ZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcxMzJiYy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIvb3JnLmp1bml0Ii8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLmpkdC5jb3JlIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuZWNsaXBzZS5jb3JlLmJvb3QiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlci8uY3ZzaWdub3JlIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzFjODMxLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUuYm9vdDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuamR0LmNvcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuanVuaXQ8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvYWJvdXQuaHRtbCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFhYTkwYy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD4yMHRoIEp1bmUsIDIwMDI8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotPHA+RWNsaXBzZS5vcmcgbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPkNvbnRyaWJ1dGlvbnM8L2gzPgotCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMLCBhbnkgQ29udHJpYnV0aW9ucywgYXMgZGVmaW5lZCBpbiB0aGUgQ1BMLCB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UKLW1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUgaG9zdCBvZiBFY2xpcHNlLm9yZyB3ZWIgc2l0ZSwgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2gKLUNvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ1BMLjwvcD4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zIG90aGVyIHRoYW4gdGhlIENQTCAoJnF1b3Q7T3RoZXIgTGljZW5zZSZxdW90OyksIGFueSBtb2RpZmljYXRpb25zLCBlbmhhbmNlbWVudHMgYW5kL29yCi1vdGhlciBjb2RlIGFuZC9vciBkb2N1bWVudGF0aW9uICgmcXVvdDtNb2RpZmljYXRpb25zJnF1b3Q7KSB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZQotaG9zdCBvZiBFY2xpcHNlLm9yZywgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2ggQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIE90aGVyIExpY2Vuc2UgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZQotdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3RoZXIgTGljZW5zZS4gIEluIGFkZGl0aW9uLCB3aXRoIHJlZ2FyZCB0byBNb2RpZmljYXRpb25zIGZvciB3aGljaCB5b3UgYXJlIHRoZSBjb3B5cmlnaHQgaG9sZGVyLCB5b3UgYXJlIGFsc28KLXByb3ZpZGluZyB0aGUgTW9kaWZpY2F0aW9ucyB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgc3VjaCBNb2RpZmljYXRpb25zIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mCi10aGUgQ1BMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjExMzg4MC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgKi5qYXIKLXNvdXJjZS5qZHRjb3JldGVzdHNidWlsZGVyLmphciA9IHNyYwotc3JjLmluY2x1ZGVzPWFib3V0Lmh0bWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyL3BsdWdpbi54bWwgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzOWMyN2IuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyIgotICAgbmFtZT0iSmF2YSBCdWlsZGVyIFRlc3RzIgotICAgdmVyc2lvbj0iMi4xLjAiPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9ImpkdGNvcmV0ZXN0c2J1aWxkZXIuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5qdW5pdCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgPC9yZXF1aXJlcz4KLQotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2J1aWxkZXIvQWJzdHJhY3RNZXRob2RUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvYnVpbGRlci9BYnN0cmFjdE1ldGhvZFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYTNlNTkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvYnVpbGRlci9BYnN0cmFjdE1ldGhvZFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy51dGlsLlV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdE1ldGhvZFRlc3RzIGV4dGVuZHMgVGVzdHMgewotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIEVYQ0xVREVEX1RFU1RTID0ge307Ci0JCi0JcHVibGljIEFic3RyYWN0TWV0aG9kVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IEZpbHRlcmVkVGVzdFN1aXRlKEVYQ0xVREVEX1RFU1RTKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFic3RyYWN0TWV0aG9kVGVzdHMuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdDAwMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJLy8gICAgICAgICAgIFN0ZXAgMQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJLy8gICAgICAgICBQcm9qZWN0MQotCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCUlQYXRoIHByb2plY3QxUGF0aCA9IGVudi5hZGRQcm9qZWN0KCJQcm9qZWN0MSIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwcm9qZWN0MVBhdGgsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCQkKLQkJLy8gcmVtb3ZlIG9sZCBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgc28gdGhhdCBuYW1lcyBkb24ndCBjb2xsaWRlCi0JCWVudi5yZW1vdmVQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3QxUGF0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQllbnYuc2V0T3V0cHV0Rm9sZGVyKHByb2plY3QxUGF0aCwgImJpbiIpOyAvLyROT04tTkxTLTEkCi0JCUlQYXRoIHJvb3QxID0gZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdDFQYXRoLCAic3JjIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWVudi5hZGRDbGFzcyhyb290MSwgInAxIiwgIklYIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwMTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGludGVyZmFjZSBJWCB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIiAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGZvbyhJWCB4KTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiAvLyROT04tTkxTLTEkCi0JCQkpOwotCQkJCi0JCUlQYXRoIGNsYXNzWCA9IGVudi5hZGRDbGFzcyhyb290MSwgInAyIiwgIlgiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAyO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJpbXBvcnQgcDEuKjtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGFic3RyYWN0IGNsYXNzIFggaW1wbGVtZW50cyBJWCB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIiAgIHB1YmxpYyB2b2lkIGZvbyhJWCB4KXt9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIn1cbiIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQkJCi0JCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCS8vICAgICAgICAgUHJvamVjdDIKLQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlJUGF0aCBwcm9qZWN0MlBhdGggPSBlbnYuYWRkUHJvamVjdCgiUHJvamVjdDIiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocHJvamVjdDJQYXRoLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQkJZW52LmFkZFJlcXVpcmVkUHJvamVjdChwcm9qZWN0MlBhdGgsIHByb2plY3QxUGF0aCk7Ci0JCQotCQkvLyByZW1vdmUgb2xkIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBzbyB0aGF0IG5hbWVzIGRvbid0IGNvbGxpZGUKLQkJZW52LnJlbW92ZVBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdDJQYXRoLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUlQYXRoIHJvb3QyID0gZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdDJQYXRoLCAic3JjIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LnNldE91dHB1dEZvbGRlcihwcm9qZWN0MlBhdGgsICJiaW4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCUlQYXRoIGNsYXNzWSA9ZW52LmFkZENsYXNzKHJvb3QyLCAicDMiLCAiWSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDM7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJImltcG9ydCBwMi4qO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgWSBleHRlbmRzIFh7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIn1cbiIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQkJCQotCQlmdWxsQnVpbGQoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCQkKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCS8vICAgICAgICAgICBTdGVwIDIKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCWVudi5hZGRDbGFzcyhyb290MSwgInAyIiwgIlgiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAyO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJpbXBvcnQgcDEuKjtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGFic3RyYWN0IGNsYXNzIFggaW1wbGVtZW50cyBJWCB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIiAgIHB1YmxpYyB2b2lkIGZvbyhJX19YIHgpe31cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiAvLyROT04tTkxTLTEkCi0JCQkpOwotCQkJCi0JCWluY3JlbWVudGFsQnVpbGQoKTsKLQkJZXhwZWN0aW5nT25seVNwZWNpZmljUHJvYmxlbUZvcihjbGFzc1gsIG5ldyBQcm9ibGVtKCJYLmZvbyhJX19YKSIsICJJX19YIGNhbm5vdCBiZSByZXNvbHZlZCAob3IgaXMgbm90IGEgdmFsaWQgdHlwZSkgZm9yIHRoZSBhcmd1bWVudCB4IG9mIHRoZSBtZXRob2QgZm9vIiwgY2xhc3NYKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlleHBlY3RpbmdPbmx5U3BlY2lmaWNQcm9ibGVtRm9yKGNsYXNzWSwgbmV3IFByb2JsZW0oIlkiLCAiQ2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlIGluaGVyaXRlZCBhYnN0cmFjdCBtZXRob2QgWC5mb28oSVgpIiwgY2xhc3NZKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCS8vICAgICAgICAgICBTdGVwIDMKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCWVudi5hZGRDbGFzcyhyb290MSwgInAyIiwgIlgiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAyO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJpbXBvcnQgcDEuKjtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGFic3RyYWN0IGNsYXNzIFggaW1wbGVtZW50cyBJWCB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIiAgIHB1YmxpYyB2b2lkIGZvbyhJWCB4KXt9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIn1cbiIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQkJCi0JCWluY3JlbWVudGFsQnVpbGQoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2J1aWxkZXIvQXNzZXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9idWlsZGVyL0Fzc2VydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGI2MTQ2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2J1aWxkZXIvQXNzZXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyOwotCi0vKioKLSAqIDxjb2RlPkFzc2VydDwvY29kZT4gaXMgdXNlZnVsIGZvciBmb3IgZW1iZWRkaW5nIHJ1bnRpbWUgc2FuaXR5IGNoZWNrcwotICogaW4gY29kZS4KLSAqIFRoZSBwcmVkaWNhdGUgbWV0aG9kcyBhbGwgdGVzdCBhIGNvbmRpdGlvbiBhbmQgdGhyb3cgc29tZQotICogdHlwZSBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlmIHRoZSBjb25kaXRpb24gZG9lcyBub3QgaG9sZC4KLSAqIDxwPgotICogQXNzZXJ0aW9uIGZhaWx1cmUgZXhjZXB0aW9ucywgbGlrZSBtb3N0IHJ1bnRpbWUgZXhjZXB0aW9ucywgYXJlCi0gKiB0aHJvd24gd2hlbiBzb21ldGhpbmcgaXMgbWlzYmVoYXZpbmcuIEFzc2VydGlvbiBmYWlsdXJlcyBhcmUgaW52YXJpYWJseQotICogdW5zcGVjaWZpZWQgYmVoYXZpb3I7IGNvbnNlcXVlbnRseSwgY2xpZW50cyBzaG91bGQgbmV2ZXIgcmVseSBvbgotICogdGhlc2UgYmVpbmcgdGhyb3duIChhbmQgY2VydGFpbmx5IHNob3VsZCBub3QgYmVpbmcgY2F0Y2hpbmcgdGhlbQotICogc3BlY2lmaWNhbGx5KS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFzc2VydCB7Ci0vKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQuICovCi1wcml2YXRlIEFzc2VydCgpIHsKLX0KLS8qKiBBc3NlcnRzIHRoYXQgYW4gYXJndW1lbnQgaXMgbGVnYWwuIElmIHRoZSBnaXZlbiBib29sZWFuIGlzCi0gKiBub3QgPGNvZGU+dHJ1ZTwvY29kZT4sIGFuIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4KLSAqIGlzIHRocm93bi4KLSAqCi0gKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKLSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuCi0gKiAgICBpZiB0aGUgY2hlY2sgZmFpbHMpCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbGVnYWxpdHkgdGVzdCBmYWlsZWQKLSAqLwotcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGVnYWwoYm9vbGVhbiBleHByZXNzaW9uKSB7Ci0JcmV0dXJuIGlzTGVnYWwoZXhwcmVzc2lvbiwgIiIpOyAvLyROT04tTkxTLTEkCi19Ci0vKiogQXNzZXJ0cyB0aGF0IGFuIGFyZ3VtZW50IGlzIGxlZ2FsLiBJZiB0aGUgZ2l2ZW4gYm9vbGVhbiBpcwotICogbm90IDxjb2RlPnRydWU8L2NvZGU+LCBhbiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+Ci0gKiBpcyB0aHJvd24uCi0gKiBUaGUgZ2l2ZW4gbWVzc2FnZSBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkIGRlYnVnZ2luZy4KLSAqCi0gKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKLSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgotICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgcGFzc2VzIChkb2VzIG5vdCByZXR1cm4KLSAqICAgIGlmIHRoZSBjaGVjayBmYWlscykKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBsZWdhbGl0eSB0ZXN0IGZhaWxlZAotICovCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMZWdhbChib29sZWFuIGV4cHJlc3Npb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0JaWYgKCFleHByZXNzaW9uKQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1lc3NhZ2UpOwotCXJldHVybiBleHByZXNzaW9uOwotfQotLyoqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gb2JqZWN0IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPi4gSWYgdGhpcwotICogaXMgbm90IHRoZSBjYXNlLCBzb21lIGtpbmQgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0gKiAKLSAqIEBwYXJhbSBvYmplY3QgdGhlIHZhbHVlIHRvIHRlc3QKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBvYmplY3QgaXMgPGNvZGU+bnVsbDwvY29kZT4KLSAqLwotcHVibGljIHN0YXRpYyB2b2lkIGlzTm90TnVsbChPYmplY3Qgb2JqZWN0KSB7Ci0JaXNOb3ROdWxsKG9iamVjdCwgIiIpOyAvLyROT04tTkxTLTEkCi19Ci0vKiogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBvYmplY3QgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LiBJZiB0aGlzCi0gKiBpcyBub3QgdGhlIGNhc2UsIHNvbWUga2luZCBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4KLSAqIFRoZSBnaXZlbiBtZXNzYWdlIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQgZGVidWdnaW5nLgotICoKLSAqIEBwYXJhbSBvYmplY3QgdGhlIHZhbHVlIHRvIHRlc3QKLSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG9iamVjdCBpcyA8Y29kZT5udWxsPC9jb2RlPgotICovCi1wdWJsaWMgc3RhdGljIHZvaWQgaXNOb3ROdWxsKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXNzYWdlKSB7Ci0JaWYgKG9iamVjdCA9PSBudWxsKQotCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCJudWxsIGFyZ3VtZW50OyIgKyBtZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAotfQotLyoqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gYm9vbGVhbiBpcyA8Y29kZT50cnVlPC9jb2RlPi4gSWYgdGhpcwotICogaXMgbm90IHRoZSBjYXNlLCBzb21lIGtpbmQgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0gKgotICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIG91dGNvZGUgb2YgdGhlIGNoZWNrCi0gKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybgotICogICAgaWYgdGhlIGNoZWNrIGZhaWxzKQotICovCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcnVlKGJvb2xlYW4gZXhwcmVzc2lvbikgewotCXJldHVybiBpc1RydWUoZXhwcmVzc2lvbiwgIiIpOyAvLyROT04tTkxTLTEkCi19Ci0vKiogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBib29sZWFuIGlzIDxjb2RlPnRydWU8L2NvZGU+LiBJZiB0aGlzCi0gKiBpcyBub3QgdGhlIGNhc2UsIHNvbWUga2luZCBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4KLSAqIFRoZSBnaXZlbiBtZXNzYWdlIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQgZGVidWdnaW5nLgotICoKLSAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uCi0gKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybgotICogICAgaWYgdGhlIGNoZWNrIGZhaWxzKQotICovCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcnVlKGJvb2xlYW4gZXhwcmVzc2lvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKLQlpZiAoIWV4cHJlc3Npb24pCi0JCXRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oImFzc2VydGlvbiBmYWlsZWQ7ICIrbWVzc2FnZSk7IC8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gZXhwcmVzc2lvbjsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2J1aWxkZXIvQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9idWlsZGVyL0Fzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTEyMjE5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2J1aWxkZXIvQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXI7Ci0KLS8qKgotICogPGNvZGU+QXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uPC9jb2RlPiBpcyBhIHJ1bnRpbWUgZXhjZXB0aW9uIHRocm93bgotICogYnkgc29tZSBvZiB0aGUgbWV0aG9kcyBpbiA8Y29kZT5Bc3NlcnQ8L2NvZGU+LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBkZWNsYXJlZCBwdWJsaWMgdG8gcHJldmVudCBzb21lIG1pc3VzZXM7IHByb2dyYW1zIHRoYXQgY2F0Y2ggCi0gKiBvciBvdGhlcndpc2UgZGVwZW5kIG9uIGFzc2VydGlvbiBmYWlsdXJlcyBhcmUgc3VzY2VwdGlibGUgdG8gdW5leHBlY3RlZAotICogYnJlYWthZ2Ugd2hlbiBhc3NlcnRpb25zIGluIHRoZSBjb2RlIGFyZSBhZGRlZCBvciByZW1vdmVkLgotICogPC9wPgotICovCi0vKiBwYWNrYWdlICovCi1jbGFzcyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLS8qKiBDb25zdHJ1Y3RzIGEgbmV3IGV4Y2VwdGlvbi4KLSAqLwotcHVibGljIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigpIHsKLX0KLS8qKiBDb25zdHJ1Y3RzIGEgbmV3IGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgotICovCi1wdWJsaWMgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKFN0cmluZyBkZXRhaWwpIHsKLQlzdXBlcihkZXRhaWwpOwotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvYnVpbGRlci9CYXNpY0J1aWxkVGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2J1aWxkZXIvQmFzaWNCdWlsZFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZTQzYTEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvYnVpbGRlci9CYXNpY0J1aWxkVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLnV0aWwuVXRpbDsKLQotLyoqCi0gKiBCYXNpYyB0ZXN0cyBvZiB0aGUgaW1hZ2UgYnVpbGRlci4KLSAqLwotcHVibGljIGNsYXNzIEJhc2ljQnVpbGRUZXN0cyBleHRlbmRzIFRlc3RzIHsKLQlwdWJsaWMgQmFzaWNCdWlsZFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKEJhc2ljQnVpbGRUZXN0cy5jbGFzcyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RCdWlsZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJUGF0aCBwcm9qZWN0UGF0aCA9IGVudi5hZGRQcm9qZWN0KCJQcm9qZWN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZEV4dGVybmFsSmFyKHByb2plY3RQYXRoLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQkJZnVsbEJ1aWxkKHByb2plY3RQYXRoKTsKLQkJCi0JCS8vIHJlbW92ZSBvbGQgcGFja2FnZSBmcmFnbWVudCByb290IHNvIHRoYXQgbmFtZXMgZG9uJ3QgY29sbGlkZQotCQllbnYucmVtb3ZlUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlJUGF0aCByb290ID0gZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICJzcmMiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuc2V0T3V0cHV0Rm9sZGVyKHByb2plY3RQYXRoLCAiYmluIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWVudi5hZGRDbGFzcyhyb290LCAicDEiLCAiSGVsbG8iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAxO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBIZWxsbyB7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkge1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIiAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihcIkhlbGxvIHdvcmxkXCIpO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIiAgIH1cbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XG4iIC8vJE5PTi1OTFMtMSQKLQkJCSk7Ci0JCQkKLQkJaW5jcmVtZW50YWxCdWlsZChwcm9qZWN0UGF0aCk7Ci0JfQotCQotCS8qCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM4OTQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VG9Eb01hcmtlcigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlIYXNodGFibGUgb3B0aW9ucyA9IEphdmFDb3JlLmdldE9wdGlvbnMoKTsKLQkJSGFzaHRhYmxlIG5ld09wdGlvbnMgPSBKYXZhQ29yZS5nZXRPcHRpb25zKCk7Ci0JCW5ld09wdGlvbnMucHV0KEphdmFDb3JlLkNPTVBJTEVSX1RBU0tfVEFHUywgInRvZG8iKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJSmF2YUNvcmUuc2V0T3B0aW9ucyhuZXdPcHRpb25zKTsKLQkJCi0JCUlQYXRoIHByb2plY3RQYXRoID0gZW52LmFkZFByb2plY3QoIlByb2plY3QiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocHJvamVjdFBhdGgsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCi0JCS8vIHJlbW92ZSBvbGQgcGFja2FnZSBmcmFnbWVudCByb290IHNvIHRoYXQgbmFtZXMgZG9uJ3QgY29sbGlkZQotCQllbnYucmVtb3ZlUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJSVBhdGggcm9vdCA9IGVudi5hZGRQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAic3JjIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LnNldE91dHB1dEZvbGRlcihwcm9qZWN0UGF0aCwgImJpbiIpOyAvLyROT04tTkxTLTEkCi0KLQkJSVBhdGggcGF0aFRvQSA9IGVudi5hZGRDbGFzcyhyb290LCAicCIsICJBIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwOyBcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIvL3RvZG8gbm90aGluZ1xuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBBIHtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJ9Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlmdWxsQnVpbGQocHJvamVjdFBhdGgpOwotCQlleHBlY3RpbmdPbmx5U3BlY2lmaWNQcm9ibGVtRm9yKHBhdGhUb0EsIG5ldyBQcm9ibGVtKCJBIiwgInRvZG8gbm90aGluZyIsIHBhdGhUb0EpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQotCQlKYXZhQ29yZS5zZXRPcHRpb25zKG9wdGlvbnMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2J1aWxkZXIvQ2xhc3NwYXRoVGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2J1aWxkZXIvQ2xhc3NwYXRoVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY5MDZjNC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9idWlsZGVyL0NsYXNzcGF0aFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy51dGlsLlV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIENsYXNzcGF0aFRlc3RzIGV4dGVuZHMgVGVzdHMgewotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIEVYQ0xVREVEX1RFU1RTID0ge307Ci0KLQlwdWJsaWMgQ2xhc3NwYXRoVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgRmlsdGVyZWRUZXN0U3VpdGUoRVhDTFVERURfVEVTVFMpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2xhc3NwYXRoVGVzdHMuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsb3NlZFByb2plY3QoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhdGggcHJvamVjdDFQYXRoID0gZW52LmFkZFByb2plY3QoIkNQMSIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwcm9qZWN0MVBhdGgsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCQlJUGF0aCBqYXJQYXRoID0gZW52LmFkZEludGVybmFsSmFyKHByb2plY3QxUGF0aCwgInRlbXAuamFyIiwgbmV3IGJ5dGVbXSB7MH0pOyAvLyROT04tTkxTLTEkCi0KLQkJSVBhdGggcHJvamVjdDJQYXRoID0gZW52LmFkZFByb2plY3QoIkNQMiIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwcm9qZWN0MlBhdGgsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCQllbnYuYWRkUmVxdWlyZWRQcm9qZWN0KHByb2plY3QyUGF0aCwgcHJvamVjdDFQYXRoKTsKLQotCQlJUGF0aCBwcm9qZWN0M1BhdGggPSBlbnYuYWRkUHJvamVjdCgiQ1AzIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZEV4dGVybmFsSmFyKHByb2plY3QzUGF0aCwgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0JCWVudi5hZGRFeHRlcm5hbEphcihwcm9qZWN0M1BhdGgsIGphclBhdGgudG9TdHJpbmcoKSk7Ci0KLQkJZnVsbEJ1aWxkKCk7Ci0JCWV4cGVjdGluZ05vUHJvYmxlbXMoKTsKLQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJLy8gICAgICAgICAgIFN0ZXAgMgotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJZW52LmNsb3NlUHJvamVjdChwcm9qZWN0MVBhdGgpOwotCi0JCWluY3JlbWVudGFsQnVpbGQoKTsKLQkJZXhwZWN0aW5nT25seVByb2JsZW1zRm9yKG5ldyBJUGF0aFtdIHtwcm9qZWN0MlBhdGgsIHByb2plY3QzUGF0aH0pOwotCQlleHBlY3RpbmdPbmx5U3BlY2lmaWNQcm9ibGVtc0Zvcihwcm9qZWN0MlBhdGgsCi0JCQluZXcgUHJvYmxlbVtdIHsKLQkJCQluZXcgUHJvYmxlbSgiIiwgIlRoZSBwcm9qZWN0IGNhbm5vdCBiZSBidWlsdCB1bnRpbCBidWlsZCBwYXRoIGVycm9ycyBhcmUgcmVzb2x2ZWQuIiwgcHJvamVjdDJQYXRoKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJbmV3IFByb2JsZW0oIkJ1aWxkIHBhdGgiLCAiTWlzc2luZyByZXF1aXJlZCBKYXZhIHByb2plY3Q6IENQMS4iLCBwcm9qZWN0MlBhdGgpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkpOwotCQlleHBlY3RpbmdPbmx5U3BlY2lmaWNQcm9ibGVtc0Zvcihwcm9qZWN0M1BhdGgsCi0JCQluZXcgUHJvYmxlbVtdIHsKLQkJCQluZXcgUHJvYmxlbSgiIiwgIlRoZSBwcm9qZWN0IGNhbm5vdCBiZSBidWlsdCB1bnRpbCBidWlsZCBwYXRoIGVycm9ycyBhcmUgcmVzb2x2ZWQuIiwgcHJvamVjdDNQYXRoKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJbmV3IFByb2JsZW0oIkJ1aWxkIHBhdGgiLCAiTWlzc2luZyByZXF1aXJlZCBsaWJyYXJ5OiAnQ1AxL3RlbXAuamFyJy4iLCBwcm9qZWN0M1BhdGgpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkpOwotCi0JCWVudi5vcGVuUHJvamVjdChwcm9qZWN0MVBhdGgpOwotCQlpbmNyZW1lbnRhbEJ1aWxkKCk7Ci0JCWV4cGVjdGluZ05vUHJvYmxlbXMoKTsKLQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJLy8gICAgICAgICAgIFN0ZXAgMwotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJSGFzaHRhYmxlIG9wdGlvbnMgPSBKYXZhQ29yZS5nZXRPcHRpb25zKCk7Ci0JCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPUkVfSkFWQV9CVUlMRF9JTlZBTElEX0NMQVNTUEFUSCwgSmF2YUNvcmUuSUdOT1JFKTsKLQkJSmF2YUNvcmUuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQkJZW52LmNsb3NlUHJvamVjdChwcm9qZWN0MVBhdGgpOwotCi0JCWluY3JlbWVudGFsQnVpbGQoKTsKLQkJZXhwZWN0aW5nT25seVByb2JsZW1zRm9yKG5ldyBJUGF0aFtdIHtwcm9qZWN0MlBhdGgsIHByb2plY3QzUGF0aH0pOwotCQlleHBlY3RpbmdPbmx5U3BlY2lmaWNQcm9ibGVtRm9yKHByb2plY3QyUGF0aCwKLQkJCW5ldyBQcm9ibGVtKCJCdWlsZCBwYXRoIiwgIk1pc3NpbmcgcmVxdWlyZWQgSmF2YSBwcm9qZWN0OiBDUDEuIiwgcHJvamVjdDJQYXRoKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJKTsKLQkJZXhwZWN0aW5nT25seVNwZWNpZmljUHJvYmxlbUZvcihwcm9qZWN0M1BhdGgsCi0JCQluZXcgUHJvYmxlbSgiQnVpbGQgcGF0aCIsICJNaXNzaW5nIHJlcXVpcmVkIGxpYnJhcnk6ICdDUDEvdGVtcC5qYXInLiIsIHByb2plY3QzUGF0aCkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSk7Ci0KLQkJZW52Lm9wZW5Qcm9qZWN0KHByb2plY3QxUGF0aCk7Ci0JCWluY3JlbWVudGFsQnVpbGQoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCi0JCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPUkVfSkFWQV9CVUlMRF9JTlZBTElEX0NMQVNTUEFUSCwgSmF2YUNvcmUuQUJPUlQpOwotCQlKYXZhQ29yZS5zZXRPcHRpb25zKG9wdGlvbnMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nUHJvamVjdCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJUGF0aCBwcm9qZWN0MVBhdGggPSBlbnYuYWRkUHJvamVjdCgiTVAxIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZEV4dGVybmFsSmFyKHByb2plY3QxUGF0aCwgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0KLQkJSVBhdGggcHJvamVjdDJQYXRoID0gZW52LmFkZFByb2plY3QoIk1QMiIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwcm9qZWN0MlBhdGgsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCQllbnYuYWRkUmVxdWlyZWRQcm9qZWN0KHByb2plY3QyUGF0aCwgcHJvamVjdDFQYXRoKTsKLQotCQlmdWxsQnVpbGQoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyAgICAgICAgICAgU3RlcCAyCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQllbnYucmVtb3ZlUHJvamVjdChwcm9qZWN0MVBhdGgpOwotCi0JCWluY3JlbWVudGFsQnVpbGQoKTsKLQkJZXhwZWN0aW5nT25seVByb2JsZW1zRm9yKHByb2plY3QyUGF0aCk7Ci0JCWV4cGVjdGluZ09ubHlTcGVjaWZpY1Byb2JsZW1zRm9yKHByb2plY3QyUGF0aCwKLQkJCW5ldyBQcm9ibGVtW10gewotCQkJCW5ldyBQcm9ibGVtKCIiLCAiVGhlIHByb2plY3QgY2Fubm90IGJlIGJ1aWx0IHVudGlsIGJ1aWxkIHBhdGggZXJyb3JzIGFyZSByZXNvbHZlZC4iLCBwcm9qZWN0MlBhdGgpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQluZXcgUHJvYmxlbSgiQnVpbGQgcGF0aCIsICJNaXNzaW5nIHJlcXVpcmVkIEphdmEgcHJvamVjdDogTVAxLiIsIHByb2plY3QyUGF0aCkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCSk7Ci0KLQkJcHJvamVjdDFQYXRoID0gZW52LmFkZFByb2plY3QoIk1QMSIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwcm9qZWN0MVBhdGgsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCi0JCWluY3JlbWVudGFsQnVpbGQoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyAgICAgICAgICAgU3RlcCAzCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlIYXNodGFibGUgb3B0aW9ucyA9IEphdmFDb3JlLmdldE9wdGlvbnMoKTsKLQkJb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09SRV9KQVZBX0JVSUxEX0lOVkFMSURfQ0xBU1NQQVRILCBKYXZhQ29yZS5JR05PUkUpOwotCQlKYXZhQ29yZS5zZXRPcHRpb25zKG9wdGlvbnMpOwotCQllbnYucmVtb3ZlUHJvamVjdChwcm9qZWN0MVBhdGgpOwotCi0JCWluY3JlbWVudGFsQnVpbGQoKTsKLQkJZXhwZWN0aW5nT25seVByb2JsZW1zRm9yKHByb2plY3QyUGF0aCk7Ci0JCWV4cGVjdGluZ09ubHlTcGVjaWZpY1Byb2JsZW1Gb3IocHJvamVjdDJQYXRoLAotCQkJbmV3IFByb2JsZW0oIkJ1aWxkIHBhdGgiLCAiTWlzc2luZyByZXF1aXJlZCBKYXZhIHByb2plY3Q6IE1QMS4iLCBwcm9qZWN0MlBhdGgpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkpOwotCi0JCXByb2plY3QxUGF0aCA9IGVudi5hZGRQcm9qZWN0KCJNUDEiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocHJvamVjdDFQYXRoLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQotCQlpbmNyZW1lbnRhbEJ1aWxkKCk7Ci0JCWV4cGVjdGluZ05vUHJvYmxlbXMoKTsKLQotCQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT1JFX0pBVkFfQlVJTERfSU5WQUxJRF9DTEFTU1BBVEgsIEphdmFDb3JlLkFCT1JUKTsKLQkJSmF2YUNvcmUuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ0xpYnJhcnkxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYXRoIHByb2plY3RQYXRoID0gZW52LmFkZFByb2plY3QoIlByb2plY3QiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYucmVtb3ZlUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCUlQYXRoIHJvb3QgPSBlbnYuYWRkUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgInNyYyIpOyAvLyROT04tTkxTLTEkCi0JCUlQYXRoIGJpbiA9IGVudi5zZXRPdXRwdXRGb2xkZXIocHJvamVjdFBhdGgsICJiaW4iKTsgLy8kTk9OLU5MUy0xJAotCQlJUGF0aCBjbGFzc1Rlc3QxID0gZW52LmFkZENsYXNzKHJvb3QsICJwMSIsICJUZXN0MSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDE7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIFRlc3QxIHt9IiAvLyROT04tTkxTLTEkCi0JCSk7Ci0KLQkJZnVsbEJ1aWxkKCk7Ci0JCWV4cGVjdGluZ09ubHlQcm9ibGVtc0ZvcihuZXcgSVBhdGhbXSB7cHJvamVjdFBhdGgsIGNsYXNzVGVzdDF9KTsKLQkJZXhwZWN0aW5nT25seVNwZWNpZmljUHJvYmxlbXNGb3IocHJvamVjdFBhdGgsCi0JCQluZXcgUHJvYmxlbVtdIHsKLQkJCQluZXcgUHJvYmxlbSgiIiwgIlRoZSBwcm9qZWN0IHdhcyBub3QgYnVpbHQgc2luY2UgaXRzIGJ1aWxkIHBhdGggaXMgaW5jb21wbGV0ZS4gQ2Fubm90IGZpbmQgdGhlIGNsYXNzIGZpbGUgZm9yIGphdmEubGFuZy5PYmplY3QuIEZpeCB0aGUgYnVpbGQgcGF0aCB0aGVuIHRyeSByZWJ1aWxkaW5nIHRoaXMgcHJvamVjdC4iLCBwcm9qZWN0UGF0aCksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCW5ldyBQcm9ibGVtKCJwMSIsICJUaGUgdHlwZSBqYXZhLmxhbmcuT2JqZWN0IGNhbm5vdCBiZSByZXNvbHZlZC4gSXQgaXMgaW5kaXJlY3RseSByZWZlcmVuY2VkIGZyb20gcmVxdWlyZWQgLmNsYXNzIGZpbGVzLiIsIGNsYXNzVGVzdDEpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkpOwotCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyAgICAgICAgICAgU3RlcCAyCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkKLQkJZW52LmFkZEV4dGVybmFsSmFyKHByb2plY3RQYXRoLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQotCQlpbmNyZW1lbnRhbEJ1aWxkKCk7Ci0JCWV4cGVjdGluZ05vUHJvYmxlbXMoKTsKLQkJZXhwZWN0aW5nUHJlc2VuY2VPZihuZXcgSVBhdGhbXXsKLQkJCWJpbi5hcHBlbmQoInAxIikuYXBwZW5kKCJUZXN0MS5jbGFzcyIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nTGlicmFyeTIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhdGggcHJvamVjdFBhdGggPSBlbnYuYWRkUHJvamVjdCgiUHJvamVjdCIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5yZW1vdmVQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJSVBhdGggcm9vdCA9IGVudi5hZGRQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAic3JjIik7IC8vJE5PTi1OTFMtMSQKLQkJSVBhdGggYmluID0gZW52LnNldE91dHB1dEZvbGRlcihwcm9qZWN0UGF0aCwgImJpbiIpOyAvLyROT04tTkxTLTEkCi0JCUlQYXRoIGNsYXNzVGVzdDEgPSBlbnYuYWRkQ2xhc3Mocm9vdCwgInAxIiwgIlRlc3QxIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwMTtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgVGVzdDEge30iIC8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJSVBhdGggY2xhc3NUZXN0MiA9IGVudi5hZGRDbGFzcyhyb290LCAicDIiLCAiVGVzdDIiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAyO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBUZXN0MiB7fSIgLy8kTk9OLU5MUy0xJAotCQkpOwotCQlJUGF0aCBjbGFzc1Rlc3QzID0gZW52LmFkZENsYXNzKHJvb3QsICJwMiIsICJUZXN0MyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDI7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIFRlc3QzIHt9IiAvLyROT04tTkxTLTEkCi0JCSk7Ci0KLQkJZnVsbEJ1aWxkKCk7Ci0JCWV4cGVjdGluZ1NwZWNpZmljUHJvYmxlbUZvcigKLQkJCXByb2plY3RQYXRoLAotCQkJbmV3IFByb2JsZW0oIiIsICJUaGUgcHJvamVjdCB3YXMgbm90IGJ1aWx0IHNpbmNlIGl0cyBidWlsZCBwYXRoIGlzIGluY29tcGxldGUuIENhbm5vdCBmaW5kIHRoZSBjbGFzcyBmaWxlIGZvciBqYXZhLmxhbmcuT2JqZWN0LiBGaXggdGhlIGJ1aWxkIHBhdGggdGhlbiB0cnkgcmVidWlsZGluZyB0aGlzIHByb2plY3QuIiwgcHJvamVjdFBhdGgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQotCQlQcm9ibGVtW10gcHJvYjEgPSBlbnYuZ2V0UHJvYmxlbXNGb3IoY2xhc3NUZXN0MSk7Ci0JCVByb2JsZW1bXSBwcm9iMiA9IGVudi5nZXRQcm9ibGVtc0ZvcihjbGFzc1Rlc3QyKTsKLQkJUHJvYmxlbVtdIHByb2IzID0gZW52LmdldFByb2JsZW1zRm9yKGNsYXNzVGVzdDMpOwotCQlhc3NlcnRFcXVhbHMoInRvbyBtYW55IHByb2JsZW1zIiwgcHJvYjEubGVuZ3RoICsgcHJvYjIubGVuZ3RoICsgcHJvYjMubGVuZ3RoLDEpOyAvLyROT04tTkxTLTEkCi0JCWlmKHByb2IxLmxlbmd0aCA9PSAxKSB7Ci0JCQlleHBlY3RpbmdTcGVjaWZpY1Byb2JsZW1Gb3IoY2xhc3NUZXN0MSwgbmV3IFByb2JsZW0oInAxIiwgIlRoZSB0eXBlIGphdmEubGFuZy5PYmplY3QgY2Fubm90IGJlIHJlc29sdmVkLiBJdCBpcyBpbmRpcmVjdGx5IHJlZmVyZW5jZWQgZnJvbSByZXF1aXJlZCAuY2xhc3MgZmlsZXMuIiwgY2xhc3NUZXN0MSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfSBlbHNlIGlmIChwcm9iMi5sZW5ndGggPT0gMSkgewotCQkJZXhwZWN0aW5nU3BlY2lmaWNQcm9ibGVtRm9yKGNsYXNzVGVzdDIsIG5ldyBQcm9ibGVtKCJwMiIsICJUaGUgdHlwZSBqYXZhLmxhbmcuT2JqZWN0IGNhbm5vdCBiZSByZXNvbHZlZC4gSXQgaXMgaW5kaXJlY3RseSByZWZlcmVuY2VkIGZyb20gcmVxdWlyZWQgLmNsYXNzIGZpbGVzLiIsIGNsYXNzVGVzdDIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0gZWxzZSB7Ci0JCQlleHBlY3RpbmdTcGVjaWZpY1Byb2JsZW1Gb3IoY2xhc3NUZXN0MywgbmV3IFByb2JsZW0oInAyIiwgIlRoZSB0eXBlIGphdmEubGFuZy5PYmplY3QgY2Fubm90IGJlIHJlc29sdmVkLiBJdCBpcyBpbmRpcmVjdGx5IHJlZmVyZW5jZWQgZnJvbSByZXF1aXJlZCAuY2xhc3MgZmlsZXMuIiwgY2xhc3NUZXN0MykpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyAgICAgICAgICAgU3RlcCAyCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkKLQkJZW52LmFkZEV4dGVybmFsSmFyKHByb2plY3RQYXRoLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQotCQlpbmNyZW1lbnRhbEJ1aWxkKCk7Ci0JCWV4cGVjdGluZ05vUHJvYmxlbXMoKTsKLQkJZXhwZWN0aW5nUHJlc2VuY2VPZihuZXcgSVBhdGhbXXsKLQkJCWJpbi5hcHBlbmQoInAxIikuYXBwZW5kKCJUZXN0MS5jbGFzcyIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWJpbi5hcHBlbmQoInAyIikuYXBwZW5kKCJUZXN0Mi5jbGFzcyIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWJpbi5hcHBlbmQoInAyIikuYXBwZW5kKCJUZXN0My5jbGFzcyIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9idWlsZGVyL0NvbXBpbGF0aW9uVW5pdExvY2F0aW9uVGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2J1aWxkZXIvQ29tcGlsYXRpb25Vbml0TG9jYXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGEzZmQ1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2J1aWxkZXIvQ29tcGlsYXRpb25Vbml0TG9jYXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy51dGlsLlV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBDb21waWxhdGlvblVuaXRMb2NhdGlvblRlc3RzIGV4dGVuZHMgVGVzdHMgewotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIEVYQ0xVREVEX1RFU1RTID0gewotCQkiQ29tcGlsYXRpb25Vbml0TG9jYXRpb25UZXN0cyIsICJ0ZXN0V3JvbmdDb21waWxhdGlvblVuaXRMb2NhdGlvbiIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfTsKLQkKLQlwdWJsaWMgQ29tcGlsYXRpb25Vbml0TG9jYXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgRmlsdGVyZWRUZXN0U3VpdGUoRVhDTFVERURfVEVTVFMpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tcGlsYXRpb25Vbml0TG9jYXRpb25UZXN0cy5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JLyoqCi0JICogQnVncyA2NDYxIAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RXcm9uZ0NvbXBpbGF0aW9uVW5pdExvY2F0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyAgICAgICAgICAgU3RlcCAxCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlJUGF0aCBwcm9qZWN0UGF0aCA9IGVudi5hZGRQcm9qZWN0KCJQcm9qZWN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZEV4dGVybmFsSmFyKHByb2plY3RQYXRoLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQkJZW52LnJlbW92ZVBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlJUGF0aCByb290ID0gZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICJzcmMiKTsgLy8kTk9OLU5MUy0xJAotCQlJUGF0aCBiaW4gPSBlbnYuc2V0T3V0cHV0Rm9sZGVyKHByb2plY3RQYXRoLCAiYmluIik7IC8vJE5PTi1OTFMtMSQKLQkJSVBhdGggeCA9IGVudi5hZGRDbGFzcyhyb290LCAiIiwgIlgiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiAvLyROT04tTkxTLTEkCi0JCQkpOwotCi0JCQotCQlmdWxsQnVpbGQoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCQlleHBlY3RpbmdQcmVzZW5jZU9mKGJpbi5hcHBlbmQoIlguY2xhc3MiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyAgICAgICAgICAgU3RlcCAyCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQllbnYuYWRkQ2xhc3Mocm9vdCwgIiIsICJYIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwMTtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiAvLyROT04tTkxTLTEkCi0JCQkpOwotCQkJCi0JCWluY3JlbWVudGFsQnVpbGQoKTsKLQkJZXhwZWN0aW5nUHJvYmxlbXNGb3IoeCk7Ci0JCWV4cGVjdGluZ05vUHJlc2VuY2VPZihiaW4uYXBwZW5kKCJYLmNsYXNzIikpOyAvLyROT04tTkxTLTEkCi0JfQotfQotCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9idWlsZGVyL0NvcHlSZXNvdXJjZVRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9idWlsZGVyL0NvcHlSZXNvdXJjZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YzkwM2MuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvYnVpbGRlci9Db3B5UmVzb3VyY2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMudXRpbC5VdGlsOwotCi0vKioKLSAqIEJhc2ljIHRlc3RzIG9mIHRoZSBpbWFnZSBidWlsZGVyLgotICovCi1wdWJsaWMgY2xhc3MgQ29weVJlc291cmNlVGVzdHMgZXh0ZW5kcyBUZXN0cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gRVhDTFVERURfVEVTVFMgPSB7fTsKLQkKLQlwdWJsaWMgQ29weVJlc291cmNlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IEZpbHRlcmVkVGVzdFN1aXRlKEVYQ0xVREVEX1RFU1RTKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvcHlSZXNvdXJjZVRlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVQcm9qZWN0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYXRoIHByb2plY3RQYXRoID0gZW52LmFkZFByb2plY3QoIlAxIik7IC8vJE5PTi1OTFMtMSQKLQkJSVBhdGggc3JjID0gZW52LmdldFBhY2thZ2VGcmFnbWVudFJvb3RQYXRoKHByb2plY3RQYXRoLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LnNldE91dHB1dEZvbGRlcihwcm9qZWN0UGF0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwcm9qZWN0UGF0aCwgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0KLQkJZW52LmFkZEZpbGUoc3JjLCAiei50eHQiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWZ1bGxCdWlsZCgpOwotCQlleHBlY3RpbmdOb1Byb2JsZW1zKCk7Ci0JCWV4cGVjdGluZ1ByZXNlbmNlT2YocHJvamVjdFBhdGguYXBwZW5kKCJ6LnR4dCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWVudi5yZW1vdmVGaWxlKHNyYy5hcHBlbmQoInoudHh0IikpOyAvLyROT04tTkxTLTEkCi0JCUlQYXRoIHAgPSBlbnYuYWRkRm9sZGVyKHNyYywgInAiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRmlsZShwLCAicC50eHQiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluY3JlbWVudGFsQnVpbGQoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCQlleHBlY3RpbmdOb1ByZXNlbmNlT2YocHJvamVjdFBhdGguYXBwZW5kKCJ6LnR4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQlleHBlY3RpbmdQcmVzZW5jZU9mKHAuYXBwZW5kKCJwLnR4dCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9qZWN0V2l0aEJpbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJUGF0aCBwcm9qZWN0UGF0aCA9IGVudi5hZGRQcm9qZWN0KCJQMiIpOyAvLyROT04tTkxTLTEkCi0JCUlQYXRoIHNyYyA9IGVudi5nZXRQYWNrYWdlRnJhZ21lbnRSb290UGF0aChwcm9qZWN0UGF0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5zZXRPdXRwdXRGb2xkZXIocHJvamVjdFBhdGgsICJiaW4iKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocHJvamVjdFBhdGgsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCi0JCWVudi5hZGRGaWxlKHNyYywgInoudHh0IiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlmdWxsQnVpbGQoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCQlleHBlY3RpbmdQcmVzZW5jZU9mKG5ldyBJUGF0aFtdIHsKLQkJCXByb2plY3RQYXRoLmFwcGVuZCgiei50eHQiKSwgLy8kTk9OLU5MUy0xJAotCQkJcHJvamVjdFBhdGguYXBwZW5kKCJiaW4vei50eHQiKSAvLyROT04tTkxTLTEkCi0JCX0pOwotCi0JCWVudi5yZW1vdmVGaWxlKHNyYy5hcHBlbmQoInoudHh0IikpOyAvLyROT04tTkxTLTEkCi0JCUlQYXRoIHAgPSBlbnYuYWRkRm9sZGVyKHNyYywgInAiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRmlsZShwLCAicC50eHQiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluY3JlbWVudGFsQnVpbGQoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCQlleHBlY3RpbmdOb1ByZXNlbmNlT2YobmV3IElQYXRoW10gewotCQkJcHJvamVjdFBhdGguYXBwZW5kKCJ6LnR4dCIpLCAvLyROT04tTkxTLTEkCi0JCQlwcm9qZWN0UGF0aC5hcHBlbmQoImJpbi96LnR4dCIpIC8vJE5PTi1OTFMtMSQKLQkJfSk7Ci0JCWV4cGVjdGluZ1ByZXNlbmNlT2YobmV3IElQYXRoW10gewotCQkJcHJvamVjdFBhdGguYXBwZW5kKCJwL3AudHh0IiksIC8vJE5PTi1OTFMtMSQKLQkJCXByb2plY3RQYXRoLmFwcGVuZCgiYmluL3AvcC50eHQiKSAvLyROT04tTkxTLTEkCi0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9qZWN0V2l0aFNyY0JpbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJUGF0aCBwcm9qZWN0UGF0aCA9IGVudi5hZGRQcm9qZWN0KCJQMyIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5yZW1vdmVQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJSVBhdGggc3JjID0gZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICJzcmMiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuc2V0T3V0cHV0Rm9sZGVyKHByb2plY3RQYXRoLCAiYmluIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZEV4dGVybmFsSmFyKHByb2plY3RQYXRoLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQotCQllbnYuYWRkRmlsZShzcmMsICJ6LnR4dCIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJZnVsbEJ1aWxkKCk7Ci0JCWV4cGVjdGluZ05vUHJvYmxlbXMoKTsKLQkJZXhwZWN0aW5nUHJlc2VuY2VPZihuZXcgSVBhdGhbXSB7Ci0JCQlwcm9qZWN0UGF0aC5hcHBlbmQoInNyYy96LnR4dCIpLCAvLyROT04tTkxTLTEkCi0JCQlwcm9qZWN0UGF0aC5hcHBlbmQoImJpbi96LnR4dCIpIC8vJE5PTi1OTFMtMSQKLQkJfSk7Ci0KLQkJZW52LnJlbW92ZUZpbGUoc3JjLmFwcGVuZCgiei50eHQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZEZpbGUoc3JjLCAienoudHh0IiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbmNyZW1lbnRhbEJ1aWxkKCk7Ci0JCWV4cGVjdGluZ05vUHJvYmxlbXMoKTsKLQkJZXhwZWN0aW5nTm9QcmVzZW5jZU9mKG5ldyBJUGF0aFtdIHsKLQkJCXByb2plY3RQYXRoLmFwcGVuZCgic3JjL3oudHh0IiksIC8vJE5PTi1OTFMtMSQKLQkJCXByb2plY3RQYXRoLmFwcGVuZCgiYmluL3oudHh0IikgLy8kTk9OLU5MUy0xJAotCQl9KTsKLQkJZXhwZWN0aW5nUHJlc2VuY2VPZihuZXcgSVBhdGhbXSB7Ci0JCQlwcm9qZWN0UGF0aC5hcHBlbmQoInNyYy96ei50eHQiKSwgLy8kTk9OLU5MUy0xJAotCQkJcHJvamVjdFBhdGguYXBwZW5kKCJiaW4venoudHh0IikgLy8kTk9OLU5MUy0xJAotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvamVjdFdpdGgyU3JjQmluKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYXRoIHByb2plY3RQYXRoID0gZW52LmFkZFByb2plY3QoIlA0Iik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LnJlbW92ZVBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlJUGF0aCBzcmMxID0gZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICJzcmMxIik7IC8vJE5PTi1OTFMtMSQKLQkJSVBhdGggc3JjMiA9IGVudi5hZGRQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAic3JjMiIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5zZXRPdXRwdXRGb2xkZXIocHJvamVjdFBhdGgsICJiaW4iKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocHJvamVjdFBhdGgsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCi0JCWVudi5hZGRGaWxlKHNyYzEsICJ6LnR4dCIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWVudi5hZGRGaWxlKHNyYzIsICJ6ei50eHQiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWZ1bGxCdWlsZCgpOwotCQlleHBlY3RpbmdOb1Byb2JsZW1zKCk7Ci0JCWV4cGVjdGluZ1ByZXNlbmNlT2YobmV3IElQYXRoW10gewotCQkJcHJvamVjdFBhdGguYXBwZW5kKCJzcmMxL3oudHh0IiksIC8vJE5PTi1OTFMtMSQKLQkJCXByb2plY3RQYXRoLmFwcGVuZCgiYmluL3oudHh0IiksIC8vJE5PTi1OTFMtMSQKLQkJCXByb2plY3RQYXRoLmFwcGVuZCgic3JjMi96ei50eHQiKSwgLy8kTk9OLU5MUy0xJAotCQkJcHJvamVjdFBhdGguYXBwZW5kKCJiaW4venoudHh0IikgLy8kTk9OLU5MUy0xJAotCQl9KTsKLQotCQllbnYucmVtb3ZlRmlsZShzcmMyLmFwcGVuZCgienoudHh0IikpOyAvLyROT04tTkxTLTEkCi0JCUlQYXRoIHAgPSBlbnYuYWRkRm9sZGVyKHNyYzIsICJwIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZEZpbGUocCwgInAudHh0IiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbmNyZW1lbnRhbEJ1aWxkKCk7Ci0JCWV4cGVjdGluZ05vUHJvYmxlbXMoKTsKLQkJZXhwZWN0aW5nTm9QcmVzZW5jZU9mKG5ldyBJUGF0aFtdIHsKLQkJCXByb2plY3RQYXRoLmFwcGVuZCgic3JjMi96ei50eHQiKSwgLy8kTk9OLU5MUy0xJAotCQkJcHJvamVjdFBhdGguYXBwZW5kKCJiaW4venoudHh0IikgLy8kTk9OLU5MUy0xJAotCQl9KTsKLQkJZXhwZWN0aW5nUHJlc2VuY2VPZihuZXcgSVBhdGhbXSB7Ci0JCQlwcm9qZWN0UGF0aC5hcHBlbmQoInNyYzIvcC9wLnR4dCIpLCAvLyROT04tTkxTLTEkCi0JCQlwcm9qZWN0UGF0aC5hcHBlbmQoImJpbi9wL3AudHh0IikgLy8kTk9OLU5MUy0xJAotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvamVjdFdpdGgyU3JjQXNCaW4oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhdGggcHJvamVjdFBhdGggPSBlbnYuYWRkUHJvamVjdCgiUDUiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYucmVtb3ZlUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCUlQYXRoIHNyYzEgPSBlbnYuYWRkUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgInNyYzEiLCBudWxsLCAic3JjMSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJSVBhdGggc3JjMiA9IGVudi5hZGRQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAic3JjMiIsIG51bGwsICJzcmMyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQllbnYuc2V0T3V0cHV0Rm9sZGVyKHByb2plY3RQYXRoLCAiYmluIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZEV4dGVybmFsSmFyKHByb2plY3RQYXRoLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQotCQllbnYuYWRkRmlsZShzcmMxLCAiei50eHQiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQllbnYuYWRkRmlsZShzcmMyLCAienoudHh0IiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlmdWxsQnVpbGQoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCQlleHBlY3RpbmdQcmVzZW5jZU9mKG5ldyBJUGF0aFtdIHsKLQkJCXByb2plY3RQYXRoLmFwcGVuZCgic3JjMS96LnR4dCIpLCAvLyROT04tTkxTLTEkCi0JCQlwcm9qZWN0UGF0aC5hcHBlbmQoInNyYzIvenoudHh0IiksIC8vJE5PTi1OTFMtMSQKLQkJfSk7Ci0JCWV4cGVjdGluZ05vUHJlc2VuY2VPZihuZXcgSVBhdGhbXSB7Ci0JCQlwcm9qZWN0UGF0aC5hcHBlbmQoInNyYzIvei50eHQiKSwgLy8kTk9OLU5MUy0xJAotCQkJcHJvamVjdFBhdGguYXBwZW5kKCJiaW4iKSAvLyROT04tTkxTLTEkCi0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9qZWN0V2l0aDJTcmMyQmluKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYXRoIHByb2plY3RQYXRoID0gZW52LmFkZFByb2plY3QoIlA2Iik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LnJlbW92ZVBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlJUGF0aCBzcmMxID0gZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICJzcmMxIiwgbnVsbCwgImJpbjEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUlQYXRoIHNyYzIgPSBlbnYuYWRkUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgInNyYzIiLCBudWxsLCAiYmluMiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZW52LnNldE91dHB1dEZvbGRlcihwcm9qZWN0UGF0aCwgImJpbjEiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocHJvamVjdFBhdGgsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCi0JCWVudi5hZGRGaWxlKHNyYzEsICJ6LnR4dCIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWVudi5hZGRGaWxlKHNyYzIsICJ6ei50eHQiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWZ1bGxCdWlsZCgpOwotCQlleHBlY3RpbmdOb1Byb2JsZW1zKCk7Ci0JCWV4cGVjdGluZ1ByZXNlbmNlT2YobmV3IElQYXRoW10gewotCQkJcHJvamVjdFBhdGguYXBwZW5kKCJiaW4xL3oudHh0IiksIC8vJE5PTi1OTFMtMSQKLQkJCXByb2plY3RQYXRoLmFwcGVuZCgiYmluMi96ei50eHQiKSwgLy8kTk9OLU5MUy0xJAotCQl9KTsKLQkJZXhwZWN0aW5nTm9QcmVzZW5jZU9mKG5ldyBJUGF0aFtdIHsKLQkJCXByb2plY3RQYXRoLmFwcGVuZCgiYmluMS96ei50eHQiKSwgLy8kTk9OLU5MUy0xJAotCQkJcHJvamVjdFBhdGguYXBwZW5kKCJiaW4yL3oudHh0IiksIC8vJE5PTi1OTFMtMSQKLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdDJQcm9qZWN0V2l0aDFCaW4oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhdGggcHJvamVjdFBhdGggPSBlbnYuYWRkUHJvamVjdCgiUDciKTsgLy8kTk9OLU5MUy0xJAotCQllbnYucmVtb3ZlUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAic3JjIik7IC8vJE5PTi1OTFMtMSQKLQkJSVBhdGggYmluID0gZW52LnNldE91dHB1dEZvbGRlcihwcm9qZWN0UGF0aCwgImJpbiIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwcm9qZWN0UGF0aCwgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0KLQkJSVBhdGggcHJvamVjdFBhdGgyID0gZW52LmFkZFByb2plY3QoIlA4Iik7IC8vJE5PTi1OTFMtMSQKLQkJSVBhdGggYmluTG9jYXRpb24gPSBlbnYuZ2V0UHJvamVjdChwcm9qZWN0UGF0aCkuZ2V0Rm9sZGVyKCJiaW4iKS5nZXRMb2NhdGlvbigpOyAvLyROT04tTkxTLTEkCi0JCWVudi5zZXRFeHRlcm5hbE91dHB1dEZvbGRlcihwcm9qZWN0UGF0aDIsICJleHRlcm5hbEJpbiIsIGJpbkxvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocHJvamVjdFBhdGgyLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQotCQllbnYuYWRkRmlsZShwcm9qZWN0UGF0aDIsICJ6LnR4dCIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJZnVsbEJ1aWxkKCk7Ci0JCWV4cGVjdGluZ05vUHJvYmxlbXMoKTsKLQkJZXhwZWN0aW5nUHJlc2VuY2VPZihiaW4uYXBwZW5kKCJ6LnR4dCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2J1aWxkZXIvRWZmaWNpZW5jeUNvbXBpbGVyUmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9idWlsZGVyL0VmZmljaWVuY3lDb21waWxlclJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDM3YTEyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2J1aWxkZXIvRWZmaWNpZW5jeUNvbXBpbGVyUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5DbGFzc0ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JRGVidWdSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuVXRpbDsKLQotcHVibGljIGNsYXNzIEVmZmljaWVuY3lDb21waWxlclJlcXVlc3RvciBpbXBsZW1lbnRzIElEZWJ1Z1JlcXVlc3RvciB7Ci0JcHJpdmF0ZSBib29sZWFuIGlzQWN0aXZlID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBWZWN0b3IgY29tcGlsZWRDbGFzc2VzID0gbmV3IFZlY3RvcigxMCk7Ci0JCi0JcHVibGljIHZvaWQgYWNjZXB0RGVidWdSZXN1bHQoQ29tcGlsYXRpb25SZXN1bHQgcmVzdWx0KXsKLQkJQ2xhc3NGaWxlW10gY2xhc3NGaWxlcyA9IHJlc3VsdC5nZXRDbGFzc0ZpbGVzKCk7Ci0JCVV0aWwuc29ydChjbGFzc0ZpbGVzLCBuZXcgVXRpbC5Db21wYXJlcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkJCQlTdHJpbmcgYU5hbWUgPSBuZXcgU3RyaW5nKCgoQ2xhc3NGaWxlKWEpLmZpbGVOYW1lKCkpOwotCQkJCVN0cmluZyBiTmFtZSA9IG5ldyBTdHJpbmcoKChDbGFzc0ZpbGUpYikuZmlsZU5hbWUoKSk7Ci0JCQkJcmV0dXJuIGFOYW1lLmNvbXBhcmVUbyhiTmFtZSk7Ci0JCQl9Ci0JCX0pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzRmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSBuZXcgU3RyaW5nKGNsYXNzRmlsZXNbaV0uZmlsZU5hbWUoKSk7Ci0JCQljb21waWxlZENsYXNzZXMuYWRkRWxlbWVudChjbGFzc05hbWUucmVwbGFjZSgnLycsICcuJykpOwotCQl9Ci0JfQotCQotCVN0cmluZ1tdIGdldENvbXBpbGVkQ2xhc3NlcygpewotCQlyZXR1cm4gKFN0cmluZyBbXSljb21waWxlZENsYXNzZXMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xlYXJSZXN1bHQoKXsKLQkJY29tcGlsZWRDbGFzc2VzLmNsZWFyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCX0KLQkKLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJaXNBY3RpdmUgPSB0cnVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlpc0FjdGl2ZSA9IGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZSgpIHsKLQkJcmV0dXJuIGlzQWN0aXZlOwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2J1aWxkZXIvRWZmaWNpZW5jeVRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9idWlsZGVyL0VmZmljaWVuY3lUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTRkMGYxLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2J1aWxkZXIvRWZmaWNpZW5jeVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy51dGlsLlV0aWw7Ci0KLS8qKgotICogQmFzaWMgZWZmaWNpZW5jeSB0ZXN0cyBvZiB0aGUgaW1hZ2UgYnVpbGRlci4KLSAqLwotcHVibGljIGNsYXNzIEVmZmljaWVuY3lUZXN0cyBleHRlbmRzIFRlc3RzIHsKLQlwdWJsaWMgRWZmaWNpZW5jeVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKEVmZmljaWVuY3lUZXN0cy5jbGFzcyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFZmZpY2llbmN5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYXRoIHByb2plY3RQYXRoID0gZW52LmFkZFByb2plY3QoIlByb2plY3QiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocHJvamVjdFBhdGgsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCQlmdWxsQnVpbGQocHJvamVjdFBhdGgpOwotCQkKLQkJLy8gcmVtb3ZlIG9sZCBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgc28gdGhhdCBuYW1lcyBkb24ndCBjb2xsaWRlCi0JCWVudi5yZW1vdmVQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUlQYXRoIHJvb3QgPSBlbnYuYWRkUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgInNyYyIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5zZXRPdXRwdXRGb2xkZXIocHJvamVjdFBhdGgsICJiaW4iKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJZW52LmFkZENsYXNzKHJvb3QsICJwMSIsICJJbmRpY3RlZCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDE7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGFic3RyYWN0IGNsYXNzIEluZGljdGVkIHtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XG4iIC8vJE5PTi1OTFMtMSQKLQkJCSk7Ci0JCQkKLQkJZW52LmFkZENsYXNzKHJvb3QsICJwMiIsICJDb2xsYWJvcmF0b3IiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAyO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJImltcG9ydCBwMS4qO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBDb2xsYWJvcmF0b3IgZXh0ZW5kcyBJbmRpY3RlZHtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XG4iIC8vJE5PTi1OTFMtMSQKLQkJCSk7Ci0JCQotCQlmdWxsQnVpbGQocHJvamVjdFBhdGgpOwotCQkKLQkJZW52LmFkZENsYXNzKHJvb3QsICJwMSIsICJJbmRpY3RlZCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDE7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGFic3RyYWN0IGNsYXNzIEluZGljdGVkIHtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmb28oKTtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XG4iIC8vJE5PTi1OTFMtMSQKLQkJCSk7Ci0JCQkKLQkJaW5jcmVtZW50YWxCdWlsZChwcm9qZWN0UGF0aCk7Ci0KLQkJZXhwZWN0aW5nQ29tcGlsZWRDbGFzc2VzKG5ldyBTdHJpbmdbXXsicDIuQ29sbGFib3JhdG9yIiwgInAxLkluZGljdGVkIn0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZXhwZWN0aW5nQ29tcGlsaW5nT3JkZXIobmV3IFN0cmluZ1tdeyJwMS5JbmRpY3RlZCIsICJwMi5Db2xsYWJvcmF0b3IifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kQWRkaXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQotCQlJUGF0aCBwcm9qZWN0UGF0aCA9IGVudi5hZGRQcm9qZWN0KCJQcm9qZWN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZEV4dGVybmFsSmFyKHByb2plY3RQYXRoLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQkJZnVsbEJ1aWxkKHByb2plY3RQYXRoKTsKLQkJCi0JCS8vIHJlbW92ZSBvbGQgcGFja2FnZSBmcmFnbWVudCByb290IHNvIHRoYXQgbmFtZXMgZG9uJ3QgY29sbGlkZQotCQllbnYucmVtb3ZlUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlJUGF0aCByb290ID0gZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICJzcmMiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuc2V0T3V0cHV0Rm9sZGVyKHByb2plY3RQYXRoLCAiYmluIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWVudi5hZGRDbGFzcyhyb290LCAicDEiLCAiWCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDE7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIFgge1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIgl2b2lkIGZvbygpIHsJXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIn1cbiIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQkJCQotCQllbnYuYWRkQ2xhc3Mocm9vdCwgInAyIiwgIlkiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAyO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJImltcG9ydCBwMS4qO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBZIGV4dGVuZHMgWHtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XG4iIC8vJE5PTi1OTFMtMSQKLQkJCSk7Ci0JCQotCQllbnYuYWRkQ2xhc3Mocm9vdCwgInAzIiwgIloiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAyO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJImltcG9ydCBwMS4qO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBae1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIn1cbiIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQotCQlmdWxsQnVpbGQocHJvamVjdFBhdGgpOwotCQkKLQkJZW52LmFkZENsYXNzKHJvb3QsICJwMSIsICJYIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwMTtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiCXZvaWQgYmFyKCl7fQlcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCXZvaWQgZm9vKCkgewlcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQl9OwlcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiAvLyROT04tTkxTLTEkCi0JCQkpOwotCQkJCi0JCWluY3JlbWVudGFsQnVpbGQocHJvamVjdFBhdGgpOwotCi0JCWV4cGVjdGluZ0NvbXBpbGVkQ2xhc3NlcyhuZXcgU3RyaW5nW117InAxLlgiLCAicDIuWSJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWV4cGVjdGluZ0NvbXBpbGluZ09yZGVyKG5ldyBTdHJpbmdbXXsicDEuWCIsICJwMi5ZIiB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdExvY2FsVHlwZUFkZGl0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0KLQkJSVBhdGggcHJvamVjdFBhdGggPSBlbnYuYWRkUHJvamVjdCgiUHJvamVjdCIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwcm9qZWN0UGF0aCwgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0JCWZ1bGxCdWlsZChwcm9qZWN0UGF0aCk7Ci0JCQotCQkvLyByZW1vdmUgb2xkIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBzbyB0aGF0IG5hbWVzIGRvbid0IGNvbGxpZGUKLQkJZW52LnJlbW92ZVBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJSVBhdGggcm9vdCA9IGVudi5hZGRQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAic3JjIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LnNldE91dHB1dEZvbGRlcihwcm9qZWN0UGF0aCwgImJpbiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQllbnYuYWRkQ2xhc3Mocm9vdCwgInAxIiwgIlgiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAxO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIJdm9pZCBmb28oKSB7CVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XG4iIC8vJE5PTi1OTFMtMSQKLQkJCSk7Ci0JCQkKLQkJZW52LmFkZENsYXNzKHJvb3QsICJwMiIsICJZIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwMjtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJpbXBvcnQgcDEuKjtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgWSBleHRlbmRzIFh7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiAvLyROT04tTkxTLTEkCi0JCQkpOwotCQkKLQkJZW52LmFkZENsYXNzKHJvb3QsICJwMyIsICJaIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwMjtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJpbXBvcnQgcDEuKjtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgWntcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XG4iIC8vJE5PTi1OTFMtMSQKLQkJCSk7Ci0KLQkJZnVsbEJ1aWxkKHByb2plY3RQYXRoKTsKLQkJCi0JCWVudi5hZGRDbGFzcyhyb290LCAicDEiLCAiWCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDE7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIFgge1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIgl2b2lkIGZvbygpIHsJXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJbmV3IE9iamVjdCgpewlcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQl9OwlcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiAvLyROT04tTkxTLTEkCi0JCQkpOwotCQkJCi0JCWluY3JlbWVudGFsQnVpbGQocHJvamVjdFBhdGgpOwotCi0JCWV4cGVjdGluZ0NvbXBpbGVkQ2xhc3NlcyhuZXcgU3RyaW5nW117InAxLlgiLCAicDEuWCQxIn0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZXhwZWN0aW5nQ29tcGlsaW5nT3JkZXIobmV3IFN0cmluZ1tdeyJwMS5YIiwgInAxLlgkMSIgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMb2NhbFR5cGVBZGRpdGlvbjIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQotCQlJUGF0aCBwcm9qZWN0UGF0aCA9IGVudi5hZGRQcm9qZWN0KCJQcm9qZWN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZEV4dGVybmFsSmFyKHByb2plY3RQYXRoLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQkJZnVsbEJ1aWxkKHByb2plY3RQYXRoKTsKLQkJCi0JCS8vIHJlbW92ZSBvbGQgcGFja2FnZSBmcmFnbWVudCByb290IHNvIHRoYXQgbmFtZXMgZG9uJ3QgY29sbGlkZQotCQllbnYucmVtb3ZlUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlJUGF0aCByb290ID0gZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICJzcmMiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuc2V0T3V0cHV0Rm9sZGVyKHByb2plY3RQYXRoLCAiYmluIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWVudi5hZGRDbGFzcyhyb290LCAicDEiLCAiWCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDE7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIFgge1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIgl2b2lkIGZvbygpIHsJXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJbmV3IFgoKXsJXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJCXZvaWQgYmFyKCl7fQlcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQl9OwlcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiAvLyROT04tTkxTLTEkCi0JCQkpOwotCQkJCi0JCWVudi5hZGRDbGFzcyhyb290LCAicDIiLCAiWSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDI7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiaW1wb3J0IHAxLio7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIFkgZXh0ZW5kcyBYe1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIn1cbiIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQkJCi0JCWVudi5hZGRDbGFzcyhyb290LCAicDMiLCAiWiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDI7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiaW1wb3J0IHAxLio7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIFp7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiAvLyROT04tTkxTLTEkCi0JCQkpOwotCi0JCWZ1bGxCdWlsZChwcm9qZWN0UGF0aCk7Ci0JCQotCQllbnYuYWRkQ2xhc3Mocm9vdCwgInAxIiwgIlgiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAxO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIJdm9pZCBmb28oKSB7CVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCW5ldyBPYmplY3QoKXsJXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJfTsJXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJbmV3IFgoKXsJXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJCXZvaWQgYmFyKCl7fQlcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQl9OwlcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiAvLyROT04tTkxTLTEkCi0JCQkpOwotCQkJCi0JCWluY3JlbWVudGFsQnVpbGQocHJvamVjdFBhdGgpOwotCi0JCWV4cGVjdGluZ0NvbXBpbGVkQ2xhc3NlcyhuZXcgU3RyaW5nW117InAxLlgiLCAicDEuWCQxIiwgInAxLlgkMiJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJZXhwZWN0aW5nQ29tcGlsaW5nT3JkZXIobmV3IFN0cmluZ1tdeyJwMS5YIiwgInAxLlgkMSIsICJwMS5YJDIiIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMb2NhbFR5cGVSZW1vdmFsKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0KLQkJSVBhdGggcHJvamVjdFBhdGggPSBlbnYuYWRkUHJvamVjdCgiUHJvamVjdCIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwcm9qZWN0UGF0aCwgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0JCWZ1bGxCdWlsZChwcm9qZWN0UGF0aCk7Ci0JCQotCQkvLyByZW1vdmUgb2xkIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBzbyB0aGF0IG5hbWVzIGRvbid0IGNvbGxpZGUKLQkJZW52LnJlbW92ZVBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJSVBhdGggcm9vdCA9IGVudi5hZGRQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAic3JjIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LnNldE91dHB1dEZvbGRlcihwcm9qZWN0UGF0aCwgImJpbiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQllbnYuYWRkQ2xhc3Mocm9vdCwgInAxIiwgIlgiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAxO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIJdm9pZCBmb28oKSB7CVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCW5ldyBPYmplY3QoKXsJXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJfTsJXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIn1cbiIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQkJCQotCQllbnYuYWRkQ2xhc3Mocm9vdCwgInAyIiwgIlkiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAyO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJImltcG9ydCBwMS4qO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBZIGV4dGVuZHMgWHtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XG4iIC8vJE5PTi1OTFMtMSQKLQkJCSk7Ci0JCQotCQllbnYuYWRkQ2xhc3Mocm9vdCwgInAzIiwgIloiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAyO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJImltcG9ydCBwMS4qO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBae1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIn1cbiIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQotCQlmdWxsQnVpbGQocHJvamVjdFBhdGgpOwotCQkKLQkJZW52LmFkZENsYXNzKHJvb3QsICJwMSIsICJYIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwMTtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiCXZvaWQgZm9vKCkgewlcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiAvLyROT04tTkxTLTEkCi0JCQkpOwotCQkJCi0JCWluY3JlbWVudGFsQnVpbGQocHJvamVjdFBhdGgpOwotCi0JCWV4cGVjdGluZ0NvbXBpbGVkQ2xhc3NlcyhuZXcgU3RyaW5nW117InAxLlgifSk7IC8vJE5PTi1OTFMtMSQKLQkJZXhwZWN0aW5nQ29tcGlsaW5nT3JkZXIobmV3IFN0cmluZ1tdeyJwMS5YIiB9KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMb2NhbFR5cGVSZW1vdmFsMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCi0JCUlQYXRoIHByb2plY3RQYXRoID0gZW52LmFkZFByb2plY3QoIlByb2plY3QiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocHJvamVjdFBhdGgsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCQlmdWxsQnVpbGQocHJvamVjdFBhdGgpOwotCQkKLQkJLy8gcmVtb3ZlIG9sZCBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgc28gdGhhdCBuYW1lcyBkb24ndCBjb2xsaWRlCi0JCWVudi5yZW1vdmVQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUlQYXRoIHJvb3QgPSBlbnYuYWRkUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgInNyYyIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5zZXRPdXRwdXRGb2xkZXIocHJvamVjdFBhdGgsICJiaW4iKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJZW52LmFkZENsYXNzKHJvb3QsICJwMSIsICJYIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwMTtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiCXZvaWQgZm9vKCkgewlcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQluZXcgT2JqZWN0KCl7CVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCX07CVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCW5ldyBYKCl7CVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcigpe30JXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJfTsJXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIn1cbiIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQkJCQotCQllbnYuYWRkQ2xhc3Mocm9vdCwgInAyIiwgIlkiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAyO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJImltcG9ydCBwMS4qO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBZIGV4dGVuZHMgWHtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XG4iIC8vJE5PTi1OTFMtMSQKLQkJCSk7Ci0JCQotCQllbnYuYWRkQ2xhc3Mocm9vdCwgInAzIiwgIloiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAyO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJImltcG9ydCBwMS4qO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBae1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIn1cbiIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQotCQlmdWxsQnVpbGQocHJvamVjdFBhdGgpOwotCQkKLQkJZW52LmFkZENsYXNzKHJvb3QsICJwMSIsICJYIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwMTtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiCXZvaWQgZm9vKCkgewlcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQluZXcgWCgpewlcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJdm9pZCBiYXIoKXt9CVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCX07CVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XG4iIC8vJE5PTi1OTFMtMSQKLQkJCSk7Ci0JCQkKLQkJaW5jcmVtZW50YWxCdWlsZChwcm9qZWN0UGF0aCk7Ci0KLQkJZXhwZWN0aW5nQ29tcGlsZWRDbGFzc2VzKG5ldyBTdHJpbmdbXXsicDEuWCIsICJwMS5YJDEifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlleHBlY3RpbmdDb21waWxpbmdPcmRlcihuZXcgU3RyaW5nW117InAxLlgiLCAicDEuWCQxIiB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvYnVpbGRlci9FcnJvcnNUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvYnVpbGRlci9FcnJvcnNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDhiY2M4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2J1aWxkZXIvRXJyb3JzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLnV0aWwuVXRpbDsKLQotCi0vKioKLSAqIEJhc2ljIGVycm9ycyB0ZXN0cyBvZiB0aGUgaW1hZ2UgYnVpbGRlci4KLSAqLwotcHVibGljIGNsYXNzIEVycm9yc1Rlc3RzIGV4dGVuZHMgVGVzdHMgewotCXB1YmxpYyBFcnJvcnNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShFcnJvcnNUZXN0cy5jbGFzcyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFcnJvcnMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhdGggcHJvamVjdFBhdGggPSBlbnYuYWRkUHJvamVjdCgiUHJvamVjdCIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwcm9qZWN0UGF0aCwgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0JCWZ1bGxCdWlsZChwcm9qZWN0UGF0aCk7Ci0JCQotCQkvLyByZW1vdmUgb2xkIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBzbyB0aGF0IG5hbWVzIGRvbid0IGNvbGxpZGUKLQkJZW52LnJlbW92ZVBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsIiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlJUGF0aCByb290ID0gZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICJzcmMiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuc2V0T3V0cHV0Rm9sZGVyKHByb2plY3RQYXRoLCAiYmluIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWVudi5hZGRDbGFzcyhyb290LCAicDEiLCAiSW5kaWN0ZWQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAxO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbmRpY3RlZCB7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiAvLyROT04tTkxTLTEkCi0JCQkpOwotCQkJCi0JCUlQYXRoIGNvbGxhYm9yYXRvclBhdGggPSAgZW52LmFkZENsYXNzKHJvb3QsICJwMiIsICJDb2xsYWJvcmF0b3IiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAyO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJImltcG9ydCBwMS4qO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBDb2xsYWJvcmF0b3IgZXh0ZW5kcyBJbmRpY3RlZHtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XG4iIC8vJE5PTi1OTFMtMSQKLQkJCSk7Ci0JCQotCQlmdWxsQnVpbGQocHJvamVjdFBhdGgpOwotCQlleHBlY3RpbmdOb1Byb2JsZW1zKCk7Ci0JCQotCQllbnYuYWRkQ2xhc3Mocm9vdCwgInAxIiwgIkluZGljdGVkIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwMTtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW5kaWN0ZWQge1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIiAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGZvbygpO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIn1cbiIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQkJCQotCQlpbmNyZW1lbnRhbEJ1aWxkKHByb2plY3RQYXRoKTsKLQotCQlleHBlY3RpbmdPbmx5UHJvYmxlbXNGb3IoY29sbGFib3JhdG9yUGF0aCk7Ci0JCWV4cGVjdGluZ09ubHlTcGVjaWZpY1Byb2JsZW1Gb3IoY29sbGFib3JhdG9yUGF0aCwgbmV3IFByb2JsZW0oIkNvbGxhYm9yYXRvciIsICJDbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgaW5oZXJpdGVkIGFic3RyYWN0IG1ldGhvZCBJbmRpY3RlZC5mb28oKSIsIGNvbGxhYm9yYXRvclBhdGgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCQotCS8qCi0JICogUmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMjg1NyBSZW5hbWluZyAuamF2YSBjbGFzcyB3aXRoIGVycm9ycyB0byAudHh0IGxlYXZlcyBlcnJvcnMgaW4gVGFzayBsaXN0ICgxR0swNlIzKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RSZW5hbWVUb05vbkphdmEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhdGggcHJvamVjdFBhdGggPSBlbnYuYWRkUHJvamVjdCgiUHJvamVjdCIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwcm9qZWN0UGF0aCwgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0JCQotCQkvLyByZW1vdmUgb2xkIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBzbyB0aGF0IG5hbWVzIGRvbid0IGNvbGxpZGUKLQkJZW52LnJlbW92ZVBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsIiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlJUGF0aCByb290ID0gZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICJzcmMiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuc2V0T3V0cHV0Rm9sZGVyKHByb2plY3RQYXRoLCAiYmluIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUlQYXRoIGN1UGF0aCA9IGVudi5hZGRDbGFzcyhyb290LCAicDEiLCAiWCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDE7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBZIHtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XG4iIC8vJE5PTi1OTFMtMSQKLQkJCSk7Ci0JCQkKLQkJZnVsbEJ1aWxkKHByb2plY3RQYXRoKTsKLQkJZXhwZWN0aW5nT25seVByb2JsZW1zRm9yKGN1UGF0aCk7Ci0JCWV4cGVjdGluZ09ubHlTcGVjaWZpY1Byb2JsZW1Gb3IoY3VQYXRoLCBuZXcgUHJvYmxlbSgiWCIsICJZIGNhbm5vdCBiZSByZXNvbHZlZCBvciBpcyBub3QgYSB2YWxpZCBzdXBlcmNsYXNzIiwgY3VQYXRoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkKLQkJCi0JCWVudi5yZW5hbWVDVShyb290LmFwcGVuZCgicDEiKSwgIlguamF2YSIsICJYLnR4dCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlpbmNyZW1lbnRhbEJ1aWxkKHByb2plY3RQYXRoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvYnVpbGRlci9FeGVjdXRpb25UZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvYnVpbGRlci9FeGVjdXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWU1MDY4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2J1aWxkZXIvRXhlY3V0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMudXRpbC5VdGlsOwotCi0vKioKLSAqIEJhc2ljIGV4ZWN1dGlvbiB0ZXN0cyBvZiB0aGUgaW1hZ2UgYnVpbGRlci4KLSAqLwotcHVibGljIGNsYXNzIEV4ZWN1dGlvblRlc3RzIGV4dGVuZHMgVGVzdHMgewotCXB1YmxpYyBFeGVjdXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShFeGVjdXRpb25UZXN0cy5jbGFzcyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTdWNjZXNzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYXRoIHByb2plY3RQYXRoID0gZW52LmFkZFByb2plY3QoIlByb2plY3QiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocHJvamVjdFBhdGgsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCQlmdWxsQnVpbGQocHJvamVjdFBhdGgpOwotCQkKLQkJLy8gcmVtb3ZlIG9sZCBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgc28gdGhhdCBuYW1lcyBkb24ndCBjb2xsaWRlCi0JCWVudi5yZW1vdmVQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUlQYXRoIHJvb3QgPSBlbnYuYWRkUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgInNyYyIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5zZXRPdXRwdXRGb2xkZXIocHJvamVjdFBhdGgsICJiaW4iKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJZW52LmFkZENsYXNzKHJvb3QsICJwMSIsICJIZWxsbyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDE7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIEhlbGxvIHtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiSGVsbG8gd29ybGRcIik7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICAgfVxuIisgLy8kTk9OLU5MUy0xJAotCQkJIn1cbiIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQkJCQotCQlpbmNyZW1lbnRhbEJ1aWxkKHByb2plY3RQYXRoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCQlleGVjdXRlQ2xhc3MocHJvamVjdFBhdGgsICJwMS5IZWxsbyIsICJIZWxsbyB3b3JsZFxyXG4iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RGYWlsdXJlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYXRoIHByb2plY3RQYXRoID0gZW52LmFkZFByb2plY3QoIlByb2plY3QiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocHJvamVjdFBhdGgsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCQlmdWxsQnVpbGQocHJvamVjdFBhdGgpOwotCQkKLQkJLy8gcmVtb3ZlIG9sZCBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgc28gdGhhdCBuYW1lcyBkb24ndCBjb2xsaWRlCi0JCWVudi5yZW1vdmVQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUlQYXRoIHJvb3QgPSBlbnYuYWRkUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgInNyYyIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5zZXRPdXRwdXRGb2xkZXIocHJvamVjdFBhdGgsICJiaW4iKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJSVBhdGggaGVsbG9QYXRoID0gZW52LmFkZENsYXNzKHJvb3QsICJwMSIsICJIZWxsbyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDE7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIEhlbGxvIHtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiSGVsbG8gd29ybGRcIilcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIgICB9XG4iKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiAvLyROT04tTkxTLTEkCi0JCQkpOwotCQkvLyBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7Ci0JCS8vICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSGVsbG8gd29ybGQiKSA8LS0gbWlzc2luZyAiOyIKLQkJLy8gfQotCQkJCi0JCWluY3JlbWVudGFsQnVpbGQocHJvamVjdFBhdGgpOwotCQlleHBlY3RpbmdPbmx5UHJvYmxlbXNGb3IoaGVsbG9QYXRoKTsKLQkJZXhlY3V0ZUNsYXNzKHByb2plY3RQYXRoLCAicDEuSGVsbG8iLCAiIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkiamF2YS5sYW5nLkVycm9yOiBVbnJlc29sdmVkIGNvbXBpbGF0aW9uIHByb2JsZW06IFxuIiArICAvLyROT04tTkxTLTEkCi0JCQkiCU1pc3Npbmcgc2VtaWNvbG9uXG4iIC8vJE5PTi1OTFMtMSQKLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9idWlsZGVyL0ZpbHRlcmVkVGVzdFN1aXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9idWlsZGVyL0ZpbHRlcmVkVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNGRkODAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvYnVpbGRlci9GaWx0ZXJlZFRlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1wdWJsaWMgY2xhc3MgRmlsdGVyZWRUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBFWFBFUlQgPSBmYWxzZTsKLQlTdHJpbmdbXSBleGNsdWRlZFRlc3RzID0gbnVsbDsKLS8qKgotICogQ3JlYXRlcyBhIG5ldyB0ZXN0IHN1aXRlIGJ5IGV4Y2x1ZGluZyB0aGUgZ2l2ZW4gdGVzdHMKLSAqIGZyb20gdGhlIGdpdmVuIHRlc3Qgc3VpdGUgaWYgVGVzdHMuRVhQRVJUIGlzIGZhbHNlLgotICovCi1wdWJsaWMgRmlsdGVyZWRUZXN0U3VpdGUoU3RyaW5nW10gZXhjbHVkZWRUZXN0cykgewotCWlmKCFFWFBFUlQpIHsKLQkJdGhpcy5leGNsdWRlZFRlc3RzID0gZXhjbHVkZWRUZXN0czsKLQkJLy9mb3IgKGludCBpID0gMDsgaSA8IGV4Y2x1ZGVkVGVzdHMubGVuZ3RoOyBpKz0yKSB7Ci0JCS8vCVN5c3RlbS5vdXQucHJpbnRsbigiZXhjbHVkZWQgOiAiK2V4Y2x1ZGVkVGVzdHNbaV0rIiMiK2V4Y2x1ZGVkVGVzdHNbaSsxXSk7Ci0JCS8vfQotCX0KLX0KLS8qKgotICogQWRkcyBhIHRlc3QgdG8gdGhlIHN1aXRlLgotICovCi1wdWJsaWMgdm9pZCBhZGRUZXN0KFRlc3QgdGVzdCkgewotCWlmKEVYUEVSVCl7Ci0JCXN1cGVyLmFkZFRlc3QodGVzdCk7Ci0JfSBlbHNlIHsKLQkJaWYgKHRlc3QgaW5zdGFuY2VvZiBUZXN0Q2FzZSkgewotCQkJaWYgKCFpc0V4Y2x1ZGVkKChUZXN0Q2FzZSl0ZXN0KSkgewotCQkJCXN1cGVyLmFkZFRlc3QodGVzdCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAodGVzdCBpbnN0YW5jZW9mIFRlc3RTdWl0ZSkgewotCQkJamF2YS51dGlsLkVudW1lcmF0aW9uIGVudW0gPSAoKFRlc3RTdWl0ZSl0ZXN0KS50ZXN0cygpOwotCQkJd2hpbGUgKGVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQl0aGlzLmFkZFRlc3QoKFRlc3QpZW51bS5uZXh0RWxlbWVudCgpKTsKLQkJCX0KLQkJfQotCX0KLX0KLS8qKgotICogUmV0dXJucyB3aGV0aGVyIHRoZSB0ZXN0IGlzIGV4Y2x1ZGVkLgotICovCi1wdWJsaWMgYm9vbGVhbiBpc0V4Y2x1ZGVkKFRlc3RDYXNlIHRlc3QpIHsKLQlpZiAodGhpcy5leGNsdWRlZFRlc3RzID09IG51bGwpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuZXhjbHVkZWRUZXN0cy5sZW5ndGg7IGkgKz0gMikgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gdGhpcy5leGNsdWRlZFRlc3RzW2ldOwotCQlTdHJpbmcgbWV0aG9kTmFtZSA9IHRoaXMuZXhjbHVkZWRUZXN0c1tpKzFdOwotCQlpZiAodGVzdC5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZE5hbWUpICYmCi0JCQl0ZXN0LmdldENsYXNzKCkuZ2V0TmFtZSgpLmVuZHNXaXRoKGNsYXNzTmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9idWlsZGVyL0luY3JlbWVudGFsVGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2J1aWxkZXIvSW5jcmVtZW50YWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2ZlOWI1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2J1aWxkZXIvSW5jcmVtZW50YWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy51dGlsLlV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBJbmNyZW1lbnRhbFRlc3RzIGV4dGVuZHMgVGVzdHMgewotCi0JcHVibGljIEluY3JlbWVudGFsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShJbmNyZW1lbnRhbFRlc3RzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFBhY2thZ2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhdGggcHJvamVjdFBhdGggPSBlbnYuYWRkUHJvamVjdCgiUHJvamVjdCIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwcm9qZWN0UGF0aCwgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0JCWVudi5zZXRPdXRwdXRGb2xkZXIocHJvamVjdFBhdGgsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWVudi5hZGRDbGFzcyhwcm9qZWN0UGF0aCwgIiIsICJBIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicHVibGljIGNsYXNzIEEge30iKTsgLy8kTk9OLU5MUy0xJAotCi0JCWVudi5hZGRDbGFzcyhwcm9qZWN0UGF0aCwgIiIsICJCIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicHVibGljIGNsYXNzIEIge30iKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZ1bGxCdWlsZChwcm9qZWN0UGF0aCk7Ci0JCWV4cGVjdGluZ05vUHJvYmxlbXMoKTsKLQotCQllbnYuYWRkQ2xhc3MocHJvamVjdFBhdGgsICIiLCAiQiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInB1YmxpYyBjbGFzcyBCIHtBIGE7fSIpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5jcmVtZW50YWxCdWlsZChwcm9qZWN0UGF0aCk7Ci0JCWV4cGVjdGluZ05vUHJvYmxlbXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFBhY2thZ2UyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYXRoIHByb2plY3RQYXRoID0gZW52LmFkZFByb2plY3QoIlByb2plY3QiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocHJvamVjdFBhdGgsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCQllbnYuc2V0T3V0cHV0Rm9sZGVyKHByb2plY3RQYXRoLCAiYmluIik7IC8vJE5PTi1OTFMtMSQKLQotCQllbnYuYWRkQ2xhc3MocHJvamVjdFBhdGgsICIiLCAiQSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInB1YmxpYyBjbGFzcyBBIHt9Iik7IC8vJE5PTi1OTFMtMSQKLQotCQllbnYuYWRkQ2xhc3MocHJvamVjdFBhdGgsICIiLCAiQiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInB1YmxpYyBjbGFzcyBCIHt9Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlmdWxsQnVpbGQocHJvamVjdFBhdGgpOwotCQlleHBlY3RpbmdOb1Byb2JsZW1zKCk7Ci0KLQkJZW52LmFkZENsYXNzKHByb2plY3RQYXRoLCAiIiwgIkIiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwdWJsaWMgY2xhc3MgQiB7QSBhO30iKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluY3JlbWVudGFsQnVpbGQocHJvamVjdFBhdGgpOwotCQlleHBlY3RpbmdOb1Byb2JsZW1zKCk7Ci0JfQotCi0JLyoKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzMyOQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RSZW5hbWVNYWluVHlwZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJUGF0aCBwcm9qZWN0UGF0aCA9IGVudi5hZGRQcm9qZWN0KCJQcm9qZWN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZEV4dGVybmFsSmFyKHByb2plY3RQYXRoLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQotCQkvLyByZW1vdmUgb2xkIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBzbyB0aGF0IG5hbWVzIGRvbid0IGNvbGxpZGUKLQkJZW52LnJlbW92ZVBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCUlQYXRoIHJvb3QgPSBlbnYuYWRkUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgInNyYyIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5zZXRPdXRwdXRGb2xkZXIocHJvamVjdFBhdGgsICJiaW4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8qIEEuamF2YSAqLwotCQlJUGF0aCBwYXRoVG9BID0gZW52LmFkZENsYXNzKHJvb3QsICJwIiwgIkEiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHA7CVxuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBBIHt9Iik7IC8vJE5PTi1OTFMtMSQKLQotCQkvKiBCLmphdmEgKi8KLQkJSVBhdGggcGF0aFRvQiA9IGVudi5hZGRDbGFzcyhyb290LCAicCIsICJCIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwOwlcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgQiBleHRlbmRzIEEge30iKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8qIEMuamF2YSAqLwotCQlJUGF0aCBwYXRoVG9DID0gZW52LmFkZENsYXNzKHJvb3QsICJwIiwgIkMiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHA7CVxuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBDIGV4dGVuZHMgQiB7fSIpOyAvLyROT04tTkxTLTEkCi0KLQkJZnVsbEJ1aWxkKHByb2plY3RQYXRoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCi0JCS8qIFRvdWNoIGJvdGggQSBhbmQgQywgcmVtb3ZpbmcgQSBtYWluIHR5cGUgKi8KLQkJcGF0aFRvQSA9IGVudi5hZGRDbGFzcyhyb290LCAicCIsICJBIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwOwlcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgX0Ege30iKTsgLy8kTk9OLU5MUy0xJAotCi0JCXBhdGhUb0MgPSBlbnYuYWRkQ2xhc3Mocm9vdCwgInAiLCAiQyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDsJXG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIEMgZXh0ZW5kcyBCIHsgfSIpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5jcmVtZW50YWxCdWlsZChwcm9qZWN0UGF0aCk7Ci0JCWV4cGVjdGluZ1Byb2JsZW1zRm9yKG5ldyBJUGF0aFtdeyBwYXRoVG9BLCBwYXRoVG9CLCBwYXRoVG9DIH0pOwotCQlleHBlY3RpbmdTcGVjaWZpY1Byb2JsZW1Gb3IocGF0aFRvQSwgbmV3IFByb2JsZW0oIl9BIiwgIlRoZSBwdWJsaWMgdHlwZSBfQSBtdXN0IGJlIGRlZmluZWQgaW4gaXRzIG93biBmaWxlIiwgcGF0aFRvQSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZXhwZWN0aW5nU3BlY2lmaWNQcm9ibGVtRm9yKHBhdGhUb0IsIG5ldyBQcm9ibGVtKCJCIiwgIkEgY2Fubm90IGJlIHJlc29sdmVkIG9yIGlzIG5vdCBhIHZhbGlkIHN1cGVyY2xhc3MiLCBwYXRoVG9CKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlleHBlY3RpbmdTcGVjaWZpY1Byb2JsZW1Gb3IocGF0aFRvQywgbmV3IFByb2JsZW0oIkMiLCAiVGhlIGhpZXJhcmNoeSBvZiB0aGUgdHlwZSBDIGlzIGluY29uc2lzdGVudCIsIHBhdGhUb0MpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJLyogVG91Y2ggYm90aCBBIGFuZCBDLCByZW1vdmluZyBBIG1haW4gdHlwZSAqLwotCQlwYXRoVG9BID0gZW52LmFkZENsYXNzKHJvb3QsICJwIiwgIkEiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHA7CVxuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBBIHt9Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlpbmNyZW1lbnRhbEJ1aWxkKHByb2plY3RQYXRoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCX0KLQotCS8qCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc4MDcKLQkgKiBjYXNlIDEKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU2Vjb25kYXJ5VHlwZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJUGF0aCBwcm9qZWN0UGF0aCA9IGVudi5hZGRQcm9qZWN0KCJQcm9qZWN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZEV4dGVybmFsSmFyKHByb2plY3RQYXRoLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQotCQkvLyByZW1vdmUgb2xkIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBzbyB0aGF0IG5hbWVzIGRvbid0IGNvbGxpZGUKLQkJZW52LnJlbW92ZVBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCUlQYXRoIHJvb3QgPSBlbnYuYWRkUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgInNyYyIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5zZXRPdXRwdXRGb2xkZXIocHJvamVjdFBhdGgsICJiaW4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCWVudi5hZGRDbGFzcyhyb290LCAicCIsICJBQSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDsJXG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIEFBIHt9CVxuIisgLy8kTk9OLU5MUy0xJAotCQkJImNsYXNzIEFaIHt9Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlJUGF0aCBwYXRoVG9BQiA9IGVudi5hZGRDbGFzcyhyb290LCAicCIsICJBQiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDsJXG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIEFCIGV4dGVuZHMgQVoge30iKTsgLy8kTk9OLU5MUy0xJAotCi0JCWVudi5hZGRDbGFzcyhyb290LCAicCIsICJCQiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDsJXG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIEJCIHsJXG4iKyAvLyROT04tTkxTLTEkCi0JCQkiCXZvaWQgZm9vKCl7CVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihuZXcgQUIoKSk7CVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihuZXcgWkEoKSk7CVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJfQlcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkifSIpOyAvLyROT04tTkxTLTEkCi0KLQkJZW52LmFkZENsYXNzKHJvb3QsICJwIiwgIlpaIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwOwlcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgWloge30JXG4iKyAvLyROT04tTkxTLTEkCi0JCQkiY2xhc3MgWkEge30iKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZ1bGxCdWlsZChwcm9qZWN0UGF0aCk7Ci0JCWV4cGVjdGluZ05vUHJvYmxlbXMoKTsKLQotCQkvKiBSZW1vdmUgQVogYW5kIHRvdWNoIEJCICovCi0JCWVudi5hZGRDbGFzcyhyb290LCAicCIsICJBQSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDsJXG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIEFBIHt9Iik7IC8vJE5PTi1OTFMtMSQKLQotCQllbnYuYWRkQ2xhc3Mocm9vdCwgInAiLCAiQkIiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHA7CVxuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBCQiB7CVxuIisgLy8kTk9OLU5MUy0xJAotCQkJIgl2b2lkIGZvbygpIHsJXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKG5ldyBBQigpKTsJXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKG5ldyBaQSgpKTsJXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl9CVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJ9Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlpbmNyZW1lbnRhbEJ1aWxkKHByb2plY3RQYXRoKTsKLQkJZXhwZWN0aW5nUHJvYmxlbXNGb3IobmV3IElQYXRoW117IHBhdGhUb0FCIH0pOwotCQlleHBlY3RpbmdTcGVjaWZpY1Byb2JsZW1Gb3IocGF0aFRvQUIsIG5ldyBQcm9ibGVtKCJBQiIsICJBWiBjYW5ub3QgYmUgcmVzb2x2ZWQgb3IgaXMgbm90IGEgdmFsaWQgc3VwZXJjbGFzcyIsIHBhdGhUb0FCKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWVudi5hZGRDbGFzcyhyb290LCAicCIsICJBQSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDsJXG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIEFBIHt9CVxuIisgLy8kTk9OLU5MUy0xJAotCQkJImNsYXNzIEFaIHt9Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlpbmNyZW1lbnRhbEJ1aWxkKHByb2plY3RQYXRoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCX0KLQotCS8qCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc4MDcKLQkgKiBjYXNlIDIKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU2Vjb25kYXJ5VHlwZTIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhdGggcHJvamVjdFBhdGggPSBlbnYuYWRkUHJvamVjdCgiUHJvamVjdCIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwcm9qZWN0UGF0aCwgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0KLQkJLy8gcmVtb3ZlIG9sZCBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgc28gdGhhdCBuYW1lcyBkb24ndCBjb2xsaWRlCi0JCWVudi5yZW1vdmVQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQlJUGF0aCByb290ID0gZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICJzcmMiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuc2V0T3V0cHV0Rm9sZGVyKHByb2plY3RQYXRoLCAiYmluIik7IC8vJE5PTi1OTFMtMSQKLQotCQllbnYuYWRkQ2xhc3Mocm9vdCwgInAiLCAiQUEiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHA7CVxuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBBQSB7fQlcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJjbGFzcyBBWiB7fSIpOyAvLyROT04tTkxTLTEkCi0KLQkJZW52LmFkZENsYXNzKHJvb3QsICJwIiwgIkFCIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwOwlcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgQUIgZXh0ZW5kcyBBWiB7fSIpOyAvLyROT04tTkxTLTEkCi0KLQkJSVBhdGggcGF0aFRvQkIgPSBlbnYuYWRkQ2xhc3Mocm9vdCwgInAiLCAiQkIiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHA7CVxuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBCQiB7CVxuIisgLy8kTk9OLU5MUy0xJAotCQkJIgl2b2lkIGZvbygpewlcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4obmV3IEFCKCkpOwlcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4obmV3IFpBKCkpOwlcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCX0JXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIn0iKTsgLy8kTk9OLU5MUy0xJAotCi0JCWVudi5hZGRDbGFzcyhyb290LCAicCIsICJaWiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDsJXG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIFpaIHt9CVxuIisgLy8kTk9OLU5MUy0xJAotCQkJImNsYXNzIFpBIHt9Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlmdWxsQnVpbGQocHJvamVjdFBhdGgpOwotCQlleHBlY3RpbmdOb1Byb2JsZW1zKCk7Ci0KLQkJLyogUmVtb3ZlIFpBIGFuZCB0b3VjaCBCQiAqLwotCQllbnYuYWRkQ2xhc3Mocm9vdCwgInAiLCAiWloiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHA7CVxuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBaWiB7fSIpOyAvLyROT04tTkxTLTEkCi0KLQkJcGF0aFRvQkIgPSBlbnYuYWRkQ2xhc3Mocm9vdCwgInAiLCAiQkIiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHA7CVxuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBCQiB7CVxuIisgLy8kTk9OLU5MUy0xJAotCQkJIgl2b2lkIGZvbygpIHsJXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKG5ldyBBQigpKTsJXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKG5ldyBaQSgpKTsJXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl9CVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJ9Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlpbmNyZW1lbnRhbEJ1aWxkKHByb2plY3RQYXRoKTsKLQkJZXhwZWN0aW5nUHJvYmxlbXNGb3IobmV3IElQYXRoW117IHBhdGhUb0JCIH0pOwotCQlleHBlY3RpbmdTcGVjaWZpY1Byb2JsZW1Gb3IocGF0aFRvQkIsIG5ldyBQcm9ibGVtKCJCQi5mb28oKSIsICJaQSBjYW5ub3QgYmUgcmVzb2x2ZWQgb3IgaXMgbm90IGEgdHlwZSIsIHBhdGhUb0JCKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWVudi5hZGRDbGFzcyhyb290LCAicCIsICJaWiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDsJXG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIFpaIHt9CVxuIisgLy8kTk9OLU5MUy0xJAotCQkJImNsYXNzIFpBIHt9Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlpbmNyZW1lbnRhbEJ1aWxkKHByb2plY3RQYXRoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU2Vjb25kYXJ5VHlwZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJUGF0aCBwcm9qZWN0UGF0aCA9IGVudi5hZGRQcm9qZWN0KCJQcm9qZWN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZEV4dGVybmFsSmFyKHByb2plY3RQYXRoLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQotCQkvLyByZW1vdmUgb2xkIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBzbyB0aGF0IG5hbWVzIGRvbid0IGNvbGxpZGUKLQkJZW52LnJlbW92ZVBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCUlQYXRoIHJvb3QgPSBlbnYuYWRkUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgInNyYyIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5zZXRPdXRwdXRGb2xkZXIocHJvamVjdFBhdGgsICJiaW4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCWVudi5hZGRDbGFzcyhyb290LCAicCIsICJBQSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDsgXG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIEFBIHt9IFxuIisgLy8kTk9OLU5MUy0xJAotCQkJImNsYXNzIEFaIHt9Iik7IC8vJE5PTi1OTFMtMSQKLQotCQllbnYuYWRkQ2xhc3Mocm9vdCwgInAiLCAiQUIiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHA7IFxuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBBQiBleHRlbmRzIEFaIHt9Iik7IC8vJE5PTi1OTFMtMSQKLQotCQllbnYuYWRkQ2xhc3Mocm9vdCwgInAiLCAiWloiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHA7IFxuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBaWiB7fSIpOyAvLyROT04tTkxTLTEkCi0KLQkJZnVsbEJ1aWxkKHByb2plY3RQYXRoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCi0JCS8qIE1vdmUgQVogZnJvbSBBQSB0byBaWiAqLwotCQllbnYuYWRkQ2xhc3Mocm9vdCwgInAiLCAiQUEiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHA7IFxuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBBQSB7fSIpOyAvLyROT04tTkxTLTEkCi0KLQkJZW52LmFkZENsYXNzKHJvb3QsICJwIiwgIlpaIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwOyBcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgWloge30gXG4iKyAvLyROT04tTkxTLTEkCi0JCQkiY2xhc3MgQVoge30iKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluY3JlbWVudGFsQnVpbGQocHJvamVjdFBhdGgpOwotCQlleHBlY3RpbmdOb1Byb2JsZW1zKCk7Ci0KLQkJLyogTW92ZSBBWiBmcm9tIFpaIHRvIEFBICovCi0JCWVudi5hZGRDbGFzcyhyb290LCAicCIsICJBQSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDsgXG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIEFBIHt9IFxuIisgLy8kTk9OLU5MUy0xJAotCQkJImNsYXNzIEFaIHt9Iik7IC8vJE5PTi1OTFMtMSQKLQotCQllbnYuYWRkQ2xhc3Mocm9vdCwgInAiLCAiWloiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHA7IFxuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBaWiB7fSIpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5jcmVtZW50YWxCdWlsZChwcm9qZWN0UGF0aCk7Ci0JCWV4cGVjdGluZ05vUHJvYmxlbXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZU1lbWJlclR5cGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhdGggcHJvamVjdFBhdGggPSBlbnYuYWRkUHJvamVjdCgiUHJvamVjdCIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwcm9qZWN0UGF0aCwgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0KLQkJLy8gcmVtb3ZlIG9sZCBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgc28gdGhhdCBuYW1lcyBkb24ndCBjb2xsaWRlCi0JCWVudi5yZW1vdmVQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQlJUGF0aCByb290ID0gZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICJzcmMiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuc2V0T3V0cHV0Rm9sZGVyKHByb2plY3RQYXRoLCAiYmluIik7IC8vJE5PTi1OTFMtMSQKLQotCQllbnYuYWRkQ2xhc3Mocm9vdCwgInAiLCAiQUEiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHA7IFxuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBBQSB7fSBcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJjbGFzcyBBWiB7c3RhdGljIGNsYXNzIE17fX0iKTsgLy8kTk9OLU5MUy0xJAotCi0JCWVudi5hZGRDbGFzcyhyb290LCAicCIsICJBQiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDsgXG4iKyAvLyROT04tTkxTLTEkCi0JCQkiaW1wb3J0IHAuQVouKjsgXG4iKyAvLyROT04tTkxTLTEkCi0JCQkiaW1wb3J0IHAuWkEuKjsgXG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIEFCIGV4dGVuZHMgTSB7fSIpOyAvLyROT04tTkxTLTEkCi0KLQkJZW52LmFkZENsYXNzKHJvb3QsICJwIiwgIlpaIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwOyBcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgWloge30gXG4iKyAvLyROT04tTkxTLTEkCi0JCQkiY2xhc3MgWkEge30iKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZ1bGxCdWlsZChwcm9qZWN0UGF0aCk7Ci0JCWV4cGVjdGluZ09ubHlTcGVjaWZpY1Byb2JsZW1zRm9yKAotCQkJcm9vdCwgCi0JCQluZXcgUHJvYmxlbVtdeyAKLQkJCQluZXcgUHJvYmxlbSgiIiwgIlRoZSBpbXBvcnQgcC5aQSBpcyBuZXZlciB1c2VkIiwgbmV3IFBhdGgoIi9Qcm9qZWN0L3NyYy9wL0FCLmphdmEiKSksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9KTsKLQotCQkvKiBNb3ZlIE0gZnJvbSBBQSB0byBaWiAqLwotCQllbnYuYWRkQ2xhc3Mocm9vdCwgInAiLCAiQUEiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHA7IFxuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBBQSB7fSBcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJjbGFzcyBBWiB7fSIpOyAvLyROT04tTkxTLTEkCi0KLQkJZW52LmFkZENsYXNzKHJvb3QsICJwIiwgIlpaIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwOyBcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgWloge30gXG4iKyAvLyROT04tTkxTLTEkCi0JCQkiY2xhc3MgWkEge3N0YXRpYyBjbGFzcyBNe319Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlpbmNyZW1lbnRhbEJ1aWxkKHByb2plY3RQYXRoKTsKLQkJZXhwZWN0aW5nT25seVNwZWNpZmljUHJvYmxlbXNGb3IoCi0JCQlyb290LCAKLQkJCW5ldyBQcm9ibGVtW117IAotCQkJCW5ldyBQcm9ibGVtKCIiLCAiVGhlIGltcG9ydCBwLkFaIGlzIG5ldmVyIHVzZWQiLCBuZXcgUGF0aCgiL1Byb2plY3Qvc3JjL3AvQUIuamF2YSIpKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0pOwotCi0JCS8qIE1vdmUgTSBmcm9tIFpaIHRvIEFBICovCi0JCWVudi5hZGRDbGFzcyhyb290LCAicCIsICJBQSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDsgXG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIEFBIHt9IFxuIisgLy8kTk9OLU5MUy0xJAotCQkJImNsYXNzIEFaIHtzdGF0aWMgY2xhc3MgTXt9fSIpOyAvLyROT04tTkxTLTEkCi0KLQkJZW52LmFkZENsYXNzKHJvb3QsICJwIiwgIlpaIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwOyBcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgWloge30gXG4iKyAvLyROT04tTkxTLTEkCi0JCQkiY2xhc3MgWkEge30iKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluY3JlbWVudGFsQnVpbGQocHJvamVjdFBhdGgpOwotCQlleHBlY3RpbmdPbmx5U3BlY2lmaWNQcm9ibGVtc0ZvcigKLQkJCXJvb3QsIAotCQkJbmV3IFByb2JsZW1bXXsgCi0JCQkJbmV3IFByb2JsZW0oIiIsICJUaGUgaW1wb3J0IHAuWkEgaXMgbmV2ZXIgdXNlZCIsIG5ldyBQYXRoKCIvUHJvamVjdC9zcmMvcC9BQi5qYXZhIikpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVQYWNrYWdlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYXRoIHByb2plY3RQYXRoID0gZW52LmFkZFByb2plY3QoIlByb2plY3QiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocHJvamVjdFBhdGgsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCQllbnYucmVtb3ZlUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCUlQYXRoW10gZXhjbHVzaW9uUGF0dGVybnMgPSBuZXcgUGF0aFtdIHtuZXcgUGF0aCgic3JjMi8iKX07IC8vJE5PTi1OTFMtMSQKLQkJSVBhdGggc3JjMSA9IGVudi5hZGRQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAic3JjMSIsIGV4Y2x1c2lvblBhdHRlcm5zLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAKLQkJSVBhdGggc3JjMiA9IGVudi5hZGRQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAic3JjMS9zcmMyIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LnNldE91dHB1dEZvbGRlcihwcm9qZWN0UGF0aCwgImJpbiIpOyAvLyROT04tTkxTLTEkCi0KLQkJZW52LmFkZENsYXNzKHNyYzEsICJwIiwgIkEiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHA7IFxuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBBIHt9Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlmdWxsQnVpbGQocHJvamVjdFBhdGgpOwotCQlleHBlY3RpbmdOb1Byb2JsZW1zKCk7Ci0KLQkJZW52LnJlbW92ZVBhY2thZ2Uoc3JjMSwgInAiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkQ2xhc3Moc3JjMiwgInAiLCAiQSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDsgXG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIEEge30iKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluY3JlbWVudGFsQnVpbGQocHJvamVjdFBhdGgpOwotCQlleHBlY3RpbmdOb1Byb2JsZW1zKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1lbWJlclR5cGVGcm9tQ2xhc3NGaWxlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYXRoIHByb2plY3RQYXRoID0gZW52LmFkZFByb2plY3QoIlByb2plY3QiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocHJvamVjdFBhdGgsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCi0JCS8vIHJlbW92ZSBvbGQgcGFja2FnZSBmcmFnbWVudCByb290IHNvIHRoYXQgbmFtZXMgZG9uJ3QgY29sbGlkZQotCQllbnYucmVtb3ZlUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJSVBhdGggcm9vdCA9IGVudi5hZGRQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAic3JjIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LnNldE91dHB1dEZvbGRlcihwcm9qZWN0UGF0aCwgImJpbiIpOyAvLyROT04tTkxTLTEkCi0KLQkJZW52LmFkZENsYXNzKHJvb3QsICJwIiwgIkEiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHA7IFxuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBBIGV4dGVuZHMgWiB7TVtdIG07fSIpOyAvLyROT04tTkxTLTEkCi0KLQkJZW52LmFkZENsYXNzKHJvb3QsICJwIiwgIkIiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHA7IFxuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBCIHtBIGE7IEUgZTsgXG4iKyAvLyROT04tTkxTLTEkCi0JCQkidm9pZCBmb28oKSB7IFN5c3RlbS5vdXQucHJpbnRsbihhLm0pOyB9fSIpOyAvLyROT04tTkxTLTEkCi0KLQkJZW52LmFkZENsYXNzKHJvb3QsICJwIiwgIkUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHA7IFxuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBFIGV4dGVuZHMgWiB7IFxuIisgLy8kTk9OLU5MUy0xJAotCQkJInZvaWQgZm9vKCkgeyBTeXN0ZW0ub3V0LnByaW50bG4obmV3IE0oKSk7IH19Iik7IC8vJE5PTi1OTFMtMSQKLQotCQllbnYuYWRkQ2xhc3Mocm9vdCwgInAiLCAiWiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDsgXG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIFoge3N0YXRpYyBjbGFzcyBNIHt9fSIpOyAvLyROT04tTkxTLTEkCi0KLQkJZnVsbEJ1aWxkKHByb2plY3RQYXRoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCi0JCWVudi5hZGRDbGFzcyhyb290LCAicCIsICJCIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwOyBcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgQiB7QSBhOyBFIGU7IFxuIisgLy8kTk9OLU5MUy0xJAotCQkJInZvaWQgZm9vKCApIHsgU3lzdGVtLm91dC5wcmludGxuKGEubSk7IH19Iik7IC8vJE5PTi1OTFMtMSQKLQotCQllbnYuYWRkQ2xhc3Mocm9vdCwgInAiLCAiRSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDsgXG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIEUgZXh0ZW5kcyBaIHsgXG4iKyAvLyROT04tTkxTLTEkCi0JCQkidm9pZCBmb28oICkgeyBTeXN0ZW0ub3V0LnByaW50bG4obmV3IE0oKSk7IH19Iik7IC8vJE5PTi1OTFMtMSQKLQotCQllbnYuYWRkQ2xhc3Mocm9vdCwgInAiLCAiWiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDsgXG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIFogeyBzdGF0aWMgY2xhc3MgTSB7fSB9Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlpbnQgcHJldmlvdXMgPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyLkFic3RyYWN0SW1hZ2VCdWlsZGVyLk1BWF9BVF9PTkNFOwotCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5idWlsZGVyLkFic3RyYWN0SW1hZ2VCdWlsZGVyLk1BWF9BVF9PTkNFID0gMTsgLy8gcmVkdWNlIHRoZSBsb3Qgc2l6ZQotCQlpbmNyZW1lbnRhbEJ1aWxkKHByb2plY3RQYXRoKTsKLQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuYnVpbGRlci5BYnN0cmFjdEltYWdlQnVpbGRlci5NQVhfQVRfT05DRSA9IHByZXZpb3VzOwotCQlleHBlY3RpbmdOb1Byb2JsZW1zKCk7Ci0JfQotCQotCS8vIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc2NTgKLQlwdWJsaWMgdm9pZCB0ZXN0T2JqZWN0V2l0aFN1cGVySW50ZXJmYWNlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQl0cnkgewotCQkJSVBhdGggcHJvamVjdFBhdGggPSBlbnYuYWRkUHJvamVjdCgiUHJvamVjdCIpOyAvLyROT04tTkxTLTEkCi0JCQllbnYuYWRkRXh0ZXJuYWxKYXIocHJvamVjdFBhdGgsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCQotCQkJLy8gcmVtb3ZlIG9sZCBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgc28gdGhhdCBuYW1lcyBkb24ndCBjb2xsaWRlCi0JCQllbnYucmVtb3ZlUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCi0JCQlJUGF0aCByb290ID0gZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICJzcmMiKTsgLy8kTk9OLU5MUy0xJAotCQkJZW52LnNldE91dHB1dEZvbGRlcihwcm9qZWN0UGF0aCwgImJpbiIpOyAvLyROT04tTkxTLTEkCi0JCi0JCQllbnYuYWRkQ2xhc3Mocm9vdCwgImphdmEubGFuZyIsICJPYmplY3QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkicGFja2FnZSBqYXZhLmxhbmc7IFxuIisgLy8kTk9OLU5MUy0xJAotCQkJCSJwdWJsaWMgY2xhc3MgT2JqZWN0IGltcGxlbWVudHMgSSB7fSBcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCQkiaW50ZXJmYWNlIEkge30JXG4iKTsJLy8kTk9OLU5MUy0xJAotCQotCQkJZnVsbEJ1aWxkKHByb2plY3RQYXRoKTsKLQotCQkJZXhwZWN0aW5nT25seVNwZWNpZmljUHJvYmxlbXNGb3IoCi0JCQkJcm9vdCwgCi0JCQkJbmV3IFByb2JsZW1bXXsKLQkJCQkJbmV3IFByb2JsZW0oIiIsICJUaGUgdHlwZSBqYXZhLmxhbmcuT2JqZWN0IGNhbm5vdCBoYXZlIGEgc3VwZXJjbGFzcyBvciBzdXBlcmludGVyZmFjZXMiLCBuZXcgUGF0aCgiL1Byb2plY3Qvc3JjL2phdmEvbGFuZy9PYmplY3QuamF2YSIpKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQJCQkJCi0JCQkJfSk7Ci0JCi0JCQllbnYuYWRkQ2xhc3Mocm9vdCwgInAiLCAiWCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCSJwYWNrYWdlIHA7IFxuIisgLy8kTk9OLU5MUy0xJAotCQkJCSJwdWJsaWMgY2xhc3MgWCB7fVxuIik7IC8vJE5PTi1OTFMtMSQKLQkKLQkJCWluY3JlbWVudGFsQnVpbGQocHJvamVjdFBhdGgpOwotCQotCQkJZXhwZWN0aW5nT25seVNwZWNpZmljUHJvYmxlbXNGb3IoCi0JCQkJcm9vdCwgCi0JCQkJbmV3IFByb2JsZW1bXXsKLQkJCQkJbmV3IFByb2JsZW0oIiIsICJUaGUgdHlwZSBqYXZhLmxhbmcuT2JqZWN0IGNhbm5vdCBoYXZlIGEgc3VwZXJjbGFzcyBvciBzdXBlcmludGVyZmFjZXMiLCBuZXcgUGF0aCgiL1Byb2plY3Qvc3JjL2phdmEvbGFuZy9PYmplY3QuamF2YSIpKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQJCQkJCi0JCQkJfSk7Ci0KLQkJCWVudi5hZGRDbGFzcyhyb290LCAicCIsICJZIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJInBhY2thZ2UgcDsgXG4iKyAvLyROT04tTkxTLTEkCi0JCQkJInB1YmxpYyBjbGFzcyBZIGV4dGVuZHMgWCB7fVxuIik7IC8vJE5PTi1OTFMtMSQKLQkKLQkJCWluY3JlbWVudGFsQnVpbGQocHJvamVjdFBhdGgpOwotCi0JCQlleHBlY3RpbmdPbmx5U3BlY2lmaWNQcm9ibGVtc0ZvcigKLQkJCQlyb290LCAKLQkJCQluZXcgUHJvYmxlbVtdewotCQkJCQluZXcgUHJvYmxlbSgiIiwgIlRoZSB0eXBlIGphdmEubGFuZy5PYmplY3QgY2Fubm90IGhhdmUgYSBzdXBlcmNsYXNzIG9yIHN1cGVyaW50ZXJmYWNlcyIsIG5ldyBQYXRoKCIvUHJvamVjdC9zcmMvamF2YS9sYW5nL09iamVjdC5qYXZhIikpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAkJCQkKLQkJCQl9KTsKLQotCQl9IGNhdGNoKFN0YWNrT3ZlcmZsb3dFcnJvciBlKXsKLQkJCWFzc2VydFRydWUoIkluZmluaXRlIGxvb3AgaW4gY3ljbGUgZGV0ZWN0aW9uIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvYnVpbGRlci9KQ0xUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvYnVpbGRlci9KQ0xUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmI1MGM0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2J1aWxkZXIvSkNMVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotLyoqCi0gKiBCYXNpYyB0ZXN0cyBvZiB0aGUgaW1hZ2UgYnVpbGRlci4KLSAqLwotcHVibGljIGNsYXNzIEpDTFRlc3RzIGV4dGVuZHMgVGVzdHMgewotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIEVYQ0xVREVEX1RFU1RTID0gewotCQkiSkNMVGVzdHMiLCAidGVzdE5ld0pDTCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfTsKLQkKLQlwdWJsaWMgSkNMVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IEZpbHRlcmVkVGVzdFN1aXRlKEVYQ0xVREVEX1RFU1RTKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEpDTFRlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TmV3SkNMKCkgewotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJLy8gICAgICAgICAgIFN0ZXAgMQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJSVBhdGggcHJvamVjdFBhdGggPSBlbnYuYWRkUHJvamVjdCgiUHJvamVjdCIpOyAvLyROT04tTkxTLTEkCi0KLQkJSVBhdGggcm9vdCA9IGVudi5nZXRQYWNrYWdlRnJhZ21lbnRSb290UGF0aChwcm9qZWN0UGF0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWZ1bGxCdWlsZCgpOwotCQlleHBlY3RpbmdOb1Byb2JsZW1zKCk7Ci0JCQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJLy8gICAgICAgICAgIFN0ZXAgMgotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJSVBhdGggb2JqZWN0ID0gZW52LmFkZENsYXNzKHJvb3QsICJqYXZhLmxhbmciLCAiT2JqZWN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBqYXZhLmxhbmc7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBPYmplY3Qge1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIn1cbiIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQkJCQotCi0JCWluY3JlbWVudGFsQnVpbGQoKTsKLQkJZXhwZWN0aW5nU3BlY2lmaWNQcm9ibGVtRm9yKG9iamVjdCwgbmV3IFByb2JsZW0oImphdmEubGFuZyIsICJUaGlzIGNvbXBpbGF0aW9uIHVuaXQgaW5kaXJlY3RseSByZWZlcmVuY2VzIHRoZSBtaXNzaW5nIHR5cGUgamF2YS5sYW5nLlRocm93YWJsZSAodHlwaWNhbGx5IHNvbWUgcmVxdWlyZWQgY2xhc3MgZmlsZSBpcyByZWZlcmVuY2luZyBhIHR5cGUgb3V0c2lkZSB0aGUgY2xhc3NwYXRoKSIsIG9iamVjdCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyAgICAgICAgICAgU3RlcCAzCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlJUGF0aCB0aHJvd2FibGUgPSBlbnYuYWRkQ2xhc3Mocm9vdCwgImphdmEubGFuZyIsICJUaHJvd2FibGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIGphdmEubGFuZztcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIFRocm93YWJsZSB7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiAvLyROT04tTkxTLTEkCi0JCQkpOwotCQkJCi0KLQkJaW5jcmVtZW50YWxCdWlsZCgpOwotCQlleHBlY3RpbmdTcGVjaWZpY1Byb2JsZW1Gb3Iob2JqZWN0LCBuZXcgUHJvYmxlbSgiamF2YS5sYW5nIiwgIlRoaXMgY29tcGlsYXRpb24gdW5pdCBpbmRpcmVjdGx5IHJlZmVyZW5jZXMgdGhlIG1pc3NpbmcgdHlwZSBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiAodHlwaWNhbGx5IHNvbWUgcmVxdWlyZWQgY2xhc3MgZmlsZSBpcyByZWZlcmVuY2luZyBhIHR5cGUgb3V0c2lkZSB0aGUgY2xhc3NwYXRoKSIsIG9iamVjdCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZXhwZWN0aW5nU3BlY2lmaWNQcm9ibGVtRm9yKHRocm93YWJsZSwgbmV3IFByb2JsZW0oImphdmEubGFuZyIsICJUaGlzIGNvbXBpbGF0aW9uIHVuaXQgaW5kaXJlY3RseSByZWZlcmVuY2VzIHRoZSBtaXNzaW5nIHR5cGUgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24gKHR5cGljYWxseSBzb21lIHJlcXVpcmVkIGNsYXNzIGZpbGUgaXMgcmVmZXJlbmNpbmcgYSB0eXBlIG91dHNpZGUgdGhlIGNsYXNzcGF0aCkiLCB0aHJvd2FibGUpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvYnVpbGRlci9NdWx0aVByb2plY3RUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvYnVpbGRlci9NdWx0aVByb2plY3RUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjQxNjhiLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2J1aWxkZXIvTXVsdGlQcm9qZWN0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy51dGlsLlV0aWw7Ci0KLQotcHVibGljIGNsYXNzIE11bHRpUHJvamVjdFRlc3RzIGV4dGVuZHMgVGVzdHMgewotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIEVYQ0xVREVEX1RFU1RTID0ge307Ci0JCi0JcHVibGljIE11bHRpUHJvamVjdFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBGaWx0ZXJlZFRlc3RTdWl0ZShFWENMVURFRF9URVNUUyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNdWx0aVByb2plY3RUZXN0cy5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbXBpbGVPbmx5RGVwZW5kZW50KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyAgICAgICAgICAgU3RlcCAxCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQkvLyAgICAgICAgIFByb2plY3QxCi0JCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJSVBhdGggcHJvamVjdDFQYXRoID0gZW52LmFkZFByb2plY3QoIlByb2plY3QxIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZEV4dGVybmFsSmFyKHByb2plY3QxUGF0aCwgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0JCUlQYXRoIHJvb3QxID0gZW52LmdldFBhY2thZ2VGcmFnbWVudFJvb3RQYXRoKHByb2plY3QxUGF0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRDbGFzcyhyb290MSwgIiIsICJBIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicHVibGljIGNsYXNzIEEge1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIn1cbiIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQkJCQotCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQkvLyAgICAgICAgIFByb2plY3QyCi0JCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJSVBhdGggcHJvamVjdDJQYXRoID0gZW52LmFkZFByb2plY3QoIlByb2plY3QyIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZEV4dGVybmFsSmFyKHByb2plY3QyUGF0aCwgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0JCWVudi5hZGRSZXF1aXJlZFByb2plY3QocHJvamVjdDJQYXRoLCBwcm9qZWN0MVBhdGgpOwotCQlJUGF0aCByb290MiA9IGVudi5nZXRQYWNrYWdlRnJhZ21lbnRSb290UGF0aChwcm9qZWN0MlBhdGgsICIiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkQ2xhc3Mocm9vdDIsICIiLCAiQiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInB1YmxpYyBjbGFzcyBCIGV4dGVuZHMgQSB7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiAvLyROT04tTkxTLTEkCi0JCQkpOwotCQkJCi0JCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCS8vICAgICAgICAgUHJvamVjdDMKLQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlJUGF0aCBwcm9qZWN0M1BhdGggPSBlbnYuYWRkUHJvamVjdCgiUHJvamVjdDMiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocHJvamVjdDNQYXRoLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQkJSVBhdGggcm9vdDMgPSBlbnYuZ2V0UGFja2FnZUZyYWdtZW50Um9vdFBhdGgocHJvamVjdDNQYXRoLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZENsYXNzKHJvb3QzLCAiIiwgIkMiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwdWJsaWMgY2xhc3MgQyB7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiAvLyROT04tTkxTLTEkCi0JCQkpOwotCQkKLQkJZnVsbEJ1aWxkKCk7Ci0JCWV4cGVjdGluZ05vUHJvYmxlbXMoKTsKLQkJCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyAgICAgICAgICAgU3RlcCAyCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQllbnYuYWRkQ2xhc3Mocm9vdDEsICIiLCAiQSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInB1YmxpYyBjbGFzcyBBIHtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIgICBpbnQgeDtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XG4iIC8vJE5PTi1OTFMtMSQKLQkJCSk7Ci0JCQkKLQkJaW5jcmVtZW50YWxCdWlsZCgpOwotCQlleHBlY3RpbmdDb21waWxlZENsYXNzZXMobmV3IFN0cmluZ1tdeyJBIiwgIkIifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmllbGQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCS8vICAgICAgICAgICBTdGVwIDEKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCS8vICAgICAgICAgUHJvamVjdDEKLQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlJUGF0aCBwcm9qZWN0MVBhdGggPSBlbnYuYWRkUHJvamVjdCgiUHJvamVjdDEiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocHJvamVjdDFQYXRoLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQkJSVBhdGggcm9vdDEgPSBlbnYuZ2V0UGFja2FnZUZyYWdtZW50Um9vdFBhdGgocHJvamVjdDFQYXRoLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZENsYXNzKHJvb3QxLCAiIiwgIkEiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwdWJsaWMgY2xhc3MgQSB7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICAgcHVibGljIGludCB4O1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIn1cbiIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQkJCQotCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQkvLyAgICAgICAgIFByb2plY3QyCi0JCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJSVBhdGggcHJvamVjdDJQYXRoID0gZW52LmFkZFByb2plY3QoIlByb2plY3QyIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZEV4dGVybmFsSmFyKHByb2plY3QyUGF0aCwgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0JCWVudi5hZGRSZXF1aXJlZFByb2plY3QocHJvamVjdDJQYXRoLCBwcm9qZWN0MVBhdGgpOwotCQlJUGF0aCByb290MiA9IGVudi5nZXRQYWNrYWdlRnJhZ21lbnRSb290UGF0aChwcm9qZWN0MlBhdGgsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlJUGF0aCBiID0gZW52LmFkZENsYXNzKHJvb3QyLCAiIiwgIkIiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwdWJsaWMgY2xhc3MgQiB7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICAgcHVibGljIHZvaWQgZm9vKCl7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICAgICAgaW50IHggPSBuZXcgQSgpLng7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICAgfVxuIisgLy8kTk9OLU5MUy0xJAotCQkJIn1cbiIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQkJCi0JCWZ1bGxCdWlsZCgpOwotCQlleHBlY3RpbmdOb1Byb2JsZW1zKCk7Ci0JCQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJLy8gICAgICAgICAgIFN0ZXAgMgotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJZW52LmFkZENsYXNzKHJvb3QxLCAiIiwgIkEiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwdWJsaWMgY2xhc3MgQSB7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiAvLyROT04tTkxTLTEkCi0JCQkpOwotCQkJCi0JCWluY3JlbWVudGFsQnVpbGQoKTsKLQkJZXhwZWN0aW5nU3BlY2lmaWNQcm9ibGVtRm9yKGIsIG5ldyBQcm9ibGVtKCJCLmZvbygpIiwgInggY2Fubm90IGJlIHJlc29sdmVkIG9yIGlzIG5vdCBhIGZpZWxkIiwgYikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbXBpbGVPcmRlcigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlIYXNodGFibGUgb3B0aW9ucyA9IEphdmFDb3JlLmdldE9wdGlvbnMoKTsKLQkJSGFzaHRhYmxlIG5ld09wdGlvbnMgPSBKYXZhQ29yZS5nZXRPcHRpb25zKCk7Ci0JCW5ld09wdGlvbnMucHV0KEphdmFDb3JlLkNPUkVfQ0lSQ1VMQVJfQ0xBU1NQQVRILCBKYXZhQ29yZS5XQVJOSU5HKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJSmF2YUNvcmUuc2V0T3B0aW9ucyhuZXdPcHRpb25zKTsKLQkJCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyAgICAgICAgIFByb2plY3QxCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlJUGF0aCBwMSA9IGVudi5hZGRQcm9qZWN0KCJQMSIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwMSwgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0JCS8vIHJlbW92ZSBvbGQgcGFja2FnZSBmcmFnbWVudCByb290IHNvIHRoYXQgbmFtZXMgZG9uJ3QgY29sbGlkZQotCQllbnYucmVtb3ZlUGFja2FnZUZyYWdtZW50Um9vdChwMSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCUlQYXRoIHJvb3QxID0gZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocDEsICJzcmMiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuc2V0T3V0cHV0Rm9sZGVyKHAxLCAiYmluIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUlQYXRoIGMxID0gZW52LmFkZENsYXNzKHJvb3QxLCAicDEiLCAiWCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDE7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIFgge1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIiAgVyB3O1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XG4iIC8vJE5PTi1OTFMtMSQKLQkJCSk7Ci0JCQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJLy8gICAgICAgICBQcm9qZWN0MgotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJSVBhdGggcDIgPSBlbnYuYWRkUHJvamVjdCgiUDIiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocDIsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCQkvLyByZW1vdmUgb2xkIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBzbyB0aGF0IG5hbWVzIGRvbid0IGNvbGxpZGUKLQkJZW52LnJlbW92ZVBhY2thZ2VGcmFnbWVudFJvb3QocDIsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlJUGF0aCByb290MiA9IGVudi5hZGRQYWNrYWdlRnJhZ21lbnRSb290KHAyLCAic3JjIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LnNldE91dHB1dEZvbGRlcihwMiwgImJpbiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlJUGF0aCBjMiA9IGVudi5hZGRDbGFzcyhyb290MiwgInAyIiwgIlkiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAyO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBZIHtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIgIFcgdztcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiAvLyROT04tTkxTLTEkCi0JCQkpOwotCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyAgICAgICAgIFByb2plY3QzCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlJUGF0aCBwMyA9IGVudi5hZGRQcm9qZWN0KCJQMyIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwMywgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0JCS8vIHJlbW92ZSBvbGQgcGFja2FnZSBmcmFnbWVudCByb290IHNvIHRoYXQgbmFtZXMgZG9uJ3QgY29sbGlkZQotCQllbnYucmVtb3ZlUGFja2FnZUZyYWdtZW50Um9vdChwMywgIiIpOyAvLyROT04tTkxTLTEkCi0JCUlQYXRoIHJvb3QzID0gZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocDMsICJzcmMiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuc2V0T3V0cHV0Rm9sZGVyKHAzLCAiYmluIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUlQYXRoIGMzID0gZW52LmFkZENsYXNzKHJvb3QzLCAicDMiLCAiWiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDM7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIFoge1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIiAgVyB3O1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XG4iIC8vJE5PTi1OTFMtMSQKLQkJCSk7Ci0JCQotCQllbnYuc2V0QnVpbGRPcmRlcihuZXcgU3RyaW5nW117IlAxIiwgIlAzIiwgIlAyIn0pOy8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0zJAotCQlmdWxsQnVpbGQoKTsKLQkJCi0JCWV4cGVjdGluZ0NvbXBpbGluZ09yZGVyKG5ldyBTdHJpbmdbXXsicDEuWCIsICJwMy5aIiwgInAyLlkifSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0zJAotCQlJUGF0aCB3b3Jrc3BhY2VSb290UGF0aCA9IGVudi5nZXRXb3Jrc3BhY2VSb290UGF0aCgpOwotCQlleHBlY3RpbmdPbmx5U3BlY2lmaWNQcm9ibGVtc0Zvcih3b3Jrc3BhY2VSb290UGF0aCxuZXcgUHJvYmxlbVtdewotCQkJCW5ldyBQcm9ibGVtKCJwMyIsICJXIGNhbm5vdCBiZSByZXNvbHZlZCAob3IgaXMgbm90IGEgdmFsaWQgdHlwZSkgZm9yIHRoZSBmaWVsZCBaLnciLCBjMyksLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJbmV3IFByb2JsZW0oInAyIiwgIlcgY2Fubm90IGJlIHJlc29sdmVkIChvciBpcyBub3QgYSB2YWxpZCB0eXBlKSBmb3IgdGhlIGZpZWxkIFkudyIsIGMyKSwvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQluZXcgUHJvYmxlbSgicDEiLCAiVyBjYW5ub3QgYmUgcmVzb2x2ZWQgKG9yIGlzIG5vdCBhIHZhbGlkIHR5cGUpIGZvciB0aGUgZmllbGQgWC53IiwgYzEpLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0pOwkKLQkJSmF2YUNvcmUuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEN5Y2xlMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlIYXNodGFibGUgb3B0aW9ucyA9IEphdmFDb3JlLmdldE9wdGlvbnMoKTsKLQkJSGFzaHRhYmxlIG5ld09wdGlvbnMgPSBKYXZhQ29yZS5nZXRPcHRpb25zKCk7Ci0JCW5ld09wdGlvbnMucHV0KEphdmFDb3JlLkNPUkVfQ0lSQ1VMQVJfQ0xBU1NQQVRILCBKYXZhQ29yZS5XQVJOSU5HKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJSmF2YUNvcmUuc2V0T3B0aW9ucyhuZXdPcHRpb25zKTsKLQkJCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyAgICAgICAgIFByb2plY3QxCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlJUGF0aCBwMSA9IGVudi5hZGRQcm9qZWN0KCJQMSIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwMSwgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0JCS8vIHJlbW92ZSBvbGQgcGFja2FnZSBmcmFnbWVudCByb290IHNvIHRoYXQgbmFtZXMgZG9uJ3QgY29sbGlkZQotCQllbnYucmVtb3ZlUGFja2FnZUZyYWdtZW50Um9vdChwMSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCUlQYXRoIHJvb3QxID0gZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocDEsICJzcmMiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuc2V0T3V0cHV0Rm9sZGVyKHAxLCAiYmluIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWVudi5hZGRDbGFzcyhyb290MSwgInAxIiwgIlgiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAxO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJImltcG9ydCBwMi5ZO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIgIHB1YmxpYyB2b2lkIGJhcihZIHkpe1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIiAgICB5LnpvcmsoKTtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIgIH1cbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XG4iIC8vJE5PTi1OTFMtMSQKLQkJCSk7Ci0JCQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJLy8gICAgICAgICBQcm9qZWN0MgotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJSVBhdGggcDIgPSBlbnYuYWRkUHJvamVjdCgiUDIiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocDIsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCQkvLyByZW1vdmUgb2xkIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBzbyB0aGF0IG5hbWVzIGRvbid0IGNvbGxpZGUKLQkJZW52LnJlbW92ZVBhY2thZ2VGcmFnbWVudFJvb3QocDIsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlJUGF0aCByb290MiA9IGVudi5hZGRQYWNrYWdlRnJhZ21lbnRSb290KHAyLCAic3JjIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LnNldE91dHB1dEZvbGRlcihwMiwgImJpbiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQllbnYuYWRkQ2xhc3Mocm9vdDIsICJwMiIsICJZIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwMjtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJpbXBvcnQgcDEuWDtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJpbXBvcnQgcDMuWjtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgWSBleHRlbmRzIFp7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICBwdWJsaWMgWCB6b3JrKCl7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICAgIFggeCA9IGZvbygpO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIiAgICB4LmJhcih0aGlzKTtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIgICAgcmV0dXJuIHg7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICB9XG4iKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiAvLyROT04tTkxTLTEkCi0JCQkpOwotCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyAgICAgICAgIFByb2plY3QzCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlJUGF0aCBwMyA9IGVudi5hZGRQcm9qZWN0KCJQMyIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwMywgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0JCS8vIHJlbW92ZSBvbGQgcGFja2FnZSBmcmFnbWVudCByb290IHNvIHRoYXQgbmFtZXMgZG9uJ3QgY29sbGlkZQotCQllbnYucmVtb3ZlUGFja2FnZUZyYWdtZW50Um9vdChwMywgIiIpOyAvLyROT04tTkxTLTEkCi0JCUlQYXRoIHJvb3QzID0gZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocDMsICJzcmMiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuc2V0T3V0cHV0Rm9sZGVyKHAzLCAiYmluIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWVudi5hZGRDbGFzcyhyb290MywgInAzIiwgIloiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAzO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJImltcG9ydCBwMS5YO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBaIHtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIgIHB1YmxpYyBYIGZvbygpe1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIiAgICByZXR1cm4gbnVsbDtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIgIH1cbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XG4iIC8vJE5PTi1OTFMtMSQKLQkJCSk7Ci0JCQotCQkvLyBmb3IgUHJvamVjdDEKLQkJZW52LmFkZFJlcXVpcmVkUHJvamVjdChwMSwgcDIpOwotCQllbnYuYWRkUmVxdWlyZWRQcm9qZWN0KHAxLCBwMyk7Ci0JCS8vIGZvciBQcm9qZWN0MgotCQllbnYuYWRkUmVxdWlyZWRQcm9qZWN0KHAyLCBwMSk7Ci0JCWVudi5hZGRSZXF1aXJlZFByb2plY3QocDIsIHAzKTsKLQkJLy8gZm9yIFByb2plY3QzCi0JCWVudi5hZGRSZXF1aXJlZFByb2plY3QocDMsIHAxKTsKLQotCQl0cnkgewotCQkJZW52LnNldEJ1aWxkT3JkZXIobmV3IFN0cmluZ1tdeyJQMSIsICJQMiIsICJQMyJ9KTsvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMyQKLQkJCWZ1bGxCdWlsZCgpOwotCQkJCi0JCQlleHBlY3RpbmdDb21waWxpbmdPcmRlcihuZXcgU3RyaW5nW117InAxLlgiLCAicDIuWSIsICJwMy5aIiwgInAxLlgiLCAicDIuWSIsICJwMy5aIiwgInAxLlgifSk7Ly8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy00JC8vJE5PTi1OTFMtNSQvLyROT04tTkxTLTYkLy8kTk9OLU5MUy03JAotCQkJZXhwZWN0aW5nT25seVNwZWNpZmljUHJvYmxlbUZvcihwMSxuZXcgUHJvYmxlbSgicDEiLCAiQSBjeWNsZSB3YXMgZGV0ZWN0ZWQgaW4gdGhlIGJ1aWxkIHBhdGggb2YgcHJvamVjdDogUDEiLCBwMSkpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZXhwZWN0aW5nT25seVNwZWNpZmljUHJvYmxlbUZvcihwMixuZXcgUHJvYmxlbSgicDIiLCAiQSBjeWNsZSB3YXMgZGV0ZWN0ZWQgaW4gdGhlIGJ1aWxkIHBhdGggb2YgcHJvamVjdDogUDIiLCBwMikpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZXhwZWN0aW5nT25seVNwZWNpZmljUHJvYmxlbUZvcihwMyxuZXcgUHJvYmxlbSgicDMiLCAiQSBjeWNsZSB3YXMgZGV0ZWN0ZWQgaW4gdGhlIGJ1aWxkIHBhdGggb2YgcHJvamVjdDogUDMiLCBwMykpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCi0JCQlKYXZhQ29yZS5zZXRPcHRpb25zKG9wdGlvbnMpOwotCQl9IGZpbmFsbHkgewotCQkJZW52LnNldEJ1aWxkT3JkZXIobnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEN5Y2xlMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlIYXNodGFibGUgb3B0aW9ucyA9IEphdmFDb3JlLmdldE9wdGlvbnMoKTsKLQkJSGFzaHRhYmxlIG5ld09wdGlvbnMgPSBKYXZhQ29yZS5nZXRPcHRpb25zKCk7Ci0JCW5ld09wdGlvbnMucHV0KEphdmFDb3JlLkNPUkVfQ0lSQ1VMQVJfQ0xBU1NQQVRILCBKYXZhQ29yZS5XQVJOSU5HKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJSmF2YUNvcmUuc2V0T3B0aW9ucyhuZXdPcHRpb25zKTsKLQkJCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyAgICAgICAgIFByb2plY3QxCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlJUGF0aCBwMSA9IGVudi5hZGRQcm9qZWN0KCJQMSIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwMSwgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0JCS8vIHJlbW92ZSBvbGQgcGFja2FnZSBmcmFnbWVudCByb290IHNvIHRoYXQgbmFtZXMgZG9uJ3QgY29sbGlkZQotCQllbnYucmVtb3ZlUGFja2FnZUZyYWdtZW50Um9vdChwMSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCUlQYXRoIHJvb3QxID0gZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocDEsICJzcmMiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuc2V0T3V0cHV0Rm9sZGVyKHAxLCAiYmluIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWVudi5hZGRDbGFzcyhyb290MSwgInAxIiwgIlgiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAxO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJImltcG9ydCBwMi5ZO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIgIHB1YmxpYyB2b2lkIGJhcihZIHksIGludCBpKXtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIgICAgeS56b3JrKCk7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICB9XG4iKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiAvLyROT04tTkxTLTEkCi0JCQkpOwotCQkKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCS8vICAgICAgICAgUHJvamVjdDIKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCUlQYXRoIHAyID0gZW52LmFkZFByb2plY3QoIlAyIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZEV4dGVybmFsSmFyKHAyLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQkJLy8gcmVtb3ZlIG9sZCBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgc28gdGhhdCBuYW1lcyBkb24ndCBjb2xsaWRlCi0JCWVudi5yZW1vdmVQYWNrYWdlRnJhZ21lbnRSb290KHAyLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJSVBhdGggcm9vdDIgPSBlbnYuYWRkUGFja2FnZUZyYWdtZW50Um9vdChwMiwgInNyYyIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5zZXRPdXRwdXRGb2xkZXIocDIsICJiaW4iKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJSVBhdGggYzIgPSBlbnYuYWRkQ2xhc3Mocm9vdDIsICJwMiIsICJZIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwMjtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJpbXBvcnQgcDEuWDtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJpbXBvcnQgcDMuWjtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgWSBleHRlbmRzIFp7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICBwdWJsaWMgWCB6b3JrKCl7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICAgIFggeCA9IGZvbygpO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIiAgICB4LmJhcih0aGlzKTtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIgICAgcmV0dXJuIHg7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICB9XG4iKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiAvLyROT04tTkxTLTEkCi0JCQkpOwotCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyAgICAgICAgIFByb2plY3QzCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlJUGF0aCBwMyA9IGVudi5hZGRQcm9qZWN0KCJQMyIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwMywgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0JCS8vIHJlbW92ZSBvbGQgcGFja2FnZSBmcmFnbWVudCByb290IHNvIHRoYXQgbmFtZXMgZG9uJ3QgY29sbGlkZQotCQllbnYucmVtb3ZlUGFja2FnZUZyYWdtZW50Um9vdChwMywgIiIpOyAvLyROT04tTkxTLTEkCi0JCUlQYXRoIHJvb3QzID0gZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocDMsICJzcmMiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuc2V0T3V0cHV0Rm9sZGVyKHAzLCAiYmluIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWVudi5hZGRDbGFzcyhyb290MywgInAzIiwgIloiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAzO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJImltcG9ydCBwMS5YO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBaIHtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIgIHB1YmxpYyBYIGZvbygpe1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIiAgICByZXR1cm4gbnVsbDtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIgIH1cbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XG4iIC8vJE5PTi1OTFMtMSQKLQkJCSk7Ci0JCQotCQkvLyBmb3IgUHJvamVjdDEKLQkJZW52LmFkZFJlcXVpcmVkUHJvamVjdChwMSwgcDIpOwotCQllbnYuYWRkUmVxdWlyZWRQcm9qZWN0KHAxLCBwMyk7Ci0JCS8vIGZvciBQcm9qZWN0MgotCQllbnYuYWRkUmVxdWlyZWRQcm9qZWN0KHAyLCBwMSk7Ci0JCWVudi5hZGRSZXF1aXJlZFByb2plY3QocDIsIHAzKTsKLQkJLy8gZm9yIFByb2plY3QzCi0JCWVudi5hZGRSZXF1aXJlZFByb2plY3QocDMsIHAxKTsKLQotCQl0cnkgewotCQkJZW52LnNldEJ1aWxkT3JkZXIobmV3IFN0cmluZ1tdeyJQMSIsICJQMiIsICJQMyJ9KTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTMkIAotCQkJZnVsbEJ1aWxkKCk7Ci0JCQkKLQkJCWV4cGVjdGluZ0NvbXBpbGluZ09yZGVyKG5ldyBTdHJpbmdbXXsicDEuWCIsICJwMi5ZIiwgInAzLloiLCAicDEuWCIsICJwMi5ZIiwgInAzLloiLCAicDEuWCJ9KTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQvLyROT04tTkxTLTckCi0JCQlleHBlY3RpbmdPbmx5U3BlY2lmaWNQcm9ibGVtRm9yKHAxLG5ldyBQcm9ibGVtKCJwMSIsICJBIGN5Y2xlIHdhcyBkZXRlY3RlZCBpbiB0aGUgYnVpbGQgcGF0aCBvZiBwcm9qZWN0OiBQMSIsIHAxKSk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlleHBlY3RpbmdPbmx5U3BlY2lmaWNQcm9ibGVtc0ZvcihwMixuZXcgUHJvYmxlbVtdewotCQkJCQluZXcgUHJvYmxlbSgicDIiLCAiVGhlIG1ldGhvZCBiYXIoWSwgaW50KSBpbiB0aGUgdHlwZSBYIGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChZKSIsIGMyKSwvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJbmV3IFByb2JsZW0oInAyIiwgIkEgY3ljbGUgd2FzIGRldGVjdGVkIGluIHRoZSBidWlsZCBwYXRoIG9mIHByb2plY3Q6IFAyIiwgcDIpLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9KTsKLQkJCWV4cGVjdGluZ09ubHlTcGVjaWZpY1Byb2JsZW1Gb3IocDMsbmV3IFByb2JsZW0oInAzIiwgIkEgY3ljbGUgd2FzIGRldGVjdGVkIGluIHRoZSBidWlsZCBwYXRoIG9mIHByb2plY3Q6IFAzIiwgcDMpKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQotCQkJSmF2YUNvcmUuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWVudi5zZXRCdWlsZE9yZGVyKG51bGwpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDeWNsZTMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSGFzaHRhYmxlIG9wdGlvbnMgPSBKYXZhQ29yZS5nZXRPcHRpb25zKCk7Ci0JCUhhc2h0YWJsZSBuZXdPcHRpb25zID0gSmF2YUNvcmUuZ2V0T3B0aW9ucygpOwotCQluZXdPcHRpb25zLnB1dChKYXZhQ29yZS5DT1JFX0NJUkNVTEFSX0NMQVNTUEFUSCwgSmF2YUNvcmUuV0FSTklORyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUphdmFDb3JlLnNldE9wdGlvbnMobmV3T3B0aW9ucyk7Ci0JCQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJLy8gICAgICAgICBQcm9qZWN0MQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJSVBhdGggcDEgPSBlbnYuYWRkUHJvamVjdCgiUDEiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocDEsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCQkvLyByZW1vdmUgb2xkIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBzbyB0aGF0IG5hbWVzIGRvbid0IGNvbGxpZGUKLQkJZW52LnJlbW92ZVBhY2thZ2VGcmFnbWVudFJvb3QocDEsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlJUGF0aCByb290MSA9IGVudi5hZGRQYWNrYWdlRnJhZ21lbnRSb290KHAxLCAic3JjIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LnNldE91dHB1dEZvbGRlcihwMSwgImJpbiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQllbnYuYWRkQ2xhc3Mocm9vdDEsICJwMSIsICJYIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwMTtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJpbXBvcnQgcDIuWTtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICBwdWJsaWMgdm9pZCBiYXIoWSB5KXtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIgICAgeS56b3JrKCk7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICB9XG4iKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiAvLyROT04tTkxTLTEkCi0JCQkpOwotCQkKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCS8vICAgICAgICAgUHJvamVjdDIKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCUlQYXRoIHAyID0gZW52LmFkZFByb2plY3QoIlAyIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZEV4dGVybmFsSmFyKHAyLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQkJLy8gcmVtb3ZlIG9sZCBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgc28gdGhhdCBuYW1lcyBkb24ndCBjb2xsaWRlCi0JCWVudi5yZW1vdmVQYWNrYWdlRnJhZ21lbnRSb290KHAyLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJSVBhdGggcm9vdDIgPSBlbnYuYWRkUGFja2FnZUZyYWdtZW50Um9vdChwMiwgInNyYyIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5zZXRPdXRwdXRGb2xkZXIocDIsICJiaW4iKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJSVBhdGggYzIgPSBlbnYuYWRkQ2xhc3Mocm9vdDIsICJwMiIsICJZIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwMjtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJpbXBvcnQgcDEuWDtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJpbXBvcnQgcDMuWjtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgWSBleHRlbmRzIFp7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICBwdWJsaWMgWCB6b3JrKCl7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICAgIFggeCA9IGZvbygpO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIiAgICB4LmJhcih0aGlzKTtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIgICAgcmV0dXJuIHg7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICB9XG4iKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiAvLyROT04tTkxTLTEkCi0JCQkpOwotCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyAgICAgICAgIFByb2plY3QzCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlJUGF0aCBwMyA9IGVudi5hZGRQcm9qZWN0KCJQMyIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwMywgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0JCS8vIHJlbW92ZSBvbGQgcGFja2FnZSBmcmFnbWVudCByb290IHNvIHRoYXQgbmFtZXMgZG9uJ3QgY29sbGlkZQotCQllbnYucmVtb3ZlUGFja2FnZUZyYWdtZW50Um9vdChwMywgIiIpOyAvLyROT04tTkxTLTEkCi0JCUlQYXRoIHJvb3QzID0gZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocDMsICJzcmMiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuc2V0T3V0cHV0Rm9sZGVyKHAzLCAiYmluIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWVudi5hZGRDbGFzcyhyb290MywgInAzIiwgIloiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAzO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJImltcG9ydCBwMS5YO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBaIHtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIgIHB1YmxpYyBYIGZvbygpe1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIiAgICByZXR1cm4gbnVsbDtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIgIH1cbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XG4iIC8vJE5PTi1OTFMtMSQKLQkJCSk7Ci0JCQotCQkvLyBmb3IgUHJvamVjdDEKLQkJZW52LmFkZFJlcXVpcmVkUHJvamVjdChwMSwgcDIpOwotCQllbnYuYWRkUmVxdWlyZWRQcm9qZWN0KHAxLCBwMyk7Ci0JCS8vIGZvciBQcm9qZWN0MgotCQllbnYuYWRkUmVxdWlyZWRQcm9qZWN0KHAyLCBwMSk7Ci0JCWVudi5hZGRSZXF1aXJlZFByb2plY3QocDIsIHAzKTsKLQkJLy8gZm9yIFByb2plY3QzCi0JCWVudi5hZGRSZXF1aXJlZFByb2plY3QocDMsIHAxKTsKLQotCQl0cnkgewotCQkJZW52LnNldEJ1aWxkT3JkZXIobmV3IFN0cmluZ1tdeyJQMSIsICJQMiIsICJQMyJ9KTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTMkIAotCQkJZnVsbEJ1aWxkKCk7Ci0JCQkKLQkJCWV4cGVjdGluZ0NvbXBpbGluZ09yZGVyKG5ldyBTdHJpbmdbXXsicDEuWCIsICJwMi5ZIiwgInAzLloiLCAicDEuWCIsICJwMi5ZIiwgInAzLloiLCAicDEuWCJ9KTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQvLyROT04tTkxTLTckCi0JCQlleHBlY3RpbmdPbmx5U3BlY2lmaWNQcm9ibGVtRm9yKHAxLG5ldyBQcm9ibGVtKCJwMSIsICJBIGN5Y2xlIHdhcyBkZXRlY3RlZCBpbiB0aGUgYnVpbGQgcGF0aCBvZiBwcm9qZWN0OiBQMSIsIHAxKSk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlleHBlY3RpbmdPbmx5U3BlY2lmaWNQcm9ibGVtRm9yKHAyLG5ldyBQcm9ibGVtKCJwMiIsICJBIGN5Y2xlIHdhcyBkZXRlY3RlZCBpbiB0aGUgYnVpbGQgcGF0aCBvZiBwcm9qZWN0OiBQMiIsIHAyKSk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlleHBlY3RpbmdPbmx5U3BlY2lmaWNQcm9ibGVtRm9yKHAzLG5ldyBQcm9ibGVtKCJwMyIsICJBIGN5Y2xlIHdhcyBkZXRlY3RlZCBpbiB0aGUgYnVpbGQgcGF0aCBvZiBwcm9qZWN0OiBQMyIsIHAzKSk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkKLQkJCWVudi5hZGRDbGFzcyhyb290MSwgInAxIiwgIlgiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkicGFja2FnZSBwMTtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCQkiaW1wb3J0IHAyLlk7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCQkiICBwdWJsaWMgdm9pZCBiYXIoWSB5LCBpbnQgaSl7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkJIiAgICB5LnpvcmsoKTtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCQkiICB9XG4iKyAvLyROT04tTkxTLTEkCi0JCQkJIn1cbiIgLy8kTk9OLU5MUy0xJAotCQkJCSk7Ci0JCQlpbmNyZW1lbnRhbEJ1aWxkKCk7Ci0JCQkKLQkJCWV4cGVjdGluZ0NvbXBpbGluZ09yZGVyKG5ldyBTdHJpbmdbXXsicDEuWCIsICJwMi5ZIiwgInAzLloifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMyQgCi0JCQlleHBlY3RpbmdPbmx5U3BlY2lmaWNQcm9ibGVtRm9yKHAxLG5ldyBQcm9ibGVtKCJwMSIsICJBIGN5Y2xlIHdhcyBkZXRlY3RlZCBpbiB0aGUgYnVpbGQgcGF0aCBvZiBwcm9qZWN0OiBQMSIsIHAxKSk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlleHBlY3RpbmdPbmx5U3BlY2lmaWNQcm9ibGVtc0ZvcihwMixuZXcgUHJvYmxlbVtdewotCQkJCQluZXcgUHJvYmxlbSgicDIiLCAiVGhlIG1ldGhvZCBiYXIoWSwgaW50KSBpbiB0aGUgdHlwZSBYIGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChZKSIsIGMyKSwvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJbmV3IFByb2JsZW0oInAyIiwgIkEgY3ljbGUgd2FzIGRldGVjdGVkIGluIHRoZSBidWlsZCBwYXRoIG9mIHByb2plY3Q6IFAyIiwgcDIpLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9KTsKLQkJCWV4cGVjdGluZ09ubHlTcGVjaWZpY1Byb2JsZW1Gb3IocDMsbmV3IFByb2JsZW0oInAzIiwgIkEgY3ljbGUgd2FzIGRldGVjdGVkIGluIHRoZSBidWlsZCBwYXRoIG9mIHByb2plY3Q6IFAzIiwgcDMpKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkKLQkJCUphdmFDb3JlLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0JCX0gZmluYWxseSB7Ci0JCQllbnYuc2V0QnVpbGRPcmRlcihudWxsKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q3ljbGU0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUhhc2h0YWJsZSBvcHRpb25zID0gSmF2YUNvcmUuZ2V0T3B0aW9ucygpOwotCQlIYXNodGFibGUgbmV3T3B0aW9ucyA9IEphdmFDb3JlLmdldE9wdGlvbnMoKTsKLQkJbmV3T3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09SRV9DSVJDVUxBUl9DTEFTU1BBVEgsIEphdmFDb3JlLldBUk5JTkcpOyAvLyROT04tTkxTLTEkCi0JCQotCQlKYXZhQ29yZS5zZXRPcHRpb25zKG5ld09wdGlvbnMpOwotCQkKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCS8vICAgICAgICAgUHJvamVjdDEKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCUlQYXRoIHAxID0gZW52LmFkZFByb2plY3QoIlAxIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZEV4dGVybmFsSmFyKHAxLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQkJLy8gcmVtb3ZlIG9sZCBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgc28gdGhhdCBuYW1lcyBkb24ndCBjb2xsaWRlCi0JCWVudi5yZW1vdmVQYWNrYWdlRnJhZ21lbnRSb290KHAxLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJSVBhdGggcm9vdDEgPSBlbnYuYWRkUGFja2FnZUZyYWdtZW50Um9vdChwMSwgInNyYyIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5zZXRPdXRwdXRGb2xkZXIocDEsICJiaW4iKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCS8vICAgICAgICAgUHJvamVjdDIKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCUlQYXRoIHAyID0gZW52LmFkZFByb2plY3QoIlAyIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZEV4dGVybmFsSmFyKHAyLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQkJLy8gcmVtb3ZlIG9sZCBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgc28gdGhhdCBuYW1lcyBkb24ndCBjb2xsaWRlCi0JCWVudi5yZW1vdmVQYWNrYWdlRnJhZ21lbnRSb290KHAyLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJSVBhdGggcm9vdDIgPSBlbnYuYWRkUGFja2FnZUZyYWdtZW50Um9vdChwMiwgInNyYyIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5zZXRPdXRwdXRGb2xkZXIocDIsICJiaW4iKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJSVBhdGggYzIgPSBlbnYuYWRkQ2xhc3Mocm9vdDIsICJwMiIsICJZIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwMjtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJpbXBvcnQgcDEuWDtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJpbXBvcnQgcDMuWjtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgWSBleHRlbmRzIFp7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICBwdWJsaWMgWCB6b3JrKCl7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICAgIFggeCA9IGZvbygpO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIiAgICB4LmJhcih0aGlzKTtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIgICAgcmV0dXJuIHg7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICB9XG4iKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiAvLyROT04tTkxTLTEkCi0JCQkpOwotCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyAgICAgICAgIFByb2plY3QzCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlJUGF0aCBwMyA9IGVudi5hZGRQcm9qZWN0KCJQMyIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwMywgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0JCS8vIHJlbW92ZSBvbGQgcGFja2FnZSBmcmFnbWVudCByb290IHNvIHRoYXQgbmFtZXMgZG9uJ3QgY29sbGlkZQotCQllbnYucmVtb3ZlUGFja2FnZUZyYWdtZW50Um9vdChwMywgIiIpOyAvLyROT04tTkxTLTEkCi0JCUlQYXRoIHJvb3QzID0gZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocDMsICJzcmMiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuc2V0T3V0cHV0Rm9sZGVyKHAzLCAiYmluIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUlQYXRoIGMzID0gZW52LmFkZENsYXNzKHJvb3QzLCAicDMiLCAiWiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDM7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiaW1wb3J0IHAxLlg7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIFoge1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIiAgcHVibGljIFggZm9vKCl7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICAgIHJldHVybiBudWxsO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIiAgfVxuIisgLy8kTk9OLU5MUy0xJAotCQkJIn1cbiIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQkJCi0JCS8vIGZvciBQcm9qZWN0MQotCQllbnYuYWRkUmVxdWlyZWRQcm9qZWN0KHAxLCBwMik7Ci0JCWVudi5hZGRSZXF1aXJlZFByb2plY3QocDEsIHAzKTsKLQkJLy8gZm9yIFByb2plY3QyCi0JCWVudi5hZGRSZXF1aXJlZFByb2plY3QocDIsIHAxKTsKLQkJZW52LmFkZFJlcXVpcmVkUHJvamVjdChwMiwgcDMpOwotCQkvLyBmb3IgUHJvamVjdDMKLQkJZW52LmFkZFJlcXVpcmVkUHJvamVjdChwMywgcDEpOwotCi0JCXRyeSB7Ci0JCQllbnYuc2V0QnVpbGRPcmRlcihuZXcgU3RyaW5nW117IlAxIiwgIlAyIiwgIlAzIn0pOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMyQgCi0JCQlmdWxsQnVpbGQoKTsKLQkJCQotCQkJZXhwZWN0aW5nQ29tcGlsaW5nT3JkZXIobmV3IFN0cmluZ1tdeyJwMi5ZIiwgInAzLloiLCAicDIuWSJ9KTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTMkCi0JCQlleHBlY3RpbmdPbmx5U3BlY2lmaWNQcm9ibGVtRm9yKHAxLG5ldyBQcm9ibGVtKCJwMSIsICJBIGN5Y2xlIHdhcyBkZXRlY3RlZCBpbiB0aGUgYnVpbGQgcGF0aCBvZiBwcm9qZWN0OiBQMSIsIHAxKSk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlleHBlY3RpbmdPbmx5U3BlY2lmaWNQcm9ibGVtc0ZvcihwMixuZXcgUHJvYmxlbVtdewotCQkJCW5ldyBQcm9ibGVtKCJwMiIsICJUaGUgaW1wb3J0IHAxIGNhbm5vdCBiZSByZXNvbHZlZCIsIGMyKSwvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQluZXcgUHJvYmxlbSgicDIiLCAiWCBjYW5ub3QgYmUgcmVzb2x2ZWQgKG9yIGlzIG5vdCBhIHZhbGlkIHJldHVybiB0eXBlKSBmb3IgdGhlIG1ldGhvZCB6b3JrIiwgYzIpLC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCW5ldyBQcm9ibGVtKCJwMiIsICJYIGNhbm5vdCBiZSByZXNvbHZlZCBvciBpcyBub3QgYSB0eXBlIiwgYzIpLC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCW5ldyBQcm9ibGVtKCJwMiIsICJUaGUgbWV0aG9kIGZvbygpIGlzIHVuZGVmaW5lZCBmb3IgdGhlIHR5cGUgWSIsIGMyKSwvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQluZXcgUHJvYmxlbSgicDIiLCAiQSBjeWNsZSB3YXMgZGV0ZWN0ZWQgaW4gdGhlIGJ1aWxkIHBhdGggb2YgcHJvamVjdDogUDIiLCBwMikvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0pOwotCQkJZXhwZWN0aW5nT25seVNwZWNpZmljUHJvYmxlbXNGb3IocDMsbmV3IFByb2JsZW1bXXsKLQkJCQluZXcgUHJvYmxlbSgicDMiLCAiWCBjYW5ub3QgYmUgcmVzb2x2ZWQgKG9yIGlzIG5vdCBhIHZhbGlkIHJldHVybiB0eXBlKSBmb3IgdGhlIG1ldGhvZCBmb28iLCBjMyksLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJbmV3IFByb2JsZW0oInAzIiwgIlRoZSBpbXBvcnQgcDEgY2Fubm90IGJlIHJlc29sdmVkIiwgYzMpLC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCW5ldyBQcm9ibGVtKCJwMyIsICJBIGN5Y2xlIHdhcyBkZXRlY3RlZCBpbiB0aGUgYnVpbGQgcGF0aCBvZiBwcm9qZWN0OiBQMyIsIHAzKS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfSk7Ci0JCi0JCQllbnYuYWRkQ2xhc3Mocm9vdDEsICJwMSIsICJYIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJInBhY2thZ2UgcDE7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkJImltcG9ydCBwMi5ZO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkJIiAgcHVibGljIHZvaWQgYmFyKFkgeSl7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkJIiAgICB5LnpvcmsoKTtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCQkiICB9XG4iKyAvLyROT04tTkxTLTEkCi0JCQkJIn1cbiIgLy8kTk9OLU5MUy0xJAotCQkJCSk7Ci0JCQlpbmNyZW1lbnRhbEJ1aWxkKCk7Ci0JCQlleHBlY3RpbmdDb21waWxpbmdPcmRlcihuZXcgU3RyaW5nW117InAxLlgiLCAicDIuWSIsICJwMy5aIiwgInAxLlgiLCAicDIuWSJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkLy8kTk9OLU5MUy01JCAKLQkJCWV4cGVjdGluZ09ubHlTcGVjaWZpY1Byb2JsZW1Gb3IocDEsbmV3IFByb2JsZW0oInAxIiwgIkEgY3ljbGUgd2FzIGRldGVjdGVkIGluIHRoZSBidWlsZCBwYXRoIG9mIHByb2plY3Q6IFAxIiwgcDEpKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWV4cGVjdGluZ09ubHlTcGVjaWZpY1Byb2JsZW1Gb3IocDIsbmV3IFByb2JsZW0oInAyIiwgIkEgY3ljbGUgd2FzIGRldGVjdGVkIGluIHRoZSBidWlsZCBwYXRoIG9mIHByb2plY3Q6IFAyIiwgcDIpKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWV4cGVjdGluZ09ubHlTcGVjaWZpY1Byb2JsZW1Gb3IocDMsbmV3IFByb2JsZW0oInAzIiwgIkEgY3ljbGUgd2FzIGRldGVjdGVkIGluIHRoZSBidWlsZCBwYXRoIG9mIHByb2plY3Q6IFAzIiwgcDMpKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkKLQkJCUphdmFDb3JlLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0JCX0gZmluYWxseSB7Ci0JCQllbnYuc2V0QnVpbGRPcmRlcihudWxsKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q3ljbGU1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUhhc2h0YWJsZSBvcHRpb25zID0gSmF2YUNvcmUuZ2V0T3B0aW9ucygpOwotCQlIYXNodGFibGUgbmV3T3B0aW9ucyA9IEphdmFDb3JlLmdldE9wdGlvbnMoKTsKLQkJbmV3T3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09SRV9DSVJDVUxBUl9DTEFTU1BBVEgsIEphdmFDb3JlLldBUk5JTkcpOyAvLyROT04tTkxTLTEkCi0JCQotCQlKYXZhQ29yZS5zZXRPcHRpb25zKG5ld09wdGlvbnMpOwotCQkKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCS8vICAgICAgICAgUHJvamVjdDEKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCUlQYXRoIHAxID0gZW52LmFkZFByb2plY3QoIlAxIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZEV4dGVybmFsSmFyKHAxLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQkJLy8gcmVtb3ZlIG9sZCBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgc28gdGhhdCBuYW1lcyBkb24ndCBjb2xsaWRlCi0JCWVudi5yZW1vdmVQYWNrYWdlRnJhZ21lbnRSb290KHAxLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJSVBhdGggcm9vdDEgPSBlbnYuYWRkUGFja2FnZUZyYWdtZW50Um9vdChwMSwgInNyYyIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5zZXRPdXRwdXRGb2xkZXIocDEsICJiaW4iKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJSVBhdGggYzEgPSBlbnYuYWRkQ2xhc3Mocm9vdDEsICJwMSIsICJYIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwMTtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJpbXBvcnQgcDIuKjtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJpbXBvcnQgcDIyLio7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIFgge1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIiAgWSB5O1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIn1cbiIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQkJCQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJLy8gICAgICAgICBQcm9qZWN0MgotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJSVBhdGggcDIgPSBlbnYuYWRkUHJvamVjdCgiUDIiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocDIsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCQkvLyByZW1vdmUgb2xkIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBzbyB0aGF0IG5hbWVzIGRvbid0IGNvbGxpZGUKLQkJZW52LnJlbW92ZVBhY2thZ2VGcmFnbWVudFJvb3QocDIsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlJUGF0aCByb290MiA9IGVudi5hZGRQYWNrYWdlRnJhZ21lbnRSb290KHAyLCAic3JjIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LnNldE91dHB1dEZvbGRlcihwMiwgImJpbiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlJUGF0aCBjMiA9IGVudi5hZGRDbGFzcyhyb290MiwgInAyIiwgIlkiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAyO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJImltcG9ydCBwMS4qO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJImltcG9ydCBwMTEuKjtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgWSB7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICBYIHg7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiAvLyROT04tTkxTLTEkCi0JCQkpOwotCi0KLQkJLy8gZm9yIFByb2plY3QxCi0JCWVudi5hZGRSZXF1aXJlZFByb2plY3QocDEsIHAyKTsKLQkJLy8gZm9yIFByb2plY3QyCi0JCWVudi5hZGRSZXF1aXJlZFByb2plY3QocDIsIHAxKTsKLQotCQl0cnkgewotCQkJZW52LnNldEJ1aWxkT3JkZXIobmV3IFN0cmluZ1tdeyJQMSIsICJQMiJ9KTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWZ1bGxCdWlsZCgpOwotCQkJCi0JCQlleHBlY3RpbmdDb21waWxpbmdPcmRlcihuZXcgU3RyaW5nW117InAxLlgiLCAicDIuWSIsICJwMS5YIiwgInAyLlkifSk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIAotCQkJZXhwZWN0aW5nT25seVNwZWNpZmljUHJvYmxlbXNGb3IocDEsbmV3IFByb2JsZW1bXXsKLQkJCQluZXcgUHJvYmxlbSgicDEiLCAiVGhlIGltcG9ydCBwMjIgY2Fubm90IGJlIHJlc29sdmVkIiwgYzEpLC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCW5ldyBQcm9ibGVtKCJwMSIsICJBIGN5Y2xlIHdhcyBkZXRlY3RlZCBpbiB0aGUgYnVpbGQgcGF0aCBvZiBwcm9qZWN0OiBQMSIsIHAxKS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfSk7Ci0JCQlleHBlY3RpbmdPbmx5U3BlY2lmaWNQcm9ibGVtc0ZvcihwMixuZXcgUHJvYmxlbVtdewotCQkJCW5ldyBQcm9ibGVtKCJwMiIsICJUaGUgaW1wb3J0IHAxMSBjYW5ub3QgYmUgcmVzb2x2ZWQiLCBjMiksLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJbmV3IFByb2JsZW0oInAyIiwgIkEgY3ljbGUgd2FzIGRldGVjdGVkIGluIHRoZSBidWlsZCBwYXRoIG9mIHByb2plY3Q6IFAyIiwgcDIpLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9KTsKLQkJCQotCQkJZW52LmFkZENsYXNzKHJvb3QxLCAicDExIiwgIlhYIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJInBhY2thZ2UgcDExO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJCSJwdWJsaWMgY2xhc3MgWFgge1xuIisgLy8kTk9OLU5MUy0xJAotCQkJCSJ9XG4iIC8vJE5PTi1OTFMtMSQKLQkJCQkpOwotCQkJZW52LmFkZENsYXNzKHJvb3QyLCAicDIyIiwgIllZIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJInBhY2thZ2UgcDIyO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJCSJwdWJsaWMgY2xhc3MgWVkge1xuIisgLy8kTk9OLU5MUy0xJAotCQkJCSJ9XG4iIC8vJE5PTi1OTFMtMSQKLQkJCQkpOwotCQkJCQotCQkJaW5jcmVtZW50YWxCdWlsZCgpOwotCQkJCi0JCQlleHBlY3RpbmdDb21waWxpbmdPcmRlcihuZXcgU3RyaW5nW117InAxMS5YWCIsICJwMjIuWVkiLCAicDIuWSIsICJwMS5YIn0pOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJZXhwZWN0aW5nT25seVNwZWNpZmljUHJvYmxlbXNGb3IocDEsbmV3IFByb2JsZW1bXXsKLQkJCQluZXcgUHJvYmxlbSgicDEiLCAiVGhlIGltcG9ydCBwMjIgaXMgbmV2ZXIgdXNlZCIsIGMxKSwvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQluZXcgUHJvYmxlbSgicDEiLCAiQSBjeWNsZSB3YXMgZGV0ZWN0ZWQgaW4gdGhlIGJ1aWxkIHBhdGggb2YgcHJvamVjdDogUDEiLCBwMSkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0pOwotCQkJZXhwZWN0aW5nT25seVNwZWNpZmljUHJvYmxlbXNGb3IocDIsbmV3IFByb2JsZW1bXXsKLQkJCQluZXcgUHJvYmxlbSgicDIiLCAiVGhlIGltcG9ydCBwMTEgaXMgbmV2ZXIgdXNlZCIsIGMyKSwvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQluZXcgUHJvYmxlbSgicDIiLCAiQSBjeWNsZSB3YXMgZGV0ZWN0ZWQgaW4gdGhlIGJ1aWxkIHBhdGggb2YgcHJvamVjdDogUDIiLCBwMikvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0pOwotCQkJCi0JCQlKYXZhQ29yZS5zZXRPcHRpb25zKG9wdGlvbnMpOwotCQl9IGZpbmFsbHkgewotCQkJZW52LnNldEJ1aWxkT3JkZXIobnVsbCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9idWlsZGVyL011bHRpU291cmNlRm9sZGVyQW5kT3V0cHV0Rm9sZGVyVGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2J1aWxkZXIvTXVsdGlTb3VyY2VGb2xkZXJBbmRPdXRwdXRGb2xkZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2QzOGM0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2J1aWxkZXIvTXVsdGlTb3VyY2VGb2xkZXJBbmRPdXRwdXRGb2xkZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy51dGlsLlV0aWw7Ci0KLS8qKgotICogQmFzaWMgdGVzdHMgb2YgdGhlIGltYWdlIGJ1aWxkZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aVNvdXJjZUZvbGRlckFuZE91dHB1dEZvbGRlclRlc3RzIGV4dGVuZHMgVGVzdHMgewotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIEVYQ0xVREVEX1RFU1RTID0ge307Ci0KLQlwdWJsaWMgTXVsdGlTb3VyY2VGb2xkZXJBbmRPdXRwdXRGb2xkZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBGaWx0ZXJlZFRlc3RTdWl0ZShFWENMVURFRF9URVNUUyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNdWx0aVNvdXJjZUZvbGRlckFuZE91dHB1dEZvbGRlclRlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3QwMDAxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYXRoIHByb2plY3RQYXRoID0gZW52LmFkZFByb2plY3QoIlAiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYucmVtb3ZlUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCUlQYXRoIHNyYzEgPSBlbnYuYWRkUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgInNyYzEiLCBudWxsLCAiYmluMSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZW52LnNldE91dHB1dEZvbGRlcihwcm9qZWN0UGF0aCwgImJpbiIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwcm9qZWN0UGF0aCwgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0JCQotCQllbnYuYWRkQ2xhc3Moc3JjMSwgIiIsICJYIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicHVibGljIGNsYXNzIFgge30iIC8vJE5PTi1OTFMtMSQKLQkJCSk7Ci0JCQotCQlmdWxsQnVpbGQoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCQlleHBlY3RpbmdQcmVzZW5jZU9mKHByb2plY3RQYXRoLmFwcGVuZCgiYmluMS9YLmNsYXNzIikpOyAvLyROT04tTkxTLTEkCi0JCWV4cGVjdGluZ05vUHJlc2VuY2VPZihwcm9qZWN0UGF0aC5hcHBlbmQoImJpbi9YLmNsYXNzIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdDAwMDIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhdGggcHJvamVjdFBhdGggPSBlbnYuYWRkUHJvamVjdCgiUCIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5yZW1vdmVQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJSVBhdGggc3JjMSA9IGVudi5hZGRQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAic3JjMSIsIG51bGwsICJiaW4xIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlJUGF0aCBzcmMyID0gZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICJzcmMyIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LnNldE91dHB1dEZvbGRlcihwcm9qZWN0UGF0aCwgImJpbiIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwcm9qZWN0UGF0aCwgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0JCQotCQllbnYuYWRkQ2xhc3Moc3JjMSwgInAiLCAiWCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDsiKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIFgge30iIC8vJE5PTi1OTFMtMSQKLQkJCSk7Ci0JCQkKLQkJZW52LmFkZENsYXNzKHNyYzIsICJwIiwgIlkiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHA7IisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBZIHt9IiAvLyROT04tTkxTLTEkCi0JCQkpOwotCQkKLQkJZnVsbEJ1aWxkKCk7Ci0JCWV4cGVjdGluZ05vUHJvYmxlbXMoKTsKLQkJZXhwZWN0aW5nUHJlc2VuY2VPZihwcm9qZWN0UGF0aC5hcHBlbmQoImJpbjEvcC9YLmNsYXNzIikpOyAvLyROT04tTkxTLTEkCi0JCWV4cGVjdGluZ1ByZXNlbmNlT2YocHJvamVjdFBhdGguYXBwZW5kKCJiaW4vcC9ZLmNsYXNzIikpOyAvLyROT04tTkxTLTEkCi0JCWV4cGVjdGluZ05vUHJlc2VuY2VPZihwcm9qZWN0UGF0aC5hcHBlbmQoImJpbi9wL1guY2xhc3MiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZXhwZWN0aW5nTm9QcmVzZW5jZU9mKHByb2plY3RQYXRoLmFwcGVuZCgiYmluMS9wL1kuY2xhc3MiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdDAwMDMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUlQYXRoIHByb2plY3RQYXRoID0gZW52LmFkZFByb2plY3QoIlAiKTsgLy8kTk9OLU5MUy0xJAotCQkJZW52LnJlbW92ZVBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICJzcmMiLCBudWxsLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICJzcmMvZjEiLCBudWxsLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJZW52LnNldE91dHB1dEZvbGRlcihwcm9qZWN0UGF0aCwgImJpbiIpOyAvLyROT04tTkxTLTEkCi0JCQllbnYuYWRkRXh0ZXJuYWxKYXIocHJvamVjdFBhdGgsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCQkJCi0JCQlmdWxsQnVpbGQoKTsKLQkJCWV4cGVjdGluZ05vUHJvYmxlbXMoKTsKLQkJCQotCQkJYXNzZXJ0VHJ1ZSgiSmF2YU1vZGVsRXhjZXB0aW9uIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoCi0JCQkJIkNhbm5vdCBuZXN0ICdQL3NyYy9mMScgaW5zaWRlICdQL3NyYycuICIgKyAvLyROT04tTkxTLTEkCi0JCQkJIlRvIGVuYWJsZSB0aGUgbmVzdGluZyBleGNsdWRlICdmMS8nIGZyb20gJ1Avc3JjJy4iLCAvLyROT04tTkxTLTEkCi0JCQkJZS5nZXRNZXNzYWdlKCkKLQkJCSk7IAotCQl9Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0MDAwNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQl0cnkgewotCQkJSVBhdGggcHJvamVjdFBhdGggPSBlbnYuYWRkUHJvamVjdCgiUCIpOyAvLyROT04tTkxTLTEkCi0JCQllbnYucmVtb3ZlUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQllbnYuYWRkUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgInNyYy9mMSIsIG51bGwsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQllbnYuYWRkUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgInNyYyIsIG5ldyBJUGF0aFtde25ldyBQYXRoKCJmMSIpfSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZW52LnNldE91dHB1dEZvbGRlcihwcm9qZWN0UGF0aCwgImJpbiIpOyAvLyROT04tTkxTLTEkCi0JCQllbnYuYWRkRXh0ZXJuYWxKYXIocHJvamVjdFBhdGgsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCQkJCi0JCQlmdWxsQnVpbGQoKTsKLQkJCWV4cGVjdGluZ05vUHJvYmxlbXMoKTsKLQkJCQotCQkJYXNzZXJ0VHJ1ZSgiSmF2YU1vZGVsRXhjZXB0aW9uIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoCi0JCQkJIkVuZCBleGNsdXNpb24gZmlsdGVyICdmMScgd2l0aCAvIHRvIGZ1bGx5IGV4Y2x1ZGUgJ1Avc3JjL2YxJy4iLCAvLyROT04tTkxTLTEkCi0JCQkJZS5nZXRNZXNzYWdlKCkKLQkJCSk7IAotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3QwMDA1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYXRoIHByb2plY3RQYXRoID0gZW52LmFkZFByb2plY3QoIlAiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYucmVtb3ZlUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAic3JjL2YxIiwgbnVsbCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICJzcmMiLCBuZXcgSVBhdGhbXXtuZXcgUGF0aCgiZjEvIil9LCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWVudi5zZXRPdXRwdXRGb2xkZXIocHJvamVjdFBhdGgsICJiaW4iKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocHJvamVjdFBhdGgsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCQkKLQkJZnVsbEJ1aWxkKCk7Ci0JCWV4cGVjdGluZ05vUHJvYmxlbXMoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdDAwMDYoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhdGggcHJvamVjdFBhdGggPSBlbnYuYWRkUHJvamVjdCgiUCIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5yZW1vdmVQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJSVBhdGggc3JjRjEgPSBlbnYuYWRkUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgInNyYy9mMSIsIG51bGwsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCUlQYXRoIHNyYyA9IGVudi5hZGRQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAic3JjIiwgbmV3IElQYXRoW117bmV3IFBhdGgoImYxLyIpfSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocHJvamVjdFBhdGgsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCQkKLQkJZW52LmFkZENsYXNzKHNyYywgInAiLCAiWCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDsiKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBwMi5Ze30iIC8vJE5PTi1OTFMtMSQKLQkJCSk7Ci0JCQkKLQkJZW52LmFkZENsYXNzKHNyY0YxLCAicDIiLCAiWSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDI7IisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBZIHt9IiAvLyROT04tTkxTLTEkCi0JCQkpOwotCQkJCi0JCWZ1bGxCdWlsZCgpOwotCQlleHBlY3RpbmdOb1Byb2JsZW1zKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3QwMDA3KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYXRoIHByb2plY3RQYXRoID0gZW52LmFkZFByb2plY3QoIlAiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYucmVtb3ZlUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCUlQYXRoIHNyY0YxID0gZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICJzcmMvZjEiLCBudWxsLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlJUGF0aCBzcmMgPSBlbnYuYWRkUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgInNyYyIsIG5ldyBJUGF0aFtde25ldyBQYXRoKCJmMS8iKX0sIG51bGwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZW52LmFkZEV4dGVybmFsSmFyKHByb2plY3RQYXRoLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQkJCi0JCUlQYXRoIHhQYXRoID0gZW52LmFkZENsYXNzKHNyYywgInAiLCAiWCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDsiKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBmMS5wMi5Ze30iIC8vJE5PTi1OTFMtMSQKLQkJCSk7Ci0JCQkKLQkJZW52LmFkZENsYXNzKHNyY0YxLCAicDIiLCAiWSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDI7IisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBZIHt9IiAvLyROT04tTkxTLTEkCi0JCQkpOwotCQkJCi0JCWZ1bGxCdWlsZCgpOwotCQlleHBlY3RpbmdPbmx5UHJvYmxlbXNGb3IoeFBhdGgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MDAwOCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJUGF0aCBwcm9qZWN0UGF0aCA9IGVudi5hZGRQcm9qZWN0KCJQIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LnJlbW92ZVBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlJUGF0aCBzcmNGMSA9IGVudi5hZGRQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAic3JjL2YxIiwgbnVsbCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJSVBhdGggc3JjID0gZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICJzcmMiLCBuZXcgSVBhdGhbXXtuZXcgUGF0aCgiZjEvIil9LCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwcm9qZWN0UGF0aCwgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0JCQotCQlJUGF0aCB4UGF0aCA9IGVudi5hZGRDbGFzcyhzcmMsICJwIiwgIlgiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHA7IisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgcDIuWXt9IiAvLyROT04tTkxTLTEkCi0JCQkpOwotCQkJCi0JCWVudi5hZGRDbGFzcyhzcmNGMSwgInAyIiwgIlkiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAyOyIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgYWJzdHJhY3QgY2xhc3MgWSB7IisgLy8kTk9OLU5MUy0xJAotCQkJIiAgYWJzdHJhY3Qgdm9pZCBmb28oKTsiKyAvLyROT04tTkxTLTEkCi0JCQkifSIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQkJCQotCQlmdWxsQnVpbGQoKTsKLQkJZXhwZWN0aW5nT25seVByb2JsZW1zRm9yKHhQYXRoKTsKLQkJCi0JCWVudi5hZGRDbGFzcyhzcmNGMSwgInAyIiwgIlkiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAyOyIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgWSB7fSIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQkJCi0JCWluY3JlbWVudGFsQnVpbGQoKTsKLQkJCi0JCWV4cGVjdGluZ05vUHJvYmxlbXMoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdDAwMDkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhdGggcHJvamVjdFBhdGggPSBlbnYuYWRkUHJvamVjdCgiUCIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5yZW1vdmVQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZEV4dGVybmFsSmFyKHByb2plY3RQYXRoLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQkKLQkJZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICIiLCBudWxsLCAiYmluMiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZW52LmFkZEZvbGRlcihwcm9qZWN0UGF0aCwgImJpbiIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5zZXRPdXRwdXRGb2xkZXIocHJvamVjdFBhdGgsICJiaW4iKTsgLy8kTk9OLU5MUy0xJAotCQotCQllbnYuYWRkQ2xhc3MocHJvamVjdFBhdGgsICIiLCAiWCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInB1YmxpYyBjbGFzcyBYIHt9IiAvLyROT04tTkxTLTEkCi0JCSk7Ci0JCQkKLQkJCi0JCWZ1bGxCdWlsZCgpOwotCi0JCWV4cGVjdGluZ05vUHJvYmxlbXMoKTsKLQkJZXhwZWN0aW5nUHJlc2VuY2VPZihwcm9qZWN0UGF0aC5hcHBlbmQoImJpbjIiKS5hcHBlbmQoIlguY2xhc3MiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlleHBlY3RpbmdOb1ByZXNlbmNlT2YocHJvamVjdFBhdGguYXBwZW5kKCJiaW4iKS5hcHBlbmQoIlguY2xhc3MiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlleHBlY3RpbmdOb1ByZXNlbmNlT2YocHJvamVjdFBhdGguYXBwZW5kKCJiaW4yIikuYXBwZW5kKCJiaW4iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlleHBlY3RpbmdOb1ByZXNlbmNlT2YocHJvamVjdFBhdGguYXBwZW5kKCJiaW4iKS5hcHBlbmQoImJpbjIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0MDAxMCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJUGF0aCBwcm9qZWN0UGF0aCA9IGVudi5hZGRQcm9qZWN0KCJQIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LnJlbW92ZVBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICIiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocHJvamVjdFBhdGgsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCi0JCWVudi5hZGRQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAiIiwgbmV3IElQYXRoW117bmV3IFBhdGgoInNyYy8iKX0sICJiaW4yIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCUlQYXRoIHNyYyA9IGVudi5hZGRQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAic3JjIiwgbnVsbCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQllbnYuYWRkRm9sZGVyKHByb2plY3RQYXRoLCAiYmluIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LnNldE91dHB1dEZvbGRlcihwcm9qZWN0UGF0aCwgImJpbiIpOyAvLyROT04tTkxTLTEkCi0KLQkJZW52LmFkZENsYXNzKHByb2plY3RQYXRoLCAiIiwgIlgiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwdWJsaWMgY2xhc3MgWCB7fSIgLy8kTk9OLU5MUy0xJAotCQkpOwotCQkKLQkJZW52LmFkZENsYXNzKHNyYywgIiIsICJZIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicHVibGljIGNsYXNzIFkge30iIC8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJCi0JCi0JCWZ1bGxCdWlsZCgpOwotCi0JCWV4cGVjdGluZ05vUHJvYmxlbXMoKTsKLQkJZXhwZWN0aW5nUHJlc2VuY2VPZihwcm9qZWN0UGF0aC5hcHBlbmQoImJpbjIiKS5hcHBlbmQoIlguY2xhc3MiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlleHBlY3RpbmdOb1ByZXNlbmNlT2YocHJvamVjdFBhdGguYXBwZW5kKCJiaW4iKS5hcHBlbmQoIlguY2xhc3MiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlleHBlY3RpbmdQcmVzZW5jZU9mKHByb2plY3RQYXRoLmFwcGVuZCgiYmluIikuYXBwZW5kKCJZLmNsYXNzIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZXhwZWN0aW5nTm9QcmVzZW5jZU9mKHByb2plY3RQYXRoLmFwcGVuZCgiYmluMiIpLmFwcGVuZCgiWS5jbGFzcyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWV4cGVjdGluZ05vUHJlc2VuY2VPZihwcm9qZWN0UGF0aC5hcHBlbmQoImJpbjIiKS5hcHBlbmQoImJpbiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWV4cGVjdGluZ05vUHJlc2VuY2VPZihwcm9qZWN0UGF0aC5hcHBlbmQoImJpbiIpLmFwcGVuZCgiYmluMiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCXB1YmxpYyB2b2lkIHRlc3QwMDExKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYXRoIHByb2plY3RQYXRoID0gZW52LmFkZFByb2plY3QoIlAiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYucmVtb3ZlUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwcm9qZWN0UGF0aCwgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0KLQkJZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICIiLCBuZXcgSVBhdGhbXXtuZXcgUGF0aCgic3JjLyIpfSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlJUGF0aCBzcmMgPSBlbnYuYWRkUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgInNyYyIsIG51bGwsICJiaW4yIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQllbnYuYWRkRm9sZGVyKHByb2plY3RQYXRoLCAiYmluIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LnNldE91dHB1dEZvbGRlcihwcm9qZWN0UGF0aCwgImJpbiIpOyAvLyROT04tTkxTLTEkCi0KLQkJZW52LmFkZENsYXNzKHByb2plY3RQYXRoLCAiIiwgIlgiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwdWJsaWMgY2xhc3MgWCB7fSIgLy8kTk9OLU5MUy0xJAotCQkpOwotCQkKLQkJZW52LmFkZENsYXNzKHNyYywgIiIsICJZIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicHVibGljIGNsYXNzIFkge30iIC8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJCi0JCi0JCWZ1bGxCdWlsZCgpOwotCi0JCWV4cGVjdGluZ05vUHJvYmxlbXMoKTsKLQkJZXhwZWN0aW5nUHJlc2VuY2VPZihwcm9qZWN0UGF0aC5hcHBlbmQoImJpbiIpLmFwcGVuZCgiWC5jbGFzcyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWV4cGVjdGluZ05vUHJlc2VuY2VPZihwcm9qZWN0UGF0aC5hcHBlbmQoImJpbjIiKS5hcHBlbmQoIlguY2xhc3MiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlleHBlY3RpbmdQcmVzZW5jZU9mKHByb2plY3RQYXRoLmFwcGVuZCgiYmluMiIpLmFwcGVuZCgiWS5jbGFzcyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWV4cGVjdGluZ05vUHJlc2VuY2VPZihwcm9qZWN0UGF0aC5hcHBlbmQoImJpbiIpLmFwcGVuZCgiWS5jbGFzcyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWV4cGVjdGluZ05vUHJlc2VuY2VPZihwcm9qZWN0UGF0aC5hcHBlbmQoImJpbjIiKS5hcHBlbmQoImJpbiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWV4cGVjdGluZ05vUHJlc2VuY2VPZihwcm9qZWN0UGF0aC5hcHBlbmQoImJpbiIpLmFwcGVuZCgiYmluMiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvYnVpbGRlci9PdXRwdXRGb2xkZXJUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvYnVpbGRlci9PdXRwdXRGb2xkZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDUzNzljLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2J1aWxkZXIvT3V0cHV0Rm9sZGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMudXRpbC5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YVByb2plY3Q7Ci0KLS8qKgotICogQmFzaWMgdGVzdHMgb2YgdGhlIGltYWdlIGJ1aWxkZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRwdXRGb2xkZXJUZXN0cyBleHRlbmRzIFRlc3RzIHsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBFWENMVURFRF9URVNUUyA9IHt9OwotCi0JcHVibGljIE91dHB1dEZvbGRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IEZpbHRlcmVkVGVzdFN1aXRlKEVYQ0xVREVEX1RFU1RTKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE91dHB1dEZvbGRlclRlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VPdXRwdXRGb2xkZXIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhdGggcHJvamVjdFBhdGggPSBlbnYuYWRkUHJvamVjdCgiUHJvamVjdCIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwcm9qZWN0UGF0aCwgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0KLQkJLy8gcmVtb3ZlIG9sZCBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgc28gdGhhdCBuYW1lcyBkb24ndCBjb2xsaWRlCi0JCWVudi5yZW1vdmVQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQlJUGF0aCByb290ID0gZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICJzcmMiKTsgLy8kTk9OLU5MUy0xJAotCQlJUGF0aCBiaW4xID0gZW52LnNldE91dHB1dEZvbGRlcihwcm9qZWN0UGF0aCwgImJpbjEiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWVudi5hZGRDbGFzcyhyb290LCAicCIsICJUZXN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgVGVzdCB7fSIgLy8kTk9OLU5MUy0xJAotCQkpOwotCi0JCWZ1bGxCdWlsZCgpOwotCQlleHBlY3RpbmdOb1Byb2JsZW1zKCk7Ci0JCWV4cGVjdGluZ1ByZXNlbmNlT2YoYmluMS5hcHBlbmQoInAvVGVzdC5jbGFzcyIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUlQYXRoIGJpbjIgPSBlbnYuc2V0T3V0cHV0Rm9sZGVyKHByb2plY3RQYXRoLCAiYmluMiIpOyAvLyROT04tTkxTLTEkCi0JCWluY3JlbWVudGFsQnVpbGQoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCQlleHBlY3RpbmdQcmVzZW5jZU9mKGJpbjIuYXBwZW5kKCJwL1Rlc3QuY2xhc3MiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlT3V0cHV0Rm9sZGVyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYXRoIHByb2plY3RQYXRoID0gZW52LmFkZFByb2plY3QoIlByb2plY3QiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocHJvamVjdFBhdGgsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCQkKLQkJSVBhdGggcm9vdCA9IGVudi5nZXRQYWNrYWdlRnJhZ21lbnRSb290UGF0aChwcm9qZWN0UGF0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCUlQYXRoIGJpbiA9IGVudi5zZXRPdXRwdXRGb2xkZXIocHJvamVjdFBhdGgsICJiaW4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCWVudi5hZGRDbGFzcyhyb290LCAiIiwgIlRlc3QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwdWJsaWMgY2xhc3MgVGVzdCB7fSIgLy8kTk9OLU5MUy0xJAotCQkpOwotCQllbnYuYWRkRmlsZShyb290LCAiVGVzdC50eHQiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWZ1bGxCdWlsZCgpOwotCQlleHBlY3RpbmdOb1Byb2JsZW1zKCk7Ci0JCWV4cGVjdGluZ1ByZXNlbmNlT2YobmV3IElQYXRoW117Ci0JCQliaW4uYXBwZW5kKCJUZXN0LmNsYXNzIiksIC8vJE5PTi1OTFMtMSQKLQkJCWJpbi5hcHBlbmQoIlRlc3QudHh0IikgLy8kTk9OLU5MUy0xJAotCQl9KTsKLQotCQllbnYucmVtb3ZlRm9sZGVyKGJpbik7Ci0vLwkJaW5jcmVtZW50YWxCdWlsZCgpOyBjdXJyZW50bHkgbm90IGRldGVjdGVkIGJ5IHRoZSBpbmNyZW1lbnRhbCBidWlsZGVyLi4uIHNob3VsZCBpdD8KLQkJZnVsbEJ1aWxkKCk7Ci0JCWV4cGVjdGluZ1ByZXNlbmNlT2YobmV3IElQYXRoW117Ci0JCQliaW4uYXBwZW5kKCJUZXN0LmNsYXNzIiksIC8vJE5PTi1OTFMtMSQKLQkJCWJpbi5hcHBlbmQoIlRlc3QudHh0IikgLy8kTk9OLU5MUy0xJAotCQl9KTsKLQl9Ci0JLyoKLQkgKiBFbnN1cmVzIHRoYXQgY2hhbmdpbmcgdGhlIG91dHB1dCB0byBiZSB0aGUgcHJvamVjdCAod2hlbiB0aGUgcHJvamVjdCBoYXMgYSBzb3VyY2UgZm9sZGVyIHNyYykKLQkgKiBkb2Vzbid0IHNjcnViIHRoZSBwcm9qZWN0IG9uIGV4aXQvcmVzdGFydC4KLQkgKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMzI1ODggRXJyb3Igc2F2aW5nIGNoYW5nZWQgc291cmNlIGZpbGVzOyBhbGwgZmlsZXMgaW4gcHJvamVjdCBkZWxldGVkKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkT3V0cHV0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCS8vIHNldHVwIHByb2plY3Qgd2l0aCAxIHNyYyBmb2xkZXIgYW5kIDEgb3V0cHV0IGZvbGRlcgotCQlJUGF0aCBwcm9qZWN0UGF0aCA9IGVudi5hZGRQcm9qZWN0KCJQIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LnJlbW92ZVBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICIiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgInNyYyIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwcm9qZWN0UGF0aCwgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0JCi0JCS8vIGFkZCBjdSBhbmQgYnVpbGQKLQkJZW52LmFkZENsYXNzKHByb2plY3RQYXRoLCAic3JjIiwgIkEiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwdWJsaWMgY2xhc3MgQSB7fSIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQkJZnVsbEJ1aWxkKCk7Ci0JCWV4cGVjdGluZ05vUHJvYmxlbXMoKTsKLQotCQkvLyBzZXQgaW52YWxpZCAgb3V0cHV0IGZvZGVyIGJ5IGVkaXRpbmcgdGhlIC5jbGFzc3BhdGggZmlsZQotCQllbnYuYWRkRmlsZSgKLQkJCXByb2plY3RQYXRoLCAKLQkJCSIuY2xhc3NwYXRoIiwgIC8vJE5PTi1OTFMtMSQKLQkJCSI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiPGNsYXNzcGF0aD5cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPVwic3JjXCIgcGF0aD1cInNyY1wiLz5cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPVwidmFyXCIgcGF0aD1cIiIgKyBVdGlsLmdldEphdmFDbGFzc0xpYigpICsgIlwiLz5cbiIgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSIgICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9XCJvdXRwdXRcIiBwYXRoPVwiXCIvPlxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSI8L2NsYXNzcGF0aD4iIC8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJCi0JCS8vIHNpbXVsYXRlIGV4aXQvcmVzdGFydAotCQlKYXZhTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKTsKLQkJSmF2YVByb2plY3QgcHJvamVjdCA9IChKYXZhUHJvamVjdCltYW5hZ2VyLmdldEphdmFNb2RlbCgpLmdldEphdmFQcm9qZWN0KCJQIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuYWdlci5yZW1vdmVQZXJQcm9qZWN0SW5mbyhwcm9qZWN0KTsKLQkJCi0JCS8vIGNoYW5nZSBjdSBhbmQgYnVpbGQKLQkJSVBhdGggY3VQYXRoID0gZW52LmFkZENsYXNzKHByb2plY3RQYXRoLCAic3JjIiwgIkEiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwdWJsaWMgY2xhc3MgQSB7IFN0cmluZyBzO30iIC8vJE5PTi1OTFMtMSQKLQkJCSk7CQkKLQkJaW5jcmVtZW50YWxCdWlsZCgpOwotCi0JCWV4cGVjdGluZ1ByZXNlbmNlT2YobmV3IElQYXRoW10ge2N1UGF0aH0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVQcm9qZWN0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYXRoIHByb2plY3RQYXRoID0gZW52LmFkZFByb2plY3QoIlAxIik7IC8vJE5PTi1OTFMtMSQKLQkJSVBhdGggYmluID0gZW52LnNldE91dHB1dEZvbGRlcihwcm9qZWN0UGF0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwcm9qZWN0UGF0aCwgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0KLQkJZW52LmFkZENsYXNzKHByb2plY3RQYXRoLCAiIiwgIkEiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwdWJsaWMgY2xhc3MgQSB7fSIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQkJZW52LmFkZENsYXNzKHByb2plY3RQYXRoLCAicCIsICJCIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwOyIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgQiB7fSIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQotCQlmdWxsQnVpbGQoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCQlleHBlY3RpbmdQcmVzZW5jZU9mKG5ldyBJUGF0aFtdIHsKLQkJCWJpbi5hcHBlbmQoIkEuY2xhc3MiKSwgLy8kTk9OLU5MUy0xJAotCQkJYmluLmFwcGVuZCgicC9CLmNsYXNzIikgLy8kTk9OLU5MUy0xJAotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvamVjdFdpdGhCaW4oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhdGggcHJvamVjdFBhdGggPSBlbnYuYWRkUHJvamVjdCgiUDIiKTsgLy8kTk9OLU5MUy0xJAotCQlJUGF0aCBzcmMgPSBlbnYuZ2V0UGFja2FnZUZyYWdtZW50Um9vdFBhdGgocHJvamVjdFBhdGgsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlJUGF0aCBiaW4gPSBlbnYuc2V0T3V0cHV0Rm9sZGVyKHByb2plY3RQYXRoLCAiYmluIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZEV4dGVybmFsSmFyKHByb2plY3RQYXRoLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQotCQllbnYuYWRkQ2xhc3Moc3JjLCAiIiwgIkEiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwdWJsaWMgY2xhc3MgQSB7fSIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQkJZW52LmFkZENsYXNzKHNyYywgInAiLCAiQiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDsiKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIEIge30iIC8vJE5PTi1OTFMtMSQKLQkJCSk7Ci0KLQkJZnVsbEJ1aWxkKCk7Ci0JCWV4cGVjdGluZ05vUHJvYmxlbXMoKTsKLQkJZXhwZWN0aW5nUHJlc2VuY2VPZihuZXcgSVBhdGhbXSB7Ci0JCQliaW4uYXBwZW5kKCJBLmNsYXNzIiksIC8vJE5PTi1OTFMtMSQKLQkJCWJpbi5hcHBlbmQoInAvQi5jbGFzcyIpIC8vJE5PTi1OTFMtMSQKLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb2plY3RXaXRoU3JjQmluKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYXRoIHByb2plY3RQYXRoID0gZW52LmFkZFByb2plY3QoIlAzIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LnJlbW92ZVBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlJUGF0aCBzcmMgPSBlbnYuYWRkUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgInNyYyIpOyAvLyROT04tTkxTLTEkCi0JCUlQYXRoIGJpbiA9IGVudi5zZXRPdXRwdXRGb2xkZXIocHJvamVjdFBhdGgsICJiaW4iKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocHJvamVjdFBhdGgsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCi0JCWVudi5hZGRDbGFzcyhzcmMsICIiLCAiQSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInB1YmxpYyBjbGFzcyBBIHt9IiAvLyROT04tTkxTLTEkCi0JCQkpOwotCQllbnYuYWRkQ2xhc3Moc3JjLCAicCIsICJCIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwOyIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgQiB7fSIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQotCQlmdWxsQnVpbGQoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCQlleHBlY3RpbmdQcmVzZW5jZU9mKG5ldyBJUGF0aFtdIHsKLQkJCWJpbi5hcHBlbmQoIkEuY2xhc3MiKSwgLy8kTk9OLU5MUy0xJAotCQkJYmluLmFwcGVuZCgicC9CLmNsYXNzIikgLy8kTk9OLU5MUy0xJAotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvamVjdFdpdGgyU3JjQmluKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYXRoIHByb2plY3RQYXRoID0gZW52LmFkZFByb2plY3QoIlA0Iik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LnJlbW92ZVBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlJUGF0aCBzcmMxID0gZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICJzcmMxIik7IC8vJE5PTi1OTFMtMSQKLQkJSVBhdGggc3JjMiA9IGVudi5hZGRQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAic3JjMiIpOyAvLyROT04tTkxTLTEkCi0JCUlQYXRoIGJpbiA9IGVudi5zZXRPdXRwdXRGb2xkZXIocHJvamVjdFBhdGgsICJiaW4iKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocHJvamVjdFBhdGgsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCi0JCWVudi5hZGRDbGFzcyhzcmMxLCAiIiwgIkEiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwdWJsaWMgY2xhc3MgQSB7fSIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQkJZW52LmFkZENsYXNzKHNyYzIsICJwIiwgIkIiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHA7IisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBCIHt9IiAvLyROT04tTkxTLTEkCi0JCQkpOwotCi0JCWZ1bGxCdWlsZCgpOwotCQlleHBlY3RpbmdOb1Byb2JsZW1zKCk7Ci0JCWV4cGVjdGluZ1ByZXNlbmNlT2YobmV3IElQYXRoW10gewotCQkJYmluLmFwcGVuZCgiQS5jbGFzcyIpLCAvLyROT04tTkxTLTEkCi0JCQliaW4uYXBwZW5kKCJwL0IuY2xhc3MiKSAvLyROT04tTkxTLTEkCi0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9qZWN0V2l0aDJTcmNBc0JpbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJUGF0aCBwcm9qZWN0UGF0aCA9IGVudi5hZGRQcm9qZWN0KCJQNSIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5yZW1vdmVQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJSVBhdGggc3JjMSA9IGVudi5hZGRQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAic3JjMSIsIG51bGwsICJzcmMxIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlJUGF0aCBzcmMyID0gZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICJzcmMyIiwgbnVsbCwgInNyYzIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCS8qSVBhdGggYmluID0qLyBlbnYuc2V0T3V0cHV0Rm9sZGVyKHByb2plY3RQYXRoLCAiYmluIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZEV4dGVybmFsSmFyKHByb2plY3RQYXRoLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQotCQllbnYuYWRkQ2xhc3Moc3JjMSwgIiIsICJBIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicHVibGljIGNsYXNzIEEge30iIC8vJE5PTi1OTFMtMSQKLQkJCSk7Ci0JCWVudi5hZGRDbGFzcyhzcmMyLCAicCIsICJCIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwOyIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgQiB7fSIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQotCQlmdWxsQnVpbGQoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCQlleHBlY3RpbmdQcmVzZW5jZU9mKG5ldyBJUGF0aFtdIHsKLQkJCXNyYzEuYXBwZW5kKCJBLmNsYXNzIiksIC8vJE5PTi1OTFMtMSQKLQkJCXNyYzIuYXBwZW5kKCJwL0IuY2xhc3MiKSAvLyROT04tTkxTLTEkCi0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9qZWN0V2l0aDJTcmMyQmluKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYXRoIHByb2plY3RQYXRoID0gZW52LmFkZFByb2plY3QoIlA2Iik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LnJlbW92ZVBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlJUGF0aCBzcmMxID0gZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICJzcmMxIiwgbnVsbCwgImJpbjEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUlQYXRoIHNyYzIgPSBlbnYuYWRkUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgInNyYzIiLCBudWxsLCAiYmluMiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZW52LnNldE91dHB1dEZvbGRlcihwcm9qZWN0UGF0aCwgImJpbjEiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocHJvamVjdFBhdGgsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCi0JCWVudi5hZGRDbGFzcyhzcmMxLCAiIiwgIkEiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwdWJsaWMgY2xhc3MgQSB7fSIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQkJZW52LmFkZENsYXNzKHNyYzIsICJwIiwgIkIiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHA7IisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBCIHt9IiAvLyROT04tTkxTLTEkCi0JCQkpOwotCi0JCWZ1bGxCdWlsZCgpOwotCQlleHBlY3RpbmdOb1Byb2JsZW1zKCk7Ci0JCWV4cGVjdGluZ1ByZXNlbmNlT2YobmV3IElQYXRoW10gewotCQkJcHJvamVjdFBhdGguYXBwZW5kKCJiaW4xL0EuY2xhc3MiKSwgLy8kTk9OLU5MUy0xJAotCQkJcHJvamVjdFBhdGguYXBwZW5kKCJiaW4yL3AvQi5jbGFzcyIpIC8vJE5PTi1OTFMtMSQKLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb2plY3RXaXRoM1NyYzJCaW4oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhdGggcHJvamVjdFBhdGggPSBlbnYuYWRkUHJvamVjdCgiUDYiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYucmVtb3ZlUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCUlQYXRoIHNyYzEgPSBlbnYuYWRkUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgInNyYzEiLCBudWxsLCAiYmluMSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJSVBhdGggc3JjMiA9IGVudi5hZGRQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAic3JjMiIsIG51bGwsICJiaW4yIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlJUGF0aCBzcmMzID0gZW52LmFkZFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICJzcmMzIiwgbnVsbCwgImJpbjIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWVudi5zZXRPdXRwdXRGb2xkZXIocHJvamVjdFBhdGgsICJiaW4xIik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZEV4dGVybmFsSmFyKHByb2plY3RQYXRoLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQotCQllbnYuYWRkQ2xhc3Moc3JjMSwgIiIsICJBIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicHVibGljIGNsYXNzIEEge30iIC8vJE5PTi1OTFMtMSQKLQkJCSk7Ci0JCWVudi5hZGRDbGFzcyhzcmMyLCAicCIsICJCIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwOyIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgQiB7fSIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQkJZW52LmFkZENsYXNzKHNyYzMsICIiLCAiQyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInB1YmxpYyBjbGFzcyBDIHt9IiAvLyROT04tTkxTLTEkCi0JCQkpOwotCi0JCWZ1bGxCdWlsZCgpOwotCQlleHBlY3RpbmdOb1Byb2JsZW1zKCk7Ci0JCWV4cGVjdGluZ1ByZXNlbmNlT2YobmV3IElQYXRoW10gewotCQkJcHJvamVjdFBhdGguYXBwZW5kKCJiaW4xL0EuY2xhc3MiKSwgLy8kTk9OLU5MUy0xJAotCQkJcHJvamVjdFBhdGguYXBwZW5kKCJiaW4yL3AvQi5jbGFzcyIpLCAvLyROT04tTkxTLTEkCi0JCQlwcm9qZWN0UGF0aC5hcHBlbmQoImJpbjIvQy5jbGFzcyIpIC8vJE5PTi1OTFMtMSQKLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdDJQcm9qZWN0V2l0aDFCaW4oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhdGggcHJvamVjdFBhdGggPSBlbnYuYWRkUHJvamVjdCgiUDciKTsgLy8kTk9OLU5MUy0xJAotCQllbnYucmVtb3ZlUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3RQYXRoLCAic3JjIik7IC8vJE5PTi1OTFMtMSQKLQkJSVBhdGggYmluID0gZW52LnNldE91dHB1dEZvbGRlcihwcm9qZWN0UGF0aCwgImJpbiIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwcm9qZWN0UGF0aCwgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0KLQkJSVBhdGggcHJvamVjdFBhdGgyID0gZW52LmFkZFByb2plY3QoIlA4Iik7IC8vJE5PTi1OTFMtMSQKLQkJSVBhdGggYmluTG9jYXRpb24gPSBlbnYuZ2V0UHJvamVjdChwcm9qZWN0UGF0aCkuZ2V0Rm9sZGVyKCJiaW4iKS5nZXRMb2NhdGlvbigpOyAvLyROT04tTkxTLTEkCi0JCWVudi5zZXRFeHRlcm5hbE91dHB1dEZvbGRlcihwcm9qZWN0UGF0aDIsICJleHRlcm5hbEJpbiIsIGJpbkxvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocHJvamVjdFBhdGgyLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQkJZW52LmFkZFJlcXVpcmVkUHJvamVjdChwcm9qZWN0UGF0aDIsIHByb2plY3RQYXRoKTsKLQotCQllbnYuYWRkQ2xhc3MocHJvamVjdFBhdGgyLCAicCIsICJCIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwOyIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgQiB7fSIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQotCQlmdWxsQnVpbGQoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCQlleHBlY3RpbmdQcmVzZW5jZU9mKGJpbi5hcHBlbmQoInAvQi5jbGFzcyIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2J1aWxkZXIvUGFja2FnZVRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9idWlsZGVyL1BhY2thZ2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzFkODAwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2J1aWxkZXIvUGFja2FnZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLnV0aWwuVXRpbDsKLQotcHVibGljIGNsYXNzIFBhY2thZ2VUZXN0cyBleHRlbmRzIFRlc3RzIHsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBFWENMVURFRF9URVNUUyA9IHsKLQl9OwotCQotCXB1YmxpYyBQYWNrYWdlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IEZpbHRlcmVkVGVzdFN1aXRlKEVYQ0xVREVEX1RFU1RTKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFBhY2thZ2VUZXN0cy5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JLyoqCi0JICogQnVncyA2NTY0Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdFBhY2thZ2VQcm9ibGVtKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyAgICAgICAgICAgU3RlcCAxCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlJUGF0aCBwcm9qZWN0UGF0aCA9IGVudi5hZGRQcm9qZWN0KCJQcm9qZWN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZEV4dGVybmFsSmFyKHByb2plY3RQYXRoLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQkJZW52LnJlbW92ZVBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlJUGF0aCBzcmMgPSBlbnYuYWRkUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgInNyYyIpOyAvLyROT04tTkxTLTEkCi0JCUlQYXRoIHNyYzIgPSBlbnYuYWRkUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgInNyYzIiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuc2V0T3V0cHV0Rm9sZGVyKHByb2plY3RQYXRoLCAiYmluIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWVudi5hZGRDbGFzcyhzcmMsICJwYWNrIiwgIlgiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHBhY2s7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIFgge1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIn1cbiIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQkJCQotCQllbnYuYWRkQ2xhc3Moc3JjMiwgInAxIiwgIlgiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAxO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XG4iIC8vJE5PTi1OTFMtMSQKLQkJCSk7Ci0JCQkKLQkJZW52LmFkZENsYXNzKHNyYzIsICJwMiIsICJZIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwMjtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgWSBleHRlbmRzIHAxLlgge1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIn1cbiIgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQkJCQotCQllbnYuYWRkQ2xhc3Moc3JjMiwgInAzIiwgIloiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAzO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBaIGV4dGVuZHMgcDIuWSB7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiAvLyROT04tTkxTLTEkCi0JCQkpOwotCi0JCQotCQlmdWxsQnVpbGQoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCQkKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCS8vICAgICAgICAgICBTdGVwIDIKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCWVudi5yZW1vdmVDbGFzcyhlbnYuZ2V0UGFja2FnZVBhdGgoc3JjLCAicGFjayIpLCAiWCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZW52LnJlbW92ZVBhY2thZ2Uoc3JjMiwgInAzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQlpbmNyZW1lbnRhbEJ1aWxkKCk7Ci0JCWV4cGVjdGluZ05vUHJvYmxlbXMoKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2J1aWxkZXIvUHJvYmxlbS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvYnVpbGRlci9Qcm9ibGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyM2U0NzAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvYnVpbGRlci9Qcm9ibGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotcHVibGljIGNsYXNzIFByb2JsZW0gewotCXByaXZhdGUgU3RyaW5nIGxvY2F0aW9uOwotCXByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7Ci0JcHJpdmF0ZSBJUGF0aCByZXNvdXJjZVBhdGg7Ci0JCi0JcHVibGljIFByb2JsZW0oU3RyaW5nIGxvY2F0aW9uLCBTdHJpbmcgbWVzc2FnZSwgSVBhdGggcmVzb3VyY2VQYXRoKXsKLQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotCQl0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotCQl0aGlzLnJlc291cmNlUGF0aCA9IHJlc291cmNlUGF0aDsKLQl9Ci0JCi0JcHVibGljIFByb2JsZW0oSU1hcmtlciBtYXJrZXIpewotCQl0aGlzLmxvY2F0aW9uID0gbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkxPQ0FUSU9OLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5tZXNzYWdlID0gbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UsICIiKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLnJlc291cmNlUGF0aCA9IG1hcmtlci5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCk7Ci0JfQotCS8qKgotCSAqIEdldHMgdGhlIGxvY2F0aW9uLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0JLyoqCi0JICogR2V0cyB0aGUgbWVzc2FnZS4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBtZXNzYWdlOwotCX0KLQkvKioKLQkgKiBHZXRzIHRoZSByZXNvdXJjZVBhdGguCi0JICogQHJldHVybiBSZXR1cm5zIGEgSVBhdGgKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UmVzb3VyY2VQYXRoKCkgewotCQlyZXR1cm4gcmVzb3VyY2VQYXRoOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7Ci0vLyBpZ25vcmUgbG9jYXRpb25zIHNpbmNlIHRoZSBidWlsZGVyIG5vIGxvbmdlciBmaW5kcyBleGFjdCBKYXZhIGVsZW1lbnRzCi0vLwkJcmV0dXJuICJQcm9ibGVtIDogIiArIG1lc3NhZ2UgKyAiIFsgcmVzb3VyY2UgOiA8IiArIHJlc291cmNlUGF0aCArICI+IGxvY2F0aW9uIDwiKyBsb2NhdGlvbiArICI+IF0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCXJldHVybiAiUHJvYmxlbSA6ICIgKyBtZXNzYWdlICsgIiBbIHJlc291cmNlIDogPCIgKyByZXNvdXJjZVBhdGggKyAiPiBdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pewotCQlpZihvIGluc3RhbmNlb2YgUHJvYmxlbSl7Ci0JCQlyZXR1cm4gdGhpcy50b1N0cmluZygpLmVxdWFscyhvLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmJ1aWxkZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2J1aWxkZXIvU3RhdGljRmluYWxUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvYnVpbGRlci9TdGF0aWNGaW5hbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYjU0NDMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvYnVpbGRlci9TdGF0aWNGaW5hbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy51dGlsLlV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBTdGF0aWNGaW5hbFRlc3RzIGV4dGVuZHMgVGVzdHMgewotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIEVYQ0xVREVEX1RFU1RTID0ge307Ci0JCi0JcHVibGljIFN0YXRpY0ZpbmFsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IEZpbHRlcmVkVGVzdFN1aXRlKEVYQ0xVREVEX1RFU1RTKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN0YXRpY0ZpbmFsVGVzdHMuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJvb2xlYW4oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhdGggcHJvamVjdFBhdGggPSBlbnYuYWRkUHJvamVjdCgiUHJvamVjdCIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwcm9qZWN0UGF0aCwgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0KLQkJZW52LmFkZENsYXNzKHByb2plY3RQYXRoLCAicDEiLCAiQSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDE7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBBIHsgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIFZBUiA9IHRydWU7IH0iIC8vJE5PTi1OTFMtMSQKLQkJKTsKLQotCQllbnYuYWRkQ2xhc3MocHJvamVjdFBhdGgsICJwMSIsICJNYWluIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwMTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIE1haW4ge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICAgICAgU3lzdGVtLm91dC5wcmludGxuKEEuVkFSKTtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIgICB9XG4iKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiAvLyROT04tTkxTLTEkCi0JCSk7Ci0KLQkJZnVsbEJ1aWxkKCk7Ci0JCWV4cGVjdGluZ05vUHJvYmxlbXMoKTsKLQkJZXhlY3V0ZUNsYXNzKHByb2plY3RQYXRoLCAicDEuTWFpbiIsICJ0cnVlIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCWVudi5hZGRDbGFzcyhwcm9qZWN0UGF0aCwgInAxIiwgIkEiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAxO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgQSB7IHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBWQVIgPSBmYWxzZTsgfSIgLy8kTk9OLU5MUy0xJAotCQkpOwotCi0JCWluY3JlbWVudGFsQnVpbGQoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCQlleGVjdXRlQ2xhc3MocHJvamVjdFBhdGgsICJwMS5NYWluIiwgImZhbHNlIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCeXRlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYXRoIHByb2plY3RQYXRoID0gZW52LmFkZFByb2plY3QoIlByb2plY3QiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocHJvamVjdFBhdGgsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCi0JCWVudi5hZGRDbGFzcyhwcm9qZWN0UGF0aCwgInAxIiwgIkEiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAxO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgQSB7IHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBWQVIgPSAoYnl0ZSkgMDsgfSIgLy8kTk9OLU5MUy0xJAotCQkpOwotCi0JCWVudi5hZGRDbGFzcyhwcm9qZWN0UGF0aCwgInAxIiwgIk1haW4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAxO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgTWFpbiB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oQS5WQVIpO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIiAgIH1cbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XG4iIC8vJE5PTi1OTFMtMSQKLQkJKTsKLQotCQlmdWxsQnVpbGQoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCQlleGVjdXRlQ2xhc3MocHJvamVjdFBhdGgsICJwMS5NYWluIiwgIjAiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0KLQkJZW52LmFkZENsYXNzKHByb2plY3RQYXRoLCAicDEiLCAiQSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDE7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBBIHsgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFZBUiA9IChieXRlKSAxOyB9IiAvLyROT04tTkxTLTEkCi0JCSk7Ci0KLQkJaW5jcmVtZW50YWxCdWlsZCgpOwotCQlleHBlY3RpbmdOb1Byb2JsZW1zKCk7Ci0JCWV4ZWN1dGVDbGFzcyhwcm9qZWN0UGF0aCwgInAxLk1haW4iLCAiMSIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhcigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJUGF0aCBwcm9qZWN0UGF0aCA9IGVudi5hZGRQcm9qZWN0KCJQcm9qZWN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZEV4dGVybmFsSmFyKHByb2plY3RQYXRoLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQotCQllbnYuYWRkQ2xhc3MocHJvamVjdFBhdGgsICJwMSIsICJBIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwMTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIEEgeyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQVIgPSBcIkhlbGxvXCI7IH0iIC8vJE5PTi1OTFMtMSQKLQkJKTsKLQotCQllbnYuYWRkQ2xhc3MocHJvamVjdFBhdGgsICJwMSIsICJNYWluIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwMTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIE1haW4ge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICAgICAgU3lzdGVtLm91dC5wcmludGxuKEEuVkFSKTtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIgICB9XG4iKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiAvLyROT04tTkxTLTEkCi0JCSk7Ci0KLQkJZnVsbEJ1aWxkKCk7Ci0JCWV4cGVjdGluZ05vUHJvYmxlbXMoKTsKLQkJZXhlY3V0ZUNsYXNzKHByb2plY3RQYXRoLCAicDEuTWFpbiIsICJIZWxsbyIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCQllbnYuYWRkQ2xhc3MocHJvamVjdFBhdGgsICJwMSIsICJBIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwMTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIEEgeyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQVIgPSBcIkJ5ZVwiOyB9IiAvLyROT04tTkxTLTEkCi0JCSk7Ci0KLQkJaW5jcmVtZW50YWxCdWlsZCgpOwotCQlleHBlY3RpbmdOb1Byb2JsZW1zKCk7Ci0JCWV4ZWN1dGVDbGFzcyhwcm9qZWN0UGF0aCwgInAxLk1haW4iLCAiQnllIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REb3VibGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhdGggcHJvamVjdFBhdGggPSBlbnYuYWRkUHJvamVjdCgiUHJvamVjdCIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwcm9qZWN0UGF0aCwgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0KLQkJZW52LmFkZENsYXNzKHByb2plY3RQYXRoLCAicDEiLCAiQSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDE7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBBIHsgcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUgVkFSID0gKGRvdWJsZSkgMjsgfSIgLy8kTk9OLU5MUy0xJAotCQkpOwotCi0JCWVudi5hZGRDbGFzcyhwcm9qZWN0UGF0aCwgInAxIiwgIk1haW4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAxO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgTWFpbiB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oQS5WQVIpO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIiAgIH1cbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XG4iIC8vJE5PTi1OTFMtMSQKLQkJKTsKLQotCQlmdWxsQnVpbGQoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCQlleGVjdXRlQ2xhc3MocHJvamVjdFBhdGgsICJwMS5NYWluIiwgIjIiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0KLQkJZW52LmFkZENsYXNzKHByb2plY3RQYXRoLCAicDEiLCAiQSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDE7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBBIHsgcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUgVkFSID0gKGRvdWJsZSkgMzsgfSIgLy8kTk9OLU5MUy0xJAotCQkpOwotCi0JCWluY3JlbWVudGFsQnVpbGQoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCQlleGVjdXRlQ2xhc3MocHJvamVjdFBhdGgsICJwMS5NYWluIiwgIjMiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZsb2F0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYXRoIHByb2plY3RQYXRoID0gZW52LmFkZFByb2plY3QoIlByb2plY3QiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocHJvamVjdFBhdGgsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCi0JCWVudi5hZGRDbGFzcyhwcm9qZWN0UGF0aCwgInAxIiwgIkEiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAxO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgQSB7IHB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgVkFSID0gKGZsb2F0KSA0OyB9IiAvLyROT04tTkxTLTEkCi0JCSk7Ci0KLQkJZW52LmFkZENsYXNzKHByb2plY3RQYXRoLCAicDEiLCAiTWFpbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDE7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBNYWluIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkge1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIiAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihBLlZBUik7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICAgfVxuIisgLy8kTk9OLU5MUy0xJAotCQkJIn1cbiIgLy8kTk9OLU5MUy0xJAotCQkpOwotCi0JCWZ1bGxCdWlsZCgpOwotCQlleHBlY3RpbmdOb1Byb2JsZW1zKCk7Ci0JCWV4ZWN1dGVDbGFzcyhwcm9qZWN0UGF0aCwgInAxLk1haW4iLCAiNCIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCQllbnYuYWRkQ2xhc3MocHJvamVjdFBhdGgsICJwMSIsICJBIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwMTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIEEgeyBwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IFZBUiA9IChmbG9hdCkgNTsgfSIgLy8kTk9OLU5MUy0xJAotCQkpOwotCi0JCWluY3JlbWVudGFsQnVpbGQoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCQlleGVjdXRlQ2xhc3MocHJvamVjdFBhdGgsICJwMS5NYWluIiwgIjUiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJUGF0aCBwcm9qZWN0UGF0aCA9IGVudi5hZGRQcm9qZWN0KCJQcm9qZWN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZEV4dGVybmFsSmFyKHByb2plY3RQYXRoLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQotCQllbnYuYWRkQ2xhc3MocHJvamVjdFBhdGgsICJwMSIsICJBIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwMTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIEEgeyBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQVIgPSAoaW50KSA2OyB9IiAvLyROT04tTkxTLTEkCi0JCSk7Ci0KLQkJZW52LmFkZENsYXNzKHByb2plY3RQYXRoLCAicDEiLCAiTWFpbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDE7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBNYWluIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkge1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIiAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihBLlZBUik7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICAgfVxuIisgLy8kTk9OLU5MUy0xJAotCQkJIn1cbiIgLy8kTk9OLU5MUy0xJAotCQkpOwotCi0JCWZ1bGxCdWlsZCgpOwotCQlleHBlY3RpbmdOb1Byb2JsZW1zKCk7Ci0JCWV4ZWN1dGVDbGFzcyhwcm9qZWN0UGF0aCwgInAxLk1haW4iLCAiNiIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCQllbnYuYWRkQ2xhc3MocHJvamVjdFBhdGgsICJwMSIsICJBIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwMTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIEEgeyBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQVIgPSAoaW50KSA3OyB9IiAvLyROT04tTkxTLTEkCi0JCSk7Ci0KLQkJaW5jcmVtZW50YWxCdWlsZCgpOwotCQlleHBlY3RpbmdOb1Byb2JsZW1zKCk7Ci0JCWV4ZWN1dGVDbGFzcyhwcm9qZWN0UGF0aCwgInAxLk1haW4iLCAiNyIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TG9uZygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJUGF0aCBwcm9qZWN0UGF0aCA9IGVudi5hZGRQcm9qZWN0KCJQcm9qZWN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJZW52LmFkZEV4dGVybmFsSmFyKHByb2plY3RQYXRoLCBVdGlsLmdldEphdmFDbGFzc0xpYigpKTsKLQotCQllbnYuYWRkQ2xhc3MocHJvamVjdFBhdGgsICJwMSIsICJBIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwMTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIEEgeyBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgVkFSID0gKGxvbmcpIDg7IH0iIC8vJE5PTi1OTFMtMSQKLQkJKTsKLQotCQllbnYuYWRkQ2xhc3MocHJvamVjdFBhdGgsICJwMSIsICJNYWluIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkicGFja2FnZSBwMTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIE1haW4ge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICAgICAgU3lzdGVtLm91dC5wcmludGxuKEEuVkFSKTtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIgICB9XG4iKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiAvLyROT04tTkxTLTEkCi0JCSk7Ci0KLQkJZnVsbEJ1aWxkKCk7Ci0JCWV4cGVjdGluZ05vUHJvYmxlbXMoKTsKLQkJZXhlY3V0ZUNsYXNzKHByb2plY3RQYXRoLCAicDEuTWFpbiIsICI4IiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCWVudi5hZGRDbGFzcyhwcm9qZWN0UGF0aCwgInAxIiwgIkEiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAxO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgQSB7IHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBWQVIgPSAobG9uZykgOTsgfSIgLy8kTk9OLU5MUy0xJAotCQkpOwotCi0JCWluY3JlbWVudGFsQnVpbGQoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCQlleGVjdXRlQ2xhc3MocHJvamVjdFBhdGgsICJwMS5NYWluIiwgIjkiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNob3J0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYXRoIHByb2plY3RQYXRoID0gZW52LmFkZFByb2plY3QoIlByb2plY3QiKTsgLy8kTk9OLU5MUy0xJAotCQllbnYuYWRkRXh0ZXJuYWxKYXIocHJvamVjdFBhdGgsIFV0aWwuZ2V0SmF2YUNsYXNzTGliKCkpOwotCi0JCWVudi5hZGRDbGFzcyhwcm9qZWN0UGF0aCwgInAxIiwgIkEiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAxO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgQSB7IHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgVkFSID0gKHNob3J0KSAxMDsgfSIgLy8kTk9OLU5MUy0xJAotCQkpOwotCi0JCWVudi5hZGRDbGFzcyhwcm9qZWN0UGF0aCwgInAxIiwgIk1haW4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAxO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgTWFpbiB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHtcbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSIgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oQS5WQVIpO1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIiAgIH1cbiIrIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XG4iIC8vJE5PTi1OTFMtMSQKLQkJKTsKLQotCQlmdWxsQnVpbGQoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCQlleGVjdXRlQ2xhc3MocHJvamVjdFBhdGgsICJwMS5NYWluIiwgIjEwIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCWVudi5hZGRDbGFzcyhwcm9qZWN0UGF0aCwgInAxIiwgIkEiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSJwYWNrYWdlIHAxO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgQSB7IHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgVkFSID0gKHNob3J0KSAxMTsgfSIgLy8kTk9OLU5MUy0xJAotCQkpOwotCi0JCWluY3JlbWVudGFsQnVpbGQoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCQlleGVjdXRlQ2xhc3MocHJvamVjdFBhdGgsICJwMS5NYWluIiwgIjExIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhdGggcHJvamVjdFBhdGggPSBlbnYuYWRkUHJvamVjdCgiUHJvamVjdCIpOyAvLyROT04tTkxTLTEkCi0JCWVudi5hZGRFeHRlcm5hbEphcihwcm9qZWN0UGF0aCwgVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSk7Ci0KLQkJZW52LmFkZENsYXNzKHByb2plY3RQYXRoLCAicDEiLCAiQSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDE7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBBIHsgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSID0gXCJIZWxsb1wiOyB9IiAvLyROT04tTkxTLTEkCi0JCSk7Ci0KLQkJZW52LmFkZENsYXNzKHByb2plY3RQYXRoLCAicDEiLCAiTWFpbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDE7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBNYWluIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkge1xuIisgLy8kTk9OLU5MUy0xJAotCQkJIiAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihBLlZBUik7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiICAgfVxuIisgLy8kTk9OLU5MUy0xJAotCQkJIn1cbiIgLy8kTk9OLU5MUy0xJAotCQkpOwotCi0JCWZ1bGxCdWlsZCgpOwotCQlleHBlY3RpbmdOb1Byb2JsZW1zKCk7Ci0JCWV4ZWN1dGVDbGFzcyhwcm9qZWN0UGF0aCwgInAxLk1haW4iLCAiSGVsbG8iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0KLQkJZW52LmFkZENsYXNzKHByb2plY3RQYXRoLCAicDEiLCAiQSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJInBhY2thZ2UgcDE7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBBIHsgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSID0gXCJCeWVcIjsgfSIgLy8kTk9OLU5MUy0xJAotCQkpOwotCi0JCWluY3JlbWVudGFsQnVpbGQoKTsKLQkJZXhwZWN0aW5nTm9Qcm9ibGVtcygpOwotCQlleGVjdXRlQ2xhc3MocHJvamVjdFBhdGgsICJwMS5NYWluIiwgIkJ5ZSIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9idWlsZGVyL1Rlc3RpbmdFbnZpcm9ubWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvYnVpbGRlci9UZXN0aW5nRW52aXJvbm1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg1YzNhMS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9idWlsZGVyL1Rlc3RpbmdFbnZpcm9ubWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YVByb2plY3Q7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgVGVzdGluZ0Vudmlyb25tZW50IHsKLQkKLQlwcml2YXRlIGJvb2xlYW4gZklzT3BlbiA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmV2FzQnVpbHQgPSBmYWxzZTsKLQotCXByaXZhdGUgSVdvcmtzcGFjZSBmV29ya3NwYWNlID0gbnVsbDsKLQlwcml2YXRlIEhhc2h0YWJsZSBmUHJvamVjdHMgPSBudWxsOwotCi0JcHJpdmF0ZSB2b2lkIGFkZEJ1aWxkZXJTcGVjcyhTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQkJdHJ5IHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3IFN0cmluZ1tdIHsgSmF2YUNvcmUuTkFUVVJFX0lEIH0pOwotCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJaGFuZGxlQ29yZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qKiBBZGRzIGEgYmluYXJ5IGNsYXNzIHdpdGggdGhlIGdpdmVuIGNvbnRlbnRzIHRvIHRoZQotCSAqIGdpdmVuIHBhY2thZ2UgaW4gdGhlIHdvcmtzcGFjZS4gIFRoZSBwYWNrYWdlIGlzIGNyZWF0ZWQKLQkgKiBpZiBuZWNlc3NhcnkuICBJZiBhIGNsYXNzIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5Ci0JICogZXhpc3RzLCBpdCBpcyByZXBsYWNlZC4gIEEgd29ya3NwYWNlIG11c3QgYmUgb3BlbiwKLQkgKiBhbmQgdGhlIGdpdmVuIGNsYXNzIG5hbWUgbXVzdCBub3QgZW5kIHdpdGggIi5jbGFzcyIuCi0JICogUmV0dXJucyB0aGUgcGF0aCBvZiB0aGUgYWRkZWQgY2xhc3MuCi0JICovCi0JcHVibGljIElQYXRoIGFkZEJpbmFyeUNsYXNzKElQYXRoIHBhY2thZ2VQYXRoLCBTdHJpbmcgY2xhc3NOYW1lLCBieXRlW10gY29udGVudHMpIHsKLQkJY2hlY2tBc3NlcnRpb24oImEgd29ya3NwYWNlIG11c3QgYmUgb3BlbiIsIGZJc09wZW4pOyAvLyROT04tTkxTLTEkCi0JCUlQYXRoIGNsYXNzUGF0aCA9IHBhY2thZ2VQYXRoLmFwcGVuZChjbGFzc05hbWUgKyAiLmNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJY3JlYXRlRmlsZShjbGFzc1BhdGgsIGNvbnRlbnRzKTsKLQkJcmV0dXJuIGNsYXNzUGF0aDsKLQl9Ci0JCi0JLyoqIEFkZHMgYSBiaW5hcnkgY2xhc3Mgd2l0aCB0aGUgZ2l2ZW4gY29udGVudHMgdG8gdGhlCi0JICogZ2l2ZW4gcGFja2FnZSBpbiB0aGUgd29ya3NwYWNlLiAgVGhlIHBhY2thZ2UgaXMgY3JlYXRlZAotCSAqIGlmIG5lY2Vzc2FyeS4gIElmIGEgY2xhc3Mgd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkKLQkgKiBleGlzdHMsIGl0IGlzIHJlcGxhY2VkLiAgQSB3b3Jrc3BhY2UgbXVzdCBiZSBvcGVuLAotCSAqIGFuZCB0aGUgZ2l2ZW4gY2xhc3MgbmFtZSBtdXN0IG5vdCBlbmQgd2l0aCAiLmNsYXNzIi4KLQkgKiBSZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBhZGRlZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgSVBhdGggYWRkQmluYXJ5Q2xhc3MoSVBhdGggcGFja2FnZUZyYWdtZW50Um9vdFBhdGgsIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGNsYXNzTmFtZSwgYnl0ZVtdIGNvbnRlbnRzKSB7Ci0JCS8qIG1ha2Ugc3VyZSB0aGUgcGFja2FnZSBleGlzdHMgKi8KLQkJaWYocGFja2FnZU5hbWUgIT0gbnVsbCAmJiBwYWNrYWdlTmFtZS5sZW5ndGgoKSA+MCl7Ci0JCQlJUGF0aCBwYWNrYWdlUGF0aCA9IGFkZFBhY2thZ2UocGFja2FnZUZyYWdtZW50Um9vdFBhdGgsIHBhY2thZ2VOYW1lKTsKLQotCQkJcmV0dXJuIGFkZEJpbmFyeUNsYXNzKHBhY2thZ2VQYXRoLCBjbGFzc05hbWUsIGNvbnRlbnRzKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBhZGRCaW5hcnlDbGFzcyhwYWNrYWdlRnJhZ21lbnRSb290UGF0aCwgY2xhc3NOYW1lLCBjb250ZW50cyk7Ci0JCX0KLQkJCQotCX0KLQkKLQkvKiogQWRkcyBhIGNsYXNzIHdpdGggdGhlIGdpdmVuIGNvbnRlbnRzIHRvIHRoZSBnaXZlbgotCSAqIHBhY2thZ2UgaW4gdGhlIHdvcmtzcGFjZS4gIFRoZSBwYWNrYWdlIGlzIGNyZWF0ZWQKLQkgKiBpZiBuZWNlc3NhcnkuICBJZiBhIGNsYXNzIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5Ci0JICogZXhpc3RzLCBpdCBpcyByZXBsYWNlZC4gIEEgd29ya3NwYWNlIG11c3QgYmUgb3BlbiwKLQkgKiBhbmQgdGhlIGdpdmVuIGNsYXNzIG5hbWUgbXVzdCBub3QgZW5kIHdpdGggIi5qYXZhIi4KLQkgKiBSZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBhZGRlZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgSVBhdGggYWRkQ2xhc3MoSVBhdGggcGFja2FnZVBhdGgsIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBjb250ZW50cykgewotCQljaGVja0Fzc2VydGlvbigiYSB3b3Jrc3BhY2UgbXVzdCBiZSBvcGVuIiwgZklzT3Blbik7IC8vJE5PTi1OTFMtMSQKLQkJSVBhdGggY2xhc3NQYXRoID0gcGFja2FnZVBhdGguYXBwZW5kKGNsYXNzTmFtZSArICIuamF2YSIpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQljcmVhdGVGaWxlKGNsYXNzUGF0aCwgY29udGVudHMuZ2V0Qnl0ZXMoIlVURjgiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJY2hlY2tBc3NlcnRpb24oImUxIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGNsYXNzUGF0aDsKLQl9Ci0JCi0JLyoqIEFkZHMgYSBjbGFzcyB3aXRoIHRoZSBnaXZlbiBjb250ZW50cyB0byB0aGUgZ2l2ZW4KLQkgKiBwYWNrYWdlIGluIHRoZSB3b3Jrc3BhY2UuICBUaGUgcGFja2FnZSBpcyBjcmVhdGVkCi0JICogaWYgbmVjZXNzYXJ5LiAgSWYgYSBjbGFzcyB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeQotCSAqIGV4aXN0cywgaXQgaXMgcmVwbGFjZWQuICBBIHdvcmtzcGFjZSBtdXN0IGJlIG9wZW4sCi0JICogYW5kIHRoZSBnaXZlbiBjbGFzcyBuYW1lIG11c3Qgbm90IGVuZCB3aXRoICIuamF2YSIuCi0JICogUmV0dXJucyB0aGUgcGF0aCBvZiB0aGUgYWRkZWQgY2xhc3MuCi0JICovCi0JcHVibGljIElQYXRoIGFkZENsYXNzKElQYXRoIHBhY2thZ2VGcmFnbWVudFJvb3RQYXRoLCBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBjb250ZW50cykgewotCQkvKiBtYWtlIHN1cmUgdGhlIHBhY2thZ2UgZXhpc3RzICovCi0JCWlmKHBhY2thZ2VOYW1lICE9IG51bGwgJiYgcGFja2FnZU5hbWUubGVuZ3RoKCkgPjApewotCQkJSVBhdGggcGFja2FnZVBhdGggPSBhZGRQYWNrYWdlKHBhY2thZ2VGcmFnbWVudFJvb3RQYXRoLCBwYWNrYWdlTmFtZSk7Ci0KLQkJCXJldHVybiBhZGRDbGFzcyhwYWNrYWdlUGF0aCwgY2xhc3NOYW1lLCBjb250ZW50cyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gYWRkQ2xhc3MocGFja2FnZUZyYWdtZW50Um9vdFBhdGgsIGNsYXNzTmFtZSwgY29udGVudHMpOwotCQl9Ci0JfQotCi0JLyoqIEFkZHMgYSBwYWNrYWdlIHRvIHRoZSBnaXZlbiBwYWNrYWdlIGZyYWdtZW50IHJvb3QKLQkgKiBpbiB0aGUgd29ya3NwYWNlLiAgVGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBpcyBjcmVhdGVkCi0JICogaWYgbmVjZXNzYXJ5LiAgSWYgYSBwYWNrYWdlIHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5Ci0JICogZXhpc3RzLCBpdCBpcyBub3QgcmVwbGFjZWQuICBBIHdvcmtzcGFjZSBtdXN0IGJlIG9wZW4uCi0JICogUmV0dXJucyB0aGUgcGF0aCBvZiB0aGUgYWRkZWQgcGFja2FnZS4KLQkgKi8KLQlwdWJsaWMgSVBhdGggYWRkUGFja2FnZShJUGF0aCBwYWNrYWdlRnJhZ21lbnRSb290UGF0aCwgU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0JCWNoZWNrQXNzZXJ0aW9uKCJhIHdvcmtzcGFjZSBtdXN0IGJlIG9wZW4iLCBmSXNPcGVuKTsgLy8kTk9OLU5MUy0xJAotCQlJUGF0aCBwYXRoID0KLQkJCXBhY2thZ2VGcmFnbWVudFJvb3RQYXRoLmFwcGVuZChwYWNrYWdlTmFtZS5yZXBsYWNlKCcuJywgSVBhdGguU0VQQVJBVE9SKSk7Ci0JCWNyZWF0ZUZvbGRlcihwYXRoKTsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JcHVibGljIElQYXRoIGFkZFBhY2thZ2VGcmFnbWVudFJvb3QoSVBhdGggcHJvamVjdFBhdGgsIFN0cmluZyBzb3VyY2VGb2xkZXJOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGFkZFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdFBhdGgsIHNvdXJjZUZvbGRlck5hbWUsIG51bGwsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqIEFkZHMgYSBwYWNrYWdlIGZyYWdtZW50IHJvb3QgdG8gdGhlIHdvcmtzcGFjZS4gIElmCi0JICogYSBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkKLQkgKiBleGlzdHMsIGl0IGlzIG5vdCByZXBsYWNlZC4gIEEgd29ya3NwYWNlIG11c3QgYmUgb3Blbi4KLQkgKiBSZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBhZGRlZCBwYWNrYWdlIGZyYWdtZW50IHJvb3QuCi0JICovCi0JcHVibGljIElQYXRoIGFkZFBhY2thZ2VGcmFnbWVudFJvb3QoSVBhdGggcHJvamVjdFBhdGgsIFN0cmluZyBzb3VyY2VGb2xkZXJOYW1lLCBJUGF0aFtdIGV4Y2x1c2lvblBhdHRlcm5zLCBTdHJpbmcgc3BlY2lmaWNPdXRwdXRMb2NhdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCWNoZWNrQXNzZXJ0aW9uKCJhIHdvcmtzcGFjZSBtdXN0IGJlIG9wZW4iLCBmSXNPcGVuKTsgLy8kTk9OLU5MUy0xJAotCQlJUGF0aCBwYXRoID0gZ2V0UGFja2FnZUZyYWdtZW50Um9vdFBhdGgocHJvamVjdFBhdGgsIHNvdXJjZUZvbGRlck5hbWUpOwotCQljcmVhdGVGb2xkZXIocGF0aCk7Ci0JCUlQYXRoIG91dHB1dFBhdGggPSBudWxsOwotCQlpZiAoc3BlY2lmaWNPdXRwdXRMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQlvdXRwdXRQYXRoID0gZ2V0UGFja2FnZUZyYWdtZW50Um9vdFBhdGgocHJvamVjdFBhdGgsIHNwZWNpZmljT3V0cHV0TG9jYXRpb24pOwotCQkJY3JlYXRlRm9sZGVyKG91dHB1dFBhdGgpOwotCQl9Ci0JCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KHBhdGgsIGV4Y2x1c2lvblBhdHRlcm5zID09IG51bGwgPyBuZXcgUGF0aFswXSA6IGV4Y2x1c2lvblBhdHRlcm5zLCBvdXRwdXRQYXRoKTsKLQkJYWRkRW50cnkocHJvamVjdFBhdGgsIGVudHJ5KTsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCQotCXB1YmxpYyBJUGF0aCBhZGRQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSl7Ci0JCWNoZWNrQXNzZXJ0aW9uKCJhIHdvcmtzcGFjZSBtdXN0IGJlIG9wZW4iLCBmSXNPcGVuKTsgLy8kTk9OLU5MUy0xJAotCQlJUHJvamVjdCBwcm9qZWN0ID0gY3JlYXRlUHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCXJldHVybiBwcm9qZWN0LmdldEZ1bGxQYXRoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVxdWlyZWRQcm9qZWN0KElQYXRoIHByb2plY3RQYXRoLCBJUGF0aCByZXF1aXJlZFByb2plY3RQYXRoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJYWRkUmVxdWlyZWRQcm9qZWN0KHByb2plY3RQYXRoLCByZXF1aXJlZFByb2plY3RQYXRoLCBmYWxzZSk7Ci0JfQotCQotCS8qKiBBZGRzIGEgcHJvamVjdCB0byB0aGUgY2xhc3NwYXRoIG9mIGEgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZXF1aXJlZFByb2plY3QoSVBhdGggcHJvamVjdFBhdGgsIElQYXRoIHJlcXVpcmVkUHJvamVjdFBhdGgsIGJvb2xlYW4gaXNFeHBvcnRlZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCWNoZWNrQXNzZXJ0aW9uKCJyZXF1aXJlZCBwcm9qZWN0IG11c3Qgbm90IGJlIGluIHByb2plY3QiLCAhcHJvamVjdFBhdGguaXNQcmVmaXhPZihyZXF1aXJlZFByb2plY3RQYXRoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRW50cnkocHJvamVjdFBhdGgsIEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShyZXF1aXJlZFByb2plY3RQYXRoLCBpc0V4cG9ydGVkKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRXh0ZXJuYWxKYXIoSVBhdGggcHJvamVjdFBhdGgsIFN0cmluZyBqYXIpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlhZGRFeHRlcm5hbEphcihwcm9qZWN0UGF0aCwgamFyLCBmYWxzZSk7Ci0JfQotCQotCS8qKiBBZGRzIGFuIGV4dGVybmFsIGphciB0byB0aGUgY2xhc3NwYXRoIG9mIGEgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFeHRlcm5hbEphcihJUGF0aCBwcm9qZWN0UGF0aCwgU3RyaW5nIGphciwgYm9vbGVhbiBpc0V4cG9ydGVkKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJY2hlY2tBc3NlcnRpb24oImZpbGUgbmFtZSBtdXN0IGVuZCB3aXRoIC56aXAgb3IgLmphciIsIGphci5lbmRzV2l0aCgiLnppcCIpIHx8IGphci5lbmRzV2l0aCgiLmphciIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJYWRkRW50cnkocHJvamVjdFBhdGgsIEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShuZXcgUGF0aChqYXIpLCBudWxsLCBudWxsLCBpc0V4cG9ydGVkKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRFbnRyeShJUGF0aCBwcm9qZWN0UGF0aCwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5UGF0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCA9IGdldENsYXNzcGF0aChwcm9qZWN0UGF0aCk7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0NsYXNwYXRoID0gbmV3IElDbGFzc3BhdGhFbnRyeVtjbGFzc3BhdGgubGVuZ3RoICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkoY2xhc3NwYXRoLCAwLCBuZXdDbGFzcGF0aCwgMCwgY2xhc3NwYXRoLmxlbmd0aCk7Ci0JCW5ld0NsYXNwYXRoW2NsYXNzcGF0aC5sZW5ndGhdID0gZW50cnlQYXRoOwotCQlzZXRDbGFzc3BhdGgocHJvamVjdFBhdGgsIG5ld0NsYXNwYXRoKTsKLQl9Ci0JCi0JLyoqIEFkZHMgYSBmaWxlLgotCSAqLwotCXB1YmxpYyBJUGF0aCBhZGRGaWxlKElQYXRoIHJvb3QsIFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGNvbnRlbnRzKXsKLQkJY2hlY2tBc3NlcnRpb24oImEgd29ya3NwYWNlIG11c3QgYmUgb3BlbiIsIGZJc09wZW4pOyAvLyROT04tTkxTLTEkCi0JCUlQYXRoIGZpbGVQYXRoID0gcm9vdC5hcHBlbmQoZmlsZU5hbWUpOwotCQl0cnkgewotCQkJY3JlYXRlRmlsZShmaWxlUGF0aCwgY29udGVudHMuZ2V0Qnl0ZXMoIlVURjgiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJY2hlY2tBc3NlcnRpb24oImUxIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGZpbGVQYXRoOwotCX0KLQkKLQkvKiogQWRkcyBhIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgSVBhdGggYWRkRm9sZGVyKElQYXRoIHJvb3QsIFN0cmluZyBmb2xkZXJOYW1lKXsKLQkJY2hlY2tBc3NlcnRpb24oImEgd29ya3NwYWNlIG11c3QgYmUgb3BlbiIsIGZJc09wZW4pOyAvLyROT04tTkxTLTEkCi0JCUlQYXRoIGZvbGRlclBhdGggPSByb290LmFwcGVuZChmb2xkZXJOYW1lKTsKLQkJY3JlYXRlRm9sZGVyKGZvbGRlclBhdGgpOwotCQlyZXR1cm4gZm9sZGVyUGF0aDsKLQl9Ci0KLQlwdWJsaWMgSVBhdGggYWRkSW50ZXJuYWxKYXIoSVBhdGggcHJvamVjdFBhdGgsIFN0cmluZyB6aXBOYW1lLCBieXRlW10gY29udGVudHMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlyZXR1cm4gYWRkSW50ZXJuYWxKYXIocHJvamVjdFBhdGgsIHppcE5hbWUsIGNvbnRlbnRzLCBmYWxzZSk7Ci0JfQotCi0JLyoqIEFkZHMgYSBqYXIgd2l0aCB0aGUgZ2l2ZW4gY29udGVudHMgdG8gdGhlIHRoZSB3b3Jrc3BhY2UuCi0JICogSWYgYSBqYXIgd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLCBpdCBpcwotCSAqIHJlcGxhY2VkLiAgQSB3b3Jrc3BhY2UgbXVzdCBiZSBvcGVuLCBhbmQgdGhlIGdpdmVuCi0JICogemlwIG5hbWUgbXVzdCBlbmQgd2l0aCAiLnppcCIgb3IgIi5qYXIiLiAgUmV0dXJucyB0aGUgcGF0aCBvZgotCSAqIHRoZSBhZGRlZCBqYXIuCi0JICovCi0JcHVibGljIElQYXRoIGFkZEludGVybmFsSmFyKElQYXRoIHByb2plY3RQYXRoLCBTdHJpbmcgemlwTmFtZSwgYnl0ZVtdIGNvbnRlbnRzLCBib29sZWFuIGlzRXhwb3J0ZWQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQljaGVja0Fzc2VydGlvbigiYSB3b3Jrc3BhY2UgbXVzdCBiZSBvcGVuIiwgZklzT3Blbik7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tBc3NlcnRpb24oInppcE5hbWUgbXVzdCBlbmQgd2l0aCAuemlwIG9yIC5qYXIiLCB6aXBOYW1lLmVuZHNXaXRoKCIuemlwIikgfHwgemlwTmFtZS5lbmRzV2l0aCgiLmphciIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJSVBhdGggcGF0aCA9IHByb2plY3RQYXRoLmFwcGVuZCh6aXBOYW1lKTsKLQkJCi0JCS8qIHJlbW92ZSBhbnkgZXhpc3RpbmcgemlwIGZyb20gdGhlIGphdmEgbW9kZWwgKi8KLQkJcmVtb3ZlSW50ZXJuYWxKYXIocHJvamVjdFBhdGgsIHppcE5hbWUpOwotCi0JCWNyZWF0ZUZpbGUocGF0aCwgY29udGVudHMpOwotCQlhZGRFbnRyeShwcm9qZWN0UGF0aCwgSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KHBhdGgsIG51bGwsIG51bGwsIGlzRXhwb3J0ZWQpKTsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQXNzZXJ0aW9uKFN0cmluZyBtZXNzYWdlLCBib29sZWFuIGIpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShiLCBtZXNzYWdlKTsKLQl9Ci0KLQkvKiogQ2xvc2VzIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFuZCBmcmVlcyB1cCBhbnkKLQkgKiByZXNvdXJjZXMuICBPbmNlIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGlzIGNsb3NlZCwKLQkgKiBpdCBzaG91bGRuJ3QgYmUgdXNlZCBhbnkgbW9yZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChmUHJvamVjdHMgIT0gbnVsbCkgewotCQkJCUVudW1lcmF0aW9uIHByb2plY3ROYW1lcyA9IGZQcm9qZWN0cy5rZXlzKCk7Ci0JCQkJd2hpbGUgKHByb2plY3ROYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCQlTdHJpbmcgcHJvamVjdE5hbWUgPSAoU3RyaW5nKSBwcm9qZWN0TmFtZXMubmV4dEVsZW1lbnQoKTsKLQkJCQkJZ2V0SmF2YVByb2plY3QocHJvamVjdE5hbWUpLmdldEphdmFNb2RlbCgpLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQkJY2xvc2VXb3Jrc3BhY2UoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQkvKiogQ2xvc2UgYSBwcm9qZWN0IGZyb20gdGhlIHdvcmtzcGFjZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZVByb2plY3QoSVBhdGggcHJvamVjdFBhdGgpewotCQljaGVja0Fzc2VydGlvbigiYSB3b3Jrc3BhY2UgbXVzdCBiZSBvcGVuIiwgZklzT3Blbik7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWdldEphdmFQcm9qZWN0KHByb2plY3RQYXRoKS5nZXRQcm9qZWN0KCkuY2xvc2UobnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY2xvc2VXb3Jrc3BhY2UoKSB7Ci0JCWZJc09wZW4gPSBmYWxzZTsKLQkJZldhc0J1aWx0ID0gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBJRmlsZSBjcmVhdGVGaWxlKElQYXRoIHBhdGgsIGJ5dGVbXSBjb250ZW50cykgewotCQl0cnkgewotCQkJSUZpbGUgZmlsZSA9IGZXb3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0KLQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbnRlbnRzKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJZmlsZS5zZXRDb250ZW50cyhpcywgdHJ1ZSwgZmFsc2UsIG51bGwpOwotCQkJfSBlbHNlIHsKLQkJCQlmaWxlLmNyZWF0ZShpcywgdHJ1ZSwgbnVsbCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmlsZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGUoZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJRm9sZGVyIGNyZWF0ZUZvbGRlcihJUGF0aCBwYXRoKSB7Ci0JCWNoZWNrQXNzZXJ0aW9uKCJyb290IiwgIXBhdGguaXNSb290KCkpOyAvLyROT04tTkxTLTEkCi0KLQkJLyogZG9uJ3QgY3JlYXRlIGZvbGRlcnMgZm9yIHByb2plY3RzICovCi0JCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpIDw9IDEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSUZvbGRlciBmb2xkZXIgPSBmV29ya3NwYWNlLmdldFJvb3QoKS5nZXRGb2xkZXIocGF0aCk7Ci0JCWlmICghZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkvKiBjcmVhdGUgdGhlIHBhcmVudCBmb2xkZXIgaWYgbmVjZXNzYXJ5ICovCi0JCQljcmVhdGVGb2xkZXIocGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkpOwotCi0JCQl0cnkgewotCQkJCWZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQloYW5kbGUoZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZvbGRlcjsKLQl9Ci0KLQlwcml2YXRlIElQcm9qZWN0IGNyZWF0ZVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQl0cnkgewotCQkJcHJvamVjdCA9IGZXb3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQkJcHJvamVjdC5jcmVhdGUobnVsbCwgbnVsbCk7Ci0JCQlwcm9qZWN0Lm9wZW4obnVsbCk7Ci0JCQlmUHJvamVjdHMucHV0KHByb2plY3ROYW1lLCBwcm9qZWN0KTsKLQkJCWFkZEJ1aWxkZXJTcGVjcyhwcm9qZWN0TmFtZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJaGFuZGxlKGUpOwotCQl9Ci0JCQotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQkvKiogQmF0Y2ggYnVpbGRzIHRoZSB3b3Jrc3BhY2UuICBBIHdvcmtzcGFjZSBtdXN0IGJlCi0JICogb3Blbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmdWxsQnVpbGQoKSB7Ci0JCWNoZWNrQXNzZXJ0aW9uKCJhIHdvcmtzcGFjZSBtdXN0IGJlIG9wZW4iLCBmSXNPcGVuKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJZ2V0V29ya3NwYWNlKCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxELCBudWxsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGUoZSk7Ci0JCX0KLQkJZldhc0J1aWx0ID0gdHJ1ZTsKLQl9Ci0KLQkvKiogQmF0Y2ggYnVpbGRzIGEgcHJvamVjdC4gIEEgd29ya3NwYWNlIG11c3QgYmUKLQkgKiBvcGVuLgotCSAqLwotCXB1YmxpYyB2b2lkIGZ1bGxCdWlsZChJUGF0aCBwcm9qZWN0UGF0aCkgewotCQljaGVja0Fzc2VydGlvbigiYSB3b3Jrc3BhY2UgbXVzdCBiZSBvcGVuIiwgZklzT3Blbik7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWdldFByb2plY3QocHJvamVjdFBhdGgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuRlVMTF9CVUlMRCwgbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJaGFuZGxlKGUpOwotCQl9Ci0JCWZXYXNCdWlsdCA9IHRydWU7Ci0JfQotCQotCS8qKgotCSogUmV0dXJucyB0aGUgY2xhc3MgcGF0aC4KLQkqLwotCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSBnZXRDbGFzc3BhdGgoSVBhdGggcHJvamVjdFBhdGgpIHsKLQkJdHJ5IHsKLQkJCWNoZWNrQXNzZXJ0aW9uKCJhIHdvcmtzcGFjZSBtdXN0IGJlIG9wZW4iLCBmSXNPcGVuKTsgLy8kTk9OLU5MUy0xJAotCQkJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSAoSmF2YVByb2plY3QpIEphdmFDb3JlLmNyZWF0ZShnZXRQcm9qZWN0KHByb2plY3RQYXRoKSk7Ci0JCQlyZXR1cm4gamF2YVByb2plY3QuZ2V0RXhwYW5kZWRDbGFzc3BhdGgodHJ1ZSk7Ci0vLwkJCUlQYXRoW10gcGFja2FnZUZyYWdtZW50Um9vdHNQYXRoID0gbmV3IElQYXRoW2VudHJpZXMubGVuZ3RoXTsKLS8vCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgKytpKQotLy8JCQkJcGFja2FnZUZyYWdtZW50Um9vdHNQYXRoW2ldID0gZW50cmllc1tpXS5nZXRQYXRoKCk7Ci0vLwkJCXJldHVybiBwYWNrYWdlRnJhZ21lbnRSb290c1BhdGg7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJY2hlY2tBc3NlcnRpb24oIkphdmFNb2RlbEV4Y2VwdGlvbiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7IC8vIG5vdCByZWFjaGFibGUKLQkJfQotCX0KLQkKLQkvKioKLQkqIFJldHVybnMgdGhlIEphdmEgTW9kZWwgZWxlbWVudCBmb3IgdGhlIHByb2plY3QuCi0JKi8KLQlwdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KElQYXRoIHByb2plY3RQYXRoKSB7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShnZXRQcm9qZWN0KHByb2plY3RQYXRoKSk7Ci0JCUFzc2VydC5pc05vdE51bGwoamF2YVByb2plY3QpOwotCQlyZXR1cm4gamF2YVByb2plY3Q7Ci0JfQotCQotCS8qKgotCSogUmV0dXJucyB0aGUgSmF2YSBNb2RlbCBlbGVtZW50IGZvciB0aGUgcHJvamVjdC4KLQkqLwotCXB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShnZXRQcm9qZWN0KHByb2plY3ROYW1lKSk7Ci0JCUFzc2VydC5pc05vdE51bGwoamF2YVByb2plY3QpOwotCQlyZXR1cm4gamF2YVByb2plY3Q7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBvdXRwdXQgbG9jYXRpb24gZm9yIGEgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0T3V0cHV0TG9jYXRpb24oSVBhdGggcHJvamVjdFBhdGgpewotCQl0cnkgewotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKGdldFByb2plY3QocHJvamVjdFBhdGgpKTsKLQkJCXJldHVybiBqYXZhUHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpOwotCQl9IGNhdGNoKENvcmVFeGNlcHRpb24gZSl7Ci0JCQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYWxsIHByb2JsZW1zIHdpdGggd29ya3NwYWNlLgotCSAqLwotCXB1YmxpYyBQcm9ibGVtW10gZ2V0UHJvYmxlbXMoKXsKLQkJcmV0dXJuIGdldFByb2JsZW1zRm9yKGdldFdvcmtzcGFjZVJvb3RQYXRoKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYWxsIHByb2JsZW1zIHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBQcm9ibGVtW10gZ2V0UHJvYmxlbXNGb3IoSVBhdGggcGF0aCl7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZTsKLQkJaWYocGF0aC5lcXVhbHMoZ2V0V29ya3NwYWNlUm9vdFBhdGgoKSkpewotCQkJcmVzb3VyY2UgPSBnZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCX0gZWxzZSB7Ci0JCQlJUHJvamVjdCBwID0gZ2V0UHJvamVjdChwYXRoKTsKLQkJCWlmKHAgIT0gbnVsbCAmJiBwYXRoLmVxdWFscyhwLmdldEZ1bGxQYXRoKCkpKSB7Ci0JCQkJcmVzb3VyY2UgPSBnZXRQcm9qZWN0KHBhdGgubGFzdFNlZ21lbnQoKSk7Ci0JCQl9IGVsc2UgaWYocGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCkgPT0gbnVsbCkgewotCQkJCXJlc291cmNlID0gZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcihwYXRoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzb3VyY2UgPSBnZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQkJCX0KLQkJfQotCQl0cnkgewotCQkJQXJyYXlMaXN0IHByb2JsZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhJSmF2YU1vZGVsTWFya2VyLkpBVkFfTU9ERUxfUFJPQkxFTV9NQVJLRVIsIHRydWUsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspCi0JCQkJcHJvYmxlbXMuYWRkKG5ldyBQcm9ibGVtKG1hcmtlcnNbaV0pKTsKLQotCQkJbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKElKYXZhTW9kZWxNYXJrZXIuQlVJTERQQVRIX1BST0JMRU1fTUFSS0VSLCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKQotCQkJCXByb2JsZW1zLmFkZChuZXcgUHJvYmxlbShtYXJrZXJzW2ldKSk7Ci0JCQkKLQkJCW1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhJSmF2YU1vZGVsTWFya2VyLlRBU0tfTUFSS0VSLCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKQotCQkJCXByb2JsZW1zLmFkZChuZXcgUHJvYmxlbShtYXJrZXJzW2ldKSk7Ci0KLQkJCVByb2JsZW1bXSByZXN1bHQgPSBuZXcgUHJvYmxlbVtwcm9ibGVtcy5zaXplKCldOwotCQkJcHJvYmxlbXMudG9BcnJheShyZXN1bHQpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfSBjYXRjaChDb3JlRXhjZXB0aW9uIGUpewotCQl9Ci0JCXJldHVybiBuZXcgUHJvYmxlbVswXTsKLQl9Ci0JCi0JLyoqIFJldHVybiB0aGUgcGF0aCBvZiB0aGUgcGFja2FnZQotCSAqIHdpdGggdGhlIGdpdmVuIG5hbWUuICBBIHdvcmtzcGFjZSBtdXN0IGJlIG9wZW4sIGFuZAotCSAqIHRoZSBwYWNrYWdlIG11c3QgZXhpc3QuCi0JICovCi0JcHVibGljIElQYXRoIGdldFBhY2thZ2VQYXRoKElQYXRoIHJvb3QsIFN0cmluZyBwYWNrYWdlTmFtZSkgewotCQljaGVja0Fzc2VydGlvbigiYSB3b3Jrc3BhY2UgbXVzdCBiZSBvcGVuIiwgZklzT3Blbik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHBhY2thZ2VOYW1lLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gcm9vdDsKLQkJZWxzZQotCQkJcmV0dXJuIHJvb3QuYXBwZW5kKHBhY2thZ2VOYW1lLnJlcGxhY2UoJy4nLCBJUGF0aC5TRVBBUkFUT1IpKTsKLQl9Ci0KLQkvKiogUmV0dXJuIHRoZSBwYXRoIG9mIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3QKLQkgKiB3aXRoIHRoZSBnaXZlbiBuYW1lLiAgQSB3b3Jrc3BhY2UgbXVzdCBiZSBvcGVuLCBhbmQKLQkgKiB0aGUgcGFja2FnZSBmcmFnbWVudCByb290IG11c3QgZXhpc3QuCi0JICovCi0JcHVibGljIElQYXRoIGdldFBhY2thZ2VGcmFnbWVudFJvb3RQYXRoKElQYXRoIHByb2plY3RQYXRoLCBTdHJpbmcgbmFtZSkgewotCQljaGVja0Fzc2VydGlvbigiYSB3b3Jrc3BhY2UgbXVzdCBiZSBvcGVuIiwgZklzT3Blbik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBwcm9qZWN0UGF0aDsKLQkJZWxzZQotCQkJcmV0dXJuIHByb2plY3RQYXRoLmFwcGVuZChuYW1lKTsKLQl9Ci0JCi0JLyoqCi0JKiBSZXR1cm5zIHRoZSBjb3JlIHByb2plY3QuCi0JKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQkJcmV0dXJuIChJUHJvamVjdClmUHJvamVjdHMuZ2V0KHByb2plY3ROYW1lKTsKLQl9Ci0JCi0JLyoqCi0JKiBSZXR1cm5zIHRoZSBjb3JlIHByb2plY3QuCi0JKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdChJUGF0aCBwcm9qZWN0UGF0aCkgewotCQlyZXR1cm4gKElQcm9qZWN0KWZQcm9qZWN0cy5nZXQocHJvamVjdFBhdGgubGFzdFNlZ21lbnQoKSk7Ci0JfQotCi0JLyoqCi0JKiBSZXR1cm5zIHRoZSB3b3Jrc3BhY2UuCi0JKi8KLQlwdWJsaWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBmV29ya3NwYWNlOwotCX0KLQkKLQkvKioKLQkqIFJldHVybnMgdGhlIHBhdGggb2Ygd29ya3NwYWNlIHJvb3QuCi0JKi8KLQlwdWJsaWMgSVBhdGggZ2V0V29ya3NwYWNlUm9vdFBhdGgoKXsKLQkJcmV0dXJuIGdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpOwotCX0KLQotCXByaXZhdGUgSVBhdGggZ2V0SmFyUm9vdFBhdGgoSVBhdGggcHJvamVjdFBhdGgpIHsKLQkJY2hlY2tBc3NlcnRpb24oImEgd29ya3NwYWNlIG11c3QgYmUgb3BlbiIsIGZJc09wZW4pOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBnZXRQcm9qZWN0KHByb2plY3RQYXRoKS5nZXRGdWxsUGF0aCgpOwotCX0KLQotCXZvaWQgaGFuZGxlKEV4Y2VwdGlvbiBlKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJaGFuZGxlQ29yZUV4Y2VwdGlvbigoQ29yZUV4Y2VwdGlvbikgZSk7Ci0JCX0gZWxzZSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkqIEhhbmRsZXMgYSBjb3JlIGV4Y2VwdGlvbiB0aHJvd24gZHVyaW5nIGEgdGVzdGluZyBlbnZpcm9ubWVudCBvcGVyYXRpb24KLQkqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVDb3JlRXhjZXB0aW9uKENvcmVFeGNlcHRpb24gZSkgewotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQlBc3NlcnQuaXNUcnVlKAotCQkJZmFsc2UsCi0JCQkiQ29yZSBleGNlcHRpb24gaW4gdGVzdGluZyBlbnZpcm9ubWVudDogIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKiBJbmNyZW1lbnRhbGx5IGJ1aWxkcyB0aGUgd29ya3NwYWNlLiAgQSB3b3Jrc3BhY2UgbXVzdCBiZQotCSAqIG9wZW4uCi0JICovCi0JcHVibGljIHZvaWQgaW5jcmVtZW50YWxCdWlsZCgpIHsKLQkJY2hlY2tBc3NlcnRpb24oImEgd29ya3NwYWNlIG11c3QgYmUgb3BlbiIsIGZJc09wZW4pOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrQXNzZXJ0aW9uKCJ0aGUgd29ya3NwYWNlIG11c3QgaGF2ZSBiZWVuIGJ1aWx0IiwgZldhc0J1aWx0KTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJZ2V0V29ya3NwYWNlKCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCwgbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJaGFuZGxlKGUpOwotCQl9Ci0JfQotCQotCS8qKiBJbmNyZW1lbnRhbGx5IGJ1aWxkcyBhIHByb2plY3QuICBBIHdvcmtzcGFjZSBtdXN0IGJlCi0JICogb3Blbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbmNyZW1lbnRhbEJ1aWxkKElQYXRoIHByb2plY3RQYXRoKSB7Ci0JCWNoZWNrQXNzZXJ0aW9uKCJhIHdvcmtzcGFjZSBtdXN0IGJlIG9wZW4iLCBmSXNPcGVuKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja0Fzc2VydGlvbigidGhlIHdvcmtzcGFjZSBtdXN0IGhhdmUgYmVlbiBidWlsdCIsIGZXYXNCdWlsdCk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWdldFByb2plY3QocHJvamVjdFBhdGgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQsIG51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZShlKTsKLQkJfQotCX0KLQotCS8qKiBPcGVuIGFuIGVtcHR5IHdvcmtzcGFjZS4KLSAJKi8KLQlwdWJsaWMgdm9pZCBvcGVuRW1wdHlXb3Jrc3BhY2UoKSB7Ci0JCWNsb3NlKCk7Ci0JCW9wZW5Xb3Jrc3BhY2UoKTsKLQkJZlByb2plY3RzID0gbmV3IEhhc2h0YWJsZSgxMCk7Ci0JCXNldHVwKCk7Ci0JfQotCQotCS8qKiBDbG9zZSBhIHByb2plY3QgZnJvbSB0aGUgd29ya3NwYWNlLgotCSAqLwotCXB1YmxpYyB2b2lkIG9wZW5Qcm9qZWN0KElQYXRoIHByb2plY3RQYXRoKXsKLQkJY2hlY2tBc3NlcnRpb24oImEgd29ya3NwYWNlIG11c3QgYmUgb3BlbiIsIGZJc09wZW4pOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlnZXRKYXZhUHJvamVjdChwcm9qZWN0UGF0aCkuZ2V0UHJvamVjdCgpLm9wZW4obnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuV29ya3NwYWNlKCkgewotCQl0cnkgewotCQkJY2xvc2VXb3Jrc3BhY2UoKTsKLQotCQkJZldvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQotCQkJLy8gdHVybiBvZmYgYXV0by1idWlsZCAtLSB0aGUgdGVzdHMgZGV0ZXJtaW5lIHdoZW4gYnVpbGRzIG9jY3VyCi0JCQlJV29ya3NwYWNlRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBmV29ya3NwYWNlLmdldERlc2NyaXB0aW9uKCk7Ci0JCQlkZXNjcmlwdGlvbi5zZXRBdXRvQnVpbGRpbmcoZmFsc2UpOwotCQkJZldvcmtzcGFjZS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGUoZSk7Ci0JCX0KLQl9Ci0KLQkvKiogUmVuYW1lcyBhIGNvbXBpbGF0aW9uIHVuaXQgaW50IHRoZSBnaXZlbiBwYWNrYWdlIGluIHRoZSB3b3Jrc3BhY2UuCi0JICogQSB3b3Jrc3BhY2UgbXVzdCBiZSBvcGVuLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbmFtZUNVKElQYXRoIHBhY2thZ2VQYXRoLCBTdHJpbmcgY3VOYW1lLCBTdHJpbmcgbmV3TmFtZSkgewotCQljaGVja0Fzc2VydGlvbigiYSB3b3Jrc3BhY2UgbXVzdCBiZSBvcGVuIiwgZklzT3Blbik7IC8vJE5PTi1OTFMtMSQKLQkJSUZvbGRlciBwYWNrYWdlRm9sZGVyID0gZldvcmtzcGFjZS5nZXRSb290KCkuZ2V0Rm9sZGVyKHBhY2thZ2VQYXRoKTsKLQkJdHJ5IHsKLQkJCXBhY2thZ2VGb2xkZXIuZ2V0RmlsZShjdU5hbWUpLm1vdmUocGFja2FnZUZvbGRlci5nZXRGaWxlKG5ld05hbWUpLmdldEZ1bGxQYXRoKCksIHRydWUsIG51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZShlKTsKLQkJfQotCX0KLQotCS8qKiBSZW1vdmVzIGEgYmluYXJ5IGNsYXNzIGZyb20gdGhlIGdpdmVuIHBhY2thZ2UgaW4KLQkgKiB0aGUgd29ya3NwYWNlLiAgQSB3b3Jrc3BhY2UgbXVzdCBiZSBvcGVuLCBhbmQgdGhlCi0JICogZ2l2ZW4gY2xhc3MgbmFtZSBtdXN0IG5vdCBlbmQgd2l0aCAiLmNsYXNzIi4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVCaW5hcnlDbGFzcyhJUGF0aCBwYWNrYWdlUGF0aCwgU3RyaW5nIGNsYXNzTmFtZSkgewotCQljaGVja0Fzc2VydGlvbigiYSB3b3Jrc3BhY2UgbXVzdCBiZSBvcGVuIiwgZklzT3Blbik7IC8vJE5PTi1OTFMtMSQKLQkJY2xhc3NOYW1lICs9ICIuY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JCUlGb2xkZXIgcGFja2FnZUZvbGRlciA9IGZXb3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZvbGRlcihwYWNrYWdlUGF0aCk7Ci0JCXRyeSB7Ci0JCQlwYWNrYWdlRm9sZGVyLmdldEZpbGUoY2xhc3NOYW1lKS5kZWxldGUodHJ1ZSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJaGFuZGxlKGUpOwotCQl9Ci0JfQotCi0JLyoqIFJlbW92ZXMgYSBjbGFzcyBmcm9tIHRoZSBnaXZlbiBwYWNrYWdlIGluIHRoZSB3b3Jrc3BhY2UuCi0JICogQSB3b3Jrc3BhY2UgbXVzdCBiZSBvcGVuLCBhbmQgdGhlIGdpdmVuIGNsYXNzIG5hbWUgbXVzdAotCSAqIG5vdCBlbmQgd2l0aCAiLmphdmEiLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNsYXNzKElQYXRoIHBhY2thZ2VQYXRoLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWNoZWNrQXNzZXJ0aW9uKCJhIHdvcmtzcGFjZSBtdXN0IGJlIG9wZW4iLCBmSXNPcGVuKTsgLy8kTk9OLU5MUy0xJAotCQljbGFzc05hbWUgKz0gIi5qYXZhIjsgLy8kTk9OLU5MUy0xJAotCQlJRm9sZGVyIHBhY2thZ2VGb2xkZXIgPSBmV29ya3NwYWNlLmdldFJvb3QoKS5nZXRGb2xkZXIocGFja2FnZVBhdGgpOwotCQl0cnkgewotCQkJcGFja2FnZUZvbGRlci5nZXRGaWxlKGNsYXNzTmFtZSkuZGVsZXRlKHRydWUsIG51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZShlKTsKLQkJfQotCX0KLQotCS8qKiBSZW1vdmVzIGEgcGFja2FnZSBmcm9tIHRoZSBnaXZlbiBwYWNrYWdlIGZyYWdtZW50IHJvb3QKLQkgKiBpbiB0aGUgd29ya3NwYWNlLiAgQSB3b3Jrc3BhY2UgbXVzdCBiZSBvcGVuLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVBhY2thZ2UoSVBhdGggcGFja2FnZUZyYWdtZW50Um9vdFBhdGgsIFN0cmluZyBwYWNrYWdlTmFtZSkgewotCQljaGVja0Fzc2VydGlvbigiYSB3b3Jrc3BhY2UgbXVzdCBiZSBvcGVuIiwgZklzT3Blbik7IC8vJE5PTi1OTFMtMSQKLQkJSVBhdGggcGF0aCA9Ci0JCQlwYWNrYWdlRnJhZ21lbnRSb290UGF0aC5hcHBlbmQocGFja2FnZU5hbWUucmVwbGFjZSgnLicsIElQYXRoLlNFUEFSQVRPUikpOwotCQlJRm9sZGVyIGZvbGRlciA9IGZXb3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZvbGRlcihwYXRoKTsKLQkJdHJ5IHsKLQkJCWZvbGRlci5kZWxldGUoZmFsc2UsIG51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZShlKTsKLQkJfQotCX0KLQotCS8qKiBSZW1vdmVzIHRoZSBnaXZlbiBwYWNrYWdlIGZyYWdtZW50IHJvb3QgZnJvbSB0aGUKLQkgKiB0aGUgd29ya3NwYWNlLiAgQSB3b3Jrc3BhY2UgbXVzdCBiZSBvcGVuLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVBhY2thZ2VGcmFnbWVudFJvb3QoSVBhdGggcHJvamVjdFBhdGgsIFN0cmluZyBwYWNrYWdlRnJhZ21lbnRSb290TmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCWNoZWNrQXNzZXJ0aW9uKCJhIHdvcmtzcGFjZSBtdXN0IGJlIG9wZW4iLCBmSXNPcGVuKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocGFja2FnZUZyYWdtZW50Um9vdE5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQlJRm9sZGVyIGZvbGRlciA9IGdldFByb2plY3QocHJvamVjdFBhdGgpLmdldEZvbGRlcihwYWNrYWdlRnJhZ21lbnRSb290TmFtZSk7Ci0JCQlpZiAoZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9sZGVyLmRlbGV0ZShmYWxzZSwgbnVsbCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWhhbmRsZShlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJSVBhdGggcm9vdFBhdGggPSBnZXRQYWNrYWdlRnJhZ21lbnRSb290UGF0aChwcm9qZWN0UGF0aCwgcGFja2FnZUZyYWdtZW50Um9vdE5hbWUpOwotCQlyZW1vdmVFbnRyeShwcm9qZWN0UGF0aCwgcm9vdFBhdGgpOwotCX0KLQkKLQkvKiogUmVtb3ZlIGEgcHJvamVjdCBmcm9tIHRoZSB3b3Jrc3BhY2UuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvamVjdChJUGF0aCBwcm9qZWN0UGF0aCl7Ci0JCWNoZWNrQXNzZXJ0aW9uKCJhIHdvcmtzcGFjZSBtdXN0IGJlIG9wZW4iLCBmSXNPcGVuKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJZ2V0SmF2YVByb2plY3QocHJvamVjdFBhdGgpLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KHByb2plY3RQYXRoKTsKLQkJdHJ5IHsKLQkJCXByb2plY3QuZGVsZXRlKHRydWUsIG51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZShlKTsKLQkJfQotCQkKLQl9Ci0JCi0JLyoqIFJlbW92ZSBhIHJlcXVpcmVkIHByb2plY3QgZnJvbSB0aGUgY2xhc3NwYXRoCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUmVxdWlyZWRQcm9qZWN0KElQYXRoIHByb2plY3RQYXRoLCBJUGF0aCByZXF1aXJlZFByb2plY3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlyZW1vdmVFbnRyeShwcm9qZWN0UGF0aCwgcmVxdWlyZWRQcm9qZWN0KTsKLQl9Ci0JCi0JLyoqIFJlbW92ZSBhbGwgZWxlbWVudHMgaW4gdGhlIHdvcmtzcGFjZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldFdvcmtzcGFjZSgpewotCQlpZiAoZlByb2plY3RzICE9IG51bGwpIHsKLQkJCUVudW1lcmF0aW9uIHByb2plY3ROYW1lcyA9IGZQcm9qZWN0cy5rZXlzKCk7Ci0JCQl3aGlsZSAocHJvamVjdE5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJU3RyaW5nIHByb2plY3ROYW1lID0gKFN0cmluZykgcHJvamVjdE5hbWVzLm5leHRFbGVtZW50KCk7Ci0JCQkJcmVtb3ZlUHJvamVjdChnZXRQcm9qZWN0KHByb2plY3ROYW1lKS5nZXRGdWxsUGF0aCgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKiBSZW1vdmVzIHRoZSBnaXZlbiBpbnRlcm5hbCBqYXIgZnJvbSB0aGUgd29ya3NwYWNlLgotCSAqIEEgd29ya3NwYWNlIG11c3QgYmUgb3Blbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVJbnRlcm5hbEphcihJUGF0aCBwcm9qZWN0UGF0aCwgU3RyaW5nIHppcE5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQljaGVja0Fzc2VydGlvbigiYSB3b3Jrc3BhY2UgbXVzdCBiZSBvcGVuIiwgZklzT3Blbik7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tBc3NlcnRpb24oInppcE5hbWUgbXVzdCBlbmQgd2l0aCAuemlwIG9yIC5qYXIiLCB6aXBOYW1lLmVuZHNXaXRoKCIuemlwIikgfHwgemlwTmFtZS5lbmRzV2l0aCgiLmphciIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCQkvKiByZW1vdmUgemlwIGZyb20gdGhlIGphdmEgbW9kZWwgKGl0IGNhY2hlcyBvcGVuIHppcCBmaWxlcykgKi8KLQkJSVBhdGggemlwUGF0aCA9IGdldEphclJvb3RQYXRoKHByb2plY3RQYXRoKS5hcHBlbmQoemlwTmFtZSk7Ci0JCXRyeSB7Ci0JCQlnZXRKYXZhUHJvamVjdChwcm9qZWN0UGF0aCkKLQkJCQkuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChnZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZSh6aXBQYXRoKSkKLQkJCQkuY2xvc2UoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmVtb3ZlUGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0UGF0aCwgemlwTmFtZSk7Ci0KLQkJSUZpbGUgZmlsZSA9IGdldFByb2plY3QocHJvamVjdFBhdGgpLmdldEZpbGUoemlwTmFtZSk7Ci0JCXRyeSB7Ci0JCQlmaWxlLmRlbGV0ZShmYWxzZSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJaGFuZGxlKGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSBhbiBleHRlcm5hbCBqYXIgZnJvbSB0aGUgY2xhc3NwYXRoLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUV4dGVybmFsSmFyKElQYXRoIHByb2plY3RQYXRoLCBJUGF0aCBqYXJQYXRoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJY2hlY2tBc3NlcnRpb24oImEgd29ya3NwYWNlIG11c3QgYmUgb3BlbiIsIGZJc09wZW4pOyAvLyROT04tTkxTLTEkCi0JCXJlbW92ZUVudHJ5KHByb2plY3RQYXRoLCBqYXJQYXRoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUVudHJ5KElQYXRoIHByb2plY3RQYXRoLCBJUGF0aCBlbnRyeVBhdGgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQljaGVja0Fzc2VydGlvbigiYSB3b3Jrc3BhY2UgbXVzdCBiZSBvcGVuIiwgZklzT3Blbik7IC8vJE5PTi1OTFMtMSQKLQkJSUNsYXNzcGF0aEVudHJ5W10gb2xkRW50cmllcyA9IGdldENsYXNzcGF0aChwcm9qZWN0UGF0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkRW50cmllcy5sZW5ndGg7ICsraSkgewotCQkJaWYgKG9sZEVudHJpZXNbaV0uZ2V0UGF0aCgpLmVxdWFscyhlbnRyeVBhdGgpKSB7Ci0JCQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3RW50cmllcyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbb2xkRW50cmllcy5sZW5ndGggLSAxXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KG9sZEVudHJpZXMsIDAsIG5ld0VudHJpZXMsIDAsIGkpOwotCQkJCVN5c3RlbS5hcnJheWNvcHkob2xkRW50cmllcywgaSArIDEsIG5ld0VudHJpZXMsIGksIG9sZEVudHJpZXMubGVuZ3RoIC0gaSAtIDEpOwotCQkJCXNldENsYXNzcGF0aChwcm9qZWN0UGF0aCwgbmV3RW50cmllcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiogUmVtb3ZlIGEgZmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUZpbGUoSVBhdGggZmlsZVBhdGgpIHsKLQkJY2hlY2tBc3NlcnRpb24oImEgd29ya3NwYWNlIG11c3QgYmUgb3BlbiIsIGZJc09wZW4pOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlmV29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlKGZpbGVQYXRoKS5kZWxldGUodHJ1ZSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJaGFuZGxlKGUpOwotCQl9Ci0JfQotCQotCS8qKiBSZW1vdmUgYSBmb2xkZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVGb2xkZXIoSVBhdGggZm9sZGVyUGF0aCkgewotCQljaGVja0Fzc2VydGlvbigiYSB3b3Jrc3BhY2UgbXVzdCBiZSBvcGVuIiwgZklzT3Blbik7IC8vJE5PTi1OTFMtMSQKLQkJSUZvbGRlciBmb2xkZXIgPSBmV29ya3NwYWNlLmdldFJvb3QoKS5nZXRGb2xkZXIoZm9sZGVyUGF0aCk7Ci0JCXRyeSB7Ci0JCQlmb2xkZXIuZGVsZXRlKHRydWUsIG51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZShlKTsKLQkJfQotCX0KLQkKLQkvKiogU2V0cyB0aGUgY2xhc3NwYXRoIHRvIHRoZSBnaXZlbiBwYWNrYWdlIGZyYWdtZW50Ci0JICogcm9vdHMuICBUaGUgYnVpbGRlciBzZWFyY2hlcyB0aGUgY2xhc3NwYXRoIHRvCi0JICogZmluZCB0aGUgamF2YSBmaWxlcyBpdCBuZWVkcyBkdXJpbmcgYSBidWlsZC4KLQkgKi8KLS8vCXB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChJUGF0aCBwcm9qZWN0UGF0aCwgSVBhdGhbXSBwYWNrYWdlRnJhZ21lbnRSb290c1BhdGgpIHsKLS8vCQl0cnkgewotLy8JCQljaGVja0Fzc2VydGlvbigiYSB3b3Jrc3BhY2UgbXVzdCBiZSBvcGVuIiwgZklzT3Blbik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKGdldFByb2plY3QocHJvamVjdFBhdGgpKTsKLS8vCQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9Ci0vLwkJCQluZXcgSUNsYXNzcGF0aEVudHJ5W3BhY2thZ2VGcmFnbWVudFJvb3RzUGF0aC5sZW5ndGhdOwotLy8JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhY2thZ2VGcmFnbWVudFJvb3RzUGF0aC5sZW5ndGg7ICsraSkgewotLy8JCQkJSVBhdGggcGF0aCA9IHBhY2thZ2VGcmFnbWVudFJvb3RzUGF0aFtpXTsKLS8vCQkJCWlmICgiamFyIi5lcXVhbHMocGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCkpIC8vJE5PTi1OTFMtMSQKLS8vCQkJCQl8fCAiemlwIi5lcXVhbHMocGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCkpKSB7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCQllbnRyaWVzW2ldID0gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KHBhdGgsIG51bGwsIG51bGwsIGlzRXhwb3J0ZWQpOwotLy8JCQkJfSBlbHNlIGlmIChwcm9qZWN0UGF0aC5pc1ByZWZpeE9mKHBhY2thZ2VGcmFnbWVudFJvb3RzUGF0aFtpXSkpIHsKLS8vCQkJCQllbnRyaWVzW2ldID0gSmF2YUNvcmUubmV3U291cmNlRW50cnkocGF0aCwgSVBhdGhbXSBleGNsdXNpb25QYXR0ZXJucywgSVBhdGggc3BlY2lmaWNPdXRwdXRMb2NhdGlvbikKLS8vCQkJCX0gZWxzZSB7Ci0vLwkJCQkJZW50cmllc1tpXSA9IEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShwYXRoLCBpc0V4cG9ydGVkKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgoZW50cmllcywgbnVsbCk7Ci0vLwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLS8vCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLS8vCQkJY2hlY2tBc3NlcnRpb24oIkphdmFNb2RlbEV4Y2VwdGlvbiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotLy8JCX0KLS8vCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRCdWlsZE9yZGVyKFN0cmluZ1tdIHByb2plY3RzKSB7Ci0JCXRyeSB7Ci0JCQlJV29ya3NwYWNlIHcgPSBnZXRXb3Jrc3BhY2UoKTsKLQkJCUlXb3Jrc3BhY2VEZXNjcmlwdGlvbiBkID0gdy5nZXREZXNjcmlwdGlvbigpOwotCQkJZC5zZXRCdWlsZE9yZGVyKHByb2plY3RzKTsKLQkJCXcuc2V0RGVzY3JpcHRpb24oZCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCWNoZWNrQXNzZXJ0aW9uKCJDb3JlRXhjZXB0aW9uIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGgoSVBhdGggcHJvamVjdFBhdGgsIElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQljaGVja0Fzc2VydGlvbigiYSB3b3Jrc3BhY2UgbXVzdCBiZSBvcGVuIiwgZklzT3Blbik7IC8vJE5PTi1OTFMtMSQKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKGdldFByb2plY3QocHJvamVjdFBhdGgpKTsKLQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKGVudHJpZXMsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgSVBhdGggc2V0RXh0ZXJuYWxPdXRwdXRGb2xkZXIoSVBhdGggcHJvamVjdFBhdGgsIFN0cmluZyBuYW1lLCBJUGF0aCBleHRlcm5hbE91dHB1dExvY2F0aW9uKXsKLQkJSVBhdGggcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNoZWNrQXNzZXJ0aW9uKCJhIHdvcmtzcGFjZSBtdXN0IGJlIG9wZW4iLCBmSXNPcGVuKTsgLy8kTk9OLU5MUy0xJAotCQkJSVByb2plY3QgcCA9IGdldFByb2plY3QocHJvamVjdFBhdGgpOwotCQkJSUZvbGRlciBmID0gcC5nZXRGb2xkZXIobmFtZSk7Ci0JCQlmLmNyZWF0ZUxpbmsoZXh0ZXJuYWxPdXRwdXRMb2NhdGlvbiwgSUZvbGRlci5BTExPV19NSVNTSU5HX0xPQ0FMLCBudWxsKTsKLQotCQkJcmVzdWx0ID0gZi5nZXRGdWxsUGF0aCgpOwotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHApOwotCQkJamF2YVByb2plY3Quc2V0T3V0cHV0TG9jYXRpb24ocmVzdWx0LCBudWxsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJY2hlY2tBc3NlcnRpb24oIkNvcmVFeGNlcHRpb24iLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgSVBhdGggc2V0T3V0cHV0Rm9sZGVyKElQYXRoIHByb2plY3RQYXRoLCBTdHJpbmcgb3V0cHV0Rm9sZGVyKXsKLQkJSVBhdGggb3V0cHV0UGF0aCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljaGVja0Fzc2VydGlvbigiYSB3b3Jrc3BhY2UgbXVzdCBiZSBvcGVuIiwgZklzT3Blbik7IC8vJE5PTi1OTFMtMSQKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShnZXRQcm9qZWN0KHByb2plY3RQYXRoKSk7Ci0JCQlvdXRwdXRQYXRoID0gcHJvamVjdFBhdGguYXBwZW5kKG91dHB1dEZvbGRlcik7Ci0JCQlqYXZhUHJvamVjdC5zZXRPdXRwdXRMb2NhdGlvbihvdXRwdXRQYXRoLCBudWxsKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQljaGVja0Fzc2VydGlvbigiSmF2YU1vZGVsRXhjZXB0aW9uIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG91dHB1dFBhdGg7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldHVwKCkgewotCQlmSXNPcGVuID0gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9idWlsZGVyL1Rlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9idWlsZGVyL1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MmRlMTkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvYnVpbGRlci9UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuanVuaXQuZXh0ZW5zaW9uLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLnV0aWwuVGVzdFZlcmlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLnV0aWwuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBKYXZhIGltYWdlIGJ1aWxkZXIgdGVzdHMKLSAqLwotcHVibGljIGNsYXNzIFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCXByb3RlY3RlZCBzdGF0aWMgVGVzdGluZ0Vudmlyb25tZW50IGVudiA9IG51bGw7Ci0JcHJvdGVjdGVkIEVmZmljaWVuY3lDb21waWxlclJlcXVlc3RvciBkZWJ1Z1JlcXVlc3RvciA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBFWENMVURFRF9URVNUUyA9IHsKLQl9OwotCi0JcHVibGljIFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKiBFeGVjdXRlIHRoZSBnaXZlbiBjbGFzcy4gRXhwZWN0aW5nIG91dHB1dCBhbmQgZXJyb3IgbXVzdCBiZSBzcGVjaWZpZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZUNsYXNzKAotCQlJUGF0aCBwcm9qZWN0UGF0aCwKLQkJU3RyaW5nIGNsYXNzTmFtZSwKLQkJU3RyaW5nIGV4cGVjdGluZ091dHB1dCwKLQkJU3RyaW5nIGV4cGVjdGVkRXJyb3IpIHsKLQkJVGVzdFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFRlc3RWZXJpZmllcihmYWxzZSk7Ci0JCVZlY3RvciBjbGFzc3BhdGggPSBuZXcgVmVjdG9yKDUpOwotCi0JCUlQYXRoIHdvcmtzcGFjZVBhdGggPSBlbnYuZ2V0V29ya3NwYWNlUm9vdFBhdGgoKTsKLQotCQljbGFzc3BhdGguYWRkRWxlbWVudCh3b3Jrc3BhY2VQYXRoLmFwcGVuZChlbnYuZ2V0T3V0cHV0TG9jYXRpb24ocHJvamVjdFBhdGgpKS50b09TU3RyaW5nKCkpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBjcCA9IGVudi5nZXRDbGFzc3BhdGgocHJvamVjdFBhdGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNwLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUGF0aCBjID0gY3BbaV0uZ2V0UGF0aCgpOwotCQkJU3RyaW5nIGV4dCA9IGMuZ2V0RmlsZUV4dGVuc2lvbigpOwotCQkJaWYgKGV4dCAhPSBudWxsICYmIChleHQuZXF1YWxzKCJ6aXAiKSB8fCBleHQuZXF1YWxzKCJqYXIiKSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJaWYgKGMuZ2V0RGV2aWNlKCkgPT0gbnVsbCkgewotCQkJCQljbGFzc3BhdGguYWRkRWxlbWVudCh3b3Jrc3BhY2VQYXRoLmFwcGVuZChjKS50b09TU3RyaW5nKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNsYXNzcGF0aC5hZGRFbGVtZW50KGMudG9PU1N0cmluZygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQl2ZXJpZmllci5leGVjdXRlKGNsYXNzTmFtZSwgKFN0cmluZ1tdKSBjbGFzc3BhdGgudG9BcnJheShuZXcgU3RyaW5nWzBdKSk7Ci0KLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVSUk9SU1xuIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihVdGlsLmRpc3BsYXlTdHJpbmcodmVyaWZpZXIuZ2V0RXhlY3V0aW9uRXJyb3IoKSkpOwotCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9VVFBVVFxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihVdGlsLmRpc3BsYXlTdHJpbmcodmVyaWZpZXIuZ2V0RXhlY3V0aW9uT3V0cHV0KCkpKTsKLQkJfQotCQlTdHJpbmcgYWN0dWFsRXJyb3IgPSB2ZXJpZmllci5nZXRFeGVjdXRpb25FcnJvcigpOwotCi0JCS8vIHdvcmthcm91bmQgcGIgb24gMS4zLjEgVk0gKGxpbmUgZGVsaW1pdG9yIGlzIG5vdCB0aGUgcGxhdGZvcm0gbGluZSBkZWxpbWl0b3IpCi0JCWNoYXJbXSBlcnJvciA9IGFjdHVhbEVycm9yLnRvQ2hhckFycmF5KCk7Ci0JCWFjdHVhbEVycm9yID0gbmV3IFN0cmluZyhDaGFyT3BlcmF0aW9uLnJlcGxhY2UoZXJyb3IsIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKS50b0NoYXJBcnJheSgpLCBuZXcgY2hhcltdIHsgJ1xuJyB9KSk7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoYWN0dWFsRXJyb3IuaW5kZXhPZihleHBlY3RlZEVycm9yKSA9PSAtMSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFUlJPUlNcbiIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oVXRpbC5kaXNwbGF5U3RyaW5nKGFjdHVhbEVycm9yKSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBlcnJvciA6ICIgKyBhY3R1YWxFcnJvciArICIgZXhwZWN0ZWQgOiAiICsgZXhwZWN0ZWRFcnJvciwgYWN0dWFsRXJyb3IuaW5kZXhPZihleHBlY3RlZEVycm9yKSAhPSAtMSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCVN0cmluZyBhY3R1YWxPdXRwdXQgPSB2ZXJpZmllci5nZXRFeGVjdXRpb25PdXRwdXQoKTsKLQkJaWYgKGFjdHVhbE91dHB1dC5pbmRleE9mKGV4cGVjdGluZ091dHB1dCkgPT0gLTEpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT1VUUFVUXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKFV0aWwuZGlzcGxheVN0cmluZyhhY3R1YWxPdXRwdXQpKTsKLQkJfQotCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIG91dHB1dCIsIGFjdHVhbE91dHB1dC5pbmRleE9mKGV4cGVjdGluZ091dHB1dCkgIT0gLTEpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQkvKiogVmVyaWZpZXMgdGhhdCBnaXZlbiBlbGVtZW50IGlzIG5vdCBwcmVzZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGV4cGVjdGluZ1ByZXNlbmNlT2YoSVBhdGggcGF0aCkgewotCQlleHBlY3RpbmdQcmVzZW5jZU9mKG5ldyBJUGF0aFtdIHsgcGF0aCB9KTsKLQl9Ci0KLQkvKiogVmVyaWZpZXMgdGhhdCBnaXZlbiBlbGVtZW50cyBhcmUgbm90IHByZXNlbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZXhwZWN0aW5nUHJlc2VuY2VPZihJUGF0aFtdIHBhdGhzKSB7Ci0JCUlQYXRoIHdSb290ID0gZW52LmdldFdvcmtzcGFjZVJvb3RQYXRoKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykKLQkJCWFzc2VydFRydWUocGF0aHNbaV0gKyAiIGlzIG5vdCBwcmVzZW50Iiwgd1Jvb3QuYXBwZW5kKHBhdGhzW2ldKS50b0ZpbGUoKS5leGlzdHMoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKiogVmVyaWZpZXMgdGhhdCBnaXZlbiBlbGVtZW50IGlzIG5vdCBwcmVzZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGV4cGVjdGluZ05vUHJlc2VuY2VPZihJUGF0aCBwYXRoKSB7Ci0JCWV4cGVjdGluZ05vUHJlc2VuY2VPZihuZXcgSVBhdGhbXSB7IHBhdGggfSk7Ci0JfQotCi0JLyoqIFZlcmlmaWVzIHRoYXQgZ2l2ZW4gZWxlbWVudHMgYXJlIG5vdCBwcmVzZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGV4cGVjdGluZ05vUHJlc2VuY2VPZihJUGF0aFtdIHBhdGhzKSB7Ci0JCUlQYXRoIHdSb290ID0gZW52LmdldFdvcmtzcGFjZVJvb3RQYXRoKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykKLQkJCWFzc2VydFRydWUocGF0aHNbaV0gKyAiIGlzIHByZXNlbnQiLCAhd1Jvb3QuYXBwZW5kKHBhdGhzW2ldKS50b0ZpbGUoKS5leGlzdHMoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKiogVmVyaWZpZXMgdGhhdCBnaXZlbiBjbGFzc2VzIGhhdmUgYmVlbiBjb21waWxlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBleHBlY3RpbmdDb21waWxlZENsYXNzZXMoU3RyaW5nW10gZXhwZWN0ZWQpIHsKLQkJU3RyaW5nW10gYWN0dWFsID0gZGVidWdSZXF1ZXN0b3IuZ2V0Q29tcGlsZWRDbGFzc2VzKCk7Ci0JCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlV0aWwuc29ydChhY3R1YWwpOwotCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5VdGlsLnNvcnQoZXhwZWN0ZWQpOwotCQlleHBlY3RpbmdDb21waWxpbmcoYWN0dWFsLCBleHBlY3RlZCwgInVuZXhwZWN0ZWQgcmVjb21waWxlZCB1bml0cyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqIFZlcmlmaWVzIHRoYXQgZ2l2ZW4gY2xhc3NlcyBoYXZlIGJlZW4gY29tcGlsZWQgaW4gdGhlIHNwZWNpZmllZCBvcmRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBleHBlY3RpbmdDb21waWxpbmdPcmRlcihTdHJpbmdbXSBleHBlY3RlZCkgewotCQlleHBlY3RpbmdDb21waWxpbmcoZGVidWdSZXF1ZXN0b3IuZ2V0Q29tcGlsZWRDbGFzc2VzKCksIGV4cGVjdGVkLCAidW5leHBlY3RlZCBjb21waWxpbmcgb3JkZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBleHBlY3RpbmdDb21waWxpbmcoU3RyaW5nW10gYWN0dWFsLCBTdHJpbmdbXSBleHBlY3RlZCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKERFQlVHKQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY3R1YWwubGVuZ3RoOyBpKyspCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKGFjdHVhbFtpXSk7Ci0KLQkJU3RyaW5nQnVmZmVyIGFjdHVhbEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoInsiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IGFjdHVhbC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgPiAwKQotCQkJCWFjdHVhbEJ1ZmZlci5hcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJYWN0dWFsQnVmZmVyLmFwcGVuZChhY3R1YWxbaV0pOwotCQl9Ci0JCWFjdHVhbEJ1ZmZlci5hcHBlbmQoJ30nKTsKLQkJU3RyaW5nQnVmZmVyIGV4cGVjdGVkQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigieyIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpID4gMCkKLQkJCQlleHBlY3RlZEJ1ZmZlci5hcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJZXhwZWN0ZWRCdWZmZXIuYXBwZW5kKGV4cGVjdGVkW2ldKTsKLQkJfQotCQlleHBlY3RlZEJ1ZmZlci5hcHBlbmQoJ30nKTsKLQkJYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkQnVmZmVyLnRvU3RyaW5nKCksIGFjdHVhbEJ1ZmZlci50b1N0cmluZygpKTsKLQl9Ci0KLQkvKiogVmVyaWZpZXMgdGhhdCB0aGUgd29ya3NwYWNlIGhhcyBubyBwcm9ibGVtcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBleHBlY3RpbmdOb1Byb2JsZW1zKCkgewotCQlleHBlY3RpbmdOb1Byb2JsZW1zRm9yKGVudi5nZXRXb3Jrc3BhY2VSb290UGF0aCgpKTsKLQl9Ci0KLQkvKiogVmVyaWZpZXMgdGhhdCB0aGUgZ2l2ZW4gZWxlbWVudCBoYXMgbm8gcHJvYmxlbXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZXhwZWN0aW5nTm9Qcm9ibGVtc0ZvcihJUGF0aCByb290KSB7Ci0JCWV4cGVjdGluZ05vUHJvYmxlbXNGb3IobmV3IElQYXRoW10geyByb290IH0pOwotCX0KLQotCS8qKiBWZXJpZmllcyB0aGF0IHRoZSBnaXZlbiBlbGVtZW50cyBoYXZlIG5vIHByb2JsZW1zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGV4cGVjdGluZ05vUHJvYmxlbXNGb3IoSVBhdGhbXSByb290cykgewotCQlpZiAoREVCVUcpCi0JCQlwcmludFByb2JsZW1zRm9yKHJvb3RzKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlQcm9ibGVtW10gcHJvYmxlbXMgPSBlbnYuZ2V0UHJvYmxlbXNGb3Iocm9vdHNbaV0pOwotCQkJaWYgKHByb2JsZW1zLmxlbmd0aCAhPSAwKQotCQkJCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgcHJvYmxlbShzKSA6ICIgKyBwcm9ibGVtc1swXSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKiogVmVyaWZpZXMgdGhhdCB0aGUgZ2l2ZW4gZWxlbWVudCBoYXMgcHJvYmxlbXMgYW5kCi0JICogb25seSB0aGUgZ2l2ZW4gZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBleHBlY3RpbmdPbmx5UHJvYmxlbXNGb3IoSVBhdGggZXhwZWN0ZWQpIHsKLQkJZXhwZWN0aW5nT25seVByb2JsZW1zRm9yKG5ldyBJUGF0aFtdIHsgZXhwZWN0ZWQgfSk7Ci0JfQotCi0JLyoqIFZlcmlmaWVzIHRoYXQgdGhlIGdpdmVuIGVsZW1lbnRzIGhhdmUgcHJvYmxlbXMgYW5kCi0JICogb25seSB0aGUgZ2l2ZW4gZWxlbWVudHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZXhwZWN0aW5nT25seVByb2JsZW1zRm9yKElQYXRoW10gZXhwZWN0ZWQpIHsKLQkJaWYgKERFQlVHKQotCQkJcHJpbnRQcm9ibGVtcygpOwotCi0JCVByb2JsZW1bXSByb290UHJvYmxlbXMgPSBlbnYuZ2V0UHJvYmxlbXMoKTsKLQkJSGFzaHRhYmxlIGFjdHVhbCA9IG5ldyBIYXNodGFibGUocm9vdFByb2JsZW1zLmxlbmd0aCAqIDIgKyAxKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb290UHJvYmxlbXMubGVuZ3RoOyBpKyspIHsKLQkJCUlQYXRoIGN1bHByaXQgPSByb290UHJvYmxlbXNbaV0uZ2V0UmVzb3VyY2VQYXRoKCk7Ci0JCQlhY3R1YWwucHV0KGN1bHByaXQsIGN1bHByaXQpOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykKLQkJCWlmICghYWN0dWFsLmNvbnRhaW5zS2V5KGV4cGVjdGVkW2ldKSkKLQkJCQlhc3NlcnRUcnVlKCJtaXNzaW5nIGV4cGVjdGVkIHByb2JsZW0gd2l0aCAiICsgZXhwZWN0ZWRbaV0udG9TdHJpbmcoKSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGFjdHVhbC5zaXplKCkgPiBleHBlY3RlZC5sZW5ndGgpIHsKLQkJCWZvciAoRW51bWVyYXRpb24gZSA9IGFjdHVhbC5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJCUlQYXRoIHBhdGggPSAoSVBhdGgpIGUubmV4dEVsZW1lbnQoKTsKLQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7ICsraSkgewotCQkJCQlpZiAocGF0aC5lcXVhbHMoZXhwZWN0ZWRbaV0pKSB7Ci0JCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIWZvdW5kKQotCQkJCQlhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIHByb2JsZW0ocykgd2l0aCAiICsgcGF0aC50b1N0cmluZygpLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qKiBWZXJpZmllcyB0aGF0IHRoZSBnaXZlbiBlbGVtZW50IGhhcyBhIHNwZWNpZmljIHByb2JsZW0gYW5kCi0JICogb25seSB0aGUgZ2l2ZW4gcHJvYmxlbS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBleHBlY3RpbmdPbmx5U3BlY2lmaWNQcm9ibGVtRm9yKElQYXRoIHJvb3QsIFByb2JsZW0gcHJvYmxlbSkgewotCQlleHBlY3RpbmdPbmx5U3BlY2lmaWNQcm9ibGVtc0Zvcihyb290LCBuZXcgUHJvYmxlbVtdIHsgcHJvYmxlbSB9KTsKLQl9Ci0KLQkvKiogVmVyaWZpZXMgdGhhdCB0aGUgZ2l2ZW4gZWxlbWVudCBoYXMgc3BlY2lmaWNzIHByb2JsZW1zIGFuZAotCSAqIG9ubHkgdGhlIGdpdmVuIHByb2JsZW1zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGV4cGVjdGluZ09ubHlTcGVjaWZpY1Byb2JsZW1zRm9yKElQYXRoIHJvb3QsIFByb2JsZW1bXSBleHBlY3RlZFByb2JsZW1zKSB7Ci0JCWlmIChERUJVRykKLQkJCXByaW50UHJvYmxlbXNGb3Iocm9vdCk7Ci0KLQkJUHJvYmxlbVtdIHJvb3RQcm9ibGVtcyA9IGVudi5nZXRQcm9ibGVtc0Zvcihyb290KTsKLQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZFByb2JsZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlQcm9ibGVtIGV4cGVjdGVkUHJvYmxlbSA9IGV4cGVjdGVkUHJvYmxlbXNbaV07Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHJvb3RQcm9ibGVtcy5sZW5ndGg7IGorKykgewotCQkJCWlmKGV4cGVjdGVkUHJvYmxlbS5lcXVhbHMocm9vdFByb2JsZW1zW2pdKSkgewotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCXJvb3RQcm9ibGVtc1tqXSA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFmb3VuZCkgewotCQkJCXByaW50UHJvYmxlbXNGb3Iocm9vdCk7Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKCJwcm9ibGVtIG5vdCBmb3VuZDogIiArIGV4cGVjdGVkUHJvYmxlbS50b1N0cmluZygpLCBmb3VuZCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJvb3RQcm9ibGVtcy5sZW5ndGg7IGkrKykgewotCQkJaWYocm9vdFByb2JsZW1zW2ldICE9IG51bGwpIHsKLQkJCQlwcmludFByb2JsZW1zRm9yKHJvb3QpOwotCQkJCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgcHJvYmxlbTogIiArIHJvb3RQcm9ibGVtc1tpXS50b1N0cmluZygpLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qKiBWZXJpZmllcyB0aGF0IHRoZSBnaXZlbiBlbGVtZW50IGhhcyBwcm9ibGVtcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBleHBlY3RpbmdQcm9ibGVtc0ZvcihJUGF0aCBleHBlY3RlZCkgewotCQlleHBlY3RpbmdQcm9ibGVtc0ZvcihuZXcgSVBhdGhbXSB7IGV4cGVjdGVkIH0pOwotCX0KLQotCS8qKiBWZXJpZmllcyB0aGF0IHRoZSBnaXZlbiBlbGVtZW50cyBoYXZlIHByb2JsZW1zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGV4cGVjdGluZ1Byb2JsZW1zRm9yKElQYXRoW10gZXhwZWN0ZWQpIHsKLQkJaWYgKERFQlVHKQotCQkJcHJpbnRQcm9ibGVtc0ZvcihleHBlY3RlZCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykgewotCQkJLyogZ2V0IHRoZSBsZWFmIHByb2JsZW1zIGZvciB0aGlzIHR5cGUgKi8KLQkJCVByb2JsZW1bXSBwcm9ibGVtcyA9IGVudi5nZXRQcm9ibGVtc0ZvcihleHBlY3RlZFtpXSk7Ci0JCQlhc3NlcnRUcnVlKCJtaXNzaW5nIGV4cGVjdGVkIHByb2JsZW0gd2l0aCAiICsgZXhwZWN0ZWRbaV0udG9TdHJpbmcoKSwgcHJvYmxlbXMubGVuZ3RoID4gMCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKiBWZXJpZmllcyB0aGF0IHRoZSBnaXZlbiBlbGVtZW50IGhhcyBhIHNwZWNpZmljIHByb2JsZW0uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZXhwZWN0aW5nU3BlY2lmaWNQcm9ibGVtRm9yKElQYXRoIHJvb3QsIFByb2JsZW0gcHJvYmxlbSkgewotCQlleHBlY3RpbmdTcGVjaWZpY1Byb2JsZW1zRm9yKHJvb3QsIG5ldyBQcm9ibGVtW10geyBwcm9ibGVtIH0pOwotCX0KLQotCS8qKiBWZXJpZmllcyB0aGF0IHRoZSBnaXZlbiBlbGVtZW50IGhhcyBzcGVjaWZpYyBwcm9ibGVtcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBleHBlY3RpbmdTcGVjaWZpY1Byb2JsZW1zRm9yKElQYXRoIHJvb3QsIFByb2JsZW1bXSBwcm9ibGVtcykgewotCQlpZiAoREVCVUcpCi0JCQlwcmludFByb2JsZW1zRm9yKHJvb3QpOwotCi0JCVByb2JsZW1bXSByb290UHJvYmxlbXMgPSBlbnYuZ2V0UHJvYmxlbXNGb3Iocm9vdCk7Ci0JCW5leHQgOiBmb3IgKGludCBpID0gMDsgaSA8IHByb2JsZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlQcm9ibGVtIHByb2JsZW0gPSBwcm9ibGVtc1tpXTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgcm9vdFByb2JsZW1zLmxlbmd0aDsgaisrKSB7Ci0JCQkJUHJvYmxlbSByb290UHJvYmxlbSA9IHJvb3RQcm9ibGVtc1tqXTsKLQkJCQlpZiAocm9vdFByb2JsZW0gIT0gbnVsbCkgewotCQkJCQlpZiAocHJvYmxlbS5lcXVhbHMocm9vdFByb2JsZW0pKSB7Ci0JCQkJCQlyb290UHJvYmxlbXNbal0gPSBudWxsOwotCQkJCQkJY29udGludWUgbmV4dDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZvciAoaW50IGogPSAwOyBqIDwgcm9vdFByb2JsZW1zLmxlbmd0aDsgaisrKSB7Ci0JCQkJUHJvYmxlbSBwYiA9IHJvb3RQcm9ibGVtc1tqXTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImdvdCBwYjoJCW5ldyBQcm9ibGVtKFwiIiArIHBiLmdldExvY2F0aW9uKCkgKyAiXCIsIFwiIiArIHBiLmdldE1lc3NhZ2UoKSArICJcIiwgXCIiICsgcGIuZ2V0UmVzb3VyY2VQYXRoKCkgKyAiXCIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCX0KLQkJCWFzc2VydFRydWUoIm1pc3NpbmcgZXhwZWN0ZWQgcHJvYmxlbSA6ICIgKyBwcm9ibGVtLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKiBCYXRjaCBidWlsZHMgdGhlIHdvcmtzcGFjZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmdWxsQnVpbGQoKSB7Ci0JCWRlYnVnUmVxdWVzdG9yLmNsZWFyUmVzdWx0KCk7Ci0JCWRlYnVnUmVxdWVzdG9yLmFjdGl2YXRlKCk7Ci0JCWVudi5mdWxsQnVpbGQoKTsKLQkJZGVidWdSZXF1ZXN0b3IuZGVhY3RpdmF0ZSgpOwotCX0KLQotCS8qKiBCYXRjaCBidWlsZHMgdGhlIGdpdmVuIHByb2plY3QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZnVsbEJ1aWxkKElQYXRoIHByb2plY3RQYXRoKSB7Ci0JCWRlYnVnUmVxdWVzdG9yLmNsZWFyUmVzdWx0KCk7Ci0JCWRlYnVnUmVxdWVzdG9yLmFjdGl2YXRlKCk7Ci0JCWVudi5mdWxsQnVpbGQocHJvamVjdFBhdGgpOwotCQlkZWJ1Z1JlcXVlc3Rvci5kZWFjdGl2YXRlKCk7Ci0JfQotCi0JLyoqIEluY3JlbWVudGFsbHkgYnVpbGRzIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluY3JlbWVudGFsQnVpbGQoSVBhdGggcHJvamVjdFBhdGgpIHsKLQkJZGVidWdSZXF1ZXN0b3IuY2xlYXJSZXN1bHQoKTsKLQkJZGVidWdSZXF1ZXN0b3IuYWN0aXZhdGUoKTsKLQkJZW52LmluY3JlbWVudGFsQnVpbGQocHJvamVjdFBhdGgpOwotCQlkZWJ1Z1JlcXVlc3Rvci5kZWFjdGl2YXRlKCk7Ci0JfQotCi0JLyoqIEluY3JlbWVudGFsbHkgYnVpbGRzIHRoZSB3b3Jrc3BhY2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5jcmVtZW50YWxCdWlsZCgpIHsKLQkJZGVidWdSZXF1ZXN0b3IuY2xlYXJSZXN1bHQoKTsKLQkJZGVidWdSZXF1ZXN0b3IuYWN0aXZhdGUoKTsKLQkJZW52LmluY3JlbWVudGFsQnVpbGQoKTsKLQkJZGVidWdSZXF1ZXN0b3IuZGVhY3RpdmF0ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW50UHJvYmxlbXMoKSB7Ci0JCXByaW50UHJvYmxlbXNGb3IoZW52LmdldFdvcmtzcGFjZVJvb3RQYXRoKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW50UHJvYmxlbXNGb3IoSVBhdGggcm9vdCkgewotCQlwcmludFByb2JsZW1zRm9yKG5ldyBJUGF0aFtdIHsgcm9vdCB9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmludFByb2JsZW1zRm9yKElQYXRoW10gcm9vdHMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb290cy5sZW5ndGg7IGkrKykgewotCQkJSVBhdGggcGF0aCA9IHJvb3RzW2ldOwotCi0JCQkvKiBnZXQgdGhlIGxlYWYgcHJvYmxlbXMgZm9yIHRoaXMgdHlwZSAqLwotCQkJUHJvYmxlbVtdIHByb2JsZW1zID0gZW52LmdldFByb2JsZW1zRm9yKHBhdGgpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwcm9ibGVtcy5sZW5ndGg7IGorKykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4ocHJvYmxlbXNbal0udG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQkvKiogU2V0cyB1cCB0aGlzIHRlc3QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JCWRlYnVnUmVxdWVzdG9yID0gbmV3IEVmZmljaWVuY3lDb21waWxlclJlcXVlc3RvcigpOwotCQlDb21waWxlci5EZWJ1Z1JlcXVlc3RvciA9IGRlYnVnUmVxdWVzdG9yOwotCQlpZiAoZW52ID09IG51bGwpIHsKLQkJCWVudiA9IG5ldyBUZXN0aW5nRW52aXJvbm1lbnQoKTsKLQkJCWVudi5vcGVuRW1wdHlXb3Jrc3BhY2UoKTsKLQkJfQotCQllbnYucmVzZXRXb3Jrc3BhY2UoKTsKLQotCX0KLQkvKioKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZW52LnJlc2V0V29ya3NwYWNlKCk7Ci0JCUphdmFDb3JlLnNldE9wdGlvbnMoSmF2YUNvcmUuZ2V0RGVmYXVsdE9wdGlvbnMoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgRmlsdGVyZWRUZXN0U3VpdGUoRVhDTFVERURfVEVTVFMpOwotCi0JCS8qIHRlc3RzICovCi0JCXN1aXRlLmFkZFRlc3QoQWJzdHJhY3RNZXRob2RUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChCYXNpY0J1aWxkVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoQ2xhc3NwYXRoVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoQ29tcGlsYXRpb25Vbml0TG9jYXRpb25UZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChDb3B5UmVzb3VyY2VUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChFcnJvcnNUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChFZmZpY2llbmN5VGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoRXhlY3V0aW9uVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSW5jcmVtZW50YWxUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKQ0xUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChNdWx0aVByb2plY3RUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChNdWx0aVNvdXJjZUZvbGRlckFuZE91dHB1dEZvbGRlclRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KE91dHB1dEZvbGRlclRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KFBhY2thZ2VUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChTdGF0aWNGaW5hbFRlc3RzLnN1aXRlKCkpOwotCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyL3Rlc3QueG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuYnVpbGRlci90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFjYjNiNi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9InRlc3RzdWl0ZSIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4KLSAgPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLSAgPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn1cLi5cLi4iLz4KLQotICA8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgZWNsaXBzZS1ob21lLCBhbmQgbGlicmFyeS1maWxlIC0tPgotICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LWZpbGUiCi0gICAgICAgICAgICB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvb3JnLmVjbGlwc2UudGVzdC9saWJyYXJ5LnhtbCIvPgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLSAgPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KLSAgPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgPHRzdGFtcC8+Ci0gICAgPGRlbGV0ZT4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtlY2xpcHNlLWhvbWV9IiBpbmNsdWRlcz0ib3JnKi54bWwiLz4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJzdWl0ZSI+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImpkdC1idWlsZGVyLWZvbGRlciIgCi0gICAgICAgICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vamR0X2J1aWxkZXJfZm9sZGVyIi8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7amR0LWJ1aWxkZXItZm9sZGVyfSIgcXVpZXQ9InRydWUiLz4KLSAgICA8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7amR0LWJ1aWxkZXItZm9sZGVyfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIAotICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5idWlsZGVyLlRlc3RzIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotICA8IS0tIGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8gLS0+Ci0gIDwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIC0tPgotICA8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJpbml0LHN1aXRlLGNsZWFudXAiPgotICAgIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZyoueG1sIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyLy5jbGFzc3BhdGggYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODU3MmRiLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIvb3JnLmp1bml0Ii8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLmpkdC5kZWJ1ZyIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuZWNsaXBzZS5qZHQuY29yZSIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIvb3JnLmVjbGlwc2UuY29yZS5ib290Ii8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyLy5jdnNpZ25vcmUgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci8ucHJvamVjdCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDk4YTZjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ib290PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpkdC5jb3JlPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qZHQuZGVidWc8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5qdW5pdDwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvYWJvdXQuaHRtbCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNzkwNmUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPjIwdGggSnVuZSwgMjAwMjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci08cD5FY2xpcHNlLm9yZyBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtDUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBDUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+VGhpcmQgUGFydHkgQ29udGVudDwvaDM+Ci0KLTxwPlRoZSBDb250ZW50IGluY2x1ZGVzIGl0ZW1zIHRoYXQgbWF5IGJlIGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQgcGFydGllcyBhcyBmb2xsb3dzOjwvcD4KLQotPHA+PGI+SlVuaXQgMy43PC9iPjwvcD4KLTxwPlRoZSBwbHVnLWluIGlzIGJhc2VkIG9uIHNvZnR3YXJlIGRldmVsb3BlZCBieSBKVW5pdC5vcmcuICBZb3VyIHVzZSBvZiBKVW5pdCAzLjcgaW4gYm90aCBzb3VyY2UgYW5kIGJpbmFyeSBjb2RlCi1mb3JtIGNvbnRhaW5lZCBpbiB0aGUgcGx1Zy1pbiBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKLTxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4uCi1UaGUgc291cmNlIGNvZGUgaXMgbG9jYXRlZCBpbiBzcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvanVuaXQvZXh0ZW5zaW9uLjwvcD4KLQotPHA+aSkgSUJNIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7PC9wPgotPHA+aWkpIElCTSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czs8L3A+Ci08cD5paWkpIElCTSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5LjwvcD4KLQotPGgzPkNvbnRyaWJ1dGlvbnM8L2gzPgotCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMLCBhbnkgQ29udHJpYnV0aW9ucywgYXMgZGVmaW5lZCBpbiB0aGUgQ1BMLCB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UKLW1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUgaG9zdCBvZiBFY2xpcHNlLm9yZyB3ZWIgc2l0ZSwgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2gKLUNvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ1BMLjwvcD4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zIG90aGVyIHRoYW4gdGhlIENQTCAoJnF1b3Q7T3RoZXIgTGljZW5zZSZxdW90OyksIGFueSBtb2RpZmljYXRpb25zLCBlbmhhbmNlbWVudHMgYW5kL29yCi1vdGhlciBjb2RlIGFuZC9vciBkb2N1bWVudGF0aW9uICgmcXVvdDtNb2RpZmljYXRpb25zJnF1b3Q7KSB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZQotaG9zdCBvZiBFY2xpcHNlLm9yZywgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2ggQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIE90aGVyIExpY2Vuc2UgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZQotdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3RoZXIgTGljZW5zZS4gIEluIGFkZGl0aW9uLCB3aXRoIHJlZ2FyZCB0byBNb2RpZmljYXRpb25zIGZvciB3aGljaCB5b3UgYXJlIHRoZSBjb3B5cmlnaHQgaG9sZGVyLCB5b3UgYXJlIGFsc28KLXByb3ZpZGluZyB0aGUgTW9kaWZpY2F0aW9ucyB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgc3VjaCBNb2RpZmljYXRpb25zIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mCi10aGUgQ1BMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDlkMzdkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgKi5qYXIKLXNvdXJjZS5qZHRjb3JldGVzdHNjb21waWxlci5qYXIgPSBzcmMKLXNyYy5pbmNsdWRlcz1hYm91dC5odG1sClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvcGx1Z2luLnhtbCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NTY0ZDUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIiCi0gICBuYW1lPSJKYXZhIENvbXBpbGVyIFRlc3RzIgotICAgdmVyc2lvbj0iMi4xLjAiPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9ImpkdGNvcmV0ZXN0c2NvbXBpbGVyLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuanVuaXQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuZGVidWciLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIvPgotICAgPC9yZXF1aXJlcz4KLQotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9FdmFsVGVzdHNUYXJnZXQuemlwIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL0V2YWxUZXN0c1RhcmdldC56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YmIyZTkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL0V2YWxUZXN0c1RhcmdldC56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL0Fic3RyYWN0Q29tcGxldGlvblRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvQWJzdHJhY3RDb21wbGV0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGY4Y2RlLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvQWJzdHJhY3RDb21wbGV0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIucGFyc2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmNvbXBsZXRlLkNvbXBsZXRpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGUuQ29tcGxldGlvblNjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5EZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Db21waWxhdGlvblVuaXREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Jbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYmF0Y2guQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uRGVmYXVsdFByb2JsZW1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1SZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb21wbGV0aW9uVGVzdCBleHRlbmRzIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmp1bml0LmV4dGVuc2lvbi5UZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOT05FID0gIjxOT05FPiI7Ci1wdWJsaWMgQWJzdHJhY3RDb21wbGV0aW9uVGVzdChTdHJpbmcgdGVzdE5hbWUpewotCXN1cGVyKHRlc3ROYW1lKTsKLX0KLS8qCi0gKiBEaWV0UGFyc2Ugd2l0aCBjb21wbGV0aW9uTm9kZSBjaGVjawotICovCi1wdWJsaWMgdm9pZCBjaGVja0RpZXRQYXJzZSgKLQljaGFyW10gc291cmNlLCAKLQlpbnQgY3Vyc29yTG9jYXRpb24sIAotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb24sIAotCVN0cmluZyBleHBlY3RlZFVuaXRUb1N0cmluZywgCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXIsCi0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JU3RyaW5nIHRlc3ROYW1lKSB7Ci0JdGhpcy5jaGVja0RpZXRQYXJzZSgKLQkJc291cmNlLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb24sCi0JCW51bGwsCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogRGlldFBhcnNlIHdpdGggY29tcGxldGlvbk5vZGUgY2hlY2sKLSAqLwotcHVibGljIHZvaWQgY2hlY2tEaWV0UGFyc2UoCi0JY2hhcltdIHNvdXJjZSwgCi0JaW50IGN1cnNvckxvY2F0aW9uLCAKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uLCAKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnRDb21wbGV0aW9uLAotCVN0cmluZyBleHBlY3RlZFVuaXRUb1N0cmluZywgCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXIsCi0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JU3RyaW5nIHRlc3ROYW1lKSB7Ci0KLQlDb21waWxlck9wdGlvbnMgb3B0aW9ucyA9IG5ldyBDb21waWxlck9wdGlvbnMoKTsKLQlDb21wbGV0aW9uUGFyc2VyIHBhcnNlciA9IAotCQluZXcgQ29tcGxldGlvblBhcnNlcigKLQkJCW5ldyBQcm9ibGVtUmVwb3J0ZXIoCi0JCQkJRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llcy5wcm9jZWVkV2l0aEFsbFByb2JsZW1zKCksIAotCQkJCW9wdGlvbnMsIAotCQkJCW5ldyBEZWZhdWx0UHJvYmxlbUZhY3RvcnkoTG9jYWxlLmdldERlZmF1bHQoKSkpLAotCQkJb3B0aW9ucy5zb3VyY2VMZXZlbCk7Ci0KLQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBuZXcgQ29tcGlsYXRpb25Vbml0KHNvdXJjZSwgdGVzdE5hbWUsIG51bGwpOwotCUNvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KHNvdXJjZVVuaXQsIDAsIDAsIDApOwkKLQotCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQgPSBwYXJzZXIuZGlldFBhcnNlKHNvdXJjZVVuaXQsIGNvbXBpbGF0aW9uUmVzdWx0LCBjdXJzb3JMb2NhdGlvbik7Ci0KLQlTdHJpbmcgY29tcHV0ZWRDb21wbGV0aW9uID0gcGFyc2VyLmFzc2lzdE5vZGUgPT0gbnVsbCAKLQkJCQkJCQkJCT8gTk9ORQotCQkJCQkJCQkJOiBwYXJzZXIuYXNzaXN0Tm9kZS50b1N0cmluZygwKTsKLQlTdHJpbmcgY29tcHV0ZWRQYXJlbnRDb21wbGV0aW9uID0gcGFyc2VyLmFzc2lzdE5vZGVQYXJlbnQgPT0gbnVsbCAKLQkJCQkJCQkJPyBOT05FCi0JCQkJCQkJCTogcGFyc2VyLmFzc2lzdE5vZGVQYXJlbnQudG9TdHJpbmcoMCk7Ci0JU3RyaW5nIGNvbXB1dGVkVW5pdFRvU3RyaW5nID0gdW5pdC50b1N0cmluZygpOwotCS8vU3lzdGVtLm91dC5wcmludGxuKGNvbXB1dGVkVW5pdFRvU3RyaW5nKTsKLQkvL1N5c3RlbS5vdXQucHJpbnRsbihVdGlsLmRpc3BsYXlTdHJpbmcoY29tcHV0ZWRVbml0VG9TdHJpbmcpKTsKLQkvL1N5c3RlbS5vdXQucHJpbnRsbihleHBlY3RlZFVuaXRUb1N0cmluZyk7Ci0JCi0JYXNzZXJ0RXF1YWxzKAotCQkiaW52YWxpZCBjb21wbGV0aW9uIG5vZGUtIiArIHRlc3ROYW1lLAotCQlleHBlY3RlZENvbXBsZXRpb24sCi0JCWNvbXB1dGVkQ29tcGxldGlvbik7Ci0JCi0JaWYoZXhwZWN0ZWRQYXJlbnRDb21wbGV0aW9uICE9IG51bGwpIHsKLQkJYXNzZXJ0RXF1YWxzKAotCQkiaW52YWxpZCBjb21wbGV0aW9uIHBhcmVudCBub2RlLSIgKyB0ZXN0TmFtZSwKLQkJZXhwZWN0ZWRQYXJlbnRDb21wbGV0aW9uLAotCQljb21wdXRlZFBhcmVudENvbXBsZXRpb24pOwotCX0KLQotCWFzc2VydEVxdWFscygKLQkJImludmFsaWQgY29tcGxldGlvbiB0cmVlLSIgKyB0ZXN0TmFtZSwKLQkJZXhwZWN0ZWRVbml0VG9TdHJpbmcsCi0JCWNvbXB1dGVkVW5pdFRvU3RyaW5nKTsKLQkKLQlpZiAoZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllciAhPSBudWxsKXsKLQkJY2hhcltdIGNoYXJzID0gKChDb21wbGV0aW9uU2Nhbm5lcilwYXJzZXIuc2Nhbm5lcikuY29tcGxldGlvbklkZW50aWZpZXI7Ci0JCVN0cmluZyBjb21wdXRlZENvbXBsZXRpb25JZGVudGlmaWVyID0gY2hhcnMgPT0gbnVsbCA/IE5PTkUgOiBuZXcgU3RyaW5nKGNoYXJzKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJImludmFsaWQgY29tcGxldGlvbiBpZGVudGlmaWVyLSIgKyB0ZXN0TmFtZSwKLQkJCWV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXIsCi0JCQljb21wdXRlZENvbXBsZXRpb25JZGVudGlmaWVyKTsKLQl9Ci0JCi0JaWYgKGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgIT0gbnVsbCl7Ci0JCWNoYXJbXSBjaGFycyA9IG51bGw7Ci0JCWlmIChwYXJzZXIuYXNzaXN0Tm9kZSAhPSBudWxsKXsKLQkJCWNoYXJzID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheSgKLQkJCQlwYXJzZXIuc2Nhbm5lci5zb3VyY2UsIAotCQkJCXBhcnNlci5hc3Npc3ROb2RlLnNvdXJjZVN0YXJ0LCAKLQkJCQlwYXJzZXIuYXNzaXN0Tm9kZS5zb3VyY2VFbmQgKyAxKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChwYXJzZXIuYXNzaXN0SWRlbnRpZmllcigpICE9IG51bGwpewotCQkJCWlmICgoKENvbXBsZXRpb25TY2FubmVyKXBhcnNlci5zY2FubmVyKS5jb21wbGV0ZWRJZGVudGlmaWVyRW5kIAotCQkJCQk+PSAoKENvbXBsZXRpb25TY2FubmVyKXBhcnNlci5zY2FubmVyKS5jb21wbGV0ZWRJZGVudGlmaWVyU3RhcnQpewotCQkJCQljaGFycyA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkoCi0JCQkJCQlwYXJzZXIuc2Nhbm5lci5zb3VyY2UsIAotCQkJCQkJKChDb21wbGV0aW9uU2Nhbm5lcilwYXJzZXIuc2Nhbm5lcikuY29tcGxldGVkSWRlbnRpZmllclN0YXJ0LCAKLQkJCQkJCSgoQ29tcGxldGlvblNjYW5uZXIpcGFyc2VyLnNjYW5uZXIpLmNvbXBsZXRlZElkZW50aWZpZXJFbmQgKyAxKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGNvbXB1dGVkUmVwbGFjZWRTb3VyY2UgID0gY2hhcnMgPT0gbnVsbCA/IE5PTkUgOiBuZXcgU3RyaW5nKGNoYXJzKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJImludmFsaWQgcmVwbGFjZWQgc291cmNlLSIgKyB0ZXN0TmFtZSwKLQkJCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCQljb21wdXRlZFJlcGxhY2VkU291cmNlKTsKLQl9Ci19Ci0vKgotICogUGFyc2UgYSBtZXRob2Qgd2l0aCBjb21wbGV0aW9uTm9kZSBjaGVjawotICovCi1wdWJsaWMgdm9pZCBjaGVja01ldGhvZFBhcnNlKAotCQljaGFyW10gc291cmNlLCAKLQkJaW50IGN1cnNvckxvY2F0aW9uLCAKLQkJU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbiwgCi0JCVN0cmluZyBleHBlY3RlZFBhcmVudENvbXBsZXRpb24sCi0JCVN0cmluZyBleHBlY3RlZFVuaXRUb1N0cmluZywgCi0JCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyLCAKLQkJU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCVN0cmluZ1tdIGV4cGVjdGVkTGFiZWxzLAotCQlTdHJpbmcgdGVzdE5hbWUpIHsKLQotCUNvbXBpbGVyT3B0aW9ucyBvcHRpb25zID0gbmV3IENvbXBpbGVyT3B0aW9ucygpOwotCUNvbXBsZXRpb25QYXJzZXIgcGFyc2VyID0gCi0JCW5ldyBDb21wbGV0aW9uUGFyc2VyKAotCQkJbmV3IFByb2JsZW1SZXBvcnRlcigKLQkJCQlEZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzLnByb2NlZWRXaXRoQWxsUHJvYmxlbXMoKSwgCi0JCQkJb3B0aW9ucywgCi0JCQkJbmV3IERlZmF1bHRQcm9ibGVtRmFjdG9yeShMb2NhbGUuZ2V0RGVmYXVsdCgpKSksCi0JCQlvcHRpb25zLnNvdXJjZUxldmVsKTsKLQotCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IG5ldyBDb21waWxhdGlvblVuaXQoc291cmNlLCB0ZXN0TmFtZSwgbnVsbCk7Ci0JQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQgPSBuZXcgQ29tcGlsYXRpb25SZXN1bHQoc291cmNlVW5pdCwgMCwgMCwgMCk7CQotCi0JQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gdW5pdCA9IHBhcnNlci5kaWV0UGFyc2Uoc291cmNlVW5pdCwgY29tcGlsYXRpb25SZXN1bHQsIGN1cnNvckxvY2F0aW9uKTsKLQotCUFzdE5vZGUgZm91bmRNZXRob2QgPSBudWxsOwotCWlmICh1bml0LnR5cGVzICE9IG51bGwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1bml0LnR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUeXBlRGVjbGFyYXRpb24gdHlwZSA9IHVuaXQudHlwZXNbaV07Ci0JCQlBc3ROb2RlIG1ldGhvZCA9IGZpbmRNZXRob2QodHlwZSwgY3Vyc29yTG9jYXRpb24pOwotCQkJaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0JCQkJZm91bmRNZXRob2QgPSBtZXRob2Q7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JYXNzZXJ0VHJ1ZSgibm8gbWV0aG9kIGZvdW5kIGF0IGN1cnNvciBsb2NhdGlvbiIsIGZvdW5kTWV0aG9kICE9IG51bGwpOwotCWlmIChmb3VuZE1ldGhvZCBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHsKLQkJcGFyc2VyLnBhcnNlQmxvY2tTdGF0ZW1lbnRzKChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKWZvdW5kTWV0aG9kLCB1bml0KTsKLQl9IGVsc2UgewotCQlUeXBlRGVjbGFyYXRpb24gdHlwZSA9IChUeXBlRGVjbGFyYXRpb24pZm91bmRNZXRob2Q7Ci0JCWlmICh0eXBlLmZpZWxkcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGUuZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZCA9IHR5cGUuZmllbGRzW2ldOwotCQkJCWlmIChmaWVsZC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IDw9IGN1cnNvckxvY2F0aW9uICYmIChjdXJzb3JMb2NhdGlvbiA8PSBmaWVsZC5kZWNsYXJhdGlvblNvdXJjZUVuZCB8fCBmaWVsZC5kZWNsYXJhdGlvblNvdXJjZUVuZCA9PSAwKSkgewotCQkJCQlpZiAoZmllbGQgaW5zdGFuY2VvZiBJbml0aWFsaXplcikgewotCQkJCQkJcGFyc2VyLnBhcnNlQmxvY2tTdGF0ZW1lbnRzKChJbml0aWFsaXplcilmaWVsZCwgdHlwZSwgdW5pdCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWFzc2VydFRydWUoIlRCRCIsIGZhbHNlKTsgLy8gZmllbGQgaW5pdGlhbGl6ZXIKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlTdHJpbmcgY29tcHV0ZWRDb21wbGV0aW9uID0gcGFyc2VyLmFzc2lzdE5vZGUgPT0gbnVsbCAKLQkJCQkJCQkJPyBOT05FCi0JCQkJCQkJCTogcGFyc2VyLmFzc2lzdE5vZGUudG9TdHJpbmcoMCk7Ci0JU3RyaW5nIGNvbXB1dGVkUGFyZW50Q29tcGxldGlvbiA9IHBhcnNlci5hc3Npc3ROb2RlUGFyZW50ID09IG51bGwgCi0JCQkJCQkJCT8gTk9ORQotCQkJCQkJCQk6IHBhcnNlci5hc3Npc3ROb2RlUGFyZW50LnRvU3RyaW5nKDApOwotCVN0cmluZyBjb21wdXRlZFVuaXRUb1N0cmluZyA9IHVuaXQudG9TdHJpbmcoKTsKLQkvL1N5c3RlbS5vdXQucHJpbnRsbihjb21wdXRlZFVuaXRUb1N0cmluZyk7Ci0JLy9TeXN0ZW0ub3V0LnByaW50bG4oVXRpbC5kaXNwbGF5U3RyaW5nKGNvbXB1dGVkVW5pdFRvU3RyaW5nKSk7Ci0JLy9TeXN0ZW0ub3V0LnByaW50bG4oZXhwZWN0ZWRVbml0VG9TdHJpbmcpOwkJCi0KLQlhc3NlcnRFcXVhbHMoCi0JCSJpbnZhbGlkIGNvbXBsZXRpb24gbm9kZS0iICsgdGVzdE5hbWUsCi0JCWV4cGVjdGVkQ29tcGxldGlvbiwKLQkJY29tcHV0ZWRDb21wbGV0aW9uKTsKLQkJCi0JaWYoZXhwZWN0ZWRQYXJlbnRDb21wbGV0aW9uICE9IG51bGwpIHsKLQkJYXNzZXJ0RXF1YWxzKAotCQkiaW52YWxpZCBjb21wbGV0aW9uIHBhcmVudCBub2RlLSIgKyB0ZXN0TmFtZSwKLQkJZXhwZWN0ZWRQYXJlbnRDb21wbGV0aW9uLAotCQljb21wdXRlZFBhcmVudENvbXBsZXRpb24pOwotCX0KLQotCWFzc2VydEVxdWFscygKLQkJImludmFsaWQgY29tcGxldGlvbiBsb2NhdGlvbi0iK3Rlc3ROYW1lLAotCQlleHBlY3RlZFVuaXRUb1N0cmluZywKLQkJY29tcHV0ZWRVbml0VG9TdHJpbmcpOwotCi0JaWYgKGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXIgIT0gbnVsbCl7Ci0JCWNoYXJbXSBjaGFycyA9ICgoQ29tcGxldGlvblNjYW5uZXIpcGFyc2VyLnNjYW5uZXIpLmNvbXBsZXRpb25JZGVudGlmaWVyOwotCQlTdHJpbmcgY29tcHV0ZWRDb21wbGV0aW9uSWRlbnRpZmllciA9IGNoYXJzID09IG51bGwgPyBOT05FIDogbmV3IFN0cmluZyhjaGFycyk7Ci0JCWFzc2VydEVxdWFscygKLQkJCSJpbnZhbGlkIGNvbXBsZXRpb24gaWRlbnRpZmllci0iICsgdGVzdE5hbWUsCi0JCQlleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyLAotCQkJY29tcHV0ZWRDb21wbGV0aW9uSWRlbnRpZmllcik7Ci0JfQotCWlmIChleHBlY3RlZFJlcGxhY2VkU291cmNlICE9IG51bGwpewotCQljaGFyW10gY2hhcnMgPSBudWxsOwotCQlpZiAocGFyc2VyLmFzc2lzdE5vZGUgIT0gbnVsbCl7Ci0JCQljaGFycyA9IENoYXJPcGVyYXRpb24uc3ViYXJyYXkoCi0JCQkJcGFyc2VyLnNjYW5uZXIuc291cmNlLCAKLQkJCQlwYXJzZXIuYXNzaXN0Tm9kZS5zb3VyY2VTdGFydCwgCi0JCQkJcGFyc2VyLmFzc2lzdE5vZGUuc291cmNlRW5kICsgMSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocGFyc2VyLmFzc2lzdElkZW50aWZpZXIoKSAhPSBudWxsKXsKLQkJCQlpZiAoKChDb21wbGV0aW9uU2Nhbm5lcilwYXJzZXIuc2Nhbm5lcikuY29tcGxldGVkSWRlbnRpZmllckVuZCAKLQkJCQkJPj0gKChDb21wbGV0aW9uU2Nhbm5lcilwYXJzZXIuc2Nhbm5lcikuY29tcGxldGVkSWRlbnRpZmllclN0YXJ0KXsKLQkJCQkJY2hhcnMgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KAotCQkJCQkJcGFyc2VyLnNjYW5uZXIuc291cmNlLCAKLQkJCQkJCSgoQ29tcGxldGlvblNjYW5uZXIpcGFyc2VyLnNjYW5uZXIpLmNvbXBsZXRlZElkZW50aWZpZXJTdGFydCwgCi0JCQkJCQkoKENvbXBsZXRpb25TY2FubmVyKXBhcnNlci5zY2FubmVyKS5jb21wbGV0ZWRJZGVudGlmaWVyRW5kICsgMSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVN0cmluZyBjb21wdXRlZFJlcGxhY2VkU291cmNlICA9IGNoYXJzID09IG51bGwgPyBOT05FIDogbmV3IFN0cmluZyhjaGFycyk7Ci0JCWFzc2VydEVxdWFscygKLQkJCSJpbnZhbGlkIHJlcGxhY2VkIHNvdXJjZS0iICsgdGVzdE5hbWUsCi0JCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkJY29tcHV0ZWRSZXBsYWNlZFNvdXJjZSk7Ci0JCWlmIChleHBlY3RlZFJlcGxhY2VkU291cmNlLmxlbmd0aCgpID09IDApIHsKLQkJCWFzc2VydEVxdWFscygKLQkJCQkiaW52YWxpZCBpbnNlcnRpb24gcG9pbnQtIiArIHRlc3ROYW1lLAotCQkJCWN1cnNvckxvY2F0aW9uICsgMSwgCi0JCQkJcGFyc2VyLmFzc2lzdE5vZGUuc291cmNlU3RhcnQpOwotCQl9Ci0JfQotCWlmIChleHBlY3RlZExhYmVscyAhPSBudWxsKSB7Ci0vLwkJaW50IGxlbmd0aCA9IChwYXJzZXIubGFiZWxzID09IG51bGwpID8gMCA6IHBhcnNlci5sYWJlbHMubGVuZ3RoOwotLy8JCWFzc2VydEVxdWFscygiaW52YWxpZCBudW1iZXIgb2YgbGFiZWxzLSIgKyB0ZXN0TmFtZSwgZXhwZWN0ZWRMYWJlbHMubGVuZ3RoLCBsZW5ndGgpOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLS8vCQkJU3RyaW5nIGxhYmVsID0gbmV3IFN0cmluZyhwYXJzZXIubGFiZWxzW2ldKTsKLS8vCQkJYXNzZXJ0RXF1YWxzKCJpbnZhbGlkIGxhYmVsLSIgKyB0ZXN0TmFtZSwgZXhwZWN0ZWRMYWJlbHNbaV0sIGxhYmVsKTsKLS8vCQl9Ci0JfQotfQotLyoKLSAqIFBhcnNlIGEgbWV0aG9kIHdpdGggY29tcGxldGlvbk5vZGUgY2hlY2sKLSAqLwotcHVibGljIHZvaWQgY2hlY2tNZXRob2RQYXJzZSgKLQkJY2hhcltdIHNvdXJjZSwgCi0JCWludCBjdXJzb3JMb2NhdGlvbiwgCi0JCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb24sIAotCQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcsIAotCQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllciwgCi0JCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlLCAKLQkJU3RyaW5nIHRlc3ROYW1lKSB7Ci0KLQl0aGlzLmNoZWNrTWV0aG9kUGFyc2UoCi0JCXNvdXJjZSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uLAotCQludWxsLAotCQlleHBlY3RlZFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJbnVsbCwKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIFBhcnNlIGEgbWV0aG9kIHdpdGggY29tcGxldGlvbk5vZGUgY2hlY2sKLSAqLwotcHVibGljIHZvaWQgY2hlY2tNZXRob2RQYXJzZSgKLQkJY2hhcltdIHNvdXJjZSwgCi0JCWludCBjdXJzb3JMb2NhdGlvbiwgCi0JCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb24sCi0JCVN0cmluZyBleHBlY3RlZFBhcmVudENvbXBsZXRpb24sIAotCQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcsIAotCQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllciwgCi0JCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlLCAKLQkJU3RyaW5nIHRlc3ROYW1lKSB7Ci0KLQl0aGlzLmNoZWNrTWV0aG9kUGFyc2UoCi0JCXNvdXJjZSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uLAotCQlleHBlY3RlZFBhcmVudENvbXBsZXRpb24sCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQludWxsLAotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogUGFyc2UgYSBtZXRob2Qgd2l0aCBjb21wbGV0aW9uTm9kZSBjaGVjawotICovCi1wdWJsaWMgdm9pZCBjaGVja01ldGhvZFBhcnNlKAotCQljaGFyW10gc291cmNlLCAKLQkJaW50IGN1cnNvckxvY2F0aW9uLCAKLQkJU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbiwgCi0JCVN0cmluZyBleHBlY3RlZFVuaXRUb1N0cmluZywgCi0JCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyLCAKLQkJU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCVN0cmluZ1tdIGV4cGVjdGVkTGFiZWxzLAotCQlTdHJpbmcgdGVzdE5hbWUpIHsKLQkJCi0JdGhpcy5jaGVja01ldGhvZFBhcnNlKAotCQlzb3VyY2UsIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbiwKLQkJbnVsbCwKLQkJZXhwZWN0ZWRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCWV4cGVjdGVkTGFiZWxzLAotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogUmV0dXJucyB0aGUgbWV0aG9kLCB0aGUgY29uc3RydWN0b3Igb3IgdGhlIHR5cGUgZGVjbGFyaW5nIHRoZSBpbml0aWFsaXplcgotICogYXQgdGhlIGN1cnNvciBsb2NhdGlvbiBpbiB0aGUgZ2l2ZW4gdHlwZS4KLSAqIFJldHVybnMgbnVsbCBpZiBub3QgZm91bmQuCi0gKi8KLXByaXZhdGUgQXN0Tm9kZSBmaW5kTWV0aG9kKFR5cGVEZWNsYXJhdGlvbiB0eXBlLCBpbnQgY3Vyc29yTG9jYXRpb24pIHsKLQlpZiAodHlwZS5tZXRob2RzICE9IG51bGwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlLm1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCUFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gdHlwZS5tZXRob2RzW2ldOwotCQkJaWYgKG1ldGhvZC5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0IDw9IGN1cnNvckxvY2F0aW9uICYmIChjdXJzb3JMb2NhdGlvbiA8PSBtZXRob2QuZGVjbGFyYXRpb25Tb3VyY2VFbmQgfHwgbWV0aG9kLmRlY2xhcmF0aW9uU291cmNlRW5kID09IDApKSB7Ci0JCQkJcmV0dXJuIG1ldGhvZDsKLQkJCX0KLQkJfQotCX0KLQlpZiAodHlwZS5tZW1iZXJUeXBlcyAhPSBudWxsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZS5tZW1iZXJUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJVHlwZURlY2xhcmF0aW9uIG1lbWJlclR5cGUgPSB0eXBlLm1lbWJlclR5cGVzW2ldOwotCQkJQXN0Tm9kZSBtZXRob2QgPSBmaW5kTWV0aG9kKG1lbWJlclR5cGUsIGN1cnNvckxvY2F0aW9uKTsKLQkJCWlmIChtZXRob2QgIT0gbnVsbCkgewotCQkJCXJldHVybiBtZXRob2Q7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKHR5cGUuZmllbGRzICE9IG51bGwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlLmZpZWxkcy5sZW5ndGg7IGkrKykgewotCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZCA9IHR5cGUuZmllbGRzW2ldOwotCQkJaWYgKGZpZWxkIGluc3RhbmNlb2YgSW5pdGlhbGl6ZXIgJiYgZmllbGQuZGVjbGFyYXRpb25Tb3VyY2VTdGFydCA8PSBjdXJzb3JMb2NhdGlvbiAmJiAoY3Vyc29yTG9jYXRpb24gPD0gZmllbGQuZGVjbGFyYXRpb25Tb3VyY2VFbmQgfHwgZmllbGQuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPT0gMCkpIHsKLQkJCQlyZXR1cm4gdHlwZTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLS8qKgotICogUnVucyB0aGUgZ2l2ZW4gdGVzdCB0aGF0IGNoZWNrcyB0aGF0IGRpZXQgY29tcGxldGlvbiBwYXJzaW5nIHJldHVybnMgdGhlIGdpdmVuIGNvbXBsZXRpb24uCi0gKi8KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3RDaGVja0RpZXRQYXJzZSgKLQkJU3RyaW5nIGNvbXBpbGF0aW9uVW5pdCwgCi0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCwgCi0JCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllciwKLQkJU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCVN0cmluZyB0ZXN0TmFtZSkgewotCQkJCi0JaW50IGN1cnNvckxvY2F0aW9uID0gY29tcGlsYXRpb25Vbml0LmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCXRoaXMuY2hlY2tEaWV0UGFyc2UoCi0JCWNvbXBpbGF0aW9uVW5pdC50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qKgotICogUnVucyB0aGUgZ2l2ZW4gdGVzdCB0aGF0IGNoZWNrcyB0aGF0IG1ldGhvZCBjb21wbGV0aW9uIHBhcnNpbmcgcmV0dXJucyB0aGUgZ2l2ZW4gY29tcGxldGlvbi4KLSAqLwotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCVN0cmluZyBjb21waWxhdGlvblVuaXQsIAotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQsIAotCQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXIsCi0JCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQlTdHJpbmdbXSBleHBlY3RlZExhYmVscywKLQkJU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCQkKLQlpbnQgY29tcGxldGVCZWhpbmRTdGFydCA9IGNvbXBpbGF0aW9uVW5pdC5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKTsKLQlhc3NlcnRUcnVlKCJjb21wbGV0ZUJlaGluZCBzdHJpbmcgbm90IGZvdW5kIiwgY29tcGxldGVCZWhpbmRTdGFydCA+PSAwKTsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBjb21wbGV0ZUJlaGluZFN0YXJ0ICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCXRoaXMuY2hlY2tNZXRob2RQYXJzZSgKLQkJY29tcGlsYXRpb25Vbml0LnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQlleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQlleHBlY3RlZExhYmVscywKLQkJdGVzdE5hbWUpOyAKLX0KLS8qKgotICogUnVucyB0aGUgZ2l2ZW4gdGVzdCB0aGF0IGNoZWNrcyB0aGF0IG1ldGhvZCBjb21wbGV0aW9uIHBhcnNpbmcgcmV0dXJucyB0aGUgZ2l2ZW4gY29tcGxldGlvbi4KLSAqLwotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCVN0cmluZyBjb21waWxhdGlvblVuaXQsIAotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQsIAotCQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXIsCi0JCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQlTdHJpbmcgdGVzdE5hbWUpIHsKLQkJCQotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCWNvbXBpbGF0aW9uVW5pdCwKLQkJY29tcGxldGVCZWhpbmQsCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJbnVsbCwKLQkJdGVzdE5hbWUpOyAKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvQWJzdHJhY3RTZWxlY3Rpb25UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL0Fic3RyYWN0U2VsZWN0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDU4OTQ3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvQWJzdHJhY3RTZWxlY3Rpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3Quc2VsZWN0LlNlbGVjdGlvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5zZWxlY3QuU2VsZWN0aW9uU2Nhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkRlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5BYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQXN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkJsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5GaWVsZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmJhdGNoLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkRlZmF1bHRQcm9ibGVtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5Qcm9ibGVtUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2VsZWN0aW9uVGVzdCBleHRlbmRzIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmp1bml0LmV4dGVuc2lvbi5UZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOT05FID0gIjxOT05FPiI7Ci1wdWJsaWMgQWJzdHJhY3RTZWxlY3Rpb25UZXN0KFN0cmluZyB0ZXN0TmFtZSl7Ci0Jc3VwZXIodGVzdE5hbWUpOwotfQotLyoKLSAqIERpZXRQYXJzZSB3aXRoIHNlbGVjdGlvbk5vZGUgY2hlY2sKLSAqLwotcHVibGljIHZvaWQgY2hlY2tEaWV0UGFyc2UoCi0JY2hhcltdIHNvdXJjZSwgCi0JaW50IHNlbGVjdGlvblN0YXJ0LAotCWludCBzZWxlY3Rpb25FbmQsCi0JU3RyaW5nIGV4cGVjdGVkU2VsZWN0aW9uLCAKLQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcsIAotCVN0cmluZyBleHBlY3RlZFNlbGVjdGlvbklkZW50aWZpZXIsCi0JU3RyaW5nIGV4cGVjdGVkU2VsZWN0ZWRTb3VyY2UsCi0JU3RyaW5nIHRlc3ROYW1lKSB7Ci0KLQlDb21waWxlck9wdGlvbnMgb3B0aW9ucyA9IG5ldyBDb21waWxlck9wdGlvbnMoKTsKLQlTZWxlY3Rpb25QYXJzZXIgcGFyc2VyID0gCi0JCW5ldyBTZWxlY3Rpb25QYXJzZXIoCi0JCQluZXcgUHJvYmxlbVJlcG9ydGVyKAotCQkJCURlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXMucHJvY2VlZFdpdGhBbGxQcm9ibGVtcygpLCAKLQkJCQlvcHRpb25zLCAKLQkJCQluZXcgRGVmYXVsdFByb2JsZW1GYWN0b3J5KExvY2FsZS5nZXREZWZhdWx0KCkpKSwKLQkJCW9wdGlvbnMuc291cmNlTGV2ZWwpOwotCi0JSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gbmV3IENvbXBpbGF0aW9uVW5pdChzb3VyY2UsIHRlc3ROYW1lLCBudWxsKTsKLQlDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCA9IG5ldyBDb21waWxhdGlvblJlc3VsdChzb3VyY2VVbml0LCAwLCAwLCAwKTsJCi0KLQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiB1bml0ID0gcGFyc2VyLmRpZXRQYXJzZShzb3VyY2VVbml0LCBjb21waWxhdGlvblJlc3VsdCwgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCk7Ci0KLQlTdHJpbmcgY29tcHV0ZWRVbml0VG9TdHJpbmcgPSB1bml0LnRvU3RyaW5nKCk7Ci0JLy9TeXN0ZW0ub3V0LnByaW50bG4oY29tcHV0ZWRVbml0VG9TdHJpbmcpOwotCS8vU3lzdGVtLm91dC5wcmludGxuKFV0aWwuZGlzcGxheVN0cmluZyhjb21wdXRlZFVuaXRUb1N0cmluZykpOwotCS8vU3lzdGVtLm91dC5wcmludGxuKGV4cGVjdGVkVW5pdFRvU3RyaW5nKTsKLQotCVN0cmluZyBjb21wdXRlZFNlbGVjdGlvbiA9IHBhcnNlci5hc3Npc3ROb2RlID09IG51bGwgCi0JCQkJCQkJCQk/IE5PTkUKLQkJCQkJCQkJCTogcGFyc2VyLmFzc2lzdE5vZGUudG9TdHJpbmcoMCk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiaW52YWxpZCBzZWxlY3Rpb24gbm9kZS0iICsgdGVzdE5hbWUsCi0JCWV4cGVjdGVkU2VsZWN0aW9uLAotCQljb21wdXRlZFNlbGVjdGlvbik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJpbnZhbGlkIHNlbGVjdGlvbiB0cmVlLSIgKyB0ZXN0TmFtZSwKLQkJZXhwZWN0ZWRVbml0VG9TdHJpbmcsCi0JCWNvbXB1dGVkVW5pdFRvU3RyaW5nKTsKLQkKLQlpZiAoZXhwZWN0ZWRTZWxlY3Rpb25JZGVudGlmaWVyICE9IG51bGwpewotCQljaGFyW10gY2hhcnMgPSAoKFNlbGVjdGlvblNjYW5uZXIpcGFyc2VyLnNjYW5uZXIpLnNlbGVjdGlvbklkZW50aWZpZXI7Ci0JCVN0cmluZyBjb21wdXRlZFNlbGVjdGlvbklkZW50aWZpZXIgPSBjaGFycyA9PSBudWxsID8gTk9ORSA6IG5ldyBTdHJpbmcoY2hhcnMpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkiaW52YWxpZCBzZWxlY3Rpb24gaWRlbnRpZmllci0iICsgdGVzdE5hbWUsCi0JCQlleHBlY3RlZFNlbGVjdGlvbklkZW50aWZpZXIsCi0JCQljb21wdXRlZFNlbGVjdGlvbklkZW50aWZpZXIpOwotCX0KLQlpZiAoZXhwZWN0ZWRTZWxlY3RlZFNvdXJjZSAhPSBudWxsKXsKLQkJY2hhcltdIGNoYXJzID0gbnVsbDsKLQkJaWYgKHBhcnNlci5hc3Npc3ROb2RlICE9IG51bGwpewotCQkJY2hhcnMgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KAotCQkJCXBhcnNlci5zY2FubmVyLnNvdXJjZSwgCi0JCQkJcGFyc2VyLmFzc2lzdE5vZGUuc291cmNlU3RhcnQsIAotCQkJCXBhcnNlci5hc3Npc3ROb2RlLnNvdXJjZUVuZCArIDEpOwotCQl9IGVsc2UgewotCQkJaWYgKHBhcnNlci5hc3Npc3RJZGVudGlmaWVyKCkgIT0gbnVsbCl7Ci0JCQkJaWYgKCgoU2VsZWN0aW9uU2Nhbm5lcilwYXJzZXIuc2Nhbm5lcikuc2VsZWN0aW9uRW5kIAotCQkJCQk+PSAoKFNlbGVjdGlvblNjYW5uZXIpcGFyc2VyLnNjYW5uZXIpLnNlbGVjdGlvblN0YXJ0KXsKLQkJCQkJY2hhcnMgPSBDaGFyT3BlcmF0aW9uLnN1YmFycmF5KAotCQkJCQkJcGFyc2VyLnNjYW5uZXIuc291cmNlLCAKLQkJCQkJCSgoU2VsZWN0aW9uU2Nhbm5lcilwYXJzZXIuc2Nhbm5lcikuc2VsZWN0aW9uU3RhcnQsIAotCQkJCQkJKChTZWxlY3Rpb25TY2FubmVyKXBhcnNlci5zY2FubmVyKS5zZWxlY3Rpb25FbmQgKyAxKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGNvbXB1dGVkU2VsZWN0ZWRTb3VyY2UgID0gY2hhcnMgPT0gbnVsbCA/IE5PTkUgOiBuZXcgU3RyaW5nKGNoYXJzKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJImludmFsaWQgcmVwbGFjZWQgc291cmNlLSIgKyB0ZXN0TmFtZSwKLQkJCWV4cGVjdGVkU2VsZWN0ZWRTb3VyY2UsCi0JCQljb21wdXRlZFNlbGVjdGVkU291cmNlKTsKLQl9Ci19Ci0vKgotICogUGFyc2UgYSBtZXRob2Qgd2l0aCBzZWxlY3Rpb25Ob2RlIGNoZWNrCi0gKi8KLXB1YmxpYyB2b2lkIGNoZWNrTWV0aG9kUGFyc2UoCi0JCWNoYXJbXSBzb3VyY2UsIAotCQlpbnQgc2VsZWN0aW9uU3RhcnQsCi0JCWludCBzZWxlY3Rpb25FbmQsIAotCQlTdHJpbmcgZXhwZWN0ZWRTZWxlY3Rpb24sIAotCQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcsIAotCQlTdHJpbmcgZXhwZWN0ZWRTZWxlY3Rpb25JZGVudGlmaWVyLCAKLQkJU3RyaW5nIGV4cGVjdGVkU2VsZWN0ZWRTb3VyY2UsCi0JCVN0cmluZ1tdIGV4cGVjdGVkTGFiZWxzLAotCQlTdHJpbmcgdGVzdE5hbWUpIHsKLQotCUNvbXBpbGVyT3B0aW9ucyBvcHRpb25zID0gbmV3IENvbXBpbGVyT3B0aW9ucygpOwotCVNlbGVjdGlvblBhcnNlciBwYXJzZXIgPSAKLQkJbmV3IFNlbGVjdGlvblBhcnNlcigKLQkJCW5ldyBQcm9ibGVtUmVwb3J0ZXIoCi0JCQkJRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llcy5wcm9jZWVkV2l0aEFsbFByb2JsZW1zKCksIAotCQkJCW9wdGlvbnMsIAotCQkJCW5ldyBEZWZhdWx0UHJvYmxlbUZhY3RvcnkoTG9jYWxlLmdldERlZmF1bHQoKSkpLAotCQkJb3B0aW9ucy5zb3VyY2VMZXZlbCk7Ci0KLQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBuZXcgQ29tcGlsYXRpb25Vbml0KHNvdXJjZSwgdGVzdE5hbWUsIG51bGwpOwotCUNvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KHNvdXJjZVVuaXQsIDAsIDAsIDApOwkKLQotCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQgPSBwYXJzZXIuZGlldFBhcnNlKHNvdXJjZVVuaXQsIGNvbXBpbGF0aW9uUmVzdWx0LCBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTsKLQotCUFzdE5vZGUgZm91bmRNZXRob2QgPSBudWxsOwotCWlmICh1bml0LnR5cGVzICE9IG51bGwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1bml0LnR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUeXBlRGVjbGFyYXRpb24gdHlwZSA9IHVuaXQudHlwZXNbaV07Ci0JCQlBc3ROb2RlIG1ldGhvZCA9IGZpbmRNZXRob2QodHlwZSwgc2VsZWN0aW9uU3RhcnQpOwotCQkJaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0JCQkJZm91bmRNZXRob2QgPSBtZXRob2Q7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JYXNzZXJ0VHJ1ZSgibm8gbWV0aG9kIGZvdW5kIGF0IGN1cnNvciBsb2NhdGlvbiIsIGZvdW5kTWV0aG9kICE9IG51bGwpOwotCWlmIChmb3VuZE1ldGhvZCBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHsKLQkJcGFyc2VyLnBhcnNlQmxvY2tTdGF0ZW1lbnRzKChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKWZvdW5kTWV0aG9kLCB1bml0KTsKLQl9IGVsc2UgewotCQlUeXBlRGVjbGFyYXRpb24gdHlwZSA9IChUeXBlRGVjbGFyYXRpb24pZm91bmRNZXRob2Q7Ci0JCWlmICh0eXBlLmZpZWxkcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGUuZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZCA9IHR5cGUuZmllbGRzW2ldOwotCQkJCWlmIChmaWVsZCBpbnN0YW5jZW9mIEluaXRpYWxpemVyICYmIGZpZWxkLnNvdXJjZVN0YXJ0IDw9IHNlbGVjdGlvblN0YXJ0ICYmIHNlbGVjdGlvblN0YXJ0IDw9IGZpZWxkLnNvdXJjZUVuZCkgewotCQkJCQlwYXJzZXIucGFyc2VCbG9ja1N0YXRlbWVudHMoKEluaXRpYWxpemVyKWZpZWxkLCB0eXBlLCB1bml0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JU3RyaW5nIGNvbXB1dGVkVW5pdFRvU3RyaW5nID0gdW5pdC50b1N0cmluZygpOwotCS8vU3lzdGVtLm91dC5wcmludGxuKGNvbXB1dGVkVW5pdFRvU3RyaW5nKTsKLQkvL1N5c3RlbS5vdXQucHJpbnRsbihVdGlsLmRpc3BsYXlTdHJpbmcoY29tcHV0ZWRVbml0VG9TdHJpbmcpKTsKLQkvL1N5c3RlbS5vdXQucHJpbnRsbihleHBlY3RlZFVuaXRUb1N0cmluZyk7CQotCQotCVN0cmluZyBjb21wdXRlZENvbXBsZXRpb24gPSBwYXJzZXIuYXNzaXN0Tm9kZSA9PSBudWxsIAotCQkJCQkJCQk/IE5PTkUKLQkJCQkJCQkJOiBwYXJzZXIuYXNzaXN0Tm9kZS50b1N0cmluZygwKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJpbnZhbGlkIHNlbGVjdGlvbiBub2RlLSIgKyB0ZXN0TmFtZSwKLQkJZXhwZWN0ZWRTZWxlY3Rpb24sCi0JCWNvbXB1dGVkQ29tcGxldGlvbik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJpbnZhbGlkIHNlbGVjdGlvbiBsb2NhdGlvbi0iK3Rlc3ROYW1lLAotCQlleHBlY3RlZFVuaXRUb1N0cmluZywKLQkJY29tcHV0ZWRVbml0VG9TdHJpbmcpOwotCi0JaWYgKGV4cGVjdGVkU2VsZWN0aW9uSWRlbnRpZmllciAhPSBudWxsKXsKLQkJY2hhcltdIGNoYXJzID0gKChTZWxlY3Rpb25TY2FubmVyKXBhcnNlci5zY2FubmVyKS5zZWxlY3Rpb25JZGVudGlmaWVyOwotCQlTdHJpbmcgY29tcHV0ZWRTZWxlY3Rpb25JZGVudGlmaWVyID0gY2hhcnMgPT0gbnVsbCA/IE5PTkUgOiBuZXcgU3RyaW5nKGNoYXJzKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJImludmFsaWQgc2VsZWN0aW9uIGlkZW50aWZpZXItIiArIHRlc3ROYW1lLAotCQkJZXhwZWN0ZWRTZWxlY3Rpb25JZGVudGlmaWVyLAotCQkJY29tcHV0ZWRTZWxlY3Rpb25JZGVudGlmaWVyKTsKLQl9Ci0JaWYgKGV4cGVjdGVkU2VsZWN0ZWRTb3VyY2UgIT0gbnVsbCl7Ci0JCWNoYXJbXSBjaGFycyA9IG51bGw7Ci0JCWlmIChwYXJzZXIuYXNzaXN0Tm9kZSAhPSBudWxsKXsKLQkJCWNoYXJzID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheSgKLQkJCQlwYXJzZXIuc2Nhbm5lci5zb3VyY2UsIAotCQkJCXBhcnNlci5hc3Npc3ROb2RlLnNvdXJjZVN0YXJ0LCAKLQkJCQlwYXJzZXIuYXNzaXN0Tm9kZS5zb3VyY2VFbmQgKyAxKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChwYXJzZXIuYXNzaXN0SWRlbnRpZmllcigpICE9IG51bGwpewotCQkJCWlmICgoKFNlbGVjdGlvblNjYW5uZXIpcGFyc2VyLnNjYW5uZXIpLnNlbGVjdGlvbkVuZCAKLQkJCQkJPj0gKChTZWxlY3Rpb25TY2FubmVyKXBhcnNlci5zY2FubmVyKS5zZWxlY3Rpb25TdGFydCl7Ci0JCQkJCWNoYXJzID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheSgKLQkJCQkJCXBhcnNlci5zY2FubmVyLnNvdXJjZSwgCi0JCQkJCQkoKFNlbGVjdGlvblNjYW5uZXIpcGFyc2VyLnNjYW5uZXIpLnNlbGVjdGlvblN0YXJ0LCAKLQkJCQkJCSgoU2VsZWN0aW9uU2Nhbm5lcilwYXJzZXIuc2Nhbm5lcikuc2VsZWN0aW9uRW5kICsgMSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVN0cmluZyBjb21wdXRlZFJlcGxhY2VkU291cmNlICA9IGNoYXJzID09IG51bGwgPyBOT05FIDogbmV3IFN0cmluZyhjaGFycyk7Ci0JCWFzc2VydEVxdWFscygKLQkJCSJpbnZhbGlkIHJlcGxhY2VkIHNvdXJjZS0iICsgdGVzdE5hbWUsCi0JCQlleHBlY3RlZFNlbGVjdGVkU291cmNlLAotCQkJY29tcHV0ZWRSZXBsYWNlZFNvdXJjZSk7Ci0JfQotCWlmIChleHBlY3RlZExhYmVscyAhPSBudWxsKSB7Ci0vKgkKLQkJYXNzZXJ0KCJubyBsYWJlbHMtIiArIHRlc3ROYW1lLCBwYXJzZXIubGFiZWxzICE9IG51bGwpOwotCQlpbnQgbGVuZ3RoID0gcGFyc2VyLmxhYmVscy5sZW5ndGg7Ci0JCWFzc2VydEVxdWFscygiaW52YWxpZCBudW1iZXIgb2YgbGFiZWxzLSIgKyB0ZXN0TmFtZSwgZXhwZWN0ZWRMYWJlbHMubGVuZ3RoLCBsZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgbGFiZWwgPSBuZXcgU3RyaW5nKHBhcnNlci5sYWJlbHNbaV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJpbnZhbGlkIGxhYmVsLSIgKyB0ZXN0TmFtZSwgZXhwZWN0ZWRMYWJlbHNbaV0sIGxhYmVsKTsKLQkJfQotKi8JCi0JfQotfQotLyoKLSAqIFBhcnNlIGEgbWV0aG9kIHdpdGggc2VsZWN0aW9uTm9kZSBjaGVjawotICovCi1wdWJsaWMgdm9pZCBjaGVja01ldGhvZFBhcnNlKAotCQljaGFyW10gc291cmNlLCAKLQkJaW50IHNlbGVjdGlvblN0YXJ0LAotCQlpbnQgc2VsZWN0aW9uRW5kLCAJCQotCQlTdHJpbmcgZXhwZWN0ZWRTZWxlY3Rpb24sIAotCQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcsIAotCQlTdHJpbmcgZXhwZWN0ZWRTZWxlY3Rpb25JZGVudGlmaWVyLCAKLQkJU3RyaW5nIGV4cGVjdGVkU2VsZWN0ZWRTb3VyY2UsIAotCQlTdHJpbmcgdGVzdE5hbWUpIHsKLQotCXRoaXMuY2hlY2tNZXRob2RQYXJzZSgKLQkJc291cmNlLCAKLQkJc2VsZWN0aW9uU3RhcnQsCi0JCXNlbGVjdGlvbkVuZCwKLQkJZXhwZWN0ZWRTZWxlY3Rpb24sIAotCQlleHBlY3RlZFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRTZWxlY3Rpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFNlbGVjdGVkU291cmNlLAotCQludWxsLAotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogUmV0dXJucyB0aGUgbWV0aG9kLCB0aGUgY29uc3RydWN0b3Igb3IgdGhlIHR5cGUgZGVjbGFyaW5nIHRoZSBpbml0aWFsaXplcgotICogYXQgdGhlIGN1cnNvciBsb2NhdGlvbiBpbiB0aGUgZ2l2ZW4gdHlwZS4KLSAqIFJldHVybnMgbnVsbCBpZiBub3QgZm91bmQuCi0gKi8KLXByb3RlY3RlZCBBc3ROb2RlIGZpbmRNZXRob2QoVHlwZURlY2xhcmF0aW9uIHR5cGUsIGludCBjdXJzb3JMb2NhdGlvbikgewotCWlmICh0eXBlLm1ldGhvZHMgIT0gbnVsbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGUubWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbiBtZXRob2QgPSB0eXBlLm1ldGhvZHNbaV07Ci0JCQlpZiAobWV0aG9kLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPD0gY3Vyc29yTG9jYXRpb24gJiYgKGN1cnNvckxvY2F0aW9uIDw9IG1ldGhvZC5kZWNsYXJhdGlvblNvdXJjZUVuZCB8fCBtZXRob2QuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPT0gMCkpIHsKLQkJCQlyZXR1cm4gbWV0aG9kOwotCQkJfQotCQl9Ci0JfQotCWlmICh0eXBlLm1lbWJlclR5cGVzICE9IG51bGwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlLm1lbWJlclR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUeXBlRGVjbGFyYXRpb24gbWVtYmVyVHlwZSA9IHR5cGUubWVtYmVyVHlwZXNbaV07Ci0JCQlBc3ROb2RlIG1ldGhvZCA9IGZpbmRNZXRob2QobWVtYmVyVHlwZSwgY3Vyc29yTG9jYXRpb24pOwotCQkJaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG1ldGhvZDsKLQkJCX0KLQkJfQotCX0KLQlpZiAodHlwZS5maWVsZHMgIT0gbnVsbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGUuZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkID0gdHlwZS5maWVsZHNbaV07Ci0JCQlpZiAoZmllbGQgaW5zdGFuY2VvZiBJbml0aWFsaXplcikgewotCQkJCUluaXRpYWxpemVyIGluaXRpYWxpemVyID0gKEluaXRpYWxpemVyKWZpZWxkOwotCQkJCUJsb2NrIGJsb2NrID0gaW5pdGlhbGl6ZXIuYmxvY2s7Ci0JCQkJaWYgKGJsb2NrICE9IG51bGwgJiYgYmxvY2suc291cmNlU3RhcnQgPD0gY3Vyc29yTG9jYXRpb24gJiYgKGN1cnNvckxvY2F0aW9uIDw9IGJsb2NrLnNvdXJjZUVuZCB8fCBibG9jay5zb3VyY2VFbmQgPT0gMCkpIHsKLQkJCQkJcmV0dXJuIHR5cGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXJldHVybiBudWxsOwotfQotLyoqCi0gKiBSdW5zIHRoZSBnaXZlbiB0ZXN0IHRoYXQgY2hlY2tzIHRoYXQgbWV0aG9kIGNvbXBsZXRpb24gcGFyc2luZyByZXR1cm5zIHRoZSBnaXZlbiBjb21wbGV0aW9uLgotICovCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJU3RyaW5nIGNvbXBpbGF0aW9uVW5pdCwgCi0JCVN0cmluZyBzZWxlY3Rpb25TdGFydEJlaGluZCwKLQkJU3RyaW5nIHNlbGVjdGlvbkVuZEJlaGluZCwKLQkJU3RyaW5nIGV4cGVjdGVkU2VsZWN0aW9uTm9kZVRvU3RyaW5nLAotCQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJU3RyaW5nIGV4cGVjdGVkU2VsZWN0aW9uSWRlbnRpZmllciwKLQkJU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCVN0cmluZyB0ZXN0TmFtZSkgewotCi0JaW50IHNlbGVjdGlvblN0YXJ0QmVoaW5kU3RhcnQgPSBjb21waWxhdGlvblVuaXQuaW5kZXhPZihzZWxlY3Rpb25TdGFydEJlaGluZCk7Ci0JYXNzZXJ0VHJ1ZSgic2VsZWN0aW9uU3RhcnRCZWhpbmQgc3RyaW5nIG5vdCBmb3VuZCIsIHNlbGVjdGlvblN0YXJ0QmVoaW5kU3RhcnQgIT0gLTEpOwotCWludCBzZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0QmVoaW5kU3RhcnQgKyBzZWxlY3Rpb25TdGFydEJlaGluZC5sZW5ndGgoKTsKLQlpbnQgc2VsZWN0aW9uRW5kQmVoaW5kU3RhcnQgPSBjb21waWxhdGlvblVuaXQuaW5kZXhPZihzZWxlY3Rpb25FbmRCZWhpbmQpOwotCWFzc2VydFRydWUoInNlbGVjdGlvbkVuZEJlaGluZCBzdHJpbmcgbm90IGZvdW5kIiwgc2VsZWN0aW9uRW5kQmVoaW5kU3RhcnQgIT0gLTEpOwotCWludCBzZWxlY3Rpb25FbmQgPSBzZWxlY3Rpb25FbmRCZWhpbmRTdGFydCArIHNlbGVjdGlvbkVuZEJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCQotCXRoaXMuY2hlY2tNZXRob2RQYXJzZSgKLQkJY29tcGlsYXRpb25Vbml0LnRvQ2hhckFycmF5KCksIAotCQlzZWxlY3Rpb25TdGFydCwKLQkJc2VsZWN0aW9uRW5kLAotCQlleHBlY3RlZFNlbGVjdGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJZXhwZWN0ZWRTZWxlY3Rpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3BhcnNlci9BbGxvY2F0aW9uRXhwcmVzc2lvbkNvbXBsZXRpb25UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL0FsbG9jYXRpb25FeHByZXNzaW9uQ29tcGxldGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI0MDQ0ZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL0FsbG9jYXRpb25FeHByZXNzaW9uQ29tcGxldGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyLnBhcnNlcjsKLQotLyoqCi0gKiBDb21wbGV0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIGFuIEFsbG9jYXRpb25FeHByZXNzaW9uLgotICovCi1wdWJsaWMgY2xhc3MgQWxsb2NhdGlvbkV4cHJlc3Npb25Db21wbGV0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0Q29tcGxldGlvblRlc3QgewotcHVibGljIEFsbG9jYXRpb25FeHByZXNzaW9uQ29tcGxldGlvblRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0Jc3VwZXIodGVzdE5hbWUpOwotfQotCi0vKgotICogQ29tcGxldGlvbiBpbnNpZGUgYW4gaWYgc3RhdGVtZW50LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0SW5JZlN0YXRlbWVudCgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJXG4iICsgCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCVxuIiArCi0JCSIJCWlmICh0cnVlKSB7CQkJCQkJCVxuIiArCi0JCSIJCQluZXcgei55LlgoMSwgMiwgaSk7CQkJCVxuIiArCi0JCSIJCX0JCQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJXG4iICsKLQkJIn1cbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiWCgxLCAyLCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uQWxsb2NhdGlvbkV4cHJlc3Npb246bmV3IHoueS5YKDEsIDIpPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAge1xuIiArIAotCQkiICAgICAgPENvbXBsZXRlT25BbGxvY2F0aW9uRXhwcmVzc2lvbjpuZXcgei55LlgoMSwgMik+O1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIiIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSIiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBpbnNpZGUgYW4gaWYgc3RhdGVtZW50PiIKLQkpOwotfQotLyoKLSAqIENvbXBsZXRpb24gb24gYSBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIHdpdGggbm8gcXVhbGlmaWNhdGlvbiBhbmQgdXNpbmcgYSBxdWFsaWZpZWQgdHlwZSBuYW1lLgotICogCi0gKiBpZS4gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gJ25ldycgQ2xhc3NUeXBlICcoJyBBcmd1bWVudExpc3RvcHQgJyknIENsYXNzQm9keW9wdAotICoJCXdoZXJlIENsYXNzVHlwZSBpcyBhIHF1YWxpZmllZCB0eXBlIG5hbWUKLSAqLwotcHVibGljIHZvaWQgdGVzdE5vUXVhbGlmaWNhdGlvblF1YWxpZmllZFR5cGVOYW1lKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciB7CQkJCQkJCQlcbiIgKyAKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJXG4iICsKLQkJIgkJbmV3IHoueS5YKDEsIDIsIGkpOwkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCVxuIiArCi0JCSJ9XG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIlgoMSwgMiwiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbkFsbG9jYXRpb25FeHByZXNzaW9uOm5ldyB6LnkuWCgxLCAyKT4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uQWxsb2NhdGlvbkV4cHJlc3Npb246bmV3IHoueS5YKDEsIDIpPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIiIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSIiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBub24gcXVhbGlmaWVkIGluc3RhbmNlIGNyZWF0aW9uIHdpdGggcXVhbGlmaWVkIHR5cGUgbmFtZT4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0aW9uIG9uIGEgY29uc3RydWN0b3IgaW52b2NhdGlvbiB3aXRoIG5vIHF1YWxpZmljYXRpb24gYW5kIHVzaW5nIGEgc2ltcGxlIHR5cGUgbmFtZS4KLSAqIAotICogaWUuIENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gOjo9ICduZXcnIENsYXNzVHlwZSAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJyBDbGFzc0JvZHlvcHQKLSAqCQl3aGVyZSBDbGFzc1R5cGUgaXMgYSBzaW1wbGUgdHlwZSBuYW1lCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3ROb1F1YWxpZmljYXRpb25TaW1wbGVUeXBlTmFtZSgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJXG4iICsgCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCVxuIiArCi0JCSIJCW5ldyBYKDEsIDIsIGkpOwkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJYKDEsIDIsIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25BbGxvY2F0aW9uRXhwcmVzc2lvbjpuZXcgWCgxLCAyKT4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uQWxsb2NhdGlvbkV4cHJlc3Npb246bmV3IFgoMSwgMik+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIG5vbiBxdWFsaWZpZWQgaW5zdGFuY2UgY3JlYXRpb24gd2l0aCBzaW1wbGUgdHlwZSBuYW1lPiIKLQkpOwotfQotLyoKLSAqIENvbXBsZXRpb24gb24gYSBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIHF1YWxpZmllZCB3aXRoIGEgbmFtZS4KLSAqIAotICogaWUuIENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gOjo9IENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25OYW1lICduZXcnIFNpbXBsZU5hbWUgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScgQ2xhc3NCb2R5b3B0Ci0gKi8KLXB1YmxpYyB2b2lkIHRlc3RRdWFsaWZpZWRXaXRoTmFtZSgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQlcbiIgKwotCQkiCQlCdXoueC5uZXcgWCgxLCAyLCBpKTsJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCVxuIiArCi0JCSJ9XG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIlgoMSwgMiwiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPblF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uOkJ1ei54Lm5ldyBYKDEsIDIpPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbjpCdXoueC5uZXcgWCgxLCAyKT47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSIiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiIiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gbmFtZSBxdWFsaWZpZWQgaW5zdGFuY2UgY3JlYXRpb24+IgotCSk7Ci19Ci0vKgotICogQ29tcGxldGlvbiBvbiBhIGNvbnN0cnVjdG9yIGludm9jYXRpb24gcXVhbGlmaWVkIHdpdGggYSBwcmltYXJ5LgotICogCi0gKiBpZS4gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gUHJpbWFyeSAnLicgJ25ldycgU2ltcGxlTmFtZSAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJyBDbGFzc0JvZHlvcHQKLSAqLwotcHVibGljIHZvaWQgdGVzdFF1YWxpZmllZFdpdGhQcmltYXJ5KCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciB7CQkJCQkJCQlcbiIgKyAKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJXG4iICsKLQkJIgkJcHJpbWFyeSgpLm5ldyBYKDEsIDIsIGkpOwkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJYKDEsIDIsIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbjpwcmltYXJ5KCkubmV3IFgoMSwgMik+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPblF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uOnByaW1hcnkoKS5uZXcgWCgxLCAyKT47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSIiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiIiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gcHJpbWFyeSBxdWFsaWZpZWQgaW5zdGFuY2UgY3JlYXRpb24+IgotCSk7Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL0NsYXNzTGl0ZXJhbEFjY2Vzc0NvbXBsZXRpb25UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL0NsYXNzTGl0ZXJhbEFjY2Vzc0NvbXBsZXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MmE1NDEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3BhcnNlci9DbGFzc0xpdGVyYWxBY2Nlc3NDb21wbGV0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIucGFyc2VyOwotCi0vKioKLSAqIENvbXBsZXRpb24gaXMgZXhwZWN0ZWQgdG8gYmUgYSBDbGFzc0xpdGVyYWxBY2Nlc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc0xpdGVyYWxBY2Nlc3NDb21wbGV0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0Q29tcGxldGlvblRlc3QgewotcHVibGljIENsYXNzTGl0ZXJhbEFjY2Vzc0NvbXBsZXRpb25UZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotCXN1cGVyKHRlc3ROYW1lKTsKLX0KLS8qCi0gKiBDb21wbGV0aW9uIG9uIHRoZSBrZXl3b3JkICdjbGFzcycgb24gYW4gYXJyYXkgdHlwZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0QXJyYXlUeXBlKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDogCi0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQkJCVxuIiArCi0JCSIJCVN0cmluZ1tdLjsJCQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiU3RyaW5nW10uIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25DbGFzc0xpdGVyYWxBY2Nlc3M6U3RyaW5nW10uPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25DbGFzc0xpdGVyYWxBY2Nlc3M6U3RyaW5nW10uPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIiIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJTdHJpbmdbXS4iLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBhcnJheSB0eXBlIG1lbWJlcj4iCi0JKTsKLX0KLS8qCi0gKiBUZXN0IGFjY2VzcyB0byB0aGUga2V5d29yZCAnY2xhc3MnIG9uIGFuIGFycmF5IHR5cGUKLSAqIHdoZXJlIHRoZSBrZXl3b3JkIGlzIG5vbiBlbXB0eS4KLSAqLwotcHVibGljIHZvaWQgdGVzdEFycmF5VHlwZVdpdGhOb25FbXB0eUlkZW50aWZpZXIoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQkJXG4iICsKLQkJIgkJU3RyaW5nW10uY2xhc3M7CQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiU3RyaW5nW10uY2wiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbkNsYXNzTGl0ZXJhbEFjY2VzczpTdHJpbmdbXS5jbD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uQ2xhc3NMaXRlcmFsQWNjZXNzOlN0cmluZ1tdLmNsPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJImNsIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIlN0cmluZ1tdLmNsYXNzIiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gYXJyYXkgdHlwZSBtZW1iZXIgd2l0aCBub24gZW1wdHkgaWRlbnRpZmllcj4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0aW9uIG9uIHRoZSBrZXl3b3JkICdjbGFzcycgb24gYSBwcmltaXRpdmUgYXJyYXkgdHlwZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0UHJpbWl0aXZlQXJyYXlUeXBlKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDogCi0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQkJCVxuIiArCi0JCSIJCWludFtdLjsJCQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJImludFtdLiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uQ2xhc3NMaXRlcmFsQWNjZXNzOmludFtdLj4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uQ2xhc3NMaXRlcmFsQWNjZXNzOmludFtdLj47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSIiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiaW50W10uIiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gcHJpbWl0aXZlIGFycmF5IHR5cGUgbWVtYmVyPiIKLQkpOwotfQotLyoKLSAqIENvbXBsZXRpb24gb24gdGhlIGtleXdvcmQgJ2NsYXNzJyBvbiBhIHByaW1pdGl2ZSBhcnJheSB0eXBlIHdoZXJlIHRoZQotICoga2V5d29yZCBpcyBub24gZW1wdHkKLSAqLwotcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZUFycmF5VHlwZVdpdGhOb25FbXB0eUlkZW50aWZpZXIoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQkJXG4iICsKLQkJIgkJaW50W10uY2xhc3M7CQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiaW50W10uY2wiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbkNsYXNzTGl0ZXJhbEFjY2VzczppbnRbXS5jbD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uQ2xhc3NMaXRlcmFsQWNjZXNzOmludFtdLmNsPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJImNsIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJImludFtdLmNsYXNzIiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gcHJpbWl0aXZlIGFycmF5IHR5cGUgbWVtYmVyIHdpdGggbm9uIGVtcHR5IGlkZW50aWZpZXI+IgotCSk7Ci19Ci0vKgotICogQ29tcGxldGlvbiBvbiB0aGUga2V5d29yZCAnY2xhc3MnIG9uIGEgcHJpbWl0aXZlIHR5cGUKLSAqLwotcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZVR5cGUoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQkJXG4iICsKLQkJIgkJaW50LjsJCQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJImludC4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbkNsYXNzTGl0ZXJhbEFjY2VzczppbnQuPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25DbGFzc0xpdGVyYWxBY2Nlc3M6aW50Lj47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSIiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiaW50LiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIHByaW1pdGl2ZSB0eXBlIG1lbWJlcj4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0aW9uIG9uIHRoZSBrZXl3b3JkICdjbGFzcycgb24gYSBwcmltaXRpdmUgdHlwZSB3aGVyZSB0aGUKLSAqIGtleXdvcmQgaXMgbm9uIGVtcHR5Ci0gKi8KLXB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVUeXBlV2l0aE5vbkVtcHR5SWRlbnRpZmllcigpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6IAotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJCQlcbiIgKwotCQkiCQlpbnQuY2xhc3M7CQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJImludC5jbCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uQ2xhc3NMaXRlcmFsQWNjZXNzOmludC5jbD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uQ2xhc3NMaXRlcmFsQWNjZXNzOmludC5jbD47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJjbCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJpbnQuY2xhc3MiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBwcmltaXRpdmUgdHlwZSBtZW1iZXIgd2l0aCBub24gZW1wdHkgaWRlbnRpZmllcj4iCi0JKTsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvQ29tcGxldGlvblBhcnNlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvQ29tcGxldGlvblBhcnNlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNlOTExNC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL0NvbXBsZXRpb25QYXJzZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIucGFyc2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGUuKjsKLQotcHVibGljIGNsYXNzIENvbXBsZXRpb25QYXJzZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RDb21wbGV0aW9uVGVzdCB7Ci1wdWJsaWMgQ29tcGxldGlvblBhcnNlclRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0Jc3VwZXIodGVzdE5hbWUpOwotfQotcHVibGljIHZvaWQgdGVzdEEoKSB7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwYWNrYWdlIHA7IFxuIiArIAotCQkicHVibGljIGNsYXNzIEEge1xuIiArIAotCQkiCXB1YmxpYyB2b2lkIGZvbyhcbiIgKyAKLQkJIgkJamF2YS51dGlsLkxvY2FsZSwgXG4iICsgCi0JCSIJCWphdmEudXRpbC5WZWN0b3IpIHtcbiIgKyAKLQkJIgkJaW50IGk7XG4iICsgCi0JCSIJCWlmIChpIGluc3RhbmNlb2YgTykge1xuIiArIAotCQkiCQl9XG4iICsgCi0JCSIJCVN0cmluZyBzID0gXCJoZWxsb1wiO1xuIiArIAotCQkiCQlzLn1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIG1ldGhvZHMvZmllbGRzPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInMuIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpzLj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInMuIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIEEge1xuIiArIAotCQkiICBwdWJsaWMgQSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAge1xuIiArIAotCQkiICAgICAgaW50IGk7XG4iICsgCi0JCSIgICAgICBTdHJpbmcgcztcbiIgKyAKLQkJIiAgICAgIDxDb21wbGV0ZU9uTmFtZTpzLj47XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0QUFfMSgpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSJpbXBvcnQgc29tZXRoaW5nOyBcbiIgKyAKLQkJCSJpbXBvcnQgcDIuOyBcbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgQUEge1xuIiArIAotCQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKLQkJCSIJCWludCBtYXhVbml0cyA9IDA7XG4iICsgCi0JCQkiCQlmb3IgKGludCBpID0gMDsgXG4iICsgCi0JCQkiCQkJaSA8IG1heFVuaXRzOyBcbiIgKyAKLQkJCSIJCQlpKyspIHtcbiIgKyAKLQkJCSIJCQlDb21waWxhdGlvblVuaXRSZXN1bHQgdW5pdFJlc3VsdCA9IFxuIiArIAotCQkJIgkJCQluZXcgQ29tcGlsYXRpb25Vbml0UmVzdWx0KFxuIiArIAotCQkJIgkJCQkJbnVsbCwgXG4iICsgCi0JCQkiCQkJCQlpLCBcbiIgKyAKLQkJCSIJCQkJCW1heFVuaXRzKTsgXG4iICsgCi0JCQkiCQl9XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIm4iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOm4+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAibiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkiaW1wb3J0IHNvbWV0aGluZztcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBBQSB7XG4iICsgCi0JCSIgIHB1YmxpYyBBQSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBpbnQgbWF4VW5pdHM7XG4iICsgCi0JCSIgICAgaW50IGk7XG4iICsgCi0JCSIgICAge1xuIiArIAotCQkiICAgICAgQ29tcGlsYXRpb25Vbml0UmVzdWx0IHVuaXRSZXN1bHQgPSA8Q29tcGxldGVPbk5hbWU6bj47XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIm5ldyI7Ci0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBpbml0aWFsaXplciAobmV3KT4iOwotCi0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoIm5ldyBDb21waWxhdGlvblVuaXRSZXN1bHQoIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0QUFfMigpIHsKLQlTdHJpbmcgc3RyID0KLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJImltcG9ydCBzb21ldGhpbmc7IFxuIiArIAotCQkJImltcG9ydCBwMi47IFxuIiArIAotCQkJInB1YmxpYyBjbGFzcyBBQSB7XG4iICsgCi0JCQkiCXZvaWQgZm9vKCkge1xuIiArIAotCQkJIgkJaW50IG1heFVuaXRzID0gMDtcbiIgKyAKLQkJCSIJCWZvciAoaW50IGkgPSAwOyBcbiIgKyAKLQkJCSIJCQlpIDwgbWF4VW5pdHM7IFxuIiArIAotCQkJIgkJCWkrKykge1xuIiArIAotCQkJIgkJCUNvbXBpbGF0aW9uVW5pdFJlc3VsdCB1bml0UmVzdWx0ID0gXG4iICsgCi0JCQkiCQkJCW5ldyBDb21waWxhdGlvblVuaXRSZXN1bHQoXG4iICsgCi0JCQkiCQkJCQludWxsLCBcbiIgKyAKLQkJCSIJCQkJCWksIFxuIiArIAotCQkJIgkJCQkJbWF4VW5pdHMpOyBcbiIgKyAKLQkJCSIJCX1cbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIG1ldGhvZCBjYWxsIGFyZ3VtZW50PiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIm4iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOm4+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAibiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAibnVsbCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoIm51bGwsICIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJImltcG9ydCBzb21ldGhpbmc7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgQUEge1xuIiArIAotCQkiICBwdWJsaWMgQUEoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgaW50IG1heFVuaXRzO1xuIiArIAotCQkiICAgIGludCBpO1xuIiArIAotCQkiICAgIHtcbiIgKyAKLQkJIiAgICAgIENvbXBpbGF0aW9uVW5pdFJlc3VsdCB1bml0UmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uVW5pdFJlc3VsdCg8Q29tcGxldGVPbk5hbWU6bj4pO1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdEFBXzMoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkiaW1wb3J0IHNvbWV0aGluZzsgXG4iICsgCi0JCQkiaW1wb3J0IHAyLjsgXG4iICsgCi0JCQkicHVibGljIGNsYXNzIEFBIHtcbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQlpbnQgbWF4VW5pdHMgPSAwO1xuIiArIAotCQkJIgkJZm9yIChpbnQgaSA9IDA7IFxuIiArIAotCQkJIgkJCWkgPCBtYXhVbml0czsgXG4iICsgCi0JCQkiCQkJaSsrKSB7XG4iICsgCi0JCQkiCQkJQ29tcGlsYXRpb25Vbml0UmVzdWx0IHVuaXRSZXN1bHQgPSBcbiIgKyAKLQkJCSIJCQkJbmV3IENvbXBpbGF0aW9uVW5pdFJlc3VsdChcbiIgKyAKLQkJCSIJCQkJCW51bGwsIFxuIiArIAotCQkJIgkJCQkJaSwgXG4iICsgCi0JCQkiCQkJCQltYXhVbml0cyk7IFxuIiArIAotCQkJIgkJfVxuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gY2FsbCB0byBjb25zdHJ1Y3RvciBhcmd1bWVudD4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTppPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImkiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImkiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJpLCAiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJpbXBvcnQgc29tZXRoaW5nO1xuIiArIAotCQkicHVibGljIGNsYXNzIEFBIHtcbiIgKyAKLQkJIiAgcHVibGljIEFBKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIGludCBtYXhVbml0cztcbiIgKyAKLQkJIiAgICBpbnQgaTtcbiIgKyAKLQkJIiAgICB7XG4iICsgCi0JCSIgICAgICBDb21waWxhdGlvblVuaXRSZXN1bHQgdW5pdFJlc3VsdCA9IG5ldyBDb21waWxhdGlvblVuaXRSZXN1bHQobnVsbCwgPENvbXBsZXRlT25OYW1lOmk+KTtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RBQV80KCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJImltcG9ydCBzb21ldGhpbmc7IFxuIiArIAotCQkJImltcG9ydCBwMi47IFxuIiArIAotCQkJInB1YmxpYyBjbGFzcyBBQSB7XG4iICsgCi0JCQkiCXZvaWQgZm9vKCkge1xuIiArIAotCQkJIgkJaW50IG1heFVuaXRzID0gMDtcbiIgKyAKLQkJCSIJCWZvciAoaW50IGkgPSAwOyBcbiIgKyAKLQkJCSIJCQlpIDwgbWF4VW5pdHM7IFxuIiArIAotCQkJIgkJCWkrKykge1xuIiArIAotCQkJIgkJCUNvbXBpbGF0aW9uVW5pdFJlc3VsdCB1bml0UmVzdWx0ID0gXG4iICsgCi0JCQkiCQkJCW5ldyBDb21waWxhdGlvblVuaXRSZXN1bHQoXG4iICsgCi0JCQkiCQkJCQludWxsLCBcbiIgKyAKLQkJCSIJCQkJCWksIFxuIiArIAotCQkJIgkJCQkJbWF4VW5pdHMpOyBcbiIgKyAKLQkJCSIJCX1cbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIGNvbnN0cnVjdG9yIGNhbGwgYXJndW1lbnQ+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibWF4IjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTptYXg+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAibWF4IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJtYXhVbml0cyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoIm1heFVuaXRzKTsgIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkiaW1wb3J0IHNvbWV0aGluZztcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBBQSB7XG4iICsgCi0JCSIgIHB1YmxpYyBBQSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBpbnQgbWF4VW5pdHM7XG4iICsgCi0JCSIgICAgaW50IGk7XG4iICsgCi0JCSIgICAge1xuIiArIAotCQkiICAgICAgQ29tcGlsYXRpb25Vbml0UmVzdWx0IHVuaXRSZXN1bHQgPSBuZXcgQ29tcGlsYXRpb25Vbml0UmVzdWx0KG51bGwsIGksIDxDb21wbGV0ZU9uTmFtZTptYXg+KTtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RBQl8xRkhVOUxVKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJIi8qKlxuIiArIAotCQkJIiAqIDFGSFU5TFVcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSJjbGFzcyBTdXBlckNsYXNzIHtcbiIgKyAKLQkJCSIJc3RhdGljIHZvaWQgZUZvb1N0YXRpYygpIHtcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIgl2b2lkIGVGb28oKSB7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSJ9XG4iICsgCi0JCQkicHVibGljIGNsYXNzIEFCXG4iICsgCi0JCQkiCWV4dGVuZHMgU3VwZXJDbGFzcyB7XG4iICsgCi0JCQkiCXZvaWQgZUJhcigpIHtcbiIgKyAKLQkJCSIJCXN1cGVyLmVGb28oKTtcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIG1ldGhvZHMvZmllbGRzIGZyb20gc3VwZXIgY2xhc3M+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3VwZXIuIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOnN1cGVyLj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInN1cGVyLiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJImNsYXNzIFN1cGVyQ2xhc3Mge1xuIiArIAotCQkiICBTdXBlckNsYXNzKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHN0YXRpYyB2b2lkIGVGb29TdGF0aWMoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBlRm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgQUIgZXh0ZW5kcyBTdXBlckNsYXNzIHtcbiIgKyAKLQkJIiAgcHVibGljIEFCKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZUJhcigpIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk1lbWJlckFjY2VzczpzdXBlci4+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0QUNfMUZKOEQ5Wl8xKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJIi8qKlxuIiArIAotCQkJIiAqIDFGSjhEOVpcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSJpbXBvcnQgamF2YS5pby4qO1xuIiArIAotCQkJInB1YmxpYyBjbGFzcyBBQyB7XG4iICsgCi0JCQkiCUFDKCkge1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkiCUFDKGludCBpKSB7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSIJQUMoaW50IGksIFN0cmluZyBzKSB7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQluZXcgQUMobmV3IEZpbGUoXG4iICsgCi0JCQkiCQkJbmV3IGphdmFcbiIgKyAKLQkJCSIJCQkudXRpbFxuIiArIAotCQkJIgkJCS5WZWN0b3IofVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIGNvbnN0cnVjdG9yIGFyZ3VtZW50PiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIm5ldyBBQygiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25BbGxvY2F0aW9uRXhwcmVzc2lvbjpuZXcgQUMoKT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJImltcG9ydCBqYXZhLmlvLio7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgQUMge1xuIiArIAotCQkiICBBQygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBBQyhpbnQgaSkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIEFDKGludCBpLCBTdHJpbmcgcykge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uQWxsb2NhdGlvbkV4cHJlc3Npb246bmV3IEFDKCk+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0QUNfMUZKOEQ5Wl8yKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJIi8qKlxuIiArIAotCQkJIiAqIDFGSjhEOVpcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSJpbXBvcnQgamF2YS5pby4qO1xuIiArIAotCQkJInB1YmxpYyBjbGFzcyBBQyB7XG4iICsgCi0JCQkiCUFDKCkge1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkiCUFDKGludCBpKSB7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSIJQUMoaW50IGksIFN0cmluZyBzKSB7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQluZXcgQUMobmV3IEZpbGUoXG4iICsgCi0JCQkiCQkJbmV3IGphdmFcbiIgKyAKLQkJCSIJCQkudXRpbFxuIiArIAotCQkJIgkJCS5WZWN0b3IofVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIGNvbnN0cnVjdG9yIGFyZ3VtZW50PiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIm5ldyBGaWxlKCI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbkFsbG9jYXRpb25FeHByZXNzaW9uOm5ldyBGaWxlKCk+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICIiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJpbXBvcnQgamF2YS5pby4qO1xuIiArIAotCQkicHVibGljIGNsYXNzIEFDIHtcbiIgKyAKLQkJIiAgQUMoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgQUMoaW50IGkpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBBQyhpbnQgaSwgU3RyaW5nIHMpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbkFsbG9jYXRpb25FeHByZXNzaW9uOm5ldyBGaWxlKCk+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0QUNfMUZKOEQ5Wl8zKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJIi8qKlxuIiArIAotCQkJIiAqIDFGSjhEOVpcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSJpbXBvcnQgamF2YS5pby4qO1xuIiArIAotCQkJInB1YmxpYyBjbGFzcyBBQyB7XG4iICsgCi0JCQkiCUFDKCkge1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkiCUFDKGludCBpKSB7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSIJQUMoaW50IGksIFN0cmluZyBzKSB7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQluZXcgQUMobmV3IEZpbGUoXG4iICsgCi0JCQkiCQkJbmV3IGphdmEudXRpbC5WZWN0b3IofVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIGNvbnN0cnVjdG9yIGFyZ3VtZW50PiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIm5ldyBqYXZhLnV0aWwuVmVjdG9yKCI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbkFsbG9jYXRpb25FeHByZXNzaW9uOm5ldyBqYXZhLnV0aWwuVmVjdG9yKCk+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICIiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJpbXBvcnQgamF2YS5pby4qO1xuIiArIAotCQkicHVibGljIGNsYXNzIEFDIHtcbiIgKyAKLQkJIiAgQUMoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgQUMoaW50IGkpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBBQyhpbnQgaSwgU3RyaW5nIHMpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbkFsbG9jYXRpb25FeHByZXNzaW9uOm5ldyBqYXZhLnV0aWwuVmVjdG9yKCk+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0QigpIHsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7IFxuIiArIAotCQkicHVibGljIGNsYXNzIEIge1xuIiArIAotCQkiCU9iamVjdCBvID0gbmV3IE9iamVjdCB9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiB0eXBlIGludG8gdHlwZSBjcmVhdGlvbj4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuZXcgT2JqZWN0IjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpPYmplY3Q+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiT2JqZWN0IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJPYmplY3QiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgQiB7XG4iICsgCi0JCSIgIE9iamVjdCBvID0gbmV3IDxDb21wbGV0ZU9uVHlwZTpPYmplY3Q+KCk7XG4iICsgCi0JCSIgIHB1YmxpYyBCKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdEJBXzEoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkicHVibGljIGNsYXNzIEJBIHtcbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQlqYXZhLnV0aWwuVmVjdG9yIHYyO1xuIiArIAotCQkJIgkJamF2YS51dGlsLlZlY3RvciB2MTtcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIHBhY2thZ2UgbmFtZT4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJqYXZhLiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6amF2YS4+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJqYXZhLiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBCQSB7XG4iICsgCi0JCSIgIHB1YmxpYyBCQSgpIHtcbiIgKyAKLQotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpqYXZhLj47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RCQV8yKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJInB1YmxpYyBjbGFzcyBCQSB7XG4iICsgCi0JCQkiCXZvaWQgZm9vKCkge1xuIiArIAotCQkJIgkJamF2YS51dGlsLlZlY3RvciB2MjtcbiIgKyAKLQkJCSIJCWphdmEudXRpbC5WZWN0b3IgdjE7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBwYWNrYWdlIGNvbnRlbnRzPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImphdmEudXRpbC4iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmphdmEudXRpbC4+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJqYXZhLnV0aWwuIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIEJBIHtcbiIgKyAKLQkJIiAgcHVibGljIEJBKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpqYXZhLnV0aWwuPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdEJCXzFGSEo4SDkoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkiLyoqXG4iICsgCi0JCQkiICogMUZISjhIOVxuIiArIAotCQkJIiAqL1xuIiArIAotCQkJInB1YmxpYyBjbGFzcyBCQiB7XG4iICsgCi0JCQkiCXZvaWQgYmFyKCkge1xuIiArIAotCQkJIgkJZiB9XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbWV0aG9kL2ZpZWxkIGZyb20gaW1wbGljaXQgbWV0aG9kIGNhbGw+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6Zj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJmIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJmIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIEJCIHtcbiIgKyAKLQkJIiAgcHVibGljIEJCKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgYmFyKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpmPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdEJDXzFGSjRHU0dfMSgpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSIvKipcbiIgKyAKLQkJCSIgKiAxRko0R1NHXG4iICsgCi0JCQkiICovXG4iICsgCi0JCQkiaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7XG4iICsgCi0JCQkicHVibGljIGNsYXNzIEJDIHtcbiIgKyAKLQkJCSIJaW50IFZhbHVlMSA9IDA7XG4iICsgCi0JCQkiCWludGVyZmFjZSBDb25zdGFudHMge1xuIiArIAotCQkJIgkJaW50IE9LID0gMTtcbiIgKyAKLQkJCSIJCWludCBDQU5DRUwgPSAyO1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkiCXZvaWQgZm9vKCkge1xuIiArIAotCQkJIgkJVmVjdG9yIHYgPSBcbiIgKyAKLQkJCSIJCQluZXcgVmVjdG9yKFxuIiArIAotCQkJIgkJCQlWYWx1ZTEsIFxuIiArIAotCQkJIgkJCQlCQy5Db25zdGFudHMuT0tcbiIgKyAKLQkJCSIJCQkJCXwgQkMuQ29uc3RhbnRzLkNBTkNFTCk7IFxuIiArIAotCQkJIgkJT2JqZWN0IGFucyA9IHYuZWxlbWVudEF0KDEpO1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbWVtYmVyIHR5cGU+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiQkMuIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpCQy4+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJCQy4iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJpbXBvcnQgamF2YS51dGlsLlZlY3RvcjtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBCQyB7XG4iICsgCi0JCSIgIGludGVyZmFjZSBDb25zdGFudHMge1xuIiArIAotCQkiICAgIGludCBPSztcbiIgKyAKLQkJIiAgICBpbnQgQ0FOQ0VMO1xuIiArIAotCQkiICAgIDxjbGluaXQ+KCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgVmFsdWUxO1xuIiArIAotCQkiICBwdWJsaWMgQkMoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKFZhbHVlMSwgPENvbXBsZXRlT25OYW1lOkJDLj4pO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0QkNfMUZKNEdTR18yKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJIi8qKlxuIiArIAotCQkJIiAqIDFGSjRHU0dcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSJpbXBvcnQgamF2YS51dGlsLlZlY3RvcjtcbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgQkMge1xuIiArIAotCQkJIglpbnQgVmFsdWUxID0gMDtcbiIgKyAKLQkJCSIJaW50ZXJmYWNlIENvbnN0YW50cyB7XG4iICsgCi0JCQkiCQlpbnQgT0sgPSAxO1xuIiArIAotCQkJIgkJaW50IENBTkNFTCA9IDI7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQlWZWN0b3IgdiA9IFxuIiArIAotCQkJIgkJCW5ldyBWZWN0b3IoXG4iICsgCi0JCQkiCQkJCVZhbHVlMSwgXG4iICsgCi0JCQkiCQkJCUJDLkNvbnN0YW50cy5PS1xuIiArIAotCQkJIgkJCQkJfCBCQy5Db25zdGFudHMuQ0FOQ0VMKTsgXG4iICsgCi0JCQkiCQlPYmplY3QgYW5zID0gdi5lbGVtZW50QXQoMSk7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBtZW1iZXIgdHlwZSBtZXRob2QvZmllbGQ+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAifCBCQy5Db25zdGFudHMuIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpCQy5Db25zdGFudHMuPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiQkMuQ29uc3RhbnRzLiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJImltcG9ydCBqYXZhLnV0aWwuVmVjdG9yO1xuIiArIAotCQkicHVibGljIGNsYXNzIEJDIHtcbiIgKyAKLQkJIiAgaW50ZXJmYWNlIENvbnN0YW50cyB7XG4iICsgCi0JCSIgICAgaW50IE9LO1xuIiArIAotCQkiICAgIGludCBDQU5DRUw7XG4iICsgCi0JCSIgICAgPGNsaW5pdD4oKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBWYWx1ZTE7XG4iICsgCi0JCSIgIHB1YmxpYyBCQygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBWZWN0b3IgdiA9IChCQy5Db25zdGFudHMuT0sgfCA8Q29tcGxldGVPbk5hbWU6QkMuQ29uc3RhbnRzLj4pO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0QkNfMUZKNEdTR18zKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJIi8qKlxuIiArIAotCQkJIiAqIDFGSjRHU0dcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSJpbXBvcnQgamF2YS51dGlsLlZlY3RvcjtcbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgQkMge1xuIiArIAotCQkJIglpbnQgVmFsdWUxID0gMDtcbiIgKyAKLQkJCSIJaW50ZXJmYWNlIENvbnN0YW50cyB7XG4iICsgCi0JCQkiCQlpbnQgT0sgPSAxO1xuIiArIAotCQkJIgkJaW50IENBTkNFTCA9IDI7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQlWZWN0b3IgdiA9IFxuIiArIAotCQkJIgkJCW5ldyBWZWN0b3IoXG4iICsgCi0JCQkiCQkJCVZhbHVlMSwgXG4iICsgCi0JCQkiCQkJCUJDLkNvbnN0YW50cy5PS1xuIiArIAotCQkJIgkJCQkJfCBCQy5Db25zdGFudHMuQ0FOQ0VMKTsgXG4iICsgCi0JCQkiCQlPYmplY3QgYW5zID0gdi5lbGVtZW50QXQoMSk7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBtZXRob2QvZmllbGQ+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidi4iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnYuPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidi4iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJpbXBvcnQgamF2YS51dGlsLlZlY3RvcjtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBCQyB7XG4iICsgCi0JCSIgIGludGVyZmFjZSBDb25zdGFudHMge1xuIiArIAotCQkiICAgIGludCBPSztcbiIgKyAKLQkJIiAgICBpbnQgQ0FOQ0VMO1xuIiArIAotCQkiICAgIDxjbGluaXQ+KCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgVmFsdWUxO1xuIiArIAotCQkiICBwdWJsaWMgQkMoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgVmVjdG9yIHY7XG4iICsgCi0JCSIgICAgT2JqZWN0IGFucyA9IDxDb21wbGV0ZU9uTmFtZTp2Lj47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RDKCkgewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgQyB7XG4iICsgCi0JCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCSIJCVN0cmluZyBzdHJpbmcgPSBuO1xuIiArIAotCQkiCX1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiPSBuIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpuPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIm4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBDIHtcbiIgKyAKLQkJIiAgcHVibGljIEMoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgU3RyaW5nIHN0cmluZyA9IDxDb21wbGV0ZU9uTmFtZTpuPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJuIjsKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIGxvY2FsIHZhcmlhYmxlIGluaXRpYWxpemVyPiI7Ci0KLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0Q0FfMUZHUEpRWigpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSJpbXBvcnQgcDIuWDsgXG4iICsgCi0JCQkiLyoqXG4iICsgCi0JCQkiICogMUZHUEpRWlxuIiArIAotCQkJIiAqL1xuIiArIAotCQkJInB1YmxpYyBjbGFzcyBDQSB7XG4iICsgCi0JCQkiCXZvaWQgbW9vKCkge1xuIiArIAotCQkJIgkJdW5rbm93bkZpZWxkLn1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBtZXRob2QvZmllbGQ+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidW5rbm93bkZpZWxkLiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6dW5rbm93bkZpZWxkLj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInVua25vd25GaWVsZC4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJImltcG9ydCBwMi5YO1xuIiArIAotCQkicHVibGljIGNsYXNzIENBIHtcbiIgKyAKLQkJIiAgcHVibGljIENBKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgbW9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTp1bmtub3duRmllbGQuPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RDQl8xRkhTS1E5XzEoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkiLyoqXG4iICsgCi0JCQkiICogMUZIU0tROVxuIiArIAotCQkJIiAqL1xuIiArIAotCQkJInB1YmxpYyBjbGFzcyBDQiB7XG4iICsgCi0JCQkiCXZvaWQgZm9vKCkge1xuIiArIAotCQkJIgkJaW50IGkgPSAwO1xuIiArIAotCQkJIgkJaW50W10gdGFiMSA9IG5ldyBpbnRbMTBdO1xuIiArIAotCQkJIgkJaW50IGogPSB0YWIxW2ldO1xuIiArIAotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKFxuIiArIAotCQkJIgkJCVwiIFwiICsgKGkgKyAxKSk7IFxuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbWV0aG9kIGNhbGwgYXJndW1lbnQ+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiKyAoaSI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6aT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJpIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJpIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIENCIHtcbiIgKyAKLQkJIiAgcHVibGljIENCKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIGludCBpO1xuIiArIAotCQkiICAgIGludFtdIHRhYjE7XG4iICsgCi0JCSIgICAgaW50IGo7XG4iICsgCi0JCSIgICAgKFwiIFwiICsgPENvbXBsZXRlT25OYW1lOmk+KTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdENCXzFGSFNLUTlfMigpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSIvKipcbiIgKyAKLQkJCSIgKiAxRkhTS1E5XG4iICsgCi0JCQkiICovXG4iICsgCi0JCQkicHVibGljIGNsYXNzIENCIHtcbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQlpbnQgaSA9IDA7XG4iICsgCi0JCQkiCQlpbnRbXSB0YWIxID0gbmV3IGludFsxMF07XG4iICsgCi0JCQkiCQlpbnQgaiA9IHRhYjFbaV07XG4iICsgCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oXG4iICsgCi0JCQkiCQkJXCIgXCIgKyAoaSArIDEpKTsgXG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImkgKyAxIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gTk9ORTsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9IG51bGw7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSBOT05FOwotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gZGlnaXQgaW50byBtZXRob2QgY2FsbCBhcmd1bWVudD4iOwotCi0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JdHJ5IHsKLQkJY2hlY2tNZXRob2RQYXJzZSgKLQkJCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJCWN1cnNvckxvY2F0aW9uLCAKLQkJCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCQl0ZXN0TmFtZSk7IAotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gZGV0ZWN0IGludmFsaWQgY3Vyc29yIGxvY2F0aW9uIiwgZmFsc2UpOwkJCi0JfSBjYXRjaChJbnZhbGlkQ3Vyc29yTG9jYXRpb24gZSl7Ci0JCWFzc2VydEVxdWFscygiaW52YWxpZCBjdXJzb3IgbG9jYXRpb246ICIsIGUuaXJyaXRhbnQsIEludmFsaWRDdXJzb3JMb2NhdGlvbi5OT19DT01QTEVUSU9OX0lOU0lERV9OVU1CRVIpOwotCX0KLX0KLXB1YmxpYyB2b2lkIHRlc3RDQ18xRko2NEk5KCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJIi8qKlxuIiArIAotCQkJIiAqIDFGSjY0STlcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSJjbGFzcyBDQ0hlbHBlciB7XG4iICsgCi0JCQkiCWNsYXNzIE1lbWJlcjEge1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkiCWNsYXNzIE1lbWJlcjIge1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkiCXZvaWQgZm9vKCkge1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIiArIAotCQkJInB1YmxpYyBjbGFzcyBDQyB7XG4iICsgCi0JCQkiCXZvaWQgZm9vKCkge1xuIiArIAotCQkJIgkJbmV3IENDSGVscGVyKClcbiIgKyAKLQkJCSIJCQkubmV3IENDSGVscGVyKClcbiIgKyAKLQkJCSIJCQkubmV3IE0gfVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIHF1YWxpZmllZCBtZW1iZXIgdHlwZT4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICIubmV3IE0iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOk0+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiTSI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiTSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJImNsYXNzIENDSGVscGVyIHtcbiIgKyAKLQkJIiAgY2xhc3MgTWVtYmVyMSB7XG4iICsgCi0JCSIgICAgTWVtYmVyMSgpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgY2xhc3MgTWVtYmVyMiB7XG4iICsgCi0JCSIgICAgTWVtYmVyMigpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgQ0NIZWxwZXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBDQyB7XG4iICsgCi0JCSIgIHB1YmxpYyBDQygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBuZXcgQ0NIZWxwZXIoKS5uZXcgQ0NIZWxwZXIoKS5uZXcgPENvbXBsZXRlT25UeXBlOk0+KCk7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3REXzEoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBEIHtcbiIgKyAKLQkJIglzdGF0aWMgaW50IGk7XG4iICsgCi0JCSIJc3RhdGljIHtcbiIgKyAKLQkJIgkJaSA9IDU7XG4iICsgCi0JCSIJfVxuIiArIAotCQkiCXB1YmxpYyBpbnQgajtcbiIgKyAKLQkJIglWZWN0b3IgYSA9IG5ldyBWZWN0b3IoKTtcbiIgKyAKLQkJIgl2b2lkIGZvbyhTdHJpbmcgcykge1xuIiArIAotCQkiCQlTdHJpbmcgc3RyaW5nID0gbnVsbDtcbiIgKyAKLQkJIgkJaW50IHNvc287XG4iICsgCi0JCSIJCWZsb2F0IGY7XG4iICsgCi0JCSIJCXN0cmluZy5yZWdpb25NYXRjaGVzKFxuIiArIAotCQkiCQkJMCwgXG4iICsgCi0JCSIJCQlcIlwiLCBcbiIgKyAKLQkJIgkJCTAsIFxuIiArIAotCQkiCQkJMCk7IFxuIiArIAotCQkiCX1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIHZhcmlhYmxlIGludG8gdHlwZSBpbml0aWFsaXplcj4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTppPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImkiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImkiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJpID0gNTsiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgRCB7XG4iICsgCi0JCSIgIHN0YXRpYyBpbnQgaTtcbiIgKyAKLQkJIiAgc3RhdGljIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6aT47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIGludCBqO1xuIiArIAotCQkiICBWZWN0b3IgYTtcbiIgKyAKLQkJIiAgPGNsaW5pdD4oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIEQoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oU3RyaW5nIHMpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdERfMigpIHsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7IFxuIiArIAotCQkiaW1wb3J0IGphdmEudXRpbC4qO1xuIiArIAotCQkicHVibGljIGNsYXNzIEQge1xuIiArIAotCQkiCXN0YXRpYyBpbnQgaTtcbiIgKyAKLQkJIglzdGF0aWMge1xuIiArIAotCQkiCQlpID0gNTtcbiIgKyAKLQkJIgl9XG4iICsgCi0JCSIJcHVibGljIGludCBqO1xuIiArIAotCQkiCVZlY3RvciBhID0gbmV3IFZlY3RvcigpO1xuIiArIAotCQkiCXZvaWQgZm9vKFN0cmluZyBzKSB7XG4iICsgCi0JCSIJCVN0cmluZyBzdHJpbmcgPSBudWxsO1xuIiArIAotCQkiCQlpbnQgc29zbztcbiIgKyAKLQkJIgkJZmxvYXQgZjtcbiIgKyAKLQkJIgkJc3RyaW5nLnJlZ2lvbk1hdGNoZXMoXG4iICsgCi0JCSIJCQkwLCBcbiIgKyAKLQkJIgkJCVwiXCIsIFxuIiArIAotCQkiCQkJMCwgXG4iICsgCi0JCSIJCQkwKTsgXG4iICsgCi0JCSIJfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbWV0aG9kL2ZpZWxkPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInN0cmluZy4iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnN0cmluZy4+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJzdHJpbmcuIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgRCB7XG4iICsgCi0JCSIgIHN0YXRpYyBpbnQgaTtcbiIgKyAKLQkJIiAgc3RhdGljIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgaW50IGo7XG4iICsgCi0JCSIgIFZlY3RvciBhO1xuIiArIAotCQkiICA8Y2xpbml0PigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgRCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbyhTdHJpbmcgcykge1xuIiArIAotCQkiICAgIFN0cmluZyBzdHJpbmc7XG4iICsgCi0JCSIgICAgaW50IHNvc287XG4iICsgCi0JCSIgICAgZmxvYXQgZjtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6c3RyaW5nLj47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0REFfMSgpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgREEge1xuIiArIAotCQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKLQkJCSIJCW5ldyBUZXN0Q2FzZShcImVycm9yXCIpIHtcbiIgKyAKLQkJCSIJCQlwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkge1xuIiArIAotCQkJIgkJCQlWZWN0b3IgdjExMTExID0gbmV3IFZlY3RvcigpO1xuIiArIAotCQkJIgkJCQl2IH1cbiIgKyAKLQkJCSIJCX07XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBtZXRob2QvZmllbGQgaW50byBhbm9ueW1vdXMgZGVjbGFyYXRpb24+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6dj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ2IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ2IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigidiB9IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIERBIHtcbiIgKyAKLQkJIiAgcHVibGljIERBKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIG5ldyBUZXN0Q2FzZShcImVycm9yXCIpIHtcbiIgKyAKLQkJIiAgICAgICgpIHtcbiIgKyAKLQkJIiAgICAgIH1cbiIgKyAKLQkJIiAgICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB7XG4iICsgCi0JCSIgICAgICAgIFZlY3RvciB2MTExMTE7XG4iICsgCi0JCSIgICAgICAgIDxDb21wbGV0ZU9uTmFtZTp2PjtcbiIgKyAKLQkJIiAgICAgIH1cbiIgKyAKLQkJIiAgICB9O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0REFfMigpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgREEge1xuIiArIAotCQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKLQkJCSIJCW5ldyBUZXN0Q2FzZShcImVycm9yXCIpIHtcbiIgKyAKLQkJCSIJCQlwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkge1xuIiArIAotCQkJIgkJCQlWZWN0b3IgdjExMTExID0gbmV3IFZlY3RvcigpO1xuIiArIAotCQkJIgkJCQl2IH1cbiIgKyAKLQkJCSIJCX07XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInByb3RlY3RlZCB2IjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTp2PiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInYiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBEQSB7XG4iICsgCi0JCSIgIHB1YmxpYyBEQSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBuZXcgVGVzdENhc2UoXCJlcnJvclwiKSB7XG4iICsgCi0JCSIgICAgICA8Q29tcGxldGVPblR5cGU6dj47XG4iICsgCi0JCSIgICAgICAoKSB7XG4iICsgCi0JCSIgICAgICB9XG4iICsgCi0JCSIgICAgICBydW5UZXN0KCkge1xuIiArIAotCQkiICAgICAgfVxuIiArIAotCQkiICAgIH07XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidm9pZCI7Ci0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiByZXR1cm4gdHlwZSBpbnRvIGFub255bW91cyBkZWNsYXJhdGlvbj4iOwotCi0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdERBXzMoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkicHVibGljIGNsYXNzIERBIHtcbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQluZXcgVGVzdENhc2UoXCJlcnJvclwiKSB7XG4iICsgCi0JCQkiCQkJcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHtcbiIgKyAKLQkJCSIJCQkJVmVjdG9yIHYxMTExMSA9IG5ldyBWZWN0b3IoKTtcbiIgKyAKLQkJCSIJCQkJdiB9XG4iICsgCi0JCQkiCQl9O1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbWV0aG9kIHNlbGVjdG9yIGludG8gYW5vbnltb3VzIGRlY2xhcmF0aW9uPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInIiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25GaWVsZE5hbWU6dm9pZCByPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInJ1blRlc3QiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJydW5UZXN0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIERBIHtcbiIgKyAKLQkJIiAgcHVibGljIERBKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIG5ldyBUZXN0Q2FzZShcImVycm9yXCIpIHtcbiIgKyAKLQkJIiAgICAgIDxDb21wbGV0ZU9uRmllbGROYW1lOnZvaWQgcj47XG4iICsgCi0JCSIgICAgICB7XG4iICsgCi0JCSIgICAgICB9XG4iICsgCi0JCSIgICAgICAoKSB7XG4iICsgCi0JCSIgICAgICB9XG4iICsgCi0JCSIgICAgfTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdERBXzQoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkicHVibGljIGNsYXNzIERBIHtcbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQluZXcgVGVzdENhc2UoXCJlcnJvclwiKSB7XG4iICsgCi0JCQkiCQkJcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHtcbiIgKyAKLQkJCSIJCQkJVmVjdG9yIHYxMTExMSA9IG5ldyBWZWN0b3IoKTtcbiIgKyAKLQkJCSIJCQkJdiB9XG4iICsgCi0JCQkiCQl9O1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbG9jYWwgdmFyaWFibGUgdHlwZSBpbnRvIGFub255bW91cyBkZWNsYXJhdGlvbj4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJWIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpWPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIlYiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIlZlY3RvciI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoIlZlY3RvciB2MTExMTEiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgREEge1xuIiArIAotCQkiICBwdWJsaWMgREEoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgbmV3IFRlc3RDYXNlKFwiZXJyb3JcIikge1xuIiArIAotCQkiICAgICAgKCkge1xuIiArIAotCQkiICAgICAgfVxuIiArIAotCQkiICAgICAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHtcbiIgKyAKLQkJIiAgICAgICAgPENvbXBsZXRlT25OYW1lOlY+O1xuIiArIAotCQkiICAgICAgfVxuIiArIAotCQkiICAgIH07XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3REQV81KCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJInB1YmxpYyBjbGFzcyBEQSB7XG4iICsgCi0JCQkiCXZvaWQgZm9vKCkge1xuIiArIAotCQkJIgkJbmV3IFRlc3RDYXNlKFwiZXJyb3JcIikge1xuIiArIAotCQkJIgkJCXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB7XG4iICsgCi0JCQkiCQkJCVZlY3RvciB2MTExMTEgPSBuZXcgVmVjdG9yKCk7XG4iICsgCi0JCQkiCQkJCXYgfVxuIiArIAotCQkJIgkJfTtcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIGxvY2FsIHR5cGUgaW50byBhbm9ueW1vdXMgZGVjbGFyYXRpb24+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6dj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ2IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ2IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigidiB9IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIERBIHtcbiIgKyAKLQkJIiAgcHVibGljIERBKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIG5ldyBUZXN0Q2FzZShcImVycm9yXCIpIHtcbiIgKyAKLQkJIiAgICAgICgpIHtcbiIgKyAKLQkJIiAgICAgIH1cbiIgKyAKLQkJIiAgICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB7XG4iICsgCi0JCSIgICAgICAgIFZlY3RvciB2MTExMTE7XG4iICsgCi0JCSIgICAgICAgIDxDb21wbGV0ZU9uTmFtZTp2PjtcbiIgKyAKLQkJIiAgICAgIH1cbiIgKyAKLQkJIiAgICB9O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0REJfMUZIU0xEUigpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSIvKipcbiIgKyAKLQkJCSIgKiAxRkhTTERSXG4iICsgCi0JCQkiICovXG4iICsgCi0JCQkicHVibGljIGNsYXNzIERCIHtcbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQl0cnkge1xuIiArIAotCQkJIgkJCVN5c3RlbS5vdXQucHJpbnRsbihcIlwiKTtcbiIgKyAKLQkJCSIJCX1cbiIgKyAKLQkJCSIJCWZpIH1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBmaW5hbGx5IGtleXdvcmQ+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZmkiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmZpPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImZpIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJmaSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoImZpIH0iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgREIge1xuIiArIAotCQkiICBwdWJsaWMgREIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25LZXl3b3JkOmZpPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdERDXzFGSkowSlJfMSgpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSIvKipcbiIgKyAKLQkJCSIgKiAxRkpKMEpSXG4iICsgCi0JCQkiICovXG4iICsgCi0JCQkicHVibGljIGNsYXNzIERDXG4iICsgCi0JCQkiCWV4dGVuZHMgTW9kZWxDaGFuZ2VPcGVyYXRpb24ge1xuIiArIAotCQkJIglJU2VjIHB1YmxpYyBTZXRTZWNvbmRhcnlTb3VyY2VPcGVyYXRpb24oXG4iICsgCi0JCQkiCQlJU2Vjb25kYXJ5U291cmNlQ29udGFpbmVyIGVsZW1lbnQsIFxuIiArIAotCQkJIgkJVmVyc2lvbklEIGlkKSB7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSIJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcilcbiIgKyAKLQkJCSIJCXRocm93cyBPcGVyYXRpb25GYWlsZWRFeGNlcHRpb24ge1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbWV0aG9kIHJldHVybiB0eXBlPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIklTZWMiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOklTZWM+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiSVNlYyI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiSVNlYyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBEQyBleHRlbmRzIE1vZGVsQ2hhbmdlT3BlcmF0aW9uIHtcbiIgKyAKLQkJIiAgPENvbXBsZXRlT25UeXBlOklTZWM+O1xuIiArIAotCQkiICBwdWJsaWMgREMoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFNldFNlY29uZGFyeVNvdXJjZU9wZXJhdGlvbihJU2Vjb25kYXJ5U291cmNlQ29udGFpbmVyIGVsZW1lbnQsIFZlcnNpb25JRCBpZCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvRXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBPcGVyYXRpb25GYWlsZWRFeGNlcHRpb247XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdEVfMUZHMVlEU18xKCkgewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCSIvKipcbiIgKyAKLQkJIiAqIDFGRzFZRFNcbiIgKyAKLQkJIiAqL1xuIiArIAotCQkicHVibGljIGNsYXNzIEUge1xuIiArIAotCQkiCXtcbiIgKyAKLQkJIgkJbmV3IFkoKVxuIiArIAotCQkiCSB9XG4iICsgCi0JCSIJe1xuIiArIAotCQkiCQluZXcgWSgpLn1cbiIgKyAKLQkJIgljbGFzcyBZXG4iICsgCi0JCSIJCWV4dGVuZHMgamF2YS51dGlsLlZlY3RvciB7XG4iICsgCi0JCSIJCXZvaWQgZm9vKCkge1xuIiArIAotCQkiCQl9XG4iICsgCi0JCSIJfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gdHlwZSBpbnRvIHR5cGUgY3JlYXRpb24+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiWSI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6WT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJZIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJZIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgRSB7XG4iICsgCi0JCSIgIGNsYXNzIFkgZXh0ZW5kcyBqYXZhLnV0aWwuVmVjdG9yIHtcbiIgKyAKLQkJIiAgICBZKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAge1xuIiArIAotCQkiICAgIG5ldyA8Q29tcGxldGVPblR5cGU6WT4oKTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIEUoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigiWSgpXG4iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RFXzFGRzFZRFNfMigpIHsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7IFxuIiArIAotCQkiLyoqXG4iICsgCi0JCSIgKiAxRkcxWURTXG4iICsgCi0JCSIgKi9cbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBFIHtcbiIgKyAKLQkJIgl7XG4iICsgCi0JCSIJCW5ldyBZKClcbiIgKyAKLQkJIgkgfVxuIiArIAotCQkiCXtcbiIgKyAKLQkJIgkJbmV3IFkoKS59XG4iICsgCi0JCSIJY2xhc3MgWVxuIiArIAotCQkiCQlleHRlbmRzIGphdmEudXRpbC5WZWN0b3Ige1xuIiArIAotCQkiCQl2b2lkIGZvbygpIHtcbiIgKyAKLQkJIgkJfVxuIiArIAotCQkiCX1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIGltcGxpY2l0IG1ldGhvZCBjYWxsIGludG8gaW50aWFsaXplcj4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuZXcgWSgpLiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpuZXcgWSgpLj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIEUge1xuIiArIAotCQkiICBjbGFzcyBZIGV4dGVuZHMgamF2YS51dGlsLlZlY3RvciB7XG4iICsgCi0JCSIgICAgWSgpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6bmV3IFkoKS4+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBFKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdEVfMUZHMVlEU18zKCkgewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCSIvKipcbiIgKyAKLQkJIiAqIDFGRzFZRFNcbiIgKyAKLQkJIiAqL1xuIiArIAotCQkicHVibGljIGNsYXNzIEUge1xuIiArIAotCQkiCXtcbiIgKyAKLQkJIgkJbmV3IFkoKVxuIiArIAotCQkiCSB9XG4iICsgCi0JCSIJe1xuIiArIAotCQkiCQluZXcgWSgpLn1cbiIgKyAKLQkJIgljbGFzcyBZXG4iICsgCi0JCSIJCWV4dGVuZHMgamF2YS51dGlsLlZlY3RvciB7XG4iICsgCi0JCSIJCXZvaWQgZm9vKCkge1xuIiArIAotCQkiCQl9XG4iICsgCi0JCSIJfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gZXh0ZW5kIHR5cGU+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiamF2YS51dGlsLiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbkNsYXNzOmphdmEudXRpbC4+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJqYXZhLnV0aWwuVmVjdG9yIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIEUge1xuIiArIAotCQkiICBjbGFzcyBZIGV4dGVuZHMgPENvbXBsZXRlT25DbGFzczpqYXZhLnV0aWwuPiB7XG4iICsgCi0JCSIgICAgWSgpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIEUoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0RUFfMSgpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgRUEge1xuIiArIAotCQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKLQkJCSIJCXRyeSB7XG4iICsgCi0JCQkiCQkJdGhyb3cgbmV3IEVycm9yKCk7XG4iICsgCi0JCQkiCQl9IGNhdGNoIChFeGNlcHRpb24gZWVlZSkge1xuIiArIAotCQkJIgkJCWVlZWUufVxuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gY2F0Y2ggYmxvY2sgZXhjZXB0aW9uIHR5cGUgZGVjbGFyYXRpb24+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiRSI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbkV4Y2VwdGlvbjpFPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIkUiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIkV4Y2VwdGlvbiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIEVBIHtcbiIgKyAKLQkJIiAgcHVibGljIEVBKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uRXhjZXB0aW9uOkU+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoIkV4Y2VwdGlvbiBlZWVlIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0RUFfMigpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgRUEge1xuIiArIAotCQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKLQkJCSIJCXRyeSB7XG4iICsgCi0JCQkiCQkJdGhyb3cgbmV3IEVycm9yKCk7XG4iICsgCi0JCQkiCQl9IGNhdGNoIChFeGNlcHRpb24gZWVlZSkge1xuIiArIAotCQkJIgkJCWVlZWUufVxuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbWV0aG9kL2ZpZWxkIG9mIHRocm93biBleGNlcHRpb24gaW50byBjYXRjaCBibG9jaz4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJlZWVlLiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6ZWVlZS4+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJlZWVlLiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIEVBIHtcbiIgKyAKLQkJIiAgcHVibGljIEVBKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIHtcbiIgKyAKLQkJIiAgICAgIEV4Y2VwdGlvbiBlZWVlO1xuIiArIAotCQkiICAgICAgPENvbXBsZXRlT25OYW1lOmVlZWUuPjtcbiIgKwotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RFQl8xRkk3NFMzKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJIi8qKlxuIiArIAotCQkJIiAqIDFGSTc0UzNcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgRUIge1xuIiArIAotCQkJIglpbnRbXSB0YWJsZTtcbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQlpbnQgeCA9IHRhYmxlLn1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBtZXRob2QvZmllbGQgb2YgYXJyYXk+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidGFibGUuIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp0YWJsZS4+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ0YWJsZS4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBFQiB7XG4iICsgCi0JCSIgIGludFtdIHRhYmxlO1xuIiArIAotCQkiICBwdWJsaWMgRUIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgaW50IHggPSA8Q29tcGxldGVPbk5hbWU6dGFibGUuPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RFQ18xRlNCWjJZKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJIi8qKlxuIiArIAotCQkJIiAqIDFGU0JaMllcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSJjbGFzcyBFQyB7XG4iICsgCi0JCQkiCXZvaWQgZm9vKCkge1xuIiArIAotCQkJIgkJRUNcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIn1cbiIgKyAKLQkJCSJjbGFzcyBFQ090aGVyVG9wTGV2ZWwge1xuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIGxvY2FsIHZhcmlhYmxlIGRlY2FyYXRpb24gdHlwZT4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJFQyI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6RUM+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiRUMiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIkVDIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJjbGFzcyBFQyB7XG4iICsgCi0JCSIgIEVDKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpFQz47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIgKyAKLQkJImNsYXNzIEVDT3RoZXJUb3BMZXZlbCB7XG4iICsgCi0JCSIgIEVDT3RoZXJUb3BMZXZlbCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJFQ1xuIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0RigpIHsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7IFxuIiArIAotCQkicHVibGljIGNsYXNzIEYge1xuIiArIAotCQkiCXZvaWQgYmFyKCkge1xuIiArIAotCQkiCX1cbiIgKyAKLQkJIgljbGFzcyBZIHtcbiIgKyAKLQkJIgkJdm9pZCBmb28oKSB7XG4iICsgCi0JCSIJCQliYSB9XG4iICsgCi0JCSIJfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbWV0aG9kL2ZpZWxkIGV4cGxpY2l0IGFjY2Vzcz4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJiYSI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6YmE+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiYmEiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImJhIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgRiB7XG4iICsgCi0JCSIgIGNsYXNzIFkge1xuIiArIAotCQkiICAgIFkoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICAgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgICAgPENvbXBsZXRlT25OYW1lOmJhPjtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIEYoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigiYmEgfSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdEZBXzEoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkicHVibGljIGNsYXNzIEZBIHtcbiIgKyAKLQkJCSIJYnl0ZSB2YWx1ZTtcbiIgKyAKLQkJCSIJcHVibGljIGZsb2F0IGZvbygpIHtcbiIgKyAKLQkJCSIJCXJldHVybiAoZmxvYXQpIHZhbHVlO1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gY2FzdCBleHByZXNzaW9uIHR5cGU+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6Zj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJmIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJmbG9hdCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIEZBIHtcbiIgKyAKLQkJIiAgYnl0ZSB2YWx1ZTtcbiIgKyAKLQkJIiAgcHVibGljIEZBKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBmbG9hdCBmb28oKSB7XG4iICsgCi0JCSIgICAgcmV0dXJuIDxDb21wbGV0ZU9uTmFtZTpmPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJmbG9hdCkiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RGQV8yKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJInB1YmxpYyBjbGFzcyBGQSB7XG4iICsgCi0JCQkiCWJ5dGUgdmFsdWU7XG4iICsgCi0JCQkiCXB1YmxpYyBmbG9hdCBmb28oKSB7XG4iICsgCi0JCQkiCQlyZXR1cm4gKGZsb2F0KSB2YWx1ZTsgXG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiByZXR1cm5lZCB2YWx1ZT4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ2IjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp2PiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInYiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInZhbHVlIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgRkEge1xuIiArIAotCQkiICBieXRlIHZhbHVlO1xuIiArIAotCQkiICBwdWJsaWMgRkEoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIGZsb2F0IGZvbygpIHtcbiIgKyAKLQkJIiAgICAoZmxvYXQpIDxDb21wbGV0ZU9uTmFtZTp2PjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ2YWx1ZTsgXG4iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RGQl8xRkk3NFMzKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJIi8qKlxuIiArIAotCQkJIiAqIDFGSTc0UzNcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgRkIge1xuIiArIAotCQkJIglpbnRbXSB0YWJsZTtcbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQlpbnQgeCA9IHRhYmxlWzFdLn1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBtZXRob2QvZmllbGQgb2YgYXJyYXkgZWxlbWVudD4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ0YWJsZVsxXS4iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6dGFibGVbMV0uPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgRkIge1xuIiArIAotCQkiICBpbnRbXSB0YWJsZTtcbiIgKyAKLQkJIiAgcHVibGljIEZCKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIGludCB4ID0gPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6dGFibGVbMV0uPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RGQ18xRlNCWjlCKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJIi8qKlxuIiArIAotCQkJIiAqIDFGU0JaOUJcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSJjbGFzcyBGQyB7XG4iICsgCi0JCQkiCVVOS09XTlRZUEUgZmllbGQ7XG4iICsgCi0JCQkiCXZvaWQgZm9vKCkge1xuIiArIAotCQkJIgkJZlxuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbWV0aG9kL2ZpZWxkIGltcGxpY2l0IGFjY2Vzcz4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpmPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImYiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImYiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJmXG4iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJjbGFzcyBGQyB7XG4iICsgCi0JCSIgIFVOS09XTlRZUEUgZmllbGQ7XG4iICsgCi0JCSIgIEZDKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpmPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdEcoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBHIHtcbiIgKyAKLQkJIglpbnQgYmFyKCkge1xuIiArIAotCQkiCX1cbiIgKyAKLQkJIgljbGFzcyBZIHtcbiIgKyAKLQkJIgkJdm9pZCBmb28oaW50IGIpIHtcbiIgKyAKLQkJIgkJCXJldHVybiBiIH1cbiIgKyAKLQkJIgl9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiByZXR1cm4gdmFsdWU+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6Yj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJiIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJiIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgRyB7XG4iICsgCi0JCSIgIGNsYXNzIFkge1xuIiArIAotCQkiICAgIFkoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICAgIHZvaWQgZm9vKGludCBiKSB7XG4iICsgCi0JCSIgICAgICByZXR1cm4gPENvbXBsZXRlT25OYW1lOmI+O1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgRygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgYmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoImIgfSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdEdBKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJInB1YmxpYyBjbGFzcyBHQSB7XG4iICsgCi0JCQkiCXZvaWQgZm9vKFN0cmluZyBzKSB7XG4iICsgCi0JCQkiCQlTdHJpbmcgc3RyaW5nID0gcztcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIGxvY2FsIHZhcmlhYmxlIGluaXRpYWxpemVyPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInMiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnM+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAicyI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInM7IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIEdBIHtcbiIgKyAKLQkJIiAgcHVibGljIEdBKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKFN0cmluZyBzKSB7XG4iICsgCi0JCSIgICAgU3RyaW5nIHN0cmluZyA9IDxDb21wbGV0ZU9uTmFtZTpzPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdEdCXzFGSTc0UzMoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkiLyoqXG4iICsgCi0JCQkiICogMUZJNzRTM1xuIiArIAotCQkJIiAqL1xuIiArIAotCQkJInB1YmxpYyBjbGFzcyBHQiB7XG4iICsgCi0JCQkiCVN0cmluZ1tdIHRhYmxlO1xuIiArIAotCQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKLQkJCSIJCWludCB4ID0gdGFibGVbMV0ufVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIG1ldGhvZC9maWVsZCBvZiBhcnJheSBlbGVtZW50PiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRhYmxlWzFdLiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk1lbWJlckFjY2Vzczp0YWJsZVsxXS4+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICIiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgR0Ige1xuIiArIAotCQkiICBTdHJpbmdbXSB0YWJsZTtcbiIgKyAKLQkJIiAgcHVibGljIEdCKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIGludCB4ID0gPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6dGFibGVbMV0uPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdEdDXzFGU0hMSFZfMSgpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSIvKipcbiIgKyAKLQkJCSIgKiAxRlNITEhWXG4iICsgCi0JCQkiICovXG4iICsgCi0JCQkicHVibGljIGNsYXNzIEdDIHtcbiIgKyAKLQkJCSJwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCi0JCQkiCU9iamVjdCBsID0gbmV3IE9iamVjdCgpIHtcbiIgKyAKLQkJCSIJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KFN0cmluZ1tdIGV2ZW50KSB7XG4iICsgCi0JCQkiCQkJU3RyaW5nIHMgPSBuZXcgU3RyaW5nKCk7XG4iICsgCi0JCQkiCQkJcy5cbiIgKyAKLQkJCSIJCQl0cnkge1xuIiArIAotCQkJIgkJCQlldmVudC47XG4iICsgCi0JCQkiCQkJfVxuIiArIAotCQkJIgkJCWNhdGNoIChFeGNlcHRpb24gZSkge1xuIiArIAotCQkJIgkJCQllLlxuIiArIAotCQkJIgkJCX1cbiIgKyAKLQkJCSIJCX1cbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIn1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBhbm9ueW1vdXMgZGVjbGFyYXRpb24gdHlwZT4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJPIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpPPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIk8iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIk9iamVjdCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoIk9iamVjdCgpIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIEdDIHtcbiIgKyAKLQkJIiAgcHVibGljIEdDKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKLQkJIiAgICBPYmplY3QgbCA9IG5ldyA8Q29tcGxldGVPblR5cGU6Tz4oKTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdEdDXzFGU0hMSFZfMigpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSIvKipcbiIgKyAKLQkJCSIgKiAxRlNITEhWXG4iICsgCi0JCQkiICovXG4iICsgCi0JCQkicHVibGljIGNsYXNzIEdDIHtcbiIgKyAKLQkJCSJwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCi0JCQkiCU9iamVjdCBsID0gbmV3IE9iamVjdCgpIHtcbiIgKyAKLQkJCSIJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KFN0cmluZ1tdIGV2ZW50KSB7XG4iICsgCi0JCQkiCQkJU3RyaW5nIHMgPSBuZXcgU3RyaW5nKCk7XG4iICsgCi0JCQkiCQkJcy5cbiIgKyAKLQkJCSIJCQl0cnkge1xuIiArIAotCQkJIgkJCQlldmVudC47XG4iICsgCi0JCQkiCQkJfVxuIiArIAotCQkJIgkJCWNhdGNoIChFeGNlcHRpb24gZSkge1xuIiArIAotCQkJIgkJCQllLlxuIiArIAotCQkJIgkJCX1cbiIgKyAKLQkJCSIJCX1cbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIn1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBtZXRob2QvZmllbGQgb2YgbG9jYWwgdmFyaWFibGUgaW50byBhbm9ueW1vdXMgZGVjbGFyYXRpb24+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicy4iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnMuPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicy4iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgR0Mge1xuIiArIAotCQkiICBwdWJsaWMgR0MoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAotCQkiICAgIE9iamVjdCBsO1xuIiArIAotCQkiICAgIG5ldyBPYmplY3QoKSB7XG4iICsgCi0JCSIgICAgICAoKSB7XG4iICsgCi0JCSIgICAgICB9XG4iICsgCi0JCSIgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChTdHJpbmdbXSBldmVudCkge1xuIiArIAotCQkiICAgICAgICBTdHJpbmcgcztcbiIgKyAKLQkJIiAgICAgICAgPENvbXBsZXRlT25OYW1lOnMuPjtcbiIgKyAKLQkJIiAgICAgIH1cbiIgKyAKLQkJIiAgICB9O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0R0NfMUZTSExIVl8zKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJIi8qKlxuIiArIAotCQkJIiAqIDFGU0hMSFZcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgR0Mge1xuIiArIAotCQkJInB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKLQkJCSIJT2JqZWN0IGwgPSBuZXcgT2JqZWN0KCkge1xuIiArIAotCQkJIgkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoU3RyaW5nW10gZXZlbnQpIHtcbiIgKyAKLQkJCSIJCQlTdHJpbmcgcyA9IG5ldyBTdHJpbmcoKTtcbiIgKyAKLQkJCSIJCQlzLlxuIiArIAotCQkJIgkJCXRyeSB7XG4iICsgCi0JCQkiCQkJCWV2ZW50LjtcbiIgKyAKLQkJCSIJCQl9XG4iICsgCi0JCQkiCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7XG4iICsgCi0JCQkiCQkJCWUuXG4iICsgCi0JCQkiCQkJfVxuIiArIAotCQkJIgkJfVxuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIG1ldGhvZC9maWVsZCBvZiBhcnJheT4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJldmVudC4iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmV2ZW50Lj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImV2ZW50LiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBHQyB7XG4iICsgCi0JCSIgIHB1YmxpYyBHQygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCi0JCSIgICAgT2JqZWN0IGw7XG4iICsgCi0JCSIgICAgbmV3IE9iamVjdCgpIHtcbiIgKyAKLQkJIiAgICAgICgpIHtcbiIgKyAKLQkJIiAgICAgIH1cbiIgKyAKLQkJIiAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KFN0cmluZ1tdIGV2ZW50KSB7XG4iICsgCi0JCSIgICAgICAgIFN0cmluZyBzO1xuIiArIAotCQkiICAgICAgICB7XG4iICsgCi0JCSIgICAgICAgICAgPENvbXBsZXRlT25OYW1lOmV2ZW50Lj47XG4iICsgCi0JCSIgICAgICAgIH1cbiIgKyAKLQkJIiAgICAgIH1cbiIgKyAKLQkJIiAgICB9O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0R0NfMUZTSExIVl80KCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJIi8qKlxuIiArIAotCQkJIiAqIDFGU0hMSFZcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgR0Mge1xuIiArIAotCQkJInB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKLQkJCSIJT2JqZWN0IGwgPSBuZXcgT2JqZWN0KCkge1xuIiArIAotCQkJIgkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoU3RyaW5nW10gZXZlbnQpIHtcbiIgKyAKLQkJCSIJCQlTdHJpbmcgcyA9IG5ldyBTdHJpbmcoKTtcbiIgKyAKLQkJCSIJCQlzLlxuIiArIAotCQkJIgkJCXRyeSB7XG4iICsgCi0JCQkiCQkJCWV2ZW50LjtcbiIgKyAKLQkJCSIJCQl9XG4iICsgCi0JCQkiCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7XG4iICsgCi0JCQkiCQkJCWUuXG4iICsgCi0JCQkiCQkJfVxuIiArIAotCQkJIgkJfVxuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIG1ldGhvZC9maWVsZCBvZiB0aHJvd24gZXhjZXB0aW9uIGludG8gY2F0Y2ggYmxvY2sgaW50byBhbm9ueW1vdXMgZGVjbGFyYXRpb24+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZS4iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmUuPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiZS4iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgR0Mge1xuIiArIAotCQkiICBwdWJsaWMgR0MoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAotCQkiICAgIE9iamVjdCBsO1xuIiArIAotCQkiICAgIG5ldyBPYmplY3QoKSB7XG4iICsgCi0JCSIgICAgICAoKSB7XG4iICsgCi0JCSIgICAgICB9XG4iICsgCi0JCSIgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChTdHJpbmdbXSBldmVudCkge1xuIiArIAotCQkiICAgICAgICBTdHJpbmcgcztcbiIgKyAKLQkJIiAgICAgICAge1xuIiArIAotCQkiICAgICAgICAgIEV4Y2VwdGlvbiBlO1xuIiArIAotCQkiICAgICAgICAgIDxDb21wbGV0ZU9uTmFtZTplLj47XG4iICsgCi0JCSIgICAgICAgIH1cbiIgKyAKLQkJIiAgICAgIH1cbiIgKyAKLQkJIiAgICB9O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0SCgpIHsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7IFxuIiArIAotCQkicHVibGljIGNsYXNzIEgge1xuIiArIAotCQkiCXZvaWQgZm9vKGJvb2xlYW4gYmJiYikge1xuIiArIAotCQkiCQl3aGlsZSAoWGJtIH1cbiIgKyAKLQkJIgl2b2lkIGJhcigpIHtcbiIgKyAKLQkJIgl9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiB3aGlsZSBrZXl3b3JkIGFyZ3VtZW50PiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIlhibSI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6WGJtPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIlhibSI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiWGJtIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIEgge1xuIiArIAotCQkiICBwdWJsaWMgSCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbyhib29sZWFuIGJiYmIpIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6WGJtPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdEhBXzEoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkicHVibGljIGNsYXNzIEhBIHtcbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQl4LnkuWltdIGZpZWxkMTsgXG4iICsgCi0JCQkiCQlmaWVsZDFbMV0ufVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIHBhY2thZ2UgbWVtYmVyIHR5cGU+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAieC55LiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6eC55Lj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIngueS4iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgSEEge1xuIiArIAotCQkiICBwdWJsaWMgSEEoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOngueS4+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0SEFfMigpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgSEEge1xuIiArIAotCQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKLQkJCSIJCXgueS5aW10gZmllbGQxOyBcbiIgKyAKLQkJCSIJCWZpZWxkMVsxXS59XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbWV0aG9kL2ZpZWxkIG9mIGFycmF5IGVsZW1lbnQ+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZmllbGQxWzFdLiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmaWVsZDFbMV0uPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIEhBIHtcbiIgKyAKLQkJIiAgcHVibGljIEhBKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIHgueS5aW10gZmllbGQxO1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZpZWxkMVsxXS4+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgfQotcHVibGljIHZvaWQgdGVzdEhCXzFGSFNMRFIoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkiLyoqXG4iICsgCi0JCQkiICogMUZIU0xEUlxuIiArIAotCQkJIiAqL1xuIiArIAotCQkJInB1YmxpYyBjbGFzcyBIQiB7XG4iICsgCi0JCQkiCXZvaWQgZm9vKCkge1xuIiArIAotCQkJIgkJZm9yICg7IGkgPCB0b3RhbFVuaXRzOyBpKyspIHtcbiIgKyAKLQkJCSIJCQl1bml0ID0gdW5pdHNUb1Byb2Nlc3NbaV07XG4iICsgCi0JCQkiCQkJdHJ5IHtcbiIgKyAKLQkJCSIJCQkJaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuIiArIAotCQkJIgkJCQkJU3lzdGVtLm91dC5wcmludGxuKFxuIiArIAotCQkJIgkJCQkJCVwicHJvY2VzcyBcIlxuIiArIAotCQkJIgkJCQkJCQkrIChpICsgMSlcbiIgKyAKLQkJCSIJCQkJCQkJKyBcIi9cIlxuIiArIAotCQkJIgkJCQkJCQkrIHRvdGFsVW5pdHNcbiIgKyAKLQkJCSIJCQkJCQkJKyBcIiA6IFwiXG4iICsgCi0JCQkiCQkJCQkJCSsgdW5pdHNUb1Byb2Nlc3NbaV1cbiIgKyAKLQkJCSIJCQkJCQkJCS5zb3VyY2VGaWxlTmFtZSgpKTsgXG4iICsgCi0JCQkiCQkJCX1cbiIgKyAKLQkJCSIJCQkJcHJvY2Vzcyh1bml0LCBpKTtcbiIgKyAKLQkJCSIJCQl9XG4iICsgCi0JCQkiCQkJZmkgfVxuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gZmluYWxseSBrZXl3b3JkPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZpIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDpmaT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJmaSI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiZmkiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJmaSB9IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIEhCIHtcbiIgKyAKLQkJIiAgcHVibGljIEhCKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIHtcbiIgKyAKLQkJIiAgICAgIDxDb21wbGV0ZU9uS2V5d29yZDpmaT47XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgfQotcHVibGljIHZvaWQgdGVzdEhDXzFGTVBZTzNfMSgpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSIvKipcbiIgKyAKLQkJCSIgKiAxRk1QWU8zXG4iICsgCi0JCQkiICovXG4iICsgCi0JCQkiY2xhc3MgSEMge1xuIiArIAotCQkJIglIQyhPYmplY3Qgbyl7fVxuIiArIAotCQkJIgl2b2lkIGZvbygpe1xuIiArIAotCQkJIgkJSEMgYSA9IG5ldyBIQyhuZXcgT2JqZWN0KCkpLlxuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbWV0aG9kL2ZpZWxkIG9mIG9iamVjdCBjcmVhdGlvbj4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuZXcgSEMobmV3IE9iamVjdCgpKS4iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6bmV3IEhDKG5ldyBPYmplY3QoKSkuPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkiY2xhc3MgSEMge1xuIiArIAotCQkiICBIQyhPYmplY3Qgbykge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIEhDIGEgPSA8Q29tcGxldGVPbk1lbWJlckFjY2VzczpuZXcgSEMobmV3IE9iamVjdCgpKS4+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgfQotcHVibGljIHZvaWQgdGVzdEhDXzFGTVBZTzNfMigpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSIvKipcbiIgKyAKLQkJCSIgKiAxRk1QWU8zXG4iICsgCi0JCQkiICovXG4iICsgCi0JCQkiY2xhc3MgSEMge1xuIiArIAotCQkJIglIQyhPYmplY3Qgbyl7fVxuIiArIAotCQkJIgl2b2lkIGZvbygpe1xuIiArIAotCQkJIgkJQSBhID0gbmV3IEEobmV3IE9iamVjdCgpKS5cbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIG9iamVjdCBvZiBuZXN0ZWQgb2JqZWN0IGNyZWF0aW9uIGRlY2xhcmF0aW9uPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIk8iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOk8+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiTyI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiT2JqZWN0IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigiT2JqZWN0KCkiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJjbGFzcyBIQyB7XG4iICsgCi0JCSIgIEhDKE9iamVjdCBvKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgQSBhID0gbmV3IEEobmV3IDxDb21wbGV0ZU9uVHlwZTpPPigpKTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IH0KLXB1YmxpYyB2b2lkIHRlc3RJKCkgewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgSSB7XG4iICsgCi0JCSIJQ29tcG9uZW50IH1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIGluY29tcGxldGUgZmllbGQgZGVjbGFyYXRpb24gdHlwZT4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJDIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpDPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIkMiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIkNvbXBvbmVudCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBJIHtcbiIgKyAKLQkJIiAgPENvbXBsZXRlT25UeXBlOkM+O1xuIiArIAotCQkiICBwdWJsaWMgSSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyB9Ci1wdWJsaWMgdm9pZCB0ZXN0SUFfMUZHTkJQUl8xKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJIi8qKlxuIiArIAotCQkJIiAqIDFGR05CUFJcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgSUEge1xuIiArIAotCQkJIgl2b2lkIGZvbzEoKSB7XG4iICsgCi0JCQkiCQlsYWJlbDEgOiB3aGlsZSAodHJ1ZSkge1xuIiArIAotCQkJIgkJCWNsYXNzIEEge1xuIiArIAotCQkJIgkJCQl2b2lkIGZvbzIoKSB7XG4iICsgCi0JCQkiCQkJCQlsYWJlbDIgOiB3aGlsZSAodHJ1ZSkge1xuIiArIAotCQkJIgkJCQkJCWJyZWFrIGxhIH1cbiIgKyAKLQkJCSIJCQkJfVxuIiArIAotCQkJIgkJCX1cbiIgKyAKLQkJCSIJCQlBIGEgPSBuZXcgQSgpO1xuIiArIAotCQkJIgkJCWJyZWFrIGxhIH1cbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIGxhYmVsIG5hbWU+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibGEiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmxhPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImxhIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJsYSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoImxhIH0iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgSUEge1xuIiArIAotCQkiICBwdWJsaWMgSUEoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28xKCkge1xuIiArIAotCQkiICAgIHtcbiIgKwotCQkiICAgICAgY2xhc3MgQSB7XG4iICsKLQkJIiAgICAgICAgQSgpIHtcbiIgKwotCQkiICAgICAgICB9XG4iICsKLQkJIiAgICAgICAgdm9pZCBmb28yKCkge1xuIiArCi0JCSIgICAgICAgICAgPENvbXBsZXRlT25OYW1lOmxhPjtcbiIgKwotCQkiICAgICAgICB9XG4iICsKLQkJIiAgICAgIH07XG4iICsKLQkJIiAgICB9XG4iICsKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdElBXzFGR05CUFJfMigpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSIvKipcbiIgKyAKLQkJCSIgKiAxRkdOQlBSXG4iICsgCi0JCQkiICovXG4iICsgCi0JCQkicHVibGljIGNsYXNzIElBIHtcbiIgKyAKLQkJCSIJdm9pZCBmb28xKCkge1xuIiArIAotCQkJIgkJbGFiZWwxIDogd2hpbGUgKHRydWUpIHtcbiIgKyAKLQkJCSIJCQljbGFzcyBBIHtcbiIgKyAKLQkJCSIJCQkJdm9pZCBmb28yKCkge1xuIiArIAotCQkJIgkJCQkJbGFiZWwyIDogd2hpbGUgKHRydWUpIHtcbiIgKyAKLQkJCSIJCQkJCQlicmVhayBsYSB9XG4iICsgCi0JCQkiCQkJCX1cbiIgKyAKLQkJCSIJCQl9XG4iICsgCi0JCQkiCQkJQSBhID0gbmV3IEEoKTtcbiIgKyAKLQkJCSIJCQlicmVhayBsYSB9XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBsYWJlbCBuYW1lPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImxhIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpsYT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJsYSI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAibGEiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJsYSB9Iiwgc3RyLmluZGV4T2YoImxhIH0iKSArIDEpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBJQSB7XG4iICsgCi0JCSIgIHB1YmxpYyBJQSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbzEoKSB7XG4iICsgCi0JCSIgICAge1xuIiArCi0JCSIgICAgICBjbGFzcyBBIHtcbiIgKwotCQkiICAgICAgICBBKCkge1xuIiArCi0JCSIgICAgICAgICAgc3VwZXIoKTtcbiIgKyAvLyBjb3VsZCBiZSBvcHRpbWl6ZWQgb3V0ID8KLQkJIiAgICAgICAgfVxuIiArCi0JCSIgICAgICAgIHZvaWQgZm9vMigpIHtcbiIgKwotCQkiICAgICAgICB9XG4iICsKLQkJIiAgICAgIH07XG4iICsKLQkJIiAgICAgIEEgYTtcbiIgKwotCQkiICAgICAgPENvbXBsZXRlT25OYW1lOmxhPjtcbiIgKwotCQkiICAgIH1cbiIgKwotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0SUIoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkicHVibGljIGNsYXNzIElCIHtcbiIgKyAKLQkJCSIJVW5rbm93bkZpZWxkVFlQRSBmaWVsZDtcbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQlmaWVsZC59XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbWV0aG9kL2ZpZWxkIG9mIGZpZWxkIG9mIHVua293biB0eXBlPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZpZWxkLiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6ZmllbGQuPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiZmllbGQuIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIElCIHtcbiIgKyAKLQkJIiAgVW5rbm93bkZpZWxkVFlQRSBmaWVsZDtcbiIgKyAKLQkJIiAgcHVibGljIElCKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpmaWVsZC4+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgfQotcHVibGljIHZvaWQgdGVzdElDXzFGTUdVUFIoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkiLyoqXG4iICsgCi0JCQkiICogMUZNR1VQUlxuIiArIAotCQkJIiAqL1xuIiArIAotCQkJInB1YmxpYyBjbGFzcyBJQyB7XG4iICsgCi0JCQkiCXZvaWQgZm9vKCl7XG4iICsgCi0JCQkiCQluZXcgU3RyaW5nKCkudG9TdHJpbmcoKS5cbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIG11bHRpcGxlIG1ldGhvZC9maWVsZCBjYWxsPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIm5ldyBTdHJpbmcoKS50b1N0cmluZygpLiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpuZXcgU3RyaW5nKCkudG9TdHJpbmcoKS4+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICIiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgSUMge1xuIiArIAotCQkiICBwdWJsaWMgSUMoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6bmV3IFN0cmluZygpLnRvU3RyaW5nKCkuPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IH0KLXB1YmxpYyB2b2lkIHRlc3RKKCkgewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgSiB7XG4iICsgCi0JCSIJaW50IGZvbzEoKVt2b2lkIGZvbzIoKSBpbnQgaTtcbiIgKyAKLQkJIgl2b2lkIGZvbzMoKSB7XG4iICsgCi0JCSIJCWYgfVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbWV0aG9kL2ZpZWxkIGFjY2VzcyBpbnRvIGNvcnJ1cHRlZCBtZXRob2QgZGVjbGFyYXRpb24+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6Zj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJmIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJmIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigiZiB9IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIEoge1xuIiArIAotCQkiICBwdWJsaWMgSigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgZm9vMSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbzIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28zKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpmPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IH0KLXB1YmxpYyB2b2lkIHRlc3RKQV8xRkdRVlcyXzEoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkiLyoqXG4iICsgCi0JCQkiICogMUZHUVZXMlxuIiArIAotCQkJIiAqL1xuIiArIAotCQkJInB1YmxpYyBjbGFzcyBKQSB7XG4iICsgCi0JCQkiCXZvaWQgZm9vKCkge1xuIiArIAotCQkJIgkJXCJhYmMudHh0XCIuICdhJy59XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gc3RyaW5nIGxpdGVyYWw+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiXCJhYmMudHh0XCIuIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOlwiYWJjLnR4dFwiLj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBKQSB7XG4iICsgCi0JCSIgIHB1YmxpYyBKQSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk1lbWJlckFjY2VzczpcImFiYy50eHRcIi4+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgfQotcHVibGljIHZvaWQgdGVzdEpBXzFGR1FWVzJfMigpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSIvKipcbiIgKyAKLQkJCSIgKiAxRkdRVlcyXG4iICsgCi0JCQkiICovXG4iICsgCi0JCQkicHVibGljIGNsYXNzIEpBIHtcbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQlcImFiYy50eHRcIi4gJ2EnLn1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBjaGFyIGxpdGVyYWw+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiJ2EnLiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk1lbWJlckFjY2VzczonYScuPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIEpBIHtcbiIgKyAKLQkJIiAgcHVibGljIEpBKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOidhJy4+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgfQotcHVibGljIHZvaWQgdGVzdEpCKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJInB1YmxpYyBjbGFzcyBKQlxuIiArIAotCQkJIglleHRlbmRzIFVua25vd25TVVBFUkNMQVNTXG4iICsgCi0JCQkiCWltcGxlbWVudHMgVW5rbm93blNVUEVSSU5URVJGQUNFIHtcbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQlmIH1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBpbnRvIG1ldGhvZCBkZWNsYXJlZCBpbnRvIGNvcnJ1cHRlZCBjbGFzcyBkZWNsYXJhdGlvbj4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpmPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImYiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImYiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJmIH0iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgSkIgZXh0ZW5kcyBVbmtub3duU1VQRVJDTEFTUyBpbXBsZW1lbnRzIFVua25vd25TVVBFUklOVEVSRkFDRSB7XG4iICsgCi0JCSIgIHB1YmxpYyBKQigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6Zj47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyB9Ci1wdWJsaWMgdm9pZCB0ZXN0SkNfMUZMRzFaQygpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSIvKipcbiIgKyAKLQkJCSIgKiAxRkxHMVpDXG4iICsgCi0JCQkiICovXG4iICsgCi0JCQkicHVibGljIGNsYXNzIEpDIHtcbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQluZXcgU3RyaW5nICgpLlxuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbWV0aG9kL2ZpZWxkIG9mIG9iamVjdCBjcmVhdGlvbiB3aXRoIGR1bW15IHNwYWNlcz4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuZXcgU3RyaW5nICgpLiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpuZXcgU3RyaW5nKCkuPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIEpDIHtcbiIgKyAKLQkJIiAgcHVibGljIEpDKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOm5ldyBTdHJpbmcoKS4+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgfQotcHVibGljIHZvaWQgdGVzdEtfMSgpIHsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7IFxuIiArIAotCQkiY2xhc3MgT3RoZXIge1xuIiArIAotCQkiCXZvaWQgZm9vKCkge1xuIiArIAotCQkiCX1cbiIgKyAKLQkJIn1cbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBLIHtcbiIgKyAKLQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihcbiIgKyAKLQkJIgkJamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKLQkJIgkJamF2YS5pby5GaWxlIGJiYmIgPSBcbiIgKyAKLQkJIgkJCW5ldyBGaWxlKFwiYzpcXGFiYy50eHRcIik7IFxuIiArIAotCQkiCQlPIGJiIGJiYmIufVxuIiArIAotCQkifVxuIjsKLQkJCi0vLwlzdHIgPSAKLS8vCQkicHVibGljIGNsYXNzIEsge1xuIiArIAotLy8JCSIJdm9pZCBmb28oKSB7XG4iICsgCi0vLwkJIgkJbmV3IFgoXCJjOmFiYy50eHRcIik7IFxuIiArIAotLy8JCSIJCU8iICsKLS8vCQkiICAgfVxuIiArIAotLy8JCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBjb3JydXB0ZWQgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiCQlPIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpPPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIk8iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIk8iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJjbGFzcyBPdGhlciB7XG4iICsgCi0JCSIgIE90aGVyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgSyB7XG4iICsgCi0JCSIgIHB1YmxpYyBLKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7XG4iICsgCi0JCSIgICAgamF2YS5pby5GaWxlIGJiYmI7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOk8+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0S18yKCkgewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCSJjbGFzcyBPdGhlciB7XG4iICsgCi0JCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCSIJfVxuIiArIAotCQkifVxuIiArIAotCQkicHVibGljIGNsYXNzIEsge1xuIiArIAotCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFxuIiArIAotCQkiCQlqYXZhLmxhbmcuU3RyaW5nW10gYXJncykge1xuIiArIAotCQkiCQlqYXZhLmlvLkZpbGUgYmJiYiA9IFxuIiArIAotCQkiCQkJbmV3IEZpbGUoXCJjOlxcYWJjLnR4dFwiKTsgXG4iICsgCi0JCSIJCU8gYmIgYmJiYi59XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBjb3JydXB0ZWQgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24gbmFtZT4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJiYiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbkxvY2FsTmFtZTpPIGJiPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImJiIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJiYiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoImJiIGJiYmIuIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkiY2xhc3MgT3RoZXIge1xuIiArIAotCQkiICBPdGhlcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiArIAotCQkicHVibGljIGNsYXNzIEsge1xuIiArIAotCQkiICBwdWJsaWMgSygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykge1xuIiArCi0JCSIgICAgamF2YS5pby5GaWxlIGJiYmI7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbkxvY2FsTmFtZTpPIGJiPjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RLXzMoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJImNsYXNzIE90aGVyIHtcbiIgKyAKLQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKLQkJIgl9XG4iICsgCi0JCSJ9XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgSyB7XG4iICsgCi0JCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oXG4iICsgCi0JCSIJCWphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7XG4iICsgCi0JCSIJCWphdmEuaW8uRmlsZSBiYmJiID0gXG4iICsgCi0JCSIJCQluZXcgRmlsZShcImM6XFxhYmMudHh0XCIpOyBcbiIgKyAKLQkJIgkJTyBiYiBiYmJiLn1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIGNvcnJ1cHRlZCBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbj4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJiYmJiIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpiYmJiPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImJiYmIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImJiYmIiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJiYmJiLn0iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJjbGFzcyBPdGhlciB7XG4iICsgCi0JCSIgIE90aGVyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgSyB7XG4iICsgCi0JCSIgIHB1YmxpYyBLKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7XG4iICsgCi0JCSIgICAgamF2YS5pby5GaWxlIGJiYmI7XG4iICsgCi0JCSIgICAgTyBiYjtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6YmJiYj47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyB9Ci1wdWJsaWMgdm9pZCB0ZXN0S180KCkgewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCSJjbGFzcyBPdGhlciB7XG4iICsgCi0JCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCSIJfVxuIiArIAotCQkifVxuIiArIAotCQkicHVibGljIGNsYXNzIEsge1xuIiArIAotCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFxuIiArIAotCQkiCQlqYXZhLmxhbmcuU3RyaW5nW10gYXJncykge1xuIiArIAotCQkiCQlqYXZhLmlvLkZpbGUgYmJiYiA9IFxuIiArIAotCQkiCQkJbmV3IEZpbGUoXCJjOlxcYWJjLnR4dFwiKTsgXG4iICsgCi0JCSIJCU8gYmIgYmJiYi59XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBtZXRob2QvZmllbGQgb2YgbG9jYWwgdmFyaWFibGUgd2l0aCBjb3JydXB0ZWQgZGVjbGFyYXRpb24+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYmJiYi4iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmJiYmIuPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiYmJiYi4iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJjbGFzcyBPdGhlciB7XG4iICsgCi0JCSIgIE90aGVyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgSyB7XG4iICsgCi0JCSIgIHB1YmxpYyBLKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7XG4iICsgCi0JCSIgICAgamF2YS5pby5GaWxlIGJiYmI7XG4iICsgCi0JCSIgICAgTyBiYjtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6YmJiYi4+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgfQotcHVibGljIHZvaWQgdGVzdEtBXzFGSDVTVTUoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkiLyoqXG4iICsgCi0JCQkiICogMUZINVNVNVxuIiArIAotCQkJIiAqL1xuIiArIAotCQkJImNsYXNzIEtBSGVscGVyXG4iICsgCi0JCQkiCWV4dGVuZHMgamF2YS51dGlsLlZlY3RvciB7XG4iICsgCi0JCQkifVxuIiArIAotCQkJInB1YmxpYyBjbGFzcyBLQSB7XG4iICsgCi0JCQkiCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7XG4iICsgCi0JCQkiCQlyZXR1cm4gMTA7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAotCQkJIgkJS0EgYSA9IG5ldyBLQTtcbiIgKyAKLQkJCSIJCWEuaGFzIH1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBtZXRob2QvZmllbGQ+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYS5oYXMiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmEuaGFzPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImhhcyI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiYS5oYXMiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJjbGFzcyBLQUhlbHBlciBleHRlbmRzIGphdmEudXRpbC5WZWN0b3Ige1xuIiArIAotCQkiICBLQUhlbHBlcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiArIAotCQkicHVibGljIGNsYXNzIEtBIHtcbiIgKyAKLQkJIiAgcHVibGljIEtBKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAotCQkiICAgIEtBIGE7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmEuaGFzPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IH0KLXB1YmxpYyB2b2lkIHRlc3RLQigpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgS0Ige1xuIiArIAotCQkJIgl2b2lkIGZvbygpW2kgfVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIGNvcnJ1cHRlZCBtZXRob2QgaGVhZGVyPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInZvaWQgZm9vKClbaSI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9IE5PTkU7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImkiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImkiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgS0Ige1xuIiArIAotCQkiICBwdWJsaWMgS0IoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgfQotcHVibGljIHZvaWQgdGVzdEtDXzFGTEcxWkMoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkiLyoqXG4iICsgCi0JCQkiICogMUZMRzFaQ1xuIiArIAotCQkJIiAqL1xuIiArIAotCQkJImltcG9ydCBqYXZhLmlvLio7XG4iICsgCi0JCQkicHVibGljIGNsYXNzIEtDIHtcbiIgKyAKLQkJCSJwcml2YXRlIHN0YXRpYyBjaGFyW10gcmVhZChTdHJpbmcgZmlsZU5hbWUpe1xuIiArIAotCQkJIgl0cnkge1xuIiArIAotCQkJIgkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpO1xuIiArIAotCQkJIgkJRmlsZVJlYWRlciByZWFkZXIgPVxuIiArIAotCQkJIgkJCW5ldyBGaWxlUmVhZGVyKGZpbGUpO1xuIiArIAotCQkJIgkJaW50IGxlbmd0aDtcbiIgKyAKLQkJCSIJCWNoYXJbXSBjb250ZW50cyA9XG4iICsgCi0JCQkiCQkJbmV3IGNoYXJbXG4iICsgCi0JCQkiCQkJCWxlbmd0aCA9XG4iICsgCi0JCQkiCQkJCShpbnQpIGZpbGUubGVuZ3RoKCldO1xuIiArIAotCQkJIgkJaW50IGxlbiA9IDA7XG4iICsgCi0JCQkiCQlpbnQgcmVhZFNpemUgPSAwO1xuIiArIAotCQkJIgkJd2hpbGUgKChyZWFkU2l6ZSAhPSAtMSlcbiIgKyAKLQkJCSIJCQkmJiAobGVuICE9IGxlbmd0aCkpIHtcbiIgKyAKLQkJCSIJCQlyZWFkU2l6ZSA9IHJlYWRlci5yZWFkKFxuIiArIAotCQkJIgkJCQljb250ZW50cyxcbiIgKyAKLQkJCSIJCQkJbGVuLFxuIiArIAotCQkJIgkJCQlsZW5ndGggLSBsZW4pO1xuIiArIAotCQkJIgkJCWxlbiArPSByZWFkU2l6ZTtcbiIgKyAKLQkJCSIJCX1cbiIgKyAKLQkJCSIJCXJlYWRlci4gdFxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbWV0aG9kL2ZpZWxkIHdpdGggZHVtbXkgc3BhY2VzPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInJlYWRlci4gdCI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6cmVhZGVyLnQ+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAidCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicmVhZGVyLiB0IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkiaW1wb3J0IGphdmEuaW8uKjtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBLQyB7XG4iICsgCi0JCSIgIHB1YmxpYyBLQygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwcml2YXRlIHN0YXRpYyBjaGFyW10gcmVhZChTdHJpbmcgZmlsZU5hbWUpIHtcbiIgKyAKLQkJIiAgICB7XG4iICsgCi0JCSIgICAgICBGaWxlIGZpbGU7XG4iICsgCi0JCSIgICAgICBGaWxlUmVhZGVyIHJlYWRlcjtcbiIgKyAKLQkJIiAgICAgIGludCBsZW5ndGg7XG4iICsgCi0JCSIgICAgICBjaGFyW10gY29udGVudHM7XG4iICsgCi0JCSIgICAgICBpbnQgbGVuO1xuIiArIAotCQkiICAgICAgaW50IHJlYWRTaXplO1xuIiArIAotCQkiICAgICAgPENvbXBsZXRlT25OYW1lOnJlYWRlci50PjtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyB9Ci1wdWJsaWMgdm9pZCB0ZXN0TF8xKCkgewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgTCB7XG4iICsgCi0JCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCSIJCXgueS5aW10gZmllbGQxLCBcbiIgKyAKLQkJIgkJCWZpZWxkMjsgXG4iICsgCi0JCSIJCWZpZWxkMS5pZiAoaW50W10uY2xhc3MgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbWV0aG9kL2ZpZWxkPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZpZWxkMS4iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmZpZWxkMS4+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJmaWVsZDEuIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIEwge1xuIiArIAotCQkiICBwdWJsaWMgTCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICB4LnkuWltdIGZpZWxkMTtcbiIgKyAKLQkJIiAgICB4LnkuWltdIGZpZWxkMjtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6ZmllbGQxLj47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyB9Ci1wdWJsaWMgdm9pZCB0ZXN0TF8yKCkgewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgTCB7XG4iICsgCi0JCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCSIJCXgueS5aW10gZmllbGQxLCBcbiIgKyAKLQkJIgkJCWZpZWxkMjsgXG4iICsgCi0JCSIJCWZpZWxkMS5pZiAoaW50W10uY2xhc3MgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbWV0aG9kL2ZpZWxkIG9mIGFycmF5PiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImludFtdLiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbkNsYXNzTGl0ZXJhbEFjY2VzczppbnRbXS4+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJpbnRbXS4iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgTCB7XG4iICsgCi0JCSIgIHB1YmxpYyBMKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIHgueS5aW10gZmllbGQxO1xuIiArIAotCQkiICAgIHgueS5aW10gZmllbGQyO1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uQ2xhc3NMaXRlcmFsQWNjZXNzOmludFtdLj47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RMXzMoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBMIHtcbiIgKyAKLQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKLQkJIgkJeC55LlpbXSBmaWVsZDEsIFxuIiArIAotCQkiCQkJZmllbGQyOyBcbiIgKyAKLQkJIgkJZmllbGQxLmlmIChpbnRbXS5jbGFzcyB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBhcmd1bWVudCBvZiBjb3JydXB0ZWQgaWYgc3RhdGVtZW50PiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImludCI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6aW50PiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImludCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaW50IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIEwge1xuIiArIAotCQkiICBwdWJsaWMgTCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICB4LnkuWltdIGZpZWxkMTtcbiIgKyAKLQkJIiAgICB4LnkuWltdIGZpZWxkMjtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6aW50PjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdExBXzFGR0xNT0YoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkiLyoqXG4iICsgCi0JCQkiICogMUZHTE1PRlxuIiArIAotCQkJIiAqL1xuIiArIAotCQkJInB1YmxpYyBjbGFzcyBMQSB7XG4iICsgCi0JCQkiCXZvaWRbXSBmb28oKSB7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSIJdm9pZCBiYXIoKSB7XG4iICsgCi0JCQkiCQlmIH1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBtZXRob2QvZmllbGQgd2l0aCBjb3JydXB0ZWQgbWV0aG9kIGhlYWRlcj4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpmPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImYiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImYiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJmIH0iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgTEEge1xuIiArIAotCQkiICBwdWJsaWMgTEEoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZFtdIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGJhcigpIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6Zj47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyB9Ci1wdWJsaWMgdm9pZCB0ZXN0TEIoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkicHVibGljIGNsYXNzIExCIHtcbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSIJdm9pZCBiYXIoKSB7XG4iICsgCi0JCQkiCQlpIH1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBtZXRob2QvZmllbGQgd2l0aCBkdXBsaWNhdGUgbWV0aG9kIGRlY2xhcmF0aW9uPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImkiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmk+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiaSI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoImkgfSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBMQiB7XG4iICsgCi0JCSIgIHB1YmxpYyBMQigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGJhcigpIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6aT47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyB9Ci1wdWJsaWMgdm9pZCB0ZXN0TENfMUZMRzFFMigpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSIvKipcbiIgKyAKLQkJCSIgKiAxRkxHMUUyXG4iICsgCi0JCQkiICovXG4iICsgCi0JCQkicHVibGljIGNsYXNzIExDIHtcbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQlPYmplY3RbXSB4ID0gbmV3IE9iamVjdFsxMF07XG4iICsgCi0JCQkiCQl4IFsxXS5cbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIG1ldGhvZC9maWVsZCBvZiBhcnJheSBlbGVtZW50IHdpdGggZHVtbXkgc3BhY2VzPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInggWzFdLiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk1lbWJlckFjY2Vzczp4WzFdLj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBMQyB7XG4iICsgCi0JCSIgIHB1YmxpYyBMQygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBPYmplY3RbXSB4O1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOnhbMV0uPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IH0KLXB1YmxpYyB2b2lkIHRlc3RNXzFGR0dMTVQoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJIi8qKlxuIiArIAotCQkiICogMUZHR0xNVFxuIiArIAotCQkiICovXG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgTSB7XG4iICsgCi0JCSIJY2xhc3MgTWVtYmVyIHtcbiIgKyAKLQkJIgkJdm9pZCBmb29NZW1iZXIoKSB7XG4iICsgCi0JCSIJCX1cbiIgKyAKLQkJIgl9XG4iICsgCi0JCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCSIJCW5ldyBNZW1iZXIoKS59XG4iICsgCi0JCSJ9XG4iICsgCi0JCSJjbGFzcyBNZW1iZXJPZkNVIHtcbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIG1ldGhvZC9maWVsZCBvZiBleHBsaWNpdCBvYmplY3QgY3JlYXRpb24+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibmV3IE1lbWJlcigpLiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpuZXcgTWVtYmVyKCkuPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIE0ge1xuIiArIAotCQkiICBjbGFzcyBNZW1iZXIge1xuIiArIAotCQkiICAgIE1lbWJlcigpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgdm9pZCBmb29NZW1iZXIoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBNKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOm5ldyBNZW1iZXIoKS4+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iICsgCi0JCSJjbGFzcyBNZW1iZXJPZkNVIHtcbiIgKyAKLQkJIiAgTWVtYmVyT2ZDVSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IH0KLXB1YmxpYyB2b2lkIHRlc3RNQV8xKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJInB1YmxpYyBjbGFzcyBNQSB7XG4iICsgCi0JCQkiCWNsYXNzIE1lbWJlclxuIiArIAotCQkJIgkJZXh0ZW5kcyBqYXZhLnV0aWwuVmVjdG9yIHtcbiIgKyAKLQkJCSIJCXN0YXRpYyB2b2lkIGZvb1N0YXRpY01lbWJlcigpIHtcbiIgKyAKLQkJCSIJCX1cbiIgKyAKLQkJCSIJCXZvaWQgZm9vTWVtYmVyKCkge1xuIiArIAotCQkJIgkJfVxuIiArIAotCQkJIgkJY2xhc3MgTWVtYmVyTWVtYmVyIHtcbiIgKyAKLQkJCSIJCQl2b2lkIGZvb01lbWJlck1lbWJlcigpIHtcbiIgKyAKLQkJCSIJCQkJTWVtYmVyT2ZDVU1BIG0gPSBcbiIgKyAKLQkJCSIJCQkJCW5ldyBNZW1iZXJPZkNVTUEoKTsgXG4iICsgCi0JCQkiCQkJfVxuIiArIAotCQkJIgkJfVxuIiArIAotCQkJIgkJY2xhc3MgTWVtYmVyTWVtYmVyMiB7XG4iICsgCi0JCQkiCQl9XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQlNZW1iZSB9XG4iICsgCi0JCQkiCXZvaWQgZm9vYmFyKCkge1xuIiArIAotCQkJIgkJbmV3IE1lbWJlcigpLn1cbiIgKyAKLQkJCSIJY2xhc3MgTWVtYmVyMiB7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSJ9XG4iICsgCi0JCQkiY2xhc3MgTWVtYmVyT2ZDVU1BIHtcbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiB0eXBlPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIk1lbWJlIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpNZW1iZT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJNZW1iZSI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiTWVtYmUiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJNZW1iZSB9IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIE1BIHtcbiIgKyAKLQkJIiAgY2xhc3MgTWVtYmVyIGV4dGVuZHMgamF2YS51dGlsLlZlY3RvciB7XG4iICsgCi0JCSIgICAgY2xhc3MgTWVtYmVyTWVtYmVyIHtcbiIgKyAKLQkJIiAgICAgIE1lbWJlck1lbWJlcigpIHtcbiIgKyAKLQkJIiAgICAgIH1cbiIgKyAKLQkJIiAgICAgIHZvaWQgZm9vTWVtYmVyTWVtYmVyKCkge1xuIiArIAotCQkiICAgICAgfVxuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgICBjbGFzcyBNZW1iZXJNZW1iZXIyIHtcbiIgKyAKLQkJIiAgICAgIE1lbWJlck1lbWJlcjIoKSB7XG4iICsgCi0JCSIgICAgICB9XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICAgIE1lbWJlcigpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgc3RhdGljIHZvaWQgZm9vU3RhdGljTWVtYmVyKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgICB2b2lkIGZvb01lbWJlcigpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgY2xhc3MgTWVtYmVyMiB7XG4iICsgCi0JCSIgICAgTWVtYmVyMigpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIE1BKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpNZW1iZT47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb29iYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIgKyAKLQkJImNsYXNzIE1lbWJlck9mQ1VNQSB7XG4iICsgCi0JCSIgIE1lbWJlck9mQ1VNQSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IH0KLXB1YmxpYyB2b2lkIHRlc3RNQV8yKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJInB1YmxpYyBjbGFzcyBNQSB7XG4iICsgCi0JCQkiCWNsYXNzIE1lbWJlclxuIiArIAotCQkJIgkJZXh0ZW5kcyBqYXZhLnV0aWwuVmVjdG9yIHtcbiIgKyAKLQkJCSIJCXN0YXRpYyB2b2lkIGZvb1N0YXRpY01lbWJlcigpIHtcbiIgKyAKLQkJCSIJCX1cbiIgKyAKLQkJCSIJCXZvaWQgZm9vTWVtYmVyKCkge1xuIiArIAotCQkJIgkJfVxuIiArIAotCQkJIgkJY2xhc3MgTWVtYmVyTWVtYmVyIHtcbiIgKyAKLQkJCSIJCQl2b2lkIGZvb01lbWJlck1lbWJlcigpIHtcbiIgKyAKLQkJCSIJCQkJTWVtYmVyT2ZDVU1BIG0gPSBcbiIgKyAKLQkJCSIJCQkJCW5ldyBNZW1iZXJPZkNVTUEoKTsgXG4iICsgCi0JCQkiCQkJfVxuIiArIAotCQkJIgkJfVxuIiArIAotCQkJIgkJY2xhc3MgTWVtYmVyTWVtYmVyMiB7XG4iICsgCi0JCQkiCQl9XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQlNZW1iZSB9XG4iICsgCi0JCQkiCXZvaWQgZm9vYmFyKCkge1xuIiArIAotCQkJIgkJbmV3IE1lbWJlcigpLn1cbiIgKyAKLQkJCSIJY2xhc3MgTWVtYmVyMiB7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSJ9XG4iICsgCi0JCQkiY2xhc3MgTWVtYmVyT2ZDVU1BIHtcbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBvYmplY3QgY3JlYXRpb24gdHlwZT4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJNZW1iZXJPZkNVIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpNZW1iZXJPZkNVPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIk1lbWJlck9mQ1UiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIk1lbWJlck9mQ1VNQSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoIk1lbWJlck9mQ1VNQSgpOyIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBNQSB7XG4iICsgCi0JCSIgIGNsYXNzIE1lbWJlciBleHRlbmRzIGphdmEudXRpbC5WZWN0b3Ige1xuIiArIAotCQkiICAgIGNsYXNzIE1lbWJlck1lbWJlciB7XG4iICsgCi0JCSIgICAgICBNZW1iZXJNZW1iZXIoKSB7XG4iICsgCi0JCSIgICAgICB9XG4iICsgCi0JCSIgICAgICB2b2lkIGZvb01lbWJlck1lbWJlcigpIHtcbiIgKyAKLQkJIiAgICAgICAgTWVtYmVyT2ZDVU1BIG0gPSBuZXcgPENvbXBsZXRlT25UeXBlOk1lbWJlck9mQ1U+KCk7XG4iICsgCi0JCSIgICAgICB9XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICAgIGNsYXNzIE1lbWJlck1lbWJlcjIge1xuIiArIAotCQkiICAgICAgTWVtYmVyTWVtYmVyMigpIHtcbiIgKyAKLQkJIiAgICAgIH1cbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgTWVtYmVyKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgICBzdGF0aWMgdm9pZCBmb29TdGF0aWNNZW1iZXIoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICAgIHZvaWQgZm9vTWVtYmVyKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBjbGFzcyBNZW1iZXIyIHtcbiIgKyAKLQkJIiAgICBNZW1iZXIyKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgTUEoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb29iYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIgKyAKLQkJImNsYXNzIE1lbWJlck9mQ1VNQSB7XG4iICsgCi0JCSIgIE1lbWJlck9mQ1VNQSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IH0KLXB1YmxpYyB2b2lkIHRlc3RNQV8zKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJInB1YmxpYyBjbGFzcyBNQSB7XG4iICsgCi0JCQkiCWNsYXNzIE1lbWJlclxuIiArIAotCQkJIgkJZXh0ZW5kcyBqYXZhLnV0aWwuVmVjdG9yIHtcbiIgKyAKLQkJCSIJCXN0YXRpYyB2b2lkIGZvb1N0YXRpY01lbWJlcigpIHtcbiIgKyAKLQkJCSIJCX1cbiIgKyAKLQkJCSIJCXZvaWQgZm9vTWVtYmVyKCkge1xuIiArIAotCQkJIgkJfVxuIiArIAotCQkJIgkJY2xhc3MgTWVtYmVyTWVtYmVyIHtcbiIgKyAKLQkJCSIJCQl2b2lkIGZvb01lbWJlck1lbWJlcigpIHtcbiIgKyAKLQkJCSIJCQkJTWVtYmVyT2ZDVU1BIG0gPSBcbiIgKyAKLQkJCSIJCQkJCW5ldyBNZW1iZXJPZkNVTUEoKTsgXG4iICsgCi0JCQkiCQkJfVxuIiArIAotCQkJIgkJfVxuIiArIAotCQkJIgkJY2xhc3MgTWVtYmVyTWVtYmVyMiB7XG4iICsgCi0JCQkiCQl9XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQlNZW1iZSB9XG4iICsgCi0JCQkiCXZvaWQgZm9vYmFyKCkge1xuIiArIAotCQkJIgkJbmV3IE1lbWJlcigpLn1cbiIgKyAKLQkJCSIJY2xhc3MgTWVtYmVyMiB7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSJ9XG4iICsgCi0JCQkiY2xhc3MgTWVtYmVyT2ZDVU1BIHtcbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBtZXRob2QvZmllbGQgb2Ygb2JqZWN0IGNyZWF0aW9uPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIm5ldyBNZW1iZXIoKS4iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6bmV3IE1lbWJlcigpLj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBNQSB7XG4iICsgCi0JCSIgIGNsYXNzIE1lbWJlciBleHRlbmRzIGphdmEudXRpbC5WZWN0b3Ige1xuIiArIAotCQkiICAgIGNsYXNzIE1lbWJlck1lbWJlciB7XG4iICsgCi0JCSIgICAgICBNZW1iZXJNZW1iZXIoKSB7XG4iICsgCi0JCSIgICAgICB9XG4iICsgCi0JCSIgICAgICB2b2lkIGZvb01lbWJlck1lbWJlcigpIHtcbiIgKyAKLQkJIiAgICAgIH1cbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgY2xhc3MgTWVtYmVyTWVtYmVyMiB7XG4iICsgCi0JCSIgICAgICBNZW1iZXJNZW1iZXIyKCkge1xuIiArIAotCQkiICAgICAgfVxuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgICBNZW1iZXIoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICAgIHN0YXRpYyB2b2lkIGZvb1N0YXRpY01lbWJlcigpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgdm9pZCBmb29NZW1iZXIoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGNsYXNzIE1lbWJlcjIge1xuIiArIAotCQkiICAgIE1lbWJlcjIoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBNQSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvb2JhcigpIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk1lbWJlckFjY2VzczpuZXcgTWVtYmVyKCkuPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiArIAotCQkiY2xhc3MgTWVtYmVyT2ZDVU1BIHtcbiIgKyAKLQkJIiAgTWVtYmVyT2ZDVU1BKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgfQotcHVibGljIHZvaWQgdGVzdE1CXzFGSFNMTVFfMSgpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSIvKipcbiIgKyAKLQkJCSIgKiAxRkhTTE1RXG4iICsgCi0JCQkiICovXG4iICsgCi0JCQkicHVibGljIGNsYXNzIE1CIHtcbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQl0cnkge1xuIiArIAotCQkJIgkJCVN5c3RlbS5vdXQucHJpbnRsbihcIlwiKTtcbiIgKyAKLQkJCSIJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlRmlyc3QpIHtcbiIgKyAKLQkJCSIJCQllIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlU2Vjb25kKSB7XG4iICsgCi0JCQkiCQkJZSB9XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBsb2NhbCB2YXJpYWJsZSBuYW1lIGludG8gY2F0Y2ggYmxvY2s+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZSI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6ZT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJlIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJlIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigiZSB9IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIE1CIHtcbiIgKyAKLQkJIiAgcHVibGljIE1CKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAge1xuIiArIAotCQkiICAgICAgRXhjZXB0aW9uIGVGaXJzdDtcbiIgKyAKLQkJIiAgICAgIDxDb21wbGV0ZU9uTmFtZTplPjtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyB9Ci1wdWJsaWMgdm9pZCB0ZXN0TUJfMUZIU0xNUV8yKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJIi8qKlxuIiArIAotCQkJIiAqIDFGSFNMTVFcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgTUIge1xuIiArIAotCQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKLQkJCSIJCXRyeSB7XG4iICsgCi0JCQkiCQkJU3lzdGVtLm91dC5wcmludGxuKFwiXCIpO1xuIiArIAotCQkJIgkJfSBjYXRjaCAoRXhlcHRpb24gZUZpcnN0KSB7XG4iICsgCi0JCQkiCQkJZSB9IGNhdGNoIChFeGNlcHRpb24gZVNlY29uZCkge1xuIiArIAotCQkJIgkJCWUgfVxuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbG9jYWwgdmFyaWFibGUgbmFtZSBpbnRvIGNhdGNoIGJsb2NrPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImUiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiZSI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiZSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoImUgfVxuIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIE1CIHtcbiIgKyAKLQkJIiAgcHVibGljIE1CKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIHtcbiIgKyAKLQkJIiAgICAgIEV4Y2VwdGlvbiBlU2Vjb25kO1xuIiArIAotCQkiICAgICAgPENvbXBsZXRlT25OYW1lOmU+O1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IH0KLXB1YmxpYyB2b2lkIHRlc3RNQ18xRko4RDlaKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJIi8qKlxuIiArIAotCQkJIiAqIDFGSjhEOVpcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgTUMge1xuIiArIAotCQkJIglwMi5YIHNvbWVGaWVsZDtcbiIgKyAKLQkJCSIJcHVibGljIHZvaWQgZm9vKCkge1xuIiArIAotCQkJIgkJbmV3IHAyLlgoXG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBvYmplY3QgY3JlYXRpb24gYXJndW1lbnQ+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibmV3IHAyLlgoIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uQWxsb2NhdGlvbkV4cHJlc3Npb246bmV3IHAyLlgoKT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBNQyB7XG4iICsgCi0JCSIgIHAyLlggc29tZUZpZWxkO1xuIiArIAotCQkiICBwdWJsaWMgTUMoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uQWxsb2NhdGlvbkV4cHJlc3Npb246bmV3IHAyLlgoKT47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyB9Ci1wdWJsaWMgdm9pZCB0ZXN0TigpIHsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7IFxuIiArIAotCQkicHVibGljIGNsYXNzIE4gZXh0ZW5kcyBwLk0ge1xuIiArIAotCQkiCXZvaWQgZm9vKCkge1xuIiArIAotCQkiCQljbGFzcyBNTG9jYWxcbiIgKyAKLQkJIgkJCWV4dGVuZHMgU2NobXVyeiB7XG4iICsgCi0JCSIJCQl2b2lkIGZvbygpIHtcbiIgKyAKLQkJIgkJCX1cbiIgKyAKLQkJIgkJCWludCBmaWVsZDE7XG4iICsgCi0JCSIJCQljbGFzcyBNTG9jYWxNZW1iZXJcbiIgKyAKLQkJIgkJCQlleHRlbmRzIG15SW5uZXJDIHtcbiIgKyAKLQkJIgkJCQl2b2lkIGZvbygpIHtcbiIgKyAKLQkJIgkJCQl9XG4iICsgCi0JCSIJCQkJdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIJCQkJCW5ldyBNIH1cbiIgKyAKLQkJIgkJCX1cbiIgKyAKLQkJIgkJCWNsYXNzIE1Mb2NhbE1lbWJlcjIge1xuIiArIAotCQkiCQkJCXZvaWQgZm9vTXlJbm5lckMoKSB7XG4iICsgCi0JCSIJCQkJfVxuIiArIAotCQkiCQkJfVxuIiArIAotCQkiCQl9XG4iICsgCi0JCSIJfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gb2JqZWN0IGNyZWF0aW9uIHR5cGU+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibmV3IE0iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOk0+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiTSI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiTSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBOIGV4dGVuZHMgcC5NIHtcbiIgKyAKLQkJIiAgcHVibGljIE4oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgY2xhc3MgTUxvY2FsIGV4dGVuZHMgU2NobXVyeiB7XG4iICsgCi0JCSIgICAgICBjbGFzcyBNTG9jYWxNZW1iZXIgZXh0ZW5kcyBteUlubmVyQyB7XG4iICsgCi0JCSIgICAgICAgIE1Mb2NhbE1lbWJlcigpIHtcbiIgKyAKLQkJIiAgICAgICAgfVxuIiArIAotCQkiICAgICAgICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICAgICAgfVxuIiArIAotCQkiICAgICAgICB2b2lkIGJhcigpIHtcbiIgKyAKLQkJIiAgICAgICAgICBuZXcgPENvbXBsZXRlT25UeXBlOk0+KCk7XG4iICsgCi0JCSIgICAgICAgIH1cbiIgKyAKLQkJIiAgICAgIH1cbiIgKyAKLQkJIiAgICAgIGNsYXNzIE1Mb2NhbE1lbWJlcjIge1xuIiArIAotCQkiICAgICAgICBNTG9jYWxNZW1iZXIyKCkge1xuIiArIAotCQkiICAgICAgICB9XG4iICsgCi0JCSIgICAgICAgIHZvaWQgZm9vTXlJbm5lckMoKSB7XG4iICsgCi0JCSIgICAgICAgIH1cbiIgKyAKLQkJIiAgICAgIH1cbiIgKyAKLQkJIiAgICAgIGludCBmaWVsZDE7XG4iICsgCi0JCSIgICAgICBNTG9jYWwoKSB7XG4iICsgCi0JCSIgICAgICB9XG4iICsgCi0JCSIgICAgICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICAgIH1cbiIgKyAKLQkJIiAgICB9O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgfQotcHVibGljIHZvaWQgdGVzdE5BXzEoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkiY2xhc3MgTkV4Y2VwdGlvbjJcbiIgKyAKLQkJCSIJZXh0ZW5kcyBOb0NsYXNzRGVmRm91bmRFcnJvciB7XG4iICsgCi0JCQkifVxuIiArIAotCQkJImludGVyZmFjZSBOSW50ZXJmYWNlIHtcbiIgKyAKLQkJCSIJdm9pZCBmb28oKTtcbiIgKyAKLQkJCSJ9XG4iICsgCi0JCQkiY2xhc3MgREFCIHtcbiIgKyAKLQkJCSIJcHVibGljIERBIGZvbygpIHtcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIglwdWJsaWMgaW50IGZvdWZvdTtcbiIgKyAKLQkJCSJ9XG4iICsgCi0JCQkiY2xhc3MgREFOQSB7XG4iICsgCi0JCQkiCXB1YmxpYyBpbnQgZjtcbiIgKyAKLQkJCSIJTiBmaWVsZEM7XG4iICsgCi0JCQkifVxuIiArIAotCQkJInB1YmxpYyBjbGFzcyBOQVxuIiArIAotCQkJIglleHRlbmRzIE5FeGNlcHRpb24yXG4iICsgCi0JCQkiCWltcGxlbWVudHMgTiB7XG4iICsgCi0JCQkiCURBIGZpZWxkQjtcbiIgKyAKLQkJCSIJY2xhc3MgZnJlYWsge1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkiCXZvaWQgZGVkZSgpIHtcbiIgKyAKLQkJCSIJCURBIGxvY2FsO1xuIiArIAotCQkJIgkJbG9jYWwuZmllbGRDLmZvbygpO1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIiArIAotCQkJImludGVyZmFjZSBOQ29vbCB7XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbG9jYWwgdmFyaWFibGUgbmFtZT4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJsIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpsPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImwiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImxvY2FsIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigibG9jYWwuIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkiY2xhc3MgTkV4Y2VwdGlvbjIgZXh0ZW5kcyBOb0NsYXNzRGVmRm91bmRFcnJvciB7XG4iICsgCi0JCSIgIE5FeGNlcHRpb24yKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iICsgCi0JCSJpbnRlcmZhY2UgTkludGVyZmFjZSB7XG4iICsgCi0JCSIgIHZvaWQgZm9vKCk7XG4iICsgCi0JCSJ9XG4iICsgCi0JCSJjbGFzcyBEQUIge1xuIiArIAotCQkiICBwdWJsaWMgaW50IGZvdWZvdTtcbiIgKyAKLQkJIiAgREFCKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBEQSBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIgKyAKLQkJImNsYXNzIERBTkEge1xuIiArIAotCQkiICBwdWJsaWMgaW50IGY7XG4iICsgCi0JCSIgIE4gZmllbGRDO1xuIiArIAotCQkiICBEQU5BKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgTkEgZXh0ZW5kcyBORXhjZXB0aW9uMiBpbXBsZW1lbnRzIE4ge1xuIiArIAotCQkiICBjbGFzcyBmcmVhayB7XG4iICsgCi0JCSIgICAgZnJlYWsoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIERBIGZpZWxkQjtcbiIgKyAKLQkJIiAgcHVibGljIE5BKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZGVkZSgpIHtcbiIgKyAKLQkJIiAgICBEQSBsb2NhbDtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6bD47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIgKyAKLQkJImludGVyZmFjZSBOQ29vbCB7XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgfQotcHVibGljIHZvaWQgdGVzdE5BXzIoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkiY2xhc3MgTkV4Y2VwdGlvbjJcbiIgKyAKLQkJCSIJZXh0ZW5kcyBOb0NsYXNzRGVmRm91bmRFcnJvciB7XG4iICsgCi0JCQkifVxuIiArIAotCQkJImludGVyZmFjZSBOSW50ZXJmYWNlIHtcbiIgKyAKLQkJCSIJdm9pZCBmb28oKTtcbiIgKyAKLQkJCSJ9XG4iICsgCi0JCQkiY2xhc3MgREFCIHtcbiIgKyAKLQkJCSIJcHVibGljIERBIGZvbygpIHtcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIglwdWJsaWMgaW50IGZvdWZvdTtcbiIgKyAKLQkJCSJ9XG4iICsgCi0JCQkiY2xhc3MgREFOQSB7XG4iICsgCi0JCQkiCXB1YmxpYyBpbnQgZjtcbiIgKyAKLQkJCSIJTiBmaWVsZEM7XG4iICsgCi0JCQkifVxuIiArIAotCQkJInB1YmxpYyBjbGFzcyBOQVxuIiArIAotCQkJIglleHRlbmRzIE5FeGNlcHRpb24yXG4iICsgCi0JCQkiCWltcGxlbWVudHMgTiB7XG4iICsgCi0JCQkiCURBIGZpZWxkQjtcbiIgKyAKLQkJCSIJY2xhc3MgZnJlYWsge1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkiCXZvaWQgZGVkZSgpIHtcbiIgKyAKLQkJCSIJCURBIGxvY2FsO1xuIiArIAotCQkJIgkJbG9jYWwuZmllbGRDLmZvbygpO1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIiArIAotCQkJImludGVyZmFjZSBOQ29vbCB7XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbWV0aG9kL2ZpZWxkIG9mIGxvY2FsIHZhcmlhYmxlPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImxvY2FsLmYiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmxvY2FsLmY+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiZiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAibG9jYWwuZmllbGRDIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkiY2xhc3MgTkV4Y2VwdGlvbjIgZXh0ZW5kcyBOb0NsYXNzRGVmRm91bmRFcnJvciB7XG4iICsgCi0JCSIgIE5FeGNlcHRpb24yKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iICsgCi0JCSJpbnRlcmZhY2UgTkludGVyZmFjZSB7XG4iICsgCi0JCSIgIHZvaWQgZm9vKCk7XG4iICsgCi0JCSJ9XG4iICsgCi0JCSJjbGFzcyBEQUIge1xuIiArIAotCQkiICBwdWJsaWMgaW50IGZvdWZvdTtcbiIgKyAKLQkJIiAgREFCKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBEQSBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIgKyAKLQkJImNsYXNzIERBTkEge1xuIiArIAotCQkiICBwdWJsaWMgaW50IGY7XG4iICsgCi0JCSIgIE4gZmllbGRDO1xuIiArIAotCQkiICBEQU5BKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgTkEgZXh0ZW5kcyBORXhjZXB0aW9uMiBpbXBsZW1lbnRzIE4ge1xuIiArIAotCQkiICBjbGFzcyBmcmVhayB7XG4iICsgCi0JCSIgICAgZnJlYWsoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIERBIGZpZWxkQjtcbiIgKyAKLQkJIiAgcHVibGljIE5BKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZGVkZSgpIHtcbiIgKyAKLQkJIiAgICBEQSBsb2NhbDtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6bG9jYWwuZj47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIgKyAKLQkJImludGVyZmFjZSBOQ29vbCB7XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgfQotcHVibGljIHZvaWQgdGVzdE5BXzMoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkiY2xhc3MgTkV4Y2VwdGlvbjJcbiIgKyAKLQkJCSIJZXh0ZW5kcyBOb0NsYXNzRGVmRm91bmRFcnJvciB7XG4iICsgCi0JCQkifVxuIiArIAotCQkJImludGVyZmFjZSBOSW50ZXJmYWNlIHtcbiIgKyAKLQkJCSIJdm9pZCBmb28oKTtcbiIgKyAKLQkJCSJ9XG4iICsgCi0JCQkiY2xhc3MgREFCIHtcbiIgKyAKLQkJCSIJcHVibGljIERBIGZvbygpIHtcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIglwdWJsaWMgaW50IGZvdWZvdTtcbiIgKyAKLQkJCSJ9XG4iICsgCi0JCQkiY2xhc3MgREFOQSB7XG4iICsgCi0JCQkiCXB1YmxpYyBpbnQgZjtcbiIgKyAKLQkJCSIJTiBmaWVsZEM7XG4iICsgCi0JCQkifVxuIiArIAotCQkJInB1YmxpYyBjbGFzcyBOQVxuIiArIAotCQkJIglleHRlbmRzIE5FeGNlcHRpb24yXG4iICsgCi0JCQkiCWltcGxlbWVudHMgTiB7XG4iICsgCi0JCQkiCURBIGZpZWxkQjtcbiIgKyAKLQkJCSIJY2xhc3MgZnJlYWsge1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkiCXZvaWQgZGVkZSgpIHtcbiIgKyAKLQkJCSIJCURBIGxvY2FsO1xuIiArIAotCQkJIgkJbG9jYWwuZmllbGRDLmZvbygpO1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIiArIAotCQkJImludGVyZmFjZSBOQ29vbCB7XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbWV0aG9kL2ZpZWxkIG9mIGxvY2FsIHZhcmlhYmxlPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImxvY2FsLmZpZWxkQy4iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmxvY2FsLmZpZWxkQy4+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJsb2NhbC5maWVsZEMuIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkiY2xhc3MgTkV4Y2VwdGlvbjIgZXh0ZW5kcyBOb0NsYXNzRGVmRm91bmRFcnJvciB7XG4iICsgCi0JCSIgIE5FeGNlcHRpb24yKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iICsgCi0JCSJpbnRlcmZhY2UgTkludGVyZmFjZSB7XG4iICsgCi0JCSIgIHZvaWQgZm9vKCk7XG4iICsgCi0JCSJ9XG4iICsgCi0JCSJjbGFzcyBEQUIge1xuIiArIAotCQkiICBwdWJsaWMgaW50IGZvdWZvdTtcbiIgKyAKLQkJIiAgREFCKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBEQSBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIgKyAKLQkJImNsYXNzIERBTkEge1xuIiArIAotCQkiICBwdWJsaWMgaW50IGY7XG4iICsgCi0JCSIgIE4gZmllbGRDO1xuIiArIAotCQkiICBEQU5BKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgTkEgZXh0ZW5kcyBORXhjZXB0aW9uMiBpbXBsZW1lbnRzIE4ge1xuIiArIAotCQkiICBjbGFzcyBmcmVhayB7XG4iICsgCi0JCSIgICAgZnJlYWsoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIERBIGZpZWxkQjtcbiIgKyAKLQkJIiAgcHVibGljIE5BKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZGVkZSgpIHtcbiIgKyAKLQkJIiAgICBEQSBsb2NhbDtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6bG9jYWwuZmllbGRDLj47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIgKyAKLQkJImludGVyZmFjZSBOQ29vbCB7XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgfQotcHVibGljIHZvaWQgdGVzdE5CKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJInB1YmxpYyBjbGFzcyBOQiB7XG4iICsgCi0JCQkiCXZvaWQgZm9vKCkge1xuIiArIAotCQkJIgkJaW50IGlPdXRzaWRlO1xuIiArIAotCQkJIgkJaWYgKGkgIT0gMCkge1xuIiArIAotCQkJIgkJCWZvciAoaW50IGkgPSAxMDsgLS1pID49IDA7KVxuIiArIAotCQkJIgkJCQl1bml0W2ldLnBhcnNlTWV0aG9kKFxuIiArIAotCQkJIgkJCQkJcGFyc2VyLCBcbiIgKyAKLQkJCSIJCQkJCXVuaXQpOyBcbiIgKyAKLQkJCSIJCX1cbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIHZhcmlhYmxlIG5hbWUgaW50byBmb3Igc3RhdGVtZW50PiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImkiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmk+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiaSI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoImkgPj0iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgTkIge1xuIiArIAotCQkiICBwdWJsaWMgTkIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgaW50IGlPdXRzaWRlO1xuIiArIAotCQkiICAgIHtcbiIgKyAKLQkJIiAgICAgIGludCBpO1xuIiArIAotCQkiICAgICAgLS0gPENvbXBsZXRlT25OYW1lOmk+O1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IH0KLXB1YmxpYyB2b2lkIHRlc3ROQ18xRko4RDlaKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJIi8qKlxuIiArIAotCQkJIiAqIDFGSjhEOVpcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgTkMge1xuIiArIAotCQkJIglTdHJpbmcgcyA9IG5ldyBTdHJpbmcoXG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBmaWVsZCBpbnRpYWxpemVyIGludG8gY29ycnVwdGVkIGNsYXNzIGRlY2xhcmF0aW9uPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIm5ldyBTdHJpbmcoIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uQWxsb2NhdGlvbkV4cHJlc3Npb246bmV3IFN0cmluZygpPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIE5DIHtcbiIgKyAKLQkJIiAgU3RyaW5nIHMgPSA8Q29tcGxldGVPbkFsbG9jYXRpb25FeHByZXNzaW9uOm5ldyBTdHJpbmcoKT47XG4iICsgCi0JCSIgIHB1YmxpYyBOQygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyB9Ci1wdWJsaWMgdm9pZCB0ZXN0T18xRkcxWVUwKCkgewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCSIvKipcbiIgKyAKLQkJIiAqIDFGRzFZVTBcbiIgKyAKLQkJIiAqL1xuIiArIAotCQkicHVibGljIGNsYXNzIE9cbiIgKyAKLQkJIglleHRlbmRzIGphdmEudXRpbC5WZWN0b3Ige1xuIiArIAotCQkiCXZvaWQgYmFyKGJvb2xlYW4gYmJiYikge1xuIiArIAotCQkiCQl0aGlzLn1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIG1ldGhvZC9maWVsZCBvZiBleHBsaWNpdCB0aGlzPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRoaXMuIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOnRoaXMuPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidGhpcy4iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgTyBleHRlbmRzIGphdmEudXRpbC5WZWN0b3Ige1xuIiArIAotCQkiICBwdWJsaWMgTygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGJhcihib29sZWFuIGJiYmIpIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk1lbWJlckFjY2Vzczp0aGlzLj47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyB9Ci1wdWJsaWMgdm9pZCB0ZXN0T0FfMSgpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgT0Ege1xuIiArIAotCQkJIgl2b2lkIHByb2MoKSB7XG4iICsgCi0JCQkiCQlpbnRbXSBhID0gbmV3IGludFsxMF07XG4iICsgCi0JCQkiCQlPYmplY3QgYiA9IGE7XG4iICsgCi0JCQkiCQlDbGFzcyBjID0gYS5nZXRDbGFzcygpO1xuIiArIAotCQkJIgkJU3RyaW5nIHMgPSBhLnRvU3RyaW5nKCk7XG4iICsgCi0JCQkiCQlib29sZWFuIGwgPSBhLmVxdWFscyhiKTtcbiIgKyAKLQkJCSIJCWludCBoID0gYS5oYXNoQ29kZSgpO1xuIiArIAotCQkJIgkJdHJ5IHtcbiIgKyAKLQkJCSIJCQlhLndhaXQoKTtcbiIgKyAKLQkJCSIJCQlhLndhaXQoMyk7XG4iICsgCi0JCQkiCQkJYS53YWl0KDQsIDUpO1xuIiArIAotCQkJIgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHtcbiIgKyAKLQkJCSIJCX1cbiIgKyAKLQkJCSIJCWEubm90aWZ5KCk7XG4iICsgCi0JCQkiCQlhLm5vdGlmeUFsbCgpO1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbWV0aG9kL2ZpZWxkIG9mIGFycmF5PiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImEubiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6YS5uPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIm4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImEubm90aWZ5IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIE9BIHtcbiIgKyAKLQkJIiAgcHVibGljIE9BKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgcHJvYygpIHtcbiIgKyAKLQkJIiAgICBpbnRbXSBhO1xuIiArIAotCQkiICAgIE9iamVjdCBiO1xuIiArIAotCQkiICAgIENsYXNzIGM7XG4iICsgCi0JCSIgICAgU3RyaW5nIHM7XG4iICsgCi0JCSIgICAgYm9vbGVhbiBsO1xuIiArIAotCQkiICAgIGludCBoO1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTphLm4+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgfQotcHVibGljIHZvaWQgdGVzdE9BXzIoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkicHVibGljIGNsYXNzIE9BIHtcbiIgKyAKLQkJCSIJdm9pZCBwcm9jKCkge1xuIiArIAotCQkJIgkJaW50W10gYSA9IG5ldyBpbnRbMTBdO1xuIiArIAotCQkJIgkJT2JqZWN0IGIgPSBhO1xuIiArIAotCQkJIgkJQ2xhc3MgYyA9IGEuZ2V0Q2xhc3MoKTtcbiIgKyAKLQkJCSIJCVN0cmluZyBzID0gYS50b1N0cmluZygpO1xuIiArIAotCQkJIgkJYm9vbGVhbiBsID0gYS5lcXVhbHMoYik7XG4iICsgCi0JCQkiCQlpbnQgaCA9IGEuaGFzaENvZGUoKTtcbiIgKyAKLQkJCSIJCXRyeSB7XG4iICsgCi0JCQkiCQkJYS53YWl0KCk7XG4iICsgCi0JCQkiCQkJYS53YWl0KDMpO1xuIiArIAotCQkJIgkJCWEud2FpdCg0LCA1KTtcbiIgKyAKLQkJCSIJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7XG4iICsgCi0JCQkiCQl9XG4iICsgCi0JCQkiCQlhLm5vdGlmeSgpO1xuIiArIAotCQkJIgkJYS5ub3RpZnlBbGwoKTtcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIG1ldGhvZC9maWVsZCBvZiBhcnJheT4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJhLnciOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmEudz4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ3IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJhLndhaXQiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJhLndhaXQoNCwgNSkiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgT0Ege1xuIiArIAotCQkiICBwdWJsaWMgT0EoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBwcm9jKCkge1xuIiArIAotCQkiICAgIGludFtdIGE7XG4iICsgCi0JCSIgICAgT2JqZWN0IGI7XG4iICsgCi0JCSIgICAgQ2xhc3MgYztcbiIgKyAKLQkJIiAgICBTdHJpbmcgcztcbiIgKyAKLQkJIiAgICBib29sZWFuIGw7XG4iICsgCi0JCSIgICAgaW50IGg7XG4iICsgCi0JCSIgICAge1xuIiArIAotCQkiICAgICAgPENvbXBsZXRlT25OYW1lOmEudz47XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgfQotcHVibGljIHZvaWQgdGVzdE9CXzEoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkicHVibGljIGNsYXNzIE9CIHtcbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQlsYWJlbCA6IHdoaWxlICh0cnVlKSB7XG4iICsgCi0JCQkiCQkJU3lzdGVtLm91dC5wcmludGxuKFwiXCIpO1xuIiArIAotCQkJIgkJCWJyZWFrIGxhYmVsO1xuIiArIAotCQkJIgkJfVxuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24ga2V5d29yZD4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJiIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpiPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImJyZWFrIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigiYnJlYWsiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgT0Ige1xuIiArIAotCQkiICBwdWJsaWMgT0IoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAge1xuIiArIAotCQkiICAgICAgPENvbXBsZXRlT25OYW1lOmI+O1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IH0KLXB1YmxpYyB2b2lkIHRlc3RPQl8yKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJInB1YmxpYyBjbGFzcyBPQiB7XG4iICsgCi0JCQkiCXZvaWQgZm9vKCkge1xuIiArIAotCQkJIgkJbGFiZWwgOiB3aGlsZSAodHJ1ZSkge1xuIiArIAotCQkJIgkJCVN5c3RlbS5vdXQucHJpbnRsbihcIlwiKTtcbiIgKyAKLQkJCSIJCQlicmVhayBsYWJlbDtcbiIgKyAKLQkJCSIJCX1cbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIGxhYmVsIG5hbWU+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibCI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6bD4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJsIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJsYWJlbCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoImxhYmVsIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIE9CIHtcbiIgKyAKLQkJIiAgcHVibGljIE9CKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpsPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IH0KLXB1YmxpYyB2b2lkIHRlc3RPQ18xRk03SjdGKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJIi8qKlxuIiArIAotCQkJIiAqIDFGTTdKN0ZcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSJjbGFzcyBPQyB7XG4iICsgCi0JCQkiCVN0cmluZyBzID0gbmV3IFN0cmluZyhcbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBmaWVsZCBpbml0aWFsaXplcj4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuZXcgU3RyaW5nKCI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbkFsbG9jYXRpb25FeHByZXNzaW9uOm5ldyBTdHJpbmcoKT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJImNsYXNzIE9DIHtcbiIgKyAKLQkJIiAgU3RyaW5nIHMgPSA8Q29tcGxldGVPbkFsbG9jYXRpb25FeHByZXNzaW9uOm5ldyBTdHJpbmcoKT47XG4iICsgCi0JCSIgIE9DKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IH0KLXB1YmxpYyB2b2lkIHRlc3RQXzFGRzFZVTAoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJIi8qKlxuIiArIAotCQkiICogMUZHMVlVMFxuIiArIAotCQkiICovXG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgUCB7XG4iICsgCi0JCSIJe1xuIiArIAotCQkiCQl2b2lkIGJhcigpIHtcbiIgKyAKLQkJIgkJCWYgfVxuIiArIAotCQkiCQl2b2lkIGZvbygpIHtcbiIgKyAKLQkJIgkJfVxuIiArIAotCQkiCX1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIG1ldGhvZC9maWVsZD4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpmPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImYiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImYiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJmIH0iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgUCB7XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgUCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGJhcigpIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6Zj47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyB9Ci1wdWJsaWMgdm9pZCB0ZXN0UEFfMSgpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSJjbGFzcyBQQUhlbHBlciB7XG4iICsgCi0JCQkiCXB1YmxpYyBpbnQgZmllbGRQdWJsaWM7XG4iICsgCi0JCQkiCXByb3RlY3RlZCBpbnQgZmllbGRQcm90ZWN0ZWQ7XG4iICsgCi0JCQkiCXByaXZhdGUgaW50IGZpZWxkUHJpdmF0ZTtcbiIgKyAKLQkJCSIJaW50IGZpZWxkRGVmYXVsdDtcbiIgKyAKLQkJCSIJc3RhdGljIHZvaWQgc3RhdGljRm9vKCkge1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkiCXN0YXRpYyBpbnQgaSA9IDE7XG4iICsgCi0JCQkiCWludCBuZXVuZXUxKCkge1xuIiArIAotCQkJIgkJcmV0dXJuIDA7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSIJdm9pZCBuZXVuZXUyKCkge1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIiArIAotCQkJInB1YmxpYyBjbGFzcyBQQVxuIiArIAotCQkJIglleHRlbmRzIFBBSGVscGVyIHtcbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQlCW10gYiA9IFxuIiArIAotCQkJIgkJCW5ldyBqYXZhLmxhbmcuTnVtYmVyW107IFxuIiArIAotCQkJIgkJamF2YS5sYW5nLlNob3J0IHM7XG4iICsgCi0JCQkiCQkvLyBiWzFdLjtcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIGNvbW1lbnQ+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYlsxXS4iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSBOT05FOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gTk9ORTsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPSBudWxsOwotCi0JdHJ5IHsKLQkJY2hlY2tNZXRob2RQYXJzZSgKLQkJCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJCWN1cnNvckxvY2F0aW9uLCAKLQkJCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCQl0ZXN0TmFtZSk7IAotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gZGV0ZWN0IGludmFsaWQgY3Vyc29yIGxvY2F0aW9uIiwgZmFsc2UpOwkJCi0JfSBjYXRjaChJbnZhbGlkQ3Vyc29yTG9jYXRpb24gZSl7Ci0JCWFzc2VydEVxdWFscygiaW52YWxpZCBjdXJzb3IgbG9jYXRpb246ICIsIGUuaXJyaXRhbnQsIEludmFsaWRDdXJzb3JMb2NhdGlvbi5OT19DT01QTEVUSU9OX0lOU0lERV9DT01NRU5UKTsKLQl9Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0UEFfMigpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSJjbGFzcyBQQUhlbHBlciB7XG4iICsgCi0JCQkiCXB1YmxpYyBpbnQgZmllbGRQdWJsaWM7XG4iICsgCi0JCQkiCXByb3RlY3RlZCBpbnQgZmllbGRQcm90ZWN0ZWQ7XG4iICsgCi0JCQkiCXByaXZhdGUgaW50IGZpZWxkUHJpdmF0ZTtcbiIgKyAKLQkJCSIJaW50IGZpZWxkRGVmYXVsdDtcbiIgKyAKLQkJCSIJc3RhdGljIHZvaWQgc3RhdGljRm9vKCkge1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkiCXN0YXRpYyBpbnQgaSA9IDE7XG4iICsgCi0JCQkiCWludCBuZXVuZXUxKCkge1xuIiArIAotCQkJIgkJcmV0dXJuIDA7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSIJdm9pZCBuZXVuZXUyKCkge1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIiArIAotCQkJInB1YmxpYyBjbGFzcyBQQVxuIiArIAotCQkJIglleHRlbmRzIFBBSGVscGVyIHtcbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQlCW10gYiA9IFxuIiArIAotCQkJIgkJCW5ldyBqYXZhLmxhbmcuTnVtYmVyW107IFxuIiArIAotCQkJIgkJamF2YS5sYW5nLlNob3J0IHM7XG4iICsgCi0JCQkiCQkvLyBiWzFdLjtcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIG5ldyBrZXl3b3JkPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIm4iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOm4+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAibiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAibmV3IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigibmV3ICIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJImNsYXNzIFBBSGVscGVyIHtcbiIgKyAKLQkJIiAgcHVibGljIGludCBmaWVsZFB1YmxpYztcbiIgKyAKLQkJIiAgcHJvdGVjdGVkIGludCBmaWVsZFByb3RlY3RlZDtcbiIgKyAKLQkJIiAgcHJpdmF0ZSBpbnQgZmllbGRQcml2YXRlO1xuIiArIAotCQkiICBpbnQgZmllbGREZWZhdWx0O1xuIiArIAotCQkiICBzdGF0aWMgaW50IGk7XG4iICsgCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIFBBSGVscGVyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHN0YXRpYyB2b2lkIHN0YXRpY0ZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgbmV1bmV1MSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIG5ldW5ldTIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBQQSBleHRlbmRzIFBBSGVscGVyIHtcbiIgKyAKLQkJIiAgcHVibGljIFBBKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIEJbXSBiID0gPENvbXBsZXRlT25OYW1lOm4+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0UEIoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkicHVibGljIGNsYXNzIFBCIHtcbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQljbGFzcyBMb2NhbCB7XG4iICsgCi0JCQkiCQkJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQkJfVxuIiArIAotCQkJIgkJCWNsYXNzIExvY2FsTWVtYmVyMSB7XG4iICsgCi0JCQkiCQkJCXZvaWQgZm9vKCkge1xuIiArIAotCQkJIgkJCQkJY2xhc3MgTG9jYWxNZW1iZXJMb2NhbCB7XG4iICsgCi0JCQkiCQkJCQkJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQkJCQkJCWZcbiIrCi0JCQkiCQkJCQkJfVxuIiArIAotCQkJIgkJCQkJfVxuIiArIAotCQkJIgkJCQl9XG4iICsgCi0JCQkiCQkJfVxuIiArIAotCQkJIgkJCWNsYXNzIExvY2FsTWVtYmVyMiB7XG4iICsgCi0JCQkiCQkJCXZvaWQgZm9vKCkge1xuIiArIAotCQkJIgkJCQl9XG4iICsgCi0JCQkiCQkJfVxuIiArIAotCQkJIgkJfVxuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbWV0aG9kL2ZpZWxkIGludG8gbmVzdGVkIGxvY2FsIHR5cGU+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6Zj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJmIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJmIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigiZlxuIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFBCIHtcbiIgKyAKLQkJIiAgcHVibGljIFBCKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIGNsYXNzIExvY2FsIHtcbiIgKyAKLQkJIiAgICAgIGNsYXNzIExvY2FsTWVtYmVyMSB7XG4iICsgCi0JCSIgICAgICAgIExvY2FsTWVtYmVyMSgpIHtcbiIgKyAKLQkJIiAgICAgICAgfVxuIiArIAotCQkiICAgICAgICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICAgICAgICBjbGFzcyBMb2NhbE1lbWJlckxvY2FsIHtcbiIgKyAKLQkJIiAgICAgICAgICAgIExvY2FsTWVtYmVyTG9jYWwoKSB7XG4iICsgCi0JCSIgICAgICAgICAgICB9XG4iICsgCi0JCSIgICAgICAgICAgICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICAgICAgICAgICAgPENvbXBsZXRlT25OYW1lOmY+O1xuIiArIAotCQkiICAgICAgICAgICAgfVxuIiArIAotCQkiICAgICAgICAgIH07XG4iICsgCi0JCSIgICAgICAgIH1cbiIgKyAKLQkJIiAgICAgIH1cbiIgKyAKLQkJIiAgICAgIGNsYXNzIExvY2FsTWVtYmVyMiB7XG4iICsgCi0JCSIgICAgICAgIExvY2FsTWVtYmVyMigpIHtcbiIgKyAKLQkJIiAgICAgICAgfVxuIiArIAotCQkiICAgICAgICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICAgICAgfVxuIiArIAotCQkiICAgICAgfVxuIiArIAotCQkiICAgICAgTG9jYWwoKSB7XG4iICsgCi0JCSIgICAgICB9XG4iICsgCi0JCSIgICAgICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICAgIH1cbiIgKyAKLQkJIiAgICB9O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0UENfMUZTVTRFRigpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSIvKipcbiIgKyAKLQkJCSIgKiAxRlNVNEVGXG4iICsgCi0JCQkiICovXG4iICsgCi0JCQkiaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7XG4iICsgCi0JCQkicHVibGljIGNsYXNzIFBDIHtcbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQljbGFzcyBJbm5lciB7XG4iICsgCi0JCQkiCQkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7XG4iICsgCi0JCQkiCQkJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQkJCVZlY3RvciB2ID0gbmV3IFZlY3RvcigpO1xuIiArIAotCQkJIgkJCQl2LmFkZEVsZW1lbnQoKTtcbiIgKyAKLQkJCSIJCQl9XG4iICsgCi0JCQkiCQl9XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBtZXRob2QvZmllbGQgaW50byBsb2NhbCB0eXBlPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInYuYSI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6di5hPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImEiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInYuYWRkRWxlbWVudCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJImltcG9ydCBqYXZhLnV0aWwuVmVjdG9yO1xuIiArIAotCQkicHVibGljIGNsYXNzIFBDIHtcbiIgKyAKLQkJIiAgcHVibGljIFBDKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIGNsYXNzIElubmVyIHtcbiIgKyAKLQkJIiAgICAgIFZlY3RvciB2O1xuIiArIAotCQkiICAgICAgSW5uZXIoKSB7XG4iICsgCi0JCSIgICAgICB9XG4iICsgCi0JCSIgICAgICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICAgICAgVmVjdG9yIHY7XG4iICsgCi0JCSIgICAgICAgIDxDb21wbGV0ZU9uTmFtZTp2LmE+O1xuIiArIAotCQkiICAgICAgfVxuIiArIAotCQkiICAgIH07XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RRXzFGRzFZVTAoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJIi8qKlxuIiArIAotCQkiICogMUZHMVlVMFxuIiArIAotCQkiICovXG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgUSB7XG4iICsgCi0JCSIJdm9pZCBiYXIoYm9vbGVhbiBiYmJiKSB7XG4iICsgCi0JCSIJCXRoaXMufVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbWV0aG9kL2ZpZWxkPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRoaXMuIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOnRoaXMuPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidGhpcy4iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgUSB7XG4iICsgCi0JCSIgIHB1YmxpYyBRKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgYmFyKGJvb2xlYW4gYmJiYikge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOnRoaXMuPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdFFBXzEoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkiY2xhc3MgUUFIZWxwZXIge1xuIiArIAotCQkJIglpbnQgaSA9IDEwO1xuIiArIAotCQkJIgl2b2lkIGYoKSB7XG4iICsgCi0JCQkiCQlDaGsuY2hrSW50VmFsKFxuIiArIAotCQkJIgkJCVwiZXJyXzBcIiwgXG4iICsgCi0JCQkiCQkJXCJpXCIsIFxuIiArIAotCQkJIgkJCXRoaXMuaSwgXG4iICsgCi0JCQkiCQkJaSk7IFxuIiArIAotCQkJIgl9XG4iICsgCi0JCQkiCXN0YXRpYyBjbGFzcyBZXG4iICsgCi0JCQkiCQlleHRlbmRzIFFBSGVscGVyIHtcbiIgKyAKLQkJCSIJCXB1YmxpYyB2b2lkIGYoKSB7XG4iICsgCi0JCQkiCQkJc3VwZXIuZigpO1xuIiArIAotCQkJIgkJCWludCBqID0gc3VwZXIuaTtcbiIgKyAKLQkJCSIJCX1cbiIgKyAKLQkJCSIJCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhW10pIHtcbiIgKyAKLQkJCSIJCQlZIG95ID0gbmV3IFkoKTtcbiIgKyAKLQkJCSIJCQlveS5mKCk7XG4iICsgCi0JCQkiCQl9XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSJ9XG4iICsgCi0JCQkicHVibGljIGNsYXNzIFFBIHtcbiIgKyAKLQkJCSIJc3RhdGljIFN0cmluZyBzW10gPSBcbiIgKyAKLQkJCSIJCXtcIkRvbGJ5XCIsIFwiVGh4XCIsfTsgXG4iICsgCi0JCQkiCXZvaWQgY2hlY2soKSB7XG4iICsgCi0JCQkiCQluZXcgUUFIZWxwZXIoKS5uZXcgWSgpLm1haW4oXG4iICsgCi0JCQkiCQkJcyk7IFxuIiArIAotCQkJIgl9XG4iICsgCi0JCQkiCXN0YXRpYyBwdWJsaWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHtcbiIgKyAKLQkJCSIJCW5ldyBRQSgpLmNoZWNrKCk7XG4iICsgCi0JCQkiCQlDaGsuZW5kVGVzdChcImNpbmVyMTExXCIpO1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbWV0aG9kL2ZpZWxkPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIm5ldyBRQUhlbHBlcigpLm5ldyBZKCkubSI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpuZXcgUUFIZWxwZXIoKS5uZXcgWSgpLm0+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAibSI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAibWFpbiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJImNsYXNzIFFBSGVscGVyIHtcbiIgKyAKLQkJIiAgc3RhdGljIGNsYXNzIFkgZXh0ZW5kcyBRQUhlbHBlciB7XG4iICsgCi0JCSIgICAgWSgpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgcHVibGljIHZvaWQgZigpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYSkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgaTtcbiIgKyAKLQkJIiAgUUFIZWxwZXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgUUEge1xuIiArIAotCQkiICBzdGF0aWMgU3RyaW5nW10gcztcbiIgKyAKLQkJIiAgPGNsaW5pdD4oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFFBKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgY2hlY2soKSB7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6bmV3IFFBSGVscGVyKCkubmV3IFkoKS5tPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RRQV8yKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJImNsYXNzIFFBSGVscGVyIHtcbiIgKyAKLQkJCSIJaW50IGkgPSAxMDtcbiIgKyAKLQkJCSIJdm9pZCBmKCkge1xuIiArIAotCQkJIgkJQ2hrLmNoa0ludFZhbChcbiIgKyAKLQkJCSIJCQlcImVycl8wXCIsIFxuIiArIAotCQkJIgkJCVwiaVwiLCBcbiIgKyAKLQkJCSIJCQl0aGlzLmksIFxuIiArIAotCQkJIgkJCWkpOyBcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIglzdGF0aWMgY2xhc3MgWVxuIiArIAotCQkJIgkJZXh0ZW5kcyBRQUhlbHBlciB7XG4iICsgCi0JCQkiCQlwdWJsaWMgdm9pZCBmKCkge1xuIiArIAotCQkJIgkJCXN1cGVyLmYoKTtcbiIgKyAKLQkJCSIJCQlpbnQgaiA9IHN1cGVyLmk7XG4iICsgCi0JCQkiCQl9XG4iICsgCi0JCQkiCQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYVtdKSB7XG4iICsgCi0JCQkiCQkJWSBveSA9IG5ldyBZKCk7XG4iICsgCi0JCQkiCQkJb3kuZigpO1xuIiArIAotCQkJIgkJfVxuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIiArIAotCQkJInB1YmxpYyBjbGFzcyBRQSB7XG4iICsgCi0JCQkiCXN0YXRpYyBTdHJpbmcgc1tdID0gXG4iICsgCi0JCQkiCQl7XCJEb2xieVwiLCBcIlRoeFwiLH07IFxuIiArIAotCQkJIgl2b2lkIGNoZWNrKCkge1xuIiArIAotCQkJIgkJbmV3IFFBSGVscGVyKCkubmV3IFkoKS5tYWluKFxuIiArIAotCQkJIgkJCXMpOyBcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIglzdGF0aWMgcHVibGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7XG4iICsgCi0JCQkiCQluZXcgUUEoKS5jaGVjaygpO1xuIiArIAotCQkJIgkJQ2hrLmVuZFRlc3QoXCJjaW5lcjExMVwiKTtcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIG1ldGhvZC9maWVsZCBvZiBvYmplY3QgY3JlYXRpb24+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibmV3IFFBSGVscGVyKCkuIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOm5ldyBRQUhlbHBlcigpLj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJImNsYXNzIFFBSGVscGVyIHtcbiIgKyAKLQkJIiAgc3RhdGljIGNsYXNzIFkgZXh0ZW5kcyBRQUhlbHBlciB7XG4iICsgCi0JCSIgICAgWSgpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgcHVibGljIHZvaWQgZigpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYSkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgaTtcbiIgKyAKLQkJIiAgUUFIZWxwZXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgUUEge1xuIiArIAotCQkiICBzdGF0aWMgU3RyaW5nW10gcztcbiIgKyAKLQkJIiAgPGNsaW5pdD4oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFFBKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgY2hlY2soKSB7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6bmV3IFFBSGVscGVyKCkuPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RRQV8zKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJImNsYXNzIFFBSGVscGVyIHtcbiIgKyAKLQkJCSIJaW50IGkgPSAxMDtcbiIgKyAKLQkJCSIJdm9pZCBmKCkge1xuIiArIAotCQkJIgkJQ2hrLmNoa0ludFZhbChcbiIgKyAKLQkJCSIJCQlcImVycl8wXCIsIFxuIiArIAotCQkJIgkJCVwiaVwiLCBcbiIgKyAKLQkJCSIJCQl0aGlzLmksIFxuIiArIAotCQkJIgkJCWkpOyBcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIglzdGF0aWMgY2xhc3MgWVxuIiArIAotCQkJIgkJZXh0ZW5kcyBRQUhlbHBlciB7XG4iICsgCi0JCQkiCQlwdWJsaWMgdm9pZCBmKCkge1xuIiArIAotCQkJIgkJCXN1cGVyLmYoKTtcbiIgKyAKLQkJCSIJCQlpbnQgaiA9IHN1cGVyLmk7XG4iICsgCi0JCQkiCQl9XG4iICsgCi0JCQkiCQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYVtdKSB7XG4iICsgCi0JCQkiCQkJWSBveSA9IG5ldyBZKCk7XG4iICsgCi0JCQkiCQkJb3kuZigpO1xuIiArIAotCQkJIgkJfVxuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIiArIAotCQkJInB1YmxpYyBjbGFzcyBRQSB7XG4iICsgCi0JCQkiCXN0YXRpYyBTdHJpbmcgc1tdID0gXG4iICsgCi0JCQkiCQl7XCJEb2xieVwiLCBcIlRoeFwiLH07IFxuIiArIAotCQkJIgl2b2lkIGNoZWNrKCkge1xuIiArIAotCQkJIgkJbmV3IFFBSGVscGVyKCkubmV3IFkoKS5tYWluKFxuIiArIAotCQkJIgkJCXMpOyBcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIglzdGF0aWMgcHVibGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7XG4iICsgCi0JCQkiCQluZXcgUUEoKS5jaGVjaygpO1xuIiArIAotCQkJIgkJQ2hrLmVuZFRlc3QoXCJjaW5lcjExMVwiKTtcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIG1ldGhvZC9maWVsZCBvZiBvYmplY3QgY3JlYXRpb24+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibmV3IFFBSGVscGVyKCkubmV3IFkoKS4iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6bmV3IFFBSGVscGVyKCkubmV3IFkoKS4+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICIiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJjbGFzcyBRQUhlbHBlciB7XG4iICsgCi0JCSIgIHN0YXRpYyBjbGFzcyBZIGV4dGVuZHMgUUFIZWxwZXIge1xuIiArIAotCQkiICAgIFkoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICAgIHB1YmxpYyB2b2lkIGYoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGEpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGk7XG4iICsgCi0JCSIgIFFBSGVscGVyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiArIAotCQkicHVibGljIGNsYXNzIFFBIHtcbiIgKyAKLQkJIiAgc3RhdGljIFN0cmluZ1tdIHM7XG4iICsgCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBRQSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGNoZWNrKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOm5ldyBRQUhlbHBlcigpLm5ldyBZKCkuPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RRQV80KCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJImNsYXNzIFFBSGVscGVyIHtcbiIgKyAKLQkJCSIJaW50IGkgPSAxMDtcbiIgKyAKLQkJCSIJdm9pZCBmKCkge1xuIiArIAotCQkJIgkJQ2hrLmNoa0ludFZhbChcbiIgKyAKLQkJCSIJCQlcImVycl8wXCIsIFxuIiArIAotCQkJIgkJCVwiaVwiLCBcbiIgKyAKLQkJCSIJCQl0aGlzLmksIFxuIiArIAotCQkJIgkJCWkpOyBcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIglzdGF0aWMgY2xhc3MgWVxuIiArIAotCQkJIgkJZXh0ZW5kcyBRQUhlbHBlciB7XG4iICsgCi0JCQkiCQlwdWJsaWMgdm9pZCBmKCkge1xuIiArIAotCQkJIgkJCXN1cGVyLmYoKTtcbiIgKyAKLQkJCSIJCQlpbnQgaiA9IHN1cGVyLmk7XG4iICsgCi0JCQkiCQl9XG4iICsgCi0JCQkiCQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYVtdKSB7XG4iICsgCi0JCQkiCQkJWSBveSA9IG5ldyBZKCk7XG4iICsgCi0JCQkiCQkJb3kuZigpO1xuIiArIAotCQkJIgkJfVxuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIiArIAotCQkJInB1YmxpYyBjbGFzcyBRQSB7XG4iICsgCi0JCQkiCXN0YXRpYyBTdHJpbmcgc1tdID0gXG4iICsgCi0JCQkiCQl7XCJEb2xieVwiLCBcIlRoeFwiLH07IFxuIiArIAotCQkJIgl2b2lkIGNoZWNrKCkge1xuIiArIAotCQkJIgkJbmV3IFFBSGVscGVyKCkubmV3IFkoKS5tYWluKFxuIiArIAotCQkJIgkJCXMpOyBcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIglzdGF0aWMgcHVibGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7XG4iICsgCi0JCQkiCQluZXcgUUEoKS5jaGVjaygpO1xuIiArIAotCQkJIgkJQ2hrLmVuZFRlc3QoXCJjaW5lcjExMVwiKTtcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIG1ldGhvZC9maWVsZCBvZiBvYmplY3QgY3JlYXRpb24+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibmV3IFFBKCkuIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOm5ldyBRQSgpLj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJImNsYXNzIFFBSGVscGVyIHtcbiIgKyAKLQkJIiAgc3RhdGljIGNsYXNzIFkgZXh0ZW5kcyBRQUhlbHBlciB7XG4iICsgCi0JCSIgICAgWSgpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgcHVibGljIHZvaWQgZigpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYSkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgaTtcbiIgKyAKLQkJIiAgUUFIZWxwZXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgUUEge1xuIiArIAotCQkiICBzdGF0aWMgU3RyaW5nW10gcztcbiIgKyAKLQkJIiAgPGNsaW5pdD4oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFFBKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgY2hlY2soKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOm5ldyBRQSgpLj47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RRQl8xRklLODIwKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJIi8qKlxuIiArIAotCQkJIiAqIDFGSUs4MjBcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgUUIge1xuIiArIAotCQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKLQkJCSIJCXtcbiIgKyAKLQkJCSIJCX1cbiIgKyAKLQkJCSIJCS59XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gYmxvY2sgKG5vIGFuc3dlcnMgd2FudGVkKT4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICIuIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTo+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICIiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCIufSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBRQiB7XG4iICsgCi0JCSIgIHB1YmxpYyBRQigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6PjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdFJfMUZHRDMxRSgpIHsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7IFxuIiArIAotCQkiLyoqXG4iICsgCi0JCSIgKiAxRkdEMzFFXG4iICsgCi0JCSIgKi9cbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBSIHtcbiIgKyAKLQkJIgl2b2lkIG1vbygpIHtcbiIgKyAKLQkJIgkJYiB9XG4iICsgCi0JCSIJdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIJfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbWV0aG9kL2ZpZWxkPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImIiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmI+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiYiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiYiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoImIgfSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBSIHtcbiIgKyAKLQkJIiAgcHVibGljIFIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBtb28oKSB7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmI+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgYmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0UkFfMSgpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgUkEgZXh0ZW5kcyBBIHtcbiIgKyAKLQkJCSIJcHJpdmF0ZSBpbnQgZiA9IDU7XG4iICsgCi0JCQkiCWludCBpKGludCBrKSB7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSIJY2xhc3MgQiBleHRlbmRzIEkge1xuIiArIAotCQkJIgkJdm9pZCBmb28oKTtcbiIgKyAKLQkJCSIJCWNsYXNzIEMgZXh0ZW5kcyBaIHtcbiIgKyAKLQkJCSIJCX1cbiIgKyAKLQkJCSIJCWZpbmFsIGludCBmbztcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIglmaW5hbCB2b2lkIGZvbyhrIGopIHtcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIglvIG8oKSB0aHJvd3MgRXhjLCBFeGMge1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkiCXN0YXRpYyB7XG4iICsgCi0JCQkiCQl0aGlzLmZmID0gNTtcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIGluY29ycmVjdCB0aGlzIGNhbGw+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidCI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6dD4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ0IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ0aGlzIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigidGhpcy5mZiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBSQSBleHRlbmRzIEEge1xuIiArIAotCQkiICBjbGFzcyBCIGV4dGVuZHMgSSB7XG4iICsgCi0JCSIgICAgY2xhc3MgQyBleHRlbmRzIFoge1xuIiArIAotCQkiICAgICAgQygpIHtcbiIgKyAKLQkJIiAgICAgIH1cbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgZmluYWwgaW50IGZvO1xuIiArIAotCQkiICAgIEIoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICAgIHZvaWQgZm9vKCk7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHJpdmF0ZSBpbnQgZjtcbiIgKyAKLQkJIiAgc3RhdGljIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6dD47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgPGNsaW5pdD4oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFJBKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBpKGludCBrKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgZmluYWwgdm9pZCBmb28oayBqKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgbyBvKCkgdGhyb3dzIEV4YywgRXhjIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdFJBXzIoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkicHVibGljIGNsYXNzIFJBIGV4dGVuZHMgQSB7XG4iICsgCi0JCQkiCXByaXZhdGUgaW50IGYgPSA1O1xuIiArIAotCQkJIglpbnQgaShpbnQgaykge1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkiCWNsYXNzIEIgZXh0ZW5kcyBJIHtcbiIgKyAKLQkJCSIJCXZvaWQgZm9vKCk7XG4iICsgCi0JCQkiCQljbGFzcyBDIGV4dGVuZHMgWiB7XG4iICsgCi0JCQkiCQl9XG4iICsgCi0JCQkiCQlmaW5hbCBpbnQgZm87XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSIJZmluYWwgdm9pZCBmb28oayBqKSB7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSIJbyBvKCkgdGhyb3dzIEV4YywgRXhjIHtcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIglzdGF0aWMge1xuIiArIAotCQkJIgkJdGhpcy5mZiA9IDU7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiB0PiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInQiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnQ+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAidCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidGhpcyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInRoaXMiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgUkEgZXh0ZW5kcyBBIHtcbiIgKyAKLQkJIiAgY2xhc3MgQiBleHRlbmRzIEkge1xuIiArIAotCQkiICAgIGNsYXNzIEMgZXh0ZW5kcyBaIHtcbiIgKyAKLQkJIiAgICAgIEMoKSB7XG4iICsgCi0JCSIgICAgICB9XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICAgIGZpbmFsIGludCBmbztcbiIgKyAKLQkJIiAgICBCKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgICB2b2lkIGZvbygpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHByaXZhdGUgaW50IGY7XG4iICsgCi0JCSIgIHN0YXRpYyB7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOnQ+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBSQSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgaShpbnQgaykge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGZpbmFsIHZvaWQgZm9vKGsgaikge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIG8gbygpIHRocm93cyBFeGMsIEV4YyB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RSQV8zKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJInB1YmxpYyBjbGFzcyBSQSBleHRlbmRzIEEge1xuIiArIAotCQkJIglwcml2YXRlIGludCBmID0gNTtcbiIgKyAKLQkJCSIJaW50IGkoaW50IGspIHtcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIgljbGFzcyBCIGV4dGVuZHMgSSB7XG4iICsgCi0JCQkiCQl2b2lkIGZvbygpO1xuIiArIAotCQkJIgkJY2xhc3MgQyBleHRlbmRzIFoge1xuIiArIAotCQkJIgkJfVxuIiArIAotCQkJIgkJZmluYWwgaW50IGZvO1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkiCWZpbmFsIHZvaWQgZm9vKGsgaikge1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkiCW8gbygpIHRocm93cyBFeGMsIEV4YyB7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSIJc3RhdGljIHtcbiIgKyAKLQkJCSIJCXRoaXMuZmYgPSA1O1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gZXhjZXB0aW9uIHR5cGU+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiRXhjIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uRXhjZXB0aW9uOkV4Yz4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJFeGMiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIkV4YyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoIkV4YyB7IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFJBIGV4dGVuZHMgQSB7XG4iICsgCi0JCSIgIGNsYXNzIEIgZXh0ZW5kcyBJIHtcbiIgKyAKLQkJIiAgICBjbGFzcyBDIGV4dGVuZHMgWiB7XG4iICsgCi0JCSIgICAgICBDKCkge1xuIiArIAotCQkiICAgICAgfVxuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgICBmaW5hbCBpbnQgZm87XG4iICsgCi0JCSIgICAgQigpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgdm9pZCBmb28oKTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwcml2YXRlIGludCBmO1xuIiArIAotCQkiICBzdGF0aWMge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBSQSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgaShpbnQgaykge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGZpbmFsIHZvaWQgZm9vKGsgaikge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIG8gbygpIHRocm93cyBFeGMsIDxDb21wbGV0ZU9uRXhjZXB0aW9uOkV4Yz4ge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdFJCXzFGSTc0UzMoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkiLyoqXG4iICsgCi0JCQkiICogMUZJNzRTM1xuIiArIAotCQkJIiAqL1xuIiArIAotCQkJInB1YmxpYyBjbGFzcyBSQiB7XG4iICsgCi0JCQkiCWludFtdIHRhYmxlO1xuIiArIAotCQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKLQkJCSIJCWludCB4ID0gdGFibGUufVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIG1ldGhvZC9maWVsZCBvZiBhcnJ5PiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRhYmxlLiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6dGFibGUuPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidGFibGUuIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFJCIHtcbiIgKyAKLQkJIiAgaW50W10gdGFibGU7XG4iICsgCi0JCSIgIHB1YmxpYyBSQigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBpbnQgeCA9IDxDb21wbGV0ZU9uTmFtZTp0YWJsZS4+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0U18xRkdGNjRQXzEoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJIi8qKlxuIiArIAotCQkiICogMUZHRjY0UFxuIiArIAotCQkiICovXG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgUyB7XG4iICsgCi0JCSIJe1xuIiArIAotCQkiCQluZXcgWSgpLi59XG4iICsgCi0JCSIJY2xhc3MgWSB7XG4iICsgCi0JCSIJCXZvaWQgZm9vKCkge1xuIiArIAotCQkiCQl9XG4iICsgCi0JCSIJfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gaW5jb3JyZWN0IGNhbGw+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibmV3IFkoKS4uIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTo+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICIiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgUyB7XG4iICsgCi0JCSIgIGNsYXNzIFkge1xuIiArIAotCQkiICAgIFkoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICAgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB7XG4iICsgCi0JCSIgICAge1xuIiArIAotCQkiICAgICAgPENvbXBsZXRlT25OYW1lOj47XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBTKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0U18xRkdGNjRQXzIoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJIi8qKlxuIiArIAotCQkiICogMUZHRjY0UFxuIiArIAotCQkiICovXG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgUyB7XG4iICsgCi0JCSIJe1xuIiArIAotCQkiCQluZXcgWSgpLi59XG4iICsgCi0JCSIJY2xhc3MgWSB7XG4iICsgCi0JCSIJCXZvaWQgZm9vKCkge1xuIiArIAotCQkiCQl9XG4iICsgCi0JCSIJfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbWV0aG9kL2ZpZWxkIG9mIG9iamVjdCBjcmVhdGlvbj4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuZXcgWSgpLiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpuZXcgWSgpLj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBTIHtcbiIgKyAKLQkJIiAgY2xhc3MgWSB7XG4iICsgCi0JCSIgICAgWSgpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk1lbWJlckFjY2VzczpuZXcgWSgpLj47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFMoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RTXzFGR0Y2NFBfMygpIHsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7IFxuIiArIAotCQkiLyoqXG4iICsgCi0JCSIgKiAxRkdGNjRQXG4iICsgCi0JCSIgKi9cbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBTIHtcbiIgKyAKLQkJIgl7XG4iICsgCi0JCSIJCW5ldyBZKCkuLn1cbiIgKyAKLQkJIgljbGFzcyBZIHtcbiIgKyAKLQkJIgkJdm9pZCBmb28oKSB7XG4iICsgCi0JCSIJCX1cbiIgKyAKLQkJIgl9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBpbmNvcnJlY3QgY2FsbD4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuZXcgWSgpLi4iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBTIHtcbiIgKyAKLQkJIiAgY2xhc3MgWSB7XG4iICsgCi0JCSIgICAgWSgpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgICB7XG4iICsgCi0JCSIgICAgICA8Q29tcGxldGVPbk5hbWU6PjtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFMoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RTQSgpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgU0Ege1xuIiArIAotCQkJIglwdWJsaWMgc3kgdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBtZXRob2QgbW9kaWZpZXI+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3kiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOnN5PiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInN5IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJzeSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBTQSB7XG4iICsgCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpzeT47XG4iICsgCi0JCSIgIHB1YmxpYyBTQSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RTQl8xRklMRkRHKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJIi8qKlxuIiArIAotCQkJIiAqIDFGSUxGREdcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgU0Ige1xuIiArIAotCQkJIglwdWJsaWMgdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQlTdHJpbmcgcyA9IFwiaGVsbG9cbiIgKyAKLQkJCSIJCWludH1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBmaWVsZCBkZWNsYXJhdGlvbiB0eXBlPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImludCI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6aW50PiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImludCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaW50IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFNCIHtcbiIgKyAKLQkJIiAgcHVibGljIFNCKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBTdHJpbmcgcztcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6aW50PjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdFRfMUZHRjY0UCgpIHsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7IFxuIiArIAotCQkiLyoqXG4iICsgCi0JCSIgKiAxRkdGNjRQXG4iICsgCi0JCSIgKi9cbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBUIHtcbiIgKyAKLQkJIgl7XG4iICsgCi0JCSIJCW5ldyBZKCkufVxuIiArIAotCQkiCWNsYXNzIFkge1xuIiArIAotCQkiCQl2b2lkIGZvbygpIHtcbiIgKyAKLQkJIgkJfVxuIiArIAotCQkiCX1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIG9iamVjdCBjcmVhdGlvbj4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuZXcgWSgpLiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpuZXcgWSgpLj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBUIHtcbiIgKyAKLQkJIiAgY2xhc3MgWSB7XG4iICsgCi0JCSIgICAgWSgpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk1lbWJlckFjY2VzczpuZXcgWSgpLj47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFQoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RUQV8xRkhJU0pKXzEoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkiLyoqXG4iICsgCi0JCQkiICogMUZISVNKSlxuIiArIAotCQkJIiAqL1xuIiArIAotCQkJInB1YmxpYyBjbGFzcyBUQSB7XG4iICsgCi0JCQkiCXZvaWQgZm9vKCkge1xuIiArIAotCQkJIgkJT2JqZWN0W10gaXRlbXMgPSBcbiIgKyAKLQkJCSIJCQl7XG4iICsgCi0JCQkiCQkJCVwiTWFyayB1bnVibGlzaGFibGVcIiwgXG4iICsgCi0JCQkiCQkJCW51bGwsIFxuIiArIAotCQkJIgkJCQlcIlByb3BlcnRpZXMuLi5cIn1cbiIgKyAKLQkJCSIJCS47XG4iICsgCi0JCQkiCQlpdGVtcy59XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gYXJyYXkgaW50aWFsaXplciB2YWx1ZT4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpuPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIm4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIm51bGwiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJudWxsLCAiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgVEEge1xuIiArIAotCQkiICBwdWJsaWMgVEEoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgT2JqZWN0W10gaXRlbXMgPSB7PENvbXBsZXRlT25OYW1lOm4+LH07XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RUQV8xRkhJU0pKXzIoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkiLyoqXG4iICsgCi0JCQkiICogMUZISVNKSlxuIiArIAotCQkJIiAqL1xuIiArIAotCQkJInB1YmxpYyBjbGFzcyBUQSB7XG4iICsgCi0JCQkiCXZvaWQgZm9vKCkge1xuIiArIAotCQkJIgkJT2JqZWN0W10gaXRlbXMgPSBcbiIgKyAKLQkJCSIJCQl7XG4iICsgCi0JCQkiCQkJCVwiTWFyayB1bnVibGlzaGFibGVcIiwgXG4iICsgCi0JCQkiCQkJCW51bGwsIFxuIiArIAotCQkJIgkJCQlcIlByb3BlcnRpZXMuLi5cIn1cbiIgKyAKLQkJCSIJCS47XG4iICsgCi0JCQkiCQlpdGVtcy59XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbWV0aG9kL2ZpZWxkIG9mIGFycmF5IGludGlhbGl6ZXI+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPQotCQkJIgkJCXtcbiIgKyAKLQkJCSIJCQkJXCJNYXJrIHVudWJsaXNoYWJsZVwiLCBcbiIgKyAKLQkJCSIJCQkJbnVsbCwgXG4iICsgCi0JCQkiCQkJCVwiUHJvcGVydGllcy4uLlwifVxuIiArIAotCQkJIgkJLiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6PiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFRBIHtcbiIgKyAKLQkJIiAgcHVibGljIFRBKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIE9iamVjdFtdIGl0ZW1zO1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTo+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0VEFfMUZISVNKSl8zKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJIi8qKlxuIiArIAotCQkJIiAqIDFGSElTSkpcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgVEEge1xuIiArIAotCQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKLQkJCSIJCU9iamVjdFtdIGl0ZW1zID0gXG4iICsgCi0JCQkiCQkJe1xuIiArIAotCQkJIgkJCQlcIk1hcmsgdW51Ymxpc2hhYmxlXCIsIFxuIiArIAotCQkJIgkJCQludWxsLCBcbiIgKyAKLQkJCSIJCQkJXCJQcm9wZXJ0aWVzLi4uXCJ9XG4iICsgCi0JCQkiCQkuO1xuIiArIAotCQkJIgkJaXRlbXMufVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIG1ldGhvZC9maWVsZCBvZiBhcnJheT4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpdGVtcy4iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOml0ZW1zLj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIml0ZW1zLiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBUQSB7XG4iICsgCi0JCSIgIHB1YmxpYyBUQSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBPYmplY3RbXSBpdGVtcztcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6aXRlbXMuPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdFRCXzFGSFNMTVEoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkiLyoqXG4iICsgCi0JCQkiICogMUZIU0xNUVxuIiArIAotCQkJIiAqL1xuIiArIAotCQkJInB1YmxpYyBjbGFzcyBUQiB7XG4iICsgCi0JCQkiCXZvaWQgZm9vKCkge1xuIiArIAotCQkJIgkJaWYgKHRydWUpXG4iICsgCi0JCQkiCQkJU3lzdGVtLm91dC5wcmludGxuKFwiXCIpO1xuIiArIAotCQkJIgkJZSB9XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gZWxzZSBrZXl3b3JkPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImUiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiZSI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiZSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoImUgfSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBUQiB7XG4iICsgCi0JCSIgIHB1YmxpYyBUQigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6ZT47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RVXzFGR0dVTUUoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJIi8qKlxuIiArIAotCQkiICogMUZHR1VNRVxuIiArIAotCQkiICovXG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgVSB7XG4iICsgCi0JCSIJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU291cmNlID0gXG4iICsgCi0JCSIJCTU7IFxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gZGlnaXQ+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiNSI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9IE5PTkU7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSBOT05FOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9IG51bGw7Ci0KLQl0cnkgewotCQljaGVja01ldGhvZFBhcnNlKAotCQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQkJY3Vyc29yTG9jYXRpb24sIAotCQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJCXRlc3ROYW1lKTsgCi0JCWFzc2VydFRydWUoImZhaWxlZCB0byBkZXRlY3QgaW52YWxpZCBjdXJzb3IgbG9jYXRpb24iLCBmYWxzZSk7CQkKLQl9IGNhdGNoKEludmFsaWRDdXJzb3JMb2NhdGlvbiBlKXsKLQkJYXNzZXJ0RXF1YWxzKCJpbnZhbGlkIGN1cnNvciBsb2NhdGlvbjogIiwgZS5pcnJpdGFudCwgSW52YWxpZEN1cnNvckxvY2F0aW9uLk5PX0NPTVBMRVRJT05fSU5TSURFX05VTUJFUik7Ci0JfQotfQotcHVibGljIHZvaWQgdGVzdFVBXzFGSElTSkpfMSgpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSIvKipcbiIgKyAKLQkJCSIgKiAxRkhJU0pKXG4iICsgCi0JCQkiICovXG4iICsgCi0JCQkicHVibGljIGNsYXNzIFVBIHtcbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQlPYmplY3RbXSBpdGVtcyA9IFxuIiArIAotCQkJIgkJCW5ldyBTdHJpbmdbXSB7XG4iICsgCi0JCQkiCQkJCVwiTWFyayB1bnVibGlzaGFibGVcIiwgXG4iICsgCi0JCQkiCQkJCW51bGwsIFxuIiArIAotCQkJIgkJCQlcIlByb3BlcnRpZXMuLi5cIn1cbiIgKyAKLQkJCSIJCS47XG4iICsgCi0JCQkiCQlpdGVtcy59XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gYXJyYXkgaW5pdGlhbGl6ZXI+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPQotCQkJIm5ldyBTdHJpbmdbXSB7XG4iICsgCi0JCQkiCQkJCVwiTWFyayB1bnVibGlzaGFibGVcIiwgXG4iICsgCi0JCQkiCQkJCW51bGwsIFxuIiArIAotCQkJIgkJCQlcIlByb3BlcnRpZXMuLi5cIn1cbiIgKyAKLQkJCSIJCS4iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6bmV3IFN0cmluZ1tde1wiTWFyayB1bnVibGlzaGFibGVcIixudWxsLFwiUHJvcGVydGllcy4uLlwiLH0uPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFVBIHtcbiIgKyAKLQkJIiAgcHVibGljIFVBKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIE9iamVjdFtdIGl0ZW1zID0gPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6bmV3IFN0cmluZ1tde1wiTWFyayB1bnVibGlzaGFibGVcIixudWxsLFwiUHJvcGVydGllcy4uLlwiLH0uPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdFVBXzFGSElTSkpfMigpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSIvKipcbiIgKyAKLQkJCSIgKiAxRkhJU0pKXG4iICsgCi0JCQkiICovXG4iICsgCi0JCQkicHVibGljIGNsYXNzIFVBIHtcbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQlPYmplY3RbXSBpdGVtcyA9IFxuIiArIAotCQkJIgkJCW5ldyBTdHJpbmdbXSB7XG4iICsgCi0JCQkiCQkJCVwiTWFyayB1bnVibGlzaGFibGVcIiwgXG4iICsgCi0JCQkiCQkJCW51bGwsIFxuIiArIAotCQkJIgkJCQlcIlByb3BlcnRpZXMuLi5cIn1cbiIgKyAKLQkJCSIJCS47XG4iICsgCi0JCQkiCQlpdGVtcy59XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbWV0aG9kL2ZpZWxkIG9mIGFycmF5PiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIml0ZW1zLiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6aXRlbXMuPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaXRlbXMuIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFVBIHtcbiIgKyAKLQkJIiAgcHVibGljIFVBKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIE9iamVjdFtdIGl0ZW1zO1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTppdGVtcy4+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0VUJfMUZTQlowMigpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSIvKipcbiIgKyAKLQkJCSIgKiAxRlNCWjAyXG4iICsgCi0JCQkiICovXG4iICsgCi0JCQkiY2xhc3MgVUIge1xuIiArIAotCQkJIgl2b2lkIGJhcigpIHtcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIgljbGFzcyBVQk1lbWJlciB7XG4iICsgCi0JCQkiCQl2b2lkIGJhcjIoKSB7XG4iICsgCi0JCQkiCQl9XG4iICsgCi0JCQkiCQl2b2lkIGZvbygpIHtcbiIgKyAKLQkJCSIJCQliXG4iICsgCi0JCQkiCQl9XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBrZXl3b3JkPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImIiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmI+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiYiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiYiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoImJcbiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJImNsYXNzIFVCIHtcbiIgKyAKLQkJIiAgY2xhc3MgVUJNZW1iZXIge1xuIiArIAotCQkiICAgIFVCTWVtYmVyKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgICB2b2lkIGJhcjIoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICAgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgICAgPENvbXBsZXRlT25OYW1lOmI+O1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBVQigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdFZfMUZHR1VPT18xKCkgewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCSIvKipcbiIgKyAKLQkJIiAqIDFGR0dVT09cbiIgKyAKLQkJIiAqL1xuIiArIAotCQkicHVibGljIGNsYXNzIFYgaSBqYXZhXG4iICsgCi0JCSIJLmlvXG4iICsgCi0JCSIJLlNlcmlhbGl6YWJsZSB7XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBpbXBsZW1lbnRzIGtleXdvcmQ+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaSI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbktleXdvcmQ6aT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJpIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJpIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigiaSBqYXZhIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFYgZXh0ZW5kcyA8Q29tcGxldGVPbktleXdvcmQ6aT4ge1xuIiArIAotCQkiICB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHB1YmxpYyBWKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdFZfMUZHR1VPT18yKCkgewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgeC55Lno7IFxuIiArIAotCQkiLyoqXG4iICsgCi0JCSIgKiAxRkdHVU9PXG4iICsgCi0JCSIgKi9cbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBWIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUge1xuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gcGFja2FnZT4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ5IjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uUGFja2FnZTp4Lnk+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAieSI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPQotCQkieC55LnoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ5IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSA8Q29tcGxldGVPblBhY2thZ2U6eC55PjtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBWIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUge1xuIiArIAotCQkiICBwdWJsaWMgVigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RWQV8xRkhJU0pKXzEoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkiLyoqXG4iICsgCi0JCQkiICogMUZISVNKSlxuIiArIAotCQkJIiAqL1xuIiArIAotCQkJInB1YmxpYyBjbGFzcyBWQSB7XG4iICsgCi0JCQkiCXZvaWQgZm9vKCkge1xuIiArIAotCQkJIgkJT2JqZWN0IGl0ZW0gPSBuZXcgU3RyaW5nKCkge1xuIiArIAotCQkJIgkJCXB1YmxpYyBib29sZWFuIGVxdWFscygpIHtcbiIgKyAKLQkJCSIJCQkJcmV0dXJuIGZhbHNlO1xuIiArIAotCQkJIgkJCX1cbiIgKyAKLQkJCSIJCX1cbiIgKyAKLQkJCSIJCS47XG4iICsgCi0JCQkiCQlpdGVtLn1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBhbm9ueW1vdXMgdHlwZSBkZWNsYXJhdGlvbj4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9Ci0JCQkibmV3IFN0cmluZygpIHtcbiIgKyAKLQkJCSIJCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoKSB7XG4iICsgCi0JCQkiCQkJCXJldHVybiBmYWxzZTtcbiIgKyAKLQkJCSIJCQl9XG4iICsgCi0JCQkiCQl9XG4iICsgCi0JCQkiCQkuIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOm5ldyBTdHJpbmcoKSB7XG4iICsgCi0JCSIgIHB1YmxpYyBib29sZWFuIGVxdWFscygpIHtcbiIgKyAKLQkJIiAgICByZXR1cm4gZmFsc2U7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn0uPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFZBIHtcbiIgKyAKLQkJIiAgcHVibGljIFZBKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIE9iamVjdCBpdGVtID0gPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6bmV3IFN0cmluZygpIHtcbiIgKyAKLQkJIiAgcHVibGljIGJvb2xlYW4gZXF1YWxzKCkge1xuIiArIAotCQkiICAgIHJldHVybiBmYWxzZTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifS4+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0VkFfMUZISVNKSl8yKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJIi8qKlxuIiArIAotCQkJIiAqIDFGSElTSkpcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgVkEge1xuIiArIAotCQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKLQkJCSIJCU9iamVjdCBpdGVtID0gbmV3IFN0cmluZygpIHtcbiIgKyAKLQkJCSIJCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoKSB7XG4iICsgCi0JCQkiCQkJCXJldHVybiBmYWxzZTtcbiIgKyAKLQkJCSIJCQl9XG4iICsgCi0JCQkiCQl9XG4iICsgCi0JCQkiCQkuO1xuIiArIAotCQkJIgkJaXRlbS59XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbG9jYWwgdmFyaWFibGU+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaXRlbS4iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOml0ZW0uPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaXRlbS4iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgVkEge1xuIiArIAotCQkiICBwdWJsaWMgVkEoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgT2JqZWN0IGl0ZW07XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOml0ZW0uPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdFZCXzEoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBWQiB7XG4iICsgCi0JCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCSIJCW5ldyBqYXZhLmlvLkZpbGUoXCJlcnJvclwiKSB7XG4iICsgCi0JCSIJCQlwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkge1xuIiArIAotCQkiCQkJCVZlY3RvciB2MTExMTEgPSBuZXcgVmVjdG9yKCk7XG4iICsgCi0JCSIJCQkJdiB9XG4iICsgCi0JCSIJCX1cbiIgKyAKLQkJIgkJLjtcbiIgKyAKLQkJIgl9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBsb2NhbCB2YXJpYWJsZSBuYW1lIGludG8gYW5vbnltb3VzIGRlY2xhcmF0aW9uPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInYiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnY+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAidiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInYgfSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBWQiB7XG4iICsgCi0JCSIgIHB1YmxpYyBWQigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBuZXcgamF2YS5pby5GaWxlKFwiZXJyb3JcIikge1xuIiArIAotCQkiICAgICAgKCkge1xuIiArIAotCQkiICAgICAgfVxuIiArIAotCQkiICAgICAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHtcbiIgKyAKLQkJIiAgICAgICAgVmVjdG9yIHYxMTExMTtcbiIgKyAKLQkJIiAgICAgICAgPENvbXBsZXRlT25OYW1lOnY+O1xuIiArIAotCQkiICAgICAgfVxuIiArIAotCQkiICAgIH07XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RWQl8yKCkgewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgVkIge1xuIiArIAotCQkiCXZvaWQgZm9vKCkge1xuIiArIAotCQkiCQluZXcgamF2YS5pby5GaWxlKFwiZXJyb3JcIikge1xuIiArIAotCQkiCQkJcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHtcbiIgKyAKLQkJIgkJCQlWZWN0b3IgdjExMTExID0gbmV3IFZlY3RvcigpO1xuIiArIAotCQkiCQkJCXYgfVxuIiArIAotCQkiCQl9LlxuIiArIAotCQkiCX1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIGFub255bW91cyB0eXBlIGRlY2xhcmF0aW9uPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0KLQkJIm5ldyBqYXZhLmlvLkZpbGUoXCJlcnJvclwiKSB7XG4iICsgCi0JCSIJCQlwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkge1xuIiArIAotCQkiCQkJCVZlY3RvciB2MTExMTEgPSBuZXcgVmVjdG9yKCk7XG4iICsgCi0JCSIJCQkJdiB9XG4iICsgCi0JCSIJCX0uIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gCi0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpuZXcgamF2YS5pby5GaWxlKFwiZXJyb3JcIikge1xuIiArIAotCQkiICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkge1xuIiArIAotCQkiICB9XG4iICsKLQkJIn0uPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPQotCQkibmV3IGphdmEuaW8uRmlsZShcImVycm9yXCIpIHtcbiIgKyAKLQkJIgkJCXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB7XG4iICsgCi0JCSIJCQkJVmVjdG9yIHYxMTExMSA9IG5ldyBWZWN0b3IoKTtcbiIgKyAKLQkJIgkJCQl2IH1cbiIgKyAKLQkJIgkJfS4iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgVkIge1xuIiArIAotCQkiICBwdWJsaWMgVkIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6bmV3IGphdmEuaW8uRmlsZShcImVycm9yXCIpIHtcbiIgKyAKLQkJIiAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArCi0JCSJ9Lj47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RWQl8zKCkgewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgVkIge1xuIiArIAotCQkiCXZvaWQgZm9vKCkge1xuIiArIAotCQkiCQluZXcgamF2YS5pby5GaWxlKFwiZXJyb3JcIikge1xuIiArIAotCQkiCQkJcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHtcbiIgKyAKLQkJIgkJCQlWZWN0b3IgdjExMTExID0gbmV3IFZlY3RvcigpO1xuIiArIAotCQkiCQkJCXYgfVxuIiArIAotCQkiCQl9XG4iICsgCi0JCSIJCS47XG4iICsgCi0JCSIJfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gY29uc3RydWN0b3I+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibmV3IGphdmEuaW8uRmlsZSgiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25BbGxvY2F0aW9uRXhwcmVzc2lvbjpuZXcgamF2YS5pby5GaWxlKCk+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICIiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgVkIge1xuIiArIAotCQkiICBwdWJsaWMgVkIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25BbGxvY2F0aW9uRXhwcmVzc2lvbjpuZXcgamF2YS5pby5GaWxlKCk+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0VkJfNCgpIHsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7IFxuIiArIAotCQkicHVibGljIGNsYXNzIFZCIHtcbiIgKyAKLQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKLQkJIgkJbmV3IGphdmEuaW8uRmlsZShcImVycm9yXCIpIHtcbiIgKyAKLQkJIgkJCXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB7XG4iICsgCi0JCSIJCQkJVmVjdG9yIHYxMTExMSA9IG5ldyBWZWN0b3IoKTtcbiIgKyAKLQkJIgkJCQl2IH1cbiIgKyAKLQkJIgkJfVxuIiArCi0JCSIJCS47XG4iICsgCi0JCSIJfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gYW5vbnltb3VzIHR5cGUgZGVjbGFyYXRpb24gd2l0aCBkdW1teSBzcGFjZXM+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPQotCQkibmV3IGphdmEuaW8uRmlsZShcImVycm9yXCIpIHtcbiIgKyAKLQkJIgkJCXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB7XG4iICsgCi0JCSIJCQkJVmVjdG9yIHYxMTExMSA9IG5ldyBWZWN0b3IoKTtcbiIgKyAKLQkJIgkJCQl2IH1cbiIgKyAKLQkJIgkJfVxuIiArCi0JCSIJCS4iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAKLQkJIjxDb21wbGV0ZU9uTmFtZTpuZXcgamF2YS5pby5GaWxlKFwiZXJyb3JcIikge1xuIiArIAotCQkiICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9Lj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0KLQkJIm5ldyBqYXZhLmlvLkZpbGUoXCJlcnJvclwiKSB7XG4iICsgCi0JCSIJCQlwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkge1xuIiArIAotCQkiCQkJCVZlY3RvciB2MTExMTEgPSBuZXcgVmVjdG9yKCk7XG4iICsgCi0JCSIJCQkJdiB9XG4iICsgCi0JCSIJCX1cbiIgKwotCQkiCQkuIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFZCIHtcbiIgKyAKLQkJIiAgcHVibGljIFZCKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOm5ldyBqYXZhLmlvLkZpbGUoXCJlcnJvclwiKSB7XG4iICsgCi0JCSIgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB7XG4iICsgCi0JCSIgIH1cbiIgKwotCQkifS4+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0VkJfNSgpIHsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7IFxuIiArIAotCQkicHVibGljIGNsYXNzIFZCIHtcbiIgKyAKLQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKLQkJIgkJbmV3IGphdmEuaW8uRmlsZShcImVycm9yXCIpIHtcbiIgKyAKLQkJIgkJCXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB7XG4iICsgCi0JCSIJCQkJVmVjdG9yIHYxMTExMSA9IG5ldyBWZWN0b3IoKTtcbiIgKyAKLQkJIgkJCQl2IH1cbiIgKyAKLQkJIgkJfS47XG4iICsgCi0JCSIJfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gYW5vbnltb3VzIHR5cGUgZGVjbGFyYXRpb24gd2l0aCB0cmFpbGluZyBzZW1pLWNvbG9uPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0KLQkJIm5ldyBqYXZhLmlvLkZpbGUoXCJlcnJvclwiKSB7XG4iICsgCi0JCSIJCQlwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkge1xuIiArIAotCQkiCQkJCVZlY3RvciB2MTExMTEgPSBuZXcgVmVjdG9yKCk7XG4iICsgCi0JCSIJCQkJdiB9XG4iICsgCi0JCSIJCX0uIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gCi0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpuZXcgamF2YS5pby5GaWxlKFwiZXJyb3JcIikge1xuIiArIAotCQkiICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkge1xuIiArIAotCQkiICB9XG4iICsKLQkJIn0uPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPQotCQkibmV3IGphdmEuaW8uRmlsZShcImVycm9yXCIpIHtcbiIgKyAKLQkJIgkJCXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB7XG4iICsgCi0JCSIJCQkJVmVjdG9yIHYxMTExMSA9IG5ldyBWZWN0b3IoKTtcbiIgKyAKLQkJIgkJCQl2IH1cbiIgKyAKLQkJIgkJfS4iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgVkIge1xuIiArIAotCQkiICBwdWJsaWMgVkIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6bmV3IGphdmEuaW8uRmlsZShcImVycm9yXCIpIHtcbiIgKyAKLQkJIiAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArCi0JCSJ9Lj47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RXXzFGR0dVUzQoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJIi8qKlxuIiArIAotCQkiICogMUZHR1VTNFxuIiArIAotCQkiICovXG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgVyB7XG4iICsgCi0JCSIJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEEgPSBcbiIgKyAKLQkJIgkJMTsgXG4iICsgCi0JCSIJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFCID0gXG4iICsgCi0JCSIJCTI7IFxuIiArIAotCQkiCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBQk8gPSBcbiIgKyAKLQkJIgkJNDsgXG4iICsgCi0JCSIJcHVibGljIGludCBwcm9kdWNlRGVidWdBdHRyaWJ1dGVzID0gXG4iICsgCi0JCSIJCUxBQk87IFxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gZmllbGQgaW5pdGlhbGl6ZXI+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiTCI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6TD4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJMIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJMQUJPIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigiTEFCTzsiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgVyB7XG4iICsgCi0JCSIgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBO1xuIiArIAotCQkiICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQUI7XG4iICsgCi0JCSIgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBQk87XG4iICsgCi0JCSIgIHB1YmxpYyBpbnQgcHJvZHVjZURlYnVnQXR0cmlidXRlcyA9IDxDb21wbGV0ZU9uTmFtZTpMPjtcbiIgKyAKLQkJIiAgcHVibGljIFcoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgPGNsaW5pdD4oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0V0FfMSgpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgV0Ege1xuIiArIAotCQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKLQkJCSIJCWludCB2YWx1ZSA9IDEwO1xuIiArIAotCQkJIgkJdiBpbnRbXSB0YWIgPSBuZXcgaW50W3ZhbHVlXTtcbiIgKyAKLQkJCSIJfVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gYXJyYXkgc2l6ZSB2YWx1ZT4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ2IjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp2PiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInYiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInZhbHVlIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigidmFsdWVdOyIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBXQSB7XG4iICsgCi0JCSIgIHB1YmxpYyBXQSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBpbnQgdmFsdWU7XG4iICsgCi0JCSIgICAgaW50W10gdGFiID0gbmV3IGludFs8Q29tcGxldGVPbk5hbWU6dj5dO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0V0FfMigpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgV0Ege1xuIiArIAotCQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKLQkJCSIJCWludCB2YWx1ZSA9IDEwO1xuIiArIAotCQkJIgkJdiBpbnRbXSB0YWIgPSBuZXcgaW50W3ZhbHVlXTtcbiIgKyAKLQkJCSIJfVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gY29ycnVwdGVyIGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInYiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnY+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAidiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInYgaW50W10iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgV0Ege1xuIiArIAotCQkiICBwdWJsaWMgV0EoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgaW50IHZhbHVlO1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTp2PjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdFdCXzFGSTMxM0MoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkiLypcbiIgKyAKLQkJCSIgKiAxRkkzMTNDXG4iICsgCi0JCQkiICovXG4iICsgCi0JCQkiY2xhc3MgV0JIZWxwZXIge1xuIiArIAotCQkJIglwdWJsaWMgaW50IGZpZWxkUHVibGljO1xuIiArIAotCQkJIglwcm90ZWN0ZWQgaW50IGZpZWxkUHJvdGVjdGVkO1xuIiArIAotCQkJIglwcml2YXRlIGludCBmaWVsZFByaXZhdGU7XG4iICsgCi0JCQkiCWludCBmaWVsZERlZmF1bHQ7XG4iICsgCi0JCQkiCXN0YXRpYyB2b2lkIHN0YXRpY0ZvbygpIHtcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIglzdGF0aWMgaW50IGkgPSBkO1xuIiArIAotCQkJIglpbnQgbmV1bmV1MSgpIHtcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIgl2b2lkIG5ldW5ldTIoKSB7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSJ9XG4iICsgCi0JCQkicHVibGljIGNsYXNzIFdCXG4iICsgCi0JCQkiCWV4dGVuZHMgV0JIZWxwZXIge1xuIiArIAotCQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKLQkJCSIJCUJJSk9VUltdIGIgPSBcbiIgKyAKLQkJCSIJCQluZXcgamF2YS5sYW5nLk51bWJlcltdOyBcbiIgKyAKLQkJCSIJCWphdmEubGFuZy5TaG9ydCBzO1xuIiArIAotCQkJIgkJYlsxXS59XG4iICsgCi0JCQkiCUIoKSB7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSIJQihpbnQpIHtcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIG1ldGhvZC9maWVsZCBvZiBhcnJheSBlbGVtZW50PiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImJbMV0uIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmJbMV0uPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkiY2xhc3MgV0JIZWxwZXIge1xuIiArIAotCQkiICBwdWJsaWMgaW50IGZpZWxkUHVibGljO1xuIiArIAotCQkiICBwcm90ZWN0ZWQgaW50IGZpZWxkUHJvdGVjdGVkO1xuIiArIAotCQkiICBwcml2YXRlIGludCBmaWVsZFByaXZhdGU7XG4iICsgCi0JCSIgIGludCBmaWVsZERlZmF1bHQ7XG4iICsgCi0JCSIgIHN0YXRpYyBpbnQgaTtcbiIgKyAKLQkJIiAgV0JIZWxwZXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgPGNsaW5pdD4oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgc3RhdGljIHZvaWQgc3RhdGljRm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBuZXVuZXUxKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgbmV1bmV1MigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiArIAotCQkicHVibGljIGNsYXNzIFdCIGV4dGVuZHMgV0JIZWxwZXIge1xuIiArIAotCQkiICBwdWJsaWMgV0IoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgQklKT1VSW10gYjtcbiIgKyAKLQkJIiAgICBqYXZhLmxhbmcuU2hvcnQgcztcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk1lbWJlckFjY2VzczpiWzFdLj47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgQigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBCKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0WF8xRkdHVjhDXzEoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJImltcG9ydCBwMi5ZOyBcbiIgKyAKLQkJIi8qKlxuIiArIAotCQkiICogMUZHR1Y4QyBhbmQgMUZHUEU4RVxuIiArIAotCQkiICovXG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIJcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBWYXJzOyBcbiIgKyAKLQkJIglwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IExpbmVzOyBcbiIgKyAKLQkJIglwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IFNvdXJjZTsgXG4iICsgCi0JCSIJcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBVbnJlYWNoYWJsZUNvZGU7IFxuIiArIAotCQkiCXB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgcHJvZHVjZURlYnVnQXR0cmlidXRlczsgXG4iICsgCi0JCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCSIJCWludCBsb2NhbGUsIFxuIiArIAotCQkiCQkJZXJyb3JUaHJlc2hvbGQsIFxuIiArIAotCQkiCQkJcHJlc2VydmVBbGxMb2NhbFZhcmlhYmxlczsgXG4iICsgCi0JCSIJCXJldHVybiBuZXcgWVtdIHtcbiIgKyAKLQkJIgkJCW5ldyBZKFxuIiArIAotCQkiCQkJCVwiZGVidWcudmFyc1wiLCBcbiIgKyAKLQkJIgkJCQl0aGlzLCBcbiIgKyAKLQkJIgkJCQlsb2NhbGUsIFxuIiArIAotCQkiCQkJCShwcm9kdWNlRGVidWdBdHRyaWJ1dGVzXG4iICsgCi0JCSIJCQkJCSYgVmFycylcbiIgKyAKLQkJIgkJCQkJIT0gMFxuIiArIAotCQkiCQkJCQk/IDBcbiIgKyAKLQkJIgkJCQkJOiAxKSwgXG4iICsgCi0JCSIJCQluZXcgWShcbiIgKyAKLQkJIgkJCQlcImRlYnVnLmxpbmVzXCIsIFxuIiArIAotCQkiCQkJCXRoaXMsIFxuIiArIAotCQkiCQkJCWxvY2FsZSwgXG4iICsgCi0JCSIJCQkJKHByb2R1Y2VEZWJ1Z0F0dHJpYnV0ZXNcbiIgKyAKLQkJIgkJCQkJJiBMaW5lcylcbiIgKyAKLQkJIgkJCQkJIT0gMFxuIiArIAotCQkiCQkJCQk/IDBcbiIgKyAKLQkJIgkJCQkJOiAxKSwgXG4iICsgCi0JCSIJCQluZXcgWShcbiIgKyAKLQkJIgkJCQlcImRlYnVnLnNvdXJjZVwiLCBcbiIgKyAKLQkJIgkJCQl0aGlzLCBcbiIgKyAKLQkJIgkJCQlsb2NhbGUsIFxuIiArIAotCQkiCQkJCShwcm9kdWNlRGVidWdBdHRyaWJ1dGVzXG4iICsgCi0JCSIJCQkJCSYgU291cmNlKVxuIiArIAotCQkiCQkJCQkhPSAwXG4iICsgCi0JCSIJCQkJCT8gMFxuIiArIAotCQkiCQkJCQk6IDEpLCBcbiIgKyAKLQkJIgkJCW5ldyBZKFxuIiArIAotCQkiCQkJCVwiZGVidWcucHJlc2VydmVBbGxMb2NhbHNcIiwgXG4iICsgCi0JCSIJCQkJdGhpcywgXG4iICsgCi0JCSIJCQkJbG9jYWxlLCBcbiIgKyAKLQkJIgkJCQlwcmVzZXJ2ZUFsbExvY2FsVmFyaWFibGVzXG4iICsgCi0JCSIJCQkJCT8gMFxuIiArIAotCQkiCQkJCQk6IDEpLCBcbiIgKyAKLQkJIgkJCW5ldyBZKFxuIiArIAotCQkiCQkJCVwib3B0aW9uYWxFcnJvci51blJlYWNoYWJsZUNvZGVcIiwgXG4iICsgCi0JCSIJCQkJdGhpcywgXG4iICsgCi0JCSIJCQkJbG9jYWxlLCBcbiIgKyAKLQkJIgkJCQkoZXJyb3JUaHJlc2hvbGRcbiIgKyAKLQkJIgkJCQkJJiBVbnJlYWNoYWJsZUNvZGUpXG4iICsgCi0JCSIJCQkJCSE9IDBcbiIgKyAKLQkJIgkJCQkJPyAwXG4iICsgCi0JCSIJCQkJCTogMSlcbiIgKyAKLQkJIgkJCQkgfVxuIiArIAotCQkiCX1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIGFyZ3VtZW50IG9mIGFub255bW91cyB0eXBlIGRlY2xhcmF0aW9uPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInQiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnQ+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAidCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidGhpcyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInRoaXMsICIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJImltcG9ydCBwMi5ZO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IFZhcnM7XG4iICsgCi0JCSIgIHB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgTGluZXM7XG4iICsgCi0JCSIgIHB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgU291cmNlO1xuIiArIAotCQkiICBwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IFVucmVhY2hhYmxlQ29kZTtcbiIgKyAKLQkJIiAgcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBwcm9kdWNlRGVidWdBdHRyaWJ1dGVzO1xuIiArIAotCQkiICA8Y2xpbml0PigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBpbnQgbG9jYWxlO1xuIiArIAotCQkiICAgIGludCBlcnJvclRocmVzaG9sZDtcbiIgKyAKLQkJIiAgICBpbnQgcHJlc2VydmVBbGxMb2NhbFZhcmlhYmxlcztcbiIgKyAKLQkJIiAgICBuZXcgWShcImRlYnVnLnZhcnNcIiwgPENvbXBsZXRlT25OYW1lOnQ+KTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdFhfMUZHR1Y4Q18yKCkgewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCSJpbXBvcnQgcDIuWVpBOyBcbiIgKyAKLQkJIi8qKlxuIiArIAotCQkiICogMUZHR1Y4QyBhbmQgMUZHUEU4RVxuIiArIAotCQkiICovXG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIJcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBWYXJzOyBcbiIgKyAKLQkJIglwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IExpbmVzOyBcbiIgKyAKLQkJIglwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IFNvdXJjZTsgXG4iICsgCi0JCSIJcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBVbnJlYWNoYWJsZUNvZGU7IFxuIiArIAotCQkiCXB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgcHJvZHVjZURlYnVnQXR0cmlidXRlczsgXG4iICsgCi0JCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCSIJCWludCBsb2NhbGUsIFxuIiArIAotCQkiCQkJZXJyb3JUaHJlc2hvbGQsIFxuIiArIAotCQkiCQkJcHJlc2VydmVBbGxMb2NhbFZhcmlhYmxlczsgXG4iICsgCi0JCSIJCXJldHVybiBuZXcgWVpBW10ge1xuIiArIAotCQkiCQkJbmV3IFlaQShcbiIgKyAKLQkJIgkJCQlcImRlYnVnLnZhcnNcIiwgXG4iICsgCi0JCSIJCQkJdGhpcywgXG4iICsgCi0JCSIJCQkJbG9jYWxlLCBcbiIgKyAKLQkJIgkJCQkocHJvZHVjZURlYnVnQXR0cmlidXRlc1xuIiArIAotCQkiCQkJCQkmIFZhcnMpXG4iICsgCi0JCSIJCQkJCSE9IDBcbiIgKyAKLQkJIgkJCQkJPyAwXG4iICsgCi0JCSIJCQkJCTogMSksIFxuIiArIAotCQkiCQkJbmV3IFlaQShcbiIgKyAKLQkJIgkJCQlcImRlYnVnLmxpbmVzXCIsIFxuIiArIAotCQkiCQkJCXRoaXMsIFxuIiArIAotCQkiCQkJCWxvY2FsZSwgXG4iICsgCi0JCSIJCQkJKHByb2R1Y2VEZWJ1Z0F0dHJpYnV0ZXNcbiIgKyAKLQkJIgkJCQkJJiBMaW5lcylcbiIgKyAKLQkJIgkJCQkJIT0gMFxuIiArIAotCQkiCQkJCQk/IDBcbiIgKyAKLQkJIgkJCQkJOiAxKSwgXG4iICsgCi0JCSIJCQluZXcgWVpBKFxuIiArIAotCQkiCQkJCVwiZGVidWcuc291cmNlXCIsIFxuIiArIAotCQkiCQkJCXRoaXMsIFxuIiArIAotCQkiCQkJCWxvY2FsZSwgXG4iICsgCi0JCSIJCQkJKHByb2R1Y2VEZWJ1Z0F0dHJpYnV0ZXNcbiIgKyAKLQkJIgkJCQkJJiBTb3VyY2UpXG4iICsgCi0JCSIJCQkJCSE9IDBcbiIgKyAKLQkJIgkJCQkJPyAwXG4iICsgCi0JCSIJCQkJCTogMSksIFxuIiArIAotCQkiCQkJbmV3IFlaQShcbiIgKyAKLQkJIgkJCQlcImRlYnVnLnByZXNlcnZlQWxsTG9jYWxzXCIsIFxuIiArIAotCQkiCQkJCXRoaXMsIFxuIiArIAotCQkiCQkJCWxvY2FsZSwgXG4iICsgCi0JCSIJCQkJcHJlc2VydmVBbGxMb2NhbFZhcmlhYmxlc1xuIiArIAotCQkiCQkJCQk/IDBcbiIgKyAKLQkJIgkJCQkJOiAxKSwgXG4iICsgCi0JCSIJCQluZXcgWVpBKFxuIiArIAotCQkiCQkJCVwib3B0aW9uYWxFcnJvci51blJlYWNoYWJsZUNvZGVcIiwgXG4iICsgCi0JCSIJCQkJdGhpcywgXG4iICsgCi0JCSIJCQkJbG9jYWxlLCBcbiIgKyAKLQkJIgkJCQkoZXJyb3JUaHJlc2hvbGRcbiIgKyAKLQkJIgkJCQkJJiBVbnJlYWNoYWJsZUNvZGUpXG4iICsgCi0JCSIJCQkJCSE9IDBcbiIgKyAKLQkJIgkJCQkJPyAwXG4iICsgCi0JCSIJCQkJCTogMSlcbiIgKyAKLQkJIgkJCQkgfVxuIiArIAotCQkiCX1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIGFub255bW91cyB0eXBlIGRlY2xhcmF0aW9uIGludG8gYSByZXR1cm4gc3RhdGVtZW50PiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIlkiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOlk+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiWSI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiWVpBIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigiWVpBW10iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJpbXBvcnQgcDIuWVpBO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IFZhcnM7XG4iICsgCi0JCSIgIHB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgTGluZXM7XG4iICsgCi0JCSIgIHB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgU291cmNlO1xuIiArIAotCQkiICBwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IFVucmVhY2hhYmxlQ29kZTtcbiIgKyAKLQkJIiAgcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBwcm9kdWNlRGVidWdBdHRyaWJ1dGVzO1xuIiArIAotCQkiICA8Y2xpbml0PigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBpbnQgbG9jYWxlO1xuIiArIAotCQkiICAgIGludCBlcnJvclRocmVzaG9sZDtcbiIgKyAKLQkJIiAgICBpbnQgcHJlc2VydmVBbGxMb2NhbFZhcmlhYmxlcztcbiIgKyAKLQkJIiAgICByZXR1cm4gbmV3IDxDb21wbGV0ZU9uVHlwZTpZPigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0WF8xRkdHVjhDXzMoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJImltcG9ydCBwMi5ZWkE7IFxuIiArIAotCQkiLyoqXG4iICsgCi0JCSIgKiAxRkdHVjhDIGFuZCAxRkdQRThFXG4iICsgCi0JCSIgKi9cbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIglwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IFZhcnM7IFxuIiArIAotCQkiCXB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgTGluZXM7IFxuIiArIAotCQkiCXB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgU291cmNlOyBcbiIgKyAKLQkJIglwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IFVucmVhY2hhYmxlQ29kZTsgXG4iICsgCi0JCSIJcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBwcm9kdWNlRGVidWdBdHRyaWJ1dGVzOyBcbiIgKyAKLQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKLQkJIgkJaW50IGxvY2FsZSwgXG4iICsgCi0JCSIJCQllcnJvclRocmVzaG9sZCwgXG4iICsgCi0JCSIJCQlwcmVzZXJ2ZUFsbExvY2FsVmFyaWFibGVzOyBcbiIgKyAKLQkJIgkJcmV0dXJuIG5ldyBZWkFbXSB7XG4iICsgCi0JCSIJCQluZXcgWVpBKFxuIiArIAotCQkiCQkJCVwiZGVidWcudmFyc1wiLCBcbiIgKyAKLQkJIgkJCQl0aGlzLCBcbiIgKyAKLQkJIgkJCQlsb2NhbGUsIFxuIiArIAotCQkiCQkJCShwcm9kdWNlRGVidWdBdHRyaWJ1dGVzXG4iICsgCi0JCSIJCQkJCSYgVmFycylcbiIgKyAKLQkJIgkJCQkJIT0gMFxuIiArIAotCQkiCQkJCQk/IDBcbiIgKyAKLQkJIgkJCQkJOiAxKSwgXG4iICsgCi0JCSIJCQluZXcgWVpBKFxuIiArIAotCQkiCQkJCVwiZGVidWcubGluZXNcIiwgXG4iICsgCi0JCSIJCQkJdGhpcywgXG4iICsgCi0JCSIJCQkJbG9jYWxlLCBcbiIgKyAKLQkJIgkJCQkocHJvZHVjZURlYnVnQXR0cmlidXRlc1xuIiArIAotCQkiCQkJCQkmIExpbmVzKVxuIiArIAotCQkiCQkJCQkhPSAwXG4iICsgCi0JCSIJCQkJCT8gMFxuIiArIAotCQkiCQkJCQk6IDEpLCBcbiIgKyAKLQkJIgkJCW5ldyBZWkEoXG4iICsgCi0JCSIJCQkJXCJkZWJ1Zy5zb3VyY2VcIiwgXG4iICsgCi0JCSIJCQkJdGhpcywgXG4iICsgCi0JCSIJCQkJbG9jYWxlLCBcbiIgKyAKLQkJIgkJCQkocHJvZHVjZURlYnVnQXR0cmlidXRlc1xuIiArIAotCQkiCQkJCQkmIFNvdXJjZSlcbiIgKyAKLQkJIgkJCQkJIT0gMFxuIiArIAotCQkiCQkJCQk/IDBcbiIgKyAKLQkJIgkJCQkJOiAxKSwgXG4iICsgCi0JCSIJCQluZXcgWVpBKFxuIiArIAotCQkiCQkJCVwiZGVidWcucHJlc2VydmVBbGxMb2NhbHNcIiwgXG4iICsgCi0JCSIJCQkJdGhpcywgXG4iICsgCi0JCSIJCQkJbG9jYWxlLCBcbiIgKyAKLQkJIgkJCQlwcmVzZXJ2ZUFsbExvY2FsVmFyaWFibGVzXG4iICsgCi0JCSIJCQkJCT8gMFxuIiArIAotCQkiCQkJCQk6IDEpLCBcbiIgKyAKLQkJIgkJCW5ldyBZWkEoXG4iICsgCi0JCSIJCQkJXCJvcHRpb25hbEVycm9yLnVuUmVhY2hhYmxlQ29kZVwiLCBcbiIgKyAKLQkJIgkJCQl0aGlzLCBcbiIgKyAKLQkJIgkJCQlsb2NhbGUsIFxuIiArIAotCQkiCQkJCShlcnJvclRocmVzaG9sZFxuIiArIAotCQkiCQkJCQkmIFVucmVhY2hhYmxlQ29kZSlcbiIgKyAKLQkJIgkJCQkJIT0gMFxuIiArIAotCQkiCQkJCQk/IDBcbiIgKyAKLQkJIgkJCQkJOiAxKVxuIiArIAotCQkiCQkJCSB9XG4iICsgCi0JCSIJfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gYW5vbnltb3VzIHR5cGUgZGVjbGFyYXRpb24gbmVzdGVkIGludG8gYW4gYXJyYXkgaW5pdGlhbGl6ZXI+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiWSI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6WT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJZIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJZWkEiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJZWkEoIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkiaW1wb3J0IHAyLllaQTtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBWYXJzO1xuIiArIAotCQkiICBwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IExpbmVzO1xuIiArIAotCQkiICBwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IFNvdXJjZTtcbiIgKyAKLQkJIiAgcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBVbnJlYWNoYWJsZUNvZGU7XG4iICsgCi0JCSIgIHB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgcHJvZHVjZURlYnVnQXR0cmlidXRlcztcbiIgKyAKLQkJIiAgPGNsaW5pdD4oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgaW50IGxvY2FsZTtcbiIgKyAKLQkJIiAgICBpbnQgZXJyb3JUaHJlc2hvbGQ7XG4iICsgCi0JCSIgICAgaW50IHByZXNlcnZlQWxsTG9jYWxWYXJpYWJsZXM7XG4iICsgCi0JCSIgICAgbmV3IFlaQVtde25ldyA8Q29tcGxldGVPblR5cGU6WT4oKSx9O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0WF8xRkdHVjhDXzQoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJImltcG9ydCBwMi5ZOyBcbiIgKyAKLQkJIi8qKlxuIiArIAotCQkiICogMUZHR1Y4QyBhbmQgMUZHUEU4RVxuIiArIAotCQkiICovXG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIJcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBWYXJzOyBcbiIgKyAKLQkJIglwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IExpbmVzOyBcbiIgKyAKLQkJIglwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IFNvdXJjZTsgXG4iICsgCi0JCSIJcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBVbnJlYWNoYWJsZUNvZGU7IFxuIiArIAotCQkiCXB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgcHJvZHVjZURlYnVnQXR0cmlidXRlczsgXG4iICsgCi0JCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCSIJCWludCBsb2NhbGUsIFxuIiArIAotCQkiCQkJZXJyb3JUaHJlc2hvbGQsIFxuIiArIAotCQkiCQkJcHJlc2VydmVBbGxMb2NhbFZhcmlhYmxlczsgXG4iICsgCi0JCSIJCXJldHVybiBuZXcgWVtdIHtcbiIgKyAKLQkJIgkJCW5ldyBZKFxuIiArIAotCQkiCQkJCVwiZGVidWcudmFyc1wiLCBcbiIgKyAKLQkJIgkJCQl0aGlzLCBcbiIgKyAKLQkJIgkJCQlsb2NhbGUsIFxuIiArIAotCQkiCQkJCShwcm9kdWNlRGVidWdBdHRyaWJ1dGVzXG4iICsgCi0JCSIJCQkJCSYgVmFycylcbiIgKyAKLQkJIgkJCQkJIT0gMFxuIiArIAotCQkiCQkJCQk/IDBcbiIgKyAKLQkJIgkJCQkJOiAxKSwgXG4iICsgCi0JCSIJCQluZXcgWShcbiIgKyAKLQkJIgkJCQlcImRlYnVnLmxpbmVzXCIsIFxuIiArIAotCQkiCQkJCXRoaXMsIFxuIiArIAotCQkiCQkJCWxvY2FsZSwgXG4iICsgCi0JCSIJCQkJKHByb2R1Y2VEZWJ1Z0F0dHJpYnV0ZXNcbiIgKyAKLQkJIgkJCQkJJiBMaW5lcylcbiIgKyAKLQkJIgkJCQkJIT0gMFxuIiArIAotCQkiCQkJCQk/IDBcbiIgKyAKLQkJIgkJCQkJOiAxKSwgXG4iICsgCi0JCSIJCQluZXcgWShcbiIgKyAKLQkJIgkJCQlcImRlYnVnLnNvdXJjZVwiLCBcbiIgKyAKLQkJIgkJCQl0aGlzLCBcbiIgKyAKLQkJIgkJCQlsb2NhbGUsIFxuIiArIAotCQkiCQkJCShwcm9kdWNlRGVidWdBdHRyaWJ1dGVzXG4iICsgCi0JCSIJCQkJCSYgU291cmNlKVxuIiArIAotCQkiCQkJCQkhPSAwXG4iICsgCi0JCSIJCQkJCT8gMFxuIiArIAotCQkiCQkJCQk6IDEpLCBcbiIgKyAKLQkJIgkJCW5ldyBZKFxuIiArIAotCQkiCQkJCVwiZGVidWcucHJlc2VydmVBbGxMb2NhbHNcIiwgXG4iICsgCi0JCSIJCQkJdGhpcywgXG4iICsgCi0JCSIJCQkJbG9jYWxlLCBcbiIgKyAKLQkJIgkJCQlwcmVzZXJ2ZUFsbExvY2FsVmFyaWFibGVzXG4iICsgCi0JCSIJCQkJCT8gMFxuIiArIAotCQkiCQkJCQk6IDEpLCBcbiIgKyAKLQkJIgkJCW5ldyBZKFxuIiArIAotCQkiCQkJCVwib3B0aW9uYWxFcnJvci51blJlYWNoYWJsZUNvZGVcIiwgXG4iICsgCi0JCSIJCQkJdGhpcywgXG4iICsgCi0JCSIJCQkJbG9jYWxlLCBcbiIgKyAKLQkJIgkJCQkoZXJyb3JUaHJlc2hvbGRcbiIgKyAKLQkJIgkJCQkJJiBVbnJlYWNoYWJsZUNvZGUpXG4iICsgCi0JCSIJCQkJCSE9IDBcbiIgKyAKLQkJIgkJCQkJPyAwXG4iICsgCi0JCSIJCQkJCTogMSlcbiIgKyAKLQkJIgkJCQkgfVxuIiArIAotCQkiCX1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIG1ldGhvZC9maWVsZCBpbnRvIGFycmF5IGludGlhbGl6ZXI+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6bj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJuZXciOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJuZXcgWSgiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJpbXBvcnQgcDIuWTtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBWYXJzO1xuIiArIAotCQkiICBwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IExpbmVzO1xuIiArIAotCQkiICBwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IFNvdXJjZTtcbiIgKyAKLQkJIiAgcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBVbnJlYWNoYWJsZUNvZGU7XG4iICsgCi0JCSIgIHB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgcHJvZHVjZURlYnVnQXR0cmlidXRlcztcbiIgKyAKLQkJIiAgPGNsaW5pdD4oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgaW50IGxvY2FsZTtcbiIgKyAKLQkJIiAgICBpbnQgZXJyb3JUaHJlc2hvbGQ7XG4iICsgCi0JCSIgICAgaW50IHByZXNlcnZlQWxsTG9jYWxWYXJpYWJsZXM7XG4iICsgCi0JCSIgICAgbmV3IFlbXXs8Q29tcGxldGVPbk5hbWU6bj4sfTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdFhfMUZHUEU4RSgpIHsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7IFxuIiArIAotCQkiaW1wb3J0IHAyLlk7IFxuIiArIAotCQkiLyoqXG4iICsgCi0JCSIgKiAxRkdHVjhDIGFuZCAxRkdQRThFXG4iICsgCi0JCSIgKi9cbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIglwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IFZhcnM7IFxuIiArIAotCQkiCXB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgTGluZXM7IFxuIiArIAotCQkiCXB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgU291cmNlOyBcbiIgKyAKLQkJIglwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IFVucmVhY2hhYmxlQ29kZTsgXG4iICsgCi0JCSIJcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBwcm9kdWNlRGVidWdBdHRyaWJ1dGVzOyBcbiIgKyAKLQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKLQkJIgkJaW50IGxvY2FsZSwgXG4iICsgCi0JCSIJCQllcnJvclRocmVzaG9sZCwgXG4iICsgCi0JCSIJCQlwcmVzZXJ2ZUFsbExvY2FsVmFyaWFibGVzOyBcbiIgKyAKLQkJIgkJcmV0dXJuIG5ldyBZW10ge1xuIiArIAotCQkiCQkJbmV3IFkoXG4iICsgCi0JCSIJCQkJXCJkZWJ1Zy52YXJzXCIsIFxuIiArIAotCQkiCQkJCXRoaXMsIFxuIiArIAotCQkiCQkJCWxvY2FsZSwgXG4iICsgCi0JCSIJCQkJKHByb2R1Y2VEZWJ1Z0F0dHJpYnV0ZXNcbiIgKyAKLQkJIgkJCQkJJiBWYXJzKVxuIiArIAotCQkiCQkJCQkhPSAwXG4iICsgCi0JCSIJCQkJCT8gMFxuIiArIAotCQkiCQkJCQk6IDEpLCBcbiIgKyAKLQkJIgkJCW5ldyBZKFxuIiArIAotCQkiCQkJCVwiZGVidWcubGluZXNcIiwgXG4iICsgCi0JCSIJCQkJdGhpcywgXG4iICsgCi0JCSIJCQkJbG9jYWxlLCBcbiIgKyAKLQkJIgkJCQkocHJvZHVjZURlYnVnQXR0cmlidXRlc1xuIiArIAotCQkiCQkJCQkmIExpbmVzKVxuIiArIAotCQkiCQkJCQkhPSAwXG4iICsgCi0JCSIJCQkJCT8gMFxuIiArIAotCQkiCQkJCQk6IDEpLCBcbiIgKyAKLQkJIgkJCW5ldyBZKFxuIiArIAotCQkiCQkJCVwiZGVidWcuc291cmNlXCIsIFxuIiArIAotCQkiCQkJCXRoaXMsIFxuIiArIAotCQkiCQkJCWxvY2FsZSwgXG4iICsgCi0JCSIJCQkJKHByb2R1Y2VEZWJ1Z0F0dHJpYnV0ZXNcbiIgKyAKLQkJIgkJCQkJJiBTb3VyY2UpXG4iICsgCi0JCSIJCQkJCSE9IDBcbiIgKyAKLQkJIgkJCQkJPyAwXG4iICsgCi0JCSIJCQkJCTogMSksIFxuIiArIAotCQkiCQkJbmV3IFkoXG4iICsgCi0JCSIJCQkJXCJkZWJ1Zy5wcmVzZXJ2ZUFsbExvY2Fsc1wiLCBcbiIgKyAKLQkJIgkJCQl0aGlzLCBcbiIgKyAKLQkJIgkJCQlsb2NhbGUsIFxuIiArIAotCQkiCQkJCXByZXNlcnZlQWxsTG9jYWxWYXJpYWJsZXNcbiIgKyAKLQkJIgkJCQkJPyAwXG4iICsgCi0JCSIJCQkJCTogMSksIFxuIiArIAotCQkiCQkJbmV3IFkoXG4iICsgCi0JCSIJCQkJXCJvcHRpb25hbEVycm9yLnVuUmVhY2hhYmxlQ29kZVwiLCBcbiIgKyAKLQkJIgkJCQl0aGlzLCBcbiIgKyAKLQkJIgkJCQlsb2NhbGUsIFxuIiArIAotCQkiCQkJCShlcnJvclRocmVzaG9sZFxuIiArIAotCQkiCQkJCQkmIFVucmVhY2hhYmxlQ29kZSlcbiIgKyAKLQkJIgkJCQkJIT0gMFxuIiArIAotCQkiCQkJCQk/IDBcbiIgKyAKLQkJIgkJCQkJOiAxKVxuIiArIAotCQkiCQkJCSB9XG4iICsgCi0JCSIJfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbWV0aG9kL2ZpZWxkIGludG8gcmV0dXJuIHN0YXRlbWVudD4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpuPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIm4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIm5ldyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoIm5ldyBZW10iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJpbXBvcnQgcDIuWTtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBWYXJzO1xuIiArIAotCQkiICBwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IExpbmVzO1xuIiArIAotCQkiICBwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IFNvdXJjZTtcbiIgKyAKLQkJIiAgcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBVbnJlYWNoYWJsZUNvZGU7XG4iICsgCi0JCSIgIHB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgcHJvZHVjZURlYnVnQXR0cmlidXRlcztcbiIgKyAKLQkJIiAgPGNsaW5pdD4oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgaW50IGxvY2FsZTtcbiIgKyAKLQkJIiAgICBpbnQgZXJyb3JUaHJlc2hvbGQ7XG4iICsgCi0JCSIgICAgaW50IHByZXNlcnZlQWxsTG9jYWxWYXJpYWJsZXM7XG4iICsgCi0JCSIgICAgcmV0dXJuIDxDb21wbGV0ZU9uTmFtZTpuPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdFhBXzFGR0dVUUZfMUZIU0w4SF8xKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSIvLyBpbnRcbiIgKyAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJIi8qKlxuIiArIAotCQkJIiAqIDFGR0dVUUYgYW5kIDFGSFNMOEhcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSIvKipcbiIgKyAKLQkJCSIgKiBpbnRcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSIvKlxuIiArIAotCQkJIiAqIGludFxuIiArIAotCQkJIiAqL1xuIiArIAotCQkJIi8vIGludFxuIiArIAotCQkJIi8qKlxuIiArIAotCQkJImludC5cbiIgKyAKLQkJCSIgKiBJbnRlcm5hbCBBUEkgdXNlZCB0byByZXNvbHZlIGEgY29tcGlsYXRpb24gdW5pdCBtaW5pbWFsbHkgZm9yIGNvZGUgYXNzaXN0IGVuZ2luZVxuIiArIAotCQkJIiAqL1xuIiArIAotCQkJIi8qKlxuIiArIAotCQkJIiAqIGludFxuIiArIAotCQkJIiAqL1xuIiArIAotCQkJInB1YmxpYyBjbGFzcyBYQSB7XG4iICsgCi0JCQkiCS8vICBpbnRcbiIgKyAKLQkJCSIJLyogIGludCAqL1xuIiArIAotCQkJIgkvKiogaW50ICovXG4iICsgCi0JCQkiCS8qKlxuIiArIAotCQkJIglpbnQuXG4iICsgCi0JCQkiCSAqIEludGVybmFsIEFQSSB1c2VkIHRvIHJlc29sdmUgYSBjb21waWxhdGlvbiB1bml0IG1pbmltYWxseSBmb3IgY29kZSBhc3Npc3QgZW5naW5lXG4iICsgCi0JCQkiCSAqL1xuIiArIAotCQkJIgl2b2lkIC8qIGludCAqL1xuIiArIAotCQkJIglmb28oKSB7XG4iICsgCi0JCQkiCQkvLyAgaW50XG4iICsgCi0JCQkiCQkvKiAgaW50ICovXG4iICsgCi0JCQkiCQkvKiogaW50ICovXG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSIJLyoqXG4iICsgCi0JCQkiCWludC5cbiIgKyAKLQkJCSIJICogSW50ZXJuYWwgQVBJIHVzZWQgdG8gcmVzb2x2ZSBhIGNvbXBpbGF0aW9uIHVuaXQgbWluaW1hbGx5IGZvciBjb2RlIGFzc2lzdCBlbmdpbmVcbiIgKyAKLQkJCSIJICovXG4iICsgCi0JCQkiCWludCBmaWVsZCAvKiBpbnQgKi9cbiIgKyAKLQkJCSIJO1xuIiArIAotCQkJIgkvKlxuIiArIAotCQkJIgkgICAgaW50XG4iICsgCi0JCQkiCSovXG4iICsgCi0JCQkiCXN0YXRpYyB7XG4iICsgCi0JCQkiCQkvLyBpbnRcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIn1cbiIgKyAKLQkJCSIvLyAgaW50XG4iICsgCi0JCQkiLyogIGludCAqL1xuIiArIAotCQkJIi8qKiBpbnQgKi9cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIGNvbW1lbnQ+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW50LiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9IE5PTkU7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSBOT05FOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJpbnQuXG4iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9IG51bGw7Ci0KLQl0cnkgewotCQljaGVja01ldGhvZFBhcnNlKAotCQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQkJY3Vyc29yTG9jYXRpb24sIAotCQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJCXRlc3ROYW1lKTsgCi0JCWFzc2VydFRydWUoImZhaWxlZCB0byBkZXRlY3QgaW52YWxpZCBjdXJzb3IgbG9jYXRpb24iLCBmYWxzZSk7CQkKLQl9IGNhdGNoKEludmFsaWRDdXJzb3JMb2NhdGlvbiBlKXsKLQkJYXNzZXJ0RXF1YWxzKCJpbnZhbGlkIGN1cnNvciBsb2NhdGlvbjogIiwgZS5pcnJpdGFudCwgSW52YWxpZEN1cnNvckxvY2F0aW9uLk5PX0NPTVBMRVRJT05fSU5TSURFX0NPTU1FTlQpOwotCX0KLX0KLXB1YmxpYyB2b2lkIHRlc3RYQV8xRkdHVVFGXzFGSFNMOEhfMigpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkiLy8gaW50XG4iICsgCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSIvKipcbiIgKyAKLQkJCSIgKiAxRkdHVVFGIGFuZCAxRkhTTDhIXG4iICsgCi0JCQkiICovXG4iICsgCi0JCQkiLyoqXG4iICsgCi0JCQkiICogaW50XG4iICsgCi0JCQkiICovXG4iICsgCi0JCQkiLypcbiIgKyAKLQkJCSIgKiBpbnRcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSIvLyBpbnRcbiIgKyAKLQkJCSIvKipcbiIgKyAKLQkJCSJpbnQuXG4iICsgCi0JCQkiICogSW50ZXJuYWwgQVBJIHVzZWQgdG8gcmVzb2x2ZSBhIGNvbXBpbGF0aW9uIHVuaXQgbWluaW1hbGx5IGZvciBjb2RlIGFzc2lzdCBlbmdpbmVcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSIvKipcbiIgKyAKLQkJCSIgKiBpbnRcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgWEEge1xuIiArIAotCQkJIgkvLyAgaW50XG4iICsgCi0JCQkiCS8qICBpbnQgKi9cbiIgKyAKLQkJCSIJLyoqIGludCAqL1xuIiArIAotCQkJIgkvKipcbiIgKyAKLQkJCSIJaW50LlxuIiArIAotCQkJIgkgKiBJbnRlcm5hbCBBUEkgdXNlZCB0byByZXNvbHZlIGEgY29tcGlsYXRpb24gdW5pdCBtaW5pbWFsbHkgZm9yIGNvZGUgYXNzaXN0IGVuZ2luZVxuIiArIAotCQkJIgkgKi9cbiIgKyAKLQkJCSIJdm9pZCAvKiBpbnQgKi9cbiIgKyAKLQkJCSIJZm9vKCkge1xuIiArIAotCQkJIgkJLy8gIGludFxuIiArIAotCQkJIgkJLyogIGludCAqL1xuIiArIAotCQkJIgkJLyoqIGludCAqL1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkiCS8qKlxuIiArIAotCQkJIglpbnQuXG4iICsgCi0JCQkiCSAqIEludGVybmFsIEFQSSB1c2VkIHRvIHJlc29sdmUgYSBjb21waWxhdGlvbiB1bml0IG1pbmltYWxseSBmb3IgY29kZSBhc3Npc3QgZW5naW5lXG4iICsgCi0JCQkiCSAqL1xuIiArIAotCQkJIglpbnQgZmllbGQgLyogaW50ICovXG4iICsgCi0JCQkiCTtcbiIgKyAKLQkJCSIJLypcbiIgKyAKLQkJCSIJICAgIGludFxuIiArIAotCQkJIgkqL1xuIiArIAotCQkJIglzdGF0aWMge1xuIiArIAotCQkJIgkJLy8gaW50XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSJ9XG4iICsgCi0JCQkiLy8gIGludFxuIiArIAotCQkJIi8qICBpbnQgKi9cbiIgKyAKLQkJCSIvKiogaW50ICovXG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBjb21tZW50PiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImkiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSBOT05FOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gTk9ORTsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigiaW50XG4iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9IG51bGw7Ci0KLQl0cnkgewotCQljaGVja01ldGhvZFBhcnNlKAotCQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQkJY3Vyc29yTG9jYXRpb24sIAotCQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJCXRlc3ROYW1lKTsgCi0JCWFzc2VydFRydWUoImZhaWxlZCB0byBkZXRlY3QgaW52YWxpZCBjdXJzb3IgbG9jYXRpb24iLCBmYWxzZSk7CQkKLQl9IGNhdGNoKEludmFsaWRDdXJzb3JMb2NhdGlvbiBlKXsKLQkJYXNzZXJ0RXF1YWxzKCJpbnZhbGlkIGN1cnNvciBsb2NhdGlvbjogIiwgZS5pcnJpdGFudCwgSW52YWxpZEN1cnNvckxvY2F0aW9uLk5PX0NPTVBMRVRJT05fSU5TSURFX0NPTU1FTlQpOwotCX0KLX0KLXB1YmxpYyB2b2lkIHRlc3RYQV8xRkdHVVFGXzFGSFNMOEhfMygpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkiLy8gaW50XG4iICsgCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSIvKipcbiIgKyAKLQkJCSIgKiAxRkdHVVFGIGFuZCAxRkhTTDhIXG4iICsgCi0JCQkiICovXG4iICsgCi0JCQkiLyoqXG4iICsgCi0JCQkiICogaW50XG4iICsgCi0JCQkiICovXG4iICsgCi0JCQkiLypcbiIgKyAKLQkJCSIgKiBpbnRcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSIvLyBpbnRcbiIgKyAKLQkJCSIvKipcbiIgKyAKLQkJCSJpbnQuXG4iICsgCi0JCQkiICogSW50ZXJuYWwgQVBJIHVzZWQgdG8gcmVzb2x2ZSBhIGNvbXBpbGF0aW9uIHVuaXQgbWluaW1hbGx5IGZvciBjb2RlIGFzc2lzdCBlbmdpbmVcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSIvKipcbiIgKyAKLQkJCSIgKiBpbnRcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgWEEge1xuIiArIAotCQkJIgkvLyAgaW50XG4iICsgCi0JCQkiCS8qICBpbnQgKi9cbiIgKyAKLQkJCSIJLyoqIGludCAqL1xuIiArIAotCQkJIgkvKipcbiIgKyAKLQkJCSIJaW50LlxuIiArIAotCQkJIgkgKiBJbnRlcm5hbCBBUEkgdXNlZCB0byByZXNvbHZlIGEgY29tcGlsYXRpb24gdW5pdCBtaW5pbWFsbHkgZm9yIGNvZGUgYXNzaXN0IGVuZ2luZVxuIiArIAotCQkJIgkgKi9cbiIgKyAKLQkJCSIJdm9pZCAvKiBpbnQgKi8gZm9vKCkge1xuIiArIAotCQkJIgkJLy8gIGludFxuIiArIAotCQkJIgkJLyogIGludCAqL1xuIiArIAotCQkJIgkJLyoqIGludCAqL1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkiCS8qKlxuIiArIAotCQkJIglpbnQuXG4iICsgCi0JCQkiCSAqIEludGVybmFsIEFQSSB1c2VkIHRvIHJlc29sdmUgYSBjb21waWxhdGlvbiB1bml0IG1pbmltYWxseSBmb3IgY29kZSBhc3Npc3QgZW5naW5lXG4iICsgCi0JCQkiCSAqL1xuIiArIAotCQkJIglpbnQgZmllbGQgLyogaW50ICovXG4iICsgCi0JCQkiCTtcbiIgKyAKLQkJCSIJLypcbiIgKyAKLQkJCSIJICAgIGludFxuIiArIAotCQkJIgkqL1xuIiArIAotCQkJIglzdGF0aWMge1xuIiArIAotCQkJIgkJLy8gaW50XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSJ9XG4iICsgCi0JCQkiLy8gIGludFxuIiArIAotCQkJIi8qICBpbnQgKi9cbiIgKyAKLQkJCSIvKiogaW50ICovXG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBjb21tZW50PiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImkiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSBOT05FOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gTk9ORTsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigiaW50ICovIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPSBudWxsOwotCi0JdHJ5IHsKLQkJY2hlY2tNZXRob2RQYXJzZSgKLQkJCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJCWN1cnNvckxvY2F0aW9uLCAKLQkJCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCQl0ZXN0TmFtZSk7IAotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gZGV0ZWN0IGludmFsaWQgY3Vyc29yIGxvY2F0aW9uIiwgZmFsc2UpOwkJCi0JfSBjYXRjaChJbnZhbGlkQ3Vyc29yTG9jYXRpb24gZSl7Ci0JCWFzc2VydEVxdWFscygiaW52YWxpZCBjdXJzb3IgbG9jYXRpb246ICIsIGUuaXJyaXRhbnQsIEludmFsaWRDdXJzb3JMb2NhdGlvbi5OT19DT01QTEVUSU9OX0lOU0lERV9DT01NRU5UKTsKLQl9Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0WEFfMUZHR1VRRl8xRkhTTDhIXzQoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJIi8vIGludFxuIiArIAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkiLyoqXG4iICsgCi0JCQkiICogMUZHR1VRRiBhbmQgMUZIU0w4SFxuIiArIAotCQkJIiAqL1xuIiArIAotCQkJIi8qKlxuIiArIAotCQkJIiAqIGludFxuIiArIAotCQkJIiAqL1xuIiArIAotCQkJIi8qXG4iICsgCi0JCQkiICogaW50XG4iICsgCi0JCQkiICovXG4iICsgCi0JCQkiLy8gaW50XG4iICsgCi0JCQkiLyoqXG4iICsgCi0JCQkiaW50LlxuIiArIAotCQkJIiAqIEludGVybmFsIEFQSSB1c2VkIHRvIHJlc29sdmUgYSBjb21waWxhdGlvbiB1bml0IG1pbmltYWxseSBmb3IgY29kZSBhc3Npc3QgZW5naW5lXG4iICsgCi0JCQkiICovXG4iICsgCi0JCQkiLyoqXG4iICsgCi0JCQkiICogaW50XG4iICsgCi0JCQkiICovXG4iICsgCi0JCQkicHVibGljIGNsYXNzIFhBIHtcbiIgKyAKLQkJCSIJLy8gIGludFxuIiArIAotCQkJIgkvKiAgaW50ICovXG4iICsgCi0JCQkiCS8qKiBpbnQgKi9cbiIgKyAKLQkJCSIJLyoqXG4iICsgCi0JCQkiCWludC5cbiIgKyAKLQkJCSIJICogSW50ZXJuYWwgQVBJIHVzZWQgdG8gcmVzb2x2ZSBhIGNvbXBpbGF0aW9uIHVuaXQgbWluaW1hbGx5IGZvciBjb2RlIGFzc2lzdCBlbmdpbmVcbiIgKyAKLQkJCSIJICovXG4iICsgCi0JCQkiCXZvaWQgLyogaW50ICovIGZvbygpIHtcbiIgKyAKLQkJCSIJCS8vICBpbnRcbiIgKyAKLQkJCSIJCS8qICBpbnQgKi9cbiIgKyAKLQkJCSIJCS8qKiBpbnQgKi9cbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIgkvKipcbiIgKyAKLQkJCSIJaW50LlxuIiArIAotCQkJIgkgKiBJbnRlcm5hbCBBUEkgdXNlZCB0byByZXNvbHZlIGEgY29tcGlsYXRpb24gdW5pdCBtaW5pbWFsbHkgZm9yIGNvZGUgYXNzaXN0IGVuZ2luZVxuIiArIAotCQkJIgkgKi9cbiIgKyAKLQkJCSIJaW50IGZpZWxkIC8qIGludCAqL1xuIiArIAotCQkJIgk7XG4iICsgCi0JCQkiCS8qXG4iICsgCi0JCQkiCSAgICBpbnRcbiIgKyAKLQkJCSIJKi9cbiIgKyAKLQkJCSIJc3RhdGljIHtcbiIgKyAKLQkJCSIJCS8vIGludFxuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIiArIAotCQkJIi8vICBpbnRcbiIgKyAKLQkJCSIvKiAgaW50ICAqL1xuIiArIAotCQkJIi8qKiBpbnQgICAqL1xuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gY29tbWVudD4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gTk9ORTsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9IE5PTkU7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoImludCAqLyBmb28oKSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0gbnVsbDsKLQotCXRyeSB7Ci0JCWNoZWNrTWV0aG9kUGFyc2UoCi0JCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCQljdXJzb3JMb2NhdGlvbiwgCi0JCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkJdGVzdE5hbWUpOyAKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGRldGVjdCBpbnZhbGlkIGN1cnNvciBsb2NhdGlvbiIsIGZhbHNlKTsJCQotCX0gY2F0Y2goSW52YWxpZEN1cnNvckxvY2F0aW9uIGUpewotCQlhc3NlcnRFcXVhbHMoImludmFsaWQgY3Vyc29yIGxvY2F0aW9uOiAiLCBlLmlycml0YW50LCBJbnZhbGlkQ3Vyc29yTG9jYXRpb24uTk9fQ09NUExFVElPTl9JTlNJREVfQ09NTUVOVCk7Ci0JfQotfQotcHVibGljIHZvaWQgdGVzdFhCXzFGSVlNNUlfMSgpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSIvKlxuIiArIAotCQkJIiAqIDFGSVlNNUlcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgWEJcbiIgKyAKLQkJCSIJZXh0ZW5kcyBqYXZhLmlvLkZpbGUge1xuIiArIAotCQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKLQkJCSIJCVhCIHhiID0gbmV3IFhCKCk7XG4iICsgCi0JCQkiCQl0aGlzLnNlcGFyYXRvci47XG4iICsgCi0JCQkiCQl0aGlzLmJhcigpLjtcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIglTdHJpbmcgYmFyKCkge1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbWV0aG9kL2ZpZWxkIG9mIGV4cGxpY2l0IHRoaXMgYWNjZXNzPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRoaXMucyI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk1lbWJlckFjY2Vzczp0aGlzLnM+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAicyI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidGhpcy5zZXBhcmF0b3IiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWEIgZXh0ZW5kcyBqYXZhLmlvLkZpbGUge1xuIiArIAotCQkiICBwdWJsaWMgWEIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgWEIgeGI7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6dGhpcy5zPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBTdHJpbmcgYmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0WEJfMUZJWU01SV8yKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJIi8qXG4iICsgCi0JCQkiICogMUZJWU01SVxuIiArIAotCQkJIiAqL1xuIiArIAotCQkJInB1YmxpYyBjbGFzcyBYQlxuIiArIAotCQkJIglleHRlbmRzIGphdmEuaW8uRmlsZSB7XG4iICsgCi0JCQkiCXZvaWQgZm9vKCkge1xuIiArIAotCQkJIgkJWEIgeGIgPSBuZXcgWEIoKTtcbiIgKyAKLQkJCSIJCXRoaXMuc2VwYXJhdG9yLjtcbiIgKyAKLQkJCSIJCXRoaXMuYmFyKCkuO1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkiCVN0cmluZyBiYXIoKSB7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBtZXRob2QvZmllbGQgb2YgZXhwbGljaXRseSBhY2Nlc3NlZCBmaWVsZD4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ0aGlzLnNlcGFyYXRvci4iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6dGhpcy5zZXBhcmF0b3IuPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFhCIGV4dGVuZHMgamF2YS5pby5GaWxlIHtcbiIgKyAKLQkJIiAgcHVibGljIFhCKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIFhCIHhiO1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOnRoaXMuc2VwYXJhdG9yLj47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgU3RyaW5nIGJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdFhCXzFGSVlNNUlfMygpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSIvKlxuIiArIAotCQkJIiAqIDFGSVlNNUlcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgWEJcbiIgKyAKLQkJCSIJZXh0ZW5kcyBqYXZhLmlvLkZpbGUge1xuIiArIAotCQkJIgl2b2lkIGZvbygpIHtcbiIgKyAKLQkJCSIJCVhCIHhiID0gbmV3IFhCKCk7XG4iICsgCi0JCQkiCQl0aGlzLnNlcGFyYXRvci47XG4iICsgCi0JCQkiCQl0aGlzLmJhcigpLjtcbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIglTdHJpbmcgYmFyKCkge1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbWV0aG9kL2ZpZWxkIG9mIGV4cGxpY2l0IHRoaXMgYWNjZXNzPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRoaXMuYiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk1lbWJlckFjY2Vzczp0aGlzLmI+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiYiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidGhpcy5iYXIiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWEIgZXh0ZW5kcyBqYXZhLmlvLkZpbGUge1xuIiArIAotCQkiICBwdWJsaWMgWEIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgWEIgeGI7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6dGhpcy5iPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBTdHJpbmcgYmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0WEJfMUZJWU01SV80KCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJIi8qXG4iICsgCi0JCQkiICogMUZJWU01SVxuIiArIAotCQkJIiAqL1xuIiArIAotCQkJInB1YmxpYyBjbGFzcyBYQlxuIiArIAotCQkJIglleHRlbmRzIGphdmEuaW8uRmlsZSB7XG4iICsgCi0JCQkiCXZvaWQgZm9vKCkge1xuIiArIAotCQkJIgkJWEIgeGIgPSBuZXcgWEIoKTtcbiIgKyAKLQkJCSIJCXRoaXMuc2VwYXJhdG9yLjtcbiIgKyAKLQkJCSIJCXRoaXMuYmFyKCkuO1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkiCVN0cmluZyBiYXIoKSB7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBtZXRob2QvZmllbGQgb2YgZXhwbGljaXRseSBhY2Nlc3NlZCBtZXRob2Q+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidGhpcy5iYXIoKS4iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6dGhpcy5iYXIoKS4+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICIiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWEIgZXh0ZW5kcyBqYXZhLmlvLkZpbGUge1xuIiArIAotCQkiICBwdWJsaWMgWEIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgWEIgeGI7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6dGhpcy5iYXIoKS4+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIFN0cmluZyBiYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RZXzFGR1BFU0koKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJImltcG9ydCBwMi47IFxuIiArIAotCQkiLyoqXG4iICsgCi0JCSIgKiAxRkdQRVNJXG4iICsgCi0JCSIgKi9cbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBZIHtcbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIGltcG9ydHM+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicDIuIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uSW1wb3J0OnAyLj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInAyLiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJImltcG9ydCA8Q29tcGxldGVPbkltcG9ydDpwMi4+O1xuIiArIAotCQkicHVibGljIGNsYXNzIFkge1xuIiArIAotCQkiICBwdWJsaWMgWSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RZQV8xRkdSSVVIKCkgewotCVN0cmluZyBzdHIgPSAKLQkJCSJwYWNrYWdlIHA7IFxuIiArIAotCQkJIi8qKlxuIiArIAotCQkJIiAqIDFGR1JJVUhcbiIgKyAKLQkJCSIgKi9cbiIgKyAKLQkJCSJwdWJsaWMgY2xhc3MgWUFcbiIgKyAKLQkJCSIJZXh0ZW5kcyBZQVNlY29uZFRvcExldmVsIHtcbiIgKyAKLQkJCSIJdm9pZCBlRm9vKCkge1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkiCWNsYXNzIFlBTWVtYmVyIHtcbiIgKyAKLQkJCSIJCXZvaWQgZUZvbygpIHtcbiIgKyAKLQkJCSIJCX1cbiIgKyAKLQkJCSIJCXZvaWQgZUJhcigpIHtcbiIgKyAKLQkJCSIJCQllIH1cbiIgKyAKLQkJCSIJfVxuIiArIAotCQkJIn1cbiIgKyAKLQkJCSJjbGFzcyBZQVNlY29uZFRvcExldmVsIHtcbiIgKyAKLQkJCSIJcHVibGljIGJvb2xlYW4gZXF1YWxzKFlBIHlheWEpIHtcbiIgKyAKLQkJCSIJCXJldHVybiB0cnVlO1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkiCXB1YmxpYyBlRm9vKCkge1xuIiArIAotCQkJIgl9XG4iICsgCi0JCQkiCXB1YmxpYyB2b2lkIGVGb29CYXIoKSB7XG4iICsgCi0JCQkiCX1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBtZXRob2QvZmllbGQ+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZSI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6ZT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJlIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJlIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigiZSB9IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFlBIGV4dGVuZHMgWUFTZWNvbmRUb3BMZXZlbCB7XG4iICsgCi0JCSIgIGNsYXNzIFlBTWVtYmVyIHtcbiIgKyAKLQkJIiAgICBZQU1lbWJlcigpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgdm9pZCBlRm9vKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgICB2b2lkIGVCYXIoKSB7XG4iICsgCi0JCSIgICAgICA8Q29tcGxldGVPbk5hbWU6ZT47XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBZQSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGVGb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIgKyAKLQkJImNsYXNzIFlBU2Vjb25kVG9wTGV2ZWwge1xuIiArIAotCQkiICBZQVNlY29uZFRvcExldmVsKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBib29sZWFuIGVxdWFscyhZQSB5YXlhKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIGVGb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIHZvaWQgZUZvb0JhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdFlCXzFGSjRENDZfMSgpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSIvKipcbiIgKyAKLQkJCSIgKiAxRko0RDQ2XG4iICsgCi0JCQkiICovXG4iICsgCi0JCQkicHVibGljIGNsYXNzIFlCIHtcbiIgKyAKLQkJCSIJdm9pZCBmb28oKSB7XG4iICsgCi0JCQkiCQluZXcgU3RyaW5nKFwiYXNkZlwiLmdldEJ5dGVzKCkpLn1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBtZXRob2QvZmllbGQgb2Ygb2JqZWN0IGNyZWF0aW9uPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIm5ldyBTdHJpbmcoXCJhc2RmXCIuZ2V0Qnl0ZXMoKSkuIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOm5ldyBTdHJpbmcoXCJhc2RmXCIuZ2V0Qnl0ZXMoKSkuPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFlCIHtcbiIgKyAKLQkJIiAgcHVibGljIFlCKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOm5ldyBTdHJpbmcoXCJhc2RmXCIuZ2V0Qnl0ZXMoKSkuPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdFpfMUZHUEYzRF8xKCkgewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCSIvKipcbiIgKyAKLQkJIiAqIDFGR1BGM0RcbiIgKyAKLQkJIiAqL1xuIiArIAotCQkicHVibGljIGNsYXNzIFogaW1wIFByby5TZXYsIFxuIiArIAotCQkiCUJsYS5CbG8ge1xuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gaW1wbGVtZW50cyBrZXl3b3JkPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImltcCI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbktleXdvcmQ6aW1wPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImltcCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaW1wIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFogZXh0ZW5kcyA8Q29tcGxldGVPbktleXdvcmQ6aW1wPiB7XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RaXzFGR1BGM0RfMigpIHsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7IFxuIiArIAotCQkiLyoqXG4iICsgCi0JCSIgKiAxRkdQRjNEXG4iICsgCi0JCSIgKi9cbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBaIGltcGxlbWVudHMgUHJvLlNldiwgXG4iICsgCi0JCSIJQmxhLkJsbyB7XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBpbXBsZW50ZWQgaW50ZXJmYWNlPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIlAiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25JbnRlcmZhY2U6UD4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJQIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJQcm8iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJQcm8uU2V2IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFogaW1wbGVtZW50cyA8Q29tcGxldGVPbkludGVyZmFjZTpQPiwgQmxhLkJsbyB7XG4iICsgCi0JCSIgIHB1YmxpYyBaKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdFpBXzEoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkiaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBpbXBvcnQga2V5d29yZD4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDppPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImkiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImltcG9ydCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoImltcG9ydCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkiaW1wb3J0IDxDb21wbGV0ZU9uS2V5d29yZDppPjtcbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0WkFfMigpIHsKLQlTdHJpbmcgc3RyID0gCi0JCQkicGFja2FnZSBwOyBcbiIgKyAKLQkJCSJpbXBvcnQgamF2YS51dGlsLlZlY3RvcjtcbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIGltcG9ydGVkIHBhY2thZ2U+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiamF2IjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uSW1wb3J0Omphdj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJqYXYiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImphdmEudXRpbC5WZWN0b3IiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJqYXZhLnV0aWwuVmVjdG9yIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkiaW1wb3J0IDxDb21wbGV0ZU9uSW1wb3J0Omphdj47XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotcHVibGljIHZvaWQgdGVzdFpBXzMoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkiaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBpbXBvcnRlZCB0eXBlPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImphdmEudXRpbC5WIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uSW1wb3J0OmphdmEudXRpbC5WPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIlYiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImphdmEudXRpbC5WZWN0b3IiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJpbXBvcnQgPENvbXBsZXRlT25JbXBvcnQ6amF2YS51dGlsLlY+O1xuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RaQl8xRko0RDQ2XzEoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkiLyoqXG4iICsgCi0JCQkiICogMUZKNEQ0NlxuIiArIAotCQkJIiAqL1xuIiArIAotCQkJImltcG9ydCBqYXZhLnV0aWwuemlwLkNSQzMyO1xuIiArIAotCQkJImltcG9ydCBqYXZhLmlvLio7XG4iICsgCi0JCQkicHVibGljIGNsYXNzIFpCIHtcbiIgKyAKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oXG4iICsgCi0JCQkiCQlqYXZhLmxhbmcuU3RyaW5nW10gYXJncykge1xuIiArIAotCQkJIgkJRmlsZSBmaWxlID0gXG4iICsgCi0JCQkiCQkJbmV3IEZpbGUoXCJkOlxcXFwzMTRcIik7IFxuIiArIAotCQkJIgkJQ1JDMzIgY3JjID0gbmV3IENSQzMyKCk7XG4iICsgCi0JCQkiCQlmaWxlLn1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBtZXRob2QvZmllbGQgb2YgbG9jYWwgdmFyaWFibGU+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZmlsZS4iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmZpbGUuPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiZmlsZS4iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJpbXBvcnQgamF2YS51dGlsLnppcC5DUkMzMjtcbiIgKyAKLQkJImltcG9ydCBqYXZhLmlvLio7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWkIge1xuIiArIAotCQkiICBwdWJsaWMgWkIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKLQkJIiAgICBGaWxlIGZpbGU7XG4iICsgCi0JCSIgICAgQ1JDMzIgY3JjO1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpmaWxlLj47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3RaQl8xRko0RDQ2XzIoKSB7Ci0JU3RyaW5nIHN0ciA9IAotCQkJInBhY2thZ2UgcDsgXG4iICsgCi0JCQkiLyoqXG4iICsgCi0JCQkiICogMUZKNEQ0NlxuIiArIAotCQkJIiAqL1xuIiArIAotCQkJImltcG9ydCBqYXZhLnV0aWwuemlwLkNSQzMyO1xuIiArIAotCQkJImltcG9ydCBqYXZhLmlvLio7XG4iICsgCi0JCQkicHVibGljIGNsYXNzIFpCIHtcbiIgKyAKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oXG4iICsgCi0JCQkiCQlqYXZhLmxhbmcuU3RyaW5nW10gYXJncykge1xuIiArIAotCQkJIgkJRmlsZSBmaWxlID0gXG4iICsgCi0JCQkiCQkJbmV3IEZpbGUoXCJkOlxcXFwzMTRcIik7IFxuIiArIAotCQkJIgkJQ1JDMzIgY3JjID0gbmV3IENSQzMyKCk7XG4iICsgCi0JCQkiCQlmaWxlLn1cbiIgKyAKLQkJCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBsb2NhbCB2YXJpYWJsZSB0eXBlPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIkNSQyI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6Q1JDPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIkNSQyI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiQ1JDMzIiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJDUkMzMiBjcmMiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJpbXBvcnQgamF2YS51dGlsLnppcC5DUkMzMjtcbiIgKyAKLQkJImltcG9ydCBqYXZhLmlvLio7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWkIge1xuIiArIAotCQkiICBwdWJsaWMgWkIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKLQkJIiAgICBGaWxlIGZpbGU7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOkNSQz47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qKgotICogQ29tcGxldGUgaW4gaW5pdGlhbGl6ZXIKLSAqLwotcHVibGljIHZvaWQgdGVzdDAwMSgpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKyAKLQkJIiAgICBpbnQgdjE7XG4iICsgCi0JCSIgICAge1xuIiArIAotCQkiICAgICAgT2JqXG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBpbiBpbml0aWFsaXplcj4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJPYmoiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOk9iaj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJPYmoiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIk9iaiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoIk9iaiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgaW50IHYxO1xuIiArIAotCQkiICAgIHtcbiIgKyAKLQkJIiAgICAgIDxDb21wbGV0ZU9uTmFtZTpPYmo+O1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotLyoqCi0gKiBDb21wbGV0ZSBhZnRlciBpbml0aWFsaXplcgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDAyKCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArIAotCQkiICAgIGludCB2MTtcbiIgKyAKLQkJIiAgICB7XG4iICsgCi0JCSIgICAgICBpbnQgdjJcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgT2JqIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBhZnRlciBpbml0aWFsaXplcj4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJPYmoiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOk9iaj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJPYmoiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIk9iaiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoIk9iaiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgaW50IHYxO1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpPYmo+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKioKLSAqIENvbXBsZXRlIGluIGluaXRpYWxpemVyCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDMoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsgCi0JCSIgICAgaW50IHYxO1xuIiArIAotCQkiICAgIHtcbiIgKyAKLQkJIiAgICAgIHRoaXMuXG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBpbiBpbml0aWFsaXplcj4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ0aGlzLiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk1lbWJlckFjY2Vzczp0aGlzLj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInRoaXMuIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigidGhpcy4iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIGludCB2MTtcbiIgKyAKLQkJIiAgICB7XG4iICsgCi0JCSIgICAgICA8Q29tcGxldGVPbk1lbWJlckFjY2Vzczp0aGlzLj47XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0KLS8qKgotICogQ29tcGxldGUgaW4gc3dpdGNoCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDQoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgZmluYWwgc3RhdGljIGludCBaWlogPSAxO1xuIisKLQkJIiAgdm9pZCBmb28oKXtcbiIgKyAKLQkJIiAgICBzd2l0Y2goMilcbiIgKwotCQkiICAgICAgY2FzZSAwICsgWlpaIDpcbiIgKyAKLQkJIiAgICAgIGNhc2UgMSArIFpaWiA6XG4iICsgCi0JCSIgICAgICAgICAgYmFyKFpaWilcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGJhcihpbnQgeSkge31cbiIrCi0JCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBpbiBzd2l0Y2g+IjsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiWlpaIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpaWlo+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiWlpaIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJaWloiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiWlpaIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBzdGF0aWMgZmluYWwgaW50IFpaWjtcbiIgKyAKLQkJIiAgPGNsaW5pdD4oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgYmFyKDxDb21wbGV0ZU9uTmFtZTpaWlo+KTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGJhcihpbnQgeSkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKioKLSAqIENvbXBsZXRlIGluIG1ldGhvZCB0eXBlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDA1KCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIGNsb24gZm9vKCl7XG4iICsgIAotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIGluIG1ldGhvZCB0eXBlPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNsb24iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOmNsb24+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiY2xvbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiY2xvbiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJjbG9uIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6Y2xvbj5cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKioKLSAqIENvbXBsZXRlIGluIG1ldGhvZCB0eXBlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDA2KCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIGNsb25cbiIgKyAgCi0JCSIgIGZvbygpO1xuIiArICAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIGluIG1ldGhvZCB0eXBlPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNsb24iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOmNsb24+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiY2xvbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiY2xvbiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJjbG9uIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpjbG9uPjtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKioKLSAqIENvbXBsZXRlIGluIGZpZWxkIHR5cGUuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDcoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgY2xvbiAgeDtcbiIgKyAgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBpbiBmaWVsZCB0eXBlPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNsb24iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOmNsb24+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiY2xvbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiY2xvbiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJjbG9uIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpjbG9uPjtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotLyoqCi0gKiBDb21wbGV0ZSBpbiBmaWVsZCB0eXBlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDA4KCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIGNsb25cbiIgKyAgCi0JCSIgIHg7XG4iICsgIAotCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgaW4gZmllbGQgdHlwZT4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJjbG9uIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpjbG9uPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImNsb24iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImNsb24iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiY2xvbiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6Y2xvbj47XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qKgotICogQ29tcGxldGUgaW4gZmllbGQgdHlwZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwOSgpewotCVN0cmluZyBzdHIgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBjbG9uXG4iICsgIAotCQkiICB4IHk7XG4iICsgIAotCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgaW4gZmllbGQgdHB5ZT4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJjbG9uIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpjbG9uPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImNsb24iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImNsb24iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiY2xvbiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6Y2xvbj47XG4iICsgCi0JCSIgIHggeTtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKioKLSAqIENvbXBsZXRlIGluIG1ldGhvZCB0eXBlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDEwKCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIGNsb25cbiIgKyAgCi0JCSIgIHggeSgpe31cbiIgKyAgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBpbiBtZXRob2QgdHlwZT4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJjbG9uIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpjbG9uPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImNsb24iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImNsb24iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiY2xvbiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6Y2xvbj47XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB4IHkoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKioKLSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUyMzMKLSAqLwotcHVibGljIHZvaWQgdGVzdDAxMSgpewotCVN0cmluZyBzdHIgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBuZXcgT2JqZWN0W117XG4iICsgCi0JCSIgICAgICBiYXIoenp6KVxuIiArICAKLQkJIiAgICB9O1xuIiArICAKLQkJIiAgfVxuIiArICAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGJ1ZyAyNTIzMz4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIG5ldyBiYXIoPENvbXBsZXRlT25OYW1lOnp6ej4pO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKioKLSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjczNzAKLSAqLwotcHVibGljIHZvaWQgdGVzdDAxMigpewotCVN0cmluZyBzdHIgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArICAgCi0JCSIgIH1cbiIgKyAgCi0JCSIgIE9iamVjdCBvID0gbmV3IFpaWlxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8YnVnIDI3MzcwPiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIlpaWiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6WlpaPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIlpaWiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiWlpaIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoIlpaWiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBPYmplY3QgbyA9IG5ldyA8Q29tcGxldGVPblR5cGU6WlpaPigpO1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qKgotICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzczNQotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDEzKCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicHVibGljIGNsYXNzIEJhciB7XG4iICsKLQkJIiAgI1xuIiArIAotCQkiICBCYXIgZm9vMSA9IG5ldyBCYXIoKXt9O1xuIiArICAgCi0JCSIgIHtpbnQgaTt9XG4iICsgIAotCQkiICBzeW5jaHJvbml6ZWQgdm9pZCBmb28zKCkge31cbiIgKyAKLQkJIiAgenp6XG4iICsgIAotCQkifVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8YnVnIDI3NzM1PiI7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6enp6PiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBCYXIge1xuIiArCi0JCSIgIEJhciBmb28xO1xuIiArCi0JCSIgIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnp6ej47XG4iICsKLQkJIiAgcHVibGljIEJhcigpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgc3luY2hyb25pemVkIHZvaWQgZm9vMygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKioKLSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc5NDEKLSAqLwotcHVibGljIHZvaWQgdGVzdDAxNCgpewotCVN0cmluZyBzdHIgPSAKLQkJInB1YmxpYyBjbGFzcyBCYXIge1xuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIFN0cmluZyBzID0gXCJhXCIgKyBcImJcIjtcbiIgKyAKLQkJIiAgICB6enpcbiIgKyAKLQkJIiAgfVxuIiArICAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGJ1ZyAyNzk0MT4iOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgQmFyIHtcbiIgKwotCQkiICBwdWJsaWMgQmFyKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIFN0cmluZyBzO1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOnp6ej47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL0NvbXBsZXRpb25QYXJzZXJUZXN0Mi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3BhcnNlci9Db21wbGV0aW9uUGFyc2VyVGVzdDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ4MWU0Ny4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL0NvbXBsZXRpb25QYXJzZXJUZXN0Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzI4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyLnBhcnNlcjsKLQotcHVibGljIGNsYXNzIENvbXBsZXRpb25QYXJzZXJUZXN0MiBleHRlbmRzIEFic3RyYWN0Q29tcGxldGlvblRlc3QgewotcHVibGljIENvbXBsZXRpb25QYXJzZXJUZXN0MihTdHJpbmcgdGVzdE5hbWUpIHsKLQlzdXBlcih0ZXN0TmFtZSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDAwMSgpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgT2JqZWN0IG8gPSB6eno7XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICJPYmplY3QgbyA9IDxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgT2JqZWN0IG8gPSA8Q29tcGxldGVPbk5hbWU6enp6PjtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QwMDAyKCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB7XG4iICsgCi0JCSIgICAgT2JqZWN0IG8gPSB6eno7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB7XG4iICsKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkJCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICJPYmplY3QgbyA9IDxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAge1xuIiArIAotCQkiICAgIE9iamVjdCBvID0gPENvbXBsZXRlT25OYW1lOnp6ej47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotcHVibGljIHZvaWQgdGVzdDAwMDMoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsgCi0JCSIgICAgT2JqZWN0IG8gPSB6eno7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiT2JqZWN0IG8gPSA8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIE9iamVjdCBvID0gPENvbXBsZXRlT25OYW1lOnp6ej47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDAwNCgpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgI1xuIiArIAotCQkiICBPYmplY3QgbyA9IHp6ejtcbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIk9iamVjdCBvID0gPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBPYmplY3QgbyA9IDxDb21wbGV0ZU9uTmFtZTp6eno+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDAwNSgpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAge1xuIiArIAotCQkiICAgICNcbiIgKwotCQkiICAgIE9iamVjdCBvID0genp6O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIk9iamVjdCBvID0gPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgICAge1xuIiArIAotCQkiICAgICAgT2JqZWN0IG8gPSA8Q29tcGxldGVPbk5hbWU6enp6PjtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QwMDA2KCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArIAotCQkiICAgICNcbiIgKwotCQkiICAgIE9iamVjdCBvID0genp6O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0KLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIk9iamVjdCBvID0gPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBPYmplY3QgbyA9IDxDb21wbGV0ZU9uTmFtZTp6eno+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDAwNygpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgT2JqZWN0IG8gPSBuZXcgenp6O1xuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTp6eno+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiT2JqZWN0IG8gPSBuZXcgPENvbXBsZXRlT25UeXBlOnp6ej4oKSI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIE9iamVjdCBvID0gbmV3IDxDb21wbGV0ZU9uVHlwZTp6eno+KCk7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7IAotfQotcHVibGljIHZvaWQgdGVzdDAwMDgoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHtcbiIgKyAKLQkJIiAgICBPYmplY3QgbyA9IG5ldyB6eno7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICJPYmplY3QgbyA9IG5ldyA8Q29tcGxldGVPblR5cGU6enp6PigpIjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAge1xuIiArIAotCQkiICAgIE9iamVjdCBvID0gbmV3IDxDb21wbGV0ZU9uVHlwZTp6eno+KCk7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0MDAwOSgpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKyAKLQkJIiAgICBPYmplY3QgbyA9IG5ldyB6eno7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIk9iamVjdCBvID0gbmV3IDxDb21wbGV0ZU9uVHlwZTp6eno+KCkiOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBPYmplY3QgbyA9IG5ldyA8Q29tcGxldGVPblR5cGU6enp6PigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7IAotfQotcHVibGljIHZvaWQgdGVzdDAwMTAoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgICNcbiIgKyAKLQkJIiAgT2JqZWN0IG8gPSBuZXcgenp6O1xuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTp6eno+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiT2JqZWN0IG8gPSBuZXcgPENvbXBsZXRlT25UeXBlOnp6ej4oKSI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIE9iamVjdCBvID0gbmV3IDxDb21wbGV0ZU9uVHlwZTp6eno+KCk7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0MDAxMSgpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAge1xuIiArIAotCQkiICAgICNcbiIgKwotCQkiICAgIE9iamVjdCBvID0gbmV3IHp6ejtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIk9iamVjdCBvID0gbmV3IDxDb21wbGV0ZU9uVHlwZTp6eno+KCkiOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB7XG4iICsKLQkJIiAgICB7XG4iICsKLQkJIiAgICAgIE9iamVjdCBvID0gbmV3IDxDb21wbGV0ZU9uVHlwZTp6eno+KCk7XG4iICsKLQkJIiAgICB9XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0MDAxMigpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKyAKLQkJIiAgICAjXG4iICsKLQkJIiAgICBPYmplY3QgbyA9IG5ldyB6eno7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIk9iamVjdCBvID0gbmV3IDxDb21wbGV0ZU9uVHlwZTp6eno+KCkiOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBPYmplY3QgbyA9IG5ldyA8Q29tcGxldGVPblR5cGU6enp6PigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7IAotfQotcHVibGljIHZvaWQgdGVzdDAwMTMoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIE9iamVjdCBvID0geXl5O1xuIiArIAotCQkiICB6enpcbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6enp6PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIE9iamVjdCBvO1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTp6eno+O1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdDAwMTQoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHtcbiIgKyAKLQkJIiAgICBPYmplY3QgbyA9IHl5eTtcbiIgKyAKLQkJIiAgICB6enpcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgICBPYmplY3QgbztcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTp6eno+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7IAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0MDAxNSgpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKyAKLQkJIiAgICBPYmplY3QgbyA9IHl5eTtcbiIgKyAKLQkJIiAgICB6enpcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgT2JqZWN0IG87XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6enp6PjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOyAKLX0KLQotcHVibGljIHZvaWQgdGVzdDAwMTYoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgICNcbiIgKyAKLQkJIiAgT2JqZWN0IG8gPSB5eXk7XG4iICsgCi0JCSIgIHp6elxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTp6eno+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgT2JqZWN0IG87XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnp6ej47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsgCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3QwMDE3KCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB7XG4iICsgCi0JCSIgICAgI1xuIiArCi0JCSIgICAgT2JqZWN0IG8gPSB5eXk7XG4iICsgCi0JCSIgICAgenp6XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgICAge1xuIiArIAotCQkiICAgICAgT2JqZWN0IG87XG4iICsKLQkJIiAgICAgIDxDb21wbGV0ZU9uTmFtZTp6eno+O1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOyAKLX0KLQotcHVibGljIHZvaWQgdGVzdDAwMTgoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsgCi0JCSIgICAgI1xuIiArCi0JCSIgICAgT2JqZWN0IG8gPSB5eXk7XG4iICsgCi0JCSIgICAgenp6XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIE9iamVjdCBvO1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOnp6ej47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0MDAxOSgpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgT2JqZWN0IG8gPSBiYXIoenp6O1xuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiYmFyKDxDb21wbGV0ZU9uTmFtZTp6eno+KSI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIE9iamVjdCBvID0gYmFyKDxDb21wbGV0ZU9uTmFtZTp6eno+KTtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsgCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3QwMDIwKCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB7XG4iICsgCi0JCSIgICAgT2JqZWN0IG8gPSBiYXIoenp6O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiYmFyKDxDb21wbGV0ZU9uTmFtZTp6eno+KSI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgICBPYmplY3QgbyA9IGJhcig8Q29tcGxldGVPbk5hbWU6enp6Pik7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsgCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3QwMDIxKCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArIAotCQkiICAgIE9iamVjdCBvID0gYmFyKHp6ejtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiYmFyKDxDb21wbGV0ZU9uTmFtZTp6eno+KSI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIE9iamVjdCBvID0gYmFyKDxDb21wbGV0ZU9uTmFtZTp6eno+KTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOyAKLX0KLQotcHVibGljIHZvaWQgdGVzdDAwMjIoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgICNcbiIgKyAKLQkJIiAgT2JqZWN0IG8gPSBiYXIoenp6O1xuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiYmFyKDxDb21wbGV0ZU9uTmFtZTp6eno+KSI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIE9iamVjdCBvID0gYmFyKDxDb21wbGV0ZU9uTmFtZTp6eno+KTtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOyAKLX0KLQotcHVibGljIHZvaWQgdGVzdDAwMjMoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHtcbiIgKyAKLQkJIiAgICAjXG4iICsKLQkJIiAgICBPYmplY3QgbyA9IGJhcih6eno7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICJiYXIoPENvbXBsZXRlT25OYW1lOnp6ej4pIjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAge1xuIiArIAotCQkiICAgIHtcbiIgKyAKLQkJIiAgICAgIE9iamVjdCBvID0gYmFyKDxDb21wbGV0ZU9uTmFtZTp6eno+KTtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsgCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3QwMDI0KCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArIAotCQkiICAgICNcbiIgKwotCQkiICAgIE9iamVjdCBvID0gYmFyKHp6ejtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiYmFyKDxDb21wbGV0ZU9uTmFtZTp6eno+KSI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIE9iamVjdCBvID0gYmFyKDxDb21wbGV0ZU9uTmFtZTp6eno+KTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3QwMDI1KCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBPYmplY3QgbyA9IG5ldyBYKHp6ejtcbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIm5ldyBYKDxDb21wbGV0ZU9uTmFtZTp6eno+KSI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIE9iamVjdCBvID0gbmV3IFgoPENvbXBsZXRlT25OYW1lOnp6ej4pO1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOyAKLX0KLQotCi1wdWJsaWMgdm9pZCB0ZXN0MDAyNigpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAge1xuIiArIAotCQkiICAgIE9iamVjdCBvID0gbmV3IFgoenp6O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAibmV3IFgoPENvbXBsZXRlT25OYW1lOnp6ej4pIjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAge1xuIiArIAotCQkiICAgIE9iamVjdCBvID0gbmV3IFgoPENvbXBsZXRlT25OYW1lOnp6ej4pO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7IAotfQotCi0KLXB1YmxpYyB2b2lkIHRlc3QwMDI3KCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArIAotCQkiICAgIE9iamVjdCBvID0gbmV3IFgoenp6O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICJuZXcgWCg8Q29tcGxldGVPbk5hbWU6enp6PikiOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBPYmplY3QgbyA9IG5ldyBYKDxDb21wbGV0ZU9uTmFtZTp6eno+KTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOyAKLX0KLQotCi1wdWJsaWMgdm9pZCB0ZXN0MDAyOCgpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgI1xuIiArIAotCQkiICBPYmplY3QgbyA9IG5ldyBYKHp6ejtcbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIm5ldyBYKDxDb21wbGV0ZU9uTmFtZTp6eno+KSI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIE9iamVjdCBvID0gbmV3IFgoPENvbXBsZXRlT25OYW1lOnp6ej4pO1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7IAotfQotCi0KLXB1YmxpYyB2b2lkIHRlc3QwMDI5KCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB7XG4iICsgCi0JCSIgICAgI1xuIiArCi0JCSIgICAgT2JqZWN0IG8gPSBuZXcgWCh6eno7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICJuZXcgWCg8Q29tcGxldGVPbk5hbWU6enp6PikiOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgICAge1xuIiArIAotCQkiICAgICAgT2JqZWN0IG8gPSBuZXcgWCg8Q29tcGxldGVPbk5hbWU6enp6Pik7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7IAotfQotCi0KLXB1YmxpYyB2b2lkIHRlc3QwMDMwKCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArIAotCQkiICAgICNcbiIgKwotCQkiICAgIE9iamVjdCBvID0gbmV3IFgoenp6O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICJuZXcgWCg8Q29tcGxldGVPbk5hbWU6enp6PikiOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBPYmplY3QgbyA9IG5ldyBYKDxDb21wbGV0ZU9uTmFtZTp6eno+KTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3QwMDMxKCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBPYmplY3QgbyA9IHt6eno7XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgT2JqZWN0IG87XG4iICsKLQkJIiAge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIE9iamVjdCBvO1xuIiArCi0JCSIgIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTp6eno+O1xuIiArIAotCQkiICB9XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdDAwMzIoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHtcbiIgKyAKLQkJIiAgICBPYmplY3QgbyA9IHt6eno7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgICAgT2JqZWN0IG87XG4iICsKLQkJIiAgICB7XG4iICsKLQkJIiAgICAgIDxDb21wbGV0ZU9uTmFtZTp6eno+O1xuIiArIAotCQkiICAgIH1cbiIgKwotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3QwMDMzKCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArIAotCQkiICAgIE9iamVjdCBvID0ge3p6ejtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICB7XG4iICsKLQkJIiAgICAgIDxDb21wbGV0ZU9uTmFtZTp6eno+O1xuIiArIAotCQkiICAgIH1cbiIgKwotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgT2JqZWN0IG87XG4iICsKLQkJIiAgICB7XG4iICsKLQkJIiAgICAgIDxDb21wbGV0ZU9uTmFtZTp6eno+O1xuIiArIAotCQkiICAgIH1cbiIgKwotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3QwMDM0KCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICAjXG4iICsgCi0JCSIgIE9iamVjdCBvID0ge3p6ejtcbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBPYmplY3QgbztcbiIgKwotCQkiICB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgT2JqZWN0IG87XG4iICsKLQkJIiAge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOnp6ej47XG4iICsgCi0JCSIgIH1cbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0MDAzNSgpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAge1xuIiArIAotCQkiICAgICNcbiIgKwotCQkiICAgIE9iamVjdCBvID0ge3p6ejtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgICB7XG4iICsgCi0JCSIgICAgICBPYmplY3QgbztcbiIgKwotCQkiICAgICAge1xuIiArCi0JCSIgICAgICAgIDxDb21wbGV0ZU9uTmFtZTp6eno+O1xuIiArIAotCQkiICAgICAgfVxuIiArCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3QwMDM2KCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArIAotCQkiICAgICNcbiIgKwotCQkiICAgIE9iamVjdCBvID0ge3p6ejtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAge1xuIiArCi0JCSIgICAgICA8Q29tcGxldGVPbk5hbWU6enp6PjtcbiIgKyAKLQkJIiAgICB9XG4iICsKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIE9iamVjdCBvO1xuIiArCi0JCSIgICAge1xuIiArCi0JCSIgICAgICA8Q29tcGxldGVPbk5hbWU6enp6PjtcbiIgKyAKLQkJIiAgICB9XG4iICsKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotcHVibGljIHZvaWQgdGVzdDAwMzcoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIE9iamVjdFtdIG8gPSB7enp6O1xuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiT2JqZWN0W10gbyA9IHs8Q29tcGxldGVPbk5hbWU6enp6Pix9IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgT2JqZWN0W10gbyA9IHs8Q29tcGxldGVPbk5hbWU6enp6Pix9O1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotCi0KLXB1YmxpYyB2b2lkIHRlc3QwMDM4KCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB7XG4iICsgCi0JCSIgICAgT2JqZWN0W10gbyA9IHt6eno7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICJPYmplY3RbXSBvID0gezxDb21wbGV0ZU9uTmFtZTp6eno+LH0iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgICAgT2JqZWN0W10gbyA9IHs8Q29tcGxldGVPbk5hbWU6enp6Pix9O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0KLQotcHVibGljIHZvaWQgdGVzdDAwMzkoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsgCi0JCSIgICAgT2JqZWN0W10gbyA9IHt6eno7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIHtcbiIgKwotCQkiICAgICAgPENvbXBsZXRlT25OYW1lOnp6ej47XG4iICsgCi0JCSIgICAgfVxuIiArCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICJPYmplY3RbXSBvID0gezxDb21wbGV0ZU9uTmFtZTp6eno+LH0iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBPYmplY3RbXSBvID0gezxDb21wbGV0ZU9uTmFtZTp6eno+LH07XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLQotCi1wdWJsaWMgdm9pZCB0ZXN0MDA0MCgpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgI1xuIiArIAotCQkiICBPYmplY3RbXSBvID0ge3p6ejtcbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIk9iamVjdFtdIG8gPSB7PENvbXBsZXRlT25OYW1lOnp6ej4sfSI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIE9iamVjdFtdIG8gPSB7PENvbXBsZXRlT25OYW1lOnp6ej4sfTtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotCi0KLXB1YmxpYyB2b2lkIHRlc3QwMDQxKCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB7XG4iICsgCi0JCSIgICAgI1xuIiArCi0JCSIgICAgT2JqZWN0W10gbyA9IHt6eno7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICJPYmplY3RbXSBvID0gezxDb21wbGV0ZU9uTmFtZTp6eno+LH0iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgICAge1xuIiArIAotCQkiICAgICAgT2JqZWN0W10gbyA9IHs8Q29tcGxldGVPbk5hbWU6enp6Pix9O1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotCi0KLXB1YmxpYyB2b2lkIHRlc3QwMDQyKCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArIAotCQkiICAgICNcbiIgKwotCQkiICAgIE9iamVjdFtdIG8gPSB7enp6O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICB7XG4iICsKLQkJIiAgICAgIDxDb21wbGV0ZU9uTmFtZTp6eno+O1xuIiArIAotCQkiICAgIH1cbiIgKwotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiT2JqZWN0W10gbyA9IHs8Q29tcGxldGVPbk5hbWU6enp6Pix9IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgT2JqZWN0W10gbyA9IHs8Q29tcGxldGVPbk5hbWU6enp6Pix9O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDA0MygpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgT2JqZWN0W10gbyA9IG5ldyBYW3p6ejtcbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIm5ldyBYWzxDb21wbGV0ZU9uTmFtZTp6eno+XSI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIE9iamVjdFtdIG8gPSBuZXcgWFs8Q29tcGxldGVPbk5hbWU6enp6Pl07XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0KLQotCi1wdWJsaWMgdm9pZCB0ZXN0MDA0NCgpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAge1xuIiArIAotCQkiICAgIE9iamVjdFtdIG8gPSBuZXcgWFt6eno7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICJuZXcgWFs8Q29tcGxldGVPbk5hbWU6enp6Pl0iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB7XG4iICsKLQkJIiAgICBPYmplY3RbXSBvID0gbmV3IFhbPENvbXBsZXRlT25OYW1lOnp6ej5dO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0KLQotCi1wdWJsaWMgdm9pZCB0ZXN0MDA0NSgpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKyAKLQkJIiAgICBPYmplY3RbXSBvID0gbmV3IFhbenp6O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICJuZXcgWFs8Q29tcGxldGVPbk5hbWU6enp6Pl0iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBPYmplY3RbXSBvID0gbmV3IFhbPENvbXBsZXRlT25OYW1lOnp6ej5dO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7IAotfQotCi0KLQotcHVibGljIHZvaWQgdGVzdDAwNDYoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgICNcbiIgKyAKLQkJIiAgT2JqZWN0W10gbyA9IG5ldyBYW3p6ejtcbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIm5ldyBYWzxDb21wbGV0ZU9uTmFtZTp6eno+XSI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIE9iamVjdFtdIG8gPSBuZXcgWFs8Q29tcGxldGVPbk5hbWU6enp6Pl07XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLQotCi0KLXB1YmxpYyB2b2lkIHRlc3QwMDQ3KCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB7XG4iICsgCi0JCSIgICAgI1xuIiArCi0JCSIgICAgT2JqZWN0W10gbyA9IG5ldyBYW3p6ejtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIm5ldyBYWzxDb21wbGV0ZU9uTmFtZTp6eno+XSI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHtcbiIgKwotCQkiICAgIHtcbiIgKwotCQkiICAgICAgT2JqZWN0W10gbyA9IG5ldyBYWzxDb21wbGV0ZU9uTmFtZTp6eno+XTtcbiIgKyAKLQkJIiAgICB9XG4iICsKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotCi0KLQotcHVibGljIHZvaWQgdGVzdDAwNDgoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsgCi0JCSIgICAgI1xuIiArCi0JCSIgICAgT2JqZWN0W10gbyA9IG5ldyBYW3p6ejtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAibmV3IFhbPENvbXBsZXRlT25OYW1lOnp6ej5dIjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgT2JqZWN0W10gbyA9IG5ldyBYWzxDb21wbGV0ZU9uTmFtZTp6eno+XTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotcHVibGljIHZvaWQgdGVzdDAwNDkoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIE9iamVjdFtdIG8gPSBuZXcgWFtde3p6ejtcbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIm5ldyBYW117PENvbXBsZXRlT25OYW1lOnp6ej4sfSI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIE9iamVjdFtdIG8gPSBuZXcgWFtdezxDb21wbGV0ZU9uTmFtZTp6eno+LH07XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDA1MCgpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAge1xuIiArIAotCQkiICAgIE9iamVjdFtdIG8gPSBuZXcgWFtde3p6ejtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIm5ldyBYW117PENvbXBsZXRlT25OYW1lOnp6ej4sfSI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgICBPYmplY3RbXSBvID0gbmV3IFhbXXs8Q29tcGxldGVPbk5hbWU6enp6Pix9O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDA1MSgpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKyAKLQkJIiAgICBPYmplY3RbXSBvID0gbmV3IFhbXXt6eno7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIm5ldyBYW117PENvbXBsZXRlT25OYW1lOnp6ej4sfSI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIHtcbiIgKwotCQkiICAgICAgbmV3IFhbXXs8Q29tcGxldGVPbk5hbWU6enp6Pix9O1xuIiArIAotCQkiICAgIH1cbiIgKwotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAibmV3IFhbXXs8Q29tcGxldGVPbk5hbWU6enp6Pix9IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgT2JqZWN0W10gbyA9IG5ldyBYW117PENvbXBsZXRlT25OYW1lOnp6ej4sfTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3QwMDUyKCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICAjXG4iICsgCi0JCSIgIE9iamVjdFtdIG8gPSBuZXcgWFtde3p6ejtcbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIm5ldyBYW117PENvbXBsZXRlT25OYW1lOnp6ej4sfSI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIE9iamVjdFtdIG8gPSBuZXcgWFtdezxDb21wbGV0ZU9uTmFtZTp6eno+LH07XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDA1MygpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAge1xuIiArIAotCQkiICAgICNcbiIgKwotCQkiICAgIE9iamVjdFtdIG8gPSBuZXcgWFtde3p6ejtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIm5ldyBYW117PENvbXBsZXRlT25OYW1lOnp6ej4sfSI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgICB7XG4iICsgCi0JCSIgICAgICBPYmplY3RbXSBvID0gbmV3IFhbXXs8Q29tcGxldGVPbk5hbWU6enp6Pix9O1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotcHVibGljIHZvaWQgdGVzdDAwNTQoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsgCi0JCSIgICAgI1xuIiArCi0JCSIgICAgT2JqZWN0W10gbyA9IG5ldyBYW117enp6O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICJuZXcgWFtdezxDb21wbGV0ZU9uTmFtZTp6eno+LH0iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICB7XG4iICsKLQkJIiAgICAgIG5ldyBYW117PENvbXBsZXRlT25OYW1lOnp6ej4sfTtcbiIgKyAKLQkJIiAgICB9XG4iICsKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIm5ldyBYW117PENvbXBsZXRlT25OYW1lOnp6ej4sfSI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIE9iamVjdFtdIG8gPSBuZXcgWFtdezxDb21wbGV0ZU9uTmFtZTp6eno+LH07XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QwMDU1KCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBPYmplY3RbXSBvID0genp6O1xuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiT2JqZWN0W10gbyA9IDxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgT2JqZWN0W10gbyA9IDxDb21wbGV0ZU9uTmFtZTp6eno+O1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0MDA1NigpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAge1xuIiArIAotCQkiICAgIE9iamVjdFtdIG8gPSB6eno7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICJPYmplY3RbXSBvID0gPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgICAgT2JqZWN0W10gbyA9IDxDb21wbGV0ZU9uTmFtZTp6eno+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3QwMDU3KCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArIAotCQkiICAgIE9iamVjdFtdIG8gPSB6eno7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIk9iamVjdFtdIG8gPSA8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIE9iamVjdFtdIG8gPSA8Q29tcGxldGVPbk5hbWU6enp6PjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOyAKLX0KLQotcHVibGljIHZvaWQgdGVzdDAwNTgoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgICNcbiIgKyAKLQkJIiAgT2JqZWN0W10gbyA9IHp6ejtcbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIk9iamVjdFtdIG8gPSA8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIE9iamVjdFtdIG8gPSA8Q29tcGxldGVPbk5hbWU6enp6PjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0MDA1OSgpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAge1xuIiArIAotCQkiICAgICNcbiIgKwotCQkiICAgIE9iamVjdFtdIG8gPSB6eno7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICJPYmplY3RbXSBvID0gPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB7XG4iICsKLQkJIiAgICB7XG4iICsKLQkJIiAgICAgIE9iamVjdFtdIG8gPSA8Q29tcGxldGVPbk5hbWU6enp6PjtcbiIgKyAKLQkJIiAgICB9XG4iICsKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0MDA2MCgpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKyAKLQkJIiAgICAjXG4iICsKLQkJIiAgICBPYmplY3RbXSBvID0genp6O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICJPYmplY3RbXSBvID0gPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBPYmplY3RbXSBvID0gPENvbXBsZXRlT25OYW1lOnp6ej47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QwMDYxKCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBPYmplY3QgbyA9IG5ldyBYW3p6ejtcbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIm5ldyBYWzxDb21wbGV0ZU9uTmFtZTp6eno+XSI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIE9iamVjdCBvID0gbmV3IFhbPENvbXBsZXRlT25OYW1lOnp6ej5dO1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0MDA2MigpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAge1xuIiArIAotCQkiICAgIE9iamVjdCBvID0gbmV3IFhbenp6O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAibmV3IFhbPENvbXBsZXRlT25OYW1lOnp6ej5dIjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAge1xuIiArIAotCQkiICAgIE9iamVjdCBvID0gbmV3IFhbPENvbXBsZXRlT25OYW1lOnp6ej5dO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3QwMDYzKCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArIAotCQkiICAgIE9iamVjdCBvID0gbmV3IFhbenp6O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICJuZXcgWFs8Q29tcGxldGVPbk5hbWU6enp6Pl0iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBPYmplY3QgbyA9IG5ldyBYWzxDb21wbGV0ZU9uTmFtZTp6eno+XTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOyAKLX0KLQotcHVibGljIHZvaWQgdGVzdDAwNjQoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgICNcbiIgKyAKLQkJIiAgT2JqZWN0IG8gPSBuZXcgWFt6eno7XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICJuZXcgWFs8Q29tcGxldGVPbk5hbWU6enp6Pl0iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBPYmplY3QgbyA9IG5ldyBYWzxDb21wbGV0ZU9uTmFtZTp6eno+XTtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0MDA2NSgpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAge1xuIiArIAotCQkiICAgICNcbiIgKwotCQkiICAgIE9iamVjdCBvID0gbmV3IFhbenp6O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAibmV3IFhbPENvbXBsZXRlT25OYW1lOnp6ej5dIjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAge1xuIiArIAotCQkiICAgIHtcbiIgKyAKLQkJIiAgICAgIE9iamVjdCBvID0gbmV3IFhbPENvbXBsZXRlT25OYW1lOnp6ej5dO1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0MDA2NigpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKyAKLQkJIiAgICAjXG4iICsKLQkJIiAgICBPYmplY3QgbyA9IG5ldyBYW3p6ejtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAibmV3IFhbPENvbXBsZXRlT25OYW1lOnp6ej5dIjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgT2JqZWN0IG8gPSBuZXcgWFs8Q29tcGxldGVPbk5hbWU6enp6Pl07XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QwMDY3KCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBPYmplY3QgbyA9IG5ldyBYW117enp6O1xuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIE9iamVjdCBvO1xuIiArCi0JCSIgIHtcbiIgKwotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIE9iamVjdCBvO1xuIiArCi0JCSIgIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTp6eno+O1xuIiArCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0MDA2OCgpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAge1xuIiArIAotCQkiICAgIE9iamVjdCBvID0gbmV3IFhbXXt6eno7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICJuZXcgWFtdezxDb21wbGV0ZU9uTmFtZTp6eno+LH0iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgICAgT2JqZWN0IG8gPSBuZXcgWFtdezxDb21wbGV0ZU9uTmFtZTp6eno+LH07XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QwMDY5KCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArIAotCQkiICAgIE9iamVjdCBvID0gbmV3IFhbXXt6eno7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIm5ldyBYW117PENvbXBsZXRlT25OYW1lOnp6ej4sfSI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIHtcbiIgKwotCQkiICAgICAgbmV3IFhbXXs8Q29tcGxldGVPbk5hbWU6enp6Pix9O1xuIiArIAotCQkiICAgIH1cbiIgKwotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAibmV3IFhbXXs8Q29tcGxldGVPbk5hbWU6enp6Pix9IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgT2JqZWN0IG8gPSBuZXcgWFtdezxDb21wbGV0ZU9uTmFtZTp6eno+LH07XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsgCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3QwMDcwKCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICAjXG4iICsgCi0JCSIgIE9iamVjdCBvID0gbmV3IFhbXXt6eno7XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgT2JqZWN0IG87XG4iICsKLQkJIiAge1xuIiArCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBPYmplY3QgbztcbiIgKwotCQkiICB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6enp6PjtcbiIgKwotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3QwMDcxKCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB7XG4iICsgCi0JCSIgICAgI1xuIiArCi0JCSIgICAgT2JqZWN0IG8gPSBuZXcgWFtde3p6ejtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgICB7XG4iICsgCi0JCSIgICAgICBPYmplY3QgbztcbiIgKwotCQkiICAgICAge1xuIiArCi0JCSIgICAgICAgIDxDb21wbGV0ZU9uTmFtZTp6eno+O1xuIiArCi0JCSIgICAgICB9XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3QwMDcyKCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArIAotCQkiICAgICNcbiIgKwotCQkiICAgIE9iamVjdCBvID0gbmV3IFhbXXt6eno7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIm5ldyBYW117PENvbXBsZXRlT25OYW1lOnp6ej4sfSI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIHtcbiIgKwotCQkiICAgICAgbmV3IFhbXXs8Q29tcGxldGVPbk5hbWU6enp6Pix9O1xuIiArIAotCQkiICAgIH1cbiIgKwotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIE9iamVjdCBvO1xuIiArCi0JCSIgICAge1xuIiArCi0JCSIgICAgICA8Q29tcGxldGVPbk5hbWU6enp6PjtcbiIgKwotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotcHVibGljIHZvaWQgdGVzdDAwNzMoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIGludCBvID0gbmV3IGludFt6eno7XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICJuZXcgaW50WzxDb21wbGV0ZU9uTmFtZTp6eno+XSI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIGludCBvID0gbmV3IGludFs8Q29tcGxldGVPbk5hbWU6enp6Pl07XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0KLQotcHVibGljIHZvaWQgdGVzdDAwNzQoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHtcbiIgKyAKLQkJIiAgICBpbnQgbyA9IG5ldyBpbnRbenp6O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAibmV3IGludFs8Q29tcGxldGVPbk5hbWU6enp6Pl0iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgICAgaW50IG8gPSBuZXcgaW50WzxDb21wbGV0ZU9uTmFtZTp6eno+XTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotCi0KLXB1YmxpYyB2b2lkIHRlc3QwMDc1KCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArIAotCQkiICAgIGludCBvID0gbmV3IGludFt6eno7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIm5ldyBpbnRbPENvbXBsZXRlT25OYW1lOnp6ej5dIjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgaW50IG8gPSBuZXcgaW50WzxDb21wbGV0ZU9uTmFtZTp6eno+XTtcbiIgKyAgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsgCi19Ci0KLQotcHVibGljIHZvaWQgdGVzdDAwNzYoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgICNcbiIgKyAKLQkJIiAgaW50IG8gPSBuZXcgaW50W3p6ejtcbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIm5ldyBpbnRbPENvbXBsZXRlT25OYW1lOnp6ej5dIjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgaW50IG8gPSBuZXcgaW50WzxDb21wbGV0ZU9uTmFtZTp6eno+XTtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLQotCi1wdWJsaWMgdm9pZCB0ZXN0MDA3NygpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAge1xuIiArIAotCQkiICAgICNcbiIgKwotCQkiICAgIGludCBvID0gbmV3IGludFt6eno7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICJuZXcgaW50WzxDb21wbGV0ZU9uTmFtZTp6eno+XSI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgICB7XG4iICsgCi0JCSIgICAgICBpbnQgbyA9IG5ldyBpbnRbPENvbXBsZXRlT25OYW1lOnp6ej5dO1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotCi0KLXB1YmxpYyB2b2lkIHRlc3QwMDc4KCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArIAotCQkiICAgICNcbiIgKwotCQkiICAgIGludCBvID0gbmV3IGludFt6eno7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIm5ldyBpbnRbPENvbXBsZXRlT25OYW1lOnp6ej5dIjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgaW50IG8gPSBuZXcgaW50WzxDb21wbGV0ZU9uTmFtZTp6eno+XTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0MDA3OSgpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgaW50IG8gPSBuZXcgaW50W117enp6O1xuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIGludCBvO1xuIiArCi0JCSIgIHtcbiIgKwotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIGludCBvO1xuIiArCi0JCSIgIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTp6eno+O1xuIiArCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0KLQotcHVibGljIHZvaWQgdGVzdDAwODAoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHtcbiIgKyAKLQkJIiAgICBpbnQgbyA9IG5ldyBpbnRbXXt6eno7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICJuZXcgaW50W117PENvbXBsZXRlT25OYW1lOnp6ej4sfSI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgICBpbnQgbyA9IG5ldyBpbnRbXXs8Q29tcGxldGVPbk5hbWU6enp6Pix9O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0KLQotcHVibGljIHZvaWQgdGVzdDAwODEoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsgCi0JCSIgICAgaW50IG8gPSBuZXcgaW50W117enp6O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICJuZXcgaW50W117PENvbXBsZXRlT25OYW1lOnp6ej4sfSI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArICAKLQkJIiAgICB7XG4iICsKLQkJIiAgICAgIG5ldyBpbnRbXXs8Q29tcGxldGVPbk5hbWU6enp6Pix9O1xuIiArIAotCQkiICAgIH1cbiIgKwotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAibmV3IGludFtdezxDb21wbGV0ZU9uTmFtZTp6eno+LH0iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBpbnQgbyA9IG5ldyBpbnRbXXs8Q29tcGxldGVPbk5hbWU6enp6Pix9O1xuIiArICAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOyAKLX0KLQotCi1wdWJsaWMgdm9pZCB0ZXN0MDA4MigpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgI1xuIiArIAotCQkiICBpbnQgbyA9IG5ldyBpbnRbXXt6eno7XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgaW50IG87XG4iICsKLQkJIiAge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIGludCBvO1xuIiArCi0JCSIgIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTp6eno+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotCi0KLXB1YmxpYyB2b2lkIHRlc3QwMDgzKCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB7XG4iICsgCi0JCSIgICAgI1xuIiArCi0JCSIgICAgaW50IG8gPSBuZXcgaW50W117enp6O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgICB7XG4iICsgCi0JCSIgICAgICBpbnQgbztcbiIgKwotCQkiICAgICAge1xuIiArCi0JCSIgICAgICAgIDxDb21wbGV0ZU9uTmFtZTp6eno+O1xuIiArCi0JCSIgICAgICB9XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDA4NCgpewotCi0KLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsgCi0JCSIgICAgI1xuIiArCi0JCSIgICAgaW50IG8gPSBuZXcgaW50W117enp6O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICJuZXcgaW50W117PENvbXBsZXRlT25OYW1lOnp6ej4sfSI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIHtcbiIgKwotCQkiICAgICAgbmV3IGludFtdezxDb21wbGV0ZU9uTmFtZTp6eno+LH07XG4iICsgCi0JCSIgICAgfVxuIiArCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBpbnQgbztcbiIgKwotCQkiICAgIHtcbiIgKwotCQkiICAgICAgPENvbXBsZXRlT25OYW1lOnp6ej47XG4iICsKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QwMDg1KCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBYIG8gPSBuZXcgWFtde3p6ejtcbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBYIG87XG4iICsKLQkJIiAge1xuIiArCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBYIG87XG4iICsKLQkJIiAge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOnp6ej47XG4iICsKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotCi0KLXB1YmxpYyB2b2lkIHRlc3QwMDg2KCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB7XG4iICsgCi0JCSIgICAgWCBvID0gbmV3IFhbXXt6eno7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICJuZXcgWFtdezxDb21wbGV0ZU9uTmFtZTp6eno+LH0iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgICAgWCBvID0gbmV3IFhbXXs8Q29tcGxldGVPbk5hbWU6enp6Pix9O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3QwMDg3KCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArIAotCQkiICAgIFggbyA9IG5ldyBYW117enp6O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICJuZXcgWFtdezxDb21wbGV0ZU9uTmFtZTp6eno+LH0iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICB7XG4iICsKLQkJIiAgICAgIG5ldyBYW117PENvbXBsZXRlT25OYW1lOnp6ej4sfTtcbiIgKyAKLQkJIiAgICB9XG4iICsKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIm5ldyBYW117PENvbXBsZXRlT25OYW1lOnp6ej4sfSI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIFggbyA9IG5ldyBYW117PENvbXBsZXRlT25OYW1lOnp6ej4sfTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOyAKLX0KLQotCi1wdWJsaWMgdm9pZCB0ZXN0MDA4OCgpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgI1xuIiArIAotCQkiICBYIG8gPSBuZXcgWFtde3p6ejtcbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBYIG87XG4iICsKLQkJIiAge1xuIiArCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBYIG87XG4iICsKLQkJIiAge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOnp6ej47XG4iICsKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotCi0KLXB1YmxpYyB2b2lkIHRlc3QwMDg5KCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB7XG4iICsgCi0JCSIgICAgI1xuIiArCi0JCSIgICAgWCBvID0gbmV3IFhbXXt6eno7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgICAge1xuIiArIAotCQkiICAgICAgWCBvO1xuIiArCi0JCSIgICAgICB7XG4iICsKLQkJIiAgICAgICAgPENvbXBsZXRlT25OYW1lOnp6ej47XG4iICsKLQkJIiAgICAgIH1cbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLQotCi1wdWJsaWMgdm9pZCB0ZXN0MDA5MCgpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKyAKLQkJIiAgICAjXG4iICsKLQkJIiAgICBYIG8gPSBuZXcgWFtde3p6ejtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAibmV3IFhbXXs8Q29tcGxldGVPbk5hbWU6enp6Pix9IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAge1xuIiArCi0JCSIgICAgICBuZXcgWFtdezxDb21wbGV0ZU9uTmFtZTp6eno+LH07XG4iICsgCi0JCSIgICAgfVxuIiArCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBYIG87XG4iICsKLQkJIiAgICB7XG4iICsKLQkJIiAgICAgIDxDb21wbGV0ZU9uTmFtZTp6eno+O1xuIiArCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDA5MSgpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgT2JqZWN0IG8gPSBcInl5eTtcbiIgKyAKLQkJIiAgenp6XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOnp6ej4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBPYmplY3QgbztcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6enp6PjtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0KLQotcHVibGljIHZvaWQgdGVzdDAwOTIoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHtcbiIgKyAKLQkJIiAgICBPYmplY3QgbyA9IFwieXl5O1xuIiArIAotCQkiICAgIHp6elxuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAge1xuIiArIAotCQkiICAgIE9iamVjdCBvO1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOnp6ej47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsgCi19Ci0KLQotcHVibGljIHZvaWQgdGVzdDAwOTMoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsgCi0JCSIgICAgT2JqZWN0IG8gPSBcInl5eTtcbiIgKyAKLQkJIiAgICB6enpcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgT2JqZWN0IG87XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6enp6PjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOyAKLX0KLQotCi1wdWJsaWMgdm9pZCB0ZXN0MDA5NCgpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgI1xuIiArIAotCQkiICBPYmplY3QgbyA9IFwieXl5O1xuIiArIAotCQkiICB6enpcbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6enp6PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIE9iamVjdCBvO1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTp6eno+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7IAotfQotCi0KLXB1YmxpYyB2b2lkIHRlc3QwMDk1KCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB7XG4iICsgCi0JCSIgICAgI1xuIiArCi0JCSIgICAgT2JqZWN0IG8gPSBcInl5eTtcbiIgKyAKLQkJIiAgICB6enpcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgICB7XG4iICsgCi0JCSIgICAgICBPYmplY3QgbztcbiIgKwotCQkiICAgICAgPENvbXBsZXRlT25OYW1lOnp6ej47XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7IAotfQotCi0KLXB1YmxpYyB2b2lkIHRlc3QwMDk2KCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB7XG4iICsgCi0JCSIgICAgI1xuIiArCi0JCSIgICAgT2JqZWN0IG8gPSBcInl5eTtcbiIgKyAKLQkJIiAgICB6enpcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgfVxuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgIAotCQkifVxuIjsKLQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgICB7XG4iICsKLQkJIiAgICAgIE9iamVjdCBvO1xuIiArCi0JCSIgICAgICA8Q29tcGxldGVPbk5hbWU6enp6PjtcbiIgKyAKLQkJIiAgICB9XG4iICsKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3QwMDk3KCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArIAotCQkiICAgIE9iamVjdCBvO1xuIiArCi0JCSIgICAgbyA9IHp6ejtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAibyA9IDxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgT2JqZWN0IG87XG4iICsKLQkJIiAgICBvID0gPENvbXBsZXRlT25OYW1lOnp6ej47XG4iICsKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0MDA5OCgpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKyAKLQkJIiAgICBPYmplY3QgbztcbiIgKwotCQkiICAgIG8gPSB6eno7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIm8gPSA8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIE9iamVjdCBvO1xuIiArCi0JCSIgICAgbyA9IDxDb21wbGV0ZU9uTmFtZTp6eno+O1xuIiArCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QwMDk5KCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArIAotCQkiICAgIE9iamVjdCBvO1xuIiArCi0JCSIgICAgbyA9IG5ldyB6eno7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIm8gPSBuZXcgPENvbXBsZXRlT25UeXBlOnp6ej4oKSI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIE9iamVjdCBvO1xuIiArCi0JCSIgICAgbyA9IG5ldyA8Q29tcGxldGVPblR5cGU6enp6PigpO1xuIiArCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdDAxMDAoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsgCi0JCSIgICAgT2JqZWN0IG87XG4iICsKLQkJIiAgICBvID0gbmV3IHp6ejtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6enp6PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAibyA9IG5ldyA8Q29tcGxldGVPblR5cGU6enp6PigpIjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgT2JqZWN0IG87XG4iICsKLQkJIiAgICBvID0gbmV3IDxDb21wbGV0ZU9uVHlwZTp6eno+KCk7XG4iICsKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotcHVibGljIHZvaWQgdGVzdDAxMDEoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsgCi0JCSIgICAgT2JqZWN0IG87XG4iICsKLQkJIiAgICBvID0geXl5O1xuIiArCi0JCSIgICAgenp6XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIE9iamVjdCBvO1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOnp6ej47XG4iICsKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0MDEwMigpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKyAKLQkJIiAgICBPYmplY3QgbztcbiIgKwotCQkiICAgIG8gPSB5eXk7XG4iICsKLQkJIiAgICB6enpcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgT2JqZWN0IG87XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6enp6PjtcbiIgKwotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDEwMygpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKyAKLQkJIiAgICBPYmplY3QgbztcbiIgKwotCQkiICAgIG8gPSBcInl5eTtcbiIgKwotCQkiICAgIHp6elxuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBPYmplY3QgbztcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTp6eno+O1xuIiArCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdDAxMDQoKXsKLQlTdHJpbmcgc3RyID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsgCi0JCSIgICAgT2JqZWN0IG87XG4iICsKLQkJIiAgICBvID0gXCJ5eXk7XG4iICsKLQkJIiAgICB6enpcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgT2JqZWN0IG87XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6enp6PjtcbiIgKwotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3QwMTA1KCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArIAotCQkiICAgIGludCB4ID0gMSArIHp6elxuIiArCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIigxICsgPENvbXBsZXRlT25OYW1lOnp6ej4pIjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgaW50IHggPSAoMSArIDxDb21wbGV0ZU9uTmFtZTp6eno+KTtcbiIgKwotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDEwNigpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKyAKLQkJIiAgICBpbnQgeCA9IDEgKyAoenp6XG4iICsKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiKDEgKyA8Q29tcGxldGVPbk5hbWU6enp6PikiOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBpbnQgeCA9ICgxICsgPENvbXBsZXRlT25OYW1lOnp6ej4pO1xuIiArCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QwMTA3KCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArIAotCQkiICAgIGludCB4ID0gMDtcbiIgKwotCQkiICAgIGludCB5ID0gMSArIHg7XG4iICsKLQkJIiAgICB6eno7XG4iICsKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgaW50IHg7XG4iICsKLQkJIiAgICBpbnQgeTtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTp6eno+O1xuIiArCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QwMTA4KCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArIAotCQkiICAgIGludCB4ID0gLXp6ejtcbiIgKwotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICIoLSA8Q29tcGxldGVPbk5hbWU6enp6PikiOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBpbnQgeCA9ICgtIDxDb21wbGV0ZU9uTmFtZTp6eno+KTtcbiIgKwotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDEwOSgpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKyAKLQkJIiAgICBpbnQgeCA9IC0oenp6O1xuIiArCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIigtIDxDb21wbGV0ZU9uTmFtZTp6eno+KSI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIGludCB4ID0gKC0gPENvbXBsZXRlT25OYW1lOnp6ej4pO1xuIiArCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QwMTEwKCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArIAotCQkiICAgIGludCB4ID0gMDtcbiIgKwotCQkiICAgIGludCB5ID0gLXg7XG4iICsKLQkJIiAgICB6eno7XG4iICsKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgaW50IHg7XG4iICsKLQkJIiAgICBpbnQgeTtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTp6eno+O1xuIiArCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QwMTExKCl7Ci0JU3RyaW5nIHN0ciA9IAotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArIAotCQkiICAgIGlmKDEgPT0genp6KSB7fVxuIiArCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIigxID09IDxDb21wbGV0ZU9uTmFtZTp6eno+KSI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgICgxID09IDxDb21wbGV0ZU9uTmFtZTp6eno+KTtcbiIgKwotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDExMigpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKyAKLQkJIiAgICBpZigxID09ICh6enopKSB7fVxuIiArCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIigxID09IDxDb21wbGV0ZU9uTmFtZTp6eno+KSI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgICgxID09IDxDb21wbGV0ZU9uTmFtZTp6eno+KTtcbiIgKwotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDExMygpewotCVN0cmluZyBzdHIgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oT2JqZWN0IHgpe1xuIiArIAotCQkiICAgIGlmKHggaW5zdGFuY2VvZiBaWlopIHt9XG4iICsKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJaWloiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJaWloiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKE9iamVjdCB4KSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpaWlo+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICIoeCBpbnN0YW5jZW9mIDxDb21wbGV0ZU9uVHlwZTpaWlo+KSI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAiWlpaIjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIlpaWiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKE9iamVjdCB4KSB7XG4iICsgCi0JCSIgICAgKHggaW5zdGFuY2VvZiA8Q29tcGxldGVPblR5cGU6WlpaPik7XG4iICsKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotcHVibGljIHZvaWQgdGVzdDAxMTQoKXsKLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICBib29sZWFuIGEsIGIsIGM7XG4iICsKLQkJIiAgICBjID0gYSA9PSBiID8genp6XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiYyA9IDxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIGJvb2xlYW4gYTtcbiIgKwotCQkiICAgIGJvb2xlYW4gYjtcbiIgKwotCQkiICAgIGJvb2xlYW4gYztcbiIgKwotCQkiICAgIGMgPSA8Q29tcGxldGVPbk5hbWU6enp6PjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QwMTE1KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArCi0JCSIgICAgYm9vbGVhbiBhLCBiO1xuIiArCi0JCSIgICAgYSA9PSBiID8genp6XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIGJvb2xlYW4gYTtcbiIgKwotCQkiICAgIGJvb2xlYW4gYjtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTp6eno+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotcHVibGljIHZvaWQgdGVzdDAxMTYoKXsKLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICBib29sZWFuIGEsIGIsIGM7XG4iICsKLQkJIiAgICBjID0gYSA9PSBiID8gYSA6IHp6elxuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0KLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gImMgPSAoKGEgPT0gYikgPyBhIDogPENvbXBsZXRlT25OYW1lOnp6ej4pIjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIGJvb2xlYW4gYTtcbiIgKwotCQkiICAgIGJvb2xlYW4gYjtcbiIgKwotCQkiICAgIGJvb2xlYW4gYztcbiIgKwotCQkiICAgIGMgPSAoKGEgPT0gYikgPyBhIDogPENvbXBsZXRlT25OYW1lOnp6ej4pO1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotcHVibGljIHZvaWQgdGVzdDAxMTcoKXsKLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICBib29sZWFuIGEsIGIsIGM7XG4iICsKLQkJIiAgICBjID0gYSA9PSBiID8gYSA6ICh6enpcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICJjID0gPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgYm9vbGVhbiBhO1xuIiArCi0JCSIgICAgYm9vbGVhbiBiO1xuIiArCi0JCSIgICAgYm9vbGVhbiBjO1xuIiArCi0JCSIgICAgYyA9IDxDb21wbGV0ZU9uTmFtZTp6eno+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotcHVibGljIHZvaWQgdGVzdDAxMTgoKXsKLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICBib29sZWFuIGEsIGIsIGM7XG4iICsKLQkJIiAgICBjID0gYSMgPT0gYiA/IGEgOiB6enpcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgYm9vbGVhbiBhO1xuIiArCi0JCSIgICAgYm9vbGVhbiBiO1xuIiArCi0JCSIgICAgYm9vbGVhbiBjO1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOnp6ej47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDExOSgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICBzd2l0Y2goMSkge1xuIiArCi0JCSIgICAgICBjYXNlIHp6elxuIiArCi0JCSIgICAgfVxuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIHtcbiIgKwotCQkiICAgICAgPENvbXBsZXRlT25OYW1lOnp6ej47XG4iICsKLQkJIiAgICB9XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDEyMCgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICBzd2l0Y2goMSkge1xuIiArCi0JCSIgICAgICBjYXNlIFNvbWV0aGluZyA6XG4iICsKLQkJIiAgICAgIGNhc2Ugenp6XG4iICsKLQkJIiAgICB9XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0KLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAge1xuIiArCi0JCSIgICAgICA8Q29tcGxldGVPbk5hbWU6enp6PjtcbiIgKwotCQkiICAgIH1cbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QwMTIxKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKwotCQkiICAgIHRhYlt6enpdXG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0KLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gInRhYls8Q29tcGxldGVPbk5hbWU6enp6Pl0iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIHRhYls8Q29tcGxldGVPbk5hbWU6enp6Pl07XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDEyMigpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICB0YWJbXS56enpcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbkNsYXNzTGl0ZXJhbEFjY2Vzczp0YWJbXS56eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ0YWJbXS56enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uQ2xhc3NMaXRlcmFsQWNjZXNzOnRhYltdLnp6ej47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDEyMygpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICB0YWJbMF0uenp6XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0KLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6dGFiWzBdLnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6dGFiWzBdLnp6ej47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDEyNCgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICBmb28oKVt6enpdXG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0KLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gImZvbygpWzxDb21wbGV0ZU9uTmFtZTp6eno+XSI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgZm9vKClbPENvbXBsZXRlT25OYW1lOnp6ej5dO1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotcHVibGljIHZvaWQgdGVzdDAxMjUoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArCi0JCSIgICAgZm9vKClbXS56enpcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigienp6IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6enp6PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6enp6PjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QwMTI2KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKwotCQkiICAgIGZvbygpWzFdLnp6elxuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZvbygpWzFdLnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAienp6IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInp6eiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6Zm9vKClbMV0uenp6PjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QwMTI3KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKwotCQkiICAgIGlmICh6enooKSA9PSBudWxsKSBiYXIgPSBudWxsO1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICBPYmplY3QgbyA9IG5ldyBPKCk7XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiTyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJPIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpPPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIk9iamVjdCBvID0gbmV3IDxDb21wbGV0ZU9uVHlwZTpPPigpIjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiTyI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiTyI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIE9iamVjdCBvID0gbmV3IDxDb21wbGV0ZU9uVHlwZTpPPigpO1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDEyOCgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICBuZXcgT2JqZWN0KCkge1xuIiArCi0JCSIgICAgICB2b2lkIGJhcigpIHtcbiIgKwotCQkiICAgICAgICBhW3p6elxuIiArCi0JCSIgICAgICB9XG4iICsKLQkJIiAgICB9XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoInp6eiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0KLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnp6ej4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gImFbPENvbXBsZXRlT25OYW1lOnp6ej5dIjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ6enoiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAienp6IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICBuZXcgT2JqZWN0KCkge1xuIiArCi0JCSIgICAgICAoKSB7XG4iICsKLQkJIiAgICAgIH1cbiIgKwotCQkiICAgICAgdm9pZCBiYXIoKSB7XG4iICsKLQkJIiAgICAgICAgYVs8Q29tcGxldGVPbk5hbWU6enp6Pl07XG4iICsKLQkJIiAgICAgIH1cbiIgKwotCQkiICAgIH07XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDEyOSgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICBPYmplY3QgbG9jYWw7XG4iICsKLQkJIiAgICBkb3VibGUgYmFyO1xuIiArCi0JCSIgICAgZm9yKDs7KSB7XG4iICsKLQkJIiAgICAgIGJhciA9IChkb3VibGUpMDtcbiIgKwotCQkiICAgIH1cbiIgKwotCQkiICAgIHp6elxuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6enoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJ6enoiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp6eno+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInp6eiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ6enoiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIE9iamVjdCBsb2NhbDtcbiIgKwotCQkiICAgIGRvdWJsZSBiYXI7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6enp6PjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvQ29tcGxldGlvblBhcnNlclRlc3RLZXl3b3JkLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL0NvbXBsZXRpb25QYXJzZXJUZXN0S2V5d29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWZmZmQyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvQ29tcGxldGlvblBhcnNlclRlc3RLZXl3b3JkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyLnBhcnNlcjsKLQotcHVibGljIGNsYXNzIENvbXBsZXRpb25QYXJzZXJUZXN0S2V5d29yZCBleHRlbmRzIEFic3RyYWN0Q29tcGxldGlvblRlc3QgewotcHVibGljIENvbXBsZXRpb25QYXJzZXJUZXN0S2V5d29yZChTdHJpbmcgdGVzdE5hbWUpIHsKLQlzdXBlcih0ZXN0TmFtZSk7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2Fic3RyYWN0JyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDAwMSgpewotCVN0cmluZyBzdHIgPQotCQkiYWJzdCI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYWJzdCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoImFic3QiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmFic3Q+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiYWJzdCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiYWJzdCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiaW1wb3J0IDxDb21wbGV0ZU9uS2V5d29yZDphYnN0PjtcbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2Fic3RyYWN0JyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDAwMigpewotCVN0cmluZyBzdHIgPQotCQkiYWJzdCB6enoiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImFic3QiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJhYnN0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDphYnN0PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJImltcG9ydCA8Q29tcGxldGVPbktleXdvcmQ6YWJzdD47XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdhYnN0cmFjdCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwMDMoKXsKLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkiYWJzdCI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYWJzdCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoImFic3QiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmFic3Q+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiYWJzdCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiYWJzdCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJpbXBvcnQgPENvbXBsZXRlT25LZXl3b3JkOmFic3Q+O1xuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnYWJzdHJhY3QnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDA0KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJImFic3Qgenp6IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJhYnN0IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigiYWJzdCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbktleXdvcmQ6YWJzdD4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJhYnN0IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJhYnN0IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJImltcG9ydCA8Q29tcGxldGVPbktleXdvcmQ6YWJzdD47XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdhYnN0cmFjdCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwMDUoKXsKLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkiaW1wb3J0IHl5eTtcbiIgKwotCQkiYWJzdCI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYWJzdCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoImFic3QiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmFic3Q+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiYWJzdCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiYWJzdCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJpbXBvcnQgeXl5O1xuIiArCi0JCSJpbXBvcnQgPENvbXBsZXRlT25LZXl3b3JkOmFic3Q+O1xuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnYWJzdHJhY3QnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDA2KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJImltcG9ydCB5eXk7XG4iICsKLQkJImFic3Qgenp6IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJhYnN0IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigiYWJzdCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbktleXdvcmQ6YWJzdD4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJhYnN0IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJhYnN0IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJImltcG9ydCB5eXk7XG4iICsKLQkJImltcG9ydCA8Q29tcGxldGVPbktleXdvcmQ6YWJzdD47XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdhYnN0cmFjdCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwMDcoKXsKLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkiaW1wb3J0IHl5eTtcbiIgKwotCQkicHVibGljIGFic3QiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImFic3QiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJhYnN0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDphYnN0PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkiaW1wb3J0IHl5eTtcbiIgKwotCQkiaW1wb3J0IDxDb21wbGV0ZU9uS2V5d29yZDphYnN0PjtcbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2Fic3RyYWN0JyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDAwOCgpewotCVN0cmluZyBzdHIgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJpbXBvcnQgeXl5O1xuIiArCi0JCSJwdWJsaWMgYWJzdCB6enoiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImFic3QiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJhYnN0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDphYnN0PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkiaW1wb3J0IHl5eTtcbiIgKwotCQkiaW1wb3J0IDxDb21wbGV0ZU9uS2V5d29yZDphYnN0PjtcbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2Fic3RyYWN0JyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDAwOSgpewotCVN0cmluZyBzdHIgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJpbXBvcnQgeXl5O1xuIiArCi0JCSJhYnN0cmFjdCBhYnN0IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJhYnN0IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImFic3QiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiYWJzdCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiYWJzdCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJpbXBvcnQgeXl5O1xuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnYWJzdHJhY3QnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDEwKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJImltcG9ydCB5eXk7XG4iICsKLQkJImFic3RyYWN0IGFic3Qgenp6IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJhYnN0IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImFic3QiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiYWJzdCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiYWJzdCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJpbXBvcnQgeXl5O1xuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnYWJzdHJhY3QnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDExKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJImltcG9ydCBcbiIgKwotCQkiYWJzdCI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYWJzdCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJhYnN0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uSW1wb3J0OmFic3Q+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiYWJzdCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiYWJzdCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJpbXBvcnQgPENvbXBsZXRlT25JbXBvcnQ6YWJzdD47XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdhYnN0cmFjdCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwMTIoKXsKLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkiaW1wb3J0IHl5eTtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge31cbiIgKwotCQkiYWJzdCI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYWJzdCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJhYnN0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDphYnN0PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkiaW1wb3J0IHl5eTtcbiIgKwotCQkiaW1wb3J0IDxDb21wbGV0ZU9uS2V5d29yZDphYnN0PjtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnYWJzdHJhY3QnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDEzKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJImltcG9ydCB5eXk7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHt9XG4iICsKLQkJImFic3Qgenp6IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJhYnN0IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImFic3QiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmFic3Q+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiYWJzdCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiYWJzdCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJpbXBvcnQgeXl5O1xuIiArCi0JCSJpbXBvcnQgPENvbXBsZXRlT25LZXl3b3JkOmFic3Q+O1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdhYnN0cmFjdCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwMTQoKXsKLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkiaW1wb3J0IHl5eTtcbiIgKwotCQkiZmluYWwgYWJzdCI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYWJzdCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJhYnN0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkiaW1wb3J0IHl5eTtcbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2Fic3RyYWN0JyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDAxNSgpewotCVN0cmluZyBzdHIgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgYWJzdFxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImFic3QiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiYWJzdCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6YWJzdD4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJhYnN0IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJhYnN0IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6YWJzdD47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdhYnN0cmFjdCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwMTYoKXsKLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIGFic3Qgenp6XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYWJzdCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJhYnN0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTphYnN0PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTphYnN0PjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2Fic3RyYWN0JyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDAxNygpewotCVN0cmluZyBzdHIgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIGFic3Qgenp6XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYWJzdCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJhYnN0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTphYnN0PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTphYnN0PjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2Fic3RyYWN0JyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDAxOCgpewotCVN0cmluZyBzdHIgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgZmluYWwgYWJzdFxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImFic3QiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiYWJzdCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6YWJzdD4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJhYnN0IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJhYnN0IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6YWJzdD47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdhYnN0cmFjdCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwMTkoKXsKLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIGFic3RyYWN0IGFic3RcbiIgKwotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJhYnN0IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImFic3QiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOmFic3Q+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiYWJzdCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiYWJzdCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOmFic3Q+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnYWJzdHJhY3QnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDIwKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBzdGF0aWMgYWJzdFxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImFic3QiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiYWJzdCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6YWJzdD4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJhYnN0IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJhYnN0IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6YWJzdD47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnYWJzdHJhY3QnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDIxKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArCi0JCSIgICAgYWJzdFxuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJhYnN0IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImFic3QiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTphYnN0PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJhYnN0IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImFic3QiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmFic3Q+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdhYnN0cmFjdCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwMjIoKXsKLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICBhYnN0IHp6elxuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJhYnN0IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImFic3QiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTphYnN0PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJhYnN0IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImFic3QiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmFic3Q+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdicmVhaycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwMjMoKXsKLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICBicmVcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYnJlIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImJyZSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmJyZT4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAiYnJlIjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImJyZSI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6YnJlPjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnYnJlYWsnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDI0KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArCi0JCSIgICAgZm9yKGludCBpOyBpIDwgMTA7IGkrKykge1xuIiArCi0JCSIgICAgICBicmVcbiIgKwotCQkiICAgIH1cbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYnJlIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImJyZSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmJyZT4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAiYnJlIjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImJyZSI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICBpbnQgaTtcbiIgKwotCQkiICAgIHtcbiIgKwotCQkiICAgICAgPENvbXBsZXRlT25OYW1lOmJyZT47XG4iICsKLQkJIiAgICB9XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2Nhc2UnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDI1KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArCi0JCSIgICAgY2FzXG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNhcyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJjYXMiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpjYXM+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gImNhcyI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJjYXMiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmNhcz47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2Nhc2UnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDI2KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArCi0JCSIgICAgc3dpdGNoKDApIHtcbiIgKwotCQkiICAgICAgY2FzXG4iICsKLQkJIiAgICB9XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNhcyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJjYXMiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDpjYXM+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gImNhcyI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJjYXMiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25LZXl3b3JkOmNhcz47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2NhdGNoJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDAyNygpewotCVN0cmluZyBzdHIgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKwotCQkiICAgICBjYXRcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2F0IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImNhdCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmNhdD4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAiY2F0IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImNhdCI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6Y2F0PjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnY2F0Y2gnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDI4KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArCi0JCSIgICAgdHJ5IHtcbiIgKwotCQkiICAgIH0gY2F0XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNhdCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJjYXQiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDpjYXQ+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gImNhdCI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJjYXQiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25LZXl3b3JkOmNhdD47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2NsYXNzJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDAyOSgpewotCVN0cmluZyBzdHIgPQotCQkiY2xhIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJjbGEiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiY2xhIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDpjbGE+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiY2xhIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJjbGEiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJImltcG9ydCA8Q29tcGxldGVPbktleXdvcmQ6Y2xhPjtcbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2NsYXNzJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDAzMCgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2xhIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImNsYSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbktleXdvcmQ6Y2xhPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImNsYSI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiY2xhIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJpbXBvcnQgPENvbXBsZXRlT25LZXl3b3JkOmNsYT47XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdjbGFzcycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwMzEoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBmaW5hbCBjbGEiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNsYSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJjbGEiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmNsYT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJjbGEiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImNsYSI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiaW1wb3J0IDxDb21wbGV0ZU9uS2V5d29yZDpjbGE+O1xuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnY2xhc3MnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDMyKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgZmluYWwgY2xhIFgiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNsYSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJjbGEiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmNsYT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJjbGEiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImNsYSI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiaW1wb3J0IDxDb21wbGV0ZU9uS2V5d29yZDpjbGE+O1xuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnY2xhc3MnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDMzKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgY2xhXG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNsYSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJjbGEiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOmNsYT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJjbGEiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImNsYSI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpjbGE+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnY2xhc3MnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDM0KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIGNsYVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJjbGEiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiY2xhIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpjbGE+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiY2xhIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJjbGEiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6Y2xhPjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2NsYXNzJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDAzNSgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBmaW5hbCBjbGFcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2xhIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImNsYSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6Y2xhPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImNsYSI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiY2xhIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOmNsYT47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdjbGFzcycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwMzYoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgZmluYWwgY2xhIFlcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2xhIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImNsYSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6Y2xhPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImNsYSI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiY2xhIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOmNsYT47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdjbGFzcycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwMzcoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIGNsYVxuIiArCi0JCSIgIH1cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2xhIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImNsYSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpjbGE+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gImNsYSI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJjbGEiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpjbGE+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdjbGFzcycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwMzgoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIGZpbmFsIGNsYVxuIiArCi0JCSIgIH1cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2xhIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImNsYSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpjbGE+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gImNsYSI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJjbGEiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpjbGE+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdjbGFzcycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwMzkoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIGZpbmFsIGNsYSBZXG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJjbGEiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiY2xhIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmNsYT4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAiY2xhIjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImNsYSI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmNsYT47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2NvbnRpbnVlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDA0MCgpewotCVN0cmluZyBzdHIgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKwotCQkiICAgICBjb25cbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY29uIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImNvbiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmNvbj4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAiY29uIjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImNvbiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6Y29uPjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnY29udGludWUnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDQxKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArCi0JCSIgICAgIGZvcihpbnQgaTsgaSA8IDU7IGkrKykge1xuIiArCi0JCSIgICAgICAgY29uXG4iICsKLQkJIiAgICAgfVxuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJjb24iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiY29uIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6Y29uPiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJjb24iOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiY29uIjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIGludCBpO1xuIiArCi0JCSIgICAge1xuIiArCi0JCSIgICAgICA8Q29tcGxldGVPbk5hbWU6Y29uPjtcbiIgKwotCQkiICAgIH1cbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnZGVmYXVsdCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwNDIoKXsKLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICAgZGVmXG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImRlZiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJkZWYiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpkZWY+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gImRlZiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJkZWYiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmRlZj47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2RlZmF1bHQnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDQzKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArCi0JCSIgICAgIHN3aXRjaCgwKSB7XG4iICsKLQkJIiAgICAgICBjYXNlIDEgOiBicmVhaztcbiIgKwotCQkiICAgICAgIGRlZlxuIiArCi0JCSIgICAgIH1cbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZGVmIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImRlZiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmRlZj4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAiZGVmIjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImRlZiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICB7XG4iICsKLQkJIiAgICAgIDxDb21wbGV0ZU9uTmFtZTpkZWY+O1xuIiArCi0JCSIgICAgfVxuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdkbycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwNDQoKXsKLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICAgZG9cbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZG8iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiZG8iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpkbz4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAiZG8iOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiZG8iOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmRvPjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnZWxzZScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwNDUoKXsKLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICAgZWxzXG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImVscyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJlbHMiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTplbHM+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gImVscyI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJlbHMiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmVscz47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2Vsc2UnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDQ2KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArCi0JCSIgICAgIGlmKHRydWUpIHtcbiIgKwotCQkiICAgICB9IGVsc1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJlbHMiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiZWxzIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6ZWxzPiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJlbHMiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiZWxzIjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTplbHM+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdleHRlbmRzJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDA0NygpewotCVN0cmluZyBzdHIgPQotCQkiZXh0IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJleHQiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiZXh0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImV4dCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiZXh0IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSIiOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdleHRlbmRzJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDA0OCgpewotCVN0cmluZyBzdHIgPQotCQkiWCBleHQiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImV4dCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJleHQiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiZXh0IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJleHQiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJIiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2V4dGVuZHMnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDQ5KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJleHQgWSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZXh0IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImV4dCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJleHQiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImV4dCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnZXh0ZW5kcycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwNTAoKXsKLQlTdHJpbmcgc3RyID0KLQkJImNsYXNzIFggZXh0IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJleHQiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiZXh0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDpleHQ+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiZXh0IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJleHQiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJImNsYXNzIFggZXh0ZW5kcyA8Q29tcGxldGVPbktleXdvcmQ6ZXh0PiB7XG4iICsKLQkJIiAgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2V4dGVuZHMnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDUxKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJjbGFzcyBYIGV4dCBZIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJleHQiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiZXh0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDpleHQ+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiZXh0IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJleHQiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJImNsYXNzIFggZXh0ZW5kcyA8Q29tcGxldGVPbktleXdvcmQ6ZXh0PiB7XG4iICsKLQkJIiAgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2V4dGVuZHMnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDUyKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJjbGFzcyBYIGV4dCBZIHsiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImV4dCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJleHQiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmV4dD4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJleHQiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImV4dCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiY2xhc3MgWCBleHRlbmRzIDxDb21wbGV0ZU9uS2V5d29yZDpleHQ+IHtcbiIgKwotCQkiICB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdleHRlbmRzJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDA1MygpewotCVN0cmluZyBzdHIgPQotCQkiY2xhc3MgWCBleHRlbmRzIFkgZXh0IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJleHQiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiZXh0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDpleHQ+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiZXh0IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJleHQiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJImNsYXNzIFggZXh0ZW5kcyA8Q29tcGxldGVPbktleXdvcmQ6ZXh0PiB7XG4iICsKLQkJIiAgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2V4dGVuZHMnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDU0KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJjbGFzcyBYIGltcGxlbWVudHMgWSBleHQiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImV4dCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJleHQiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiZXh0IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJleHQiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJImNsYXNzIFggaW1wbGVtZW50cyBZIHtcbiIgKwotCQkiICBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnZmluYWxseScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwNTUoKXsKLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICAgZmluIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmaW4iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiZmluIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6ZmluPiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJmaW4iOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiZmluIjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpmaW4+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdmaW5hbGx5JyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDA1NigpewotCVN0cmluZyBzdHIgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKwotCQkiICAgICB0cnkgeyIgKwotCQkiICAgICB9IGZpbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZmluIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImZpbiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmZpbj4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAiZmluIjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImZpbiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbktleXdvcmQ6ZmluPjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnZm9yJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDA1NygpewotCVN0cmluZyBzdHIgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKwotCQkiICAgICBmb3IiICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZvciI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJmb3IiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpmb3I+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gImZvciI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJmb3IiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmZvcj47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2lmJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDA1OCgpewotCVN0cmluZyBzdHIgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKwotCQkiICAgICBpZiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaWYiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiaWYiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTppZj4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAiaWYiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaWYiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmlmPjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnc3dpdGNoJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDA1OSgpewotCVN0cmluZyBzdHIgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKwotCQkiICAgICBzd2kiICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInN3aSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJzd2kiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpzd2k+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInN3aSI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJzd2kiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOnN3aT47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ltcGxlbWVudHMnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDYwKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJpbXBsIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbXBsIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImltcGwiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiaW1wbCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaW1wbCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnaW1wbGVtZW50cycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwNjEoKXsKLQlTdHJpbmcgc3RyID0KLQkJIlggaW1wbCI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW1wbCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJpbXBsIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImltcGwiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImltcGwiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJIiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ltcGxlbWVudHMnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDYyKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJpbXBsIFkiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImltcGwiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiaW1wbCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJpbXBsIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJpbXBsIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSIiOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdpbXBsZW1lbnRzJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDA2MygpewotCVN0cmluZyBzdHIgPQotCQkiY2xhc3MgWCBpbXBsIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbXBsIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImltcGwiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmltcGw+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiaW1wbCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaW1wbCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiY2xhc3MgWCBleHRlbmRzIDxDb21wbGV0ZU9uS2V5d29yZDppbXBsPiB7XG4iICsKLQkJIiAgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ltcGxlbWVudHMnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDY0KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJjbGFzcyBYIGltcGwgWSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW1wbCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJpbXBsIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDppbXBsPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImltcGwiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImltcGwiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJImNsYXNzIFggZXh0ZW5kcyA8Q29tcGxldGVPbktleXdvcmQ6aW1wbD4ge1xuIiArCi0JCSIgIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdpbXBsZW1lbnRzJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDA2NSgpewotCVN0cmluZyBzdHIgPQotCQkiY2xhc3MgWCBpbXBsIFkgeyI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW1wbCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJpbXBsIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDppbXBsPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImltcGwiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImltcGwiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJImNsYXNzIFggZXh0ZW5kcyA8Q29tcGxldGVPbktleXdvcmQ6aW1wbD4ge1xuIiArCi0JCSIgIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ltcGxlbWVudHMnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDY2KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJjbGFzcyBYIGV4dGVuZHMgWSBpbXBsIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbXBsIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImltcGwiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmltcGw+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiaW1wbCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaW1wbCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiY2xhc3MgWCBleHRlbmRzIDxDb21wbGV0ZU9uS2V5d29yZDppbXBsPiB7XG4iICsKLQkJIiAgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ltcGxlbWVudHMnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDY3KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJjbGFzcyBYIGltcGxlbWVudHMgWSBpbXBsIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbXBsIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImltcGwiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiaW1wbCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaW1wbCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiY2xhc3MgWCBpbXBsZW1lbnRzIFkge1xuIiArCi0JCSIgIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdpbXBvcnQnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDY4KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJpbXBvIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbXBvIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImltcG8iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmltcG8+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiaW1wbyI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaW1wbyI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiaW1wb3J0IDxDb21wbGV0ZU9uS2V5d29yZDppbXBvPjtcbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ltcG9ydCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwNjkoKXsKLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkiaW1wbyI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW1wbyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJpbXBvIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDppbXBvPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImltcG8iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImltcG8iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkiaW1wb3J0IDxDb21wbGV0ZU9uS2V5d29yZDppbXBvPjtcbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ltcG9ydCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwNzAoKXsKLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkiaW1wb3J0IHAyLlk7XG4iICsKLQkJImltcG8iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImltcG8iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiaW1wbyIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbktleXdvcmQ6aW1wbz4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJpbXBvIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJpbXBvIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJImltcG9ydCBwMi5ZO1xuIiArCi0JCSJpbXBvcnQgPENvbXBsZXRlT25LZXl3b3JkOmltcG8+O1xuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnaW1wb3J0JyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDA3MSgpewotCVN0cmluZyBzdHIgPQotCQkiaW1wbyBwMi5ZIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbXBvIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImltcG8iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmltcG8+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiaW1wbyI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaW1wbyI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiaW1wb3J0IDxDb21wbGV0ZU9uS2V5d29yZDppbXBvPjtcbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ludGVyZmFjZScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwNzIoKXsKLQlTdHJpbmcgc3RyID0KLQkJImludCI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW50IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImludCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbktleXdvcmQ6aW50PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImludCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaW50IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJpbXBvcnQgPENvbXBsZXRlT25LZXl3b3JkOmludD47XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdpbnRlcmZhY2UnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDczKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgaW50IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbnQiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiaW50IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDppbnQ+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiaW50IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJpbnQiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJImltcG9ydCA8Q29tcGxldGVPbktleXdvcmQ6aW50PjtcbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ludGVyZmFjZScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwNzQoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBhYnN0cmFjdCBpbnQiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImludCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJpbnQiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmludD4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJpbnQiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImludCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiaW1wb3J0IDxDb21wbGV0ZU9uS2V5d29yZDppbnQ+O1xuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnaW50ZXJmYWNlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDA3NSgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGFic3RyYWN0IGludCBYIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbnQiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiaW50IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDppbnQ+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiaW50IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJpbnQiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJImltcG9ydCA8Q29tcGxldGVPbktleXdvcmQ6aW50PjtcbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ludGVyZmFjZScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwNzYoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBpbnRcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW50IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImludCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6aW50PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImludCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaW50IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOmludD47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdpbnRlcmZhY2UnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDc3KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIGludFxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbnQiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiaW50IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTppbnQ+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiaW50IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJpbnQiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6aW50PjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ludGVyZmFjZScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwNzgoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgYWJzdHJhY3QgaW50XG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImludCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJpbnQiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOmludD4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJpbnQiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImludCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTppbnQ+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnaW50ZXJmYWNlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDA3OSgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBhYnN0cmFjdCBpbnQgWVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbnQiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiaW50IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTppbnQ+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiaW50IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJpbnQiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6aW50PjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ludGVyZmFjZScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwODAoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIGludFxuIiArCi0JCSIgIH1cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW50IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImludCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTppbnQ+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gImludCI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJpbnQiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTppbnQ+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdpbnRlcmZhY2UnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDgxKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICBhYnN0cmFjdCBpbnRcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImludCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJpbnQiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6aW50PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJpbnQiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaW50IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6aW50PjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnaW50ZXJmYWNlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDA4MigpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgYWJzdHJhY3QgaW50IFlcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImludCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJpbnQiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6aW50PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJpbnQiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaW50IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6aW50PjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnaW50ZXJmYWNlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDA4MygpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGZpbmFsIGludCI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW50IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImludCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJpbnQiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImludCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnaW50ZXJmYWNlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDA4NCgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGZpbmFsIGludCBYIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbnQiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiaW50IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImludCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaW50IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSIiOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdwYWNrYWdlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDA4NSgpewotCVN0cmluZyBzdHIgPQotCQkicGFjIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJwYWMiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigicGFjIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDpwYWM+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAicGFjIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJwYWMiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJImltcG9ydCA8Q29tcGxldGVPbktleXdvcmQ6cGFjPjtcbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3BhY2thZ2UnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDg2KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwYWMgcCI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicGFjIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInBhYyIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbktleXdvcmQ6cGFjPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInBhYyI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicGFjIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJpbXBvcnQgPENvbXBsZXRlT25LZXl3b3JkOnBhYz47XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdwYWNrYWdlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDA4NygpewotCVN0cmluZyBzdHIgPQotCQkicGFja2FnZSBwOyIgKwotCQkicGFjIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJwYWMiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigicGFjIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInBhYyI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicGFjIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdwYWNrYWdlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDA4OCgpewotCVN0cmluZyBzdHIgPQotCQkiaW1wb3J0IHA7IiArCi0JCSJwYWMiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInBhYyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJwYWMiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAicGFjIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJwYWMiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJImltcG9ydCBwO1xuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAncGFja2FnZScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwODkoKXsKLQlTdHJpbmcgc3RyID0KLQkJImNsYXNzIFgge30iICsKLQkJInBhYyI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicGFjIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInBhYyIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwYWMiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInBhYyI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiY2xhc3MgWCB7XG4iICsKLQkJIiAgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3JldHVybicga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwOTAoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBpbnQgZm9vKCkge1xuIiArCi0JCSIgICAgcmV0XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJyZXQiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigicmV0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIGludCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6cmV0PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJyZXQiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicmV0IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgaW50IGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpyZXQ+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICd0aHJvdycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwOTEoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIHRoclxuIiArCi0JCSIgIH1cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidGhyIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInRociIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp0aHI+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInRociI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ0aHIiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTp0aHI+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICd0cnknIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDkyKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICB0cnlcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRyeSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJ0cnkiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6dHJ5PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ0cnkiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidHJ5IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6dHJ5PjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAndHJ5JyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDA5MygpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgaWYodHJ5XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ0cnkiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigidHJ5IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnRyeT4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAidHJ5IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInRyeSI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOnRyeT47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2RvJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDA5NCgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgaWYoZG9cbiIgKwotCQkiICB9XG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImRvIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImRvIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmRvPiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJkbyI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJkbyI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmRvPjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnZm9yJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDA5NSgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgaWYoZm9yXG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmb3IiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiZm9yIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmZvcj4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAiZm9yIjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImZvciI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmZvcj47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2lmJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDA5NigpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgaWYoaWZcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImlmIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImlmIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmlmPiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJpZiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJpZiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmlmPjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnc3dpdGNoJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDA5NygpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgaWYoc3dpXG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJzd2kiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigic3dpIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnN3aT4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAic3dpIjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInN3aSI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOnN3aT47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ25ldycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwOTgoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIG5ld1xuIiArCi0JCSIgIH1cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibmV3IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoIm5ldyIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpuZXc+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gIm5ldyI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJuZXciOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpuZXc+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICduZXcnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDk5KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICBuZXcgWFxuIiArCi0JCSIgIH1cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibmV3IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoIm5ldyIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpuZXc+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gIm5ldyI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJuZXciOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpuZXc+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICduZXcnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTAwKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICBuZXcgWCgpXG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuZXciOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigibmV3IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOm5ldz4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAibmV3IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIm5ldyI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOm5ldz47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3Rocm93cycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxMDEoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpIHRoclxuIiArCi0JCSIgIH1cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidGhyIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInRociIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbktleXdvcmQ6dGhyPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInRociI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidGhyIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkgdGhyb3dzIDxDb21wbGV0ZU9uS2V5d29yZDp0aHI+IHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3Rocm93cycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxMDIoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpIHRociB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ0aHIiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigidGhyIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDp0aHI+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAidGhyIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ0aHIiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB0aHJvd3MgPENvbXBsZXRlT25LZXl3b3JkOnRocj4ge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAndGhyb3dzJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDEwMygpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCkgdGhyIEUge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidGhyIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInRociIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbktleXdvcmQ6dGhyPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInRociI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidGhyIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkgdGhyb3dzIDxDb21wbGV0ZU9uS2V5d29yZDp0aHI+IHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3Rocm93cycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxMDQoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpIHRocm93cyBFIHRoclxuIiArCi0JCSIgIH1cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidGhyIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInRociIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ0aHIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInRociI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHRocm93cyBFIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3Rocm93cycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxMDUoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBYKCkgdGhyXG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ0aHIiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigidGhyIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDp0aHI+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAidGhyIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ0aHIiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBYKCkgdGhyb3dzIDxDb21wbGV0ZU9uS2V5d29yZDp0aHI+IHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3Rocm93cycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxMDYoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBpbnQgZm9vKClbXSB0aHJcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRociI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJ0aHIiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOnRocj4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ0aHIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInRociI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICBpbnRbXSBmb28oKSB0aHJvd3MgPENvbXBsZXRlT25LZXl3b3JkOnRocj4ge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnd2hpbGUnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTA3KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICB3aGlcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIndoaSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJ3aGkiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6d2hpPiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ3aGkiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAid2hpIjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6d2hpPjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnd2hpbGUnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTA4KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICBpZih3aGlcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIndoaSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJ3aGkiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6d2hpPiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ3aGkiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAid2hpIjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6d2hpPjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnYXNzZXJ0JyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDEwOSgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgYXNzXG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJhc3MiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiYXNzIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmFzcz4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAiYXNzIjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImFzcyI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmFzcz47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2Fzc2VydCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxMTAoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIGlmKGFzc1xuIiArCi0JCSIgIH1cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYXNzIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImFzcyIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTphc3M+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gImFzcyI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJhc3MiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTphc3M+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdmaW5hbCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxMTEoKXsKLQlTdHJpbmcgc3RyID0KLQkJImZpbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZmluIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImZpbiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbktleXdvcmQ6ZmluPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImZpbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiZmluIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJpbXBvcnQgPENvbXBsZXRlT25LZXl3b3JkOmZpbj47XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdmaW5hbCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxMTIoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBmaW4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZpbiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJmaW4iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmZpbj4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJmaW4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImZpbiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiaW1wb3J0IDxDb21wbGV0ZU9uS2V5d29yZDpmaW4+O1xuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnZmluYWwnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTEzKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJmaW4genp6IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmaW4iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiZmluIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDpmaW4+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiZmluIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJmaW4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJImltcG9ydCA8Q29tcGxldGVPbktleXdvcmQ6ZmluPjtcbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ZpbmFsJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDExNCgpewotCVN0cmluZyBzdHIgPQotCQkiZmluYWwgZmluIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmaW4iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiZmluIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImZpbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiZmluIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSIiOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdmaW5hbCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxMTUoKXsKLQlTdHJpbmcgc3RyID0KLQkJImFic3RyYWN0IGZpbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZmluIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImZpbiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJmaW4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImZpbiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnZmluYWwnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTE2KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgZmluIGNsYXNzIFgge30iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZpbiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJmaW4iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmZpbj4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJmaW4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImZpbiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiaW1wb3J0IDxDb21wbGV0ZU9uS2V5d29yZDpmaW4+O1xuIiArCi0JCSJjbGFzcyBYIHtcbiIgKwotCQkiICBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnZmluYWwnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTE3KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgZmluXG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZpbiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJmaW4iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOmZpbj4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJmaW4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImZpbiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpmaW4+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnZmluYWwnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTE4KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIGZpblxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmaW4iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiZmluIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpmaW4+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiZmluIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJmaW4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6ZmluPjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ZpbmFsJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDExOSgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIGZpbiB6enpcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZmluIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImZpbiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6ZmluPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImZpbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiZmluIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOmZpbj47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdmaW5hbCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxMjAoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBmaW5hbCBmaW5cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZmluIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImZpbiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6ZmluPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImZpbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiZmluIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOmZpbj47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdmaW5hbCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxMjEoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBhYnN0cmFjdCBmaW5cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZmluIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImZpbiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6ZmluPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImZpbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiZmluIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOmZpbj47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICduYXRpdmUnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTIyKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgbmF0XG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIm5hdCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJuYXQiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOm5hdD4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJuYXQiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIm5hdCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpuYXQ+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnbmF0aXZlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDEyMygpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBuYXRcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibmF0IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoIm5hdCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6bmF0PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIm5hdCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAibmF0IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOm5hdD47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICduYXRpdmUnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTI0KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdHJhbnNpZW50IG5hdFxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuYXQiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigibmF0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpuYXQ+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAibmF0IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJuYXQiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6bmF0PjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ25hdGl2ZScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxMjUoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB0cmFuc2llbnQgbmF0XG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIm5hdCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJuYXQiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOm5hdD4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJuYXQiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIm5hdCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpuYXQ+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnbmF0aXZlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDEyNigpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvbGF0aWxlIG5hdFxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuYXQiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigibmF0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpuYXQ+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAibmF0IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJuYXQiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6bmF0PjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3N0cmljdGZwJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDEyNygpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHN0clxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJzdHIiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigic3RyIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpzdHI+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAic3RyIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJzdHIiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6c3RyPjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3N0cmljdGZwJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDEyOCgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBzdHJcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3RyIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInN0ciIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6c3RyPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInN0ciI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAic3RyIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnN0cj47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdzdHJpY3RmcCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxMjkoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB0cmFuc2llbnQgc3RyXG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInN0ciI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJzdHIiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOnN0cj4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJzdHIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInN0ciI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpzdHI+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnc3RyaWN0ZnAnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTMwKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdHJhbnNpZW50IHN0clxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJzdHIiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigic3RyIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpzdHI+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAic3RyIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJzdHIiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6c3RyPjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3N0cmljdGZwJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDEzMSgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvbGF0aWxlIHN0clxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJzdHIiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigic3RyIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpzdHI+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAic3RyIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJzdHIiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6c3RyPjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3ZvbGF0aWxlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDEzMigpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvbFxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ2b2wiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigidm9sIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTp2b2w+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAidm9sIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ2b2wiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6dm9sPjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3ZvbGF0aWxlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDEzMygpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyB2b2xcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidm9sIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInZvbCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6dm9sPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInZvbCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidm9sIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnZvbD47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICd2b2xhdGlsZScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxMzQoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB0cmFuc2llbnQgdm9sXG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInZvbCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJ2b2wiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOnZvbD4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ2b2wiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInZvbCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTp2b2w+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAndm9sYXRpbGUnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTM1KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9sYXRpbGUgdm9sXG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInZvbCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJ2b2wiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOnZvbD4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ2b2wiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInZvbCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTp2b2w+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAndm9sYXRpbGUnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTM2KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgbmF0aXZlIHZvbFxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ2b2wiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigidm9sIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTp2b2w+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAidm9sIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ2b2wiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6dm9sPjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3RyYW5zaWVudCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxMzcoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB0cmFcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidHJhIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInRyYSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6dHJhPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInRyYSI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidHJhIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnRyYT47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICd0cmFuc2llbnQnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTM4KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIHRyYVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ0cmEiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigidHJhIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTp0cmE+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAidHJhIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ0cmEiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6dHJhPjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3RyYW5zaWVudCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxMzkoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB0cmFuc2llbnQgdHJhXG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRyYSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJ0cmEiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOnRyYT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ0cmEiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInRyYSI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTp0cmE+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAndHJhbnNpZW50JyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDE0MCgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvbGF0aWxlIHRyYVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ0cmEiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigidHJhIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTp0cmE+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAidHJhIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ0cmEiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6dHJhPjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3RyYW5zaWVudCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxNDEoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBuYXRpdmUgdHJhXG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRyYSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJ0cmEiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOnRyYT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ0cmEiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInRyYSI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTp0cmE+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnc3luY2hyb25pemVkJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDE0MigpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHN5blxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJzeW4iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigic3luIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpzeW4+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAic3luIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJzeW4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6c3luPjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3N5bmNocm9uaXplZCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxNDMoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgc3luXG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInN5biI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJzeW4iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOnN5bj4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJzeW4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInN5biI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpzeW4+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnc3luY2hyb25pemVkJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDE0NCgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHRyYW5zaWVudCBzeW5cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3luIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInN5biIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6c3luPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInN5biI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAic3luIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnN5bj47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdzeW5jaHJvbml6ZWQnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTQ1KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdHJhbnNpZW50IHN5blxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJzeW4iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigic3luIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpzeW4+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAic3luIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJzeW4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6c3luPjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3N5bmNocm9uaXplZCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxNDYoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2xhdGlsZSBzeW5cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3luIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInN5biIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6c3luPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInN5biI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAic3luIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnN5bj47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdzeW5jaHJvbml6ZWQnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTQ3KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICBzeW5cbiIgKwotCQkiICB9XG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInN5biI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJzeW4iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6c3luPiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJzeW4iOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAic3luIjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6c3luPjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnc3luY2hyb25pemVkJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDE0OCgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgaWYoc3luXG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJzeW4iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigic3luIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnN5bj4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAic3luIjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInN5biI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOnN5bj47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3N0YXRpYycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxNDkoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBzdGFcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3RhIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInN0YSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6c3RhPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInN0YSI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAic3RhIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnN0YT47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdzdGF0aWMnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTUwKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIHN0YVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJzdGEiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigic3RhIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpzdGE+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAic3RhIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJzdGEiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6c3RhPjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3B1YmxpYycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxNTEoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHViIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInB1YiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbktleXdvcmQ6cHViPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInB1YiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicHViIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJpbXBvcnQgPENvbXBsZXRlT25LZXl3b3JkOnB1Yj47XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdwdWJsaWMnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTUyKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJmaW5hbCBwdWIiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInB1YiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJwdWIiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOnB1Yj4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwdWIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInB1YiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiaW1wb3J0IDxDb21wbGV0ZU9uS2V5d29yZDpwdWI+O1xuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAncHVibGljJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDE1MygpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIHB1YiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHViIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInB1YiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwdWIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInB1YiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAncHVibGljJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDE1NCgpewotCVN0cmluZyBzdHIgPQotCQkicHJpdmF0ZSBwdWIiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInB1YiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJwdWIiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOnB1Yj4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwdWIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInB1YiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiaW1wb3J0IDxDb21wbGV0ZU9uS2V5d29yZDpwdWI+O1xuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAncHVibGljJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDE1NSgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFh7fVxuIiArCi0JCSJwdWIiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInB1YiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJwdWIiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAicHViIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJwdWIiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3B1YmxpYycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxNTYoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYe1xuIiArCi0JCSIgIHB1YlxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJwdWIiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigicHViIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpwdWI+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAicHViIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJwdWIiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6cHViPjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3B1YmxpYycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxNTcoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYe1xuIiArCi0JCSIgIHB1YmxpYyBwdWJcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHViIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInB1YiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6cHViPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInB1YiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicHViIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnB1Yj47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdwdWJsaWMnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTU4KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWHtcbiIgKwotCQkiICBwcml2YXRlIHB1YlxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJwdWIiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigicHViIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpwdWI+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAicHViIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJwdWIiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6cHViPjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3B1YmxpYycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxNTkoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYe1xuIiArCi0JCSIgIHByb3RlY3RlZCBwdWJcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHViIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInB1YiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6cHViPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInB1YiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicHViIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnB1Yj47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdwdWJsaWMnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTYwKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWHtcbiIgKwotCQkiICBhYnN0cmFjdCBwdWJcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHViIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInB1YiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6cHViPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInB1YiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicHViIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnB1Yj47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdwcm90ZWN0ZWQnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTYxKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwcm8iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInBybyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCIiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJIiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3Byb3RlY3RlZCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxNjIoKXsKLQlTdHJpbmcgc3RyID0KLQkJImZpbmFsIHBybyI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHJvIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInBybyIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwcm8iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInBybyI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAncHJvdGVjdGVkJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDE2MygpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIHBybyI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHJvIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInBybyIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwcm8iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInBybyI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAncHJvdGVjdGVkJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDE2NCgpewotCVN0cmluZyBzdHIgPQotCQkicHJpdmF0ZSBwcm8iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInBybyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJwcm8iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAicHJvIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJwcm8iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJIiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3Byb3RlY3RlZCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxNjUoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYe31cbiIgKwotCQkicHJvIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJwcm8iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigicHJvIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInBybyI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicHJvIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdwcm90ZWN0ZWQnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTY2KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWHtcbiIgKwotCQkiICBwcm9cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHJvIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInBybyIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6cHJvPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInBybyI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicHJvIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnBybz47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdwcm90ZWN0ZWQnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTY3KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWHtcbiIgKwotCQkiICBwdWJsaWMgcHJvXG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInBybyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJwcm8iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOnBybz4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwcm8iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInBybyI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpwcm8+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAncHJvdGVjdGVkJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDE2OCgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFh7XG4iICsKLQkJIiAgcHJpdmF0ZSBwcm9cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHJvIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInBybyIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6cHJvPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInBybyI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicHJvIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnBybz47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdwcm90ZWN0ZWQnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTY5KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWHtcbiIgKwotCQkiICBwcm90ZWN0ZWQgcHJvXG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInBybyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJwcm8iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOnBybz4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwcm8iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInBybyI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpwcm8+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAncHJvdGVjdGVkJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDE3MCgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFh7XG4iICsKLQkJIiAgYWJzdHJhY3QgcHJvXG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInBybyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJwcm8iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOnBybz4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwcm8iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInBybyI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpwcm8+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAncHJpdmF0ZScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxNzEoKXsKLQlTdHJpbmcgc3RyID0KLQkJInByaSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHJpIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoIiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAncHJpdmF0ZScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxNzIoKXsKLQlTdHJpbmcgc3RyID0KLQkJImZpbmFsIHByaSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHJpIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInByaSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwcmkiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInByaSI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAncHJpdmF0ZScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxNzMoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBwcmkiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInByaSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJwcmkiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAicHJpIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJwcmkiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJIiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3ByaXZhdGUnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTc0KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwcml2YXRlIHByaSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHJpIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInByaSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwcmkiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInByaSI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAncHJpdmF0ZScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxNzUoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYe31cbiIgKwotCQkicHJpIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJwcmkiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigicHJpIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInByaSI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicHJpIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdwcml2YXRlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDE3NigpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFh7XG4iICsKLQkJIiAgcHJpXG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInByaSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJwcmkiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOnByaT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwcmkiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInByaSI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpwcmk+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAncHJpdmF0ZScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxNzcoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYe1xuIiArCi0JCSIgIHB1YmxpYyBwcmlcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHJpIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInByaSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6cHJpPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInByaSI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicHJpIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnByaT47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdwcml2YXRlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDE3OCgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFh7XG4iICsKLQkJIiAgcHJpdmF0ZSBwcmlcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHJpIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInByaSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6cHJpPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInByaSI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicHJpIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnByaT47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdwcml2YXRlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDE3OSgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFh7XG4iICsKLQkJIiAgcHJvdGVjdGVkIHByaVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJwcmkiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigicHJpIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpwcmk+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAicHJpIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJwcmkiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6cHJpPjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3ByaXZhdGUnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTgwKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWHtcbiIgKwotCQkiICBhYnN0cmFjdCBwcmlcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHJpIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInByaSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6cHJpPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInByaSI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicHJpIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnByaT47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdzdXBlcicga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxODEoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArCi0JCSIgICAgIHN1cFxuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJzdXAiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigic3VwIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnN1cD4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAic3VwIjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInN1cCI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOnN1cD47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3RoaXMnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTgyKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKwotCQkiICAgICB0aGlcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidGhpIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInRoaSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp0aGk+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInRoaSI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ0aGkiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTp0aGk+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICd0cnVlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDE4MygpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICAgdHJ1XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRydSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJ0cnUiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6dHJ1PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ0cnUiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidHJ1IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6dHJ1PjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnZmFsc2UnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTg0KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKwotCQkiICAgICBmYWxcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZmFsIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImZhbCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpmYWw+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gImZhbCI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJmYWwiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpmYWw+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdudWxsJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDE4NSgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICAgbnVsXG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIm51bCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJudWwiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6bnVsPiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJudWwiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAibnVsIjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6bnVsPjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnaW5zdGFuY2VvZicga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxODYoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArCi0JCSIgICAgIGlmKHp6eiBpbnNcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW5zIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImlucyIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDppbnM+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gImlucyI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJpbnMiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uS2V5d29yZDppbnM+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdpbnN0YW5jZW9mJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDE4NygpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICAgaW5zXG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImlucyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJpbnMiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6aW5zPiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJpbnMiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaW5zIjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6aW5zPjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnaW5zdGFuY2VvZicga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxODgoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArCi0JCSIgICAgIGlmKHp6eiB6enogaW5zXG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImlucyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJpbnMiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6aW5zPiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJpbnMiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaW5zIjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICB6enogenp6O1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmlucz47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3doaWxlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDE4OSgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgZG97XG4iICsKLQkJIiAgICB9IHdoaVxuIiArCi0JCSIgIH1cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAid2hpIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoIndoaSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDp3aGk+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gIndoaSI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ3aGkiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uS2V5d29yZDp3aGk+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdjYXRjaCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxOTAoKXsKLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICB0cnkge1xuIiArCi0JCSIgICAgfSBjYXRjaChFIGUpIHtcbiIgKwotCQkiICAgIH0gY2F0XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNhdCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJjYXQiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpjYXQ+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gImNhdCI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJjYXQiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmNhdD47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ZpbmFsbHknIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTkxKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArCi0JCSIgICAgIHRyeSB7IiArCi0JCSIgICAgIH0gY2F0Y2goRSBlKSB7IiArCi0JCSIgICAgIH0gZmluIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmaW4iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiZmluIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6ZmluPiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJmaW4iOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiZmluIjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpmaW4+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdmaW5hbGx5JyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDE5MigpewotCVN0cmluZyBzdHIgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKwotCQkiICAgICB0cnkgeyIgKwotCQkiICAgICB9IGZpbmFsbHkgeyIgKwotCQkiICAgICB9IGZpbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZmluIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImZpbiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmZpbj4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAiZmluIjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImZpbiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6ZmluPjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAndGhpcycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxOTMoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArCi0JCSIgICAgIFgudGhpXG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRoaSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJ0aGkiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6WC50aGk+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInRoaSI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJYLnRoaSI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOlgudGhpPjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8qCi0gKiBUZXN0IGZvciAnYWJzdHJhY3QnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTk0KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJImFic3QiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImFic3QiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJhYnN0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDphYnN0PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJImltcG9ydCA8Q29tcGxldGVPbktleXdvcmQ6YWJzdD47XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdhYnN0cmFjdCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxOTUoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkiYWJzdCB6enoiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImFic3QiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJhYnN0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDphYnN0PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJImltcG9ydCA8Q29tcGxldGVPbktleXdvcmQ6YWJzdD47XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdhYnN0cmFjdCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxOTYoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicGFja2FnZSBwO1xuIiArCi0JCSJhYnN0IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJhYnN0IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigiYWJzdCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbktleXdvcmQ6YWJzdD4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJhYnN0IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJhYnN0IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJImltcG9ydCA8Q29tcGxldGVPbktleXdvcmQ6YWJzdD47XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdhYnN0cmFjdCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxOTcoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicGFja2FnZSBwO1xuIiArCi0JCSJhYnN0IHp6eiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYWJzdCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoImFic3QiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmFic3Q+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiYWJzdCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiYWJzdCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJpbXBvcnQgPENvbXBsZXRlT25LZXl3b3JkOmFic3Q+O1xuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnYWJzdHJhY3QnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTk4KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJInBhY2thZ2UgcDtcbiIgKwotCQkiaW1wb3J0IHl5eTtcbiIgKwotCQkiYWJzdCI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYWJzdCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoImFic3QiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmFic3Q+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiYWJzdCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiYWJzdCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJpbXBvcnQgeXl5O1xuIiArCi0JCSJpbXBvcnQgPENvbXBsZXRlT25LZXl3b3JkOmFic3Q+O1xuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnYWJzdHJhY3QnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTk5KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJInBhY2thZ2UgcDtcbiIgKwotCQkiaW1wb3J0IHl5eTtcbiIgKwotCQkiYWJzdCB6enoiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImFic3QiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJhYnN0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDphYnN0PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkiaW1wb3J0IHl5eTtcbiIgKwotCQkiaW1wb3J0IDxDb21wbGV0ZU9uS2V5d29yZDphYnN0PjtcbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2Fic3RyYWN0JyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDIwMCgpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwYWNrYWdlIHA7XG4iICsKLQkJImltcG9ydCB5eXk7XG4iICsKLQkJInB1YmxpYyBhYnN0IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJhYnN0IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZigiYWJzdCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbktleXdvcmQ6YWJzdD4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJhYnN0IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJhYnN0IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJImltcG9ydCB5eXk7XG4iICsKLQkJImltcG9ydCA8Q29tcGxldGVPbktleXdvcmQ6YWJzdD47XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdhYnN0cmFjdCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyMDEoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicGFja2FnZSBwO1xuIiArCi0JCSJpbXBvcnQgeXl5O1xuIiArCi0JCSJwdWJsaWMgYWJzdCB6enoiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImFic3QiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKCJhYnN0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDphYnN0PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkiaW1wb3J0IHl5eTtcbiIgKwotCQkiaW1wb3J0IDxDb21wbGV0ZU9uS2V5d29yZDphYnN0PjtcbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2Fic3RyYWN0JyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDIwMigpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwYWNrYWdlIHA7XG4iICsKLQkJImltcG9ydCB5eXk7XG4iICsKLQkJImFic3RyYWN0IGFic3QiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImFic3QiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiYWJzdCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJhYnN0IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJhYnN0IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJImltcG9ydCB5eXk7XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdhYnN0cmFjdCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyMDMoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicGFja2FnZSBwO1xuIiArCi0JCSJpbXBvcnQgeXl5O1xuIiArCi0JCSJhYnN0cmFjdCBhYnN0IHp6eiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYWJzdCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJhYnN0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkiaW1wb3J0IHl5eTtcbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2Fic3RyYWN0JyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDIwNCgpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwYWNrYWdlIHA7XG4iICsKLQkJImltcG9ydCBcbiIgKwotCQkiYWJzdCI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYWJzdCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJhYnN0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uSW1wb3J0OmFic3Q+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiYWJzdCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiYWJzdCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJpbXBvcnQgPENvbXBsZXRlT25JbXBvcnQ6YWJzdD47XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdhYnN0cmFjdCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyMDUoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicGFja2FnZSBwO1xuIiArCi0JCSJpbXBvcnQgeXl5O1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7fVxuIiArCi0JCSJhYnN0IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJhYnN0IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImFic3QiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmFic3Q+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiYWJzdCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiYWJzdCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJpbXBvcnQgeXl5O1xuIiArCi0JCSJpbXBvcnQgPENvbXBsZXRlT25LZXl3b3JkOmFic3Q+O1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdhYnN0cmFjdCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyMDYoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicGFja2FnZSBwO1xuIiArCi0JCSJpbXBvcnQgeXl5O1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7fVxuIiArCi0JCSJhYnN0IHp6eiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYWJzdCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJhYnN0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDphYnN0PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkiaW1wb3J0IHl5eTtcbiIgKwotCQkiaW1wb3J0IDxDb21wbGV0ZU9uS2V5d29yZDphYnN0PjtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnYWJzdHJhY3QnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjA3KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJInBhY2thZ2UgcDtcbiIgKwotCQkiaW1wb3J0IHl5eTtcbiIgKwotCQkiZmluYWwgYWJzdCI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYWJzdCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJhYnN0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkiaW1wb3J0IHl5eTtcbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2Fic3RyYWN0JyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDIwOCgpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBhYnN0XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYWJzdCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJhYnN0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTphYnN0PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTphYnN0PjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2Fic3RyYWN0JyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDIwOSgpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBhYnN0IHp6elxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImFic3QiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiYWJzdCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6YWJzdD4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJhYnN0IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJhYnN0IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6YWJzdD47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdhYnN0cmFjdCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyMTAoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIGFic3Qgenp6XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYWJzdCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJhYnN0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTphYnN0PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTphYnN0PjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2Fic3RyYWN0JyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDIxMSgpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBmaW5hbCBhYnN0XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYWJzdCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJhYnN0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTphYnN0PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTphYnN0PjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2Fic3RyYWN0JyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDIxMigpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBhYnN0cmFjdCBhYnN0XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYWJzdCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJhYnN0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTphYnN0PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImFic3QiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTphYnN0PjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2Fic3RyYWN0JyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDIxMygpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBzdGF0aWMgYWJzdFxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImFic3QiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiYWJzdCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6YWJzdD4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJhYnN0IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJhYnN0IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6YWJzdD47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnYWJzdHJhY3QnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjE0KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArCi0JCSIgICAgI1xuIiArCi0JCSIgICAgYWJzdFxuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJhYnN0IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImFic3QiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTphYnN0PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJhYnN0IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImFic3QiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmFic3Q+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdhYnN0cmFjdCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyMTYoKXsKLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICAjXG4iICsKLQkJIiAgICBhYnN0IHp6elxuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJhYnN0IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImFic3QiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTphYnN0PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJhYnN0IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImFic3QiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmFic3Q+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdicmVhaycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyMTcoKXsKLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICAjXG4iICsKLQkJIiAgICBicmVcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYnJlIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImJyZSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmJyZT4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAiYnJlIjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImJyZSI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6YnJlPjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnYnJlYWsnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjE4KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArCi0JCSIgICAgI1xuIiArCi0JCSIgICAgZm9yKGludCBpOyBpIDwgMTA7IGkrKykge1xuIiArCi0JCSIgICAgICBicmVcbiIgKwotCQkiICAgIH1cbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYnJlIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImJyZSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmJyZT4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAiYnJlIjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImJyZSI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICBpbnQgaTtcbiIgKwotCQkiICAgIHtcbiIgKwotCQkiICAgICAgPENvbXBsZXRlT25OYW1lOmJyZT47XG4iICsKLQkJIiAgICB9XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2Nhc2UnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjE5KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArCi0JCSIgICAgI1xuIiArCi0JCSIgICAgY2FzXG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNhcyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJjYXMiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpjYXM+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gImNhcyI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJjYXMiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmNhcz47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2Nhc2UnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjIwKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArCi0JCSIgICAgI1xuIiArCi0JCSIgICAgc3dpdGNoKDApIHtcbiIgKwotCQkiICAgICAgY2FzXG4iICsKLQkJIiAgICB9XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNhcyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJjYXMiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDpjYXM+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gImNhcyI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJjYXMiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAge1xuIiArCi0JCSIgICAgICA8Q29tcGxldGVPbktleXdvcmQ6Y2FzPjtcbiIgKwotCQkiICAgIH1cbiIrCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdjYXRjaCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyMjEoKXsKLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICAjXG4iICsKLQkJIiAgICBjYXRcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2F0IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImNhdCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmNhdD4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAiY2F0IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImNhdCI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6Y2F0PjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnY2F0Y2gnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjIyKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArCi0JCSIgICAgI1xuIiArCi0JCSIgICAgdHJ5IHtcbiIgKwotCQkiICAgIH0gY2F0XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNhdCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJjYXQiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDpjYXQ+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gImNhdCI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJjYXQiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25LZXl3b3JkOmNhdD47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2NsYXNzJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDIyMygpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJjbGEiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNsYSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJjbGEiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmNsYT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJjbGEiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImNsYSI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiaW1wb3J0IDxDb21wbGV0ZU9uS2V5d29yZDpjbGE+O1xuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnY2xhc3MnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjI0KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJInB1YmxpYyBjbGEiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNsYSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJjbGEiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmNsYT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJjbGEiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImNsYSI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiaW1wb3J0IDxDb21wbGV0ZU9uS2V5d29yZDpjbGE+O1xuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnY2xhc3MnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjI1KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJInB1YmxpYyBmaW5hbCBjbGEiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNsYSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJjbGEiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmNsYT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJjbGEiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImNsYSI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiaW1wb3J0IDxDb21wbGV0ZU9uS2V5d29yZDpjbGE+O1xuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnY2xhc3MnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjI2KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJInB1YmxpYyBmaW5hbCBjbGEgWCI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2xhIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImNsYSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbktleXdvcmQ6Y2xhPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImNsYSI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiY2xhIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJpbXBvcnQgPENvbXBsZXRlT25LZXl3b3JkOmNsYT47XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdjbGFzcycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyMjcoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIGNsYVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJjbGEiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiY2xhIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpjbGE+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiY2xhIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJjbGEiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6Y2xhPjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2NsYXNzJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDIyOCgpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIGNsYVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJjbGEiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiY2xhIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpjbGE+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiY2xhIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJjbGEiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6Y2xhPjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2NsYXNzJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDIyOSgpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIGZpbmFsIGNsYVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJjbGEiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiY2xhIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpjbGE+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiY2xhIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJjbGEiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6Y2xhPjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2NsYXNzJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDIzMCgpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIGZpbmFsIGNsYSBZXG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNsYSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJjbGEiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOmNsYT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJjbGEiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImNsYSI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpjbGE+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnY2xhc3MnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjMxKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICAjXG4iICsKLQkJIiAgICBjbGFcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNsYSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJjbGEiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6Y2xhPiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJjbGEiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiY2xhIjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6Y2xhPjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnY2xhc3MnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjMyKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICAjXG4iICsKLQkJIiAgICBmaW5hbCBjbGFcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNsYSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJjbGEiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6Y2xhPiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJjbGEiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiY2xhIjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6Y2xhPjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnY2xhc3MnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjMzKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICAjXG4iICsKLQkJIiAgICBmaW5hbCBjbGEgWVxuIiArCi0JCSIgIH1cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2xhIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImNsYSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpjbGE+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gImNsYSI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJjbGEiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpjbGE+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdjb250aW51ZScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyMzQoKXsKLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICAjXG4iICsKLQkJIiAgICBjb25cbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY29uIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImNvbiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmNvbj4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAiY29uIjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImNvbiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6Y29uPjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnY29udGludWUnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjM1KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArCi0JCSIgICAgI1xuIiArCi0JCSIgICAgZm9yKGludCBpOyBpIDwgNTsgaSsrKSB7XG4iICsKLQkJIiAgICAgIGNvblxuIiArCi0JCSIgICAgfVxuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJjb24iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiY29uIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6Y29uPiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJjb24iOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiY29uIjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIGludCBpO1xuIiArCi0JCSIgICAge1xuIiArCi0JCSIgICAgICA8Q29tcGxldGVPbk5hbWU6Y29uPjtcbiIgKwotCQkiICAgIH1cbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnZGVmYXVsdCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyMzYoKXsKLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICAjXG4iICsKLQkJIiAgICBkZWZcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZGVmIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImRlZiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmRlZj4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAiZGVmIjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImRlZiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6ZGVmPjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnZGVmYXVsdCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyMzcoKXsKLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICAjXG4iICsKLQkJIiAgICBzd2l0Y2goMCkge1xuIiArCi0JCSIgICAgICBjYXNlIDEgOiBicmVhaztcbiIgKwotCQkiICAgICAgZGVmXG4iICsKLQkJIiAgICB9XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImRlZiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJkZWYiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpkZWY+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gImRlZiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJkZWYiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAge1xuIiArCi0JCSIgICAgICA8Q29tcGxldGVPbk5hbWU6ZGVmPjtcbiIgKwotCQkiICAgIH1cbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnZG8nIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjM4KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArCi0JCSIgICAgI1xuIiArCi0JCSIgICAgZG9cbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZG8iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiZG8iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpkbz4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAiZG8iOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiZG8iOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmRvPjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnZWxzZScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyMzkoKXsKLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICAjXG4iICsKLQkJIiAgICBlbHNcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZWxzIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImVscyIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmVscz4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAiZWxzIjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImVscyI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6ZWxzPjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnZWxzZScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyNDAoKXsKLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICAjXG4iICsKLQkJIiAgICBpZih0cnVlKSB7XG4iICsKLQkJIiAgICB9IGVsc1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJlbHMiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiZWxzIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6ZWxzPiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJlbHMiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiZWxzIjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTplbHM+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdleHRlbmRzJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDI0MSgpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJleHQiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImV4dCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJleHQiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiZXh0IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJleHQiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJIiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2V4dGVuZHMnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjQyKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJIlggZXh0IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJleHQiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiZXh0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImV4dCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiZXh0IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSIiOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdleHRlbmRzJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDI0MygpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJleHQgWSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZXh0IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImV4dCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJleHQiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImV4dCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnZXh0ZW5kcycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyNDQoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkiY2xhc3MgWCBleHQiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImV4dCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJleHQiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmV4dD4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJleHQiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImV4dCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiY2xhc3MgWCBleHRlbmRzIDxDb21wbGV0ZU9uS2V5d29yZDpleHQ+IHtcbiIgKwotCQkiICBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnZXh0ZW5kcycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyNDUoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkiY2xhc3MgWCBleHQgWSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZXh0IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImV4dCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbktleXdvcmQ6ZXh0PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImV4dCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiZXh0IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJjbGFzcyBYIGV4dGVuZHMgPENvbXBsZXRlT25LZXl3b3JkOmV4dD4ge1xuIiArCi0JCSIgIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdleHRlbmRzJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDI0NigpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJjbGFzcyBYIGV4dCBZIHsiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImV4dCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJleHQiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmV4dD4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJleHQiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImV4dCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiY2xhc3MgWCBleHRlbmRzIDxDb21wbGV0ZU9uS2V5d29yZDpleHQ+IHtcbiIgKwotCQkiICB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdleHRlbmRzJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDI0NygpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJjbGFzcyBYIGV4dGVuZHMgWSBleHQiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImV4dCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJleHQiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmV4dD4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJleHQiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImV4dCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiY2xhc3MgWCBleHRlbmRzIDxDb21wbGV0ZU9uS2V5d29yZDpleHQ+IHtcbiIgKwotCQkiICBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnZXh0ZW5kcycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyNDgoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkiY2xhc3MgWCBpbXBsZW1lbnRzIFkgZXh0IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJleHQiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiZXh0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImV4dCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiZXh0IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJjbGFzcyBYIGltcGxlbWVudHMgWSB7XG4iICsKLQkJIiAgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ZpbmFsbHknIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjQ5KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArCi0JCSIgICAgI1xuIiArCi0JCSIgICAgZmluIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmaW4iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiZmluIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6ZmluPiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJmaW4iOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiZmluIjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpmaW4+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdmaW5hbGx5JyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDI1MCgpewotCVN0cmluZyBzdHIgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKwotCQkiICAgICNcbiIgKwotCQkiICAgIHRyeSB7IiArCi0JCSIgICAgfSBmaW4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZpbiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJmaW4iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDpmaW4+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gImZpbiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJmaW4iOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25LZXl3b3JkOmZpbj47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2Zvcicga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyNTEoKXsKLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICAjXG4iICsKLQkJIiAgICBmb3IiICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZvciI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJmb3IiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpmb3I+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gImZvciI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJmb3IiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmZvcj47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2lmJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDI1MigpewotCVN0cmluZyBzdHIgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKwotCQkiICAgICNcbiIgKwotCQkiICAgIGlmIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpZiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJpZiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmlmPiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJpZiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJpZiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6aWY+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdzd2l0Y2gnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjUzKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArCi0JCSIgICAgI1xuIiArCi0JCSIgICAgc3dpIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJzd2kiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigic3dpIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6c3dpPiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJzd2kiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAic3dpIjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpzd2k+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdpbXBsZW1lbnRzJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDI1NCgpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJpbXBsIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbXBsIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImltcGwiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiaW1wbCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaW1wbCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnaW1wbGVtZW50cycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyNTUoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkiWCBpbXBsIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbXBsIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImltcGwiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiaW1wbCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaW1wbCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnaW1wbGVtZW50cycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyNTYoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkiaW1wbCBZIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbXBsIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImltcGwiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiaW1wbCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaW1wbCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnaW1wbGVtZW50cycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyNTcoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkiY2xhc3MgWCBpbXBsIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbXBsIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImltcGwiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmltcGw+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiaW1wbCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaW1wbCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiY2xhc3MgWCBleHRlbmRzIDxDb21wbGV0ZU9uS2V5d29yZDppbXBsPiB7XG4iICsKLQkJIiAgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ltcGxlbWVudHMnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjU4KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJImNsYXNzIFggaW1wbCBZIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbXBsIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImltcGwiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmltcGw+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiaW1wbCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaW1wbCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiY2xhc3MgWCBleHRlbmRzIDxDb21wbGV0ZU9uS2V5d29yZDppbXBsPiB7XG4iICsKLQkJIiAgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ltcGxlbWVudHMnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjU5KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJImNsYXNzIFggaW1wbCBZIHsiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImltcGwiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiaW1wbCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbktleXdvcmQ6aW1wbD4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJpbXBsIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJpbXBsIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJjbGFzcyBYIGV4dGVuZHMgPENvbXBsZXRlT25LZXl3b3JkOmltcGw+IHtcbiIgKwotCQkiICB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdpbXBsZW1lbnRzJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDI2MCgpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJjbGFzcyBYIGV4dGVuZHMgWSBpbXBsIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbXBsIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImltcGwiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmltcGw+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiaW1wbCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaW1wbCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiY2xhc3MgWCBleHRlbmRzIDxDb21wbGV0ZU9uS2V5d29yZDppbXBsPiB7XG4iICsKLQkJIiAgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ltcGxlbWVudHMnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjYxKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJImNsYXNzIFggaW1wbGVtZW50cyBZIGltcGwiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImltcGwiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiaW1wbCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJpbXBsIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJpbXBsIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJjbGFzcyBYIGltcGxlbWVudHMgWSB7XG4iICsKLQkJIiAgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ltcG9ydCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyNjIoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkiaW1wbyI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW1wbyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJpbXBvIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDppbXBvPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImltcG8iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImltcG8iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJImltcG9ydCA8Q29tcGxldGVPbktleXdvcmQ6aW1wbz47XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdpbXBvcnQnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjYzKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJInBhY2thZ2UgcDtcbiIgKwotCQkiaW1wbyI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW1wbyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJpbXBvIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDppbXBvPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImltcG8iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImltcG8iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkiaW1wb3J0IDxDb21wbGV0ZU9uS2V5d29yZDppbXBvPjtcbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ltcG9ydCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyNjQoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicGFja2FnZSBwO1xuIiArCi0JCSJpbXBvcnQgcDIuWTtcbiIgKwotCQkiaW1wbyI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW1wbyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJpbXBvIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDppbXBvPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImltcG8iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImltcG8iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkiaW1wb3J0IHAyLlk7XG4iICsKLQkJImltcG9ydCA8Q29tcGxldGVPbktleXdvcmQ6aW1wbz47XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdpbXBvcnQnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjY1KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJImltcG8gcDIuWSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW1wbyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJpbXBvIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDppbXBvPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImltcG8iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImltcG8iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJImltcG9ydCA8Q29tcGxldGVPbktleXdvcmQ6aW1wbz47XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdpbnRlcmZhY2UnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjY2KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJImludCI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW50IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImludCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbktleXdvcmQ6aW50PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImludCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaW50IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJpbXBvcnQgPENvbXBsZXRlT25LZXl3b3JkOmludD47XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdpbnRlcmZhY2UnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjY3KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJInB1YmxpYyBpbnQiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImludCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJpbnQiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmludD4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJpbnQiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImludCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiaW1wb3J0IDxDb21wbGV0ZU9uS2V5d29yZDppbnQ+O1xuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnaW50ZXJmYWNlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDI2OCgpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwdWJsaWMgYWJzdHJhY3QgaW50IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbnQiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiaW50IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDppbnQ+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiaW50IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJpbnQiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJImltcG9ydCA8Q29tcGxldGVPbktleXdvcmQ6aW50PjtcbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ludGVyZmFjZScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyNjkoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicHVibGljIGFic3RyYWN0IGludCBYIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbnQiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiaW50IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDppbnQ+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiaW50IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJpbnQiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJImltcG9ydCA8Q29tcGxldGVPbktleXdvcmQ6aW50PjtcbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ludGVyZmFjZScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyNzAoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIGludFxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbnQiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiaW50IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTppbnQ+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiaW50IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJpbnQiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6aW50PjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ludGVyZmFjZScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyNzEoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBpbnRcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW50IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImludCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6aW50PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImludCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaW50IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOmludD47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdpbnRlcmZhY2UnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjcyKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgYWJzdHJhY3QgaW50XG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImludCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJpbnQiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOmludD4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJpbnQiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImludCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTppbnQ+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnaW50ZXJmYWNlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDI3MygpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIGFic3RyYWN0IGludCBZXG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImludCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJpbnQiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOmludD4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJpbnQiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImludCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTppbnQ+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnaW50ZXJmYWNlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDI3NCgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgI1xuIiArCi0JCSIgICAgaW50XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbnQiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiaW50IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmludD4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAiaW50IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImludCI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmludD47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ludGVyZmFjZScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyNzUoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgICNcbiIgKwotCQkiICAgIGFic3RyYWN0IGludFxuIiArCi0JCSIgIH1cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW50IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImludCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTppbnQ+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gImludCI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJpbnQiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTppbnQ+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdpbnRlcmZhY2UnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjc2KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICAjXG4iICsKLQkJIiAgICBhYnN0cmFjdCBpbnQgWVxuIiArCi0JCSIgIH1cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW50IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImludCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTppbnQ+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gImludCI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJpbnQiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTppbnQ+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdpbnRlcmZhY2UnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjc3KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJInB1YmxpYyBmaW5hbCBpbnQiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImludCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJpbnQiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiaW50IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJpbnQiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJIiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ludGVyZmFjZScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyNzgoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicHVibGljIGZpbmFsIGludCBYIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbnQiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiaW50IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImludCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaW50IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSIiOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdwYWNrYWdlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDI3OSgpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwYWMiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInBhYyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJwYWMiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOnBhYz4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwYWMiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInBhYyI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiaW1wb3J0IDxDb21wbGV0ZU9uS2V5d29yZDpwYWM+O1xuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAncGFja2FnZScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyODAoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicGFjIHAiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInBhYyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJwYWMiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOnBhYz4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwYWMiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInBhYyI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiaW1wb3J0IDxDb21wbGV0ZU9uS2V5d29yZDpwYWM+O1xuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAncGFja2FnZScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyODEoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicGFja2FnZSBwOyIgKwotCQkicGFjIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJwYWMiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigicGFjIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInBhYyI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicGFjIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdwYWNrYWdlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MjgyKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJImltcG9ydCBwOyIgKwotCQkicGFjIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJwYWMiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigicGFjIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInBhYyI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicGFjIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJpbXBvcnQgcDtcbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3BhY2thZ2UnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjgzKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJImNsYXNzIFgge30iICsKLQkJInBhYyI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicGFjIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInBhYyIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwYWMiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInBhYyI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiY2xhc3MgWCB7XG4iICsKLQkJIiAgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3JldHVybicga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyODQoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBpbnQgZm9vKCkge1xuIiArCi0JCSIgICAgI1xuIiArCi0JCSIgICAgcmV0XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJyZXQiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigicmV0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIGludCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6cmV0PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJyZXQiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicmV0IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgaW50IGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpyZXQ+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICd0aHJvdycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyODUoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgICNcbiIgKwotCQkiICAgIHRoclxuIiArCi0JCSIgIH1cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidGhyIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInRociIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTp0aHI+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gInRociI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ0aHIiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTp0aHI+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICd0cnknIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjg2KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICAjXG4iICsKLQkJIiAgICB0cnlcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRyeSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJ0cnkiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6dHJ5PiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ0cnkiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidHJ5IjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6dHJ5PjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAndHJ5JyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDI4NygpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgI1xuIiArCi0JCSIgICAgaWYodHJ5XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ0cnkiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigidHJ5IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnRyeT4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAidHJ5IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInRyeSI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOnRyeT47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2RvJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDI4OCgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgI1xuIiArCi0JCSIgICAgaWYoZG9cbiIgKwotCQkiICB9XG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImRvIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImRvIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmRvPiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJkbyI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJkbyI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmRvPjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnZm9yJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDI4OSgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgI1xuIiArCi0JCSIgICAgaWYoZm9yXG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmb3IiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiZm9yIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmZvcj4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAiZm9yIjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImZvciI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmZvcj47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2lmJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDI5MCgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgI1xuIiArCi0JCSIgICAgaWYoaWZcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImlmIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImlmIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmlmPiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJpZiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJpZiI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmlmPjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnc3dpdGNoJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDI5MSgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgI1xuIiArCi0JCSIgICAgaWYoc3dpXG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJzd2kiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigic3dpIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnN3aT4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAic3dpIjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInN3aSI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOnN3aT47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ25ldycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyOTIoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgICNcbiIgKwotCQkiICAgIG5ld1xuIiArCi0JCSIgIH1cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibmV3IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoIm5ldyIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpuZXc+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gIm5ldyI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJuZXciOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpuZXc+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICduZXcnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjkzKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICAjXG4iICsKLQkJIiAgICBuZXcgWFxuIiArCi0JCSIgIH1cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibmV3IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoIm5ldyIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpuZXc+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gIm5ldyI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJuZXciOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpuZXc+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICduZXcnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjk0KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICAjXG4iICsKLQkJIiAgICBuZXcgWCgpXG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuZXciOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigibmV3IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOm5ldz4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAibmV3IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIm5ldyI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOm5ldz47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3Rocm93cycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyOTUoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCkgdGhyXG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ0aHIiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigidGhyIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDp0aHI+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAidGhyIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ0aHIiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB0aHJvd3MgPENvbXBsZXRlT25LZXl3b3JkOnRocj4ge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAndGhyb3dzJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDI5NigpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKSB0aHIge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidGhyIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInRociIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbktleXdvcmQ6dGhyPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInRociI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidGhyIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkgdGhyb3dzIDxDb21wbGV0ZU9uS2V5d29yZDp0aHI+IHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3Rocm93cycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyOTcoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCkgdGhyIEUge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidGhyIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInRociIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbktleXdvcmQ6dGhyPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInRociI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidGhyIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkgdGhyb3dzIDxDb21wbGV0ZU9uS2V5d29yZDp0aHI+IHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3Rocm93cycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyOTgoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCkgdGhyb3dzIEUgdGhyXG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ0aHIiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigidGhyIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInRociI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidGhyIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkgdGhyb3dzIEUge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAndGhyb3dzJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDI5OSgpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgWCgpIHRoclxuIiArCi0JCSIgIH1cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidGhyIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInRociIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbktleXdvcmQ6dGhyPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInRociI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidGhyIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgWCgpIHRocm93cyA8Q29tcGxldGVPbktleXdvcmQ6dGhyPiB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICd0aHJvd3MnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzAwKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBpbnQgZm9vKClbXSB0aHJcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRociI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJ0aHIiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOnRocj4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ0aHIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInRociI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICBpbnRbXSBmb28oKSB0aHJvd3MgPENvbXBsZXRlT25LZXl3b3JkOnRocj4ge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnd2hpbGUnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzAxKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICAjXG4iICsKLQkJIiAgICB3aGlcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIndoaSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJ3aGkiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6d2hpPiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ3aGkiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAid2hpIjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6d2hpPjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnd2hpbGUnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzAyKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICAjXG4iICsKLQkJIiAgICBpZih3aGlcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIndoaSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJ3aGkiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6d2hpPiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ3aGkiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAid2hpIjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6d2hpPjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnYXNzZXJ0JyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDMwMygpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgI1xuIiArCi0JCSIgICAgYXNzXG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJhc3MiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiYXNzIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmFzcz4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAiYXNzIjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImFzcyI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmFzcz47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2Fzc2VydCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAzMDQoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgICNcbiIgKwotCQkiICAgIGlmKGFzc1xuIiArCi0JCSIgIH1cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYXNzIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImFzcyIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTphc3M+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gImFzcyI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJhc3MiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTphc3M+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdmaW5hbCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAzMDUoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkiZmluIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmaW4iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiZmluIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDpmaW4+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiZmluIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJmaW4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJImltcG9ydCA8Q29tcGxldGVPbktleXdvcmQ6ZmluPjtcbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ZpbmFsJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDMwNigpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwdWJsaWMgZmluIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmaW4iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiZmluIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDpmaW4+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiZmluIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJmaW4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJImltcG9ydCA8Q29tcGxldGVPbktleXdvcmQ6ZmluPjtcbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ZpbmFsJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDMwNygpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJmaW4genp6IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmaW4iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiZmluIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uS2V5d29yZDpmaW4+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiZmluIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJmaW4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJImltcG9ydCA8Q29tcGxldGVPbktleXdvcmQ6ZmluPjtcbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ZpbmFsJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDMwOCgpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJmaW5hbCBmaW4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZpbiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJmaW4iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiZmluIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJmaW4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJIiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ZpbmFsJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDMwOSgpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJhYnN0cmFjdCBmaW4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZpbiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJmaW4iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiZmluIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJmaW4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJIiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ZpbmFsJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDMxMCgpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwdWJsaWMgZmluIGNsYXNzIFgge30iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZpbiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJmaW4iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmZpbj4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJmaW4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImZpbiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiaW1wb3J0IDxDb21wbGV0ZU9uS2V5d29yZDpmaW4+O1xuIiArCi0JCSJjbGFzcyBYIHtcbiIgKwotCQkiICBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnZmluYWwnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzExKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBmaW5cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZmluIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImZpbiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6ZmluPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImZpbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiZmluIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOmZpbj47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdmaW5hbCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAzMTIoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBmaW5cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZmluIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImZpbiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6ZmluPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImZpbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiZmluIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOmZpbj47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdmaW5hbCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAzMTMoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIGZpbiB6enpcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZmluIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImZpbiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6ZmluPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImZpbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiZmluIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOmZpbj47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdmaW5hbCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAzMTQoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIGZpbmFsIGZpblxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmaW4iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiZmluIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpmaW4+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiZmluIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJmaW4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6ZmluPjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ZpbmFsJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDMxNSgpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgYWJzdHJhY3QgZmluXG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZpbiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJmaW4iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOmZpbj4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJmaW4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImZpbiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpmaW4+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnbmF0aXZlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDMxNigpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgbmF0XG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIm5hdCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJuYXQiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOm5hdD4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJuYXQiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIm5hdCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpuYXQ+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnbmF0aXZlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDMxNygpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIG5hdFxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuYXQiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigibmF0IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpuYXQ+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAibmF0IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJuYXQiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6bmF0PjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ25hdGl2ZScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAzMTgoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHRyYW5zaWVudCBuYXRcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibmF0IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoIm5hdCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6bmF0PiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIm5hdCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAibmF0IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOm5hdD47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICduYXRpdmUnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzE5KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB0cmFuc2llbnQgbmF0XG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIm5hdCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJuYXQiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOm5hdD4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJuYXQiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIm5hdCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpuYXQ+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnbmF0aXZlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDMyMCgpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9sYXRpbGUgbmF0XG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIm5hdCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJuYXQiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOm5hdD4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJuYXQiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIm5hdCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpuYXQ+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnc3RyaWN0ZnAnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzIxKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBzdHJcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3RyIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInN0ciIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6c3RyPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInN0ciI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAic3RyIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnN0cj47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdzdHJpY3RmcCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAzMjIoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBzdHJcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3RyIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInN0ciIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6c3RyPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInN0ciI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAic3RyIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnN0cj47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdzdHJpY3RmcCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAzMjMoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHRyYW5zaWVudCBzdHJcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3RyIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInN0ciIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6c3RyPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInN0ciI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAic3RyIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnN0cj47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdzdHJpY3RmcCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAzMjQoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHRyYW5zaWVudCBzdHJcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3RyIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInN0ciIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6c3RyPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInN0ciI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAic3RyIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnN0cj47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdzdHJpY3RmcCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAzMjUoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvbGF0aWxlIHN0clxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJzdHIiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigic3RyIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpzdHI+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAic3RyIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJzdHIiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6c3RyPjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3ZvbGF0aWxlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDMyNigpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9sXG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInZvbCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJ2b2wiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOnZvbD4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ2b2wiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInZvbCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTp2b2w+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAndm9sYXRpbGUnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzI3KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgdm9sXG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInZvbCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJ2b2wiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOnZvbD4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ2b2wiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInZvbCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTp2b2w+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAndm9sYXRpbGUnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzI4KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB0cmFuc2llbnQgdm9sXG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInZvbCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJ2b2wiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOnZvbD4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ2b2wiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInZvbCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTp2b2w+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAndm9sYXRpbGUnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzI5KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2xhdGlsZSB2b2xcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidm9sIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInZvbCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6dm9sPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInZvbCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidm9sIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnZvbD47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICd2b2xhdGlsZScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAzMzAoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIG5hdGl2ZSB2b2xcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidm9sIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInZvbCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6dm9sPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInZvbCI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidm9sIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnZvbD47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICd0cmFuc2llbnQnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzMxKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB0cmFcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidHJhIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInRyYSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6dHJhPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInRyYSI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidHJhIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnRyYT47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICd0cmFuc2llbnQnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzMyKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgdHJhXG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRyYSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJ0cmEiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOnRyYT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ0cmEiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInRyYSI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTp0cmE+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAndHJhbnNpZW50JyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDMzMygpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdHJhbnNpZW50IHRyYVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ0cmEiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigidHJhIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTp0cmE+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAidHJhIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ0cmEiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6dHJhPjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3RyYW5zaWVudCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAzMzQoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvbGF0aWxlIHRyYVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ0cmEiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigidHJhIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTp0cmE+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAidHJhIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ0cmEiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6dHJhPjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3RyYW5zaWVudCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAzMzUoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIG5hdGl2ZSB0cmFcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidHJhIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInRyYSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6dHJhPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInRyYSI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidHJhIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnRyYT47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdzeW5jaHJvbml6ZWQnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzM2KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBzeW5cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3luIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInN5biIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6c3luPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInN5biI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAic3luIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnN5bj47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdzeW5jaHJvbml6ZWQnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzM3KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgc3luXG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInN5biI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJzeW4iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOnN5bj4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJzeW4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInN5biI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpzeW4+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnc3luY2hyb25pemVkJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDMzOCgpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdHJhbnNpZW50IHN5blxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJzeW4iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigic3luIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpzeW4+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAic3luIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJzeW4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6c3luPjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3N5bmNocm9uaXplZCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAzMzkoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHRyYW5zaWVudCBzeW5cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3luIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInN5biIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6c3luPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInN5biI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAic3luIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnN5bj47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdzeW5jaHJvbml6ZWQnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzQwKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2xhdGlsZSBzeW5cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3luIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInN5biIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6c3luPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInN5biI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAic3luIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnN5bj47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdzeW5jaHJvbml6ZWQnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzQxKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICAjXG4iICsKLQkJIiAgICBzeW5cbiIgKwotCQkiICB9XG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInN5biI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJzeW4iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6c3luPiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJzeW4iOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAic3luIjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6c3luPjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnc3luY2hyb25pemVkJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDM0MigpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgI1xuIiArCi0JCSIgICAgaWYoc3luXG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJzeW4iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigic3luIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnN5bj4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAic3luIjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInN5biI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOnN5bj47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3N0YXRpYycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAzNDMoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHN0YVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJzdGEiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigic3RhIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpzdGE+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAic3RhIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJzdGEiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6c3RhPjtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3N0YXRpYycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAzNDQoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBzdGFcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3RhIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInN0YSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6c3RhPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInN0YSI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAic3RhIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnN0YT47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdwdWJsaWMnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzQ1KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJInB1YiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHViIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInB1YiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbktleXdvcmQ6cHViPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInB1YiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicHViIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJpbXBvcnQgPENvbXBsZXRlT25LZXl3b3JkOnB1Yj47XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdwdWJsaWMnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzQ2KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJImZpbmFsIHB1YiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHViIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInB1YiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbktleXdvcmQ6cHViPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInB1YiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicHViIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJpbXBvcnQgPENvbXBsZXRlT25LZXl3b3JkOnB1Yj47XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdwdWJsaWMnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzQ3KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJInB1YmxpYyBwdWIiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInB1YiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJwdWIiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAicHViIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJwdWIiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJIiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3B1YmxpYycga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAzNDgoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicHJpdmF0ZSBwdWIiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInB1YiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJwdWIiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOnB1Yj4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwdWIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInB1YiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiaW1wb3J0IDxDb21wbGV0ZU9uS2V5d29yZDpwdWI+O1xuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAncHVibGljJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDM0OSgpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWHt9XG4iICsKLQkJInB1YiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHViIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInB1YiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwdWIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInB1YiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAncHVibGljJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDM1MCgpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWHtcbiIgKwotCQkiICBwdWJcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHViIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInB1YiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6cHViPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInB1YiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicHViIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnB1Yj47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdwdWJsaWMnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzUxKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJInB1YmxpYyBjbGFzcyBYe1xuIiArCi0JCSIgIHB1YmxpYyBwdWJcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHViIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInB1YiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6cHViPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInB1YiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicHViIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnB1Yj47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdwdWJsaWMnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzUyKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJInB1YmxpYyBjbGFzcyBYe1xuIiArCi0JCSIgIHByaXZhdGUgcHViXG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInB1YiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJwdWIiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOnB1Yj4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwdWIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInB1YiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpwdWI+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAncHVibGljJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDM1MygpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWHtcbiIgKwotCQkiICBwcm90ZWN0ZWQgcHViXG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInB1YiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJwdWIiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOnB1Yj4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwdWIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInB1YiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpwdWI+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAncHVibGljJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDM1NCgpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWHtcbiIgKwotCQkiICBhYnN0cmFjdCBwdWJcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHViIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInB1YiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6cHViPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInB1YiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicHViIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnB1Yj47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdwcm90ZWN0ZWQnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzU1KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJInBybyI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHJvIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoIiIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAncHJvdGVjdGVkJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDM1NigpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJmaW5hbCBwcm8iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInBybyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJwcm8iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAicHJvIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJwcm8iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJIiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3Byb3RlY3RlZCcga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAzNTcoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicHVibGljIHBybyI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHJvIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInBybyIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwcm8iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInBybyI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAncHJvdGVjdGVkJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDM1OCgpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwcml2YXRlIHBybyI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHJvIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInBybyIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwcm8iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInBybyI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAncHJvdGVjdGVkJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDM1OSgpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWHt9XG4iICsKLQkJInBybyI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHJvIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInBybyIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwcm8iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInBybyI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAncHJvdGVjdGVkJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDM2MCgpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWHtcbiIgKwotCQkiICBwcm9cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHJvIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInBybyIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6cHJvPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInBybyI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicHJvIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnBybz47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdwcm90ZWN0ZWQnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzYxKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJInB1YmxpYyBjbGFzcyBYe1xuIiArCi0JCSIgIHB1YmxpYyBwcm9cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHJvIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInBybyIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6cHJvPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInBybyI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicHJvIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnBybz47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdwcm90ZWN0ZWQnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzYyKCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJInB1YmxpYyBjbGFzcyBYe1xuIiArCi0JCSIgIHByaXZhdGUgcHJvXG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInBybyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJwcm8iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOnBybz4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwcm8iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInBybyI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpwcm8+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAncHJvdGVjdGVkJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDM2MygpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWHtcbiIgKwotCQkiICBwcm90ZWN0ZWQgcHJvXG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInBybyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJwcm8iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOnBybz4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwcm8iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInBybyI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpwcm8+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAncHJvdGVjdGVkJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDM2NCgpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWHtcbiIgKwotCQkiICBhYnN0cmFjdCBwcm9cbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHJvIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInBybyIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6cHJvPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInBybyI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicHJvIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnBybz47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdwcml2YXRlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDM2NSgpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwcmkiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInByaSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCIiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJIiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3ByaXZhdGUnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzY2KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJImZpbmFsIHByaSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHJpIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInByaSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwcmkiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInByaSI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAncHJpdmF0ZScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAzNjcoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicHVibGljIHByaSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHJpIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInByaSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwcmkiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInByaSI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAncHJpdmF0ZScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAzNjgoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicHJpdmF0ZSBwcmkiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInByaSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJwcmkiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAicHJpIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJwcmkiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJIiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3ByaXZhdGUnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzY5KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSIjXG4iICsKLQkJInB1YmxpYyBjbGFzcyBYe31cbiIgKwotCQkicHJpIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJwcmkiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigicHJpIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInByaSI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicHJpIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdwcml2YXRlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDM3MCgpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWHtcbiIgKwotCQkiICBwcmlcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHJpIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInByaSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6cHJpPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInByaSI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicHJpIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnByaT47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdwcml2YXRlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDM3MSgpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWHtcbiIgKwotCQkiICBwdWJsaWMgcHJpXG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInByaSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJwcmkiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOnByaT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwcmkiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInByaSI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpwcmk+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAncHJpdmF0ZScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAzNzIoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicHVibGljIGNsYXNzIFh7XG4iICsKLQkJIiAgcHJpdmF0ZSBwcmlcbiIgKwotCQkifSI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHJpIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoInByaSIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6cHJpPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInByaSI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicHJpIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOnByaT47XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdwcml2YXRlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDM3MygpewotCVN0cmluZyBzdHIgPQotCQkiI1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWHtcbiIgKwotCQkiICBwcm90ZWN0ZWQgcHJpXG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInByaSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJwcmkiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOnByaT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwcmkiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInByaSI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpwcmk+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAncHJpdmF0ZScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAzNzQoKXsKLQlTdHJpbmcgc3RyID0KLQkJIiNcbiIgKwotCQkicHVibGljIGNsYXNzIFh7XG4iICsKLQkJIiAgYWJzdHJhY3QgcHJpXG4iICsKLQkJIn0iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInByaSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJwcmkiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOnByaT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwcmkiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInByaSI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpwcmk+O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnc3VwZXInIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzc1KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKwotCQkiICAgICNcbiIgKwotCQkiICAgIHN1cFxuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJzdXAiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigic3VwIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnN1cD4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAic3VwIjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInN1cCI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOnN1cD47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3RoaXMnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzc2KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKwotCQkiICAgICNcbiIgKwotCQkiICAgIHRoaVxuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ0aGkiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigidGhpIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnRoaT4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAidGhpIjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInRoaSI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOnRoaT47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ3RydWUnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzc3KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKwotCQkiICAgICNcbiIgKwotCQkiICAgIHRydVxuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ0cnUiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigidHJ1IikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnRydT4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAidHJ1IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInRydSI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOnRydT47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ZhbHNlJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDM3OCgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICAjXG4iICsKLQkJIiAgICBmYWxcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZmFsIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImZhbCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpmYWw+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gImZhbCI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJmYWwiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpmYWw+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdudWxsJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDM3OSgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICAjXG4iICsKLQkJIiAgICBudWxcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibnVsIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoIm51bCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpudWw+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gIm51bCI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJudWwiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpudWw+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICdpbnN0YW5jZW9mJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDM4MCgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICAjXG4iICsKLQkJIiAgICBpZih6enogaW5zXG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImlucyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJpbnMiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbktleXdvcmQ6aW5zPiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJpbnMiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaW5zIjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbktleXdvcmQ6aW5zPjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnaW5zdGFuY2VvZicga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAzODEoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArCi0JCSIgICAgI1xuIiArCi0JCSIgICAgaW5zXG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImlucyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJpbnMiKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6aW5zPiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJpbnMiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiaW5zIjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6aW5zPjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnaW5zdGFuY2VvZicga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAzODIoKXsKLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArCi0JCSIgICAgI1xuIiArCi0JCSIgICAgaWYoenp6IHp6eiBpbnNcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW5zIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImlucyIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTppbnM+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gImlucyI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJpbnMiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIHp6eiB6eno7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6aW5zPjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnd2hpbGUnIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzg0KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICAjXG4iICsKLQkJIiAgICBkb3tcbiIgKwotCQkiICAgIH0gd2hpXG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ3aGkiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigid2hpIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOndoaT4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAid2hpIjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIndoaSI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25LZXl3b3JkOndoaT47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2NhdGNoJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDM4NSgpewotCVN0cmluZyBzdHIgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oKXtcbiIgKwotCQkiICAgICNcbiIgKwotCQkiICAgIHRyeSB7XG4iICsKLQkJIiAgICB9IGNhdGNoKEUgZSkge1xuIiArCi0JCSIgICAgfSBjYXRcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2F0IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoImNhdCIpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOmNhdD4iOwotCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JY29tcGxldGlvbklkZW50aWZpZXIgPSAiY2F0IjsKLQlleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImNhdCI7Ci0JZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6Y2F0PjtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZnVsbCBhc3QiKTsKLX0KLS8qCi0gKiBUZXN0IGZvciAnZmluYWxseScga2V5d29yZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAzODYoKXsKLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICAjXG4iICsKLQkJIiAgICB0cnkgeyIgKwotCQkiICAgIH0gY2F0Y2goRSBlKSB7IiArCi0JCSIgICAgfSBmaW4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZpbiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKCJmaW4iKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICI8Tk9ORT4iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0KLQljaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksCi0JCWN1cnNvckxvY2F0aW9uLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImRpZXQgYXN0Iik7Ci0JCi0JZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTmFtZTpmaW4+IjsKLQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZyA9ICI8Tk9ORT4iOwotCWNvbXBsZXRpb25JZGVudGlmaWVyID0gImZpbiI7Ci0JZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJmaW4iOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmZpbj47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci0vKgotICogVGVzdCBmb3IgJ2ZpbmFsbHknIGtleXdvcmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzg3KCl7Ci0JU3RyaW5nIHN0ciA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpe1xuIiArCi0JCSIgICAgI1xuIiArCi0JCSIgICAgdHJ5IHsiICsKLQkJIiAgICB9IGZpbmFsbHkgeyIgKwotCQkiICAgIH0gZmluIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmaW4iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigiZmluIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLAotCQljdXJzb3JMb2NhdGlvbiwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJkaWV0IGFzdCIpOwotCQotCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6ZmluPiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJmaW4iOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiZmluIjsKLQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpmaW4+O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQljaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFBhcmVudE5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCSJmdWxsIGFzdCIpOwotfQotLyoKLSAqIFRlc3QgZm9yICd0aGlzJyBrZXl3b3JkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDM4OCgpewotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsKLQkJIiAgICAjXG4iICsKLQkJIiAgICBYLnRoaVxuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ0aGkiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZigidGhpIikgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nID0gIjxOT05FPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIjxOT05FPiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiPE5PTkU+IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQotCWNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwKLQkJY3Vyc29yTG9jYXRpb24sCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQkiZGlldCBhc3QiKTsKLQkKLQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOlgudGhpPiI7Ci0JZXhwZWN0ZWRQYXJlbnROb2RlVG9TdHJpbmcgPSAiPE5PTkU+IjsKLQljb21wbGV0aW9uSWRlbnRpZmllciA9ICJ0aGkiOwotCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiWC50aGkiOwotCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpYLnRoaT47XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCQotCWNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkUGFyZW50Tm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJImZ1bGwgYXN0Iik7Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL0NvbXBsZXRpb25SZWNvdmVyeVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvQ29tcGxldGlvblJlY292ZXJ5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmViZGE4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvQ29tcGxldGlvblJlY292ZXJ5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyLnBhcnNlcjsKLQotcHVibGljIGNsYXNzIENvbXBsZXRpb25SZWNvdmVyeVRlc3QgZXh0ZW5kcyBBYnN0cmFjdENvbXBsZXRpb25UZXN0IHsKLXB1YmxpYyBDb21wbGV0aW9uUmVjb3ZlcnlUZXN0KFN0cmluZyB0ZXN0TmFtZSl7Ci0Jc3VwZXIodGVzdE5hbWUpOwotfQotLyoKLSAqIENvbXBsZXRlIG9uIHZhcmlhYmxlIGJlaGluZCBpbGwtZm9ybWVkIGRlY2xhcmF0aW9uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMSgpIHsKLQotCVN0cmluZyBzdHIgPSAKLQkJImltcG9ydCBqYXZhLmlvLio7CQkJCQkJCVxuIiArIAotCQkiCQkJCQkJCQkJCQlcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgSU9FeGNlcHRpb24gewkJXG4iICsKLQkJIglpbnQgZm9vKCl7CQkJCQkJCQlcbiIgKwotCQkiCQlTdHJpbmcgc3RyID0gOwkJCQkJCVxuIiArCi0JCSIJCXN0ci4JCQkJCQkJCVxuIjsgCi0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3RyLiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6c3RyLj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICIiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJImltcG9ydCBqYXZhLmlvLio7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIElPRXhjZXB0aW9uIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgICBTdHJpbmcgc3RyO1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpzdHIuPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJzdHIuIjsKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIHZhcmlhYmxlIGJlaGluZCBpbGwtZm9ybWVkIGRlY2xhcmF0aW9uPiI7Ci0KLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JdGhpcy5jaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBDb21wbGV0ZSBvbiB2YXJpYWJsZSBiZWhpbmQgaWxsLWZvcm1lZCBkZWNsYXJhdGlvbiBhbmQgbmVzdGVkIGJsb2NrCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMigpIHsKLQotCVN0cmluZyBzdHIgPSAKLQkJImltcG9ydCBqYXZhLmlvLio7CQkJCQkJCVxuIiArIAotCQkiCQkJCQkJCQkJCQlcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgSU9FeGNlcHRpb24gewkJXG4iICsKLQkJIglpbnQgZm9vKCl7CQkJCQkJCQlcbiIgKwotCQkiCQlTdHJpbmcgc3RyID0gOwkJCQkJCVxuIiArCi0JCSIJCXsJCQkJCQkJCQlcbiIgKwotCQkiCQkgCWludCBpOwkJCQkJCQlcbiIgKwotCQkiCQkJc3RyLgkJCQkJCQlcbiI7IAotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInN0ci4iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnN0ci4+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJpbXBvcnQgamF2YS5pby4qO1xuIiArIAotCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB7XG4iICsgCi0JCSIgICAgU3RyaW5nIHN0cjtcbiIgKwotCQkiICAgIHtcbiIgKwotCQkiICAgICAgaW50IGk7XG4iICsJCQotCQkiICAgICAgPENvbXBsZXRlT25OYW1lOnN0ci4+O1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJzdHIuIjsKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIHZhcmlhYmxlIGJlaGluZCBpbGwtZm9ybWVkIGRlY2xhcmF0aW9uIGFuZCBuZXN0ZWQgYmxvY2s+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotLyoKLSAqIENvbXBsZXRlIG9uIHZhcmlhYmxlIGJlaGluZCBpbGwtZm9ybWVkIGRlY2xhcmF0aW9uIGFuZCBpbnNpZGUgbG9jYWwgdHlwZSBmaWVsZCBpbml0aWFsaXphdGlvbgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDMoKSB7Ci0KLQlTdHJpbmcgc3RyID0gCi0JCSJpbXBvcnQgamF2YS5pby4qOwkJCQkJCQlcbiIgKyAKLQkJIgkJCQkJCQkJCQkJXG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIElPRXhjZXB0aW9uIHsJCVxuIiArCi0JCSIJaW50IGZvbygpewkJCQkJCQkJXG4iICsKLQkJIgkJZmluYWwgU3RyaW5nIHN0ciA9IDsJCQkJXG4iICsKLQkJIgkJY2xhc3MgTCB7CQkJCQkJCVxuIiArCi0JCSIJCSAJaW50IGkgPSBzdHIJCQkJCQlcbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaSA9IHN0ciI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6c3RyPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInN0ciI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiaW1wb3J0IGphdmEuaW8uKjtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgSU9FeGNlcHRpb24ge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgZm9vKCkge1xuIiArIAotCQkiICAgIGZpbmFsIFN0cmluZyBzdHI7XG4iICsgCi0JCSIgICAgY2xhc3MgTCB7XG4iICsgCi0JCSIgICAgICBpbnQgaSA9IDxDb21wbGV0ZU9uTmFtZTpzdHI+O1xuIiArIAotCQkiICAgICAgTCgpIHtcbiIgKyAKLQkJIiAgICAgICAgc3VwZXIoKTtcbiIgKyAvLyBjb3VsZCBiZSBvcHRpbWl6ZWQgb3V0Ci0JCSIgICAgICB9XG4iICsgCi0JCSIgICAgfTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJzdHIiOwotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gdmFyaWFibGUgYmVoaW5kIGlsbC1mb3JtZWQgZGVjbGFyYXRpb24gYW5kIGluc2lkZSBsb2NhbCB0eXBlIGZpZWxkIGluaXRpYWxpemF0aW9uPiI7Ci0KLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JdGhpcy5jaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBDb21wbGV0ZSBvbiB2YXJpYWJsZSBiZWhpbmQgY2xvc2VkIHNjb3BlCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwNCgpIHsKLQotCVN0cmluZyBzdHIgPSAKLQkJImltcG9ydCBqYXZhLmlvLio7CQkJCQkJCVxuIiArIAotCQkiCQkJCQkJCQkJCQlcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgCQkJCQlcbiIgKwotCQkiCWludCBmb28oU3RyaW5nIHN0cikJCQkJCQlcbiIgKwotCQkiCQlTdHJpbmcgdmFyaWFibGUgPSA7CQkJCQlcbiIgKwotCQkiCQl7CQkJCQkJCQkJXG4iICsKLQkJIgkJIAlTdHJpbmcgdmFyaWFibGVOb3RJblNjb3BlOwkJXG4iICsKLQkJIgkJfQkJCQkJCQkJCVxuIiArCi0JCSIJCWZvbyh2YXJpYQkJCQkJCQlcbiI7IAotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZvbyh2YXIiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnZhcj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ2YXIiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJImltcG9ydCBqYXZhLmlvLio7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oU3RyaW5nIHN0cikge1xuIiArIAotCQkiICAgIFN0cmluZyB2YXJpYWJsZTtcbiIgKyAKLQkJIiAgICBmb28oPENvbXBsZXRlT25OYW1lOnZhcj4pO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInZhcmlhIjsKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIHZhcmlhYmxlIGJlaGluZCBjbG9zZWQgc2NvcGU+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotLyoKLSAqIENvbXBsZXRlIG9uIHZhcmlhYmxlIHN0ciB3aXRoIHNpYmxpbmcgbWV0aG9kIHN0cmluZ0FwcGVuZCgpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwNSgpIHsKLQotCVN0cmluZyBzdHIgPSAKLQkJImltcG9ydCBqYXZhLmlvLio7CQkJCQkJCQkJXG4iKwotCQkiCQkJCQkJCQkJCQkJCVxuIisJCQkKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgCQkJCQkJCVxuIisKLQkJIglpbnQgZm9vKFN0cmluZyBzdHIpCQkJCQkJCQlcbiIrCi0JCSIJCVN0cmluZyBzdHIgPSA7CQkJCQkJCQlcbiIrCi0JCSIJCXsJCQkJCQkJCQkJCVxuIisKLQkJIgkJIAlTdHJpbmcgc3RyTm90SW5TY29wZTsJCQkJCVxuIisKLQkJIgkJfQkJCQkJCQkJCQkJXG4iKwotCQkiCQljbGFzcyBMIHsJCQkJCQkJCQlcbiIrCi0JCSIJCQlpbnQgYmFyKCl7CQkJCQkJCQlcbiIrCi0JCSIJCQkJZm9vKHN0cgkJCQkJCQkJXG4iKwkJCQkJCQkKLQkJIgkJCXZvaWQgc3RyaW5nQXBwZW5kKFN0cmluZyBzMSwgU3RyaW5nIHMyKQlcbiI7IAotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZvbyhzdHIiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnN0cj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJzdHIiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJImltcG9ydCBqYXZhLmlvLio7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oU3RyaW5nIHN0cikge1xuIiArIAotCQkiICAgIFN0cmluZyBzdHI7XG4iICsgCi0JCSIgICAgY2xhc3MgTCB7XG4iICsgCi0JCSIgICAgICBMKCkge1xuIiArIAotCQkiICAgICAgfVxuIiArIAotCQkiICAgICAgaW50IGJhcigpIHtcbiIgKyAKLQkJIiAgICAgICAgZm9vKDxDb21wbGV0ZU9uTmFtZTpzdHI+KTtcbiIgKyAKLQkJIiAgICAgIH1cbiIgKyAKLQkJIiAgICAgIHZvaWQgc3RyaW5nQXBwZW5kKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7XG4iICsgCi0JCSIgICAgICB9XG4iICsgCi0JCSIgICAgfTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJzdHIiOwotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gdmFyaWFibGUgc3RyIHdpdGggc2libGluZyBtZXRob2Qgc3RyaW5nQXBwZW5kKCk+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotLyoKLSAqIENvbXBsZXRlIG9uIHZhcmlhYmxlIHN0ciB3aXRoIHNpYmxpbmcgbWV0aG9kIHN0cmluZ0FwcGVuZCgpLCBlbGltaW5hdGluZwotICogdW5pbnRlcmVzdGluZyBtZXRob2QgYm9kaWVzCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwNigpIHsKLQotCVN0cmluZyBzdHIgPSAKLQkJImltcG9ydCBqYXZhLmlvLio7CQkJCQkJCQkJXG4iKwotCQkiCQkJCQkJCQkJCQkJCVxuIisJCQkKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgCQkJCQkJCVxuIisKLQkJIglpbnQgZm9vKFN0cmluZyBzdHIpCQkJCQkJCQlcbiIrCi0JCSIJCVN0cmluZyBzdHIgPSA7CQkJCQkJCQlcbiIrCi0JCSIJCXsJCQkJCQkJCQkJCVxuIisKLQkJIgkJIAlTdHJpbmcgc3RyTm90SW5TY29wZTsJCQkJCVxuIisKLQkJIgkJfQkJCQkJCQkJCQkJXG4iKwotCQkiCQljbGFzcyBMIHsJCQkJCQkJCQlcbiIrCi0JCSIJCQlpbnQgbm90SW50ZXJlc3RpbmdCb2R5KCl7CQkJCVxuIisKLQkJIgkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsJCQkJXG4iKwotCQkiCQkJfQkJCQkJCQkJCQlcbiIrCi0JCSIJCQlpbnQgYmFyKCl7CQkJCQkJCQlcbiIrCi0JCSIJCQkJZm9vKHN0cgkJCQkJCQkJXG4iKwkJCQkJCQkKLQkJIgkJCXZvaWQgc3RyaW5nQXBwZW5kKFN0cmluZyBzMSwgU3RyaW5nIHMyKQlcbiI7IAotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZvbyhzdHIiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnN0cj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJzdHIiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJImltcG9ydCBqYXZhLmlvLio7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oU3RyaW5nIHN0cikge1xuIiArIAotCQkiICAgIFN0cmluZyBzdHI7XG4iICsgCi0JCSIgICAgY2xhc3MgTCB7XG4iICsgCi0JCSIgICAgICBMKCkge1xuIiArIAotCQkiICAgICAgfVxuIiArIAotCQkiICAgICAgaW50IG5vdEludGVyZXN0aW5nQm9keSgpIHtcbiIgKyAKLQkJIiAgICAgIH1cbiIgKyAKLQkJIiAgICAgIGludCBiYXIoKSB7XG4iICsgCi0JCSIgICAgICAgIGZvbyg8Q29tcGxldGVPbk5hbWU6c3RyPik7XG4iICsgCi0JCSIgICAgICB9XG4iICsgCi0JCSIgICAgICB2b2lkIHN0cmluZ0FwcGVuZChTdHJpbmcgczEsIFN0cmluZyBzMikge1xuIiArIAotCQkiICAgICAgfVxuIiArIAotCQkiICAgIH07XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInN0ciI7Ci0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiB2YXJpYWJsZSBlbGltaW5hdGluZyBvdGhlciB1bmludGVyZXN0aW5nIG1ldGhvZCBib2RpZXM+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotLyoKLSAqIENvbXBsZXRlIG9uIG5ldyBrZXl3b3JkCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwNygpeyAKLQotCVN0cmluZyBzdHIgPSAKLQkJImltcG9ydCBqYXZhLmlvLioJCQkJCQkJXG4iICsgCi0JCSIJCQkJCQkJCQkJCVxuIiArIAotCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7CQlcbiIgKwotCQkiCWludCBmb28oKSB7CQkJCQkJCQlcbiIgKwotCQkiCQlYIHggPSBuZXcgWCgJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iOyAKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICI9IG4iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOm4+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAibiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiaW1wb3J0IGphdmEuaW8uKjtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgSU9FeGNlcHRpb24ge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgZm9vKCkge1xuIiArIAotCQkiICAgIFggeCA9IDxDb21wbGV0ZU9uTmFtZTpuPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJuZXciOwotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gbmV3IGtleXdvcmQ+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotLyoKLSAqIENvbXBsZXRlIG9uIGZpZWxkIHR5cGUgaW4gYW5vbnltb3VzIHR5cGUuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwOCgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja0RpZXRQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkicGFja2FnZSB0ZXN0O1xuIiArIAotCQkiaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgVkEge1xuIiArIAotCQkiCU9iamVjdCBvMSA9IG5ldyBPYmplY3QoKSB7XG4iICsgCi0JCSIJCVZcbiIgKyAKLQkJIgkJdm9pZCBmb28yKCkge1xuIiArIAotCQkiCQkJaW50IGkgPSAxO1xuIiArIAotCQkiCQl9XG4iICsgCi0JCSIJfTtcbiIgKyAKLQkJIglTdHJpbmcgczI7XG4iICsgCi0JCSIJdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIJfVxuIiArIAotCQkiCXZvaWQgZm9vKCkgeyBcbiIgKyAKLQkJIgkJbmV3IFN0cmluZ1tdIHt9Li5lcXVhbHMoKVxuIiArIAotCQkiCX1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiCQlWIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25UeXBlOlY+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJInBhY2thZ2UgdGVzdDtcbiIgKyAKLQkJImltcG9ydCBqYXZhLnV0aWwuVmVjdG9yO1xuIiArIAotCQkicHVibGljIGNsYXNzIFZBIHtcbiIgKyAKLQkJIiAgT2JqZWN0IG8xID0gbmV3IE9iamVjdCgpIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPblR5cGU6Vj47XG4iICsgCi0JCSIgICAgKCkge1xuIiArIAotCQkiICAgICAgc3VwZXIoKTtcbiIgKwotCQkiICAgIH1cbiIgKyAKLQkJIiAgICB2b2lkIGZvbzIoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9O1xuIiArIAotCQkiICBTdHJpbmcgczI7XG4iICsgCi0JCSIgIHB1YmxpYyBWQSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIlYiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiViIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRpb24gb24gZmllbGQgdHlwZSBpbiBhbm9ueW1vdXMgdHlwZT4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0ZSBvbiBhcmd1bWVudCBuYW1lCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwOSgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja0RpZXRQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkicGFja2FnZSBwYWNrOwkJCQkJCQkJXG4iKwotCQkiY2xhc3MgQSAgewkJCQkJCQkJCVxuIisKLQkJIgkJCQkJCQkJCQkJXG4iKwotCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3YJXG4iKwotCQkiCQkJbmV3IE1lbWJlcigpLmYJCQkJCVxuIisKLQkJIgkJCTsJCQkJCQkJCVxuIisKLQkJIgl9CQkJCQkJCQkJCVxuIisKLQkJIgljbGFzcyBNZW1iZXIgewkJCQkJCQlcbiIrCi0JCSIJCWludCBmb28oKQkJCQkJCQlcbiIrCi0JCSIJCX0JCQkJCQkJCQlcbiIrCi0JCSIJfQkJCQkJCQkJCQlcbiIrCi0JCSJ9OwkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJImFyZ3YiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbkFyZ3VtZW50TmFtZTpTdHJpbmdbXSBhcmd2PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJwYWNrYWdlIHBhY2s7XG4iICsgCi0JCSJjbGFzcyBBIHtcbiIgKyAKLQkJIiAgY2xhc3MgTWVtYmVyIHtcbiIgKyAKLQkJIiAgICBNZW1iZXIoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICAgIGludCBmb28oKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIEEoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oPENvbXBsZXRlT25Bcmd1bWVudE5hbWU6U3RyaW5nW10gYXJndj4pIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJImFyZ3YiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiYXJndiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRpb24gb24gYXJndW1lbnQgbmFtZT4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0ZSBvbiBhcmd1bWVudCBuYW1lCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QxMCgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJwYWNrYWdlIHBhY2s7CQkJCQkJCQlcbiIrCi0JCSJjbGFzcyBBICB7CQkJCQkJCQkJXG4iKwotCQkiCQkJCQkJCQkJCQlcbiIrCi0JCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndglcbiIrCi0JCSIJCQluZXcgTWVtYmVyKCkuZgkJCQkJXG4iKwotCQkiCQkJOwkJCQkJCQkJXG4iKwotCQkiCX0JCQkJCQkJCQkJXG4iKwotCQkiCWNsYXNzIE1lbWJlciB7CQkJCQkJCVxuIisKLQkJIgkJaW50IGZvbygpCQkJCQkJCVxuIisKLQkJIgkJfQkJCQkJCQkJCVxuIisKLQkJIgl9CQkJCQkJCQkJCVxuIisKLQkJIn07CQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiYXJndiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTmFtZTo+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJInBhY2thZ2UgcGFjaztcbiIgKyAKLQkJImNsYXNzIEEge1xuIiArIAotCQkiICBjbGFzcyBNZW1iZXIge1xuIiArIAotCQkiICAgIE1lbWJlcigpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgQSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbig8Q29tcGxldGVPbkFyZ3VtZW50TmFtZTpTdHJpbmdbXSBhcmd2Pikge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRpb24gb24gYXJndW1lbnQgbmFtZT4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0ZSBpbnNpZGUgbWV0aG9kIHdpdGggaW5jb21wbGV0ZSBzaWduYXR1cmUKLSAqLwotcHVibGljIHZvaWQgdGVzdDExKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJInBhY2thZ2UgcGFjazsJCQkJCQkJCVxuIisKLQkJImNsYXNzIEEgIHsJCQkJCQkJCQlcbiIrCi0JCSIJCQkJCQkJCQkJCVxuIisKLQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2CVxuIisKLQkJIgkJCW5ldyBNZW1iZXIoKS5mCQkJCQlcbiIrCi0JCSIJCQk7CQkJCQkJCQlcbiIrCi0JCSIJfQkJCQkJCQkJCQlcbiIrCi0JCSIJY2xhc3MgTWVtYmVyIHsJCQkJCQkJXG4iKwotCQkiCQlpbnQgZm9vKCkJCQkJCQkJXG4iKwotCQkiCQl9CQkJCQkJCQkJXG4iKwotCQkiCX0JCQkJCQkJCQkJXG4iKwotCQkifTsJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJuZXcgTWVtYmVyKCkuZiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOm5ldyBNZW1iZXIoKS5mPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJwYWNrYWdlIHBhY2s7XG4iICsgCi0JCSJjbGFzcyBBIHtcbiIgKyAKLQkJIiAgY2xhc3MgTWVtYmVyIHtcbiIgKyAKLQkJIiAgICBNZW1iZXIoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICAgIGludCBmb28oKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIEEoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOm5ldyBNZW1iZXIoKS5mPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJImYiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiZiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIGluc2lkZSBtZXRob2Qgd2l0aCBpbmNvbXBsZXRlIHNpZ25hdHVyZT4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0ZSBvbiBhcmd1bWVudCBuYW1lIHdpdGggY2xhc3MgZGVjbCBsYXRlciBvbgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MTIoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgREQgIHsJCQkJCQkJCQlcbiIrCi0JCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndgkJXG4iKwotCQkiCQkJCQkJCQkJCQkJXG4iKwotCQkiY2xhc3MgRCB7CQkJCQkJCQkJCVxuIisKLQkJIgkJCQkJCQkJCQkJCVxuIisKLQkJIglpbnQgaTsJCQkJCQkJCQkJXG4iKwotCQkiCWNsYXNzIE1lbTEge30JCQkJCQkJCVxuIisKLQkJIglpbnQgZHVtYihTdHJpbmcgcykJCQkJCQkJXG4iKwotCQkiCWludCBkdW1iKGZsb2F0IGZOdW0sIGRvdWJsZSBkTnVtKSB7CQkJXG4iKwotCQkiCQlkdW1iKFwid29ybGRcIiwgaSk7CQkJCQkJXG4iKwotCQkiCQkJCQkJCQkJCQkJXG4iKwotCQkiCQlpZiAoaSA9PSAwKSB7CQkJCQkJCVxuIisKLQkJIgkJCWNsYXNzIExvY2FsIHsJCQkJCQlcbiIrCi0JCSIJCQkJCQkJCQkJCQlcbiIrCi0JCSIJCQkJaW50IGhlbGxvKCkgCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiYXJndiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTmFtZTo+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEREIHtcbiIgKyAKLQkJIiAgREQoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oPENvbXBsZXRlT25Bcmd1bWVudE5hbWU6U3RyaW5nW10gYXJndj4pIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIiIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSIiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBhcmd1bWVudCBuYW1lIHdpdGggY2xhc3MgZGVjbCBsYXRlciBvbj4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0ZSBiZWhpbmQgYXJyYXkgdHlwZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0MTMoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgQyB7CQkJCQkJXG4iKwotCQkiCXZvaWQgdGVzdCgpIHsJCQkJXG4iKwotCQkiCQlTdHJpbmdbXS4JCQkJXG4iKwotCQkiCX0JCQkJCQkJXG4iKwotCQkifQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIlN0cmluZ1tdLiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uQ2xhc3NMaXRlcmFsQWNjZXNzOlN0cmluZ1tdLj4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQyB7XG4iICsgCi0JCSIgIEMoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCB0ZXN0KCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uQ2xhc3NMaXRlcmFsQWNjZXNzOlN0cmluZ1tdLj47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSIiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiU3RyaW5nW10uIiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgYmVoaW5kIGFycmF5IHR5cGU+IgotCSk7Ci19Ci0vKgotICogQ29tcGxldGUgaW5zaWRlIGFycmF5IHR5cGUKLSAqLwotcHVibGljIHZvaWQgdGVzdDE0KCkgewotCXRoaXMucnVuVGVzdENoZWNrRGlldFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJwdWJsaWMgY2xhc3MgQiB7CQkJXG4iKwotCQkiCWNsYXNzIE1lbWJlciB7fQkJCVxuIisKLQkJIgkJCQkJCQlcbiIrCi0JCSIJaW50W10gajsJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJImludFsiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCU5PTkUsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJwdWJsaWMgY2xhc3MgQiB7XG4iICsgCi0JCSIgIGNsYXNzIE1lbWJlciB7XG4iICsgCi0JCSIgICAgTWVtYmVyKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgQigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIiIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCU5PTkUsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIGluc2lkZSBhcnJheSB0eXBlPiIKLQkpOwotfQotLyoKLSAqIENvbXBsZXRlIGluc2lkZSBhcnJheSB0eXBlCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QxNSgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja0RpZXRQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkicHVibGljIGNsYXNzIEIgewkJCVxuIisKLQkJIgljbGFzcyBNZW1iZXIge30JCQlcbiIrCi0JCSIJCQkJCQkJXG4iKwotCQkiCWludFsJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJpbnRbIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQlOT05FLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkicHVibGljIGNsYXNzIEIge1xuIiArIAotCQkiICBjbGFzcyBNZW1iZXIge1xuIiArIAotCQkiICAgIE1lbWJlcigpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIEIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSIiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQlOT05FLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBpbnNpZGUgYXJyYXkgdHlwZT4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0ZSBiZWhpbmQgaW52YWxpZCBhcnJheSB0eXBlCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QxNigpIHsKLQl0aGlzLnJ1blRlc3RDaGVja0RpZXRQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkicHVibGljIGNsYXNzIEIgewkJCVxuIisKLQkJIgljbGFzcyBNZW1iZXIge30JCQlcbiIrCi0JCSIJCQkJCQkJXG4iKwotCQkiCWludFsJCQkJCVxuIisKLQkJIglPYmplCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiT2JqZSIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uVHlwZTpPYmplPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJwdWJsaWMgY2xhc3MgQiB7XG4iICsgCi0JCSIgIGNsYXNzIE1lbWJlciB7XG4iICsgCi0JCSIgICAgTWVtYmVyKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICA8Q29tcGxldGVPblR5cGU6T2JqZT47XG4iICsgCi0JCSIgIHB1YmxpYyBCKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiT2JqZSIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJPYmplIiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgYmVoaW5kIGludmFsaWQgYXJyYXkgdHlwZT4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0ZSBiZWhpbmQgaW52YWxpZCBiYXNlIHR5cGUKLSAqLwotcHVibGljIHZvaWQgdGVzdDE3KCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEQgewkJCQlcbiIgKwotCQkiCWNsYXNzIE1lbWJlciB7fQkJXG4iICsKLQkJIgkJCQkJCVxuIiArCi0JCSIJdm9pZCB0ZXN0KCkgewkJXG4iICsKLQkJIgkJaW50LgkJCVxuIiArCi0JCSIJCXRlc3QoKTsJCQlcbiIgKwotCQkiCX0JCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJpbnQuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25DbGFzc0xpdGVyYWxBY2Nlc3M6aW50Lj4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgRCB7XG4iICsgCi0JCSIgIGNsYXNzIE1lbWJlciB7XG4iICsgCi0JCSIgICAgTWVtYmVyKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBEKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgdGVzdCgpIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbkNsYXNzTGl0ZXJhbEFjY2VzczppbnQuPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIiIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJpbnQuIiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgYmVoaW5kIGludmFsaWQgYmFzZSB0eXBlPiIKLQkpOwotfQotLyoKLSAqIENvbXBsZXRlIGJlaGluZCBpbmNvbXBsZXRlIGxvY2FsIG1ldGhvZCBoZWFkZXIKLSAqLwotcHVibGljIHZvaWQgdGVzdDE4KCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEUgewkJCQkJXG4iKwotCQkiCWludCBiYXIoKSB7CQkJCVxuIisKLQkJIgkJY2xhc3MgTG9jYWwgewkJXG4iKwotCQkiCQkJaW50IGhlbGxvKCkgewlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiaGVsbG8oKSIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTmFtZTo+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEUge1xuIiArIAotCQkiICBFKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBiYXIoKSB7XG4iICsgCi0JCSIgICAgY2xhc3MgTG9jYWwge1xuIiArIAotCQkiICAgICAgTG9jYWwoKSB7XG4iICsgCi0JCSIgICAgICB9XG4iICsgCi0JCSIgICAgICBpbnQgaGVsbG8oKSB7XG4iICsgCi0JCSIgICAgICB9XG4iICsgCi0JCSIgICAgfTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIiIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSIiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBiZWhpbmQgaW5jb21wbGV0ZSBsb2NhbCBtZXRob2QgaGVhZGVyPiIKLQkpOwotfQotLyoKLSAqIENvbXBsZXRlIGJlaGluZCBjYXRjaCB2YXJpYWJsZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0MTkoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkicHVibGljIGNsYXNzIFRlc3QgewkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQlcbiIgKwotCQkiCQl0cnkgewkJCQkJCQlcbiIgKwotCQkiCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewkJCVxuIiArCi0JCSIJCX0JCQkJCQkJCVxuIiArCi0JCSIJCWUJCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJcblx0XHRlIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25OYW1lOmU+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJInB1YmxpYyBjbGFzcyBUZXN0IHtcbiIgKyAKLQkJIiAgcHVibGljIFRlc3QoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmU+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiZSIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJlIiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgYmVoaW5kIGNhdGNoIHZhcmlhYmxlPiIKLQkpOwotfQotLyoKLSAqIENvbXBsZXRlIG9uIGNhdGNoIHZhcmlhYmxlCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QyMCgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJwdWJsaWMgY2xhc3MgVGVzdCB7CQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCVxuIiArCi0JCSIJCXRyeSB7CQkJCQkJCVxuIiArCi0JCSIJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CQkJXG4iICsKLQkJIgkJCWUJCQkJCQkJXG4iICsKLQkJIgkJfQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIlxuXHRcdFx0ZSIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTmFtZTplPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJwdWJsaWMgY2xhc3MgVGVzdCB7XG4iICsgCi0JCSIgIHB1YmxpYyBUZXN0KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIHtcbiIgKyAKLQkJIiAgICAgIEV4Y2VwdGlvbiBlO1xuIiArIAotCQkiICAgICAgPENvbXBsZXRlT25OYW1lOmU+O1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJImUiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiZSIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIGNhdGNoIHZhcmlhYmxlPiIKLQkpOwotfQotLyoKLSAqIENvbXBsZXRlIG9uIGNhdGNoIHZhcmlhYmxlIGFmdGVyIHN5bnRheCBlcnJvcgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MjEoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkicHVibGljIGNsYXNzIFRlc3QgewkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQlcbiIgKwotCQkiCQl0cnkgewkJCQkJCQlcbiIgKwotCQkiCQkJYmFyCQkJCQkJXG4iICsKLQkJIgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsJCQlcbiIgKwotCQkiCQkJZQkJCQkJCQlcbiIgKwotCQkiCQl9CQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiXG5cdFx0XHRlIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25OYW1lOmU+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJInB1YmxpYyBjbGFzcyBUZXN0IHtcbiIgKyAKLQkJIiAgcHVibGljIFRlc3QoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAge1xuIiArIAotCQkiICAgICAgRXhjZXB0aW9uIGU7XG4iICsgCi0JCSIgICAgICA8Q29tcGxldGVPbk5hbWU6ZT47XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iCi0JCSwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJImUiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiZSIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIGNhdGNoIHZhcmlhYmxlIGFmdGVyIHN5bnRheCBlcnJvcj4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0ZSBvbiBjb25zdHJ1Y3RvciB0eXBlIG5hbWUKLSAqIDFHMUhGN1A6IElUUENPTTpXSU45OCAtIENvZGVBc3Npc3QgbWF5IG5vdCB3b3JrIGluIGNvbnN0cnVjdG9yIHNpZ25hdHVyZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0MjIoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tEaWV0UGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJInB1YmxpYyBjbGFzcyBTb21lVHlwZSB7XG4iICsKLQkJIglwdWJsaWMgU29tZVR5cGUoaW50IGkpe31cbiIgKwotCQkifVxuIiArCi0JCSJcbiIgKwotCQkiY2xhc3MgU29tZU90aGVyVHlwZSBleHRlbmRzIFNvbWVUeXBlIHtcbiIgKwotCQkiCVNvbWVPdGhlclR5cGUoaW50IGkpe1xuIiArCi0JCSIJCXN1cGVyKGkpO1xuIiArCi0JCSIJfVxuIiArCi0JCSJ9XG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIglTb21lT3RoZXIiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPblR5cGU6U29tZU90aGVyPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJwdWJsaWMgY2xhc3MgU29tZVR5cGUge1xuIiArIAotCQkiICBwdWJsaWMgU29tZVR5cGUoaW50IGkpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiArIAotCQkiY2xhc3MgU29tZU90aGVyVHlwZSBleHRlbmRzIFNvbWVUeXBlIHtcbiIgKyAKLQkJIiAgPENvbXBsZXRlT25UeXBlOlNvbWVPdGhlcj47XG4iICsgCi0JCSIgIGludCBpO1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgU29tZU90aGVyVHlwZSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIgotCQksCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJTb21lT3RoZXIiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiU29tZU90aGVyVHlwZSIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIGNvbnN0cnVjdG9yIHR5cGUgbmFtZT4iCi0JKTsKLX0KLS8qKgotICogQ29tcGxldGUgaW4gaW5pdGlhbGl6ZXIgaW4gcmVjb3ZlcnkgbW9kZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0MjMoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkicGFja2FnZSBwO1xuIiArICAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbygpeylcbiIgKyAKLQkJIiAgICB7XG4iICsgCi0JCSIgICAgICBPYmpcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiT2JqIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25OYW1lOk9iaj4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICB7XG4iICsgCi0JCSIgICAgICA8Q29tcGxldGVPbk5hbWU6T2JqPjtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIKLQkJLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiT2JqIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIk9iaiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIGluIGluaXRpYWxpemVyPiIKLQkpOwotfQotLyoqCi0gKiBDb21wbGV0ZSBhZnRlciBpbml0aWFsaXplciBpbiByZWNvdmVyeSBtb2RlCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QyNCgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7KVxuIiArIAotCQkiICAgIGludCB2MTtcbiIgKyAKLQkJIiAgICB7XG4iICsgCi0JCSIgICAgICBpbnQgdjJcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgT2JqIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIk9iaiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTmFtZTpPYmo+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgaW50IHYxO1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpPYmo+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iCi0JCSwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIk9iaiIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJPYmoiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBhZnRlciBpbml0aWFsaXplcj4iCi0JKTsKLX0KLS8qKgotICogQ29tcGxldGUgYWZ0ZXIgZG90LCBiZWZvcmUgYSBudW1iZXIgLjx8PjEyCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QyNSgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJwYWNrYWdlIHA7XG4iICsgIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKCl7XG4iICsgCi0JCSIgICAgICB0aGlzLjEyXG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkidGhpcy4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2Vzczp0aGlzLj4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk1lbWJlckFjY2Vzczp0aGlzLj47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIKLQkJLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJInRoaXMuIiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgYWZ0ZXIgZG90IG51bWJlcj4iCi0JKTsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvRGlldENvbXBsZXRpb25UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL0RpZXRDb21wbGV0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzgzMDRiLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvRGlldENvbXBsZXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIucGFyc2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuY29tcGxldGUuSW52YWxpZEN1cnNvckxvY2F0aW9uOwotCi1wdWJsaWMgY2xhc3MgRGlldENvbXBsZXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RDb21wbGV0aW9uVGVzdCB7Ci1wdWJsaWMgRGlldENvbXBsZXRpb25UZXN0KFN0cmluZyB0ZXN0TmFtZSl7Ci0Jc3VwZXIodGVzdE5hbWUpOwotfQotLyoKLSAqIENvbXBsZXRlIG9uIHN1cGVyY2xhc3MKLSAqLwotcHVibGljIHZvaWQgdGVzdDAxKCkgewotCi0JU3RyaW5nIHN0ciA9IAotCQkiaW1wb3J0IGphdmEuaW8uKjsJCQkJCQkJXG4iICsgCi0JCSIJCQkJCQkJCQkJCVxuIiArIAotCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7CQlcbiIgKyAKLQkJIn0JCQkJCQkJCQkJCVxuIjsgCi0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiSU9FeCI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbkNsYXNzOklPRXg+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiSU9FeCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiaW1wb3J0IGphdmEuaW8uKjtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgPENvbXBsZXRlT25DbGFzczpJT0V4PiB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIklPRXhjZXB0aW9uIjsKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIHN1cGVyY2xhc3M+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBDb21wbGV0ZSBvbiBzdXBlcmludGVyZmFjZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDIoKSB7Ci0KLQlTdHJpbmcgc3RyID0gCi0JCSJpbXBvcnQgamF2YS5pby4qOwkJCQkJCQkJCQkJCQlcbiIgKyAKLQkJIgkJCQkJCQkJCQkJCQkJCQkJXG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIElPRXhjZXB0aW9uIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsJCVxuIiArCi0JCSIgaW50IGZvbygpe30gXG4iICsKLQkJIn0JCQkJCQkJCQkJCQkJCQkJCVxuIjsgCi0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiU2VyaWEiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25JbnRlcmZhY2U6U2VyaWE+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiU2VyaWEiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJImltcG9ydCBqYXZhLmlvLio7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIElPRXhjZXB0aW9uIGltcGxlbWVudHMgPENvbXBsZXRlT25JbnRlcmZhY2U6U2VyaWE+IHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJTZXJpYWxpemFibGUiOwkJCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBzdXBlcmludGVyZmFjZT4iOwotCi0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCXRoaXMuY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotLyoKLSAqIENvbXBsZXRlIG9uIHF1YWxpZmllZCBzdXBlcmNsYXNzCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMygpIHsKLQotCVN0cmluZyBzdHIgPSAKLQkJImltcG9ydCBqYXZhLmlvLio7CQkJCQkJCQkJCQkJCVxuIiArIAotCQkiCQkJCQkJCQkJCQkJCQkJCQlcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgamF2YS5pby5JT0V4Y2VwdGlvbiAgewkJCQkJCVxuIiArIAotCQkifQkJCQkJCQkJCQkJCQkJCQkJXG4iOyAKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJJT0V4IjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uQ2xhc3M6amF2YS5pby5JT0V4PiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIklPRXgiOwkKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9IAotCQkiaW1wb3J0IGphdmEuaW8uKjtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgPENvbXBsZXRlT25DbGFzczpqYXZhLmlvLklPRXg+IHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiamF2YS5pby5JT0V4Y2VwdGlvbiI7CQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIHF1YWxpZmllZCBzdXBlcmNsYXNzPiI7Ci0KLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLQkKLX0KLS8qCi0gKiBDb21wbGV0ZSBvbiBxdWFsaWZpZWQgc3VwZXJpbnRlcmZhY2UKLSAqLwotcHVibGljIHZvaWQgdGVzdDA0KCkgewotCi0JU3RyaW5nIHN0ciA9IAotCQkiaW1wb3J0IGphdmEuaW8uKjsJCQkJCQkJCQkJCQkJCQlcbiIgKyAKLQkJIgkJCQkJCQkJCQkJCQkJCQkJCQlcbiIgKyAJCi0JCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIElPRXhjZXB0aW9uIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewkJXG4iICsgCi0JCSJ9CQkJCQkJCQkJCQkJCQkJCQkJCVxuIjsgCi0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiU2VyaWEiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25JbnRlcmZhY2U6amF2YS5pby5TZXJpYT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJTZXJpYSI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPSAKLQkJImltcG9ydCBqYXZhLmlvLio7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIElPRXhjZXB0aW9uIGltcGxlbWVudHMgPENvbXBsZXRlT25JbnRlcmZhY2U6amF2YS5pby5TZXJpYT4ge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJqYXZhLmlvLlNlcmlhbGl6YWJsZSI7CQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIHF1YWxpZmllZCBzdXBlcmludGVyZmFjZT4iOwotCi0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCXRoaXMuY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotLyoKLSAqIENvbXBsZXRlIG9uIGluY29tcGxldGUgc3VwZXJjbGFzcwotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDUoKSB7Ci0KLQlTdHJpbmcgc3RyID0gCi0JCSJpbXBvcnQgamF2YS5pby4qOwkJCQkJCQlcbiIgKyAKLQkJIgkJCQkJCQkJCQkJXG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIElPRXggewkJCQlcbiIgKyAKLQkJIn0JCQkJCQkJCQkJCVxuIjsgCi0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiSU9FeCI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbkNsYXNzOklPRXg+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiSU9FeCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiaW1wb3J0IGphdmEuaW8uKjtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgPENvbXBsZXRlT25DbGFzczpJT0V4PiB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIklPRXgiOwkJCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBpbmNvbXBsZXRlIHN1cGVyY2xhc3M+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBDb21wbGV0ZSBvbiBpbmNvbXBsZXRlIHN1cGVyaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwNigpIHsKLQotCVN0cmluZyBzdHIgPSAKLQkJImltcG9ydCBqYXZhLmlvLio7CQkJCQkJCQkJCQkJCVxuIiArIAotCQkiCQkJCQkJCQkJCQkJCQkJCQlcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgSU9FeGNlcHRpb24gaW1wbGVtZW50cyBTZXJpYSB7CQkJCVxuIiArIAotCQkifQkJCQkJCQkJCQkJCQkJCQkJXG4iOyAKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJTZXJpYSI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbkludGVyZmFjZTpTZXJpYT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJTZXJpYSI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiaW1wb3J0IGphdmEuaW8uKjtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgSU9FeGNlcHRpb24gaW1wbGVtZW50cyA8Q29tcGxldGVPbkludGVyZmFjZTpTZXJpYT4ge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJTZXJpYSI7CQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIGluY29tcGxldGUgc3VwZXJpbnRlcmZhY2U+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBDb21wbGV0ZSBvbiBpbmNvbXBsZXRlIHF1YWxpZmllZCBzdXBlcmNsYXNzCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwNygpIHsKLQotCVN0cmluZyBzdHIgPSAKLQkJImltcG9ydCBqYXZhLmlvLio7CQkJCQkJCQkJCQkJCVxuIiArIAotCQkiCQkJCQkJCQkJCQkJCQkJCQlcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgamF2YS5pby5JT0V4ICAJCXsJCQkJCQlcbiIgKyAKLQkJIn0JCQkJCQkJCQkJCQkJCQkJCVxuIjsgCi0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiSU9FeCI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbkNsYXNzOmphdmEuaW8uSU9FeD4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJJT0V4IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9ICJpbXBvcnQgamF2YS5pby4qO1xuIiArIAotCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyA8Q29tcGxldGVPbkNsYXNzOmphdmEuaW8uSU9FeD4ge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkJU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiamF2YS5pby5JT0V4IjsKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIGluY29tcGxldGUgcXVhbGlmaWVkIHN1cGVyY2xhc3M+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBDb21wbGV0ZSBvbiBpbmNvbXBsZXRlIHF1YWxpZmllZCBzdXBlcmludGVyZmFjZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDgoKSB7Ci0KLQlTdHJpbmcgc3RyID0gCi0JCSJpbXBvcnQgamF2YS5pby4qOwkJCQkJCQkJCQkJCQkJCVxuIiArIAotCQkiCQkJCQkJCQkJCQkJCQkJCQkJCVxuIiArIAkKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgSU9FeGNlcHRpb24gaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhIHsJCQkJXG4iICsgCi0JCSJ9CQkJCQkJCQkJCQkJCQkJCQkJCVxuIjsgCi0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiU2VyaWEiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25JbnRlcmZhY2U6amF2YS5pby5TZXJpYT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJTZXJpYSI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPSAKLQkJImltcG9ydCBqYXZhLmlvLio7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIElPRXhjZXB0aW9uIGltcGxlbWVudHMgPENvbXBsZXRlT25JbnRlcmZhY2U6amF2YS5pby5TZXJpYT4ge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJqYXZhLmlvLlNlcmlhIjsJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gaW5jb21wbGV0ZSBxdWFsaWZpZWQgc3VwZXJpbnRlcmZhY2U+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBDb21wbGV0ZSBpbnNpZGUgcXVhbGlmaWVkIHN1cGVyY2xhc3MKLSAqLwotcHVibGljIHZvaWQgdGVzdDA5KCkgewotCi0JU3RyaW5nIHN0ciA9IAotCQkiCQkJCQkJCQkJCQkJCQkJCQlcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgamF2YS5pby5JT0V4Y2VwdGlvbiAgCQl7CQkJCVxuIiArIAotCQkifQkJCQkJCQkJCQkJCQkJCQkJXG4iOyAKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICIuaW8iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25DbGFzczpqYXZhLmlvPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImlvIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyA8Q29tcGxldGVPbkNsYXNzOmphdmEuaW8+IHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiamF2YS5pby5JT0V4Y2VwdGlvbiI7Ci0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBpbnNpZGUgcXVhbGlmaWVkIHN1cGVyY2xhc3M+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBDb21wbGV0ZSBpbnNpZGUgcXVhbGlmaWVkIHN1cGVyaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QxMCgpIHsKLQotCVN0cmluZyBzdHIgPSAKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgSU9FeGNlcHRpb24gaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CQlcbiIgKyAKLQkJIn0JCQkJCQkJCQkJCQkJCQkJCQkJXG4iOyAKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICIuaW8iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25JbnRlcmZhY2U6amF2YS5pbz4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJpbyI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBJT0V4Y2VwdGlvbiBpbXBsZW1lbnRzIDxDb21wbGV0ZU9uSW50ZXJmYWNlOmphdmEuaW8+IHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiamF2YS5pby5TZXJpYWxpemFibGUiOwkJCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBpbnNpZGUgcXVhbGlmaWVkIHN1cGVyaW50ZXJmYWNlPiI7Ci0KLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JdGhpcy5jaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKgotICogQ29tcGxldGUgaW5zaWRlIHF1YWxpZmllZCBzdXBlcmNsYXNzIGVuZGluZyB3aXRoIGRvdAotICovCi1wdWJsaWMgdm9pZCB0ZXN0MTEoKSB7Ci0KLQlTdHJpbmcgc3RyID0gCi0JCSIJCQkJCQkJCQkJCQkJCQkJCVxuIiArIAotCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBqYXZhLmlvLgl7CQkJCQkJCQlcbiIgKyAKLQkJIn0JCQkJCQkJCQkJCQkJCQkJCVxuIjsgCi0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiLmlvLiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbkNsYXNzOmphdmEuaW8uPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgPENvbXBsZXRlT25DbGFzczpqYXZhLmlvLj4ge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJqYXZhLmlvLiI7CQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIGluc2lkZSBxdWFsaWZpZWQgc3VwZXJjbGFzcyBlbmRpbmcgd2l0aCBkb3Q+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBDb21wbGV0ZSBpbnNpZGUgcXVhbGlmaWVkIHN1cGVyaW50ZXJmYWNlIGVuZGluZyB3aXRoIGRvdAotICovCi1wdWJsaWMgdm9pZCB0ZXN0MTIoKSB7Ci0KLQlTdHJpbmcgc3RyID0gCi0JCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIElPRXhjZXB0aW9uIGltcGxlbWVudHMgamF2YS5pby4JCQkJIHsJCVxuIiArIAotCQkifQkJCQkJCQkJCQkJCQkJCQkJCQlcbiI7IAotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIi5pby4iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25JbnRlcmZhY2U6amF2YS5pby4+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIElPRXhjZXB0aW9uIGltcGxlbWVudHMgPENvbXBsZXRlT25JbnRlcmZhY2U6amF2YS5pby4+IHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0KLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJqYXZhLmlvLiI7CQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIGluc2lkZSBxdWFsaWZpZWQgc3VwZXJpbnRlcmZhY2UgZW5kaW5nIHdpdGggZG90PiI7Ci0KLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JdGhpcy5jaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKgotICogQ29tcGxldGUgb24gZW1wdHkgc3VwZXJjbGFzcwotICovCi1wdWJsaWMgdm9pZCB0ZXN0MTMoKSB7Ci0KLQlTdHJpbmcgc3RyID0gCi0JCSJpbXBvcnQgamF2YS5pby4qOwkJCQkJCQlcbiIgKyAKLQkJIgkJCQkJCQkJCQkJXG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzICB7CQkJCQlcbiIgKyAKLQkJIn0JCQkJCQkJCQkJCVxuIjsgCi0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZXh0ZW5kcyAiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25DbGFzczo+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9IAotCQkiaW1wb3J0IGphdmEuaW8uKjtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgPENvbXBsZXRlT25DbGFzczo+IHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiIjsJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24gZW1wdHkgc3VwZXJjbGFzcz4iOwotCi0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCXRoaXMuY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotLyoKLSAqIENvbXBsZXRlIG9uIGVtcHR5IHN1cGVyaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QxNCgpIHsKLQotCVN0cmluZyBzdHIgPSAKLQkJImltcG9ydCBqYXZhLmlvLio7CQkJCQkJCQkJCQkJCVxuIiArIAotCQkiCQkJCQkJCQkJCQkJCQkJCQlcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgSU9FeGNlcHRpb24gaW1wbGVtZW50cyAgewkJCQkJXG4iICsgCi0JCSJ9CQkJCQkJCQkJCQkJCQkJCQlcbiI7IAotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImltcGxlbWVudHMgIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uSW50ZXJmYWNlOj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICIiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0gCi0JCSJpbXBvcnQgamF2YS5pby4qO1xuIiArIAotCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBJT0V4Y2VwdGlvbiBpbXBsZW1lbnRzIDxDb21wbGV0ZU9uSW50ZXJmYWNlOj4ge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICIiOwkJCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBlbXB0eSBzdXBlcmludGVyZmFjZT4iOwotCi0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCXRoaXMuY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotLyoKLSAqIENvbXBsZXRlIG9uIGVtcHR5IHN1cGVyY2xhc3MgZm9sbG93ZWQgYnkgaWRlbnRpZmllcgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MTUoKSB7Ci0KLQlTdHJpbmcgc3RyID0gCi0JCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIGphdmEuaW8uIElPRXhjZXB0aW9uICB7CQkJXG4iICsgCi0JCSJ9CQkJCQkJCQkJCQkJCQlcbiI7IAotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImphdmEuaW8uIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uQ2xhc3M6amF2YS5pby4+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyA8Q29tcGxldGVPbkNsYXNzOmphdmEuaW8uPiB7XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJqYXZhLmlvLiI7CQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIGVtcHR5IHN1cGVyY2xhc3MgZm9sbG93ZWQgYnkgaWRlbnRpZmllcj4iOwotCi0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCXRoaXMuY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotLyoKLSAqIENvbXBsZXRlIG9uIGtleXdvcmQgZXh0ZW5kcwotICovCi1wdWJsaWMgdm9pZCB0ZXN0MTYoKSB7Ci0KLQlTdHJpbmcgc3RyID0gCi0JCSJpbXBvcnQgamF2YS5pby4qOwkJCQkJCQlcbiIgKyAKLQkJIgkJCQkJCQkJCQkJXG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzICB7CQkJCQlcbiIgKyAKLQkJIn0JCQkJCQkJCQkJCVxuIjsgCi0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZXh0ZW5kcyI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbktleXdvcmQ6ZXh0ZW5kcz4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJleHRlbmRzIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9IAotCQkiaW1wb3J0IGphdmEuaW8uKjtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgPENvbXBsZXRlT25LZXl3b3JkOmV4dGVuZHM+IHtcbiIgKyAKLQkJIiAge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJleHRlbmRzIjsJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgb24ga2V5d29yZCBleHRlbmRzPiI7Ci0KLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JdGhpcy5jaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKgotICogQ29tcGxldGUgaW4ga2V5d29yZCBleHRlbmRzCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QxNygpIHsKLQotCVN0cmluZyBzdHIgPSAKLQkJImltcG9ydCBqYXZhLmlvLio7CQkJCQkJCVxuIiArIAotCQkiCQkJCQkJCQkJCQlcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIGV4dCAgewkJCQkJCVxuIiArIAotCQkifQkJCQkJCQkJCQkJXG4iOyAKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJleHQiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25LZXl3b3JkOmV4dD4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJleHQiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJImltcG9ydCBqYXZhLmlvLio7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIDxDb21wbGV0ZU9uS2V5d29yZDpleHQ+IHtcbiIgKyAKLQkJIiAge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJleHQiOwkJCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBpbiBrZXl3b3JkIGV4dGVuZHM+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBDb21wbGV0ZSBpbiBmaWVsZCB0eXBlCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QxOCgpIHsKLQotCVN0cmluZyBzdHIgPQotCQkiY2xhc3MgWCB7CQkJCQkJCQkJXG4iICsgCi0JCSIJCQkJCQkJCQkJCVxuIiArIAotCQkiCUlPRXhjZXB0aW9uIHg7CQkJCQkJCVxuIiArIAotCQkifQkJCQkJCQkJCQkJXG4iOyAKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJJTyI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6SU8+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiSU8iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0gCi0JCSJjbGFzcyBYIHtcbiIgKyAKLQkJIiAgPENvbXBsZXRlT25UeXBlOklPPjtcbiIgKyAKLQkJIiAgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJJT0V4Y2VwdGlvbiI7CQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIGluIGZpZWxkIHR5cGU+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBDb21wbGV0ZSBhdCBiZWdpbm5pbmcgb2YgZmllbGQgdHlwZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0MTkoKSB7Ci0KLQlTdHJpbmcgc3RyID0KLQkJImNsYXNzIFggewkJCQkJCQkJCVxuIiArIAotCQkiCQkJCQkJCQkJCQlcbiIgKyAKLQkJIglmaW5hbCBJT0V4Y2VwdGlvbiB4OwkJCQkJXG4iICsgCi0JCSJ9CQkJCQkJCQkJCQlcbiI7IAotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZpbmFsICI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6PiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPSAKLQkJImNsYXNzIFgge1xuIiArIAotCQkiICA8Q29tcGxldGVPblR5cGU6PjtcbiIgKyAKLQkJIiAgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJJT0V4Y2VwdGlvbiI7CQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIGF0IGJlZ2lubmluZyBvZiBmaWVsZCB0eXBlPiI7Ci0KLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JdGhpcy5jaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKgotICogQ29tcGxldGUgYXQgYmVnaW5uaW5nIG9mIHN1cGVyY2xhc3MKLSAqLwotcHVibGljIHZvaWQgdGVzdDIwKCkgewotCi0JU3RyaW5nIHN0ciA9Ci0JCSJjbGFzcyBYIGV4dGVuZHMgSU9FeGNlcHRpb24gewkJCQlcbiIgKyAKLQkJIgkJCQkJCQkJCQkJXG4iICsgCi0JCSJ9CQkJCQkJCQkJCQlcbiI7IAotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImV4dGVuZHMgIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uQ2xhc3M6PiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPSAKLQkJImNsYXNzIFggZXh0ZW5kcyA8Q29tcGxldGVPbkNsYXNzOj4ge1xuIiArIAotCQkiICBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIklPRXhjZXB0aW9uIjsJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgYXQgYmVnaW5uaW5nIG9mIHN1cGVyY2xhc3M+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBDb21wbGV0ZSBpbiByZXR1cm4gdHlwZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0MjEoKSB7Ci0KLQlTdHJpbmcgc3RyID0KLQkJImNsYXNzIFggewkJCQkJCQkJCVxuIiArIAotCQkiCUlPRXgJCQkJCQkJCQlcbiIgKyAKLQkJIn0JCQkJCQkJCQkJCVxuIjsgCi0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiSU9FeCI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6SU9FeD4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJJT0V4IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9IAotCQkiY2xhc3MgWCB7XG4iICsgCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpJT0V4PjtcbiIgKyAKLQkJIiAgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJJT0V4IjsJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgaW4gcmV0dXJuIHR5cGU+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBDb21wbGV0ZSBpbiBhcmd1bWVudCB0eXBlCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QyMigpIHsKLQotCVN0cmluZyBzdHIgPQotCQkiY2xhc3MgWCB7CQkJCQkJCQkJXG4iICsgCi0JCSIJaW50IGZvbyhJT0V4CQkJCQkJCVxuIiArIAotCQkifQkJCQkJCQkJCQkJXG4iOyAKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJJT0V4IjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpJT0V4PiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIklPRXgiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0gCi0JCSJjbGFzcyBYIHtcbiIgKyAKLQkJIiAgPENvbXBsZXRlT25UeXBlOklPRXg+O1xuIiArIAotCQkiICBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiSU9FeCI7CQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIGluIGFyZ3VtZW50IHR5cGU+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBDb21wbGV0ZSBpbiByZXR1cm4gdHlwZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0MjMoKSB7Ci0KLQlTdHJpbmcgc3RyID0KLQkJImNsYXNzIFggewkJCQkJCQkJCVxuIiArIAotCQkiCUlPRXgJCQkJCQkJCQlcbiIgKyAKLQkJIgkJCQkJCQkJCQkJXG4iOyAKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJJT0V4IjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpJT0V4PiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIklPRXgiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0gCi0JCSJjbGFzcyBYIHtcbiIgKyAKLQkJIiAgPENvbXBsZXRlT25UeXBlOklPRXg+O1xuIiArIAotCQkiICBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIklPRXgiOwkJCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBpbiByZXR1cm4gdHlwZT4iOwotCi0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCXRoaXMuY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotLyoKLSAqIENvbXBsZXRlIGluIGFyZ3VtZW50IHR5cGUgKG5vIGNsb3NpbmcgYnJhY2UgZm9yIHR5cGUpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QyNCgpIHsKLQotCVN0cmluZyBzdHIgPQotCQkiY2xhc3MgWCB7CQkJCQkJCQkJXG4iICsgCi0JCSIJaW50IGZvbyhJT0V4CQkJCQkJCVxuIiArIAotCQkiCQkJCQkJCQkJCQlcbiI7IAotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIklPRXgiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOklPRXg+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiSU9FeCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPSAKLQkJImNsYXNzIFgge1xuIiArIAotCQkiICA8Q29tcGxldGVPblR5cGU6SU9FeD47XG4iICsgCi0JCSIgIFgoKSB7XG4iICsgCi0KLQkJIiAgfVxuIiArIAotCQkiICBpbnQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIklPRXgiOwkJCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBpbiBhcmd1bWVudCB0eXBlPiI7Ci0KLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JdGhpcy5jaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKgotICogQ29tcGxldGUgaW4gcmV0dXJuIHR5cGUgd2l0aCBtb2RpZmllcnMKLSAqLwotcHVibGljIHZvaWQgdGVzdDI1KCkgewotCi0JU3RyaW5nIHN0ciA9Ci0JCSJjbGFzcyBYIHsJCQkJCQkJCQlcbiIgKyAKLQkJIglwdWJsaWMgZmluYWwgSU9FeAkJCQkJCVxuIiArIAotCQkiCQkJCQkJCQkJCQlcbiI7IAotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIklPRXgiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOklPRXg+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiSU9FeCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPSAKLQkJImNsYXNzIFgge1xuIiArIAotCQkiICA8Q29tcGxldGVPblR5cGU6SU9FeD47XG4iICsgCi0JCSIgIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiSU9FeCI7CQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIGluIHJldHVybiB0eXBlIHdpdGggbW9kaWZpZXJzPiI7Ci0KLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JdGhpcy5jaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKgotICogQ29tcGxldGUgaW4gZmllbGQgaW5pdGlhbGl6YXRpb24KLSAqLwotcHVibGljIHZvaWQgdGVzdDI2KCkgewotCi0JU3RyaW5nIHN0ciA9Ci0JCSJjbGFzcyBYIHsJCQkJCQkJCQlcbiIgKyAKLQkJIglwdWJsaWMgZmluYWwgaW50IHggPSBJT0V4CQkJCVxuIiArIAotCQkiCQkJCQkJCQkJCQlcbiI7IAotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIklPRXgiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOklPRXg+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiSU9FeCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPSAKLQkJImNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgZmluYWwgaW50IHggPSA8Q29tcGxldGVPbk5hbWU6SU9FeD47XG4iICsgCi0JCSIgIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiSU9FeCI7CQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIGluIGZpZWxkIGluaXRpYWxpemF0aW9uPiI7Ci0KLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JdGhpcy5jaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKgotICogQ29tcGxldGUgaW4gbnRoIGFyZ3VtZW50IHR5cGUKLSAqLwotcHVibGljIHZvaWQgdGVzdDI3KCkgewotCi0JU3RyaW5nIHN0ciA9Ci0JCSJjbGFzcyBYIHsJCQkJCQkJCQlcbiIgKyAKLQkJIglpbnQgZm9vKEFBIGEsIEJCIGIsIElPRXgJCQkJXG4iICsgCi0JCSIJCQkJCQkJCQkJCVxuIjsgCi0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiSU9FeCI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6SU9FeD4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJJT0V4IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9IAotCQkiY2xhc3MgWCB7XG4iICsgCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpJT0V4PjtcbiIgKyAKLQkJIiAgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgZm9vKEFBIGEsIEJCIGIpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJJT0V4IjsJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgaW4gbnRoIGFyZ3VtZW50IHR5cGU+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBDb21wbGV0ZSBpbiBudGggYXJndW1lbnQgcXVhbGlmaWVkIHR5cGUKLSAqLwotcHVibGljIHZvaWQgdGVzdDI4KCkgewotCi0JU3RyaW5nIHN0ciA9Ci0JCSJjbGFzcyBYIHsJCQkJCQkJCQlcbiIgKyAKLQkJIglpbnQgZm9vKEFBIGEsIEJCIGIsIGphdmEuaW8uSU9FeAkJXG4iICsgCi0JCSIJCQkJCQkJCQkJCVxuIjsgCi0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiLmlvLiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6amF2YS5pby4+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9IAotCQkiY2xhc3MgWCB7XG4iICsgCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpqYXZhLmlvLj47XG4iICsgCi0JCSIgIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGZvbyhBQSBhLCBCQiBiKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiamF2YS5pby5JT0V4IjsJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgaW4gbnRoIGFyZ3VtZW50IHF1YWxpZmllZCB0eXBlPiI7Ci0KLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JdGhpcy5jaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKgotICogQ29tcGxldGUgaW4gbnRoIHRocm93biBleGNlcHRpb24gcXVhbGlmaWVkIHR5cGUKLSAqLwotcHVibGljIHZvaWQgdGVzdDI5KCkgewotCi0JU3RyaW5nIHN0ciA9Ci0JCSJjbGFzcyBYIHsJCQkJCQkJCQkJCQlcbiIgKyAKLQkJIglwdWJsaWMgaW50IGZvbyhBQSBhLCBCQiBiKSB0aHJvd3MgQUEsIGphdmEuaW8uSU9FeAlcbiIgKwotCQkiCQkJCQkJCQkJCQkJCQlcbiI7IAotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIi5pbyI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbkV4Y2VwdGlvbjpqYXZhLmlvPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImlvIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9IAotCQkiY2xhc3MgWCB7XG4iICsgCi0JCSIgIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIGludCBmb28oQUEgYSwgQkIgYikgdGhyb3dzIEFBLCA8Q29tcGxldGVPbkV4Y2VwdGlvbjpqYXZhLmlvPiB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiamF2YS5pby5JT0V4IjsJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgaW4gbnRoIHRocm93biBleGNlcHRpb24gcXVhbGlmaWVkIHR5cGU+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBDb21wbGV0ZSBpbiBjb21wbGV0ZWQgYXJndW1lbnQgCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QzMCgpIHsKLQotCVN0cmluZyBzdHIgPQotCQkiY2xhc3MgWCB7CQkJCQkJCQkJCQkJXG4iICsgCi0JCSIJcHVibGljIGludCBmb28oQUEgYSwgamF2YS5pby5CQiBiKSAJCQkJCVxuIiArCi0JCSIJCQkJCQkJCQkJCQkJCVxuIjsgCi0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW8uIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpqYXZhLmlvLj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICIiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0gCi0JCSJjbGFzcyBYIHtcbiIgKyAKLQkJIiAgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgaW50IGZvbyhBQSBhLCA8Q29tcGxldGVPblR5cGU6amF2YS5pby4+IGIpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJqYXZhLmlvLkJCIjsKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIGluIGluIGNvbXBsZXRlZCBhcmd1bWVudD4iOwotCi0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCXRoaXMuY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotLyoKLSAqIE5lZ2F0aXZlIHRlc3Q6IG5vIGRpZXQgY29tcGxldGlvbiBpbiBhbGxvY2F0aW9uIGV4cHJlc3Npb24gCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QzMSgpIHsKLQotCVN0cmluZyBzdHIgPQotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCVxuIisKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJXG4iKwotCQkiCQluZXcgWCgpLnp6eigpOwkJCQkJCVxuIisKLQkJIgl9CQkJCQkJCQkJCVxuIisKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibmV3IFgiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSBOT05FOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9IE5PTkU7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPSAKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9IG51bGw7CQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPG5vIGRpZXQgY29tcGxldGlvbiBpbiBhbGxvY2F0aW9uIGV4cHJlc3Npb24+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBDb21wbGV0aW9uIGluIHBhY2thZ2Ugc3RhdGVtZW50Ci0gKi8KLXB1YmxpYyB2b2lkIHRlc3QzMigpIHsKLQotCVN0cmluZyBzdHIgPQotCQkicGFja2FnZSB4LmFiYwkJCQlcbiIrCi0JCSJpbXBvcnQgeC51dGlsLio7CQkJCVxuIisKLQkJImltcG9ydCB4Lio7CQkJCQlcbiIrCi0JCSJjbGFzcyBYIGV4dGVuZHMgdXRpbHsJXG4iKwotCQkiICAgIFgoKXt9CQkJCVxuIisKLQkJIiAgICBYKGludCBhLCBpbnQgYil7fQlcbiIrCi0JCSJ9CQkJCQkJCQlcbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAieC5hYiI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblBhY2thZ2U6eC5hYj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJhYiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPSAKLQkJInBhY2thZ2UgPENvbXBsZXRlT25QYWNrYWdlOnguYWI+O1xuIiArIAotCQkiaW1wb3J0IHgudXRpbC4qO1xuIiArIAotCQkiaW1wb3J0IHguKjtcbiIgKyAKLQkJImNsYXNzIFggZXh0ZW5kcyB1dGlsIHtcbiIgKyAKLQkJIiAgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBYKGludCBhLCBpbnQgYikge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInguYWJjIjsJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgaW4gcGFja2FnZSBzdGF0ZW1lbnQ+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBDb21wbGV0aW9uIGluIGltcG9ydCBzdGF0ZW1lbnQKLSAqLwotcHVibGljIHZvaWQgdGVzdDMzKCkgewotCi0JU3RyaW5nIHN0ciA9Ci0JCSJwYWNrYWdlIHguYWJjOwkJCQlcbiIrCi0JCSJpbXBvcnQgeC51dGlsCQkJCVxuIisKLQkJImltcG9ydCB4Lio7CQkJCQlcbiIrCi0JCSJjbGFzcyBYIGV4dGVuZHMgdXRpbHsJXG4iKwotCQkiICAgIFgoKXt9CQkJCVxuIisKLQkJIiAgICBYKGludCBhLCBpbnQgYil7fQlcbiIrCi0JCSJ9CQkJCQkJCQlcbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAieC51dGlsIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uSW1wb3J0OngudXRpbD4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ1dGlsIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9IAotCQkicGFja2FnZSB4LmFiYztcbiIgKyAKLQkJImltcG9ydCA8Q29tcGxldGVPbkltcG9ydDp4LnV0aWw+O1xuIiArIAotCQkiaW1wb3J0IHguKjtcbiIgKyAKLQkJImNsYXNzIFggZXh0ZW5kcyB1dGlsIHtcbiIgKyAKLQkJIiAgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBYKGludCBhLCBpbnQgYikge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIngudXRpbCI7CQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIGluIGltcG9ydCBzdGF0ZW1lbnQ+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBDb21wbGV0ZSBvbiBzdXBlcmNsYXNzIGJlaGluZCBhIHVuaWNvZGUKLSAqCi0gKiAtLSBjb21wdXRlIHRoZSB1bmljb2RlIHJlcHJlc2VudGF0aW9uIGZvciBhIGdpdmVuIHN0cmluZyAtLQotICAgWyBTdHJpbmcgc3RyID0gIklPRXgiOwotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJcIiIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspewotCQlTdHJpbmcgaGV4ID0gSW50ZWdlci50b0hleFN0cmluZyhzdHIuY2hhckF0KGkpKTsKLQkJYnVmZmVyLmFwcGVuZCgiXFx1MDAwMCIuc3Vic3RyaW5nKDAsIDYtaGV4Lmxlbmd0aCgpKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoaGV4KTsKLQl9Ci0JYnVmZmVyLmFwcGVuZCgiXCIiKTsKLQlidWZmZXIudG9TdHJpbmcoKQotCV0KLSAqLwotcHVibGljIHZvaWQgdGVzdDM0KCkgewotCi0JU3RyaW5nIHN0ciA9IAotCQkiaW1wb3J0IGphdmEuaW8uKjsJCQkJCQkJCQlcbiIgKyAKLQkJIgkJCQkJCQkJCQkJCQlcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgSU9FXFx1MDA3OGNlcHRpb24gewkJCVxuIiArIAotCQkifQkJCQkJCQkJCQkJCQlcbiI7IAotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIklPRVxcdTAwNzgiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25DbGFzczpJT0V4PiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIklPRXgiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJImltcG9ydCBqYXZhLmlvLio7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIDxDb21wbGV0ZU9uQ2xhc3M6SU9FeD4ge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJJT0VcXHUwMDc4Y2VwdGlvbiI7Ci0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBzdXBlcmNsYXNzIGJlaGluZCBhIHVuaWNvZGU+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBJbnZhbGlkIGNvbXBsZXRpb24gaW5zaWRlIGEgdW5pY29kZQotICoKLSAqIC0tIGNvbXB1dGUgdGhlIHVuaWNvZGUgcmVwcmVzZW50YXRpb24gZm9yIGEgZ2l2ZW4gc3RyaW5nIC0tCi0gICBbIFN0cmluZyBzdHIgPSAiSU9FeCI7Ci0JU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIlwiIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7IGkrKyl7Ci0JCVN0cmluZyBoZXggPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKHN0ci5jaGFyQXQoaSkpOwotCQlidWZmZXIuYXBwZW5kKCJcXHUwMDAwIi5zdWJzdHJpbmcoMCwgNi1oZXgubGVuZ3RoKCkpKTsKLQkJYnVmZmVyLmFwcGVuZChoZXgpOwotCX0KLQlidWZmZXIuYXBwZW5kKCJcIiIpOwotCWJ1ZmZlci50b1N0cmluZygpCi0JXQotICovCi1wdWJsaWMgdm9pZCB0ZXN0MzUoKSB7Ci0KLQlTdHJpbmcgc3RyID0gCi0JCSJpbXBvcnQgamF2YS5pby4qOwkJCQkJCQkJCVxuIiArIAotCQkiCQkJCQkJCQkJCQkJCVxuIiArIAotCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBJT0VcXHUwMDc4Y2VwdGlvbiB7CQkJXG4iICsgCi0JCSJ9CQkJCQkJCQkJCQkJCVxuIjsgCi0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiSU9FXFx1MDAiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSBOT05FOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9IE5PTkU7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPSAiIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9IE5PTkU7Ci0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBpbnNpZGUgdW5pY29kZT4iOwotCi0JdHJ5IHsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQkJY3Vyc29yTG9jYXRpb24sIAotCQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJCXRlc3ROYW1lKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGRldGVjdCBpbnZhbGlkIGN1cnNvciBsb2NhdGlvbiIsIGZhbHNlKTsKLQl9IGNhdGNoKEludmFsaWRDdXJzb3JMb2NhdGlvbiBlKXsKLQkJYXNzZXJ0RXF1YWxzKCJpbnZhbGlkIGN1cnNvciBsb2NhdGlvbjogIiwgZS5pcnJpdGFudCwgSW52YWxpZEN1cnNvckxvY2F0aW9uLk5PX0NPTVBMRVRJT05fSU5TSURFX1VOSUNPREUpOwotCX0KLX0KLS8qCi0gKiBJbnZhbGlkIGNvbXBsZXRpb24gaW5zaWRlIGEgY29tbWVudAotICoKLSAqLwotcHVibGljIHZvaWQgdGVzdDM2KCkgewotCi0JU3RyaW5nIHN0ciA9IAotCQkiaW1wb3J0IGphdmEuaW8uKjsJCQkJCQkJCQlcbiIgKyAKLQkJIgkJCQkJCQkJCQkJCQlcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgLypJT0V4Y2VwdGlvbiovIHsJCQlcbiIgKyAKLQkJIn0JCQkJCQkJCQkJCQkJXG4iOyAKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJJT0V4IjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gTk9ORTsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSBOT05FOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0gIiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSBOT05FOwotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgaW5zaWRlIGNvbW1lbnQ+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0cnkgewotCQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQkJY3Vyc29yTG9jYXRpb24sIAotCQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJCXRlc3ROYW1lKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGRldGVjdCBpbnZhbGlkIGN1cnNvciBsb2NhdGlvbiIsIGZhbHNlKTsJCQotCX0gY2F0Y2goSW52YWxpZEN1cnNvckxvY2F0aW9uIGUpewotCQlhc3NlcnRFcXVhbHMoImludmFsaWQgY3Vyc29yIGxvY2F0aW9uOiAiLCBlLmlycml0YW50LCBJbnZhbGlkQ3Vyc29yTG9jYXRpb24uTk9fQ09NUExFVElPTl9JTlNJREVfQ09NTUVOVCk7Ci0JfQotfQotLyoKLSAqIEludmFsaWQgY29tcGxldGlvbiBpbnNpZGUgYSBzdHJpbmcgbGl0ZXJhbAotICoKLSAqLwotcHVibGljIHZvaWQgdGVzdDM3KCkgewotCi0JU3RyaW5nIHN0ciA9IAotCQkiaW1wb3J0IGphdmEuaW8uKjsJCQkJCQkJCQlcbiIgKyAKLQkJIgkJCQkJCQkJCQkJCQlcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHsJCQkJCQkJCQlcbiIgKwotCQkiCVN0cmluZyBzID0gXCJJT0V4Y2VwdGlvblwiOwkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJCVxuIjsgCi0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiSU9FeCI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9IE5PTkU7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gTk9ORTsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9ICIiOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gTk9ORTsKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIGluc2lkZSBhIHN0cmluZyBsaXRlcmFsPiI7Ci0KLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JdHJ5ewotCQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQkJY3Vyc29yTG9jYXRpb24sIAotCQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJCXRlc3ROYW1lKTsKLQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIHRvIGRldGVjdCBpbnZhbGlkIGN1cnNvciBsb2NhdGlvbiIsIGZhbHNlKTsJCQotCX0gY2F0Y2goSW52YWxpZEN1cnNvckxvY2F0aW9uIGUpewotCQlhc3NlcnRFcXVhbHMoImludmFsaWQgY3Vyc29yIGxvY2F0aW9uOiAiLCBlLmlycml0YW50LCBJbnZhbGlkQ3Vyc29yTG9jYXRpb24uTk9fQ09NUExFVElPTl9JTlNJREVfU1RSSU5HKTsKLQl9CQotfQotLyoKLSAqIEludmFsaWQgY29tcGxldGlvbiBpbnNpZGUgYSBudW1iZXIgbGl0ZXJhbAotICoKLSAqLwotcHVibGljIHZvaWQgdGVzdDM4KCkgewotCi0JU3RyaW5nIHN0ciA9IAotCQkiaW1wb3J0IGphdmEuaW8uKjsJCQkJCQkJCQlcbiIgKyAKLQkJIgkJCQkJCQkJCQkJCQlcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHsJCQkJCQkJCQlcbiIgKwotCQkiCWludCBzID0gMTIzNDU2Nzg7CQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCQlcbiI7IAotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIjEyMzQiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSBOT05FOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9IE5PTkU7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPSAiIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9IE5PTkU7Ci0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBpbnNpZGUgYSBudW1iZXIgbGl0ZXJhbD4iOwotCi0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCXRyeXsKLQkJdGhpcy5jaGVja0RpZXRQYXJzZSgKLQkJCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJCWN1cnNvckxvY2F0aW9uLCAKLQkJCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCQl0ZXN0TmFtZSk7Ci0JCWFzc2VydFRydWUoImZhaWxlZCB0byBkZXRlY3QgaW52YWxpZCBjdXJzb3IgbG9jYXRpb24iLCBmYWxzZSk7CQkKLQl9IGNhdGNoKEludmFsaWRDdXJzb3JMb2NhdGlvbiBlKXsKLQkJYXNzZXJ0RXF1YWxzKCJpbnZhbGlkIGN1cnNvciBsb2NhdGlvbjogIiwgZS5pcnJpdGFudCwgSW52YWxpZEN1cnNvckxvY2F0aW9uLk5PX0NPTVBMRVRJT05fSU5TSURFX05VTUJFUik7Ci0JfQkKLX0KLS8qCi0gKiBDb21wbGV0aW9uIGluIGltcG9ydCBzdGF0ZW1lbnQgYXQgdGhlIGVuZCBvZiB0aGUgdW5pdAotICovCi1wdWJsaWMgdm9pZCB0ZXN0MzkoKSB7Ci0KLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgeC5hYmM7CQkJCVxuIisKLQkJImltcG9ydCB4LnV0aWwiOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIngudXRpbCI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbkltcG9ydDp4LnV0aWw+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAidXRpbCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPSAKLQkJInBhY2thZ2UgeC5hYmM7XG4iICsgCi0JCSJpbXBvcnQgPENvbXBsZXRlT25JbXBvcnQ6eC51dGlsPjtcbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAieC51dGlsIjsJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgaW4gaW1wb3J0IHN0YXRlbWVudCBhdCB0aGUgZW5kIG9mIHRoZSB1bml0PiI7Ci0KLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JdGhpcy5jaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKgotICogQ29tcGxldGlvbiBpbiBpbXBvcnQgc3RhdGVtZW50IGF0IHRoZSBlbmQgb2YgdGhlIHVuaXQgKHF1YWxpZmllZCBlbXB0eSBuYW1lKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0NDAoKSB7Ci0KLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgYS5iOwkJCVxuIisKLQkJImltcG9ydCBqYXZhLiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiamF2YS4iOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25JbXBvcnQ6amF2YS4+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9IAotCQkicGFja2FnZSBhLmI7XG4iICsgCi0JCSJpbXBvcnQgPENvbXBsZXRlT25JbXBvcnQ6amF2YS4+O1xuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJqYXZhLiI7CQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIGluIGltcG9ydCBzdGF0ZW1lbnQgYXQgdGhlIGVuZCBvZiB0aGUgdW5pdD4iOwotCi0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCXRoaXMuY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotLyoKLSAqIFNob3VsZCBub3QgZmluZCBhbnkgZGlldCBjb21wbGV0aW9uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3Q0MSgpIHsKLQotCVN0cmluZyBzdHIgPQotCQkiaW1wb3J0IGphdmEuaW8uKjsJCQkJCQkJXG4iICsgCi0JCSIJCQkJCQkJCQkJCVxuIiArIAotCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyAJCQkJCVxuIiArCi0JCSIJaW50IGZvbyhTdHJpbmcgc3RyKQkJCQkJCVxuIiArCi0JCSIJCVN0cmluZyB2YXJpYWJsZSA9IDsJCQkJCVxuIiArCi0JCSIJCXsJCQkJCQkJCQlcbiIgKwotCQkiCQkgCVN0cmluZyB2YXJpYWJsZU5vdEluU2NvcGU7CQlcbiIgKwotCQkiCQl9CQkJCQkJCQkJXG4iICsKLQkJIgkJZm9vKHZhcmlhCQkJCQkJCVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmb28odmFyIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gTk9ORTsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAidmFyIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9IAotCQkiaW1wb3J0IGphdmEuaW8uKjtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGZvbyhTdHJpbmcgc3RyKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidmFyaWEiOwkJCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxzaG91bGQgbm90IGZpbmQgZGlldCBjb21wbGV0aW9uPiI7Ci0KLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JdGhpcy5jaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKgotICogQ29tcGxldGUgb24gYXJyYXkgdHlwZSB3aXRoIHByZWZpeCBkaW1lbnNpb25zCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3Q0MigpIHsKLQotCVN0cmluZyBzdHIgPQotCQkiaW1wb3J0IGphdmEuaW8uKjsJCQkJCQkJXG4iICsgCi0JCSIJCQkJCQkJCQkJCVxuIiArIAotCQkicHVibGljIGNsYXNzIFggewkJIAkJCQkJXG4iICsKLQkJIglpbnRbXSBmb28oU3RyaW5nIHN0cikJCQkJCVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbnQiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOmludD4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJpbnQiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0gCi0JCSJpbXBvcnQgamF2YS5pby4qO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICA8Q29tcGxldGVPblR5cGU6aW50PlxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJpbnQiOwkJCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0aW9uIG9uIGFycmF5IHR5cGUgd2l0aCBwcmVmaXggZGltZW5zaW9ucz4iOwotCi0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCXRoaXMuY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotLyoKLSAqIENvbXBsZXRlIG9uIGFycmF5IHR5cGUgd2l0aCBwb3N0Zml4IGRpbWVuc2lvbnMKLSAqLwotcHVibGljIHZvaWQgdGVzdDQzKCkgewotCi0JU3RyaW5nIHN0ciA9Ci0JCSJpbXBvcnQgamF2YS5pby4qOwkJCQkJCQlcbiIgKyAKLQkJIgkJCQkJCQkJCQkJXG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7CQkgCQkJCQlcbiIgKwotCQkiCWludCBmb28oU3RyaW5nIHN0cikJW10JCQkJCVxuIjsKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbnQiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25UeXBlOmludD4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJpbnQiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0gCi0JCSJpbXBvcnQgamF2YS5pby4qO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICA8Q29tcGxldGVPblR5cGU6aW50PlxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJpbnQiOwkJCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0aW9uIG9uIGFycmF5IHR5cGUgd2l0aCBwb3N0Zml4IGRpbWVuc2lvbnM+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBDb21wbGV0ZSBpbiByZXR1cm4gdHlwZSBiZWhpbmQgb3RoZXIgbWVtYmVyCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3Q0NCgpIHsKLQotCVN0cmluZyBzdHIgPQotCQkiY2xhc3MgWCB7CQkJCQkJCQkJXG4iICsKLQkJIglpbnQgaTsJCQkJCQkJCQlcbiIgKwotCQkiCUlPRXgJCQkJCQkJCQlcbiIgKyAKLQkJIn0JCQkJCQkJCQkJCVxuIjsgCi0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiSU9FeCI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPblR5cGU6SU9FeD4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJJT0V4IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9IAotCQkiY2xhc3MgWCB7XG4iICsKLQkJIiAgaW50IGk7XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOklPRXg+O1xuIiArIAotCQkiICBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIklPRXgiOwkJCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBpbiByZXR1cm4gdHlwZT4iOwotCi0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCXRoaXMuY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotLyoKLSAqIENvbXBsZXRlIGluIHJldHVybiB0eXBlIGJlaGluZCBvdGhlciBtZW1iZXIKLSAqLwotcHVibGljIHZvaWQgdGVzdDQ1KCkgewotCi0JU3RyaW5nIHN0ciA9Ci0JCSJjbGFzcyBYIHsJCQkJCQkJCQlcbiIgKwotCQkiCWludCBpOwkJCQkJCQkJCVxuIiArCi0JCSIJcHVibGljIElPRXgJCQkJCQkJCVxuIiArIAotCQkifQkJCQkJCQkJCQkJXG4iOyAKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJJT0V4IjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpJT0V4PiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIklPRXgiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0gCi0JCSJjbGFzcyBYIHtcbiIgKwotCQkiICBpbnQgaTtcbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6SU9FeD47XG4iICsgCi0JCSIgIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiSU9FeCI7CQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIGluIHJldHVybiB0eXBlPiI7Ci0KLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JdGhpcy5jaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKgotICogQ29tcGxldGUgb24gbmFtZSBpbiBmaWVsZCBpbml0aWFsaXplcgotICovCi1wdWJsaWMgdm9pZCB0ZXN0NDYoKSB7Ci0KLQlTdHJpbmcgc3RyID0KLQkJImNsYXNzIFggewkJCQkJCQkJCVxuIiArCi0JCSIJU3RyaW5nIHMgPSBcImhlbGxvXCI7CQkJCQlcbiIgKwotCQkiCWludCBmID0gcy4JCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQlcbiI7IAotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIj0gcyI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk5hbWU6cz4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJzIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9IAotCQkiY2xhc3MgWCB7XG4iICsKLQkJIiAgU3RyaW5nIHM7XG4iICsKLQkJIiAgaW50IGYgPSA8Q29tcGxldGVPbk5hbWU6cz47XG4iICsgCi0JCSIgIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAicyI7CQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIG5hbWUgaW4gZmllbGQgaW5pdGlhbGl6ZXI+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBDb21wbGV0ZSBpbiBmaWVsZCBpbml0aWFsaXplciBpbiBpbm5uZXIgY2xhc3MgCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3Q0NygpIHsKLQotCVN0cmluZyBzdHIgPQotCQkiY2xhc3MgWCB7CQkJCQkJCQkJXG4iICsKLQkJIgljbGFzcyBZIHsJCQkJCQkJCVxuIiArCi0JCSIJCU9iamVjdFtdIGYgPSB7IHRoaXMuZm9vIH0JCQlcbiIgKwotCQkiCQlPYmplY3QgZm9vKCl7IHJldHVybiB0aGlzOyB9CQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iOyAKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ0aGlzLmZvbyI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8Q29tcGxldGVPbk1lbWJlckFjY2Vzczp0aGlzLmZvbz4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJmb28iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0gCi0JCSJjbGFzcyBYIHtcbiIgKyAKLQkJIiAgY2xhc3MgWSB7XG4iICsgCi0JCSIgICAgT2JqZWN0W10gZiA9IHs8Q29tcGxldGVPbk1lbWJlckFjY2Vzczp0aGlzLmZvbz4sfTtcbiIgKyAKLQkJIiAgICBZKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgICBPYmplY3QgZm9vKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInRoaXMuZm9vIjsJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29tcGxldGUgaW4gZmllbGQgaW5pdGlhbGl6ZXIgaW4gaW5uZXIgY2xhc3M+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBTaG91bGQgbm90IGZpbmQgZmFrZSBmaWVsZCBvZiB0eXBlIDxDb21wbGV0ZU9uVHlwZTpmPgotICovCi1wdWJsaWMgdm9pZCB0ZXN0NDgoKSB7Ci0KLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgcGFjazsJCQkJCQkJCVxuIisKLQkJImNsYXNzIEEgIHsJCQkJCQkJCQlcbiIrCi0JCSIJCQkJCQkJCQkJCVxuIisKLQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KQlcbiIrCi0JCSIJCQluZXcgTWVtYmVyKCkuZgkJCQkJXG4iKwotCQkiCQkJOwkJCQkJCQkJXG4iKwotCQkiCX0JCQkJCQkJCQkJXG4iKwotCQkiCWNsYXNzIE1lbWJlciB7CQkJCQkJCVxuIisKLQkJIgkJaW50IGZvbygpCQkJCQkJCVxuIisKLQkJIgkJfQkJCQkJCQkJCVxuIisKLQkJIgl9CQkJCQkJCQkJCVxuIisKLQkJIn07CQkJCQkJCQkJCQlcbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibmV3IE1lbWJlcigpLmYiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSBOT05FOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJmIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9IAotCQkicGFja2FnZSBwYWNrO1xuIiArIAotCQkiY2xhc3MgQSB7XG4iICsgCi0JCSIgIGNsYXNzIE1lbWJlciB7XG4iICsgCi0JCSIgICAgTWVtYmVyKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgICBpbnQgZm9vKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBBKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3YpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImYiOwkJCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxzaG91bGQgbm90IGZpbmQgZmFrZSBmaWVsZCBvZiB0eXBlIGY+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBDb21wbGV0aW9uIGluIG1pZGRsZSBvZiBwYWNrYWdlIGltcG9ydCBzdGF0ZW1lbnQKLSAqLwotcHVibGljIHZvaWQgdGVzdDQ5KCkgewotCi0JU3RyaW5nIHN0ciA9Ci0JCSJpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsJXG4iKwotCQkiY2xhc3MgWCB7CQkJCQkJXG4iKwotCQkifQkJCQkJCQkJXG4iOwotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImphdmEubGEiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25JbXBvcnQ6amF2YS5sYT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJsYSI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPSAKLQkJImltcG9ydCA8Q29tcGxldGVPbkltcG9ydDpqYXZhLmxhPjtcbiIgKyAKLQkJImNsYXNzIFgge1xuIiArIAotCQkiICBYKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJqYXZhLmxhbmcucmVmbGVjdCI7CQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIGluIG1pZGRsZSBvZiBwYWNrYWdlIGltcG9ydCBzdGF0ZW1lbnQ+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBDb21wbGV0ZSBvbiBpbnN0YW5jZSBjcmVhdGlvbiBpbiBmaWVsZCBpbml0aWFsaXplci4KLSAqLwotcHVibGljIHZvaWQgdGVzdDUwKCkgewotCi0JU3RyaW5nIHN0ciA9Ci0JCSJjbGFzcyBYIHsJCQkJCQkJCQlcbiIgKwotCQkiCVN0cmluZyBzID0gXCJoZWxsb1wiOwkJCQkJXG4iICsKLQkJIglPYmplY3QgbyA9IG5ldyBYeXooKTsJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQlcbiI7IAotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIm5ldyBYIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uVHlwZTpYPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIlgiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0gCi0JCSJjbGFzcyBYIHtcbiIgKwotCQkiICBTdHJpbmcgcztcbiIgKwotCQkiICBPYmplY3QgbyA9IG5ldyA8Q29tcGxldGVPblR5cGU6WD4oKTtcbiIgKyAKLQkJIiAgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJYeXoiOwkJCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBpbnN0YW5jZSBjcmVhdGlvbiBpbiBmaWVsZCBpbml0aWFsaXplcj4iOwotCi0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCXRoaXMuY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotLyoKLSAqIENvbXBsZXRlIG9uIG1lbWJlciBhY2Nlc3MgaW4gZmllbGQgaW5pdGlhbGl6ZXIuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3Q1MSgpIHsKLQotCVN0cmluZyBzdHIgPQotCQkiY2xhc3MgWCB7CQkJCQkJCQkJXG4iICsKLQkJIglTdHJpbmcgcyA9IFwiaGVsbG9cIjsJCQkJCVxuIiArCi0JCSIJT2JqZWN0IG8gPSBmcmVkKCkueHl6OwkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIjsgCi0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZnJlZCgpLngiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAieCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPSAKLQkJImNsYXNzIFgge1xuIiArCi0JCSIgIFN0cmluZyBzO1xuIiArCi0JCSIgIE9iamVjdCBvID0gPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+O1xuIiArIAotCQkiICBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInh5eiI7CQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIG1lbWJlciBhY2Nlc3MgaW4gZmllbGQgaW5pdGlhbGl6ZXI+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBDb21wbGV0ZSBvbiBjbGFzcyBsaXRlcmFsIGFjY2VzcyBpbiBmaWVsZCBpbml0aWFsaXplci4KLSAqLwotcHVibGljIHZvaWQgdGVzdDUyKCkgewotCi0JU3RyaW5nIHN0ciA9Ci0JCSJjbGFzcyBYIHsJCQkJCQkJCQlcbiIgKwotCQkiCVN0cmluZyBzID0gXCJoZWxsb1wiOwkJCQkJXG4iICsKLQkJIglDbGFzcyBjID0gaW50W10uY2xhc3M7CQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iOyAKLQotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbnRbXS5jIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uQ2xhc3NMaXRlcmFsQWNjZXNzOmludFtdLmM+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiYyI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPSAKLQkJImNsYXNzIFgge1xuIiArCi0JCSIgIFN0cmluZyBzO1xuIiArCi0JCSIgIENsYXNzIGMgPSA8Q29tcGxldGVPbkNsYXNzTGl0ZXJhbEFjY2VzczppbnRbXS5jPjtcbiIgKyAKLQkJIiAgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJpbnRbXS5jbGFzcyI7CQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIGNsYXNzIGxpdGVyYWwgYWNjZXNzIGluIGZpZWxkIGluaXRpYWxpemVyPiI7Ci0KLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JdGhpcy5jaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKgotICogQ29tcGxldGUgb24gbWV0aG9kIGludm9jYXRpb24gaW4gZmllbGQgaW5pdGlhbGl6ZXIuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3Q1MygpIHsKLQotCVN0cmluZyBzdHIgPQotCQkiY2xhc3MgWCB7CQkJCQkJCQkJXG4iICsKLQkJIglTdHJpbmcgcyA9IFwiaGVsbG9cIjsJCQkJCVxuIiArCi0JCSIJT2JqZWN0IG8gPSBzLmNvbmNhdCgpOwkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIjsgCi0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicy5jb25jYXQoIjsKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxDb21wbGV0ZU9uTWVzc2FnZVNlbmQ6cy5jb25jYXQoKT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICIiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0gCi0JCSJjbGFzcyBYIHtcbiIgKwotCQkiICBTdHJpbmcgcztcbiIgKwotCQkiICBPYmplY3QgbyA9IDxDb21wbGV0ZU9uTWVzc2FnZVNlbmQ6cy5jb25jYXQoKT47XG4iICsgCi0JCSIgIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiY29uY2F0KCI7CQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbXBsZXRlIG9uIG1ldGhvZCBpbnZvY2F0aW9uIGluIGZpZWxkIGluaXRpYWxpemVyPiI7Ci0KLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JdGhpcy5jaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQljdXJzb3JMb2NhdGlvbiwgCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKgotICogU2hvdWxkIG5vdCBmaW5kIGZha2UgZmllbGQgb2YgdHlwZSA8Q29tcGxldGVPblR5cGU6Zj4KLSAqLwotcHVibGljIHZvaWQgdGVzdDU0KCkgewotCi0JU3RyaW5nIHN0ciA9Ci0JCSJwYWNrYWdlIHBhY2s7CQkJCQkJCQlcbiIrCi0JCSJjbGFzcyBBICB7CQkJCQkJCQkJXG4iKwotCQkiCQkJCQkJCQkJCQlcbiIrCi0JCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndglcbiIrCi0JCSIJCQluZXcgTWVtYmVyKCkuZgkJCQkJXG4iKwotCQkiCQkJOwkJCQkJCQkJXG4iKwotCQkiCX0JCQkJCQkJCQkJXG4iKwotCQkiCWNsYXNzIE1lbWJlciB7CQkJCQkJCVxuIisKLQkJIgkJaW50IGZvbygpCQkJCQkJCVxuIisKLQkJIgkJfQkJCQkJCQkJCVxuIisKLQkJIgl9CQkJCQkJCQkJCVxuIisKLQkJIn07CQkJCQkJCQkJCQlcbiI7Ci0KLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibmV3IE1lbWJlcigpLmYiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSBOT05FOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJmIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9IAotCQkicGFja2FnZSBwYWNrO1xuIiArIAotCQkiY2xhc3MgQSB7XG4iICsgCi0JCSIgIGNsYXNzIE1lbWJlciB7XG4iICsgCi0JCSIgICAgTWVtYmVyKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgICBpbnQgZm9vKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBBKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3YpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImYiOwkJCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxzaG91bGQgbm90IGZpbmQgZmFrZSBmaWVsZCBvZiB0eXBlIGY+IjsKLQotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCWN1cnNvckxvY2F0aW9uLCAKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBDb21wbGV0ZSBvbiBhbm9ueW1vdXMgdHlwZSBpbiBmaWVsZCBpbml0aWFsaXplci4KLSAqLwotcHVibGljIHZvaWQgdGVzdDU1KCkgewotCi0JU3RyaW5nIHN0ciA9Ci0JCSJjbGFzcyBYIHsJCQkJCQkJCQlcbiIgKwotCQkiCU9iamVjdCBvID0gbmV3IE9iamVjdCgpewkJCQlcbiIgKwotCQkiCQl2b2lkIGZvbygpewkJCQkJCQlcbiIgKwotCQkiCQkJU3RyaW5nIHggPSBcIlwiOwkJCQlcbiIgKwotCQkiCQkJeC5pbmRleAkJCQkJCQlcbiIgKwotCQkiCQl9CQkJCQkJCQkJXG4iICsKLQkJIgkJCQkJCQkJCQkJXG4iICsKLQkJIgkJdm9pZCBiYXIoKXsJCQkJCQkJXG4iICsKLQkJIgkJCVN0cmluZyB5ID0gXCJcIjsJCQkJXG4iICsKLQkJIgkJfQkJCQkJCQkJCVxuIiArCi0JCSIJfTsJCQkJCSAJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQlcbiI7IAotCi0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInguaW5kZXgiOwotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPENvbXBsZXRlT25OYW1lOnguaW5kZXg+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiaW5kZXgiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0gCi0JCSJjbGFzcyBYIHtcbiIgKyAKLQkJIiAgT2JqZWN0IG8gPSBuZXcgT2JqZWN0KCkge1xuIiArIAotCQkiICAgICgpIHtcbiIgKyAKLQkJIiAgICAgIHN1cGVyKCk7XG4iICsKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgICBTdHJpbmcgeDtcbiIgKyAKLQkJIiAgICAgIDxDb21wbGV0ZU9uTmFtZTp4LmluZGV4PjtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9O1xuIiArIAotCQkiICBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInguaW5kZXgiOwkJCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb21wbGV0ZSBvbiBhbm9ueW1vdXMgdHlwZSBpbiBmaWVsZCBpbml0aWFsaXplcj4iOwotCi0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCkgLSAxOwotCXRoaXMuY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJY3Vyc29yTG9jYXRpb24sIAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3BhcnNlci9EaWV0UmVjb3ZlcnlUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL0RpZXRSZWNvdmVyeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ1NmU5ZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL0RpZXRSZWNvdmVyeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4MzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMudXRpbC5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LmNvbXBsZXRlLkNvbXBsZXRpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5EZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Tb3VyY2VFbGVtZW50UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmJhdGNoLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuU291cmNlVHlwZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnBhcnNlci5QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uRGVmYXVsdFByb2JsZW1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1SZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIERpZXRSZWNvdmVyeVRlc3QgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5qdW5pdC5leHRlbnNpb24uVGVzdENhc2UgewotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcHRpbWl6ZVN0cmluZ0xpdGVyYWxzID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBsb25nIHNvdXJjZUxldmVsID0gQ29tcGlsZXJPcHRpb25zLkpESzFfMzsgLy8kTk9OLU5MUy0xJAotCQotcHVibGljIERpZXRSZWNvdmVyeVRlc3QoU3RyaW5nIHRlc3ROYW1lKXsKLQlzdXBlcih0ZXN0TmFtZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIGNoZWNrUGFyc2UoCi0JY2hhcltdIHNvdXJjZSwgCi0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQlTdHJpbmcgZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsIAotCVN0cmluZyB0ZXN0TmFtZSkgewotCi0JLyogdXNpbmcgcmVndWxhciBwYXJzZXIgaW4gRElFVCBtb2RlICovCi0JewotCQlQYXJzZXIgcGFyc2VyID0gCi0JCQluZXcgUGFyc2VyKAotCQkJCW5ldyBQcm9ibGVtUmVwb3J0ZXIoCi0JCQkJCURlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXMucHJvY2VlZFdpdGhBbGxQcm9ibGVtcygpLCAKLQkJCQkJbmV3IENvbXBpbGVyT3B0aW9ucygpLCAKLQkJCQkJbmV3IERlZmF1bHRQcm9ibGVtRmFjdG9yeShMb2NhbGUuZ2V0RGVmYXVsdCgpKSksCi0JCQkJb3B0aW1pemVTdHJpbmdMaXRlcmFscywKLQkJCQlzb3VyY2VMZXZlbCk7Ci0KLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gbmV3IENvbXBpbGF0aW9uVW5pdChzb3VyY2UsIHRlc3ROYW1lLCBudWxsKTsKLQkJQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQgPSBuZXcgQ29tcGlsYXRpb25SZXN1bHQoc291cmNlVW5pdCwgMCwgMCwgMCk7CQotCQkKLQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gY29tcHV0ZWRVbml0ID0gcGFyc2VyLmRpZXRQYXJzZShzb3VyY2VVbml0LCBjb21waWxhdGlvblJlc3VsdCk7Ci0JCVN0cmluZyBjb21wdXRlZFVuaXRUb1N0cmluZyA9IGNvbXB1dGVkVW5pdC50b1N0cmluZygpOwotCQlpZiAoIWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZy5lcXVhbHMoY29tcHV0ZWRVbml0VG9TdHJpbmcpKXsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihVdGlsLmRpc3BsYXlTdHJpbmcoY29tcHV0ZWRVbml0VG9TdHJpbmcpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiSW52YWxpZCB1bml0IGRpZXQgc3RydWN0dXJlIiArIHRlc3ROYW1lLAotCQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQkJY29tcHV0ZWRVbml0VG9TdHJpbmcpOwotCX0KLQkvKiB1c2luZyByZWd1bGFyIHBhcnNlciBpbiBESUVUIG1vZGUgKyBnZXRNZXRob2RCb2RpZXMgKi8KLQl7Ci0JCVBhcnNlciBwYXJzZXIgPSAKLQkJCW5ldyBQYXJzZXIoCi0JCQkJbmV3IFByb2JsZW1SZXBvcnRlcigKLQkJCQkJRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llcy5wcm9jZWVkV2l0aEFsbFByb2JsZW1zKCksIAotCQkJCQluZXcgQ29tcGlsZXJPcHRpb25zKCksIAotCQkJCQluZXcgRGVmYXVsdFByb2JsZW1GYWN0b3J5KExvY2FsZS5nZXREZWZhdWx0KCkpKSwKLQkJCQlvcHRpbWl6ZVN0cmluZ0xpdGVyYWxzLAotCQkJCXNvdXJjZUxldmVsKTsKLQotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBuZXcgQ29tcGlsYXRpb25Vbml0KHNvdXJjZSwgdGVzdE5hbWUsIG51bGwpOwotCQlDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCA9IG5ldyBDb21waWxhdGlvblJlc3VsdChzb3VyY2VVbml0LCAwLCAwLCAwKTsJCi0JCQotCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBjb21wdXRlZFVuaXQgPSBwYXJzZXIuZGlldFBhcnNlKHNvdXJjZVVuaXQsIGNvbXBpbGF0aW9uUmVzdWx0KTsKLQkJU3RyaW5nIGNvbXB1dGVkVW5pdFRvU3RyaW5nID0gY29tcHV0ZWRVbml0LnRvU3RyaW5nKCk7Ci0JCWlmICghZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLmVxdWFscyhjb21wdXRlZFVuaXRUb1N0cmluZykpewotCQkJU3lzdGVtLm91dC5wcmludGxuKFV0aWwuZGlzcGxheVN0cmluZyhjb21wdXRlZFVuaXRUb1N0cmluZykpOwotCQl9Ci0JCWFzc2VydEVxdWFscygKLQkJCSJJbnZhbGlkIHVuaXQgZGlldCBzdHJ1Y3R1cmUiICsgdGVzdE5hbWUsCi0JCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCQljb21wdXRlZFVuaXRUb1N0cmluZyk7Ci0JCWlmIChjb21wdXRlZFVuaXQudHlwZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IGNvbXB1dGVkVW5pdC50eXBlcy5sZW5ndGg7IC0taSA+PSAwOyl7Ci0JCQkJY29tcHV0ZWRVbml0LnR5cGVzW2ldLmJpbmRpbmcgPSBuZXcgU291cmNlVHlwZUJpbmRpbmcoKXt9OwotCQkJCWNvbXB1dGVkVW5pdC50eXBlc1tpXS5wYXJzZU1ldGhvZChwYXJzZXIsIGNvbXB1dGVkVW5pdCk7Ci0JCQl9Ci0JCX0KLQkJY29tcHV0ZWRVbml0VG9TdHJpbmcgPSBjb21wdXRlZFVuaXQudG9TdHJpbmcoKTsKLQkJaWYgKCFleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZy5lcXVhbHMoY29tcHV0ZWRVbml0VG9TdHJpbmcpKXsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihVdGlsLmRpc3BsYXlTdHJpbmcoY29tcHV0ZWRVbml0VG9TdHJpbmcpKTsKLQkJfQotCQkKLQkJYXNzZXJ0RXF1YWxzKAotCQkJIkludmFsaWQgdW5pdCBkaWV0K2JvZHkgc3RydWN0dXJlIiArIHRlc3ROYW1lLAotCQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCQljb21wdXRlZFVuaXRUb1N0cmluZyk7Ci0JfQotCS8qIHVzaW5nIHJlZ3VsYXIgcGFyc2VyIGluIEZVTEwgbW9kZSAqLwotCXsKLQkJUGFyc2VyIHBhcnNlciA9IAotCQkJbmV3IFBhcnNlcigKLQkJCQluZXcgUHJvYmxlbVJlcG9ydGVyKAotCQkJCQlEZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzLnByb2NlZWRXaXRoQWxsUHJvYmxlbXMoKSwgCi0JCQkJCW5ldyBDb21waWxlck9wdGlvbnMoKSwgCi0JCQkJCW5ldyBEZWZhdWx0UHJvYmxlbUZhY3RvcnkoTG9jYWxlLmdldERlZmF1bHQoKSkpLAotCQkJCW9wdGltaXplU3RyaW5nTGl0ZXJhbHMsCi0JCQkJc291cmNlTGV2ZWwpOwotCi0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IG5ldyBDb21waWxhdGlvblVuaXQoc291cmNlLCB0ZXN0TmFtZSwgbnVsbCk7Ci0JCUNvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KHNvdXJjZVVuaXQsIDAsIDAsIDApOwkKLQkJCi0JCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIGNvbXB1dGVkVW5pdCA9IHBhcnNlci5wYXJzZShzb3VyY2VVbml0LCBjb21waWxhdGlvblJlc3VsdCk7Ci0JCVN0cmluZyBjb21wdXRlZFVuaXRUb1N0cmluZyA9IGNvbXB1dGVkVW5pdC50b1N0cmluZygpOwotCQlpZiAoIWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZy5lcXVhbHMoY29tcHV0ZWRVbml0VG9TdHJpbmcpKXsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihVdGlsLmRpc3BsYXlTdHJpbmcoY29tcHV0ZWRVbml0VG9TdHJpbmcpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiSW52YWxpZCB1bml0IGZ1bGwgc3RydWN0dXJlIiArIHRlc3ROYW1lLAotCQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAotCQkJY29tcHV0ZWRVbml0VG9TdHJpbmcpOwotCi0JfQotCS8qIHVzaW5nIHNvdXJjZSBlbGVtZW50IHBhcnNlciBpbiBESUVUIG1vZGUgKi8KLQl7Ci0JCVNvdXJjZUVsZW1lbnRQYXJzZXIgcGFyc2VyID0KLQkJCW5ldyBTb3VyY2VFbGVtZW50UGFyc2VyKAotCQkJCW5ldyBUZXN0U291cmNlRWxlbWVudFJlcXVlc3RvcigpLAotCQkJCW5ldyBEZWZhdWx0UHJvYmxlbUZhY3RvcnkoTG9jYWxlLmdldERlZmF1bHQoKSksCi0JCQkJbmV3IENvbXBpbGVyT3B0aW9ucygpKTsKLQkJCQotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBuZXcgQ29tcGlsYXRpb25Vbml0KHNvdXJjZSwgdGVzdE5hbWUsIG51bGwpOwotCQlDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCA9IG5ldyBDb21waWxhdGlvblJlc3VsdChzb3VyY2VVbml0LCAwLCAwLCAwKTsJCi0JCQotCQlDb21waWxhdGlvblVuaXREZWNsYXJhdGlvbiBjb21wdXRlZFVuaXQgPSBwYXJzZXIuZGlldFBhcnNlKHNvdXJjZVVuaXQsIGNvbXBpbGF0aW9uUmVzdWx0KTsKLQkJU3RyaW5nIGNvbXB1dGVkVW5pdFRvU3RyaW5nID0gY29tcHV0ZWRVbml0LnRvU3RyaW5nKCk7Ci0JCWlmICghZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLmVxdWFscyhjb21wdXRlZFVuaXRUb1N0cmluZykpewotCQkJU3lzdGVtLm91dC5wcmludGxuKFV0aWwuZGlzcGxheVN0cmluZyhjb21wdXRlZFVuaXRUb1N0cmluZykpOwotCQl9Ci0JCWFzc2VydEVxdWFscygKLQkJCSJJbnZhbGlkIHNvdXJjZSBlbGVtZW50IGRpZXQgc3RydWN0dXJlIiArIHRlc3ROYW1lLAotCQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQkJY29tcHV0ZWRVbml0VG9TdHJpbmcpOwotCX0KLQkvKiB1c2luZyBzb3VyY2UgZWxlbWVudCBwYXJzZXIgaW4gRlVMTCBtb2RlICovCi0JewotCQlTb3VyY2VFbGVtZW50UGFyc2VyIHBhcnNlciA9Ci0JCQluZXcgU291cmNlRWxlbWVudFBhcnNlcigKLQkJCQluZXcgVGVzdFNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IoKSwKLQkJCQluZXcgRGVmYXVsdFByb2JsZW1GYWN0b3J5KExvY2FsZS5nZXREZWZhdWx0KCkpLAotCQkJCW5ldyBDb21waWxlck9wdGlvbnMoKSk7Ci0JCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gbmV3IENvbXBpbGF0aW9uVW5pdChzb3VyY2UsIHRlc3ROYW1lLCBudWxsKTsKLQkJQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQgPSBuZXcgQ29tcGlsYXRpb25SZXN1bHQoc291cmNlVW5pdCwgMCwgMCwgMCk7CQotCQkKLQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gY29tcHV0ZWRVbml0ID0gcGFyc2VyLnBhcnNlKHNvdXJjZVVuaXQsIGNvbXBpbGF0aW9uUmVzdWx0KTsKLQkJU3RyaW5nIGNvbXB1dGVkVW5pdFRvU3RyaW5nID0gY29tcHV0ZWRVbml0LnRvU3RyaW5nKCk7Ci0JCWlmICghZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLmVxdWFscyhjb21wdXRlZFVuaXRUb1N0cmluZykpewotCQkJU3lzdGVtLm91dC5wcmludGxuKFV0aWwuZGlzcGxheVN0cmluZyhjb21wdXRlZFVuaXRUb1N0cmluZykpOwotCQl9Ci0JCWFzc2VydEVxdWFscygKLQkJCSJJbnZhbGlkIHNvdXJjZSBlbGVtZW50IGZ1bGwgc3RydWN0dXJlIiArIHRlc3ROYW1lLAotCQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAotCQkJY29tcHV0ZWRVbml0VG9TdHJpbmcpOwotCX0JCi0JLyogdXNpbmcgY29tcGxldGlvbiBwYXJzZXIgaW4gRElFVCBtb2RlICovCi0JewotCQlDb21waWxlck9wdGlvbnMgb3B0aW9ucyA9IG5ldyBDb21waWxlck9wdGlvbnMoKTsKLQkJQ29tcGxldGlvblBhcnNlciBwYXJzZXIgPQotCQkJbmV3IENvbXBsZXRpb25QYXJzZXIoCi0JCQkJbmV3IFByb2JsZW1SZXBvcnRlcigKLQkJCQkJRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llcy5wcm9jZWVkV2l0aEFsbFByb2JsZW1zKCksIAotCQkJCQlvcHRpb25zLCAKLQkJCQkJbmV3IERlZmF1bHRQcm9ibGVtRmFjdG9yeShMb2NhbGUuZ2V0RGVmYXVsdCgpKSksCi0JCQkJb3B0aW9ucy5zb3VyY2VMZXZlbCk7Ci0JCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gbmV3IENvbXBpbGF0aW9uVW5pdChzb3VyY2UsIHRlc3ROYW1lLCBudWxsKTsKLQkJQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQgPSBuZXcgQ29tcGlsYXRpb25SZXN1bHQoc291cmNlVW5pdCwgMCwgMCwgMCk7CQotCQkKLQkJQ29tcGlsYXRpb25Vbml0RGVjbGFyYXRpb24gY29tcHV0ZWRVbml0ID0gcGFyc2VyLmRpZXRQYXJzZShzb3VyY2VVbml0LCBjb21waWxhdGlvblJlc3VsdCwgSW50ZWdlci5NQVhfVkFMVUUpOwotCQlTdHJpbmcgY29tcHV0ZWRVbml0VG9TdHJpbmcgPSBjb21wdXRlZFVuaXQudG9TdHJpbmcoKTsKLQkJaWYgKCFleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nLmVxdWFscyhjb21wdXRlZFVuaXRUb1N0cmluZykpewotCQkJU3lzdGVtLm91dC5wcmludGxuKFV0aWwuZGlzcGxheVN0cmluZyhjb21wdXRlZFVuaXRUb1N0cmluZykpOwotCQl9Ci0JCWFzc2VydEVxdWFscygKLQkJCSJJbnZhbGlkIGNvbXBsZXRpb24gZGlldCBzdHJ1Y3R1cmUiICsgdGVzdE5hbWUsCi0JCQlleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nLAotCQkJY29tcHV0ZWRVbml0VG9TdHJpbmcpOwotCX0KLX0KLS8qCi0gKiBTaG91bGQgdHJlYXQgdmFyaWFibGVzICdoJyBhbmQgJ2knIGFzIGZpZWxkcyBzaW5jZSAncHVibGljJy4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxKCkgewotCi0JU3RyaW5nIHMgPSAKLQkJInBhY2thZ2UgYTsJCQkJCQkJCQkJCVxuIgotCQkJKyAiaW1wb3J0IGphdmEubGFuZy4qOwkJCQkJCQlcbiIKLQkJCSsgImltcG9ydCBqYXZhLnV0aWwuKjsJCQkJCQkJXG4iCi0JCQkrICIJCQkJCQkJCQkJCQlcbiIKLQkJCSsgInB1YmxpYyBjbGFzcyBYIHsJCQkJCQkJCVxuIgotCQkJKyAiCXZvaWQgZm9vKCkgewkJCQkJCQkJXG4iCi0JCQkrICIJCVN5c3RlbS5vdXQucHJpbnRsbigpOwkJCQkJXG4iCi0JCQkrICIJCQkJCQkJCQkJCQlcbiIKLQkJCSsgIglwdWJsaWMgaW50IGg7CQkJCQkJCQlcbiIKLQkJCSsgIglwdWJsaWMgaW50W10gaSA9IHsgMCwgMSB9OwkJCQkJXG4iCi0JCQkrICIJCQkJCQkJCQkJCQlcbiIKLQkJCSsgIgl2b2lkIGJhcigpewkJCQkJCQkJCVxuIgotCQkJKyAiCXZvaWQgdHJ1YygpewkJCQkJCQkJXG4iCi0JCQkrICJ9CQkJCQkJCQkJCQlcbiI7IAkKLQotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJInBhY2thZ2UgYTtcbiIgKyAKLQkJImltcG9ydCBqYXZhLmxhbmcuKjtcbiIgKyAKLQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIGludCBoO1xuIiArIAotCQkiICBwdWJsaWMgaW50W10gaSA9IHswLDEsfTtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCB0cnVjKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IAotCQkicGFja2FnZSBhO1xuIiArIAotCQkiaW1wb3J0IGphdmEubGFuZy4qO1xuIiArIAotCQkiaW1wb3J0IGphdmEudXRpbC4qO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgaW50IGg7XG4iICsgCi0JCSIgIHB1YmxpYyBpbnRbXSBpID0gezAsMSx9O1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKwotCQkiICAgIHN1cGVyKCk7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCB0cnVjKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IAotCQkicGFja2FnZSBhO1xuIiArIAotCQkiaW1wb3J0IGphdmEubGFuZy4qO1xuIiArIAotCQkiaW1wb3J0IGphdmEudXRpbC4qO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgaW50IGg7XG4iICsgCi0JCSIgIHB1YmxpYyBpbnRbXSBpO1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIHRydWMoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxwcm9tb3RlIGxvY2FsIHZhcnMgaW50byBmaWVsZHM+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywJCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBTaG91bGQgZmlsdGVyIG91dCBsb2NhbCB0eXBlIGFsdG9nZXRoZXIKLSAqLwotcHVibGljIHZvaWQgdGVzdDAyKCkgewotCi0JU3RyaW5nIHMgPSAKLQkJInBhY2thZ2UgYTsJCQkJCQkJCQkJCVxuIgotCQkJKyAiaW1wb3J0IGphdmEubGFuZy4qOwkJCQkJCQlcbiIKLQkJCSsgImltcG9ydCBqYXZhLnV0aWwuKjsJCQkJCQkJXG4iCi0JCQkrICIJCQkJCQkJCQkJCQlcbiIKLQkJCSsgInB1YmxpYyBjbGFzcyBYIHsJCQkJCQkJCVxuIgotCQkJKyAiCXZvaWQgZm9vKCkgewkJCQkJCQkJXG4iCi0JCQkrICIJCVN5c3RlbS5vdXQucHJpbnRsbigpOwkJCQkJXG4iCi0JCQkrICIJCQkJCQkJCQkJCQlcbiIKLQkJCSsgIgkJY2xhc3MgTCB7CQkJCQkJCQlcbiIKLQkJCSsgIgkJCXZvaWQgYmF6KCl7fQkJCQkJCVxuIgotCQkJKyAiCQl9CQkJCQkJCQkJCVxuIgotCQkJKyAiCQkJCQkJCQkJCQkJXG4iCi0JCQkrICIJcHVibGljIGludCBoOwkJCQkJCQkJXG4iCi0JCQkrICIJcHVibGljIGludFtdIGkgPSB7IDAsIDEgfTsJCQkJCVxuIgotCQkJKyAiCQkJCQkJCQkJCQkJXG4iCi0JCQkrICIJdm9pZCBiYXIoKXsJCQkJCQkJCQlcbiIKLQkJCSsgIgl2b2lkIHRydWMoKXsJCQkJCQkJCVxuIgotCQkJKyAifQkJCQkJCQkJCQkJXG4iOyAKLQotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJInBhY2thZ2UgYTtcbiIgKyAKLQkJImltcG9ydCBqYXZhLmxhbmcuKjtcbiIgKyAKLQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIGludCBoO1xuIiArIAotCQkiICBwdWJsaWMgaW50W10gaSA9IHswLDEsfTtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCB0cnVjKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IAotCQkicGFja2FnZSBhO1xuIiArIAotCQkiaW1wb3J0IGphdmEubGFuZy4qO1xuIiArIAotCQkiaW1wb3J0IGphdmEudXRpbC4qO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgaW50IGg7XG4iICsgCi0JCSIgIHB1YmxpYyBpbnRbXSBpID0gezAsMSx9O1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCB0cnVjKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwkKLQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSAKLQkJInBhY2thZ2UgYTtcbiIgKyAKLQkJImltcG9ydCBqYXZhLmxhbmcuKjtcbiIgKyAKLQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIGludCBoO1xuIiArIAotCQkiICBwdWJsaWMgaW50W10gaTtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCB0cnVjKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8ZmlsdGVyIG91dCBsb2NhbCB0eXBlPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCQotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogU2hvdWxkIHN0aWxsIGJlIGZpbmRpbmcgbGFzdCBtZXRob2QgKCNiYXopCi0gKi8KLQotcHVibGljIHZvaWQgdGVzdDAzKCkgewotCi0JU3RyaW5nIHMgPSAKLQkJInBhY2thZ2UgYTsJCQkJCQkJCQkJCVxuIgotCQkJKyAiaW1wb3J0IGphdmEubGFuZy4qOwkJCQkJCQlcbiIKLQkJCSsgImltcG9ydCBqYXZhLnV0aWwuKjsJCQkJCQkJXG4iCi0JCQkrICIJCQkJCQkJCQkJCQlcbiIKLQkJCSsgInB1YmxpYyBjbGFzcyBYIHsJCQkJCQkJCVxuIgotCQkJKyAiCXZvaWQgZm9vKCkgewkJCQkJCQkJXG4iCi0JCQkrICIJCVN5c3RlbS5vdXQucHJpbnRsbigpOwkJCQkJXG4iCi0JCQkrICIJCQkJCQkJCQkJCQlcbiIKLQkJCSsgIglwdWJsaWMgaW50IGg7CQkJCQkJCQlcbiIKLQkJCSsgIglwdWJsaWMgaW50W10gaSA9IHsgMCwgMSB9OwkJCQkJXG4iCi0JCQkrICIJCQkJCQkJCQkJCQlcbiIKLQkJCSsgIgl2b2lkIGJhcigpewkJCQkJCQkJCVxuIgotCQkJKyAiCXZvaWQgYmF6KCl7CQkJCQkJCQlcbiIKLQkJCSsgIgl9CQkJCQkJCQkJCQlcbiIKLQkJCSsgIn0JCQkJCQkJCQkJCVxuIjsgCi0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJwYWNrYWdlIGE7XG4iICsgCi0JCSJpbXBvcnQgamF2YS5sYW5nLio7XG4iICsgCi0JCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBpbnQgaDtcbiIgKyAKLQkJIiAgcHVibGljIGludFtdIGkgPSB7MCwxLH07XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgYmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgYmF6KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IAotCQkicGFja2FnZSBhO1xuIiArIAotCQkiaW1wb3J0IGphdmEubGFuZy4qO1xuIiArIAotCQkiaW1wb3J0IGphdmEudXRpbC4qO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgaW50IGg7XG4iICsgCi0JCSIgIHB1YmxpYyBpbnRbXSBpID0gezAsMSx9O1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXooKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7CQotCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IAotCQkicGFja2FnZSBhO1xuIiArIAotCQkiaW1wb3J0IGphdmEubGFuZy4qO1xuIiArIAotCQkiaW1wb3J0IGphdmEudXRpbC4qO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgaW50IGg7XG4iICsgCi0JCSIgIHB1YmxpYyBpbnRbXSBpO1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGJheigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHNob3VsZCBmaW5kIGxhc3QgbWV0aG9kPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAkKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nLAkKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIFNob3VsZCBmaW5kaW5nIDUgZmllbGRzLgotICovCi0KLXB1YmxpYyB2b2lkIHRlc3QwNCgpIHsKLQotCVN0cmluZyBzID0gCi0JCSJwYWNrYWdlIGE7CQkJCQkJCQkJCQlcbiIKLQkJCSsgImltcG9ydCBqYXZhLmxhbmcuKjsJCQkJCQkJXG4iCi0JCQkrICJpbXBvcnQgamF2YS51dGlsLio7CQkJCQkJCVxuIgotCQkJKyAiCQkJCQkJCQkJCQkJXG4iCi0JCQkrICJwdWJsaWMgY2xhc3MgWCB7CQkJCQkJCQlcbiIKLQkJCSsgIiBYIHg7CQkJCQkJCQkJCVxuIgotCQkJKyAiIE9iamVjdCBhLCBiID0gbnVsbDsJCQkJCQkJXG4iCi0JCQkrICIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIKLQkJCSsgIgkJU3lzdGVtLm91dC5wcmludGxuKCk7CQkJCQlcbiIKLQkJCSsgIgkJCQkJCQkJCQkJCVxuIgotCQkJKyAiCXB1YmxpYyBpbnQgaDsJCQkJCQkJCVxuIgotCQkJKyAiCXB1YmxpYyBpbnRbXSBpID0geyAwLCAxIH07CQkJCQlcbiIKLQkJCSsgIgkJCQkJCQkJCQkJCVxuIgotCQkJKyAiCXZvaWQgYmFyKCl7CQkJCQkJCQkJXG4iCi0JCQkrICIJdm9pZCB0cnVjKCl7CQkJCQkJCQlcbiIKLQkJCSsgIn0JCQkJCQkJCQkJCVxuIjsgCi0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJwYWNrYWdlIGE7XG4iICsgCi0JCSJpbXBvcnQgamF2YS5sYW5nLio7XG4iICsgCi0JCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIFggeDtcbiIgKyAKLQkJIiAgT2JqZWN0IGE7XG4iICsgCi0JCSIgIE9iamVjdCBiID0gbnVsbDtcbiIgKyAKLQkJIiAgcHVibGljIGludCBoO1xuIiArIAotCQkiICBwdWJsaWMgaW50W10gaSA9IHswLDEsfTtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCB0cnVjKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJwYWNrYWdlIGE7XG4iICsgCi0JCSJpbXBvcnQgamF2YS5sYW5nLio7XG4iICsgCi0JCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIFggeDtcbiIgKyAKLQkJIiAgT2JqZWN0IGE7XG4iICsgCi0JCSIgIE9iamVjdCBiID0gbnVsbDtcbiIgKyAKLQkJIiAgcHVibGljIGludCBoO1xuIiArIAotCQkiICBwdWJsaWMgaW50W10gaSA9IHswLDEsfTtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgICAgc3VwZXIoKTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIHRydWMoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSAKLQkJInBhY2thZ2UgYTtcbiIgKyAKLQkJImltcG9ydCBqYXZhLmxhbmcuKjtcbiIgKyAKLQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgWCB4O1xuIiArIAotCQkiICBPYmplY3QgYTtcbiIgKyAKLQkJIiAgT2JqZWN0IGI7XG4iICsgCi0JCSIgIHB1YmxpYyBpbnQgaDtcbiIgKyAKLQkJIiAgcHVibGljIGludFtdIGk7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgYmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgdHJ1YygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGZpdmUgZmllbGRzPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAkKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nLAkKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIERpZXQgcGFyc2UgdGhpbmtzIGl0IGlzIHN1Y2Nlc3NmdWwgLSBubyByZWNvdmVyeQotICovCi0KLXB1YmxpYyB2b2lkIHRlc3QwNSgpIHsKLQkKLQlTdHJpbmcgcyA9IAotCQkicHVibGljIGNsYXNzIFggewkJCQkJCQkJCVxuIgotCQkJKyAiCXZvaWQgZm9vKCkgewkJCQkJCQkJXG4iCi0JCQkrICIJCVN5c3RlbS5vdXQucHJpbnRsbigpOwkJCQkJXG4iCi0JCQkrICIgCXZvaWQgYmF6KCl7fQkJCQkJCQlcbiIKLQkJCSsgIiB9CQkJCQkJCQkJCQlcbiIKLQkJCSsgIgkJCQkJCQkJCQkJCVxuIgotCQkJKyAiCXZvaWQgYmFyKCl7CQkJCQkJCQkJXG4iCi0JCQkrICIgfQkJCQkJCQkJCQkJXG4iCi0JCQkrICIJdm9pZCB0cnVjKCl7CQkJCQkJCQlcbiIKLQkJCSsgIiB9CQkJCQkJCQkJCQlcbiIKLQkJCSsgIn0JCQkJCQkJCQkJCVxuIjsgCi0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgYmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgdHJ1YygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgYmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgdHJ1YygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXooKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCB0cnVjKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGRpZXQgd2FzIHN1Y2Nlc3NmdWw+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCQotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogUmVjb3Zlcnkgd2lsbCBub3QgcmVzdGFydCBmcm9tIHNjcmF0Y2gsIGFuZCBtaXNzIHNvbWUgc2lnbmF0dXJlcyAoI2JheigpKQotICovCi0KLXB1YmxpYyB2b2lkIHRlc3QwNigpIHsKLQkKLQlTdHJpbmcgcyA9IAotCQkJImltcG9ydCBqYXZhLmxhbmcuKjsJCQkJCQkJXG4iCi0JCQkrICIJCQkJCQkJCQkJCQlcbiIKLQkJCSsgInB1YmxpYyBjbGFzcyBYIHsJCQkJCQkJCVxuIgotCQkJKyAiCXZvaWQgZm9vKCkgewkJCQkJCQkJXG4iCi0JCQkrICIJCVN5c3RlbS5vdXQucHJpbnRsbigpOwkJCQkJXG4iCi0JCQkrICIgCXZvaWQgYmF6KCl7fQkJCQkJCQlcbiIKLQkJCSsgIiB9CQkJCQkJCQkJCQlcbiIKLQkJCSsgIgkJCQkJCQkJCQkJCVxuIgotCQkJKyAiCXZvaWQgYmFyKCl7CQkJCQkJCQkJXG4iCi0JCQkrICIgfQkJCQkJCQkJCQkJXG4iCi0JCQkrICIJdm9pZCB0cnVjKCl7CQkJCQkJCQlcbiIKLQkJCSsgIn0JCQkJCQkJCQkJCVxuIjsgCi0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJpbXBvcnQgamF2YS5sYW5nLio7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgYmF6KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgYmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgdHJ1YygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJpbXBvcnQgamF2YS5sYW5nLio7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICAgIHN1cGVyKCk7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXooKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCB0cnVjKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHdpbGwgbm90IG1pc3MgbmVzdGVkIG1ldGhvZD4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIEF0dGFjaGluZyBvcnBoYW4gbWV0aG9kcyBhbmQgZmllbGRzIAotICovCi0KLXB1YmxpYyB2b2lkIHRlc3QwNygpIHsKLQkKLQlTdHJpbmcgcyA9IAotCQkJInB1YmxpYyBjbGFzcyBYIHsJCQkJCQkJCVxuIgotCQkJKyAiCXZvaWQgZm9vKCkgewkJCQkJCQkJXG4iCi0JCQkrICIJCVN5c3RlbS5vdXQucHJpbnRsbigpOwkJCQkJXG4iCi0JCQkrICIgfQkJCQkJCQkJCQkJXG4iCi0JCQkrICJ9CQkJCQkJCQkJCQlcbiIKLQkJCSsgIgl2b2lkIGJhcigpewkJCQkJCQkJCVxuIgotCQkJKyAiIH0JCQkJCQkJCQkJCVxuIgotCQkJKyAiIGludCB4OwkJCQkJCQkJCQlcbiIKLQkJCSsgIgl2b2lkIGJheigpewkJCQkJCQkJCVxuIgotCQkJKyAiIH0JCQkJCQkJCQkJCVxuIgotCQkJKyAiIGludCB5OwkJCQkJCQkJCQlcbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIGludCB4O1xuIiArIAotCQkiICBpbnQgeTtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXooKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgaW50IHg7XG4iICsgCi0JCSIgIGludCB5O1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIFN5c3RlbS5vdXQucHJpbnRsbigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgYmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgYmF6KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxhdHRhY2hpbmcgb3JwaGFucz4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywJCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBQcm9wZXJseSBhdHRhY2hpbmcgZmllbGRzL21ldGhvZHMgdG8gbWVtYmVyIHR5cGUKLSAqLwotCi1wdWJsaWMgdm9pZCB0ZXN0MDgoKSB7Ci0KLQlTdHJpbmcgcyA9IAotCQkJInB1YmxpYyBjbGFzcyBYIHsJCQkJCQkJCVxuIgotCQkJKyAiIGNsYXNzIFkgewkJCQkJCQkJCVxuIgotCQkJKyAiCSAgdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIKLQkJCSsgIgkgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsJCQkJCVxuIgotCQkJKyAiICAgfQkJCQkJCQkJCQkJXG4iCi0JCQkrICIgcHVibGljIGludCBoOwkJCQkJCQkJXG4iCi0JCQkrICIgcHVibGljIGludFtdIGkgPSB7MCwgMX07CQkJCQlcbiIKLQkJCSsgIgl2b2lkIGJhcigpewkJCQkJCQkJCVxuIgotCQkJKyAiCXZvaWQgYmF6KCl7CQkJCQkJCQkJXG4iCi0JCQkrICIgfQkJCQkJCQkJCQkJXG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBjbGFzcyBZIHtcbiIgKyAKLQkJIiAgICBwdWJsaWMgaW50IGg7XG4iICsgCi0JCSIgICAgcHVibGljIGludFtdIGkgPSB7MCwxLH07XG4iICsgCi0JCSIgICAgWSgpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICAgIHZvaWQgYmFyKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgICB2b2lkIGJheigpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIGNsYXNzIFkge1xuIiArIAotCQkiICAgIHB1YmxpYyBpbnQgaDtcbiIgKyAKLQkJIiAgICBwdWJsaWMgaW50W10gaSA9IHswLDEsfTtcbiIgKyAKLQkJIiAgICBZKCkge1xuIiArIAotCQkiICAgICAgc3VwZXIoKTtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICAgIHZvaWQgYmF6KCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIGNsYXNzIFkge1xuIiArIAotCQkiICAgIHB1YmxpYyBpbnQgaDtcbiIgKyAKLQkJIiAgICBwdWJsaWMgaW50W10gaTtcbiIgKyAKLQkJIiAgICBZKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICAgIHZvaWQgYmF6KCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGF0dGFjaGluZyB0byBtZW1iZXIgdHlwZT4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nLAotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogUHJvcGVybHkgYXR0YWNoaW5nIGZpZWxkcy9tZXRob2RzIHRvIGVuY2xvc2luZyB0eXBlCi0gKi8KLQotcHVibGljIHZvaWQgdGVzdDA5KCkgewotCi0JU3RyaW5nIHMgPSAKLQkJCSJwdWJsaWMgY2xhc3MgWCB7CQkJCQkJCQlcbiIKLQkJCSsgIiBjbGFzcyBZIHsJCQkJCQkJCQlcbiIKLQkJCSsgIgkgIHZvaWQgZm9vKCkgewkJCQkJCQkJXG4iCi0JCQkrICIJICAgU3lzdGVtLm91dC5wcmludGxuKCk7CQkJCQlcbiIKLQkJCSsgIiAgIH0JCQkJCQkJCQkJCVxuIgotCQkJKyAiIH0JCQkJCQkJCQkJCVxuIgotCQkJKyAiIHB1YmxpYyBpbnQgaDsJCQkJCQkJCVxuIgotCQkJKyAiIHB1YmxpYyBpbnRbXSBpID0gezAsIDF9OwkJCQkJXG4iCi0JCQkrICIJdm9pZCBiYXIoKXsJCQkJCQkJCQlcbiIKLQkJCSsgIgl2b2lkIGJheigpewkJCQkJCQkJCVxuIgotCQkJKyAiIH0JCQkJCQkJCQkJCVxuIjsKLQotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgY2xhc3MgWSB7XG4iICsgCi0JCSIgICAgWSgpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBpbnQgaDtcbiIgKyAKLQkJIiAgcHVibGljIGludFtdIGkgPSB7MCwxLH07XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgYmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgYmF6KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIGNsYXNzIFkge1xuIiArIAotCQkiICAgIFkoKSB7XG4iICsgCi0JCSIgICAgICBzdXBlcigpO1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpO1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgaW50IGg7XG4iICsgCi0JCSIgIHB1YmxpYyBpbnRbXSBpID0gezAsMSx9O1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgYmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgYmF6KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBjbGFzcyBZIHtcbiIgKyAKLQkJIiAgICBZKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIGludCBoO1xuIiArIAotCQkiICBwdWJsaWMgaW50W10gaTtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXooKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxhdHRhY2hpbmcgdG8gZW5jbG9zaW5nIHR5cGU+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCQotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogUHJvcGVybHkgYXR0YWNoaW5nIGZpZWxkcy9tZXRob2RzIHRvIG1lbWJlciB0eXBlIGluIHByZXNlbmNlIG9mIG1pc3NpbmcKLSAqIG1lbWJlciB0eXBlIG9wZW5pbmcgYnJhY2UgKFkpIChhbmQgYXJyYXkgaW5pdGlhbGl6ZXIgZm9yIChpKSkuCi0gKi8KLQotcHVibGljIHZvaWQgdGVzdDEwKCkgewotCi0JU3RyaW5nIHMgPSAKLQkJCSJwdWJsaWMgY2xhc3MgWCB7CQkJCQkJCQlcbiIKLQkJCSsgIiBjbGFzcyBZIAkJCQkJCQkJCVxuIgotCQkJKyAiCSAgdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIKLQkJCSsgIgkgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsJCQkJCVxuIgotCQkJKyAiICAgfQkJCQkJCQkJCQkJXG4iCi0JCQkrICIgcHVibGljIGludCBoOwkJCQkJCQkJXG4iCi0JCQkrICIgcHVibGljIGludFtdIGkgPSB7MCwgMX07CQkJCQlcbiIKLQkJCSsgIgl2b2lkIGJhcigpewkJCQkJCQkJCVxuIgotCQkJKyAiCXZvaWQgYmF6KCl7CQkJCQkJCQkJXG4iCi0JCQkrICIgfQkJCQkJCQkJCQkJXG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBjbGFzcyBZIHtcbiIgKyAKLQkJIiAgICBwdWJsaWMgaW50IGg7XG4iICsgCi0JCSIgICAgcHVibGljIGludFtdIGkgPSB7MCwxLH07XG4iICsgCi0JCSIgICAgWSgpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICAgIHZvaWQgYmFyKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgICB2b2lkIGJheigpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIGNsYXNzIFkge1xuIiArIAotCQkiICAgIHB1YmxpYyBpbnQgaDtcbiIgKyAKLQkJIiAgICBwdWJsaWMgaW50W10gaSA9IHswLDEsfTtcbiIgKyAKLQkJIiAgICBZKCkge1xuIiArIAotCQkiICAgICAgc3VwZXIoKTtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICAgIHZvaWQgYmF6KCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBjbGFzcyBZIHtcbiIgKyAKLQkJIiAgICBwdWJsaWMgaW50IGg7XG4iICsgCi0JCSIgICAgcHVibGljIGludFtdIGk7XG4iICsgCi0JCSIgICAgWSgpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICAgIHZvaWQgYmFyKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgICB2b2lkIGJheigpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxtaXNzaW5nIGJyYWNlICsgYXJyYXkgaW5pdGlhbGl6ZXI+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIEF0dGFjaGluZyBvcnBoYW4gbWV0aG9kcyBhbmQgZmllbGRzLCBieSBjb3VudGluZyBicmFja2V0cwotICogdmFyaWFibGUgJ3gnIHNob3VsZCBiZSBlbGltaW5hdGVkIChsb29rcyBsaWtlIGEgbG9jYWwgdmFyaWFibGUpIAotICovCi0KLXB1YmxpYyB2b2lkIHRlc3QxMSgpIHsKLQkKLQlTdHJpbmcgcyA9IAotCQkJInB1YmxpYyBjbGFzcyBYIHsJCQkJCQkJCVxuIgotCQkJKyAiCXZvaWQgZm9vKCkgewkJCQkJCQkJXG4iCi0JCQkrICIJCVN5c3RlbS5vdXQucHJpbnRsbigpOwkJCQkJXG4iCi0JCQkrICIgfQkJCQkJCQkJCQkJXG4iCi0JCQkrICJ9CQkJCQkJCQkJCQlcbiIKLQkJCSsgIgl2b2lkIGJhcigpewkJCQkJCQkJCVxuIgotCQkJKyAiICBpbnQgeDsJCQkJCQkJCQkJXG4iCi0JCQkrICIJdm9pZCBiYXooKXsJCQkJCQkJCQlcbiIKLQkJCSsgIiB9CQkJCQkJCQkJCQlcbiIKLQkJCSsgIiBpbnQgeTsJCQkJCQkJCQkJXG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBpbnQgeTtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXooKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBpbnQgeTtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgICAgc3VwZXIoKTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGJheigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkJCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8YXR0YWNoaW5nIG9ycGhhbnMgd2l0aCBtaXNzaW5nIGJyYWNrZXRzPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQotCQlleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nLAkKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIEF0dGFjaGluZyBvcnBoYW4gbWV0aG9kcyBhbmQgZmllbGRzLCBieSBjb3VudGluZyBicmFja2V0cwotICogdmFyaWFibGUgJ3gnIHNob3VsZCBOT1QgYmUgZWxpbWluYXRlZCBnaXZlbiBpdCBsb29rcyBsaWtlIGEgZmllbGQKLSAqLwotCi1wdWJsaWMgdm9pZCB0ZXN0MTIoKSB7Ci0JCi0JU3RyaW5nIHMgPSAKLQkJCSJwdWJsaWMgY2xhc3MgWCB7CQkJCQkJCQlcbiIKLQkJCSsgIgl2b2lkIGZvbygpIHsJCQkJCQkJCVxuIgotCQkJKyAiCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsJCQkJCVxuIgotCQkJKyAiIH0JCQkJCQkJCQkJCVxuIgotCQkJKyAifQkJCQkJCQkJCQkJXG4iCi0JCQkrICIJdm9pZCBiYXIoKXsJCQkJCQkJCQlcbiIKLQkJCSsgIiBwdWJsaWMgaW50IHg7CQkJCQkJCQlcbiIKLQkJCSsgIgl2b2lkIGJheigpewkJCQkJCQkJCVxuIgotCQkJKyAiIH0JCQkJCQkJCQkJCVxuIgotCQkJKyAiIGludCB5OwkJCQkJCQkJCQlcbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIGludCB4O1xuIiArIAotCQkiICBpbnQgeTtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXooKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgaW50IHg7XG4iICsgCi0JCSIgIGludCB5O1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIFN5c3RlbS5vdXQucHJpbnRsbigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgYmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgYmF6KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGF0dGFjaGluZyBvcnBoYW5zIHdpdGggbWlzc2luZyBicmFja2V0cyAyPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nCQksCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywJCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBTaG91bGQgc3RpbGwgcmVjb3ZlciBpbmNvbXBsZXRlIHR5cGUgc2lnbmF0dXJlIChtaXNzaW5nIHN1cGVyY2xhc3MpCi0gKi8KLQotcHVibGljIHZvaWQgdGVzdDEzKCkgewotCQotCVN0cmluZyBzID0gCi0JCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyB7CQkJCQkJXG4iCi0JCQkrICIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIKLQkJCSsgIiB9CQkJCQkJCQkJCQlcbiIKLQkJCSsgIn0JCQkJCQkJCQkJCVxuIjsKLQotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgICAgc3VwZXIoKTtcbiIgKyAJCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8aW52YWxpZCB0eXBlIGhlYWRlcj4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBTaG91bGQgc3RpbGwgcmVjb3ZlciBpbmNvbXBsZXRlIG1ldGhvZCBzaWduYXR1cmUgKG1pc3Npbmcgb3BlbmluZyBicmFjZSkKLSAqLwotCi1wdWJsaWMgdm9pZCB0ZXN0MTQoKSB7Ci0JCi0JU3RyaW5nIHMgPSAKLQkJCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIFRocmVhZCB7CQkJCVxuIgotCQkJKyAiCXZvaWQgZm9vKCkgCQkJCQkJCQkJXG4iCi0JCQkrICIJdm9pZCBiYXIoKSAJCQkJCQkJCQlcbiIKLQkJCSsgIiB9CQkJCQkJCQkJCQlcbiIKLQkJCSsgIn0JCQkJCQkJCQkJCVxuIjsKLQotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgVGhyZWFkIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgVGhyZWFkIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgICAgc3VwZXIoKTtcbiIgKyAJCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPG1ldGhvZCBoZWFkZXIgbWlzc2luZyBvcGVuaW5nIGJyYWNlPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIFNob3VsZCBzdGlsbCByZWNvdmVyIGluY29tcGxldGUgbWV0aG9kIHNpZ25hdHVyZSAobWlzc2luZyB0aHJvd24gZXhjZXB0aW9ucykKLSAqLwotCi1wdWJsaWMgdm9pZCB0ZXN0MTUoKSB7Ci0JCi0JU3RyaW5nIHMgPSAKLQkJCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIFRocmVhZCB7CQkJCVxuIgotCQkJKyAiCXZvaWQgZm9vKCkgdGhyb3dzCQkJCQkJCVxuIgotCQkJKyAiCXZvaWQgYmFyKCkgCQkJCQkJCQkJXG4iCi0JCQkrICIgfQkJCQkJCQkJCQkJXG4iCi0JCQkrICJ9CQkJCQkJCQkJCQlcbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIFRocmVhZCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgYmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBUaHJlYWQge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAkKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8bWV0aG9kIGhlYWRlciBtaXNzaW5nIHRocm93biBleGNlcHRpb25zPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIFNob3VsZCBzdGlsbCByZWNvdmVyIGluY29tcGxldGUgdHlwZSBzaWduYXR1cmUgKG1pc3Npbmcgc3VwZXJpbnRlcmZhY2VzKQotICovCi0KLXB1YmxpYyB2b2lkIHRlc3QxNigpIHsKLQkKLQlTdHJpbmcgcyA9IAotCQkJInB1YmxpYyBjbGFzcyBYIGltcGxlbWVudHMgCQkJCQkJXG4iCi0JCQkrICIJdm9pZCBmb28oKSAJCQkJCQkJCQlcbiIKLQkJCSsgIgl2b2lkIGJhcigpIAkJCQkJCQkJCVxuIgotCQkJKyAiIH0JCQkJCQkJCQkJCVxuIgotCQkJKyAifQkJCQkJCQkJCQkJXG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgYmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICAgIHN1cGVyKCk7XG4iICsgCQotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgYmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjx0eXBlIGhlYWRlciBtaXNzaW5nIHN1cGVyaW50ZXJmYWNlcz4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBTaG91bGQgc3RpbGwgcmVjb3ZlciBpbmNvbXBsZXRlIHR5cGUgc2lnbmF0dXJlIChtaXNzaW5nIHN1cGVyaW50ZXJmYWNlcykKLSAqLwotCi1wdWJsaWMgdm9pZCB0ZXN0MTcoKSB7Ci0JCi0JU3RyaW5nIHMgPSAKLQkJCSJwdWJsaWMgY2xhc3MgWCBpbXBsZW1lbnRzIFksCQkJCQlcbiIKLQkJCSsgIgl2b2lkIGZvbygpIAkJCQkJCQkJCVxuIgotCQkJKyAiCXZvaWQgYmFyKCkgCQkJCQkJCQkJXG4iCi0JCQkrICIgfQkJCQkJCQkJCQkJXG4iCi0JCQkrICJ9CQkJCQkJCQkJCQlcbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCBpbXBsZW1lbnRzIFkge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFggaW1wbGVtZW50cyBZIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgICAgc3VwZXIoKTtcbiIgKyAJCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHR5cGUgaGVhZGVyIG1pc3Npbmcgc3VwZXJpbnRlcmZhY2VzIDI+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBTaG91bGQgZmluZCBtZW1iZXIgdHlwZSBiZWhpbmQgaW5jb21wbGV0ZSBlbmNsb3NpbmcgdHlwZSBoZWFkZXIKLSAqLwotCi1wdWJsaWMgdm9pZCB0ZXN0MTgoKSB7Ci0JCi0JU3RyaW5nIHMgPSAKLQkJCSJwdWJsaWMgY2xhc3MgWCBpbXBsZW1lbnRzIAkJCQkJCVxuIgotCQkJKyAiIGNsYXNzIFkgeyAJCQkJCQkJCQlcbiIKLQkJCSsgIgkgdm9pZCBiYXIoKSAJCQkJCQkJCVxuIgotCQkJKyAiIH0JCQkJCQkJCQkJCVxuIgotCQkJKyAifQkJCQkJCQkJCQkJXG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIGNsYXNzIFkge1xuIiArIAotCQkiICAgIFkoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICAgIHZvaWQgYmFyKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBjbGFzcyBZIHtcbiIgKyAKLQkJIiAgICBZKCkge1xuIiArIAotCQkiICAgICAgc3VwZXIoKTtcbiIgKyAJCi0JCSIgICAgfVxuIiArIAotCQkiICAgIHZvaWQgYmFyKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAkKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8bWVtYmVyIHR5cGUgYmVoaW5kIGluY29tcGxldGUgZW5jbG9zaW5nIHR5cGU+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCQotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogU2hvdWxkIGZpbmQgbWVtYmVyIHR5cGUgd2hlbiBtaXNzaW5nIG9wZW5pbmcgYnJhY2UKLSAqLwotCi1wdWJsaWMgdm9pZCB0ZXN0MTkoKSB7Ci0JCi0JU3RyaW5nIHMgPSAKLQkJCSJwdWJsaWMgY2xhc3MgWCAJCSAJCQkJCQlcbiIKLQkJCSsgIiBjbGFzcyBZIHsgCQkJCQkJCQkJXG4iCi0JCQkrICIJIHZvaWQgYmFyKCkgCQkJCQkJCQlcbiIKLQkJCSsgIiB9CQkJCQkJCQkJCQlcbiIKLQkJCSsgIn0JCQkJCQkJCQkJCVxuIjsKLQotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgY2xhc3MgWSB7XG4iICsgCi0JCSIgICAgWSgpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIGNsYXNzIFkge1xuIiArIAotCQkiICAgIFkoKSB7XG4iICsgCi0JCSIgICAgICBzdXBlcigpO1xuIisKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICAgIHN1cGVyKCk7XG4iKwotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxtZW1iZXIgdHlwZSB3aGVuIG1pc3Npbmcgb3BlbmluZyBicmFjZT4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywJCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBTaG91bGQgbm90IGZpbmQgZmllbGRYIHNpZ25hdHVyZSBiZWhpbmQgbWlzc2luZyBicmFjZQotICovCi0KLXB1YmxpYyB2b2lkIHRlc3QyMCgpIHsKLQkKLQlTdHJpbmcgcyA9IAotCQkicHVibGljIGNsYXNzIFggCQkgCQkJCQkJXG4iCi0JCSsgIiBmaWVsZFg7CQkJCQkJCQkJCVxuIgotCQkrICIgY2xhc3MgWSB7IAkJCQkJCQkJCVxuIgotCQkrICIJIHZvaWQgYmFyKCkgCQkJCQkJCQlcbiIKLQkJKyAiIH0JCQkJCQkJCQkJCVxuIgotCQkrICJ9CQkJCQkJCQkJCQlcbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIGNsYXNzIFkge1xuIiArIAotCQkiICAgIFkoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICAgIHZvaWQgYmFyKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBjbGFzcyBZIHtcbiIgKyAKLQkJIiAgICBZKCkge1xuIiArIAotCQkiICAgICAgc3VwZXIoKTtcbiIrCi0JCSIgICAgfVxuIiArIAotCQkiICAgIHZvaWQgYmFyKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIisKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8bm8gZmllbGQgYmVoaW5kIG1pc3NpbmcgYnJhY2U+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywJCQotCQlleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nLAotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogU2hvdWxkIGZpbmQgWSBhcyBtZW1iZXIgdHlwZQotICovCi0KLXB1YmxpYyB2b2lkIHRlc3QyMSgpIHsKLQotCVN0cmluZyBzID0gCi0JCQkicHVibGljIGNsYXNzIFggCQkgCQkJCQkJXG4iCi0JCQkrICIgZmllbGRYOwkJCQkJCQkJCQlcbiIKLQkJCSsgIiBjbGFzcyBZICAJCQkJCQkJCQlcbiIKLQkJCSsgIiB9CQkJCQkJCQkJCQlcbiIKLQkJCSsgIn0JCQkJCQkJCQkJCVxuIjsKLQotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgY2xhc3MgWSB7XG4iICsgCi0JCSIgICAgWSgpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgY2xhc3MgWSB7XG4iICsgCi0JCSIgICAgWSgpIHtcbiIgKyAKLQkJIiAgICAgIHN1cGVyKCk7XG4iKwotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIisKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2hvdWxkIGZpbmQgWSBhcyBtZW1iZXIgdHlwZT4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywJCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBTaG91bGQgZmlsdGVyIG91dCBpbmNvbXBsZXRlIGxvY2FsIHR5cGUKLSAqLwotCi1wdWJsaWMgdm9pZCB0ZXN0MjIoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCSJwYWNrYWdlIGE7CQkJCQkJCQkJCQlcbiIgKwotCQkiaW1wb3J0IGphdmEubGFuZy4qOwkJCQkJCQlcbiIgKwotCQkiaW1wb3J0IGphdmEudXRpbC4qOwkJCQkJCQlcbiIgKwotCQkiCQkJCQkJCQkJCQkJXG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHsJCQkJCQkJCVxuIiArCQkJCQkJCQotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQkJXG4iICsKLQkJIgkJU3lzdGVtLm91dC5wcmludGxuKCk7CQkJCQlcbiIgKwkJCi0JCSIJCQkJCQkJCQkJCQlcbiIgKwotCQkiCQljbGFzcyBMIGV4dGVuZHMgewkJCQkJCVxuIiArCi0JCSIJCQlwdWJsaWMgaW50IGw7CQkJCQkJXG4iICsKLQkJIgkJCXZvaWQgYmF6KCl7fQkJCQkJCVxuIiArCi0JCSIJCX0JCQkJCQkJCQkJXG4iICsKLQkJIgkJCQkJCQkJCQkJCVxuIiArCi0JCSIJcHVibGljIGludCBoOwkJCQkJCQkJXG4iICsJCQkJCQotCQkiCQkJCQkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGJhcigpewkJCQkJCQkJCVxuIiArCQkJCQotCQkiCXZvaWQgdHJ1YygpewkJCQkJCQkJXG4iICsKLQkJIn0JXG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9IAotCQkicGFja2FnZSBhO1xuIiArIAotCQkiaW1wb3J0IGphdmEubGFuZy4qO1xuIiArIAotCQkiaW1wb3J0IGphdmEudXRpbC4qO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgaW50IGg7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgYmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgdHJ1YygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IAotCQkicGFja2FnZSBhO1xuIiArIAotCQkiaW1wb3J0IGphdmEubGFuZy4qO1xuIiArIAotCQkiaW1wb3J0IGphdmEudXRpbC4qO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgaW50IGg7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICAgIHN1cGVyKCk7XG4iKwotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgYmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgdHJ1YygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2hvdWxkIGZpbHRlciBvdXQgaW5jb21wbGV0ZSBsb2NhbCB0eXBlPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQotCQlleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nLAkKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIFNob3VsZCBmaWx0ZXIgb3V0IGluY29tcGxldGUgbG9jYWwgdHlwZSBhbmQgbWV0aG9kIHNpZ25hdHVyZQotICovCi0KLXB1YmxpYyB2b2lkIHRlc3QyMygpIHsKLQotCVN0cmluZyBzID0KLQkJInBhY2thZ2UgYTsJCQkJCQkJCQkJCVxuIiArCi0JCSJpbXBvcnQgamF2YS5sYW5nLio7CQkJCQkJCVxuIiArCi0JCSJpbXBvcnQgamF2YS51dGlsLio7CQkJCQkJCVxuIiArCi0JCSIJCQkJCQkJCQkJCQlcbiIgKwotCQkicHVibGljIGNsYXNzIFggewkJCQkJCQkJXG4iICsJCQkJCQkJCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIgKwotCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsJCQkJCVxuIiArCQkKLQkJIgkJCQkJCQkJCQkJCVxuIiArCi0JCSIJCWNsYXNzIEwgZXh0ZW5kcyB7CQkJCQkJXG4iICsKLQkJIgkJCXB1YmxpYyBpbnQgbDsJCQkJCQlcbiIgKwotCQkiCQkJdm9pZCBiYXooKSB0aHJvd3Mge30JCQkJXG4iICsKLQkJIgkJfQkJCQkJCQkJCQlcbiIgKwotCQkiCQkJCQkJCQkJCQkJXG4iICsKLQkJIglwdWJsaWMgaW50IGg7CQkJCQkJCQlcbiIgKwkJCQkJCi0JCSIJCQkJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgYmFyKCl7CQkJCQkJCQkJXG4iICsJCQkJCi0JCSIJdm9pZCB0cnVjKCl7CQkJCQkJCQlcbiIgKwotCQkifQlcbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJwYWNrYWdlIGE7XG4iICsgCi0JCSJpbXBvcnQgamF2YS5sYW5nLio7XG4iICsgCi0JCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBpbnQgaDtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCB0cnVjKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJwYWNrYWdlIGE7XG4iICsgCi0JCSJpbXBvcnQgamF2YS5sYW5nLio7XG4iICsgCi0JCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBpbnQgaDtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgICAgc3VwZXIoKTtcbiIrCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCB0cnVjKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxzaG91bGQgZmlsdGVyIG91dCBpbmNvbXBsZXRlIGxvY2FsIHR5cGUvbWV0aG9kPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIFNob3VsZCBmaWx0ZXIgb3V0IGFub255bW91cyB0eXBlCi0gKi8KLQotcHVibGljIHZvaWQgdGVzdDI0KCkgewotCi0JU3RyaW5nIHMgPQotCQkicGFja2FnZSBhOwkJCQkJCQkJCQkJXG4iICsKLQkJImltcG9ydCBqYXZhLmxhbmcuKjsJCQkJCQkJXG4iICsKLQkJImltcG9ydCBqYXZhLnV0aWwuKjsJCQkJCQkJXG4iICsKLQkJIgkJCQkJCQkJCQkJCVxuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7CQkJCQkJCQlcbiIgKwkJCQkJCQkKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJCVxuIiArCi0JCSIJCVN5c3RlbS5vdXQucHJpbnRsbigpOwkJCQkJXG4iICsJCQotCQkiCQkJCQkJCQkJCQkJXG4iICsKLQkJIgkJbmV3IFgoKXsJCQkJCQkJCVxuIiArCi0JCSIJCQl2b2lkIGJheigpIHt9CQkJCQkJXG4iICsKLQkJIgkJfS5iYXooKTsJCQkJCQkJCVxuIiArCi0JCSIJCQkJCQkJCQkJCQlcbiIgKwotCQkiCXB1YmxpYyBpbnQgaDsJCQkJCQkJCVxuIiArCQkJCQkKLQkJIgkJCQkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBiYXIoKXsJCQkJCQkJCQlcbiIgKwkJCQkKLQkJIgl2b2lkIHRydWMoKXsJCQkJCQkJCVxuIiArCi0JCSJ9CVxuIjsKLQotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJInBhY2thZ2UgYTtcbiIgKyAKLQkJImltcG9ydCBqYXZhLmxhbmcuKjtcbiIgKyAKLQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIGludCBoO1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIHRydWMoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcgPSAKLQkJInBhY2thZ2UgYTtcbiIgKyAKLQkJImltcG9ydCBqYXZhLmxhbmcuKjtcbiIgKyAKLQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIGludCBoO1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIisKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIHRydWMoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHNob3VsZCBmaWx0ZXIgb3V0IGluY29tcGxldGUgYW5vbnltb3VzIHR5cGUvbWV0aG9kPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIFNob3VsZCBmaWx0ZXIgb3V0IGluY29tcGxldGUgYW5vbnltb3VzIHR5cGUKLSAqLwotCi1wdWJsaWMgdm9pZCB0ZXN0MjUoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCSJwYWNrYWdlIGE7CQkJCQkJCQkJCQlcbiIgKwotCQkiaW1wb3J0IGphdmEubGFuZy4qOwkJCQkJCQlcbiIgKwotCQkiaW1wb3J0IGphdmEudXRpbC4qOwkJCQkJCQlcbiIgKwotCQkiCQkJCQkJCQkJCQkJXG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHsJCQkJCQkJCVxuIiArCQkJCQkJCQotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQkJXG4iICsKLQkJIgkJU3lzdGVtLm91dC5wcmludGxuKCk7CQkJCQlcbiIgKwkJCi0JCSIJCQkJCQkJCQkJCQlcbiIgKwotCQkiCQluZXcgWCgpewkJCQkJCQkJXG4iICsKLQkJIgkJCXZvaWQgYmF6KCkge30JCQkJCQlcbiIgKwotCQkiCQkJCQkJCQkJCQkJXG4iICsKLQkJIgkJcHVibGljIGludCBoOwkJCQkJCQlcbiIgKwkJCQkJCi0JCSIJCQkJCQkJCQkJCQlcbiIgKwotCQkiCQl2b2lkIGJhcigpewkJCQkJCQkJXG4iICsJCQkJCi0JCSIJCXZvaWQgdHJ1YygpewkJCQkJCQlcbiIgKwotCQkifQlcbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJwYWNrYWdlIGE7XG4iICsgCi0JCSJpbXBvcnQgamF2YS5sYW5nLio7XG4iICsgCi0JCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJwYWNrYWdlIGE7XG4iICsgCi0JCSJpbXBvcnQgamF2YS5sYW5nLio7XG4iICsgCi0JCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICAgIHN1cGVyKCk7XG4iKwotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxzaG91bGQgZmlsdGVyIG91dCBpbmNvbXBsZXRlIGFub255bW91cyB0eXBlPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIFNob3VsZCBmaWx0ZXIgb3V0IGluY29tcGxldGUgYW5vbnltb3VzIG1ldGhvZAotICovCi0KLXB1YmxpYyB2b2lkIHRlc3QyNigpIHsKLQotCVN0cmluZyBzID0KLQkJInBhY2thZ2UgYTsJCQkJCQkJCQkJCVxuIiArCi0JCSJpbXBvcnQgamF2YS5sYW5nLio7CQkJCQkJCVxuIiArCi0JCSJpbXBvcnQgamF2YS51dGlsLio7CQkJCQkJCVxuIiArCi0JCSIJCQkJCQkJCQkJCQlcbiIgKwotCQkicHVibGljIGNsYXNzIFggewkJCQkJCQkJXG4iICsJCQkJCQkJCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIgKwotCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsJCQkJCVxuIiArCQkKLQkJIgkJCQkJCQkJCQkJCVxuIiArCi0JCSIJCW5ldyBYKCl7CQkJCQkJCQlcbiIgKwotCQkiCQkJdm9pZCBiYXooKSAJCQkJCQkJXG4iICsKLQkJIgkgICAgfQkJCQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSIJcHVibGljIGludCBoOwkJCQkJCQkJXG4iICsJCQkJCQotCQkiCQkJCQkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGJhcigpewkJCQkJCQkJCVxuIiArCQkJCQotCQkiCXZvaWQgdHJ1YygpewkJCQkJCQkJXG4iICsKLQkJIn0JXG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9IAotCQkicGFja2FnZSBhO1xuIiArIAotCQkiaW1wb3J0IGphdmEubGFuZy4qO1xuIiArIAotCQkiaW1wb3J0IGphdmEudXRpbC4qO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgaW50IGg7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgYmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgdHJ1YygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IAotCQkicGFja2FnZSBhO1xuIiArIAotCQkiaW1wb3J0IGphdmEubGFuZy4qO1xuIiArIAotCQkiaW1wb3J0IGphdmEudXRpbC4qO1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgaW50IGg7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICAgIHN1cGVyKCk7XG4iKwotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgYmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgdHJ1YygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2hvdWxkIGZpbHRlciBvdXQgaW5jb21wbGV0ZSBhbm9ueW1vdXMgbWV0aG9kPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIFNob3VsZCBmaWx0ZXIgb3V0IGluY29tcGxldGUgbG9jYWwgdHlwZSBhbmQgbG9jYWwgdmFyIGgKLSAqLwotCi1wdWJsaWMgdm9pZCB0ZXN0MjcoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCSJwYWNrYWdlIGE7CQkJCQkJCVxuIgkrCi0JCSJpbXBvcnQgamF2YS5sYW5nLio7CQkJCVxuIgkrCQkJCQotCQkiaW1wb3J0IGphdmEudXRpbC4qOwkJCQlcbiIJKwkJCQkKLQkJIgkJCQkJCQkJCVxuIgkrCQkJCQotCQkicHVibGljIGNsYXNzIFggewkJCQkJXG4iCSsJCQkJCi0JCSIJdm9pZCBmb28oKSB7CQkJCQlcbiIJKwkJCQkKLQkJIgkJU3lzdGVtLm91dC5wcmludGxuKCk7CQlcbiIJKwkJCQkKLQkJIgkJCQkJCQkJCVxuIgkrCQkJCi0JCSIJCWNsYXNzIEwgZXh0ZW5kcyB7CQkJXG4iCSsKLQkJIgkJCXB1YmxpYyBpbnQgbDsJCQlcbiIJKwkJCQkKLQkJIgkJCXZvaWQgYmF6KCl7fQkJCVxuIgkrCQkJCQotCQkiCQl9CQkJCQkJCVxuIgkrCQkJCQotCQkiCQkJCQkJCQkJXG4iCSsJCQkJCi0JCSIJCWludCBoOwkJCQkJCVxuIgkrCQkJCQotCQkiCQkJCQkJCQkJXG4iCSsJCQkJCi0JCSIJdm9pZCBiYXIoKXsJCQkJCQlcbiIJKwkJCQkKLQkJIgl2b2lkIHRydWMoKXsJCQkJCVxuIgkrCQkJCQotCQkifQkJCQkJCQkJCVxuIjsKLQotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJInBhY2thZ2UgYTtcbiIgKyAKLQkJImltcG9ydCBqYXZhLmxhbmcuKjtcbiIgKyAKLQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCB0cnVjKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcgPSAKLQkJInBhY2thZ2UgYTtcbiIgKyAKLQkJImltcG9ydCBqYXZhLmxhbmcuKjtcbiIgKyAKLQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgICAgc3VwZXIoKTtcbiIrCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCB0cnVjKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxzaG91bGQgZmlsdGVyIGluY29tcGxldGUgbG9jYWwgdHlwZSBMIGFuZCB2YXJpYWJsZSBoPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIFNob3VsZCBmaW5kIDx5PiBhcyBhIGZpZWxkIGluIFkKLSAqLwotCi1wdWJsaWMgdm9pZCB0ZXN0MjgoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7CQkgCVxuIiArCi0JCSIgIGludCB4OwkJCSAJCVxuIgkrCQkJCQkJCi0JCSIJCQkJCQkJXG4iICsKLQkJIiAgaW50IGZvbygpeyB9CQkJCVxuIiArCi0JCSIJCQkJCQkJXG4iICsKLQkJIiAgY2xhc3MgWSAgewkJCQlcbiIJKwotCQkiICAgIGludCB5OwkJCQkJXG4iICsKLQkJIn0JCQkJCQkJXG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBjbGFzcyBZIHtcbiIgKyAKLQkJIiAgICBpbnQgeTtcbiIgKyAKLQkJIiAgICBZKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgeDtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIGNsYXNzIFkge1xuIiArIAotCQkiICAgIGludCB5O1xuIiArIAotCQkiICAgIFkoKSB7XG4iICsgCi0JCSIgICAgICBzdXBlcigpO1xuIisKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IHg7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICAgIHN1cGVyKCk7XG4iKwotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHNob3VsZCBmaW5kIDx5PiBhcyBhIGZpZWxkIGluIFk+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywJCQotCQlleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nLAotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogU2hvdWxkIGZpbmQgPHk+IGFzIGEgZmllbGQgaW4gWAotICovCi0KLXB1YmxpYyB2b2lkIHRlc3QyOSgpIHsKLQotCVN0cmluZyBzID0KLQkJInB1YmxpYyBjbGFzcyBYIHsJCSAJXG4iICsKLQkJIiAgaW50IHg7CQkJIAkJXG4iCSsJCQkJCQkKLQkJIgkJCQkJCQlcbiIgKwotCQkiICBpbnQgZm9vKCl7IH0JCQkJXG4iICsKLQkJIgkJCQkJCQlcbiIgKwotCQkiICBjbGFzcyBZICB7CQkJCVxuIgkrCi0JCSJ9CQkJCQkJCVxuIiArCi0JCSIgIGludCB5OwkJCQkJXG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBjbGFzcyBZIHtcbiIgKyAKLQkJIiAgICBZKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgeDtcbiIgKyAKLQkJIiAgaW50IHk7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBjbGFzcyBZIHtcbiIgKyAKLQkJIiAgICBZKCkge1xuIiArIAotCQkiICAgICAgc3VwZXIoKTtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IHg7XG4iICsgCi0JCSIgIGludCB5O1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHNob3VsZCBmaW5kIDx5PiBhcyBhIGZpZWxkIGluIFg+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywJCQotCQlleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nLAotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogU2hvdWxkIGZpbmQgPHk+IGFzIGEgZmllbGQgaW4gWAotICovCi0KLXB1YmxpYyB2b2lkIHRlc3QzMCgpIHsKLQotCVN0cmluZyBzID0KLQkJInB1YmxpYyBjbGFzcyBYIHsJCSAJXG4iICsKLQkJIiAgaW50IHg7CQkJIAkJXG4iCSsJCQkJCQkKLQkJIgkJCQkJCQlcbiIgKwotCQkiICBpbnQgZm9vKCl7IH0JCQkJXG4iICsKLQkJIgkJCQkJCQlcbiIgKwotCQkiICBjbGFzcyBZICAJCQkJXG4iCSsKLQkJIn0JCQkJCQkJXG4iICsKLQkJIiAgaW50IHk7CQkJCQlcbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIGNsYXNzIFkge1xuIiArIAotCQkiICAgIFkoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCB4O1xuIiArIAotCQkiICBpbnQgeTtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIGNsYXNzIFkge1xuIiArIAotCQkiICAgIFkoKSB7XG4iICsgCi0JCSIgICAgICBzdXBlcigpO1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgeDtcbiIgKyAKLQkJIiAgaW50IHk7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICAgIHN1cGVyKCk7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2hvdWxkIGZpbmQgPHk+IGFzIGEgZmllbGQgaW4gWD4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBTaG91bGQgcmVjb3ZlciBmcm9tIHBhcnRpYWwgbWV0aG9kIGhlYWRlciBmb28oKQotICovCi0KLXB1YmxpYyB2b2lkIHRlc3QzMSgpIHsKLQotCVN0cmluZyBzID0KLQkJInBhY2thZ2UgYTsJCQkJCQkJCVxuIisKLQkJImltcG9ydCBqYXZhLmxhbmcuKjsJCQkJCVxuIisKLQkJImltcG9ydCBqYXZhLnV0aWwuKjsJCQkJCVxuIisKLQkJIgkJCQkJCQkJCQlcbiIrCi0JCSJwdWJsaWMgY2xhc3MgWCB7CQkJCQkJXG4iKwotCQkiCXZvaWQgZm9vKCkgCQkJCQkJCVxuIisKLQkJIgkJU3lzdGVtLm91dC5wcmludGxuKCk7CQkJXG4iKwotCQkiCQkJCQkJCQkJCVxuIisKLQkJIglwdWJsaWMgaW50IGg7CQkJCQkJXG4iKwotCQkiCXB1YmxpYyBpbnRbXSBpID0geyAwLCAxIH07CQkJXG4iKwotCQkiCQkJCQkJCQkJCVxuIisKLQkJIgl2b2lkIGJhcigpewkJCQkJCQlcbiIrCQkJCQkJCi0JCSIJdm9pZCB0cnVjKCl7CQkJCQkJXG4iKwkJCQkJCQotCQkifQkJCQkJCQkJCQlcbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJwYWNrYWdlIGE7XG4iICsgCi0JCSJpbXBvcnQgamF2YS5sYW5nLio7XG4iICsgCi0JCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBpbnQgaDtcbiIgKyAKLQkJIiAgcHVibGljIGludFtdIGkgPSB7MCwxLH07XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgYmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgdHJ1YygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJwYWNrYWdlIGE7XG4iICsgCi0JCSJpbXBvcnQgamF2YS5sYW5nLio7XG4iICsgCi0JCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBpbnQgaDtcbiIgKyAKLQkJIiAgcHVibGljIGludFtdIGkgPSB7MCwxLH07XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICAgIHN1cGVyKCk7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCB0cnVjKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSAKLQkJInBhY2thZ2UgYTtcbiIgKyAKLQkJImltcG9ydCBqYXZhLmxhbmcuKjtcbiIgKyAKLQkJImltcG9ydCBqYXZhLnV0aWwuKjtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIGludCBoO1xuIiArIAotCQkiICBwdWJsaWMgaW50W10gaTtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCB0cnVjKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2hvdWxkIHJlY292ZXIgZnJvbSBwYXJ0aWFsIG1ldGhvZCBoZWFkZXI+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywJCQotCQlleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nLAotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogU2hvdWxkIHJlY292ZXIgZnJvbSBtZXRob2Qgd2l0aCBtaXNzaW5nIGFyZ3VtZW50IG5hbWVzCi0gKi8KLQotcHVibGljIHZvaWQgdGVzdDMyKCkgewotCi0JU3RyaW5nIHMgPQotCQkicHVibGljIGNsYXNzIFdCMiB7CQkJCQkJCQkJCQlcbiIrCi0JCSIJcHVibGljIHZvaWQgZm9vKGphdmEudXRpbC5Mb2NhbGUsIGphdmEudXRpbC5WZWN0b3IpIHsJXG4iKwotCQkiCQlpbnQgaTsJCQkJCQkJCQkJCQlcbiIrCi0JCSIJCWlmKGkgaW5zdGFuY2VvZiBPKSB7CQkJCQkJCQlcbiIrCi0JCSIJCX0JCQkJCQkJCQkJCQkJXG4iKwotCQkiCQlTdHJpbmcgcyA9IFwiaGVsbG9cIjsJCQkJCQkJCVxuIisKLQkJIgkJcy4JCQkJCQkJCQkJCQkJXG4iKwotCQkiCX0JCQkJCQkJCQkJCQkJCVxuIisKLQkJIn0JCQkJCQkJCQkJCQkJCQlcbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgV0IyIHtcbiIgKyAKLQkJIiAgcHVibGljIFdCMigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFdCMiB7XG4iICsgCi0JCSIgIHB1YmxpYyBXQjIoKSB7XG4iICsgCi0JCSIgICAgc3VwZXIoKTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHNob3VsZCByZWNvdmVyIGZyb20gbWV0aG9kIHdpdGggbWlzc2luZyBhcmd1bWVudCBuYW1lcz4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBTaG91bGQgbm90IGZpbmQgbWVzc2FnZSB3aXRoIG5vIGFyZ3VtZW50IGFzIGEgY29uc3RydWN0b3IKLSAqLwotCi1wdWJsaWMgdm9pZCB0ZXN0MzMoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7CQkJCVxuIisKLQkJIgl2b2lkIGhlbGxvKCkJCQkJXG4iKwotCQkiCXB1YmxpYyBYKGludCBpKQkJCQlcbiIrCQkJCQkJCi0JCSIJdm9pZCBmb28oKSB7CQkJCVxuIisKLQkJIgkJU3lzdGVtLm91dC5wcmludGxuKCk7CVxuIisJCQkKLQkJIgkJCQkJCQkJXG4iKwotCQkifQkJCQkJCQkJXG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB2b2lkIGhlbGxvKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKGludCBpKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB2b2lkIGhlbGxvKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKGludCBpKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgU3lzdGVtLm91dC5wcmludGxuKCk7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxzaG91bGQgbm90IGZpbmQgbWVzc2FnZSB3aXRoIG5vIGFyZ3VtZW50IGFzIGEgY29uc3RydWN0b3I+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCQotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogU2hvdWxkIG5vdCBmaW5kIGFsbG9jYXRpb24gYXMgYSBjb25zdHJ1Y3RvcgotICovCi0KLXB1YmxpYyB2b2lkIHRlc3QzNCgpIHsKLQotCVN0cmluZyBzID0KLQkJInB1YmxpYyBjbGFzcyBYIHsJCQkJXG4iKwotCQkiCXZvaWQgaGVsbG8oKQkJCQlcbiIrCi0JCSIJcHVibGljIFgoaW50IGkpCQkJCVxuIisJCQkJCQkKLQkJIglzdGF0aWMgdm9pZCBmb28oKSB7CQkJXG4iKwotCQkiCQlYIHg7CQkJCQlcbiIrCi0JCSIJCXggPSBuZXcgWCgyMyk7CQkJXG4iKwotCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsJXG4iKwkJCQotCQkiCQkJCQkJCQlcbiIrCi0JCSJ9CQkJCQkJCQlcbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHZvaWQgaGVsbG8oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoaW50IGkpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBzdGF0aWMgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB2b2lkIGhlbGxvKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKGludCBpKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgc3RhdGljIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIFggeDtcbiIgKyAKLQkJIiAgICB4ID0gbmV3IFgoMjMpO1xuIiArIAotCQkiICAgIFN5c3RlbS5vdXQucHJpbnRsbigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2hvdWxkIG5vdCBmaW5kIGFsbG9jYXRpb24gYXMgYSBjb25zdHJ1Y3Rvcj4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBJbmNvbXBsZXRlIGZpZWxkIGhlYWRlcgotICovCi0KLXB1YmxpYyB2b2lkIHRlc3QzNSgpIHsKLQotCVN0cmluZyBzID0KLQkJInB1YmxpYyBjbGFzcyBYIHsJCVxuIiArCQkJCQkJCi0JCSIJaW50IHgJCQkJXG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBpbnQgeDtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgaW50IHg7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICAgIHN1cGVyKCk7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGluY29tcGxldGUgZmllbGQgaGVhZGVyPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIEluY29tcGxldGUgbXVsdGlwbGUgZmllbGQgaGVhZGVycwotICovCi0KLXB1YmxpYyB2b2lkIHRlc3QzNigpIHsKLQotCVN0cmluZyBzID0KLQkJInB1YmxpYyBjbGFzcyBYIHsJCVxuIiArCQkJCQkJCi0JCSIJaW50IHgsIHkJCQlcbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIGludCB4O1xuIiArCi0JCSIgIGludCB5O1xuIiArIAkJCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIGludCB4O1xuIiArCi0JCSIgIGludCB5O1xuIiArIAkJCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICAgIHN1cGVyKCk7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGluY29tcGxldGUgbXVsdGlwbGUgZmllbGQgaGVhZGVycz4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBGaWVsZCBoZWFkZXIgd2l0aCBzdGFydGVkIHN0cmluZyBpbml0aWFsaXplcgotICovCi0KLXB1YmxpYyB2b2lkIHRlc3QzNygpIHsKLQotCVN0cmluZyBzID0KLQkJInB1YmxpYyBjbGFzcyBYIHsJCVxuIiArCQkJCQkJCi0JCSIJU3RyaW5nIHMgPSBcIgkJXG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBTdHJpbmcgcztcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBTdHJpbmcgcztcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxmaWVsZCBoZWFkZXIgd2l0aCBzdGFydGVkIHN0cmluZyBpbml0aWFsaXplcj4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBGaWVsZCBoZWFkZXIgd2l0aCBzdGFydGVkIHN0cmluZyBpbml0aWFsaXplciBjb21iaW5lZCB3aXRoIGluY29tcGxldGUgc3VwZXJpbnRlcmZhY2UKLSAqLwotCi1wdWJsaWMgdm9pZCB0ZXN0MzgoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCBpbXBsZW1lbnRzIFksIHsJCVxuIiArCQkJCQkJCi0JCSIJU3RyaW5nIHMgPSBcIgkJCQkJXG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFggaW1wbGVtZW50cyBZIHtcbiIgKyAKLQkJIiAgU3RyaW5nIHM7XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIGltcGxlbWVudHMgWSB7XG4iICsgCi0JCSIgIFN0cmluZyBzO1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICAgIHN1cGVyKCk7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGZpZWxkIGhlYWRlciBhbmQgaW5jb21wbGV0ZSBzdXBlcmludGVyZmFjZT4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBGaWVsZCBzaWduYXR1cmUgYmVoaW5kIGtleXdvcmQgaW1wbGVtZW50cwotICovCi0KLXB1YmxpYyB2b2lkIHRlc3QzOSgpIHsKLQotCVN0cmluZyBzID0KLQkJInB1YmxpYyBjbGFzcyBYIGltcGxlbWVudHMgCQlcbiIrCi0JCSJpbnQgeAkJCQkJCQlcbiIrCQotCQkifQkJCQkJCQkJXG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBpbnQgeDtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBpbnQgeDtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxmaWVsZCBzaWduYXR1cmUgYmVoaW5kIGtleXdvcmQgaW1wbGVtZW50cz4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBGaWVsZCB0eXBlIHJlYWQgYXMgaW50ZXJmYWNlCi0gKi8KLQotcHVibGljIHZvaWQgdGVzdDQwKCkgewotCi0JU3RyaW5nIHMgPQotCQkicHVibGljIGNsYXNzIFggaW1wbGVtZW50cyBZLCAJCVxuIiArCQkJCQkJCi0JCSIJU3RyaW5nIHMgPSBcIgkJCQkJXG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFggaW1wbGVtZW50cyBZLCBTdHJpbmcge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFggaW1wbGVtZW50cyBZLCBTdHJpbmcge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxmaWVsZCB0eXBlIHJlYWQgYXMgaW50ZXJmYWNlPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIENvbnRpZ3VvdXMgaGVhZGVycyAoY2hlY2tpbmcgY2hlY2twb2ludCBwb3NpdGlvbnMpCi0gKi8KLQotcHVibGljIHZvaWQgdGVzdDQxKCkgewotCi0JU3RyaW5nIHMgPQotCQkicHVibGljIGNsYXNzIFggcHVibGljIGludCBmb28oaW50IGJhcihzdGF0aWMgU3RyaW5nIHMiOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBzdGF0aWMgU3RyaW5nIHM7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBpbnQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBiYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgc3RhdGljIFN0cmluZyBzO1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBpbnQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBiYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbnRpZ3VvdXMgaGVhZGVycz4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBDb250aWd1b3VzIGhlYWRlcnMgd2l0aG91dCBjb21tYSAoY2hlY2tpbmcgY2hlY2twb2ludCBwb3NpdGlvbnMpCi0gKi8KLQotcHVibGljIHZvaWQgdGVzdDQyKCkgewotCi0JU3RyaW5nIHMgPQotCQkicHVibGljIGNsYXNzIFggcHVibGljIGludCBmb28oaW50IHgsIGludCBiYXIgcHVibGljIFN0cmluZyBzOyI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgIAotCQkiICBwdWJsaWMgU3RyaW5nIHM7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBpbnQgZm9vKGludCB4LCBpbnQgYmFyKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAgCi0JCSIgIHB1YmxpYyBTdHJpbmcgcztcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgICAgc3VwZXIoKTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgaW50IGZvbyhpbnQgeCwgaW50IGJhcikge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxjb250aWd1b3VzIGhlYWRlcnMgd2l0aG91dCBjb21tYT4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBDb250aWd1b3VzIGhlYWRlcnMgd2l0aG91dCBjb21tYSAoY2hlY2tpbmcgY2hlY2twb2ludCBwb3NpdGlvbnMpCi0gKi8KLQotcHVibGljIHZvaWQgdGVzdDQzKCkgewotCi0JU3RyaW5nIHMgPQotCQkicHVibGljIGNsYXNzIFggCQkJXG4iICsKLQkJIglwdWJsaWMgaW50IGZvbygJCQlcbiIgKwotCQkiCWludCBiYXIoCQkJCVxuIiArCi0JCSIgCXN0YXRpYyBTdHJpbmcgcywgaW50IHgJXG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBzdGF0aWMgU3RyaW5nIHM7XG4iICsgCi0JCSIgIGludCB4O1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICA8Y2xpbml0PigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgYmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHN0YXRpYyBTdHJpbmcgcztcbiIgKyAKLQkJIiAgaW50IHg7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICAgIHN1cGVyKCk7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgPGNsaW5pdD4oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIGludCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y29udGlndW91cyBoZWFkZXJzIHdpdGhvdXQgY29tbWE+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywJCQotCQlleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nLAotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogU2hvdWxkIGZpbmQgc3RhdGljIGZpZWxkIDx4PgotICovCi0KLXB1YmxpYyB2b2lkIHRlc3Q0NCgpIHsKLQotCVN0cmluZyBzID0KLQkJImNsYXNzIFggewkJCQkJXG4iICsKLQkJIglTdHJpbmcgczsJCQkJXG4iICsKLQkJIgkJCQkJCQlcbiIgKwotCQkiCXB1YmxpYyB2b2lkIGZvbygJCVxuIiArCi0JCSIJCXN0YXRpYyBpbnQgeAkJXG4iICsKLQkJIn0JCQkJCQkJXG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9Ci0JCSJjbGFzcyBYIHtcbiIgKyAKLQkJIiAgU3RyaW5nIHM7XG4iICsgCi0JCSIgIHN0YXRpYyBpbnQgeDtcbiIgKyAKLQkJIiAgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICA8Y2xpbml0PigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcgPSAKLQkJImNsYXNzIFgge1xuIiArIAotCQkiICBTdHJpbmcgcztcbiIgKyAKLQkJIiAgc3RhdGljIGludCB4O1xuIiArIAotCQkiICBYKCkge1xuIiArIAotCQkiICAgIHN1cGVyKCk7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgPGNsaW5pdD4oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7OwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2hvdWxkIGZpbmQgc3RhdGljIGZpZWxkIHg+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywJCQotCQlleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nLAotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogTWlzc2luZyBzdHJpbmcgbGl0ZXJhbCBxdW90ZSBpbnNpZGUgbWV0aG9kCi0gKi8KLQotcHVibGljIHZvaWQgdGVzdDQ1KCkgewotCi0JU3RyaW5nIHMgPQotCQkicHVibGljIGNsYXNzIFggewkJCVxuIisKLQkJIglpbnQgZm9vKCl7CQkJCVxuIisKLQkJIgkJU3RyaW5nIHMgPSBcIgkJXG4iKwotCQkiCX0JCQkJCQlcbiIrCi0JCSJ9CQkJCQkJCVxuIjsKLQotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPG1pc3Npbmcgc3RyaW5nIGxpdGVyYWwgcXVvdGUgaW5zaWRlIG1ldGhvZD4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBEZXRlY3RpbmcgbWVtYmVyIHR5cGUgY2xvc2luZyB3aGVuIG1pc3NpbmcgYnJhY2tldHMKLSAqLwotCi1wdWJsaWMgdm9pZCB0ZXN0NDYoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCSJjbGFzcyBYIAkJCQkJXG4iKwotCQkiICBTdHJpbmcgcyA9IFwiY2xhc3MgeSAJXG4iKwotCQkiICBjbGFzcyBNZW1iZXIgCQkJXG4iKwotCQkiCWludCBmb28oKSAJCQkJXG4iKwotCQkiICAgICAgICBwdWJsaWMgaW50IHg7ICAgIAlcbiIrCi0JCSIgIH0gCQkJCQkJXG4iKwotCQkiIGludCBiYXIoKSAJCQkJXG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9IAotCQkiY2xhc3MgWCB7XG4iICsgCi0JCSIgIGNsYXNzIE1lbWJlciB7XG4iICsgCi0JCSIgICAgcHVibGljIGludCB4O1xuIiArIAotCQkiICAgIE1lbWJlcigpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgU3RyaW5nIHM7XG4iICsgCi0JCSIgIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IAotCQkiY2xhc3MgWCB7XG4iICsgCi0JCSIgIGNsYXNzIE1lbWJlciB7XG4iICsgCi0JCSIgICAgcHVibGljIGludCB4O1xuIiArIAotCQkiICAgIE1lbWJlcigpIHtcbiIgKyAKLQkJIiAgICAgIHN1cGVyKCk7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICAgIGludCBmb28oKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIFN0cmluZyBzO1xuIiArIAotCQkiICBYKCkge1xuIiArIAotCQkiICAgIHN1cGVyKCk7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8ZGV0ZWN0aW5nIG1lbWJlciB0eXBlIGNsb3Npbmcgd2hlbiBtaXNzaW5nIGJyYWNrZXRzPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIFVudGVybWluYXRlZCBtZXRob2QgYXJndW1lbnRzCi0gKi8KLQotcHVibGljIHZvaWQgdGVzdDQ3KCkgewotCi0JU3RyaW5nIHMgPQotCi0JCSJjbGFzcyBYIHsJCQkJCQkJCQlcbiIgKyAKLQkJIglpbnQgZm9vKEFBIGEsIEJCIGIsIElPRXgJCQkJXG4iICsgCi0JCSIJCQkJCQkJCQkJCVxuIjsgCi0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJjbGFzcyBYIHtcbiIgKwotCQkiICBYKCkge1xuIiArIAotCQkiICB9XG4iICsKLQkJIiAgaW50IGZvbyhBQSBhLCBCQiBiKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJjbGFzcyBYIHtcbiIgKwotCQkiICBYKCkge1xuIiArIAotCQkiICAgIHN1cGVyKCk7XG4iICsgCi0JCSIgIH1cbiIgKwotCQkiICBpbnQgZm9vKEFBIGEsIEJCIGIpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHVudGVybWluYXRlZCBtZXRob2QgYXJndW1lbnRzPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIFVudGVybWluYXRlZCBsaXRlcmFsIHN0cmluZyBpbiBtZXRob2QgYm9keQotICovCi0KLXB1YmxpYyB2b2lkIHRlc3Q0OCgpIHsKLQotCVN0cmluZyBzID0KLQkJInB1YmxpYyBjbGFzcyBYIHsJCQkJCQkJXG4iKwotCQkiCWZpbmFsIHN0YXRpYyBpbnQgZm9vKCl7IAkJCQlcbiIrCi0JCSIJCXJldHVybiBcIjE7IAkJCQkJCVxuIisKLQkJIgl9IAkJCQkJCQkJCQlcbiIrCi0JCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSl7IFxuIisKLQkJIgkJZm9vKCk7CQkJCQkJCQlcbiIrCi0JCSIJfSAJCQkJCQkJCQkJXG4iKwotCQkifQkJCQkJCQkJCQkJXG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBzdGF0aWMgZmluYWwgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgICAgc3VwZXIoKTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBzdGF0aWMgZmluYWwgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KSB7XG4iICsgCi0JCSIgICAgZm9vKCk7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHVudGVybWluYXRlZCBsaXRlcmFsIHN0cmluZyBpbiBtZXRob2QgYm9keT4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBVbnRlcm1pbmF0ZWQgaW5pdGlhbGl6ZXIgd2l0aCBsb2NhbCBkZWNsYXJhdGlvbgotICovCi0KLXB1YmxpYyB2b2lkIHRlc3Q0OSgpIHsKLQotCVN0cmluZyBzID0KLQkJInB1YmxpYyBjbGFzcyBYIHsJCQkJCQkJXG4iKwotCQkiCXsJCQkJCQkJCQkJXG4iKwotCQkiICAgICBpbnQgeDsJCQkJCQkJCVxuIisKLQkJIgkgCQkJCQkJCQkJCVxuIjsKLQotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjx1bnRlcm1pbmF0ZWQgaW5pdGlhbGl6ZXIgd2l0aCBsb2NhbCBkZWNsYXJhdGlvbj4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBVbnRlcm1pbmF0ZWQgaWYgc3RhdGVtZW50Ci0gKi8KLQotcHVibGljIHZvaWQgdGVzdDUwKCkgewotCi0JU3RyaW5nIHMgPQotCQkicHVibGljIGNsYXNzIFggewkJCQkJCQlcbiIrCi0JCSIgICBpbnQgZm9vKCl7CQkJCQkJCQlcbiIrCi0JCSIJICBpZih0cnVlKXsJCQkJCQkJCVxuIisKLQkJIiAgICAgCWludCB4OwkJCQkJCQkJXG4iKwotCQkiCSAJCQkJCQkJCQkJXG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICAgIHN1cGVyKCk7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8dW50ZXJtaW5hdGVkIGlmIHN0YXRlbWVudD4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBVbnRlcm1pbmF0ZWQgbmVzdGVkIGJsb2NrIHdpdGggbG9jYWwgZGVjbGFyYXRpb24KLSAqLwotCi1wdWJsaWMgdm9pZCB0ZXN0NTEoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7CQkJCQkJCVxuIisKLQkJIiAgIGludCBmb28oKXsJCQkJCQkJCVxuIisKLQkJIgkgIHsJCQkJCQkJCQkJXG4iKwotCQkiICAgICAJaW50IHg7CQkJCQkJCQlcbiIrCi0JCSIJIAkJCQkJCQkJCQlcbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgICAgc3VwZXIoKTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjx1bnRlcm1pbmF0ZWQgbmVzdGVkIGJsb2NrIHdpdGggbG9jYWwgZGVjbGFyYXRpb24+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywJCQotCQlleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nLAotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogVW50ZXJtaW5hdGVkIG5lc3RlZCBibG9jayB3aXRoIGZpZWxkIGRlY2xhcmF0aW9uCi0gKi8KLQotcHVibGljIHZvaWQgdGVzdDUyKCkgewotCi0JU3RyaW5nIHMgPQotCQkicHVibGljIGNsYXNzIFggewkJCQkJCQlcbiIrCi0JCSIgICBpbnQgZm9vKCl7CQkJCQkJCQlcbiIrCi0JCSIJICB7CQkJCQkJCQkJCVxuIisKLQkJIiAgICAgCXB1YmxpYyBpbnQgeDsJCQkJCQlcbiIrCi0JCSIJIAkJCQkJCQkJCQlcbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIGludCB4O1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIGludCB4O1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHVudGVybWluYXRlZCBuZXN0ZWQgYmxvY2sgd2l0aCBmaWVsZCBkZWNsYXJhdGlvbj4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBVbnRlcm1pbmF0ZWQgaW5pdGlhbGl6ZXIgd2l0aCBmaWVsZCBkZWNsYXJhdGlvbgotICovCi0KLXB1YmxpYyB2b2lkIHRlc3Q1MygpIHsKLQotCVN0cmluZyBzID0KLQkJInB1YmxpYyBjbGFzcyBYIHsJCQkJCQkJXG4iKwotCQkiCXsJCQkJCQkJCQkJXG4iKwotCQkiICAgICBwdWJsaWMgaW50IHg7CQkJCQkJCVxuIisKLQkJIgkgCQkJCQkJCQkJCVxuIjsKLQotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB7XG4iICsKLQkJIiAgfVxuIiArCQkKLQkJIiAgcHVibGljIGludCB4O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAge1xuIiArCi0JCSIgIH1cbiIgKwkJCi0JCSIgIHB1YmxpYyBpbnQgeDtcbiIgKwotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjx1bnRlcm1pbmF0ZWQgaW5pdGlhbGl6ZXIgd2l0aCBmaWVsZCBkZWNsYXJhdGlvbj4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBJbnZhbGlkIGNsYXNzIG5hbWUKLSAqLwotCi1wdWJsaWMgdm9pZCB0ZXN0NTQoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCSJwYWNrYWdlIHA7CQkJCQkJCQlcbiIrCi0JCSJwdWJsaWMgY2xhc3MgWlByby5TZXYuQmxvIHsJCQkJCQkJCQkJCQkJCVxuIisKLQkJInZvaWQgVGhpc0lzQUR1bW15TWV0aG9kVGhhdElzQ3JlYXRlZE9ubHlGb3JUaGVQdXJwb3Nlc09mVGhlQ29tcGxldGlvbkVuZ2luZSgpIHsJXG4iKwotCQkiCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzLmdldENsYXNzKCkpOwkJCQkJCQkJCQkJXG4iKwotCQkifQkJCQkJCQkJCQkJCQkJCQkJCQkJCVxuIisKLQkJIgkvLyBDT01NRU5UCQkJCQkJCQkJCQkJCQkJCQkJXG4iKwotCQkifQkJCQkJCQkJCQkJCQkJCQkJCQkJCVxuIjsKLQotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBaUHJvIHtcbiIgKyAKLQkJIiAge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBaUHJvKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgVGhpc0lzQUR1bW15TWV0aG9kVGhhdElzQ3JlYXRlZE9ubHlGb3JUaGVQdXJwb3Nlc09mVGhlQ29tcGxldGlvbkVuZ2luZSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcgPQotCQkicGFja2FnZSBwO1xuIiArIAotCQkicHVibGljIGNsYXNzIFpQcm8ge1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFpQcm8oKSB7XG4iICsgCi0JCSIgICAgc3VwZXIoKTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIFRoaXNJc0FEdW1teU1ldGhvZFRoYXRJc0NyZWF0ZWRPbmx5Rm9yVGhlUHVycG9zZXNPZlRoZUNvbXBsZXRpb25FbmdpbmUoKSB7XG4iICsgCi0JCSIgICAgU3lzdGVtLm91dC5wcmludGxuKHRoaXMuZ2V0Q2xhc3MoKSk7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPEludmFsaWQgY2xhc3MgbmFtZT4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBVbnRlcm1pbmF0ZWQgc3RhdGljIGluaXRpYWxpemVyIHdpdGggZmllbGQgZGVjbGFyYXRpb24KLSAqLwotCi1wdWJsaWMgdm9pZCB0ZXN0NTUoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7CQkJCQkJCVxuIisKLQkJIglzdGF0aWMgewkJCQkJCQkJXG4iKwotCQkiICAgICBwdWJsaWMgaW50IHg7CQkJCQkJCVxuIisKLQkJIgkgCQkJCQkJCQkJCVxuIjsKLQotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgc3RhdGljIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgaW50IHg7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHN0YXRpYyB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIGludCB4O1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjx1bnRlcm1pbmF0ZWQgc3RhdGljIGluaXRpYWxpemVyIHdpdGggZmllbGQgZGVjbGFyYXRpb24+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywJCQotCQlleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nLAotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogTXVsdGlwbGUgaW5pdGlhbGl6ZXJzIGNvbWJpbmVkIHdpdGggYXJyYXkgaW5pdGlhbGl6ZXIKLSAqLwotCi1wdWJsaWMgdm9pZCB0ZXN0NTYoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCAJCQkJXG4iKwotCQkiCXN0YXRpYyBpbnQgenoJCQkJXG4iKwotCQkiCXsJCQkJCQkJXG4iKwotCQkiCX0JCQkJCQkJXG4iKwotCQkiCXN0YXRpYyB7CQkJCQlcbiIrCi0JCSIgICBwdWJsaWMgaW50IHg7CQkJCVxuIisKLQkJIglpbnRbXSB5ID0geyAwLCAxfTsJCQlcbiIrCi0JCSIJewkJCQkJCQlcbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgc3RhdGljIGludCB6ejtcbiIgKyAKLQkJIiAge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHN0YXRpYyB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIGludCB4O1xuIiArIAotCQkiICBpbnRbXSB5ID0gezAsMSx9O1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgPGNsaW5pdD4oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgc3RhdGljIGludCB6ejtcbiIgKyAKLQkJIiAge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHN0YXRpYyB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIGludCB4O1xuIiArIAotCQkiICBpbnRbXSB5ID0gezAsMSx9O1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgICAgc3VwZXIoKTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICA8Y2xpbml0PigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHN0YXRpYyBpbnQgeno7XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBzdGF0aWMge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBpbnQgeDtcbiIgKyAKLQkJIiAgaW50W10geTtcbiIgKyAKLQkJIiAge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8bXVsdGlwbGUgaW5pdGlhbGl6ZXJzIGNvbWJpbmVkIHdpdGggYXJyYXkgaW5pdGlhbGl6ZXI+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywJCQotCQlleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nLAotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogQ29tYmluYXRpb24gb2YgdW50ZXJtaW5hdGVkIG1ldGhvZHMgYW5kIGZpZWxkcwotICovCi0KLXB1YmxpYyB2b2lkIHRlc3Q1NygpIHsKLQotCVN0cmluZyBzID0KLQkJImNsYXNzIFgJCQkJCQlcbiIrCi0JCSIJdm9pZCBmb28oKXsJCQkJCVxuIisKLQkJIgkJewkJCQkJCVxuIisKLQkJIglwdWJsaWMgc3RhdGljIGludCB4OwkJXG4iKwotCQkiCXZvaWQgYmFyKCkJCQkJCVxuIisKLQkJIgl9CQkJCQkJCVxuIisKLQkJIglpbnQgeTsJCQkJCQlcbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJImNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgc3RhdGljIGludCB4O1xuIiArIAotCQkiICBpbnQgeTtcbiIgKyAKLQkJIiAgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICA8Y2xpbml0PigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IAotCQkiY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBzdGF0aWMgaW50IHg7XG4iICsgCi0JCSIgIGludCB5O1xuIiArIAotCQkiICBYKCkge1xuIiArIAotCQkiICAgIHN1cGVyKCk7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgPGNsaW5pdD4oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBiYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGNvbWJpbmF0aW9uIG9mIHVudGVybWluYXRlZCBtZXRob2RzIGFuZCBmaWVsZHM+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywJCQotCQlleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nLAotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogSWxsZWdhbCB1bmljb2RlIGluc2lkZSBtZXRob2QgYm9keQotICovCi0KLXB1YmxpYyB2b2lkIHRlc3Q1OCgpIHsKLQotCVN0cmluZyBzID0KLQkJInBhY2thZ2UgcDsgXG4iKwotCQkiCQkJCQkJCQkJCQkJCVxuIisKLQkJImNsYXNzIEEgewkJCQkJCQkJCQkJXG4iKwotCQkiCXZvaWQgYmFyKCkgewkJCQkJCQkJCVxuIisKLQkJIgkJU3RyaW5nIHMgPSBcIlxcdTAwMERcIjsJCQkJCQlcbiIrCi0JCSIJfQkJCQkJCQkJCQkJCVxuIisKLQkJIn0JCQkJCQkJCQkJCQkJXG4iOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJjbGFzcyBBIHtcbiIgKyAKLQkJIiAgQSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJjbGFzcyBBIHtcbiIgKyAKLQkJIiAgQSgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgYmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxpbGxlZ2FsIHVuaWNvZGUgaW5zaWRlIG1ldGhvZCBib2R5PiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIEV4dHJhIGlkZW50aWZpZXIgaW4gdHlwZSBzaWduYXR1cmUKLSAqLwotCi1wdWJsaWMgdm9pZCB0ZXN0NTkoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIGphdmEuaW8uSU9FeGNlcHRpb24gSU9FeGNlcHRpb24gIHsJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCQkJCQkJXG4iOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIGphdmEuaW8uSU9FeGNlcHRpb24ge1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBqYXZhLmlvLklPRXhjZXB0aW9uIHtcbiIgKyAKLQkJIiAge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICAgIHN1cGVyKCk7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGV4dHJhIGlkZW50aWZpZXIgaW4gdHlwZSBzaWduYXR1cmU+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywJCQotCQlleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nLAotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogRXh0cmEgaWRlbnRpZmllciBpbiBtZXRob2Qgc2lnbmF0dXJlCi0gKi8KLQotcHVibGljIHZvaWQgdGVzdDYwKCkgewotCi0JU3RyaW5nIHMgPQotCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBqYXZhLmlvLklPRXhjZXB0aW9uICB7CQlcbiIgKwotCQkiCWludCBmb28oKSBFeHRyYUlkZW50aWZpZXIgewkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJCVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBqYXZhLmlvLklPRXhjZXB0aW9uIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIGphdmEuaW8uSU9FeGNlcHRpb24ge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPGV4dHJhIGlkZW50aWZpZXIgaW4gbWV0aG9kIHNpZ25hdHVyZT4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBFeHRyYSBpZGVudGlmaWVyIGJlaGluZCB0aHJvd24gZXhjZXB0aW9uCi0gKi8KLQotcHVibGljIHZvaWQgdGVzdDYxKCkgewotCi0JU3RyaW5nIHMgPQotCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyAgewkJCQkJCQlcbiIgKwotCQkiCWludCBmb28oKSB0aHJvd3MgSU9FeGNlcHRpb24gRXh0cmFJZGVudGlmaWVyIHsJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQkJXG4iOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB0aHJvd3MgSU9FeGNlcHRpb24ge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgICAgc3VwZXIoKTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgZm9vKCkgdGhyb3dzIElPRXhjZXB0aW9uIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8ZXh0cmEgaWRlbnRpZmllciBiZWhpbmQgdGhyb3duIGV4Y2VwdGlvbj4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBVbnRlcm1pbmF0ZWQgYXJyYXkgaW5pdGlhbGl6ZXIKLSAqLwotCi1wdWJsaWMgdm9pZCB0ZXN0NjIoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCSJjbGFzcyBYIHsJCQkJXG4iKwotCQkiIGNsYXNzIFkgCQkJCVxuIisKLQkJIiAgIHB1YmxpYyBTdHJpbmcgczsJXG4iKwotCQkiICAgaW50IGZvbygpewkJCVxuIisKLQkJIglyZXR1cm4gMTsJCQlcbiIrCi0JCSIgICBzdGF0aWMgaW50IHkgPSB7OwlcbiIrIC8vIGNhbiBvbmx5IGJlIGFuIGluaXRpYWxpemVyIHNpbmNlIHR5cGUgaXMgbm90IGFycmF5IG9uZQotCQkiIH0JCQkJCQlcbiIrCi0JCSIgcHVibGljIGludCBpID0gMDsJCVxuIisKLQkJIiAJCQkJCQlcbiIrCi0JCSIgaW50IGJheigpCQkJCVxuIisKLQkJIgkJCQkJCVxuIisKLQkJIn0JCQkJCQlcbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJImNsYXNzIFgge1xuIiArIAotCQkiICBjbGFzcyBZIHtcbiIgKyAKLQkJIiAgICBwdWJsaWMgU3RyaW5nIHM7XG4iICsgCi0JCSIgICAgc3RhdGljIGludCB5O1xuIiArIAotCQkiICAgIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgcHVibGljIGludCBpID0gMDtcbiIgKyAKLQkJIiAgICBZKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgICA8Y2xpbml0PigpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgaW50IGJheigpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJjbGFzcyBYIHtcbiIgKyAKLQkJIiAgY2xhc3MgWSB7XG4iICsgCi0JCSIgICAgcHVibGljIFN0cmluZyBzO1xuIiArIAotCQkiICAgIHN0YXRpYyBpbnQgeTtcbiIgKyAKLQkJIiAgICB7XG4iICsgCi0JCSIgICAgICA7O1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgICBwdWJsaWMgaW50IGkgPSAwO1xuIiArIAotCQkiICAgIFkoKSB7XG4iICsgCi0JCSIgICAgICBzdXBlcigpO1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgICA8Y2xpbml0PigpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgaW50IGJheigpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSAKLQkJImNsYXNzIFgge1xuIiArIAotCQkiICBjbGFzcyBZIHtcbiIgKyAKLQkJIiAgICBwdWJsaWMgU3RyaW5nIHM7XG4iICsgCi0JCSIgICAgc3RhdGljIGludCB5O1xuIiArIAotCQkiICAgIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgcHVibGljIGludCBpO1xuIiArIAotCQkiICAgIFkoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICAgIDxjbGluaXQ+KCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgICBpbnQgZm9vKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgICBpbnQgYmF6KCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8dW50ZXJtaW5hdGVkIGFycmF5IGluaXRpYWxpemVyPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIEluaXRpYWxpemVyIGJlaGluZCBhcnJheSBpbml0aWFsaXplcgotICovCi0KLXB1YmxpYyB2b2lkIHRlc3Q2MygpIHsKLQotCVN0cmluZyBzID0KLQkJImNsYXNzIFggewkJCQlcbiIrCi0JCSIgaW50IHhbXSA9IHswLCAxfQkJXG4iKwotCQkiIHsJCQkJCQlcbiIrCi0JCSIgfQkJCQkJCVxuIisKLQkJIn0JCQkJCQlcbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJImNsYXNzIFgge1xuIiArIAotCQkiICBpbnRbXSB4ID0gezAsMSx9O1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJjbGFzcyBYIHtcbiIgKyAKLQkJIiAgaW50W10geCA9IHswLDEsfTtcbiIgKyAKLQkJIiAge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIFgoKSB7XG4iICsgCi0JCSIgICAgc3VwZXIoKTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJjbGFzcyBYIHtcbiIgKyAKLQkJIiAgaW50W10geDtcbiIgKyAKLQkJIiAge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxpbml0aWFsaXplciBiZWhpbmQgYXJyYXkgaW5pdGlhbGl6ZXI+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywJCQotCQlleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nLAotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogSW5pdGlhbGl6ZXJzIG1peGVkIHdpdGggZmllbGRzCi0gKi8KLQotcHVibGljIHZvaWQgdGVzdDY0KCkgewotCi0JU3RyaW5nIHMgPQotCQkicHVibGljIGNsYXNzIFggCQkJXG4iKwotCQkiCWludFtdIHggPSB7IDAsIDF9OwkJXG4iKwotCQkiCXN0YXRpYyBpbnQgenoJCQlcbiIrCi0JCSIJewkJCQkJCVxuIisKLQkJIgl9CQkJCQkJXG4iKwotCQkiCXN0YXRpYyB7CQkJCVxuIisJCQkJCQkJCQotCQkiICAgIHB1YmxpYyBpbnQgeDsJCQlcbiIrCQkJCQkJCQotCQkiCXsJCQkJCQlcbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgaW50W10geCA9IHswLDEsfTtcbiIgKyAKLQkJIiAgc3RhdGljIGludCB6ejtcbiIgKyAKLQkJIiAge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHN0YXRpYyB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIGludCB4O1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgPGNsaW5pdD4oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBpbnRbXSB4ID0gezAsMSx9O1xuIiArIAotCQkiICBzdGF0aWMgaW50IHp6O1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgc3RhdGljIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgaW50IHg7XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgaW50W10geDtcbiIgKyAKLQkJIiAgc3RhdGljIGludCB6ejtcbiIgKyAKLQkJIiAge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHN0YXRpYyB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIGludCB4O1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgPGNsaW5pdD4oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxpbml0aWFsaXplcnMgbWl4ZWQgd2l0aCBmaWVsZHM+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywJCQotCQlleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nLAotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogU2hvdWxkIGZpbmQgbWV0aG9kIGJlaGluZCBzb21lKCkKLSAqLwotCi1wdWJsaWMgdm9pZCB0ZXN0NjUoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCSJpbXBvcnQgamF2YS5sYW5nLio7CQkJCQkJCQkJCQkJCVxuIiArCi0JCSIJCQkJCQkJCQkJCQkJCQkJCQlcbiIgKwotCQkicHVibGljIGNsYXNzIEhhbm9pIHsJCQkJCQkJCQkJCQkJXG4iICsKLQkJInByaXZhdGUgICAgUG9zdFtdIHBvc3RzOwkJCQkJCQkJCQkJCVxuIiArCi0JCSJwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIGFyZ3NbXSkgewkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQkJCQkJCQlcbiIgKwotCQkicHVibGljIHZvaWQgc29tZSgpewkJCQkJCQkJCQkJCQlcbiIgKwotCQkiCQkJCQkJCQkJCQkJCQkJCQkJXG4iICsKLQkJInByaXZhdGUgdm9pZCBtb3ZlRGlzayAoUG9zdCBzb3VyY2UsIFBvc3QgZGVzdGluYXRpb24pIHsJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQkJCQkJCQlcbiIgKwotCQkicHJvdGVjdGVkIHZvaWQgcmVwb3J0TW92ZSAoUG9zdCBzb3VyY2UsIFBvc3QgZGVzdGluYXRpb24pIHsJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCQkJCQkJCVxuIiArCi0JCSJwcml2YXRlIHZvaWQgcmVzZXQgKCkgewkJCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJCQkJCQkJXG4iICsKLQkJInB1YmxpYyB2b2lkIHNvbHZlICgpIHsJCQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQkJCQkJCQlcbiIgKwotCQkicHJpdmF0ZSB2b2lkIHNvbHZlIChpbnQgZGVwdGgsIFBvc3Qgc3RhcnQsIFBvc3QgZnJlZSwgUG9zdCBlbmQpIHsJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQkJCQkJCQlcbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJImltcG9ydCBqYXZhLmxhbmcuKjtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBIYW5vaSB7XG4iICsgCi0JCSIgIHByaXZhdGUgUG9zdFtdIHBvc3RzO1xuIiArIAotCQkiICBwdWJsaWMgSGFub2koKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyB2b2lkIHNvbWUoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHJpdmF0ZSB2b2lkIG1vdmVEaXNrKFBvc3Qgc291cmNlLCBQb3N0IGRlc3RpbmF0aW9uKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHJvdGVjdGVkIHZvaWQgcmVwb3J0TW92ZShQb3N0IHNvdXJjZSwgUG9zdCBkZXN0aW5hdGlvbikge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHByaXZhdGUgdm9pZCByZXNldCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgdm9pZCBzb2x2ZSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwcml2YXRlIHZvaWQgc29sdmUoaW50IGRlcHRoLCBQb3N0IHN0YXJ0LCBQb3N0IGZyZWUsIFBvc3QgZW5kKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IAotCQkiaW1wb3J0IGphdmEubGFuZy4qO1xuIiArIAotCQkicHVibGljIGNsYXNzIEhhbm9pIHtcbiIgKyAKLQkJIiAgcHJpdmF0ZSBQb3N0W10gcG9zdHM7XG4iICsgCi0JCSIgIHB1YmxpYyBIYW5vaSgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgdm9pZCBzb21lKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHByaXZhdGUgdm9pZCBtb3ZlRGlzayhQb3N0IHNvdXJjZSwgUG9zdCBkZXN0aW5hdGlvbikge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHByb3RlY3RlZCB2b2lkIHJlcG9ydE1vdmUoUG9zdCBzb3VyY2UsIFBvc3QgZGVzdGluYXRpb24pIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwcml2YXRlIHZvaWQgcmVzZXQoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIHZvaWQgc29sdmUoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHJpdmF0ZSB2b2lkIHNvbHZlKGludCBkZXB0aCwgUG9zdCBzdGFydCwgUG9zdCBmcmVlLCBQb3N0IGVuZCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxzaG91bGQgZmluZCBtZXRob2QgYmVoaW5kIHNvbWUoKT4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBTaG91bGQgZGV0ZWN0IFgoaW50KSBhcyBhIG1ldGhvZCB3aXRoIG5vIHJldHVybiB0eXBlCi0gKi8KLQotcHVibGljIHZvaWQgdGVzdDY2KCkgewotCi0JU3RyaW5nIHMgPQotCQkiY2xhc3MgWCB7CQkJXG4iKwotCQkiCWNsYXNzIFkgewkJXG4iKwotCQkiCVgoaW50IGkpe30JCVxuIisKLQkJIn0JCQkJCVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9IAotCQkiY2xhc3MgWCB7XG4iICsgCi0JCSIgIGNsYXNzIFkge1xuIiArIAotCQkiICAgIFkoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICAgIFgoaW50IGkpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJjbGFzcyBYIHtcbiIgKyAKLQkJIiAgY2xhc3MgWSB7XG4iICsgCi0JCSIgICAgWSgpIHtcbiIgKyAKLQkJIiAgICAgIHN1cGVyKCk7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICAgIFgoaW50IGkpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxzaG91bGQgZGV0ZWN0IFgoaW50KSBhcyBhIG1ldGhvZCB3aXRoIG5vIHJldHVybiB0eXBlPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIFNob3VsZCBkZXRlY3Qgb3JwaGFuIFgoaW50KSBhcyBhIGNvbnN0cnVjdG9yCi0gKi8KLQotcHVibGljIHZvaWQgdGVzdDY3KCkgewotCi0JU3RyaW5nIHMgPQotCQkiY2xhc3MgWCB7CQkJXG4iKwotCQkiCWNsYXNzIFkgewkJXG4iKwotCQkiCX0JCQkJXG4iKwotCQkifQkJCQkJXG4iKwotCQkiCVgoaW50IGkpewkJXG4iKwotCQkiICAgfQkJCQlcbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJImNsYXNzIFgge1xuIiArIAotCQkiICBjbGFzcyBZIHtcbiIgKyAKLQkJIiAgICBZKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBYKGludCBpKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcgPQotCQkiY2xhc3MgWCB7XG4iICsgCi0JCSIgIGNsYXNzIFkge1xuIiArIAotCQkiICAgIFkoKSB7XG4iICsgCi0JCSIgICAgICBzdXBlcigpO1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBYKGludCBpKSB7XG4iICsgCi0JCSIgICAgc3VwZXIoKTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHNob3VsZCBkZXRlY3Qgb3JwaGFuIFgoaW50KSBhcyBhIGNvbnN0cnVjdG9yPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIEVtcHR5IHVuaXQKLSAqLwotCi1wdWJsaWMgdm9pZCB0ZXN0NjgoKSB7Ci0KLQlTdHJpbmcgcyA9ICIiOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gIiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8ZW1wdHkgdW5pdD4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBVbml0IHJlZHVjZWQgdG8gYSBtZXRob2QgZGVjbGFyYXRpb24KLSAqLwotCi1wdWJsaWMgdm9pZCB0ZXN0NjkoKSB7Ci0KLQlTdHJpbmcgcyA9IAotCQkiCWludCBmb28oKXsJCQkJCVxuIiArCi0JCSIJCVN5c3RlbS5vdXQucHJpbnRsbigpOwlcbiIgKwotCQkiCX0JCQkJCQkJXG4iOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gIiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8dW5pdCByZWR1Y2VkIHRvIGEgbWV0aG9kIGRlY2xhcmF0aW9uPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIFVuaXQgcmVkdWNlZCB0byBhIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uCi0gKi8KLQotcHVibGljIHZvaWQgdGVzdDcwKCkgewotCi0JU3RyaW5nIHMgPSAKLQkJIglYKCl7CQkJCQkJXG4iICsKLQkJIgkJU3lzdGVtLm91dC5wcmludGxuKCk7CVxuIiArCi0JCSIJfQkJCQkJCQlcbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAiIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjx1bml0IHJlZHVjZWQgdG8gYSBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbj4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBVbml0IHJlZHVjZWQgdG8gYSBmaWVsZCBkZWNsYXJhdGlvbgotICovCi0KLXB1YmxpYyB2b2lkIHRlc3Q3MSgpIHsKLQotCVN0cmluZyBzID0gCi0JCSIJU3RyaW5nIHN0ciA9IG5ldyBTdHJpbmcoKTsiOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gIiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8dW5pdCByZWR1Y2VkIHRvIGEgZmllbGQgZGVjbGFyYXRpb24+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywJCQotCQlleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nLAotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogVW5pdCByZWR1Y2VkIHRvIGEgZmllbGQgZGVjbGFyYXRpb24gd2l0aCBhcnJheSBpbml0aWFsaXplcgotICovCi0KLXB1YmxpYyB2b2lkIHRlc3Q3MigpIHsKLQotCVN0cmluZyBzID0gCi0JCSIJU3RyaW5nW10gc3RyID0geyBcImhlbGxvXCIgfTsiOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gIiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8dW5pdCByZWR1Y2VkIHRvIGEgZmllbGQgZGVjbGFyYXRpb24gd2l0aCBhcnJheSBpbml0aWFsaXplcj4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBTaG91bGQgbm90IHBpY2stdXAgYW55IGNvbnN0cnVjdG9yIHdpdGggbm8gYXJnCi0gKi8KLQotcHVibGljIHZvaWQgdGVzdDczKCkgewotCi0JU3RyaW5nIHMgPSAKLQkJIgljbGFzcyBYIHsJCQlcbiIgKwotCQkiCQlYKGludCBpKXt9CQlcbiIgKwotCQkiCQlpbnQgZm9vKCl7CQlcbiIgKwotCQkiCQkJbmV3IFgoCQlcbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJImNsYXNzIFgge1xuIiArIAotCQkiICBYKGludCBpKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9Ci0JCSJjbGFzcyBYIHtcbiIgKyAKLQkJIiAgWChpbnQgaSkge1xuIiArIAotCQkiICAgIHN1cGVyKCk7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2hvdWxkIG5vdCBwaWNrLXVwIGFueSBjb25zdHJ1Y3RvciB3aXRoIG5vIGFyZz4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBTaG91bGQgbm90IGRldGVjdCBhbnkgZmllbGQKLSAqLwotCi1wdWJsaWMgdm9pZCB0ZXN0NzQoKSB7Ci0KLQlTdHJpbmcgcyA9IAotCQkicGFja2FnZSBwYWNrOwkJCQkJCVxuIiArCi0JCSIJCQkJCQkJCQlcbiIgKwotCQkiY2xhc3MgQSBleHRlbmRzIElPRXhjZXB0aW9uIHsJCVxuIiArCi0JCSIJCQkJCQkJCQlcbiIgKwotCQkiCVN7CQkJCQkJCQlcbiIgKwotCQkiCQlpbnQgeDsJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJXG4iOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJwYWNrYWdlIHBhY2s7XG4iICsgCi0JCSJjbGFzcyBBIGV4dGVuZHMgSU9FeGNlcHRpb24ge1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgQSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJwYWNrYWdlIHBhY2s7XG4iICsgCi0JCSJjbGFzcyBBIGV4dGVuZHMgSU9FeGNlcHRpb24ge1xuIiArIAotCQkiICB7XG4iICsKLQkJIiAgICBpbnQgeDtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBBKCkge1xuIiArIAotCQkiICAgIHN1cGVyKCk7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHNob3VsZCBub3QgZGV0ZWN0IGFueSBmaWVsZD4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBCdW5jaCBvZiBzeW50YXggZXJyb3JzCi0gKi8KLQotcHVibGljIHZvaWQgdGVzdDc1KCkgewotCi0JU3RyaW5nIHMgPSAKLQkJInBhY2thZ2UgWktlbnRUZXN0O1xuIisKLQkJIlxuIisKLQkJImltcG9ydCBqYXZhLmF3dC5jb2xvci4qO1xuIisKLQkJIlxuIisKLQkJInB1YmxpYyBjbGFzcyBBIHtcbiIrCi0JCSIJQSBmb28oaW50IGkpIHsgcmV0dXJuIHRoaXM7IH1cbiIrCi0JCSIJaW50W10gaWkgPSB7MCwgMWNsb25lKClcbiIrCi0JCSJcbiIrCi0JCSIJaW50IGJhcigpIHtcbiIrCi0JCSIJCWNsYXNzIExvY2FsIHtcbiIrCi0JCSIJCQlpbnQgaGVsbG8oKXtcbiIrCi0JCSIJCQkJZm9cbiIrCi0JCSIJCQl9XG4iKwotCQkiCQkJaW50IHdvcmxkKClcbiIrCi0JCSIJCQl9XG4iKwotCQkiCXZvaWQgZm9vKCkge1xuIisKLQkJIgkJYmEJCVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9IAotCQkicGFja2FnZSBaS2VudFRlc3Q7XG4iICsgCi0JCSJpbXBvcnQgamF2YS5hd3QuY29sb3IuKjtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKyAKLQkJIiAgaW50W10gaWk7XG4iICsgCi0JCSIgIHB1YmxpYyBBKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIEEgZm9vKGludCBpKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9Ci0JCSJwYWNrYWdlIFpLZW50VGVzdDtcbiIgKyAKLQkJImltcG9ydCBqYXZhLmF3dC5jb2xvci4qO1xuIiArIAotCQkicHVibGljIGNsYXNzIEEge1xuIiArIAotCQkiICBpbnRbXSBpaTtcbiIgKyAKLQkJIiAgcHVibGljIEEoKSB7XG4iICsgCi0JCSIgICAgc3VwZXIoKTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBBIGZvbyhpbnQgaSkge1xuIiArIAotCQkiICAgIHJldHVybiB0aGlzO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBiYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSAKLQkJInBhY2thZ2UgWktlbnRUZXN0O1xuIiArIAotCQkiaW1wb3J0IGphdmEuYXd0LmNvbG9yLio7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsgCi0JCSIgIGludFtdIGlpO1xuIiArIAotCQkiICBwdWJsaWMgQSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBBIGZvbyhpbnQgaSkge1xuIiArIAotCQkiICB9XG4iICsKLQkJIiAgY2xvbmUoKSB7XG4iICsKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgYmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8YnVuY2ggb2Ygc3ludGF4IGVycm9ycz4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBTaG91bGQgZmluZCBNZW1iZXIgYXMgYSBtZW1iZXIgdHlwZQotICovCi0KLXB1YmxpYyB2b2lkIHRlc3Q3NigpIHsKLQotCVN0cmluZyBzID0gCi0JCSJwYWNrYWdlIHBhY2s7CQkJCQkJCQlcbiIrCi0JCSJjbGFzcyBBICB7CQkJCQkJCQkJXG4iKwotCQkiCQkJCQkJCQkJCQlcbiIrCi0JCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikJXG4iKwotCQkiCQkJbmV3IE1lbWJlcigpLmYJCQkJCVxuIisKLQkJIgkJCTsJCQkJCQkJCVxuIisKLQkJIgl9CQkJCQkJCQkJCVxuIisKLQkJIgljbGFzcyBNZW1iZXIgewkJCQkJCQlcbiIrCi0JCSIJCWludCBmb28oKQkJCQkJCQlcbiIrCi0JCSIJCX0JCQkJCQkJCQlcbiIrCi0JCSIJfQkJCQkJCQkJCQlcbiIrCi0JCSJ9OwkJCQkJCQkJCQkJXG4iOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJwYWNrYWdlIHBhY2s7XG4iICsgCi0JCSJjbGFzcyBBIHtcbiIgKyAKLQkJIiAgY2xhc3MgTWVtYmVyIHtcbiIgKyAKLQkJIiAgICBNZW1iZXIoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICAgIGludCBmb28oKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIEEoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJwYWNrYWdlIHBhY2s7XG4iICsgCi0JCSJjbGFzcyBBIHtcbiIgKyAKLQkJIiAgY2xhc3MgTWVtYmVyIHtcbiIgKyAKLQkJIiAgICBNZW1iZXIoKSB7XG4iICsgCi0JCSIgICAgICBzdXBlcigpO1xuIiArIAkJCQotCQkiICAgIH1cbiIgKyAKLQkJIiAgICBpbnQgZm9vKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBBKCkge1xuIiArIAotCQkiICAgIHN1cGVyKCk7XG4iICsgCQkKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7CQotCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHNob3VsZCBmaW5kIE1lbWJlciBhcyBhIG1lbWJlciB0eXBlPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIFNob3VsZCBub3QgcmVjb3ZlciBkdXBsaWNhdGUgZmllbGQgbnVtYmVyT2ZEaXNrcwotICovCi0KLXB1YmxpYyB2b2lkIHRlc3Q3NygpIHsKLQotCVN0cmluZyBzID0gCi0JCSJwYWNrYWdlIHA7CQkJCQkJCQkJCQkJCQkJXG4iKwotCQkiCQkJCQkJCQkJCQkJCQkJCQkJXG4iKwotCQkiaW1wb3J0IGphdmEubGFuZy4qOwkJCQkJCQkJCQkJCQlcbiIrCi0JCSIJCQkJCQkJCQkJCQkJCQkJCQlcbiIrCi0JCSJjbGFzcyBJbmNvbXBsZXRlSGFub2kgewkJCQkJCQkJCQkJCVxuIisKLQkJInByaXZhdGUgICAgUG9zdFtdIHBvc3RzOwkJCQkJCQkJCQkJCVxuIisKLQkJInByaXZhdGUgICAgaW50IG51bWJlck9mRGlza3M7CQkJCQkJCQkJCQlcbiIrCi0JCSIJCQkJCQkJCQkJCQkJCQkJCQlcbiIrCi0JCSJwdWJsaWMgSGFub2kgKGludCBudW1iZXJPZkRpc2tzKSB7CQkJCQkJCQkJCVxuIisKLQkJIiB0aGlzLm51bWJlck9mRGlza3MgPSBudW1iZXJPZkRpc2tzOwkJCQkJCQkJCVxuIisKLQkJIicnIHRoaXMucG9zdHMgPSBuZXcgUG9zdFszXTsJCQkJCQkJCQkJCVxuIisKLQkJIiBTdHJpbmdbXSBwb3N0TmFtZXMgPSBuZXcgU3RyaW5nW117XCJMZWZ0XCIsIFwiTWlkZGxlXCIsIFwiUmlnaHRcIn07CVxuIisKLQkJIgkJCQkJCQkJCQkJCQkJCQkJCVxuIisKLQkJIiBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkJCQkJCQkJCQkJCVxuIisKLQkJIiAgdGhpcy5wb3N0c1tpXSA9IG5ldyBQb3N0KHBvc3ROYW1lc1tpXSwgbnVtYmVyT2ZEaXNrcyk7CQkJCVxuIisKLQkJIn0JCQkJCQkJCQkJCQkJCQkJCQlcbiIrCi0JCSIJCQkJCQkJCQkJCQkJCQkJCQlcbiIrCi0JCSJwcml2YXRlIHZvaWQgc29sdmUgKGludCBkZXB0aCwgUG9zdCBzdGFydCwgUG9zdCBmcmVlLCBQb3N0IGVuZCkgewkJXG4iKwotCQkiIGlmIChkZXB0aCA9PSAxKQkJCQkJCQkJCQkJCQkJXG4iKwotCQkiICBtb3ZlRGlzayhzdGFydCwgZW5kKTsJCQkJCQkJCQkJCQlcbiIrCi0JCSIgZWxzZSBpZiAoZGVwdGggPiAxKSB7CQkJCQkJCQkJCQkJCVxuIisKLQkJIiAgc29sCQkJCQkJCQkJCQkJCQkJCQlcbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJImltcG9ydCBqYXZhLmxhbmcuKjtcbiIgKyAKLQkJImNsYXNzIEluY29tcGxldGVIYW5vaSB7XG4iICsgCi0JCSIgIHByaXZhdGUgUG9zdFtdIHBvc3RzO1xuIiArIAotCQkiICBwcml2YXRlIGludCBudW1iZXJPZkRpc2tzO1xuIiArIAotCQkiICBJbmNvbXBsZXRlSGFub2koKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIEhhbm9pKGludCBudW1iZXJPZkRpc2tzKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHJpdmF0ZSB2b2lkIHNvbHZlKGludCBkZXB0aCwgUG9zdCBzdGFydCwgUG9zdCBmcmVlLCBQb3N0IGVuZCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcgPSAKLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJImltcG9ydCBqYXZhLmxhbmcuKjtcbiIgKyAKLQkJImNsYXNzIEluY29tcGxldGVIYW5vaSB7XG4iICsgCi0JCSIgIHByaXZhdGUgUG9zdFtdIHBvc3RzO1xuIiArIAotCQkiICBwcml2YXRlIGludCBudW1iZXJPZkRpc2tzO1xuIiArIAotCQkiICBJbmNvbXBsZXRlSGFub2koKSB7XG4iICsgCi0JCSIgICAgc3VwZXIoKTtcbiIgKyAJCQotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBIYW5vaShpbnQgbnVtYmVyT2ZEaXNrcykge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHByaXZhdGUgdm9pZCBzb2x2ZShpbnQgZGVwdGgsIFBvc3Qgc3RhcnQsIFBvc3QgZnJlZSwgUG9zdCBlbmQpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2hvdWxkIG5vdCByZWNvdmVyIGR1cGxpY2F0ZSBmaWVsZCBudW1iZXJPZkRpc2tzPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIFNob3VsZCBub3QgZGV0ZWN0IGEgZmllbGQgdiAoMS8yKQotICovCi0KLXB1YmxpYyB2b2lkIHRlc3Q3OCgpIHsKLQotCVN0cmluZyBzID0gCi0JCSJjbGFzcyBYIHsJCQkJCQkJCVxuIiArCi0JCSIJaW50IGZvbygpewkJCQkJCQlcbiIgKwotCQkiCQlWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsJCVxuIiArCi0JCSIJCXMJCQkJCQkJCVxuIiArCi0JCSIJCXYuYWRkRWxlbWVudCgJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9IAotCQkiY2xhc3MgWCB7XG4iICsgCi0JCSIgIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJjbGFzcyBYIHtcbiIgKyAKLQkJIiAgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAkJCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2hvdWxkIG5vdCBkZXRlY3QgYSBmaWVsZCB2PiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIFNob3VsZCBub3QgZGV0ZWN0IGEgZmllbGQgdiAoMi8yKQotICovCi0KLXB1YmxpYyB2b2lkIHRlc3Q3OSgpIHsKLQotCVN0cmluZyBzID0gCi0JCSJjbGFzcyBYIHsJCQkJCQkJCVxuIiArCi0JCSIJaW50IGZvbygpewkJCQkJCQlcbiIgKwotCQkiCQlWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsJCVxuIiArCi0JCSIJCXB1YmxpYyBzICAgdi5hZGRFbGVtZW50KAkJXG4iICsKLQkJIgl9CQkJCQkJCQkJXG4iOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJjbGFzcyBYIHtcbiIgKyAKLQkJIiAgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcgPSAKLQkJImNsYXNzIFgge1xuIiArIAotCQkiICBYKCkge1xuIiArIAotCQkiICAgIHN1cGVyKCk7XG4iICsgCQkKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxzaG91bGQgbm90IGRldGVjdCBhIGZpZWxkIHY+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywJCQotCQlleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nLAotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogU2hvdWxkIG5vdCBkZXRlY3QgYSBtZXRob2QgYmFyCi0gKi8KLQotcHVibGljIHZvaWQgdGVzdDgwKCkgewotCi0JU3RyaW5nIHMgPSAKLQkJImNsYXNzIFggewkJCQkJCQkJXG4iICsKLQkJIglpbnQgdGVzdCgpewkJCQkJCQlcbiIgKwotCQkiCQlpbnRbXSBpOwkJCQkJCVxuIiArCi0JCSIJCWkJCQkJCQkJCVxuIiArCi0JCSIJCS8vIHNvbWUgY29tbWVudAkJCQkJXG4iICsKLQkJIgkJYmFyKDEpOwkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQlcbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJImNsYXNzIFgge1xuIiArIAotCQkiICBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCB0ZXN0KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcgPSAKLQkJImNsYXNzIFgge1xuIiArIAotCQkiICBYKCkge1xuIiArIAotCQkiICAgIHN1cGVyKCk7XG4iICsgCQkKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgdGVzdCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2hvdWxkIG5vdCBkZXRlY3QgYSBtZXRob2QgYmFyPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIFNob3VsZCBub3QgcGljay11cCBhbnkgY29uc3RydWN0b3Igd2l0aCBubyBhcmcKLSAqLwotCi1wdWJsaWMgdm9pZCB0ZXN0ODEoKSB7Ci0KLQlTdHJpbmcgcyA9IAotCQkiCWNsYXNzIFggewkJCQlcbiIgKwotCQkiCQlYKGludCBpKXt9CQkJXG4iICsKLQkJIgkJaW50IGZvbygpewkJCVxuIiArCi0JCSIJCQlYKDEyKQkJCVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9IAotCQkiY2xhc3MgWCB7XG4iICsgCi0JCSIgIFgoaW50IGkpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IAotCQkiY2xhc3MgWCB7XG4iICsgCi0JCSIgIFgoaW50IGkpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHNob3VsZCBub3QgcGljay11cCBhbnkgY29uc3RydWN0b3Igd2l0aCBubyBhcmc+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywJCQotCQlleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nLAotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogU2hvdWxkIG5vdCBwcm9tb3RlIG1lc3NhZ2Ugc2VuZGluZyBhcyBhIG1ldGhvZAotICovCi0KLXB1YmxpYyB2b2lkIHRlc3Q4MigpIHsKLQotCVN0cmluZyBzID0gCi0JCSJwdWJsaWMgY2xhc3MgQSB7CQlcbiIrCi0JCSIJCQkJCQlcbiIrCi0JCSIJdm9pZCBmb28oKSAJCQlcbiIrCi0JCSIJCWlmICh0cnVlKSB7CQlcbiIrCi0JCSIJCX0gZWxzZSB7CQlcbiIrCi0JCSIJCQlCYXIgczsgCQlcbiIrCi0JCSIJCQlzLmZyZWQoKTsJXG4iKwotCQkiCQl9CQkJCVxuIisKLQkJIgl9CQkJCQlcbiIrCi0JCSJ9CQkJCQkJXG4iOwotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKyAKLQkJIiAgcHVibGljIEEoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIEEge1xuIiArIAotCQkiICBwdWJsaWMgQSgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAkJCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHNob3VsZCBub3QgcHJvbW90ZSBtZXNzYWdlIHNlbmRpbmcgYXMgYSBtZXRob2Q+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywJCQotCQlleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nLAotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogU2hvdWxkIG5vdCBwcm9tb3RlIG1lc3NhZ2Ugc2VuZGluZyBhcyBhIG1ldGhvZCAyCi0gKi8KLQotcHVibGljIHZvaWQgdGVzdDgzKCkgewotCi0JU3RyaW5nIHMgPSAKLQkJInB1YmxpYyBjbGFzcyBBIHsJCQlcbiIrCi0JCSIJCQkJCQkJXG4iKwotCQkiCXZvaWQgZm9vKCkgaWYgKHRydWUpIHsJXG4iKwotCQkiCQl9IGVsc2UgewkJCVxuIisKLQkJIgkJCUJhciBzOyAJCQlcbiIrCi0JCSIJCQlzLmZyZWQoKTsJCVxuIisKLQkJIgkJfQkJCQkJXG4iKwotCQkiCX0JCQkJCQlcbiIrCi0JCSJ9CQkJCQkJCVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsgCi0JCSIgIHB1YmxpYyBBKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKyAKLQkJIiAgcHVibGljIEEoKSB7XG4iICsgCi0JCSIgICAgc3VwZXIoKTtcbiIgKyAJCQotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxzaG91bGQgbm90IHByb21vdGUgbWVzc2FnZSBzZW5kaW5nIGFzIGEgbWV0aG9kPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIFNob3VsZCBmaW5kIGEgc3RhdGljIGluaXRpYWxpemVyCi0gKi8KLQotcHVibGljIHZvaWQgdGVzdDg0KCkgewotCi0JU3RyaW5nIHMgPSAKLQkJInB1YmxpYyBjbGFzcyBBIGV4dGVuZHMJCQlcbiIgKwotCQkiCQkJCQkJCQlcbiIgKwotCQkiCXN0YXRpYyB7CQkJCQlcbiIgKwotCQkifQkJCQkJCQkJXG4iOwotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKyAKLQkJIiAgc3RhdGljIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgQSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICA8Y2xpbml0PigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsgCi0JCSIgIHN0YXRpYyB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIEEoKSB7XG4iICsgCi0JCSIgICAgc3VwZXIoKTtcbiIgKyAJCQotCQkiICB9XG4iICsgCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxzaG91bGQgZmluZCBhIHN0YXRpYyBpbml0aWFsaXplcj4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBTaG91bGQgZmluZCBhIHN0YXRpYyBpbml0aWFsaXplcgotICovCi0KLXB1YmxpYyB2b2lkIHRlc3Q4NSgpIHsKLQotCVN0cmluZyBzID0gCi0JCSJwdWJsaWMgY2xhc3MgQSAJCQlcbiIgKwotCQkiCQkJCQkJCVxuIiArCi0JCSIJc3RhdGljIHsJCQkJXG4iICsKLQkJIn0JCQkJCQkJXG4iOwotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKyAKLQkJIiAgc3RhdGljIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgQSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICA8Y2xpbml0PigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsgCi0JCSIgIHN0YXRpYyB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIEEoKSB7XG4iICsgCi0JCSIgICAgc3VwZXIoKTtcbiIgKyAJCQotCQkiICB9XG4iICsgCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxzaG91bGQgZmluZCBhIHN0YXRpYyBpbml0aWFsaXplcj4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBTaG91bGQgZmluZCBhbiBpbml0aWFsaXplcgotICovCi0KLXB1YmxpYyB2b2lkIHRlc3Q4NigpIHsKLQotCVN0cmluZyBzID0gCi0JCSJwdWJsaWMgY2xhc3MgQSAJCQlcbiIgKwotCQkiCQkJCQkJCVxuIiArCi0JCSIJaW50IAkJCQkJXG4iICsKLQkJIgl7CQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJXG4iOwotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKyAKLQkJIiAge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBBKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKyAKLQkJIiAge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBBKCkge1xuIiArIAotCQkiICAgIHN1cGVyKCk7XG4iICsgCQkKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2hvdWxkIGZpbmQgYW4gaW5pdGlhbGl6ZXI+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywJCQotCQlleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nLAotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogU2hvdWxkIGZpbmQgYW4gaW5pdGlhbGl6ZXIKLSAqLwotCi1wdWJsaWMgdm9pZCB0ZXN0ODcoKSB7Ci0KLQlTdHJpbmcgcyA9IAotCQkicHVibGljIGNsYXNzIEEgCQkJXG4iICsKLQkJIgkJCQkJCQlcbiIgKwotCQkiCWludCB4OwkJCQkJXG4iICsKLQkJIiAgewkJCQkJCVxuIiArCi0JCSIJaW50IHk7CQkJCQlcbiIgKwotCQkifQkJCQkJCQlcbiI7Ci0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIEEge1xuIiArIAotCQkiICBpbnQgeDtcbiIgKyAKLQkJIiAge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBBKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKyAKLQkJIiAgaW50IHg7XG4iICsgCi0JCSIgIHtcbiIgKyAKLQkJIiAgICBpbnQgeTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgQSgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAkJCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHNob3VsZCBmaW5kIGFuIGluaXRpYWxpemVyPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIDFGVlJRRzA6IElUUENPTTpXSU5OVCAtIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIHJlY292ZXJ5IG1vZGUKLSAqLwotCi1wdWJsaWMgdm9pZCB0ZXN0ODgoKSB7Ci0KLQlTdHJpbmcgcyA9IAotCQkicGFja2FnZSBwMTsJCQkJCVxuIiArCi0JCSIJCQkJCQkJCVxuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7CQkJCVxuIiArCi0JCSIJaW50IGZvbyhTdHJpbmcgcywgaW50IHgpIAlcbiIgKwotCQkiCXB1YmxpYyBpbnQgeSA9IG5ldyBYKCkgeyAJXG4iICsKLQkJIgkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9IAotCQkicGFja2FnZSBwMTtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIGludCB5O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oU3RyaW5nIHMsIGludCB4KSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IAotCQkicGFja2FnZSBwMTtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIGludCB5O1xuIiArCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICAgIHN1cGVyKCk7XG4iICsgCQkKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgZm9vKFN0cmluZyBzLCBpbnQgeCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPQotCQkicGFja2FnZSBwMTtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIGludCB5O1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgZm9vKFN0cmluZyBzLCBpbnQgeCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPDFGVlJRRzA6IElUUENPTTpXSU5OVCAtIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIHJlY292ZXJ5IG1vZGU+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywJCQotCQlleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nLAotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogMUZWUk45VjogSVRQSkNPUkU6V0lOOTggLSBJbnRlcm5hbCBidWlsZGVyIGVycm9yIGNvbXBpbGluZyBzZXJ2bGV0Ci0gKi8KLQotcHVibGljIHZvaWQgdGVzdDg5KCkgewotCi0JU3RyaW5nIHMgPSAKLQkJImltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CQkJCQkJCQkJCQlcbiIgKwotCQkiaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOwkJCQkJCQkJCQlcbiIgKwotCQkiCQkJCQkJCQkJCQkJCQkJCQlcbiIgKwotCQkicHVibGljIGNsYXNzIFNlcnZsZXQxIGV4dGVuZHMgSHR0cFNlcnZsZXQgewkJCQkJCVxuIiArCi0JCSIJcHJvdGVjdGVkIChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApIHsJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJCQkJCQlcbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJImltcG9ydCBqYXZheC5zZXJ2bGV0Lio7XG4iICsgCi0JCSJpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgU2VydmxldDEgZXh0ZW5kcyBIdHRwU2VydmxldCB7XG4iICsgCi0JCSIgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXE7XG4iICsgCi0JCSIgIEh0dHBTZXJ2bGV0UmVxdWVzdCBIdHRwU2VydmxldFJlc3BvbnNlO1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFNlcnZsZXQxKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcgPSAKLQkJImltcG9ydCBqYXZheC5zZXJ2bGV0Lio7XG4iICsgCi0JCSJpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgU2VydmxldDEgZXh0ZW5kcyBIdHRwU2VydmxldCB7XG4iICsgCi0JCSIgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXE7XG4iICsgCi0JCSIgIEh0dHBTZXJ2bGV0UmVxdWVzdCBIdHRwU2VydmxldFJlc3BvbnNlO1xuIiArIAotCQkiICB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIFNlcnZsZXQxKCkge1xuIiArIAotCQkiICAgIHN1cGVyKCk7XG4iICsgCQkKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8MUZWUk45VjogSVRQSkNPUkU6V0lOOTggLSBJbnRlcm5hbCBidWlsZGVyIGVycm9yIGNvbXBpbGluZyBzZXJ2bGV0PiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIDFGVlhRWjQ6IElUUENPTTpXSU45OCAtIFdhbGtiYWNrIGR1cmluZyBwYXJzaW5nIHJlY292ZXJ5Ci0gKi8KLQotcHVibGljIHZvaWQgdGVzdDkwKCkgewotCi0JU3RyaW5nIHMgPSAKLQkJInB1YmxpYyBjbGFzcyBUZXN0IHsJXG4iKwotCQkiCQkJCQkJXG4iKwotCQkiCWludCB4OwkJCQlcbiIrCi0JCSIJaW50IGZvbygJCQlcbiIrCi0JCSIJaW50IGJhcigJCQlcbiIrCi0JCSIJYmF6KEEgYQkJCQlcbiIrCi0JCSJ9CQkJCQkJXG4iOwotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBUZXN0IHtcbiIgKyAKLQkJIiAgaW50IHg7XG4iICsgCi0JCSIgIHB1YmxpYyBUZXN0KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBiYXooQSBhKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFRlc3Qge1xuIiArIAotCQkiICBpbnQgeDtcbiIgKyAKLQkJIiAgcHVibGljIFRlc3QoKSB7XG4iICsgCi0JCSIgICAgc3VwZXIoKTtcbiIgKyAJCQotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBiYXooQSBhKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPDFGVlhRWjQ6IElUUENPTTpXSU45OCAtIFdhbGtiYWNrIGR1cmluZyBwYXJzaW5nIHJlY292ZXJ5PiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIDFGVlhXS0k6IElUUENPTTpXSU45OCAtIFdhbGtiYWNrIHdoZW4gcGFyc2luZyBhIGJvZ3VzIGludGVyZmFjZQotICovCi0KLXB1YmxpYyB2b2lkIHRlc3Q5MSgpIHsKLQotCVN0cmluZyBzID0gCi0JCSJwdWJsaWMgaW50ZXJmYWNlIEZyZWQgewkJXG4iICsKLQkJIgl2b2lkIGZvbygpOwkJCQkJXG4iICsKLQkJIgl2b2lkIGJhcigpOwkJCQkJXG4iICsKLQkJIglwdWJsaWMgZnJlZChYIHgsIGludCB5KTsJXG4iICsKLQkJIn0JCQkJCQkJCVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgaW50ZXJmYWNlIEZyZWQge1xuIiArIAotCQkiICB2b2lkIGZvbygpO1xuIiArIAotCQkiICB2b2lkIGJhcigpO1xuIiArIAotCQkiICBwdWJsaWMgZnJlZChYIHgsIGludCB5KSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjwxRlZYV0tJOiBJVFBDT006V0lOOTggLSBXYWxrYmFjayB3aGVuIHBhcnNpbmcgYSBib2d1cyBpbnRlcmZhY2U+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywJCQotCQlleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nLAotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogVmFyaWF0aW9uIG9uIDFGVlhXS0k6IElUUENPTTpXSU45OCAtIFdhbGtiYWNrIHdoZW4gcGFyc2luZyBhIGJvZ3VzIGludGVyZmFjZQotICovCi0KLXB1YmxpYyB2b2lkIHRlc3Q5MigpIHsKLQlTdHJpbmcgcyA9IAotCQkicHVibGljIGludGVyZmFjZSBUZXN0IHsJCVxuIisKLQkJIgl2b2lkIGZvbygpOwkJCQkJXG4iKwotCQkiCQkJCQkJCQlcbiIrCi0JCSIJcHVibGljIGZyZWQoRnJlZCB4LCBpbnQgeSk7CVxuIisKLQkJIn0JCQkJCQkJCVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgaW50ZXJmYWNlIFRlc3Qge1xuIiArIAotCQkiICB2b2lkIGZvbygpO1xuIiArIAotCQkiICBwdWJsaWMgZnJlZChGcmVkIHgsIGludCB5KSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjwxRlZYV0tJOiBJVFBDT006V0lOOTggLSBXYWxrYmFjayB3aGVuIHBhcnNpbmcgYSBib2d1cyBpbnRlcmZhY2U+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywJCQotCQlleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nLAotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogMUZXNUE0RTogSVRQQ09NOldJTjk4IC0gV2Fsa2JhY2sgcmVjb25jaWxpbmcKLSAqLwotCi1wdWJsaWMgdm9pZCB0ZXN0OTMoKSB7Ci0JU3RyaW5nIHMgPSAKLQkJImNsYXNzIFh7CQkJXG4iICsKLQkJIglpbnQgZm9vKCkJCVxuIiArCi0JCSIJc3RhdGljIHsgfQkJXG4iICsKLQkJIn0JCQkJCVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJjbGFzcyBYIHtcbiIgKyAKLQkJIiAgc3RhdGljIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJjbGFzcyBYIHtcbiIgKyAKLQkJIiAgc3RhdGljIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBYKCkge1xuIiArIAotCQkiICAgIHN1cGVyKCk7XG4iICsgCQkKLQkJIiAgfVxuIiArIAotCQkiICA8Y2xpbml0PigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjwxRlc1QTRFOiBJVFBDT006V0lOOTggLSBXYWxrYmFjayByZWNvbmNpbGluZz4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiAxRlczNjYzOiBJVFBDT006V0lOOTggLSBPdXRsaW5lIC0gZG9lcyBub3Qgc2hvdyBtZXRob2QgI2ZyZWQoKQotICovCi0KLXB1YmxpYyB2b2lkIHRlc3Q5NCgpIHsKLQlTdHJpbmcgcyA9IAotCQkicHVibGljIGNsYXNzIFggewkJCQkJCVxuIiArCi0JCSIJaW50W10gYXJyYXk7CQkJCQkJXG4iICsKLQkJIgkJCQkJCQkJCQlcbiIgKwotCQkidm9pZCBmb28oKSB7CQkJCQkJCVxuIiArCi0JCSIJYmFyKHRoaXMuYXJyYXkubGVuZ3RoLCAxMCwgZnJlZCgJXG4iICsKLQkJIgkJCQkJCQkJCQlcbiIgKwotCQkiaW50IGZyZWQoCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQlcbiI7Ci0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBpbnRbXSBhcnJheTtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKwotCQkiICBpbnQgZnJlZCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIGludFtdIGFycmF5O1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAkJCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKwotCQkiICBpbnQgZnJlZCgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPDFGVzM2NjM6IElUUENPTTpXSU45OCAtIE91dGxpbmUgLSBkb2VzIG5vdCBzaG93IG1ldGhvZCAjZnJlZCgpPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIDFGVzZNNU06IElUUEpVSTpBTEwgLSBOUEUgaW4gU291cmNlRWxlbWVudFBhcnNlcgotICovCi0KLXB1YmxpYyB2b2lkIHRlc3Q5NSgpIHsKLQlTdHJpbmcgcyA9IAotCQkicHVibGljIGludGVyZmFjZSBJUCB7CQkJXG4iKwotCQkiCXB1YmxpYyBzdGF0aWMgdG9TdHJpbmcoKSB7CVxuIisKLQkJIgl9CQkJCQkJCVxuIisKLQkJIn0JCQkJCQkJCVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgaW50ZXJmYWNlIElQIHtcbiIgKyAKLQkJIiAgcHVibGljIHN0YXRpYyB0b1N0cmluZygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPDFGVzZNNU06IElUUEpVSTpBTEwgLSBOUEUgaW4gU291cmNlRWxlbWVudFBhcnNlcj4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nLAkJCi0JCWV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiAxRldIWFg3OiBJVFBDT006V0lOTlQgLSBDbGFzc0Nhc3RFeGNlcHRpb24gY29tcGlsaW5nIGludmFsaWQgaW1wb3J0Ci0gKi8KLQotcHVibGljIHZvaWQgdGVzdDk2KCkgewotCVN0cmluZyBzID0gCi0JCSJpbXBvcnQgO1xuIisKLQkJImNsYXNzIFgge1xuIisKLQkJIglpbnQgZm9vKCl7XG4iKwotCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oKTtcbiIrCi0JCSIJfVxuIisKLQkJIglzdGF0aWMge1xuIisKLQkJIgkJaW50IGkgPSBqO1xuIisKLQkJIgl9XG4iKwotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJjbGFzcyBYIHtcbiIgKyAKLQkJIiAgc3RhdGljIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJjbGFzcyBYIHtcbiIgKyAKLQkJIiAgc3RhdGljIHtcbiIgKyAKLQkJIiAgICBpbnQgaSA9IGo7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB7XG4iICsgCi0JCSIgICAgU3lzdGVtLm91dC5wcmludGxuKCk7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7CQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjwxRldIWFg3OiBJVFBDT006V0lOTlQgLSBDbGFzc0Nhc3RFeGNlcHRpb24gY29tcGlsaW5nIGludmFsaWQgaW1wb3J0PiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIHZhcmlhdGlvbiBvbiAxRldIWFg3OiBJVFBDT006V0lOTlQgLSBDbGFzc0Nhc3RFeGNlcHRpb24gY29tcGlsaW5nIGludmFsaWQgaW1wb3J0Ci0gKi8KLQotcHVibGljIHZvaWQgdGVzdDk3KCkgewotCVN0cmluZyBzID0gCi0JCSJpbXBvcnQgO1xuIisKLQkJImNsYXNzIFgge1xuIisKLQkJIglpbnQgZm9vKCl7XG4iKwotCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oKTtcbiIrCi0JCSIJfVxuIisKLQkJIglzdGF0aWMge1xuIisKLQkJIgl9XG4iKwotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJjbGFzcyBYIHtcbiIgKyAKLQkJIiAgc3RhdGljIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJjbGFzcyBYIHtcbiIgKyAKLQkJIiAgc3RhdGljIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBYKCkge1xuIiArIAotCQkiICAgIHN1cGVyKCk7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgPGNsaW5pdD4oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsJCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHZhcmlhdGlvbiBvbiAxRldIWFg3OiBJVFBDT006V0lOTlQgLSBDbGFzc0Nhc3RFeGNlcHRpb24gY29tcGlsaW5nIGludmFsaWQgaW1wb3J0PiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTA4NAotICovCi0KLXB1YmxpYyB2b2lkIHRlc3Q5OCgpIHsKLQotCVN0cmluZyBzID0gCi0JCSJwdWJsaWMgY2xhc3MgQSB7CQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIrCi0JCSIJY2xhc3MgUGxhdGZvcm0gewkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIrCi0JCSIJCXB1YmxpYyBzdGF0aWMgdm9pZCBydW4oUnVubmFibGUgcikgewkJICAgICAgICAgICAgICAgICAgICBcbiIrCi0JCSIJCX0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKwotCQkiCX0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIisKLQkJIglPYmplY3QgW10gYXJyYXkgPSBudWxsOwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIisKLQkJIglmb3IgKGludCBuWCA9IDA7IG5YIDwgYXJyYXkubGVuZ3RoOyBuWCArKykgewkJICAgICAgICAgICAgICAgIFxuIisKLQkJIgkJZmluYWwgU3RyaW5nIHBhcnQgPSBcIlwiOwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIrCi0JCSIJCWZpbmFsIFN0cmluZyBzZWwgPSBcIlwiOwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIrCi0JCSIJCU9iamVjdCBsID0gbnVsbDsJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIrCi0JCSIJCWlmICgocGFydCAhPSBudWxsICYmIHNlbCAhPSBudWxsKSB8fCBsIGluc3RhbmNlb2YgU3RyaW5nKSB7CQlcbiIrCi0JCSIJCQlQbGF0Zm9ybS5ydW4obmV3IFJ1bm5hYmxlKCkgewkJICAgICAgICAgICAgICAgICAgICAgICAgXG4iKwotCQkiCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKwotCQkiCQkJCX0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIisKLQkJIgkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGUpIHsJCSAgICAgICAgXG4iKwotCQkiCQkJCX0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIisKLQkJIgkJCX0pOwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIisKLQkJIgkJfQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIrCi0JCSIJfQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKwotCQkifSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBBIHtcbiIrCi0JCSIgIGNsYXNzIFBsYXRmb3JtIHtcbiIrCi0JCSIgICAgUGxhdGZvcm0oKSB7XG4iKwotCQkiICAgIH1cbiIrCi0JCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIHJ1bihSdW5uYWJsZSByKSB7XG4iKwotCQkiICAgIH1cbiIrCi0JCSIgIH1cbiIrCi0JCSIgIE9iamVjdFtdIGFycmF5ID0gbnVsbDtcbiIrCi0JCSIgIGludCBuWCA9IDA7XG4iKwotCQkiICB7XG4iKwotCQkiICB9XG4iKwotCQkiICBwdWJsaWMgQSgpIHtcbiIrCi0JCSIgIH1cbiIrCi0JCSJ9XG4iOwotCQkKLQkJCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gInB1YmxpYyBjbGFzcyBBIHtcbiIrCi0JCSIgIGNsYXNzIFBsYXRmb3JtIHtcbiIrCi0JCSIgICAgUGxhdGZvcm0oKSB7XG4iKwotCQkiICAgICAgc3VwZXIoKTtcbiIrCi0JCSIgICAgfVxuIisKLQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgcnVuKFJ1bm5hYmxlIHIpIHtcbiIrCi0JCSIgICAgfVxuIisKLQkJIiAgfVxuIisKLQkJIiAgT2JqZWN0W10gYXJyYXkgPSBudWxsO1xuIisKLQkJIiAgaW50IG5YID0gMDtcbiIrCi0JCSIgIHtcbiIrCi0JCSIgICAgZmluYWwgU3RyaW5nIHBhcnQgPSBcIlwiO1xuIisKLQkJIiAgICBmaW5hbCBTdHJpbmcgc2VsID0gXCJcIjtcbiIrCi0JCSIgICAgT2JqZWN0IGwgPSBudWxsO1xuIisKLSAgICAJIiAgICBpZiAoKCgocGFydCAhPSBudWxsKSAmJiAoc2VsICE9IG51bGwpKSB8fCAobCBpbnN0YW5jZW9mIFN0cmluZykpKSBcbiIrCi0gICAgCSIgICAgICAgIHtcbiIrCi0gICAgIAkiICAgICAgICAgIFBsYXRmb3JtLnJ1bihuZXcgUnVubmFibGUoKSB7XG4iKwotCQkiICBwdWJsaWMgdm9pZCBydW4oKSB7XG4iKwotCQkiICB9XG4iKwotCQkiICBwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGUpIHtcbiIrCi0JCSIgIH1cbiIrCi0JCSJ9KTtcbiIrCi0JCSIgICAgICAgIH07O1xuIisKLQkJIiAgfVxuIisKLQkJIiAgcHVibGljIEEoKSB7XG4iKwotCQkiICAgIHN1cGVyKCk7XG4iKwotCQkiICB9XG4iKwotCQkifVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIEEge1xuIisKLQkJIiAgY2xhc3MgUGxhdGZvcm0ge1xuIisKLQkJIiAgICBQbGF0Zm9ybSgpIHtcbiIrCi0JCSIgICAgfVxuIisKLQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgcnVuKFJ1bm5hYmxlIHIpIHtcbiIrCi0JCSIgICAgfVxuIisKLQkJIiAgfVxuIisKLQkJIiAgT2JqZWN0W10gYXJyYXk7XG4iKwotCQkiICBpbnQgblg7XG4iKwotCQkiICB7XG4iKwotCQkiICB9XG4iKwotCQkiICBwdWJsaWMgQSgpIHtcbiIrCi0JCSIgIH1cbiIrCi0JCSJ9XG4iOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8Y2hlY2sgZm9yIG51bGwgaW5zaWRlIFJlY292ZXJlZEluaXRpYWxpemVyPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0OTkoKSB7Ci0JU3RyaW5nIHMgPSAKLQkJImltcG9ydCA7XG4iKwotCQkiY2xhc3MgWCB7XG4iKwotCQkifVxuIisKLQkJIi0gcHVibGljIHZvaWQgYWRkVGhyZWFkRmlsdGVyKElKYXZhVGhyZWFkIHRocmVhZCkgLSByZXN0cmljdHMgYnJlYWtwb2ludCB0byBcbiIrCi0JCSJnaXZlbiB0aHJlYWQgYW5kIGFueSBvdGhlciBwcmV2aW91c2x5IHNwZWNpZmllZCB0aHJlYWRzXG4iKwotCQkiLSBwdWJsaWMgdm9pZCByZW1vdmVUaHJlYWRGaWx0ZXIoSUphdmFUaHJlYWQgdGhyZWFkKS0gcmVtb3ZlcyB0aGUgZ2l2ZW4gdGhyZWFkIFxuIisKLQkJInJlc3RyaWN0aW9uICh3aWxsIG5lZWQgdG8gcmUtY3JlYXRlIGJyZWFrcG9pbnQgcmVxdWVzdCBhcyBKREkgZG9lcyBub3Qgc3VwcG9ydCBcbiIrCi0JCSJ0aGUgcmVtb3ZhbCBvZiB0aHJlYWQgZmlsdGVycylcbiIrCi0JCSItIHB1YmxpYyBJSmF2YVRocmVhZFtdIGdldFRocmVhZEZpbHRlcnMoKSAtIHJldHVybiB0aGUgc2V0IG9mIHRocmVhZHMgdGhpcyBcbiIrCi0JCSJicmVha3BvaW50IGlzIGN1cnJlbnRseSByZXN0cmljdGVkIHRvXG4iOwotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJImNsYXNzIFgge1xuIiArIAotCQkiICBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyB2b2lkIGFkZFRocmVhZEZpbHRlcihJSmF2YVRocmVhZCB0aHJlYWQpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgdm9pZCByZW1vdmVUaHJlYWRGaWx0ZXIoSUphdmFUaHJlYWQgdGhyZWFkKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIElKYXZhVGhyZWFkW10gZ2V0VGhyZWFkRmlsdGVycygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJjbGFzcyBYIHtcbiIgKyAKLQkJIiAgWCgpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAkJCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIHZvaWQgYWRkVGhyZWFkRmlsdGVyKElKYXZhVGhyZWFkIHRocmVhZCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyB2b2lkIHJlbW92ZVRocmVhZEZpbHRlcihJSmF2YVRocmVhZCB0aHJlYWQpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgSUphdmFUaHJlYWRbXSBnZXRUaHJlYWRGaWx0ZXJzKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyBleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSBleHBlY3RlZERpZXRVbml0VG9TdHJpbmc7Ci0JCi0JU3RyaW5nIHRlc3ROYW1lID0gIjw5MTAxIC0gUGFyc2UgZXJyb3Igd2hpbGUgdHlwaW5nIGluIEphdmEgZWRpdG9yPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotcHVibGljIHZvaWQgdGVzdDEwMCgpIHsKLQlTdHJpbmcgcyA9IAotCQkicHVibGljIGNsYXNzIEJ1ZyB7XG4iICsgCi0JCSIJc3RhdGljIGJvb2xlYW4gYm9sZCA9IGZhbHNlO1xuIiArIAotCQkicHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3VtZW50c1tdKSB7XG4iICsgCi0JCSIJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoU1dULk1FTlUgfCBTV1QuUkVTSVpFIHwgU1dULlRJVExFIHwgU1dULkhfU0NST0xMKTtcbiIgKyAKLQkJIglTdHlsZWRUZXh0IHRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULldSQVApOyBcbiIgKyAKLQkJIglzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIoKSB7XG4iICsgCi0JCSIJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHtcbiIgKyAKLQkJIgkJCXRleHQuc2V0Qm91bmRzKHNoZWxsLmdldENsaWVudEFyZWEoKSk7CQkJIFxuIiArIAotCQkiCQl9ICBcbiIgKyAKLQkJIgl9KTsJXG4iICsgCi0JCSIJc2hlbGwuYWRkTGlzdGVuZXIoU1dULktleURvd24sIGJldyBMaXN0ZW5lciAoKSB7XG4iICsgCi0JCSIJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHtcbiIgKyAKLQkJIgkJCWJvbGQgPSAhYm9sZDtcbiIgKyAKLQkJIgkJfVxuIiArIAotCQkiCX0pOyBcbiIgKyAKLQkJIgl0ZXh0LmFkZExpbmVTdHlsZUxpc3RlbmVyKG5ldyBMaW5lU3R5bGVMaXN0ZW5lcigpIHsgXG4iICsgCi0JCSIJCXB1YmxpYyB2b2lkIGxpbmVHZXRTdHlsZShMaW5lU3R5bGVFdmVudCBldmVudCkge1xuIiArIAotCQkiCQl9XG4iICsgCi0JCSIJfSk7XG4iICsgCi0JCSJ9XG4iICsgCi0JCSJ9XG4iOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgQnVnIHtcbiIgKyAKLQkJIiAgc3RhdGljIGJvb2xlYW4gYm9sZCA9IGZhbHNlO1xuIiArIAotCQkiICA8Y2xpbml0PigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgQnVnKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3VtZW50cykge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgQnVnIHtcbiIgKyAKLQkJIiAgc3RhdGljIGJvb2xlYW4gYm9sZCA9IGZhbHNlO1xuIiArIAotCQkiICA8Y2xpbml0PigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgQnVnKCkge1xuIiArIAotCQkiICAgIHN1cGVyKCk7XG4iICsgCQkKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd1bWVudHMpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgQnVnIHtcbiIgKyAKLQkJIiAgc3RhdGljIGJvb2xlYW4gYm9sZCA9IGZhbHNlO1xuIiArIAotCQkiICBwdWJsaWMgQnVnKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3VtZW50cykge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGJldyBMaXN0ZW5lcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbkRpZXRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBCdWcge1xuIiArIAotCQkiICBzdGF0aWMgYm9vbGVhbiBib2xkO1xuIiArIAotCQkiICA8Y2xpbml0PigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgQnVnKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3VtZW50cykge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8MTA2MTYgLSBsb2NhbCB0eXBlIG91dHNpZGUgbWV0aG9kPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotcHVibGljIHZvaWQgdGVzdDEwMSgpIHsKLQlTdHJpbmcgcyA9IAotCQkicHVibGljIGNsYXNzIFggewlcbiIrCi0JCSIgICAgT2JqZWN0IGZvbyhTdGFjazxYPiBzKSB7CVxuIisKLQkJIiAgICB9CVxuIisKLQkJIiAgIExpc3Q8VD4gYmFyKGludCBwb3MsIFQgeDEsIFQgeDIsIExpc3Q8VD4gbCkgewlcbiIrCi0JCSIgICAgfQlcbiIrCi0JCSJ9CVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBPYmplY3QgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGJhcihpbnQgcG9zLCBUIHgxLCBUIHgyKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgICAgc3VwZXIoKTtcbiIgKyAJCQotCQkiICB9XG4iICsgCi0JCSIgIE9iamVjdCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgYmFyKGludCBwb3MsIFQgeDEsIFQgeDIpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8MTIzODcgb3V0IG9mIG1lbW9yeSB3aXRoIGdlbmVyaWNzPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotcHVibGljIHZvaWQgdGVzdDEwMigpIHsKLQlTdHJpbmcgcyA9IAotCQkidm9pZCBfX19ldmFsKCkgewlcbiIrCi0JCSJuZXcgUnVubmFibGUoKXsJXG4iKwotCQkidm9pZCBfX19ydW4oKSB0aHJvd3MgVGhyb3dhYmxlIHsJXG4iKwotCQkicmV0dXJuIGJsYWg7CVxuIisKLQkJIn0JXG4iKwotCQkicHJpdmF0ZSBTdHJpbmcgYmxhcmc7CVxuIisKLQkJInB1YmxpYyB2b2lkIHJ1biAoKXsJXG4iKwotCQkiCQljbGFzcyBMb2NhbCB7IFxuIiArCi0JCSIJCQl2b2lkIGJheigpIHsJXG4iKyAKLQkJIgkJCX0JXG4iICsKLQkJIgkJfSAJXG4iKwotCQkifQlcbiIrCi0JCSJ9CVxuIisKLQkJIjt9CVxuIisKLQkJInB1YmxpYyBjbGFzcyBIZWxsb3sJXG4iKwotCQkicHJpdmF0ZSBzdGF0aWMgaW50IHg7CVxuIisKLQkJInByaXZhdGUgU3RyaW5nIGJsYWg7CVxuIisKLQkJInB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKXsJXG4iKwotCQkifQlcbiIrCi0JCSJwdWJsaWMgdm9pZCBoZWxsbyAoKXsJXG4iKwotCQkifQlcbiIrCi0JCSJwdWJsaWMgYm9vbGVhbiBibGFoICgpewlcbiIrCi0JCSJyZXR1cm4gZmFsc2U7fQlcbiIrCi0JCSJwdWJsaWMgdm9pZCBmb28gKCl7CVxuIisKLQkJIn0JXG4iKwotCQkifQlcbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZERpZXRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBIZWxsbyB7XG4iICsgCi0JCSIgIHByaXZhdGUgc3RhdGljIGludCB4O1xuIiArIAotCQkiICBwcml2YXRlIFN0cmluZyBibGFoO1xuIiArIAotCQkiICBwdWJsaWMgSGVsbG8oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgPGNsaW5pdD4oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyB2b2lkIGhlbGxvKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBib29sZWFuIGJsYWgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iIDsKLQotCVN0cmluZyBleHBlY3RlZERpZXRQbHVzQm9keVVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIEhlbGxvIHtcbiIgKyAKLQkJIiAgcHJpdmF0ZSBzdGF0aWMgaW50IHg7XG4iICsgCi0JCSIgIHByaXZhdGUgU3RyaW5nIGJsYWg7XG4iICsgCi0JCSIgIHB1YmxpYyBIZWxsbygpIHtcbiIgKyAKLQkJIiAgICBzdXBlcigpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgdm9pZCBoZWxsbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgYm9vbGVhbiBibGFoKCkge1xuIiArIAotCQkiICAgIHJldHVybiBmYWxzZTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZyA9IGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZzsKLQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPDEyNDU0IC0gaGFuZGxpbmcgdG9wbGV2ZWwgYW5vbnltb3VzPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZERpZXRVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nLAotCQlleHBlY3RlZEZ1bGxVbml0VG9TdHJpbmcsCQkKLQkJZXhwZWN0ZWRDb21wbGV0aW9uRGlldFVuaXRUb1N0cmluZywKLQkJdGVzdE5hbWUpOwotfQotcHVibGljIHZvaWQgdGVzdDEwMygpIHsKLQlTdHJpbmcgcyA9IAotCQkicHVibGljIGNsYXNzIFh7CVxuIisKLQkJIiAgIHZvaWQgZm9vKGludCB4LCBpbnQgeSwgdm9pZCB6IjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkRGlldFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICB2b2lkIHo7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKGludCB4LCBpbnQgeSkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHZvaWQgejtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgICAgc3VwZXIoKTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbyhpbnQgeCwgaW50IHkpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8MTQwMzggLSB0aGlyZCBhcmd1bWVudCB0eXBlIGlzIHZvaWQ+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywJCQotCQlleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nLAotCQl0ZXN0TmFtZSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MTA0KCkgewotCVN0cmluZyBzID0gCi0JCSJwdWJsaWMgY2xhc3MgUCNBRmllbGQge1xuIiArCi0JCSIJcHVibGljIHZvaWQgc2V0UCNBKFN0cmluZyBQI0EpIHtcbiIgKwotCQkiCQl0aGlzLlAjQSA9IFAjQTtcbiIgKwotCQkiCX1cbiIgKwkKLQkJIn0iOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgUCB7XG4iICsKLQkJIiAge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICBwdWJsaWMgdm9pZCBzZXRQO1xuIiArCi0JCSIgIHB1YmxpYyBQKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICBBKFN0cmluZyBQKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkRGlldFBsdXNCb2R5VW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgUCB7XG4iICsKLQkJIiAge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICBwdWJsaWMgdm9pZCBzZXRQO1xuIiArCi0JCSIgIHB1YmxpYyBQKCkge1xuIiArCi0JCSIgICAgc3VwZXIoKTtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgQShTdHJpbmcgUCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRGdWxsVW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nID0gZXhwZWN0ZWREaWV0VW5pdFRvU3RyaW5nOwotCQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8MTYxMjY+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkRGlldFVuaXRUb1N0cmluZywKLQkJZXhwZWN0ZWREaWV0UGx1c0JvZHlVbml0VG9TdHJpbmcsCi0JCWV4cGVjdGVkRnVsbFVuaXRUb1N0cmluZywJCQotCQlleHBlY3RlZENvbXBsZXRpb25EaWV0VW5pdFRvU3RyaW5nLAotCQl0ZXN0TmFtZSk7Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL0V4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uQ29tcGxldGlvblRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25Db21wbGV0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmE1N2I0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25Db21wbGV0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIucGFyc2VyOwotCi0vKioKLSAqIENvbXBsZXRpb24gaXMgZXhwZWN0ZWQgdG8gYmUgYW4gRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24KLSAqIG9yIGluc2lkZSBhbiBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25Db21wbGV0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0Q29tcGxldGlvblRlc3QgewotcHVibGljIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uQ29tcGxldGlvblRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0Jc3VwZXIodGVzdE5hbWUpOwotfQotLyoKLSAqIENvbXBsZXRpb24gb24gYSBxdWFsaWZpZWQgJ3N1cGVyJyBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uLgotICogCi0gKiBpZS4gRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gOjo9IFByaW1hcnkgJy4nICdzdXBlcicgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScgJzsnCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RQcmltYXJ5U3VwZXIoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJXG4iICsKLQkJIglzdGF0aWMgQmFyIHg7CQkJCQkJCQlcbiIgKwotCQkiCXB1YmxpYyBjbGFzcyBJbm5lckJhciB7CQkJCQkJXG4iICsKLQkJIgkJSW5uZXJCYXIoQmFyIHgpIHsJCQkJCQlcbiIgKwotCQkiCQl9CQkJCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIglwdWJsaWMgY2xhc3MgU3ViSW5uZXJCYXIgZXh0ZW5kcyBJbm5lckJhciB7CVxuIiArCi0JCSIJCVN1YklubmVyQmFyKEJhciB4KSB7CQkJCQlcbiIgKwotCQkiCQkJcHJpbWFyeSgpLnN1cGVyKDEsIDIsIGkpOwkJCVxuIiArCi0JCSIJCX0JCQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJzdXBlcigxLCAyLCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGw6cHJpbWFyeSgpLnN1cGVyKDEsIDIpPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBwdWJsaWMgY2xhc3MgSW5uZXJCYXIge1xuIiArIAotCQkiICAgIElubmVyQmFyKEJhciB4KSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBjbGFzcyBTdWJJbm5lckJhciBleHRlbmRzIElubmVyQmFyIHtcbiIgKyAKLQkJIiAgICBTdWJJbm5lckJhcihCYXIgeCkge1xuIiArIAotCQkiICAgICAgPENvbXBsZXRlT25FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbDpwcmltYXJ5KCkuc3VwZXIoMSwgMik+O1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBzdGF0aWMgQmFyIHg7XG4iICsgCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIiIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSIiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBleHBsaWNpdCBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIHByaW1hcnkgc3VwZXI+IgotCSk7Ci19Ci0vKgotICogQ29tcGxldGlvbiBvbiBhIHF1YWxpZmllZCAndGhpcycgY29uc3RydWN0b3IgaW52b2NhdGlvbi4KLSAqIAotICogaWUuIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSBQcmltYXJ5ICcuJyAndGhpcycgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScgJzsnCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RQcmltYXJ5VGhpcygpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6IAotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQlcbiIgKwotCQkiCXN0YXRpYyBCYXIgeDsJCQkJCQkJCVxuIiArCi0JCSIJcHVibGljIGNsYXNzIElubmVyQmFyIHsJCQkJCQlcbiIgKwotCQkiCQlJbm5lckJhcihCYXIgeCkgewkJCQkJCVxuIiArCi0JCSIJCX0JCQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkiCXB1YmxpYyBjbGFzcyBTdWJJbm5lckJhciBleHRlbmRzIElubmVyQmFyIHsJXG4iICsKLQkJIgkJU3ViSW5uZXJCYXIoQmFyIHgpIHsJCQkJCVxuIiArCi0JCSIJCQlwcmltYXJ5KCkudGhpcygxLCAyLCBpKTsJCQlcbiIgKwotCQkiCQl9CQkJCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkidGhpcygxLCAyLCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGw6cHJpbWFyeSgpLnRoaXMoMSwgMik+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIHB1YmxpYyBjbGFzcyBJbm5lckJhciB7XG4iICsgCi0JCSIgICAgSW5uZXJCYXIoQmFyIHgpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIGNsYXNzIFN1YklubmVyQmFyIGV4dGVuZHMgSW5uZXJCYXIge1xuIiArIAotCQkiICAgIFN1YklubmVyQmFyKEJhciB4KSB7XG4iICsgCi0JCSIgICAgICA8Q29tcGxldGVPbkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsOnByaW1hcnkoKS50aGlzKDEsIDIpPjtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgc3RhdGljIEJhciB4O1xuIiArIAotCQkiICA8Y2xpbml0PigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSIiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiIiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gZXhwbGljaXQgY29uc3RydWN0b3IgaW52b2NhdGlvbiBwcmltYXJ5IHRoaXM+IgotCSk7Ci19Ci0vKgotICogQ29tcGxldGlvbiBvbiBhICdzdXBlcicgY29uc3RydWN0b3IgaW52b2NhdGlvbi4KLSAqIAotICogaWUuIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSAnc3VwZXInICcoJyBBcmd1bWVudExpc3RvcHQgJyknICc7JwotICovCi1wdWJsaWMgdm9pZCB0ZXN0U3VwZXIoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCVxuIiArCi0JCSIJQmFyKCkgewkJCQkJCQkJCVxuIiArCi0JCSIJCXN1cGVyKDEsIDIsIGkpOwkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJInN1cGVyKDEsIDIsIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbDpzdXBlcigxLCAyKT4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGw6c3VwZXIoMSwgMik+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRpb24gb24gJ3N1cGVyJyBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uPiIKLQkpOwotfQotLyoKLSAqIENvbXBsZXRpb24gb24gYSAndGhpcycgY29uc3RydWN0b3IgaW52b2NhdGlvbi4KLSAqIAotICogaWUuIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSAndGhpcycgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScgJzsnCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RUaGlzKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciB7CQkJCQkJCQlcbiIgKwotCQkiCUJhcigpIHsJCQkJCQkJCQlcbiIgKwotCQkiCQl0aGlzKDEsIDIsIGkpOwkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJInRoaXMoMSwgMiwiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsOnRoaXMoMSwgMik+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsOnRoaXMoMSwgMik+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRpb24gb24gJ3RoaXMnIGNvbnN0cnVjdG9yIGludm9jYXRpb24+IgotCSk7Ci19Ci0vKgotICogRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gOjo9IE5hbWUgJy4nICdzdXBlcicgJygnIDxBcmd1bWVudExpc3RvcHQ+ICcpJyAnOycKLSAqLwotcHVibGljIHZvaWQgdGVzdFdyYXBwZXJOYW1lU3VwZXIoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJXG4iICsKLQkJIglzdGF0aWMgQmFyIHg7CQkJCQkJCQlcbiIgKwotCQkiCXB1YmxpYyBjbGFzcyBJbm5lckJhciB7CQkJCQkJXG4iICsKLQkJIgkJSW5uZXJCYXIoQmFyIHgpIHsJCQkJCQlcbiIgKwotCQkiCQl9CQkJCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIglwdWJsaWMgY2xhc3MgU3ViSW5uZXJCYXIgZXh0ZW5kcyBJbm5lckJhciB7CVxuIiArCi0JCSIJCVN1YklubmVyQmFyKCkgewkJCQkJCQlcbiIgKwotCQkiCQkJQmFyLnN1cGVyKGZyZWQoKS54eXopOwkJCQlcbiIgKwotCQkiCQl9CQkJCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiZnJlZCgpLngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgcHVibGljIGNsYXNzIElubmVyQmFyIHtcbiIgKyAKLQkJIiAgICBJbm5lckJhcihCYXIgeCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgY2xhc3MgU3ViSW5uZXJCYXIgZXh0ZW5kcyBJbm5lckJhciB7XG4iICsgCi0JCSIgICAgU3ViSW5uZXJCYXIoKSB7XG4iICsgCi0JCSIgICAgICBzdXBlcig8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4pO1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBzdGF0aWMgQmFyIHg7XG4iICsgCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gd3JhcHBlciBuYW1lIHN1cGVyPiIKLQkpOwotfQotLyoKLSAqIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSBOYW1lICcuJyAndGhpcycgJygnIDxBcmd1bWVudExpc3RvcHQ+ICcpJyAnOycgIAotICovCi1wdWJsaWMgdm9pZCB0ZXN0V3JhcHBlck5hbWVUaGlzKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDogCi0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCVxuIiArCi0JCSIJc3RhdGljIEJhciB4OwkJCQkJCQkJXG4iICsKLQkJIglwdWJsaWMgY2xhc3MgSW5uZXJCYXIgewkJCQkJCVxuIiArCi0JCSIJCUlubmVyQmFyKEJhciB4KSB7CQkJCQkJXG4iICsKLQkJIgkJfQkJCQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSIJcHVibGljIGNsYXNzIFN1YklubmVyQmFyIGV4dGVuZHMgSW5uZXJCYXIgewlcbiIgKwotCQkiCQlTdWJJbm5lckJhcigpIHsJCQkJCQkJXG4iICsKLQkJIgkJCUJhci50aGlzKGZyZWQoKS54eXopOwkJCQlcbiIgKwotCQkiCQl9CQkJCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiZnJlZCgpLngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgcHVibGljIGNsYXNzIElubmVyQmFyIHtcbiIgKyAKLQkJIiAgICBJbm5lckJhcihCYXIgeCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgY2xhc3MgU3ViSW5uZXJCYXIgZXh0ZW5kcyBJbm5lckJhciB7XG4iICsgCi0JCSIgICAgU3ViSW5uZXJCYXIoKSB7XG4iICsgCi0JCSIgICAgICB0aGlzKDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54Pik7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHN0YXRpYyBCYXIgeDtcbiIgKyAKLQkJIiAgPGNsaW5pdD4oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJ4eXoiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiB3cmFwcGVyIG5hbWUgdGhpcz4iCi0JKTsKLX0KLS8qCi0gKiBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gUHJpbWFyeSAnLicgJ3RoaXMnICcoJyA8QXJndW1lbnRMaXN0b3B0PiAnKScgJzsnIAotICovCi1wdWJsaWMgdm9pZCB0ZXN0V3JhcHBlclByaW1hcnlTdXBlcigpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6IAotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQlcbiIgKwotCQkiCXN0YXRpYyBCYXIgeDsJCQkJCQkJCVxuIiArCi0JCSIJcHVibGljIGNsYXNzIElubmVyQmFyIHsJCQkJCQlcbiIgKwotCQkiCQlJbm5lckJhcihCYXIgeCkgewkJCQkJCVxuIiArCi0JCSIJCX0JCQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkiCXB1YmxpYyBjbGFzcyBTdWJJbm5lckJhciBleHRlbmRzIElubmVyQmFyIHsJXG4iICsKLQkJIgkJU3ViSW5uZXJCYXIoQmFyIHgpIHsJCQkJCVxuIiArCi0JCSIJCQlwcmltYXJ5KCkuc3VwZXIoZnJlZCgpLnh5eik7CQkJXG4iICsKLQkJIgkJfQkJCQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJImZyZWQoKS54IiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIHB1YmxpYyBjbGFzcyBJbm5lckJhciB7XG4iICsgCi0JCSIgICAgSW5uZXJCYXIoQmFyIHgpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIGNsYXNzIFN1YklubmVyQmFyIGV4dGVuZHMgSW5uZXJCYXIge1xuIiArIAotCQkiICAgIFN1YklubmVyQmFyKEJhciB4KSB7XG4iICsgCi0JCSIgICAgICBzdXBlcig8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4pO1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBzdGF0aWMgQmFyIHg7XG4iICsgCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gd3JhcHBlciBwcmltYXJ5IHN1cGVyPiIKLQkpOwotfQotLyoKLSAqIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSAnc3VwZXInICcoJyA8QXJndW1lbnRMaXN0b3B0PiAnKScgJzsnICAgCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RXcmFwcGVyU3VwZXIoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJXG4iICsKLQkJIglCYXIoKSB7CQkJCQkJCQkJCVxuIiArCi0JCSIJCXN1cGVyKGZyZWQoKS54eXopOwkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsKLQkJIiAgICBzdXBlcig8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4pO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJ4eXoiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiB3cmFwcGVyIHN1cGVyPiIKLQkpOwotfQotLyoKLSAqIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSAndGhpcycgJygnIDxBcmd1bWVudExpc3RvcHQ+ICcpJyAnOycgICAKLSAqLwotcHVibGljIHZvaWQgdGVzdFdyYXBwZXJUaGlzKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDogCi0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCVxuIiArCi0JCSIJQmFyKCkgewkJCQkJCQkJCQlcbiIgKwotCQkiCQl0aGlzKGZyZWQoKS54eXopOwkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArCi0JCSIgICAgdGhpcyg8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4pO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJ4eXoiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiB3cmFwcGVyIHRoaXM+IgotCSk7Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL0V4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU2VsZWN0aW9uVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3BhcnNlci9FeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblNlbGVjdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBlOGRkZi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL0V4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU2VsZWN0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIucGFyc2VyOwotCi0vKioKLSAqIFNlbGVjdGlvbiBpcyBleHBlY3RlZCB0byBiZSB3cmFwcGVkIHdpdGggYW4gZXhwbGljaXQgY29uc3RydWN0b3IgaW52b2NhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uU2VsZWN0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0U2VsZWN0aW9uVGVzdCB7Ci1wdWJsaWMgRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb25TZWxlY3Rpb25UZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotCXN1cGVyKHRlc3ROYW1lKTsKLX0KLS8qCi0gKiBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gTmFtZSAnLicgJ3N1cGVyJyAnKCcgPEFyZ3VtZW50TGlzdG9wdD4gJyknICc7JyAgCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3ROYW1lU3VwZXIoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQlcbiIgKwotCQkiCXN0YXRpYyBCYXIgeDsJCQkJCQkJCVxuIiArCi0JCSIJcHVibGljIGNsYXNzIElubmVyQmFyIHsJCQkJCQlcbiIgKwotCQkiCQlJbm5lckJhcihCYXIgeCkgewkJCQkJCVxuIiArCi0JCSIJCX0JCQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkiCXB1YmxpYyBjbGFzcyBTdWJJbm5lckJhciBleHRlbmRzIElubmVyQmFyIHsJXG4iICsKLQkJIgkJU3ViSW5uZXJCYXIoKSB7CQkJCQkJCVxuIiArCi0JCSIJCQlCYXIuc3VwZXIoZnJlZCgpKTsJCQkJCVxuIiArCi0JCSIJCX0JCQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gc2VsZWN0aW9uU3RhcnRCZWhpbmQ6Ci0JCSJCYXIuc3VwZXIoIiwKLQkJLy8gc2VsZWN0aW9uRW5kQmVoaW5kOgotCQkiZnJlZCIsCi0JCS8vIGV4cGVjdGVkU2VsZWN0aW9uTm9kZVRvU3RyaW5nOgotCQkiPFNlbGVjdE9uTWVzc2FnZVNlbmQ6ZnJlZCgpPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBwdWJsaWMgY2xhc3MgSW5uZXJCYXIge1xuIiArIAotCQkiICAgIElubmVyQmFyKEJhciB4KSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBjbGFzcyBTdWJJbm5lckJhciBleHRlbmRzIElubmVyQmFyIHtcbiIgKyAKLQkJIiAgICBTdWJJbm5lckJhcigpIHtcbiIgKyAKLQkJIiAgICAgIHN1cGVyKDxTZWxlY3RPbk1lc3NhZ2VTZW5kOmZyZWQoKT4pO1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBzdGF0aWMgQmFyIHg7XG4iICsgCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRTZWxlY3Rpb25JZGVudGlmaWVyOgotCQkiZnJlZCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJmcmVkKCkiLAotCQkvLyB0ZXN0TmFtZToKLQkJIjxzZWxlY3Qgb24gZXhwbGljaXQgY29uc3RydWN0b3IgaW52b2NhdGlvbiBuYW1lIHN1cGVyPiIKLQkpOwotfQotLyoKLSAqIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uIDo6PSBOYW1lICcuJyAndGhpcycgJygnIDxBcmd1bWVudExpc3RvcHQ+ICcpJyAnOycgIAotICovCi1wdWJsaWMgdm9pZCB0ZXN0TmFtZVRoaXMoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQlcbiIgKwotCQkiCXN0YXRpYyBCYXIgeDsJCQkJCQkJCVxuIiArCi0JCSIJcHVibGljIGNsYXNzIElubmVyQmFyIHsJCQkJCQlcbiIgKwotCQkiCQlJbm5lckJhcihCYXIgeCkgewkJCQkJCVxuIiArCi0JCSIJCX0JCQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkiCXB1YmxpYyBjbGFzcyBTdWJJbm5lckJhciBleHRlbmRzIElubmVyQmFyIHsJXG4iICsKLQkJIgkJU3ViSW5uZXJCYXIoKSB7CQkJCQkJCVxuIiArCi0JCSIJCQlCYXIudGhpcyhmcmVkKCkpOwkJCQkJXG4iICsKLQkJIgkJfQkJCQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBzZWxlY3Rpb25TdGFydEJlaGluZDoKLQkJIkJhci50aGlzKCIsCi0JCS8vIHNlbGVjdGlvbkVuZEJlaGluZDoKLQkJImZyZWQiLAotCQkvLyBleHBlY3RlZFNlbGVjdGlvbk5vZGVUb1N0cmluZzoKLQkJIjxTZWxlY3RPbk1lc3NhZ2VTZW5kOmZyZWQoKT4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgcHVibGljIGNsYXNzIElubmVyQmFyIHtcbiIgKyAKLQkJIiAgICBJbm5lckJhcihCYXIgeCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgY2xhc3MgU3ViSW5uZXJCYXIgZXh0ZW5kcyBJbm5lckJhciB7XG4iICsgCi0JCSIgICAgU3ViSW5uZXJCYXIoKSB7XG4iICsgCi0JCSIgICAgICB0aGlzKDxTZWxlY3RPbk1lc3NhZ2VTZW5kOmZyZWQoKT4pO1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBzdGF0aWMgQmFyIHg7XG4iICsgCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRTZWxlY3Rpb25JZGVudGlmaWVyOgotCQkiZnJlZCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJmcmVkKCkiLAotCQkvLyB0ZXN0TmFtZToKLQkJIjxzZWxlY3Qgb24gZXhwbGljaXQgY29uc3RydWN0b3IgaW52b2NhdGlvbiBuYW1lIHRoaXM+IgotCSk7Ci19Ci0vKgotICogRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gOjo9IFByaW1hcnkgJy4nICd0aGlzJyAnKCcgPEFyZ3VtZW50TGlzdG9wdD4gJyknICc7JyAKLSAqLwotcHVibGljIHZvaWQgdGVzdFByaW1hcnlTdXBlcigpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCVxuIiArCi0JCSIJc3RhdGljIEJhciB4OwkJCQkJCQkJXG4iICsKLQkJIglwdWJsaWMgY2xhc3MgSW5uZXJCYXIgewkJCQkJCVxuIiArCi0JCSIJCUlubmVyQmFyKEJhciB4KSB7CQkJCQkJXG4iICsKLQkJIgkJfQkJCQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSIJcHVibGljIGNsYXNzIFN1YklubmVyQmFyIGV4dGVuZHMgSW5uZXJCYXIgewlcbiIgKwotCQkiCQlTdWJJbm5lckJhcihCYXIgeCkgewkJCQkJXG4iICsKLQkJIgkJCXByaW1hcnkoKS5zdXBlcihmcmVkKCkpOwkJCVxuIiArCi0JCSIJCX0JCQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gc2VsZWN0aW9uU3RhcnRCZWhpbmQ6Ci0JCSJzdXBlcigiLAotCQkvLyBzZWxlY3Rpb25FbmRCZWhpbmQ6Ci0JCSJmcmVkIiwKLQkJLy8gZXhwZWN0ZWRTZWxlY3Rpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8U2VsZWN0T25NZXNzYWdlU2VuZDpmcmVkKCk+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIHB1YmxpYyBjbGFzcyBJbm5lckJhciB7XG4iICsgCi0JCSIgICAgSW5uZXJCYXIoQmFyIHgpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIGNsYXNzIFN1YklubmVyQmFyIGV4dGVuZHMgSW5uZXJCYXIge1xuIiArIAotCQkiICAgIFN1YklubmVyQmFyKEJhciB4KSB7XG4iICsgCi0JCSIgICAgICBzdXBlcig8U2VsZWN0T25NZXNzYWdlU2VuZDpmcmVkKCk+KTtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgc3RhdGljIEJhciB4O1xuIiArIAotCQkiICA8Y2xpbml0PigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkU2VsZWN0aW9uSWRlbnRpZmllcjoKLQkJImZyZWQiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiZnJlZCgpIiwKLQkJLy8gdGVzdE5hbWU6Ci0JCSI8c2VsZWN0IG9uIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGludm9jYXRpb24gcHJpbWFyeSBzdXBlcj4iCi0JKTsKLX0KLS8qCi0gKiBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiA6Oj0gJ3N1cGVyJyAnKCcgPEFyZ3VtZW50TGlzdG9wdD4gJyknICc7JyAgCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTdXBlcigpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCVxuIiArCi0JCSIJQmFyKCkgewkJCQkJCQkJCQlcbiIgKwotCQkiCQlzdXBlcihmcmVkKCkpOwkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBzZWxlY3Rpb25TdGFydEJlaGluZDoKLQkJInN1cGVyKCIsCi0JCS8vIHNlbGVjdGlvbkVuZEJlaGluZDoKLQkJImZyZWQiLAotCQkvLyBleHBlY3RlZFNlbGVjdGlvbk5vZGVUb1N0cmluZzoKLQkJIjxTZWxlY3RPbk1lc3NhZ2VTZW5kOmZyZWQoKT4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArCi0JCSIgICAgc3VwZXIoPFNlbGVjdE9uTWVzc2FnZVNlbmQ6ZnJlZCgpPik7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkU2VsZWN0aW9uSWRlbnRpZmllcjoKLQkJImZyZWQiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiZnJlZCgpIiwKLQkJLy8gdGVzdE5hbWU6Ci0JCSI8c2VsZWN0IG9uIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGludm9jYXRpb24gc3VwZXI+IgotCSk7Ci19Ci0vKgotICogRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gOjo9ICd0aGlzJyAnKCcgPEFyZ3VtZW50TGlzdG9wdD4gJyknICc7JyAKLSAqLwotcHVibGljIHZvaWQgdGVzdFRoaXMoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQlcbiIgKwotCQkiCUJhcigpIHsJCQkJCQkJCQkJXG4iICsKLQkJIgkJdGhpcyhmcmVkKCkpOwkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBzZWxlY3Rpb25TdGFydEJlaGluZDoKLQkJInRoaXMoIiwKLQkJLy8gc2VsZWN0aW9uRW5kQmVoaW5kOgotCQkiZnJlZCIsCi0JCS8vIGV4cGVjdGVkU2VsZWN0aW9uTm9kZVRvU3RyaW5nOgotCQkiPFNlbGVjdE9uTWVzc2FnZVNlbmQ6ZnJlZCgpPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsKLQkJIiAgICB0aGlzKDxTZWxlY3RPbk1lc3NhZ2VTZW5kOmZyZWQoKT4pO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZFNlbGVjdGlvbklkZW50aWZpZXI6Ci0JCSJmcmVkIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJImZyZWQoKSIsCi0JCS8vIHRlc3ROYW1lOgotCQkiPHNlbGVjdCBvbiBleHBsaWNpdCBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIHRoaXM+IgotCSk7Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL0ZpZWxkQWNjZXNzQ29tcGxldGlvblRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvRmllbGRBY2Nlc3NDb21wbGV0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDg0NDQ4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvRmllbGRBY2Nlc3NDb21wbGV0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyLnBhcnNlcjsKLQotLyoqCi0gKiBDb21wbGV0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIGEgRmllbGRBY2Nlc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWVsZEFjY2Vzc0NvbXBsZXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RDb21wbGV0aW9uVGVzdCB7Ci1wdWJsaWMgRmllbGRBY2Nlc3NDb21wbGV0aW9uVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLQlzdXBlcih0ZXN0TmFtZSk7Ci19Ci0vKgotICogQWRkaXRpdmVFeHByZXNzaW9uIDo6PSBBZGRpdGl2ZUV4cHJlc3Npb24gJy0nIDxNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24+ICAKLSAqLwotcHVibGljIHZvaWQgdGVzdEFkZGl0aXZlRXhwcmVzc2lvbk1pbnVzKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJCVxuIiArCi0JCSIJaW50IGZvbygpIHsJCQkJCQkJCQkJXG4iICsKLQkJIgkJcmV0dXJuIDEgLSBmcmVkKCkueHl6OwkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJCVxuIiwKLQkJCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgICAoMSAtIDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54Pik7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJInh5eiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIGFkZGl0aXZlIGV4cHJlc3Npb24gbWludXM+IgotCSk7Ci19Ci0vKgotICogQWRkaXRpdmVFeHByZXNzaW9uIDo6PSBBZGRpdGl2ZUV4cHJlc3Npb24gJysnIDxNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24+IAotICovCi1wdWJsaWMgdm9pZCB0ZXN0QWRkaXRpdmVFeHByZXNzaW9uUGx1cygpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCQlcbiIgKwotCQkiCWludCBmb28oKSB7CQkJCQkJCQkJCVxuIiArCi0JCSIJCXJldHVybiAxICsgZnJlZCgpLnh5ejsJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCQlcbiIsCi0JCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB7XG4iICsgCi0JCSIgICAgKDEgKyA8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4pO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJ4eXoiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBhZGRpdGl2ZSBleHByZXNzaW9uIHBsdXM+IgotCSk7Ci19Ci0vKgotICogQW5kRXhwcmVzc2lvbiA6Oj0gQW5kRXhwcmVzc2lvbiAnJicgPEVxdWFsaXR5RXhwcmVzc2lvbj4KLSAqLwotcHVibGljIHZvaWQgdGVzdEFuZEV4cHJlc3Npb24oKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQkJXG4iICsKLQkJIglib29sZWFuIGZvbygpIHsJCQkJCQkJCQlcbiIgKwotCQkiCQlyZXR1cm4gaXNUcnVlICYgZnJlZCgpLnh5ejsJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJCVxuIiwKLQkJCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgYm9vbGVhbiBmb28oKSB7XG4iICsgCi0JCSIgICAgKGlzVHJ1ZSAmIDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54Pik7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJInh5eiIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSI8Y29tcGxldGUgb24gYW5kIGV4cHJlc3Npb24+IgotCSk7Ci19Ci0vKgotICogQXJndW1lbnRMaXN0IDo6PSBBcmd1bWVudExpc3QgJywnIDxFeHByZXNzaW9uPiAKLSAqLwotcHVibGljIHZvaWQgdGVzdEFyZ3VtZW50TGlzdCgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIgKwotCQkiCQliaXp6KDEsIFwiMlwiLCBmcmVkKCkueHl6KTsJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIiwKLQkJCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgYml6eigxICwgXCIyXCIgLCA8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4pO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJ4eXoiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBhcmd1bWVudCBsaXN0PiIKLQkpOwotfQotLyoKLSAqIEFycmF5QWNjZXNzIDo6PSBOYW1lICdbJyA8RXhwcmVzc2lvbj4gJ10nIAotICovCi1wdWJsaWMgdm9pZCB0ZXN0QXJyYXlBY2Nlc3MoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQlcbiIgKwotCQkiCWludCBmb28oKSB7CQkJCQkJCQkJXG4iICsKLQkJIgkJcmV0dXJuIHZbZnJlZCgpLnh5el07CQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIiwKLQkJCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgICB2WzxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54Pl07XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJInh5eiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIGFycmF5IGFjY2Vzcz4iCi0JKTsKLX0KLS8qCi0gKiBBcnJheUFjY2VzcyA6Oj0gUHJpbWFyeU5vTmV3QXJyYXkgJ1snIDxFeHByZXNzaW9uPiAnXScgCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RBcnJheUFjY2Vzc1ByaW1hcnlOb05ld0FycmF5KCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJXG4iICsKLQkJIglpbnQgZm9vKCkgewkJCQkJCQkJCVxuIiArCi0JCSIJCXJldHVybiBidXp6KClbZnJlZCgpLnh5el07CQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQlcbiIsCi0JCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB7XG4iICsgCi0JCSIgICAgYnV6eigpWzxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54Pl07XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJInh5eiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIGFycmF5IGFjY2VzcyBwcmltYXJ5IG5vIG5ldyBhcnJheT4iCi0JKTsKLX0KLS8qCi0gKiBBcnJheUluaXRpYWxpemVyIDo6PSAneycgPFZhcmlhYmxlSW5pdGlhbGl6ZXJzPiAnfScgCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RBcnJheUluaXRpYWxpemVyKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQkJCQlcbiIgKwotCQkiCQlpbnRbXSBpID0gbmV3IGludFtdIHtmcmVkKCkueHl6fQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQkJCVxuIiwKLQkJCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgaW50W10gaSA9IG5ldyBpbnRbXXs8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4sfTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gYXJyYXkgaW5pdGlhbGl6ZXI+IgotCSk7Ci19Ci0vKgotICogQXJyYXlJbml0aWFsaXplciA6Oj0gJ3snIDxWYXJpYWJsZUluaXRpYWxpemVycz4gLCAnfScgCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RBcnJheUluaXRpYWxpemVyQ29tbWEoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQkJCQlcbiIgKwotCQkiCQlpbnRbXSBpID0gbmV3IGludFtdIHtmcmVkKCkueHl6LH0JCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIGludFtdIGkgPSBuZXcgaW50W117PENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+LH07XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJInh5eiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIGFycmF5IGluaXRpYWxpemVyIGNvbW1hPiIKLQkpOwotfQotLyoKLSAqIEFzc2lnbm1lbnQgOjo9IExlZnRIYW5kU2lkZSBBc3NpZ25tZW50T3BlcmF0b3IgPEFzc2lnbm1lbnRFeHByZXNzaW9uPiAKLSAqLwotcHVibGljIHZvaWQgdGVzdEFzc2lnbm1lbnQoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQkJCQlcbiIgKwotCQkiCQlpID0gZnJlZCgpLnh5ejsJCQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBpID0gPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJ4eXoiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBhc3NpZ25tZW50PiIKLQkpOwotfQotLyoKLSAqIEJsb2NrIDo6PSBPcGVuQmxvY2sgJ3snIDxCbG9ja1N0YXRlbWVudHNvcHQ+ICd9JyAKLSAqLwotcHVibGljIHZvaWQgdGVzdEJsb2NrKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDogCi0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIgKwotCQkiCQl0cnkgewkJCQkJCQkJCVxuIiArCi0JCSIJCQlmcmVkKCkueHl6ID0gbmV3IEZvbygpOwkJCQlcbiIgKwotCQkiCQl9IGNhdGNoIChFeGNlcHRpb24gZSkge30JCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICB7XG4iICsgCi0JCSIgICAgICA8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD47XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJ4eXoiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBibG9jaz4iCi0JKTsKLX0KLS8qCi0gKiBCbG9ja1N0YXRlbWVudHMgOjo9IEJsb2NrU3RhdGVtZW50cyA8QmxvY2tTdGF0ZW1lbnQ+Ci0gKi8KLXB1YmxpYyB2b2lkIHRlc3RCbG9ja1N0YXRlbWVudHMoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJCVxuIiArCi0JCSIJCWludCBpID0gMDsJCQkJCQkJCVxuIiArCi0JCSIJCWZyZWQoKS54eXogPSBuZXcgRm9vKCk7CQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIGludCBpO1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gYmxvY2sgc3RhdGVtZW50cz4iCi0JKTsKLX0KLS8qCi0gKiBDb25zdHJ1Y3RvckJvZHkgOjo9IE5lc3RlZE1ldGhvZCAneycgRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24gPEJsb2NrU3RhdGVtZW50cz4gJ30nICAgCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RCbG9ja1N0YXRlbWVudHNJbkNvbnN0cnVjdG9yQm9keSgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6IAotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQlcbiIgKwotCQkiCUJhcigpIHsJCQkJCQkJCQkJXG4iICsKLQkJIgkJc3VwZXIoKTsJCQkJCQkJCQlcbiIgKwotCQkiCQlmcmVkKCkueHl6ID0gbmV3IEZvbygpOwkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKwotCQkiICAgIHN1cGVyKCk7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJInh5eiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIGJsb2NrIHN0YXRlbWVudHMgaW4gY29uc3RydWN0b3IgYm9keT4iCi0JKTsKLX0KLS8qCi0gKiBCbG9ja1N0YXRlbWVudHMgOjo9IEJsb2NrU3RhdGVtZW50cyA8QmxvY2tTdGF0ZW1lbnQ+Ci0gKgotICogaW4gYSBub24gc3RhdGljIGluaXRpYWxpemVyLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0QmxvY2tTdGF0ZW1lbnRzSW5Jbml0aWFsaXplcigpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6IAotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQlcbiIgKwotCQkiCXsJCQkJCQkJCQkJCVxuIiArCi0JCSIJCWludCBpID0gMDsJCQkJCQkJCVxuIiArCi0JCSIJCWZyZWQoKS54eXogPSBuZXcgRm9vKCk7CQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAge1xuIiArIAotCQkiICAgIGludCBpO1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJInh5eiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIGJsb2NrIHN0YXRlbWVudHMgaW4gaW5pdGlhbGl6ZXI+IgotCSk7Ci19Ci0vKgotICogQmxvY2tTdGF0ZW1lbnRzIDo6PSBCbG9ja1N0YXRlbWVudHMgPEJsb2NrU3RhdGVtZW50PgotICoKLSAqIGluIGEgc3RhdGljIGluaXRpYWxpemVyLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0QmxvY2tTdGF0ZW1lbnRzSW5TdGF0aWNJbml0aWFsaXplcigpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6IAotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQlcbiIgKwotCQkiCXN0YXRpYyB7CQkJCQkJCQkJXG4iICsKLQkJIgkJaW50IGkgPSAwOwkJCQkJCQkJXG4iICsKLQkJIgkJZnJlZCgpLnh5eiA9IG5ldyBGb28oKTsJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBzdGF0aWMge1xuIiArIAotCQkiICAgIGludCBpO1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PjtcbiIgKyAKLQkJIiAgfVxuIiArCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJInh5eiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIGJsb2NrIHN0YXRlbWVudHMgaW4gc3RhdGljIGluaXRpYWxpemVyPiIKLQkpOwotfQotLyoKLSAqIENhc3RFeHByZXNzaW9uIDo6PSBQdXNoTFBBUkVOIDxFeHByZXNzaW9uPiBQdXNoUlBBUkVOIFVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cwotICoKLSAqIE5COiBWYWxpZCBzeW50YXhpY2FsbHkgYnV0IG5vdCBzZW1hbnRpY2FsbHkKLSAqLwotcHVibGljIHZvaWQgdGVzdENhc3RFeHByZXNzaW9uKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDogCi0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCVxuIiArCi0JCSIJQmFyIGZvbygpIHsJCQkJCQkJCQlcbiIgKwotCQkiCQlyZXR1cm4gKGZyZWQoKS54eXopYnV6eigpOwkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIEJhciBmb28oKSB7XG4iICsgCi0JCSIgICAgcmV0dXJuIDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gY2FzdCBleHByZXNzaW9uPiIKLQkpOwotfQotLyoKLSAqIENhc3RFeHByZXNzaW9uIDo6PSBQdXNoTFBBUkVOIFByaW1pdGl2ZVR5cGUgRGltc29wdCBQdXNoUlBBUkVOIDxVbmFyeUV4cHJlc3Npb24+Ci0gKiBvcgotICogQ2FzdEV4cHJlc3Npb24gOjo9IFB1c2hMUEFSRU4gTmFtZSBEaW1zIFB1c2hSUEFSRU4gPFVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cz4KLSAqIG9yCi0gKiBDYXN0RXhwcmVzc2lvbiA6Oj0gUHVzaExQQVJFTiBFeHByZXNzaW9uIFB1c2hSUEFSRU4gPFVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cz4gCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDYXN0RXhwcmVzc2lvblVuYXJ5RXhwcmVzc2lvbigpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6IAotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQlcbiIgKwotCQkiCUJhciBmb28oKSB7CQkJCQkJCQkJXG4iICsKLQkJIgkJcmV0dXJuIChCYXIpKGZyZWQoKS54eXopOwkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIEJhciBmb28oKSB7XG4iICsgCi0JCSIgICAgKEJhcikgPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJ4eXoiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBjYXN0IGV4cHJlc3Npb24gdW5hcnkgZXhwcmVzc2lvbj4iCi0JKTsKLX0KLS8qCi0gKiBDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIDo6PSAnbmV3JyBDbGFzc1R5cGUgJygnIDxBcmd1bWVudExpc3RvcHQ+ICcpJyBDbGFzc0JvZHlvcHQgCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDogCi0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIgKwotCQkiCQluZXcgQmFyKGZyZWQoKS54eXopOwkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgbmV3IEJhcig8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4pO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJ4eXoiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiBleHByZXNzaW9uPiIKLQkpOwotfQotLyoKLSAqIENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gOjo9IENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25OYW1lICduZXcnIFNpbXBsZU5hbWUgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScgQ2xhc3NCb2R5b3B0ICAKLSAqLwotcHVibGljIHZvaWQgdGVzdENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25OYW1lKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDogCi0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIgKwotCQkiCQlCYXIubmV3IEJhcihmcmVkKCkueHl6KTsJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgQmFyLm5ldyBCYXIoPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+KTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24gZXhwcmVzc2lvbiBuYW1lPiIKLQkpOwotfQotLyoKLSAqIENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gOjo9IFByaW1hcnkgJy4nICduZXcnIFNpbXBsZU5hbWUgJygnIDxBcmd1bWVudExpc3RvcHQ+ICcpJyBDbGFzc0JvZHlvcHQgCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uUHJpbWFyeSgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6IAotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQkJXG4iICsKLQkJIgkJYml6eigpLm5ldyBCYXIoZnJlZCgpLnh5eik7CQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgYml6eigpLm5ldyBCYXIoPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+KTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24gZXhwcmVzc2lvbiBwcmltYXJ5PiIKLQkpOwotfQotLyoKLSAqIENvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbiA6Oj0gQ29uZGl0aW9uYWxBbmRFeHByZXNzaW9uICcmJicgPEluY2x1c2l2ZU9yRXhwcmVzc2lvbj4gCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb25kaXRpb25hbEFuZEV4cHJlc3Npb24oKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJCVxuIiArCi0JCSIJYm9vbGVhbiBmb28oKSB7CQkJCQkJCQkJXG4iICsKLQkJIgkJcmV0dXJuIGlzVHJ1ZSAmJiBmcmVkKCkueHl6OwkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGJvb2xlYW4gZm9vKCkge1xuIiArIAotCQkiICAgIChpc1RydWUgJiYgPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+KTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gY29uZGl0aW9uYWwgYW5kIGV4cHJlc3Npb24+IgotCSk7Ci19Ci0vKgotICogQ29uZGl0aW9uYWxFeHByZXNzaW9uIDo6PSBDb25kaXRpb25hbE9yRXhwcmVzc2lvbiAnPycgPEV4cHJlc3Npb24+ICc6JyBDb25kaXRpb25hbEV4cHJlc3Npb24KLSAqLwotcHVibGljIHZvaWQgdGVzdENvbmRpdGlvbmFsRXhwcmVzc2lvbigpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6IAotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQkJXG4iICsKLQkJIglCYXIgZm9vKCkgewkJCQkJCQkJCQlcbiIgKwotCQkiCQlyZXR1cm4gZnJlZCgpLnh5eiA9PSBudWxsID8gbnVsbCA6IG5ldyBCYXIoKTsJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIEJhciBmb28oKSB7XG4iICsgCi0JCSIgICAgcmV0dXJuIDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gY29uZGl0aW9uYWwgZXhwcmVzc2lvbj4iCi0JKTsKLX0KLS8qCi0gKiBDb25kaXRpb25hbEV4cHJlc3Npb24gOjo9IENvbmRpdGlvbmFsT3JFeHByZXNzaW9uICc/JyBFeHByZXNzaW9uICc6JyA8Q29uZGl0aW9uYWxFeHByZXNzaW9uPiAKLSAqLwotcHVibGljIHZvaWQgdGVzdENvbmRpdGlvbmFsRXhwcmVzc2lvbkNvbmRpdGlvbmFsRXhwcmVzc2lvbigpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6IAotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQkJXG4iICsKLQkJIglib29sZWFuIGZvbygpIHsJCQkJCQkJCQlcbiIgKwotCQkiCQlyZXR1cm4gaXNUcnVlID8gdHJ1ZSA6IGZyZWQoKS54eXo7CQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGJvb2xlYW4gZm9vKCkge1xuIiArIAotCQkiICAgIChpc1RydWUgPyB0cnVlIDogPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+KTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBjb25kaXRpb25hbCBleHByZXNzaW9uPiIKLQkpOwotfQotLyoKLSAqIENvbmRpdGlvbmFsT3JFeHByZXNzaW9uIDo6PSBDb25kaXRpb25hbE9yRXhwcmVzc2lvbiAnfHwnIDxDb25kaXRpb25hbEFuZEV4cHJlc3Npb24+IAotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29uZGl0aW9uYWxPckV4cHJlc3Npb24oKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJCVxuIiArCi0JCSIJYm9vbGVhbiBmb28oKSB7CQkJCQkJCQkJXG4iICsKLQkJIgkJcmV0dXJuIGlzVHJ1ZSB8fCBmcmVkKCkueHl6OwkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGJvb2xlYW4gZm9vKCkge1xuIiArIAotCQkiICAgIChpc1RydWUgfHwgPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+KTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gY29uZGl0aW9uYWwgb3IgZXhwcmVzc2lvbj4iCi0JKTsKLX0KLS8qCi0gKiBDb25zdHJ1Y3RvckJvZHkgOjo9IE5lc3RlZE1ldGhvZCAneycgPEJsb2NrU3RhdGVtZW50c29wdD4gJ30nIAotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JCb2R5KCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDogCi0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCVxuIiArCi0JCSIJQmFyKCkgewkJCQkJCQkJCQlcbiIgKwotCQkiCQlmcmVkKCkueHl6ID0gbmV3IEZvbygpOwkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKwotCQkiICAgIHN1cGVyKCk7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJInh5eiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIGNvbnN0cnVjdG9yIGJvZHk+IgotCSk7Ci19Ci0vKgotICogRGltV2l0aE9yV2l0aE91dEV4cHIgOjo9ICdbJyA8RXhwcmVzc2lvbj4gJ10nIAotICovCi1wdWJsaWMgdm9pZCB0ZXN0RGltV2l0aE9yV2l0aE91dEV4cHIoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJCVxuIiArCi0JCSIJCWludFtdIHYgPSBuZXcgaW50W2ZyZWQoKS54eXpdOwkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgaW50W10gdiA9IG5ldyBpbnRbPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+XTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gZGltIHdpdGggb3Igd2l0aG91dCBleHByPiIKLQkpOwotfQotLyoKLSAqIERvU3RhdGVtZW50IDo6PSAnZG8nIFN0YXRlbWVudCAnd2hpbGUnICcoJyA8RXhwcmVzc2lvbj4gJyknICc7JyAgCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3REb0V4cHJlc3Npb24oKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJCVxuIiArCi0JCSIJCWRvCQkJCQkJCQkJCVxuIiArCi0JCSIJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsJCQkJXG4iICsKLQkJIgkJd2hpbGUgKGZyZWQoKS54eXopOwkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJ4eXoiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBkbyBleHByZXNzaW9uPiIKLQkpOwotfQotLyoKLSAqIERvU3RhdGVtZW50IDo6PSAnZG8nIDxTdGF0ZW1lbnQ+ICd3aGlsZScgJygnIEV4cHJlc3Npb24gJyknICc7JyAgCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3REb1N0YXRlbWVudCgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6IAotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQkJXG4iICsKLQkJIgkJZG8JCQkJCQkJCQkJXG4iICsKLQkJIgkJCWZyZWQoKS54eXogPSBuZXcgRm9vKCk7CQkJCVxuIiArCi0JCSIJCXdoaWxlICh0cnVlKTsJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJInh5eiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIGRvIHN0YXRlbWVudD4iCi0JKTsKLX0KLS8qCi0gKiBFcXVhbGl0eUV4cHJlc3Npb24gOjo9IEVxdWFsaXR5RXhwcmVzc2lvbiAnPT0nIDxSZWxhdGlvbmFsRXhwcmVzc2lvbj4gCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RFcXVhbGl0eUV4cHJlc3Npb24oKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJCVxuIiArCi0JCSIJYm9vbGVhbiBmb28oKSB7CQkJCQkJCQkJXG4iICsKLQkJIgkJcmV0dXJuIDEgPT0gZnJlZCgpLnh5ejsJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgYm9vbGVhbiBmb28oKSB7XG4iICsgCi0JCSIgICAgKDEgPT0gPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+KTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gZXF1YWxpdHkgZXhwcmVzc2lvbj4iCi0JKTsKLX0KLS8qCi0gKiBFcXVhbGl0eUV4cHJlc3Npb24gOjo9IEVxdWFsaXR5RXhwcmVzc2lvbiAnIT0nIDxSZWxhdGlvbmFsRXhwcmVzc2lvbj4gCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RFcXVhbGl0eUV4cHJlc3Npb25Ob3QoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJCVxuIiArCi0JCSIJYm9vbGVhbiBmb28oKSB7CQkJCQkJCQkJXG4iICsKLQkJIgkJcmV0dXJuIDEgIT0gZnJlZCgpLnh5ejsJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgYm9vbGVhbiBmb28oKSB7XG4iICsgCi0JCSIgICAgKDEgIT0gPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+KTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gZXF1YWxpdHkgZXhwcmVzc2lvbiBub3Q+IgotCSk7Ci19Ci0vKgotICogRXhjbHVzaXZlT3JFeHByZXNzaW9uIDo6PSBFeGNsdXNpdmVPckV4cHJlc3Npb24gJ14nIDxBbmRFeHByZXNzaW9uPiAKLSAqLwotcHVibGljIHZvaWQgdGVzdEV4Y2x1c2l2ZU9yRXhwcmVzc2lvbigpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6IAotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQkJXG4iICsKLQkJIglib29sZWFuIGZvbygpIHsJCQkJCQkJCQlcbiIgKwotCQkiCQlyZXR1cm4gaXNUcnVlIF4gZnJlZCgpLnh5ejsJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBib29sZWFuIGZvbygpIHtcbiIgKyAKLQkJIiAgICAoaXNUcnVlIF4gPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+KTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gZXhjbHVzaXZlIG9yIGV4cHJlc3Npb24+IgotCSk7Ci19Ci0vKgotICogQ29uc3RydWN0b3JCb2R5IDo6PSBOZXN0ZWRNZXRob2QgJ3snIDxFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbj4gJ30nCi0gKiBvcgotICogQ29uc3RydWN0b3JCb2R5IDo6PSBOZXN0ZWRNZXRob2QgJ3snIDxFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbj4gQmxvY2tTdGF0ZW1lbnRzICd9JyAgCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbkluQ29uc3RydWN0b3JCb2R5KCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDogCi0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCVxuIiArCi0JCSIJc3RhdGljIEJhciB4OwkJCQkJCQkJXG4iICsKLQkJIglwdWJsaWMgY2xhc3MgSW5uZXJCYXIgewkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIglwdWJsaWMgY2xhc3MgU3ViSW5uZXJCYXIgZXh0ZW5kcyBJbm5lckJhciB7CVxuIiArCi0JCSIJCVN1YklubmVyQmFyKCkgewkJCQkJCQlcbiIgKwotCQkiCQkJQmFyLngueC5zdXBlcigpOwkJCQkJXG4iICsKLQkJIgkJfQkJCQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIkJhci54LngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk5hbWU6QmFyLngueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKwotCQkiICBwdWJsaWMgY2xhc3MgSW5uZXJCYXIge1xuIiArCi0JCSIgICAgcHVibGljIElubmVyQmFyKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArCi0JCSIgIHB1YmxpYyBjbGFzcyBTdWJJbm5lckJhciBleHRlbmRzIElubmVyQmFyIHtcbiIgKwotCQkiICAgIFN1YklubmVyQmFyKCkge1xuIiArCi0JCSIgICAgICBzdXBlcigpO1xuIiArCi0JCSIgICAgICA8Q29tcGxldGVPbk5hbWU6QmFyLngueD47XG4iICsgCi0JCSIgICAgfVxuIiArCi0JCSIgIH1cbiIgKwotCQkiICBzdGF0aWMgQmFyIHg7XG4iICsgCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiQmFyLngueCIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGludm9jYXRpb24gaW4gY29uc3RydWN0b3IgYm9keT4iCi0JKTsKLX0KLS8qCi0gKiBGb3JTdGF0ZW1lbnQgOjo9ICdmb3InICcoJyA8Rm9ySW5pdG9wdD4gJzsnIEV4cHJlc3Npb25vcHQgJzsnIEZvclVwZGF0ZW9wdCAnKScgU3RhdGVtZW50Ci0gKiBvcgotICogRm9yU3RhdGVtZW50Tm9TaG9ydElmIDo6PSAnZm9yJyAnKCcgPEZvckluaXRvcHQ+ICc7JyBFeHByZXNzaW9ub3B0ICc7JyBGb3JVcGRhdGVvcHQgJyknIFN0YXRlbWVudE5vU2hvcnRJZiAKLSAqLwotcHVibGljIHZvaWQgdGVzdEZvckluaXQoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJCVxuIiArCi0JCSIJCWZvciAoaW50IGkgPSBmcmVkKCkueHl6OyBpIDwgMjsgaSsrKQkJXG4iICsKLQkJIgkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIGludCBpID0gPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJ4eXoiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBmb3IgaW5pdD4iCi0JKTsKLX0KLS8qCi0gKiBGb3JTdGF0ZW1lbnQgOjo9ICdmb3InICcoJyBGb3JJbml0b3B0ICc7JyBFeHByZXNzaW9ub3B0ICc7JyBGb3JVcGRhdGVvcHQgJyknIDxTdGF0ZW1lbnQ+Ci0gKiBvcgotICogRm9yU3RhdGVtZW50Tm9TaG9ydElmIDo6PSAnZm9yJyAnKCcgRm9ySW5pdG9wdCAnOycgRXhwcmVzc2lvbm9wdCAnOycgRm9yVXBkYXRlb3B0ICcpJyA8U3RhdGVtZW50Tm9TaG9ydElmPiAKLSAqLwotcHVibGljIHZvaWQgdGVzdEZvclN0YXRlbWVudCgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6IAotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQkJXG4iICsKLQkJIgkJZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspCQkJCVxuIiArCi0JCSIJCQlmcmVkKCkueHl6ID0gbmV3IEZvbygpOwkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIGludCBpO1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gZm9yIHN0YXRlbWVudD4iCi0JKTsKLX0KLS8qCi0gKiBGb3JTdGF0ZW1lbnQgOjo9ICdmb3InICcoJyBGb3JJbml0b3B0ICc7JyA8RXhwcmVzc2lvbm9wdD4gJzsnIEZvclVwZGF0ZW9wdCAnKScgU3RhdGVtZW50IAotICogb3IKLSAqIEZvclN0YXRlbWVudE5vU2hvcnRJZiA6Oj0gJ2ZvcicgJygnIEZvckluaXRvcHQgJzsnIDxFeHByZXNzaW9ub3B0PiAnOycgRm9yVXBkYXRlb3B0ICcpJyBTdGF0ZW1lbnROb1Nob3J0SWYgIAotICovCi1wdWJsaWMgdm9pZCB0ZXN0Rm9yU3RhdGVtZW50RXhwcmVzc2lvbigpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6IAotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQkJXG4iICsKLQkJIgkJZm9yIChpbnQgaSA9IDA7IGZyZWQoKS54eXogPiBpOyBpKyspCQlcbiIgKwotCQkiCQkJU3lzdGVtb3V0LnByaW50bG4oKTsJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBpbnQgaTtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJInh5eiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIGZvciBzdGF0ZW1lbnQgZXhwcmVzc2lvbj4iCi0JKTsKLX0KLS8qCi0gKiBGb3JTdGF0ZW1lbnQgOjo9ICdmb3InICcoJyBGb3JJbml0b3B0ICc7JyBFeHByZXNzaW9ub3B0ICc7JyA8Rm9yVXBkYXRlb3B0PiAnKScgU3RhdGVtZW50IAotICogb3IKLSAqIEZvclN0YXRlbWVudE5vU2hvcnRJZiA6Oj0gJ2ZvcicgJygnIEZvckluaXRvcHQgJzsnIEV4cHJlc3Npb25vcHQgJzsnIDxGb3JVcGRhdGVvcHQ+ICcpJyBTdGF0ZW1lbnROb1Nob3J0SWYgCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RGb3JVcGRhdGUoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJCVxuIiArCi0JCSIJCWZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSs9IGZyZWQoKS54eXopCVxuIiArCi0JCSIJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBpbnQgaTtcbiIgKyAKLQkJIiAgICBpICs9IDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gZm9yIHVwZGF0ZT4iCi0JKTsKLX0KLS8qCi0gKiBJZlRoZW5TdGF0ZW1lbnQgOjo9ICdpZicgJygnIDxFeHByZXNzaW9uPiAnKScgU3RhdGVtZW50IAotICovCi1wdWJsaWMgdm9pZCB0ZXN0SWZFeHByZXNpb25UaGVuKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDogCi0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIgKwotCQkiCQlpZiAoZnJlZCgpLnh5eikJCQkJCQkJXG4iICsKLQkJIgkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwkJCQlcbiIJKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gXCJpZiBleHByZXNzaW9uIHRoZW5cIj4iCi0JKTsKLX0KLS8qCi0gKiBJZlRoZW5FbHNlU3RhdGVtZW50IDo6PSAnaWYnICcoJyA8RXhwcmVzc2lvbj4gJyknIFN0YXRlbWVudE5vU2hvcnRJZiAnZWxzZScgU3RhdGVtZW50Ci0gKiBvcgotICogSWZUaGVuRWxzZVN0YXRlbWVudE5vU2hvcnRJZiA6Oj0gJ2lmJyAnKCcgPEV4cHJlc3Npb24+ICcpJyBTdGF0ZW1lbnROb1Nob3J0SWYgJ2Vsc2UnIFN0YXRlbWVudE5vU2hvcnRJZiAKLSAqLwotcHVibGljIHZvaWQgdGVzdElmRXhwcmVzaW9uVGhlbkVsc2UoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJCVxuIiArCi0JCSIJCWlmIChmcmVkKCkueHl6KQkJCQkJCQlcbiIgKwotCQkiCQkJU3lzdGVtLm91dC5wcmludGxuKCk7CQkJCVxuIgkrCi0JCSIJCWVsc2UJCQkJCQkJCQlcbiIgKwotCQkiCQkJU3lzdGVtLm91dC5wcmludGxuKCk7CQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJ4eXoiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBcImlmIGV4cHJlc3Npb24gdGhlbiBlbHNlXCI+IgotCSk7Ci19Ci0vKgotICogSWZUaGVuRWxzZVN0YXRlbWVudCA6Oj0gJ2lmJyAnKCcgRXhwcmVzc2lvbiAnKScgU3RhdGVtZW50Tm9TaG9ydElmICdlbHNlJyA8U3RhdGVtZW50PgotICogb3IKLSAqIElmVGhlbkVsc2VTdGF0ZW1lbnROb1Nob3J0SWYgOjo9ICdpZicgJygnIEV4cHJlc3Npb24gJyknIFN0YXRlbWVudE5vU2hvcnRJZiAnZWxzZScgPFN0YXRlbWVudE5vU2hvcnRJZj4KLSAqLwotcHVibGljIHZvaWQgdGVzdElmVGhlbkVsc2VTdGF0ZW1lbnQoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJCVxuIiArCi0JCSIJCWlmIChmYWxzZSkJCQkJCQkJCVxuIiArCi0JCSIJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsJCQkJXG4iCSsKLQkJIgkJZWxzZQkJCQkJCQkJCVxuIiArCi0JCSIJCQlmcmVkKCkueHl6ID0gbmV3IEZvbygpOwkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gXCJpZiB0aGVuIGVsc2VcIiBzdGF0ZW1lbnQ+IgotCSk7Ci19Ci0vKgotICogSWZUaGVuU3RhdGVtZW50IDo6PSAnaWYnICcoJyBFeHByZXNzaW9uICcpJyA8U3RhdGVtZW50PiAKLSAqLwotcHVibGljIHZvaWQgdGVzdElmVGhlblN0YXRlbWVudCgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6IAotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQkJXG4iICsKLQkJIgkJaWYgKHRydWUpCQkJCQkJCQlcbiIgKwotCQkiCQkJZnJlZCgpLnh5eiA9IG5ldyBGb28oKTsJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJInh5eiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIFwiaWYgdGhlblwiIHN0YXRlbWVudD4iCi0JKTsKLX0KLS8qCi0gKiBJZlRoZW5TdGF0ZW1lbnRFbHNlIDo6PSAnaWYnICcoJyBFeHByZXNzaW9uICcpJyA8U3RhdGVtZW50Tm9TaG9ydElmPiAnZWxzZScgU3RhdGVtZW50Ci0gKiBvcgotICogSWZUaGVuRWxzZVN0YXRlbWVudE5vU2hvcnRJZiA6Oj0gJ2lmJyAnKCcgRXhwcmVzc2lvbiAnKScgPFN0YXRlbWVudE5vU2hvcnRJZj4gJ2Vsc2UnIFN0YXRlbWVudE5vU2hvcnRJZgotICovCi1wdWJsaWMgdm9pZCB0ZXN0SWZUaGVuU3RhdGVtZW50RWxzZSgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6IAotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQkJXG4iICsKLQkJIgkJaWYgKHRydWUpCQkJCQkJCQlcbiIgKwotCQkiCQkJZnJlZCgpLnh5eiA9IG5ldyBGb28oKTsJCQkJXG4iCSsKLQkJIgkJZWxzZQkJCQkJCQkJCVxuIiArCi0JCSIJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJInh5eiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIFwiaWYgdGhlbiBzdGF0ZW1lbnQgZWxzZVwiPiIKLQkpOwotfQotLyoKLSAqIEluY2x1c2l2ZU9yRXhwcmVzc2lvbiA6Oj0gSW5jbHVzaXZlT3JFeHByZXNzaW9uICd8JyA8RXhjbHVzaXZlT3JFeHByZXNzaW9uPiAKLSAqLwotcHVibGljIHZvaWQgdGVzdEluY2x1c2l2ZU9yRXhwcmVzc2lvbigpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6IAotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQkJXG4iICsKLQkJIglib29sZWFuIGZvbygpIHsJCQkJCQkJCQlcbiIgKwotCQkiCQlyZXR1cm4gaXNUcnVlIHwgZnJlZCgpLnh5ejsJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBib29sZWFuIGZvbygpIHtcbiIgKyAKLQkJIiAgICAoaXNUcnVlIHwgPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+KTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gaW5jbHVzaXZlIG9yIGV4cHJlc3Npb24+IgotCSk7Ci19Ci0vKgotICogTGFiZWxlZFN0YXRlbWVudCA6Oj0gJ0lkZW50aWZpZXInICc6JyA8U3RhdGVtZW50PgotICogb3IKLSAqIExhYmVsZWRTdGF0ZW1lbnROb1Nob3J0SWYgOjo9ICdJZGVudGlmaWVyJyAnOicgPFN0YXRlbWVudE5vU2hvcnRJZj4gCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RMYWJlbGVkU3RhdGVtZW50KCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDogCi0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIgKwotCQkiCQlmcmVkQ2FsbDogZnJlZCgpLnh5eiA9IG5ldyBGb28oKTsJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gZXhwZWN0ZWRMYWJlbHM6Ci0JCW5ldyBTdHJpbmdbXSB7ImZyZWRDYWxsIn0sCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIGxhYmVsZWQgc3RhdGVtZW50PiIKLQkpOwotfQotLyoKLSAqIE1ldGhvZEJvZHkgOjo9IE5lc3RlZE1ldGhvZCAneycgPEJsb2NrU3RhdGVtZW50c29wdD4gJ30nCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNZXRob2RCb2R5KCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDogCi0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIgKwotCQkiCQlmcmVkKCkueHl6ID0gbmV3IEZvbygpOwkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJInh5eiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIG1ldGhvZCBib2R5PiIKLQkpOwotfQotLyoKLSAqIE1ldGhvZEludm9jYXRpb24gOjo9IE5hbWUgJygnIDxBcmd1bWVudExpc3RvcHQ+ICcpJyAgCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJbnZvY2F0aW9uKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDogCi0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIgKwotCQkiCQliaXp6KGZyZWQoKS54eXopOwkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIGJpenooPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+KTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gbWV0aG9kIGludm9jYXRpb24+IgotCSk7Ci19Ci0vKgotICogTWV0aG9kSW52b2NhdGlvbiA6Oj0gUHJpbWFyeSAnLicgJ0lkZW50aWZpZXInICcoJyA8QXJndW1lbnRMaXN0b3B0PiAnKScgIAotICovCi1wdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSW52b2NhdGlvblByaW1hcnkoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJCVxuIiArCi0JCSIJCWJ1enooKS5iaXp6KGZyZWQoKS54eXopOwkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBidXp6KCkuYml6eig8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4pO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJ4eXoiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBtZXRob2QgaW52b2NhdGlvbiBwcmltYXJ5PiIKLQkpOwotfQotLyoKLSAqIE1ldGhvZEludm9jYXRpb24gOjo9ICdzdXBlcicgJy4nICdJZGVudGlmaWVyJyAnKCcgPEFyZ3VtZW50TGlzdG9wdD4gJyknIAotICovCi1wdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSW52b2NhdGlvblN1cGVyKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDogCi0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIgKwotCQkiCQlzdXBlci5iaXp6KGZyZWQoKS54eXopOwkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBzdXBlci5iaXp6KDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54Pik7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJInh5eiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIG1ldGhvZCBpbnZvY2F0aW9uIHN1cGVyPiIKLQkpOwotfQotLyoKLSAqIE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiA6Oj0gTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICcvJyA8VW5hcnlFeHByZXNzaW9uPgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGljYXRpdmVFeHByZXNzaW9uZERpdmlzaW9uKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDogCi0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCQlcbiIgKwotCQkiCWRvdWJsZSBmb28oKSB7CQkJCQkJCQkJXG4iICsKLQkJIgkJcmV0dXJuIDIgLyBmcmVkKCkueHl6OwkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBkb3VibGUgZm9vKCkge1xuIiArIAotCQkiICAgICgyIC8gPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+KTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gbXVsdGlwbGljYXRpdmUgZXhwcmVzc2lvbiBkaXZpc2lvbj4iCi0JKTsKLX0KLS8qCi0gKiBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gOjo9IE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAnKicgPFVuYXJ5RXhwcmVzc2lvbj4gCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25NdWx0aXBsaWNhdGlvbigpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6IAotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQkJXG4iICsKLQkJIglpbnQgZm9vKCkgewkJCQkJCQkJCQlcbiIgKwotCQkiCQlyZXR1cm4gMiAqIGZyZWQoKS54eXo7CQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB7XG4iICsgCi0JCSIgICAgKDIgKiA8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4pO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJ4eXoiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBtdWx0aXBsaWNhdGl2ZSBleHByZXNzaW9uIG11bHRpcGxpY2F0aW9uPiIKLQkpOwotfQotLyoKLSAqIE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiA6Oj0gTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICclJyA8VW5hcnlFeHByZXNzaW9uPiAKLSAqLwotcHVibGljIHZvaWQgdGVzdE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJlbWFpbmRlcigpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6IAotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQkJXG4iICsKLQkJIglpbnQgZm9vKCkgewkJCQkJCQkJCQlcbiIgKwotCQkiCQlyZXR1cm4gMiAlIGZyZWQoKS54eXo7CQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB7XG4iICsgCi0JCSIgICAgKDIgJSA8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4pO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJ4eXoiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBtdWx0aXBsaWNhdGl2ZSBleHByZXNzaW9uIHJlbWFpbmRlcj4iCi0JKTsKLX0KLS8qCi0gKiBQcmVEZWNyZW1lbnRFeHByZXNzaW9uIDo6PSAnLS0nIFB1c2hQb3NpdGlvbiA8VW5hcnlFeHByZXNzaW9uPiAKLSAqLwotcHVibGljIHZvaWQgdGVzdFByZUluY3JlbWVudEV4cHJlc3Npb25NaW51c01pbnVzKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDogCi0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIgKwotCQkiCQktLSBmcmVkKCkueHl6OwkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIC0tIDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gcHJlIGluY3JlbWVudCBleHByZXNzaW9uIG1pbnVzIG1pbnVzPiIKLQkpOwotfQotLyoKLSAqIFByZUluY3JlbWVudEV4cHJlc3Npb24gOjo9ICcrKycgUHVzaFBvc2l0aW9uIDxVbmFyeUV4cHJlc3Npb24+IAotICovCi1wdWJsaWMgdm9pZCB0ZXN0UHJlSW5jcmVtZW50RXhwcmVzc2lvblBsdXNQbHVzKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDogCi0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIgKwotCQkiCQkrKyBmcmVkKCkueHl6OwkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgICsrIDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gcHJlIGluY3JlbWVudCBleHByZXNzaW9uIHBsdXMgcGx1cz4iCi0JKTsKLX0KLS8qCi0gKiBQcmltYXJ5Tm9OZXdBcnJheSA6Oj0gUHVzaExQQVJFTiA8RXhwcmVzc2lvbj4gUHVzaFJQQVJFTgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UHJpbWFyeU5vTmV3QXJyYXkoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJCVxuIiArCi0JCSIJCShmcmVkKCkueHl6KS56enooKTsJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gcHJpbWFyeSBubyBuZXcgYXJyYXk+IgotCSk7Ci19Ci0vKgotICogUmVsYXRpb25hbEV4cHJlc3Npb24gOjo9IFJlbGF0aW9uYWxFeHByZXNzaW9uICc+JyA8U2hpZnRFeHByZXNzaW9uPiAKLSAqLwotcHVibGljIHZvaWQgdGVzdFJlbGF0aW9uYWxFeHByZXNzaW9uR3JlYXRlclRoYW4oKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJCVxuIiArCi0JCSIJYm9vbGVhbiBmb28oKSB7CQkJCQkJCQkJXG4iICsKLQkJIgkJcmV0dXJuIDEgPiBmcmVkKCkueHl6OwkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBib29sZWFuIGZvbygpIHtcbiIgKyAKLQkJIiAgICAoMSA+IDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54Pik7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJInh5eiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIHJlbGF0aW9uYWwgZXhwcmVzc2lvbiBncmVhdGVyIHRoYW4+IgotCSk7Ci19Ci0vKgotICogUmVsYXRpb25hbEV4cHJlc3Npb24gOjo9IFJlbGF0aW9uYWxFeHByZXNzaW9uICc+PScgPFNoaWZ0RXhwcmVzc2lvbj4gCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZWxhdGlvbmFsRXhwcmVzc2lvbkdyZWF0ZXJUaGFuT3JFcXVhbHMoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJCVxuIiArCi0JCSIJYm9vbGVhbiBmb28oKSB7CQkJCQkJCQkJXG4iICsKLQkJIgkJcmV0dXJuIDEgPj0gZnJlZCgpLnh5ejsJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgYm9vbGVhbiBmb28oKSB7XG4iICsgCi0JCSIgICAgKDEgPj0gPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+KTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gcmVsYXRpb25hbCBleHByZXNzaW9uIGdyZWF0ZXIgdGhhbiBvciBlcXVhbD4iCi0JKTsKLX0KLS8qCi0gKiBSZWxhdGlvbmFsRXhwcmVzc2lvbiA6Oj0gUmVsYXRpb25hbEV4cHJlc3Npb24gJzwnIDxTaGlmdEV4cHJlc3Npb24+ICAKLSAqLwotcHVibGljIHZvaWQgdGVzdFJlbGF0aW9uYWxFeHByZXNzaW9uTGVzc1RoYW4oKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJCVxuIiArCi0JCSIJYm9vbGVhbiBmb28oKSB7CQkJCQkJCQkJXG4iICsKLQkJIgkJcmV0dXJuIDEgPCBmcmVkKCkueHl6OwkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBib29sZWFuIGZvbygpIHtcbiIgKyAKLQkJIiAgICAoMSA8IDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54Pik7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJInh5eiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIHJlbGF0aW9uYWwgZXhwcmVzc2lvbiBsZXNzIHRoYW4+IgotCSk7Ci19Ci0vKgotICogUmVsYXRpb25hbEV4cHJlc3Npb24gOjo9IFJlbGF0aW9uYWxFeHByZXNzaW9uICc8PScgPFNoaWZ0RXhwcmVzc2lvbj4gCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZWxhdGlvbmFsRXhwcmVzc2lvbkxlc3NUaGFuT3JFcXVhbCgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6IAotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQkJXG4iICsKLQkJIglib29sZWFuIGZvbygpIHsJCQkJCQkJCQlcbiIgKwotCQkiCQlyZXR1cm4gMSA8PSBmcmVkKCkueHl6OwkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBib29sZWFuIGZvbygpIHtcbiIgKyAKLQkJIiAgICAoMSA8PSA8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4pO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJ4eXoiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiByZWxhdGlvbmFsIGV4cHJlc3Npb24gbGVzcyB0aGFuIG9yIGVxdWFsPiIKLQkpOwotfQotLyoKLSAqIFJldHVyblN0YXRlbWVudCA6Oj0gJ3JldHVybicgPEV4cHJlc3Npb25vcHQ+ICc7Ci0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXR1cm5TdGF0ZW1lbnQoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJXG4iICsKLQkJIglpbnQgZm9vKCkgewkJCQkJCQkJCVxuIiArCi0JCSIJCXJldHVybiBmcmVkKCkueHl6OwkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgICByZXR1cm4gPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJ4eXoiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiByZXR1cm4gc3RhdGVtZW50PiIKLQkpOwotfQotLyoKLSAqIFNoaWZ0RXhwcmVzc2lvbiA6Oj0gU2hpZnRFeHByZXNzaW9uICc8PCcgPEFkZGl0aXZlRXhwcmVzc2lvbj4gCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTaGlmdEV4cHJlc3Npb25MZWZ0KCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDogCi0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCQlcbiIgKwotCQkiCWludCBmb28oKSB7CQkJCQkJCQkJCVxuIiArCi0JCSIJCXJldHVybiBpIDw8IGZyZWQoKS54eXo7CQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB7XG4iICsgCi0JCSIgICAgKGkgPDwgPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+KTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gc2hpZnQgZXhwcmVzc2lvbiBsZWZ0PiIKLQkpOwotfQotLyoKLSAqIFNoaWZ0RXhwcmVzc2lvbiA6Oj0gU2hpZnRFeHByZXNzaW9uICc+PicgPEFkZGl0aXZlRXhwcmVzc2lvbj4KLSAqLwotcHVibGljIHZvaWQgdGVzdFNoaWZ0RXhwcmVzc2lvblJpZ2h0KCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDogCi0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCQlcbiIgKwotCQkiCWludCBmb28oKSB7CQkJCQkJCQkJCVxuIiArCi0JCSIJCXJldHVybiBpID4+IGZyZWQoKS54eXo7CQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB7XG4iICsgCi0JCSIgICAgKGkgPj4gPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+KTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gc2hpZnQgZXhwcmVzc2lvbiByaWdodD4iCi0JKTsKLX0KLS8qCi0gKiBTaGlmdEV4cHJlc3Npb24gOjo9IFNoaWZ0RXhwcmVzc2lvbiAnPj4+JyA8QWRkaXRpdmVFeHByZXNzaW9uPgotICovCi1wdWJsaWMgdm9pZCB0ZXN0U2hpZnRFeHByZXNzaW9uUmlnaHRVblNpZ25lZCgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6IAotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQkJXG4iICsKLQkJIglpbnQgZm9vKCkgewkJCQkJCQkJCQlcbiIgKwotCQkiCQlyZXR1cm4gaSA+Pj4gZnJlZCgpLnh5ejsJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgICAoaSA+Pj4gPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+KTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gc2hpZnQgZXhwcmVzc2lvbiByaWdodCB1bnNpZ25lZD4iCi0JKTsKLX0KLS8qCi0gKiBTdGF0ZW1lbnRFeHByZXNzaW9uTGlzdCA6Oj0gU3RhdGVtZW50RXhwcmVzc2lvbkxpc3QgJywnIDxTdGF0ZW1lbnRFeHByZXNzaW9uPiAKLSAqLwotcHVibGljIHZvaWQgdGVzdFN0YXRlbWVudEV4cHJlc3Npb25MaXN0KCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDogCi0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJCQkJXG4iICsKLQkJIgkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGZyZWQoKS54eXo7IGkgPCAyOyBpKyspCVxuIiArCi0JCSIJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBpbnQgaTtcbiIgKwotCQkiICAgIGludCBsZW5ndGggPSA8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJInh5eiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIHN0YXRlbWVudCBleHByZXNzaW9uIGxpc3Q+IgotCSk7Ci19Ci0vKgotICogU3dpdGNoQmxvY2tTdGF0ZW1lbnQgOjo9IFN3aXRjaExhYmVscyA8QmxvY2tTdGF0ZW1lbnRzPiAgIAotICovCi1wdWJsaWMgdm9pZCB0ZXN0U3dpdGNoQmxvY2tTdGF0ZW1lbnQoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJCVxuIiArCi0JCSIJCWludCBpID0gIDA7CQkJCQkJCQlcbiIgKwotCQkiCQlzd2l0Y2ggKGkpIHsJCQkJCQkJXG4iICsKLQkJIgkJCWNhc2UgMDogZnJlZCgpLnh5eiA9IG5ldyBGb28oKTsJCVxuIiArCi0JCSIJCX0JCQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBpbnQgaTtcbiIgKwotCQkiICAgIHtcbiIgKwotCQkiICAgICAgPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+O1xuIiArCi0JCSIgICAgfVxuIiArCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJInh5eiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIHN3aXRjaCBibG9jayBzdGF0ZW1lbnQ+IgotCSk7Ci19Ci0vKgotICogU3dpdGNoU3RhdGVtZW50IDo6PSAnc3dpdGNoJyBPcGVuQmxvY2sgJygnIDxFeHByZXNzaW9uPiAnKScgU3dpdGNoQmxvY2sgICAgCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTd2l0Y2hFeHByZXNzaW9uKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDogCi0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIgKwotCQkiCQlzd2l0Y2ggKGZyZWQoKS54eXopIHsJCQkJCQlcbiIgKwotCQkiCQkJY2FzZSAwOiBTeXN0ZW0ub3V0LnByaW50bG4oKTsJCVxuIiArCi0JCSIJCX0JCQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICB7XG4iICsgCi0JCSIgICAgICA8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD47XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJ4eXoiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBzd2l0Y2ggZXhwcmVzc2lvbj4iCi0JKTsKLX0KLS8qCi0gKiBTd2l0Y2hMYWJlbCA6Oj0gJ2Nhc2UnIDxDb25zdGFudEV4cHJlc3Npb24+ICc6JyAKLSAqLwotcHVibGljIHZvaWQgdGVzdFN3aXRjaExhYmVsKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDogCi0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQkJCVxuIiArCi0JCSIJCWludCBpID0gIDA7CQkJCQkJCQkJXG4iICsKLQkJIgkJc3dpdGNoIChpKSB7CQkJCQkJCQlcbiIgKwotCQkiCQkJY2FzZSBmcmVkKCkueHl6OiBTeXN0ZW0ub3V0LnByaW50bG4oKTsJXG4iICsKLQkJIgkJfQkJCQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIGludCBpO1xuIiArIAotCQkiICAgIHtcbiIgKyAKLQkJIiAgICAgIDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PjtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJInh5eiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIHN3aXRjaCBsYWJlbD4iCi0JKTsKLX0KLS8qCi0gKiBTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgOjo9IE9ubHlTeW5jaHJvbml6ZWQgJygnIDxFeHByZXNzaW9uPiAnKScgQmxvY2sKLSAqLwotcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplZFN0YXRlbWVudCgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6IAotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQkJXG4iICsKLQkJIgkJc3luY2hyb25pemVkIChmcmVkKCkueHl6KSB7CQkJCVxuIiArCi0JCSIJCQkgU3lzdGVtLm91dC5wcmludGxuKCk7CQkJCVxuIiArCi0JCSIJCX0gCQkJCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJ4eXoiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBzeW5jaHJvbml6ZWQgZXhwcmVzc2lvbj4iCi0JKTsKLX0KLS8qCi0gKiBUaHJvd1N0YXRlbWVudCA6Oj0gJ3Rocm93JyA8RXhwcmVzc2lvbj4gJzsnIAotICovCi1wdWJsaWMgdm9pZCB0ZXN0VGhyb3dFeHByZXNzaW9uKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDogCi0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIgKwotCQkiCQl0aHJvdyBmcmVkKCkueHl6OwkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gdGhyb3cgZXhwcmVzc2lvbj4iCi0JKTsKLX0KLS8qCi0gKiBVbmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMgOjo9ICd+JyBQdXNoUG9zaXRpb24gPFVuYXJ5RXhwcmVzc2lvbj4gCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RVbmFyeUV4cHJlc3Npb25CaXR3aXNlQ29tcGxlbWVudCgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6IAotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQkJXG4iICsKLQkJIgkJaSA9IH4gZnJlZCgpLnh5ejsJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICAofiA8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4pO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJ4eXoiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiB1bmFyeSBleHByZXNzaW9uIGJpdHdpc2UgY29tcGxlbWVudD4iCi0JKTsKLX0KLS8qCi0gKiBVbmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMgOjo9ICchJyBQdXNoUG9zaXRpb24gPFVuYXJ5RXhwcmVzc2lvbj4gIAotICovCi1wdWJsaWMgdm9pZCB0ZXN0VW5hcnlFeHByZXNzaW9uTG9naWNhbENvbXBsZW1lbnQoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJCVxuIiArCi0JCSIJCWkgPSAhIGZyZWQoKS54eXo7CQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgKCEgPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+KTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gdW5hcnkgZXhwcmVzc2lvbiBsb2dpY2FsIGNvbXBsZW1lbnQ+IgotCSk7Ci19Ci0vKgotICogVW5hcnlFeHByZXNzaW9uIDo6PSAnLScgUHVzaFBvc2l0aW9uIDxVbmFyeUV4cHJlc3Npb24+IAotICovCi1wdWJsaWMgdm9pZCB0ZXN0VW5hcnlFeHByZXNzaW9uTWludXMoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJCVxuIiArCi0JCSIJCWkgPSAtIGZyZWQoKS54eXo7CQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgKC0gPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+KTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gdW5hcnkgZXhwcmVzc2lvbiBtaW51cz4iCi0JKTsKLX0KLS8qCi0gKiBVbmFyeUV4cHJlc3Npb24gOjo9ICcrJyBQdXNoUG9zaXRpb24gPFVuYXJ5RXhwcmVzc2lvbj4KLSAqLwotcHVibGljIHZvaWQgdGVzdFVuYXJ5RXhwcmVzc2lvblBsdXMoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJCVxuIiArCi0JCSIJCWkgPSArIGZyZWQoKS54eXo7CQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgKCsgPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+KTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gdW5hcnkgZXhwcmVzc2lvbiBwbHVzPiIKLQkpOwotfQotLyoKLSAqIFZhcmlhYmxlRGVjbGFyYXRvciA6Oj0gVmFyaWFibGVEZWNsYXJhdG9ySWQgRW50ZXJGaWVsZCAnPScgRm9yY2VOb0RpZXQgPFZhcmlhYmxlSW5pdGlhbGl6ZXI+IFJlc3RvcmVEaWV0IEV4aXRGaWVsZCAKLSAqLwotcHVibGljIHZvaWQgdGVzdFZhcmlhYmxlRGVjbGFyYXRvcigpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6IAotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQkJCVxuIiArCi0JCSIJCWludCBpID0gZnJlZCgpLnh5ejsJCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIGludCBpID0gPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJ4eXoiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiB2YXJpYWJsZSBkZWNsYXJhdG9yPiIKLQkpOwotfQotLyoKLSAqIFZhcmlhYmxlSW5pdGlhbGl6ZXJzIDo6PSBWYXJpYWJsZUluaXRpYWxpemVycyAnLCcgPFZhcmlhYmxlSW5pdGlhbGl6ZXI+Ci0gKi8KLXB1YmxpYyB2b2lkIHRlc3RWYXJpYWJsZUluaXRpYWxpemVycygpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6IAotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQkJCVxuIiArCi0JCSIJCWludCBpID0gMCwgaiA9IGZyZWQoKS54eXo7CQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgaW50IGk7XG4iICsKLQkJIiAgICBpbnQgaiA9IDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gdmFyaWFibGUgaW5pdGlhbGl6ZXJzPiIKLQkpOwotfQotLyoKLSAqIFdoaWxlU3RhdGVtZW50IDo6PSAnd2hpbGUnICcoJyA8RXhwcmVzc2lvbj4gJyknIFN0YXRlbWVudCAKLSAqIG9yCi0gKiBXaGlsZVN0YXRlbWVudE5vU2hvcnRJZiA6Oj0gJ3doaWxlJyAnKCcgPEV4cHJlc3Npb24+ICcpJyBTdGF0ZW1lbnROb1Nob3J0SWYgCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RXaGlsZUV4cHJlc3Npb24oKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJCVxuIiArCi0JCSIJCXdoaWxlIChmcmVkKCkueHl6KQkJCQkJCVxuIiArCi0JCSIJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJInh5eiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIHdoaWxlIGV4cHJlc2lvbj4iCi0JKTsKLX0KLS8qCi0gKiBXaGlsZVN0YXRlbWVudCA6Oj0gJ3doaWxlJyAnKCcgRXhwcmVzc2lvbiAnKScgPFN0YXRlbWVudD4KLSAqIG9yCi0gKiBXaGlsZVN0YXRlbWVudE5vU2hvcnRJZiA6Oj0gJ3doaWxlJyAnKCcgRXhwcmVzc2lvbiAnKScgPFN0YXRlbWVudE5vU2hvcnRJZj4gCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RXaGlsZVN0YXRlbWVudCgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6IAotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQkJXG4iICsKLQkJIgkJd2hpbGUgKHRydWUpCQkJCQkJCVxuIiArCi0JCSIJCQlmcmVkKCkueHl6ID0gbmV3IEZvbygpOwkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gd2hpbGUgc3RhdGVtZW50PiIKLQkpOwotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3BhcnNlci9Jbm5lclR5cGVDb21wbGV0aW9uVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3BhcnNlci9Jbm5lclR5cGVDb21wbGV0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2ZiZDMyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvSW5uZXJUeXBlQ29tcGxldGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyLnBhcnNlcjsKLQotLyoqCi0gKiBDb21wbGV0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIGluIGFuIGlubmVyIHR5cGUKLSAqLwotcHVibGljIGNsYXNzIElubmVyVHlwZUNvbXBsZXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RDb21wbGV0aW9uVGVzdCB7Ci1wdWJsaWMgSW5uZXJUeXBlQ29tcGxldGlvblRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0Jc3VwZXIodGVzdE5hbWUpOwotfQotLyoKLSAqIFRlc3QgY29tcGxldGlvbiBpbiB0aGUgZmlyc3QgbWV0aG9kIG9mIGFuIGFub255bW91cyBpbm5lciBjbGFzcwotICovCi1wdWJsaWMgdm9pZCB0ZXN0QW5vbnltb3VzRmlyc3RNZXRob2QoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQkJXG4iICsKLQkJIgkJT2JqZWN0IG8gPSBuZXcgT2JqZWN0KCkgewkJCQlcbiIgKwotCQkiCQkJdm9pZCBidXp6KCkgewkJCQkJCVxuIiArCi0JCSIJCQkJaW50IGkgPSBmcmVkKCkueHl6OwkJCQlcbiIgKwotCQkiCQkJfQkJCQkJCQkJCVxuIiArCi0JCSIJCQl2b2lkIGZ1enooKSB7CQkJCQkJXG4iICsKLQkJIgkJCX0JCQkJCQkJCQlcbiIgKwotCQkiCQl9OwkJCQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgT2JqZWN0IG87XG4iICsKLQkJIiAgICBuZXcgT2JqZWN0KCkge1xuIiArCi0JCSIgICAgICAoKSB7XG4iICsKLQkJIiAgICAgIH1cbiIgKwotCQkiICAgICAgdm9pZCBidXp6KCkge1xuIiArCi0JCSIgICAgICAgIGludCBpID0gPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+O1xuIiArCi0JCSIgICAgICB9XG4iICsKLQkJIiAgICAgIHZvaWQgZnV6eigpIHtcbiIgKwotCQkiICAgICAgfVxuIiArCi0JCSIgICAgfTtcbiIgKwotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJ4eXoiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBpbiBhbm9ueW1vdXMgaW5uZXIgY2xhc3MgaW4gZmlyc3QgbWV0aG9kPiIKLQkpOwotfQotLyoKLSAqIFRlc3QgY29tcGxldGlvbiBpbiBhbm9ueW1vdXMgaW5uZXIgY2xhc3Mgd2l0aCBubyBzdGF0ZW1lbnQgZGVmaW5lZCBiZWZvcmUuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RBbm9ueW1vdXNOb1N0YXRlbWVudEJlZm9yZSgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIgKwotCQkiCQlPYmplY3QgbyA9IG5ldyBPYmplY3QoKSB7CQkJCVxuIiArCi0JCSIJCQl2b2lkIGJ1enooKSB7CQkJCQkJXG4iICsKLQkJIgkJCQlpbnQgaSA9IGZyZWQoKS54eXo7CQkJCVxuIiArCi0JCSIJCQl9CQkJCQkJCQkJXG4iICsKLQkJIgkJfTsJCQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIE9iamVjdCBvO1xuIiArCi0JCSIgICAgbmV3IE9iamVjdCgpIHtcbiIgKwotCQkiICAgICAgKCkge1xuIiArCi0JCSIgICAgICB9XG4iICsKLQkJIiAgICAgIHZvaWQgYnV6eigpIHtcbiIgKwotCQkiICAgICAgICBpbnQgaSA9IDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PjtcbiIgKwotCQkiICAgICAgfVxuIiArCi0JCSIgICAgfTtcbiIgKwotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJ4eXoiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBpbiBhbm9ueW1vdXMgaW5uZXIgY2xhc3Mgd2l0aCBubyBzdGF0ZW1lbnQgYmVmb3JlPiIKLQkpOwotfQotLyoKLSAqIFRlc3QgY29tcGxldGlvbiBpbiBhbm9ueW1vdXMgaW5uZXIgY2xhc3Mgd2l0aCBvbmUgZmllbGQgZGVmaW5lZCBiZWZvcmUKLSAqIHRoZSBtZXRob2QgY29udGFpbmluZyB0aGUgY29tcGxldGlvbi4KLSAqLwotcHVibGljIHZvaWQgdGVzdEFub255bW91c09uZUZpZWxkQmVmb3JlKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJCVxuIiArCi0JCSIJCU9iamVjdCBvID0gbmV3IE9iamVjdCgpIHsJCQkJXG4iICsKLQkJIgkJCWludCBmaWVsZCA9IDE7CQkJCQkJXG4iICsKLQkJIgkJCXZvaWQgYnV6eigpIHsJCQkJCQlcbiIgKwotCQkiCQkJCWludCBpID0gZnJlZCgpLnh5ejsJCQkJXG4iICsKLQkJIgkJCX0JCQkJCQkJCQlcbiIgKwotCQkiCQl9OwkJCQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgT2JqZWN0IG87XG4iICsKLQkJIiAgICBuZXcgT2JqZWN0KCkge1xuIiArCi0JCSIgICAgICBpbnQgZmllbGQ7XG4iICsKLQkJIiAgICAgICgpIHtcbiIgKwotCQkiICAgICAgfVxuIiArCi0JCSIgICAgICB2b2lkIGJ1enooKSB7XG4iICsKLQkJIiAgICAgICAgaW50IGkgPSA8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD47XG4iICsKLQkJIiAgICAgIH1cbiIgKwotCQkiICAgIH07XG4iICsKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgaW4gYW5vbnltb3VzIGlubmVyIGNsYXNzIHdpdGggb25lIGZpZWxkIGJlZm9yZT4iCi0JKTsKLX0KLS8qCi0gKiBUZXN0IGNvbXBsZXRpb24gaW4gYW5vbnltb3VzIGlubmVyIGNsYXNzIHdpdGggb25lIHN0YXRlbWVudCBkZWZpbmVkIGJlZm9yZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdEFub255bW91c09uZVN0YXRlbWVudEJlZm9yZSgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIgKwotCQkiCQlpbnQgaSA9IDE7CQkJCQkJCQlcbiIgKwotCQkiCQlPYmplY3QgbyA9IG5ldyBPYmplY3QoKSB7CQkJCVxuIiArCi0JCSIJCQl2b2lkIGJ1enooKSB7CQkJCQkJXG4iICsKLQkJIgkJCQlpbnQgaSA9IGZyZWQoKS54eXo7CQkJCVxuIiArCi0JCSIJCQl9CQkJCQkJCQkJXG4iICsKLQkJIgkJfTsJCQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIGludCBpO1xuIiArCi0JCSIgICAgT2JqZWN0IG87XG4iICsKLQkJIiAgICBuZXcgT2JqZWN0KCkge1xuIiArCi0JCSIgICAgICAoKSB7XG4iICsKLQkJIiAgICAgIH1cbiIgKwotCQkiICAgICAgdm9pZCBidXp6KCkge1xuIiArCi0JCSIgICAgICAgIGludCBpID0gPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+O1xuIiArCi0JCSIgICAgICB9XG4iICsKLQkJIiAgICB9O1xuIiArCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJInh5eiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIGluIGFub255bW91cyBpbm5lciBjbGFzcyB3aXRoIG9uZSBzdGF0ZW1lbnQgYmVmb3JlPiIKLQkpOwotfQotLyoKLSAqIFRlc3QgY29tcGxldGlvbiBpbiB0aGUgc2Vjb25kIG1ldGhvZCBvZiBhbiBhbm9ueW1vdXMgaW5uZXIgY2xhc3MKLSAqLwotcHVibGljIHZvaWQgdGVzdEFub255bW91c1NlY29uZE1ldGhvZCgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIgKwotCQkiCQlPYmplY3QgbyA9IG5ldyBPYmplY3QoKSB7CQkJCVxuIiArCi0JCSIJCQl2b2lkIGZ1enooKSB7CQkJCQkJXG4iICsKLQkJIgkJCX0JCQkJCQkJCQlcbiIgKwotCQkiCQkJdm9pZCBidXp6KCkgewkJCQkJCVxuIiArCi0JCSIJCQkJaW50IGkgPSBmcmVkKCkueHl6OwkJCQlcbiIgKwotCQkiCQkJfQkJCQkJCQkJCVxuIiArCi0JCSIJCX07CQkJCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICBPYmplY3QgbztcbiIgKwotCQkiICAgIG5ldyBPYmplY3QoKSB7XG4iICsKLQkJIiAgICAgICgpIHtcbiIgKwotCQkiICAgICAgfVxuIiArCi0JCSIgICAgICB2b2lkIGZ1enooKSB7XG4iICsKLQkJIiAgICAgIH1cbiIgKwotCQkiICAgICAgdm9pZCBidXp6KCkge1xuIiArCi0JCSIgICAgICAgIGludCBpID0gPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+O1xuIiArCi0JCSIgICAgICB9XG4iICsKLQkJIiAgICB9O1xuIiArCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJInh5eiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIGluIGFub255bW91cyBpbm5lciBjbGFzcyBpbiBzZWNvbmQgbWV0aG9kPiIKLQkpOwotfQotLyoKLSAqIFRlc3QgY29tcGxldGlvbiBpbiB0aGUgZmlyc3QgbWV0aG9kIG9mIGEgbG9jYWwgdHlwZSBkZWNsYXJhdGlvbgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TG9jYWxUeXBlRmlyc3RNZXRob2QoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQkJXG4iICsKLQkJIgkJY2xhc3MgSW5uZXJCYXIgewkJCQkJCVxuIiArCi0JCSIJCQl2b2lkIGJ1enooKSB7CQkJCQkJXG4iICsKLQkJIgkJCQlpbnQgaSA9IGZyZWQoKS54eXo7CQkJCVxuIiArCi0JCSIJCQl9CQkJCQkJCQkJXG4iICsKLQkJIgkJCXZvaWQgZnV6eigpIHsJCQkJCQlcbiIgKwotCQkiCQkJfQkJCQkJCQkJCVxuIiArCi0JCSIJCX07CQkJCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICBjbGFzcyBJbm5lckJhciB7XG4iICsKLQkJIiAgICAgIElubmVyQmFyKCkge1xuIiArCi0JCSIgICAgICB9XG4iICsKLQkJIiAgICAgIHZvaWQgYnV6eigpIHtcbiIgKwotCQkiICAgICAgICBpbnQgaSA9IDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PjtcbiIgKwotCQkiICAgICAgfVxuIiArCi0JCSIgICAgICB2b2lkIGZ1enooKSB7XG4iICsKLQkJIiAgICAgIH1cbiIgKwotCQkiICAgIH07XG4iICsKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgaW4gbG9jYWwgdHlwZSBkZWNsYXJhdGlvbiBpbiBmaXJzdCBtZXRob2Q+IgotCSk7Ci19Ci0vKgotICogVGVzdCBjb21wbGV0aW9uIGluIGxvY2FsIHR5cGUgZGVjbGFyYXRpb24gd2l0aCBubyBzdGF0ZW1lbnQgZGVmaW5lZCBiZWZvcmUuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RMb2NhbFR5cGVOb1N0YXRlbWVudEJlZm9yZSgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIgKwotCQkiCQljbGFzcyBJbm5lckJhciB7CQkJCQkJXG4iICsKLQkJIgkJCXZvaWQgYnV6eigpIHsJCQkJCQlcbiIgKwotCQkiCQkJCWludCBpID0gZnJlZCgpLnh5ejsJCQkJXG4iICsKLQkJIgkJCX0JCQkJCQkJCQlcbiIgKwotCQkiCQl9OwkJCQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgY2xhc3MgSW5uZXJCYXIge1xuIiArCi0JCSIgICAgICBJbm5lckJhcigpIHtcbiIgKwotCQkiICAgICAgfVxuIiArCi0JCSIgICAgICB2b2lkIGJ1enooKSB7XG4iICsKLQkJIiAgICAgICAgaW50IGkgPSA8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD47XG4iICsKLQkJIiAgICAgIH1cbiIgKwotCQkiICAgIH07XG4iICsKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieHl6IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgaW4gbG9jYWwgdHlwZSBkZWNsYXJhdGlvbiB3aXRoIG5vIHN0YXRlbWVudCBiZWZvcmU+IgotCSk7Ci19Ci0vKgotICogVGVzdCBjb21wbGV0aW9uIGluIGxvY2FsIHR5cGUgZGVjbGFyYXRpb24gd2l0aCBvbmUgZmllbGQgZGVmaW5lZCBiZWZvcmUKLSAqIHRoZSBtZXRob2QgY29udGFpbmluZyB0aGUgY29tcGxldGlvbi4KLSAqLwotcHVibGljIHZvaWQgdGVzdExvY2FsVHlwZU9uZUZpZWxkQmVmb3JlKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJCVxuIiArCi0JCSIJCWNsYXNzIElubmVyQmFyIHsJCQkJCQlcbiIgKwotCQkiCQkJaW50IGZpZWxkID0gMTsJCQkJCQlcbiIgKwotCQkiCQkJdm9pZCBidXp6KCkgewkJCQkJCVxuIiArCi0JCSIJCQkJaW50IGkgPSBmcmVkKCkueHl6OwkJCQlcbiIgKwotCQkiCQkJfQkJCQkJCQkJCVxuIiArCi0JCSIJCX07CQkJCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICBjbGFzcyBJbm5lckJhciB7XG4iICsKLQkJIiAgICAgIGludCBmaWVsZDtcbiIgKwotCQkiICAgICAgSW5uZXJCYXIoKSB7XG4iICsKLQkJIiAgICAgIH1cbiIgKwotCQkiICAgICAgdm9pZCBidXp6KCkge1xuIiArCi0JCSIgICAgICAgIGludCBpID0gPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+O1xuIiArCi0JCSIgICAgICB9XG4iICsKLQkJIiAgICB9O1xuIiArCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJInh5eiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIGluIGxvY2FsIHR5cGUgZGVjbGFyYXRpb24gd2l0aCBvbmUgZmllbGQgYmVmb3JlPiIKLQkpOwotfQotLyoKLSAqIFRlc3QgY29tcGxldGlvbiBpbiBsb2NhbCB0eXBlIGRlY2xhcmF0aW9uIHdpdGggb25lIHN0YXRlbWVudCBkZWZpbmVkIGJlZm9yZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdExvY2FsVHlwZU9uZVN0YXRlbWVudEJlZm9yZSgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIgKwotCQkiCQlpbnQgaSA9IDE7CQkJCQkJCQlcbiIgKwotCQkiCQljbGFzcyBJbm5lckJhciB7CQkJCQkJXG4iICsKLQkJIgkJCXZvaWQgYnV6eigpIHsJCQkJCQlcbiIgKwotCQkiCQkJCWludCBpID0gZnJlZCgpLnh5ejsJCQkJXG4iICsKLQkJIgkJCX0JCQkJCQkJCQlcbiIgKwotCQkiCQl9OwkJCQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpmcmVkKCkueD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgaW50IGk7XG4iICsKLQkJIiAgICBjbGFzcyBJbm5lckJhciB7XG4iICsKLQkJIiAgICAgIElubmVyQmFyKCkge1xuIiArCi0JCSIgICAgICB9XG4iICsKLQkJIiAgICAgIHZvaWQgYnV6eigpIHtcbiIgKwotCQkiICAgICAgICBpbnQgaSA9IDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PjtcbiIgKwotCQkiICAgICAgfVxuIiArCi0JCSIgICAgfTtcbiIgKwotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJ4eXoiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBpbiBsb2NhbCB0eXBlIGRlY2xhcmF0aW9uIHdpdGggMSBzdGF0ZW1lbnQgYmVmb3JlPiIKLQkpOwotfQotLyoKLSAqIFRlc3QgY29tcGxldGlvbiBpbiB0aGUgc2Vjb25kIG1ldGhvZCBvZiBhIGxvY2FsIHR5cGUgZGVjbGFyYXRpb24KLSAqLwotcHVibGljIHZvaWQgdGVzdExvY2FsVHlwZVNlY29uZE1ldGhvZCgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIgKwotCQkiCQljbGFzcyBJbm5lckJhciB7CQkJCQkJXG4iICsKLQkJIgkJCXZvaWQgZnV6eigpIHsJCQkJCQlcbiIgKwotCQkiCQkJfQkJCQkJCQkJCVxuIiArCi0JCSIJCQl2b2lkIGJ1enooKSB7CQkJCQkJXG4iICsKLQkJIgkJCQlpbnQgaSA9IGZyZWQoKS54eXo7CQkJCVxuIiArCi0JCSIJCQl9CQkJCQkJCQkJXG4iICsKLQkJIgkJfTsJCQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6ZnJlZCgpLng+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIGNsYXNzIElubmVyQmFyIHtcbiIgKwotCQkiICAgICAgSW5uZXJCYXIoKSB7XG4iICsKLQkJIiAgICAgIH1cbiIgKwotCQkiICAgICAgdm9pZCBmdXp6KCkge1xuIiArCi0JCSIgICAgICB9XG4iICsKLQkJIiAgICAgIHZvaWQgYnV6eigpIHtcbiIgKwotCQkiICAgICAgICBpbnQgaSA9IDxDb21wbGV0ZU9uTWVtYmVyQWNjZXNzOmZyZWQoKS54PjtcbiIgKwotCQkiICAgICAgfVxuIiArCi0JCSIgICAgfTtcbiIgKwotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkieCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJ4eXoiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBpbiBsb2NhbCB0eXBlIGRlY2xhcmF0aW9uIGluIHNlY29uZCBtZXRob2Q+IgotCSk7Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL0xhYmVsU3RhdGVtZW50Q29tcGxldGlvblRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvTGFiZWxTdGF0ZW1lbnRDb21wbGV0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGE3MmZhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvTGFiZWxTdGF0ZW1lbnRDb21wbGV0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIucGFyc2VyOwotCi0vKioKLSAqIENvbXBsZXRpb24gaXMgZXhwZWN0ZWQgdG8gYmUgaW4gYSBMYWJlbGVkU3RhdGVtZW50LgotICovCi1wdWJsaWMgY2xhc3MgTGFiZWxTdGF0ZW1lbnRDb21wbGV0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0Q29tcGxldGlvblRlc3QgewotcHVibGljIExhYmVsU3RhdGVtZW50Q29tcGxldGlvblRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0Jc3VwZXIodGVzdE5hbWUpOwotfQotLyoKLSAqIENvbXBsZXRpb24gaW5zaWRlIGFuIGlubmVyIGNsYXNzIGRlZmluZWQgaW5zaWRlIGEgbGFiZWxlZCBzdGF0ZW1lbnQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QxRlRFTzlMKCkgewotCVN0cmluZyBjdSA9Ci0JCSJwYWNrYWdlIHA7IAkJCQkJXG4iICsKLQkJIgkJCQkJCQkJXG4iICsKLQkJImNsYXNzIENDSGVscGVyIHsJCQkJXG4iICsKLQkJIgljbGFzcyBNZW1iZXIxIHsJCQkJXG4iICsKLQkJIgl9CQkJCQkJCVxuIiArCi0JCSIJY2xhc3MgTWVtYmVyMiB7CQkJCVxuIiArCi0JCSIJfQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQlcbiIgKwotCQkiCX0JCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCVxuIiArCi0JCSIJCQkJCQkJCVxuIiArCi0JCSJwdWJsaWMgY2xhc3MgQ0MgewkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQlcbiIgKwotCQkiCQluZXcgQ0NIZWxwZXIoKQkJCVxuIiArCi0JCSIJCQkubmV3IENDSGVscGVyKCkJCVxuIiArCi0JCSIJCQkubmV3IE0JCQkJXG4iICsKLQkJIgl9CQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQlcbiI7Ci0JLy8gZmlyc3QgY2FzZQotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJY3UsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiCQkJLm4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpuZXcgQ0NIZWxwZXIoKS5uPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJjbGFzcyBDQ0hlbHBlciB7XG4iICsgCi0JCSIgIGNsYXNzIE1lbWJlcjEge1xuIiArIAotCQkiICAgIE1lbWJlcjEoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGNsYXNzIE1lbWJlcjIge1xuIiArIAotCQkiICAgIE1lbWJlcjIoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIENDSGVscGVyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgQ0Mge1xuIiArIAotCQkiICBwdWJsaWMgQ0MoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6bmV3IENDSGVscGVyKCkubj47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJuIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIm5ldyIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPHJlZ3Jlc3Npb24gdGVzdCAxRlRFTzlMIChmaXJzdCBjYXNlKT4iCi0JKTsKLQkvLyBzZWNvbmQgY2FzZQotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJY3UsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiCQkJLm5ldyBDQyIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uVHlwZTpDQz4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkicGFja2FnZSBwO1xuIiArIAotCQkiY2xhc3MgQ0NIZWxwZXIge1xuIiArIAotCQkiICBjbGFzcyBNZW1iZXIxIHtcbiIgKyAKLQkJIiAgICBNZW1iZXIxKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBjbGFzcyBNZW1iZXIyIHtcbiIgKyAKLQkJIiAgICBNZW1iZXIyKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBDQ0hlbHBlcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiArIAotCQkicHVibGljIGNsYXNzIENDIHtcbiIgKyAKLQkJIiAgcHVibGljIENDKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIG5ldyBDQ0hlbHBlcigpLm5ldyA8Q29tcGxldGVPblR5cGU6Q0M+KCk7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJDQyIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJDQ0hlbHBlciIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPHJlZ3Jlc3Npb24gdGVzdCAxRlRFTzlMIChzZWNvbmQgY2FzZSk+IgotCSk7Ci0JLy8gdGhpcmQgY2FzZQotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJY3UsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiCQkJLm5ldyBDQ0hlbHBlcigpCQlcbiIgKwotCQkiCQkJLm4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lbWJlckFjY2VzczpuZXcgQ0NIZWxwZXIoKS5uZXcgQ0NIZWxwZXIoKS5uPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJjbGFzcyBDQ0hlbHBlciB7XG4iICsgCi0JCSIgIGNsYXNzIE1lbWJlcjEge1xuIiArIAotCQkiICAgIE1lbWJlcjEoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGNsYXNzIE1lbWJlcjIge1xuIiArIAotCQkiICAgIE1lbWJlcjIoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIENDSGVscGVyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgQ0Mge1xuIiArIAotCQkiICBwdWJsaWMgQ0MoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25NZW1iZXJBY2Nlc3M6bmV3IENDSGVscGVyKCkubmV3IENDSGVscGVyKCkubj47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJuIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIm5ldyIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPHJlZ3Jlc3Npb24gdGVzdCAxRlRFTzlMICh0aGlyZCBjYXNlKT4iCi0JKTsKLQkvLyBmb3VydGggY2FzZQotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJY3UsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiCQkJLm5ldyBDQ0hlbHBlcigpCQlcbiIgKwotCQkiCQkJLm5ldyBNIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25UeXBlOk0+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJImNsYXNzIENDSGVscGVyIHtcbiIgKyAKLQkJIiAgY2xhc3MgTWVtYmVyMSB7XG4iICsgCi0JCSIgICAgTWVtYmVyMSgpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgY2xhc3MgTWVtYmVyMiB7XG4iICsgCi0JCSIgICAgTWVtYmVyMigpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgQ0NIZWxwZXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBDQyB7XG4iICsgCi0JCSIgIHB1YmxpYyBDQygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBuZXcgQ0NIZWxwZXIoKS5uZXcgQ0NIZWxwZXIoKS5uZXcgPENvbXBsZXRlT25UeXBlOk0+KCk7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJNIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIk0iLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxyZWdyZXNzaW9uIHRlc3QgMUZURU85TCAoZm91cnRoIGNhc2UpPiIKLQkpOwotfQotLyoKLSAqIENvbXBsZXRpb24gaW5zaWRlIGEgY2FzZSB0aGF0IGhhcyBhbiBpZGVudGlmaWVyIGFzIGl0cyBjb25zdGFudCBleHByZXNzaW9uLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0SW5DYXNlV2l0aElkZW50aWZpZXIoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQkJXG4iICsKLQkJIgkJbGFiZWwxOiB7CQkJCQkJCQkJXG4iICsKLQkJIgkJCXN3aXRjaCAoaSkgewkJCQkJCQlcbiIgKwotCQkiCQkJCWNhc2UgYTogbGFiZWwyOiBYIG8gPSBuZXcgT2JqZWN0KCk7CVxuIiArCi0JCSIJCQl9CQkJCQkJCQkJCVxuIiArCi0JCSIJCX0JCQkJCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25OYW1lOlg+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIHtcbiIgKwotCQkiICAgICAge1xuIiArCi0JCSIgICAgICAgIDxDb21wbGV0ZU9uTmFtZTpYPjtcbiIgKwotCQkiICAgICAgfVxuIiArCi0JCSIgICAgfVxuIiArCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIlgiLAotCQkvLyBleHBlY3RlZExhYmVsczoKLQkJbmV3IFN0cmluZ1tdIHsibGFiZWwxIiwgImxhYmVsMiJ9LAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBpbiBjYXNlIHdpdGggaWRlbnRpZmllcj4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0aW9uIGluc2lkZSBhIGNhc2UgdGhhdCBoYXMgYSBudW1iZXIgYXMgaXRzIGNvbnN0YW50IGV4cHJlc3Npb24uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RJbkNhc2VXaXRoTnVtYmVyQ29uc3RhbnQoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQkJXG4iICsKLQkJIgkJbGFiZWwxOiB7CQkJCQkJCQkJXG4iICsKLQkJIgkJCXN3aXRjaCAoaSkgewkJCQkJCQlcbiIgKwotCQkiCQkJCWNhc2UgMTogbGFiZWwyOiBYIG8gPSBuZXcgT2JqZWN0KCk7CVxuIiArCi0JCSIJCQl9CQkJCQkJCQkJCVxuIiArCi0JCSIJCX0JCQkJCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25OYW1lOlg+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIHtcbiIgKwotCQkiICAgICAge1xuIiArCi0JCSIgICAgICAgIDxDb21wbGV0ZU9uTmFtZTpYPjtcbiIgKwotCQkiICAgICAgfVxuIiArCi0JCSIgICAgfVxuIiArCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIlgiLAotCQkvLyBleHBlY3RlZExhYmVsczoKLQkJbmV3IFN0cmluZ1tdIHsibGFiZWwxIiwgImxhYmVsMiJ9LAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBpbiBjYXNlIHdpdGggbnVtYmVyPiIKLQkpOwotfQotLyoKLSAqIENvbXBsZXRpb24gaW5zaWRlIGFuIGlubmVyIGNsYXNzIGRlZmluZWQgaW5zaWRlIGEgbGFiZWxlZCBzdGF0ZW1lbnQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RJbkxhYmVsZWRJbm5lckNsYXNzKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDogCi0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIgKwotCQkiCQlsYWJlbDE6IHsJCQkJCQkJCVxuIiArCi0JCSIJCQlPYmplY3QgbyA9IG5ldyBPYmplY3QoKSB7CQkJXG4iICsKLQkJIgkJCQl2b2lkIGZyZWQoKSB7CQkJCQlcbiIgKwotCQkiCQkJCQlsYWJlbDI6IHsJCQkJCVxuIiArCi0JCSIJCQkJCQlYIG8gPSBuZXcgT2JqZWN0KCk7CQlcbiIgKwotCQkiCQkJCQl9CQkJCQkJCVxuIiArCi0JCSIJCQkJfQkJCQkJCQkJXG4iICsKLQkJIgkJCX07CQkJCQkJCQkJXG4iICsKLQkJIgkJfQkJCQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIlgiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk5hbWU6WD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAge1xuIiArCi0JCSIgICAgICBPYmplY3QgbztcbiIgKwotCQkiICAgICAgbmV3IE9iamVjdCgpIHtcbiIgKwotCQkiICAgICAgICAoKSB7XG4iICsKLQkJIiAgICAgICAgfVxuIiArCi0JCSIgICAgICAgIHZvaWQgZnJlZCgpIHtcbiIgKwotCQkiICAgICAgICAgIHtcbiIgKwotCQkiICAgICAgICAgICAgPENvbXBsZXRlT25OYW1lOlg+O1xuIiArCi0JCSIgICAgICAgICAgfVxuIiArCi0JCSIgICAgICAgIH1cbiIgKwotCQkiICAgICAgfTtcbiIgKwotCQkiICAgIH1cbiIgKwotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiWCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRMYWJlbHM6Ci0JCW5ldyBTdHJpbmdbXSB7ImxhYmVsMiJ9LAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBpbiBsYWJlbGVkIGlubmVyIGNsYXNzPiIKLQkpOwotfQotLyoKLSAqIENvbXBsZXRpb24gaW5zaWRlIGFuIGlubmVyIGNsYXNzIGRlZmluZWQgaW5zaWRlIGEgbGFiZWxlZCBzdGF0ZW1lbnQgd2l0aCBhIHN5bnRheCBlcnJvcgotICoganVzdCBiZWZvcmUgdGhlIGxhYmVsZWQgc3RhdGVtZW50LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0SW5MYWJlbGVkSW5uZXJDbGFzc1dpdGhFcnJvckJlZm9yZSgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6IAotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQkJXG4iICsKLQkJIgkJaW50IGkgPT0gMjsgXG4iICsKLQkJIgkJbGFiZWwxOiB7CQkJCQkJCQlcbiIgKwotCQkiCQkJT2JqZWN0IG8gPSBuZXcgT2JqZWN0KCkgewkJCVxuIiArCi0JCSIJCQkJdm9pZCBmcmVkKCkgewkJCQkJXG4iICsKLQkJIgkJCQkJbGFiZWwyOiB7CQkJCQlcbiIgKwotCQkiCQkJCQkJWCBvID0gbmV3IE9iamVjdCgpOwkJXG4iICsKLQkJIgkJCQkJfQkJCQkJCQlcbiIgKwotCQkiCQkJCX0JCQkJCQkJCVxuIiArCi0JCSIJCQl9OwkJCQkJCQkJCVxuIiArCi0JCSIJCX0JCQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25OYW1lOlg+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBpbnQgaTtcbiIgKyAKLQkJIiAgICB7XG4iICsgCi0JCSIgICAgICBPYmplY3QgbztcbiIgKyAKLQkJIiAgICAgIG5ldyBPYmplY3QoKSB7XG4iICsgCi0JCSIgICAgICAgICgpIHtcbiIgKyAKLQkJIiAgICAgICAgfVxuIiArIAotCQkiICAgICAgICB2b2lkIGZyZWQoKSB7XG4iICsgCi0JCSIgICAgICAgICAge1xuIiArIAotCQkiICAgICAgICAgICAgPENvbXBsZXRlT25OYW1lOlg+O1xuIiArIAotCQkiICAgICAgICAgIH1cbiIgKyAKLQkJIiAgICAgICAgfVxuIiArIAotCQkiICAgICAgfTtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIlgiLAotCQkvLyBleHBlY3RlZExhYmVsczoKLQkJbmV3IFN0cmluZ1tdIHsibGFiZWwyIn0sCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIGluIGxhYmVsZWQgaW5uZXIgY2xhc3Mgd2l0aCBzeW50YXggZXJyb3IgYmVmb3JlPiIKLQkpOwotfQotLyoKLSAqIENvbXBsZXRpb24gaW5zaWRlIGEgbGFiZWxlZCBzdGF0ZW1lbnQgb25lIGxldmVsIGRlZXAuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RPbmVMZXZlbERlZXAoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJCVxuIiArCi0JCSIJCWxhYmVsMTogWCBvID0gbmV3IE9iamVjdCgpOwkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIlgiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk5hbWU6WD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpYPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIlgiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiWCIsCi0JCS8vIGV4cGVjdGVkTGFiZWxzOgotCQluZXcgU3RyaW5nW10geyJsYWJlbDEifSwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgaW4gb25lIGxldmVsIGRlZXA+IgotCSk7Ci19Ci0vKgotICogQ29tcGxldGlvbiBpbnNpZGUgYSBsYWJlbGVkIHN0YXRlbWVudCB3aGljaCBpcyB0aGUgc2Vjb25kIG9uZSBpbiB0aGUgbWV0aG9kLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0U2Vjb25kTGFiZWwoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJCVxuIiArCi0JCSIJCWxhYmVsMTogYnV6eigpOwkJCQkJCQlcbiIgKwotCQkiCQlsYWJlbDI6IFggbyA9IG5ldyBPYmplY3QoKTsJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25OYW1lOlg+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6WD47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIlgiLAotCQkvLyBleHBlY3RlZExhYmVsczoKLQkJbmV3IFN0cmluZ1tdIHsibGFiZWwyIn0sCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIGluIHNlY29uZCBsYWJlbGVkIHN0YXRlbWVudD4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0aW9uIGluc2lkZSBhIGxhYmVsZWQgc3RhdGVtZW50IHR3byBsZXZlbCBkZWVwLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0VHdvTGV2ZWxEZWVwKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDogCi0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIgKwotCQkiCQlsYWJlbDE6IHsJCQkJCQkJCVxuIiArCi0JCSIJCQlsYWJlbDI6IFggbyA9IG5ldyBPYmplY3QoKTsJCQlcbiIgKwotCQkiCQl9CQkJCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiWCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTmFtZTpYPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAge1xuIiArIAotCQkiICAgICAgPENvbXBsZXRlT25OYW1lOlg+O1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIlgiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiWCIsCi0JCS8vIGV4cGVjdGVkTGFiZWxzOgotCQluZXcgU3RyaW5nW10geyJsYWJlbDEiLCAibGFiZWwyIn0sCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIGluIHR3byBsZXZlbCBkZWVwPiIKLQkpOwotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3BhcnNlci9NZXRob2RJbnZvY2F0aW9uQ29tcGxldGlvblRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvTWV0aG9kSW52b2NhdGlvbkNvbXBsZXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMGZiZDkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3BhcnNlci9NZXRob2RJbnZvY2F0aW9uQ29tcGxldGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyLnBhcnNlcjsKLQotLyoqCi0gKiBDb21wbGV0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIGEgTWV0aG9kSW52b2NhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEludm9jYXRpb25Db21wbGV0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0Q29tcGxldGlvblRlc3QgewotcHVibGljIE1ldGhvZEludm9jYXRpb25Db21wbGV0aW9uVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLQlzdXBlcih0ZXN0TmFtZSk7Ci19Ci0vKgotICogQ29tcGxldGlvbiB3aXRoIG5vIHJlY2VpdmVyIGluc2lkZSBhIGZvciBzdGF0ZW1lbnQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QxRlZWV1M4XzEoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgWCB7CQkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJXG4iICsKLQkJIgkJZm9yIChpbnQgaSA9IDEwOyBpID4gMDsgLS1pKQkJXG4iICsKLQkJIgkJCWZyZWQoCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJImZyZWQoIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZXNzYWdlU2VuZDpmcmVkKCk+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIFgge1xuIiArIAotCQkiICBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgaW50IGk7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk1lc3NhZ2VTZW5kOmZyZWQoKT47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSIiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiZnJlZCgiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjwxRlZWV1M4XzE+IgotCSk7Ci19Ci0vKgotICogQ29tcGxldGlvbiB3aXRoIG5vIHJlY2VpdmVyIGluc2lkZSBhbiBpZiBzdGF0ZW1lbnQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QxRlZWV1M4XzIoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgWCB7CQkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJXG4iICsKLQkJIgkJaWYgKHRydWUpCQkJCQkJCVxuIiArCi0JCSIJCQlmcmVkKAkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJmcmVkKCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVzc2FnZVNlbmQ6ZnJlZCgpPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBYIHtcbiIgKyAKLQkJIiAgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTWVzc2FnZVNlbmQ6ZnJlZCgpPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIiIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJmcmVkKCIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPDFGVlZXUzhfMj4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0aW9uIHdpdGggbm8gcmVjZWl2ZXIgaW5zaWRlIGEgZm9yIHN0YXRlbWVudAotICogYW5kIGFmdGVyIGEgZmllbGQgYWNjZXNzLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MUZXMlpUQl8xKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIFggewkJCQkJCQkJCQkJXG4iICsKLQkJIglpbnRbXSBhcnJheTsJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQkJCVxuIiArCi0JCSIJCWZvciAoaW50IGkgPSB0aGlzLmFycmF5Lmxlbmd0aDsgaSA+IDA7IC0taSkJXG4iICsKLQkJIgkJCWZyZWQoCQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJImZyZWQoIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZXNzYWdlU2VuZDpmcmVkKCk+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIFgge1xuIiArCi0JCSIgIGludFtdIGFycmF5O1xuIiArCi0JCSIgIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICBpbnQgaTtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTWVzc2FnZVNlbmQ6ZnJlZCgpPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIiIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJmcmVkKCIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPDFGVzJaVEJfMSIKLQkpOwotfQotLyoKLSAqIENvbXBsZXRpb24gd2l0aCBubyByZWNlaXZlciBpbnNpZGUgYW5vdGhlciBtZXNzYWdlIHNlbmQKLSAqIGFuZCBhZnRlciBhIGZpZWxkIGFjY2VzcyBpbiBhIHByZXZpb3VzIGFyZ3VtZW50LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MUZXMlpUQl8yKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIFggewkJCQkJCQkJCQkJXG4iICsKLQkJIglpbnRbXSBhcnJheTsJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQkJCVxuIiArCi0JCSIJCWJhcih0aGlzLmFycmF5Lmxlbmd0aCwgMTAsIGZyZWQoCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJImZyZWQoIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZXNzYWdlU2VuZDpmcmVkKCk+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIFgge1xuIiArCi0JCSIgIGludFtdIGFycmF5O1xuIiArCi0JCSIgIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk1lc3NhZ2VTZW5kOmZyZWQoKT47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSIiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiZnJlZCgiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjwxRlcyWlRCXzIiCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0ZSBvbiBtZXRob2QgaW52b2NhdGlvbiB3aXRoIGV4cHJlc3Npb24gcmVjZWl2ZXIKLSAqIGluc2lkZSBhbm90aGVyIGludm9jYXRpb24gd2l0aCBubyByZWNlaXZlci4KLSAqLwotcHVibGljIHZvaWQgdGVzdDFGVzM1WVpfMSgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJXG4iICsKLQkJIgkJYmFyKHByaW1hcnkoKS5mcmVkKAkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiZnJlZCgiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lc3NhZ2VTZW5kOnByaW1hcnkoKS5mcmVkKCk+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk1lc3NhZ2VTZW5kOnByaW1hcnkoKS5mcmVkKCk+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJImZyZWQoIiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8MUZXMzVZWl8xPiIKLQkpOwotfQotLyoKLSAqIENvbXBsZXRlIG9uIHF1YWxpZmllZCBhbGxvY2F0aW9uIGV4cHJlc3Npb24KLSAqIGluc2lkZSBhbiBpbnZvY2F0aW9uIHdpdGggbm8gcmVjZWl2ZXIuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QxRlczNVlaXzIoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCVxuIiArCi0JCSIJCWJhcihwcmltYXJ5KCkubmV3IFgoCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIlgoIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25RdWFsaWZpZWRBbGxvY2F0aW9uRXhwcmVzc2lvbjpwcmltYXJ5KCkubmV3IFgoKT4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb246cHJpbWFyeSgpLm5ldyBYKCk+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPDFGVzM1WVpfMj4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0aW9uIHdpdGggcHJpbWFyeSByZWNlaXZlci4KLSAqLwotcHVibGljIHZvaWQgdGVzdDFGV1lCS0YoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgWCB7CQkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJXG4iICsKLQkJIgkJCXRoaXMueC5iYXIoCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiYmFyKCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVzc2FnZVNlbmQ6dGhpcy54LmJhcigpPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBYIHtcbiIgKyAKLQkJIiAgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTWVzc2FnZVNlbmQ6dGhpcy54LmJhcigpPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIiIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJiYXIoIiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8MUZXWUJLRj4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0aW9uIGp1c3QgYWZ0ZXIgYSBwYXJhbWV0ZXIgd2hpY2ggaXMgYSBtZXNzYWdlIHNlbmQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QxR0FKQlVRKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciB7CQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQlcbiIgKwotCQkiCQl4LnkuWi5mcmVkKGJ1enooKSk7CQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJmcmVkKGJ1enooKSIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVzc2FnZVNlbmQ6eC55LlouZnJlZChidXp6KCkpPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25NZXNzYWdlU2VuZDp4LnkuWi5mcmVkKGJ1enooKSk+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJImZyZWQoYnV6eigpIiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8MUdBSkJVUT4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0aW9uIGp1c3QgYmVmb3JlIHRoZSBzZWNvbmQgcGFyYW1ldGVyLCB0aGUgZmlyc3QgcGFyYW1ldGVyIGJlaW5nIGFuIGVtcHR5Ci0gKiBhbm9ueW1vdXMgY2xhc3MuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RBZnRlckVtcHR5QW5vbnltb3VzKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciB7CQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQlcbiIgKwotCQkiCQl0aGlzLmZyZWQobmV3IFJ1bm5hYmxlKCkge30sIDIsIGkpOwlcbiIgKwotCQkiCX0JCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJmcmVkKG5ldyBSdW5uYWJsZSgpIHt9LCAiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lc3NhZ2VTZW5kOnRoaXMuZnJlZChuZXcgUnVubmFibGUoKSB7XG59KT4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTWVzc2FnZVNlbmQ6dGhpcy5mcmVkKG5ldyBSdW5uYWJsZSgpIHtcbiIgKyAKLQkJIn0pPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIiIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJmcmVkKG5ldyBSdW5uYWJsZSgpIHt9LCAiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0aW9uIGp1c3QgYmVmb3JlIHNlY29uZCBwYXJhbWV0ZXIsIHRoZSBmaXJzdCBwYXJhbWV0ZXIgYmVpbmcgYW4gZW1wdHkgYW5vbnltb3VzIGNsYXNzPiIKLQkpOwotfQotLyoKLSAqIENvbXBsZXRpb24ganVzdCBhZnRlciB0aGUgZmlyc3QgcGFyYW1ldGVyLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0QWZ0ZXJGaXJzdFBhcmFtZXRlcigpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJXG4iICsKLQkJIgkJdGhpcy5mcmVkKFwiYWJjXCIgLCAyLCBpKTsJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJImZyZWQoXCJhYmNcIiAiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lc3NhZ2VTZW5kOnRoaXMuZnJlZChcImFiY1wiKT4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTWVzc2FnZVNlbmQ6dGhpcy5mcmVkKFwiYWJjXCIpPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIiIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJmcmVkKFwiYWJjXCIgIiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGlvbiBqdXN0IGFmdGVyIGZpcnN0IHBhcmFtZXRlcj4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0aW9uIGp1c3QgYmVmb3JlIHRoZSBmaXJzdCBwYXJhbWV0ZXIuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RCZWZvcmVGaXJzdFBhcmFtZXRlcigpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJXG4iICsKLQkJIgkJdGhpcy5mcmVkKDEsIDIsIGkpOwkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiZnJlZCgiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lc3NhZ2VTZW5kOnRoaXMuZnJlZCgpPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25NZXNzYWdlU2VuZDp0aGlzLmZyZWQoKT47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSIiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiZnJlZCgiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0aW9uIGp1c3QgYmVmb3JlIGZpcnN0IHBhcmFtZXRlcj4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0aW9uIGp1c3QgYmVmb3JlIHRoZSBsYXN0IHBhcmFtZXRlci4KLSAqLwotcHVibGljIHZvaWQgdGVzdEJlZm9yZUxhc3RQYXJhbWV0ZXIoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCVxuIiArCi0JCSIJCXRoaXMuZnJlZCgxLCAyLCBpKTsJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJImZyZWQoMSwgMiwiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lc3NhZ2VTZW5kOnRoaXMuZnJlZCgxLCAyKT4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTWVzc2FnZVNlbmQ6dGhpcy5mcmVkKDEsIDIpPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIiIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJmcmVkKDEsIDIsIiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGlvbiBqdXN0IGJlZm9yZSBsYXN0IHBhcmFtZXRlcj4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0aW9uIGp1c3QgYmVmb3JlIHRoZSBzZWNvbmQgcGFyYW1ldGVyLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0QmVmb3JlU2Vjb25kUGFyYW1ldGVyKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciB7CQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQlcbiIgKwotCQkiCQl0aGlzLmZyZWQoMSwgMiwgaSk7CQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJmcmVkKDEsICIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVzc2FnZVNlbmQ6dGhpcy5mcmVkKDEpPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25NZXNzYWdlU2VuZDp0aGlzLmZyZWQoMSk+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJImZyZWQoMSwgIiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGlvbiBqdXN0IGJlZm9yZSBzZWNvbmQgcGFyYW1ldGVyPiIKLQkpOwotfQotLyoKLSAqIENvbXBsZXRpb24gb24gZW1wdHkgbmFtZSBpbnNpZGUgdGhlIGV4cHJlc3Npb24gb2YgdGhlIGZpcnN0IHBhcmFtZXRlci4KLSAqLwotcHVibGljIHZvaWQgdGVzdEVtcHR5SW5GaXJzdFBhcmFtZXRlcigpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJXG4iICsKLQkJIgkJdGhpcy5mcmVkKFwiYWJjXCIgKyAsIDIsIGkpOwkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiZnJlZChcImFiY1wiICsiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk5hbWU6PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgKFwiYWJjXCIgKyA8Q29tcGxldGVPbk5hbWU6Pik7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSIiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiIiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGlvbiBlbXB0eSBpbiBmaXJzdCBwYXJhbWV0ZXI+IgotCSk7Ci19Ci0vKgotICogQ29tcGxldGlvbiBpbnNpZGUgdGhlIGV4cHJlc3Npb24gb2YgdGhlIGZpcnN0IHBhcmFtZXRlci4KLSAqLwotcHVibGljIHZvaWQgdGVzdEluRmlyc3RQYXJhbWV0ZXIoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCVxuIiArCi0JCSIJCXRoaXMuZnJlZChcImFiY1wiICsgYml6eiwgMiwgaSk7CVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJImZyZWQoXCJhYmNcIiArIGJpIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25OYW1lOmJpPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgKFwiYWJjXCIgKyA8Q29tcGxldGVPbk5hbWU6Ymk+KTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJImJpIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJImJpenoiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0aW9uIGluc2lkZSBmaXJzdCBwYXJhbWV0ZXI+IgotCSk7Ci19Ci0vKgotICogQ29tcGxldGlvbiBpbnNpZGUgYW4gaWYgc3RhdGVtZW50LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0SW5JZlN0YXRlbWVudCgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBYIHsJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQlcbiIgKwotCQkiCQlpZiAodHJ1ZSkgewkJCQkJCQlcbiIgKwotCQkiCQkJYmFyLmZyZWQoKTsJCQkJCQlcbiIgKwotCQkiCQl9CQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiZnJlZCgiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lc3NhZ2VTZW5kOmJhci5mcmVkKCk+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIFgge1xuIiArIAotCQkiICBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIHtcbiIgKyAKLQkJIiAgICAgIDxDb21wbGV0ZU9uTWVzc2FnZVNlbmQ6YmFyLmZyZWQoKT47XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJImZyZWQoIiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGlvbiBpbnNpZGUgYSBpZiBzdGF0ZW1lbnQ+IgotCSk7Ci19Ci0vKgotICogQ29tcGxldGlvbiBpbiBsYWJlbGVkIG1ldGhvZCBpbnZvY2F0aW9uIHdpdGggZXhwcmVzc2lvbiByZWNlaXZlci4KLSAqLwotcHVibGljIHZvaWQgdGVzdExhYmVsZWRXaXRoRXhwcmVzc2lvblJlY2VpdmVyKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIFggewkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCVxuIiArCi0JCSIJCWxhYmVsMTogYmFyKCkuZnJlZCgxLCAyLCBvKTsJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJImZyZWQoMSwgMiwiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lc3NhZ2VTZW5kOmJhcigpLmZyZWQoMSwgMik+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIFgge1xuIiArIAotCQkiICBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25NZXNzYWdlU2VuZDpiYXIoKS5mcmVkKDEsIDIpPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIiIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJmcmVkKDEsIDIsIiwKLQkJLy8gZXhwZWN0ZWRMYWJlbHM6Ci0JCW5ldyBTdHJpbmdbXSB7ImxhYmVsMSJ9LAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0aW9uIGluIGxhYmVsZWQgbWV0aG9kIGludm9jYXRpb24gd2l0aCBleHByZXNzaW9uIHJlY2VpdmVyPiIKLQkpOwotfQotLyoKLSAqIENvbXBsZXRpb24gaW4gbGFiZWxlZCBtZXRob2QgaW52b2NhdGlvbiB3aXRob3V0IHJlY2VpdmVyLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TGFiZWxlZFdpdGhvdXRSZWNlaXZlcigpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJXG4iICsKLQkJIgkJbGFiZWwxOiBmcmVkKDEsIDIsIG8pOwkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJmcmVkKDEsIDIsIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZXNzYWdlU2VuZDpmcmVkKDEsIDIpPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk1lc3NhZ2VTZW5kOmZyZWQoMSwgMik+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJImZyZWQoMSwgMiwiLAotCQkvLyBleHBlY3RlZExhYmVsczoKLQkJbmV3IFN0cmluZ1tdIHsibGFiZWwxIn0sCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRpb24gaW4gbGFiZWxlZCBtZXRob2QgaW52b2NhdGlvbiB3aXRob3V0IHJlY2VpdmVyPiIKLQkpOwotfQotLyoKLSAqIE1ldGhvZEludm9jYXRpb24gOjo9IE5hbWUgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScKLSAqLwotcHVibGljIHZvaWQgdGVzdE5vUmVjZWl2ZXIoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCVxuIiArCi0JCSIJCWZyZWQoKTsJCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJImZyZWQoIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZXNzYWdlU2VuZDpmcmVkKCk+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk1lc3NhZ2VTZW5kOmZyZWQoKT47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSIiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiZnJlZCgiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0aW9uIG9uIG1ldGhvZCBpbnZvY2F0aW9uIHdpdGggbm8gcmVjZWl2ZXI+IgotCSk7Ci19Ci0vKgotICogQ29tcGxldGlvbiBqdXN0IGJlZm9yZSB0aGUgZmlyc3QgcGFyYW1ldGVyIHdpdGggYSBzcGFjZSBhZnRlciB0aGUgb3BlbiBwYXJlbnRoZXNpcy4KLSAqLwotcHVibGljIHZvaWQgdGVzdFNwYWNlVGhlbkZpcnN0UGFyYW1ldGVyKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciB7CQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQlcbiIgKwotCQkiCQl0aGlzLmZyZWQoIDEsIDIsIGkpOwkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJmcmVkKCAiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lc3NhZ2VTZW5kOnRoaXMuZnJlZCgpPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25NZXNzYWdlU2VuZDp0aGlzLmZyZWQoKT47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSIiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiZnJlZCggIiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGlvbiBqdXN0IGJlZm9yZSBmaXJzdCBwYXJhbWV0ZXIgd2l0aCBhIHNwYWNlIGFmdGVyIG9wZW4gcGFyZW50aGVzaXM+IgotCSk7Ci19Ci0vKgotICogTWV0aG9kSW52b2NhdGlvbiA6Oj0gJ3N1cGVyJyAnLicgJ0lkZW50aWZpZXInICcoJyBBcmd1bWVudExpc3RvcHQgJyknCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTdXBlcigpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJXG4iICsKLQkJIgkJc3VwZXIuZnJlZCgxLCAyLCBpKTsJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiZnJlZCgiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lc3NhZ2VTZW5kOnN1cGVyLmZyZWQoKT4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTWVzc2FnZVNlbmQ6c3VwZXIuZnJlZCgpPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIiIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJmcmVkKCIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRpb24gb24gc3VwZXIgbWV0aG9kIGludm9jYXRpb24+IgotCSk7Ci19Ci0vKgotICogQ29tcGxldGUgb24gbWV0aG9kIGludm9jYXRpb24gd2l0aCBleHByZXNzaW9uIHJlY2VpdmVyLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0V2l0aEV4cHJlc3Npb25SZWNlaXZlcigpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJXG4iICsKLQkJIgkJYmFyKCkuZnJlZCgpOwkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJImZyZWQoIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZXNzYWdlU2VuZDpiYXIoKS5mcmVkKCk+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk1lc3NhZ2VTZW5kOmJhcigpLmZyZWQoKT47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSIiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiZnJlZCgiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0aW9uIG9uIG1ldGhvZCBpbnZvY2F0aW9uIHdpdGggZXhwcmVzc2lvbiByZWNlaXZlcj4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0aW9uIHdpdGggYSBuYW1lIHJlY2VpdmVyLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0V2l0aE5hbWVSZWNlaXZlcigpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJXG4iICsKLQkJIgkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7CQkJXG4iICsKLQkJIgkJdi5hZGRFbGVtZW50KFwiMVwiKTsJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiYWRkRWxlbWVudCgiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk1lc3NhZ2VTZW5kOnYuYWRkRWxlbWVudCgpPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICBWZWN0b3IgdjtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTWVzc2FnZVNlbmQ6di5hZGRFbGVtZW50KCk+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJImFkZEVsZW1lbnQoIiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGlvbiB3aXRoIG5hbWUgcmVjZWl2ZXI+IgotCSk7Ci19Ci0vKgotICogQ29tcGxldGlvbiB3aXRoIGEgbmFtZSByZWNlaXZlciBhZnRlciBjb25kaXRpb25hbCBleHByZXNzaW9uLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0V2l0aE5hbWVSZWNlaXZlckFmdGVyQ29uZGl0aW9uYWxFeHByZXNzaW9uKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIFggewkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCVxuIiArCi0JCSIJCWJ1enoudGVzdChjb25kID8gbWF4IDogbWluKTsJCVxuIiArCi0JCSIJCWJhci5mcmVkKCk7CQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJImZyZWQoIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZXNzYWdlU2VuZDpiYXIuZnJlZCgpPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBYIHtcbiIgKyAKLQkJIiAgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTWVzc2FnZVNlbmQ6YmFyLmZyZWQoKT47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSIiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiZnJlZCgiLAotCQkvLyBleHBlY3RlZExhYmVsczoKLQkJbmV3IFN0cmluZ1tdIHt9LAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0aW9uIHdpdGggbmFtZSByZWNlaXZlciBhZnRlciBjb25kaXRpb25hbCBleHByZXNzaW9uPiIKLQkpOwotfQotLyoKLSAqIENvbXBsZXRpb24gd2l0aCBhIG5hbWUgcmVjZWl2ZXIgYW5kIDIgYXJndW1lbnRzLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0V2l0aE5hbWVSZWNlaXZlckFuZFR3b0FyZ3MoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCVxuIiArCi0JCSIJCVggeCA9IG5ldyBYKCk7CQkJCQkJXG4iICsKLQkJIgkJeC5mcmVkKDEsIDIsIG8pOwkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkieC5mcmVkKDEsIDIsIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25NZXNzYWdlU2VuZDp4LmZyZWQoMSwgMik+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIFggeDtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTWVzc2FnZVNlbmQ6eC5mcmVkKDEsIDIpPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIiIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJmcmVkKDEsIDIsIiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGlvbiB3aXRoIG5hbWUgcmVjZWl2ZXIgYW5kIDIgYXJndW1lbnRzPiIKLQkpOwotfQotLyoKLSAqIENvbXBsZXRpb24gd2l0aCBhIHF1YWxpZmllZCBuYW1lIHJlY2VpdmVyLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0V2l0aFF1YWxpZmllZE5hbWVSZWNlaXZlcigpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJXG4iICsKLQkJIgkJWCB4ID0gbmV3IFgoKTsJCQkJCQlcbiIgKwotCQkiCQl5LnguZnJlZCgxLCAyLCBvKTsJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJInguZnJlZCgxLCAyLCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTWVzc2FnZVNlbmQ6eS54LmZyZWQoMSwgMik+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIFggeDtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTWVzc2FnZVNlbmQ6eS54LmZyZWQoMSwgMik+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJImZyZWQoMSwgMiwiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0aW9uIHdpdGggcXVhbGlmaWVkIG5hbWUgcmVjZWl2ZXI+IgotCSk7Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL05hbWVSZWZlcmVuY2VDb21wbGV0aW9uVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3BhcnNlci9OYW1lUmVmZXJlbmNlQ29tcGxldGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU4ZTMwOS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL05hbWVSZWZlcmVuY2VDb21wbGV0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIucGFyc2VyOwotCi0vKioKLSAqIENvbXBsZXRpb24gaXMgZXhwZWN0ZWQgdG8gYmUgYSBuYW1lIHJlZmVyZW5jZS4KLSAqLwotcHVibGljIGNsYXNzIE5hbWVSZWZlcmVuY2VDb21wbGV0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0Q29tcGxldGlvblRlc3QgewotcHVibGljIE5hbWVSZWZlcmVuY2VDb21wbGV0aW9uVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLQlzdXBlcih0ZXN0TmFtZSk7Ci19Ci0vKgotICogUmVncmVzc2lvbiB0ZXN0IGZvciAxRlRaODQ5LgotICogVGhlIGluc3RhbmNlIGNyZWF0aW9uIGJlZm9yZSB0aGUgY29tcGxldGlvbiBpcyBub3QgcHJvcGVybHkgY2xvc2VkLCBhbmQgdGh1cwotICogdGhlIGNvbXBsZXRpb24gcGFyc2VyIHVzZWQgdG8gdGhpbmsgdGhlIGNvbXBsZXRpb24gd2FzIG9uIGEgdHlwZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdDFGVFo4NDkoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCVxuIiArCi0JCSIJCVggbyA9IG5ldyBYOwkJCQkJCVxuIiArCi0JCSIJCWZyZWQueHl6OwkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJmcmVkLngiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk5hbWU6ZnJlZC54PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICBYIG87XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmZyZWQueD47XG4iICsKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiZnJlZC54eXoiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjwxRlRaODQ5PiIKLQkpOwotfQotLyoKLSAqIENvbXBsZXRpb24gaW4gYSBmaWVsZCBpbml0aWFsaXplciB3aXRoIG5vIHN5bnRheCBlcnJvci4gCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QxRlVVUDczKCkgewotCXRoaXMucnVuVGVzdENoZWNrRGlldFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJwdWJsaWMgY2xhc3MgQSB7CQkJCQlcbiIgKwotCQkiCVN0cmluZyBzID0gXCJoZWxsb1wiOwkJCVxuIiArCi0JCSIJT2JqZWN0IG8gPSBzLmNvbmNhdChcImJvb1wiKTsJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIk9iamVjdCBvID0gcyIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTmFtZTpzPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJIiAgU3RyaW5nIHM7XG4iICsKLQkJIiAgT2JqZWN0IG8gPSA8Q29tcGxldGVPbk5hbWU6cz47XG4iICsKLQkJIiAgcHVibGljIEEoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJzIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJInMiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjwxRlVVUDczPiIKLQkpOwotCXRoaXMucnVuVGVzdENoZWNrRGlldFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJwdWJsaWMgY2xhc3MgQSB7CQkJCQlcbiIgKwotCQkiCVN0cmluZyBzID0gXCJoZWxsb1wiOwkJCVxuIiArCi0JCSIJT2JqZWN0IG8gPSBzLmNvbmNhdChcImJvb1wiKTsJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIk9iamVjdCBvID0gcy5jIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25OYW1lOnMuYz4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCSIgIFN0cmluZyBzO1xuIiArCi0JCSIgIE9iamVjdCBvID0gPENvbXBsZXRlT25OYW1lOnMuYz47XG4iICsKLQkJIiAgcHVibGljIEEoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJjIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJInMuY29uY2F0IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8MUZVVVA3Mz4iCi0JKTsKLX0KLS8qCi0gKiBSZWdyZXNzaW9uIHRlc3QgZm9yIDFGVlJRUUEuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QxRlZSUVFBXzEoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgWCB7CQkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJXG4iICsKLQkJIgkJRW51bWVyYXRpb24gZSA9IG51bGw7IAkJCQlcbiIgKwotCQkiCQllLnRvCQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJlLnRvIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25OYW1lOmUudG8+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIFgge1xuIiArIAotCQkiICBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgRW51bWVyYXRpb24gZTtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6ZS50bz47XG4iICsKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJInRvIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJImUudG8iLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjwxRlZSUVFBXzE+IgotCSk7Ci19Ci0vKgotICogUmVncmVzc2lvbiB0ZXN0IGZvciAxRlZSUVFBLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MUZWUlFRQV8yKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIFggewkJCQkJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQkJCQkJXG4iICsKLQkJIgkJZm9yIChFbnVtZXJhdGlvbiBlID0gZ2V0U29tZUVudW1lcmF0aW9uKCk7IGUuaGFzCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiZS5oYXMiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk5hbWU6ZS5oYXM+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIFgge1xuIiArIAotCQkiICBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgRW51bWVyYXRpb24gZTtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6ZS5oYXM+O1xuIiArCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJoYXMiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiZS5oYXMiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjwxRlZSUVFBXzI+IgotCSk7Ci19Ci0vKgotICogUmVncmVzc2lvbiB0ZXN0IGZvciAxRlZUNjZRLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MUZWVDY2UV8xKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJInBhY2thZ2UgdGVzdDsJCQkJCQkJXG4iICsKLQkJIgkJCQkJCQkJCQlcbiIgKwotCQkicHVibGljIGNsYXNzIFRlc3QgewkJCQkJXG4iICsKLQkJIglwdWJsaWMgdm9pZCBmb28oKSB7CQkJCQlcbiIgKwotCQkiCQlmaW5hbCBpbnQgY29kZUFzc2lzdFRhcmdldD0gMzsJXG4iICsKLQkJIgkJCQkJCQkJCQlcbiIgKwotCQkiCQlUaHJlYWQgdD0gbmV3IFRocmVhZCgpIHsJCVxuIiArCi0JCSIJCQlwdWJsaWMgdm9pZCBydW4oKSB7CQkJXG4iICsKLQkJIgkJCQljb2RlQXNzCQkJCQlcbiIgKwotCQkiCQkJfQkJCQkJCQlcbiIgKwotCQkiCQl9OwkJCQkJCQkJXG4iICsKLQkJIgkJY29kZUEJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIgljb2RlQXNzIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25OYW1lOmNvZGVBc3M+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJInBhY2thZ2UgdGVzdDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBUZXN0IHtcbiIgKyAKLQkJIiAgcHVibGljIFRlc3QoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIGZpbmFsIGludCBjb2RlQXNzaXN0VGFyZ2V0O1xuIiArIAotCQkiICAgIFRocmVhZCB0O1xuIiArIAotCQkiICAgIG5ldyBUaHJlYWQoKSB7XG4iICsgCi0JCSIgICAgICAoKSB7XG4iICsgCi0JCSIgICAgICB9XG4iICsgCi0JCSIgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7XG4iICsgCi0JCSIgICAgICAgIDxDb21wbGV0ZU9uTmFtZTpjb2RlQXNzPjtcbiIgKyAKLQkJIiAgICAgIH1cbiIgKyAKLQkJIiAgICB9O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiY29kZUFzcyIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJjb2RlQXNzIiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8MUZWVDY2UV8xPiIKLQkpOwotfQotLyoKLSAqIFJlZ3Jlc3Npb24gdGVzdCBmb3IgMUZWVDY2US4KLSAqLwotcHVibGljIHZvaWQgdGVzdDFGVlQ2NlFfMigpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJwYWNrYWdlIHRlc3Q7CQkJCQkJCVxuIiArCi0JCSIJCQkJCQkJCQkJXG4iICsKLQkJInB1YmxpYyBjbGFzcyBUZXN0IHsJCQkJCVxuIiArCi0JCSIJcHVibGljIHZvaWQgZm9vKCkgewkJCQkJXG4iICsKLQkJIgkJZmluYWwgaW50IGNvZGVBc3Npc3RUYXJnZXQ9IDM7CVxuIiArCi0JCSIJCQkJCQkJCQkJXG4iICsKLQkJIgkJVGhyZWFkIHQ9IG5ldyBUaHJlYWQoKSB7CQlcbiIgKwotCQkiCQkJcHVibGljIHZvaWQgcnVuKCkgewkJCVxuIiArCi0JCSIJCQkJY29kZUFzcwkJCQkJXG4iICsKLQkJIgkJCX0JCQkJCQkJXG4iICsKLQkJIgkJfTsJCQkJCQkJCVxuIiArCi0JCSIJCWNvZGVBCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJcbgkJY29kZUEiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk5hbWU6Y29kZUE+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJInBhY2thZ2UgdGVzdDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBUZXN0IHtcbiIgKyAKLQkJIiAgcHVibGljIFRlc3QoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIGZpbmFsIGludCBjb2RlQXNzaXN0VGFyZ2V0O1xuIiArIAotCQkiICAgIFRocmVhZCB0O1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpjb2RlQT47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJjb2RlQSIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJjb2RlQSIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPDFGVlQ2NlFfMj4iCi0JKTsKLX0KLS8qCi0gKiBSZWdyZXNzaW9uIHRlc3QgZm9yIDFHOERFMzAuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QxRzhERTMwKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciB7CQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQlcbiIgKwotCQkiCQluZXcgUnVubmFibGUoKSB7CQkJCQlcbiIgKwotCQkiCQkJcHVibGljIHZvaWQgcnVuKCkgewkJCQlcbiIgKwotCQkiCQkJCUJhcgkJCQkJCQlcbiIgKwotCQkiCQkJfQkJCQkJCQkJXG4iICsKLQkJIgkJfTsJCQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJwdWJsaWMgdm9pZCBydW4oKSB7CQkJCVxuCQkJCSIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTmFtZTo+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBuZXcgUnVubmFibGUoKSB7XG4iICsgCi0JCSIgICAgICAoKSB7XG4iICsgCi0JCSIgICAgICB9XG4iICsgCi0JCSIgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7XG4iICsgCi0JCSIgICAgICAgIDxDb21wbGV0ZU9uTmFtZTo+O1xuIiArIAotCQkiICAgICAgfVxuIiArIAotCQkiICAgIH07XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSIiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiIiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8MUc4REUzMD4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0aW9uIG9uIGFuIGVtcHR5IG5hbWUgcmVmZXJlbmNlLiAKLSAqLwotcHVibGljIHZvaWQgdGVzdEVtcHR5TmFtZVJlZmVyZW5jZSgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJXG4iICsKLQkJIgkJaW50IGkgPSAwOwkJCQkJCQlcbiIgKwotCQkiCQkJCQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJpbnQgaSA9IDA7CQkJCQkJCVxuCQkiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk5hbWU6PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICBpbnQgaTtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6PjtcbiIgKwotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIGVtcHR5IG5hbWUgcmVmZXJlbmNlPiIKLQkpOwotfQotLyoKLSAqIENvbXBsZXRpb24gb24gYW4gZW1wdHkgbmFtZSByZWZlcmVuY2UgYWZ0ZXIgYSBjYXN0LiAKLSAqLwotcHVibGljIHZvaWQgdGVzdEVtcHR5TmFtZVJlZmVyZW5jZUFmdGVyQ2FzdCgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBYIHsJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQlcbiIgKwotCQkiCQlYIHggPSAoWCkJCQkJCQkJXG4iICsKLQkJIgkJCQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiKFgpIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25OYW1lOj4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgWCB7XG4iICsgCi0JCSIgIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICBYIHggPSAoWCkgPENvbXBsZXRlT25OYW1lOj47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSIiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiIiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gZW1wdHkgbmFtZSByZWZlcmVuY2UgYWZ0ZXIgY2FzdD4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0aW9uIG9uIGFuIGVtcHR5IG5hbWUgcmVmZXJlbmNlIGFmdGVyICsgb3BlcmF0b3IuIAotICovCi1wdWJsaWMgdm9pZCB0ZXN0RW1wdHlOYW1lUmVmZXJlbmNlQWZ0ZXJQbHVzKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIFggewkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCVxuIiArCi0JCSIJCTEgKyAJCQkJCQkJCVxuIiArCi0JCSIJCQkJCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIjEgKyIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTmFtZTo+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIFgge1xuIiArIAotCQkiICBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTo+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIGVtcHR5IG5hbWUgcmVmZXJlbmNlIGFmdGVyICsgb3BlcmF0b3I+IgotCSk7Ci19Ci0vKgotICogQ29tcGxldGlvbiBvbiBhbiBlbXB0eSBuYW1lIHJlZmVyZW5jZSBpbiBhbiBhcnJheSBkaW1lbnNpb24uIAotICovCi1wdWJsaWMgdm9pZCB0ZXN0RW1wdHlOYW1lUmVmZXJlbmNlSW5BcnJheURpbSgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBYIHsJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQlcbiIgKwotCQkiCQlpbnRbXQkJCQkJCQkJXG4iICsKLQkJIgkJCQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiaW50WyIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTmFtZTo+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIFgge1xuIiArIAotCQkiICBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTo+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIGVtcHR5IG5hbWUgcmVmZXJlbmNlIGluIGFycmF5IGRpbT4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0aW9uIG9uIGFuIGVtcHR5IG5hbWUgcmVmZXJlbmNlIGluIGlubmVyIGNsYXNzLiAKLSAqLwotcHVibGljIHZvaWQgdGVzdEVtcHR5TmFtZVJlZmVyZW5jZUluSW5uZXJDbGFzcygpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBYIHsJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQlcbiIgKwotCQkiCQljbGFzcyBZIHsJCQkJCQkJXG4iICsKLQkJIgkJCXZvaWQgYmFyKCkgewkJCQkJXG4iICsKLQkJIgkJCQkJCQkJCQkJXG4iICsKLQkJIgkJCX0JCQkJCQkJCVxuIiArCi0JCSIJCX0JCQkJCQkJCQlcbiIgKwotCQkiCQkJCQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJcbgkJCQkiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk5hbWU6PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBYIHtcbiIgKyAKLQkJIiAgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIGNsYXNzIFkge1xuIiArIAotCQkiICAgICAgWSgpIHtcbiIgKyAKLQkJIiAgICAgIH1cbiIgKyAKLQkJIiAgICAgIHZvaWQgYmFyKCkge1xuIiArIAotCQkiICAgICAgICA8Q29tcGxldGVPbk5hbWU6PjtcbiIgKyAKLQkJIiAgICAgIH1cbiIgKyAKLQkJIiAgICB9O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIGVtcHR5IG5hbWUgcmVmZXJlbmNlIGluIGlubmVyIGNsYXNzPiIKLQkpOwotfQotLyoKLSAqIENvbXBsZXRpb24gaW4gdGhlIHN0YXRlbWVudCBmb2xsb3dpbmcgYW4gaWYgZXhwcmVzc2lvbi4gCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RJbklmVGhlblN0YXRlbWVudCgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJXG4iICsKLQkJIgkJaWYgKGJhcigpKSAJCQkJCQkJXG4iICsKLQkJIgkJCQkJCQkJCQkJXG4iICsKLQkJIgkJCQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiXG4JCQkiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk5hbWU6PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6PjtcbiIgKwotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIGluIGlmIHRoZW4gc3RhdGVtZW50PiIKLQkpOwotfQotLyoKLSAqIENvbXBsZXRpb24gb24gYSBuYW1lIHJlZmVyZW5jZSBpbnNpZGUgYW4gaW5uZXIgY2xhc3MgaW4gYSBmaWVsZCBpbml0aWFsaXplci4gCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RJbm5lckNsYXNzRmllbGRJbml0aWFsaXplcigpIHsKLQl0aGlzLnJ1blRlc3RDaGVja0RpZXRQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCVxuIiArCi0JCSIJT2JqZWN0IG8gPSBuZXcgT2JqZWN0KCkgewkJCQlcbiIgKwotCQkiCQl2b2lkIGZvbygpIHsJCQkJCQlcbiIgKwotCQkiCQkJeHl6CQkJCQkJCQlcbiIgKwotCQkiCQl9CQkJCQkJCQkJXG4iICsKLQkJIgl9OwkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJInh5eiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTmFtZTp4eXo+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsKLQkJIiAgT2JqZWN0IG8gPSBuZXcgT2JqZWN0KCkge1xuIiArCi0JCSIgICAgKCkge1xuIiArIAotCQkiICAgICAgc3VwZXIoKTtcbiIgKwotCQkiICAgIH1cbiIgKyAKLQkJIiAgICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgICAgPENvbXBsZXRlT25OYW1lOnh5ej47XG4iICsKLQkJIiAgICB9XG4iICsKLQkJIiAgfTtcbiIgKwotCQkiICBCYXIoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkieHl6IiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJInh5eiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIG5hbWUgcmVmZXJlbmNlIGluIGlubmVyIGNsYXNzIGluIGZpZWxkIGluaXRpYWxpemVyPiIKLQkpOwotfQotLyoKLSAqIENvbXBsZXRpb24gb24gYW4gZW1wdHkgbmFtZSByZWZlcmVuY2UgaW5zaWRlIGFuIGludm9jYXRpb24gaW4gYSBmaWVsZCBpbml0aWFsaXplci4gCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RJbnZvY2F0aW9uRmllbGRJbml0aWFsaXplcigpIHsKLQl0aGlzLnJ1blRlc3RDaGVja0RpZXRQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCVxuIiArCi0JCSIJU3RyaW5nIHMgPSBmcmVkKDEgKyApOwkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiKDEgKyAiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk5hbWU6PiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArCi0JCSIgIFN0cmluZyBzID0gKDEgKyA8Q29tcGxldGVPbk5hbWU6Pik7XG4iICsKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSIiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiIiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gZW1wdHkgbmFtZSByZWZlcmVuY2UgaW4gaW52b2NhdGlvbiBpbiBmaWVsZCBpbml0aWFsaXplcj4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0aW9uIGluc2lkZSBhbiBhbm9ueW1vdXMgaW5uZXIgY2xhc3Mgd2hpY2ggaXMKLSAqIGluc2lkZSBhIG1ldGhvZCBpbnZvY2F0aW9uIHdpdGggcmVjZWl2ZXIuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJbnZvY2F0aW9uQW5vbnltb3VzSW5uZXJDbGFzcygpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6IAotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQkJXG4iICsKLQkJIgkJcHJpbWFyeSgpLmJpenooCQkJCQkJCVxuIiArCi0JCSIJCQluZXcgWCgpIHsJCQkJCQkJXG4iICsKLQkJIgkJCQl2b2lkIGZ1enooKSB7CQkJCQlcbiIgKwotCQkiCQkJCQl4LnkuegkJCQkJCVxuIiArCi0JCSIJCQkJfQkJCQkJCQkJXG4iICsKLQkJIgkJCX0JCQkJCQkJCQlcbiIJKwkJCQotCQkiCQkpOwkJCQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJInguIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25OYW1lOnguPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgbmV3IFgoKSB7XG4iICsgCi0JCSIgICAgICAoKSB7XG4iICsgCi0JCSIgICAgICB9XG4iICsgCi0JCSIgICAgICB2b2lkIGZ1enooKSB7XG4iICsgCi0JCSIgICAgICAgIDxDb21wbGV0ZU9uTmFtZTp4Lj47XG4iICsgCi0JCSIgICAgICB9XG4iICsgCi0JCSIgICAgfTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIiIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJ4LiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIGluc2lkZSBhbm9ueW1vdXMgaW5uZXIgY2xhc3MgaW5zaWRlIG1ldGhvZCBpbnZvY2F0aW9uIDE+IgotCSk7Ci19Ci0vKgotICogQ29tcGxldGlvbiBvbiBhIHF1YWxpZmllZCBuYW1lIHJlZmVyZW5jZSwgd2hlcmUgdGhlIGN1cnNvciBpcyBpbiB0aGUgCi0gKiBmaXJzdCB0eXBlIHJlZmVyZW5jZS4gCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RRdWFsaWZpZWROYW1lUmVmZXJlbmNlU2hyaW5rQWxsKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciB7CQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQlcbiIgKwotCQkiCQlpbnQgaSA9IDA7CQkJCQkJCVxuIiArCi0JCSIJCWEuYi5jLlh4eCBvID0gbmV3IFkoaSk7CQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSIJCWEiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk5hbWU6YT4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgaW50IGk7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmE+O1xuIiArCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJhIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJImEiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBxdWFsaWZpZWQgbmFtZSByZWZlcmVuY2UgKHNocmluayBhbGwpPiIKLQkpOwotfQotLyoKLSAqIENvbXBsZXRpb24gb24gYSBxdWFsaWZpZWQgbmFtZSByZWZlcmVuY2UsIHdoZXJlIHRoZSBjdXJzb3IgaXMgcmlnaHQgYWZ0ZXIgdGhlIGZpcnN0IGRvdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdFF1YWxpZmllZE5hbWVSZWZlcmVuY2VTaHJpbmtBbGxCdXRPbmUoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OiAKLQkJImNsYXNzIEJhciB7CQkJCQkJCQkJXG4iICsKLQkJIglzdGF0aWMgQmFyIHg7CQkJCQkJCQlcbiIgKwotCQkiCXB1YmxpYyBjbGFzcyBJbm5lckJhciB7CQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkiCXB1YmxpYyBjbGFzcyBTdWJJbm5lckJhciBleHRlbmRzIElubmVyQmFyIHsJXG4iICsKLQkJIgkJU3ViSW5uZXJCYXIoKSB7CQkJCQkJCVxuIiArCi0JCSIJCQlCYXIueC54LnN1cGVyKCk7CQkJCQlcbiIgKwotCQkiCQl9CQkJCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiQmFyLiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTmFtZTpCYXIuPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArCi0JCSIgIHB1YmxpYyBjbGFzcyBJbm5lckJhciB7XG4iICsKLQkJIiAgICBwdWJsaWMgSW5uZXJCYXIoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsKLQkJIiAgcHVibGljIGNsYXNzIFN1YklubmVyQmFyIGV4dGVuZHMgSW5uZXJCYXIge1xuIiArCi0JCSIgICAgU3ViSW5uZXJCYXIoKSB7XG4iICsgCi0JCSIgICAgICBzdXBlcigpO1xuIiArIAotCQkiICAgICAgPENvbXBsZXRlT25OYW1lOkJhci4+O1xuIiArCi0JCSIgICAgfVxuIiArCi0JCSIgIH1cbiIgKyAKLQkJIiAgc3RhdGljIEJhciB4O1xuIiArIAotCQkiICA8Y2xpbml0PigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSIiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiQmFyLiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIHF1YWxpZmllZCBuYW1lIHJlZmVyZW5jZSAoc2hyaW5rIGFsbCBidXQgb25lKT4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0aW9uIG9uIGEgcXVhbGlmaWVkIG5hbWUgcmVmZXJlbmNlLCB3aGVyZSB0aGUgY3Vyc29yIGlzIHJpZ2h0IGFmdGVyIHRoZSBmaXJzdCBkb3QuIAotICovCi1wdWJsaWMgdm9pZCB0ZXN0UXVhbGlmaWVkTmFtZVJlZmVyZW5jZVNocmlua0FsbEJ1dE9uZTIoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCVxuIiArCi0JCSIJCWludCBpID0gMDsJCQkJCQkJXG4iICsKLQkJIgkJYS5iLmMuWCBvID0gbmV3IFkoaSk7CQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSIJCWEuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25OYW1lOmEuPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICBpbnQgaTtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6YS4+O1xuIiArCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSIiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiYS4iLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBxdWFsaWZpZWQgbmFtZSByZWZlcmVuY2UgKHNocmluayBhbGwgYnV0IG9uZSkgMj4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0aW9uIG9uIGEgcXVhbGlmaWVkIG5hbWUgcmVmZXJlbmNlLHdoZXJlIHRoZSBjdXJzb3IgaXMgcmlnaHQgYWZ0ZXIgdGhlIGVuZCAKLSAqIG9mIHRoZSBsYXN0IG5hbWUgcmVmZXJlbmNlLiAgCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RRdWFsaWZpZWROYW1lUmVmZXJlbmNlU2hyaW5rTm9uZSgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6IAotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQlcbiIgKwotCQkiCXN0YXRpYyBCYXIgeDsJCQkJCQkJCVxuIiArCi0JCSIJcHVibGljIGNsYXNzIElubmVyQmFyIHsJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSIJcHVibGljIGNsYXNzIFN1YklubmVyQmFyIGV4dGVuZHMgSW5uZXJCYXIgewlcbiIgKwotCQkiCQlTdWJJbm5lckJhcigpIHsJCQkJCQkJXG4iICsKLQkJIgkJCUJhci54Lnguc3VwZXIoKTsJCQkJCVxuIiArCi0JCSIJCX0JCQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJCYXIueC54IiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25OYW1lOkJhci54Lng+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIHB1YmxpYyBjbGFzcyBJbm5lckJhciB7XG4iICsgCi0JCSIgICAgcHVibGljIElubmVyQmFyKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgY2xhc3MgU3ViSW5uZXJCYXIgZXh0ZW5kcyBJbm5lckJhciB7XG4iICsgCi0JCSIgICAgU3ViSW5uZXJCYXIoKSB7XG4iICsgCi0JCSIgICAgICBzdXBlcigpO1xuIiArIAotCQkiICAgICAgPENvbXBsZXRlT25OYW1lOkJhci54Lng+O1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBzdGF0aWMgQmFyIHg7XG4iICsgCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIngiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiQmFyLngueCIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIHF1YWxpZmllZCBuYW1lIHJlZmVyZW5jZSAoc2hyaW5rIG5vbmUpPiIKLQkpOwotfQotLyoKLSAqIENvbXBsZXRpb24gb24gYSBxdWFsaWZpZWQgbmFtZSByZWZlcmVuY2UsIHdoZXJlIHRoZSBjdXJzb3IgaXMgcmlnaHQgYWZ0ZXIgdGhlIGVuZCAKLSAqIG9mIHRoZSBsYXN0IHR5cGUgcmVmZXJlbmNlLiAKLSAqLwotcHVibGljIHZvaWQgdGVzdFF1YWxpZmllZE5hbWVSZWZlcmVuY2VTaHJpbmtOb25lMigpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJXG4iICsKLQkJIgkJaW50IGkgPSAwOwkJCQkJCQlcbiIgKwotCQkiCQlhLmIuYy5YeHggbyA9IG5ldyBZKGkpOwkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiWCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTmFtZTphLmIuYy5YPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICBpbnQgaTtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6YS5iLmMuWD47XG4iICsKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIlgiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiYS5iLmMuWHh4IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gcXVhbGlmaWVkIG5hbWUgcmVmZXJlbmNlIChzaHJpbmsgbm9uZSkgMj4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0aW9uIG9uIGEgcXVhbGlmaWVkIG5hbWUgcmVmZXJlbmNlLCB3aGVyZSB0aGUgY3Vyc29yIGlzIHJpZ2h0IGFmdGVyIHRoZSAKLSAqIGxhc3QgZG90LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UXVhbGlmaWVkTmFtZVJlZmVyZW5jZVNocmlua09uZSgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6IAotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQlcbiIgKwotCQkiCXN0YXRpYyBCYXIgeDsJCQkJCQkJCVxuIiArCi0JCSIJcHVibGljIGNsYXNzIElubmVyQmFyIHsJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSIJcHVibGljIGNsYXNzIFN1YklubmVyQmFyIGV4dGVuZHMgSW5uZXJCYXIgewlcbiIgKwotCQkiCQlTdWJJbm5lckJhcigpIHsJCQkJCQkJXG4iICsKLQkJIgkJCUJhci54Lnguc3VwZXIoKTsJCQkJCVxuIiArCi0JCSIJCX0JCQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJCYXIueC4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk5hbWU6QmFyLnguPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArCi0JCSIgIHB1YmxpYyBjbGFzcyBJbm5lckJhciB7XG4iICsKLQkJIiAgICBwdWJsaWMgSW5uZXJCYXIoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsKLQkJIiAgcHVibGljIGNsYXNzIFN1YklubmVyQmFyIGV4dGVuZHMgSW5uZXJCYXIge1xuIiArCi0JCSIgICAgU3ViSW5uZXJCYXIoKSB7XG4iICsgCi0JCSIgICAgICBzdXBlcigpO1xuIiArIAotCQkiICAgICAgPENvbXBsZXRlT25OYW1lOkJhci54Lj47XG4iICsKLQkJIiAgICB9XG4iICsKLQkJIiAgfVxuIiArIAotCQkiICBzdGF0aWMgQmFyIHg7XG4iICsgCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIiIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJCYXIueC4iLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBxdWFsaWZpZWQgbmFtZSByZWZlcmVuY2UgKHNocmluayBvbmUpPiIKLQkpOwotfQotLyoKLSAqIENvbXBsZXRpb24gb24gYSBxdWFsaWZpZWQgbmFtZSByZWZlcmVuY2UsIHdoZXJlIHRoZSBjdXJzb3IgaXMgcmlnaHQgYWZ0ZXIgdGhlIAotICogbGFzdCBkb3QuIAotICovCi1wdWJsaWMgdm9pZCB0ZXN0UXVhbGlmaWVkTmFtZVJlZmVyZW5jZVNocmlua09uZTIoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCVxuIiArCi0JCSIJCWludCBpID0gMDsJCQkJCQkJXG4iICsKLQkJIgkJYS5iLmMuWCBvID0gbmV3IFkoaSk7CQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJhLmIuYy4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk5hbWU6YS5iLmMuPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICBpbnQgaTtcbiIgKyAKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6YS5iLmMuPjtcbiIgKwotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJImEuYi5jLiIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIHF1YWxpZmllZCBuYW1lIHJlZmVyZW5jZSAoc2hyaW5rIG9uZSkgMj4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0aW9uIG9uIGEgcXVhbGlmaWVkIG5hbWUgcmVmZXJlbmNlIHRoYXQgY29udGFpbnMgYSB1bmljb2RlLiAKLSAqLwotcHVibGljIHZvaWQgdGVzdFVuaWNvZGUoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgWCB7CQkJCQlcbiIgKyAKLQkJIgl2b2lkIGZvbygpIHsJCQlcbiIgKyAKLQkJIgkJYmFyLlxcdTAwNWF4IAkJXG4iICsKLQkJIgl9CQkJCQkJXG4iICsgCi0JCSJ9CQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJ4IiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25OYW1lOmJhci5aeD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgWCB7XG4iICsgCi0JCSIgIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOmJhci5aeD47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJaeCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJiYXIuXFx1MDA1YXgiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiB1bmljb2RlPiIKLQkpOwotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3BhcnNlci9SZWZlcmVuY2VUeXBlQ29tcGxldGlvblRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvUmVmZXJlbmNlVHlwZUNvbXBsZXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZTM2NTUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3BhcnNlci9SZWZlcmVuY2VUeXBlQ29tcGxldGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci5wYXJzZXI7Ci0KLS8qKgotICogQ29tcGxldGlvbiBpcyBleHBlY3RlZCB0byBiZSBhIFJlZmVyZW5jZVR5cGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VUeXBlQ29tcGxldGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdENvbXBsZXRpb25UZXN0IHsKLXB1YmxpYyBSZWZlcmVuY2VUeXBlQ29tcGxldGlvblRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0Jc3VwZXIodGVzdE5hbWUpOwotfQotLyoKLSAqIFJlZ3Jlc3Npb24gdGVzdCBmb3IgMUZUWkNJRy4gCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QxRlRaQ0lHKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciB7CQkJCQkJCQlcbiIgKyAKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJXG4iICsKLQkJIgkJbmV3IFgoKSB7CQkJCQkJCVxuIiArCi0JCSIJCQlwcm90ZWN0ZWQgdm9pZCBiYXIoKSB7CQkJXG4iICsKLQkJIgkJCX0JCQkJCQkJCVxuIiArCi0JCSIJCX0JCQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJwIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25UeXBlOnA+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsKLQkJIiAgQmFyKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIG5ldyBYKCkge1xuIiArCi0JCSIgICAgICA8Q29tcGxldGVPblR5cGU6cD47XG4iICsKLQkJIiAgICAgICgpIHtcbiIgKyAKLQkJIiAgICAgIH1cbiIgKyAKLQkJIiAgICAgIHZvaWQgYmFyKCkge1xuIiArCi0JCSIgICAgICB9XG4iICsKLQkJIiAgICB9O1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJInAiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkicHJvdGVjdGVkIiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8MUZUWkNJRz4iCi0JKTsKLX0KLS8qCi0gKiBCbG9jayA6Oj0gT3BlbkJsb2NrICd7JyA8QmxvY2tTdGF0ZW1lbnRzb3B0PiAnfScgIAotICovCi1wdWJsaWMgdm9pZCB0ZXN0QmxvY2soKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCVxuIiArCi0JCSIJCXRyeSB7CQkJCQkJCQlcbiIgKwotCQkiCQkJWHh4IG8gPSBuZXcgWSgpOwkJCQlcbiIgKwotCQkiCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewkJCQlcbiIJKwotCQkiCQl9CQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiWCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTmFtZTpYPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAge1xuIiArIAotCQkiICAgICAgPENvbXBsZXRlT25OYW1lOlg+O1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIlgiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiWHh4IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gYmxvY2s+IgotCSk7Ci19Ci0vKgotICogQmxvY2tTdGF0ZW1lbnRzIDo6PSBCbG9ja1N0YXRlbWVudHMgPEJsb2NrU3RhdGVtZW50PiAKLSAqLwotcHVibGljIHZvaWQgdGVzdEJsb2NrU3RhdGVtZW50cygpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJXG4iICsKLQkJIgkJaW50IGkgPSAwOwkJCQkJCQlcbiIgKwotCQkiCQlYeHggbyA9IG5ldyBZKCk7CQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25OYW1lOlg+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIGludCBpO1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOlg+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiWCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJYeHgiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBibG9jayBzdGF0ZW1lbnRzPiIKLQkpOwotfQotLyoKLSAqIENhdGNoQ2xhdXNlIDo6PSAnY2F0Y2gnICcoJyA8Rm9ybWFsUGFyYW1ldGVyPiAnKScgQmxvY2sgIAotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q2F0Y2hDbGF1c2UxKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciB7CQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQlcbiIgKwotCQkiCQl0cnkgewkJCQkJCQkJXG4iICsKLQkJIgkJCWZyZWQoKTsJCQkJCQkJXG4iICsKLQkJIgkJfSBjYXRjaCAoWHh4IGUpIHsJCQkJCVxuIgkrCi0JCSIJCX0JCQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25FeGNlcHRpb246WD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25FeGNlcHRpb246WD47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIlh4eCIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIGNhdGNoIGNsYXVzZSAxPiIKLQkpOwotfQotLyoKLSAqIENhdGNoQ2xhdXNlIDo6PSAnY2F0Y2gnICcoJyA8Rm9ybWFsUGFyYW1ldGVyPiAnKScgQmxvY2sgIAotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q2F0Y2hDbGF1c2UyKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciB7CQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQlcbiIgKwotCQkiCQl0cnkgewkJCQkJCQkJXG4iICsKLQkJIgkJCWZyZWQoKTsJCQkJCQkJXG4iICsKLQkJIgkJfSBjYXRjaCAoZmluYWwgWHh4IGUpIHsJCQkJXG4iCSsKLQkJIgkJfQkJCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIlgiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbkV4Y2VwdGlvbjpYPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbkV4Y2VwdGlvbjpYPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIlgiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiWHh4IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gY2F0Y2ggY2xhdXNlIDI+IgotCSk7Ci19Ci0vKgotICogQ2F0Y2hDbGF1c2UgOjo9ICdjYXRjaCcgJygnIDxGb3JtYWxQYXJhbWV0ZXI+ICcpJyBCbG9jayAgCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDYXRjaENsYXVzZTMoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCVxuIiArCi0JCSIJCXRyeSB7CQkJCQkJCQlcbiIgKwotCQkiCQkJZnJlZCgpOwkJCQkJCQlcbiIgKwotCQkiCQl9IGNhdGNoICh4LnkuWHh4IGUpIHsJCQkJXG4iCSsKLQkJIgkJfQkJCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIngueS5YIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25FeGNlcHRpb246eC55Llg+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uRXhjZXB0aW9uOngueS5YPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIlgiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkieC55Llh4eCIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIGNhdGNoIGNsYXVzZSAzPiIKLQkpOwotfQotLyoKLSAqIENsYXNzQm9keSA6Oj0gJ3snIDxDbGFzc0JvZHlEZWNsYXJhdGlvbnNvcHQ+ICd9JyAKLSAqLwotcHVibGljIHZvaWQgdGVzdENsYXNzQm9keSgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja0RpZXRQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCVxuIiArIAotCQkiCVh4eCBmb28oKSB7CQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25UeXBlOlg+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgPENvbXBsZXRlT25UeXBlOlg+XG4iICsKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIlh4eCIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uICBjbGFzcyBib2R5PiIKLQkpOwotfQotLyoKLSAqIENsYXNzQm9keURlY2xhcmF0aW9ucyA6Oj0gQ2xhc3NCb2R5RGVjbGFyYXRpb25zIDxDbGFzc0JvZHlEZWNsYXJhdGlvbj4gCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDbGFzc0JvZHlEZWNsYXJhdGlvbnMoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tEaWV0UGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciB7CQkJCQkJCQlcbiIgKwotCQkiCWludCBpID0gMDsJCQkJCQkJCVxuIiArCi0JCSIJWHh4IGZvbygpIHsJCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIlgiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPblR5cGU6WD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgaW50IGk7XG4iICsKLQkJIiAgQmFyKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICA8Q29tcGxldGVPblR5cGU6WD5cbiIgKwotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIlgiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiWHh4IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gIGNsYXNzIGJvZHkgZGVjbGFyYXRpb25zPiIKLQkpOwotfQotLyoKLSAqIENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gOjo9ICduZXcnIDxDbGFzc1R5cGU+ICcoJyBBcmd1bWVudExpc3RvcHQgJyknIENsYXNzQm9keW9wdCAKLSAqLwotcHVibGljIHZvaWQgdGVzdENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24xKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciB7CQkJCQkJCQlcbiIgKyAKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJXG4iICsKLQkJIgkJbmV3IFh4eCgpLnp6eigpOwkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCVxuIiArCi0JCSJ9XG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIlgiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPblR5cGU6WD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIG5ldyA8Q29tcGxldGVPblR5cGU6WD4oKTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIlgiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiWHh4IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24gZXhwcmVzc2lvbiAxPiIKLQkpOwotfQotLyoKLSAqIENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gOjo9ICduZXcnIDxDbGFzc1R5cGU+ICcoJyBBcmd1bWVudExpc3RvcHQgJyknIENsYXNzQm9keW9wdCAKLSAqLwotcHVibGljIHZvaWQgdGVzdENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24yKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciB7CQkJCQkJCQlcbiIgKyAKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJXG4iICsKLQkJIgkJbmV3IFkobmV3IFh4eCgpKS56enooKTsJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCVxuIiArCi0JCSJ9XG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIlgiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPblR5cGU6WD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIG5ldyBZKG5ldyA8Q29tcGxldGVPblR5cGU6WD4oKSk7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIlh4eCIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIGNsYXNzIGluc3RhbmNlIGNyZWF0aW9uIGV4cHJlc3Npb24gMj4iCi0JKTsKLX0KLS8qCi0gKiBDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIDo6PSAnbmV3JyA8Q2xhc3NUeXBlPiAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJyBDbGFzc0JvZHlvcHQgCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uMygpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJXG4iICsgCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCVxuIiArCi0JCSIJCW5ldyBZKDEsIHRydWUsIG5ldyBYeHgoKSkuenp6KCk7CVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25UeXBlOlg+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBuZXcgWSgxLCB0cnVlLCBuZXcgPENvbXBsZXRlT25UeXBlOlg+KCkpO1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiWCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJYeHgiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiBleHByZXNzaW9uIDM+IgotCSk7Ci19Ci0vKgotICogQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gJ25ldycgPENsYXNzVHlwZT4gJygnIEFyZ3VtZW50TGlzdG9wdCAnKScgQ2xhc3NCb2R5b3B0IAotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbjQoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCVxuIiArIAotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQlcbiIgKwotCQkiCQlmcmVkKCkubmV3IFkobmV3IFh4eCgpKS56enooKTsJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25UeXBlOlg+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIiAgICBmcmVkKCkubmV3IFkobmV3IDxDb21wbGV0ZU9uVHlwZTpYPigpKTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIlgiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiWHh4IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24gZXhwcmVzc2lvbiA0PiIKLQkpOwotfQotLyoKLSAqIENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gOjo9IENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25OYW1lICduZXcnIFNpbXBsZU5hbWUgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScgQ2xhc3NCb2R5b3B0Ci0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uTmFtZTEoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkicHVibGljIGNsYXNzIEJhciB7CQkJCQkJCQlcbiIgKwotCQkiCXN0YXRpYyBCYXIgYmF6OwkJCQkJCQkJXG4iICsKLQkJIglwdWJsaWMgY2xhc3MgWCB7CQkJCQkJCVxuIiArCi0JCSIJCXZvaWQgZm9vKCkgewkJCQkJCQlcbiIgKwotCQkiCQkJQmFyLmJhei5uZXcgWHh4KCk7CQkJCQlcbiIgKwotCQkiCQl9CQkJCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkibmV3IFgiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPblR5cGU6WD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkicHVibGljIGNsYXNzIEJhciB7XG4iICsgCi0JCSIgIHB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICAgIEJhci5iYXoubmV3IDxDb21wbGV0ZU9uVHlwZTpYPigpO1xuIiArCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHN0YXRpYyBCYXIgYmF6O1xuIiArCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICBwdWJsaWMgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiWCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJYeHgiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiBleHByZXNzaW9uIHdpdGggbmFtZSAxPiIKLQkpOwotfQotLyoKLSAqIENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gOjo9IENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25OYW1lICduZXcnIFNpbXBsZU5hbWUgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScgQ2xhc3NCb2R5b3B0Ci0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uTmFtZTIoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkicHVibGljIGNsYXNzIEJhciB7CQkJCQkJCQlcbiIgKwotCQkiCXN0YXRpYyBCYXIgYmF6OwkJCQkJCQkJXG4iICsKLQkJIglwdWJsaWMgY2xhc3MgWCB7CQkJCQkJCVxuIiArCi0JCSIJCXZvaWQgZm9vKCkgewkJCQkJCQlcbiIgKwotCQkiCQkJbmV3IFkoQmFyLmJhei5uZXcgWHh4KCkpOwkJCVxuIiArCi0JCSIJCX0JCQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJuZXcgWCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uVHlwZTpYPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJwdWJsaWMgY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgcHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICAgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgICAgbmV3IFkoQmFyLmJhei5uZXcgPENvbXBsZXRlT25UeXBlOlg+KCkpO1xuIiArCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHN0YXRpYyBCYXIgYmF6O1xuIiArCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICBwdWJsaWMgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiWCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJYeHgiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiBleHByZXNzaW9uIHdpdGggbmFtZSAyPiIKLQkpOwotfQotLyoKLSAqIENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gOjo9IENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25OYW1lICduZXcnIFNpbXBsZU5hbWUgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScgQ2xhc3NCb2R5b3B0Ci0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uTmFtZTMoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkicHVibGljIGNsYXNzIEJhciB7CQkJCQkJCQlcbiIgKwotCQkiCXN0YXRpYyBCYXIgYmF6OwkJCQkJCQkJXG4iICsKLQkJIglwdWJsaWMgY2xhc3MgWCB7CQkJCQkJCVxuIiArCi0JCSIJCXZvaWQgZm9vKCkgewkJCQkJCQlcbiIgKwotCQkiCQkJbmV3IFkoMSwgdHJ1ZSwgQmFyLmJhei5uZXcgWHh4KCkpOwlcbiIgKwotCQkiCQl9CQkJCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkibmV3IFgiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPblR5cGU6WD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkicHVibGljIGNsYXNzIEJhciB7XG4iICsgCi0JCSIgIHB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICAgIG5ldyBZKDEsIHRydWUsIEJhci5iYXoubmV3IDxDb21wbGV0ZU9uVHlwZTpYPigpKTtcbiIgKwotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBzdGF0aWMgQmFyIGJhejtcbiIgKwotCQkiICA8Y2xpbml0PigpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgcHVibGljIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIlgiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiWHh4IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24gZXhwcmVzc2lvbiB3aXRoIG5hbWUgMz4iCi0JKTsKLX0KLS8qCi0gKiBDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIDo6PSBDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uTmFtZSAnbmV3JyBTaW1wbGVOYW1lICcoJyBBcmd1bWVudExpc3RvcHQgJyknIENsYXNzQm9keW9wdAotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbk5hbWU0KCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJInB1YmxpYyBjbGFzcyBCYXIgewkJCQkJCQkJXG4iICsKLQkJIglzdGF0aWMgQmFyIGJhejsJCQkJCQkJCVxuIiArCi0JCSIJcHVibGljIGNsYXNzIFggewkJCQkJCQlcbiIgKwotCQkiCQl2b2lkIGZvbygpIHsJCQkJCQkJXG4iICsKLQkJIgkJCWZyZWQoKS5uZXcgWShCYXIuYmF6Lm5ldyBYeHgoKSk7CQlcbiIgKwotCQkiCQl9CQkJCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkibmV3IFgiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPblR5cGU6WD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkicHVibGljIGNsYXNzIEJhciB7XG4iICsgCi0JCSIgIHB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICAgIGZyZWQoKS5uZXcgWShCYXIuYmF6Lm5ldyA8Q29tcGxldGVPblR5cGU6WD4oKSk7XG4iICsKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgc3RhdGljIEJhciBiYXo7XG4iICsKLQkJIiAgPGNsaW5pdD4oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHB1YmxpYyBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIlh4eCIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIGNsYXNzIGluc3RhbmNlIGNyZWF0aW9uIGV4cHJlc3Npb24gd2l0aCBuYW1lIDQ+IgotCSk7Ci19Ci0vKgotICogQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gUHJpbWFyeSAnLicgJ25ldycgU2ltcGxlTmFtZSAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJyBDbGFzc0JvZHlvcHQKLSAqLwotcHVibGljIHZvaWQgdGVzdENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25QcmltYXJ5MSgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJwdWJsaWMgY2xhc3MgQmFyIHsJCQkJCQkJCVxuIiArCi0JCSIJcHVibGljIGNsYXNzIFggewkJCQkJCQlcbiIgKwotCQkiCQl2b2lkIGZvbygpIHsJCQkJCQkJXG4iICsKLQkJIgkJCW5ldyBCYXIoKS5uZXcgWHh4KCk7CQkJCVxuIiArCi0JCSIJCX0JCQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJuZXcgWCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uVHlwZTpYPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJwdWJsaWMgY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgcHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICAgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgICAgbmV3IEJhcigpLm5ldyA8Q29tcGxldGVPblR5cGU6WD4oKTtcbiIgKwotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiWCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJYeHgiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiBleHByZXNzaW9uIHdpdGggcHJpbWFyeSAxPiIKLQkpOwotfQotLyoKLSAqIENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gOjo9IFByaW1hcnkgJy4nICduZXcnIFNpbXBsZU5hbWUgJygnIEFyZ3VtZW50TGlzdG9wdCAnKScgQ2xhc3NCb2R5b3B0Ci0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uUHJpbWFyeTIoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkicHVibGljIGNsYXNzIEJhciB7CQkJCQkJCQlcbiIgKwotCQkiCXB1YmxpYyBjbGFzcyBYIHsJCQkJCQkJXG4iICsKLQkJIgkJdm9pZCBmb28oKSB7CQkJCQkJCVxuIiArCi0JCSIJCQluZXcgWShuZXcgQmFyKCkubmV3IFh4eCgpKTsJCQlcbiIgKwotCQkiCQl9CQkJCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkibmV3IFgiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPblR5cGU6WD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkicHVibGljIGNsYXNzIEJhciB7XG4iICsgCi0JCSIgIHB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgICAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICAgIG5ldyBZKG5ldyBCYXIoKS5uZXcgPENvbXBsZXRlT25UeXBlOlg+KCkpO1xuIiArCi0JCSIgICAgfVxuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHB1YmxpYyBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIlh4eCIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIGNsYXNzIGluc3RhbmNlIGNyZWF0aW9uIGV4cHJlc3Npb24gd2l0aCBwcmltYXJ5IDI+IgotCSk7Ci19Ci0vKgotICogQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA6Oj0gUHJpbWFyeSAnLicgJ25ldycgU2ltcGxlTmFtZSAnKCcgQXJndW1lbnRMaXN0b3B0ICcpJyBDbGFzc0JvZHlvcHQKLSAqLwotcHVibGljIHZvaWQgdGVzdENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25QcmltYXJ5MygpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJwdWJsaWMgY2xhc3MgQmFyIHsJCQkJCQkJCVxuIiArCi0JCSIJcHVibGljIGNsYXNzIFggewkJCQkJCQlcbiIgKwotCQkiCQl2b2lkIGZvbygpIHsJCQkJCQkJXG4iICsKLQkJIgkJCWZyZWQoKS5uZXcgWShuZXcgQmFyKCkubmV3IFh4eCgpKTsJXG4iICsKLQkJIgkJfQkJCQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIm5ldyBYIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25UeXBlOlg+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJInB1YmxpYyBjbGFzcyBCYXIge1xuIiArIAotCQkiICBwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgICAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICAgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgICBmcmVkKCkubmV3IFkobmV3IEJhcigpLm5ldyA8Q29tcGxldGVPblR5cGU6WD4oKSk7XG4iICsKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIlgiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiWHh4IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24gZXhwcmVzc2lvbiB3aXRoIHByaW1hcnkgMz4iCi0JKTsKLX0KLS8qCi0gKiBDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uIDo6PSBQcmltYXJ5ICcuJyAnbmV3JyBTaW1wbGVOYW1lICcoJyBBcmd1bWVudExpc3RvcHQgJyknIENsYXNzQm9keW9wdAotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvblByaW1hcnk0KCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJInB1YmxpYyBjbGFzcyBCYXIgewkJCQkJCQkJXG4iICsKLQkJIglwdWJsaWMgY2xhc3MgWCB7CQkJCQkJCVxuIiArCi0JCSIJCXZvaWQgZm9vKCkgewkJCQkJCQlcbiIgKwotCQkiCQkJbmV3IFkoMSwgdHJ1ZSwgbmV3IEJhcigpLm5ldyBYeHgoKSk7XG4iICsKLQkJIgkJfQkJCQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIm5ldyBYIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25UeXBlOlg+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJInB1YmxpYyBjbGFzcyBCYXIge1xuIiArIAotCQkiICBwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgICAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgICAgfVxuIiArIAotCQkiICAgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgICBuZXcgWSgxLCB0cnVlLCBuZXcgQmFyKCkubmV3IDxDb21wbGV0ZU9uVHlwZTpYPigpKTtcbiIgKwotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiWCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJYeHgiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiBleHByZXNzaW9uIHdpdGggcHJpbWFyeSA0PiIKLQkpOwotfQotLyoKLSAqIENsYXNzVHlwZUxpc3QgOjo9IENsYXNzVHlwZUxpc3QgJywnIDxDbGFzc1R5cGVFbHQ+IAotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q2xhc3NUeXBlTGlzdCgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja0RpZXRQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCVxuIiArIAotCQkiCXZvaWQgZm9vKCkgdGhyb3dzIEV4Y2VwdGlvbiwgWHh4IHsJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIlgiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbkV4Y2VwdGlvbjpYPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB0aHJvd3MgRXhjZXB0aW9uLCA8Q29tcGxldGVPbkV4Y2VwdGlvbjpYPiB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIlh4eCIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIGNsYXNzIHR5cGUgbGlzdD4iCi0JKTsKLX0KLS8qCi0gKiBDb25zdHJ1Y3RvckJvZHkgOjo9IE5lc3RlZE1ldGhvZCAneycgPEJsb2NrU3RhdGVtZW50c29wdD4gJ30nIAotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JCb2R5KCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciB7CQkJCQkJCQlcbiIgKwotCQkiCUJhcigpIHsJCQkJCQkJCQlcbiIgKwotCQkiCQlYeHggbyA9IG5ldyBZKCk7CQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25OYW1lOlg+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKwotCQkiICAgIHN1cGVyKCk7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6WD47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIlh4eCIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIGNvbnN0cnVjdG9yIGJvZHk+IgotCSk7Ci19Ci0vKgotICogQ29uc3RydWN0b3JEZWNsYXJhdG9yIDo6PSAnSWRlbnRpZmllcicgJygnIDxGb3JtYWxQYXJhbWV0ZXJMaXN0b3B0PiAnKScgCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvckRlY2xhcmF0b3IoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tEaWV0UGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciB7CQkJCQkJCQlcbiIgKwotCQkiCUJhcihYeHggbykgewkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25UeXBlOlg+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcig8Q29tcGxldGVPblR5cGU6WD4gbykge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiWCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJYeHgiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBjb25zdHJ1Y3RvciBkZWNsYXJhdG9yPiIKLQkpOwotfQotLyoKLSAqIFRoZSByZWZlcmVuY2UgdHlwZSBpcyBidXJyaWVkIGluIHNldmVyYWwgYmxvY2tzIAotICovCi1wdWJsaWMgdm9pZCB0ZXN0RGVlcFJlZmVyZW5jZSgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJXG4iICsgCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCVxuIiArCi0JCSIJCWlmIChhID09IDIpIHsJCQkJCQlcbiIgKwotCQkiCQl9CQkJCQkJCQkJXG4iICsKLQkJIgkJdHJ5IHsJCQkJCQkJCVxuIiArCi0JCSIJCX0gZmluYWxseSB7CQkJCQkJCVxuIiArCi0JCSIJCQlpZiAoMSA9PSBmZ2gpIHsJCQkJCVxuIiArCi0JCSIJCQkJWHh4IG8gPSBudWxsOwkJCQlcbiIgKwotCQkiCQkJfQkJCQkJCQkJXG4iICsKLQkJIgkJfQkJCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIlgiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk5hbWU6WD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIHtcbiIgKwotCQkiICAgICAge1xuIiArCi0JCSIgICAgICAgIDxDb21wbGV0ZU9uTmFtZTpYPjtcbiIgKwotCQkiICAgICAgfVxuIiArCi0JCSIgICAgfVxuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIlgiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiWHh4IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gZGVlcCB0eXBlPiIKLQkpOwotfQotLyoKLSAqIFN1cGVyIDo6PSAnZXh0ZW5kcycgPENsYXNzVHlwZT4gCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RFeHRlbmRzQ2xhc3MoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tEaWV0UGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciBleHRlbmRzIFh4eCB7CQkJCQlcbiIgKyAKLQkJIn0JCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25DbGFzczpYPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIgZXh0ZW5kcyA8Q29tcGxldGVPbkNsYXNzOlg+IHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiWCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJYeHgiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBleHRlbmRzPiIKLQkpOwotfQotLyoKLSAqIEV4dGVuZHNJbnRlcmZhY2VzIDo6PSAnZXh0ZW5kcycgPEludGVyZmFjZVR5cGVMaXN0PiAKLSAqLwotcHVibGljIHZvaWQgdGVzdEV4dGVuZHNJbnRlcmZhY2UoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tEaWV0UGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImludGVyZmFjZSBCYXIgZXh0ZW5kcyBYeHggewkJCQlcbiIgKyAKLQkJIn0JCQkJCQkJCQkJCVxuIiwgCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiWCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uSW50ZXJmYWNlOlg+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImludGVyZmFjZSBCYXIgZXh0ZW5kcyA8Q29tcGxldGVPbkludGVyZmFjZTpYPiB7XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiWCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJYeHgiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBleHRlbmRzPiIKLQkpOwotfQotLyoKLSAqIEZpZWxkRGVjbGFyYXRpb24gOjo9IE1vZGlmaWVyc29wdCA8VHlwZT4gVmFyaWFibGVEZWNsYXJhdG9ycyAnOycKLSAqIHdoZXJlIE1vZGlmaWVyc29wdCBpcyBub3QgZW1wdHkKLSAqLwotcHVibGljIHZvaWQgdGVzdEZpZWxkRGVjbGFyYXRpb25XaXRoTW9kaWZpZXJzKCkgewotCXRoaXMucnVuVGVzdENoZWNrRGlldFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJXG4iICsgCi0JCSIJcHVibGljIGZpbmFsIFh4eCBmb287CQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIlgiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPblR5cGU6WD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgPENvbXBsZXRlT25UeXBlOlg+O1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIlh4eCIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIGZpZWxkIGRlY2xhcmF0aW9uIHdpdGggbW9kaWZpZXJzPiIKLQkpOwotfQotLyoKLSAqIEZpZWxkRGVjbGFyYXRpb24gOjo9IE1vZGlmaWVyc29wdCA8VHlwZT4gVmFyaWFibGVEZWNsYXJhdG9ycyAnOycKLSAqIHdoZXJlIE1vZGlmaWVyc29wdCBpcyBlbXB0eQotICovCi1wdWJsaWMgdm9pZCB0ZXN0RmllbGREZWNsYXJhdGlvbldpdGhvdXRNb2RpZmllcnMoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tEaWV0UGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciB7CQkJCQkJCQlcbiIgKyAKLQkJIglYeHggZm9vOwkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25UeXBlOlg+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpYPjtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiWCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJYeHgiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBmaWVsZCBkZWNsYXJhdGlvbiB3aXRob3V0IG1vZGlmaWVycz4iCi0JKTsKLX0KLS8qCi0gKiBGb3JtYWxQYXJhbWV0ZXIgOjo9IE1vZGlmaWVycyA8VHlwZT4gVmFyaWFibGVEZWNsYXJhdG9ySWQgCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RGb3JtYWxQYXJhbWV0ZXIoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tEaWV0UGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciB7CQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKGZpbmFsIFh4eCB4KSB7CQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25UeXBlOlg+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbyhmaW5hbCA8Q29tcGxldGVPblR5cGU6WD4geCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiWCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJYeHgiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBmb3JtYWwgcGFyYW1ldGVyPiIKLQkpOwotfQotLyoKLSAqIEZvcm1hbFBhcmFtZXRlckxpc3QgOjo9IEZvcm1hbFBhcmFtZXRlckxpc3QgJywnIDxGb3JtYWxQYXJhbWV0ZXI+IAotICovCi1wdWJsaWMgdm9pZCB0ZXN0Rm9ybWFsUGFyYW1ldGVyTGlzdCgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja0RpZXRQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oaW50IGksIGZpbmFsIE9iamVjdCBvLCBYeHggeCkge1xuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIlgiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPblR5cGU6WD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKGludCBpLCBmaW5hbCBPYmplY3QgbywgPENvbXBsZXRlT25UeXBlOlg+IHgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIlgiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiWHh4IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gZm9ybWFsIHBhcmFtZXRlciBsaXN0PiIKLQkpOwotfQotLyoKLSAqIEZvclN0YXRlbWVudCA6Oj0gJ2ZvcicgJygnIDxGb3JJbml0b3B0PiAnOycgRXhwcmVzc2lvbm9wdCAnOycgRm9yVXBkYXRlb3B0ICcpJyBTdGF0ZW1lbnQKLSAqIG9yCi0gKiBGb3JTdGF0ZW1lbnROb1Nob3J0SWYgOjo9ICdmb3InICcoJyA8Rm9ySW5pdG9wdD4gJzsnIEV4cHJlc3Npb25vcHQgJzsnIEZvclVwZGF0ZW9wdCAnKScgU3RhdGVtZW50Tm9TaG9ydElmICAKLSAqLwotcHVibGljIHZvaWQgdGVzdEZvclN0YXRlbWVudCgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIgKwotCQkiCQlmb3IgKFh4eCBvID0gbmV3IFkoKTsgby5zaXplKCkgPCAxMDsgKSB7XG4iICsKLQkJIgkJfQkJCQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIlgiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbk5hbWU6WD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgPENvbXBsZXRlT25OYW1lOlg+O1xuIiArCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIlh4eCIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIGZvciBzdGF0ZW1lbnQ+IgotCSk7Ci19Ci0vKgotICogSW50ZXJmYWNlcyA6Oj0gJ2ltcGxlbWVudHMnIDxJbnRlcmZhY2VUeXBlTGlzdD4gCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RJbXBsZW1lbnRzKCkgewotCXRoaXMucnVuVGVzdENoZWNrRGlldFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgaW1wbGVtZW50cyBYeHggewkJCQkJXG4iICsgCi0JCSJ9CQkJCQkJCQkJCQlcbiIsIAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIlgiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbkludGVyZmFjZTpYPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIgaW1wbGVtZW50cyA8Q29tcGxldGVPbkludGVyZmFjZTpYPiB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIlgiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiWHh4IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gaW1wbGVtZW50cz4iCi0JKTsKLX0KLS8qCi0gKiBSZWxhdGlvbmFsRXhwcmVzc2lvbiA6Oj0gUmVsYXRpb25hbEV4cHJlc3Npb24gJ2luc3RhbmNlb2YnIDxSZWZlcmVuY2VUeXBlPgotICovCi1wdWJsaWMgdm9pZCB0ZXN0SW5zdGFuY2VPZigpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJCVxuIiArCi0JCSIJYm9vbGVhbiBmb28oKSB7CQkJCQkJCQlcbiIgKwotCQkiCQlyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIFh4eDsJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25UeXBlOlg+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBib29sZWFuIGZvbygpIHtcbiIgKwotCQkiICAgICh0aGlzIGluc3RhbmNlb2YgPENvbXBsZXRlT25UeXBlOlg+KTtcbiIgKwotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiWCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJYeHgiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBpbnN0YW5jZW9mPiIKLQkpOwotfQotLyoKLSAqIEludGVyZmFjZUJvZHkgOjo9ICd7JyA8SW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zb3B0PiAnfScgCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RJbnRlcmZhY2VCb2R5KCkgewotCXRoaXMucnVuVGVzdENoZWNrRGlldFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJpbnRlcmZhY2UgQmFyIHsJCQkJCQkJXG4iICsKLQkJIglYeHggZm9vKCk7CQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIlgiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPblR5cGU6WD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiaW50ZXJmYWNlIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICA8Q29tcGxldGVPblR5cGU6WD5cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIlh4eCIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIGludGVyZmFjZSBib2R5PiIKLQkpOwotfQotLyoKLSAqIEludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9ucyA6Oj0gSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zIDxJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbj4gCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RJbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnMoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tEaWV0UGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImludGVyZmFjZSBCYXIgewkJCQkJCQlcbiIgKwotCQkiCWludCBDT05TVEFOVCA9IDA7CQkJCQkJXG4iICsKLQkJIglYeHggZm9vKCk7CQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iLCAKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25UeXBlOlg+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImludGVyZmFjZSBCYXIge1xuIiArCi0JCSIgIGludCBDT05TVEFOVDtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIDxjbGluaXQ+KCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpYPlxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIlgiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiWHh4IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gaW50ZXJmYWNlIG1lbWJlciBkZWNsYXJhdGlvbnM+IgotCSk7Ci19Ci0vKgotICogSW50ZXJmYWNlVHlwZUxpc3QgOjo9IEludGVyZmFjZVR5cGVMaXN0ICcsJyA8SW50ZXJmYWNlVHlwZT4gCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RJbnRlcmZhY2VUeXBlTGlzdCgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja0RpZXRQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiaW50ZXJmYWNlIEJhciBleHRlbmRzIENvbXBhcmFibGUsIFh4eCB7CVxuIiArIAotCQkifQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIlgiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPbkludGVyZmFjZTpYPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJpbnRlcmZhY2UgQmFyIGV4dGVuZHMgQ29tcGFyYWJsZSwgPENvbXBsZXRlT25JbnRlcmZhY2U6WD4ge1xuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIlgiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiWHh4IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gaW50ZXJmYWNlIGxpc3Q+IgotCSk7Ci19Ci0vKgotICogTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uIDo6PSBNb2RpZmllcnMgPFR5cGU+IFZhcmlhYmxlRGVjbGFyYXRvcnMgCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb24oKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQkJXG4iICsKLQkJIgkJZmluYWwgWHh4IG8gPSBuZXcgWSgpOwkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIiwgCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiWCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uTmFtZTpYPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArIAotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICA8Q29tcGxldGVPbk5hbWU6WD47XG4iICsKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIlgiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiWHh4IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24+IgotCSk7Ci19Ci0vKgotICogTWV0aG9kQm9keSA6Oj0gTmVzdGVkTWV0aG9kICd7JyA8QmxvY2tTdGF0ZW1lbnRzb3B0PiAnfScgCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNZXRob2RCb2R5KCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciB7CQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQlcbiIgKwotCQkiCQlYeHggbyA9IG5ldyBZKCk7CQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25OYW1lOlg+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIDxDb21wbGV0ZU9uTmFtZTpYPjtcbiIgKwotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiWCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJYeHgiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBtZXRob2QgYm9keT4iCi0JKTsKLX0KLS8qCi0gKiBNZXRob2REZWNsYXJhdG9yIDo6PSAnSWRlbnRpZmllcicgJygnIDxGb3JtYWxQYXJhbWV0ZXJMaXN0b3B0PiAnKScgRGltc29wdCAKLSAqLwotcHVibGljIHZvaWQgdGVzdE1ldGhvZERlY2xhcmF0b3IoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tEaWV0UGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciB7CQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKFh4eCBvKSB7CQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQlcbiIsIAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIlgiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPblR5cGU6WD4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKwotCQkiICBCYXIoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oPENvbXBsZXRlT25UeXBlOlg+IG8pIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIlgiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiWHh4IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gbWV0aG9kIGRlY2xhcmF0b3I+IgotCSk7Ci19Ci0vKgotICogTWV0aG9kSGVhZGVyIDo6PSBNb2RpZmllcnNvcHQgPFR5cGU+IE1ldGhvZERlY2xhcmF0b3IgVGhyb3dzb3B0IAotICogd2hlcmUgTW9kaWZpZXJzb3B0IGlzIG5vdCBlbXB0eSAKLSAqLwotcHVibGljIHZvaWQgdGVzdE1ldGhvZEhlYWRlcldpdGhNb2RpZmllcnMoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tEaWV0UGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciB7CQkJCQkJCQlcbiIgKwotCQkiCXB1YmxpYyBzdGF0aWMgWHh4IGZvbygpIHsJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiWCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uVHlwZTpYPiIsCi0JCS8vIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmc6Ci0JCSJjbGFzcyBCYXIge1xuIiArCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICA8Q29tcGxldGVPblR5cGU6WD5cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIlh4eCIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIG1ldGhvZCBoZWFkZXIgd2l0aCBtb2RpZmllcnM+IgotCSk7Ci19Ci0vKgotICogTWV0aG9kSGVhZGVyIDo6PSBNb2RpZmllcnNvcHQgPFR5cGU+IE1ldGhvZERlY2xhcmF0b3IgVGhyb3dzb3B0IAotICogd2hlcmUgTW9kaWZpZXJzb3B0IGlzIGVtcHR5IAotICovCi1wdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSGVhZGVyV2l0aG91dE1vZGlmaWVycygpIHsKLQl0aGlzLnJ1blRlc3RDaGVja0RpZXRQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCVxuIiArCi0JCSIJWHh4IGZvbygpIHsJCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iLCAKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25UeXBlOlg+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIDxDb21wbGV0ZU9uVHlwZTpYPlxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIlgiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiWHh4IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gbWV0aG9kIGhlYWRlciB3aXRob3V0IG1vZGlmaWVycz4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0aW9uIG9uIGEgcXVhbGlmaWVkIHR5cGUgcmVmZXJlbmNlLCB3aGVyZSB0aGUgY3Vyc29yIGlzIGluIHRoZSAKLSAqIGZpcnN0IHR5cGUgcmVmZXJlbmNlLiAKLSAqLwotcHVibGljIHZvaWQgdGVzdFF1YWxpZmllZFR5cGVSZWZlcmVuY2VTaHJpbmtBbGwoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCVxuIiArCi0JCSIJCWludCBpID0gMDsJCQkJCQkJXG4iICsKLQkJIgkJbmV3IGEuYi5jLlh4eCgpOwkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJIgkJbmV3IGEiLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmc6Ci0JCSI8Q29tcGxldGVPblR5cGU6YT4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgaW50IGk7XG4iICsgCi0JCSIgICAgbmV3IDxDb21wbGV0ZU9uVHlwZTphPigpO1xuIiArCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJhIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJImEiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBxdWFsaWZpZWQgdHlwZSByZWZlcmVuY2UgKHNocmluayBhbGwpPiIKLQkpOwotfQotLyoKLSAqIENvbXBsZXRpb24gb24gYSBxdWFsaWZpZWQgdHlwZSByZWZlcmVuY2UsIHdoZXJlIHRoZSBjdXJzb3IgaXMgcmlnaHQgYWZ0ZXIgdGhlIGZpcnN0IGRvdC4gCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RRdWFsaWZpZWRUeXBlUmVmZXJlbmNlU2hyaW5rQWxsQnV0T25lKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciB7CQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQlcbiIgKwotCQkiCQlpbnQgaSA9IDA7CQkJCQkJCVxuIiArCi0JCSIJCW5ldyBhLmIuYy5YeHgoKTsJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJhLiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uVHlwZTphLj4iLAotCQkvLyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nOgotCQkiY2xhc3MgQmFyIHtcbiIgKyAKLQkJIiAgQmFyKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgaW50IGk7XG4iICsgCi0JCSIgICAgbmV3IDxDb21wbGV0ZU9uVHlwZTphLj4oKTtcbiIgKwotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJImEuIiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gcXVhbGlmaWVkIHR5cGUgcmVmZXJlbmNlIChzaHJpbmsgYWxsIGJ1dCBvbmUpPiIKLQkpOwotfQotLyoKLSAqIENvbXBsZXRpb24gb24gYSBxdWFsaWZpZWQgdHlwZSByZWZlcmVuY2UsIHdoZXJlIHRoZSBjdXJzb3IgaXMgcmlnaHQgYWZ0ZXIgdGhlIGVuZCAKLSAqIG9mIHRoZSBsYXN0IHR5cGUgcmVmZXJlbmNlLiAKLSAqLwotcHVibGljIHZvaWQgdGVzdFF1YWxpZmllZFR5cGVSZWZlcmVuY2VTaHJpbmtOb25lKCkgewotCXRoaXMucnVuVGVzdENoZWNrTWV0aG9kUGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciB7CQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQlcbiIgKwotCQkiCQlpbnQgaSA9IDA7CQkJCQkJCVxuIiArCi0JCSIJCW5ldyBhLmIuYy5YeHgoKTsJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25UeXBlOmEuYi5jLlg+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIGludCBpO1xuIiArIAotCQkiICAgIG5ldyA8Q29tcGxldGVPblR5cGU6YS5iLmMuWD4oKTtcbiIgKwotCQkiICB9XG4iICsgCi0JCSJ9XG4iLAotCQkvLyBleHBlY3RlZENvbXBsZXRpb25JZGVudGlmaWVyOgotCQkiWCIsCi0JCS8vIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2U6Ci0JCSJhLmIuYy5YeHgiLAotCQkvLyB0ZXN0IG5hbWUKLQkJIjxjb21wbGV0ZSBvbiBxdWFsaWZpZWQgdHlwZSByZWZlcmVuY2UgKHNocmluayBub25lKT4iCi0JKTsKLX0KLS8qCi0gKiBDb21wbGV0aW9uIG9uIGEgcXVhbGlmaWVkIHR5cGUgcmVmZXJlbmNlLCB3aGVyZSB0aGUgY3Vyc29yIGlzIHJpZ2h0IGFmdGVyIHRoZSAKLSAqIGxhc3QgZG90LiAKLSAqLwotcHVibGljIHZvaWQgdGVzdFF1YWxpZmllZFR5cGVSZWZlcmVuY2VTaHJpbmtPbmUoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tNZXRob2RQYXJzZSgKLQkJLy8gY29tcGlsYXRpb25Vbml0OgotCQkiY2xhc3MgQmFyIHsJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCVxuIiArCi0JCSIJCWludCBpID0gMDsJCQkJCQkJXG4iICsKLQkJIgkJbmV3IGEuYi5jLlh4eCgpOwkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iLAotCQkvLyBjb21wbGV0ZUJlaGluZDoKLQkJImEuYi5jLiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uVHlwZTphLmIuYy4+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIGludCBpO1xuIiArIAotCQkiICAgIG5ldyA8Q29tcGxldGVPblR5cGU6YS5iLmMuPigpO1xuIiArCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSIiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiYS5iLmMuIiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gcXVhbGlmaWVkIHR5cGUgcmVmZXJlbmNlIChzaHJpbmsgb25lKT4iCi0JKTsKLX0KLS8qCi0gKiBTd2l0Y2hCbG9ja1N0YXRlbWVudCA6Oj0gU3dpdGNoTGFiZWxzIDxCbG9ja1N0YXRlbWVudHM+Ci0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTd2l0Y2hCbG9ja1N0YXRlbWVudCgpIHsKLQl0aGlzLnJ1blRlc3RDaGVja01ldGhvZFBhcnNlKAotCQkvLyBjb21waWxhdGlvblVuaXQ6Ci0JCSJjbGFzcyBCYXIgewkJCQkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJXG4iICsKLQkJIgkJaW50IGkgPSAxOwkJCQkJCQlcbiIgKwotCQkiCQlzd2l0Y2ggKGkpIHsJCQkJCQlcbiIgKwotCQkiCQkJY2FzZSAxOiAJCQkJCQlcbiIgKwotCQkiCQkJCVh4eCBvID0gZnJlZChpKTsJCQlcbiIgKwotCQkiCQkJCWJyZWFrOwkJCQkJCVxuIiArCi0JCSIJCQlkZWZhdWx0OgkJCQkJCVxuIiArCi0JCSIJCX0JCQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIiwKLQkJLy8gY29tcGxldGVCZWhpbmQ6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nOgotCQkiPENvbXBsZXRlT25OYW1lOlg+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIGludCBpO1xuIiArCi0JCSIgICAge1xuIiArCi0JCSIgICAgICA8Q29tcGxldGVPbk5hbWU6WD47XG4iICsKLQkJIiAgICB9XG4iICsKLQkJIiAgfVxuIiArIAotCQkifVxuIiwKLQkJLy8gZXhwZWN0ZWRDb21wbGV0aW9uSWRlbnRpZmllcjoKLQkJIlgiLAotCQkvLyBleHBlY3RlZFJlcGxhY2VkU291cmNlOgotCQkiWHh4IiwKLQkJLy8gdGVzdCBuYW1lCi0JCSI8Y29tcGxldGUgb24gc3dpdGNoIGJsb2NrIHN0YXRlbWVudD4iCi0JKTsKLX0KLS8qCi0gKiBUaHJvd3MgOjo9ICd0aHJvd3MnIDxDbGFzc1R5cGVMaXN0PiAgCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RUaHJvd3MoKSB7Ci0JdGhpcy5ydW5UZXN0Q2hlY2tEaWV0UGFyc2UoCi0JCS8vIGNvbXBpbGF0aW9uVW5pdDoKLQkJImNsYXNzIEJhciB7CQkJCQkJCQlcbiIgKyAKLQkJIgl2b2lkIGZvbygpIHRocm93cyBYeHggewkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQlcbiIsCi0JCS8vIGNvbXBsZXRlQmVoaW5kOgotCQkiWCIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZzoKLQkJIjxDb21wbGV0ZU9uRXhjZXB0aW9uOlg+IiwKLQkJLy8gZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZzoKLQkJImNsYXNzIEJhciB7XG4iICsgCi0JCSIgIEJhcigpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICB2b2lkIGZvbygpIHRocm93cyA8Q29tcGxldGVPbkV4Y2VwdGlvbjpYPiB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiIsCi0JCS8vIGV4cGVjdGVkQ29tcGxldGlvbklkZW50aWZpZXI6Ci0JCSJYIiwKLQkJLy8gZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZToKLQkJIlh4eCIsCi0JCS8vIHRlc3QgbmFtZQotCQkiPGNvbXBsZXRlIG9uIHRocm93cz4iCi0JKTsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvU2VsZWN0aW9uVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3BhcnNlci9TZWxlY3Rpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYjI4MTAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3BhcnNlci9TZWxlY3Rpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIucGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgU2VsZWN0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0U2VsZWN0aW9uVGVzdCB7Ci1wdWJsaWMgU2VsZWN0aW9uVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLQlzdXBlcih0ZXN0TmFtZSk7Ci19Ci0vKgotICogU2VsZWN0IHN1cGVyY2xhc3MKLSAqLwotcHVibGljIHZvaWQgdGVzdDAxKCkgewotCi0JU3RyaW5nIHN0ciA9IAotCQkiaW1wb3J0IGphdmEuaW8uKjsJCQkJCQkJXG4iICsgCi0JCSIJCQkJCQkJCQkJCVxuIiArIAotCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7CQlcbiIgKyAKLQkJIn0JCQkJCQkJCQkJCVxuIjsgCi0KLQlTdHJpbmcgc2VsZWN0aW9uU3RhcnRCZWhpbmQgPSAiZXh0ZW5kcyAiOwotCVN0cmluZyBzZWxlY3Rpb25FbmRCZWhpbmQgPSAiSU9FeGNlcHRpb24iOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPFNlbGVjdE9uVHlwZTpJT0V4Y2VwdGlvbj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJJT0V4Y2VwdGlvbiI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiaW1wb3J0IGphdmEuaW8uKjtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgPFNlbGVjdE9uVHlwZTpJT0V4Y2VwdGlvbj4ge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJJT0V4Y2VwdGlvbiI7Ci0JU3RyaW5nIHRlc3ROYW1lID0gIjxzZWxlY3Qgc3VwZXJjbGFzcz4iOwotCi0JaW50IHNlbGVjdGlvblN0YXJ0ID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uU3RhcnRCZWhpbmQpICsgc2VsZWN0aW9uU3RhcnRCZWhpbmQubGVuZ3RoKCk7Ci0JaW50IHNlbGVjdGlvbkVuZCA9IHN0ci5pbmRleE9mKHNlbGVjdGlvbkVuZEJlaGluZCkgKyBzZWxlY3Rpb25FbmRCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQkKLQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCXNlbGVjdGlvblN0YXJ0LAotCQlzZWxlY3Rpb25FbmQsCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKgotICogU2VsZWN0IHN1cGVyaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMigpIHsKLQotCVN0cmluZyBzdHIgPSAKLQkJImltcG9ydCBqYXZhLmlvLio7CQkJCQkJCQkJCQkJCVxuIiArIAotCQkiCQkJCQkJCQkJCQkJCQkJCQlcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgSU9FeGNlcHRpb24gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewkJXG4iICsKLQkJIiBpbnQgZm9vKCl7fSAJCQkJCQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJCQkJCQlcbiI7IAotCi0JU3RyaW5nIHNlbGVjdGlvblN0YXJ0QmVoaW5kID0gImltcGxlbWVudHMgIjsKLQlTdHJpbmcgc2VsZWN0aW9uRW5kQmVoaW5kID0gIlNlcmlhbGl6YWJsZSI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8U2VsZWN0T25UeXBlOlNlcmlhbGl6YWJsZT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJTZXJpYWxpemFibGUiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJImltcG9ydCBqYXZhLmlvLio7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIElPRXhjZXB0aW9uIGltcGxlbWVudHMgPFNlbGVjdE9uVHlwZTpTZXJpYWxpemFibGU+IHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJTZXJpYWxpemFibGUiOwotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2VsZWN0IHN1cGVyaW50ZXJmYWNlPiI7Ci0KLQlpbnQgc2VsZWN0aW9uU3RhcnQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb25TdGFydEJlaGluZCkgKyBzZWxlY3Rpb25TdGFydEJlaGluZC5sZW5ndGgoKTsKLQlpbnQgc2VsZWN0aW9uRW5kID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uRW5kQmVoaW5kKSArIHNlbGVjdGlvbkVuZEJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCQotCXRoaXMuY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJc2VsZWN0aW9uU3RhcnQsCi0JCXNlbGVjdGlvbkVuZCwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBTZWxlY3QgcXVhbGlmaWVkIHN1cGVyY2xhc3MKLSAqLwotcHVibGljIHZvaWQgdGVzdDAzKCkgewotCi0JU3RyaW5nIHN0ciA9IAotCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBqYXZhLmlvLklPRXhjZXB0aW9uIHsJXG4iICsgCi0JCSJ9CQkJCQkJCQkJCQkJXG4iOyAKLQotCVN0cmluZyBzZWxlY3Rpb25TdGFydEJlaGluZCA9ICJqYXZhLmlvLiI7Ci0JU3RyaW5nIHNlbGVjdGlvbkVuZEJlaGluZCA9ICJJT0V4Y2VwdGlvbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8U2VsZWN0T25UeXBlOmphdmEuaW8uSU9FeGNlcHRpb24+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiSU9FeGNlcHRpb24iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgPFNlbGVjdE9uVHlwZTpqYXZhLmlvLklPRXhjZXB0aW9uPiB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImphdmEuaW8uSU9FeGNlcHRpb24iOwotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2VsZWN0IHF1YWxpZmllZCBzdXBlcmNsYXNzPiI7Ci0KLQlpbnQgc2VsZWN0aW9uU3RhcnQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb25TdGFydEJlaGluZCkgKyBzZWxlY3Rpb25TdGFydEJlaGluZC5sZW5ndGgoKTsKLQlpbnQgc2VsZWN0aW9uRW5kID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uRW5kQmVoaW5kKSArIHNlbGVjdGlvbkVuZEJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCQotCXRoaXMuY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJc2VsZWN0aW9uU3RhcnQsCi0JCXNlbGVjdGlvbkVuZCwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBTZWxlY3QgcGFja2FnZSBmcm9tIHF1YWxpZmllZCBzdXBlcmNsYXNzCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwNCgpIHsKLQotCVN0cmluZyBzdHIgPSAKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgamF2YS5pby5JT0V4Y2VwdGlvbiB7CVxuIiArIAotCQkifQkJCQkJCQkJCQkJCVxuIjsgCi0KLQlTdHJpbmcgc2VsZWN0aW9uU3RhcnRCZWhpbmQgPSAiamF2YS4iOwotCVN0cmluZyBzZWxlY3Rpb25FbmRCZWhpbmQgPSAiamF2YS5pbyI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8U2VsZWN0T25UeXBlOmphdmEuaW8+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiaW8iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgPFNlbGVjdE9uVHlwZTpqYXZhLmlvPiB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gImphdmEuaW8uSU9FeGNlcHRpb24iOwotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2VsZWN0IHBhY2thZ2UgZnJvbSBxdWFsaWZpZWQgc3VwZXJjbGFzcz4iOwotCi0JaW50IHNlbGVjdGlvblN0YXJ0ID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uU3RhcnRCZWhpbmQpICsgc2VsZWN0aW9uU3RhcnRCZWhpbmQubGVuZ3RoKCk7Ci0JaW50IHNlbGVjdGlvbkVuZCA9IHN0ci5pbmRleE9mKHNlbGVjdGlvbkVuZEJlaGluZCkgKyBzZWxlY3Rpb25FbmRCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQkKLQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCXNlbGVjdGlvblN0YXJ0LAotCQlzZWxlY3Rpb25FbmQsCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKgotICogU2VsZWN0IG1lc3NhZ2Ugc2VuZAotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDUoKSB7Ci0KLQlTdHJpbmcgc3RyID0gCi0JCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIGphdmEuaW8uSU9FeGNlcHRpb24gewlcbiIgKwotCQkiCWludCBmb28oKXsJCQkJCQkJCQlcbiIgKwotCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJoZWxsb1wiKTsJCQlcbiI7Ci0KLQlTdHJpbmcgc2VsZWN0aW9uU3RhcnRCZWhpbmQgPSAiU3lzdGVtLm91dC4iOwotCVN0cmluZyBzZWxlY3Rpb25FbmRCZWhpbmQgPSAicHJpbnRsbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8U2VsZWN0T25NZXNzYWdlU2VuZDpTeXN0ZW0ub3V0LnByaW50bG4oXCJoZWxsb1wiKT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwcmludGxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIGphdmEuaW8uSU9FeGNlcHRpb24ge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgZm9vKCkge1xuIiArIAotCQkiICAgIDxTZWxlY3RPbk1lc3NhZ2VTZW5kOlN5c3RlbS5vdXQucHJpbnRsbihcImhlbGxvXCIpPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJTeXN0ZW0ub3V0LnByaW50bG4oXCJoZWxsb1wiKSI7Ci0JU3RyaW5nIHRlc3ROYW1lID0gIjxzZWxlY3QgbWVzc2FnZSBzZW5kPiI7Ci0KLQlpbnQgc2VsZWN0aW9uU3RhcnQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb25TdGFydEJlaGluZCkgKyBzZWxlY3Rpb25TdGFydEJlaGluZC5sZW5ndGgoKTsKLQlpbnQgc2VsZWN0aW9uRW5kID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uRW5kQmVoaW5kKSArIHNlbGVjdGlvbkVuZEJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCQotCXRoaXMuY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQlzZWxlY3Rpb25TdGFydCwKLQkJc2VsZWN0aW9uRW5kLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotLyoKLSAqIFNlbGVjdCBtZXNzYWdlIHNlbmQgd2l0aCByZWNvdmVyeSBiZWZvcmUKLSAqLwotcHVibGljIHZvaWQgdGVzdDA2KCkgewotCi0JU3RyaW5nIHN0ciA9IAotCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyAJCQkJCQlcbiIgKwotCQkiCWludCBmb28oKXsJCQkJCQkJCQlcbiIgKwotCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJoZWxsb1wiKTsJCQlcbiI7Ci0KLQlTdHJpbmcgc2VsZWN0aW9uU3RhcnRCZWhpbmQgPSAiU3lzdGVtLm91dC4iOwotCVN0cmluZyBzZWxlY3Rpb25FbmRCZWhpbmQgPSAicHJpbnRsbiI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8U2VsZWN0T25NZXNzYWdlU2VuZDpTeXN0ZW0ub3V0LnByaW50bG4oXCJoZWxsb1wiKT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJwcmludGxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB7XG4iICsgCi0JCSIgICAgPFNlbGVjdE9uTWVzc2FnZVNlbmQ6U3lzdGVtLm91dC5wcmludGxuKFwiaGVsbG9cIik+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIlN5c3RlbS5vdXQucHJpbnRsbihcImhlbGxvXCIpIjsKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHNlbGVjdCBtZXNzYWdlIHNlbmQgd2l0aCByZWNvdmVyeSBiZWZvcmU+IjsKLQotCWludCBzZWxlY3Rpb25TdGFydCA9IHN0ci5pbmRleE9mKHNlbGVjdGlvblN0YXJ0QmVoaW5kKSArIHNlbGVjdGlvblN0YXJ0QmVoaW5kLmxlbmd0aCgpOwotCWludCBzZWxlY3Rpb25FbmQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb25FbmRCZWhpbmQpICsgc2VsZWN0aW9uRW5kQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkJCi0JdGhpcy5jaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCXNlbGVjdGlvblN0YXJ0LAotCQlzZWxlY3Rpb25FbmQsCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKgotICogU2VsZWN0IG1lc3NhZ2Ugc2VuZCB3aXRoIHNpYmxpbmcgbWV0aG9kCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwNygpIHsKLQotCVN0cmluZyBzdHIgPSAKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgCQkJCQkJXG4iICsKLQkJIglpbnQgZm9vKCl7CQkJCQkJCQkJXG4iICsKLQkJIgkJdGhpcy5iYXIoXCJoZWxsb1wiKTsJCQkJCVxuIiArCi0JCSIJaW50IGJhcihTdHJpbmcgcyl7CQkJCQkJCVxuIiArCi0JCSIJCXJldHVybiBzLmxlbmd0aCgpOwkJCQkJCVxuIgkrCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQlcbiI7Ci0KLQlTdHJpbmcgc2VsZWN0aW9uU3RhcnRCZWhpbmQgPSAidGhpcy4iOwotCVN0cmluZyBzZWxlY3Rpb25FbmRCZWhpbmQgPSAidGhpcy5iYXIiOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPFNlbGVjdE9uTWVzc2FnZVNlbmQ6dGhpcy5iYXIoXCJoZWxsb1wiKT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJiYXIiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgICA8U2VsZWN0T25NZXNzYWdlU2VuZDp0aGlzLmJhcihcImhlbGxvXCIpPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgYmFyKFN0cmluZyBzKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidGhpcy5iYXIoXCJoZWxsb1wiKSI7Ci0JU3RyaW5nIHRlc3ROYW1lID0gIjxzZWxlY3QgbWVzc2FnZSBzZW5kIHdpdGggc2libGluZyBtZXRob2Q+IjsKLQotCWludCBzZWxlY3Rpb25TdGFydCA9IHN0ci5pbmRleE9mKHNlbGVjdGlvblN0YXJ0QmVoaW5kKSArIHNlbGVjdGlvblN0YXJ0QmVoaW5kLmxlbmd0aCgpOwotCWludCBzZWxlY3Rpb25FbmQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb25FbmRCZWhpbmQpICsgc2VsZWN0aW9uRW5kQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkJCi0JdGhpcy5jaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCXNlbGVjdGlvblN0YXJ0LAotCQlzZWxlY3Rpb25FbmQsCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKgotICogU2VsZWN0IGZpZWxkIHJlZmVyZW5jZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDgoKSB7Ci0KLQlTdHJpbmcgc3RyID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7CQkgCQkJCQkJXG4iICsKLQkJIglpbnQgbnVtID0gMDsJCQkJCQkJCVxuIiArCi0JCSIJaW50IGZvbygpewkJCQkJCQkJCVxuIiArCi0JCSIJCWludCBqID0gdGhpcy5udW07CQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQlcbiI7Ci0KLQlTdHJpbmcgc2VsZWN0aW9uU3RhcnRCZWhpbmQgPSAidGhpcy4iOwotCVN0cmluZyBzZWxlY3Rpb25FbmRCZWhpbmQgPSAidGhpcy5udW0iOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPFNlbGVjdGlvbk9uRmllbGRSZWZlcmVuY2U6dGhpcy5udW0+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAibnVtIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIGludCBudW07XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB7XG4iICsgCi0JCSIgICAgaW50IGogPSA8U2VsZWN0aW9uT25GaWVsZFJlZmVyZW5jZTp0aGlzLm51bT47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidGhpcy5udW0iOwotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2VsZWN0IGZpZWxkIHJlZmVyZW5jZT4iOwotCi0JaW50IHNlbGVjdGlvblN0YXJ0ID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uU3RhcnRCZWhpbmQpICsgc2VsZWN0aW9uU3RhcnRCZWhpbmQubGVuZ3RoKCk7Ci0JaW50IHNlbGVjdGlvbkVuZCA9IHN0ci5pbmRleE9mKHNlbGVjdGlvbkVuZEJlaGluZCkgKyBzZWxlY3Rpb25FbmRCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQkKLQl0aGlzLmNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJc2VsZWN0aW9uU3RhcnQsCi0JCXNlbGVjdGlvbkVuZCwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBTZWxlY3QgZmllbGQgcmVmZXJlbmNlIHdpdGggc3ludGF4IGVycm9ycwotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDkoKSB7Ci0KLQlTdHJpbmcgc3RyID0gCi0JCSJwdWJsaWMgY2xhc3MgWCAJCSAJCQkJCQlcbiIgKwotCQkiCWludCBudW0gCQkJCQkJCQkJXG4iICsKLQkJIglpbnQgZm9vKCl7CQkJCQkJCQkJXG4iICsKLQkJIgkJaW50IGogPSB0aGlzLm51bTsJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIjsKLQotCVN0cmluZyBzZWxlY3Rpb25TdGFydEJlaGluZCA9ICJ0aGlzLiI7Ci0JU3RyaW5nIHNlbGVjdGlvbkVuZEJlaGluZCA9ICJ0aGlzLm51bSI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8U2VsZWN0aW9uT25GaWVsZFJlZmVyZW5jZTp0aGlzLm51bT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJudW0iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgaW50IG51bTtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgICBpbnQgaiA9IDxTZWxlY3Rpb25PbkZpZWxkUmVmZXJlbmNlOnRoaXMubnVtPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ0aGlzLm51bSI7Ci0JU3RyaW5nIHRlc3ROYW1lID0gIjxzZWxlY3QgZmllbGQgcmVmZXJlbmNlIHdpdGggc3ludGF4IGVycm9ycz4iOwotCi0JaW50IHNlbGVjdGlvblN0YXJ0ID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uU3RhcnRCZWhpbmQpICsgc2VsZWN0aW9uU3RhcnRCZWhpbmQubGVuZ3RoKCk7Ci0JaW50IHNlbGVjdGlvbkVuZCA9IHN0ci5pbmRleE9mKHNlbGVjdGlvbkVuZEJlaGluZCkgKyBzZWxlY3Rpb25FbmRCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQkKLQl0aGlzLmNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJc2VsZWN0aW9uU3RhcnQsCi0JCXNlbGVjdGlvbkVuZCwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBTZWxlY3QgZmllbGQgcmVmZXJlbmNlIGluc2lkZSBtZXNzYWdlIHJlY2VpdmVyCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QxMCgpIHsKLQotCVN0cmluZyBzdHIgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHsJCSAJCQkJCVxuIiArCi0JCSIJWCB4OyAJCQkJCQkJCQlcbiIgKwotCQkiCWludCBmb28oKXsJCQkJCQkJCVxuIiArCi0JCSIJCWludCBqID0gdGhpcy54LmZvbygpOwkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iOwotCQkKLQlTdHJpbmcgc2VsZWN0aW9uU3RhcnRCZWhpbmQgPSAidGhpcy4iOwotCVN0cmluZyBzZWxlY3Rpb25FbmRCZWhpbmQgPSAidGhpcy54IjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxTZWxlY3Rpb25PbkZpZWxkUmVmZXJlbmNlOnRoaXMueD4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ4IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIFggeDtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgICBpbnQgaiA9IDxTZWxlY3Rpb25PbkZpZWxkUmVmZXJlbmNlOnRoaXMueD47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidGhpcy54IjsKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHNlbGVjdCBmaWVsZCByZWZlcmVuY2UgaW5zaWRlIG1lc3NhZ2UgcmVjZWl2ZXI+IjsKLQotCWludCBzZWxlY3Rpb25TdGFydCA9IHN0ci5pbmRleE9mKHNlbGVjdGlvblN0YXJ0QmVoaW5kKSArIHNlbGVjdGlvblN0YXJ0QmVoaW5kLmxlbmd0aCgpOwotCWludCBzZWxlY3Rpb25FbmQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb25FbmRCZWhpbmQpICsgc2VsZWN0aW9uRW5kQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkJCi0JdGhpcy5jaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCXNlbGVjdGlvblN0YXJ0LAotCQlzZWxlY3Rpb25FbmQsCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKgotICogU2VsZWN0IGFsbG9jYXRpb24KLSAqLwotcHVibGljIHZvaWQgdGVzdDExKCkgewotCi0JU3RyaW5nIHN0ciA9IAotCQkicHVibGljIGNsYXNzIFggewkJIAkJCQkJXG4iICsKLQkJIglYKGludCBpKXt9CQkJCQkJCQlcbiIgKwotCQkiCWludCBmb28oKXsJCQkJCQkJCVxuIiArCi0JCSIJCWludCBqID0gMDsJCQkJCQkJXG4iICsKLQkJIgkJWCB4ID0gbmV3IFgoaik7CQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQlcbiI7Ci0JCQotCVN0cmluZyBzZWxlY3Rpb25TdGFydEJlaGluZCA9ICJuZXcgIjsKLQlTdHJpbmcgc2VsZWN0aW9uRW5kQmVoaW5kID0gIm5ldyBYIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxTZWxlY3RPbkFsbG9jYXRpb25FeHByZXNzaW9uOm5ldyBYKGopPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIlgiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgWChpbnQgaSkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB7XG4iICsgCi0JCSIgICAgaW50IGo7XG4iICsgCi0JCSIgICAgWCB4ID0gPFNlbGVjdE9uQWxsb2NhdGlvbkV4cHJlc3Npb246bmV3IFgoaik+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIm5ldyBYKGopIjsKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHNlbGVjdCBhbGxvY2F0aW9uPiI7Ci0KLQlpbnQgc2VsZWN0aW9uU3RhcnQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb25TdGFydEJlaGluZCkgKyBzZWxlY3Rpb25TdGFydEJlaGluZC5sZW5ndGgoKTsKLQlpbnQgc2VsZWN0aW9uRW5kID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uRW5kQmVoaW5kKSArIHNlbGVjdGlvbkVuZEJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCQotCXRoaXMuY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQlzZWxlY3Rpb25TdGFydCwKLQkJc2VsZWN0aW9uRW5kLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotLyoKLSAqIFNlbGVjdCBxdWFsaWZpZWQgYWxsb2NhdGlvbgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MTIoKSB7Ci0KLQlTdHJpbmcgc3RyID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7CQkgCQkJCQlcbiIgKwotCQkiIAljbGFzcyBZIHsJCQkJCQkJCVxuIiArCi0JCSIJCVkoaW50IGkpe30JCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCVxuIiArCi0JCSIJWChpbnQgaSl7fQkJCQkJCQkJXG4iICsKLQkJIglpbnQgZm9vKCl7CQkJCQkJCQlcbiIgKwotCQkiCQlpbnQgaiA9IDA7CQkJCQkJCVxuIiArCi0JCSIJCVggeCA9IG5ldyBYKGopOwkJCQkJCVxuIiArCi0JCSIJCXgubmV3IFkoMSk7CQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iOwotCQkKLQlTdHJpbmcgc2VsZWN0aW9uU3RhcnRCZWhpbmQgPSAieC5uZXcgIjsKLQlTdHJpbmcgc2VsZWN0aW9uRW5kQmVoaW5kID0gIngubmV3IFkiOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPFNlbGVjdE9uUXVhbGlmaWVkQWxsb2NhdGlvbkV4cHJlc3Npb246eC5uZXcgWSgxKT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJZIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIGNsYXNzIFkge1xuIiArIAotCQkiICAgIFkoaW50IGkpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgWChpbnQgaSkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB7XG4iICsgCi0JCSIgICAgaW50IGo7XG4iICsgCi0JCSIgICAgWCB4O1xuIiArIAotCQkiICAgIDxTZWxlY3RPblF1YWxpZmllZEFsbG9jYXRpb25FeHByZXNzaW9uOngubmV3IFkoMSk+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIngubmV3IFkoMSkiOwotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2VsZWN0IHF1YWxpZmllZCBhbGxvY2F0aW9uPiI7Ci0KLQlpbnQgc2VsZWN0aW9uU3RhcnQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb25TdGFydEJlaGluZCkgKyBzZWxlY3Rpb25TdGFydEJlaGluZC5sZW5ndGgoKTsKLQlpbnQgc2VsZWN0aW9uRW5kID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uRW5kQmVoaW5kKSArIHNlbGVjdGlvbkVuZEJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCQotCXRoaXMuY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQlzZWxlY3Rpb25TdGFydCwKLQkJc2VsZWN0aW9uRW5kLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotLyoKLSAqIFNlbGVjdCBxdWFsaWZpZWQgbmFtZSByZWZlcmVuY2UgcmVjZWl2ZXIKLSAqLwotcHVibGljIHZvaWQgdGVzdDEzKCkgewotCi0JU3RyaW5nIHN0ciA9IAotCQkicHVibGljIGNsYXNzIFggewkJIAkJCQkJXG4iICsKLQkJIglpbnQgZm9vKCl7CQkJCQkJCQlcbiIgKwotCQkiCQlqYXZhLmxhbmcuU3lzdGVtLm91dC5wcmludGxuKCk7CQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIjsKLQkJCi0JU3RyaW5nIHNlbGVjdGlvblN0YXJ0QmVoaW5kID0gImphdmEubGFuZy4iOwotCVN0cmluZyBzZWxlY3Rpb25FbmRCZWhpbmQgPSAiamF2YS5sYW5nLlN5c3RlbSI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8U2VsZWN0T25OYW1lOmphdmEubGFuZy5TeXN0ZW0+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiU3lzdGVtIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB7XG4iICsgCi0JCSIgICAgPFNlbGVjdE9uTmFtZTpqYXZhLmxhbmcuU3lzdGVtPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJqYXZhLmxhbmcuU3lzdGVtLm91dCI7Ci0JU3RyaW5nIHRlc3ROYW1lID0gIjxzZWxlY3QgcXVhbGlmaWVkIG5hbWUgcmVjZWl2ZXI+IjsKLQotCWludCBzZWxlY3Rpb25TdGFydCA9IHN0ci5pbmRleE9mKHNlbGVjdGlvblN0YXJ0QmVoaW5kKSArIHNlbGVjdGlvblN0YXJ0QmVoaW5kLmxlbmd0aCgpOwotCWludCBzZWxlY3Rpb25FbmQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb25FbmRCZWhpbmQpICsgc2VsZWN0aW9uRW5kQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkJCi0JdGhpcy5jaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCXNlbGVjdGlvblN0YXJ0LAotCQlzZWxlY3Rpb25FbmQsCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKgotICogU2VsZWN0IHF1YWxpZmllZCBuYW1lIHJlZmVyZW5jZSAKLSAqLwotcHVibGljIHZvaWQgdGVzdDE0KCkgewotCi0JU3RyaW5nIHN0ciA9IAotCQkicHVibGljIGNsYXNzIFggewkJIAkJCQkJXG4iICsKLQkJIglpbnQgZm9vKCl7CQkJCQkJCQlcbiIgKwotCQkiCQlTeXN0ZW0gc3lzID0gamF2YS5sYW5nLlN5c3RlbTsJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iOwotCQkKLQlTdHJpbmcgc2VsZWN0aW9uU3RhcnRCZWhpbmQgPSAiamF2YS5sYW5nLiI7Ci0JU3RyaW5nIHNlbGVjdGlvbkVuZEJlaGluZCA9ICJqYXZhLmxhbmcuU3lzdGVtIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxTZWxlY3RPbk5hbWU6amF2YS5sYW5nLlN5c3RlbT4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJTeXN0ZW0iOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgICBTeXN0ZW0gc3lzID0gPFNlbGVjdE9uTmFtZTpqYXZhLmxhbmcuU3lzdGVtPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJqYXZhLmxhbmcuU3lzdGVtIjsKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHNlbGVjdCBxdWFsaWZpZWQgbmFtZT4iOwotCi0JaW50IHNlbGVjdGlvblN0YXJ0ID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uU3RhcnRCZWhpbmQpICsgc2VsZWN0aW9uU3RhcnRCZWhpbmQubGVuZ3RoKCk7Ci0JaW50IHNlbGVjdGlvbkVuZCA9IHN0ci5pbmRleE9mKHNlbGVjdGlvbkVuZEJlaGluZCkgKyBzZWxlY3Rpb25FbmRCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQkKLQl0aGlzLmNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJc2VsZWN0aW9uU3RhcnQsCi0JCXNlbGVjdGlvbkVuZCwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBTZWxlY3QgdmFyaWFibGUgdHlwZSB3aXRoIG1vZGlmaWVyCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QxNSgpIHsKLQotCVN0cmluZyBzdHIgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHsJCSAJCQkJCVxuIiArCi0JCSIJaW50IGZvbygpewkJCQkJCQkJXG4iICsKLQkJIgkJZmluYWwgU3lzdGVtIHN5cyA9IG51bGw7CQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQlcbiI7Ci0JCQotCVN0cmluZyBzZWxlY3Rpb25TdGFydEJlaGluZCA9ICJmaW5hbCAiOwotCVN0cmluZyBzZWxlY3Rpb25FbmRCZWhpbmQgPSAiZmluYWwgU3lzdGVtIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxTZWxlY3RPblR5cGU6U3lzdGVtPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIlN5c3RlbSI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgZm9vKCkge1xuIiArIAotCQkiICAgIGZpbmFsIDxTZWxlY3RPblR5cGU6U3lzdGVtPiBzeXM7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiU3lzdGVtIjsKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHNlbGVjdCB2YXJpYWJsZSB0eXBlIHdpdGggbW9kaWZpZXI+IjsKLQotCWludCBzZWxlY3Rpb25TdGFydCA9IHN0ci5pbmRleE9mKHNlbGVjdGlvblN0YXJ0QmVoaW5kKSArIHNlbGVjdGlvblN0YXJ0QmVoaW5kLmxlbmd0aCgpOwotCWludCBzZWxlY3Rpb25FbmQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb25FbmRCZWhpbmQpICsgc2VsZWN0aW9uRW5kQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkJCi0JdGhpcy5jaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCXNlbGVjdGlvblN0YXJ0LAotCQlzZWxlY3Rpb25FbmQsCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKgotICogU2VsZWN0IHZhcmlhYmxlIHR5cGUKLSAqLwotcHVibGljIHZvaWQgdGVzdDE2KCkgewotCi0JU3RyaW5nIHN0ciA9IAotCQkicHVibGljIGNsYXNzIFggewkJIAkJCQkJXG4iICsKLQkJIglpbnQgZm9vKCl7CQkJCQkJCQlcbiIgKwotCQkiCQlTeXN0ZW0gc3lzID0gbnVsbDsJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iOwotCQkKLQlTdHJpbmcgc2VsZWN0aW9uU3RhcnRCZWhpbmQgPSAiXG4JCSI7Ci0JU3RyaW5nIHNlbGVjdGlvbkVuZEJlaGluZCA9ICJcbgkJU3lzdGVtIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxTZWxlY3RPblR5cGU6U3lzdGVtPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIlN5c3RlbSI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgZm9vKCkge1xuIiArIAotCQkiICAgIDxTZWxlY3RPblR5cGU6U3lzdGVtPiBzeXM7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiU3lzdGVtIjsKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHNlbGVjdCB2YXJpYWJsZSB0eXBlPiI7Ci0KLQlpbnQgc2VsZWN0aW9uU3RhcnQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb25TdGFydEJlaGluZCkgKyBzZWxlY3Rpb25TdGFydEJlaGluZC5sZW5ndGgoKTsKLQlpbnQgc2VsZWN0aW9uRW5kID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uRW5kQmVoaW5kKSArIHNlbGVjdGlvbkVuZEJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCQotCXRoaXMuY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQlzZWxlY3Rpb25TdGFydCwKLQkJc2VsZWN0aW9uRW5kLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotLyoKLSAqIFNlbGVjdCBuYW1lCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QxNygpIHsKLQotCVN0cmluZyBzdHIgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHsJCSAJCQkJCVxuIiArCi0JCSIJaW50IGZvbygpewkJCQkJCQkJXG4iICsKLQkJIgkJU3lzdGVtIAkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQlcbiI7Ci0JCQotCVN0cmluZyBzZWxlY3Rpb25TdGFydEJlaGluZCA9ICJcbgkJIjsKLQlTdHJpbmcgc2VsZWN0aW9uRW5kQmVoaW5kID0gIlxuCQlTeXN0ZW0iOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPFNlbGVjdE9uTmFtZTpTeXN0ZW0+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiU3lzdGVtIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB7XG4iICsgCi0JCSIgICAgPFNlbGVjdE9uTmFtZTpTeXN0ZW0+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJTeXN0ZW0iOwotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2VsZWN0IG5hbWU+IjsKLQotCWludCBzZWxlY3Rpb25TdGFydCA9IHN0ci5pbmRleE9mKHNlbGVjdGlvblN0YXJ0QmVoaW5kKSArIHNlbGVjdGlvblN0YXJ0QmVoaW5kLmxlbmd0aCgpOwotCWludCBzZWxlY3Rpb25FbmQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb25FbmRCZWhpbmQpICsgc2VsZWN0aW9uRW5kQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkJCi0JdGhpcy5jaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCXNlbGVjdGlvblN0YXJ0LAotCQlzZWxlY3Rpb25FbmQsCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKgotICogU2VsZWN0IGFub255bW91cyB0eXBlCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QxOCgpIHsKLQotCVN0cmluZyBzdHIgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHsJCSAJCQkJCVxuIiArCi0JCSIJaW50IGZvbygpewkJCQkJCQkJXG4iICsKLQkJIgkJbmV3IE9iamVjdCgpewkJCQkJCVxuIiArCi0JCSIJCQlpbnQgYmFyKCl7fQkJCQkJCVxuIiArCi0JCSIJCX0JCQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIjsKLQkJCi0JU3RyaW5nIHNlbGVjdGlvblN0YXJ0QmVoaW5kID0gIm5ldyAiOwotCVN0cmluZyBzZWxlY3Rpb25FbmRCZWhpbmQgPSAibmV3IE9iamVjdCI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9IAotCQkiPFNlbGVjdE9uQWxsb2NhdGlvbkV4cHJlc3Npb246bmV3IE9iamVjdCgpIHtcbiIgKwotCQkiICAoKSB7XG4iICsKLQkJIiAgICBzdXBlcigpO1xuIiArCi0JCSIgIH1cbiIgKyAKLQkJIn0+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiT2JqZWN0IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB7XG4iICsgCi0JCSIgICAgPFNlbGVjdE9uQWxsb2NhdGlvbkV4cHJlc3Npb246bmV3IE9iamVjdCgpIHtcbiIgKwotCQkiICAgICAgKCkge1xuIiArCi0JCSIgICAgICAgIHN1cGVyKCk7XG4iICsKLQkJIiAgICAgIH1cbiIgKyAKLQkJIiAgICB9PjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAibmV3IE9iamVjdCgpIjsKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHNlbGVjdCBhbm9ueW1vdXMgdHlwZT4iOwotCi0JaW50IHNlbGVjdGlvblN0YXJ0ID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uU3RhcnRCZWhpbmQpICsgc2VsZWN0aW9uU3RhcnRCZWhpbmQubGVuZ3RoKCk7Ci0JaW50IHNlbGVjdGlvbkVuZCA9IHN0ci5pbmRleE9mKHNlbGVjdGlvbkVuZEJlaGluZCkgKyBzZWxlY3Rpb25FbmRCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQkKLQl0aGlzLmNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJc2VsZWN0aW9uU3RhcnQsCi0JCXNlbGVjdGlvbkVuZCwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBTZWxlY3QgY2FzdCB0eXBlCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QxOSgpIHsKLQotCVN0cmluZyBzdHIgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHsJCSAJCQkJCVxuIiArCi0JCSIJT2JqZWN0IGZvbygpewkJCQkJCQlcbiIgKwotCQkiCQlyZXR1cm4gKE9iamVjdCkgdGhpczsJCQkJXG4iICsKLQkJIgkJfQkJCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iOwotCQkKLQlTdHJpbmcgc2VsZWN0aW9uU3RhcnRCZWhpbmQgPSAicmV0dXJuICgiOwotCVN0cmluZyBzZWxlY3Rpb25FbmRCZWhpbmQgPSAicmV0dXJuIChPYmplY3QiOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPFNlbGVjdE9uTmFtZTpPYmplY3Q+IjsKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiT2JqZWN0IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIE9iamVjdCBmb28oKSB7XG4iICsgCi0JCSIgICAgPFNlbGVjdE9uTmFtZTpPYmplY3Q+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJPYmplY3QiOwotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2VsZWN0IGNhc3QgdHlwZT4iOwotCi0JaW50IHNlbGVjdGlvblN0YXJ0ID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uU3RhcnRCZWhpbmQpICsgc2VsZWN0aW9uU3RhcnRCZWhpbmQubGVuZ3RoKCk7Ci0JaW50IHNlbGVjdGlvbkVuZCA9IHN0ci5pbmRleE9mKHNlbGVjdGlvbkVuZEJlaGluZCkgKyBzZWxlY3Rpb25FbmRCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQkKLQl0aGlzLmNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJc2VsZWN0aW9uU3RhcnQsCi0JCXNlbGVjdGlvbkVuZCwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBTZWxlY3QgcGFja2FnZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0MjAoKSB7Ci0KLQlTdHJpbmcgc3RyID0KLQkJInBhY2thZ2UgeC55Lm90aGVyOwkJCQkJXG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHsJCSAJCQkJCVxuIiArCi0JCSIJaW50IGZvbygpewkJCQkJCQkJXG4iICsKLQkJIgkJfQkJCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iOwotCQkKLQlTdHJpbmcgc2VsZWN0aW9uU3RhcnRCZWhpbmQgPSAieC4iOwotCVN0cmluZyBzZWxlY3Rpb25FbmRCZWhpbmQgPSAieC55IjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxTZWxlY3RPblBhY2thZ2U6eC55PiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInkiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2UgPFNlbGVjdE9uUGFja2FnZTp4Lnk+O1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ4Lnkub3RoZXIiOwotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2VsZWN0IHBhY2thZ2U+IjsKLQotCWludCBzZWxlY3Rpb25TdGFydCA9IHN0ci5pbmRleE9mKHNlbGVjdGlvblN0YXJ0QmVoaW5kKSArIHNlbGVjdGlvblN0YXJ0QmVoaW5kLmxlbmd0aCgpOwotCWludCBzZWxlY3Rpb25FbmQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb25FbmRCZWhpbmQpICsgc2VsZWN0aW9uRW5kQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkJCi0JdGhpcy5jaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQlzZWxlY3Rpb25TdGFydCwKLQkJc2VsZWN0aW9uRW5kLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotLyoKLSAqIFNlbGVjdCBpbXBvcnQKLSAqLwotcHVibGljIHZvaWQgdGVzdDIxKCkgewotCi0JU3RyaW5nIHN0ciA9Ci0JCSJpbXBvcnQgeC55Lk90aGVyOwkJCQkJXG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHsJCSAJCQkJCVxuIiArCi0JCSIJaW50IGZvbygpewkJCQkJCQkJXG4iICsKLQkJIgkJfQkJCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJXG4iOwotCQkKLQlTdHJpbmcgc2VsZWN0aW9uU3RhcnRCZWhpbmQgPSAieS4iOwotCVN0cmluZyBzZWxlY3Rpb25FbmRCZWhpbmQgPSAieS5PdGhlciI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8U2VsZWN0T25JbXBvcnQ6eC55Lk90aGVyPiI7Ci0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIk90aGVyIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJpbXBvcnQgPFNlbGVjdE9uSW1wb3J0OngueS5PdGhlcj47XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSIgIGludCBmb28oKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIngueS5PdGhlciI7Ci0JU3RyaW5nIHRlc3ROYW1lID0gIjxzZWxlY3QgaW1wb3J0PiI7Ci0KLQlpbnQgc2VsZWN0aW9uU3RhcnQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb25TdGFydEJlaGluZCkgKyBzZWxlY3Rpb25TdGFydEJlaGluZC5sZW5ndGgoKTsKLQlpbnQgc2VsZWN0aW9uRW5kID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uRW5kQmVoaW5kKSArIHNlbGVjdGlvbkVuZEJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCQotCXRoaXMuY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJc2VsZWN0aW9uU3RhcnQsCi0JCXNlbGVjdGlvbkVuZCwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBTZWxlY3QgaW1wb3J0IG9uIGRlbWFuZAotICovCi1wdWJsaWMgdm9pZCB0ZXN0MjIoKSB7Ci0KLQlTdHJpbmcgc3RyID0KLQkJImltcG9ydCB4Lnkub3RoZXIuKjsJCQkJCVxuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7CQkgCQkJCQlcbiIgKwotCQkiCWludCBmb28oKXsJCQkJCQkJCVxuIiArCi0JCSIJCX0JCQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIjsKLQkJCi0JU3RyaW5nIHNlbGVjdGlvblN0YXJ0QmVoaW5kID0gInkuIjsKLQlTdHJpbmcgc2VsZWN0aW9uRW5kQmVoaW5kID0gInkub3RoZXIiOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPFNlbGVjdE9uSW1wb3J0OngueS5vdGhlcj4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJvdGhlciI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiaW1wb3J0IDxTZWxlY3RPbkltcG9ydDp4Lnkub3RoZXI+O1xuIiArIAotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBpbnQgZm9vKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ4Lnkub3RoZXIiOwotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2VsZWN0IGltcG9ydCBvbiBkZW1hbmQ+IjsKLQotCWludCBzZWxlY3Rpb25TdGFydCA9IHN0ci5pbmRleE9mKHNlbGVjdGlvblN0YXJ0QmVoaW5kKSArIHNlbGVjdGlvblN0YXJ0QmVoaW5kLmxlbmd0aCgpOwotCWludCBzZWxlY3Rpb25FbmQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb25FbmRCZWhpbmQpICsgc2VsZWN0aW9uRW5kQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkJCi0JdGhpcy5jaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQlzZWxlY3Rpb25TdGFydCwKLQkJc2VsZWN0aW9uRW5kLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotLyoKLSAqIFNlbGVjdCBhcnJheSBpbml0aWFsaXplciB0eXBlCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QyMygpIHsKLQotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFggewkJIAkJCQkJXG4iICsKLQkJIglpbnQgZm9vKCl7CQkJCQkJCQlcbiIgKwotCQkiCQlTdHJpbmdbXSBwID0gbmV3IFN0cmluZ1tde1wiTGVmdFwifTtcbiIgKwotLy8JCSIJCX0JCQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCVxuIjsKLQkJCi0JU3RyaW5nIHNlbGVjdGlvblN0YXJ0QmVoaW5kID0gIm5ldyAiOwotCVN0cmluZyBzZWxlY3Rpb25FbmRCZWhpbmQgPSAibmV3IFN0cmluZyI7Ci0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8U2VsZWN0T25UeXBlOlN0cmluZz4iOwotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJTdHJpbmciOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgICBTdHJpbmdbXSBwID0gPFNlbGVjdE9uVHlwZTpTdHJpbmc+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJTdHJpbmciOwotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2VsZWN0IGFycmF5IGluaXRpYWxpemVyIHR5cGU+IjsKLQotCWludCBzZWxlY3Rpb25TdGFydCA9IHN0ci5pbmRleE9mKHNlbGVjdGlvblN0YXJ0QmVoaW5kKSArIHNlbGVjdGlvblN0YXJ0QmVoaW5kLmxlbmd0aCgpOwotCWludCBzZWxlY3Rpb25FbmQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb25FbmRCZWhpbmQpICsgc2VsZWN0aW9uRW5kQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkJCi0JdGhpcy5jaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCXNlbGVjdGlvblN0YXJ0LAotCQlzZWxlY3Rpb25FbmQsCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKgotICogU2VsZWN0IG5lc3RlZCB0eXBlIHN1cGVyY2xhc3Mgd2l0aCBzeW50YXggZXJyb3IgYmVoaW5kCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QyNCgpIHsKLQotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIEcgewkJCQkJXG4iICsKLQkJIgl2b2lkIGZvbygpIHsJCQkJCVxuIiArCi0JCSIJCWNsYXNzIFggewkJCQkJXG4iICsKLQkJIgkJCWNsYXNzIFkgZXh0ZW5kcyBHIHsJCVxuIiArCi0JCSIJCQkJaW50IGZvbygpCQkJXG4iICsKLQkJIgkJCX0JCQkJCQlcbiIgKwotCQkiCQl9CQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQlcbiI7Ci0JCQotCVN0cmluZyBzZWxlY3Rpb25TdGFydEJlaGluZCA9ICJleHRlbmRzICI7Ci0JU3RyaW5nIHNlbGVjdGlvbkVuZEJlaGluZCA9ICJleHRlbmRzIEciOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPFNlbGVjdE9uVHlwZTpHPiI7Ci0JCi0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIkciOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBHIHtcbiIgKyAKLQkJIiAgcHVibGljIEcoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgY2xhc3MgWCB7XG4iICsgCi0JCSIgICAgICBjbGFzcyBZIGV4dGVuZHMgPFNlbGVjdE9uVHlwZTpHPiB7XG4iICsgCi0JCSIgICAgICAgIFkoKSB7XG4iICsgCi0JCSIgICAgICAgIH1cbiIgKyAKLQkJIiAgICAgICAgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgICAgICAgfVxuIiArIAotCQkiICAgICAgfVxuIiArIAotCQkiICAgICAgWCgpIHtcbiIgKyAKLQkJIiAgICAgIH1cbiIgKyAKLQkJIiAgICB9O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJHIjsKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHNlbGVjdCBuZXN0ZWQgdHlwZSBzdXBlcmNsYXNzPiI7Ci0KLQlpbnQgc2VsZWN0aW9uU3RhcnQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb25TdGFydEJlaGluZCkgKyBzZWxlY3Rpb25TdGFydEJlaGluZC5sZW5ndGgoKTsKLQlpbnQgc2VsZWN0aW9uRW5kID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uRW5kQmVoaW5kKSArIHNlbGVjdGlvbkVuZEJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCQotCXRoaXMuY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQlzZWxlY3Rpb25TdGFydCwKLQkJc2VsZWN0aW9uRW5kLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotLyoKLSAqIFNlbGVjdCBzdXBlcgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MjUoKSB7Ci0KLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBHIHsJCQkJCVxuIiArCi0JCSIJT2JqZWN0IGZvbygpIHsJCQkJCVxuIiArCi0JCSIJCXJldHVybiBzdXBlci5mb28oKTsJCQlcbiIgKwotCQkiCX0JCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJXG4iOwotCQkKLQlTdHJpbmcgc2VsZWN0aW9uU3RhcnRCZWhpbmQgPSAicmV0dXJuICI7Ci0JU3RyaW5nIHNlbGVjdGlvbkVuZEJlaGluZCA9ICJyZXR1cm4gc3VwZXIiOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPFNlbGVjdE9uU3VwZXI6c3VwZXI+IjsKLQkKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAic3VwZXIiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBHIHtcbiIgKyAKLQkJIiAgcHVibGljIEcoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgT2JqZWN0IGZvbygpIHtcbiIgKyAKLQkJIiAgICA8U2VsZWN0T25TdXBlcjpzdXBlcj47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInN1cGVyIjsKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHNlbGVjdCBzdXBlcj4iOwotCi0JaW50IHNlbGVjdGlvblN0YXJ0ID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uU3RhcnRCZWhpbmQpICsgc2VsZWN0aW9uU3RhcnRCZWhpbmQubGVuZ3RoKCk7Ci0JaW50IHNlbGVjdGlvbkVuZCA9IHN0ci5pbmRleE9mKHNlbGVjdGlvbkVuZEJlaGluZCkgKyBzZWxlY3Rpb25FbmRCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQkKLQl0aGlzLmNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJc2VsZWN0aW9uU3RhcnQsCi0JCXNlbGVjdGlvbkVuZCwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBTZWxlY3QgcXVhbGlmaWVkIHN1cGVyCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QyNigpIHsKLQotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIEcgewkJCQkJCVxuIiArCi0JCSIJT2JqZWN0IGZvbygpIHsJCQkJCQlcbiIgKwotCQkiCQluZXcgWCgpewkJCQkJCVxuIiArCi0JCSIJCQlPYmplY3QgYmFyKCl7CQkJCVxuIiArCi0JCSIJCQkJcmV0dXJuIEcuc3VwZXIuZm9vKCk7CVxuIiArCi0JCSIJCQl9CQkJCQkJCVxuIiArCi0JCSIJCX0JCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCVxuIjsKLQkJCi0JU3RyaW5nIHNlbGVjdGlvblN0YXJ0QmVoaW5kID0gIkcuIjsKLQlTdHJpbmcgc2VsZWN0aW9uRW5kQmVoaW5kID0gIkcuc3VwZXIiOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPFNlbGVjdE9uUXVhbGlmaWVkU3VwZXI6Ry5zdXBlcj4iOwotCQotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJzdXBlciI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIEcge1xuIiArIAotCQkiICBwdWJsaWMgRygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBPYmplY3QgZm9vKCkge1xuIiArIAotCQkiICAgIG5ldyBYKCkge1xuIiArIAotCQkiICAgICAgKCkge1xuIiArIAotCQkiICAgICAgfVxuIiArIAotCQkiICAgICAgT2JqZWN0IGJhcigpIHtcbiIgKyAKLQkJIiAgICAgICAgPFNlbGVjdE9uUXVhbGlmaWVkU3VwZXI6Ry5zdXBlcj47XG4iICsgCi0JCSIgICAgICB9XG4iICsgCi0JCSIgICAgfTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiRy5zdXBlciI7Ci0JU3RyaW5nIHRlc3ROYW1lID0gIjxzZWxlY3QgcXVhbGlmaWVkIHN1cGVyPiI7Ci0KLQlpbnQgc2VsZWN0aW9uU3RhcnQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb25TdGFydEJlaGluZCkgKyBzZWxlY3Rpb25TdGFydEJlaGluZC5sZW5ndGgoKTsKLQlpbnQgc2VsZWN0aW9uRW5kID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uRW5kQmVoaW5kKSArIHNlbGVjdGlvbkVuZEJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCQotCXRoaXMuY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQlzZWxlY3Rpb25TdGFydCwKLQkJc2VsZWN0aW9uRW5kLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotLyoKLSAqIFNlbGVjdCBzdXBlciBjb25zdHJ1Y3RvciBjYWxsCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QyNygpIHsKLQotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIEcgewkJCQkJXG4iICsKLQkJIglHKCkgewkJCQkJCQlcbiIgKwotCQkiCQlzdXBlcigpOwkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCVxuIjsKLQkJCi0JU3RyaW5nIHNlbGVjdGlvblN0YXJ0QmVoaW5kID0gIlxuXHRcdCI7Ci0JU3RyaW5nIHNlbGVjdGlvbkVuZEJlaGluZCA9ICJzdXBlciI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8U2VsZWN0T25FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbDpzdXBlcigpPiI7Ci0JCi0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInN1cGVyIjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgRyB7XG4iICsgCi0JCSIgIEcoKSB7XG4iICsgCi0JCSIgICAgPFNlbGVjdE9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGw6c3VwZXIoKT47XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInN1cGVyKCkiOwotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2VsZWN0IHN1cGVyIGNvbnN0cnVjdG9yIGNhbGw+IjsKLQotCWludCBzZWxlY3Rpb25TdGFydCA9IHN0ci5pbmRleE9mKHNlbGVjdGlvblN0YXJ0QmVoaW5kKSArIHNlbGVjdGlvblN0YXJ0QmVoaW5kLmxlbmd0aCgpOwotCWludCBzZWxlY3Rpb25FbmQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb25FbmRCZWhpbmQpICsgc2VsZWN0aW9uRW5kQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkJCi0JdGhpcy5jaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCXNlbGVjdGlvblN0YXJ0LAotCQlzZWxlY3Rpb25FbmQsCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKgotICogU2VsZWN0IHF1YWxpZmllZCBzdXBlciBjb25zdHJ1Y3RvciBjYWxsCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QyOCgpIHsKLQotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIEcgewkJCQkJCVxuIiArCi0JCSIJY2xhc3MgTSB7fQkJCQkJCQlcbiIgKwotCQkiCXN0YXRpYyBPYmplY3QgZm9vKCkgewkJCQlcbiIgKwotCQkiCQljbGFzcyBYIGV4dGVuZHMgTSB7CQkJCVxuIiArCi0JCSIJCQlYICgpewkJCQkJCVxuIiArCi0JCSIJCQkJbmV3IEcoKS5zdXBlcigpOwkJXG4iICsKLQkJIgkJCX0JCQkJCQkJXG4iICsKLQkJIgkJfQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJXG4iOwotCQkKLQlTdHJpbmcgc2VsZWN0aW9uU3RhcnRCZWhpbmQgPSAibmV3IEcoKS4iOwotCVN0cmluZyBzZWxlY3Rpb25FbmRCZWhpbmQgPSAibmV3IEcoKS5zdXBlciI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8U2VsZWN0T25FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbDpuZXcgRygpLnN1cGVyKCk+IjsKLQkKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAic3VwZXIiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBHIHtcbiIgKyAKLQkJIiAgY2xhc3MgTSB7XG4iICsgCi0JCSIgICAgTSgpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIEcoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgc3RhdGljIE9iamVjdCBmb28oKSB7XG4iICsgCi0JCSIgICAgY2xhc3MgWCBleHRlbmRzIE0ge1xuIiArIAotCQkiICAgICAgWCgpIHtcbiIgKyAKLQkJIiAgICAgICAgPFNlbGVjdE9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGw6bmV3IEcoKS5zdXBlcigpPjtcbiIgKyAKLQkJIiAgICAgIH1cbiIgKyAKLQkJIiAgICB9O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwkKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJuZXcgRygpLnN1cGVyKCkiOwotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2VsZWN0IHF1YWxpZmllZCBzdXBlciBjb25zdHJ1Y3RvciBjYWxsPiI7Ci0KLQlpbnQgc2VsZWN0aW9uU3RhcnQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb25TdGFydEJlaGluZCkgKyBzZWxlY3Rpb25TdGFydEJlaGluZC5sZW5ndGgoKTsKLQlpbnQgc2VsZWN0aW9uRW5kID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uRW5kQmVoaW5kKSArIHNlbGVjdGlvbkVuZEJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCQotCXRoaXMuY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQlzZWxlY3Rpb25TdGFydCwKLQkJc2VsZWN0aW9uRW5kLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotLyoKLSAqIFNlbGVjdCBxdWFsaWZpZWQgc3VwZXIgY29uc3RydWN0b3IgY2FsbCB3aXRoIGFyZ3VtZW50cwotICovCi1wdWJsaWMgdm9pZCB0ZXN0MjkoKSB7Ci0KLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBHIHsJCQkJCQkJCVxuIiArCi0JCSIJY2xhc3MgTSB7fQkJCQkJCQkJCVxuIiArCi0JCSIJc3RhdGljIE9iamVjdCBmb28oKSB7CQkJCQkJXG4iICsKLQkJIgkJY2xhc3MgWCBleHRlbmRzIE0gewkJCQkJCVxuIiArCi0JCSIJCQlYICgpewkJCQkJCQkJXG4iICsKLQkJIgkJCQluZXcgRygpLnN1cGVyKDIzICsgXCJoZWxsb1wiKTsJXG4iICsKLQkJIgkJCX0JCQkJCQkJCQlcbiIgKwotCQkiCQl9CQkJCQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCQkJXG4iICsKLQkJIn0JCQkJCQkJCQkJCQlcbiI7Ci0JCQotCVN0cmluZyBzZWxlY3Rpb25TdGFydEJlaGluZCA9ICJuZXcgRygpLiI7Ci0JU3RyaW5nIHNlbGVjdGlvbkVuZEJlaGluZCA9ICJuZXcgRygpLnN1cGVyIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxTZWxlY3RPbkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsOm5ldyBHKCkuc3VwZXIoKDIzICsgXCJoZWxsb1wiKSk+IjsKLQkKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAic3VwZXIiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBHIHtcbiIgKyAKLQkJIiAgY2xhc3MgTSB7XG4iICsgCi0JCSIgICAgTSgpIHtcbiIgKyAKLQkJIiAgICB9XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIEcoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgc3RhdGljIE9iamVjdCBmb28oKSB7XG4iICsgCi0JCSIgICAgY2xhc3MgWCBleHRlbmRzIE0ge1xuIiArIAotCQkiICAgICAgWCgpIHtcbiIgKyAKLQkJIiAgICAgICAgPFNlbGVjdE9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGw6bmV3IEcoKS5zdXBlcigoMjMgKyBcImhlbGxvXCIpKT47XG4iICsgCi0JCSIgICAgICB9XG4iICsgCi0JCSIgICAgfTtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsJCi0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAibmV3IEcoKS5zdXBlcigyMyArIFwiaGVsbG9cIikiOwotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2VsZWN0IHF1YWxpZmllZCBzdXBlciBjb25zdHJ1Y3RvciBjYWxsIHdpdGggYXJndW1lbnRzPiI7Ci0KLQlpbnQgc2VsZWN0aW9uU3RhcnQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb25TdGFydEJlaGluZCkgKyBzZWxlY3Rpb25TdGFydEJlaGluZC5sZW5ndGgoKTsKLQlpbnQgc2VsZWN0aW9uRW5kID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uRW5kQmVoaW5kKSArIHNlbGVjdGlvbkVuZEJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCQotCXRoaXMuY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQlzZWxlY3Rpb25TdGFydCwKLQkJc2VsZWN0aW9uRW5kLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotLyoKLSAqIFNlbGVjdCBzdXBlciBjb25zdHJ1Y3RvciBjYWxsIHdpdGggYXJndW1lbnRzCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QzMCgpIHsKLQotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIEcgewkJCQkJXG4iICsKLQkJIglHKCkgewkJCQkJCQlcbiIgKwotCQkiCQlzdXBlcihuZXcgRygpKTsJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCVxuIjsKLQkJCi0JU3RyaW5nIHNlbGVjdGlvblN0YXJ0QmVoaW5kID0gIlxuXHRcdCI7Ci0JU3RyaW5nIHNlbGVjdGlvbkVuZEJlaGluZCA9ICJzdXBlciI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8U2VsZWN0T25FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbDpzdXBlcihuZXcgRygpKT4iOwotCQotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJzdXBlciI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIEcge1xuIiArIAotCQkiICBHKCkge1xuIiArIAotCQkiICAgIDxTZWxlY3RPbkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsOnN1cGVyKG5ldyBHKCkpPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAic3VwZXIobmV3IEcoKSkiOwotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2VsZWN0IHN1cGVyIGNvbnN0cnVjdG9yIGNhbGwgd2l0aCBhcmd1bWVudHM+IjsKLQotCWludCBzZWxlY3Rpb25TdGFydCA9IHN0ci5pbmRleE9mKHNlbGVjdGlvblN0YXJ0QmVoaW5kKSArIHNlbGVjdGlvblN0YXJ0QmVoaW5kLmxlbmd0aCgpOwotCWludCBzZWxlY3Rpb25FbmQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb25FbmRCZWhpbmQpICsgc2VsZWN0aW9uRW5kQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkJCi0JdGhpcy5jaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCXNlbGVjdGlvblN0YXJ0LAotCQlzZWxlY3Rpb25FbmQsCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKgotICogUmVncmVzc2lvbiB0ZXN0IGZvciAxRlZRMExLCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QzMSgpIHsKLQotCVN0cmluZyBzdHIgPQotCQkiY2xhc3MgWCB7CQkJCQkJCVxuIiArCi0JCSIJWSBmOwkJCQkJCQlcbiIgKwotCQkiCXZvaWQgZm9vKCkgewkJCQkJXG4iICsKLQkJIgkJbmV3IEJhcihmcmVkKCkpOwkJCVxuIiArCi0JCSIJCVogej0gbmV3IFooKTsJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCVxuIjsKLQkJCi0JU3RyaW5nIHNlbGVjdGlvblN0YXJ0QmVoaW5kID0gIlxuXHQiOwotCVN0cmluZyBzZWxlY3Rpb25FbmRCZWhpbmQgPSAiWSI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8U2VsZWN0T25UeXBlOlk+IjsKLQkKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiWSI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkiY2xhc3MgWCB7XG4iICsKLQkJIiAgPFNlbGVjdE9uVHlwZTpZPiBmO1xuIiArCi0JCSIgIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiWSI7Ci0JU3RyaW5nIHRlc3ROYW1lID0gIjxyZWdyZXNzaW9uIHRlc3QgZm9yIDFGVlEwTEs+IjsKLQotCWludCBzZWxlY3Rpb25TdGFydCA9IHN0ci5pbmRleE9mKHNlbGVjdGlvblN0YXJ0QmVoaW5kKSArIHNlbGVjdGlvblN0YXJ0QmVoaW5kLmxlbmd0aCgpOwotCWludCBzZWxlY3Rpb25FbmQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb25FbmRCZWhpbmQpICsgc2VsZWN0aW9uRW5kQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkJCi0JdGhpcy5jaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQlzZWxlY3Rpb25TdGFydCwKLQkJc2VsZWN0aW9uRW5kLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotLyoKLSAqIFJlZ3Jlc3Npb24gdGVzdCBmb3IgMUZXVDRBSjogSVRQQ09NOldJTjk4IC0gU2VsZWN0aW9uUGFyc2VyIHByb2R1Y2VzIGR1cGxpY2F0ZSB0eXBlIGRlY2xhcmF0aW9uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QzMigpIHsKLQotCVN0cmluZyBzdHIgPQotCQkicGFja2FnZSBzZWFyY2g7CQkJCQkJCQkJCQkJXG4iKwotCQkiaW1wb3J0IGphdmEuaW8uKjsJCQkJCQkJCQkJCQlcbiIrCi0JCSJwdWJsaWMgY2xhc3MgUGhyYXNlUXVlcnkgewkJCQkJCQkJCQlcbiIrCi0JCSIJcHVibGljIGJvb2xlYW4gY29udGFpbnNQaHJhc2UoKXsJCQkJCQkJXG4iKwotCQkiCQl0cnkgewkJCQkJCQkJCQkJCQlcbiIrCi0JCSIJCQkJY2hhciBjdXJyZW50Q2hhciA9IFwiaGVsbG9cIi50b0xvd2VyQ2FzZSgpCQlcbiIrCi0JCSIJfQkJCQkJCQkJCQkJCQkJCVxuIisKLQkJIn0JCQkJCQkJCQkJCQkJCQkJXG4iOwotCQkKLQlTdHJpbmcgc2VsZWN0aW9uU3RhcnRCZWhpbmQgPSAiXCJoZWxsb1wiLiI7Ci0JU3RyaW5nIHNlbGVjdGlvbkVuZEJlaGluZCA9ICJcImhlbGxvXCIudG9Mb3dlckNhc2UiOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPFNlbGVjdE9uTWVzc2FnZVNlbmQ6XCJoZWxsb1wiLnRvTG93ZXJDYXNlKCk+IjsKLQkKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAidG9Mb3dlckNhc2UiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInBhY2thZ2Ugc2VhcmNoO1xuIiArIAotCQkiaW1wb3J0IGphdmEuaW8uKjtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBQaHJhc2VRdWVyeSB7XG4iICsgCi0JCSIgIHB1YmxpYyBQaHJhc2VRdWVyeSgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1BocmFzZSgpIHtcbiIgKyAKLQkJIiAgICB7XG4iICsgCi0JCSIgICAgICBjaGFyIGN1cnJlbnRDaGFyID0gPFNlbGVjdE9uTWVzc2FnZVNlbmQ6XCJoZWxsb1wiLnRvTG93ZXJDYXNlKCk+O1xuIiArIAotCQkiICAgIH1cbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiXCJoZWxsb1wiLnRvTG93ZXJDYXNlKCkiOwotCVN0cmluZyB0ZXN0TmFtZSA9ICI8MUZXVDRBSjogSVRQQ09NOldJTjk4IC0gU2VsZWN0aW9uUGFyc2VyIHByb2R1Y2VzIGR1cGxpY2F0ZSB0eXBlIGRlY2xhcmF0aW9uPiI7Ci0KLQlpbnQgc2VsZWN0aW9uU3RhcnQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb25TdGFydEJlaGluZCkgKyBzZWxlY3Rpb25TdGFydEJlaGluZC5sZW5ndGgoKTsKLQlpbnQgc2VsZWN0aW9uRW5kID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uRW5kQmVoaW5kKSArIHNlbGVjdGlvbkVuZEJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCQotCXRoaXMuY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQlzZWxlY3Rpb25TdGFydCwKLQkJc2VsZWN0aW9uRW5kLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7IAotfQotLyoKLSAqIFJlZ3Jlc3Npb24gdGVzdCBmb3IgMUc0Q0xaTTogSVRQSlVJOldJTk5UIC0gJ0ltcG9ydCBTZWxlY3Rpb24nIC0gU2V0IG5vdCBmb3VuZAotICovCi1wdWJsaWMgdm9pZCB0ZXN0MzMoKSB7Ci0KLQlTdHJpbmcgc3RyID0KLQkJIglpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TWFwOwkJCQlcbiIrCi0JCSIJcHVibGljIGNsYXNzIGM0IGV4dGVuZHMgQWJzdHJhY3RNYXAgewkJXG4iKwotCQkiCQkvKioJCQkJCQkJCQkJXG4iKwotCQkiCQkgKiBAc2VlIEFic3RyYWN0TWFwI2VudHJ5U2V0CQkJXG4iKwotCQkiCQkgKi8JCQkJCQkJCQkJXG4iKwotCQkiCQlwdWJsaWMgU2V0IGVudHJ5U2V0KCkgewkJCQkJXG4iKwotCQkiCQkJcmV0dXJuIG51bGw7CQkJCQkJXG4iKwotCQkiCQl9CQkJCQkJCQkJCVxuIisKLQkJIgl9CQkJCQkJCQkJCQlcbiI7Ci0JCQotCVN0cmluZyBzZWxlY3Rpb25TdGFydEJlaGluZCA9ICJcblx0XHRwdWJsaWMgIjsKLQlTdHJpbmcgc2VsZWN0aW9uRW5kQmVoaW5kID0gInB1YmxpYyBTZXQiOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPFNlbGVjdE9uVHlwZTpTZXQ+IjsKLQkKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiU2V0IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TWFwO1xuIiArIAotCQkicHVibGljIGNsYXNzIGM0IGV4dGVuZHMgQWJzdHJhY3RNYXAge1xuIiArIAotCQkiICBwdWJsaWMgYzQoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIDxTZWxlY3RPblR5cGU6U2V0PiBlbnRyeVNldCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiU2V0IjsKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPDFHNENMWk06IElUUEpVSTpXSU5OVCAtICdJbXBvcnQgU2VsZWN0aW9uJyAtIFNldCBub3QgZm91bmQ+IjsKLQotCWludCBzZWxlY3Rpb25TdGFydCA9IHN0ci5pbmRleE9mKHNlbGVjdGlvblN0YXJ0QmVoaW5kKSArIHNlbGVjdGlvblN0YXJ0QmVoaW5kLmxlbmd0aCgpOwotCWludCBzZWxlY3Rpb25FbmQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb25FbmRCZWhpbmQpICsgc2VsZWN0aW9uRW5kQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkKLQl0aGlzLmNoZWNrRGlldFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCXNlbGVjdGlvblN0YXJ0LAotCQlzZWxlY3Rpb25FbmQsCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKgotICogUmVncmVzc2lvbiB0ZXN0IGZvciAxR0I5OVMzOiBJVFBKVUk6V0lOTlQgLSBTSDogTlBFIGluIGVkaXRvciB3aGlsZSBnZXR0aW5nIGhvdmVyIGhlbHAKLSAqLwotcHVibGljIHZvaWQgdGVzdDM0KCkgewotCi0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7CQkJCQkJCVxuIisKLQkJIglwdWJsaWMgaW50IGZvbygpIHsJCQkJCQlcbiIrCi0JCSIJCU9iamVjdFtdIGFycmF5ID0gbmV3IE9iamVjdFswXTsJCVxuIisKLQkJIgkJcmV0dXJuIGFycmF5Lmxlbmd0aDsJCQkJXG4iKwotCQkiCX0JCQkJCQkJCQkJXG4iKwotCQkifQkJCQkJCQkJCQkJXG4iOwotCQkKLQlTdHJpbmcgc2VsZWN0aW9uU3RhcnRCZWhpbmQgPSAiXG5cdFx0cmV0dXJuICI7Ci0JU3RyaW5nIHNlbGVjdGlvbkVuZEJlaGluZCA9ICJhcnJheS5sZW5ndGgiOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSBOT05FOwotCQotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9IE5PTkU7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgaW50IGZvbygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSBOT05FOwotCVN0cmluZyB0ZXN0TmFtZSA9ICI8MUdCOTlTMzogSVRQSlVJOldJTk5UIC0gU0g6IE5QRSBpbiBlZGl0b3Igd2hpbGUgZ2V0dGluZyBob3ZlciBoZWxwPiI7Ci0KLQlpbnQgc2VsZWN0aW9uU3RhcnQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb25TdGFydEJlaGluZCkgKyBzZWxlY3Rpb25TdGFydEJlaGluZC5sZW5ndGgoKTsKLQlpbnQgc2VsZWN0aW9uRW5kID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uRW5kQmVoaW5kKSArIHNlbGVjdGlvbkVuZEJlaGluZC5sZW5ndGgoKSAtIDE7Ci0JCi0JdGhpcy5jaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCXNlbGVjdGlvblN0YXJ0LAotCQlzZWxlY3Rpb25FbmQsCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0KLS8qCi0gKiBTZWxlY3QgdGhpcyBjb25zdHJ1Y3RvciBjYWxsCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QzNSgpIHsKLQotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIEcgewkJCQkJXG4iICsKLQkJIglHKCkgewkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCVxuIiArCi0JCSIJRyhpbnQgeCkgewkJCQkJCVxuIiArCi0JCSIJCXRoaXMoKTsJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJXG4iOwotCQkKLQlTdHJpbmcgc2VsZWN0aW9uU3RhcnRCZWhpbmQgPSAiXG5cdFx0IjsKLQlTdHJpbmcgc2VsZWN0aW9uRW5kQmVoaW5kID0gInRoaXMiOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPFNlbGVjdE9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGw6dGhpcygpPiI7Ci0JCi0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInRoaXMiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBHIHtcbiIgKyAKLQkJIiAgRygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgRyhpbnQgeCkge1xuIiArIAotCQkiICAgIDxTZWxlY3RPbkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsOnRoaXMoKT47XG4iICsgCi0JCSIgIH1cbiIgKwotCQkifVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidGhpcygpIjsKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHNlbGVjdCB0aGlzIGNvbnN0cnVjdG9yIGNhbGw+IjsKLQotCWludCBzZWxlY3Rpb25TdGFydCA9IHN0ci5pbmRleE9mKHNlbGVjdGlvblN0YXJ0QmVoaW5kKSArIHNlbGVjdGlvblN0YXJ0QmVoaW5kLmxlbmd0aCgpOwotCWludCBzZWxlY3Rpb25FbmQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb25FbmRCZWhpbmQpICsgc2VsZWN0aW9uRW5kQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkJCi0JdGhpcy5jaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCXNlbGVjdGlvblN0YXJ0LAotCQlzZWxlY3Rpb25FbmQsCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0KLS8qCi0gKiBTZWxlY3QgcXVhbGlmaWVkIHRoaXMgY29uc3RydWN0b3IgY2FsbAotICovCi1wdWJsaWMgdm9pZCB0ZXN0MzYoKSB7Ci0KLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBHIHsJCQkJCQlcbiIgKwotCQkiCXN0YXRpYyBPYmplY3QgZm9vKCkgewkJCQlcbiIgKwotCQkiCQljbGFzcyBYIHsJCQkJCQlcbiIgKwotCQkiCQkJWCAoKXsJCQkJCQlcbiIgKwotCQkiCQkJfQkJCQkJCQlcbiIgKwotCQkiCQkJWCAoaW50IHgpewkJCQkJXG4iICsKLQkJIgkJCQluZXcgRygpLnRoaXMoKTsJCQlcbiIgKwotCQkiCQkJfQkJCQkJCQlcbiIgKwotCQkiCQl9CQkJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQlcbiI7Ci0JCQotCVN0cmluZyBzZWxlY3Rpb25TdGFydEJlaGluZCA9ICJuZXcgRygpLiI7Ci0JU3RyaW5nIHNlbGVjdGlvbkVuZEJlaGluZCA9ICJuZXcgRygpLnRoaXMiOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPFNlbGVjdE9uRXhwbGljaXRDb25zdHJ1Y3RvckNhbGw6bmV3IEcoKS50aGlzKCk+IjsKLQkKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAidGhpcyI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIEcge1xuIiArIAotCQkiICBwdWJsaWMgRygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBzdGF0aWMgT2JqZWN0IGZvbygpIHtcbiIgKyAKLQkJIiAgICBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgICAgIFgoKSB7XG4iICsKLQkJIiAgICAgICAgc3VwZXIoKTtcbiIrCi0JCSIgICAgICB9XG4iICsgCi0JCSIgICAgICBYKGludCB4KSB7XG4iICsgCi0JCSIgICAgICAgIDxTZWxlY3RPbkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsOm5ldyBHKCkudGhpcygpPjtcbiIgKyAKLQkJIiAgICAgIH1cbiIgKyAKLQkJIiAgICB9O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwkKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJuZXcgRygpLnRoaXMoKSI7Ci0JU3RyaW5nIHRlc3ROYW1lID0gIjxzZWxlY3QgcXVhbGlmaWVkIHRoaXMgY29uc3RydWN0b3IgY2FsbD4iOwotCi0JaW50IHNlbGVjdGlvblN0YXJ0ID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uU3RhcnRCZWhpbmQpICsgc2VsZWN0aW9uU3RhcnRCZWhpbmQubGVuZ3RoKCk7Ci0JaW50IHNlbGVjdGlvbkVuZCA9IHN0ci5pbmRleE9mKHNlbGVjdGlvbkVuZEJlaGluZCkgKyBzZWxlY3Rpb25FbmRCZWhpbmQubGVuZ3RoKCkgLSAxOwotCQkKLQl0aGlzLmNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJc2VsZWN0aW9uU3RhcnQsCi0JCXNlbGVjdGlvbkVuZCwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOyAKLX0KLS8qCi0gKiBTZWxlY3QgcXVhbGlmaWVkIHRoaXMgY29uc3RydWN0b3IgY2FsbCB3aXRoIGFyZ3VtZW50cwotICovCi1wdWJsaWMgdm9pZCB0ZXN0MzcoKSB7Ci0KLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBHIHsJCQkJCQkJCVxuIiArCi0JCSIJc3RhdGljIE9iamVjdCBmb28oKSB7CQkJCQkJXG4iICsKLQkJIgkJY2xhc3MgWCB7CQkJCQkJCQlcbiIgKwotCQkiCQkJWCAoKXsJCQkJCQkJCVxuIiArCi0JCSIJCQl9CQkJCQkJCQkJXG4iICsKLQkJIgkJCVggKGludCB4KXsJCQkJCQkJXG4iICsKLQkJIgkJCQluZXcgRygpLnRoaXMoMjMgKyBcImhlbGxvXCIpOwlcbiIgKwotCQkiCQkJfQkJCQkJCQkJCVxuIiArCi0JCSIJCX0JCQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCQkJCVxuIjsKLQkJCi0JU3RyaW5nIHNlbGVjdGlvblN0YXJ0QmVoaW5kID0gIm5ldyBHKCkuIjsKLQlTdHJpbmcgc2VsZWN0aW9uRW5kQmVoaW5kID0gIm5ldyBHKCkudGhpcyI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8U2VsZWN0T25FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbDpuZXcgRygpLnRoaXMoKDIzICsgXCJoZWxsb1wiKSk+IjsKLQkKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAidGhpcyI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIEcge1xuIiArIAotCQkiICBwdWJsaWMgRygpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBzdGF0aWMgT2JqZWN0IGZvbygpIHtcbiIgKyAKLQkJIiAgICBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgICAgIFgoKSB7XG4iICsgCi0JCSIgICAgICAgIHN1cGVyKCk7XG4iKwotCQkiICAgICAgfVxuIiArIAotCQkiICAgICAgWChpbnQgeCkge1xuIiArIAotCQkiICAgICAgICA8U2VsZWN0T25FeHBsaWNpdENvbnN0cnVjdG9yQ2FsbDpuZXcgRygpLnRoaXMoKDIzICsgXCJoZWxsb1wiKSk+O1xuIiArIAotCQkiICAgICAgfVxuIiArIAotCQkiICAgIH07XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7CQotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIm5ldyBHKCkudGhpcygyMyArIFwiaGVsbG9cIikiOwotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2VsZWN0IHF1YWxpZmllZCB0aGlzIGNvbnN0cnVjdG9yIGNhbGwgd2l0aCBhcmd1bWVudHM+IjsKLQotCWludCBzZWxlY3Rpb25TdGFydCA9IHN0ci5pbmRleE9mKHNlbGVjdGlvblN0YXJ0QmVoaW5kKSArIHNlbGVjdGlvblN0YXJ0QmVoaW5kLmxlbmd0aCgpOwotCWludCBzZWxlY3Rpb25FbmQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb25FbmRCZWhpbmQpICsgc2VsZWN0aW9uRW5kQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkJCi0JdGhpcy5jaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCXNlbGVjdGlvblN0YXJ0LAotCQlzZWxlY3Rpb25FbmQsCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKgotICogU2VsZWN0IHRoaXMgY29uc3RydWN0b3IgY2FsbCB3aXRoIGFyZ3VtZW50cwotICovCi1wdWJsaWMgdm9pZCB0ZXN0MzgoKSB7Ci0KLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBHIHsJCQkJCVxuIiArCi0JCSIJRygpIHsJCQkJCQkJXG4iICsKLQkJIgkJdGhpcyhuZXcgRygpKTsJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQlcbiIgKwotCQkifQkJCQkJCQkJCVxuIjsKLQkJCi0JU3RyaW5nIHNlbGVjdGlvblN0YXJ0QmVoaW5kID0gIlxuXHRcdCI7Ci0JU3RyaW5nIHNlbGVjdGlvbkVuZEJlaGluZCA9ICJ0aGlzIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxTZWxlY3RPbkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsOnRoaXMobmV3IEcoKSk+IjsKLQkKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAidGhpcyI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIEcge1xuIiArIAotCQkiICBHKCkge1xuIiArIAotCQkiICAgIDxTZWxlY3RPbkV4cGxpY2l0Q29uc3RydWN0b3JDYWxsOnRoaXMobmV3IEcoKSk+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ0aGlzKG5ldyBHKCkpIjsKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHNlbGVjdCB0aGlzIGNvbnN0cnVjdG9yIGNhbGwgd2l0aCBhcmd1bWVudHM+IjsKLQotCWludCBzZWxlY3Rpb25TdGFydCA9IHN0ci5pbmRleE9mKHNlbGVjdGlvblN0YXJ0QmVoaW5kKSArIHNlbGVjdGlvblN0YXJ0QmVoaW5kLmxlbmd0aCgpOwotCWludCBzZWxlY3Rpb25FbmQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb25FbmRCZWhpbmQpICsgc2VsZWN0aW9uRW5kQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkJCi0JdGhpcy5jaGVja01ldGhvZFBhcnNlKAotCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCXNlbGVjdGlvblN0YXJ0LAotCQlzZWxlY3Rpb25FbmQsCi0JCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZywKLQkJY29tcGxldGlvbklkZW50aWZpZXIsCi0JCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCXRlc3ROYW1lKTsgCi19Ci0vKgotICogYnVncyAzMjkzIHNlYXJjaCBkb2VzIG5vdCB3b3JrIGluIGlubmVyIGNsYXNzICgxR0VVUUhKKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0MzkoKSB7Ci0KLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHsgICAgICAgICAgICAgICAgXG4iICsKLQkJIiAgT2JqZWN0IGhlbGxvID0gbmV3IE9iamVjdCgpeyAgXG4iICsKLQkJIiAgICBwdWJsaWMgdm9pZCBmb28oU3RyaW5nIHMpeyAgXG4iICsKLQkJIiAgICAgIHMubGVuZ3RoKCk7ICAgICAgICAgICAgICAgXG4iICsKLQkJIiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iICsKLQkJIiAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iICsKLQkJIn0JCQkJCQkJCSBcbiI7Ci0JCQotCVN0cmluZyBzZWxlY3Rpb25TdGFydEJlaGluZCA9ICJzLiI7Ci0JU3RyaW5nIHNlbGVjdGlvbkVuZEJlaGluZCA9ICJsZW5ndGgiOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPFNlbGVjdE9uTWVzc2FnZVNlbmQ6cy5sZW5ndGgoKT4iOwotCQotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJsZW5ndGgiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBPYmplY3QgaGVsbG8gPSBuZXcgT2JqZWN0KCkge1xuIiArCi0JCSIgICAgcHVibGljIHZvaWQgZm9vKFN0cmluZyBzKSB7XG4iICsKLQkJIiAgICAgIDxTZWxlY3RPbk1lc3NhZ2VTZW5kOnMubGVuZ3RoKCk+O1xuIiArCi0JCSIgICAgfVxuIiArCi0JCSIgIH07XG4iICsKLQkJIiAgcHVibGljIFgoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInMubGVuZ3RoKCkiOwotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2VsZWN0IG1lc3NhZ2Ugc2VuZCBpbiBhbm9ueW1vdXMgY2xhc3M+IjsKLQotCWludCBzZWxlY3Rpb25TdGFydCA9IHN0ci5pbmRleE9mKHNlbGVjdGlvblN0YXJ0QmVoaW5kKSArIHNlbGVjdGlvblN0YXJ0QmVoaW5kLmxlbmd0aCgpOwotCWludCBzZWxlY3Rpb25FbmQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb25FbmRCZWhpbmQpICsgc2VsZWN0aW9uRW5kQmVoaW5kLmxlbmd0aCgpIC0gMTsKLQkJCi0JdGhpcy5jaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQlzZWxlY3Rpb25TdGFydCwKLQkJc2VsZWN0aW9uRW5kLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7Ci19Ci0KLS8qCi0gKiBidWdzIDMyMjkgT3Blbk9uU2VsZWN0aW9uIC0gc3RyYW5nZSBiZWhhdmlvdXIgb2YgY29kZSByZXNvbHZlICgxR0FWTDA4KQotICovCi1wdWJsaWMgdm9pZCB0ZXN0NDAoKSB7Ci0KLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHsgICAgICAgICAgICAgICAgXG4iICsKLQkJIiAgT2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgXG4iICsKLQkJIn0JCQkJCQkJCSBcbiI7Ci0JCQotCVN0cmluZyBzZWxlY3Rpb24gPSAiT2JqZWN0IjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxTZWxlY3RPblR5cGU6T2JqZWN0PiI7Ci0JCi0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIk9iamVjdCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICA8U2VsZWN0T25UeXBlOk9iamVjdD47XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gIk9iamVjdCI7Ci0JU3RyaW5nIHRlc3ROYW1lID0gIjxzZWxlY3QgZmFrZSBmaWVsZD4iOwotCi0JaW50IHNlbGVjdGlvblN0YXJ0ID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uKTsKLQlpbnQgc2VsZWN0aW9uRW5kID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uKSArIHNlbGVjdGlvbi5sZW5ndGgoKSAtIDE7Ci0JCQotCXRoaXMuY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJc2VsZWN0aW9uU3RhcnQsCi0JCXNlbGVjdGlvbkVuZCwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIGJ1Z3MgMTE0NzUgc2VsZWN0aW9uIG9uIGxvY2FsIG5hbWUuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3Q0MSgpIHsKLQotCVN0cmluZyBzdHIgPQotCQkicHVibGljIGNsYXNzIFggeyAgICAgICAgICAgICAgICBcbiIgKwotCQkiICBwdWJsaWMgdm9pZCBmb28oKXsgICAgICAgICAgICAgICAgICAgXG4iICsKLQkJIiAgICBPYmplY3QgdmFyOyAgICAgICAgICAgICAgXG4iICsKLQkJIiAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iICsKLQkJIn0JCQkJCQkJCSBcbiI7Ci0JCQotCVN0cmluZyBzZWxlY3Rpb24gPSAidmFyIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxTZWxlY3Rpb25PbkxvY2FsTmFtZTpPYmplY3QgdmFyPiI7Ci0JCi0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInZhciI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgdm9pZCBmb28oKSB7XG4iICsgCi0JCSIgICAgPFNlbGVjdGlvbk9uTG9jYWxOYW1lOk9iamVjdCB2YXI+O1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInZhciI7Ci0JU3RyaW5nIHRlc3ROYW1lID0gIjxzZWxlY3QgbG9jYWwgbmFtZT4iOwotCi0JaW50IHNlbGVjdGlvblN0YXJ0ID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uKTsKLQlpbnQgc2VsZWN0aW9uRW5kID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uKSArIHNlbGVjdGlvbi5sZW5ndGgoKSAtIDE7Ci0JCQotCXRoaXMuY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQlzZWxlY3Rpb25TdGFydCwKLQkJc2VsZWN0aW9uRW5kLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogYnVncyAxMTQ3NSBzZWxlY3Rpb24gb24gYXJndW1lbnQgbmFtZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdDQyKCkgewotCi0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7ICAgICAgICAgICAgICAgIFxuIiArCi0JCSIgIHB1YmxpYyB2b2lkIGZvbyhPYmplY3QgdmFyKXsgICAgICAgICAgXG4iICsKLQkJIiAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iICsKLQkJIn0JCQkJCQkJCSBcbiI7Ci0JCQotCVN0cmluZyBzZWxlY3Rpb24gPSAidmFyIjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxTZWxlY3Rpb25PbkFyZ3VtZW50TmFtZTpPYmplY3QgdmFyPiI7Ci0JCi0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gInZhciI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIiArIAotCQkiICBwdWJsaWMgWCgpIHtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkiICBwdWJsaWMgdm9pZCBmb28oPFNlbGVjdGlvbk9uQXJndW1lbnROYW1lOk9iamVjdCB2YXI+KSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIn1cbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAidmFyIjsKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHNlbGVjdCBhcmd1bWVudCBuYW1lPiI7Ci0KLQlpbnQgc2VsZWN0aW9uU3RhcnQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb24pOwotCWludCBzZWxlY3Rpb25FbmQgPSBzdHIuaW5kZXhPZihzZWxlY3Rpb24pICsgc2VsZWN0aW9uLmxlbmd0aCgpIC0gMTsKLQkJCi0JdGhpcy5jaGVja0RpZXRQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQlzZWxlY3Rpb25TdGFydCwKLQkJc2VsZWN0aW9uRW5kLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogYnVncyAxMTQ3NSBzZWxlY3Rpb24gb24gYXJndW1lbnQgbmFtZSBpbnNpZGUgY2F0Y2ggc3RhdGVtZW50LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0NDMoKSB7Ci0KLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHsgICAgICAgICAgICAgICAgXG4iICsKLQkJIiAgcHVibGljIHZvaWQgZm9vKCl7ICAgICAgICAgICAgICAgICAgIFxuIiArCi0JCSIgICAgdHJ5eyAgICAgICAgICAgICAgXG4iICsKLQkJIiAgICB9Y2F0Y2goT2JqZWN0IHZhcil7fVxuIiArCi0JCSIgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiArCi0JCSJ9CQkJCQkJCQkgXG4iOwotCQkKLQlTdHJpbmcgc2VsZWN0aW9uID0gInZhciI7Ci0JCi0JU3RyaW5nIGV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZyA9ICI8U2VsZWN0aW9uT25Bcmd1bWVudE5hbWU6T2JqZWN0IHZhcj4iOwotCQotCVN0cmluZyBjb21wbGV0aW9uSWRlbnRpZmllciA9ICJ2YXIiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgcHVibGljIFgoKSB7XG4iICsgCi0JCSIgIH1cbiIgKyAKLQkJIiAgcHVibGljIHZvaWQgZm9vKCkge1xuIiArIAotCQkiICAgIDxTZWxlY3Rpb25PbkFyZ3VtZW50TmFtZTpPYmplY3QgdmFyPjtcbiIgKyAKLQkJIiAgfVxuIiArIAotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJ2YXIiOwotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2VsZWN0IGFyZ3VtZW50IG5hbWUgaW5zaWRlIGNhdGNoIHN0YXRlbWVudD4iOwotCi0JaW50IHNlbGVjdGlvblN0YXJ0ID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uKTsKLQlpbnQgc2VsZWN0aW9uRW5kID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uKSArIHNlbGVjdGlvbi5sZW5ndGgoKSAtIDE7Ci0JCQotCXRoaXMuY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQlzZWxlY3Rpb25TdGFydCwKLQkJc2VsZWN0aW9uRW5kLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogYnVncyAxNTQzMAotICovCi1wdWJsaWMgdm9pZCB0ZXN0NDQoKSB7Ci0KLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHsgICAgICAgICAgICAgICAgXG4iICsKLQkJIiAgU3RyaW5nIHggPSBzdXBlci5mb28oKSAgXG4iICsKLQkJIn0JCQkJCQkJCSBcbiI7Ci0JCQotCVN0cmluZyBzZWxlY3Rpb24gPSAic3VwZXIiOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPFNlbGVjdE9uU3VwZXI6c3VwZXI+IjsKLQkKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAic3VwZXIiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAKLQkJIiAgU3RyaW5nIHggPSA8U2VsZWN0T25TdXBlcjpzdXBlcj47XG4iICsgCi0JCSIgIHB1YmxpYyBYKCkge1xuIiArIAotCQkiICB9XG4iICsgCi0JCSJ9XG4iOwotCVN0cmluZyBleHBlY3RlZFJlcGxhY2VkU291cmNlID0gInN1cGVyIjsKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHNlbGVjdCBzdXBlciBpbiBmaWVsZCBpbml0aWFsaXplcj4iOwotCi0JaW50IHNlbGVjdGlvblN0YXJ0ID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uKTsKLQlpbnQgc2VsZWN0aW9uRW5kID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uKSArIHNlbGVjdGlvbi5sZW5ndGgoKSAtIDE7Ci0JCQotCXRoaXMuY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJc2VsZWN0aW9uU3RhcnQsCi0JCXNlbGVjdGlvbkVuZCwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIGJ1Z3MgMTQ0NjgKLSAqLwotcHVibGljIHZvaWQgdGVzdDQ1KCkgewotCi0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7ICAgICAgICAgICAgICAgIFxuIiArCi0JCSIgIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgaWYoeCBpbnN0YW5jZW9mIE9iamVjdCl7XG4iICsKLQkJIiAgICB9XG4iICsKLQkJIiAgfSAgXG4iICsKLQkJIn0JCQkJCQkJCSBcbiI7Ci0JCQotCVN0cmluZyBzZWxlY3Rpb24gPSAiT2JqZWN0IjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxTZWxlY3RPblR5cGU6T2JqZWN0PiI7Ci0JCi0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIk9iamVjdCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIisKLQkJIiAgcHVibGljIFgoKSB7XG4iKwotCQkiICB9XG4iKwotCQkiICB2b2lkIGZvbygpIHtcbiIrCi0JCSIgICAgPFNlbGVjdE9uVHlwZTpPYmplY3Q+O1xuIisKLQkJIiAgfVxuIisKLQkJIn1cbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiT2JqZWN0IjsKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHNlbGVjdCBpbnNpZGUgaW5zdGFuY2VvZiBzdGF0ZW1lbnQ+IjsKLQotCWludCBzZWxlY3Rpb25TdGFydCA9IHN0ci5pbmRleE9mKHNlbGVjdGlvbik7Ci0JaW50IHNlbGVjdGlvbkVuZCA9IHN0ci5pbmRleE9mKHNlbGVjdGlvbikgKyBzZWxlY3Rpb24ubGVuZ3RoKCkgLSAxOwotCQkKLQl0aGlzLmNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJc2VsZWN0aW9uU3RhcnQsCi0JCXNlbGVjdGlvbkVuZCwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOwotfQotCi0vKgotICogYnVncyAxNDQ2OAotICovCi1wdWJsaWMgdm9pZCB0ZXN0NDYoKSB7Ci0KLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHsgICAgICAgICAgICAgICAgXG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgICB5ID0geCBpbnN0YW5jZW9mIE9iamVjdDtcbiIgKwotCQkiICB9ICBcbiIgKwotCQkifQkJCQkJCQkJIFxuIjsKLQkJCi0JU3RyaW5nIHNlbGVjdGlvbiA9ICJPYmplY3QiOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPFNlbGVjdE9uVHlwZTpPYmplY3Q+IjsKLQkKLQlTdHJpbmcgY29tcGxldGlvbklkZW50aWZpZXIgPSAiT2JqZWN0IjsKLQlTdHJpbmcgZXhwZWN0ZWRVbml0RGlzcGxheVN0cmluZyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iKwotCQkiICBwdWJsaWMgWCgpIHtcbiIrCi0JCSIgIH1cbiIrCi0JCSIgIHZvaWQgZm9vKCkge1xuIisKLQkJIiAgICA8U2VsZWN0T25UeXBlOk9iamVjdD47XG4iKwotCQkiICB9XG4iKwotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJPYmplY3QiOwotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2VsZWN0IGluc2lkZSBpbnN0YW5jZW9mIHN0YXRlbWVudD4iOwotCi0JaW50IHNlbGVjdGlvblN0YXJ0ID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uKTsKLQlpbnQgc2VsZWN0aW9uRW5kID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uKSArIHNlbGVjdGlvbi5sZW5ndGgoKSAtIDE7Ci0JCQotCXRoaXMuY2hlY2tNZXRob2RQYXJzZSgKLQkJc3RyLnRvQ2hhckFycmF5KCksIAotCQlzZWxlY3Rpb25TdGFydCwKLQkJc2VsZWN0aW9uRW5kLAotCQlleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcsCi0JCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCWNvbXBsZXRpb25JZGVudGlmaWVyLAotCQlleHBlY3RlZFJlcGxhY2VkU291cmNlLAotCQl0ZXN0TmFtZSk7Ci19Ci0vKgotICogYnVncyAxNDQ2OAotICovCi1wdWJsaWMgdm9pZCB0ZXN0NDcoKSB7Ci0KLQlTdHJpbmcgc3RyID0KLQkJInB1YmxpYyBjbGFzcyBYIHsgICAgICAgICAgICAgICAgXG4iICsKLQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgIGJvb2xlYW4geSA9IHggaW5zdGFuY2VvZiBPYmplY3Q7XG4iICsKLQkJIiAgfSAgXG4iICsKLQkJIn0JCQkJCQkJCSBcbiI7Ci0JCQotCVN0cmluZyBzZWxlY3Rpb24gPSAiT2JqZWN0IjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxTZWxlY3RPblR5cGU6T2JqZWN0PiI7Ci0JCi0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIk9iamVjdCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIisKLQkJIiAgcHVibGljIFgoKSB7XG4iKwotCQkiICB9XG4iKwotCQkiICB2b2lkIGZvbygpIHtcbiIrCi0JCSIgICAgYm9vbGVhbiB5ID0gPFNlbGVjdE9uVHlwZTpPYmplY3Q+O1xuIisKLQkJIiAgfVxuIisKLQkJIn1cbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAiT2JqZWN0IjsKLQlTdHJpbmcgdGVzdE5hbWUgPSAiPHNlbGVjdCBpbnNpZGUgaW5zdGFuY2VvZiBzdGF0ZW1lbnQ+IjsKLQotCWludCBzZWxlY3Rpb25TdGFydCA9IHN0ci5pbmRleE9mKHNlbGVjdGlvbik7Ci0JaW50IHNlbGVjdGlvbkVuZCA9IHN0ci5pbmRleE9mKHNlbGVjdGlvbikgKyBzZWxlY3Rpb24ubGVuZ3RoKCkgLSAxOwotCQkKLQl0aGlzLmNoZWNrTWV0aG9kUGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJc2VsZWN0aW9uU3RhcnQsCi0JCXNlbGVjdGlvbkVuZCwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIGJ1Z3MgMTQ0NjgKLSAqLwotcHVibGljIHZvaWQgdGVzdDQ4KCkgewotCi0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7ICAgICAgICAgICAgICAgIFxuIiArCi0JCSIgIGJvb2xlYW4geSA9IHggaW5zdGFuY2VvZiBPYmplY3Q7XG4iICsKLQkJIn0JCQkJCQkJCSBcbiI7Ci0JCQotCVN0cmluZyBzZWxlY3Rpb24gPSAiT2JqZWN0IjsKLQkKLQlTdHJpbmcgZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nID0gIjxTZWxlY3RPblR5cGU6T2JqZWN0PiI7Ci0JCi0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIk9iamVjdCI7Ci0JU3RyaW5nIGV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcgPQotCQkicHVibGljIGNsYXNzIFgge1xuIisKLQkJIiAgYm9vbGVhbiB5ID0gPFNlbGVjdE9uVHlwZTpPYmplY3Q+O1xuIisKLQkJIiAgcHVibGljIFgoKSB7XG4iKwotCQkiICB9XG4iKwotCQkifVxuIjsKLQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJPYmplY3QiOwotCVN0cmluZyB0ZXN0TmFtZSA9ICI8c2VsZWN0IGluc2lkZSBpbnN0YW5jZW9mIHN0YXRlbWVudD4iOwotCi0JaW50IHNlbGVjdGlvblN0YXJ0ID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uKTsKLQlpbnQgc2VsZWN0aW9uRW5kID0gc3RyLmluZGV4T2Yoc2VsZWN0aW9uKSArIHNlbGVjdGlvbi5sZW5ndGgoKSAtIDE7Ci0JCQotCXRoaXMuY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJc2VsZWN0aW9uU3RhcnQsCi0JCXNlbGVjdGlvbkVuZCwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIGJ1Z3MgMjgwNjQKLSAqLwotcHVibGljIHZvaWQgdGVzdDQ5KCkgewotCi0JU3RyaW5nIHN0ciA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7ICAgICAgICAgICAgICAgIFxuIiArCi0JCSIgIFggeCA9IG5ldyBYKCl7fVxuIiArCi0JCSJ9CQkJCQkJCQkgXG4iOwotCQkKLQlTdHJpbmcgc2VsZWN0aW9uID0gIlgiOwotCQotCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPFNlbGVjdE9uQWxsb2NhdGlvbkV4cHJlc3Npb246bmV3IFgoKSB7XG4iICsKLQkJCQkJCQkJCQkJIiAgKCkge1xuIiArCi0JCQkJCQkJCQkJCSIgICAgc3VwZXIoKTtcbiIgKwotCQkJCQkJCQkJCQkiICB9XG4iICsgCi0JCQkJCQkJCQkJCSJ9PiI7Ci0JCi0JU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gIlgiOwotCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIrCi0JCSIgIFggeCA9IDxTZWxlY3RPbkFsbG9jYXRpb25FeHByZXNzaW9uOm5ldyBYKCkge1xuIiArCi0JCSIgICAgKCkge1xuIiArCi0JCSIgICAgICBzdXBlcigpO1xuIiArCi0JCSIgICAgfVxuIiArIAotCQkiICB9PjtcbiIrCi0JCSIgIHB1YmxpYyBYKCkge1xuIisKLQkJIiAgfVxuIisKLQkJIn1cbiI7Ci0JU3RyaW5nIGV4cGVjdGVkUmVwbGFjZWRTb3VyY2UgPSAibmV3IFgoKSI7Ci0JU3RyaW5nIHRlc3ROYW1lID0gIjxzZWxlY3QgYW5vbnltb3VzIHR5cGU+IjsKLQotCWludCBzZWxlY3Rpb25TdGFydCA9IHN0ci5sYXN0SW5kZXhPZihzZWxlY3Rpb24pOwotCWludCBzZWxlY3Rpb25FbmQgPSBzdHIubGFzdEluZGV4T2Yoc2VsZWN0aW9uKSArIHNlbGVjdGlvbi5sZW5ndGgoKSAtIDE7Ci0JCQotCXRoaXMuY2hlY2tEaWV0UGFyc2UoCi0JCXN0ci50b0NoYXJBcnJheSgpLCAKLQkJc2VsZWN0aW9uU3RhcnQsCi0JCXNlbGVjdGlvbkVuZCwKLQkJZXhwZWN0ZWRDb21wbGV0aW9uTm9kZVRvU3RyaW5nLAotCQlleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nLAotCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSwKLQkJdGVzdE5hbWUpOwotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3BhcnNlci9TZWxlY3Rpb25UZXN0Mi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3BhcnNlci9TZWxlY3Rpb25UZXN0Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzhhYzU5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvU2VsZWN0aW9uVGVzdDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyLnBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LnNlbGVjdC5TZWxlY3Rpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3Quc2VsZWN0LlNlbGVjdGlvblNjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5EZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5hc3QuQWJzdHJhY3RNZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkFzdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Db21waWxhdGlvblVuaXREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LkZpZWxkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmFzdC5Jbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYXN0LlR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYmF0Y2guQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uRGVmYXVsdFByb2JsZW1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLlByb2JsZW1SZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIFNlbGVjdGlvblRlc3QyIGV4dGVuZHMgQWJzdHJhY3RTZWxlY3Rpb25UZXN0IHsKLQotcHVibGljIFNlbGVjdGlvblRlc3QyKFN0cmluZyB0ZXN0TmFtZSkgewotCXN1cGVyKHRlc3ROYW1lKTsKLX0KLWJvb2xlYW4gdGhlcmVXYXNBbk5QRSA9IGZhbHNlOwotcHJpdmF0ZSBjbGFzcyBTcGVjaWFsU2VsZWN0aW9uUGFyc2VyIGV4dGVuZHMgU2VsZWN0aW9uUGFyc2VyIHsKLQlwdWJsaWMgU3BlY2lhbFNlbGVjdGlvblBhcnNlcihQcm9ibGVtUmVwb3J0ZXIgcHJvYmxlbVJlcG9ydGVyLCBsb25nIHNvdXJjZUxldmVsKSB7Ci0JCXN1cGVyKHByb2JsZW1SZXBvcnRlciwgc291cmNlTGV2ZWwpOwotCX0KLQlwdWJsaWMgdm9pZCBkb05QRUluUGFyc2VyKCl7Ci0JCXRoaXMuc3RhY2sgPSBudWxsOwotCX0KLX0KLQotIFNwZWNpYWxTZWxlY3Rpb25QYXJzZXIgY3JlYXRlUGFyc2VyKCl7Ci0JQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMgPSBuZXcgQ29tcGlsZXJPcHRpb25zKCk7Ci0JU3BlY2lhbFNlbGVjdGlvblBhcnNlciBwYXJzZXIgPSAKLQkJbmV3IFNwZWNpYWxTZWxlY3Rpb25QYXJzZXIoCi0JCQluZXcgUHJvYmxlbVJlcG9ydGVyKAotCQkJCURlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXMucHJvY2VlZFdpdGhBbGxQcm9ibGVtcygpLCAKLQkJCQlvcHRpb25zLCAKLQkJCQluZXcgRGVmYXVsdFByb2JsZW1GYWN0b3J5KExvY2FsZS5nZXREZWZhdWx0KCkpKSwKLQkJCW9wdGlvbnMuc291cmNlTGV2ZWwpOwotCXJldHVybiBwYXJzZXI7Ci19Ci12b2lkIGNoZWNrTWV0aG9kUGFyc2UoCi0JCVNlbGVjdGlvblBhcnNlciBwYXJzZXIsCi0JCWNoYXJbXSBzb3VyY2UsIAotCQlpbnQgc2VsZWN0aW9uU3RhcnQsCi0JCWludCBzZWxlY3Rpb25FbmQsIAotCQlTdHJpbmcgZXhwZWN0ZWRTZWxlY3Rpb24sIAotCQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcsIAotCQlTdHJpbmcgZXhwZWN0ZWRTZWxlY3Rpb25JZGVudGlmaWVyLCAKLQkJU3RyaW5nIGV4cGVjdGVkU2VsZWN0ZWRTb3VyY2UsCi0KLQkJU3RyaW5nIHRlc3ROYW1lKSB7Ci0KLQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBuZXcgQ29tcGlsYXRpb25Vbml0KHNvdXJjZSwgdGVzdE5hbWUsIG51bGwpOwotCUNvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGF0aW9uUmVzdWx0ID0gbmV3IENvbXBpbGF0aW9uUmVzdWx0KHNvdXJjZVVuaXQsIDAsIDAsIDApOwkKLQotCUNvbXBpbGF0aW9uVW5pdERlY2xhcmF0aW9uIHVuaXQgPSBwYXJzZXIuZGlldFBhcnNlKHNvdXJjZVVuaXQsIGNvbXBpbGF0aW9uUmVzdWx0LCBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTsKLQotCUFzdE5vZGUgZm91bmRNZXRob2QgPSBudWxsOwotCWlmICh1bml0LnR5cGVzICE9IG51bGwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1bml0LnR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUeXBlRGVjbGFyYXRpb24gdHlwZSA9IHVuaXQudHlwZXNbaV07Ci0JCQlBc3ROb2RlIG1ldGhvZCA9IGZpbmRNZXRob2QodHlwZSwgc2VsZWN0aW9uU3RhcnQpOwotCQkJaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0JCQkJZm91bmRNZXRob2QgPSBtZXRob2Q7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JYXNzZXJ0VHJ1ZSgibm8gbWV0aG9kIGZvdW5kIGF0IGN1cnNvciBsb2NhdGlvbiIsIGZvdW5kTWV0aG9kICE9IG51bGwpOwotCWlmIChmb3VuZE1ldGhvZCBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kRGVjbGFyYXRpb24pIHsKLQkJcGFyc2VyLnBhcnNlQmxvY2tTdGF0ZW1lbnRzKChBYnN0cmFjdE1ldGhvZERlY2xhcmF0aW9uKWZvdW5kTWV0aG9kLCB1bml0KTsKLQl9IGVsc2UgewotCQlUeXBlRGVjbGFyYXRpb24gdHlwZSA9IChUeXBlRGVjbGFyYXRpb24pZm91bmRNZXRob2Q7Ci0JCWlmICh0eXBlLmZpZWxkcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGUuZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZCA9IHR5cGUuZmllbGRzW2ldOwotCQkJCWlmIChmaWVsZCBpbnN0YW5jZW9mIEluaXRpYWxpemVyICYmIGZpZWxkLnNvdXJjZVN0YXJ0IDw9IHNlbGVjdGlvblN0YXJ0ICYmIHNlbGVjdGlvblN0YXJ0IDw9IGZpZWxkLnNvdXJjZUVuZCkgewotCQkJCQlwYXJzZXIucGFyc2VCbG9ja1N0YXRlbWVudHMoKEluaXRpYWxpemVyKWZpZWxkLCB0eXBlLCB1bml0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JU3RyaW5nIGNvbXB1dGVkVW5pdFRvU3RyaW5nID0gdW5pdC50b1N0cmluZygpOwotCS8vU3lzdGVtLm91dC5wcmludGxuKGNvbXB1dGVkVW5pdFRvU3RyaW5nKTsKLQkvL1N5c3RlbS5vdXQucHJpbnRsbihVdGlsLmRpc3BsYXlTdHJpbmcoY29tcHV0ZWRVbml0VG9TdHJpbmcpKTsKLQkvL1N5c3RlbS5vdXQucHJpbnRsbihleHBlY3RlZFVuaXRUb1N0cmluZyk7CQotCQotCVN0cmluZyBjb21wdXRlZENvbXBsZXRpb24gPSBwYXJzZXIuYXNzaXN0Tm9kZSA9PSBudWxsIAotCQkJCQkJCQk/IE5PTkUKLQkJCQkJCQkJOiBwYXJzZXIuYXNzaXN0Tm9kZS50b1N0cmluZygwKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJpbnZhbGlkIHNlbGVjdGlvbiBub2RlLSIgKyB0ZXN0TmFtZSwKLQkJZXhwZWN0ZWRTZWxlY3Rpb24sCi0JCWNvbXB1dGVkQ29tcGxldGlvbik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJpbnZhbGlkIHNlbGVjdGlvbiBsb2NhdGlvbi0iK3Rlc3ROYW1lLAotCQlleHBlY3RlZFVuaXRUb1N0cmluZywKLQkJY29tcHV0ZWRVbml0VG9TdHJpbmcpOwotCi0JaWYgKGV4cGVjdGVkU2VsZWN0aW9uSWRlbnRpZmllciAhPSBudWxsKXsKLQkJY2hhcltdIGNoYXJzID0gKChTZWxlY3Rpb25TY2FubmVyKXBhcnNlci5zY2FubmVyKS5zZWxlY3Rpb25JZGVudGlmaWVyOwotCQlTdHJpbmcgY29tcHV0ZWRTZWxlY3Rpb25JZGVudGlmaWVyID0gY2hhcnMgPT0gbnVsbCA/IE5PTkUgOiBuZXcgU3RyaW5nKGNoYXJzKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJImludmFsaWQgc2VsZWN0aW9uIGlkZW50aWZpZXItIiArIHRlc3ROYW1lLAotCQkJZXhwZWN0ZWRTZWxlY3Rpb25JZGVudGlmaWVyLAotCQkJY29tcHV0ZWRTZWxlY3Rpb25JZGVudGlmaWVyKTsKLQl9Ci0JaWYgKGV4cGVjdGVkU2VsZWN0ZWRTb3VyY2UgIT0gbnVsbCl7Ci0JCWNoYXJbXSBjaGFycyA9IG51bGw7Ci0JCWlmIChwYXJzZXIuYXNzaXN0Tm9kZSAhPSBudWxsKXsKLQkJCWNoYXJzID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheSgKLQkJCQlwYXJzZXIuc2Nhbm5lci5zb3VyY2UsIAotCQkJCXBhcnNlci5hc3Npc3ROb2RlLnNvdXJjZVN0YXJ0LCAKLQkJCQlwYXJzZXIuYXNzaXN0Tm9kZS5zb3VyY2VFbmQgKyAxKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChwYXJzZXIuYXNzaXN0SWRlbnRpZmllcigpICE9IG51bGwpewotCQkJCWlmICgoKFNlbGVjdGlvblNjYW5uZXIpcGFyc2VyLnNjYW5uZXIpLnNlbGVjdGlvbkVuZCAKLQkJCQkJPj0gKChTZWxlY3Rpb25TY2FubmVyKXBhcnNlci5zY2FubmVyKS5zZWxlY3Rpb25TdGFydCl7Ci0JCQkJCWNoYXJzID0gQ2hhck9wZXJhdGlvbi5zdWJhcnJheSgKLQkJCQkJCXBhcnNlci5zY2FubmVyLnNvdXJjZSwgCi0JCQkJCQkoKFNlbGVjdGlvblNjYW5uZXIpcGFyc2VyLnNjYW5uZXIpLnNlbGVjdGlvblN0YXJ0LCAKLQkJCQkJCSgoU2VsZWN0aW9uU2Nhbm5lcilwYXJzZXIuc2Nhbm5lcikuc2VsZWN0aW9uRW5kICsgMSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVN0cmluZyBjb21wdXRlZFJlcGxhY2VkU291cmNlICA9IGNoYXJzID09IG51bGwgPyBOT05FIDogbmV3IFN0cmluZyhjaGFycyk7Ci0JCWFzc2VydEVxdWFscygKLQkJCSJpbnZhbGlkIHJlcGxhY2VkIHNvdXJjZS0iICsgdGVzdE5hbWUsCi0JCQlleHBlY3RlZFNlbGVjdGVkU291cmNlLAotCQkJY29tcHV0ZWRSZXBsYWNlZFNvdXJjZSk7Ci0JfQotfQotLyoKLSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA5NDYKLSAqLwotcHVibGljIHZvaWQgdGVzdEJ1ZzMwOTQ2KCkgewotCWZpbmFsIFNwZWNpYWxTZWxlY3Rpb25QYXJzZXIgcGFyc2VyID0gY3JlYXRlUGFyc2VyKCk7Ci0JVGhyZWFkIHF1ZXJ5ID0gbmV3IFRocmVhZCgKLQkJbmV3IFJ1bm5hYmxlKCl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKXsKLQkJCQlTdHJpbmcgc3RyID0KLQkJCQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkJCQkiCXZvaWQgZm9vKCkge1xuIiArCi0JCQkJCSIJCWlmICh0cnVlKSB7XG4iICsKLQkJCQkJIgkJCWlmKClcbiIgKwotCQkJCQkiCQkJc3dpdGNoICgxKSB7XG4iICsKLQkJCQkJIgkJCQljYXNlIEEuQjpcbiIgKwotCQkJCQkiCQkJCQlDIGQ9IChDKSBzO1xuIiArCi0JCQkJCSIJCQkJCWhlcmVcbiIgKwotCQkJCQkiCQkJfVxuIiArCi0JCQkJCSIJCX1cbiIgKwotCQkJCQkiCX1cbiIgKwotCQkJCQkifW4iOwotCQkJCQkKLQkJCQlTdHJpbmcgc2VsZWN0aW9uID0gImhlcmUiOwotCQkJCQotCQkJCVN0cmluZyBleHBlY3RlZENvbXBsZXRpb25Ob2RlVG9TdHJpbmcgPSAiPFNlbGVjdE9uTmFtZTpoZXJlPiI7Ci0JCQkJCi0JCQkJU3RyaW5nIGNvbXBsZXRpb25JZGVudGlmaWVyID0gImhlcmUiOwotCQkJCVN0cmluZyBleHBlY3RlZFVuaXREaXNwbGF5U3RyaW5nID0KLQkJCQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkJCQkiICBwdWJsaWMgQSgpIHtcbiIgKwotCQkJCQkiICB9XG4iICsKLQkJCQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJCQkJIiAgICB7XG4iICsKLQkJCQkJIiAgICAgIHtcbiIgKwotCQkJCQkiICAgICAgICBDIGQ7XG4iICsKLQkJCQkJIiAgICAgICAgPFNlbGVjdE9uTmFtZTpoZXJlPjtcbiIgKwotCQkJCQkiICAgICAgfVxuIiArCi0JCQkJCSIgICAgfVxuIiArCi0JCQkJCSIgIH1cbiIgKwotCQkJCQkifVxuIjsKLQkJCQlTdHJpbmcgZXhwZWN0ZWRSZXBsYWNlZFNvdXJjZSA9ICJoZXJlIjsKLQkJCQlTdHJpbmcgdGVzdE5hbWUgPSAiPGluaWZpbml0ZSBsb29wIHRlc3Q+IjsKLQkJCQotCQkJCWludCBzZWxlY3Rpb25TdGFydCA9IHN0ci5sYXN0SW5kZXhPZihzZWxlY3Rpb24pOwotCQkJCWludCBzZWxlY3Rpb25FbmQgPSBzdHIubGFzdEluZGV4T2Yoc2VsZWN0aW9uKSArIHNlbGVjdGlvbi5sZW5ndGgoKSAtIDE7Ci0KLQkJCQl0cnkgewotCQkJCQlTZWxlY3Rpb25UZXN0Mi50aGlzLmNoZWNrTWV0aG9kUGFyc2UoCi0JCQkJCQlwYXJzZXIsCi0JCQkJCQlzdHIudG9DaGFyQXJyYXkoKSwgCi0JCQkJCQlzZWxlY3Rpb25TdGFydCwKLQkJCQkJCXNlbGVjdGlvbkVuZCwKLQkJCQkJCWV4cGVjdGVkQ29tcGxldGlvbk5vZGVUb1N0cmluZywKLQkJCQkJCWV4cGVjdGVkVW5pdERpc3BsYXlTdHJpbmcsCi0JCQkJCQljb21wbGV0aW9uSWRlbnRpZmllciwKLQkJCQkJCWV4cGVjdGVkUmVwbGFjZWRTb3VyY2UsCi0JCQkJCQl0ZXN0TmFtZSk7Ci0JCQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJCQlTZWxlY3Rpb25UZXN0Mi50aGlzLnRoZXJlV2FzQW5OUEUgPSB0cnVlOwotCQkJCX0KLQkJfQotCX0pOwotCQotCXF1ZXJ5LnN0YXJ0KCk7Ci0JdHJ5IHsKLQkJVGhyZWFkLnNsZWVwKDUwMCk7Ci0JfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCX0KLQkvLyBmb3JjZSBwYXJzZXIgdG8gc3RvcAotCXBhcnNlci5kb05QRUluUGFyc2VyKCk7Ci0JdHJ5IHsKLQkJVGhyZWFkLnNsZWVwKDUwMCk7Ci0JfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRUcnVlKCJ0aGVyZSBpcyBhbiBpbmZpbml0ZSBsb29wIiwgIXRoZXJlV2FzQW5OUEUpOwotCQotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3BhcnNlci9TaW5nbGVDb21wbGV0aW9uVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3BhcnNlci9TaW5nbGVDb21wbGV0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWI3MDkzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvU2luZ2xlQ29tcGxldGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIucGFyc2VyOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBPbmx5IDEgdGVzdCBzaG91bGQgYmUgaW4gdGhpcyBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgU2luZ2xlQ29tcGxldGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdENvbXBsZXRpb25UZXN0IHsKLS8qKgotICogU2luZ2xlQ29tcGxldGlvblRlc3QgY29uc3RydWN0b3IgY29tbWVudC4KLSAqIEBwYXJhbSB0ZXN0TmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLXB1YmxpYyBTaW5nbGVDb21wbGV0aW9uVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLQlzdXBlcih0ZXN0TmFtZSk7Ci19Ci1wcml2YXRlIHZvaWQgcnVuKENsYXNzIHRlc3RDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQl0cnkgewotCQlqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IHRlc3RDbGFzcy5nZXREZWNsYXJlZENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHtTdHJpbmcuY2xhc3N9KTsKLQkJVGVzdENhc2UgdGVzdCA9IChUZXN0Q2FzZSljb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W10geyJzaW5nbGUgY29tcGxldGlvbiB0ZXN0In0pOwotCQlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kID0gdGVzdENsYXNzLmdldERlY2xhcmVkTWV0aG9kKG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHt9KTsKLQkJbWV0aG9kLmludm9rZSh0ZXN0LCBuZXcgT2JqZWN0W10ge30pOwotCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCVRocm93YWJsZSB0YXJnZXQgPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotCQkJdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pdGFyZ2V0OwotCQl9Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBFcnJvcikgewotCQkJdGhyb3cgKEVycm9yKXRhcmdldDsKLQkJfQotCQl0aHJvdyBuZXcgRXJyb3IodGFyZ2V0LmdldE1lc3NhZ2UoKSk7Ci0JfQotfQotLyoKLSAqIFRoZSB0ZXN0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0KCkgewotCXJ1bihOYW1lUmVmZXJlbmNlQ29tcGxldGlvblRlc3QuY2xhc3MsICJ0ZXN0TWV0aG9kSW52b2NhdGlvbkFub255bW91c0lubmVyQ2xhc3MyIik7Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL1NvdXJjZUVsZW1lbnRQYXJzZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL1NvdXJjZUVsZW1lbnRQYXJzZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlODliZDMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3BhcnNlci9Tb3VyY2VFbGVtZW50UGFyc2VyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyLnBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSVNvdXJjZUVsZW1lbnRSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLlNvdXJjZUVsZW1lbnRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmJhdGNoLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbXBpbGVyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5EZWZhdWx0UHJvYmxlbUZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBTb3VyY2VFbGVtZW50UGFyc2VyVGVzdCBleHRlbmRzIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmp1bml0LmV4dGVuc2lvbi5UZXN0Q2FzZSBpbXBsZW1lbnRzIElTb3VyY2VFbGVtZW50UmVxdWVzdG9yLCBJQ29uc3RhbnRzIHsKLQlwcml2YXRlIFNvdXJjZVR5cGUgY3VycmVudFR5cGU7Ci0JcHJpdmF0ZSBTb3VyY2VNZXRob2QgY3VycmVudE1ldGhvZDsKLQlwcml2YXRlIFNvdXJjZUZpZWxkIGN1cnJlbnRGaWVsZDsKLQlwcml2YXRlIFNvdXJjZUluaXRpYWxpemVyIGN1cnJlbnRJbml0aWFsaXplcjsKLQlwcml2YXRlIGNoYXJbXSBzb3VyY2U7Ci0JcHJpdmF0ZSBTb3VyY2VQYWNrYWdlIGN1cnJlbnRQYWNrYWdlOwotCXByaXZhdGUgU291cmNlSW1wb3J0W10gY3VycmVudEltcG9ydHM7Ci0JcHJpdmF0ZSBpbnQgbnVtYmVyT2ZJbXBvcnRzOwotcHVibGljIFNvdXJjZUVsZW1lbnRQYXJzZXJUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotCXN1cGVyKHRlc3ROYW1lKTsKLX0KLXB1YmxpYyBTb3VyY2VFbGVtZW50UGFyc2VyVGVzdChTdHJpbmcgdGVzdE5hbWUsIGNoYXJbXSBzb3VyY2UpIHsKLQlzdXBlcih0ZXN0TmFtZSk7Ci0JdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci19Ci0vKioKLSAqIGFjY2VwdENvbnN0cnVjdG9yUmVmZXJlbmNlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgdm9pZCBhY2NlcHRDb25zdHJ1Y3RvclJlZmVyZW5jZShjaGFyW10gdHlwZU5hbWUsIGludCBhcmdDb3VudCwgaW50IHNvdXJjZVBvc2l0aW9uKSB7Ci0JaWYgKGN1cnJlbnRNZXRob2QgPT0gbnVsbCkgewotCQlpZiAoY3VycmVudFR5cGUgIT0gbnVsbCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWJ1ZmZlci5hcHBlbmQodHlwZU5hbWUpLmFwcGVuZCgiKCIpLmFwcGVuZChhcmdDb3VudCkuYXBwZW5kKCIpXG4iKTsKLQkJCWN1cnJlbnRUeXBlLnNldERlZmF1bHRDb25zdHJ1Y3RvcihidWZmZXIudG9TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuOwkJCi0JfQotCWlmIChjdXJyZW50TWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKHR5cGVOYW1lKS5hcHBlbmQoIigiKS5hcHBlbmQoYXJnQ291bnQpLmFwcGVuZCgiKVxuIik7Ci0JCWN1cnJlbnRNZXRob2Quc2V0RXhwbGljaXRDb25zdHJ1Y3RvckNhbGwoYnVmZmVyLnRvU3RyaW5nKCkpOwotCX0gZWxzZSB7Ci0JCWlmIChjdXJyZW50VHlwZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJYnVmZmVyLmFwcGVuZCh0eXBlTmFtZSkuYXBwZW5kKCIoIikuYXBwZW5kKGFyZ0NvdW50KS5hcHBlbmQoIilcbiIpOwotCQkJY3VycmVudFR5cGUuc2V0RGVmYXVsdENvbnN0cnVjdG9yKGJ1ZmZlci50b1N0cmluZygpKTsKLQkJfQkJCi0JfQotfQotLyoqCi0gKiBhY2NlcHRGaWVsZFJlZmVyZW5jZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHZvaWQgYWNjZXB0RmllbGRSZWZlcmVuY2UoY2hhcltdIGZpZWxkTmFtZSwgaW50IHNvdXJjZVBvc2l0aW9uKSB7fQotLyoqCi0gKiBhY2NlcHRJbXBvcnQgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyB2b2lkIGFjY2VwdEltcG9ydCgKLQlpbnQgZGVjbGFyYXRpb25TdGFydCwgCi0JaW50IGRlY2xhcmF0aW9uRW5kLCAKLQljaGFyW10gbmFtZSwgCi0JYm9vbGVhbiBvbkRlbWFuZCwKLQlpbnQgbW9kaWZpZXJzKSB7Ci0KLQlhZGRJbXBvcnQoCi0JCW5ldyBTb3VyY2VJbXBvcnQoZGVjbGFyYXRpb25TdGFydCwgZGVjbGFyYXRpb25FbmQsIG5hbWUsIG9uRGVtYW5kLCBtb2RpZmllcnMsIHNvdXJjZSkpOyAKLX0KLS8qKgotICogYWNjZXB0TGluZVNlcGFyYXRvclBvc2l0aW9ucyBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHZvaWQgYWNjZXB0TGluZVNlcGFyYXRvclBvc2l0aW9ucyhpbnRbXSBwb3NpdGlvbnMpIHt9Ci0vKioKLSAqIGFjY2VwdE1ldGhvZFJlZmVyZW5jZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHZvaWQgYWNjZXB0TWV0aG9kUmVmZXJlbmNlKGNoYXJbXSBtZXRob2ROYW1lLCBpbnQgYXJnQ291bnQsIGludCBzb3VyY2VQb3NpdGlvbikge30KLS8qKgotICogYWNjZXB0UGFja2FnZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHZvaWQgYWNjZXB0UGFja2FnZSgKLQlpbnQgZGVjbGFyYXRpb25TdGFydCwgCi0JaW50IGRlY2xhcmF0aW9uRW5kLCAKLQljaGFyW10gbmFtZSkgewotCi0JY3VycmVudFBhY2thZ2UgPSAKLQkJbmV3IFNvdXJjZVBhY2thZ2UoZGVjbGFyYXRpb25TdGFydCwgZGVjbGFyYXRpb25FbmQsIG5hbWUsIHNvdXJjZSk7IAotfQotLyoqCi0gKiBhY2NlcHRQcm9ibGVtIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgdm9pZCBhY2NlcHRQcm9ibGVtKElQcm9ibGVtIHByb2JsZW0pIHt9Ci0vKioKLSAqIGFjY2VwdFR5cGVSZWZlcmVuY2UgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyB2b2lkIGFjY2VwdFR5cGVSZWZlcmVuY2UoY2hhcltdW10gdHlwZU5hbWUsIGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCkge30KLS8qKgotICogYWNjZXB0VHlwZVJlZmVyZW5jZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHZvaWQgYWNjZXB0VHlwZVJlZmVyZW5jZShjaGFyW10gdHlwZU5hbWUsIGludCBzb3VyY2VQb3NpdGlvbikge30KLS8qKgotICogYWNjZXB0VW5rbm93blJlZmVyZW5jZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHZvaWQgYWNjZXB0VW5rbm93blJlZmVyZW5jZShjaGFyW11bXSBuYW1lLCBpbnQgc291cmNlU3RhcnQsIGludCBzb3VyY2VFbmQpIHt9Ci0vKioKLSAqIGFjY2VwdFVua25vd25SZWZlcmVuY2UgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyB2b2lkIGFjY2VwdFVua25vd25SZWZlcmVuY2UoY2hhcltdIG5hbWUsIGludCBzb3VyY2VQb3NpdGlvbikge30KLXByb3RlY3RlZCB2b2lkIGFkZEltcG9ydChTb3VyY2VJbXBvcnQgc291cmNlSW1wb3J0KSB7Ci0JaWYgKGN1cnJlbnRJbXBvcnRzID09IG51bGwpIHsKLQkJY3VycmVudEltcG9ydHMgPSBuZXcgU291cmNlSW1wb3J0WzRdOwotCX0KLQotCWlmIChudW1iZXJPZkltcG9ydHMgPT0gY3VycmVudEltcG9ydHMubGVuZ3RoKSB7Ci0JCVN5c3RlbS5hcnJheWNvcHkoCi0JCQljdXJyZW50SW1wb3J0cywgCi0JCQkwLCAKLQkJCWN1cnJlbnRJbXBvcnRzID0gbmV3IFNvdXJjZUltcG9ydFtudW1iZXJPZkltcG9ydHMgKiAyXSwgCi0JCQkwLCAKLQkJCW51bWJlck9mSW1wb3J0cyk7IAotCX0KLQljdXJyZW50SW1wb3J0c1tudW1iZXJPZkltcG9ydHMrK10gPSBzb3VyY2VJbXBvcnQ7Ci19Ci1wdWJsaWMgdm9pZCBkaWV0UGFyc2UoU3RyaW5nIHMsIFN0cmluZyB0ZXN0TmFtZSkgewotCi0JdGhpcy5zb3VyY2UgPSBzLnRvQ2hhckFycmF5KCk7Ci0JcmVzZXQoKTsKLQlTb3VyY2VFbGVtZW50UGFyc2VyIHBhcnNlciA9IAotCQluZXcgU291cmNlRWxlbWVudFBhcnNlcih0aGlzLCBuZXcgRGVmYXVsdFByb2JsZW1GYWN0b3J5KExvY2FsZS5nZXREZWZhdWx0KCkpLCBuZXcgQ29tcGlsZXJPcHRpb25zKCkpOyAKLQotCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IG5ldyBDb21waWxhdGlvblVuaXQoc291cmNlLCB0ZXN0TmFtZSwgbnVsbCk7Ci0KLQlwYXJzZXIucGFyc2VDb21waWxhdGlvblVuaXQoc291cmNlVW5pdCwgZmFsc2UpOwotCi19Ci1wdWJsaWMgc3RhdGljIFN0cmluZyBkaXNwbGF5TW9kaWZpZXJzKGludCBtb2RpZmllcnMpIHsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQotCWlmICgobW9kaWZpZXJzICYgQWNjUHVibGljKSAhPSAwKQotCQlidWZmZXIuYXBwZW5kKCJwdWJsaWMgIik7Ci0JaWYgKChtb2RpZmllcnMgJiBBY2NQcm90ZWN0ZWQpICE9IDApCi0JCWJ1ZmZlci5hcHBlbmQoInByb3RlY3RlZCAiKTsKLQlpZiAoKG1vZGlmaWVycyAmIEFjY1ByaXZhdGUpICE9IDApCi0JCWJ1ZmZlci5hcHBlbmQoInByaXZhdGUgIik7Ci0JaWYgKChtb2RpZmllcnMgJiBBY2NGaW5hbCkgIT0gMCkKLQkJYnVmZmVyLmFwcGVuZCgiZmluYWwgIik7Ci0JaWYgKChtb2RpZmllcnMgJiBBY2NTdGF0aWMpICE9IDApCi0JCWJ1ZmZlci5hcHBlbmQoInN0YXRpYyAiKTsKLQlpZiAoKG1vZGlmaWVycyAmIEFjY0Fic3RyYWN0KSAhPSAwKQotCQlidWZmZXIuYXBwZW5kKCJhYnN0cmFjdCAiKTsKLQlpZiAoKG1vZGlmaWVycyAmIEFjY05hdGl2ZSkgIT0gMCkKLQkJYnVmZmVyLmFwcGVuZCgibmF0aXZlICIpOwotCWlmICgobW9kaWZpZXJzICYgQWNjU3luY2hyb25pemVkKSAhPSAwKQotCQlidWZmZXIuYXBwZW5kKCJzeW5jaHJvbml6ZWQgIik7Ci0JcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotfQotLyoqCi0gKiBlbnRlckNsYXNzIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgdm9pZCBlbnRlckNsYXNzKAotCWludCBkZWNsYXJhdGlvblN0YXJ0LCAKLQlpbnQgbW9kaWZpZXJzLCAKLQljaGFyW10gbmFtZSwgCi0JaW50IG5hbWVTb3VyY2VTdGFydCwgCi0JaW50IG5hbWVTb3VyY2VFbmQsIAotCWNoYXJbXSBzdXBlcmNsYXNzLCAKLQljaGFyW11bXSBzdXBlcmludGVyZmFjZXMpIHsKLQotCWlmIChjdXJyZW50VHlwZSA9PSBudWxsKSB7Ci0JCS8vIHRvcCBsZXZlbCB0eXBlCi0JCWN1cnJlbnRUeXBlID0gCi0JCQluZXcgU291cmNlVHlwZSgKLQkJCQludWxsLCAKLQkJCQlkZWNsYXJhdGlvblN0YXJ0LCAKLQkJCQltb2RpZmllcnMsIAotCQkJCW5hbWUsIAotCQkJCW5hbWVTb3VyY2VTdGFydCwgCi0JCQkJbmFtZVNvdXJjZUVuZCwgCi0JCQkJc3VwZXJjbGFzcywgCi0JCQkJc3VwZXJpbnRlcmZhY2VzLCAKLQkJCQlzb3VyY2UpOyAKLQkJY3VycmVudFR5cGUuc2V0UGFja2FnZShjdXJyZW50UGFja2FnZSk7Ci0JCXNldEltcG9ydHMoKTsKLQl9IGVsc2UgewotCQkvLyBtZW1iZXIgdHlwZQotCQlTb3VyY2VUeXBlIG1lbWJlclR5cGU7Ci0JCWN1cnJlbnRUeXBlLmFkZE1lbWJlclR5cGUoCi0JCQltZW1iZXJUeXBlID0gCi0JCQkJbmV3IFNvdXJjZVR5cGUoCi0JCQkJCWN1cnJlbnRUeXBlLmdldE5hbWUoKSwgCi0JCQkJCWRlY2xhcmF0aW9uU3RhcnQsIAotCQkJCQltb2RpZmllcnMsIAotCQkJCQluYW1lLCAKLQkJCQkJbmFtZVNvdXJjZVN0YXJ0LCAKLQkJCQkJbmFtZVNvdXJjZUVuZCwgCi0JCQkJCXN1cGVyY2xhc3MsIAotCQkJCQlzdXBlcmludGVyZmFjZXMsIAotCQkJCQlzb3VyY2UpKTsgCi0JCW1lbWJlclR5cGUucGFyZW50ID0gY3VycmVudFR5cGU7Ci0JCWN1cnJlbnRUeXBlID0gbWVtYmVyVHlwZTsKLQl9Ci19Ci0vKioKLSAqIGVudGVyQ29tcGlsYXRpb25Vbml0IG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgdm9pZCBlbnRlckNvbXBpbGF0aW9uVW5pdCgpIHt9Ci0vKioKLSAqIGVudGVyQ29uc3RydWN0b3IgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyB2b2lkIGVudGVyQ29uc3RydWN0b3IoCi0JaW50IGRlY2xhcmF0aW9uU3RhcnQsIAotCWludCBtb2RpZmllcnMsIAotCWNoYXJbXSBuYW1lLCAKLQlpbnQgbmFtZVNvdXJjZVN0YXJ0LCAKLQlpbnQgbmFtZVNvdXJjZUVuZCwgCi0JY2hhcltdW10gcGFyYW1ldGVyVHlwZXMsIAotCWNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLCAKLQljaGFyW11bXSBleGNlcHRpb25UeXBlcykgewotCi0JY3VycmVudFR5cGUuYWRkTWV0aG9kKAotCQljdXJyZW50TWV0aG9kID0gCi0JCQluZXcgU291cmNlTWV0aG9kKAotCQkJCWRlY2xhcmF0aW9uU3RhcnQsIAotCQkJCW1vZGlmaWVycywgCi0JCQkJbnVsbCwgCi0JCQkJbmFtZSwgCi0JCQkJbmFtZVNvdXJjZVN0YXJ0LCAKLQkJCQluYW1lU291cmNlRW5kLCAKLQkJCQlwYXJhbWV0ZXJUeXBlcywgCi0JCQkJcGFyYW1ldGVyTmFtZXMsIAotCQkJCWV4Y2VwdGlvblR5cGVzLCAKLQkJCQlzb3VyY2UpKTsgCi19Ci0vKioKLSAqIGVudGVyRmllbGQgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyB2b2lkIGVudGVyRmllbGQoCi0JaW50IGRlY2xhcmF0aW9uU3RhcnQsIAotCWludCBtb2RpZmllcnMsIAotCWNoYXJbXSB0eXBlLCAKLQljaGFyW10gbmFtZSwgCi0JaW50IG5hbWVTb3VyY2VTdGFydCwgCi0JaW50IG5hbWVTb3VyY2VFbmQpIHsKLQotCWN1cnJlbnRUeXBlLmFkZEZpZWxkKAotCQljdXJyZW50RmllbGQgPSAKLQkJCW5ldyBTb3VyY2VGaWVsZCgKLQkJCQlkZWNsYXJhdGlvblN0YXJ0LCAKLQkJCQltb2RpZmllcnMsIAotCQkJCXR5cGUsIAotCQkJCW5hbWUsIAotCQkJCW5hbWVTb3VyY2VTdGFydCwgCi0JCQkJbmFtZVNvdXJjZUVuZCwgCi0JCQkJc291cmNlKSk7IAotCi19Ci0KLS8qKgotICogZW50ZXJJbml0aWFsaXplciBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHZvaWQgZW50ZXJJbml0aWFsaXplcihpbnQgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCwgaW50IG1vZGlmaWVycykgewotCWN1cnJlbnRUeXBlLmFkZEZpZWxkKAotCQljdXJyZW50SW5pdGlhbGl6ZXIgPSBuZXcgU291cmNlSW5pdGlhbGl6ZXIoCi0JCQlkZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCAKLQkJCW1vZGlmaWVycykpOyAKLX0KLQotLyoqCi0gKiBleGl0SW5pdGlhbGl6ZXIgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyB2b2lkIGV4aXRJbml0aWFsaXplcihpbnQgZGVjbGFyYXRpb25Tb3VyY2VFbmQpIHsKLQljdXJyZW50SW5pdGlhbGl6ZXIuc2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoZGVjbGFyYXRpb25Tb3VyY2VFbmQpOwotfQotLyoqCi0gKiBlbnRlckludGVyZmFjZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHZvaWQgZW50ZXJJbnRlcmZhY2UoCi0JaW50IGRlY2xhcmF0aW9uU3RhcnQsIAotCWludCBtb2RpZmllcnMsIAotCWNoYXJbXSBuYW1lLCAKLQlpbnQgbmFtZVNvdXJjZVN0YXJ0LCAKLQlpbnQgbmFtZVNvdXJjZUVuZCwgCi0JY2hhcltdW10gc3VwZXJpbnRlcmZhY2VzKSB7Ci0KLQlpZiAoY3VycmVudFR5cGUgPT0gbnVsbCkgewotCQkvLyB0b3AgbGV2ZWwgdHlwZQotCQljdXJyZW50VHlwZSA9IAotCQkJbmV3IFNvdXJjZVR5cGUoCi0JCQkJbnVsbCwgCi0JCQkJZGVjbGFyYXRpb25TdGFydCwgCi0JCQkJbW9kaWZpZXJzLCAKLQkJCQluYW1lLCAKLQkJCQluYW1lU291cmNlU3RhcnQsIAotCQkJCW5hbWVTb3VyY2VFbmQsIAotCQkJCW51bGwsIAotCQkJCXN1cGVyaW50ZXJmYWNlcywgCi0JCQkJc291cmNlKTsgCi0JCWN1cnJlbnRUeXBlLnNldFBhY2thZ2UoY3VycmVudFBhY2thZ2UpOwotCQlzZXRJbXBvcnRzKCk7Ci0JfSBlbHNlIHsKLQkJLy8gbWVtYmVyIHR5cGUKLQkJU291cmNlVHlwZSBtZW1iZXJUeXBlOwotCQljdXJyZW50VHlwZS5hZGRNZW1iZXJUeXBlKAotCQkJbWVtYmVyVHlwZSA9IAotCQkJCW5ldyBTb3VyY2VUeXBlKAotCQkJCQljdXJyZW50VHlwZS5nZXROYW1lKCksIAotCQkJCQlkZWNsYXJhdGlvblN0YXJ0LCAKLQkJCQkJbW9kaWZpZXJzLCAKLQkJCQkJbmFtZSwgCi0JCQkJCW5hbWVTb3VyY2VTdGFydCwgCi0JCQkJCW5hbWVTb3VyY2VFbmQsIAotCQkJCQludWxsLCAKLQkJCQkJc3VwZXJpbnRlcmZhY2VzLCAKLQkJCQkJc291cmNlKSk7IAotCQltZW1iZXJUeXBlLnBhcmVudCA9IGN1cnJlbnRUeXBlOwotCQljdXJyZW50VHlwZSA9IG1lbWJlclR5cGU7Ci0JfQotfQotLyoqCi0gKiBlbnRlck1ldGhvZCBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHZvaWQgZW50ZXJNZXRob2QoCi0JaW50IGRlY2xhcmF0aW9uU3RhcnQsIAotCWludCBtb2RpZmllcnMsIAotCWNoYXJbXSByZXR1cm5UeXBlLCAKLQljaGFyW10gbmFtZSwgCi0JaW50IG5hbWVTb3VyY2VTdGFydCwgCi0JaW50IG5hbWVTb3VyY2VFbmQsIAotCWNoYXJbXVtdIHBhcmFtZXRlclR5cGVzLCAKLQljaGFyW11bXSBwYXJhbWV0ZXJOYW1lcywgCi0JY2hhcltdW10gZXhjZXB0aW9uVHlwZXMpIHsKLQotCWN1cnJlbnRUeXBlLmFkZE1ldGhvZCgKLQkJY3VycmVudE1ldGhvZCA9IAotCQkJbmV3IFNvdXJjZU1ldGhvZCgKLQkJCQlkZWNsYXJhdGlvblN0YXJ0LCAKLQkJCQltb2RpZmllcnMsIAotCQkJCXJldHVyblR5cGUsIAotCQkJCW5hbWUsIAotCQkJCW5hbWVTb3VyY2VTdGFydCwgCi0JCQkJbmFtZVNvdXJjZUVuZCwgCi0JCQkJcGFyYW1ldGVyVHlwZXMsIAotCQkJCXBhcmFtZXRlck5hbWVzLCAKLQkJCQlleGNlcHRpb25UeXBlcywgCi0JCQkJc291cmNlKSk7IAotfQotLyoqCi0gKiBleGl0Q2xhc3MgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyB2b2lkIGV4aXRDbGFzcyhpbnQgZGVjbGFyYXRpb25FbmQpIHsKLQljdXJyZW50VHlwZS5zZXREZWNsYXJhdGlvblNvdXJjZUVuZChkZWNsYXJhdGlvbkVuZCk7Ci0JaWYgKGN1cnJlbnRUeXBlLnBhcmVudCAhPSBudWxsKSB7Ci0JCWN1cnJlbnRUeXBlID0gY3VycmVudFR5cGUucGFyZW50OwotCX0KLX0KLS8qKgotICogZXhpdENvbXBpbGF0aW9uVW5pdCBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHZvaWQgZXhpdENvbXBpbGF0aW9uVW5pdChpbnQgZGVjbGFyYXRpb25FbmQpIHt9Ci0vKioKLSAqIGV4aXRDb25zdHJ1Y3RvciBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHZvaWQgZXhpdENvbnN0cnVjdG9yKGludCBkZWNsYXJhdGlvbkVuZCkgewotCQotCWN1cnJlbnRNZXRob2Quc2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoZGVjbGFyYXRpb25FbmQpOwotfQotLyoqCi0gKiBleGl0RmllbGQgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyB2b2lkIGV4aXRGaWVsZChpbnQgaW5pdGlhbGl6YXRpb25TdGFydCwgaW50IGRlY2xhcmF0aW9uRW5kLCBpbnQgZGVjbGFyYXRpb25Tb3VyY2VFbmQpIHsKLQljdXJyZW50RmllbGQuc2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoZGVjbGFyYXRpb25FbmQpOwotfQotLyoqCi0gKiBleGl0Q2xhc3MgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyB2b2lkIGV4aXRJbnRlcmZhY2UoaW50IGRlY2xhcmF0aW9uRW5kKSB7Ci0JY3VycmVudFR5cGUuc2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoZGVjbGFyYXRpb25FbmQpOwotCWlmIChjdXJyZW50VHlwZS5wYXJlbnQgIT0gbnVsbCkgewotCQljdXJyZW50VHlwZSA9IGN1cnJlbnRUeXBlLnBhcmVudDsKLQl9Ci19Ci0vKioKLSAqIGV4aXRNZXRob2QgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyB2b2lkIGV4aXRNZXRob2QoaW50IGRlY2xhcmF0aW9uRW5kKSB7Ci0JY3VycmVudE1ldGhvZC5zZXREZWNsYXJhdGlvblNvdXJjZUVuZChkZWNsYXJhdGlvbkVuZCk7Ci19Ci1wdWJsaWMgdm9pZCBmdWxsUGFyc2UoU3RyaW5nIHMsIFN0cmluZyB0ZXN0TmFtZSkgewotCi0JdGhpcy5zb3VyY2UgPSBzLnRvQ2hhckFycmF5KCk7Ci0JcmVzZXQoKTsKLQlTb3VyY2VFbGVtZW50UGFyc2VyIHBhcnNlciA9IAotCQluZXcgU291cmNlRWxlbWVudFBhcnNlcih0aGlzLCBuZXcgRGVmYXVsdFByb2JsZW1GYWN0b3J5KExvY2FsZS5nZXREZWZhdWx0KCkpLCBuZXcgQ29tcGlsZXJPcHRpb25zKCkpOyAKLQotCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IG5ldyBDb21waWxhdGlvblVuaXQoc291cmNlLCB0ZXN0TmFtZSwgbnVsbCk7Ci0KLQlwYXJzZXIucGFyc2VDb21waWxhdGlvblVuaXQoc291cmNlVW5pdCwgdHJ1ZSk7Ci19Ci1wdWJsaWMgdm9pZCByZXNldCgpIHsKLQljdXJyZW50VHlwZSA9IG51bGw7Ci0JY3VycmVudE1ldGhvZCA9IG51bGw7Ci0JY3VycmVudEZpZWxkID0gbnVsbDsKLQljdXJyZW50UGFja2FnZSA9IG51bGw7Ci0JY3VycmVudEltcG9ydHMgPSBudWxsOwotCW51bWJlck9mSW1wb3J0cyA9IDA7Ci19Ci1wdWJsaWMgdm9pZCBzZXRJbXBvcnRzKCkgewotCWlmIChjdXJyZW50SW1wb3J0cyA9PSBudWxsKQotCQlyZXR1cm47Ci0JaWYgKG51bWJlck9mSW1wb3J0cyAhPSBjdXJyZW50SW1wb3J0cy5sZW5ndGgpIHsKLQkJU3lzdGVtLmFycmF5Y29weSgKLQkJCWN1cnJlbnRJbXBvcnRzLCAKLQkJCTAsIAotCQkJY3VycmVudEltcG9ydHMgPSBuZXcgU291cmNlSW1wb3J0W251bWJlck9mSW1wb3J0c10sIAotCQkJMCwgCi0JCQludW1iZXJPZkltcG9ydHMpOyAKLQl9Ci0JY3VycmVudFR5cGUuc2V0SW1wb3J0cyhjdXJyZW50SW1wb3J0cyk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDEoKSB7Ci0KLQlTdHJpbmcgcyA9IAotCQkicGFja2FnZSBhO1xuIgotCQkJKyAiaW1wb3J0IGphdmEubGFuZy4qO1xuIgotCQkJKyAiaW1wb3J0IGphdmEudXRpbC4qO1xuIgotCQkJKyAiXG4iCi0JCQkrICJwdWJsaWMgY2xhc3MgWCB7XG4iCi0JCQkrICJ2b2lkIGZvbygpIHtcbiIKLQkJCSsgIlN5c3RlbS5vdXQucHJpbnRsbigpO1xuIgotCQkJKyAiXG4iCi0JCQkrICJwdWJsaWMgaW50IGg7XG4iCi0JCQkrICJwdWJsaWMgaW50W10gaSA9IHsgMCwgMSB9O1xuIgotCQkJKyAiXG4iCi0JCQkrICJpbnQgYmFyIiArICJcXCIgKyAidTAwNjUoKXtcbiIKLQkJCSsgInZvaWQgdHJ1Yygpe1xuIgotCQkJKyAifVxuIjsgCi0KLQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcgPSAKLQkJInBhY2thZ2UgYTtcbiIKLQkJCSsgImltcG9ydCBqYXZhLmxhbmcuKjtcbiIKLQkJCSsgImltcG9ydCBqYXZhLnV0aWwuKjtcbiIKLQkJCSsgInB1YmxpYyBjbGFzcyBYIHtcbiIKLQkJCSsgIlx0cHVibGljIGludCBoO1xuIgotCQkJKyAiXHRwdWJsaWMgaW50W10gaTtcbiIKLQkJCSsgIlx0amF2YS5sYW5nLk9iamVjdCgwKVxuIgotCQkJKyAiXHR2b2lkIGZvbygpIHt9XG4iCi0JCQkrICJcdGludCBiYXJlKCkge31cbiIKLQkJCSsgIlx0dm9pZCB0cnVjKCkge31cbiIKLQkJCSsgIn0iOyAKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICJ0ZXN0MDE6IGZ1bGwgcGFyc2UiOwotCWZ1bGxQYXJzZShzLHRlc3ROYW1lKTsKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJNTIsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOyAKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VFbmQgIiwgCi0JCTE3OCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOyAKLQotCVNvdXJjZUZpZWxkW10gZmllbGRzID0gY3VycmVudFR5cGUuZ2V0RmllbGRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgZmllbGRzICIsIGZpZWxkcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZmllbGRzIGxlbmd0aCAiLCAyLCBmaWVsZHMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIGZpZWxkIGgiLCAxMDUsIGZpZWxkc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBmaWVsZCBoIiwgMTE3LCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBmaWVsZCBpIiwgMTE5LCBmaWVsZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgZmllbGQgaSIsIDE0NCwgZmllbGRzWzFdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JU291cmNlTWV0aG9kW10gbWV0aG9kcyA9IGN1cnJlbnRUeXBlLmdldE1ldGhvZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZXRob2RzICIsIG1ldGhvZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIG1ldGhvZHMgbGVuZ3RoICIsIDMsIG1ldGhvZHMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCBmb28iLCA2OSwgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgZm9vIiwgMTAzLCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGJhcmUiLCAxNDcsIG1ldGhvZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGJhcmUiLCAxNjMsIG1ldGhvZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgdHJ1YyIsIDE2NCwgbWV0aG9kc1syXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgdHJ1YyIsIDE3NywgbWV0aG9kc1syXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCBmb28iLCAiZm9vIiwgbWV0aG9kc1swXS5nZXRBY3R1YWxOYW1lKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGJhcmUiLCAiYmFyIiArICJcXCIgKyAidTAwNjUiLCBtZXRob2RzWzFdLmdldEFjdHVhbE5hbWUoKSk7Ci0JCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBzb3VyY2UgIiArIHRlc3ROYW1lLCAKLQkJZXhwZWN0ZWRVbml0VG9TdHJpbmcsIAotCQljdXJyZW50VHlwZS50b1N0cmluZygpKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0MDIoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCQkiLyoqIGphdmFkb2MgY29tbWVudCAqL1xuIgotCQkJKyAicHVibGljIGNsYXNzIFgge1xuIgotCQkJKyAifVxuIjsgCi0KLQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcgPSAKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iCi0JCQkrICJcdGphdmEubGFuZy5PYmplY3QoMClcbiIKLQkJCSsgIn0iOyAKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICJ0ZXN0MDI6IGZ1bGwgcGFyc2UiOwotCWZ1bGxQYXJzZShzLHRlc3ROYW1lKTsKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJMCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7IAotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZUVuZCAiLCAKLQkJNDAsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgc291cmNlICIgKyB0ZXN0TmFtZSwgCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLCAKLQkJY3VycmVudFR5cGUudG9TdHJpbmcoKSk7IAotfQotcHVibGljIHZvaWQgdGVzdDAzKCkgewotCi0JU3RyaW5nIHMgPSAKLQkJInBhY2thZ2UgYTtcbiIKLQkJCSsgImltcG9ydCBqYXZhLmxhbmcuKjtcbiIKLQkJCSsgImltcG9ydCBqYXZhLnV0aWwuKjtcbiIKLQkJCSsgIlxuIgotCQkJKyAicHVibGljIGNsYXNzIFgge1xuIgotCQkJKyAidm9pZCBmb28oKSB7XG4iCi0JCQkrICJTeXN0ZW0ub3V0LnByaW50bG4oKTtcbiIKLQkJCSsgIlxuIgotCQkJKyAicHVibGljIGludCBoO1xuIgotCQkJKyAicHVibGljIGludFtdIGkgPSB7IDAsIDEgfTtcbiIKLQkJCSsgIlxuIgotCQkJKyAiaW50IGJhciIgKyAiXFwiICsgInUwMDY1KCl7XG4iCi0JCQkrICJ2b2lkIHRydWMoKXtcbiIKLQkJCSsgIn1cbiI7IAotCi0JU3RyaW5nIGV4cGVjdGVkVW5pdFRvU3RyaW5nID0gCi0JCSJwYWNrYWdlIGE7XG4iCi0JCQkrICJpbXBvcnQgamF2YS5sYW5nLio7XG4iCi0JCQkrICJpbXBvcnQgamF2YS51dGlsLio7XG4iCi0JCQkrICJwdWJsaWMgY2xhc3MgWCB7XG4iCi0JCQkrICJcdHB1YmxpYyBpbnQgaDtcbiIKLQkJCSsgIlx0cHVibGljIGludFtdIGk7XG4iCi0JCQkrICJcdHZvaWQgZm9vKCkge31cbiIKLQkJCSsgIlx0aW50IGJhcmUoKSB7fVxuIgotCQkJKyAiXHR2b2lkIHRydWMoKSB7fVxuIgotCQkJKyAifSI7IAotCi0JU3RyaW5nIHRlc3ROYW1lID0gInRlc3QwMzogZGlldCBwYXJzZSI7Ci0JZGlldFBhcnNlKHMsdGVzdE5hbWUpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICIsIAotCQk1MiwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7IAotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZUVuZCAiLCAKLQkJMTc4LCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7IAotCi0JU291cmNlRmllbGRbXSBmaWVsZHMgPSBjdXJyZW50VHlwZS5nZXRGaWVsZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBmaWVsZHMgbGVuZ3RoICIsIDIsIGZpZWxkcy5sZW5ndGgpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgZmllbGQgaCIsIDEwNSwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIGZpZWxkIGgiLCAxMTcsIGZpZWxkc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIGZpZWxkIGkiLCAxMTksIGZpZWxkc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBmaWVsZCBpIiwgMTQ0LCBmaWVsZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlTb3VyY2VNZXRob2RbXSBtZXRob2RzID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1ldGhvZHMgIiwgbWV0aG9kcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgbWV0aG9kcyBsZW5ndGggIiwgMywgbWV0aG9kcy5sZW5ndGgpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGZvbyIsIDY5LCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBmb28iLCAxMDMsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgYmFyIiwgMTQ3LCBtZXRob2RzWzFdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBiYXIiLCAxNjMsIG1ldGhvZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgdHJ1YyIsIDE2NCwgbWV0aG9kc1syXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgdHJ1YyIsIDE3NywgbWV0aG9kc1syXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCBmb28iLCAiZm9vIiwgbWV0aG9kc1swXS5nZXRBY3R1YWxOYW1lKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGJhcmUiLCAiYmFyIiArICJcXCIgKyAidTAwNjUiLCBtZXRob2RzWzFdLmdldEFjdHVhbE5hbWUoKSk7Ci0JCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBzb3VyY2UgIiArIHRlc3ROYW1lLCAKLQkJZXhwZWN0ZWRVbml0VG9TdHJpbmcsIAotCQljdXJyZW50VHlwZS50b1N0cmluZygpKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0MDQoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCSJwYWNrYWdlIGE7CQkJCQkJCQkJCQlcbiIKLQkJCSsgImltcG9ydCBqYXZhLmxhbmcuKjsJCQkJCQkJXG4iCi0JCQkrICJpbXBvcnQgamF2YS51dGlsLio7CQkJCQkJCVxuIgotCQkJKyAiCQkJCQkJCQkJCQkJXG4iCi0JCQkrICJwdWJsaWMgY2xhc3MgWCB7CQkJCQkJCQlcbiIKLQkJCSsgIgl2b2lkIGZvbygpIHsJCQkJCQkJCVxuIgotCQkJKyAiCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsJCQkJCVxuIgotCQkJKyAiCQkJCQkJCQkJCQkJXG4iCi0JCQkrICIJCWNsYXNzIEwgewkJCQkJCQkJXG4iCi0JCQkrICIJCQl2b2lkIGJheigpe30JCQkJCQlcbiIKLQkJCSsgIgkJfQkJCQkJCQkJCQlcbiIKLQkJCSsgIgkJCQkJCQkJCQkJCVxuIgotCQkJKyAiCXB1YmxpYyBpbnQgaDsJCQkJCQkJCVxuIgotCQkJKyAiCXB1YmxpYyBpbnRbXSBpID0geyAwLCAxIH07CQkJCQlcbiIKLQkJCSsgIgkJCQkJCQkJCQkJCVxuIgotCQkJKyAiCXZvaWQgYmFyKCl7CQkJCQkJCQkJXG4iCi0JCQkrICIJdm9pZCB0cnVjKCl7CQkJCQkJCQlcbiIKLQkJCSsgIn0JCQkJCQkJCQkJCVxuIjsgCi0KLQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcgPSAKLQkJInBhY2thZ2UgYTtcbiIKLQkJCSsgImltcG9ydCBqYXZhLmxhbmcuKjtcbiIKLQkJCSsgImltcG9ydCBqYXZhLnV0aWwuKjtcbiIKLQkJCSsgInB1YmxpYyBjbGFzcyBYIHtcbiIKLQkJCSsgIlx0cHVibGljIGludCBoO1xuIgotCQkJKyAiXHRwdWJsaWMgaW50W10gaTtcbiIKLQkJCSsgIlx0amF2YS5sYW5nLk9iamVjdCgwKVxuIgotCQkJKyAiXHR2b2lkIGZvbygpIHt9XG4iCi0JCQkrICJcdHZvaWQgYmFyKCkge31cbiIKLQkJCSsgIlx0dm9pZCB0cnVjKCkge31cbiIKLQkJCSsgIn0iOyAKLQlTdHJpbmcgdGVzdE5hbWUgPSAidGVzdDA0OiBmdWxsIHBhcnNlIjsKLQlmdWxsUGFyc2Uocyx0ZXN0TmFtZSk7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlU3RhcnQgIiwgCi0JCTg5LCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsgCi0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlRW5kICIsIAotCQkzNzIsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsgCi0KLQlTb3VyY2VGaWVsZFtdIGZpZWxkcyA9IGN1cnJlbnRUeXBlLmdldEZpZWxkcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIGZpZWxkcyAiLCBmaWVsZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGZpZWxkcyBsZW5ndGggIiwgMiwgZmllbGRzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBmaWVsZCBoIiwgMjQ4LCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgZmllbGQgaCIsIDI2MCwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgZmllbGQgaSIsIDI3MSwgZmllbGRzWzFdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIGZpZWxkIGkiLCAyOTYsIGZpZWxkc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCVNvdXJjZU1ldGhvZFtdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWV0aG9kcyAiLCBtZXRob2RzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBtZXRob2RzIGxlbmd0aCAiLCAzLCBtZXRob2RzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgZm9vIiwgMTE1LCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBmb28iLCAyNDYsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgYmFyIiwgMzE3LCBtZXRob2RzWzFdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBiYXIiLCAzMzcsIG1ldGhvZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgdHJ1YyIsIDMzOSwgbWV0aG9kc1syXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgdHJ1YyIsIDM2MCwgbWV0aG9kc1syXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCBmb28iLCAiZm9vIiwgbWV0aG9kc1swXS5nZXRBY3R1YWxOYW1lKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGJhciIsICJiYXIiLCBtZXRob2RzWzFdLmdldEFjdHVhbE5hbWUoKSk7Ci0JCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBzb3VyY2UgIiArIHRlc3ROYW1lLCAKLQkJZXhwZWN0ZWRVbml0VG9TdHJpbmcsIAotCQljdXJyZW50VHlwZS50b1N0cmluZygpKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0MDUoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCSJwYWNrYWdlIGE7CQkJCQkJCQkJCQlcbiIKLQkJCSsgImltcG9ydCBqYXZhLmxhbmcuKjsJCQkJCQkJXG4iCi0JCQkrICJpbXBvcnQgamF2YS51dGlsLio7CQkJCQkJCVxuIgotCQkJKyAiCQkJCQkJCQkJCQkJXG4iCi0JCQkrICJwdWJsaWMgY2xhc3MgWCB7CQkJCQkJCQlcbiIKLQkJCSsgIgl2b2lkIGZvbygpIHsJCQkJCQkJCVxuIgotCQkJKyAiCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsJCQkJCVxuIgotCQkJKyAiCQkJCQkJCQkJCQkJXG4iCi0JCQkrICIJCWNsYXNzIEwgewkJCQkJCQkJXG4iCi0JCQkrICIJCQl2b2lkIGJheigpe30JCQkJCQlcbiIKLQkJCSsgIgkJfQkJCQkJCQkJCQlcbiIKLQkJCSsgIgkJCQkJCQkJCQkJCVxuIgotCQkJKyAiCXB1YmxpYyBpbnQgaDsJCQkJCQkJCVxuIgotCQkJKyAiCXB1YmxpYyBpbnRbXSBpID0geyAwLCAxIH07CQkJCQlcbiIKLQkJCSsgIgkJCQkJCQkJCQkJCVxuIgotCQkJKyAiCXZvaWQgYmFyKCl7CQkJCQkJCQkJXG4iCi0JCQkrICIJdm9pZCB0cnVjKCl7CQkJCQkJCQlcbiIKLQkJCSsgIn0JCQkJCQkJCQkJCVxuIjsgCi0KLQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcgPSAKLQkJInBhY2thZ2UgYTtcbiIKLQkJCSsgImltcG9ydCBqYXZhLmxhbmcuKjtcbiIKLQkJCSsgImltcG9ydCBqYXZhLnV0aWwuKjtcbiIKLQkJCSsgInB1YmxpYyBjbGFzcyBYIHtcbiIKLQkJCSsgIlx0cHVibGljIGludCBoO1xuIgotCQkJKyAiXHRwdWJsaWMgaW50W10gaTtcbiIKLQkJCSsgIlx0dm9pZCBmb28oKSB7fVxuIgotCQkJKyAiXHR2b2lkIGJhcigpIHt9XG4iCi0JCQkrICJcdHZvaWQgdHJ1YygpIHt9XG4iCi0JCQkrICJ9IjsgCi0KLQlTdHJpbmcgdGVzdE5hbWUgPSAidGVzdDA1OiBkaWV0IHBhcnNlIjsKLQlkaWV0UGFyc2Uocyx0ZXN0TmFtZSk7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlU3RhcnQgIiwgCi0JCTg5LCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsgCi0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlRW5kICIsIAotCQkzNzIsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsgCi0KLQlTb3VyY2VGaWVsZFtdIGZpZWxkcyA9IGN1cnJlbnRUeXBlLmdldEZpZWxkcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIGZpZWxkcyAiLCBmaWVsZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGZpZWxkcyBsZW5ndGggIiwgMiwgZmllbGRzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBmaWVsZCBoIiwgMjQ4LCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgZmllbGQgaCIsIDI2MCwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgZmllbGQgaSIsIDI3MSwgZmllbGRzWzFdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIGZpZWxkIGkiLCAyOTYsIGZpZWxkc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCVNvdXJjZU1ldGhvZFtdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWV0aG9kcyAiLCBtZXRob2RzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBtZXRob2RzIGxlbmd0aCAiLCAzLCBtZXRob2RzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgZm9vIiwgMTE1LCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBmb28iLCAyNDYsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgYmFyIiwgMzE3LCBtZXRob2RzWzFdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBiYXIiLCAzMzcsIG1ldGhvZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgdHJ1YyIsIDMzOSwgbWV0aG9kc1syXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgdHJ1YyIsIDM2MCwgbWV0aG9kc1syXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCBmb28iLCAiZm9vIiwgbWV0aG9kc1swXS5nZXRBY3R1YWxOYW1lKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGJhciIsICJiYXIiLCBtZXRob2RzWzFdLmdldEFjdHVhbE5hbWUoKSk7Ci0JCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBzb3VyY2UgIiArIHRlc3ROYW1lLCAKLQkJZXhwZWN0ZWRVbml0VG9TdHJpbmcsIAotCQljdXJyZW50VHlwZS50b1N0cmluZygpKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0MDYoKSB7Ci0KLQlTdHJpbmcgcyA9IAotCQkicGFja2FnZSBhOwkJCQkJCQkJCQkJXG4iCi0JCQkrICJpbXBvcnQgamF2YS5sYW5nLio7CQkJCQkJCVxuIgotCQkJKyAiaW1wb3J0IGphdmEudXRpbC4qOwkJCQkJCQlcbiIKLQkJCSsgIgkJCQkJCQkJCQkJCVxuIgotCQkJKyAicHVibGljIGNsYXNzIFggewkJCQkJCQkJXG4iCi0JCQkrICIgWCB4OwkJCQkJCQkJCQlcbiIKLQkJCSsgIiBPYmplY3QgYSwgYiA9IG51bGw7CQkJCQkJCVxuIgotCQkJKyAiCXZvaWQgZm9vKCkgewkJCQkJCQkJXG4iCi0JCQkrICIJCVN5c3RlbS5vdXQucHJpbnRsbigpOwkJCQkJXG4iCi0JCQkrICIJCQkJCQkJCQkJCQlcbiIKLQkJCSsgIglwdWJsaWMgaW50IGg7CQkJCQkJCQlcbiIKLQkJCSsgIglwdWJsaWMgaW50W10gaSA9IHsgMCwgMSB9OwkJCQkJXG4iCi0JCQkrICIJCQkJCQkJCQkJCQlcbiIKLQkJCSsgIgl2b2lkIGJhcigpewkJCQkJCQkJCVxuIgotCQkJKyAiCXZvaWQgdHJ1YygpewkJCQkJCQkJXG4iCi0JCQkrICJ9CQkJCQkJCQkJCQlcbiI7IAotCi0JU3RyaW5nIGV4cGVjdGVkVW5pdFRvU3RyaW5nID0gCi0JCQkicGFja2FnZSBhO1xuIgotCQkJKyAiaW1wb3J0IGphdmEubGFuZy4qO1xuIgotCQkJKyAiaW1wb3J0IGphdmEudXRpbC4qO1xuIgotCQkJKyAicHVibGljIGNsYXNzIFgge1xuIgotCQkJKyAiXHRYIHg7XG4iCi0JCQkrICJcdE9iamVjdCBhO1xuIgotCQkJKyAiXHRPYmplY3QgYjtcbiIKLQkJCSsgIlx0cHVibGljIGludCBoO1xuIgotCQkJKyAiXHRwdWJsaWMgaW50W10gaTtcbiIKLQkJCSsgIlx0dm9pZCBmb28oKSB7fVxuIgotCQkJKyAiXHR2b2lkIGJhcigpIHt9XG4iCi0JCQkrICJcdHZvaWQgdHJ1YygpIHt9XG4iCi0JCQkrICJ9IjsgCi0JCQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAidGVzdDA2OiBkaWV0IHBhcnNlIjsKLQlkaWV0UGFyc2Uocyx0ZXN0TmFtZSk7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlU3RhcnQgIiwgCi0JCTg5LCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsgCi0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlRW5kICIsIAotCQkzNDcsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsgCi0KLQlTb3VyY2VGaWVsZFtdIGZpZWxkcyA9IGN1cnJlbnRUeXBlLmdldEZpZWxkcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIGZpZWxkcyAiLCBmaWVsZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGZpZWxkcyBsZW5ndGggIiwgNSwgZmllbGRzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBmaWVsZCB4IiwgMTE1LCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgZmllbGQgeCIsIDExOCwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgZmllbGQgYSIsIDEzMSwgZmllbGRzWzFdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIGZpZWxkIGEiLCAxMzksIGZpZWxkc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIGZpZWxkIGIiLCAxMzEsIGZpZWxkc1syXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBmaWVsZCBiIiwgMTQ5LCBmaWVsZHNbMl0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBmaWVsZCBoIiwgMjIzLCBmaWVsZHNbM10uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgZmllbGQgaCIsIDIzNSwgZmllbGRzWzNdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgZmllbGQgaSIsIDI0NiwgZmllbGRzWzRdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIGZpZWxkIGkiLCAyNzEsIGZpZWxkc1s0XS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCVNvdXJjZU1ldGhvZFtdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWV0aG9kcyAiLCBtZXRob2RzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBtZXRob2RzIGxlbmd0aCAiLCAzLCBtZXRob2RzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgZm9vIiwgMTU5LCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBmb28iLCAyMjEsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgYmFyIiwgMjkyLCBtZXRob2RzWzFdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBiYXIiLCAzMTIsIG1ldGhvZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgdHJ1YyIsIDMxNCwgbWV0aG9kc1syXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgdHJ1YyIsIDMzNSwgbWV0aG9kc1syXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCBmb28iLCAiZm9vIiwgbWV0aG9kc1swXS5nZXRBY3R1YWxOYW1lKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGJhciIsICJiYXIiLCBtZXRob2RzWzFdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgdHJ1YyIsICJ0cnVjIiwgbWV0aG9kc1syXS5nZXRBY3R1YWxOYW1lKCkpOwotCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgc291cmNlICIgKyB0ZXN0TmFtZSwgCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLCAKLQkJY3VycmVudFR5cGUudG9TdHJpbmcoKSk7IAotfQotcHVibGljIHZvaWQgdGVzdDA3KCkgewotCi0JU3RyaW5nIHMgPSAKLQkJInBhY2thZ2UgYTsJCQkJCQkJCQkJCVxuIgotCQkJKyAiaW1wb3J0IGphdmEubGFuZy4qOwkJCQkJCQlcbiIKLQkJCSsgImltcG9ydCBqYXZhLnV0aWwuKjsJCQkJCQkJXG4iCi0JCQkrICIJCQkJCQkJCQkJCQlcbiIKLQkJCSsgInB1YmxpYyBjbGFzcyBYIHsJCQkJCQkJCVxuIgotCQkJKyAiIFggeDsJCQkJCQkJCQkJXG4iCi0JCQkrICIgT2JqZWN0IGEsIGIgPSBudWxsOwkJCQkJCQlcbiIKLQkJCSsgIgl2b2lkIGZvbygpIHsJCQkJCQkJCVxuIgotCQkJKyAiCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsJCQkJCVxuIgotCQkJKyAiCQkJCQkJCQkJCQkJXG4iCi0JCQkrICIJcHVibGljIGludCBoOwkJCQkJCQkJXG4iCi0JCQkrICIJcHVibGljIGludFtdIGkgPSB7IDAsIDEgfTsJCQkJCVxuIgotCQkJKyAiCQkJCQkJCQkJCQkJXG4iCi0JCQkrICIJdm9pZCBiYXIoKXsJCQkJCQkJCQlcbiIKLQkJCSsgIgl2b2lkIHRydWMoKXsJCQkJCQkJCVxuIgotCQkJKyAifQkJCQkJCQkJCQkJXG4iOyAKLQotCVN0cmluZyBleHBlY3RlZFVuaXRUb1N0cmluZyA9IAotCQkJInBhY2thZ2UgYTtcbiIKLQkJCSsgImltcG9ydCBqYXZhLmxhbmcuKjtcbiIKLQkJCSsgImltcG9ydCBqYXZhLnV0aWwuKjtcbiIKLQkJCSsgInB1YmxpYyBjbGFzcyBYIHtcbiIKLQkJCSsgIlx0WCB4O1xuIgotCQkJKyAiXHRPYmplY3QgYTtcbiIKLQkJCSsgIlx0T2JqZWN0IGI7XG4iCi0JCQkrICJcdHB1YmxpYyBpbnQgaDtcbiIKLQkJCSsgIlx0cHVibGljIGludFtdIGk7XG4iCi0JCQkrICJcdGphdmEubGFuZy5PYmplY3QoMClcbiIKLQkJCSsgIlx0dm9pZCBmb28oKSB7fVxuIgotCQkJKyAiXHR2b2lkIGJhcigpIHt9XG4iCi0JCQkrICJcdHZvaWQgdHJ1YygpIHt9XG4iCi0JCQkrICJ9IjsgCi0JCQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAidGVzdDA3OiBmdWxsIHBhcnNlIjsKLQlmdWxsUGFyc2Uocyx0ZXN0TmFtZSk7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlU3RhcnQgIiwgCi0JCTg5LCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsgCi0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlRW5kICIsIAotCQkzNDcsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsgCi0KLQlTb3VyY2VGaWVsZFtdIGZpZWxkcyA9IGN1cnJlbnRUeXBlLmdldEZpZWxkcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIGZpZWxkcyAiLCBmaWVsZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGZpZWxkcyBsZW5ndGggIiwgNSwgZmllbGRzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBmaWVsZCB4aCIsIDExNSwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIGZpZWxkIHgiLCAxMTgsIGZpZWxkc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIGZpZWxkIGEiLCAxMzEsIGZpZWxkc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBmaWVsZCBhIiwgMTM5LCBmaWVsZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBmaWVsZCBiIiwgMTMxLCBmaWVsZHNbMl0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgZmllbGQgYiIsIDE0OSwgZmllbGRzWzJdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgZmllbGQgaCIsIDIyMywgZmllbGRzWzNdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIGZpZWxkIGgiLCAyMzUsIGZpZWxkc1szXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIGZpZWxkIGkiLCAyNDYsIGZpZWxkc1s0XS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBmaWVsZCBpIiwgMjcxLCBmaWVsZHNbNF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlTb3VyY2VNZXRob2RbXSBtZXRob2RzID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1ldGhvZHMgIiwgbWV0aG9kcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgbWV0aG9kcyBsZW5ndGggIiwgMywgbWV0aG9kcy5sZW5ndGgpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGZvbyIsIDE1OSwgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgZm9vIiwgMjIxLCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGJhciIsIDI5MiwgbWV0aG9kc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgYmFyIiwgMzEyLCBtZXRob2RzWzFdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIHRydWMiLCAzMTQsIG1ldGhvZHNbMl0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIHRydWMiLCAzMzUsIG1ldGhvZHNbMl0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgZm9vIiwgImZvbyIsIG1ldGhvZHNbMF0uZ2V0QWN0dWFsTmFtZSgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCBiYXIiLCAiYmFyIiwgbWV0aG9kc1sxXS5nZXRBY3R1YWxOYW1lKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIHRydWMiLCAidHJ1YyIsIG1ldGhvZHNbMl0uZ2V0QWN0dWFsTmFtZSgpKTsKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIHNvdXJjZSAiICsgdGVzdE5hbWUsIAotCQlleHBlY3RlZFVuaXRUb1N0cmluZywgCi0JCWN1cnJlbnRUeXBlLnRvU3RyaW5nKCkpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3QwOCgpIHsKLQotCVN0cmluZyBzID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7CQkJCQkJCQkJXG4iCi0JCQkrICIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIKLQkJCSsgIgkJU3lzdGVtLm91dC5wcmludGxuKCk7CQkJCQlcbiIKLQkJCSsgIiAJdm9pZCBiYXooKXt9CQkJCQkJCVxuIgotCQkJKyAiIH0JCQkJCQkJCQkJCVxuIgotCQkJKyAiCQkJCQkJCQkJCQkJXG4iCi0JCQkrICIJdm9pZCBiYXIoKXsJCQkJCQkJCQlcbiIKLQkJCSsgIiB9CQkJCQkJCQkJCQlcbiIKLQkJCSsgIgl2b2lkIHRydWMoKXsJCQkJCQkJCVxuIgotCQkJKyAiIH0JCQkJCQkJCQkJCVxuIgotCQkJKyAifQkJCQkJCQkJCQkJXG4iOyAKLQotCVN0cmluZyBleHBlY3RlZFVuaXRUb1N0cmluZyA9IAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIKLQkJCSsgIlx0dm9pZCBmb28oKSB7fVxuIgotCQkJKyAiXHR2b2lkIGJhcigpIHt9XG4iCi0JCQkrICJcdHZvaWQgdHJ1YygpIHt9XG4iCi0JCQkrICJ9IjsKLQkJCQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAidGVzdDA4OiBkaWV0IHBhcnNlIjsKLQlkaWV0UGFyc2Uocyx0ZXN0TmFtZSk7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlU3RhcnQgIiwgCi0JCTAsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOyAKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VFbmQgIiwgCi0JCTE5OCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOyAKLQotCVNvdXJjZUZpZWxkW10gZmllbGRzID0gY3VycmVudFR5cGUuZ2V0RmllbGRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgZmllbGRzICIsIGZpZWxkcyA9PSBudWxsKTsKLQotCVNvdXJjZU1ldGhvZFtdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWV0aG9kcyAiLCBtZXRob2RzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBtZXRob2RzIGxlbmd0aCAiLCAzLCBtZXRob2RzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgZm9vIiwgMjcsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGZvbyIsIDEwMCwgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCBiYXIiLCAxMjcsIG1ldGhvZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGJhciIsIDE0OSwgbWV0aG9kc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCB0cnVjIiwgMTYzLCBtZXRob2RzWzJdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCB0cnVjIiwgMTg1LCBtZXRob2RzWzJdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGZvbyIsICJmb28iLCBtZXRob2RzWzBdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgYmFyIiwgImJhciIsIG1ldGhvZHNbMV0uZ2V0QWN0dWFsTmFtZSgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCB0cnVjIiwgInRydWMiLCBtZXRob2RzWzJdLmdldEFjdHVhbE5hbWUoKSk7Ci0JCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBzb3VyY2UgIiArIHRlc3ROYW1lLCAKLQkJZXhwZWN0ZWRVbml0VG9TdHJpbmcsIAotCQljdXJyZW50VHlwZS50b1N0cmluZygpKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0MDkoKSB7Ci0KLQlTdHJpbmcgcyA9IAotCQkicHVibGljIGNsYXNzIFggewkJCQkJCQkJCVxuIgotCQkJKyAiCXZvaWQgZm9vKCkgewkJCQkJCQkJXG4iCi0JCQkrICIJCVN5c3RlbS5vdXQucHJpbnRsbigpOwkJCQkJXG4iCi0JCQkrICIgCXZvaWQgYmF6KCl7fQkJCQkJCQlcbiIKLQkJCSsgIiB9CQkJCQkJCQkJCQlcbiIKLQkJCSsgIgkJCQkJCQkJCQkJCVxuIgotCQkJKyAiCXZvaWQgYmFyKCl7CQkJCQkJCQkJXG4iCi0JCQkrICIgfQkJCQkJCQkJCQkJXG4iCi0JCQkrICIJdm9pZCB0cnVjKCl7CQkJCQkJCQlcbiIKLQkJCSsgIiB9CQkJCQkJCQkJCQlcbiIKLQkJCSsgIn0JCQkJCQkJCQkJCVxuIjsgCi0KLSAKLQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcgPSAKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iCi0JCQkrICJcdGphdmEubGFuZy5PYmplY3QoMClcbiIKLQkJCSsgIlx0dm9pZCBmb28oKSB7fVxuIgotCQkJKyAiXHR2b2lkIGJhcigpIHt9XG4iCi0JCQkrICJcdHZvaWQgdHJ1YygpIHt9XG4iCi0JCQkrICJ9IjsKLQkJCQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAidGVzdDA5OiBmdWxsIHBhcnNlIjsKLQlmdWxsUGFyc2Uocyx0ZXN0TmFtZSk7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlU3RhcnQgIiwgCi0JCTAsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOyAKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VFbmQgIiwgCi0JCTE5OCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOyAKLQotCVNvdXJjZUZpZWxkW10gZmllbGRzID0gY3VycmVudFR5cGUuZ2V0RmllbGRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgZmllbGRzICIsIGZpZWxkcyA9PSBudWxsKTsKLQotCVNvdXJjZU1ldGhvZFtdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWV0aG9kcyAiLCBtZXRob2RzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBtZXRob2RzIGxlbmd0aCAiLCAzLCBtZXRob2RzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgZm9vIiwgMjcsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGZvbyIsIDEwMCwgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCBiYXIiLCAxMjcsIG1ldGhvZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGJhciIsIDE0OSwgbWV0aG9kc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCB0cnVjIiwgMTYzLCBtZXRob2RzWzJdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCB0cnVjIiwgMTg1LCBtZXRob2RzWzJdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGZvbyIsICJmb28iLCBtZXRob2RzWzBdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCBiYXIiLCAiYmFyIiwgbWV0aG9kc1sxXS5nZXRBY3R1YWxOYW1lKCkpOwotCQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCB0cnVjIiwgInRydWMiLCBtZXRob2RzWzJdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIHNvdXJjZSAiICsgdGVzdE5hbWUsIAotCQlleHBlY3RlZFVuaXRUb1N0cmluZywgCi0JCWN1cnJlbnRUeXBlLnRvU3RyaW5nKCkpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3QxMCgpIHsKLQotCVN0cmluZyBzID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7CQkJCQkJCQkJXG4iCi0JCQkrICIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIKLQkJCSsgIgkJU3lzdGVtLm91dC5wcmludGxuKCk7CQkJCQlcbiIKLQkJCSsgIiAJdm9pZCBiYXooKXt9CQkJCQkJCVxuIgotCQkJKyAiIH0JCQkJCQkJCQkJCVxuIgotCQkJKyAiCS8qKiBjb21tZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCi0JCQkrICIgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLQkJCSsgIiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgotCQkJKyAiICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCi0JCQkrICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLQkJCSsgIgl2b2lkIGJhcigpewkJCQkJCQkJCVxuIgotCQkJKyAiIH0JCQkJCQkJCQkJCVxuIgotCQkJKyAiCXZvaWQgdHJ1YygpewkJCQkJCQkJXG4iCi0JCQkrICIgfQkJCQkJCQkJCQkJXG4iCi0JCQkrICJ9CQkJCQkJCQkJCQlcbiI7IAotCi0JU3RyaW5nIGV4cGVjdGVkVW5pdFRvU3RyaW5nID0gCi0JCQkicHVibGljIGNsYXNzIFgge1xuIgotCQkJKyAiXHR2b2lkIGZvbygpIHt9XG4iCi0JCQkrICJcdHZvaWQgYmFyKCkge31cbiIKLQkJCSsgIlx0dm9pZCB0cnVjKCkge31cbiIKLQkJCSsgIn0iOwotCQkJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICJ0ZXN0MTA6IGRpZXQgcGFyc2UiOwotCWRpZXRQYXJzZShzLHRlc3ROYW1lKTsKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJMCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7IAotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZUVuZCAiLCAKLQkJNDE1LCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7IAotCi0JU291cmNlRmllbGRbXSBmaWVsZHMgPSBjdXJyZW50VHlwZS5nZXRGaWVsZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzID09IG51bGwpOwotCi0JU291cmNlTWV0aG9kW10gbWV0aG9kcyA9IGN1cnJlbnRUeXBlLmdldE1ldGhvZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZXRob2RzICIsIG1ldGhvZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIG1ldGhvZHMgbGVuZ3RoICIsIDMsIG1ldGhvZHMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCBmb28iLCAyNywgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgZm9vIiwgMTAwLCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGJhciIsIDExNCwgbWV0aG9kc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgYmFyIiwgMzY2LCBtZXRob2RzWzFdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIHRydWMiLCAzODAsIG1ldGhvZHNbMl0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIHRydWMiLCA0MDIsIG1ldGhvZHNbMl0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgZm9vIiwgImZvbyIsIG1ldGhvZHNbMF0uZ2V0QWN0dWFsTmFtZSgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCBiYXIiLCAiYmFyIiwgbWV0aG9kc1sxXS5nZXRBY3R1YWxOYW1lKCkpOwotCQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCB0cnVjIiwgInRydWMiLCBtZXRob2RzWzJdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIHNvdXJjZSAiICsgdGVzdE5hbWUsIAotCQlleHBlY3RlZFVuaXRUb1N0cmluZywgCi0JCWN1cnJlbnRUeXBlLnRvU3RyaW5nKCkpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3QxMSgpIHsKLQotCVN0cmluZyBzID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7CQkJCQkJCQkJXG4iCi0JCQkrICIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIKLQkJCSsgIgkJU3lzdGVtLm91dC5wcmludGxuKCk7CQkJCQlcbiIKLQkJCSsgIiAJdm9pZCBiYXooKXt9ICAJCQkJCQkJXG4iCi0JCQkrICIJLyoqIGNvbW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLQkJCSsgIiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgotCQkJKyAiICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCi0JCQkrICIgICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLQkJCSsgIiAgaW50W11bXSBqW10gPSBudWxsLCBrOyAvLyBjb21tZW50ICAgICAgICAgIFxuIgotCQkJKyAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCi0JCQkrICIJdm9pZCBiYXIoKXsJCQkJCQkJCQlcbiIKLQkJCSsgIiB9CQkJCQkJCQkJCQlcbiIKLQkJCSsgIgl2b2lkIHRydWMoKXsJCQkJCQkJCVxuIgotCQkJKyAiIH0JCQkJCQkJCQkJCVxuIgotCQkJKyAifQkJCQkJCQkJCQkJXG4iOyAKLQotCVN0cmluZyBleHBlY3RlZFVuaXRUb1N0cmluZyA9IAotCQkJICJwdWJsaWMgY2xhc3MgWCB7XG4iCi0JCQkrICJcdGludFtdW11bXSBqO1xuIgotCQkJKyAiXHRpbnRbXVtdIGs7XG4iCi0JCQkrICJcdGphdmEubGFuZy5PYmplY3QoMClcbiIKLQkJCSsgIlx0dm9pZCBmb28oKSB7fVxuIgotCQkJKyAiXHR2b2lkIGJheigpIHt9XG4iCi0JCQkrICJcdHZvaWQgYmFyKCkge31cbiIKLQkJCSsgIlx0dm9pZCB0cnVjKCkge31cbiIKLQkJCSsgIn0iOwotCQkJCi0JU3RyaW5nIHRlc3ROYW1lID0gInRlc3QxMTogZnVsbCBwYXJzZSI7Ci0JZnVsbFBhcnNlKHMsdGVzdE5hbWUpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICIsIAotCQkwLCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsgCi0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlRW5kICIsIAotCQk0NDksIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsgCi0KLQlTb3VyY2VGaWVsZFtdIGZpZWxkcyA9IGN1cnJlbnRUeXBlLmdldEZpZWxkcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIGZpZWxkcyAiLCBmaWVsZHMgIT0gbnVsbCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBmaWVsZCBqIiwgMTAyLCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgZmllbGQgaiIsIDMwNSwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgZmllbGQgayIsIDEwMiwgZmllbGRzWzFdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIGZpZWxkIGsiLCAzMDgsIGZpZWxkc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCVNvdXJjZU1ldGhvZFtdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWV0aG9kcyAiLCBtZXRob2RzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBtZXRob2RzIGxlbmd0aCAiLCA0LCBtZXRob2RzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgZm9vIiwgMjcsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGZvbyIsIDc2LCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGJheiIsIDc5LCBtZXRob2RzWzFdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBiYXoiLCA5MCwgbWV0aG9kc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCBiYXIiLCAzNzgsIG1ldGhvZHNbMl0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGJhciIsIDQwMCwgbWV0aG9kc1syXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCB0cnVjIiwgNDE0LCBtZXRob2RzWzNdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCB0cnVjIiwgNDM2LCBtZXRob2RzWzNdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGZvbyIsICJmb28iLCBtZXRob2RzWzBdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgYmF6IiwgImJheiIsIG1ldGhvZHNbMV0uZ2V0QWN0dWFsTmFtZSgpKTsKLQkKLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgYmFyIiwgImJhciIsIG1ldGhvZHNbMl0uZ2V0QWN0dWFsTmFtZSgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCB0cnVjIiwgInRydWMiLCBtZXRob2RzWzNdLmdldEFjdHVhbE5hbWUoKSk7Ci0JCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBzb3VyY2UgIiArIHRlc3ROYW1lLCAKLQkJZXhwZWN0ZWRVbml0VG9TdHJpbmcsIAotCQljdXJyZW50VHlwZS50b1N0cmluZygpKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0MTIoKSB7Ci0KLQlTdHJpbmcgcyA9IAotCQkJImltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247XG4iCi0JCQkrICJpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsiCi0JCQkrICJcbiIKLQkJCSsgIi8qKiBjb21tZW50ICovXG4iCi0JCQkrICJwdWJsaWMgY2xhc3MgQTIge1xuIgotCQkJKyAiCXZvaWQgZm9vKCkge1xuIgkKLQkJCSsgIgkJU3lzdGVtLm91dC5wcmludGxuKCk7XG4iCi0JCQkrICIgCXZvaWQgYmF6KCl7fVxuIgotCQkJKyAiCS8qKiBjb21tZW50XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJKyAiICAqXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkrICIgICpcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCSsgIiAgKi9cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCSsgIiAgc3RhdGljIHsgfSAvLyBjb21tZW50XG4iCi0JCQkrICIgIFxuIgotCQkJKyAiXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJKyAiCXZvaWQgYmFyKCl7XG4iCi0JCQkrICIgfVxuIgotCQkJKyAiCXZvaWQgdHJ1Yygpe1xuIgotCQkJKyAiIH1cbiIKLQkJCSsgIn1cbiI7CQkJCQkJCQotCi0JU3RyaW5nIGV4cGVjdGVkVW5pdFRvU3RyaW5nID0gCi0JCQkiaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjtcbiIKLQkJCSsgImltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlO1xuIgotCQkJKyAicHVibGljIGNsYXNzIEEyIHtcbiIKLQkJCSsgIlx0c3RhdGljIHt9XG4iCi0JCQkrICJcdGphdmEubGFuZy5PYmplY3QoMClcbiIKLQkJCSsgIlx0dm9pZCBmb28oKSB7fVxuIgotCQkJKyAiXHR2b2lkIGJheigpIHt9XG4iCi0JCQkrICJcdHZvaWQgYmFyKCkge31cbiIKLQkJCSsgIlx0dm9pZCB0cnVjKCkge31cbiIKLQkJCSsgIn0iOwotCQkJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICJ0ZXN0MTI6IGZ1bGwgcGFyc2UiOwotCWZ1bGxQYXJzZShzLHRlc3ROYW1lKTsKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJNTgsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOyAKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VFbmQgIiwgCi0JCTIzMSwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOyAKLQotCVNvdXJjZUZpZWxkW10gZmllbGRzID0gY3VycmVudFR5cGUuZ2V0RmllbGRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgZmllbGRzICIsIGZpZWxkcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZmllbGRzIGxlbmd0aCAiLCAxLCBmaWVsZHMubGVuZ3RoKTsKLQkKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBpbml0aWFsaXplciIsIDE0NSwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIGluaXRpYWxpemVyIiwgMTgxLCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlTb3VyY2VNZXRob2RbXSBtZXRob2RzID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1ldGhvZHMgIiwgbWV0aG9kcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgbWV0aG9kcyBsZW5ndGggIiwgNCwgbWV0aG9kcy5sZW5ndGgpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGZvbyIsIDkyLCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBmb28iLCAxMjgsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgYmF6IiwgMTMxLCBtZXRob2RzWzFdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBiYXoiLCAxNDIsIG1ldGhvZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgYmFyIiwgMTgzLCBtZXRob2RzWzJdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBiYXIiLCAyMTIsIG1ldGhvZHNbMl0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgdHJ1YyIsIDIxNSwgbWV0aG9kc1szXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgdHJ1YyIsIDIyOSwgbWV0aG9kc1szXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCBmb28iLCAiZm9vIiwgbWV0aG9kc1swXS5nZXRBY3R1YWxOYW1lKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGJheiIsICJiYXoiLCBtZXRob2RzWzFdLmdldEFjdHVhbE5hbWUoKSk7Ci0JCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGJhciIsICJiYXIiLCBtZXRob2RzWzJdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgdHJ1YyIsICJ0cnVjIiwgbWV0aG9kc1szXS5nZXRBY3R1YWxOYW1lKCkpOwotCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgc291cmNlICIgKyB0ZXN0TmFtZSwgCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLCAKLQkJY3VycmVudFR5cGUudG9TdHJpbmcoKSk7IAotfQotcHVibGljIHZvaWQgdGVzdDEzKCkgewotCi0JU3RyaW5nIHMgPSAKLQkJCSJpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uO1xuIgotCQkJKyAiaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7XG4iCi0JCQkrICJcbiIKLQkJCSsgInB1YmxpYyBjbGFzcyBBMiB7XG4iCi0JCQkrICIJdm9pZCBmb28oKSB7XG4iCQotCQkJKyAiCQlTeXN0ZW0ub3V0LnByaW50bG4oKTtcbiIKLQkJCSsgIiAJdm9pZCBiYXooKXt9XG4iCi0JCQkrICIgIHN0YXRpYyB7IH1cbiIKLQkJCSsgIiAgXG4iCi0JCQkrICJcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkrICIJdm9pZCBiYXIoKXtcbiIKLQkJCSsgIiB9XG4iCi0JCQkrICIJdm9pZCB0cnVjKCl7XG4iCi0JCQkrICIgfVxuIgotCQkJKyAifVxuIjsJCQkJCQkJCi0KLQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcgPSAKLQkJCSJpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uO1xuIgotCQkJKyAiaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7XG4iCi0JCQkrICJwdWJsaWMgY2xhc3MgQTIge1xuIgotCQkJKyAiXHRzdGF0aWMge31cbiIKLQkJCSsgIlx0amF2YS5sYW5nLk9iamVjdCgwKVxuIgotCQkJKyAiXHR2b2lkIGZvbygpIHt9XG4iCi0JCQkrICJcdHZvaWQgYmF6KCkge31cbiIKLQkJCSsgIlx0dm9pZCBiYXIoKSB7fVxuIgotCQkJKyAiXHR2b2lkIHRydWMoKSB7fVxuIgotCQkJKyAifSI7Ci0JU3RyaW5nIHRlc3ROYW1lID0gInRlc3QxMzogZnVsbCBwYXJzZSI7Ci0JZnVsbFBhcnNlKHMsdGVzdE5hbWUpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICIsIAotCQk1OSwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7IAotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZUVuZCAiLCAKLQkJMTgwLCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7IAotCi0JU291cmNlRmllbGRbXSBmaWVsZHMgPSBjdXJyZW50VHlwZS5nZXRGaWVsZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzICE9IG51bGwpOwotCi0JYXNzZXJ0RXF1YWxzKCIgaW52YWxpZCBmaWVsZHMgbGVuZ3RoIiwgMSwgZmllbGRzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBpbml0aWFsaXplciIsIDEzMiwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIGluaXRpYWxpemVyIiwgMTQxLCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlTb3VyY2VNZXRob2RbXSBtZXRob2RzID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1ldGhvZHMgIiwgbWV0aG9kcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgbWV0aG9kcyBsZW5ndGggIiwgNCwgbWV0aG9kcy5sZW5ndGgpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGZvbyIsIDc4LCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBmb28iLCAxMTQsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgYmF6IiwgMTE3LCBtZXRob2RzWzFdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBiYXoiLCAxMjgsIG1ldGhvZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgYmFyIiwgMTQ4LCBtZXRob2RzWzJdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBiYXIiLCAxNjEsIG1ldGhvZHNbMl0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgdHJ1YyIsIDE2NCwgbWV0aG9kc1szXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgdHJ1YyIsIDE3OCwgbWV0aG9kc1szXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCBmb28iLCAiZm9vIiwgbWV0aG9kc1swXS5nZXRBY3R1YWxOYW1lKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGJheiIsICJiYXoiLCBtZXRob2RzWzFdLmdldEFjdHVhbE5hbWUoKSk7Ci0JCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGJhciIsICJiYXIiLCBtZXRob2RzWzJdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgdHJ1YyIsICJ0cnVjIiwgbWV0aG9kc1szXS5nZXRBY3R1YWxOYW1lKCkpOwotCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgc291cmNlICIgKyB0ZXN0TmFtZSwgCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLCAKLQkJY3VycmVudFR5cGUudG9TdHJpbmcoKSk7IAotfQotcHVibGljIHZvaWQgdGVzdDE0KCkgewotCi0JU3RyaW5nIHMgPSAKLQkJCSJpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uO1xuIgotCQkJKyAiaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7XG4iCi0JCQkrICJcbiIKLQkJCSsgInB1YmxpYyBjbGFzcyBBMiB7XG4iCi0JCQkrICIJdm9pZCBmb28oKSB7XG4iCQotCQkJKyAiCQlTeXN0ZW0ub3V0LnByaW50bG4oKTtcbiIKLQkJCSsgIiAJdm9pZCBiYXooKXt9XG4iCi0JCQkrICIgIHN0YXRpYyB7IH1cbiIKLQkJCSsgIiB9XG4iCi0JCQkrICJcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkrICIJdm9pZCBiYXIoKXtcbiIKLQkJCSsgIiB9XG4iCi0JCQkrICIJdm9pZCB0cnVjKCl7XG4iCi0JCQkrICIgfVxuIgotCQkJKyAifVxuIjsJCQkJCQkJCi0KLQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcgPSAKLQkJCSJpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uO1xuIgotCQkJKyAiaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7XG4iCi0JCQkrICJwdWJsaWMgY2xhc3MgQTIge1xuIgotCQkJKyAiXHR2b2lkIGZvbygpIHt9XG4iCi0JCQkrICJcdHZvaWQgYmFyKCkge31cbiIKLQkJCSsgIlx0dm9pZCB0cnVjKCkge31cbiIKLQkJCSsgIn0iOwotCQkJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICJ0ZXN0MTQ6IGRpZXQgcGFyc2UiOwotCWRpZXRQYXJzZShzLHRlc3ROYW1lKTsKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJNTksIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOyAKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VFbmQgIiwgCi0JCTE4MCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOyAKLQotCVNvdXJjZUZpZWxkW10gZmllbGRzID0gY3VycmVudFR5cGUuZ2V0RmllbGRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgZmllbGRzICIsIGZpZWxkcyA9PSBudWxsKTsKLQotCVNvdXJjZU1ldGhvZFtdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWV0aG9kcyAiLCBtZXRob2RzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBtZXRob2RzIGxlbmd0aCAiLCAzLCBtZXRob2RzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgZm9vIiwgNzgsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGZvbyIsIDE0NCwgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCBiYXIiLCAxNDgsIG1ldGhvZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGJhciIsIDE2MSwgbWV0aG9kc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCB0cnVjIiwgMTY0LCBtZXRob2RzWzJdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCB0cnVjIiwgMTc4LCBtZXRob2RzWzJdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGZvbyIsICJmb28iLCBtZXRob2RzWzBdLmdldEFjdHVhbE5hbWUoKSk7Ci0JCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGJhciIsICJiYXIiLCBtZXRob2RzWzFdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgdHJ1YyIsICJ0cnVjIiwgbWV0aG9kc1syXS5nZXRBY3R1YWxOYW1lKCkpOwotCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgc291cmNlICIgKyB0ZXN0TmFtZSwgCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLCAKLQkJY3VycmVudFR5cGUudG9TdHJpbmcoKSk7IAotfQotcHVibGljIHZvaWQgdGVzdDE1KCkgewotCi0JU3RyaW5nIHMgPSAKLQkJCSJwdWJsaWMgY2xhc3MgWCB7CQkJCQkJCQlcbiIKLQkJCSsgIiBjbGFzcyBZIHsJCQkJCQkJCQlcbiIKLQkJCSsgIgkgIHZvaWQgZm9vKCkgewkJCQkJCQkJXG4iCi0JCQkrICIJICAgU3lzdGVtLm91dC5wcmludGxuKCk7CQkJCQlcbiIKLQkJCSsgIiAgIH0JCQkJCQkJCQkJCVxuIgotCQkJKyAiIHB1YmxpYyBpbnQgaDsJCQkJCQkJCVxuIgotCQkJKyAiIHB1YmxpYyBpbnRbXSBpID0gezAsIDF9OwkJCQkJXG4iCi0JCQkrICIJdm9pZCBiYXIoKXsJCQkJCQkJCQlcbiIKLQkJCSsgIgl2b2lkIGJheigpewkJCQkJCQkJCVxuIgotCQkJKyAiIH0JCQkJCQkJCQkJCVxuIjsKLQkJCQkJCQotCi0JU3RyaW5nIGV4cGVjdGVkVW5pdFRvU3RyaW5nID0gCi0JCQkicHVibGljIGNsYXNzIFgge1xuIgotCQkJKyAiXHRjbGFzcyBZIHtcbiIKLQkJCSsgIlx0XHRwdWJsaWMgaW50IGg7XG4iCi0JCQkrICJcdFx0cHVibGljIGludFtdIGk7XG4iCi0JCQkrICJcdFx0amF2YS5sYW5nLk9iamVjdCgwKVxuIgotCQkJKyAiXHRcdHZvaWQgZm9vKCkge31cbiIKLQkJCSsgIlx0XHR2b2lkIGJhcigpIHt9XG4iCi0JCQkrICJcdFx0dm9pZCBiYXooKSB7fVxuIgotCQkJKyAiXHR9XG4iCi0JCQkrICJcdGphdmEubGFuZy5PYmplY3QoMClcbiIKLQkJCSsgIn0iOwotCQkJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICJ0ZXN0MTU6IGZ1bGwgcGFyc2UiOwotCWZ1bGxQYXJzZShzLHRlc3ROYW1lKTsKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJMCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7IAotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZUVuZCAiLCAKLQkJMjI3LCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7IAotCi0JU291cmNlRmllbGRbXSBmaWVsZHMgPSBjdXJyZW50VHlwZS5nZXRGaWVsZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzID09IG51bGwpOwotCi0JU291cmNlTWV0aG9kW10gbWV0aG9kcyA9IGN1cnJlbnRUeXBlLmdldE1ldGhvZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZXRob2RzICIsIG1ldGhvZHMgPT0gbnVsbCk7Ci0KLQlTb3VyY2VUeXBlW10gbWVtYmVycyA9IGN1cnJlbnRUeXBlLmdldE1lbWJlclR5cGVzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWVtYmVycyAiLCBtZW1iZXJzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiIGludmFsaWQgbWVtYmVycyBsZW5ndGggIiwgMSwgbWVtYmVycy5sZW5ndGgpOwotCi0JZmllbGRzID0gbWVtYmVyc1swXS5nZXRGaWVsZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiIGludmFsaWQgZmllbGRzIGxlbmd0aCAiLCAyLCBmaWVsZHMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIGZpZWxkIGgiLCAxMTcsIGZpZWxkc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBmaWVsZCBoIiwgMTI5LCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBmaWVsZCBpIiwgMTQwLCBmaWVsZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgZmllbGQgaSIsIDE2MywgZmllbGRzWzFdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCQotCW1ldGhvZHMgPSBtZW1iZXJzWzBdLmdldE1ldGhvZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZXRob2RzICIsIG1ldGhvZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCIgaW52YWxpZCBtZXRob2RzIGxlbmd0aCAiLCAzLCBtZXRob2RzLmxlbmd0aCk7Ci0JCQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCBmb28iLCA0OCwgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgZm9vIiwgMTAzLCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGJhciIsIDE3MSwgbWV0aG9kc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgYmFyIiwgMTkxLCBtZXRob2RzWzFdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGJheiIsIDE5MywgbWV0aG9kc1syXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgYmF6IiwgMjE1LCBtZXRob2RzWzJdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGZvbyIsICJmb28iLCBtZXRob2RzWzBdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgYmFyIiwgImJhciIsIG1ldGhvZHNbMV0uZ2V0QWN0dWFsTmFtZSgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCBiYXoiLCAiYmF6IiwgbWV0aG9kc1syXS5nZXRBY3R1YWxOYW1lKCkpOwotCi0JU291cmNlVHlwZSBtZW1iZXIgPSBtZW1iZXJzWzBdOwotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJMjYsIAotCQltZW1iZXIuZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsgCi0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlRW5kICIsIAotCQkyMjcsIAotCQltZW1iZXIuZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7IAotCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgc291cmNlICIgKyB0ZXN0TmFtZSwgCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLCAKLQkJY3VycmVudFR5cGUudG9TdHJpbmcoKSk7IAotfQotcHVibGljIHZvaWQgdGVzdDE2KCkgewotCi0JU3RyaW5nIHMgPSAKLQkJCSJwdWJsaWMgY2xhc3MgWCB7CQkJCQkJCQlcbiIKLQkJCSsgIiBjbGFzcyBZIHsJCQkJCQkJCQlcbiIKLQkJCSsgIgkgIHZvaWQgZm9vKCkgewkJCQkJCQkJXG4iCi0JCQkrICIJICAgU3lzdGVtLm91dC5wcmludGxuKCk7CQkJCQlcbiIKLQkJCSsgIiAgIH0JCQkJCQkJCQkJCVxuIgotCQkJKyAiIHB1YmxpYyBpbnQgaDsJCQkJCQkJCVxuIgotCQkJKyAiIHB1YmxpYyBpbnRbXSBpID0gezAsIDF9OwkJCQkJXG4iCi0JCQkrICIJdm9pZCBiYXIoKXsJCQkJCQkJCQlcbiIKLQkJCSsgIgl2b2lkIGJheigpewkJCQkJCQkJCVxuIgotCQkJKyAiIH0JCQkJCQkJCQkJCVxuIjsKLQkJCQkJCQotCi0JU3RyaW5nIGV4cGVjdGVkVW5pdFRvU3RyaW5nID0gCi0JCQkicHVibGljIGNsYXNzIFgge1xuIgotCQkJKyAiXHRjbGFzcyBZIHtcbiIKLQkJCSsgIlx0XHRwdWJsaWMgaW50IGg7XG4iCi0JCQkrICJcdFx0cHVibGljIGludFtdIGk7XG4iCi0JCQkrICJcdFx0dm9pZCBmb28oKSB7fVxuIgotCQkJKyAiXHRcdHZvaWQgYmFyKCkge31cbiIKLQkJCSsgIlx0XHR2b2lkIGJheigpIHt9XG4iCi0JCQkrICJcdH1cbiIKLQkJCSsgIn0iOwotCQkJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICJ0ZXN0MTY6IGRpZXQgcGFyc2UiOwotCWRpZXRQYXJzZShzLHRlc3ROYW1lKTsKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJMCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7IAotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZUVuZCAiLCAKLQkJMjI3LCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7IAotCi0JU291cmNlRmllbGRbXSBmaWVsZHMgPSBjdXJyZW50VHlwZS5nZXRGaWVsZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzID09IG51bGwpOwotCi0JU291cmNlTWV0aG9kW10gbWV0aG9kcyA9IGN1cnJlbnRUeXBlLmdldE1ldGhvZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZXRob2RzICIsIG1ldGhvZHMgPT0gbnVsbCk7Ci0KLQlTb3VyY2VUeXBlW10gbWVtYmVycyA9IGN1cnJlbnRUeXBlLmdldE1lbWJlclR5cGVzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWVtYmVycyAiLCBtZW1iZXJzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiIGludmFsaWQgbWVtYmVycyBsZW5ndGggIiwgMSwgbWVtYmVycy5sZW5ndGgpOwotCi0JZmllbGRzID0gbWVtYmVyc1swXS5nZXRGaWVsZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiIGludmFsaWQgZmllbGRzIGxlbmd0aCAiLCAyLCBmaWVsZHMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIGZpZWxkIGgiLCAxMTcsIGZpZWxkc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBmaWVsZCBoIiwgMTI5LCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBmaWVsZCBpIiwgMTQwLCBmaWVsZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgZmllbGQgaSIsIDE2MywgZmllbGRzWzFdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCQotCW1ldGhvZHMgPSBtZW1iZXJzWzBdLmdldE1ldGhvZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZXRob2RzICIsIG1ldGhvZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCIgaW52YWxpZCBtZXRob2RzIGxlbmd0aCAiLCAzLCBtZXRob2RzLmxlbmd0aCk7Ci0JCQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCBmb28iLCA0OCwgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgZm9vIiwgMTAzLCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGJhciIsIDE3MSwgbWV0aG9kc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgYmFyIiwgMTkxLCBtZXRob2RzWzFdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGJheiIsIDE5MywgbWV0aG9kc1syXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgYmF6IiwgMjE1LCBtZXRob2RzWzJdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGZvbyIsICJmb28iLCBtZXRob2RzWzBdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgYmFyIiwgImJhciIsIG1ldGhvZHNbMV0uZ2V0QWN0dWFsTmFtZSgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCBiYXoiLCAiYmF6IiwgbWV0aG9kc1syXS5nZXRBY3R1YWxOYW1lKCkpOwotCi0JU291cmNlVHlwZSBtZW1iZXIgPSBtZW1iZXJzWzBdOwotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJMjYsIAotCQltZW1iZXIuZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsgCi0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlRW5kICIsIAotCQkyMjcsIAotCQltZW1iZXIuZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7IAotCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgc291cmNlICIgKyB0ZXN0TmFtZSwgCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLCAKLQkJY3VycmVudFR5cGUudG9TdHJpbmcoKSk7IAotfQotcHVibGljIHZvaWQgdGVzdDE3KCkgewotCi0JU3RyaW5nIHMgPSAKLQkJCSJwdWJsaWMgY2xhc3MgWCB7CQkJCQkJCQlcbiIKLQkJCSsgIiBjbGFzcyBZIHsJCQkJCQkJCQlcbiIKLQkJCSsgIgkgIHZvaWQgZm9vKCkgewkJCQkJCQkJXG4iCi0JCQkrICIJICAgU3lzdGVtLm91dC5wcmludGxuKCk7CQkJCQlcbiIKLQkJCSsgIiAgIH0JCQkJCQkJCQkJCVxuIgotCQkJKyAiIH0JCQkJCQkJCQkJCVxuIgotCQkJKyAiIHB1YmxpYyBpbnQgaDsJCQkJCQkJCVxuIgotCQkJKyAiIHB1YmxpYyBpbnRbXSBpID0gezAsIDF9OwkJCQkJXG4iCi0JCQkrICIJdm9pZCBiYXIoKXsJCQkJCQkJCQlcbiIKLQkJCSsgIgl2b2lkIGJheigpewkJCQkJCQkJCVxuIgotCQkJKyAiIH0JCQkJCQkJCQkJCVxuIjsKLQkJCQkJCQotCi0JU3RyaW5nIGV4cGVjdGVkVW5pdFRvU3RyaW5nID0gCi0JCQkicHVibGljIGNsYXNzIFgge1xuIgotCQkJKyAiXHRjbGFzcyBZIHtcbiIKLQkJCSsgIlx0XHRqYXZhLmxhbmcuT2JqZWN0KDApXG4iCi0JCQkrICJcdFx0dm9pZCBmb28oKSB7fVxuIgotCQkJKyAiXHR9XG4iCi0JCQkrICJcdHB1YmxpYyBpbnQgaDtcbiIKLQkJCSsgIlx0cHVibGljIGludFtdIGk7XG4iCi0JCQkrICJcdGphdmEubGFuZy5PYmplY3QoMClcbiIKLQkJCSsgIlx0dm9pZCBiYXIoKSB7fVxuIgotCQkJKyAiXHR2b2lkIGJheigpIHt9XG4iCi0JCQkrICJ9IjsKLQkJCQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAidGVzdDE3OiBmdWxsIHBhcnNlIjsKLQlmdWxsUGFyc2Uocyx0ZXN0TmFtZSk7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlU3RhcnQgIiwgCi0JCTAsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOyAKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VFbmQgIiwgCi0JCTI0MSwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOyAKLQotCVNvdXJjZUZpZWxkW10gZmllbGRzID0gY3VycmVudFR5cGUuZ2V0RmllbGRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgZmllbGRzICIsIGZpZWxkcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoIiBpbnZhbGlkIGZpZWxkcyBsZW5ndGggIiwgMiwgZmllbGRzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBmaWVsZCBoIiwgMTMxLCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgZmllbGQgaCIsIDE0MywgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgZmllbGQgaSIsIDE1NCwgZmllbGRzWzFdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIGZpZWxkIGkiLCAxNzcsIGZpZWxkc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQkKLQlTb3VyY2VNZXRob2RbXSBtZXRob2RzID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1ldGhvZHMgIiwgbWV0aG9kcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoIiBpbnZhbGlkIGZpZWxkcyBsZW5ndGggIiwgMiwgbWV0aG9kcy5sZW5ndGgpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGJhciIsIDE4NSwgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgYmFyIiwgMjA1LCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGJheiIsIDIwNywgbWV0aG9kc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgYmF6IiwgMjI5LCBtZXRob2RzWzFdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCBiYXIiLCAiYmFyIiwgbWV0aG9kc1swXS5nZXRBY3R1YWxOYW1lKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGJheiIsICJiYXoiLCBtZXRob2RzWzFdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlTb3VyY2VUeXBlW10gbWVtYmVycyA9IGN1cnJlbnRUeXBlLmdldE1lbWJlclR5cGVzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWVtYmVycyAiLCBtZW1iZXJzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiIGludmFsaWQgbWVtYmVycyBsZW5ndGggIiwgMSwgbWVtYmVycy5sZW5ndGgpOwotCi0JZmllbGRzID0gbWVtYmVyc1swXS5nZXRGaWVsZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzID09IG51bGwpOwotCQotCW1ldGhvZHMgPSBtZW1iZXJzWzBdLmdldE1ldGhvZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZXRob2RzICIsIG1ldGhvZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCIgaW52YWxpZCBtZXRob2RzIGxlbmd0aCAiLCAxLCBtZXRob2RzLmxlbmd0aCk7Ci0JCQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCBmb28iLCA0OCwgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgZm9vIiwgMTAzLCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGZvbyIsICJmb28iLCBtZXRob2RzWzBdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlTb3VyY2VUeXBlIG1lbWJlciA9IG1lbWJlcnNbMF07Ci0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICIsIAotCQkyNiwgCi0JCW1lbWJlci5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOyAKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VFbmQgIiwgCi0JCTExNywgCi0JCW1lbWJlci5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsgCi0JCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBzb3VyY2UgIiArIHRlc3ROYW1lLCAKLQkJZXhwZWN0ZWRVbml0VG9TdHJpbmcsIAotCQljdXJyZW50VHlwZS50b1N0cmluZygpKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0MTgoKSB7Ci0KLQlTdHJpbmcgcyA9IAotCQkJInB1YmxpYyBjbGFzcyBYIHsJCQkJCQkJCVxuIgotCQkJKyAiIGNsYXNzIFkgewkJCQkJCQkJCVxuIgotCQkJKyAiCSAgdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIKLQkJCSsgIgkgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsJCQkJCVxuIgotCQkJKyAiICAgfQkJCQkJCQkJCQkJXG4iCi0JCQkrICIgfQkJCQkJCQkJCQkJXG4iCi0JCQkrICIgcHVibGljIGludCBoOwkJCQkJCQkJXG4iCi0JCQkrICIgcHVibGljIGludFtdIGkgPSB7MCwgMX07CQkJCQlcbiIKLQkJCSsgIgl2b2lkIGJhcigpewkJCQkJCQkJCVxuIgotCQkJKyAiCXZvaWQgYmF6KCl7CQkJCQkJCQkJXG4iCi0JCQkrICIgfQkJCQkJCQkJCQkJXG4iOwotCQkJCQkJCi0KLQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcgPSAKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iCi0JCQkrICJcdGNsYXNzIFkge1xuIgotCQkJKyAiXHRcdHZvaWQgZm9vKCkge31cbiIKLQkJCSsgIlx0fVxuIgotCQkJKyAiXHRwdWJsaWMgaW50IGg7XG4iCi0JCQkrICJcdHB1YmxpYyBpbnRbXSBpO1xuIgotCQkJKyAiXHR2b2lkIGJhcigpIHt9XG4iCi0JCQkrICJcdHZvaWQgYmF6KCkge31cbiIKLQkJCSsgIn0iOwotCQkJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICJ0ZXN0MTg6IGRpZXQgcGFyc2UiOwotCWRpZXRQYXJzZShzLHRlc3ROYW1lKTsKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJMCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7IAotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZUVuZCAiLCAKLQkJMjQxLCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7IAotCi0JU291cmNlRmllbGRbXSBmaWVsZHMgPSBjdXJyZW50VHlwZS5nZXRGaWVsZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiIGludmFsaWQgZmllbGRzIGxlbmd0aCAiLCAyLCBmaWVsZHMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIGZpZWxkIGgiLCAxMzEsIGZpZWxkc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBmaWVsZCBoIiwgMTQzLCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBmaWVsZCBpIiwgMTU0LCBmaWVsZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgZmllbGQgaSIsIDE3NywgZmllbGRzWzFdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCQotCVNvdXJjZU1ldGhvZFtdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWV0aG9kcyAiLCBtZXRob2RzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiIGludmFsaWQgZmllbGRzIGxlbmd0aCAiLCAyLCBtZXRob2RzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgYmFyIiwgMTg1LCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBiYXIiLCAyMDUsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgYmF6IiwgMjA3LCBtZXRob2RzWzFdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBiYXoiLCAyMjksIG1ldGhvZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0JCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGJhciIsICJiYXIiLCBtZXRob2RzWzBdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgYmF6IiwgImJheiIsIG1ldGhvZHNbMV0uZ2V0QWN0dWFsTmFtZSgpKTsKLQotCVNvdXJjZVR5cGVbXSBtZW1iZXJzID0gY3VycmVudFR5cGUuZ2V0TWVtYmVyVHlwZXMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZW1iZXJzICIsIG1lbWJlcnMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCIgaW52YWxpZCBtZW1iZXJzIGxlbmd0aCAiLCAxLCBtZW1iZXJzLmxlbmd0aCk7Ci0KLQlmaWVsZHMgPSBtZW1iZXJzWzBdLmdldEZpZWxkcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIGZpZWxkcyAiLCBmaWVsZHMgPT0gbnVsbCk7Ci0JCi0JbWV0aG9kcyA9IG1lbWJlcnNbMF0uZ2V0TWV0aG9kcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1ldGhvZHMgIiwgbWV0aG9kcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoIiBpbnZhbGlkIG1ldGhvZHMgbGVuZ3RoICIsIDEsIG1ldGhvZHMubGVuZ3RoKTsKLQkJCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGZvbyIsIDQ4LCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBmb28iLCAxMDMsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgZm9vIiwgImZvbyIsIG1ldGhvZHNbMF0uZ2V0QWN0dWFsTmFtZSgpKTsKLQotCVNvdXJjZVR5cGUgbWVtYmVyID0gbWVtYmVyc1swXTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlU3RhcnQgIiwgCi0JCTI2LCAKLQkJbWVtYmVyLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7IAotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZUVuZCAiLCAKLQkJMTE3LCAKLQkJbWVtYmVyLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOyAKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIHNvdXJjZSAiICsgdGVzdE5hbWUsIAotCQlleHBlY3RlZFVuaXRUb1N0cmluZywgCi0JCWN1cnJlbnRUeXBlLnRvU3RyaW5nKCkpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3QxOSgpIHsKLQotCVN0cmluZyBzID0gCi0JCQkicHVibGljIGNsYXNzIFggewkJCQkJCQkJXG4iCi0JCQkrICIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIKLQkJCSsgIgkJU3lzdGVtLm91dC5wcmludGxuKCk7CQkJCQlcbiIKLQkJCSsgIiB9CQkJCQkJCQkJCQlcbiIKLQkJCSsgIn0JCQkJCQkJCQkJCVxuIgotCQkJKyAiCXZvaWQgYmFyKCl7CQkJCQkJCQkJXG4iCi0JCQkrICIgIGludCB4OwkJCQkJCQkJCQlcbiIKLQkJCSsgIgl2b2lkIGJheigpewkJCQkJCQkJCVxuIgotCQkJKyAiIH0JCQkJCQkJCQkJCVxuIgotCQkJKyAiIGludCB5OwkJCQkJCQkJCQlcbiI7Ci0JCQkJCQkKLQotCVN0cmluZyBleHBlY3RlZFVuaXRUb1N0cmluZyA9IAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIKLQkJCSsgIlx0aW50IHk7XG4iCi0JCQkrICJcdGphdmEubGFuZy5PYmplY3QoMClcbiIKLQkJCSsgIlx0dm9pZCBmb28oKSB7fVxuIgotCQkJKyAiXHR2b2lkIGJhcigpIHt9XG4iCi0JCQkrICJcdHZvaWQgYmF6KCkge31cbiIKLQkJCSsgIn0iOwotCQkJCi0JU3RyaW5nIHRlc3ROYW1lID0gInRlc3QxOTogZnVsbCBwYXJzZSI7Ci0JZnVsbFBhcnNlKHMsdGVzdE5hbWUpOwotCQkJCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJMCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7IAotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZUVuZCAiLCAKLQkJMTk3LCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7IAotCi0JU291cmNlRmllbGRbXSBmaWVsZHMgPSBjdXJyZW50VHlwZS5nZXRGaWVsZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiIGludmFsaWQgZmllbGRzIGxlbmd0aCAiLCAxLCBmaWVsZHMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIGZpZWxkIHkiLCAxODEsIGZpZWxkc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBmaWVsZCB5IiwgMTg2LCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlTb3VyY2VNZXRob2RbXSBtZXRob2RzID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1ldGhvZHMgIiwgbWV0aG9kcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoIiBpbnZhbGlkIGZpZWxkcyBsZW5ndGggIiwgMywgbWV0aG9kcy5sZW5ndGgpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGZvbyIsIDI2LCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBmb28iLCA3NywgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCBiYXIiLCAxMDQsIG1ldGhvZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGJhciIsIDE0MywgbWV0aG9kc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCBiYXoiLCAxNDUsIG1ldGhvZHNbMl0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGJheiIsIDE2NywgbWV0aG9kc1syXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQkKLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgZm9vIiwgImZvbyIsIG1ldGhvZHNbMF0uZ2V0QWN0dWFsTmFtZSgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCBiYXIiLCAiYmFyIiwgbWV0aG9kc1sxXS5nZXRBY3R1YWxOYW1lKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGJheiIsICJiYXoiLCBtZXRob2RzWzJdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlTb3VyY2VUeXBlW10gbWVtYmVycyA9IGN1cnJlbnRUeXBlLmdldE1lbWJlclR5cGVzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWVtYmVycyAiLCBtZW1iZXJzID09IG51bGwpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBzb3VyY2UgIiArIHRlc3ROYW1lLCAKLQkJZXhwZWN0ZWRVbml0VG9TdHJpbmcsIAotCQljdXJyZW50VHlwZS50b1N0cmluZygpKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0MjAoKSB7Ci0KLQlTdHJpbmcgcyA9IAotCQkJInB1YmxpYyBjbGFzcyBYIHsJCQkJCQkJCVxuIgotCQkJKyAiCXZvaWQgZm9vKCkgewkJCQkJCQkJXG4iCi0JCQkrICIJCVN5c3RlbS5vdXQucHJpbnRsbigpOwkJCQkJXG4iCi0JCQkrICIgfQkJCQkJCQkJCQkJXG4iCi0JCQkrICJ9CQkJCQkJCQkJCQlcbiIKLQkJCSsgIgl2b2lkIGJhcigpewkJCQkJCQkJCVxuIgotCQkJKyAiIHB1YmxpYyBpbnQgeDsJCQkJCQkJCVxuIgotCQkJKyAiCXZvaWQgYmF6KCl7CQkJCQkJCQkJXG4iCi0JCQkrICIgfQkJCQkJCQkJCQkJXG4iCi0JCQkrICIgaW50IHk7CQkJCQkJCQkJCVxuIjsKLQkJCQkJCQotCi0JU3RyaW5nIGV4cGVjdGVkVW5pdFRvU3RyaW5nID0gCi0JCQkicHVibGljIGNsYXNzIFgge1xuIgotCQkJKyAiXHRwdWJsaWMgaW50IHg7XG4iCi0JCQkrICJcdGludCB5O1xuIgotCQkJKyAiXHRqYXZhLmxhbmcuT2JqZWN0KDApXG4iCi0JCQkrICJcdHZvaWQgZm9vKCkge31cbiIKLQkJCSsgIlx0dm9pZCBiYXIoKSB7fVxuIgotCQkJKyAiXHR2b2lkIGJheigpIHt9XG4iCi0JCQkrICJ9IjsKLQkJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICJ0ZXN0MjA6IGZ1bGwgcGFyc2UiOwotCWZ1bGxQYXJzZShzLHRlc3ROYW1lKTsKLQkJCQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlU3RhcnQgIiwgCi0JCTAsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOyAKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VFbmQgIiwgCi0JCTIwMSwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOyAKLQotCVNvdXJjZUZpZWxkW10gZmllbGRzID0gY3VycmVudFR5cGUuZ2V0RmllbGRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgZmllbGRzICIsIGZpZWxkcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoIiBpbnZhbGlkIGZpZWxkcyBsZW5ndGggIiwgMiwgZmllbGRzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBmaWVsZCB4IiwgMTI2LCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgZmllbGQgeCIsIDEzOCwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgZmllbGQgeSIsIDE4NSwgZmllbGRzWzFdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIGZpZWxkIHkiLCAxOTAsIGZpZWxkc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCVNvdXJjZU1ldGhvZFtdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWV0aG9kcyAiLCBtZXRob2RzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiIGludmFsaWQgZmllbGRzIGxlbmd0aCAiLCAzLCBtZXRob2RzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgZm9vIiwgMjYsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGZvbyIsIDc3LCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGJhciIsIDEwNCwgbWV0aG9kc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgYmFyIiwgMTI0LCBtZXRob2RzWzFdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGJheiIsIDE0OSwgbWV0aG9kc1syXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgYmF6IiwgMTcxLCBtZXRob2RzWzJdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCBmb28iLCAiZm9vIiwgbWV0aG9kc1swXS5nZXRBY3R1YWxOYW1lKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGJhciIsICJiYXIiLCBtZXRob2RzWzFdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgYmF6IiwgImJheiIsIG1ldGhvZHNbMl0uZ2V0QWN0dWFsTmFtZSgpKTsKLQotCVNvdXJjZVR5cGVbXSBtZW1iZXJzID0gY3VycmVudFR5cGUuZ2V0TWVtYmVyVHlwZXMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZW1iZXJzICIsIG1lbWJlcnMgPT0gbnVsbCk7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIHNvdXJjZSAiICsgdGVzdE5hbWUsIAotCQlleHBlY3RlZFVuaXRUb1N0cmluZywgCi0JCWN1cnJlbnRUeXBlLnRvU3RyaW5nKCkpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3QyMSgpIHsKLQotCVN0cmluZyBzID0gCi0JCQkicHVibGljIGNsYXNzIFggewkJCQkJCQkJXG4iCi0JCQkrICIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIKLQkJCSsgIgkJU3lzdGVtLm91dC5wcmludGxuKCk7CQkJCQlcbiIKLQkJCSsgIiB9CQkJCQkJCQkJCQlcbiIKLQkJCSsgIn0JCQkJCQkJCQkJCVxuIgotCQkJKyAiCXZvaWQgYmFyKCl7CQkJCQkJCQkJXG4iCi0JCQkrICIgcHVibGljIGludCB4OwkJCQkJCQkJXG4iCi0JCQkrICIJdm9pZCBiYXooKXsJCQkJCQkJCQlcbiIKLQkJCSsgIiB9CQkJCQkJCQkJCQlcbiIKLQkJCSsgIiBpbnQgeTsJCQkJCQkJCQkJXG4iOwotCQkJCQkJCi0KLQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcgPSAKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iCi0JCQkrICJcdHB1YmxpYyBpbnQgeDtcbiIKLQkJCSsgIlx0aW50IHk7XG4iCi0JCQkrICJcdHZvaWQgZm9vKCkge31cbiIKLQkJCSsgIlx0dm9pZCBiYXIoKSB7fVxuIgotCQkJKyAiXHR2b2lkIGJheigpIHt9XG4iCi0JCQkrICJ9IjsKLQkJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICJ0ZXN0MjE6IGRpZXQgcGFyc2UiOwotCWRpZXRQYXJzZShzLHRlc3ROYW1lKTsKLQkJCQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlU3RhcnQgIiwgCi0JCTAsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOyAKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VFbmQgIiwgCi0JCTIwMSwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOyAKLQotCVNvdXJjZUZpZWxkW10gZmllbGRzID0gY3VycmVudFR5cGUuZ2V0RmllbGRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgZmllbGRzICIsIGZpZWxkcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoIiBpbnZhbGlkIGZpZWxkcyBsZW5ndGggIiwgMiwgZmllbGRzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBmaWVsZCB4IiwgMTI2LCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgZmllbGQgeCIsIDEzOCwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgZmllbGQgeSIsIDE4NSwgZmllbGRzWzFdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIGZpZWxkIHkiLCAxOTAsIGZpZWxkc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCVNvdXJjZU1ldGhvZFtdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWV0aG9kcyAiLCBtZXRob2RzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiIGludmFsaWQgZmllbGRzIGxlbmd0aCAiLCAzLCBtZXRob2RzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgZm9vIiwgMjYsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGZvbyIsIDc3LCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGJhciIsIDEwNCwgbWV0aG9kc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgYmFyIiwgMTI0LCBtZXRob2RzWzFdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGJheiIsIDE0OSwgbWV0aG9kc1syXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgYmF6IiwgMTcxLCBtZXRob2RzWzJdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCBmb28iLCAiZm9vIiwgbWV0aG9kc1swXS5nZXRBY3R1YWxOYW1lKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGJhciIsICJiYXIiLCBtZXRob2RzWzFdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgYmF6IiwgImJheiIsIG1ldGhvZHNbMl0uZ2V0QWN0dWFsTmFtZSgpKTsKLQotCVNvdXJjZVR5cGVbXSBtZW1iZXJzID0gY3VycmVudFR5cGUuZ2V0TWVtYmVyVHlwZXMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZW1iZXJzICIsIG1lbWJlcnMgPT0gbnVsbCk7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIHNvdXJjZSAiICsgdGVzdE5hbWUsIAotCQlleHBlY3RlZFVuaXRUb1N0cmluZywgCi0JCWN1cnJlbnRUeXBlLnRvU3RyaW5nKCkpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3QyMigpIHsKLQotCVN0cmluZyBzID0gCi0JCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyB7CQkJCQkJXG4iCi0JCQkrICIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIKLQkJCSsgIiB9CQkJCQkJCQkJCQlcbiIKLQkJCSsgIn0JCQkJCQkJCQkJCVxuIjsJCQkJCQkKLQotCVN0cmluZyBleHBlY3RlZFVuaXRUb1N0cmluZyA9IAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIKLQkJCSsgIlx0amF2YS5sYW5nLk9iamVjdCgwKVxuIgotCQkJKyAiXHR2b2lkIGZvbygpIHt9XG4iCi0JCQkrICJ9IjsKLQkJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICJ0ZXN0MjI6IGZ1bGwgcGFyc2UiOwotCWZ1bGxQYXJzZShzLHRlc3ROYW1lKTsKLQkJCQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlU3RhcnQgIiwgCi0JCTAsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOyAKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VFbmQgIiwgCi0JCTY3LCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7IAotCi0JU291cmNlRmllbGRbXSBmaWVsZHMgPSBjdXJyZW50VHlwZS5nZXRGaWVsZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzID09IG51bGwpOwotCi0JU291cmNlTWV0aG9kW10gbWV0aG9kcyA9IGN1cnJlbnRUeXBlLmdldE1ldGhvZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZXRob2RzICIsIG1ldGhvZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCIgaW52YWxpZCBmaWVsZHMgbGVuZ3RoICIsIDEsIG1ldGhvZHMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCBmb28iLCAzMiwgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgZm9vIiwgNTQsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgZm9vIiwgImZvbyIsIG1ldGhvZHNbMF0uZ2V0QWN0dWFsTmFtZSgpKTsKLQotCVNvdXJjZVR5cGVbXSBtZW1iZXJzID0gY3VycmVudFR5cGUuZ2V0TWVtYmVyVHlwZXMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZW1iZXJzICIsIG1lbWJlcnMgPT0gbnVsbCk7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIHNvdXJjZSAiICsgdGVzdE5hbWUsIAotCQlleHBlY3RlZFVuaXRUb1N0cmluZywgCi0JCWN1cnJlbnRUeXBlLnRvU3RyaW5nKCkpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3QyMygpIHsKLQotCVN0cmluZyBzID0gCi0JCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBUaHJlYWQgewkJCQlcbiIKLQkJCSsgIgl2b2lkIGZvbygpIHRocm93cwkJCQkJCQlcbiIKLQkJCSsgIgl2b2lkIGJhcigpIAkJCQkJCQkJCVxuIgotCQkJKyAiIH0JCQkJCQkJCQkJCVxuIgotCQkJKyAifQkJCQkJCQkJCQkJXG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkVW5pdFRvU3RyaW5nID0gCi0JCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBUaHJlYWQge1xuIgotCQkJKyAiXHRUaHJlYWQoMClcbiIKLQkJCSsgIlx0dm9pZCBmb28oKSB7fVxuIgotCQkJKyAiXHR2b2lkIGJhcigpIHt9XG4iCi0JCQkrICJ9IjsKLQkJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICJ0ZXN0MjM6IGZ1bGwgcGFyc2UiOwotCWZ1bGxQYXJzZShzLHRlc3ROYW1lKTsKLQkJCQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlU3RhcnQgIiwgCi0JCTAsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOyAKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VFbmQgIiwgCi0JCTk4LCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7IAotCi0JU291cmNlRmllbGRbXSBmaWVsZHMgPSBjdXJyZW50VHlwZS5nZXRGaWVsZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzID09IG51bGwpOwotCi0JU291cmNlTWV0aG9kW10gbWV0aG9kcyA9IGN1cnJlbnRUeXBlLmdldE1ldGhvZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZXRob2RzICIsIG1ldGhvZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCIgaW52YWxpZCBmaWVsZHMgbGVuZ3RoICIsIDIsIG1ldGhvZHMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCBmb28iLCAzNywgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgZm9vIiwgNjEsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgYmFyIiwgNjMsIG1ldGhvZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGJhciIsIDg1LCBtZXRob2RzWzFdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGZvbyIsICJmb28iLCBtZXRob2RzWzBdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgYmFyIiwgImJhciIsIG1ldGhvZHNbMV0uZ2V0QWN0dWFsTmFtZSgpKTsKLQotCVNvdXJjZVR5cGVbXSBtZW1iZXJzID0gY3VycmVudFR5cGUuZ2V0TWVtYmVyVHlwZXMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZW1iZXJzICIsIG1lbWJlcnMgPT0gbnVsbCk7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIHNvdXJjZSAiICsgdGVzdE5hbWUsIAotCQlleHBlY3RlZFVuaXRUb1N0cmluZywgCi0JCWN1cnJlbnRUeXBlLnRvU3RyaW5nKCkpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3QyNCgpIHsKLQotCVN0cmluZyBzID0gCi0JCQkicHVibGljIGNsYXNzIFggaW1wbGVtZW50cyAJCQkJCQlcbiIKLQkJCSsgIgl2b2lkIGZvbygpIAkJCQkJCQkJCVxuIgotCQkJKyAiCXZvaWQgYmFyKCkgCQkJCQkJCQkJXG4iCi0JCQkrICIgfQkJCQkJCQkJCQkJXG4iCi0JCQkrICJ9CQkJCQkJCQkJCQlcbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcgPSAKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iCi0JCQkrICJcdGphdmEubGFuZy5PYmplY3QoMClcbiIKLQkJCSsgIlx0dm9pZCBmb28oKSB7fVxuIgotCQkJKyAiXHR2b2lkIGJhcigpIHt9XG4iCi0JCQkrICJ9IjsKLQkJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICJ0ZXN0MjQ6IGZ1bGwgcGFyc2UiOwotCWZ1bGxQYXJzZShzLHRlc3ROYW1lKTsKLQkJCQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlU3RhcnQgIiwgCi0JCTAsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOyAKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VFbmQgIiwgCi0JCTkxLCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7IAotCi0JU291cmNlRmllbGRbXSBmaWVsZHMgPSBjdXJyZW50VHlwZS5nZXRGaWVsZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzID09IG51bGwpOwotCi0JU291cmNlTWV0aG9kW10gbWV0aG9kcyA9IGN1cnJlbnRUeXBlLmdldE1ldGhvZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZXRob2RzICIsIG1ldGhvZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCIgaW52YWxpZCBmaWVsZHMgbGVuZ3RoICIsIDIsIG1ldGhvZHMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCBmb28iLCAzNCwgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgZm9vIiwgNTQsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgYmFyIiwgNTYsIG1ldGhvZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGJhciIsIDc4LCBtZXRob2RzWzFdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGZvbyIsICJmb28iLCBtZXRob2RzWzBdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgYmFyIiwgImJhciIsIG1ldGhvZHNbMV0uZ2V0QWN0dWFsTmFtZSgpKTsKLQotCVNvdXJjZVR5cGVbXSBtZW1iZXJzID0gY3VycmVudFR5cGUuZ2V0TWVtYmVyVHlwZXMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZW1iZXJzICIsIG1lbWJlcnMgPT0gbnVsbCk7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIHNvdXJjZSAiICsgdGVzdE5hbWUsIAotCQlleHBlY3RlZFVuaXRUb1N0cmluZywgCi0JCWN1cnJlbnRUeXBlLnRvU3RyaW5nKCkpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3QyNSgpIHsKLQotCVN0cmluZyBzID0gCi0JCQkicHVibGljIGNsYXNzIFggaW1wbGVtZW50cyBZLAkJCQkJXG4iCi0JCQkrICIJdm9pZCBmb28oKSAJCQkJCQkJCQlcbiIKLQkJCSsgIgl2b2lkIGJhcigpIAkJCQkJCQkJCVxuIgotCQkJKyAiIH0JCQkJCQkJCQkJCVxuIgotCQkJKyAifQkJCQkJCQkJCQkJXG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkVW5pdFRvU3RyaW5nID0gCi0JCQkicHVibGljIGNsYXNzIFggaW1wbGVtZW50cyBZLCB7XG4iCi0JCQkrICJcdGphdmEubGFuZy5PYmplY3QoMClcbiIKLQkJCSsgIlx0dm9pZCBmb28oKSB7fVxuIgotCQkJKyAiXHR2b2lkIGJhcigpIHt9XG4iCi0JCQkrICJ9IjsKLQkJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICJ0ZXN0MjU6IGZ1bGwgcGFyc2UiOwotCWZ1bGxQYXJzZShzLHRlc3ROYW1lKTsKLQkJCQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlU3RhcnQgIiwgCi0JCTAsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOyAKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VFbmQgIiwgCi0JCTkyLCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7IAotCi0JYXNzZXJ0VHJ1ZSgiY29udGFpbnMgc3VwZXJpbnRlcmZhY2VzICIgLCBjdXJyZW50VHlwZS5nZXRJbnRlcmZhY2VOYW1lcygpICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiIGludmFsaWQgc3VwZXJpbnRlcmZhY2VzIGxlbmd0aCAiLCAxLCBjdXJyZW50VHlwZS5nZXRJbnRlcmZhY2VOYW1lcygpLmxlbmd0aCk7Ci0JCi0JU291cmNlRmllbGRbXSBmaWVsZHMgPSBjdXJyZW50VHlwZS5nZXRGaWVsZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzID09IG51bGwpOwotCi0JU291cmNlTWV0aG9kW10gbWV0aG9kcyA9IGN1cnJlbnRUeXBlLmdldE1ldGhvZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZXRob2RzICIsIG1ldGhvZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCIgaW52YWxpZCBmaWVsZHMgbGVuZ3RoICIsIDIsIG1ldGhvZHMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCBmb28iLCAzNSwgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgZm9vIiwgNTUsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgYmFyIiwgNTcsIG1ldGhvZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGJhciIsIDc5LCBtZXRob2RzWzFdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGZvbyIsICJmb28iLCBtZXRob2RzWzBdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgYmFyIiwgImJhciIsIG1ldGhvZHNbMV0uZ2V0QWN0dWFsTmFtZSgpKTsKLQotCVNvdXJjZVR5cGVbXSBtZW1iZXJzID0gY3VycmVudFR5cGUuZ2V0TWVtYmVyVHlwZXMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZW1iZXJzICIsIG1lbWJlcnMgPT0gbnVsbCk7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIHNvdXJjZSAiICsgdGVzdE5hbWUsIAotCQlleHBlY3RlZFVuaXRUb1N0cmluZywgCi0JCWN1cnJlbnRUeXBlLnRvU3RyaW5nKCkpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3QyNigpIHsKLQotCVN0cmluZyBzID0KLQkJCSJwdWJsaWMgY2xhc3MgWCBpbXBsZW1lbnRzIAkJCQkJCVxuIgotCQkJKyAiIGNsYXNzIFkgeyAJCQkJCQkJCQlcbiIKLQkJCSsgIgkgdm9pZCBiYXIoKSAJCQkJCQkJCVxuIgotCQkJKyAiIH0JCQkJCQkJCQkJCVxuIgotCQkJKyAifQkJCQkJCQkJCQkJXG4iOwotCQkJCi0JU3RyaW5nIGV4cGVjdGVkVW5pdFRvU3RyaW5nID0gCi0JCQkicHVibGljIGNsYXNzIFgge1xuIgotCQkJKyAiXHRjbGFzcyBZIHtcbiIKLQkJCSsgIlx0XHRqYXZhLmxhbmcuT2JqZWN0KDApXG4iCi0JCQkrICJcdFx0dm9pZCBiYXIoKSB7fVxuIgotCQkJKyAiXHR9XG4iCi0JCQkrICJcdGphdmEubGFuZy5PYmplY3QoMClcbiIKLQkJCSsgIn0iOwotCQkJCi0JU3RyaW5nIHRlc3ROYW1lID0gInRlc3QyNjogZnVsbCBwYXJzZSI7Ci0JZnVsbFBhcnNlKHMsdGVzdE5hbWUpOwotCQkJCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJMCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7IAotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZUVuZCAiLCAKLQkJMTAyLCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7IAotCi0JYXNzZXJ0VHJ1ZSgiZG9lc24ndCBjb250YWluIHN1cGVyaW50ZXJmYWNlcyAiICwgY3VycmVudFR5cGUuZ2V0SW50ZXJmYWNlTmFtZXMoKSA9PSBudWxsKTsKLQkKLQlTb3VyY2VGaWVsZFtdIGZpZWxkcyA9IGN1cnJlbnRUeXBlLmdldEZpZWxkcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIGZpZWxkcyAiLCBmaWVsZHMgPT0gbnVsbCk7Ci0KLQlTb3VyY2VNZXRob2RbXSBtZXRob2RzID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1ldGhvZHMgIiwgbWV0aG9kcyA9PSBudWxsKTsKLQotCVNvdXJjZVR5cGVbXSBtZW1iZXJzID0gY3VycmVudFR5cGUuZ2V0TWVtYmVyVHlwZXMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZW1iZXJzICIsIG1lbWJlcnMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCIgY29udGFpbnMgb25lIG1lbWJlciAiLCAxLCBtZW1iZXJzLmxlbmd0aCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICIsIAotCQkzNCwgCi0JCW1lbWJlcnNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsgCi0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlRW5kICIsIAotCQk5MCwgCi0JCW1lbWJlcnNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7IAotCi0JbWV0aG9kcyA9IG1lbWJlcnNbMF0uZ2V0TWV0aG9kcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1ldGhvZHMgIiwgbWV0aG9kcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoIiBjb250YWlucyBvbmUgbWV0aG9kICIsIDEsIG1ldGhvZHMubGVuZ3RoKTsKLQkKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgYmFyIiwgNTYsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGJhciIsIDc3LCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGJhciIsICJiYXIiLCBtZXRob2RzWzBdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQltZW1iZXJzID0gbWVtYmVyc1swXS5nZXRNZW1iZXJUeXBlcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1lbWJlcnMgIiwgbWVtYmVycyA9PSBudWxsKTsKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgc291cmNlICIgKyB0ZXN0TmFtZSwgCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLCAKLQkJY3VycmVudFR5cGUudG9TdHJpbmcoKSk7IAotfQotcHVibGljIHZvaWQgdGVzdDI3KCkgewotCi0JU3RyaW5nIHMgPSAKLQkJInB1YmxpYyBjbGFzcyBYIAkJIAkJCQkJCVxuIgotCQkrICIgZmllbGRYOwkJCQkJCQkJCQlcbiIKLQkJKyAiIGNsYXNzIFkgeyAJCQkJCQkJCQlcbiIKLQkJKyAiCSB2b2lkIGJhcigpIAkJCQkJCQkJXG4iCi0JCSsgIiB9CQkJCQkJCQkJCQlcbiIKLQkJKyAifQkJCQkJCQkJCQkJXG4iOwotCQkJCi0JU3RyaW5nIGV4cGVjdGVkVW5pdFRvU3RyaW5nID0gCi0JCQkicHVibGljIGNsYXNzIFgge1xuIgotCQkJKyAiXHRjbGFzcyBZIHtcbiIKLQkJCSsgIlx0XHRqYXZhLmxhbmcuT2JqZWN0KDApXG4iCi0JCQkrICJcdFx0dm9pZCBiYXIoKSB7fVxuIgotCQkJKyAiXHR9XG4iCi0JCQkrICJcdGphdmEubGFuZy5PYmplY3QoMClcbiIKLQkJCSsgIn0iOwotCQkJCi0JU3RyaW5nIHRlc3ROYW1lID0gInRlc3QyNzogZnVsbCBwYXJzZSI7Ci0JZnVsbFBhcnNlKHMsdGVzdE5hbWUpOwotCQkJCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJMCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7IAotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZUVuZCAiLCAKLQkJMTEzLCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7IAotCi0JYXNzZXJ0VHJ1ZSgiZG9lc24ndCBjb250YWluIHN1cGVyaW50ZXJmYWNlcyAiICwgY3VycmVudFR5cGUuZ2V0SW50ZXJmYWNlTmFtZXMoKSA9PSBudWxsKTsKLQkKLQlTb3VyY2VGaWVsZFtdIGZpZWxkcyA9IGN1cnJlbnRUeXBlLmdldEZpZWxkcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIGZpZWxkcyAiLCBmaWVsZHMgPT0gbnVsbCk7Ci0KLQlTb3VyY2VNZXRob2RbXSBtZXRob2RzID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1ldGhvZHMgIiwgbWV0aG9kcyA9PSBudWxsKTsKLQotCVNvdXJjZVR5cGVbXSBtZW1iZXJzID0gY3VycmVudFR5cGUuZ2V0TWVtYmVyVHlwZXMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZW1iZXJzICIsIG1lbWJlcnMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCIgY29udGFpbnMgb25lIG1lbWJlciAiLCAxLCBtZW1iZXJzLmxlbmd0aCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICIsIAotCQk0NSwgCi0JCW1lbWJlcnNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsgCi0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlRW5kICIsIAotCQkxMDEsIAotCQltZW1iZXJzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOyAKLQotCW1ldGhvZHMgPSBtZW1iZXJzWzBdLmdldE1ldGhvZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZXRob2RzICIsIG1ldGhvZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCIgY29udGFpbnMgb25lIG1ldGhvZCAiLCAxLCBtZXRob2RzLmxlbmd0aCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGJhciIsIDY3LCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBiYXIiLCA4OCwgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCBiYXIiLCAiYmFyIiwgbWV0aG9kc1swXS5nZXRBY3R1YWxOYW1lKCkpOwotCi0JbWVtYmVycyA9IG1lbWJlcnNbMF0uZ2V0TWVtYmVyVHlwZXMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZW1iZXJzICIsIG1lbWJlcnMgPT0gbnVsbCk7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIHNvdXJjZSAiICsgdGVzdE5hbWUsIAotCQlleHBlY3RlZFVuaXRUb1N0cmluZywgCi0JCWN1cnJlbnRUeXBlLnRvU3RyaW5nKCkpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3QyOCgpIHsKLQotCVN0cmluZyBzID0gCi0JCQkicHVibGljIGNsYXNzIFggCQkgCQkJCQkJXG4iCi0JCQkrICIgZmllbGRYOwkJCQkJCQkJCQlcbiIKLQkJCSsgIiBjbGFzcyBZICAJCQkJCQkJCQlcbiIKLQkJCSsgIiB9CQkJCQkJCQkJCQlcbiIKLQkJCSsgIn0JCQkJCQkJCQkJCVxuIjsKLQkJCQotCVN0cmluZyBleHBlY3RlZFVuaXRUb1N0cmluZyA9IAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIKLQkJCSsgIlx0Y2xhc3MgWSB7XG4iCi0JCQkrICJcdFx0amF2YS5sYW5nLk9iamVjdCgwKVxuIgotCQkJKyAiXHR9XG4iCi0JCQkrICJcdGphdmEubGFuZy5PYmplY3QoMClcbiIKLQkJCSsgIn0iOwotCQkJCi0JU3RyaW5nIHRlc3ROYW1lID0gInRlc3QyODogZnVsbCBwYXJzZSI7Ci0JZnVsbFBhcnNlKHMsdGVzdE5hbWUpOwotCQkJCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJMCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7IAotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZUVuZCAiLCAKLQkJNzgsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsgCi0KLQlhc3NlcnRUcnVlKCJkb2Vzbid0IGNvbnRhaW4gc3VwZXJpbnRlcmZhY2VzICIgLCBjdXJyZW50VHlwZS5nZXRJbnRlcmZhY2VOYW1lcygpID09IG51bGwpOwotCQotCVNvdXJjZUZpZWxkW10gZmllbGRzID0gY3VycmVudFR5cGUuZ2V0RmllbGRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgZmllbGRzICIsIGZpZWxkcyA9PSBudWxsKTsKLQotCVNvdXJjZU1ldGhvZFtdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWV0aG9kcyAiLCBtZXRob2RzID09IG51bGwpOwotCi0JU291cmNlVHlwZVtdIG1lbWJlcnMgPSBjdXJyZW50VHlwZS5nZXRNZW1iZXJUeXBlcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1lbWJlcnMgIiwgbWVtYmVycyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoIiBjb250YWlucyBvbmUgbWVtYmVyICIsIDEsIG1lbWJlcnMubGVuZ3RoKTsKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlU3RhcnQgIiwgCi0JCTQ1LCAKLQkJbWVtYmVyc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOyAKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VFbmQgIiwgCi0JCTY1LCAKLQkJbWVtYmVyc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsgCi0KLQltZXRob2RzID0gbWVtYmVyc1swXS5nZXRNZXRob2RzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWV0aG9kcyAiLCBtZXRob2RzID09IG51bGwpOwotCQotCW1lbWJlcnMgPSBtZW1iZXJzWzBdLmdldE1lbWJlclR5cGVzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWVtYmVycyAiLCBtZW1iZXJzID09IG51bGwpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBzb3VyY2UgIiArIHRlc3ROYW1lLCAKLQkJZXhwZWN0ZWRVbml0VG9TdHJpbmcsIAotCQljdXJyZW50VHlwZS50b1N0cmluZygpKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0MjkoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCSJwYWNrYWdlIGE7CQkJCQkJCQkJCVxuIiArCi0JCSJpbXBvcnQgamF2YS5sYW5nLio7CQkJCQkJCVxuIiArCi0JCSJpbXBvcnQgamF2YS51dGlsLio7CQkJCQkJCVxuIiArCi0JCSIJCQkJCQkJCQkJCQlcbiIgKwotCQkicHVibGljIGNsYXNzIFggewkJCQkJCQkJXG4iICsJCQkJCQkJCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIgKwotCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsJCQkJCVxuIiArCQkKLQkJIgkJCQkJCQkJCQkJCVxuIiArCi0JCSIJCWNsYXNzIEwgZXh0ZW5kcyB7CQkJCQkJXG4iICsKLQkJIgkJCXB1YmxpYyBpbnQgbDsJCQkJCQlcbiIgKwotCQkiCQkJdm9pZCBiYXooKXt9CQkJCQkJXG4iICsKLQkJIgkJfQkJCQkJCQkJCQlcbiIgKwotCQkiCQkJCQkJCQkJCQkJXG4iICsKLQkJIglwdWJsaWMgaW50IGg7CQkJCQkJCQlcbiIgKwkJCQkJCi0JCSIJCQkJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgYmFyKCl7CQkJCQkJCQkJXG4iICsJCQkJCi0JCSIJdm9pZCB0cnVjKCl7CQkJCQkJCQlcbiIgKwotCQkifQlcbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcgPSAKLQkJInBhY2thZ2UgYTtcbiIKLQkJKyAiaW1wb3J0IGphdmEubGFuZy4qO1xuIgotCQkrICJpbXBvcnQgamF2YS51dGlsLio7XG4iCi0JCSsgInB1YmxpYyBjbGFzcyBYIHtcbiIKLQkJKyAiXHRwdWJsaWMgaW50IGg7XG4iCi0JCSsgIlx0amF2YS5sYW5nLk9iamVjdCgwKVxuIgotCQkrICJcdHZvaWQgZm9vKCkge31cbiIKLQkJKyAiXHR2b2lkIGJhcigpIHt9XG4iCi0JCSsgIlx0dm9pZCB0cnVjKCkge31cbiIKLQkJKyAifSI7Ci0JCQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAidGVzdDI5OiBmdWxsIHBhcnNlIjsKLQlmdWxsUGFyc2Uocyx0ZXN0TmFtZSk7Ci0JCQkJCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICIsIAotCQk4OCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7IAotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZUVuZCAiLCAKLQkJMzU3LCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7IAotCi0JYXNzZXJ0VHJ1ZSgiZG9lc24ndCBjb250YWluIHN1cGVyaW50ZXJmYWNlcyAiICwgY3VycmVudFR5cGUuZ2V0SW50ZXJmYWNlTmFtZXMoKSA9PSBudWxsKTsKLQkKLQlTb3VyY2VGaWVsZFtdIGZpZWxkcyA9IGN1cnJlbnRUeXBlLmdldEZpZWxkcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIGZpZWxkcyAiLCBmaWVsZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCJjb250YWlucyBvbmUgZmllbGQgIiwgMSwgZmllbGRzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBmaWVsZCBoIiwgMjc2LCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgZmllbGQgaCIsIDI4OCwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JU291cmNlTWV0aG9kW10gbWV0aG9kcyA9IGN1cnJlbnRUeXBlLmdldE1ldGhvZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZXRob2RzICIsIG1ldGhvZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCIgY29udGFpbnMgMyBtZXRob2RzICIsIDMsIG1ldGhvZHMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCBmb28iLCAxMTQsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGZvbyIsIDI3NCwgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCBiYXIiLCAzMTIsIG1ldGhvZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGJhciIsIDMzMiwgbWV0aG9kc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCB0cnVjIiwgMzM0LCBtZXRob2RzWzJdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCB0cnVjIiwgMzU1LCBtZXRob2RzWzJdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGZvbyIsICJmb28iLCBtZXRob2RzWzBdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgYmFyIiwgImJhciIsIG1ldGhvZHNbMV0uZ2V0QWN0dWFsTmFtZSgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCB0cnVjIiwgInRydWMiLCBtZXRob2RzWzJdLmdldEFjdHVhbE5hbWUoKSk7Ci0JCQotCVNvdXJjZVR5cGVbXSBtZW1iZXJzID0gY3VycmVudFR5cGUuZ2V0TWVtYmVyVHlwZXMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZW1iZXJzICIsIG1lbWJlcnMgPT0gbnVsbCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBzb3VyY2UgIiArIHRlc3ROYW1lLCAKLQkJZXhwZWN0ZWRVbml0VG9TdHJpbmcsIAotCQljdXJyZW50VHlwZS50b1N0cmluZygpKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0MzAoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCSJwYWNrYWdlIGE7CQkJCQkJCQkJCVxuIiArCi0JCSJpbXBvcnQgamF2YS5sYW5nLio7CQkJCQkJCVxuIiArCi0JCSJpbXBvcnQgamF2YS51dGlsLio7CQkJCQkJCVxuIiArCi0JCSIJCQkJCQkJCQkJCQlcbiIgKwotCQkicHVibGljIGNsYXNzIFggewkJCQkJCQkJXG4iICsJCQkJCQkJCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIgKwotCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsJCQkJCVxuIiArCQkKLQkJIgkJCQkJCQkJCQkJCVxuIiArCi0JCSIJCWNsYXNzIEwgZXh0ZW5kcyB7CQkJCQkJXG4iICsKLQkJIgkJCXB1YmxpYyBpbnQgbDsJCQkJCQlcbiIgKwotCQkiCQkJdm9pZCBiYXooKXt9CQkJCQkJXG4iICsKLQkJIgkJfQkJCQkJCQkJCQlcbiIgKwotCQkiCQkJCQkJCQkJCQkJXG4iICsKLQkJIglwdWJsaWMgaW50IGg7CQkJCQkJCQlcbiIgKwkJCQkJCi0JCSIJCQkJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgYmFyKCl7CQkJCQkJCQkJXG4iICsJCQkJCi0JCSIJdm9pZCB0cnVjKCl7CQkJCQkJCQlcbiIgKwotCQkifQlcbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcgPSAKLQkJInBhY2thZ2UgYTtcbiIKLQkJKyAiaW1wb3J0IGphdmEubGFuZy4qO1xuIgotCQkrICJpbXBvcnQgamF2YS51dGlsLio7XG4iCi0JCSsgInB1YmxpYyBjbGFzcyBYIHtcbiIKLQkJKyAiXHRwdWJsaWMgaW50IGg7XG4iCi0JCSsgIlx0dm9pZCBmb28oKSB7fVxuIgotCQkrICJcdHZvaWQgYmFyKCkge31cbiIKLQkJKyAiXHR2b2lkIHRydWMoKSB7fVxuIgotCQkrICJ9IjsKLQkJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICJ0ZXN0MzA6IGRpZXQgcGFyc2UiOwotCWRpZXRQYXJzZShzLHRlc3ROYW1lKTsKLQkJCQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlU3RhcnQgIiwgCi0JCTg4LCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsgCi0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlRW5kICIsIAotCQkzNTcsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsgCi0KLQlhc3NlcnRUcnVlKCJkb2Vzbid0IGNvbnRhaW4gc3VwZXJpbnRlcmZhY2VzICIgLCBjdXJyZW50VHlwZS5nZXRJbnRlcmZhY2VOYW1lcygpID09IG51bGwpOwotCQotCVNvdXJjZUZpZWxkW10gZmllbGRzID0gY3VycmVudFR5cGUuZ2V0RmllbGRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgZmllbGRzICIsIGZpZWxkcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoImNvbnRhaW5zIG9uZSBmaWVsZCAiLCAxLCBmaWVsZHMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIGZpZWxkIGgiLCAyNzYsIGZpZWxkc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBmaWVsZCBoIiwgMjg4LCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlTb3VyY2VNZXRob2RbXSBtZXRob2RzID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1ldGhvZHMgIiwgbWV0aG9kcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoIiBjb250YWlucyAzIG1ldGhvZHMgIiwgMywgbWV0aG9kcy5sZW5ndGgpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGZvbyIsIDExNCwgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgZm9vIiwgMjc0LCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGJhciIsIDMxMiwgbWV0aG9kc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgYmFyIiwgMzMyLCBtZXRob2RzWzFdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIHRydWMiLCAzMzQsIG1ldGhvZHNbMl0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIHRydWMiLCAzNTUsIG1ldGhvZHNbMl0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgZm9vIiwgImZvbyIsIG1ldGhvZHNbMF0uZ2V0QWN0dWFsTmFtZSgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCBiYXIiLCAiYmFyIiwgbWV0aG9kc1sxXS5nZXRBY3R1YWxOYW1lKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIHRydWMiLCAidHJ1YyIsIG1ldGhvZHNbMl0uZ2V0QWN0dWFsTmFtZSgpKTsKLQkJCi0JU291cmNlVHlwZVtdIG1lbWJlcnMgPSBjdXJyZW50VHlwZS5nZXRNZW1iZXJUeXBlcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1lbWJlcnMgIiwgbWVtYmVycyA9PSBudWxsKTsKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIHNvdXJjZSAiICsgdGVzdE5hbWUsIAotCQlleHBlY3RlZFVuaXRUb1N0cmluZywgCi0JCWN1cnJlbnRUeXBlLnRvU3RyaW5nKCkpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3QzMSgpIHsKLQotCVN0cmluZyBzID0KLQkJInBhY2thZ2UgYTsJCQkJCQkJCQkJCVxuIiArCi0JCSJpbXBvcnQgamF2YS5sYW5nLio7CQkJCQkJCVxuIiArCi0JCSJpbXBvcnQgamF2YS51dGlsLio7CQkJCQkJCVxuIiArCi0JCSIJCQkJCQkJCQkJCQlcbiIgKwotCQkicHVibGljIGNsYXNzIFggewkJCQkJCQkJXG4iICsJCQkJCQkJCi0JCSIJdm9pZCBmb28oKSB7CQkJCQkJCQlcbiIgKwotCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsJCQkJCVxuIiArCQkKLQkJIgkJCQkJCQkJCQkJCVxuIiArCi0JCSIJCW5ldyBYKCl7CQkJCQkJCQlcbiIgKwotCQkiCQkJdm9pZCBiYXooKSB7fQkJCQkJCVxuIiArCi0JCSIJCX0uYmF6KCk7CQkJCQkJCQlcbiIgKwotCQkiCQkJCQkJCQkJCQkJXG4iICsKLQkJIglwdWJsaWMgaW50IGg7CQkJCQkJCQlcbiIgKwkJCQkJCi0JCSIJCQkJCQkJCQkJCQlcbiIgKwotCQkiCXZvaWQgYmFyKCl7CQkJCQkJCQkJXG4iICsJCQkJCi0JCSIJdm9pZCB0cnVjKCl7CQkJCQkJCQlcbiIgKwotCQkifQlcbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcgPSAKLQkJInBhY2thZ2UgYTtcbiIKLQkJKyAiaW1wb3J0IGphdmEubGFuZy4qO1xuIgotCQkrICJpbXBvcnQgamF2YS51dGlsLio7XG4iCi0JCSsgInB1YmxpYyBjbGFzcyBYIHtcbiIKLQkJKyAiXHRwdWJsaWMgaW50IGg7XG4iCi0JCSsgIlx0amF2YS5sYW5nLk9iamVjdCgwKVxuIgotCQkrICJcdHZvaWQgZm9vKCkge31cbiIKLQkJKyAiXHR2b2lkIGJhcigpIHt9XG4iCi0JCSsgIlx0dm9pZCB0cnVjKCkge31cbiIKLQkJKyAifSI7Ci0JCQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAidGVzdDMxOiBmdWxsIHBhcnNlIjsKLQlmdWxsUGFyc2Uocyx0ZXN0TmFtZSk7Ci0JCQkJCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICIsIAotCQk4OSwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7IAotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZUVuZCAiLCAKLQkJMzM0LCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7IAotCi0JYXNzZXJ0VHJ1ZSgiZG9lc24ndCBjb250YWluIHN1cGVyaW50ZXJmYWNlcyAiICwgY3VycmVudFR5cGUuZ2V0SW50ZXJmYWNlTmFtZXMoKSA9PSBudWxsKTsKLQkKLQlTb3VyY2VGaWVsZFtdIGZpZWxkcyA9IGN1cnJlbnRUeXBlLmdldEZpZWxkcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIGZpZWxkcyAiLCBmaWVsZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCJjb250YWlucyBvbmUgZmllbGQgIiwgMSwgZmllbGRzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBmaWVsZCBoIiwgMjUzLCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgZmllbGQgaCIsIDI2NSwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JU291cmNlTWV0aG9kW10gbWV0aG9kcyA9IGN1cnJlbnRUeXBlLmdldE1ldGhvZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZXRob2RzICIsIG1ldGhvZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCIgY29udGFpbnMgMyBtZXRob2RzICIsIDMsIG1ldGhvZHMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCBmb28iLCAxMTUsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGZvbyIsIDI1MSwgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCBiYXIiLCAyODksIG1ldGhvZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGJhciIsIDMwOSwgbWV0aG9kc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCB0cnVjIiwgMzExLCBtZXRob2RzWzJdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCB0cnVjIiwgMzMyLCBtZXRob2RzWzJdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGZvbyIsICJmb28iLCBtZXRob2RzWzBdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgYmFyIiwgImJhciIsIG1ldGhvZHNbMV0uZ2V0QWN0dWFsTmFtZSgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCB0cnVjIiwgInRydWMiLCBtZXRob2RzWzJdLmdldEFjdHVhbE5hbWUoKSk7Ci0JCQotCVNvdXJjZVR5cGVbXSBtZW1iZXJzID0gY3VycmVudFR5cGUuZ2V0TWVtYmVyVHlwZXMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZW1iZXJzICIsIG1lbWJlcnMgPT0gbnVsbCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBzb3VyY2UgIiArIHRlc3ROYW1lLCAKLQkJZXhwZWN0ZWRVbml0VG9TdHJpbmcsIAotCQljdXJyZW50VHlwZS50b1N0cmluZygpKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0MzIoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCSJwYWNrYWdlIGE7CQkJCQkJCQkJCQlcbiIgKwotCQkiaW1wb3J0IGphdmEubGFuZy4qOwkJCQkJCQlcbiIgKwotCQkiaW1wb3J0IGphdmEudXRpbC4qOwkJCQkJCQlcbiIgKwotCQkiCQkJCQkJCQkJCQkJXG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHsJCQkJCQkJCVxuIiArCQkJCQkJCQotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQkJXG4iICsKLQkJIgkJU3lzdGVtLm91dC5wcmludGxuKCk7CQkJCQlcbiIgKwkJCi0JCSIJCQkJCQkJCQkJCQlcbiIgKwotCQkiCQluZXcgWCgpewkJCQkJCQkJXG4iICsKLQkJIgkJCXZvaWQgYmF6KCkge30JCQkJCQlcbiIgKwotCQkiCQkJCQkJCQkJCQkJXG4iICsKLQkJIgkJcHVibGljIGludCBoOwkJCQkJCQlcbiIgKwkJCQkJCi0JCSIJCQkJCQkJCQkJCQlcbiIgKwotCQkiCQl2b2lkIGJhcigpewkJCQkJCQkJXG4iICsJCQkJCi0JCSIJCXZvaWQgdHJ1YygpewkJCQkJCQlcbiIgKwotCQkifQlcbiI7Ci0KLQotCVN0cmluZyBleHBlY3RlZFVuaXRUb1N0cmluZyA9IAotCQkicGFja2FnZSBhO1xuIgotCQkrICJpbXBvcnQgamF2YS5sYW5nLio7XG4iCi0JCSsgImltcG9ydCBqYXZhLnV0aWwuKjtcbiIKLQkJKyAicHVibGljIGNsYXNzIFgge1xuIgotCQkrICJcdGphdmEubGFuZy5PYmplY3QoMClcbiIKLQkJKyAiXHR2b2lkIGZvbygpIHt9XG4iCi0JCSsgIn0iOwotCQkJCi0JU3RyaW5nIHRlc3ROYW1lID0gInRlc3QzMjogZnVsbCBwYXJzZSI7Ci0JZnVsbFBhcnNlKHMsdGVzdE5hbWUpOwotCQkJCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJODksIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOyAKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VFbmQgIiwgCi0JCTMxNSwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOyAKLQotCWFzc2VydFRydWUoImRvZXNuJ3QgY29udGFpbiBzdXBlcmludGVyZmFjZXMgIiAsIGN1cnJlbnRUeXBlLmdldEludGVyZmFjZU5hbWVzKCkgPT0gbnVsbCk7Ci0JCi0JU291cmNlRmllbGRbXSBmaWVsZHMgPSBjdXJyZW50VHlwZS5nZXRGaWVsZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzID09IG51bGwpOwotCi0JU291cmNlTWV0aG9kW10gbWV0aG9kcyA9IGN1cnJlbnRUeXBlLmdldE1ldGhvZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZXRob2RzICIsIG1ldGhvZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCIgY29udGFpbnMgb25lIG1ldGhvZHMgIiwgMSwgbWV0aG9kcy5sZW5ndGgpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGZvbyIsIDExNSwgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgZm9vIiwgMzE1LCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGZvbyIsICJmb28iLCBtZXRob2RzWzBdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlTb3VyY2VUeXBlW10gbWVtYmVycyA9IGN1cnJlbnRUeXBlLmdldE1lbWJlclR5cGVzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWVtYmVycyAiLCBtZW1iZXJzID09IG51bGwpOwotCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgc291cmNlICIgKyB0ZXN0TmFtZSwgCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLCAKLQkJY3VycmVudFR5cGUudG9TdHJpbmcoKSk7IAotfQotcHVibGljIHZvaWQgdGVzdDMzKCkgewotCi0JU3RyaW5nIHMgPQotCQkicGFja2FnZSBhOwkJCQkJCQkJCQkJXG4iICsKLQkJImltcG9ydCBqYXZhLmxhbmcuKjsJCQkJCQkJXG4iICsKLQkJImltcG9ydCBqYXZhLnV0aWwuKjsJCQkJCQkJXG4iICsKLQkJIgkJCQkJCQkJCQkJCVxuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7CQkJCQkJCQlcbiIgKwkJCQkJCQkKLQkJIgl2b2lkIGZvbygpIHsJCQkJCQkJCVxuIiArCi0JCSIJCVN5c3RlbS5vdXQucHJpbnRsbigpOwkJCQkJXG4iICsJCQotCQkiCQkJCQkJCQkJCQkJXG4iICsKLQkJIgkJbmV3IFgoKXsJCQkJCQkJCVxuIiArCi0JCSIJCQl2b2lkIGJheigpIHt9CQkJCQkJXG4iICsKLQkJIgkJCQkJCQkJCQkJCVxuIiArCi0JCSIJCXB1YmxpYyBpbnQgaDsJCQkJCQkJXG4iICsJCQkJCQotCQkiCQkJCQkJCQkJCQkJXG4iICsKLQkJIgkJdm9pZCBiYXIoKXsJCQkJCQkJCVxuIiArCQkJCQotCQkiCQl2b2lkIHRydWMoKXsJCQkJCQkJXG4iICsKLQkJIn0JXG4iOwotCi0KLQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcgPSAKLQkJInBhY2thZ2UgYTtcbiIKLQkJKyAiaW1wb3J0IGphdmEubGFuZy4qO1xuIgotCQkrICJpbXBvcnQgamF2YS51dGlsLio7XG4iCi0JCSsgInB1YmxpYyBjbGFzcyBYIHtcbiIKLQkJKyAiXHR2b2lkIGZvbygpIHt9XG4iCi0JCSsgIn0iOwotCQkJCi0JU3RyaW5nIHRlc3ROYW1lID0gInRlc3QzMzogZGlldCBwYXJzZSI7Ci0JZGlldFBhcnNlKHMsdGVzdE5hbWUpOwotCQkJCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJODksIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOyAKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VFbmQgIiwgCi0JCTMxNSwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOyAKLQotCWFzc2VydFRydWUoImRvZXNuJ3QgY29udGFpbiBzdXBlcmludGVyZmFjZXMgIiAsIGN1cnJlbnRUeXBlLmdldEludGVyZmFjZU5hbWVzKCkgPT0gbnVsbCk7Ci0JCi0JU291cmNlRmllbGRbXSBmaWVsZHMgPSBjdXJyZW50VHlwZS5nZXRGaWVsZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzID09IG51bGwpOwotCi0JU291cmNlTWV0aG9kW10gbWV0aG9kcyA9IGN1cnJlbnRUeXBlLmdldE1ldGhvZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZXRob2RzICIsIG1ldGhvZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCIgY29udGFpbnMgb25lIG1ldGhvZHMgIiwgMSwgbWV0aG9kcy5sZW5ndGgpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGZvbyIsIDExNSwgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgZm9vIiwgMzE1LCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGZvbyIsICJmb28iLCBtZXRob2RzWzBdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlTb3VyY2VUeXBlW10gbWVtYmVycyA9IGN1cnJlbnRUeXBlLmdldE1lbWJlclR5cGVzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWVtYmVycyAiLCBtZW1iZXJzID09IG51bGwpOwotCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgc291cmNlICIgKyB0ZXN0TmFtZSwgCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLCAKLQkJY3VycmVudFR5cGUudG9TdHJpbmcoKSk7IAotfQotcHVibGljIHZvaWQgdGVzdDM0KCkgewotCi0JU3RyaW5nIHMgPQotCQkicGFja2FnZSBhOwkJCQkJCQkJCQlcbiIgKwotCQkiaW1wb3J0IGphdmEubGFuZy4qOwkJCQkJCQlcbiIgKwotCQkiaW1wb3J0IGphdmEudXRpbC4qOwkJCQkJCQlcbiIgKwotCQkiCQkJCQkJCQkJCQkJXG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHsJCQkJCQkJCVxuIiArCQkJCQkJCQotCQkiCXZvaWQgZm9vKCkgewkJCQkJCQkJXG4iICsKLQkJIgkJU3lzdGVtLm91dC5wcmludGxuKCk7CQkJCQlcbiIgKwkJCi0JCSIJCQkJCQkJCQkJCQlcbiIgKwotCQkiCQluZXcgWCgpewkJCQkJCQkJXG4iICsKLQkJIgkJCXZvaWQgYmF6KCkgCQkJCQkJCVxuIiArCi0JCSIJICAgIH0JCQkJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJCQlcbiIgKwotCQkiCXB1YmxpYyBpbnQgaDsJCQkJCQkJCVxuIiArCQkJCQkKLQkJIgkJCQkJCQkJCQkJCVxuIiArCi0JCSIJdm9pZCBiYXIoKXsJCQkJCQkJCQlcbiIgKwkJCQkKLQkJIgl2b2lkIHRydWMoKXsJCQkJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCQkJCQkJXG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkVW5pdFRvU3RyaW5nID0gCi0JCSJwYWNrYWdlIGE7XG4iCi0JCSsgImltcG9ydCBqYXZhLmxhbmcuKjtcbiIKLQkJKyAiaW1wb3J0IGphdmEudXRpbC4qO1xuIgotCQkrICJwdWJsaWMgY2xhc3MgWCB7XG4iCi0JCSsgIlx0cHVibGljIGludCBoO1xuIgotCQkrICJcdGphdmEubGFuZy5PYmplY3QoMClcbiIKLQkJKyAiXHR2b2lkIGZvbygpIHt9XG4iCi0JCSsgIlx0dm9pZCBiYXIoKSB7fVxuIgotCQkrICJcdHZvaWQgdHJ1YygpIHt9XG4iCi0JCSsgIn0iOwotCQkJCi0JU3RyaW5nIHRlc3ROYW1lID0gInRlc3QzNDogZnVsbCBwYXJzZSI7Ci0JZnVsbFBhcnNlKHMsdGVzdE5hbWUpOwotCQkJCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJODgsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOyAKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VFbmQgIiwgCi0JCTM0MiwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOyAKLQotCWFzc2VydFRydWUoImRvZXNuJ3QgY29udGFpbiBzdXBlcmludGVyZmFjZXMgIiAsIGN1cnJlbnRUeXBlLmdldEludGVyZmFjZU5hbWVzKCkgPT0gbnVsbCk7Ci0JCi0JU291cmNlRmllbGRbXSBmaWVsZHMgPSBjdXJyZW50VHlwZS5nZXRGaWVsZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiY29udGFpbnMgb25lIGZpZWxkICIsIDEsIGZpZWxkcy5sZW5ndGgpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgZmllbGQgaCIsIDI1MCwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIGZpZWxkIGgiLCAyNjIsIGZpZWxkc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCVNvdXJjZU1ldGhvZFtdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWV0aG9kcyAiLCBtZXRob2RzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiIGNvbnRhaW5zIDMgbWV0aG9kcyAiLCAzLCBtZXRob2RzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgZm9vIiwgMTE0LCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBmb28iLCAyNDgsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgYmFyIiwgMjg2LCBtZXRob2RzWzFdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBiYXIiLCAzMDYsIG1ldGhvZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgdHJ1YyIsIDMwOCwgbWV0aG9kc1syXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgdHJ1YyIsIDMyOSwgbWV0aG9kc1syXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCBmb28iLCAiZm9vIiwgbWV0aG9kc1swXS5nZXRBY3R1YWxOYW1lKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGJhciIsICJiYXIiLCBtZXRob2RzWzFdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgdHJ1YyIsICJ0cnVjIiwgbWV0aG9kc1syXS5nZXRBY3R1YWxOYW1lKCkpOwotCQkKLQlTb3VyY2VUeXBlW10gbWVtYmVycyA9IGN1cnJlbnRUeXBlLmdldE1lbWJlclR5cGVzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWVtYmVycyAiLCBtZW1iZXJzID09IG51bGwpOwotCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgc291cmNlICIgKyB0ZXN0TmFtZSwgCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLCAKLQkJY3VycmVudFR5cGUudG9TdHJpbmcoKSk7IAotfQotcHVibGljIHZvaWQgdGVzdDM1KCkgewotCi0JU3RyaW5nIHMgPQotCQkicGFja2FnZSBhOwkJCQkJCQlcbiIJKwotCQkiaW1wb3J0IGphdmEubGFuZy4qOwkJCQlcbiIJKwkJCQkKLQkJImltcG9ydCBqYXZhLnV0aWwuKjsJCQkJXG4iCSsJCQkJCi0JCSIJCQkJCQkJCQlcbiIJKwkJCQkKLQkJInB1YmxpYyBjbGFzcyBYIHsJCQkJCVxuIgkrCQkJCQotCQkiCXZvaWQgZm9vKCkgewkJCQkJXG4iCSsJCQkJCi0JCSIJCVN5c3RlbS5vdXQucHJpbnRsbigpOwkJXG4iCSsJCQkJCi0JCSIJCQkJCQkJCQlcbiIJKwkJCQotCQkiCQljbGFzcyBMIGV4dGVuZHMgewkJCVxuIgkrCi0JCSIJCQlwdWJsaWMgaW50IGw7CQkJXG4iCSsJCQkJCi0JCSIJCQl2b2lkIGJheigpe30JCQlcbiIJKwkJCQkKLQkJIgkJfQkJCQkJCQlcbiIJKwkJCQkKLQkJIgkJCQkJCQkJCVxuIgkrCQkJCQotCQkiCQlpbnQgaDsJCQkJCQlcbiIJKwkJCQkKLQkJIgkJCQkJCQkJCVxuIgkrCQkJCQotCQkiCXZvaWQgYmFyKCl7CQkJCQkJXG4iCSsJCQkJCi0JCSIJdm9pZCB0cnVjKCl7CQkJCQlcbiIJKwkJCQkKLQkJIn0JCQkJCQkJCQlcbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcgPSAKLQkJInBhY2thZ2UgYTtcbiIKLQkJKyAiaW1wb3J0IGphdmEubGFuZy4qO1xuIgotCQkrICJpbXBvcnQgamF2YS51dGlsLio7XG4iCi0JCSsgInB1YmxpYyBjbGFzcyBYIHtcbiIKLQkJKyAiXHRqYXZhLmxhbmcuT2JqZWN0KDApXG4iCi0JCSsgIlx0dm9pZCBmb28oKSB7fVxuIgotCQkrICJcdHZvaWQgYmFyKCkge31cbiIKLQkJKyAiXHR2b2lkIHRydWMoKSB7fVxuIgotCQkrICJ9IjsKLQkJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICJ0ZXN0MzU6IGZ1bGwgcGFyc2UiOwotCWZ1bGxQYXJzZShzLHRlc3ROYW1lKTsKLQkJCQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlU3RhcnQgIiwgCi0JCTc2LCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsgCi0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlRW5kICIsIAotCQkzMDksIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsgCi0KLQlhc3NlcnRUcnVlKCJkb2Vzbid0IGNvbnRhaW4gc3VwZXJpbnRlcmZhY2VzICIgLCBjdXJyZW50VHlwZS5nZXRJbnRlcmZhY2VOYW1lcygpID09IG51bGwpOwotCQotCVNvdXJjZUZpZWxkW10gZmllbGRzID0gY3VycmVudFR5cGUuZ2V0RmllbGRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgZmllbGRzICIsIGZpZWxkcyA9PSBudWxsKTsKLQotCVNvdXJjZU1ldGhvZFtdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWV0aG9kcyAiLCBtZXRob2RzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiIGNvbnRhaW5zIDMgbWV0aG9kcyAiLCAzLCBtZXRob2RzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgZm9vIiwgOTksIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGZvbyIsIDI2MCwgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCBiYXIiLCAyNjIsIG1ldGhvZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGJhciIsIDI3OSwgbWV0aG9kc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCB0cnVjIiwgMjgxLCBtZXRob2RzWzJdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCB0cnVjIiwgMjk5LCBtZXRob2RzWzJdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGZvbyIsICJmb28iLCBtZXRob2RzWzBdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgYmFyIiwgImJhciIsIG1ldGhvZHNbMV0uZ2V0QWN0dWFsTmFtZSgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCB0cnVjIiwgInRydWMiLCBtZXRob2RzWzJdLmdldEFjdHVhbE5hbWUoKSk7Ci0JCQotCVNvdXJjZVR5cGVbXSBtZW1iZXJzID0gY3VycmVudFR5cGUuZ2V0TWVtYmVyVHlwZXMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZW1iZXJzICIsIG1lbWJlcnMgPT0gbnVsbCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBzb3VyY2UgIiArIHRlc3ROYW1lLCAKLQkJZXhwZWN0ZWRVbml0VG9TdHJpbmcsIAotCQljdXJyZW50VHlwZS50b1N0cmluZygpKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0MzYoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCSJwYWNrYWdlIGE7CQkJCQkJCVxuIgkrCi0JCSJpbXBvcnQgamF2YS5sYW5nLio7CQkJCVxuIgkrCQkJCQotCQkiaW1wb3J0IGphdmEudXRpbC4qOwkJCQlcbiIJKwkJCQkKLQkJIgkJCQkJCQkJCVxuIgkrCQkJCQotCQkicHVibGljIGNsYXNzIFggewkJCQkJXG4iCSsJCQkJCi0JCSIJdm9pZCBmb28oKSB7CQkJCQlcbiIJKwkJCQkKLQkJIgkJU3lzdGVtLm91dC5wcmludGxuKCk7CQlcbiIJKwkJCQkKLQkJIgkJCQkJCQkJCVxuIgkrCQkJCi0JCSIJCWNsYXNzIEwgZXh0ZW5kcyB7CQkJXG4iCSsKLQkJIgkJCXB1YmxpYyBpbnQgbDsJCQlcbiIJKwkJCQkKLQkJIgkJCXZvaWQgYmF6KCl7fQkJCVxuIgkrCQkJCQotCQkiCQl9CQkJCQkJCVxuIgkrCQkJCQotCQkiCQkJCQkJCQkJXG4iCSsJCQkJCi0JCSIJCWludCBoOwkJCQkJCVxuIgkrCQkJCQotCQkiCQkJCQkJCQkJXG4iCSsJCQkJCi0JCSIJdm9pZCBiYXIoKXsJCQkJCQlcbiIJKwkJCQkKLQkJIgl2b2lkIHRydWMoKXsJCQkJCVxuIgkrCQkJCQotCQkifQkJCQkJCQkJCVxuIjsKLQotCVN0cmluZyBleHBlY3RlZFVuaXRUb1N0cmluZyA9IAotCQkicGFja2FnZSBhO1xuIgotCQkrICJpbXBvcnQgamF2YS5sYW5nLio7XG4iCi0JCSsgImltcG9ydCBqYXZhLnV0aWwuKjtcbiIKLQkJKyAicHVibGljIGNsYXNzIFgge1xuIgotCQkrICJcdHZvaWQgZm9vKCkge31cbiIKLQkJKyAiXHR2b2lkIGJhcigpIHt9XG4iCi0JCSsgIlx0dm9pZCB0cnVjKCkge31cbiIKLQkJKyAifSI7Ci0JCQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAidGVzdDM2OiBkaWV0IHBhcnNlIjsKLQlkaWV0UGFyc2Uocyx0ZXN0TmFtZSk7Ci0JCQkJCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICIsIAotCQk3NiwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7IAotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZUVuZCAiLCAKLQkJMzA5LCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7IAotCi0JYXNzZXJ0VHJ1ZSgiZG9lc24ndCBjb250YWluIHN1cGVyaW50ZXJmYWNlcyAiICwgY3VycmVudFR5cGUuZ2V0SW50ZXJmYWNlTmFtZXMoKSA9PSBudWxsKTsKLQkKLQlTb3VyY2VGaWVsZFtdIGZpZWxkcyA9IGN1cnJlbnRUeXBlLmdldEZpZWxkcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIGZpZWxkcyAiLCBmaWVsZHMgPT0gbnVsbCk7Ci0KLQlTb3VyY2VNZXRob2RbXSBtZXRob2RzID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1ldGhvZHMgIiwgbWV0aG9kcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoIiBjb250YWlucyAzIG1ldGhvZHMgIiwgMywgbWV0aG9kcy5sZW5ndGgpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGZvbyIsIDk5LCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBmb28iLCAyNjAsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgYmFyIiwgMjYyLCBtZXRob2RzWzFdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBiYXIiLCAyNzksIG1ldGhvZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgdHJ1YyIsIDI4MSwgbWV0aG9kc1syXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgdHJ1YyIsIDI5OSwgbWV0aG9kc1syXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCBmb28iLCAiZm9vIiwgbWV0aG9kc1swXS5nZXRBY3R1YWxOYW1lKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGJhciIsICJiYXIiLCBtZXRob2RzWzFdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgdHJ1YyIsICJ0cnVjIiwgbWV0aG9kc1syXS5nZXRBY3R1YWxOYW1lKCkpOwotCQkKLQlTb3VyY2VUeXBlW10gbWVtYmVycyA9IGN1cnJlbnRUeXBlLmdldE1lbWJlclR5cGVzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWVtYmVycyAiLCBtZW1iZXJzID09IG51bGwpOwotCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgc291cmNlICIgKyB0ZXN0TmFtZSwgCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLCAKLQkJY3VycmVudFR5cGUudG9TdHJpbmcoKSk7IAotfQotcHVibGljIHZvaWQgdGVzdDM3KCkgewotCi0JU3RyaW5nIHMgPQotCQkicHVibGljIGNsYXNzIFggewkJIAlcbiIgKwotCQkiICBpbnQgeDsJCQkgCQlcbiIJKwkJCQkJCQotCQkiCQkJCQkJCVxuIiArCi0JCSIgIGludCBmb28oKXsgfQkJCQlcbiIgKwotCQkiCQkJCQkJCVxuIiArCi0JCSIgIGNsYXNzIFkgIHsJCQkJXG4iCSsKLQkJIiAgICBpbnQgeTsJCQkJCVxuIiArCi0JCSJ9CQkJCQkJCVxuIjsKLQotCVN0cmluZyBleHBlY3RlZFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIgotCQkrICJcdGNsYXNzIFkge1xuIgotCQkrICJcdFx0aW50IHk7XG4iCi0JCSsgIlx0XHRqYXZhLmxhbmcuT2JqZWN0KDApXG4iCi0JCSsgIlx0fVxuIgotCQkrICJcdGludCB4O1xuIgotCQkrICJcdGphdmEubGFuZy5PYmplY3QoMClcbiIKLQkJKyAiXHRpbnQgZm9vKCkge31cbiIKLQkJKyAifSI7Ci0JCQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAidGVzdDM3OiBmdWxsIHBhcnNlIjsKLQlmdWxsUGFyc2Uocyx0ZXN0TmFtZSk7Ci0JCQkJCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICIsIAotCQkwLCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsgCi0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlRW5kICIsIAotCQkxMTIsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsgCi0KLQlhc3NlcnRUcnVlKCJkb2Vzbid0IGNvbnRhaW4gc3VwZXJpbnRlcmZhY2VzICIgLCBjdXJyZW50VHlwZS5nZXRJbnRlcmZhY2VOYW1lcygpID09IG51bGwpOwotCQotCVNvdXJjZUZpZWxkW10gZmllbGRzID0gY3VycmVudFR5cGUuZ2V0RmllbGRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgZmllbGRzICIsIGZpZWxkcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoImNvbnRhaW5zIG9uZSBmaWVsZCAiLCAxLCBmaWVsZHMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIGZpZWxkIHgiLCAyMywgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIGZpZWxkIHgiLCAyOCwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JU291cmNlTWV0aG9kW10gbWV0aG9kcyA9IGN1cnJlbnRUeXBlLmdldE1ldGhvZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZXRob2RzICIsIG1ldGhvZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCIgY29udGFpbnMgb25lIG1ldGhvZHMgIiwgMSwgbWV0aG9kcy5sZW5ndGgpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGZvbyIsIDQ2LCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBmb28iLCA1NywgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCBmb28iLCAiZm9vIiwgbWV0aG9kc1swXS5nZXRBY3R1YWxOYW1lKCkpOwotCQkKLQlTb3VyY2VUeXBlW10gbWVtYmVycyA9IGN1cnJlbnRUeXBlLmdldE1lbWJlclR5cGVzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWVtYmVycyAiLCBtZW1iZXJzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiY29udGFpbnMgb25lIG1lbWJlciAiLCAxLCBtZW1iZXJzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlU3RhcnQgIiwgCi0JCTczLCAKLQkJbWVtYmVyc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOyAKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VFbmQgIiwgCi0JCTEwNCwgCi0JCW1lbWJlcnNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7IAotCi0JZmllbGRzID0gbWVtYmVyc1swXS5nZXRGaWVsZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiY29udGFpbnMgb25lIGZpZWxkICIsIDEsIGZpZWxkcy5sZW5ndGgpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgZmllbGQgeSIsIDkyLCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgZmllbGQgeSIsIDk3LCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0JCi0JbWV0aG9kcyA9IG1lbWJlcnNbMF0uZ2V0TWV0aG9kcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1ldGhvZHMgIiwgbWV0aG9kcyA9PSBudWxsKTsKLQkJCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBzb3VyY2UgIiArIHRlc3ROYW1lLCAKLQkJZXhwZWN0ZWRVbml0VG9TdHJpbmcsIAotCQljdXJyZW50VHlwZS50b1N0cmluZygpKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0MzgoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7CQkgCVxuIiArCi0JCSIgIGludCB4OwkJCSAJCVxuIgkrCQkJCQkJCi0JCSIJCQkJCQkJXG4iICsKLQkJIiAgaW50IGZvbygpeyB9CQkJCVxuIiArCi0JCSIJCQkJCQkJXG4iICsKLQkJIiAgY2xhc3MgWSAgewkJCQlcbiIJKwotCQkiICAgIGludCB5OwkJCQkJXG4iICsKLQkJIn0JCQkJCQkJXG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkVW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iCi0JCSsgIlx0Y2xhc3MgWSB7XG4iCi0JCSsgIlx0XHRpbnQgeTtcbiIKLQkJKyAiXHR9XG4iCi0JCSsgIlx0aW50IHg7XG4iCi0JCSsgIlx0aW50IGZvbygpIHt9XG4iCi0JCSsgIn0iOwotCQkJCi0JU3RyaW5nIHRlc3ROYW1lID0gInRlc3QzODogZGlldCBwYXJzZSI7Ci0JZGlldFBhcnNlKHMsdGVzdE5hbWUpOwotCQkJCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJMCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7IAotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZUVuZCAiLCAKLQkJMTEyLCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7IAotCi0JYXNzZXJ0VHJ1ZSgiZG9lc24ndCBjb250YWluIHN1cGVyaW50ZXJmYWNlcyAiICwgY3VycmVudFR5cGUuZ2V0SW50ZXJmYWNlTmFtZXMoKSA9PSBudWxsKTsKLQkKLQlTb3VyY2VGaWVsZFtdIGZpZWxkcyA9IGN1cnJlbnRUeXBlLmdldEZpZWxkcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIGZpZWxkcyAiLCBmaWVsZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCJjb250YWlucyBvbmUgZmllbGQgIiwgMSwgZmllbGRzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBmaWVsZCB4IiwgMjMsIGZpZWxkc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBmaWVsZCB4IiwgMjgsIGZpZWxkc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCVNvdXJjZU1ldGhvZFtdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWV0aG9kcyAiLCBtZXRob2RzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiIGNvbnRhaW5zIG9uZSBtZXRob2RzICIsIDEsIG1ldGhvZHMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCBmb28iLCA0NiwgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgZm9vIiwgNTcsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgZm9vIiwgImZvbyIsIG1ldGhvZHNbMF0uZ2V0QWN0dWFsTmFtZSgpKTsKLQkJCi0JU291cmNlVHlwZVtdIG1lbWJlcnMgPSBjdXJyZW50VHlwZS5nZXRNZW1iZXJUeXBlcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1lbWJlcnMgIiwgbWVtYmVycyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoImNvbnRhaW5zIG9uZSBtZW1iZXIgIiwgMSwgbWVtYmVycy5sZW5ndGgpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICIsIAotCQk3MywgCi0JCW1lbWJlcnNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsgCi0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlRW5kICIsIAotCQkxMDQsIAotCQltZW1iZXJzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOyAKLQotCWZpZWxkcyA9IG1lbWJlcnNbMF0uZ2V0RmllbGRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgZmllbGRzICIsIGZpZWxkcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoImNvbnRhaW5zIG9uZSBmaWVsZCAiLCAxLCBmaWVsZHMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIGZpZWxkIHkiLCA5MiwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIGZpZWxkIHkiLCA5NywgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCQotCW1ldGhvZHMgPSBtZW1iZXJzWzBdLmdldE1ldGhvZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZXRob2RzICIsIG1ldGhvZHMgPT0gbnVsbCk7Ci0JCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgc291cmNlICIgKyB0ZXN0TmFtZSwgCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLCAKLQkJY3VycmVudFR5cGUudG9TdHJpbmcoKSk7IAotfQotcHVibGljIHZvaWQgdGVzdDM5KCkgewotCi0JU3RyaW5nIHMgPQotCQkicHVibGljIGNsYXNzIFggewkJIAlcbiIgKwotCQkiICBpbnQgeDsJCQkgCQlcbiIJKwkJCQkJCQotCQkiCQkJCQkJCVxuIiArCi0JCSIgIGludCBmb28oKXsgfQkJCQlcbiIgKwotCQkiCQkJCQkJCVxuIiArCi0JCSIgIGNsYXNzIFkgIAkJCQlcbiIJKwotCQkifQkJCQkJCQlcbiIgKwotCQkiICBpbnQgeTsJCQkJCVxuIjsKLQotCVN0cmluZyBleHBlY3RlZFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIgotCQkrICJcdGNsYXNzIFkge1xuIgotCQkrICJcdFx0amF2YS5sYW5nLk9iamVjdCgwKVxuIgotCQkrICJcdH1cbiIKLQkJKyAiXHRpbnQgeDtcbiIKLQkJKyAiXHRpbnQgeTtcbiIKLQkJKyAiXHRqYXZhLmxhbmcuT2JqZWN0KDApXG4iCi0JCSsgIlx0aW50IGZvbygpIHt9XG4iCi0JCSsgIn0iOwotCQkJCi0JU3RyaW5nIHRlc3ROYW1lID0gInRlc3QzOTogZnVsbCBwYXJzZSI7Ci0JZnVsbFBhcnNlKHMsdGVzdE5hbWUpOwotCQkJCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJMCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7IAotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZUVuZCAiLCAKLQkJMTA5LCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7IAotCi0JYXNzZXJ0VHJ1ZSgiZG9lc24ndCBjb250YWluIHN1cGVyaW50ZXJmYWNlcyAiICwgY3VycmVudFR5cGUuZ2V0SW50ZXJmYWNlTmFtZXMoKSA9PSBudWxsKTsKLQkKLQlTb3VyY2VGaWVsZFtdIGZpZWxkcyA9IGN1cnJlbnRUeXBlLmdldEZpZWxkcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIGZpZWxkcyAiLCBmaWVsZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCJjb250YWlucyBvbmUgZmllbGQgIiwgMiwgZmllbGRzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBmaWVsZCB4IiwgMjMsIGZpZWxkc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBmaWVsZCB4IiwgMjgsIGZpZWxkc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIGZpZWxkIHkiLCA5OCwgZmllbGRzWzFdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIGZpZWxkIHkiLCAxMDMsIGZpZWxkc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQkKLQlTb3VyY2VNZXRob2RbXSBtZXRob2RzID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1ldGhvZHMgIiwgbWV0aG9kcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoIiBjb250YWlucyBvbmUgbWV0aG9kcyAiLCAxLCBtZXRob2RzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgZm9vIiwgNDYsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGZvbyIsIDU3LCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGZvbyIsICJmb28iLCBtZXRob2RzWzBdLmdldEFjdHVhbE5hbWUoKSk7Ci0JCQotCVNvdXJjZVR5cGVbXSBtZW1iZXJzID0gY3VycmVudFR5cGUuZ2V0TWVtYmVyVHlwZXMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZW1iZXJzICIsIG1lbWJlcnMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCJjb250YWlucyBvbmUgbWVtYmVyICIsIDEsIG1lbWJlcnMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJNzMsIAotCQltZW1iZXJzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7IAotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZUVuZCAiLCAKLQkJODcsIAotCQltZW1iZXJzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOyAKLQotCWZpZWxkcyA9IG1lbWJlcnNbMF0uZ2V0RmllbGRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgZmllbGRzICIsIGZpZWxkcyA9PSBudWxsKTsKLQotCW1ldGhvZHMgPSBtZW1iZXJzWzBdLmdldE1ldGhvZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZXRob2RzICIsIG1ldGhvZHMgPT0gbnVsbCk7Ci0JCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgc291cmNlICIgKyB0ZXN0TmFtZSwgCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLCAKLQkJY3VycmVudFR5cGUudG9TdHJpbmcoKSk7IAotfQotcHVibGljIHZvaWQgdGVzdDQwKCkgewotCi0JU3RyaW5nIHMgPQotCQkicHVibGljIGNsYXNzIFggewkJIAlcbiIgKwotCQkiICBpbnQgeDsJCQkgCQlcbiIJKwkJCQkJCQotCQkiCQkJCQkJCVxuIiArCi0JCSIgIGludCBmb28oKXsgfQkJCQlcbiIgKwotCQkiCQkJCQkJCVxuIiArCi0JCSIgIGNsYXNzIFkgIAkJCQlcbiIJKwotCQkifQkJCQkJCQlcbiIgKwotCQkiICBpbnQgeTsJCQkJCVxuIjsKLQotCVN0cmluZyBleHBlY3RlZFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIgotCQkrICJcdGNsYXNzIFkge1xuIgotCQkrICJcdH1cbiIKLQkJKyAiXHRpbnQgeDtcbiIKLQkJKyAiXHRpbnQgeTtcbiIKLQkJKyAiXHRpbnQgZm9vKCkge31cbiIKLQkJKyAifSI7Ci0JCQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAidGVzdDQwOiBkaWV0IHBhcnNlIjsKLQlkaWV0UGFyc2Uocyx0ZXN0TmFtZSk7Ci0JCQkJCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICIsIAotCQkwLCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsgCi0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlRW5kICIsIAotCQkxMDksIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsgCi0KLQlhc3NlcnRUcnVlKCJkb2Vzbid0IGNvbnRhaW4gc3VwZXJpbnRlcmZhY2VzICIgLCBjdXJyZW50VHlwZS5nZXRJbnRlcmZhY2VOYW1lcygpID09IG51bGwpOwotCQotCVNvdXJjZUZpZWxkW10gZmllbGRzID0gY3VycmVudFR5cGUuZ2V0RmllbGRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgZmllbGRzICIsIGZpZWxkcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoImNvbnRhaW5zIG9uZSBmaWVsZCAiLCAyLCBmaWVsZHMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIGZpZWxkIHgiLCAyMywgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIGZpZWxkIHgiLCAyOCwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgZmllbGQgeSIsIDk4LCBmaWVsZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgZmllbGQgeSIsIDEwMywgZmllbGRzWzFdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCQotCVNvdXJjZU1ldGhvZFtdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWV0aG9kcyAiLCBtZXRob2RzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiIGNvbnRhaW5zIG9uZSBtZXRob2RzICIsIDEsIG1ldGhvZHMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCBmb28iLCA0NiwgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgZm9vIiwgNTcsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgZm9vIiwgImZvbyIsIG1ldGhvZHNbMF0uZ2V0QWN0dWFsTmFtZSgpKTsKLQkJCi0JU291cmNlVHlwZVtdIG1lbWJlcnMgPSBjdXJyZW50VHlwZS5nZXRNZW1iZXJUeXBlcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1lbWJlcnMgIiwgbWVtYmVycyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoImNvbnRhaW5zIG9uZSBtZW1iZXIgIiwgMSwgbWVtYmVycy5sZW5ndGgpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICIsIAotCQk3MywgCi0JCW1lbWJlcnNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsgCi0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlRW5kICIsIAotCQk4NywgCi0JCW1lbWJlcnNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7IAotCi0JZmllbGRzID0gbWVtYmVyc1swXS5nZXRGaWVsZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzID09IG51bGwpOwotCi0JbWV0aG9kcyA9IG1lbWJlcnNbMF0uZ2V0TWV0aG9kcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1ldGhvZHMgIiwgbWV0aG9kcyA9PSBudWxsKTsKLQkJCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBzb3VyY2UgIiArIHRlc3ROYW1lLCAKLQkJZXhwZWN0ZWRVbml0VG9TdHJpbmcsIAotCQljdXJyZW50VHlwZS50b1N0cmluZygpKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0NDEoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7CQkJCVxuIisKLQkJIgl2b2lkIGhlbGwiICsgIlxcIiArICJ1MDA2ZigpXG4iKwotCQkiCXN0YXRpYyB2b2lkIGZvbygpIHsJCQlcbiIrCi0JCSIJCVggeDsJCQkJCVxuIisKLQkJIgkJeCA9IG5ldyBYKDIzKTsJCQlcbiIrCi0JCSIJCVN5c3RlbS5vdXQucHJpbnRsbigpOwlcbiIrCQkJCi0JCSIJCQkJCQkJCVxuIisKLQkJIn0JCQkJCQkJCVxuIjsKLQotCVN0cmluZyBleHBlY3RlZFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIgotCQkrICJcdGphdmEubGFuZy5PYmplY3QoMClcbiIKLQkJKyAiXHR2b2lkIGhlbGxvKCkge31cbiIKLQkJKyAiXHRzdGF0aWMgdm9pZCBmb28oKSB7fVxuIgotCQkrICJ9IjsKLQkJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICJ0ZXN0NDE6IGZ1bGwgcGFyc2UiOwotCWZ1bGxQYXJzZShzLHRlc3ROYW1lKTsKLQkJCQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlU3RhcnQgIiwgCi0JCTAsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOyAKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VFbmQgIiwgCi0JCTEzOSwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOyAKLQotCWFzc2VydFRydWUoImRvZXNuJ3QgY29udGFpbiBzdXBlcmludGVyZmFjZXMgIiAsIGN1cnJlbnRUeXBlLmdldEludGVyZmFjZU5hbWVzKCkgPT0gbnVsbCk7Ci0JCi0JU291cmNlRmllbGRbXSBmaWVsZHMgPSBjdXJyZW50VHlwZS5nZXRGaWVsZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzID09IG51bGwpOwotCi0JU291cmNlTWV0aG9kW10gbWV0aG9kcyA9IGN1cnJlbnRUeXBlLmdldE1ldGhvZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZXRob2RzICIsIG1ldGhvZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCIgY29udGFpbnMgb25lIG1ldGhvZHMgIiwgMiwgbWV0aG9kcy5sZW5ndGgpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGhlbGxvIiwgMjIsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGhlbGxvIiwgMzksIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgZm9vIiwgNDEsIG1ldGhvZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGZvbyIsIDEzMCwgbWV0aG9kc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCBoZWxsbyIsICJoZWxsIiArICJcXCIgKyAidTAwNmYiLCBtZXRob2RzWzBdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgZm9vIiwgImZvbyIsIG1ldGhvZHNbMV0uZ2V0QWN0dWFsTmFtZSgpKTsKLQkJCi0JU291cmNlVHlwZVtdIG1lbWJlcnMgPSBjdXJyZW50VHlwZS5nZXRNZW1iZXJUeXBlcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1lbWJlcnMgIiwgbWVtYmVycyA9PSBudWxsKTsKLQkJCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBzb3VyY2UgIiArIHRlc3ROYW1lLCAKLQkJZXhwZWN0ZWRVbml0VG9TdHJpbmcsIAotCQljdXJyZW50VHlwZS50b1N0cmluZygpKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0NDIoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7CQlcbiIgKwkJCQkJCQotCQkiCWludCB4CQkJCVxuIjsKLQotCVN0cmluZyBleHBlY3RlZFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIgotCQkrICJcdGludCB4O1xuIgotCQkrICJcdGphdmEubGFuZy5PYmplY3QoMClcbiIKLQkJKyAifSI7Ci0JCQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAidGVzdDQyOiBmdWxsIHBhcnNlIjsKLQlmdWxsUGFyc2Uocyx0ZXN0TmFtZSk7Ci0JCQkJCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICIsIAotCQkwLCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsgCi0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlRW5kICIsIAotCQkyOSwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOyAKLQotCWFzc2VydFRydWUoImRvZXNuJ3QgY29udGFpbiBzdXBlcmludGVyZmFjZXMgIiAsIGN1cnJlbnRUeXBlLmdldEludGVyZmFjZU5hbWVzKCkgPT0gbnVsbCk7Ci0JCi0JU291cmNlRmllbGRbXSBmaWVsZHMgPSBjdXJyZW50VHlwZS5nZXRGaWVsZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiIGNvbnRhaW5zIG9uZSBmaWVsZCIsIDEsIGZpZWxkcy5sZW5ndGgpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgZmllbGQgeCIsIDIwLCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgZmllbGQgeCIsIDI0LCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlTb3VyY2VNZXRob2RbXSBtZXRob2RzID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1ldGhvZHMgIiwgbWV0aG9kcyA9PSBudWxsKTsKLQotCVNvdXJjZVR5cGVbXSBtZW1iZXJzID0gY3VycmVudFR5cGUuZ2V0TWVtYmVyVHlwZXMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZW1iZXJzICIsIG1lbWJlcnMgPT0gbnVsbCk7Ci0JCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgc291cmNlICIgKyB0ZXN0TmFtZSwgCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLCAKLQkJY3VycmVudFR5cGUudG9TdHJpbmcoKSk7IAotfQotcHVibGljIHZvaWQgdGVzdDQzKCkgewotCi0JU3RyaW5nIHMgPQotCQkicHVibGljIGNsYXNzIFggewkJXG4iICsJCQkJCQkKLQkJIglpbnQgeAkJCQlcbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIKLQkJKyAiXHRpbnQgeDtcbiIKLQkJKyAifSI7Ci0JCQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAidGVzdDQzOiBkaWV0IHBhcnNlIjsKLQlkaWV0UGFyc2Uocyx0ZXN0TmFtZSk7Ci0JCQkJCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICIsIAotCQkwLCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsgCi0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlRW5kICIsIAotCQkyOSwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOyAKLQotCWFzc2VydFRydWUoImRvZXNuJ3QgY29udGFpbiBzdXBlcmludGVyZmFjZXMgIiAsIGN1cnJlbnRUeXBlLmdldEludGVyZmFjZU5hbWVzKCkgPT0gbnVsbCk7Ci0JCi0JU291cmNlRmllbGRbXSBmaWVsZHMgPSBjdXJyZW50VHlwZS5nZXRGaWVsZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiIGNvbnRhaW5zIG9uZSBmaWVsZCIsIDEsIGZpZWxkcy5sZW5ndGgpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgZmllbGQgeCIsIDIwLCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgZmllbGQgeCIsIDI0LCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlTb3VyY2VNZXRob2RbXSBtZXRob2RzID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1ldGhvZHMgIiwgbWV0aG9kcyA9PSBudWxsKTsKLQotCVNvdXJjZVR5cGVbXSBtZW1iZXJzID0gY3VycmVudFR5cGUuZ2V0TWVtYmVyVHlwZXMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZW1iZXJzICIsIG1lbWJlcnMgPT0gbnVsbCk7Ci0JCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgc291cmNlICIgKyB0ZXN0TmFtZSwgCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLCAKLQkJY3VycmVudFR5cGUudG9TdHJpbmcoKSk7IAotfQotcHVibGljIHZvaWQgdGVzdDQ0KCkgewotCi0JU3RyaW5nIHMgPQotCQkicHVibGljIGNsYXNzIFggewkJXG4iICsJCQkJCQkKLQkJIglpbnQgeCwgeQkJCVxuIjsKLQotCVN0cmluZyBleHBlY3RlZFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIgotCQkrICJcdGludCB4O1xuIgotCQkrICJcdGludCB5O1xuIgotCQkrICJcdGphdmEubGFuZy5PYmplY3QoMClcbiIKLQkJKyAifSI7Ci0JCQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAidGVzdDQ0OiBmdWxsIHBhcnNlIjsKLQlmdWxsUGFyc2Uocyx0ZXN0TmFtZSk7Ci0JCQkJCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICIsIAotCQkwLCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsgCi0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlRW5kICIsIAotCQkzMSwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOyAKLQotCWFzc2VydFRydWUoImRvZXNuJ3QgY29udGFpbiBzdXBlcmludGVyZmFjZXMgIiAsIGN1cnJlbnRUeXBlLmdldEludGVyZmFjZU5hbWVzKCkgPT0gbnVsbCk7Ci0JCi0JU291cmNlRmllbGRbXSBmaWVsZHMgPSBjdXJyZW50VHlwZS5nZXRGaWVsZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiIGNvbnRhaW5zIG9uZSBmaWVsZCIsIDIsIGZpZWxkcy5sZW5ndGgpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgZmllbGQgeCIsIDIwLCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgZmllbGQgeCIsIDI1LCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBmaWVsZCB5IiwgMjAsIGZpZWxkc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBmaWVsZCB5IiwgMjcsIGZpZWxkc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCVNvdXJjZU1ldGhvZFtdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWV0aG9kcyAiLCBtZXRob2RzID09IG51bGwpOwotCi0JU291cmNlVHlwZVtdIG1lbWJlcnMgPSBjdXJyZW50VHlwZS5nZXRNZW1iZXJUeXBlcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1lbWJlcnMgIiwgbWVtYmVycyA9PSBudWxsKTsKLQkJCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBzb3VyY2UgIiArIHRlc3ROYW1lLCAKLQkJZXhwZWN0ZWRVbml0VG9TdHJpbmcsIAotCQljdXJyZW50VHlwZS50b1N0cmluZygpKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0NDUoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7CQlcbiIgKwkJCQkJCQotCQkiCWludCB4LCB5CQkJXG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkVW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iCi0JCSsgIlx0aW50IHg7XG4iCi0JCSsgIlx0aW50IHk7XG4iCi0JCSsgIn0iOwotCQkJCi0JU3RyaW5nIHRlc3ROYW1lID0gInRlc3Q0NTogZGlldCBwYXJzZSI7Ci0JZGlldFBhcnNlKHMsdGVzdE5hbWUpOwotCQkJCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJMCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7IAotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZUVuZCAiLCAKLQkJMzEsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsgCi0KLQlhc3NlcnRUcnVlKCJkb2Vzbid0IGNvbnRhaW4gc3VwZXJpbnRlcmZhY2VzICIgLCBjdXJyZW50VHlwZS5nZXRJbnRlcmZhY2VOYW1lcygpID09IG51bGwpOwotCQotCVNvdXJjZUZpZWxkW10gZmllbGRzID0gY3VycmVudFR5cGUuZ2V0RmllbGRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgZmllbGRzICIsIGZpZWxkcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoIiBjb250YWlucyBvbmUgZmllbGQiLCAyLCBmaWVsZHMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIGZpZWxkIHgiLCAyMCwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIGZpZWxkIHgiLCAyNSwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgZmllbGQgeSIsIDIwLCBmaWVsZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgZmllbGQgeSIsIDI3LCBmaWVsZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlTb3VyY2VNZXRob2RbXSBtZXRob2RzID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1ldGhvZHMgIiwgbWV0aG9kcyA9PSBudWxsKTsKLQotCVNvdXJjZVR5cGVbXSBtZW1iZXJzID0gY3VycmVudFR5cGUuZ2V0TWVtYmVyVHlwZXMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZW1iZXJzICIsIG1lbWJlcnMgPT0gbnVsbCk7Ci0JCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgc291cmNlICIgKyB0ZXN0TmFtZSwgCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLCAKLQkJY3VycmVudFR5cGUudG9TdHJpbmcoKSk7IAotfQotcHVibGljIHZvaWQgdGVzdDQ2KCkgewotCi0JU3RyaW5nIHMgPQotCQkicHVibGljIGNsYXNzIFggewkJXG4iICsJCQkJCQkKLQkJIglTdHJpbmcgcyA9IFwiCQlcbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIKLQkJKyAiXHRTdHJpbmcgcztcbiIKLQkJKyAiXHRqYXZhLmxhbmcuT2JqZWN0KDApXG4iCi0JCSsgIn0iOwotCQkJCi0JU3RyaW5nIHRlc3ROYW1lID0gInRlc3Q0NjogZnVsbCBwYXJzZSI7Ci0JZnVsbFBhcnNlKHMsdGVzdE5hbWUpOwotCQkJCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJMCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7IAotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZUVuZCAiLCAKLQkJMzQsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsgCi0KLQlhc3NlcnRUcnVlKCJkb2Vzbid0IGNvbnRhaW4gc3VwZXJpbnRlcmZhY2VzICIgLCBjdXJyZW50VHlwZS5nZXRJbnRlcmZhY2VOYW1lcygpID09IG51bGwpOwotCQotCVNvdXJjZUZpZWxkW10gZmllbGRzID0gY3VycmVudFR5cGUuZ2V0RmllbGRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgZmllbGRzICIsIGZpZWxkcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoIiBjb250YWlucyBvbmUgZmllbGQiLCAxLCBmaWVsZHMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIGZpZWxkIHMiLCAyMCwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIGZpZWxkIHMiLCAzNCwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JU291cmNlTWV0aG9kW10gbWV0aG9kcyA9IGN1cnJlbnRUeXBlLmdldE1ldGhvZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZXRob2RzICIsIG1ldGhvZHMgPT0gbnVsbCk7Ci0KLQlTb3VyY2VUeXBlW10gbWVtYmVycyA9IGN1cnJlbnRUeXBlLmdldE1lbWJlclR5cGVzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWVtYmVycyAiLCBtZW1iZXJzID09IG51bGwpOwotCQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIHNvdXJjZSAiICsgdGVzdE5hbWUsIAotCQlleHBlY3RlZFVuaXRUb1N0cmluZywgCi0JCWN1cnJlbnRUeXBlLnRvU3RyaW5nKCkpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3Q0NygpIHsKLQotCVN0cmluZyBzID0KLQkJInB1YmxpYyBjbGFzcyBYIHsJCVxuIiArCQkJCQkJCi0JCSIJU3RyaW5nIHMgPSBcIgkJXG4iOwotCi0JU3RyaW5nIGV4cGVjdGVkVW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iCi0JCSsgIlx0U3RyaW5nIHM7XG4iCi0JCSsgIn0iOwotCQkJCi0JU3RyaW5nIHRlc3ROYW1lID0gInRlc3Q0NzogZGlldCBwYXJzZSI7Ci0JZGlldFBhcnNlKHMsdGVzdE5hbWUpOwotCQkJCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJMCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7IAotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZUVuZCAiLCAKLQkJMzQsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsgCi0KLQlhc3NlcnRUcnVlKCJkb2Vzbid0IGNvbnRhaW4gc3VwZXJpbnRlcmZhY2VzICIgLCBjdXJyZW50VHlwZS5nZXRJbnRlcmZhY2VOYW1lcygpID09IG51bGwpOwotCQotCVNvdXJjZUZpZWxkW10gZmllbGRzID0gY3VycmVudFR5cGUuZ2V0RmllbGRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgZmllbGRzICIsIGZpZWxkcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoIiBjb250YWlucyBvbmUgZmllbGQiLCAxLCBmaWVsZHMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIGZpZWxkIHMiLCAyMCwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIGZpZWxkIHMiLCAzNCwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JU291cmNlTWV0aG9kW10gbWV0aG9kcyA9IGN1cnJlbnRUeXBlLmdldE1ldGhvZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZXRob2RzICIsIG1ldGhvZHMgPT0gbnVsbCk7Ci0KLQlTb3VyY2VUeXBlW10gbWVtYmVycyA9IGN1cnJlbnRUeXBlLmdldE1lbWJlclR5cGVzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWVtYmVycyAiLCBtZW1iZXJzID09IG51bGwpOwotCQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIHNvdXJjZSAiICsgdGVzdE5hbWUsIAotCQlleHBlY3RlZFVuaXRUb1N0cmluZywgCi0JCWN1cnJlbnRUeXBlLnRvU3RyaW5nKCkpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3Q0OCgpIHsKLQotCVN0cmluZyBzID0KLQkJInB1YmxpYyBjbGFzcyBYIGltcGxlbWVudHMgWSwgCQlcbiIgKwkJCQkJCQotCQkiCVN0cmluZyBzID0gXCIJCQkJCVxuIjsKLQotCVN0cmluZyBleHBlY3RlZFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFggaW1wbGVtZW50cyBZLCBTdHJpbmcsIHtcbiIKLQkJKyAiXHRqYXZhLmxhbmcuT2JqZWN0KDApXG4iCi0JCSsgIn0iOwotCQkJCi0JU3RyaW5nIHRlc3ROYW1lID0gInRlc3Q0ODogZnVsbCBwYXJzZSI7Ci0JZnVsbFBhcnNlKHMsdGVzdE5hbWUpOwotCQkJCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJMCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7IAotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZUVuZCAiLCAKLQkJNTAsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsgCi0KLQlhc3NlcnRUcnVlKCJoYXMgMiBzdXBlcmludGVyZmFjZXMgIiAsIGN1cnJlbnRUeXBlLmdldEludGVyZmFjZU5hbWVzKCkgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCIyIHN1cGVyaW50ZXJmYWNlcyAiICwgMiwgY3VycmVudFR5cGUuZ2V0SW50ZXJmYWNlTmFtZXMoKS5sZW5ndGgpOwkKLQotCVNvdXJjZUZpZWxkW10gZmllbGRzID0gY3VycmVudFR5cGUuZ2V0RmllbGRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgZmllbGRzICIsIGZpZWxkcyA9PSBudWxsKTsKLQotCVNvdXJjZU1ldGhvZFtdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWV0aG9kcyAiLCBtZXRob2RzID09IG51bGwpOwotCi0JU291cmNlVHlwZVtdIG1lbWJlcnMgPSBjdXJyZW50VHlwZS5nZXRNZW1iZXJUeXBlcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1lbWJlcnMgIiwgbWVtYmVycyA9PSBudWxsKTsKLQkJCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBzb3VyY2UgIiArIHRlc3ROYW1lLCAKLQkJZXhwZWN0ZWRVbml0VG9TdHJpbmcsIAotCQljdXJyZW50VHlwZS50b1N0cmluZygpKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0NDkoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCBpbXBsZW1lbnRzIFksIAkJXG4iICsJCQkJCQkKLQkJIglTdHJpbmcgcyA9IFwiCQkJCQlcbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIGltcGxlbWVudHMgWSwgU3RyaW5nLCB7XG4iCi0JCSsgIn0iOwotCQkJCi0JU3RyaW5nIHRlc3ROYW1lID0gInRlc3Q0OTogZGlldCBwYXJzZSI7Ci0JZGlldFBhcnNlKHMsdGVzdE5hbWUpOwotCQkJCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJMCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7IAotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZUVuZCAiLCAKLQkJNTAsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsgCi0KLQlhc3NlcnRUcnVlKCJoYXMgMiBzdXBlcmludGVyZmFjZXMgIiAsIGN1cnJlbnRUeXBlLmdldEludGVyZmFjZU5hbWVzKCkgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCIyIHN1cGVyaW50ZXJmYWNlcyAiICwgMiwgY3VycmVudFR5cGUuZ2V0SW50ZXJmYWNlTmFtZXMoKS5sZW5ndGgpOwkKLQotCVNvdXJjZUZpZWxkW10gZmllbGRzID0gY3VycmVudFR5cGUuZ2V0RmllbGRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgZmllbGRzICIsIGZpZWxkcyA9PSBudWxsKTsKLQotCVNvdXJjZU1ldGhvZFtdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWV0aG9kcyAiLCBtZXRob2RzID09IG51bGwpOwotCi0JU291cmNlVHlwZVtdIG1lbWJlcnMgPSBjdXJyZW50VHlwZS5nZXRNZW1iZXJUeXBlcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1lbWJlcnMgIiwgbWVtYmVycyA9PSBudWxsKTsKLQkJCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBzb3VyY2UgIiArIHRlc3ROYW1lLCAKLQkJZXhwZWN0ZWRVbml0VG9TdHJpbmcsIAotCQljdXJyZW50VHlwZS50b1N0cmluZygpKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0NTAoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCBpbXBsZW1lbnRzIAkJXG4iKwotCQkiaW50IHgJCQkJCQkJXG4iKwkKLQkJIn0JCQkJCQkJCVxuIjsKLQotCVN0cmluZyBleHBlY3RlZFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIgotCQkrICJcdGludCB4O1xuIgotCQkrICJcdGphdmEubGFuZy5PYmplY3QoMClcbiIKLQkJKyAifSI7Ci0JCQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAidGVzdDUwOiBmdWxsIHBhcnNlIjsKLQlmdWxsUGFyc2Uocyx0ZXN0TmFtZSk7Ci0JCQkJCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICIsIAotCQkwLCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsgCi0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlRW5kICIsIAotCQk0MiwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOyAKLQotCWFzc2VydFRydWUoImhhcyBubyBzdXBlcmludGVyZmFjZXMgIiAsIGN1cnJlbnRUeXBlLmdldEludGVyZmFjZU5hbWVzKCkgPT0gbnVsbCk7Ci0KLQlTb3VyY2VGaWVsZFtdIGZpZWxkcyA9IGN1cnJlbnRUeXBlLmdldEZpZWxkcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIGZpZWxkcyAiLCBmaWVsZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCJoYXMgb25lIGZpZWxkICIsIDEsIGZpZWxkcy5sZW5ndGgpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgZmllbGQgeCIsIDI5LCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgZmllbGQgeCIsIDMzLCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlTb3VyY2VNZXRob2RbXSBtZXRob2RzID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1ldGhvZHMgIiwgbWV0aG9kcyA9PSBudWxsKTsKLQotCVNvdXJjZVR5cGVbXSBtZW1iZXJzID0gY3VycmVudFR5cGUuZ2V0TWVtYmVyVHlwZXMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZW1iZXJzICIsIG1lbWJlcnMgPT0gbnVsbCk7Ci0JCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgc291cmNlICIgKyB0ZXN0TmFtZSwgCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLCAKLQkJY3VycmVudFR5cGUudG9TdHJpbmcoKSk7IAotfQotcHVibGljIHZvaWQgdGVzdDUxKCkgewotCi0JU3RyaW5nIHMgPQotCQkicHVibGljIGNsYXNzIFggaW1wbGVtZW50cyAJCVxuIisKLQkJImludCB4CQkJCQkJCVxuIisJCi0JCSJ9CQkJCQkJCQlcbiI7Ci0KLQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIKLQkJKyAiXHRpbnQgeDtcbiIKLQkJKyAifSI7Ci0JCQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAidGVzdDUxOiBkaWV0IHBhcnNlIjsKLQlkaWV0UGFyc2Uocyx0ZXN0TmFtZSk7Ci0JCQkJCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICIsIAotCQkwLCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsgCi0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlRW5kICIsIAotCQk0MiwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOyAKLQotCWFzc2VydFRydWUoImhhcyBubyBzdXBlcmludGVyZmFjZXMgIiAsIGN1cnJlbnRUeXBlLmdldEludGVyZmFjZU5hbWVzKCkgPT0gbnVsbCk7Ci0KLQlTb3VyY2VGaWVsZFtdIGZpZWxkcyA9IGN1cnJlbnRUeXBlLmdldEZpZWxkcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIGZpZWxkcyAiLCBmaWVsZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCJoYXMgb25lIGZpZWxkICIsIDEsIGZpZWxkcy5sZW5ndGgpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgZmllbGQgeCIsIDI5LCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgZmllbGQgeCIsIDMzLCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlTb3VyY2VNZXRob2RbXSBtZXRob2RzID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1ldGhvZHMgIiwgbWV0aG9kcyA9PSBudWxsKTsKLQotCVNvdXJjZVR5cGVbXSBtZW1iZXJzID0gY3VycmVudFR5cGUuZ2V0TWVtYmVyVHlwZXMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZW1iZXJzICIsIG1lbWJlcnMgPT0gbnVsbCk7Ci0JCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgc291cmNlICIgKyB0ZXN0TmFtZSwgCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLCAKLQkJY3VycmVudFR5cGUudG9TdHJpbmcoKSk7IAotfQotcHVibGljIHZvaWQgdGVzdDUyKCkgewotCi0JU3RyaW5nIHMgPQotCQkicHVibGljIGNsYXNzIFggcHVibGljIGludCBmb28oaW50IGJhcihzdGF0aWMgU3RyaW5nIHMiOwotCi0JU3RyaW5nIGV4cGVjdGVkVW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iCi0JCSsgIlx0c3RhdGljIFN0cmluZyBzO1xuIgotCQkrICJcdGphdmEubGFuZy5PYmplY3QoMClcbiIKLQkJKyAiXHRwdWJsaWMgaW50IGZvbygpIHt9XG4iCi0JCSsgIlx0aW50IGJhcigpIHt9XG4iCi0JCSsgIn0iOwotCQkJCi0JU3RyaW5nIHRlc3ROYW1lID0gInRlc3Q1MjogZnVsbCBwYXJzZSI7Ci0JZnVsbFBhcnNlKHMsdGVzdE5hbWUpOwotCQkJCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJMCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7IAotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZUVuZCAiLCAKLQkJNTIsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsgCi0KLQlhc3NlcnRUcnVlKCJoYXMgbm8gc3VwZXJpbnRlcmZhY2VzICIgLCBjdXJyZW50VHlwZS5nZXRJbnRlcmZhY2VOYW1lcygpID09IG51bGwpOwotCi0JU291cmNlRmllbGRbXSBmaWVsZHMgPSBjdXJyZW50VHlwZS5nZXRGaWVsZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiaGFzIG9uZSBmaWVsZCAiLCAxLCBmaWVsZHMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIGZpZWxkIHMiLCAzOCwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIGZpZWxkIHMiLCA1MiwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JU291cmNlTWV0aG9kW10gbWV0aG9kcyA9IGN1cnJlbnRUeXBlLmdldE1ldGhvZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZXRob2RzICIsIG1ldGhvZHMgIT0gbnVsbCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgZm9vIiwgMTUsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGZvbyIsIDI5LCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGJhciIsIDMwLCBtZXRob2RzWzFdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBiYXIiLCAzNywgbWV0aG9kc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCBmb28iLCAiZm9vIiwgbWV0aG9kc1swXS5nZXRBY3R1YWxOYW1lKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGJhciIsICJiYXIiLCBtZXRob2RzWzFdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlTb3VyY2VUeXBlW10gbWVtYmVycyA9IGN1cnJlbnRUeXBlLmdldE1lbWJlclR5cGVzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWVtYmVycyAiLCBtZW1iZXJzID09IG51bGwpOwotCQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIHNvdXJjZSAiICsgdGVzdE5hbWUsIAotCQlleHBlY3RlZFVuaXRUb1N0cmluZywgCi0JCWN1cnJlbnRUeXBlLnRvU3RyaW5nKCkpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3Q1MygpIHsKLQotCVN0cmluZyBzID0KLQkJInB1YmxpYyBjbGFzcyBYIHB1YmxpYyBpbnQgZm9vKGludCB4LCBpbnQgYmFyIHB1YmxpYyBTdHJpbmcgczsiOwotCi0JU3RyaW5nIGV4cGVjdGVkVW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iCi0JCSsgIlx0cHVibGljIFN0cmluZyBzO1xuIgotCQkrICJcdGphdmEubGFuZy5PYmplY3QoMClcbiIKLQkJKyAiXHRwdWJsaWMgaW50IGZvbyhpbnQgeCwgaW50IGJhciwgKSB7fVxuIgotCQkrICJ9IjsKLQkJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICJ0ZXN0NTM6IGZ1bGwgcGFyc2UiOwotCWZ1bGxQYXJzZShzLHRlc3ROYW1lKTsKLQkJCQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlU3RhcnQgIiwgCi0JCTAsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOyAKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VFbmQgIiwgCi0JCTYwLCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRUcnVlKCJoYXMgbm8gc3VwZXJpbnRlcmZhY2VzICIgLCBjdXJyZW50VHlwZS5nZXRJbnRlcmZhY2VOYW1lcygpID09IG51bGwpOwotCi0JU291cmNlRmllbGRbXSBmaWVsZHMgPSBjdXJyZW50VHlwZS5nZXRGaWVsZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiaGFzIG9uZSBmaWVsZCAiLCAxLCBmaWVsZHMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIGZpZWxkIHMiLCA0NSwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIGZpZWxkIHMiLCA2MCwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JU291cmNlTWV0aG9kW10gbWV0aG9kcyA9IGN1cnJlbnRUeXBlLmdldE1ldGhvZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZXRob2RzICIsIG1ldGhvZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCJoYXMgb25lIG1ldGhvZCAiLCAxLCBtZXRob2RzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgZm9vIiwgMTUsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGZvbyIsIDQ0LCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGZvbyIsICJmb28iLCBtZXRob2RzWzBdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlTb3VyY2VUeXBlW10gbWVtYmVycyA9IGN1cnJlbnRUeXBlLmdldE1lbWJlclR5cGVzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWVtYmVycyAiLCBtZW1iZXJzID09IG51bGwpOwotCQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIHNvdXJjZSAiICsgdGVzdE5hbWUsIAotCQlleHBlY3RlZFVuaXRUb1N0cmluZywgCi0JCWN1cnJlbnRUeXBlLnRvU3RyaW5nKCkpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3Q1NCgpIHsKLQotCVN0cmluZyBzID0KLQkJInB1YmxpYyBjbGFzcyBYIAkJCVxuIiArCi0JCSIJcHVibGljIGludCBmb28oCQkJXG4iICsKLQkJIglpbnQgYmFyKAkJCQlcbiIgKwotCQkiIAlzdGF0aWMgU3RyaW5nIHMsIGludCB4CVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkVW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iCi0JCSsgIlx0c3RhdGljIFN0cmluZyBzO1xuIgotCQkrICJcdGludCB4O1xuIgkJCi0JCSsgIlx0amF2YS5sYW5nLk9iamVjdCgwKVxuIgotCQkrICJcdHB1YmxpYyBpbnQgZm9vKCkge31cbiIKLQkJKyAiXHRpbnQgYmFyKCkge31cbiIKLQkJKyAifSI7Ci0JCQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAidGVzdDU0OiBmdWxsIHBhcnNlIjsKLQlmdWxsUGFyc2Uocyx0ZXN0TmFtZSk7Ci0JCQkJCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICIsIAotCQkwLCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsgCi0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlRW5kICIsIAotCQk3OCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0VHJ1ZSgiaGFzIG5vIHN1cGVyaW50ZXJmYWNlcyAiICwgY3VycmVudFR5cGUuZ2V0SW50ZXJmYWNlTmFtZXMoKSA9PSBudWxsKTsKLQotCVNvdXJjZUZpZWxkW10gZmllbGRzID0gY3VycmVudFR5cGUuZ2V0RmllbGRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgZmllbGRzICIsIGZpZWxkcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoImhhcyAyIGZpZWxkcyAiLCAyLCBmaWVsZHMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIGZpZWxkIHMiLCA1NSwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIGZpZWxkIHMiLCA3MCwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgZmllbGQgeCIsIDcyLCBmaWVsZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgZmllbGQgeCIsIDc2LCBmaWVsZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0JCi0JU291cmNlTWV0aG9kW10gbWV0aG9kcyA9IGN1cnJlbnRUeXBlLmdldE1ldGhvZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZXRob2RzICIsIG1ldGhvZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCJoYXMgMiBtZXRob2RzICIsIDIsIG1ldGhvZHMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCBmb28iLCAyMCwgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgZm9vIiwgMzgsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgYmFyIiwgNDAsIG1ldGhvZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGJhciIsIDUyLCBtZXRob2RzWzFdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCBmb28iLCAiZm9vIiwgbWV0aG9kc1swXS5nZXRBY3R1YWxOYW1lKCkpOwotCQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCBiYXIiLCAiYmFyIiwgbWV0aG9kc1sxXS5nZXRBY3R1YWxOYW1lKCkpOwotCQotCVNvdXJjZVR5cGVbXSBtZW1iZXJzID0gY3VycmVudFR5cGUuZ2V0TWVtYmVyVHlwZXMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZW1iZXJzICIsIG1lbWJlcnMgPT0gbnVsbCk7Ci0JCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgc291cmNlICIgKyB0ZXN0TmFtZSwgCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLCAKLQkJY3VycmVudFR5cGUudG9TdHJpbmcoKSk7IAotfQotcHVibGljIHZvaWQgdGVzdDU1KCkgewotCi0JU3RyaW5nIHMgPQotCQkicHVibGljIGNsYXNzIFggCQkJXG4iICsKLQkJIglwdWJsaWMgaW50IGZvbygJCQlcbiIgKwotCQkiCWludCBiYXIoCQkJCVxuIiArCi0JCSIgCXN0YXRpYyBTdHJpbmcgcywgaW50IHgJXG4iOwotCQkKLQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIKLQkJKyAiXHRzdGF0aWMgU3RyaW5nIHM7XG4iCi0JCSsgIlx0aW50IHg7XG4iCQkKLQkJKyAiXHRwdWJsaWMgaW50IGZvbygpIHt9XG4iCi0JCSsgIlx0aW50IGJhcigpIHt9XG4iCi0JCSsgIn0iOwotCQkJCi0JU3RyaW5nIHRlc3ROYW1lID0gInRlc3Q1NTogZGlldCBwYXJzZSI7Ci0JZGlldFBhcnNlKHMsdGVzdE5hbWUpOwotCQkJCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJMCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7IAotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZUVuZCAiLCAKLQkJNzgsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydFRydWUoImhhcyBubyBzdXBlcmludGVyZmFjZXMgIiAsIGN1cnJlbnRUeXBlLmdldEludGVyZmFjZU5hbWVzKCkgPT0gbnVsbCk7Ci0KLQlTb3VyY2VGaWVsZFtdIGZpZWxkcyA9IGN1cnJlbnRUeXBlLmdldEZpZWxkcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIGZpZWxkcyAiLCBmaWVsZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCJoYXMgMiBmaWVsZHMgIiwgMiwgZmllbGRzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBmaWVsZCBzIiwgNTUsIGZpZWxkc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBmaWVsZCBzIiwgNzAsIGZpZWxkc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIGZpZWxkIHgiLCA3MiwgZmllbGRzWzFdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIGZpZWxkIHgiLCA3NiwgZmllbGRzWzFdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCQotCVNvdXJjZU1ldGhvZFtdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWV0aG9kcyAiLCBtZXRob2RzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiaGFzIDIgbWV0aG9kcyAiLCAyLCBtZXRob2RzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgZm9vIiwgMjAsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGZvbyIsIDM4LCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGJhciIsIDQwLCBtZXRob2RzWzFdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBiYXIiLCA1MiwgbWV0aG9kc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQkKLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgZm9vIiwgImZvbyIsIG1ldGhvZHNbMF0uZ2V0QWN0dWFsTmFtZSgpKTsKLQkKLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgYmFyIiwgImJhciIsIG1ldGhvZHNbMV0uZ2V0QWN0dWFsTmFtZSgpKTsKLQkKLQlTb3VyY2VUeXBlW10gbWVtYmVycyA9IGN1cnJlbnRUeXBlLmdldE1lbWJlclR5cGVzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWVtYmVycyAiLCBtZW1iZXJzID09IG51bGwpOwotCQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIHNvdXJjZSAiICsgdGVzdE5hbWUsIAotCQlleHBlY3RlZFVuaXRUb1N0cmluZywgCi0JCWN1cnJlbnRUeXBlLnRvU3RyaW5nKCkpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3Q1NigpIHsKLQotCVN0cmluZyBzID0KLQkJImNsYXNzIFggewkJCQkJXG4iICsKLQkJIglTdHJpbmcgczsJCQkJXG4iICsKLQkJIgkJCQkJCQlcbiIgKwotCQkiCXB1YmxpYyB2b2lkIGZvbygJCVxuIiArCi0JCSIJCXN0YXRpYyBpbnQgeAkJXG4iICsKLQkJIn0JCQkJCQkJXG4iOwotCi0JCQotCVN0cmluZyBleHBlY3RlZFVuaXRUb1N0cmluZyA9IAotCQkiY2xhc3MgWCB7XG4iCi0JCSsgIlx0U3RyaW5nIHM7XG4iCi0JCSsgIlx0c3RhdGljIGludCB4O1xuIgkJCi0JCSsgIlx0amF2YS5sYW5nLk9iamVjdCgwKVxuIgotCQkrICJcdHB1YmxpYyB2b2lkIGZvbygpIHt9XG4iCi0JCSsgIn0iOwotCQkJCi0JU3RyaW5nIHRlc3ROYW1lID0gInRlc3Q1NjogZnVsbCBwYXJzZSI7Ci0JZnVsbFBhcnNlKHMsdGVzdE5hbWUpOwotCQkJCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJMCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7IAotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZUVuZCAiLCAKLQkJNzUsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydFRydWUoImhhcyBubyBzdXBlcmludGVyZmFjZXMgIiAsIGN1cnJlbnRUeXBlLmdldEludGVyZmFjZU5hbWVzKCkgPT0gbnVsbCk7Ci0KLQlTb3VyY2VGaWVsZFtdIGZpZWxkcyA9IGN1cnJlbnRUeXBlLmdldEZpZWxkcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIGZpZWxkcyAiLCBmaWVsZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCJoYXMgMiBmaWVsZHMgIiwgMiwgZmllbGRzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBmaWVsZCBzIiwgMTYsIGZpZWxkc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBmaWVsZCBzIiwgMjQsIGZpZWxkc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIGZpZWxkIHgiLCA2MCwgZmllbGRzWzFdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIGZpZWxkIHgiLCA3MSwgZmllbGRzWzFdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCQotCVNvdXJjZU1ldGhvZFtdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWV0aG9kcyAiLCBtZXRob2RzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiaGFzIDEgbWV0aG9kICIsIDEsIG1ldGhvZHMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCBmb28iLCAzOSwgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgZm9vIiwgNTcsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgZm9vIiwgImZvbyIsIG1ldGhvZHNbMF0uZ2V0QWN0dWFsTmFtZSgpKTsKLQotCVNvdXJjZVR5cGVbXSBtZW1iZXJzID0gY3VycmVudFR5cGUuZ2V0TWVtYmVyVHlwZXMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZW1iZXJzICIsIG1lbWJlcnMgPT0gbnVsbCk7Ci0JCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgc291cmNlICIgKyB0ZXN0TmFtZSwgCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLCAKLQkJY3VycmVudFR5cGUudG9TdHJpbmcoKSk7IAotfQotcHVibGljIHZvaWQgdGVzdDU3KCkgewotCi0JU3RyaW5nIHMgPQotCQkiY2xhc3MgWCB7CQkJCQlcbiIgKwotCQkiCVN0cmluZyBzOwkJCQlcbiIgKwotCQkiCQkJCQkJCVxuIiArCi0JCSIJcHVibGljIHZvaWQgZm9vKAkJXG4iICsKLQkJIgkJc3RhdGljIGludCB4CQlcbiIgKwotCQkifQkJCQkJCQlcbiI7Ci0KLQkJCi0JU3RyaW5nIGV4cGVjdGVkVW5pdFRvU3RyaW5nID0gCi0JCSJjbGFzcyBYIHtcbiIKLQkJKyAiXHRTdHJpbmcgcztcbiIKLQkJKyAiXHRzdGF0aWMgaW50IHg7XG4iCQkKLQkJKyAiXHRwdWJsaWMgdm9pZCBmb28oKSB7fVxuIgotCQkrICJ9IjsKLQkJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICJ0ZXN0NTc6IGRpZXQgcGFyc2UiOwotCWRpZXRQYXJzZShzLHRlc3ROYW1lKTsKLQkJCQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlU3RhcnQgIiwgCi0JCTAsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOyAKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VFbmQgIiwgCi0JCTc1LCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRUcnVlKCJoYXMgbm8gc3VwZXJpbnRlcmZhY2VzICIgLCBjdXJyZW50VHlwZS5nZXRJbnRlcmZhY2VOYW1lcygpID09IG51bGwpOwotCi0JU291cmNlRmllbGRbXSBmaWVsZHMgPSBjdXJyZW50VHlwZS5nZXRGaWVsZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiaGFzIDIgZmllbGRzICIsIDIsIGZpZWxkcy5sZW5ndGgpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgZmllbGQgcyIsIDE2LCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgZmllbGQgcyIsIDI0LCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBmaWVsZCB4IiwgNjAsIGZpZWxkc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBmaWVsZCB4IiwgNzEsIGZpZWxkc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQkKLQlTb3VyY2VNZXRob2RbXSBtZXRob2RzID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1ldGhvZHMgIiwgbWV0aG9kcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoImhhcyAxIG1ldGhvZCAiLCAxLCBtZXRob2RzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgZm9vIiwgMzksIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGZvbyIsIDU3LCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGZvbyIsICJmb28iLCBtZXRob2RzWzBdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlTb3VyY2VUeXBlW10gbWVtYmVycyA9IGN1cnJlbnRUeXBlLmdldE1lbWJlclR5cGVzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWVtYmVycyAiLCBtZW1iZXJzID09IG51bGwpOwotCQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIHNvdXJjZSAiICsgdGVzdE5hbWUsIAotCQlleHBlY3RlZFVuaXRUb1N0cmluZywgCi0JCWN1cnJlbnRUeXBlLnRvU3RyaW5nKCkpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3Q1OCgpIHsKLQotCVN0cmluZyBzID0KLQkJInB1YmxpYyBjbGFzcyBYIHsJCQlcbiIrCi0JCSIJaW50IGZvbygpewkJCQlcbiIrCi0JCSIJCVN0cmluZyBzID0gXCIJCVxuIisKLQkJIgl9CQkJCQkJXG4iKwotCQkifQkJCQkJCQlcbiI7Ci0JCQotCVN0cmluZyBleHBlY3RlZFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIgotCQkrICJcdGphdmEubGFuZy5PYmplY3QoMClcbiIKLQkJKyAiXHRpbnQgZm9vKCkge31cbiIKLQkJKyAifSI7Ci0JCQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAidGVzdDU4OiBmdWxsIHBhcnNlIjsKLQlmdWxsUGFyc2Uocyx0ZXN0TmFtZSk7Ci0JCQkJCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICIsIAotCQkwLCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsgCi0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlRW5kICIsIAotCQk2MiwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0VHJ1ZSgiaGFzIG5vIHN1cGVyaW50ZXJmYWNlcyAiICwgY3VycmVudFR5cGUuZ2V0SW50ZXJmYWNlTmFtZXMoKSA9PSBudWxsKTsKLQotCVNvdXJjZUZpZWxkW10gZmllbGRzID0gY3VycmVudFR5cGUuZ2V0RmllbGRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgZmllbGRzICIsIGZpZWxkcyA9PSBudWxsKTsKLQotCVNvdXJjZU1ldGhvZFtdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWV0aG9kcyAiLCBtZXRob2RzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiaGFzIDEgbWV0aG9kICIsIDEsIG1ldGhvZHMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCBmb28iLCAyMSwgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgZm9vIiwgNTQsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgZm9vIiwgImZvbyIsIG1ldGhvZHNbMF0uZ2V0QWN0dWFsTmFtZSgpKTsKLQotCVNvdXJjZVR5cGVbXSBtZW1iZXJzID0gY3VycmVudFR5cGUuZ2V0TWVtYmVyVHlwZXMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZW1iZXJzICIsIG1lbWJlcnMgPT0gbnVsbCk7Ci0JCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgc291cmNlICIgKyB0ZXN0TmFtZSwgCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLCAKLQkJY3VycmVudFR5cGUudG9TdHJpbmcoKSk7IAotfQotcHVibGljIHZvaWQgdGVzdDU5KCkgewotCi0JU3RyaW5nIHMgPQotCi0JCSJjbGFzcyBYIHsJCQkJCQkJCQlcbiIgKyAKLQkJIglpbnQgZm9vKEFBIGEsIEJCIGIsIElPRXgJCQkJXG4iICsgCi0JCSIJCQkJCQkJCQkJCVxuIjsgCi0JCQotCVN0cmluZyBleHBlY3RlZFVuaXRUb1N0cmluZyA9IAotCQkiY2xhc3MgWCB7XG4iCi0JCSsgIlx0amF2YS5sYW5nLk9iamVjdCgwKVxuIgotCQkrICJcdGludCBmb28oQUEgYSwgQkIgYiwgKSB7fVxuIgotCQkrICJ9IjsKLQkJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICJ0ZXN0NTk6IGZ1bGwgcGFyc2UiOwotCWZ1bGxQYXJzZShzLHRlc3ROYW1lKTsKLQkJCQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlU3RhcnQgIiwgCi0JCTAsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOyAKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VFbmQgIiwgCi0JCTYwLCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRUcnVlKCJoYXMgbm8gc3VwZXJpbnRlcmZhY2VzICIgLCBjdXJyZW50VHlwZS5nZXRJbnRlcmZhY2VOYW1lcygpID09IG51bGwpOwotCi0JU291cmNlRmllbGRbXSBmaWVsZHMgPSBjdXJyZW50VHlwZS5nZXRGaWVsZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzID09IG51bGwpOwotCi0JU291cmNlTWV0aG9kW10gbWV0aG9kcyA9IGN1cnJlbnRUeXBlLmdldE1ldGhvZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZXRob2RzICIsIG1ldGhvZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCJoYXMgMSBtZXRob2QgIiwgMSwgbWV0aG9kcy5sZW5ndGgpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGZvbyIsIDIwLCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBmb28iLCA2MCwgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCBmb28iLCAiZm9vIiwgbWV0aG9kc1swXS5nZXRBY3R1YWxOYW1lKCkpOwotCi0JU291cmNlVHlwZVtdIG1lbWJlcnMgPSBjdXJyZW50VHlwZS5nZXRNZW1iZXJUeXBlcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1lbWJlcnMgIiwgbWVtYmVycyA9PSBudWxsKTsKLQkJCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBzb3VyY2UgIiArIHRlc3ROYW1lLCAKLQkJZXhwZWN0ZWRVbml0VG9TdHJpbmcsIAotCQljdXJyZW50VHlwZS50b1N0cmluZygpKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0NjAoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7CQkJCQkJCVxuIisKLQkJIglmaW5hbCBzdGF0aWMgaW50IGZvbygpeyAJCQkJXG4iKwotCQkiCQlyZXR1cm4gXCIxOyAJCQkJCQlcbiIrCi0JCSIJfSAJCQkJCQkJCQkJXG4iKwotCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10peyBcbiIrCi0JCSIJCWZvbygpOwkJCQkJCQkJXG4iKwotCQkiCX0gCQkJCQkJCQkJCVxuIisKLQkJIn0JCQkJCQkJCQkJCVxuIjsKLQkJCi0JU3RyaW5nIGV4cGVjdGVkVW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iCi0JCSsgIlx0amF2YS5sYW5nLk9iamVjdCgwKVxuIgotCQkrICJcdGZpbmFsIHN0YXRpYyBpbnQgZm9vKCkge31cbiIKLQkJKyAiXHRwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2LCApIHt9XG4iCi0JCSsgIn0iOwotCQkJCi0JU3RyaW5nIHRlc3ROYW1lID0gInRlc3Q2MDogZnVsbCBwYXJzZSI7Ci0JZnVsbFBhcnNlKHMsdGVzdE5hbWUpOwotCQkJCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJMCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7IAotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZUVuZCAiLCAKLQkJMTYxLCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRUcnVlKCJoYXMgbm8gc3VwZXJpbnRlcmZhY2VzICIgLCBjdXJyZW50VHlwZS5nZXRJbnRlcmZhY2VOYW1lcygpID09IG51bGwpOwotCi0JU291cmNlRmllbGRbXSBmaWVsZHMgPSBjdXJyZW50VHlwZS5nZXRGaWVsZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzID09IG51bGwpOwotCi0JU291cmNlTWV0aG9kW10gbWV0aG9kcyA9IGN1cnJlbnRUeXBlLmdldE1ldGhvZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZXRob2RzICIsIG1ldGhvZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCJoYXMgMSBtZXRob2QgIiwgMiwgbWV0aG9kcy5sZW5ndGgpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGZvbyIsIDI1LCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBmb28iLCA3NSwgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCBtYWluIiwgODksIG1ldGhvZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIG1haW4iLCAxNDgsIG1ldGhvZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgZm9vIiwgImZvbyIsIG1ldGhvZHNbMF0uZ2V0QWN0dWFsTmFtZSgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCBtYWluIiwgIm1haW4iLCBtZXRob2RzWzFdLmdldEFjdHVhbE5hbWUoKSk7Ci0JCQotCVNvdXJjZVR5cGVbXSBtZW1iZXJzID0gY3VycmVudFR5cGUuZ2V0TWVtYmVyVHlwZXMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZW1iZXJzICIsIG1lbWJlcnMgPT0gbnVsbCk7Ci0JCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgc291cmNlICIgKyB0ZXN0TmFtZSwgCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLCAKLQkJY3VycmVudFR5cGUudG9TdHJpbmcoKSk7IAotfQotcHVibGljIHZvaWQgdGVzdDYxKCkgewotCi0JU3RyaW5nIHMgPQotCQkicHVibGljIGNsYXNzIFggewkJCQkJCQlcbiIrCi0JCSIJewkJCQkJCQkJCQlcbiIrCi0JCSIgICAgIGludCB4OyI7Ci0JCQkKLQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIKLQkJKyAiXHR7fVxuIgotCQkrICJcdGphdmEubGFuZy5PYmplY3QoMClcbiIKLQkJKyAifSI7Ci0JCQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAidGVzdDYxOiBmdWxsIHBhcnNlIjsKLQlmdWxsUGFyc2Uocyx0ZXN0TmFtZSk7Ci0JCQkJCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICIsIAotCQkwLCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsgCi0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlRW5kICIsIAotCQk0NywgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0VHJ1ZSgiaGFzIG5vIHN1cGVyaW50ZXJmYWNlcyAiICwgY3VycmVudFR5cGUuZ2V0SW50ZXJmYWNlTmFtZXMoKSA9PSBudWxsKTsKLQotCVNvdXJjZUZpZWxkW10gZmllbGRzID0gY3VycmVudFR5cGUuZ2V0RmllbGRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgZmllbGRzICIsIGZpZWxkcyAhPSBudWxsKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIGluaXRpYWxpemVyIiwgMjUsIGZpZWxkc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBpbml0aWFsaXplciIsIDQ3LCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQkKLQlTb3VyY2VNZXRob2RbXSBtZXRob2RzID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1ldGhvZHMgIiwgbWV0aG9kcyA9PSBudWxsKTsKLQotCVNvdXJjZVR5cGVbXSBtZW1iZXJzID0gY3VycmVudFR5cGUuZ2V0TWVtYmVyVHlwZXMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZW1iZXJzICIsIG1lbWJlcnMgPT0gbnVsbCk7Ci0JCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgc291cmNlICIgKyB0ZXN0TmFtZSwgCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLCAKLQkJY3VycmVudFR5cGUudG9TdHJpbmcoKSk7IAotfQotcHVibGljIHZvaWQgdGVzdDYyKCkgewotCi0JU3RyaW5nIHMgPQotCQkicHVibGljIGNsYXNzIFggewkJCQkJCQlcbiIrCi0JCSIgICBpbnQgZm9vKCl7CQkJCQkJCQlcbiIrCi0JCSIJICBpZih0cnVlKXsJCQkJCQkJCVxuIisKLQkJIiAgICAgCWludCB4OyI7Ci0JCQkKLQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIKLQkJKyAiXHRqYXZhLmxhbmcuT2JqZWN0KDApXG4iCi0JCSsgIlx0aW50IGZvbygpIHt9XG4iCi0JCSsgIn0iOwotCQkJCi0JU3RyaW5nIHRlc3ROYW1lID0gInRlc3Q2MjogZnVsbCBwYXJzZSI7Ci0JZnVsbFBhcnNlKHMsdGVzdE5hbWUpOwotCQkJCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJMCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7IAotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZUVuZCAiLCAKLQkJNzgsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydFRydWUoImhhcyBubyBzdXBlcmludGVyZmFjZXMgIiAsIGN1cnJlbnRUeXBlLmdldEludGVyZmFjZU5hbWVzKCkgPT0gbnVsbCk7Ci0KLQlTb3VyY2VGaWVsZFtdIGZpZWxkcyA9IGN1cnJlbnRUeXBlLmdldEZpZWxkcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIGZpZWxkcyAiLCBmaWVsZHMgPT0gbnVsbCk7Ci0JCi0JU291cmNlTWV0aG9kW10gbWV0aG9kcyA9IGN1cnJlbnRUeXBlLmdldE1ldGhvZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZXRob2RzICIsIG1ldGhvZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCJoYXMgb25lIG1ldGhvZCIsIDEsIG1ldGhvZHMubGVuZ3RoKTsKLQkKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgZm9vIiwgMjcsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGZvbyIsIDc4LCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGZvbyIsICJmb28iLCBtZXRob2RzWzBdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlTb3VyY2VUeXBlW10gbWVtYmVycyA9IGN1cnJlbnRUeXBlLmdldE1lbWJlclR5cGVzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWVtYmVycyAiLCBtZW1iZXJzID09IG51bGwpOwotCQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIHNvdXJjZSAiICsgdGVzdE5hbWUsIAotCQlleHBlY3RlZFVuaXRUb1N0cmluZywgCi0JCWN1cnJlbnRUeXBlLnRvU3RyaW5nKCkpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3Q2MygpIHsKLQotCVN0cmluZyBzID0KLQkJInB1YmxpYyBjbGFzcyBYIHsJCQkJCQkJXG4iKwotCQkiICAgaW50IGZvbygpe30JCQkJCQkJCVxuIisKLQkJIn0JCQkJCQkJCQkJCVxuIisKLQkJImludCB4O1xuIjsKLQkJCQotCVN0cmluZyBleHBlY3RlZFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIgotCQkrICJcdGludCB4O1xuIgotCQkrICJcdGphdmEubGFuZy5PYmplY3QoMClcbiIKLQkJKyAiXHRpbnQgZm9vKCkge31cbiIKLQkJKyAifSI7Ci0JCQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAidGVzdDYzOiBmdWxsIHBhcnNlIjsKLQlmdWxsUGFyc2Uocyx0ZXN0TmFtZSk7Ci0JCQkJCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICIsIAotCQkwLCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsgCi0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlRW5kICIsIAotCQk2NiwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0VHJ1ZSgiaGFzIG5vIHN1cGVyaW50ZXJmYWNlcyAiICwgY3VycmVudFR5cGUuZ2V0SW50ZXJmYWNlTmFtZXMoKSA9PSBudWxsKTsKLQotCVNvdXJjZUZpZWxkW10gZmllbGRzID0gY3VycmVudFR5cGUuZ2V0RmllbGRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgZmllbGRzICIsIGZpZWxkcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoImhhcyBvbmUgZmllbGQiLCAxLCBmaWVsZHMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIGZpZWxkIHgiLCA2MCwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIGZpZWxkIHgiLCA2NSwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCQotCVNvdXJjZU1ldGhvZFtdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWV0aG9kcyAiLCBtZXRob2RzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiaGFzIG9uZSBtZXRob2QiLCAxLCBtZXRob2RzLmxlbmd0aCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGZvbyIsIDI3LCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBmb28iLCAzNywgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCBmb28iLCAiZm9vIiwgbWV0aG9kc1swXS5nZXRBY3R1YWxOYW1lKCkpOwotCi0JU291cmNlVHlwZVtdIG1lbWJlcnMgPSBjdXJyZW50VHlwZS5nZXRNZW1iZXJUeXBlcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1lbWJlcnMgIiwgbWVtYmVycyA9PSBudWxsKTsKLQkJCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBzb3VyY2UgIiArIHRlc3ROYW1lLCAKLQkJZXhwZWN0ZWRVbml0VG9TdHJpbmcsIAotCQljdXJyZW50VHlwZS50b1N0cmluZygpKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0NjQoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7CQkJCQkJCVxuIisKLQkJIiAgIGludCBmb28oKXt9CQkJCQkJCQlcbiIrCi0JCSJ9CQkJCQkJCQkJCQlcbiIrCi0JCSJpbnQgeDtcbiI7Ci0JCQkKLQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIKLQkJKyAiXHRpbnQgeDtcbiIKLQkJKyAiXHRpbnQgZm9vKCkge31cbiIKLQkJKyAifSI7Ci0JCQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAidGVzdDY0OiBkaWV0IHBhcnNlIjsKLQlkaWV0UGFyc2Uocyx0ZXN0TmFtZSk7Ci0JCQkJCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICIsIAotCQkwLCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsgCi0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlRW5kICIsIAotCQk2NiwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0VHJ1ZSgiaGFzIG5vIHN1cGVyaW50ZXJmYWNlcyAiICwgY3VycmVudFR5cGUuZ2V0SW50ZXJmYWNlTmFtZXMoKSA9PSBudWxsKTsKLQotCVNvdXJjZUZpZWxkW10gZmllbGRzID0gY3VycmVudFR5cGUuZ2V0RmllbGRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgZmllbGRzICIsIGZpZWxkcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoImhhcyBvbmUgZmllbGQiLCAxLCBmaWVsZHMubGVuZ3RoKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIGZpZWxkIHgiLCA2MCwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIGZpZWxkIHgiLCA2NSwgZmllbGRzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCQotCVNvdXJjZU1ldGhvZFtdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWV0aG9kcyAiLCBtZXRob2RzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiaGFzIG9uZSBtZXRob2QiLCAxLCBtZXRob2RzLmxlbmd0aCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGZvbyIsIDI3LCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBmb28iLCAzNywgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCBmb28iLCAiZm9vIiwgbWV0aG9kc1swXS5nZXRBY3R1YWxOYW1lKCkpOwotCi0JU291cmNlVHlwZVtdIG1lbWJlcnMgPSBjdXJyZW50VHlwZS5nZXRNZW1iZXJUeXBlcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1lbWJlcnMgIiwgbWVtYmVycyA9PSBudWxsKTsKLQkJCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBzb3VyY2UgIiArIHRlc3ROYW1lLCAKLQkJZXhwZWN0ZWRVbml0VG9TdHJpbmcsIAotCQljdXJyZW50VHlwZS50b1N0cmluZygpKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0NjUoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCSJwdWJsaWMgY2xhc3MgWCB7CQkJCQkJCVxuIisKLQkJIiAgIGludCBmb28oKXt9CQkJCQkJCQlcbiIrCi0JCSJ9CQkJCQkJCQkJCQlcbiIrCi0JCSJpbnQgeCgpO1xuIjsKLQkJCQotCVN0cmluZyBleHBlY3RlZFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIgotCQkrICJcdGludCBmb28oKSB7fVxuIgotCQkrICJcdGludCB4KCkge31cbiIKLQkJKyAifSI7Ci0JCQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAidGVzdDY1OiBkaWV0IHBhcnNlIjsKLQlkaWV0UGFyc2Uocyx0ZXN0TmFtZSk7Ci0JCQkJCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICIsIAotCQkwLCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsgCi0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlRW5kICIsIAotCQk2OCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0VHJ1ZSgiaGFzIG5vIHN1cGVyaW50ZXJmYWNlcyAiICwgY3VycmVudFR5cGUuZ2V0SW50ZXJmYWNlTmFtZXMoKSA9PSBudWxsKTsKLQotCVNvdXJjZUZpZWxkW10gZmllbGRzID0gY3VycmVudFR5cGUuZ2V0RmllbGRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgZmllbGRzICIsIGZpZWxkcyA9PSBudWxsKTsKLQotCVNvdXJjZU1ldGhvZFtdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWV0aG9kcyAiLCBtZXRob2RzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiaGFzIHR3byBtZXRob2RzIiwgMiwgbWV0aG9kcy5sZW5ndGgpOwotCQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCBmb28iLCAyNywgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgZm9vIiwgMzcsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgeCIsIDYwLCBtZXRob2RzWzFdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCB4IiwgNjcsIG1ldGhvZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgZm9vIiwgImZvbyIsIG1ldGhvZHNbMF0uZ2V0QWN0dWFsTmFtZSgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCB4IiwgIngiLCBtZXRob2RzWzFdLmdldEFjdHVhbE5hbWUoKSk7Ci0JCQotCVNvdXJjZVR5cGVbXSBtZW1iZXJzID0gY3VycmVudFR5cGUuZ2V0TWVtYmVyVHlwZXMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZW1iZXJzICIsIG1lbWJlcnMgPT0gbnVsbCk7Ci0JCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgc291cmNlICIgKyB0ZXN0TmFtZSwgCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLCAKLQkJY3VycmVudFR5cGUudG9TdHJpbmcoKSk7IAotfQotcHVibGljIHZvaWQgdGVzdDY2KCkgewotCi0JU3RyaW5nIHMgPQotCQkicHVibGljIGludGVyZmFjZSBYIHsJCQkJCQlcbiIrCi0JCSIgICBpbnQgZm9vKCkge307CQkJCQkJCVxuIisKLQkJIn0JCQkJCQkJCQkJCVxuIisKLQkJImludCB4KCk7XG4iOwotCQkJCi0JU3RyaW5nIGV4cGVjdGVkVW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgaW50ZXJmYWNlIFgge1xuIgotCQkrICJcdGludCBmb28oKSB7fVxuIgotCQkrICJcdGludCB4KCkge31cbiIKLQkJKyAifSI7Ci0JCQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAidGVzdDY2OiBkaWV0IHBhcnNlIjsKLQlkaWV0UGFyc2Uocyx0ZXN0TmFtZSk7Ci0JCQkJCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICIsIAotCQkwLCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsgCi0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlRW5kICIsIAotCQk3MiwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0VHJ1ZSgiaGFzIG5vIHN1cGVyaW50ZXJmYWNlcyAiICwgY3VycmVudFR5cGUuZ2V0SW50ZXJmYWNlTmFtZXMoKSA9PSBudWxsKTsKLQotCVNvdXJjZUZpZWxkW10gZmllbGRzID0gY3VycmVudFR5cGUuZ2V0RmllbGRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgZmllbGRzICIsIGZpZWxkcyA9PSBudWxsKTsKLQotCVNvdXJjZU1ldGhvZFtdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWV0aG9kcyAiLCBtZXRob2RzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiaGFzIHR3byBtZXRob2RzIiwgMiwgbWV0aG9kcy5sZW5ndGgpOwotCQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCBmb28iLCAzMCwgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgZm9vIiwgNDEsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgeCIsIDY0LCBtZXRob2RzWzFdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCB4IiwgNzEsIG1ldGhvZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgZm9vIiwgImZvbyIsIG1ldGhvZHNbMF0uZ2V0QWN0dWFsTmFtZSgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCB4IiwgIngiLCBtZXRob2RzWzFdLmdldEFjdHVhbE5hbWUoKSk7Ci0JCQotCVNvdXJjZVR5cGVbXSBtZW1iZXJzID0gY3VycmVudFR5cGUuZ2V0TWVtYmVyVHlwZXMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZW1iZXJzICIsIG1lbWJlcnMgPT0gbnVsbCk7Ci0JCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgc291cmNlICIgKyB0ZXN0TmFtZSwgCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLCAKLQkJY3VycmVudFR5cGUudG9TdHJpbmcoKSk7IAotfQotcHVibGljIHZvaWQgdGVzdDY3KCkgewotCi0JU3RyaW5nIHMgPQotCQkicHVibGljIGludGVyZmFjZSBYIHsJCQkJCQlcbiIrCi0JCSIgICBpbnQgZm9vKCkge307CQkJCQkJCVxuIisKLQkJIiAgIGludCB4KCk7CQkJCQkJCQlcbiIrCi0JCSJ9IjsKLQkJCQotCVN0cmluZyBleHBlY3RlZFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGludGVyZmFjZSBYIHtcbiIKLQkJKyAiXHRpbnQgZm9vKCkge31cbiIKLQkJKyAiXHRpbnQgeCgpIHt9XG4iCi0JCSsgIn0iOwotCQkJCi0JU3RyaW5nIHRlc3ROYW1lID0gInRlc3Q2NzogZGlldCBwYXJzZSI7Ci0JZGlldFBhcnNlKHMsdGVzdE5hbWUpOwotCQkJCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJMCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7IAotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZUVuZCAiLCAKLQkJNzEsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydFRydWUoImhhcyBubyBzdXBlcmludGVyZmFjZXMgIiAsIGN1cnJlbnRUeXBlLmdldEludGVyZmFjZU5hbWVzKCkgPT0gbnVsbCk7Ci0KLQlTb3VyY2VGaWVsZFtdIGZpZWxkcyA9IGN1cnJlbnRUeXBlLmdldEZpZWxkcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIGZpZWxkcyAiLCBmaWVsZHMgPT0gbnVsbCk7Ci0KLQlTb3VyY2VNZXRob2RbXSBtZXRob2RzID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1ldGhvZHMgIiwgbWV0aG9kcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoImhhcyB0d28gbWV0aG9kcyIsIDIsIG1ldGhvZHMubGVuZ3RoKTsKLQkKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgZm9vIiwgMzAsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGZvbyIsIDQxLCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIHgiLCA1NCwgbWV0aG9kc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgeCIsIDYxLCBtZXRob2RzWzFdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGZvbyIsICJmb28iLCBtZXRob2RzWzBdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgeCIsICJ4IiwgbWV0aG9kc1sxXS5nZXRBY3R1YWxOYW1lKCkpOwotCQkKLQlTb3VyY2VUeXBlW10gbWVtYmVycyA9IGN1cnJlbnRUeXBlLmdldE1lbWJlclR5cGVzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWVtYmVycyAiLCBtZW1iZXJzID09IG51bGwpOwotCQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIHNvdXJjZSAiICsgdGVzdE5hbWUsIAotCQlleHBlY3RlZFVuaXRUb1N0cmluZywgCi0JCWN1cnJlbnRUeXBlLnRvU3RyaW5nKCkpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3Q2OCgpIHsKLQotCVN0cmluZyBzID0KLQkJInB1YmxpYyBpbnRlcmZhY2UgWCB7CQkJCQkJXG4iKwotCQkiICAgaW50IGZvbygpIHt9OwkJCQkJCQlcbiIrCi0JCSIgICBpbnQgeCgpOwkJCQkJCQkJXG4iKwotCQkifSI7Ci0JCQkKLQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBpbnRlcmZhY2UgWCB7XG4iCi0JCSsgIlx0aW50IGZvbygpIHt9XG4iCi0JCSsgIlx0aW50IHgoKSB7fVxuIgotCQkrICJ9IjsKLQkJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICJ0ZXN0Njg6IGZ1bGwgcGFyc2UiOwotCWZ1bGxQYXJzZShzLHRlc3ROYW1lKTsKLQkJCQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlU3RhcnQgIiwgCi0JCTAsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOyAKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VFbmQgIiwgCi0JCTcxLCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRUcnVlKCJoYXMgbm8gc3VwZXJpbnRlcmZhY2VzICIgLCBjdXJyZW50VHlwZS5nZXRJbnRlcmZhY2VOYW1lcygpID09IG51bGwpOwotCi0JU291cmNlRmllbGRbXSBmaWVsZHMgPSBjdXJyZW50VHlwZS5nZXRGaWVsZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzID09IG51bGwpOwotCi0JU291cmNlTWV0aG9kW10gbWV0aG9kcyA9IGN1cnJlbnRUeXBlLmdldE1ldGhvZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZXRob2RzICIsIG1ldGhvZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCJoYXMgdHdvIG1ldGhvZHMiLCAyLCBtZXRob2RzLmxlbmd0aCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIGZvbyIsIDMwLCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCBmb28iLCA0MSwgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCB4IiwgNTQsIG1ldGhvZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIHgiLCA2MSwgbWV0aG9kc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCBmb28iLCAiZm9vIiwgbWV0aG9kc1swXS5nZXRBY3R1YWxOYW1lKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIHgiLCAieCIsIG1ldGhvZHNbMV0uZ2V0QWN0dWFsTmFtZSgpKTsKLQkJCi0JU291cmNlVHlwZVtdIG1lbWJlcnMgPSBjdXJyZW50VHlwZS5nZXRNZW1iZXJUeXBlcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1lbWJlcnMgIiwgbWVtYmVycyA9PSBudWxsKTsKLQkJCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBzb3VyY2UgIiArIHRlc3ROYW1lLCAKLQkJZXhwZWN0ZWRVbml0VG9TdHJpbmcsIAotCQljdXJyZW50VHlwZS50b1N0cmluZygpKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0NjkoKSB7Ci0KLQlTdHJpbmcgcyA9Ci0JCSJwdWJsaWMgaW50ZXJmYWNlIFggewkJCQkJCVxuIisKLQkJImZsb2F0IHk7CQkJCQkJCQkJXG4iKwotCQkiICAgaW50IGZvbygpCTsJCQkJCQkJXG4iKwotCQkiICAgaW50IHgoKTsJCQkJCQkJCVxuIisKLQkJIn0iOwotCQkJCi0JU3RyaW5nIGV4cGVjdGVkVW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgaW50ZXJmYWNlIFgge1xuIgotCQkrICJcdGZsb2F0IHk7XG4iCi0JCSsgIlx0aW50IGZvbygpIHt9XG4iCi0JCSsgIlx0aW50IHgoKSB7fVxuIgotCQkrICJ9IjsKLQkJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICJ0ZXN0Njk6IGZ1bGwgcGFyc2UiOwotCWZ1bGxQYXJzZShzLHRlc3ROYW1lKTsKLQkJCQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlU3RhcnQgIiwgCi0JCTAsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOyAKLQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VFbmQgIiwgCi0JCTg3LCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRUcnVlKCJoYXMgbm8gc3VwZXJpbnRlcmZhY2VzICIgLCBjdXJyZW50VHlwZS5nZXRJbnRlcmZhY2VOYW1lcygpID09IG51bGwpOwotCi0JU291cmNlRmllbGRbXSBmaWVsZHMgPSBjdXJyZW50VHlwZS5nZXRGaWVsZHMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiaGFzIG9uZSBmaWVsZCIsIDEsIGZpZWxkcy5sZW5ndGgpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgZmllbGQgeSIsIDI3LCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgZmllbGQgeSIsIDM0LCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlTb3VyY2VNZXRob2RbXSBtZXRob2RzID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1ldGhvZHMgIiwgbWV0aG9kcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoImhhcyB0d28gbWV0aG9kcyIsIDIsIG1ldGhvZHMubGVuZ3RoKTsKLQkKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgZm9vIiwgNDgsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgbWV0aG9kIGZvbyIsIDU4LCBtZXRob2RzWzBdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgbWV0aG9kIHgiLCA3MCwgbWV0aG9kc1sxXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgeCIsIDc3LCBtZXRob2RzWzFdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCIgSW52YWxpZCBhY3R1YWwgbmFtZSBmb3IgbWV0aG9kIGZvbyIsICJmb28iLCBtZXRob2RzWzBdLmdldEFjdHVhbE5hbWUoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgeCIsICJ4IiwgbWV0aG9kc1sxXS5nZXRBY3R1YWxOYW1lKCkpOwotCQkKLQlTb3VyY2VUeXBlW10gbWVtYmVycyA9IGN1cnJlbnRUeXBlLmdldE1lbWJlclR5cGVzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWVtYmVycyAiLCBtZW1iZXJzID09IG51bGwpOwotCQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIHNvdXJjZSAiICsgdGVzdE5hbWUsIAotCQlleHBlY3RlZFVuaXRUb1N0cmluZywgCi0JCWN1cnJlbnRUeXBlLnRvU3RyaW5nKCkpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3Q3MCgpIHsKLQotCVN0cmluZyBzID0KLQkJInB1YmxpYyBpbnRlcmZhY2UgWCB7CQkJCQkJXG4iKwotCQkiICAgaW50IGZvbygpOwkJCQkJCQkJXG4iKwotCQkiICAgaW50IHgoKTsJCQkJCQkJCVxuIisKLQkJIn0iOwotCQkJCi0JU3RyaW5nIGV4cGVjdGVkVW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgaW50ZXJmYWNlIFgge1xuIgotCQkrICJcdGludCBmb28oKSB7fVxuIgotCQkrICJcdGludCB4KCkge31cbiIKLQkJKyAifSI7Ci0JCQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAidGVzdDcwOiBmdWxsIHBhcnNlIjsKLQlmdWxsUGFyc2Uocyx0ZXN0TmFtZSk7Ci0JCQkJCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICIsIAotCQkwLCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsgCi0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlRW5kICIsIAotCQk2OSwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0VHJ1ZSgiaGFzIG5vIHN1cGVyaW50ZXJmYWNlcyAiICwgY3VycmVudFR5cGUuZ2V0SW50ZXJmYWNlTmFtZXMoKSA9PSBudWxsKTsKLQotCVNvdXJjZUZpZWxkW10gZmllbGRzID0gY3VycmVudFR5cGUuZ2V0RmllbGRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgZmllbGRzICIsIGZpZWxkcyA9PSBudWxsKTsKLQotCVNvdXJjZU1ldGhvZFtdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWV0aG9kcyAiLCBtZXRob2RzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiaGFzIHR3byBtZXRob2RzIiwgMiwgbWV0aG9kcy5sZW5ndGgpOwotCQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCBmb28iLCAzMCwgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgZm9vIiwgMzksIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgeCIsIDUyLCBtZXRob2RzWzFdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCB4IiwgNTksIG1ldGhvZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgZm9vIiwgImZvbyIsIG1ldGhvZHNbMF0uZ2V0QWN0dWFsTmFtZSgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCB4IiwgIngiLCBtZXRob2RzWzFdLmdldEFjdHVhbE5hbWUoKSk7Ci0JCQotCVNvdXJjZVR5cGVbXSBtZW1iZXJzID0gY3VycmVudFR5cGUuZ2V0TWVtYmVyVHlwZXMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZW1iZXJzICIsIG1lbWJlcnMgPT0gbnVsbCk7Ci0JCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgc291cmNlICIgKyB0ZXN0TmFtZSwgCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLCAKLQkJY3VycmVudFR5cGUudG9TdHJpbmcoKSk7IAotfQotcHVibGljIHZvaWQgdGVzdDcxKCkgewotCi0JU3RyaW5nIHMgPQotCQkicHVibGljIGludGVyZmFjZSBYIHsJCQkJCQlcbiIrCi0JCSIgICBpbnRbXSBpID0gOwkJCQkJCQkJXG4iKwotCQkiICAgaW50IGZvbygpIHt9CQkJCQkJCVxuIisKLQkJIiAgIGludCB4KCk7CQkJCQkJCQlcbiIrCi0JCSJ9IjsKLQkJCQotCVN0cmluZyBleHBlY3RlZFVuaXRUb1N0cmluZyA9IAotCQkicHVibGljIGludGVyZmFjZSBYIHtcbiIKLQkJKyAiXHRpbnRbXSBpO1xuIgotCQkrICJcdGphdmEubGFuZy5PYmplY3QoMClcbiIKLQkJKyAiXHRpbnQgZm9vKCkge31cbiIKLQkJKyAiXHRpbnQgeCgpIHt9XG4iCi0JCSsgIn0iOwotCQkJCi0JU3RyaW5nIHRlc3ROYW1lID0gInRlc3Q3MTogZnVsbCBwYXJzZSI7Ci0JZnVsbFBhcnNlKHMsdGVzdE5hbWUpOwotCQkJCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgY2xhc3MgZGVjbGFyYXRpb25Tb3VyY2VTdGFydCAiLCAKLQkJMCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7IAotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZUVuZCAiLCAKLQkJOTMsIAotCQljdXJyZW50VHlwZS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCWFzc2VydFRydWUoImhhcyBubyBzdXBlcmludGVyZmFjZXMgIiAsIGN1cnJlbnRUeXBlLmdldEludGVyZmFjZU5hbWVzKCkgPT0gbnVsbCk7Ci0KLQlTb3VyY2VGaWVsZFtdIGZpZWxkcyA9IGN1cnJlbnRUeXBlLmdldEZpZWxkcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIGZpZWxkcyAiLCBmaWVsZHMgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCJoYXMgb25lIGZpZWxkIiwgMSwgZmllbGRzLmxlbmd0aCk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBmaWVsZCBpIiwgMzAsIGZpZWxkc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBmaWVsZCBpIiwgNDksIGZpZWxkc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQotCVNvdXJjZU1ldGhvZFtdIG1ldGhvZHMgPSBjdXJyZW50VHlwZS5nZXRNZXRob2RzKCk7Ci0JYXNzZXJ0VHJ1ZSgiIGludmFsaWQgbWV0aG9kcyAiLCBtZXRob2RzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiaGFzIHR3byBtZXRob2RzIiwgMiwgbWV0aG9kcy5sZW5ndGgpOwotCQotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2Ugc3RhcnQgZm9yIG1ldGhvZCBmb28iLCA1MywgbWV0aG9kc1swXS5nZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBkZWNsYXJhdGlvbiBzb3VyY2UgZW5kIGZvciBtZXRob2QgZm9vIiwgNjQsIG1ldGhvZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBtZXRob2QgeCIsIDc2LCBtZXRob2RzWzFdLmdldERlY2xhcmF0aW9uU291cmNlU3RhcnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBlbmQgZm9yIG1ldGhvZCB4IiwgODMsIG1ldGhvZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIiBJbnZhbGlkIGFjdHVhbCBuYW1lIGZvciBtZXRob2QgZm9vIiwgImZvbyIsIG1ldGhvZHNbMF0uZ2V0QWN0dWFsTmFtZSgpKTsKLQotCWFzc2VydEVxdWFscygiIEludmFsaWQgYWN0dWFsIG5hbWUgZm9yIG1ldGhvZCB4IiwgIngiLCBtZXRob2RzWzFdLmdldEFjdHVhbE5hbWUoKSk7Ci0JCQotCVNvdXJjZVR5cGVbXSBtZW1iZXJzID0gY3VycmVudFR5cGUuZ2V0TWVtYmVyVHlwZXMoKTsKLQlhc3NlcnRUcnVlKCIgaW52YWxpZCBtZW1iZXJzICIsIG1lbWJlcnMgPT0gbnVsbCk7Ci0JCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgc291cmNlICIgKyB0ZXN0TmFtZSwgCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLCAKLQkJY3VycmVudFR5cGUudG9TdHJpbmcoKSk7IAotfQotcHVibGljIHZvaWQgdGVzdDcyKCkgewotCi0JU3RyaW5nIHMgPQotCQkicHVibGljIGNsYXNzIFggewkJCQkJCVxuIisKLQkJIiAgIFgoKSB7CQkJCQkJCQlcbiIgKwotCQkiICAgCXRoaXMoKTsJCQkJCQkJXG4iICsKLQkJIgl9CQkJCQkJCQkJXG4iICsKLQkJIn0iOwotCQkJCi0JU3RyaW5nIGV4cGVjdGVkVW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iCi0JCSsgIlx0WCgpIHtcbiIKLQkJKyAiXHRcdFgoMClcbiIKLQkJKyAiXHR9XG4iCi0JCSsgIn0iOwotCQkJCi0JU3RyaW5nIHRlc3ROYW1lID0gInRlc3Q3MjogZnVsbCBwYXJzZSI7Ci0JZnVsbFBhcnNlKHMsdGVzdE5hbWUpOwotCQkJCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgc291cmNlICIgKyB0ZXN0TmFtZSwgCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLCAKLQkJY3VycmVudFR5cGUudG9TdHJpbmcoKSk7IAotfQotcHVibGljIHZvaWQgdGVzdDczKCkgewotCi0JU3RyaW5nIHMgPQotCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBUb3RvIHsJCQlcbiIrCi0JCSIgICBYKCkgewkJCQkJCQkJXG4iICsKLQkJIiAgIAl0aGlzKCk7CQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCVxuIiArCi0JCSIgICBYKGludCBpKSB7CQkJCQkJCVxuIiArCi0JCSIgICAJc3VwZXIoKTsJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQlcbiIgKwotCQkiICAgWCgpIHsJCQkJCQkJCVxuIiArCi0JCSIgICAJdGhpcygwKTsJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQlcbiIgKwotCQkifSI7Ci0JCQkKLQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgVG90byB7XG4iCi0JCSsgIlx0WCgpIHtcbiIKLQkJKyAiXHRcdFgoMClcbiIKLQkJKyAiXHR9XG4iCi0JCSsgIlx0WChpbnQgaSwgKSB7XG4iCi0JCSsgIlx0XHRUb3RvKDApXG4iCi0JCSsgIlx0fVxuIgotCQkrICJcdFgoKSB7XG4iCi0JCSsgIlx0XHRYKDEpXG4iCi0JCSsgIlx0fVxuIgotCQkrICJ9IjsKLQkJCQotCVN0cmluZyB0ZXN0TmFtZSA9ICJ0ZXN0NzM6IGZ1bGwgcGFyc2UiOwotCWZ1bGxQYXJzZShzLHRlc3ROYW1lKTsKLQkJCQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIHNvdXJjZSAiICsgdGVzdE5hbWUsIAotCQlleHBlY3RlZFVuaXRUb1N0cmluZywgCi0JCWN1cnJlbnRUeXBlLnRvU3RyaW5nKCkpOyAKLX0KLXB1YmxpYyB2b2lkIHRlc3Q3NCgpIHsKLQotCVN0cmluZyBzID0KLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgVG90byB7CQkJXG4iKwotCQkiCWNsYXNzIFkgZXh0ZW5kcyBUaHJvd2FibGUgewkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCVxuIiArCi0JCSIgICBYKCkgewkJCQkJCQkJXG4iICsKLQkJIiAgIAl0aGlzKCk7CQkJCQkJCVxuIiArCi0JCSIJfQkJCQkJCQkJCVxuIiArCi0JCSIgICBYKGludCBpKSB7CQkJCQkJCVxuIiArCi0JCSIgICAJc3VwZXIoKTsJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQlcbiIgKwotCQkiICAgWCgpIHsJCQkJCQkJCVxuIiArCi0JCSIgICAJdGhpcygwKTsJCQkJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQlcbiIgKwotCQkiCXB1YmxpYyBPYmplY3QgZm9vKGludCBpKSB7CQkJXG4iICsKLQkJIgkJcmV0dXJuIG5ldyBPYmplY3QoKSB7fTsJCQlcbiIgKwotCQkiCX0JCQkJCQkJCQlcbiIgKwotCQkifSI7Ci0JCQkKLQlTdHJpbmcgZXhwZWN0ZWRVbml0VG9TdHJpbmcgPSAKLQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgVG90byB7XG4iCi0JCSsgIlx0Y2xhc3MgWSBleHRlbmRzIFRocm93YWJsZSB7XG4iCi0JCSsgIlx0XHRUaHJvd2FibGUoMClcbiIKLQkJKyAiXHR9XG4iCi0JCSsgIlx0WCgpIHtcbiIKLQkJKyAiXHRcdFgoMClcbiIKLQkJKyAiXHR9XG4iCi0JCSsgIlx0WChpbnQgaSwgKSB7XG4iCi0JCSsgIlx0XHRUb3RvKDApXG4iCi0JCSsgIlx0fVxuIgotCQkrICJcdFgoKSB7XG4iCi0JCSsgIlx0XHRYKDEpXG4iCi0JCSsgIlx0fVxuIgotCQkrICJcdHB1YmxpYyBPYmplY3QgZm9vKGludCBpLCApIHt9XG4iCi0JCSsgIn0iOwotCQkJCi0JU3RyaW5nIHRlc3ROYW1lID0gInRlc3Q3NDogZnVsbCBwYXJzZSI7Ci0JZnVsbFBhcnNlKHMsdGVzdE5hbWUpOwotCQkJCQotCWFzc2VydEVxdWFscygKLQkJIkludmFsaWQgc291cmNlICIgKyB0ZXN0TmFtZSwgCi0JCWV4cGVjdGVkVW5pdFRvU3RyaW5nLCAKLQkJY3VycmVudFR5cGUudG9TdHJpbmcoKSk7IAotfQotLyoKLSAqIGJ1Z3MgIDE2MTI2Ci0gKi8KLXB1YmxpYyB2b2lkIHRlc3Q3NSgpIHsKLQlTdHJpbmcgcyA9Ci0JCSJwdWJsaWMgY2xhc3MgUCNBRmllbGQge1xuIiArCi0JCSIJcHVibGljIHZvaWQgc2V0UCNBKFN0cmluZyBQI0EpIHtcbiIgKwotCQkiCQl0aGlzLlAjQSA9IFAjQTtcbiIgKwotCQkiCX1cbiIgKwkKLQkJIn0iOwotCQkJCi0JU3RyaW5nIGV4cGVjdGVkVW5pdFRvU3RyaW5nID0gCi0JCSJwdWJsaWMgY2xhc3MgUCB7XG4iICsKLQkJIgl7fVxuIiArCi0JCSIJcHVibGljIHZvaWQgc2V0UDtcbiIgKwotCQkiCWphdmEubGFuZy5PYmplY3QoMClcbiIgKwotCQkiCUEoU3RyaW5nIFAsICkge31cbiIgKwotCQkifSI7Ci0JCQkKLQlTdHJpbmcgdGVzdE5hbWUgPSAidGVzdDc1OiBmdWxsIHBhcnNlIjsKLQlmdWxsUGFyc2Uocyx0ZXN0TmFtZSk7Ci0JCQkJCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBzb3VyY2UgIiArIHRlc3ROYW1lLCAKLQkJZXhwZWN0ZWRVbml0VG9TdHJpbmcsIAotCQljdXJyZW50VHlwZS50b1N0cmluZygpKTsgCi19Ci1wdWJsaWMgdm9pZCB0ZXN0NzYoKSB7Ci0KLQlTdHJpbmcgcyA9IAotCQkiY2xhc3MgWCB7XG4iICsgCi0JCSIgIHB1YmxpYyBzdGF0aWMgaW50IGogPSAwO1xuIiArIAotCQkiICAvKiBzdGF0aWMgKi8ge1xuIiArICAKLQkJIiAgfSIgKyAgCi0JCSIgIHB1YmxpYyBzdGF0aWMgaW50IGkgPSA5O1xuIiArICAKLQkJIn1cbiI7IAotCi0JU3RyaW5nIGV4cGVjdGVkVW5pdFRvU3RyaW5nID0gCi0JCSJjbGFzcyBYIHtcbiIgKwotCQkiCXB1YmxpYyBzdGF0aWMgaW50IGo7XG4iICsKLQkJIgl7fVxuIiArCi0JCSIJcHVibGljIHN0YXRpYyBpbnQgaTtcbiIgKwotCQkiCWphdmEubGFuZy5PYmplY3QoMClcbiIgKwotCQkifSI7IAotCi0JU3RyaW5nIHRlc3ROYW1lID0gInRlc3QwMTogZnVsbCBwYXJzZSI7Ci0JZnVsbFBhcnNlKHMsdGVzdE5hbWUpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBjbGFzcyBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0ICIsIAotCQkwLCAKLQkJY3VycmVudFR5cGUuZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsgCi0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIGNsYXNzIGRlY2xhcmF0aW9uU291cmNlRW5kICIsIAotCQk4NCwgCi0JCWN1cnJlbnRUeXBlLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOyAKLQotCVNvdXJjZUZpZWxkW10gZmllbGRzID0gY3VycmVudFR5cGUuZ2V0RmllbGRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiaW52YWxpZCBmaWVsZHMgIiwgZmllbGRzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBmaWVsZHMgbGVuZ3RoICIsIDMsIGZpZWxkcy5sZW5ndGgpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgZmllbGQgaiIsIDEyLCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgZmllbGQgaiIsIDM1LCBmaWVsZHNbMF0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSk7Ci0KLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIHN0YXJ0IGZvciBpbml0aWFsaXplciIsIDM5LCBmaWVsZHNbMV0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmb3IgaW5pdGlhbGl6ZXIiLCA1NiwgZmllbGRzWzFdLmdldERlY2xhcmF0aW9uU291cmNlRW5kKCkpOwotCi0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGRlY2xhcmF0aW9uIHNvdXJjZSBzdGFydCBmb3IgZmllbGQgaSIsIDU5LCBmaWVsZHNbMl0uZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgZGVjbGFyYXRpb24gc291cmNlIGVuZCBmaWVsZCBpIiwgODIsIGZpZWxkc1syXS5nZXREZWNsYXJhdGlvblNvdXJjZUVuZCgpKTsKLQkKLQlTb3VyY2VNZXRob2RbXSBtZXRob2RzID0gY3VycmVudFR5cGUuZ2V0TWV0aG9kcygpOwotCWFzc2VydFRydWUoIiBpbnZhbGlkIG1ldGhvZHMgIiwgbWV0aG9kcyA9PSBudWxsKTsKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIHNvdXJjZSAiICsgdGVzdE5hbWUsIAotCQlleHBlY3RlZFVuaXRUb1N0cmluZywgCi0JCWN1cnJlbnRUeXBlLnRvU3RyaW5nKCkpOyAKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvU291cmNlRmllbGQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvU291cmNlRmllbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNjMzc4MC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL1NvdXJjZUZpZWxkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JU291cmNlRmllbGQ7Ci0KLXB1YmxpYyBjbGFzcyBTb3VyY2VGaWVsZCBpbXBsZW1lbnRzIElTb3VyY2VGaWVsZCwgSUNvbnN0YW50cyB7Ci0JcHJvdGVjdGVkIGludCBtb2RpZmllcnM7Ci0JcHJvdGVjdGVkIGNoYXJbXSB0eXBlTmFtZTsKLQlwcm90ZWN0ZWQgY2hhcltdIG5hbWU7Ci0JcHJvdGVjdGVkIGludCBkZWNsYXJhdGlvblN0YXJ0OwotCXByb3RlY3RlZCBpbnQgZGVjbGFyYXRpb25FbmQ7Ci0JcHJvdGVjdGVkIGludCBuYW1lU291cmNlU3RhcnQ7Ci0JcHJvdGVjdGVkIGludCBuYW1lU291cmNlRW5kOwotCXByb3RlY3RlZCBjaGFyW10gc291cmNlOwotcHVibGljIFNvdXJjZUZpZWxkKAotCWludCBkZWNsYXJhdGlvblN0YXJ0LAotCWludCBtb2RpZmllcnMsCi0JY2hhcltdIHR5cGVOYW1lLAotCWNoYXJbXSBuYW1lLAotCWludCBuYW1lU291cmNlU3RhcnQsCi0JaW50IG5hbWVTb3VyY2VFbmQsCi0JY2hhcltdIHNvdXJjZSkgewotCi0JdGhpcy5kZWNsYXJhdGlvblN0YXJ0ID0gZGVjbGFyYXRpb25TdGFydDsKLQl0aGlzLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKLQl0aGlzLnR5cGVOYW1lID0gdHlwZU5hbWU7Ci0JdGhpcy5uYW1lID0gbmFtZTsKLQl0aGlzLm5hbWVTb3VyY2VTdGFydCA9IG5hbWVTb3VyY2VTdGFydDsKLQl0aGlzLm5hbWVTb3VyY2VFbmQgPSBuYW1lU291cmNlRW5kOwotCXRoaXMuc291cmNlID0gc291cmNlOwotfQotcHVibGljIFN0cmluZyBkaXNwbGF5TW9kaWZpZXJzKCkgewotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQlpZiAodGhpcy5tb2RpZmllcnMgPT0gMCkKLQkJcmV0dXJuIG51bGw7Ci0JaWYgKCh0aGlzLm1vZGlmaWVycyAmIEFjY1B1YmxpYykgIT0gMCkKLQkJYnVmZmVyLmFwcGVuZCgicHVibGljICIpOwotCWlmICgodGhpcy5tb2RpZmllcnMgJiBBY2NQcm90ZWN0ZWQpICE9IDApCi0JCWJ1ZmZlci5hcHBlbmQoInByb3RlY3RlZCAiKTsKLQlpZiAoKHRoaXMubW9kaWZpZXJzICYgQWNjUHJpdmF0ZSkgIT0gMCkKLQkJYnVmZmVyLmFwcGVuZCgicHJpdmF0ZSAiKTsKLQlpZiAoKHRoaXMubW9kaWZpZXJzICYgQWNjRmluYWwpICE9IDApCi0JCWJ1ZmZlci5hcHBlbmQoImZpbmFsICIpOwotCWlmICgodGhpcy5tb2RpZmllcnMgJiBBY2NTdGF0aWMpICE9IDApCi0JCWJ1ZmZlci5hcHBlbmQoInN0YXRpYyAiKTsKLQlpZiAoKHRoaXMubW9kaWZpZXJzICYgQWNjQWJzdHJhY3QpICE9IDApCi0JCWJ1ZmZlci5hcHBlbmQoImFic3RyYWN0ICIpOwotCWlmICgodGhpcy5tb2RpZmllcnMgJiBBY2NOYXRpdmUpICE9IDApCi0JCWJ1ZmZlci5hcHBlbmQoIm5hdGl2ZSAiKTsKLQlpZiAoKHRoaXMubW9kaWZpZXJzICYgQWNjU3luY2hyb25pemVkKSAhPSAwKQotCQlidWZmZXIuYXBwZW5kKCJzeW5jaHJvbml6ZWQgIik7Ci0JcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotfQotcHVibGljIFN0cmluZyBnZXRBY3R1YWxOYW1lKCkgewotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JYnVmZmVyLmFwcGVuZChzb3VyY2UsIG5hbWVTb3VyY2VTdGFydCwgbmFtZVNvdXJjZUVuZCAtIG5hbWVTb3VyY2VTdGFydCArIDEpOwotCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLX0KLXB1YmxpYyBpbnQgZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSB7Ci0JcmV0dXJuIGRlY2xhcmF0aW9uRW5kOwotfQotcHVibGljIGludCBnZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkgewotCXJldHVybiBkZWNsYXJhdGlvblN0YXJ0OwotfQotcHVibGljIGNoYXJbXSBnZXRJbml0aWFsaXphdGlvblNvdXJjZSgpIHsKLQlyZXR1cm4gbnVsbDsKLX0KLXB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgewotCXJldHVybiBtb2RpZmllcnM7Ci19Ci1wdWJsaWMgY2hhcltdIGdldE5hbWUoKSB7Ci0JcmV0dXJuIG5hbWU7Ci19Ci1wdWJsaWMgaW50IGdldE5hbWVTb3VyY2VFbmQoKSB7Ci0JcmV0dXJuIG5hbWVTb3VyY2VFbmQ7Ci19Ci1wdWJsaWMgaW50IGdldE5hbWVTb3VyY2VTdGFydCgpIHsKLQlyZXR1cm4gbmFtZVNvdXJjZVN0YXJ0OwotfQotcHVibGljIGNoYXJbXSBnZXRUeXBlTmFtZSgpIHsKLQlyZXR1cm4gdHlwZU5hbWU7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBzZXREZWNsYXJhdGlvblNvdXJjZUVuZChpbnQgcG9zaXRpb24pIHsKLQlkZWNsYXJhdGlvbkVuZCA9IHBvc2l0aW9uOwotfQotcHVibGljIFN0cmluZyB0YWJTdHJpbmcoaW50IHRhYikgewotCS8qc2xvdyBjb2RlKi8KLQotCVN0cmluZyBzID0gIiI7Ci0JZm9yIChpbnQgaSA9IHRhYjsgaSA+IDA7IGktLSkKLQkJcyA9IHMgKyAiXHQiOwotCXJldHVybiBzOwotfQotcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlyZXR1cm4gdG9TdHJpbmcoMCk7Ci19Ci1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCWJ1ZmZlci5hcHBlbmQodGFiU3RyaW5nKHRhYikpOwotCVN0cmluZyBkaXNwbGF5TW9kaWZpZXJzID0gZGlzcGxheU1vZGlmaWVycygpOwotCWlmIChkaXNwbGF5TW9kaWZpZXJzICE9IG51bGwpIHsKLQkJYnVmZmVyLmFwcGVuZChkaXNwbGF5TW9kaWZpZXJzKTsKLQl9Ci0JYnVmZmVyLmFwcGVuZCh0eXBlTmFtZSkuYXBwZW5kKCIgIikuYXBwZW5kKG5hbWUpOwotCWJ1ZmZlci5hcHBlbmQoIjsiKTsKLQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL1NvdXJjZUltcG9ydC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3BhcnNlci9Tb3VyY2VJbXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEzNDljMC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL1NvdXJjZUltcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci5wYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBTb3VyY2VJbXBvcnQgewotCWludCBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0OwotCWludCBkZWNsYXJhdGlvblNvdXJjZUVuZDsKLQljaGFyW10gbmFtZTsKLQlib29sZWFuIG9uRGVtYW5kOwotCWludCBtb2RpZmllcnM7Ci0JY2hhcltdIHNvdXJjZTsKLS8qKgotICogQHBhcmFtIGRlY2xhcmF0aW9uU291cmNlU3RhcnQgaW50Ci0gKiBAcGFyYW0gZGVjbGFyYXRpb25Tb3VyY2VFbmQgaW50Ci0gKiBAcGFyYW0gbmFtZSBjaGFyW10KLSAqIEBwYXJhbSBvbkRlbWFuZCBib29sZWFuCi0gKi8KLXB1YmxpYyBTb3VyY2VJbXBvcnQoCi0JaW50IGRlY2xhcmF0aW9uU291cmNlU3RhcnQsIAotCWludCBkZWNsYXJhdGlvblNvdXJjZUVuZCwgCi0JY2hhcltdIG5hbWUsIAotCWJvb2xlYW4gb25EZW1hbmQsCi0JaW50IG1vZGlmaWVycywKLQljaGFyW10gc291cmNlKSB7Ci0KLQl0aGlzLmRlY2xhcmF0aW9uU291cmNlU3RhcnQgPSBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0OwotCXRoaXMuZGVjbGFyYXRpb25Tb3VyY2VFbmQgPSBkZWNsYXJhdGlvblNvdXJjZUVuZDsgCi0JdGhpcy5uYW1lID0gbmFtZTsKLQl0aGlzLm9uRGVtYW5kID0gb25EZW1hbmQ7Ci0JdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnM7Ci0JdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci19Ci0vKioKLSAqIAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlidWZmZXIKLQkJLmFwcGVuZCgKLQkJCXNvdXJjZSwgCi0JCQlkZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCAKLQkJCWRlY2xhcmF0aW9uU291cmNlRW5kIC0gZGVjbGFyYXRpb25Tb3VyY2VTdGFydCArIDEpCi0JCS5hcHBlbmQoIlxuIik7IAotCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvU291cmNlSW5pdGlhbGl6ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvU291cmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg0M2I3Mi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL1NvdXJjZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyLnBhcnNlcjsKLQotcHVibGljIGNsYXNzIFNvdXJjZUluaXRpYWxpemVyIGV4dGVuZHMgU291cmNlRmllbGQgewotcHVibGljIFNvdXJjZUluaXRpYWxpemVyKAotCWludCBkZWNsYXJhdGlvblN0YXJ0LCAKLQlpbnQgbW9kaWZpZXJzKSB7Ci0Jc3VwZXIoZGVjbGFyYXRpb25TdGFydCwgbW9kaWZpZXJzLCBudWxsLCBudWxsLCAtMSwgLTEsIG51bGwpOwotfQotCi1wdWJsaWMgdm9pZCBzZXREZWNsYXJhdGlvblNvdXJjZUVuZChpbnQgZGVjbGFyYXRpb25Tb3VyY2VFbmQpIHsKLQl0aGlzLmRlY2xhcmF0aW9uRW5kID0gZGVjbGFyYXRpb25Tb3VyY2VFbmQ7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IHRhYikgewotCWlmIChtb2RpZmllcnMgPT0gQWNjU3RhdGljKSB7Ci0JCXJldHVybiB0YWJTdHJpbmcodGFiKSArICJzdGF0aWMge30iOwotCX0KLQlyZXR1cm4gdGFiU3RyaW5nKHRhYikgKyAie30iOwotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3BhcnNlci9Tb3VyY2VNZXRob2QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvU291cmNlTWV0aG9kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYzZkZmQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3BhcnNlci9Tb3VyY2VNZXRob2QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyLnBhcnNlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklTb3VyY2VNZXRob2Q7Ci0KLXB1YmxpYyBjbGFzcyBTb3VyY2VNZXRob2QgaW1wbGVtZW50cyBJU291cmNlTWV0aG9kLCBJQ29uc3RhbnRzIHsKLQlwcml2YXRlIGludCBtb2RpZmllcnM7Ci0JcHJpdmF0ZSBpbnQgZGVjbGFyYXRpb25TdGFydDsKLQlwcml2YXRlIGludCBkZWNsYXJhdGlvbkVuZDsKLQlwcml2YXRlIGNoYXJbXSByZXR1cm5UeXBlTmFtZTsKLQlwcml2YXRlIGNoYXJbXSBzZWxlY3RvcjsKLQlwcml2YXRlIGludCBuYW1lU291cmNlU3RhcnQ7Ci0JcHJpdmF0ZSBpbnQgbmFtZVNvdXJjZUVuZDsKLQlwcml2YXRlIGNoYXJbXVtdIGFyZ3VtZW50VHlwZU5hbWVzOwotCXByaXZhdGUgY2hhcltdW10gYXJndW1lbnROYW1lczsKLQlwcml2YXRlIGNoYXJbXVtdIGV4Y2VwdGlvblR5cGVOYW1lczsKLQlwcml2YXRlIGNoYXJbXSBzb3VyY2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZXhwbGljaXRDb25zdHJ1Y3RvckNhbGw7Ci1wdWJsaWMgU291cmNlTWV0aG9kKAotCWludCBkZWNsYXJhdGlvblN0YXJ0LAotCWludCBtb2RpZmllcnMsCi0JY2hhcltdIHJldHVyblR5cGVOYW1lLAotCWNoYXJbXSBzZWxlY3RvciwKLQlpbnQgbmFtZVNvdXJjZVN0YXJ0LAotCWludCBuYW1lU291cmNlRW5kLAotCWNoYXJbXVtdIGFyZ3VtZW50VHlwZU5hbWVzLAotCWNoYXJbXVtdIGFyZ3VtZW50TmFtZXMsCi0JY2hhcltdW10gZXhjZXB0aW9uVHlwZU5hbWVzLAotCWNoYXJbXSBzb3VyY2UpIHsKLQotCXRoaXMuZGVjbGFyYXRpb25TdGFydCA9IGRlY2xhcmF0aW9uU3RhcnQ7Ci0JdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnM7Ci0JdGhpcy5yZXR1cm5UeXBlTmFtZSA9IHJldHVyblR5cGVOYW1lOwotCXRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjsKLQl0aGlzLm5hbWVTb3VyY2VTdGFydCA9IG5hbWVTb3VyY2VTdGFydDsKLQl0aGlzLm5hbWVTb3VyY2VFbmQgPSBuYW1lU291cmNlRW5kOwotCXRoaXMuYXJndW1lbnRUeXBlTmFtZXMgPSBhcmd1bWVudFR5cGVOYW1lczsKLQl0aGlzLmFyZ3VtZW50TmFtZXMgPSBhcmd1bWVudE5hbWVzOwotCXRoaXMuZXhjZXB0aW9uVHlwZU5hbWVzID0gZXhjZXB0aW9uVHlwZU5hbWVzOwotCXRoaXMuc291cmNlID0gc291cmNlOwotfQotcHVibGljIFN0cmluZyBkaXNwbGF5TW9kaWZpZXJzKCkgewotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQlpZiAodGhpcy5tb2RpZmllcnMgPT0gMCkKLQkJcmV0dXJuIG51bGw7Ci0JaWYgKCh0aGlzLm1vZGlmaWVycyAmIEFjY1B1YmxpYykgIT0gMCkKLQkJYnVmZmVyLmFwcGVuZCgicHVibGljICIpOwotCWlmICgodGhpcy5tb2RpZmllcnMgJiBBY2NQcm90ZWN0ZWQpICE9IDApCi0JCWJ1ZmZlci5hcHBlbmQoInByb3RlY3RlZCAiKTsKLQlpZiAoKHRoaXMubW9kaWZpZXJzICYgQWNjUHJpdmF0ZSkgIT0gMCkKLQkJYnVmZmVyLmFwcGVuZCgicHJpdmF0ZSAiKTsKLQlpZiAoKHRoaXMubW9kaWZpZXJzICYgQWNjRmluYWwpICE9IDApCi0JCWJ1ZmZlci5hcHBlbmQoImZpbmFsICIpOwotCWlmICgodGhpcy5tb2RpZmllcnMgJiBBY2NTdGF0aWMpICE9IDApCi0JCWJ1ZmZlci5hcHBlbmQoInN0YXRpYyAiKTsKLQlpZiAoKHRoaXMubW9kaWZpZXJzICYgQWNjQWJzdHJhY3QpICE9IDApCi0JCWJ1ZmZlci5hcHBlbmQoImFic3RyYWN0ICIpOwotCWlmICgodGhpcy5tb2RpZmllcnMgJiBBY2NOYXRpdmUpICE9IDApCi0JCWJ1ZmZlci5hcHBlbmQoIm5hdGl2ZSAiKTsKLQlpZiAoKHRoaXMubW9kaWZpZXJzICYgQWNjU3luY2hyb25pemVkKSAhPSAwKQotCQlidWZmZXIuYXBwZW5kKCJzeW5jaHJvbml6ZWQgIik7Ci0JaWYgKGJ1ZmZlci50b1N0cmluZygpLnRyaW0oKS5lcXVhbHMoIiIpKQotCQlyZXR1cm4gbnVsbDsKLQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCkudHJpbSgpOwotfQotcHVibGljIFN0cmluZyBnZXRBY3R1YWxOYW1lKCkgewotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JYnVmZmVyLmFwcGVuZChzb3VyY2UsIG5hbWVTb3VyY2VTdGFydCwgbmFtZVNvdXJjZUVuZCAtIG5hbWVTb3VyY2VTdGFydCArIDEpOwotCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLX0KLXB1YmxpYyBjaGFyW11bXSBnZXRBcmd1bWVudE5hbWVzKCkgewotCXJldHVybiBhcmd1bWVudE5hbWVzOwotfQotcHVibGljIGNoYXJbXVtdIGdldEFyZ3VtZW50VHlwZU5hbWVzKCkgewotCXJldHVybiBhcmd1bWVudFR5cGVOYW1lczsKLX0KLXB1YmxpYyBpbnQgZ2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoKSB7Ci0JcmV0dXJuIGRlY2xhcmF0aW9uRW5kOwotfQotcHVibGljIGludCBnZXREZWNsYXJhdGlvblNvdXJjZVN0YXJ0KCkgewotCXJldHVybiBkZWNsYXJhdGlvblN0YXJ0OwotfQotcHVibGljIGNoYXJbXVtdIGdldEV4Y2VwdGlvblR5cGVOYW1lcygpIHsKLQlyZXR1cm4gZXhjZXB0aW9uVHlwZU5hbWVzOwotfQotcHVibGljIGludCBnZXRNb2RpZmllcnMoKSB7Ci0JcmV0dXJuIG1vZGlmaWVyczsKLX0KLXB1YmxpYyBpbnQgZ2V0TmFtZVNvdXJjZUVuZCgpIHsKLQlyZXR1cm4gbmFtZVNvdXJjZUVuZDsKLX0KLXB1YmxpYyBpbnQgZ2V0TmFtZVNvdXJjZVN0YXJ0KCkgewotCXJldHVybiBuYW1lU291cmNlU3RhcnQ7Ci19Ci1wdWJsaWMgY2hhcltdIGdldFJldHVyblR5cGVOYW1lKCkgewotCXJldHVybiByZXR1cm5UeXBlTmFtZTsKLX0KLXB1YmxpYyBjaGFyW10gZ2V0U2VsZWN0b3IoKSB7Ci0JcmV0dXJuIHNlbGVjdG9yOwotfQotcHVibGljIGJvb2xlYW4gaXNDb25zdHJ1Y3RvcigpIHsKLQlyZXR1cm4gcmV0dXJuVHlwZU5hbWUgPT0gbnVsbDsKLX0KLXByb3RlY3RlZCB2b2lkIHNldERlY2xhcmF0aW9uU291cmNlRW5kKGludCBwb3NpdGlvbikgewotCWRlY2xhcmF0aW9uRW5kID0gcG9zaXRpb247Ci19Ci1wcm90ZWN0ZWQgdm9pZCBzZXRFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbChTdHJpbmcgcykgewotCWV4cGxpY2l0Q29uc3RydWN0b3JDYWxsID0gczsKLX0KLXB1YmxpYyBTdHJpbmcgdGFiU3RyaW5nKGludCB0YWIpIHsKLQkvKnNsb3cgY29kZSovCi0KLQlTdHJpbmcgcyA9ICIiOwotCWZvciAoaW50IGkgPSB0YWI7IGkgPiAwOyBpLS0pCi0JCXMgPSBzICsgIlx0IjsKLQlyZXR1cm4gczsKLX0KLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JcmV0dXJuIHRvU3RyaW5nKDApOwotfQotcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgdGFiKSB7Ci0JU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlidWZmZXIuYXBwZW5kKHRhYlN0cmluZyh0YWIpKTsKLQlTdHJpbmcgZGlzcGxheU1vZGlmaWVycyA9IGRpc3BsYXlNb2RpZmllcnMoKTsKLQlpZiAoZGlzcGxheU1vZGlmaWVycyAhPSBudWxsKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoZGlzcGxheU1vZGlmaWVycykuYXBwZW5kKCIgIik7Ci0JfQotCWlmIChyZXR1cm5UeXBlTmFtZSAhPSBudWxsKSB7Ci0JCWJ1ZmZlci5hcHBlbmQocmV0dXJuVHlwZU5hbWUpLmFwcGVuZCgiICIpOwotCX0KLQlidWZmZXIuYXBwZW5kKHNlbGVjdG9yKS5hcHBlbmQoIigiKTsKLQlpZiAoYXJndW1lbnRUeXBlTmFtZXMgIT0gbnVsbCkgewotCQlmb3IgKGludCBpID0gMCwgbWF4ID0gYXJndW1lbnRUeXBlTmFtZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCWJ1ZmZlci5hcHBlbmQoYXJndW1lbnRUeXBlTmFtZXNbaV0pLmFwcGVuZCgiICIpLmFwcGVuZCgKLQkJCQlhcmd1bWVudE5hbWVzW2ldKS5hcHBlbmQoCi0JCQkJIiwgIik7IAotCQl9Ci0JfQotCWJ1ZmZlci5hcHBlbmQoIikgIik7Ci0JaWYgKGV4Y2VwdGlvblR5cGVOYW1lcyAhPSBudWxsKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoInRocm93cyAiKTsKLQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGV4Y2VwdGlvblR5cGVOYW1lcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZChleGNlcHRpb25UeXBlTmFtZXNbaV0pLmFwcGVuZCgiLCAiKTsKLQkJfQotCX0KLQlpZiAoZXhwbGljaXRDb25zdHJ1Y3RvckNhbGwgIT0gbnVsbCkgewotCQlidWZmZXIuYXBwZW5kKCJ7XG4iKS5hcHBlbmQodGFiU3RyaW5nKHRhYisxKSkuYXBwZW5kKGV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKS5hcHBlbmQodGFiU3RyaW5nKHRhYikpLmFwcGVuZCgifSIpOwotCX0gZWxzZSB7Ci0JCWJ1ZmZlci5hcHBlbmQoInt9Iik7Ci0JfQotCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvU291cmNlUGFja2FnZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3BhcnNlci9Tb3VyY2VQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMmEwMzguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3BhcnNlci9Tb3VyY2VQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyLnBhcnNlcjsKLQotcHVibGljIGNsYXNzIFNvdXJjZVBhY2thZ2UgewotCWludCBkZWNsYXJhdGlvblNvdXJjZVN0YXJ0OwotCWludCBkZWNsYXJhdGlvblNvdXJjZUVuZDsKLQljaGFyW10gbmFtZTsKLQljaGFyW10gc291cmNlOwotLyoqCi0gKiBAcGFyYW0gZGVjbGFyYXRpb25Tb3VyY2VTdGFydCBpbnQKLSAqIEBwYXJhbSBkZWNsYXJhdGlvblNvdXJjZUVuZCBpbnQKLSAqIEBwYXJhbSBuYW1lIGNoYXJbXQotICogQHBhcmFtIG9uRGVtYW5kIGJvb2xlYW4KLSAqLwotcHVibGljIFNvdXJjZVBhY2thZ2UoCi0JaW50IGRlY2xhcmF0aW9uU291cmNlU3RhcnQsIAotCWludCBkZWNsYXJhdGlvblNvdXJjZUVuZCwgCi0JY2hhcltdIG5hbWUsCi0JY2hhcltdIHNvdXJjZSkgewotCi0JdGhpcy5kZWNsYXJhdGlvblNvdXJjZVN0YXJ0ID0gZGVjbGFyYXRpb25Tb3VyY2VTdGFydDsKLQl0aGlzLmRlY2xhcmF0aW9uU291cmNlRW5kID0gZGVjbGFyYXRpb25Tb3VyY2VFbmQ7IAotCXRoaXMubmFtZSA9IG5hbWU7Ci0JdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci19Ci0vKioKLSAqIAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlidWZmZXIKLQkJLmFwcGVuZCgKLQkJCXNvdXJjZSwgCi0JCQlkZWNsYXJhdGlvblNvdXJjZVN0YXJ0LCAKLQkJCWRlY2xhcmF0aW9uU291cmNlRW5kIC0gZGVjbGFyYXRpb25Tb3VyY2VTdGFydCArIDEpCi0JCS5hcHBlbmQoIlxuIik7IAotCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvU291cmNlVHlwZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3BhcnNlci9Tb3VyY2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwODJhOTcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3BhcnNlci9Tb3VyY2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Db21waWxlck1vZGlmaWVyczsKLQotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZVR5cGUgaW1wbGVtZW50cyBDb21waWxlck1vZGlmaWVycywgSUNvbnN0YW50cyB7Ci0JcHJpdmF0ZSBpbnQgbW9kaWZpZXJzOwotCXByaXZhdGUgaW50IGRlY2xhcmF0aW9uU3RhcnQ7Ci0JcHJpdmF0ZSBpbnQgZGVjbGFyYXRpb25FbmQ7Ci0JcHJpdmF0ZSBjaGFyW10gZmlsZU5hbWU7Ci0JcHJpdmF0ZSBTb3VyY2VQYWNrYWdlIHBhY2thZ2VOYW1lOwotCXByaXZhdGUgU291cmNlSW1wb3J0W10gaW1wb3J0czsKLQlwcml2YXRlIGNoYXJbXSBlbmNsb3NpbmdUeXBlTmFtZTsKLQlwcml2YXRlIGNoYXJbXSBuYW1lOwotCXByaXZhdGUgaW50IG5hbWVTb3VyY2VTdGFydDsKLQlwcml2YXRlIGludCBuYW1lU291cmNlRW5kOwotCXByaXZhdGUgY2hhcltdIHN1cGVyY2xhc3NOYW1lOwotCXByaXZhdGUgY2hhcltdW10gaW50ZXJmYWNlTmFtZXM7Ci0JcHJpdmF0ZSBTb3VyY2VUeXBlW10gbWVtYmVyVHlwZXM7Ci0JcHJpdmF0ZSBpbnQgbnVtYmVyT2ZNZW1iZXJUeXBlczsKLQlwcml2YXRlIFNvdXJjZU1ldGhvZFtdIG1ldGhvZHM7Ci0JcHJpdmF0ZSBpbnQgbnVtYmVyT2ZNZXRob2RzOwotCXByaXZhdGUgU291cmNlRmllbGRbXSBmaWVsZHM7Ci0JcHJpdmF0ZSBpbnQgbnVtYmVyT2ZGaWVsZHM7Ci0JcHJpdmF0ZSBjaGFyW10gc291cmNlOwotCVNvdXJjZVR5cGUgcGFyZW50OwotCi0JLy8gQnVmZmVyaW5nLgotCXByaXZhdGUgY2hhcltdIHF1YWxpZmllZE5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdENvbnN0cnVjdG9yOwotcHVibGljIFNvdXJjZVR5cGUoCi0JY2hhcltdIGVuY2xvc2luZ1R5cGVOYW1lLAotCWludCBkZWNsYXJhdGlvblN0YXJ0LAotCWludCBtb2RpZmllcnMsCi0JY2hhcltdIG5hbWUsCi0JaW50IG5hbWVTb3VyY2VTdGFydCwKLQlpbnQgbmFtZVNvdXJjZUVuZCwKLQljaGFyW10gc3VwZXJjbGFzc05hbWUsCi0JY2hhcltdW10gaW50ZXJmYWNlTmFtZXMsCi0JY2hhcltdIHNvdXJjZSkgewotCi0JdGhpcy5lbmNsb3NpbmdUeXBlTmFtZSA9IGVuY2xvc2luZ1R5cGVOYW1lOwotCXRoaXMuZGVjbGFyYXRpb25TdGFydCA9IGRlY2xhcmF0aW9uU3RhcnQ7Ci0KLQl0aGlzLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKLQl0aGlzLm5hbWUgPSBuYW1lOwotCXRoaXMubmFtZVNvdXJjZVN0YXJ0ID0gbmFtZVNvdXJjZVN0YXJ0OwotCXRoaXMubmFtZVNvdXJjZUVuZCA9IG5hbWVTb3VyY2VFbmQ7Ci0JdGhpcy5zdXBlcmNsYXNzTmFtZSA9IHN1cGVyY2xhc3NOYW1lOwotCXRoaXMuaW50ZXJmYWNlTmFtZXMgPSBpbnRlcmZhY2VOYW1lczsKLQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLX0KLXByb3RlY3RlZCB2b2lkIGFkZEZpZWxkKFNvdXJjZUZpZWxkIHNvdXJjZUZpZWxkKSB7Ci0JaWYgKGZpZWxkcyA9PSBudWxsKSB7Ci0JCWZpZWxkcyA9IG5ldyBTb3VyY2VGaWVsZFs0XTsKLQl9Ci0KLQlpZiAobnVtYmVyT2ZGaWVsZHMgPT0gZmllbGRzLmxlbmd0aCkgewotCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJZmllbGRzLCAKLQkJCTAsIAotCQkJZmllbGRzID0gbmV3IFNvdXJjZUZpZWxkW251bWJlck9mRmllbGRzICogMl0sIAotCQkJMCwgCi0JCQludW1iZXJPZkZpZWxkcyk7IAotCX0KLQlmaWVsZHNbbnVtYmVyT2ZGaWVsZHMrK10gPSBzb3VyY2VGaWVsZDsKLX0KLXByb3RlY3RlZCB2b2lkIGFkZE1lbWJlclR5cGUoU291cmNlVHlwZSBzb3VyY2VNZW1iZXJUeXBlKSB7Ci0JaWYobWVtYmVyVHlwZXMgPT0gbnVsbCkgewotCQltZW1iZXJUeXBlcyA9IG5ldyBTb3VyY2VUeXBlWzRdOwotCX0KLQotCWlmKG51bWJlck9mTWVtYmVyVHlwZXMgPT0gbWVtYmVyVHlwZXMubGVuZ3RoKSB7Ci0JCVN5c3RlbS5hcnJheWNvcHkobWVtYmVyVHlwZXMsIDAsIG1lbWJlclR5cGVzID0gbmV3IFNvdXJjZVR5cGVbbnVtYmVyT2ZNZW1iZXJUeXBlcyAqIDJdLCAwLCBudW1iZXJPZk1lbWJlclR5cGVzKTsKLQl9Ci0JbWVtYmVyVHlwZXNbbnVtYmVyT2ZNZW1iZXJUeXBlcysrXSA9IHNvdXJjZU1lbWJlclR5cGU7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBhZGRNZXRob2QoU291cmNlTWV0aG9kIHNvdXJjZU1ldGhvZCkgewotCWlmIChtZXRob2RzID09IG51bGwpIHsKLQkJbWV0aG9kcyA9IG5ldyBTb3VyY2VNZXRob2RbNF07Ci0JfQotCi0JaWYgKG51bWJlck9mTWV0aG9kcyA9PSBtZXRob2RzLmxlbmd0aCkgewotCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJbWV0aG9kcywgCi0JCQkwLCAKLQkJCW1ldGhvZHMgPSBuZXcgU291cmNlTWV0aG9kW251bWJlck9mTWV0aG9kcyAqIDJdLCAKLQkJCTAsIAotCQkJbnVtYmVyT2ZNZXRob2RzKTsgCi0JfQotCW1ldGhvZHNbbnVtYmVyT2ZNZXRob2RzKytdID0gc291cmNlTWV0aG9kOwotfQotcHVibGljIFN0cmluZyBkaXNwbGF5TW9kaWZpZXJzKCkgewotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQlpZiAodGhpcy5tb2RpZmllcnMgPT0gMCkKLQkJcmV0dXJuIG51bGw7Ci0JaWYgKCh0aGlzLm1vZGlmaWVycyAmIEFjY1B1YmxpYykgIT0gMCkKLQkJYnVmZmVyLmFwcGVuZCgicHVibGljICIpOwotCWlmICgodGhpcy5tb2RpZmllcnMgJiBBY2NQcm90ZWN0ZWQpICE9IDApCi0JCWJ1ZmZlci5hcHBlbmQoInByb3RlY3RlZCAiKTsKLQlpZiAoKHRoaXMubW9kaWZpZXJzICYgQWNjUHJpdmF0ZSkgIT0gMCkKLQkJYnVmZmVyLmFwcGVuZCgicHJpdmF0ZSAiKTsKLQlpZiAoKHRoaXMubW9kaWZpZXJzICYgQWNjRmluYWwpICE9IDApCi0JCWJ1ZmZlci5hcHBlbmQoImZpbmFsICIpOwotCWlmICgodGhpcy5tb2RpZmllcnMgJiBBY2NTdGF0aWMpICE9IDApCi0JCWJ1ZmZlci5hcHBlbmQoInN0YXRpYyAiKTsKLQlpZiAoKHRoaXMubW9kaWZpZXJzICYgQWNjQWJzdHJhY3QpICE9IDApCi0JCWJ1ZmZlci5hcHBlbmQoImFic3RyYWN0ICIpOwotCWlmICgodGhpcy5tb2RpZmllcnMgJiBBY2NOYXRpdmUpICE9IDApCi0JCWJ1ZmZlci5hcHBlbmQoIm5hdGl2ZSAiKTsKLQlpZiAoKHRoaXMubW9kaWZpZXJzICYgQWNjU3luY2hyb25pemVkKSAhPSAwKQotCQlidWZmZXIuYXBwZW5kKCJzeW5jaHJvbml6ZWQgIik7Ci0JcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpLnRyaW0oKTsKLX0KLXB1YmxpYyBTdHJpbmcgZ2V0QWN0dWFsTmFtZSgpIHsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCWJ1ZmZlci5hcHBlbmQoc291cmNlLCBuYW1lU291cmNlU3RhcnQsIG5hbWVTb3VyY2VFbmQgLSBuYW1lU291cmNlU3RhcnQgKyAxKTsKLQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci19Ci1wdWJsaWMgaW50IGdldERlY2xhcmF0aW9uU291cmNlRW5kKCkgewotCXJldHVybiBkZWNsYXJhdGlvbkVuZDsKLX0KLXB1YmxpYyBpbnQgZ2V0RGVjbGFyYXRpb25Tb3VyY2VTdGFydCgpIHsKLQlyZXR1cm4gZGVjbGFyYXRpb25TdGFydDsKLX0KLXB1YmxpYyBjaGFyW10gZ2V0RW5jbG9zaW5nVHlwZU5hbWUoKSB7Ci0JcmV0dXJuIGVuY2xvc2luZ1R5cGVOYW1lOwotfQotcHVibGljIFNvdXJjZUZpZWxkW10gZ2V0RmllbGRzKCkgewotCWlmIChmaWVsZHMgIT0gbnVsbCAmJiBmaWVsZHMubGVuZ3RoICE9IG51bWJlck9mRmllbGRzKSB7Ci0JCVN5c3RlbS5hcnJheWNvcHkoZmllbGRzLCAwLCBmaWVsZHMgPSBuZXcgU291cmNlRmllbGRbbnVtYmVyT2ZGaWVsZHNdLCAwLCBudW1iZXJPZkZpZWxkcyk7Ci0JfQotCXJldHVybiBmaWVsZHM7Ci19Ci1wdWJsaWMgY2hhcltdIGdldEZpbGVOYW1lKCkgewotCXJldHVybiBmaWxlTmFtZTsKLX0KLXB1YmxpYyBjaGFyW11bXSBnZXRJbXBvcnRzKCkgewotCWlmIChpbXBvcnRzID09IG51bGwpIHJldHVybiBudWxsOwotCWludCBpbXBvcnRMZW5ndGggPSBpbXBvcnRzLmxlbmd0aDsKLQljaGFyW11bXSBpbXBvcnROYW1lcyA9IG5ldyBjaGFyW2ltcG9ydExlbmd0aF1bXTsKLQlmb3IgKGludCBpID0gMCwgbWF4ID0gaW1wb3J0TGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJaW1wb3J0TmFtZXNbaV0gPSBpbXBvcnRzW2ldLm5hbWU7Ci0JfQotCXJldHVybiBpbXBvcnROYW1lczsKLX0KLXB1YmxpYyBjaGFyW11bXSBnZXRJbnRlcmZhY2VOYW1lcygpIHsKLQlyZXR1cm4gaW50ZXJmYWNlTmFtZXM7Ci19Ci1wdWJsaWMgU291cmNlVHlwZVtdIGdldE1lbWJlclR5cGVzKCkgewotCWlmIChtZW1iZXJUeXBlcyAhPSBudWxsICYmIG1lbWJlclR5cGVzLmxlbmd0aCAhPSBudW1iZXJPZk1lbWJlclR5cGVzKSB7Ci0JCVN5c3RlbS5hcnJheWNvcHkoCi0JCQltZW1iZXJUeXBlcywgCi0JCQkwLCAKLQkJCW1lbWJlclR5cGVzID0gbmV3IFNvdXJjZVR5cGVbbnVtYmVyT2ZNZW1iZXJUeXBlc10sIAotCQkJMCwgCi0JCQludW1iZXJPZk1lbWJlclR5cGVzKTsgCi0JfQotCXJldHVybiBtZW1iZXJUeXBlczsKLX0KLXB1YmxpYyBTb3VyY2VNZXRob2RbXSBnZXRNZXRob2RzKCkgewotCWlmIChtZXRob2RzICE9IG51bGwgJiYgbWV0aG9kcy5sZW5ndGggIT0gbnVtYmVyT2ZNZXRob2RzKSB7Ci0JCVN5c3RlbS5hcnJheWNvcHkobWV0aG9kcywgMCwgbWV0aG9kcyA9IG5ldyBTb3VyY2VNZXRob2RbbnVtYmVyT2ZNZXRob2RzXSwgMCwgbnVtYmVyT2ZNZXRob2RzKTsKLQl9Ci0JcmV0dXJuIG1ldGhvZHM7Ci19Ci1wdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKLQlyZXR1cm4gbW9kaWZpZXJzOwotfQotcHVibGljIGNoYXJbXSBnZXROYW1lKCkgewotCXJldHVybiBuYW1lOwotfQotcHVibGljIGludCBnZXROYW1lU291cmNlRW5kKCkgewotCXJldHVybiBuYW1lU291cmNlRW5kOwotfQotcHVibGljIGludCBnZXROYW1lU291cmNlU3RhcnQoKSB7Ci0JcmV0dXJuIG5hbWVTb3VyY2VTdGFydDsKLX0KLXB1YmxpYyBjaGFyW10gZ2V0UGFja2FnZU5hbWUoKSB7Ci0JcmV0dXJuIHBhY2thZ2VOYW1lLm5hbWU7Ci19Ci1wdWJsaWMgY2hhcltdIGdldFF1YWxpZmllZE5hbWUoKSB7Ci0JaWYgKHF1YWxpZmllZE5hbWUgPT0gbnVsbCkgewotCQlTdHJpbmdCdWZmZXIgdGVtcCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJdGVtcC5hcHBlbmQocGFja2FnZU5hbWUpOwotCQl0ZW1wLmFwcGVuZCgnLicpOwotCQl0ZW1wLmFwcGVuZChuYW1lKTsKLQkJcXVhbGlmaWVkTmFtZSA9IHRlbXAudG9TdHJpbmcoKS50b0NoYXJBcnJheSgpOwotCX0KLQlyZXR1cm4gcXVhbGlmaWVkTmFtZTsKLX0KLXB1YmxpYyBjaGFyW10gZ2V0U3VwZXJjbGFzc05hbWUoKSB7Ci0JcmV0dXJuIHN1cGVyY2xhc3NOYW1lOwotfQotcHVibGljIGJvb2xlYW4gaXNCaW5hcnlUeXBlKCkgewotCXJldHVybiBmYWxzZTsKLX0KLXB1YmxpYyBib29sZWFuIGlzQ2xhc3MoKSB7Ci0JcmV0dXJuIChtb2RpZmllcnMgJiBBY2NJbnRlcmZhY2UpID09IDA7Ci19Ci1wdWJsaWMgYm9vbGVhbiBpc0ludGVyZmFjZSgpIHsKLQlyZXR1cm4gKG1vZGlmaWVycyAmIEFjY0ludGVyZmFjZSkgPT0gQWNjSW50ZXJmYWNlOwotfQotcHVibGljIHZvaWQgc2V0RGVjbGFyYXRpb25Tb3VyY2VFbmQoaW50IHBvc2l0aW9uKSB7Ci0JZGVjbGFyYXRpb25FbmQgPSBwb3NpdGlvbjsKLX0KLXB1YmxpYyB2b2lkIHNldERlZmF1bHRDb25zdHJ1Y3RvcihTdHJpbmcgcykgewotCXRoaXMuZGVmYXVsdENvbnN0cnVjdG9yID0gczsKLX0KLXB1YmxpYyB2b2lkIHNldEltcG9ydHMoU291cmNlSW1wb3J0W10gaW1wb3J0cykgewotCXRoaXMuaW1wb3J0cyA9IGltcG9ydHM7Ci19Ci1wdWJsaWMgdm9pZCBzZXRQYWNrYWdlKFNvdXJjZVBhY2thZ2Ugc291cmNlUGFja2FnZSkgewotCXBhY2thZ2VOYW1lID0gc291cmNlUGFja2FnZTsKLX0KLXB1YmxpYyB2b2lkIHNldFN1cGVyY2xhc3MoY2hhcltdIHN1cGVyY2xhc3NOYW1lKSB7Ci0JdGhpcy5zdXBlcmNsYXNzTmFtZSA9IHN1cGVyY2xhc3NOYW1lOwotfQotcHVibGljIHZvaWQgc2V0U3VwZXJpbnRlcmZhY2VzKGNoYXJbXVtdIHN1cGVyaW50ZXJmYWNlc05hbWVzKSB7Ci0JdGhpcy5pbnRlcmZhY2VOYW1lcyA9IHN1cGVyaW50ZXJmYWNlc05hbWVzOwotfQotcHVibGljIFN0cmluZyB0YWJTdHJpbmcoaW50IHRhYikgewotCS8qc2xvdyBjb2RlKi8KLQotCVN0cmluZyBzID0gIiI7Ci0JZm9yIChpbnQgaSA9IHRhYjsgaSA+IDA7IGktLSkKLQkJcyA9IHMgKyAiXHQiOwotCXJldHVybiBzOwotfQotcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlyZXR1cm4gdG9TdHJpbmcoMCk7Ci19Ci1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCB0YWIpIHsKLQotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JaWYgKHBhY2thZ2VOYW1lICE9IG51bGwpIHsKLQkJYnVmZmVyLmFwcGVuZCh0YWJTdHJpbmcodGFiKSkuYXBwZW5kKHBhY2thZ2VOYW1lKTsKLQl9Ci0JaWYgKGltcG9ydHMgIT0gbnVsbCkgewotCQlmb3IgKGludCBpID0gMCwgbWF4ID0gaW1wb3J0cy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZCh0YWJTdHJpbmcodGFiKSkuYXBwZW5kKGltcG9ydHNbaV0pOwotCQl9Ci0JfQotCWJ1ZmZlci5hcHBlbmQodGFiU3RyaW5nKHRhYikpOwotCVN0cmluZyBkaXNwbGF5TW9kaWZpZXJzID0gZGlzcGxheU1vZGlmaWVycygpOwotCWlmIChkaXNwbGF5TW9kaWZpZXJzICE9IG51bGwpIHsKLQkJYnVmZmVyLmFwcGVuZChkaXNwbGF5TW9kaWZpZXJzKS5hcHBlbmQoIiAiKTsKLQl9Ci0JYnVmZmVyLmFwcGVuZChpc0ludGVyZmFjZSgpID8gImludGVyZmFjZSAiIDogImNsYXNzICIpLmFwcGVuZChuYW1lKS5hcHBlbmQoIiAiKTsKLQlpZiAoc3VwZXJjbGFzc05hbWUgIT0gbnVsbCkgewotCQlidWZmZXIuYXBwZW5kKCJleHRlbmRzICIpLmFwcGVuZChzdXBlcmNsYXNzTmFtZSkuYXBwZW5kKCIgIik7Ci0JfQotCWlmIChpbnRlcmZhY2VOYW1lcyAhPSBudWxsKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoImltcGxlbWVudHMgIik7Ci0JCWZvciAoaW50IGkgPSAwLCBtYXggPSBpbnRlcmZhY2VOYW1lcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZChpbnRlcmZhY2VOYW1lc1tpXSkuYXBwZW5kKCIsICIpOwotCQl9Ci0JfQotCWJ1ZmZlci5hcHBlbmQoIntcbiIpOwotCWlmIChtZW1iZXJUeXBlcyAhPSBudWxsKSB7Ci0JCWZvciAoaW50IGkgPSAwLCBtYXggPSBudW1iZXJPZk1lbWJlclR5cGVzOyBpIDwgbWF4OyBpKyspIHsKLQkJCWJ1ZmZlci5hcHBlbmQobWVtYmVyVHlwZXNbaV0udG9TdHJpbmcodGFiICsgMSkpLmFwcGVuZCgiXG4iKTsKLQkJfQotCX0KLQlpZiAoZmllbGRzICE9IG51bGwpIHsKLQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG51bWJlck9mRmllbGRzOyBpIDwgbWF4OyBpKyspIHsKLQkJCWJ1ZmZlci5hcHBlbmQoZmllbGRzW2ldLnRvU3RyaW5nKHRhYiArIDEpKS5hcHBlbmQoIlxuIik7Ci0JCX0KLQl9Ci0JaWYgKGRlZmF1bHRDb25zdHJ1Y3RvciAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKHRhYlN0cmluZyh0YWIgKyAxKSkuYXBwZW5kKGRlZmF1bHRDb25zdHJ1Y3Rvcik7CQkKLQl9Ci0JaWYgKG1ldGhvZHMgIT0gbnVsbCkgewotCQlmb3IgKGludCBpID0gMCwgbWF4ID0gbnVtYmVyT2ZNZXRob2RzOyBpIDwgbWF4OyBpKyspIHsKLQkJCWJ1ZmZlci5hcHBlbmQobWV0aG9kc1tpXS50b1N0cmluZyh0YWIgKyAxKSkuYXBwZW5kKCJcbiIpOwotCQl9Ci0JfQotCWJ1ZmZlci5hcHBlbmQodGFiU3RyaW5nKHRhYikpLmFwcGVuZCgifSIpOwotCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvU3ludGF4RXJyb3JUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL1N5bnRheEVycm9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjk2MDZhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvU3ludGF4RXJyb3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNvbXBpbGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5EZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5iYXRjaC5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5pbXBsLkNvbXBpbGVyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucGFyc2VyLlBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5EZWZhdWx0UHJvYmxlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5EZWZhdWx0UHJvYmxlbUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgU3ludGF4RXJyb3JUZXN0IGV4dGVuZHMgb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuanVuaXQuZXh0ZW5zaW9uLlRlc3RDYXNlIHsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3B0aW1pemVTdHJpbmdMaXRlcmFscyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgbG9uZyBzb3VyY2VMZXZlbCA9IENvbXBpbGVyT3B0aW9ucy5KREsxXzM7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgU3ludGF4RXJyb3JUZXN0KFN0cmluZyB0ZXN0TmFtZSl7Ci0Jc3VwZXIodGVzdE5hbWUpOwotfQotcHVibGljIHZvaWQgY2hlY2tQYXJzZSgKLQljaGFyW10gc291cmNlLCAKLQlTdHJpbmcgZXhwZWN0ZWRTeW50YXhFcnJvckRpYWdub3NpcywKLQlTdHJpbmcgdGVzdE5hbWUpIHsKLQotCS8qIHVzaW5nIHJlZ3VsYXIgcGFyc2VyIGluIERJRVQgbW9kZSAqLwotCVBhcnNlciBwYXJzZXIgPSAKLQkJbmV3IFBhcnNlcigKLQkJCW5ldyBQcm9ibGVtUmVwb3J0ZXIoCi0JCQkJRGVmYXVsdEVycm9ySGFuZGxpbmdQb2xpY2llcy5wcm9jZWVkV2l0aEFsbFByb2JsZW1zKCksIAotCQkJCW5ldyBDb21waWxlck9wdGlvbnMoKSwgCi0JCQkJbmV3IERlZmF1bHRQcm9ibGVtRmFjdG9yeShMb2NhbGUuZ2V0RGVmYXVsdCgpKSksCi0JCQlvcHRpbWl6ZVN0cmluZ0xpdGVyYWxzLAotCQkJc291cmNlTGV2ZWwpOwotCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IG5ldyBDb21waWxhdGlvblVuaXQoc291cmNlLCB0ZXN0TmFtZSwgbnVsbCk7Ci0JQ29tcGlsYXRpb25SZXN1bHQgY29tcGlsYXRpb25SZXN1bHQgPSBuZXcgQ29tcGlsYXRpb25SZXN1bHQoc291cmNlVW5pdCwgMCwgMCwgMCk7CQotCQotCXBhcnNlci5wYXJzZShzb3VyY2VVbml0LCBjb21waWxhdGlvblJlc3VsdCk7Ci0KLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigxMDApOwotCWlmIChjb21waWxhdGlvblJlc3VsdC5oYXNQcm9ibGVtcygpIHx8IGNvbXBpbGF0aW9uUmVzdWx0Lmhhc1Rhc2tzKCkpIHsKLQkJSVByb2JsZW1bXSBwcm9ibGVtcyA9IGNvbXBpbGF0aW9uUmVzdWx0LmdldEFsbFByb2JsZW1zKCk7Ci0JCWludCBjb3VudCA9IHByb2JsZW1zLmxlbmd0aDsKLQkJaW50IHByb2JsZW1Db3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeyAKLQkJCWlmIChwcm9ibGVtc1tpXSAhPSBudWxsKSB7Ci0JCQkJaWYgKHByb2JsZW1Db3VudCA9PSAwKQotCQkJCQlidWZmZXIuYXBwZW5kKCItLS0tLS0tLS0tXG4iKTsKLQkJCQlwcm9ibGVtQ291bnQrKzsKLQkJCQlidWZmZXIuYXBwZW5kKHByb2JsZW1Db3VudCArIChwcm9ibGVtc1tpXS5pc0Vycm9yKCkgPyAiLiBFUlJPUiIgOiAiLiBXQVJOSU5HIikpOwotCQkJCWJ1ZmZlci5hcHBlbmQoIiBpbiAiICsgbmV3IFN0cmluZyhwcm9ibGVtc1tpXS5nZXRPcmlnaW5hdGluZ0ZpbGVOYW1lKCkpKTsKLQkJCQl0cnkgewotCQkJCQlidWZmZXIuYXBwZW5kKCgoRGVmYXVsdFByb2JsZW0pcHJvYmxlbXNbaV0pLmVycm9yUmVwb3J0U291cmNlKGNvbXBpbGF0aW9uUmVzdWx0LmNvbXBpbGF0aW9uVW5pdCkpOwotCQkJCQlidWZmZXIuYXBwZW5kKCJcbiIpOwotCQkJCQlidWZmZXIuYXBwZW5kKHByb2JsZW1zW2ldLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlxuIik7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQkJYnVmZmVyLmFwcGVuZCgiLS0tLS0tLS0tLVxuIik7Ci0JCQl9Ci0JCX07Ci0JfQotCVN0cmluZyBjb21wdXRlZFN5bnRheEVycm9yRGlhZ25vc2lzID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gCS8vU3lzdGVtLm91dC5wcmludGxuKFV0aWwuZGlzcGxheVN0cmluZyhjb21wdXRlZFN5bnRheEVycm9yRGlhZ25vc2lzKSk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiSW52YWxpZCBzeW50YXggZXJyb3IgZGlhZ25vc2lzIiArIHRlc3ROYW1lLAotCQlleHBlY3RlZFN5bnRheEVycm9yRGlhZ25vc2lzLAotCQljb21wdXRlZFN5bnRheEVycm9yRGlhZ25vc2lzKTsKLX0KLS8qCi0gKiBTaG91bGQgZGlhZ25vc2UgcGFyZW50aGVzaXMgbWlzbWF0Y2gKLSAqLwotcHVibGljIHZvaWQgdGVzdDAxKCkgewotCi0JU3RyaW5nIHMgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHsJCQkJCQkJCVxuIisKLQkJIiBwdWJsaWMgdm9pZCBzb2x2ZSgpewkJCQkJCQlcbiIrCi0JCSIJCQkJCQkJCQkJCQlcbiIrCi0JCSIgIFhbXSByZXN1bHRzID0gbmV3IFhbMTBdOwkJCQkJCVxuIisKLQkJIiAgZm9yKGludCBpID0gMDsgaSA8IDEwOyBpKyspewkJCQkJXG4iKwotCQkiICAgWCByZXN1bHQgPSByZXN1bHRzW2ldOwkJCQkJCVxuIisKLQkJIiAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsJCQkJCQlcbiIrCi0JCSIgICBmb3IoaW50IGogPSAwOyBqIDwgMTA7IGorKyl7CQkJCVxuIisKLQkJIiAgICBpZiAodGhpcy5lcXVhbHMocmVzdWx0LmRvY3VtZW50TmFtZSl7CQlcbiIrCi0JCSIgICAgIGZvdW5kID0gdHJ1ZTsJCQkJCQkJCVxuIisKLQkJIiAgICAgYnJlYWs7CQkJCQkJCQkJXG4iKwotCQkiICAgIH0JCQkJCQkJCQkJCVxuIisKLQkJIiAgIH0JCQkJCQkJCQkJCVxuIisKLQkJIiAgfQkJCQkJCQkJCQkJXG4iKwotCQkiICByZXR1cm4gYW5kUmVzdWx0OwkJCQkJCQlcbiIrCi0JCSIgfQkJCQkJCQkJCQkJCVxuIisKLQkJIn0JCQkJCQkJCQkJCQlcbiI7IAkKLQotCVN0cmluZyBleHBlY3RlZFN5bnRheEVycm9yRGlhZ25vc2lzID0KLQkJIi0tLS0tLS0tLS1cbiIgKwotCQkiMS4gRVJST1IgaW4gPHBhcmVudGhlc2lzIG1pc21hdGNoPiAoYXQgbGluZSA5KVxuIiArIAotCQkiCWlmICh0aGlzLmVxdWFscyhyZXN1bHQuZG9jdW1lbnROYW1lKXsJCVxuIiArIAotCQkiCSAgIF5cbiIgKyAKLQkJIlVubWF0Y2hlZCBicmFja2V0XG4iICsgCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIyLiBFUlJPUiBpbiA8cGFyZW50aGVzaXMgbWlzbWF0Y2g+IChhdCBsaW5lIDkpXG4iICsgCi0JCSIJaWYgKHRoaXMuZXF1YWxzKHJlc3VsdC5kb2N1bWVudE5hbWUpewkJXG4iICsgCi0JCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXlxuIiArIAotCQkiU3ludGF4IGVycm9yIG9uIHRva2VuIFwie1wiLCBcIilcIiBleHBlY3RlZFxuIiArIAotCQkiLS0tLS0tLS0tLVxuIjsKLQotCVN0cmluZyB0ZXN0TmFtZSA9ICI8cGFyZW50aGVzaXMgbWlzbWF0Y2g+IjsKLQljaGVja1BhcnNlKAotCQlzLnRvQ2hhckFycmF5KCksCi0JCWV4cGVjdGVkU3ludGF4RXJyb3JEaWFnbm9zaXMsCi0JCXRlc3ROYW1lKTsKLX0KLS8qCi0gKiBTaG91bGQgZGlhZ25vc2UgYnJhY2UgbWlzbWF0Y2gKLSAqLwotcHVibGljIHZvaWQgdGVzdDAyKCkgewotCi0JU3RyaW5nIHMgPSAKLQkJImNsYXNzIEJhciB7CQkJXG4iKwkJCQkKLQkJIglCYXIoKSB7CQkJCVxuIisKLQkJIgkJdGhpcyhmcmVkKCkueHspO1xuIisKLQkJIgl9CQkJCQlcbiIrCQkJCQkJCi0JCSJ9CQkJCQkJXG4iOyAJCi0KLQlTdHJpbmcgZXhwZWN0ZWRTeW50YXhFcnJvckRpYWdub3NpcyA9Ci0JCSItLS0tLS0tLS0tXG4iICsKLQkJIjEuIEVSUk9SIGluIDxicmFjZSBtaXNtYXRjaD4gKGF0IGxpbmUgMylcbiIgKyAKLQkJIgl0aGlzKGZyZWQoKS54eyk7XG4iICsgCi0JCSIJICAgIF5cbiIgKyAKLQkJIlVubWF0Y2hlZCBicmFja2V0XG4iICsgCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIyLiBFUlJPUiBpbiA8YnJhY2UgbWlzbWF0Y2g+IChhdCBsaW5lIDMpXG4iICsgCi0JCSIJdGhpcyhmcmVkKCkueHspO1xuIiArIAotCQkiCSAgICAgICAgICAgICBeXG4iICsgCi0JCSJTeW50YXggZXJyb3Igb24gdG9rZW4gXCJ7XCIsIFwiKVwiIGV4cGVjdGVkXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxicmFjZSBtaXNtYXRjaD4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWRTeW50YXhFcnJvckRpYWdub3NpcywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIFNob3VsZCBkaWFnbm9zZSBwYXJlbnRoZXNpcyBtaXNtYXRjaAotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDMoKSB7Ci0KLQlTdHJpbmcgcyA9IAotCQkicHVibGljIGNsYXNzIFggeyAvLyBzaG91bGQgY29tcGxhaW4JXG4iKwotCQkiCWludCBmb28oCQkJCQkJCVxuIisKLQkJIgkJWyBhcmcxLCAJCQkJCQlcbiIrCi0JCSIJCXsgYXJnMiwgXQkJCQkJCVxuIisKLQkJIgkJICBhcmczLCAJCQkJCQlcbiIrCi0JCSIJKXsJCQkJCQkJCQlcbiIrCi0JCSIJfQkJCQkJCQkJCVxuIisKLQkJIn0JCQkJCQkJCQkJXG4iOyAJCi0KLQlTdHJpbmcgZXhwZWN0ZWRTeW50YXhFcnJvckRpYWdub3NpcyA9Ci0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIxLiBFUlJPUiBpbiA8cGFyZW50aGVzaXMgbWlzbWF0Y2g+IChhdCBsaW5lIDIpXG4iICsgCi0JCSIJaW50IGZvbygJCQkJCQkJXG4iICsgCi0JCSIJICAgICAgIF5cbiIgKyAKLQkJIlVubWF0Y2hlZCBicmFja2V0XG4iICsgCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIyLiBFUlJPUiBpbiA8cGFyZW50aGVzaXMgbWlzbWF0Y2g+IChhdCBsaW5lIDMpXG4iICsgCi0JCSIJWyBhcmcxLCAJCQkJCQlcbiIgKyAKLQkJIgleXG4iICsgCi0JCSJTeW50YXggZXJyb3Igb24gdG9rZW4gXCJbXCIsIFwiZmxvYXRcIiwgXCJkb3VibGVcIiwgXCJieXRlXCIsIFwic2hvcnRcIiwgXCJpbnRcIiwgXCJsb25nXCIsIFwiY2hhclwiLCBcImJvb2xlYW5cIiwgXCJ2b2lkXCIsIFwiSWRlbnRpZmllclwiIGV4cGVjdGVkXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iOwotCi0JU3RyaW5nIHRlc3ROYW1lID0gIjxwYXJlbnRoZXNpcyBtaXNtYXRjaD4iOwotCWNoZWNrUGFyc2UoCi0JCXMudG9DaGFyQXJyYXkoKSwKLQkJZXhwZWN0ZWRTeW50YXhFcnJvckRpYWdub3NpcywKLQkJdGVzdE5hbWUpOwotfQotLyoKLSAqIFNob3VsZCBub3QgZGlhZ25vc2UgcGFyZW50aGVzaXMgbWlzbWF0Y2gKLSAqLwotcHVibGljIHZvaWQgdGVzdDA0KCkgewotCi0JU3RyaW5nIHMgPSAKLQkJInB1YmxpYyBjbGFzcyBYIHsgLy8gc2hvdWxkIG5vdCBjb21wbGFpbglcbiIrCi0JCSIJaW50IGZvbygJCQkJCQkJCVxuIisKLQkJIgkJeyBhcmcxLCAJCQkJCQkJXG4iKwotCQkiCQl7IGFyZzIsIH0JCQkJCQkJXG4iKwotCQkiCQkgIGFyZzMsIH0JCQkJCQkJXG4iKwotCQkiCSl7CQkJCQkJCQkJCVxuIisKLQkJIgl9CQkJCQkJCQkJCVxuIisKLQkJIn0JCQkJCQkJCQkJCVxuIjsgCQotCi0JU3RyaW5nIGV4cGVjdGVkU3ludGF4RXJyb3JEaWFnbm9zaXMgPQotCQkiLS0tLS0tLS0tLVxuIiArIAotCQkiMS4gRVJST1IgaW4gPG5vIHBhcmVudGhlc2lzIG1pc21hdGNoPiAoYXQgbGluZSAzKVxuIiArIAotCQkiCXsgYXJnMSwgCQkJCQkJCVxuIiArIAotCQkiCV5cbiIgKyAKLQkJIlN5bnRheCBlcnJvciBvbiB0b2tlbiBcIntcIiwgXCJmbG9hdFwiLCBcImRvdWJsZVwiLCBcImJ5dGVcIiwgXCJzaG9ydFwiLCBcImludFwiLCBcImxvbmdcIiwgXCJjaGFyXCIsIFwiYm9vbGVhblwiLCBcInZvaWRcIiwgXCJJZGVudGlmaWVyXCIgZXhwZWN0ZWRcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiI7Ci0KLQlTdHJpbmcgdGVzdE5hbWUgPSAiPG5vIHBhcmVudGhlc2lzIG1pc21hdGNoPiI7Ci0JY2hlY2tQYXJzZSgKLQkJcy50b0NoYXJBcnJheSgpLAotCQlleHBlY3RlZFN5bnRheEVycm9yRGlhZ25vc2lzLAotCQl0ZXN0TmFtZSk7Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL1Rlc3RBbGwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvVGVzdEFsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDhmNjJmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9wYXJzZXIvVGVzdEFsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci5wYXJzZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmp1bml0LmV4dGVuc2lvbi5FeGNsdWRlZFRlc3RTdWl0ZTsKLQotLyoqCi0gKiBSdW4gYWxsIHBhcnNlciByZWdyZXNzaW9uIHRlc3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0QWxsIGV4dGVuZHMgVGVzdENhc2UgewotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBFWFBFUlQ7IC8vIGFuIGV4cGVydCBkb2Vzbid0IGV4Y2x1ZGUgYW55IHRlc3RzCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBFWENMVURFRF9URVNUUyA9IG5ldyBTdHJpbmdbXSB7Ci0JCSJDb21wbGV0aW9uUGFyc2VyVGVzdCIsICJ0ZXN0VkJfMiIsIC8vIGNvbXBsZXRpb24gb24gZmllbGQgYWNjZXNzIG9uIGFub255bW91cyBpbm5lciBjbGFzcyB3aXRoIHN5bnRheCBlcnJvcgotCQkiQ29tcGxldGlvblBhcnNlclRlc3QiLCAidGVzdFZCXzQiLCAvLyBjb21wbGV0aW9uIG9uIGZpZWxkIGFjY2VzcyBvbiBhbm9ueW1vdXMgaW5uZXIgY2xhc3Mgd2l0aCBzeW50YXggZXJyb3IKLQkJIkNvbXBsZXRpb25QYXJzZXJUZXN0IiwgInRlc3RWQl81IiwgLy8gY29tcGxldGlvbiBvbiBmaWVsZCBhY2Nlc3Mgb24gYW5vbnltb3VzIGlubmVyIGNsYXNzIHdpdGggc3ludGF4IGVycm9yCi0JCSJMYWJlbFN0YXRlbWVudENvbXBsZXRpb25UZXN0IiwgInRlc3RJbkxhYmVsZWRJbm5lckNsYXNzV2l0aEVycm9yQmVmb3JlIiwgLy8gY2Fubm90IGdldCBsYWJlbHMgaW4gcmVjb3ZlcnkgbW9kZSB5ZXQKLQl9OwotLyoqCi0gKiBUZXN0QWxsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gdGVzdE5hbWUgamF2YS5sYW5nLlN0cmluZwotICovCi1wdWJsaWMgVGVzdEFsbChTdHJpbmcgdGVzdE5hbWUpIHsKLQlzdXBlcih0ZXN0TmFtZSk7Ci19Ci0vKioKLSAqIEFkZHMgYWxsIHRoZSB0ZXN0cyBpbiB0aGUgZ2l2ZW4gY2xhc3MgdG8gdGhlIHN1aXRlIGV4Y2VwdAotICogdGhlIG9uZXMgdGhhdCBhcmUgZXhjbHVkZWQuCi0gKi8KLXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRUZXN0KFRlc3RTdWl0ZSBzdWl0ZSwgQ2xhc3MgdGVzdENsYXNzKSB7Ci0JVGVzdFN1aXRlIGlubmVyU3VpdGUgPSBuZXcgVGVzdFN1aXRlKHRlc3RDbGFzcyk7Ci0Jc3VpdGUuYWRkVGVzdChpbm5lclN1aXRlKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKFRlc3RBbGwuY2xhc3MuZ2V0TmFtZSgpKTsKLQkKLQkvKiBjb21wbGV0aW9uIHRlc3RzICovCi0JYWRkVGVzdChzdWl0ZSwgQWxsb2NhdGlvbkV4cHJlc3Npb25Db21wbGV0aW9uVGVzdC5jbGFzcyk7Ci0JYWRkVGVzdChzdWl0ZSwgQ2xhc3NMaXRlcmFsQWNjZXNzQ29tcGxldGlvblRlc3QuY2xhc3MpOwotCWFkZFRlc3Qoc3VpdGUsIENvbXBsZXRpb25QYXJzZXJUZXN0LmNsYXNzKTsKLQlhZGRUZXN0KHN1aXRlLCBDb21wbGV0aW9uUmVjb3ZlcnlUZXN0LmNsYXNzKTsKLQlhZGRUZXN0KHN1aXRlLCBEaWV0Q29tcGxldGlvblRlc3QuY2xhc3MpOwotCWFkZFRlc3Qoc3VpdGUsIEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uQ29tcGxldGlvblRlc3QuY2xhc3MpOwotCWFkZFRlc3Qoc3VpdGUsIEZpZWxkQWNjZXNzQ29tcGxldGlvblRlc3QuY2xhc3MpOwotCWFkZFRlc3Qoc3VpdGUsIElubmVyVHlwZUNvbXBsZXRpb25UZXN0LmNsYXNzKTsKLQlhZGRUZXN0KHN1aXRlLCBMYWJlbFN0YXRlbWVudENvbXBsZXRpb25UZXN0LmNsYXNzKTsKLQlhZGRUZXN0KHN1aXRlLCBNZXRob2RJbnZvY2F0aW9uQ29tcGxldGlvblRlc3QuY2xhc3MpOwotCWFkZFRlc3Qoc3VpdGUsIE5hbWVSZWZlcmVuY2VDb21wbGV0aW9uVGVzdC5jbGFzcyk7Ci0JYWRkVGVzdChzdWl0ZSwgUmVmZXJlbmNlVHlwZUNvbXBsZXRpb25UZXN0LmNsYXNzKTsKLQlhZGRUZXN0KHN1aXRlLCBDb21wbGV0aW9uUGFyc2VyVGVzdDIuY2xhc3MpOwotCWFkZFRlc3Qoc3VpdGUsIENvbXBsZXRpb25QYXJzZXJUZXN0S2V5d29yZC5jbGFzcyk7Ci0KLQkvKiBzZWxlY3Rpb24gdGVzdHMgKi8KLQlhZGRUZXN0KHN1aXRlLCBFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvblNlbGVjdGlvblRlc3QuY2xhc3MpOwotCWFkZFRlc3Qoc3VpdGUsIFNlbGVjdGlvblRlc3QuY2xhc3MpOwotCWFkZFRlc3Qoc3VpdGUsIFNlbGVjdGlvblRlc3QyLmNsYXNzKTsKLQotCS8qIHJlY292ZXJ5IHRlc3RzICovCi0JYWRkVGVzdChzdWl0ZSwgRGlldFJlY292ZXJ5VGVzdC5jbGFzcyk7Ci0KLQkvKiBzb3VyY2UgZWxlbWVudCBwYXJzZXIgdGVzdHMgKi8KLQlhZGRUZXN0KHN1aXRlLCBTb3VyY2VFbGVtZW50UGFyc2VyVGVzdC5jbGFzcyk7Ci0KLQkvKiBzeW50YXggZXJyb3IgZGlhZ25vc2lzIHRlc3RzICovCi0JYWRkVGVzdChzdWl0ZSwgU3ludGF4RXJyb3JUZXN0LmNsYXNzKTsKLQotCWlmIChFWFBFUlQpIHsKLQkJcmV0dXJuIHN1aXRlOwotCX0gZWxzZSB7Ci0JCXJldHVybiBuZXcgRXhjbHVkZWRUZXN0U3VpdGUoc3VpdGUsIEVYQ0xVREVEX1RFU1RTKTsKLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL1Rlc3RTb3VyY2VFbGVtZW50UmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcGFyc2VyL1Rlc3RTb3VyY2VFbGVtZW50UmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMmM5MDguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3BhcnNlci9UZXN0U291cmNlRWxlbWVudFJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIucGFyc2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklTb3VyY2VFbGVtZW50UmVxdWVzdG9yOwotCi1wdWJsaWMgY2xhc3MgVGVzdFNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IgaW1wbGVtZW50cyBJU291cmNlRWxlbWVudFJlcXVlc3RvciB7Ci0vKioKLSAqIER1bW15U291cmNlRWxlbWVudFJlcXVlc3RvciBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgVGVzdFNvdXJjZUVsZW1lbnRSZXF1ZXN0b3IoKSB7Ci0Jc3VwZXIoKTsKLX0KLS8qKgotICogYWNjZXB0Q29uc3RydWN0b3JSZWZlcmVuY2UgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyB2b2lkIGFjY2VwdENvbnN0cnVjdG9yUmVmZXJlbmNlKGNoYXJbXSB0eXBlTmFtZSwgaW50IGFyZ0NvdW50LCBpbnQgc291cmNlUG9zaXRpb24pIHt9Ci0vKioKLSAqIGFjY2VwdEZpZWxkUmVmZXJlbmNlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgdm9pZCBhY2NlcHRGaWVsZFJlZmVyZW5jZShjaGFyW10gZmllbGROYW1lLCBpbnQgc291cmNlUG9zaXRpb24pIHt9Ci0vKioKLSAqIGFjY2VwdEltcG9ydCBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHZvaWQgYWNjZXB0SW1wb3J0KGludCBkZWNsYXJhdGlvblN0YXJ0LCBpbnQgZGVjbGFyYXRpb25FbmQsIGNoYXJbXSBuYW1lLCBib29sZWFuIG9uRGVtYW5kLCBpbnQgbW9kaWZpZXJzKSB7fQotLyoqCi0gKiBhY2NlcHRMaW5lU2VwYXJhdG9yUG9zaXRpb25zIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgdm9pZCBhY2NlcHRMaW5lU2VwYXJhdG9yUG9zaXRpb25zKGludFtdIHBvc2l0aW9ucykge30KLS8qKgotICogYWNjZXB0TWV0aG9kUmVmZXJlbmNlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgdm9pZCBhY2NlcHRNZXRob2RSZWZlcmVuY2UoY2hhcltdIG1ldGhvZE5hbWUsIGludCBhcmdDb3VudCwgaW50IHNvdXJjZVBvc2l0aW9uKSB7fQotLyoqCi0gKiBhY2NlcHRQYWNrYWdlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgdm9pZCBhY2NlcHRQYWNrYWdlKGludCBkZWNsYXJhdGlvblN0YXJ0LCBpbnQgZGVjbGFyYXRpb25FbmQsIGNoYXJbXSBuYW1lKSB7fQotLyoqCi0gKiBhY2NlcHRQcm9ibGVtIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgdm9pZCBhY2NlcHRQcm9ibGVtKElQcm9ibGVtIHByb2JsZW0pIHt9Ci0vKioKLSAqIGFjY2VwdFR5cGVSZWZlcmVuY2UgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyB2b2lkIGFjY2VwdFR5cGVSZWZlcmVuY2UoY2hhcltdW10gdHlwZU5hbWUsIGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCkge30KLS8qKgotICogYWNjZXB0VHlwZVJlZmVyZW5jZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHZvaWQgYWNjZXB0VHlwZVJlZmVyZW5jZShjaGFyW10gdHlwZU5hbWUsIGludCBzb3VyY2VQb3NpdGlvbikge30KLS8qKgotICogYWNjZXB0VW5rbm93blJlZmVyZW5jZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHZvaWQgYWNjZXB0VW5rbm93blJlZmVyZW5jZShjaGFyW11bXSBuYW1lLCBpbnQgc291cmNlU3RhcnQsIGludCBzb3VyY2VFbmQpIHt9Ci0vKioKLSAqIGFjY2VwdFVua25vd25SZWZlcmVuY2UgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyB2b2lkIGFjY2VwdFVua25vd25SZWZlcmVuY2UoY2hhcltdIG5hbWUsIGludCBzb3VyY2VQb3NpdGlvbikge30KLS8qKgotICogZW50ZXJDbGFzcyBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHZvaWQgZW50ZXJDbGFzcyhpbnQgZGVjbGFyYXRpb25TdGFydCwgaW50IG1vZGlmaWVycywgY2hhcltdIG5hbWUsIGludCBuYW1lU291cmNlU3RhcnQsIGludCBuYW1lU291cmNlRW5kLCBjaGFyW10gc3VwZXJjbGFzcywgY2hhcltdW10gc3VwZXJpbnRlcmZhY2VzKSB7fQotLyoqCi0gKiBlbnRlckNvbXBpbGF0aW9uVW5pdCBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHZvaWQgZW50ZXJDb21waWxhdGlvblVuaXQoKSB7fQotLyoqCi0gKiBlbnRlckNvbnN0cnVjdG9yIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgdm9pZCBlbnRlckNvbnN0cnVjdG9yKGludCBkZWNsYXJhdGlvblN0YXJ0LCBpbnQgbW9kaWZpZXJzLCBjaGFyW10gbmFtZSwgaW50IG5hbWVTb3VyY2VTdGFydCwgaW50IG5hbWVTb3VyY2VFbmQsIGNoYXJbXVtdIHBhcmFtZXRlclR5cGVzLCBjaGFyW11bXSBwYXJhbWV0ZXJOYW1lcywgY2hhcltdW10gZXhjZXB0aW9uVHlwZXMpIHt9Ci0vKioKLSAqIGVudGVyRmllbGQgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyB2b2lkIGVudGVyRmllbGQoaW50IGRlY2xhcmF0aW9uU3RhcnQsIGludCBtb2RpZmllcnMsIGNoYXJbXSB0eXBlLCBjaGFyW10gbmFtZSwgaW50IG5hbWVTb3VyY2VTdGFydCwgaW50IG5hbWVTb3VyY2VFbmQpIHt9Ci0vKioKLSAqIGVudGVySW50ZXJmYWNlIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgdm9pZCBlbnRlckludGVyZmFjZShpbnQgZGVjbGFyYXRpb25TdGFydCwgaW50IG1vZGlmaWVycywgY2hhcltdIG5hbWUsIGludCBuYW1lU291cmNlU3RhcnQsIGludCBuYW1lU291cmNlRW5kLCBjaGFyW11bXSBzdXBlcmludGVyZmFjZXMpIHt9Ci0vKioKLSAqIGVudGVyTWV0aG9kIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgdm9pZCBlbnRlck1ldGhvZChpbnQgZGVjbGFyYXRpb25TdGFydCwgaW50IG1vZGlmaWVycywgY2hhcltdIHJldHVyblR5cGUsIGNoYXJbXSBuYW1lLCBpbnQgbmFtZVNvdXJjZVN0YXJ0LCBpbnQgbmFtZVNvdXJjZUVuZCwgY2hhcltdW10gcGFyYW1ldGVyVHlwZXMsIGNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLCBjaGFyW11bXSBleGNlcHRpb25UeXBlcykge30KLS8qKgotICogZXhpdENsYXNzIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgdm9pZCBleGl0Q2xhc3MoaW50IGRlY2xhcmF0aW9uRW5kKSB7fQotLyoqCi0gKiBleGl0Q29tcGlsYXRpb25Vbml0IG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgdm9pZCBleGl0Q29tcGlsYXRpb25Vbml0KGludCBkZWNsYXJhdGlvbkVuZCkge30KLS8qKgotICogZXhpdENvbnN0cnVjdG9yIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgdm9pZCBleGl0Q29uc3RydWN0b3IoaW50IGRlY2xhcmF0aW9uRW5kKSB7fQotLyoqCi0gKiBleGl0RmllbGQgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyB2b2lkIGV4aXRGaWVsZChpbnQgaW5pdGlhbGl6YXRpb25TdGFydCwgaW50IGRlY2xhcmF0aW9uRW5kLCBpbnQgZGVjbGFyYXRpb25Tb3VyY2VFbmQpIHt9Ci0vKioKLSAqIGV4aXRJbnRlcmZhY2UgbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyB2b2lkIGV4aXRJbnRlcmZhY2UoaW50IGRlY2xhcmF0aW9uRW5kKSB7fQotLyoqCi0gKiBleGl0TWV0aG9kIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgdm9pZCBleGl0TWV0aG9kKGludCBkZWNsYXJhdGlvbkVuZCkge30KLQotLyoqCi0gKiBlbnRlckluaXRpYWxpemVyIG1ldGhvZCBjb21tZW50LgotICovCi1wdWJsaWMgdm9pZCBlbnRlckluaXRpYWxpemVyKGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCkgewotfQotCi0vKioKLSAqIGV4aXRJbml0aWFsaXplciBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIHZvaWQgZXhpdEluaXRpYWxpemVyKGludCBzb3VyY2VFbmQpIHsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3JlZ3Jlc3Npb24vQWJzdHJhY3RSZWdyZXNzaW9uVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3JlZ3Jlc3Npb24vQWJzdHJhY3RSZWdyZXNzaW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjEzZTQ3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9yZWdyZXNzaW9uL0Fic3RyYWN0UmVncmVzc2lvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyLnJlZ3Jlc3Npb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklOYW1lRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuanVuaXQuZXh0ZW5zaW9uLlN0b3BhYmxlVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5iYXRjaC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uRGVmYXVsdFByb2JsZW1GYWN0b3J5OwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZWdyZXNzaW9uVGVzdCBleHRlbmRzIFN0b3BhYmxlVGVzdENhc2UgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9VVFBVVF9ESVIgPSBVdGlsLmdldE91dHB1dERpcmVjdG9yeSgpICsgRmlsZS5zZXBhcmF0b3IgKyAicmVncmVzc2lvbiI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19MSUJfUEFUSCA9IFV0aWwuZ2V0SmF2YUNsYXNzTGliKCk7Ci0KLQlwcm90ZWN0ZWQgSU5hbWVFbnZpcm9ubWVudCBqYXZhQ2xhc3NMaWI7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIGNsYXNzcGF0aHM7Ci0JcHJvdGVjdGVkIFRlc3RWZXJpZmllciB2ZXJpZmllcjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjcmVhdGVkVmVyaWZpZXI7Ci1wdWJsaWMgQWJzdHJhY3RSZWdyZXNzaW9uVGVzdChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHJvdGVjdGVkIENvbXBpbGF0aW9uVW5pdFtdIGNvbXBpbGF0aW9uVW5pdHMoU3RyaW5nW10gdGVzdEZpbGVzKSB7Ci0JaW50IGxlbmd0aCA9IChpbnQpKHRlc3RGaWxlcy5sZW5ndGggLyAyKTsKLQlDb21waWxhdGlvblVuaXRbXSByZXN1bHQgPSBuZXcgQ29tcGlsYXRpb25Vbml0W2xlbmd0aF07Ci0JaW50IGluZGV4ID0gMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCXJlc3VsdFtpXSA9IG5ldyBDb21waWxhdGlvblVuaXQodGVzdEZpbGVzW2luZGV4ICsgMV0udG9DaGFyQXJyYXkoKSwgdGVzdEZpbGVzW2luZGV4XSwgbnVsbCk7Ci0JCWluZGV4ICs9IDI7Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci1wcm90ZWN0ZWQgSU5hbWVFbnZpcm9ubWVudFtdIGdldENsYXNzTGlicygpIHsKLQlTdHJpbmcgZW5jb2RpbmcgPSAoU3RyaW5nKSBnZXRDb21waWxlck9wdGlvbnMoKS5nZXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9FbmNvZGluZyk7Ci0JaWYgKCIiLmVxdWFscyhlbmNvZGluZykpIGVuY29kaW5nID0gbnVsbDsKLQkKLQlpbnQgbGVuZ3RoID0gdGhpcy5jbGFzc3BhdGhzLmxlbmd0aDsKLQlJTmFtZUVudmlyb25tZW50W10gY2xhc3NMaWJzID0gbmV3IElOYW1lRW52aXJvbm1lbnRbbGVuZ3RoXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCVN0cmluZyBjbGFzc3BhdGggPSB0aGlzLmNsYXNzcGF0aHNbaV07Ci0JCWlmIChjbGFzc3BhdGguZXF1YWxzKEpBVkFfQ0xBU1NfTElCX1BBVEgpKSB7Ci0JCQlpZiAodGhpcy5qYXZhQ2xhc3NMaWIgPT0gbnVsbCkgewotCQkJCXRoaXMuamF2YUNsYXNzTGliID0KLQkJCQkJbmV3IEZpbGVTeXN0ZW0oCi0JCQkJCQluZXcgU3RyaW5nW10ge2NsYXNzcGF0aH0sIAotCQkJCQkJbmV3IFN0cmluZ1tdIHt9LCAvLyBpZ25vcmUgaW5pdGlhbCBmaWxlIG5hbWVzCi0JCQkJCQllbmNvZGluZyAvLyBkZWZhdWx0IGVuY29kaW5nCi0JCQkJKTsKLQkJCX0KLQkJCWNsYXNzTGlic1tpXSA9IHRoaXMuamF2YUNsYXNzTGliOwotCQl9IGVsc2UgewotCQkJY2xhc3NMaWJzW2ldID0KLQkJCQluZXcgRmlsZVN5c3RlbSgKLQkJCQkJbmV3IFN0cmluZ1tdIHtjbGFzc3BhdGh9LCAKLQkJCQkJbmV3IFN0cmluZ1tdIHt9LCAvLyBpZ25vcmUgaW5pdGlhbCBmaWxlIG5hbWVzCi0JCQkJCWVuY29kaW5nIC8vIGRlZmF1bHQgZW5jb2RpbmcJCQkKLQkJCQkpOwotCQl9Ci0JfQotCXJldHVybiBjbGFzc0xpYnM7Ci19Ci1wcm90ZWN0ZWQgTWFwIGdldENvbXBpbGVyT3B0aW9ucygpIHsKLQkJTWFwIGRlZmF1bHRPcHRpb25zID0gTWFpbi5nZXREZWZhdWx0T3B0aW9ucygpOwotCQlkZWZhdWx0T3B0aW9ucy5wdXQoCi0JCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX0xvY2FsVmFyaWFibGVBdHRyaWJ1dGUsCi0JCQlDb21waWxlck9wdGlvbnMuR0VORVJBVEUpOwotCQlkZWZhdWx0T3B0aW9ucy5wdXQoCi0JCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVudXNlZFByaXZhdGVNZW1iZXIsIAotCQkJQ29tcGlsZXJPcHRpb25zLldBUk5JTkcpOwotCQlkZWZhdWx0T3B0aW9ucy5wdXQoCi0JCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydExvY2FsVmFyaWFibGVIaWRpbmcsCi0JCQlDb21waWxlck9wdGlvbnMuV0FSTklORyk7Ci0JCWRlZmF1bHRPcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0RmllbGRIaWRpbmcsCi0JCQlDb21waWxlck9wdGlvbnMuV0FSTklORyk7Ci0JCWRlZmF1bHRPcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0UG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQsCi0JCQlDb21waWxlck9wdGlvbnMuV0FSTklORyk7Ci0JCWRlZmF1bHRPcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0U3ludGhldGljQWNjZXNzRW11bGF0aW9uLAotCQkJQ29tcGlsZXJPcHRpb25zLldBUk5JTkcpOwotCQlkZWZhdWx0T3B0aW9ucy5wdXQoCi0JCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1ByZXNlcnZlVW51c2VkTG9jYWwsIAotCQkJQ29tcGlsZXJPcHRpb25zLlBSRVNFUlZFKTsKLQkJcmV0dXJuIGRlZmF1bHRPcHRpb25zOwotfQotcHJvdGVjdGVkIFN0cmluZ1tdIGdldERlZmF1bHRDbGFzc1BhdGhzKCkgewotCXJldHVybiBuZXcgU3RyaW5nW10ge0pBVkFfQ0xBU1NfTElCX1BBVEgsIE9VVFBVVF9ESVJ9OyAKLX0KLXByb3RlY3RlZCBJRXJyb3JIYW5kbGluZ1BvbGljeSBnZXRFcnJvckhhbmRsaW5nUG9saWN5KCkgewotCXJldHVybiBuZXcgSUVycm9ySGFuZGxpbmdQb2xpY3koKSB7Ci0JCXB1YmxpYyBib29sZWFuIHN0b3BPbkZpcnN0RXJyb3IoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gcHJvY2VlZE9uRXJyb3JzKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9OwotfQotLyoKLSAqIFdpbGwgY29uc2lkZXIgZmlyc3QgdGhlIHNvdXJjZSB1bml0cyBwYXNzZWQgYXMgYXJndW1lbnRzLCB0aGVuCi0gKiBpbnZlc3RpZ2F0ZSB0aGUgY2xhc3NwYXRoOiBqZGtsaWIgKyBvdXRwdXQgZGlyIAotICovCi1wcm90ZWN0ZWQgSU5hbWVFbnZpcm9ubWVudCBnZXROYW1lRW52aXJvbm1lbnQoZmluYWwgU3RyaW5nW10gdGVzdEZpbGVzLCBTdHJpbmdbXSBjbGFzc1BhdGhzKSB7Ci0JdGhpcy5jbGFzc3BhdGhzID0gCi0JCWNsYXNzUGF0aHMgPT0gbnVsbCA/IAotCQkJdGhpcy5nZXREZWZhdWx0Q2xhc3NQYXRocygpIDoKLQkJCWNsYXNzUGF0aHM7Ci0JcmV0dXJuIAotCQluZXcgSW5NZW1vcnlOYW1lRW52aXJvbm1lbnQoCi0JCQl0ZXN0RmlsZXMsIAotCQkJdGhpcy5nZXRDbGFzc0xpYnMoKQotCQkpOwotfQotcHJvdGVjdGVkIElQcm9ibGVtRmFjdG9yeSBnZXRQcm9ibGVtRmFjdG9yeSgpIHsKLQlyZXR1cm4gbmV3IERlZmF1bHRQcm9ibGVtRmFjdG9yeShMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKLX0KLXByb3RlY3RlZCBSZXF1ZXN0b3IgZ2V0UmVxdWVzdG9yKElQcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeSkgewotCXJldHVybiBuZXcgUmVxdWVzdG9yKHByb2JsZW1GYWN0b3J5LCBPVVRQVVRfRElSLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSA/IE9VVFBVVF9ESVIgOiBPVVRQVVRfRElSICsgRmlsZS5zZXBhcmF0b3IsIGZhbHNlKTsKLX0KLQotcHJvdGVjdGVkIFJlcXVlc3RvciBnZXRSZXF1ZXN0b3IoSVByb2JsZW1GYWN0b3J5IHByb2JsZW1GYWN0b3J5LCBib29sZWFuIGdlbmVyYXRlT3V0UHV0KSB7Ci0JcmV0dXJuIG5ldyBSZXF1ZXN0b3IocHJvYmxlbUZhY3RvcnksIE9VVFBVVF9ESVIuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpID8gT1VUUFVUX0RJUiA6IE9VVFBVVF9ESVIgKyBGaWxlLnNlcGFyYXRvciwgZ2VuZXJhdGVPdXRQdXQpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5Db25mb3JtVGVzdChTdHJpbmdbXSB0ZXN0RmlsZXMpIHsKLQl0aGlzLnJ1bkNvbmZvcm1UZXN0KHRlc3RGaWxlcywgbnVsbCwgbnVsbCwgdHJ1ZSwgbnVsbCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1bkNvbmZvcm1UZXN0KFN0cmluZ1tdIHRlc3RGaWxlcywgU3RyaW5nW10gdm1Bcmd1bWVudHMpIHsKLQl0aGlzLnJ1bkNvbmZvcm1UZXN0KHRlc3RGaWxlcywgbnVsbCwgbnVsbCwgdHJ1ZSwgdm1Bcmd1bWVudHMpOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuQ29uZm9ybVRlc3QoU3RyaW5nW10gdGVzdEZpbGVzLCBTdHJpbmcgZXhwZWN0ZWRTdWNjZXNzT3V0cHV0U3RyaW5nLCBTdHJpbmdbXSB2bUFyZ3VtZW50cykgewotCXRoaXMucnVuQ29uZm9ybVRlc3QodGVzdEZpbGVzLCBleHBlY3RlZFN1Y2Nlc3NPdXRwdXRTdHJpbmcsIG51bGwsIHRydWUsIHZtQXJndW1lbnRzKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuQ29uZm9ybVRlc3QoU3RyaW5nW10gdGVzdEZpbGVzLCBTdHJpbmcgZXhwZWN0ZWRTdWNjZXNzT3V0cHV0U3RyaW5nKSB7Ci0JdGhpcy5ydW5Db25mb3JtVGVzdCh0ZXN0RmlsZXMsIGV4cGVjdGVkU3VjY2Vzc091dHB1dFN0cmluZywgbnVsbCwgdHJ1ZSwgbnVsbCk7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5Db25mb3JtVGVzdChTdHJpbmdbXSB0ZXN0RmlsZXMsIFN0cmluZyBleHBlY3RlZFN1Y2Nlc3NPdXRwdXRTdHJpbmcsIFN0cmluZ1tdIGNsYXNzTGliLCBib29sZWFuIHNob3VsZEZsdXNoT3V0cHV0RGlyZWN0b3J5LCBTdHJpbmdbXSB2bUFyZ3VtZW50cykgewotCXRoaXMucnVuQ29uZm9ybVRlc3QoIHRlc3RGaWxlcywgIGV4cGVjdGVkU3VjY2Vzc091dHB1dFN0cmluZywgY2xhc3NMaWIsICBzaG91bGRGbHVzaE91dHB1dERpcmVjdG9yeSwgdm1Bcmd1bWVudHMsIG51bGwpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5Db25mb3JtVGVzdChTdHJpbmdbXSB0ZXN0RmlsZXMsIFN0cmluZyBleHBlY3RlZFN1Y2Nlc3NPdXRwdXRTdHJpbmcsIFN0cmluZ1tdIGNsYXNzTGliLCBib29sZWFuIHNob3VsZEZsdXNoT3V0cHV0RGlyZWN0b3J5LCBTdHJpbmdbXSB2bUFyZ3VtZW50cywgTWFwIGN1c3RvbU9wdGlvbnMpIHsKLQotCWlmIChzaG91bGRGbHVzaE91dHB1dERpcmVjdG9yeSkgVXRpbC5mbHVzaERpcmVjdG9yeUNvbnRlbnQobmV3IEZpbGUoT1VUUFVUX0RJUikpOwotCQotCUlQcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeSA9IGdldFByb2JsZW1GYWN0b3J5KCk7Ci0JTG9nUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBMb2dSZXF1ZXN0b3IocHJvYmxlbUZhY3RvcnksIE9VVFBVVF9ESVIuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpID8gT1VUUFVUX0RJUiA6IE9VVFBVVF9ESVIgKyBGaWxlLnNlcGFyYXRvcik7Ci0JCi0JTWFwIG9wdGlvbnMgPSBnZXRDb21waWxlck9wdGlvbnMoKTsKLQlpZiAoY3VzdG9tT3B0aW9ucyAhPSBudWxsKXsKLQkJb3B0aW9ucy5wdXRBbGwoY3VzdG9tT3B0aW9ucyk7Ci0JfQotCUNvbXBpbGVyIGJhdGNoQ29tcGlsZXIgPQotCQluZXcgQ29tcGlsZXIoCi0JCQlnZXROYW1lRW52aXJvbm1lbnQobmV3IFN0cmluZ1tdIHt9LCBjbGFzc0xpYiksCi0JCQlnZXRFcnJvckhhbmRsaW5nUG9saWN5KCksCi0JCQlvcHRpb25zLAotCQkJcmVxdWVzdG9yLAotCQkJcHJvYmxlbUZhY3RvcnkpOwotCWJhdGNoQ29tcGlsZXIuY29tcGlsZShjb21waWxhdGlvblVuaXRzKHRlc3RGaWxlcykpOyAvLyBjb21waWxlIGFsbCBmaWxlcyB0b2dldGhlcgotCWlmICghcmVxdWVzdG9yLmhhc0Vycm9ycykgewotCQlTdHJpbmcgc291cmNlRmlsZSA9IHRlc3RGaWxlc1swXTsKLQkJCi0JCS8vIENvbXB1dGUgY2xhc3MgbmFtZSBieSByZW1vdmluZyAiLmphdmEiIGFuZCByZXBsYWNpbmcgc2xhc2hlcyB3aXRoIGRvdHMKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IHNvdXJjZUZpbGUuc3Vic3RyaW5nKDAsIHNvdXJjZUZpbGUubGVuZ3RoKCkgLSA1KS5yZXBsYWNlKCcvJywgJy4nKS5yZXBsYWNlKCdcXCcsICcuJyk7Ci0KLQkJaWYgKHZtQXJndW1lbnRzICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLnZlcmlmaWVyICE9IG51bGwpIHsKLQkJCQl0aGlzLnZlcmlmaWVyLnNodXREb3duKCk7Ci0JCQl9Ci0JCQl0aGlzLnZlcmlmaWVyID0gbmV3IFRlc3RWZXJpZmllcihmYWxzZSk7Ci0JCQl0aGlzLmNyZWF0ZWRWZXJpZmllciA9IHRydWU7Ci0JCX0JCQotCQlib29sZWFuIHBhc3NlZCA9IHRoaXMudmVyaWZpZXIudmVyaWZ5Q2xhc3NGaWxlcyhzb3VyY2VGaWxlLCBjbGFzc05hbWUsIGV4cGVjdGVkU3VjY2Vzc091dHB1dFN0cmluZywgdGhpcy5jbGFzc3BhdGhzLCBudWxsLCB2bUFyZ3VtZW50cyk7Ci0JCWFzc2VydFRydWUoCi0JCQl0aGlzLnZlcmlmaWVyLmZhaWx1cmVSZWFzb24sIC8vIGNvbXB1dGVkIGJ5IHZlcmlmeUNsYXNzRmlsZXMoLi4uKSBhY3Rpb24KLQkJCXBhc3NlZAotCQkpOwotCQlpZiAodm1Bcmd1bWVudHMgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMudmVyaWZpZXIgIT0gbnVsbCkgewotCQkJCXRoaXMudmVyaWZpZXIuc2h1dERvd24oKTsKLQkJCX0KLQkJCXRoaXMudmVyaWZpZXIgPSBuZXcgVGVzdFZlcmlmaWVyKGZhbHNlKTsKLQkJCXRoaXMuY3JlYXRlZFZlcmlmaWVyID0gdHJ1ZTsKLQkJfQkJCi0JfSBlbHNlIHsKLQkJYXNzZXJ0VHJ1ZSgiVW5leHBlY3RlZCBwcm9ibGVtczogIiArIHJlcXVlc3Rvci5wcm9ibGVtTG9nLCBmYWxzZSk7Ci0JfQotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5Db25mb3JtVGVzdFRocm93aW5nRXJyb3IoU3RyaW5nW10gdGVzdEZpbGVzLCBTdHJpbmcgZXhwZWN0ZWRTdWNjZXNzT3V0cHV0U3RyaW5nLCBTdHJpbmdbXSBjbGFzc0xpYiwgYm9vbGVhbiBzaG91bGRGbHVzaE91dHB1dERpcmVjdG9yeSwgU3RyaW5nW10gdm1Bcmd1bWVudHMpIHsKLQotCWlmIChzaG91bGRGbHVzaE91dHB1dERpcmVjdG9yeSkgVXRpbC5mbHVzaERpcmVjdG9yeUNvbnRlbnQobmV3IEZpbGUoT1VUUFVUX0RJUikpOwotCQotCUlQcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeSA9IGdldFByb2JsZW1GYWN0b3J5KCk7Ci0JTG9nUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBMb2dSZXF1ZXN0b3IocHJvYmxlbUZhY3RvcnksIE9VVFBVVF9ESVIuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpID8gT1VUUFVUX0RJUiA6IE9VVFBVVF9ESVIgKyBGaWxlLnNlcGFyYXRvcik7Ci0JQ29tcGlsZXIgYmF0Y2hDb21waWxlciA9Ci0JCW5ldyBDb21waWxlcigKLQkJCWdldE5hbWVFbnZpcm9ubWVudChuZXcgU3RyaW5nW10ge30sIGNsYXNzTGliKSwKLQkJCWdldEVycm9ySGFuZGxpbmdQb2xpY3koKSwKLQkJCWdldENvbXBpbGVyT3B0aW9ucygpLAotCQkJcmVxdWVzdG9yLAotCQkJcHJvYmxlbUZhY3RvcnkpOwotCWJhdGNoQ29tcGlsZXIuY29tcGlsZShjb21waWxhdGlvblVuaXRzKHRlc3RGaWxlcykpOyAvLyBjb21waWxlIGFsbCBmaWxlcyB0b2dldGhlcgotCWlmICghcmVxdWVzdG9yLmhhc0Vycm9ycykgewotCQlTdHJpbmcgc291cmNlRmlsZSA9IHRlc3RGaWxlc1swXTsKLQkJCi0JCS8vIENvbXB1dGUgY2xhc3MgbmFtZSBieSByZW1vdmluZyAiLmphdmEiIGFuZCByZXBsYWNpbmcgc2xhc2hlcyB3aXRoIGRvdHMKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IHNvdXJjZUZpbGUuc3Vic3RyaW5nKDAsIHNvdXJjZUZpbGUubGVuZ3RoKCkgLSA1KS5yZXBsYWNlKCcvJywgJy4nKS5yZXBsYWNlKCdcXCcsICcuJyk7Ci0JCQotCQlib29sZWFuIHBhc3NlZCA9IHRoaXMudmVyaWZpZXIudmVyaWZ5Q2xhc3NGaWxlc1Rocm93aW5nRXJyb3Ioc291cmNlRmlsZSwgY2xhc3NOYW1lLCBleHBlY3RlZFN1Y2Nlc3NPdXRwdXRTdHJpbmcsIHRoaXMuY2xhc3NwYXRocywgbnVsbCwgdm1Bcmd1bWVudHMpOwotCQlhc3NlcnRUcnVlKAotCQkJdGhpcy52ZXJpZmllci5mYWlsdXJlUmVhc29uLCAvLyBjb21wdXRlZCBieSB2ZXJpZnlDbGFzc0ZpbGVzKC4uLikgYWN0aW9uCi0JCQlwYXNzZWQKLQkJKTsKLQl9IGVsc2UgewotCQlhc3NlcnRUcnVlKCJVbmV4cGVjdGVkIHByb2JsZW1zOiAiICsgcmVxdWVzdG9yLnByb2JsZW1Mb2csIGZhbHNlKTsKLQl9Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1bk5lZ2F0aXZlVGVzdChTdHJpbmdbXSB0ZXN0RmlsZXMsIEV4cGVjdGVkUHJvYmxlbVtdIGV4cGVjdGVkUHJvYmxlbXMpIHsKLQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCh0ZXN0RmlsZXMsIGV4cGVjdGVkUHJvYmxlbXMsIG51bGwsIHRydWUpOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuTmVnYXRpdmVUZXN0KFN0cmluZ1tdIHRlc3RGaWxlcywgRXhwZWN0ZWRQcm9ibGVtW10gZXhwZWN0ZWRQcm9ibGVtcywgU3RyaW5nW10gY2xhc3NMaWIsIGJvb2xlYW4gc2hvdWxkRmx1c2hPdXRwdXREaXJlY3RvcnkpIHsKLQotCWlmIChzaG91bGRGbHVzaE91dHB1dERpcmVjdG9yeSkgVXRpbC5mbHVzaERpcmVjdG9yeUNvbnRlbnQobmV3IEZpbGUoT1VUUFVUX0RJUikpOwotCi0JSVByb2JsZW1GYWN0b3J5IHByb2JsZW1GYWN0b3J5ID0gZ2V0UHJvYmxlbUZhY3RvcnkoKTsKLQlSZXF1ZXN0b3IgcmVxdWVzdG9yID0gZ2V0UmVxdWVzdG9yKHByb2JsZW1GYWN0b3J5KTsKLQlyZXF1ZXN0b3IuZXhwZWN0ZWRQcm9ibGVtcyhleHBlY3RlZFByb2JsZW1zKTsKLQlDb21waWxlciBiYXRjaENvbXBpbGVyID0KLQkJbmV3IENvbXBpbGVyKAotCQkJZ2V0TmFtZUVudmlyb25tZW50KG5ldyBTdHJpbmdbXSB7fSwgY2xhc3NMaWIpLAotCQkJZ2V0RXJyb3JIYW5kbGluZ1BvbGljeSgpLAotCQkJZ2V0Q29tcGlsZXJPcHRpb25zKCksCi0JCQlyZXF1ZXN0b3IsCi0JCQlwcm9ibGVtRmFjdG9yeSk7Ci0JYmF0Y2hDb21waWxlci5jb21waWxlKGNvbXBpbGF0aW9uVW5pdHModGVzdEZpbGVzKSk7IC8vIGNvbXBpbGUgYWxsIGZpbGVzIHRvZ2V0aGVyCi0JaWYgKCFyZXF1ZXN0b3IuaGFzRXJyb3JzKSB7Ci0JCVN0cmluZyBzb3VyY2VGaWxlID0gdGVzdEZpbGVzWzBdOwotCQkKLQkJLy8gQ29tcHV0ZSBjbGFzcyBuYW1lIGJ5IHJlbW92aW5nICIuamF2YSIgYW5kIHJlcGxhY2luZyBzbGFzaGVzIHdpdGggZG90cwotCQlTdHJpbmcgY2xhc3NOYW1lID0gc291cmNlRmlsZS5zdWJzdHJpbmcoMCwgc291cmNlRmlsZS5sZW5ndGgoKSAtIDUpLnJlcGxhY2UoJy8nLCAnLicpLnJlcGxhY2UoJ1xcJywgJy4nKTsKLQkJCi0JCWFzc2VydFRydWUoCi0JCQl0aGlzLnZlcmlmaWVyLmZhaWx1cmVSZWFzb24sCi0JCQl0aGlzLnZlcmlmaWVyLnZlcmlmeUNsYXNzRmlsZXMoc291cmNlRmlsZSwgY2xhc3NOYW1lLCBudWxsLCB0aGlzLmNsYXNzcGF0aHMpCi0JCSk7Ci0JfQotfQotcHJvdGVjdGVkIHZvaWQgcnVuTmVnYXRpdmVUZXN0KFN0cmluZ1tdIHRlc3RGaWxlcywgRXhwZWN0ZWRQcm9ibGVtW10gZXhwZWN0ZWRQcm9ibGVtcywgU3RyaW5nW10gY2xhc3NMaWIsIGJvb2xlYW4gc2hvdWxkRmx1c2hPdXRwdXREaXJlY3RvcnksIGJvb2xlYW4gZ2VuZXJhdGVPdXRwdXQpIHsKLQotCi0JaWYgKHNob3VsZEZsdXNoT3V0cHV0RGlyZWN0b3J5KSBVdGlsLmZsdXNoRGlyZWN0b3J5Q29udGVudChuZXcgRmlsZShPVVRQVVRfRElSKSk7Ci0KLQotCUlQcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeSA9IGdldFByb2JsZW1GYWN0b3J5KCk7Ci0JUmVxdWVzdG9yIHJlcXVlc3RvciA9IGdldFJlcXVlc3Rvcihwcm9ibGVtRmFjdG9yeSwgZ2VuZXJhdGVPdXRwdXQpOwotCXJlcXVlc3Rvci5leHBlY3RlZFByb2JsZW1zKGV4cGVjdGVkUHJvYmxlbXMpOwotCUNvbXBpbGVyIGJhdGNoQ29tcGlsZXIgPQotCQluZXcgQ29tcGlsZXIoCi0JCQlnZXROYW1lRW52aXJvbm1lbnQobmV3IFN0cmluZ1tdIHt9LCBjbGFzc0xpYiksCi0JCQlnZXRFcnJvckhhbmRsaW5nUG9saWN5KCksCi0JCQlnZXRDb21waWxlck9wdGlvbnMoKSwKLQkJCXJlcXVlc3RvciwKLQkJCXByb2JsZW1GYWN0b3J5KTsKLQliYXRjaENvbXBpbGVyLmNvbXBpbGUoY29tcGlsYXRpb25Vbml0cyh0ZXN0RmlsZXMpKTsgLy8gY29tcGlsZSBhbGwgZmlsZXMgdG9nZXRoZXIKLQlpZiAoIXJlcXVlc3Rvci5oYXNFcnJvcnMpIHsKLQkJU3RyaW5nIHNvdXJjZUZpbGUgPSB0ZXN0RmlsZXNbMF07Ci0JCQotCQkvLyBDb21wdXRlIGNsYXNzIG5hbWUgYnkgcmVtb3ZpbmcgIi5qYXZhIiBhbmQgcmVwbGFjaW5nIHNsYXNoZXMgd2l0aCBkb3RzCi0JCVN0cmluZyBjbGFzc05hbWUgPSBzb3VyY2VGaWxlLnN1YnN0cmluZygwLCBzb3VyY2VGaWxlLmxlbmd0aCgpIC0gNSkucmVwbGFjZSgnLycsICcuJykucmVwbGFjZSgnXFwnLCAnLicpOwotCQkKLQkJYXNzZXJ0VHJ1ZSgKLQkJCXRoaXMudmVyaWZpZXIuZmFpbHVyZVJlYXNvbiwKLQkJCXRoaXMudmVyaWZpZXIudmVyaWZ5Q2xhc3NGaWxlcyhzb3VyY2VGaWxlLCBjbGFzc05hbWUsIG51bGwsIHRoaXMuY2xhc3NwYXRocykKLQkJKTsKLQl9Ci19Ci0KLS8qKgotICogTG9nIGNvbnRhaW5zIGFsbCBwcm9ibGVtcyAod2FybmluZ3MrZXJyb3JzKQotICovCi1wcm90ZWN0ZWQgdm9pZCBydW5OZWdhdGl2ZVRlc3QoU3RyaW5nW10gdGVzdEZpbGVzLCBTdHJpbmcgZXhwZWN0ZWRQcm9ibGVtTG9nKSB7Ci0JdGhpcy5ydW5OZWdhdGl2ZVRlc3QodGVzdEZpbGVzLCBleHBlY3RlZFByb2JsZW1Mb2csIG51bGwsIHRydWUpOwotfQotCi0vKioKLSAqIExvZyBjb250YWlucyBhbGwgcHJvYmxlbXMgKHdhcm5pbmdzK2Vycm9ycykKLSAqLwotcHJvdGVjdGVkIHZvaWQgcnVuTmVnYXRpdmVUZXN0KFN0cmluZ1tdIHRlc3RGaWxlcywgU3RyaW5nIGV4cGVjdGVkUHJvYmxlbUxvZywgU3RyaW5nW10gY2xhc3NMaWIsIGJvb2xlYW4gc2hvdWxkRmx1c2hPdXRwdXREaXJlY3RvcnkpIHsKLQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCh0ZXN0RmlsZXMsIGV4cGVjdGVkUHJvYmxlbUxvZywgY2xhc3NMaWIsIHNob3VsZEZsdXNoT3V0cHV0RGlyZWN0b3J5LCBudWxsKTsKLX0KLS8qKgotICogTG9nIGNvbnRhaW5zIGFsbCBwcm9ibGVtcyAod2FybmluZ3MrZXJyb3JzKQotICovCi1wcm90ZWN0ZWQgdm9pZCBydW5OZWdhdGl2ZVRlc3QoU3RyaW5nW10gdGVzdEZpbGVzLCBTdHJpbmcgZXhwZWN0ZWRQcm9ibGVtTG9nLCBTdHJpbmdbXSBjbGFzc0xpYiwgYm9vbGVhbiBzaG91bGRGbHVzaE91dHB1dERpcmVjdG9yeSwgTWFwIGN1c3RvbU9wdGlvbnMpIHsKLQotCWlmIChzaG91bGRGbHVzaE91dHB1dERpcmVjdG9yeSkgVXRpbC5mbHVzaERpcmVjdG9yeUNvbnRlbnQobmV3IEZpbGUoT1VUUFVUX0RJUikpOwotCi0JSVByb2JsZW1GYWN0b3J5IHByb2JsZW1GYWN0b3J5ID0gZ2V0UHJvYmxlbUZhY3RvcnkoKTsKLQlMb2dSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IExvZ1JlcXVlc3Rvcihwcm9ibGVtRmFjdG9yeSwgT1VUUFVUX0RJUi5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikgPyBPVVRQVVRfRElSIDogT1VUUFVUX0RJUiArIEZpbGUuc2VwYXJhdG9yKTsKLQlNYXAgb3B0aW9ucyA9IGdldENvbXBpbGVyT3B0aW9ucygpOwotCWlmIChjdXN0b21PcHRpb25zICE9IG51bGwpewotCQlvcHRpb25zLnB1dEFsbChjdXN0b21PcHRpb25zKTsKLQl9Ci0JQ29tcGlsZXIgYmF0Y2hDb21waWxlciA9Ci0JCW5ldyBDb21waWxlcigKLQkJCWdldE5hbWVFbnZpcm9ubWVudChuZXcgU3RyaW5nW10ge30sIGNsYXNzTGliKSwKLQkJCWdldEVycm9ySGFuZGxpbmdQb2xpY3koKSwKLQkJCW9wdGlvbnMsCi0JCQlyZXF1ZXN0b3IsCi0JCQlwcm9ibGVtRmFjdG9yeSk7Ci0JYmF0Y2hDb21waWxlci5jb21waWxlKGNvbXBpbGF0aW9uVW5pdHModGVzdEZpbGVzKSk7IC8vIGNvbXBpbGUgYWxsIGZpbGVzIHRvZ2V0aGVyCi0KLQlTdHJpbmcgY29tcHV0ZWRQcm9ibGVtTG9nID0gcmVxdWVzdG9yLnByb2JsZW1Mb2cudG9TdHJpbmcoKTsKLQlpZiAoIWV4cGVjdGVkUHJvYmxlbUxvZy5lcXVhbHMoY29tcHV0ZWRQcm9ibGVtTG9nKSl7Ci0JIAlTeXN0ZW0ub3V0LnByaW50bG4oVXRpbC5kaXNwbGF5U3RyaW5nKGNvbXB1dGVkUHJvYmxlbUxvZywgMikpOwotCX0KLQlhc3NlcnRFcXVhbHMoCi0JCSJJbnZhbGlkIHByb2JsZW0gbG9nICIsCi0JCWV4cGVjdGVkUHJvYmxlbUxvZywKLQkJY29tcHV0ZWRQcm9ibGVtTG9nKTsKLX0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JaWYgKHRoaXMudmVyaWZpZXIgPT0gbnVsbCkgewotCQl0aGlzLnZlcmlmaWVyID0gbmV3IFRlc3RWZXJpZmllcih0cnVlKTsKLQkJdGhpcy5jcmVhdGVkVmVyaWZpZXIgPSB0cnVlOwotCX0KLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzZXR1cFN1aXRlKENsYXNzIGNsYXp6KSB7Ci0JcmV0dXJuIG5ldyBSZWdyZXNzaW9uVGVzdFNldHVwKHN1aXRlKGNsYXp6KSk7Ci19Ci1wdWJsaWMgdm9pZCBzdG9wKCkgewotCXRoaXMudmVyaWZpZXIuc2h1dERvd24oKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZShDbGFzcyBldmFsdWF0aW9uVGVzdENsYXNzKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShldmFsdWF0aW9uVGVzdENsYXNzKTsKLQlyZXR1cm4gc3VpdGU7Ci19Ci1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCWlmICh0aGlzLmNyZWF0ZWRWZXJpZmllcikgewotCQl0aGlzLnN0b3AoKTsKLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcmVncmVzc2lvbi9Bc3NlcnRpb25UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcmVncmVzc2lvbi9Bc3NlcnRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMjc3YjkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3JlZ3Jlc3Npb24vQXNzZXJ0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIucmVncmVzc2lvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7Ci0KLXB1YmxpYyBjbGFzcyBBc3NlcnRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RSZWdyZXNzaW9uVGVzdCB7Ci0KLQkvKgotCSAqIFRvZ2dsZSBjb21waWxlciBpbiBtb2RlIC0xLjQKLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGdldENvbXBpbGVyT3B0aW9ucygpIHsKLQkJTWFwIG9wdGlvbnMgPSBzdXBlci5nZXRDb21waWxlck9wdGlvbnMoKTsKLQkJb3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Db21wbGlhbmNlLCBDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzQpOwotCQlvcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1NvdXJjZSwgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV80KTsKLQkJcmV0dXJuIG9wdGlvbnM7Ci0JfQotCi0JcHVibGljIEFzc2VydGlvblRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gc2V0dXBTdWl0ZSh0ZXN0Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQ2xhc3MgdGVzdENsYXNzKCkgewotCQlyZXR1cm4gQXNzZXJ0aW9uVGVzdC5jbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXNzZXJ0QXNBbklkZW50aWZpZXIoKSB7Ci0JCXRoaXMucnVuTmVnYXRpdmVUZXN0KAotCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQkiYXNzZXJ0LmphdmEiLAotCQkJCSJwdWJsaWMgY2xhc3MgYXNzZXJ0IHt9XG4iLAotCQkJfSwKLQkJCSItLS0tLS0tLS0tXG4iICsgCi0JCQkiMS4gRVJST1IgaW4gYXNzZXJ0LmphdmEgKGF0IGxpbmUgMSlcbiIgKyAKLQkJCSIJcHVibGljIGNsYXNzIGFzc2VydCB7fVxuIiArIAotCQkJIgkgICAgICAgICAgICAgXl5eXl5eXG4iICsgCi0JCQkiU3ludGF4IGVycm9yIG9uIGtleXdvcmQgXCJhc3NlcnRcIjsgXCJJZGVudGlmaWVyXCIgZXhwZWN0ZWRcbiIgKyAKLQkJCSItLS0tLS0tLS0tXG4iKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFzc2VydGlvbkVuYWJsZWQoKSB7Ci0JCXRoaXMucnVuQ29uZm9ybVRlc3QobmV3IFN0cmluZ1tdIHsKLQkJCSJBNC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgQTQgeyBcbiIKLQkJCSsgIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iCi0JCQkrICIgICB0cnkgewlcbiIKLQkJCSsgIiAgICBpbnQgaSA9IDQ7XG4iCi0JCQkrICIgICAgYXNzZXJ0IGkgIT0gNDtcbiIKLQkJCSsgIgkgICBTeXN0ZW0ub3V0LnByaW50bG4oaSk7XG4iCi0JCQkrICIJICB9IGNhdGNoKEFzc2VydGlvbkVycm9yIGUpewlcbiIKLQkJCSsgIgkJU3lzdGVtLm91dC5wcmludChcIlNVQ0NFU1NcIik7CVxuIgotCQkJKyAiCSAgfSBcbiIJCQkKLQkJCSsgIgl9IFxuIgotCQkJKyAifSBcbiIgfSwKLQkJIlNVQ0NFU1MiLCAvL2V4cGVjdGVkIGRpc3BsYXkgCi0JCW51bGwsIC8vIHVzZSBkZWZhdWx0IGNsYXNzLXBhdGgKLQkJdHJ1ZSwgLy8gZmx1c2ggcHJldmlvdXMgb3V0cHV0IGRpciBjb250ZW50Ci0JCW5ldyBTdHJpbmdbXSB7Ii1lYSJ9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFzc2VydGlvbkRpc2FibGVkKCkgewotCQl0aGlzLnJ1bkNvbmZvcm1UZXN0KG5ldyBTdHJpbmdbXSB7Ci0JCQkiQTQuamF2YSIsCi0JCQkicHVibGljIGNsYXNzIEE0IHsgXG4iCi0JCQkrICIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIgotCQkJKyAiICAgIGludCBpID0gNDtcbiIKLQkJCSsgIiAgICBhc3NlcnQgaSAhPSA0O1xuIgotCQkJKyAiCSAgIFN5c3RlbS5vdXQucHJpbnRsbihpKTtcbiIKLQkJCSsgIgl9IFxuIgotCQkJKyAifSBcbiIgfSwKLQkJIjQiLCAKLQkJbnVsbCwgLy8gdXNlIGRlZmF1bHQgY2xhc3MtcGF0aAotCQl0cnVlLCAvLyBmbHVzaCBwcmV2aW91cyBvdXRwdXQgZGlyIGNvbnRlbnQKLQkJbmV3IFN0cmluZ1tdIHsiLWRhIn0pOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0QXNzZXJ0aW9uV2l0aE9iamVjdEFyZ3VtZW50cygpIHsKLQkJdGhpcy5ydW5Db25mb3JtVGVzdChuZXcgU3RyaW5nW10gewotCQkJIkE0LmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBBNCB7IFxuIgotCQkJKyAiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIKLQkJCSsgIiAgIHRyeSB7CVxuIgotCQkJKyAiCQlhc3NlcnQgZmFsc2UgOiBcIlNVQ1wiOwlcbiIKLQkJCSsgIgkgIH0gY2F0Y2goQXNzZXJ0aW9uRXJyb3IgZSl7CVxuIgotCQkJKyAiCQlTeXN0ZW0ub3V0LnByaW50KGUuZ2V0TWVzc2FnZSgpKTsJXG4iCi0JCQkrICIJICB9CVxuIgotCQkJKyAiCSAgdHJ5IHsJXG4iCi0JCQkrICIJCWFzc2VydCBmYWxzZSA6IG5ldyBPYmplY3QoKXsgcHVibGljIFN0cmluZyB0b1N0cmluZygpeyByZXR1cm4gXCJDRVNTXCI7fX07CVxuIgotCQkJKyAiCSAgfSBjYXRjaChBc3NlcnRpb25FcnJvciBlKXsJXG4iCi0JCQkrICIJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7CVxuIgotCQkJKyAiCSAgfQlcbiIKLQkJCSsgIiAgfQlcbiIKLQkJCSsgIn0gXG4iIH0sCi0JCSJTVUNDRVNTIiwgLy9leHBlY3RlZCBkaXNwbGF5Ci0JCW51bGwsIC8vIHVzZSBkZWZhdWx0IGNsYXNzLXBhdGgKLQkJdHJ1ZSwgLy8gZmx1c2ggcHJldmlvdXMgb3V0cHV0IGRpciBjb250ZW50Ci0JCW5ldyBTdHJpbmdbXSB7Ii1lYSJ9KTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEFzc2VydGlvbldpdGhJbnRBcmd1bWVudHMoKSB7Ci0JCXRoaXMucnVuQ29uZm9ybVRlc3QobmV3IFN0cmluZ1tdIHsKLQkJCSJBNC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgQTQgeyBcbiIKLQkJCSsgIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iCi0JCQkrICIgICB0cnkgewlcbiIKLQkJCSsgIgkJYXNzZXJ0IGZhbHNlIDogMTsJXG4iCi0JCQkrICIJICB9IGNhdGNoKEFzc2VydGlvbkVycm9yIGUpewlcbiIKLQkJCSsgIgkJU3lzdGVtLm91dC5wcmludChlLmdldE1lc3NhZ2UoKSk7CVxuIgotCQkJKyAiCSAgfQlcbiIKLQkJCSsgIgkgIHRyeSB7CVxuIgotCQkJKyAiCQlpbnQgaSA9IDI7CVxuIgotCQkJKyAiCQlhc3NlcnQgZmFsc2UgOiBpOwlcbiIKLQkJCSsgIgkgIH0gY2F0Y2goQXNzZXJ0aW9uRXJyb3IgZSl7CVxuIgotCQkJKyAiCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwlcbiIKLQkJCSsgIgkgIH0JXG4iCi0JCQkrICIgIH0JXG4iCi0JCQkrICJ9IFxuIiB9LAotCQkiMTIiLCAvL2V4cGVjdGVkIGRpc3BsYXkKLQkJbnVsbCwgLy8gdXNlIGRlZmF1bHQgY2xhc3MtcGF0aAotCQl0cnVlLCAvLyBmbHVzaCBwcmV2aW91cyBvdXRwdXQgZGlyIGNvbnRlbnQKLQkJbmV3IFN0cmluZ1tdIHsiLWVhIn0pOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0QXNzZXJ0aW9uV2l0aFVuYm91bmRWYXJpYWJsZSgpIHsKLQkJdGhpcy5ydW5OZWdhdGl2ZVRlc3QobmV3IFN0cmluZ1tdIHsKLQkJCSJBNC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgQTQgeyBcbiIKLQkJCSsgIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iCi0JCQkrICIJICB0cnkgewlcbiIKLQkJCSsgIgkJYXNzZXJ0IGZhbHNlIDogdW5ib3VuZDsJXG4iCi0JCQkrICIJICB9IGNhdGNoKEFzc2VydGlvbkVycm9yIGUpewlcbiIKLQkJCSsgIgkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsJXG4iCi0JCQkrICIJICB9CVxuIgotCQkJKyAiICB9CVxuIgotCQkJKyAifSBcbiIgfSwKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjEuIEVSUk9SIGluIEE0LmphdmEgKGF0IGxpbmUgNClcbiIgKyAKLQkJIglhc3NlcnQgZmFsc2UgOiB1bmJvdW5kOwlcbiIgKyAKLQkJIgkgICAgICAgICAgICAgICBeXl5eXl5eXG4iICsgCi0JCSJ1bmJvdW5kIGNhbm5vdCBiZSByZXNvbHZlZFxuIiArIAotCQkiLS0tLS0tLS0tLVxuIik7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RBc3NlcnRpb25XaXRoTG9uZ0FyZ3VtZW50cygpIHsKLQkJdGhpcy5ydW5Db25mb3JtVGVzdChuZXcgU3RyaW5nW10gewotCQkJIkE0LmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBBNCB7IFxuIgotCQkJKyAiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIKLQkJCSsgIiAgIHRyeSB7CVxuIgotCQkJKyAiCQlhc3NlcnQgZmFsc2UgOiAxTDsJXG4iCi0JCQkrICIJICB9IGNhdGNoKEFzc2VydGlvbkVycm9yIGUpewlcbiIKLQkJCSsgIgkJU3lzdGVtLm91dC5wcmludChlLmdldE1lc3NhZ2UoKSk7CVxuIgotCQkJKyAiCSAgfQlcbiIKLQkJCSsgIiAgIHRyeSB7CVxuIgotCQkJKyAiCQlhc3NlcnQgZmFsc2UgOiAwTDsJXG4iIC8vIDBMIGlzbid0IDAKLQkJCSsgIgkgIH0gY2F0Y2goQXNzZXJ0aW9uRXJyb3IgZSl7CVxuIgotCQkJKyAiCQlTeXN0ZW0ub3V0LnByaW50KGUuZ2V0TWVzc2FnZSgpKTsJXG4iCi0JCQkrICIJICB9CVxuIgotCQkJKyAiCSAgdHJ5IHsJXG4iCi0JCQkrICIJCWxvbmcgbCA9IDJMOwlcbiIKLQkJCSsgIgkJYXNzZXJ0IGZhbHNlIDogbDsJXG4iCi0JCQkrICIJICB9IGNhdGNoKEFzc2VydGlvbkVycm9yIGUpewlcbiIKLQkJCSsgIgkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsJXG4iCi0JCQkrICIJICB9CVxuIgotCQkJKyAiICB9CVxuIgotCQkJKyAifSBcbiIgfSwKLQkJIjEwMiIsIC8vZXhwZWN0ZWQgZGlzcGxheQotCQludWxsLCAvLyB1c2UgZGVmYXVsdCBjbGFzcy1wYXRoCi0JCXRydWUsIC8vIGZsdXNoIHByZXZpb3VzIG91dHB1dCBkaXIgY29udGVudAotCQluZXcgU3RyaW5nW10geyItZWEifSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RBc3NlcnRpb25XaXRoRmxvYXRBcmd1bWVudHMoKSB7Ci0JCXRoaXMucnVuQ29uZm9ybVRlc3QobmV3IFN0cmluZ1tdIHsKLQkJCSJBNC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgQTQgeyBcbiIKLQkJCSsgIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iCi0JCQkrICIgICB0cnkgewlcbiIKLQkJCSsgIgkJYXNzZXJ0IGZhbHNlIDogMS4wZjsJXG4iCi0JCQkrICIJICB9IGNhdGNoKEFzc2VydGlvbkVycm9yIGUpewlcbiIKLQkJCSsgIgkJU3lzdGVtLm91dC5wcmludChlLmdldE1lc3NhZ2UoKSk7CVxuIgotCQkJKyAiCSAgfQlcbiIKLQkJCSsgIgkgIHRyeSB7CVxuIgotCQkJKyAiCQlmbG9hdCBmID0gMi4wZjsJXG4iCi0JCQkrICIJCWFzc2VydCBmYWxzZSA6IGY7CVxuIgotCQkJKyAiCSAgfSBjYXRjaChBc3NlcnRpb25FcnJvciBlKXsJXG4iCi0JCQkrICIJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7CVxuIgotCQkJKyAiCSAgfQlcbiIKLQkJCSsgIiAgfQlcbiIKLQkJCSsgIn0gXG4iIH0sCi0JCSIxLjAyLjAiLCAvL2V4cGVjdGVkIGRpc3BsYXkKLQkJbnVsbCwgLy8gdXNlIGRlZmF1bHQgY2xhc3MtcGF0aAotCQl0cnVlLCAvLyBkbyBub3QgZmx1c2ggcHJldmlvdXMgb3V0cHV0IGRpciBjb250ZW50Ci0JCW5ldyBTdHJpbmdbXSB7Ii1lYSJ9KTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEFzc2VydGlvbldpdGhEb3VibGVBcmd1bWVudHMoKSB7Ci0JCXRoaXMucnVuQ29uZm9ybVRlc3QobmV3IFN0cmluZ1tdIHsKLQkJCSJBNC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgQTQgeyBcbiIKLQkJCSsgIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iCi0JCQkrICIgICB0cnkgewlcbiIKLQkJCSsgIgkJYXNzZXJ0IGZhbHNlIDogMS4wOwlcbiIKLQkJCSsgIgkgIH0gY2F0Y2goQXNzZXJ0aW9uRXJyb3IgZSl7CVxuIgotCQkJKyAiCQlTeXN0ZW0ub3V0LnByaW50KGUuZ2V0TWVzc2FnZSgpKTsJXG4iCi0JCQkrICIJICB9CVxuIgotCQkJKyAiCSAgdHJ5IHsJXG4iCi0JCQkrICIJCWRvdWJsZSBkID0gMi4wOwlcbiIKLQkJCSsgIgkJYXNzZXJ0IGZhbHNlIDogZDsJXG4iCi0JCQkrICIJICB9IGNhdGNoKEFzc2VydGlvbkVycm9yIGUpewlcbiIKLQkJCSsgIgkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsJXG4iCi0JCQkrICIJICB9CVxuIgotCQkJKyAiICB9CVxuIgotCQkJKyAifSBcbiIgfSwKLQkJIjEuMDIuMCIsIC8vZXhwZWN0ZWQgZGlzcGxheQotCQludWxsLCAvLyB1c2UgZGVmYXVsdCBjbGFzcy1wYXRoCi0JCXRydWUsIC8vIGZsdXNoIHByZXZpb3VzIG91dHB1dCBkaXIgY29udGVudAotCQluZXcgU3RyaW5nW10geyItZWEifSk7Ci0JfQotCS8vIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjIzMzQKLQlwdWJsaWMgdm9pZCB0ZXN0QXNzZXJ0aW9uSW5JbnRlcmZhY2VTdGF0aWNNZW1iZXIoKSB7Ci0JCXRoaXMucnVuQ29uZm9ybVRlc3QobmV3IFN0cmluZ1tdIHsKLQkJCSJYLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBYIHsgXG4iICsKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeyBcbiIgKwotCQkJIgkJSS5Jbm5lciBpbm5lciA9IG5ldyBJLklubmVyKCk7IFxuIiArCi0JCQkiCQl0cnkgeyBcbiIgKwotCQkJIgkJCWlubmVyLnRlc3QoKTsgXG4iICsKLQkJCSIJCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJGQUlMRURcIik7IFxuIiArCi0JCQkiCQl9IGNhdGNoKEFzc2VydGlvbkVycm9yIGUpeyBcbiIgKwotCQkJIgkJCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7IFxuIiArCi0JCQkiCQl9IFxuIiArCi0JCQkiCX0gXG4iICsKLQkJCSJ9IFxuIiArCi0JCQkiaW50ZXJmYWNlIEkgeyBcbiIgKwotCQkJIiAgcHVibGljIHN0YXRpYyBjbGFzcyBJbm5lciB7IFxuIiArCi0JCQkiICAgIHB1YmxpYyB2b2lkIHRlc3QoKSB7IFxuIiArCi0JCQkiICAgICAgYXNzZXJ0IGZhbHNlOyBcbiIgKwotCQkJIiAgICB9IFxuIiArCi0JCQkiICB9IFxuIiArCi0JCQkifSBcbiIgfSwKLQkJIlNVQ0NFU1MiLAotCQludWxsLCAvLyB1c2UgZGVmYXVsdCBjbGFzcy1wYXRoCi0JCXRydWUsIC8vIGZsdXNoIHByZXZpb3VzIG91dHB1dCBkaXIgY29udGVudAotCQluZXcgU3RyaW5nW10geyItZWEifSk7Ci0JfSAJCi19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcmVncmVzc2lvbi9CYXRjaENvbXBpbGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3JlZ3Jlc3Npb24vQmF0Y2hDb21waWxlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIwNGNkMC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcmVncmVzc2lvbi9CYXRjaENvbXBpbGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIucmVncmVzc2lvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmJhdGNoLk1haW47Ci0KLXB1YmxpYyBjbGFzcyBCYXRjaENvbXBpbGVyVGVzdCBleHRlbmRzIEFic3RyYWN0UmVncmVzc2lvblRlc3QgewotcHVibGljIEJhdGNoQ29tcGlsZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JcmV0dXJuIHNldHVwU3VpdGUodGVzdENsYXNzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdDAxKCkgewotCQotCQlTdHJpbmcgY29tbWFuZExpbmUgPSAiLWNsYXNzcGF0aCBcIkQ6L2EgZm9sZGVyXCI7ZDovamRrMS40L2pyZS9saWIvcnQuamFyIC0xLjQgLXByZXNlcnZlQWxsTG9jYWxzIC1nIC12ZXJib3NlIGQ6L2VjbGlwc2Uvd29ya3NwYWNlcy9kZXZlbG9wbWVudDIuMC9wbHVnaW5zL0Jhci9zcmMyLyAtZCBkOi90ZXN0IjsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIiA8LWNsYXNzcGF0aD4gPEQ6L2EgZm9sZGVyO2Q6L2pkazEuNC9qcmUvbGliL3J0Lmphcj4gPC0xLjQ+IDwtcHJlc2VydmVBbGxMb2NhbHM+IDwtZz4gPC12ZXJib3NlPiA8ZDovZWNsaXBzZS93b3Jrc3BhY2VzL2RldmVsb3BtZW50Mi4wL3BsdWdpbnMvQmFyL3NyYzIvPiA8LWQ+IDxkOi90ZXN0PiI7Ci0JCQotCQlTdHJpbmdbXSBhcmdzID0gTWFpbi50b2tlbml6ZShjb21tYW5kTGluZSk7Ci0JCVN0cmluZ0J1ZmZlciAgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigzMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKyl7Ci0JCQlidWZmZXIuYXBwZW5kKCIgPCIrYXJnc1tpXSsiPiIpOwotCQl9Ci0JCVN0cmluZyByZXN1bHQgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oVXRpbC5kaXNwbGF5U3RyaW5nKHJlc3VsdCwgMikpOwotCQlhc3NlcnRFcXVhbHMoImluY29ycmVjdCB0b2tlbml6ZWQgY29tbWFuZCBsaW5lIiwKLQkJCWV4cGVjdGVkLAotCQkJcmVzdWx0KTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QwMigpIHsKLQkKLQkJU3RyaW5nIGNvbW1hbmRMaW5lID0gIi1jbGFzc3BhdGggXCJhIGZvbGRlclwiO1wiYiBmb2xkZXJcIiI7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICIgPC1jbGFzc3BhdGg+IDxhIGZvbGRlcjtiIGZvbGRlcj4iOwotCQkKLQkJU3RyaW5nW10gYXJncyA9IE1haW4udG9rZW5pemUoY29tbWFuZExpbmUpOwotCQlTdHJpbmdCdWZmZXIgIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMzApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspewotCQkJYnVmZmVyLmFwcGVuZCgiIDwiK2FyZ3NbaV0rIj4iKTsKLQkJfQotCQlTdHJpbmcgcmVzdWx0ID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCS8vU3lzdGVtLm91dC5wcmludGxuKFV0aWwuZGlzcGxheVN0cmluZyhyZXN1bHQsIDIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbmNvcnJlY3QgdG9rZW5pemVkIGNvbW1hbmQgbGluZSIsCi0JCQlleHBlY3RlZCwKLQkJCXJlc3VsdCk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDMoKSB7Ci0JCi0JCVN0cmluZyBjb21tYW5kTGluZSA9ICItY2xhc3NwYXRoIFwiYSBmb2xkZXI7YiBmb2xkZXJcIiI7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICIgPC1jbGFzc3BhdGg+IDxhIGZvbGRlcjtiIGZvbGRlcj4iOwotCQkKLQkJU3RyaW5nW10gYXJncyA9IE1haW4udG9rZW5pemUoY29tbWFuZExpbmUpOwotCQlTdHJpbmdCdWZmZXIgIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMzApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspewotCQkJYnVmZmVyLmFwcGVuZCgiIDwiK2FyZ3NbaV0rIj4iKTsKLQkJfQotCQlTdHJpbmcgcmVzdWx0ID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCS8vU3lzdGVtLm91dC5wcmludGxuKFV0aWwuZGlzcGxheVN0cmluZyhyZXN1bHQsIDIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbmNvcnJlY3QgdG9rZW5pemVkIGNvbW1hbmQgbGluZSIsCi0JCQlleHBlY3RlZCwKLQkJCXJlc3VsdCk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDQoKSB7Ci0JCi0JCVN0cmluZyBjb21tYW5kTGluZSA9ICJcImQ6L3RtcCBBL1wiQS5qYXZhICAtY2xhc3NwYXRoIFwiZDovdG1wIEFcIjtkOi9qYXJzL3J0LmphciAtbm93YXJuIC10aW1lIC1nIC1kIGQ6L3RtcCI7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICIgPGQ6L3RtcCBBL0EuamF2YT4gPC1jbGFzc3BhdGg+IDxkOi90bXAgQTtkOi9qYXJzL3J0Lmphcj4gPC1ub3dhcm4+IDwtdGltZT4gPC1nPiA8LWQ+IDxkOi90bXA+IjsKLQkJCi0JCVN0cmluZ1tdIGFyZ3MgPSBNYWluLnRva2VuaXplKGNvbW1hbmRMaW5lKTsKLQkJU3RyaW5nQnVmZmVyICBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDMwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKXsKLQkJCWJ1ZmZlci5hcHBlbmQoIiA8IithcmdzW2ldKyI+Iik7Ci0JCX0KLQkJU3RyaW5nIHJlc3VsdCA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkvL1N5c3RlbS5vdXQucHJpbnRsbihVdGlsLmRpc3BsYXlTdHJpbmcocmVzdWx0LCAyKSk7Ci0JCWFzc2VydEVxdWFscygiaW5jb3JyZWN0IHRva2VuaXplZCBjb21tYW5kIGxpbmUiLAotCQkJZXhwZWN0ZWQsCi0JCQlyZXN1bHQpOwotfQotcHVibGljIHZvaWQgdGVzdDA1KCkgewotCQotCQlTdHJpbmcgY29tbWFuZExpbmUgPSAiXCJkOi90bXAgQS9cIkEuamF2YSAgLWNsYXNzcGF0aCBkOi9qYXJzL3J0LmphcjtcImQ6L3RtcCBBXCI7XCJ0b3RvXCIgLW5vd2FybiAtdGltZSAtZyAtZCBkOi90bXAiOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiIDxkOi90bXAgQS9BLmphdmE+IDwtY2xhc3NwYXRoPiA8ZDovamFycy9ydC5qYXI7ZDovdG1wIEE7dG90bz4gPC1ub3dhcm4+IDwtdGltZT4gPC1nPiA8LWQ+IDxkOi90bXA+IjsKLQkJCi0JCVN0cmluZ1tdIGFyZ3MgPSBNYWluLnRva2VuaXplKGNvbW1hbmRMaW5lKTsKLQkJU3RyaW5nQnVmZmVyICBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDMwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKXsKLQkJCWJ1ZmZlci5hcHBlbmQoIiA8IithcmdzW2ldKyI+Iik7Ci0JCX0KLQkJU3RyaW5nIHJlc3VsdCA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkvL1N5c3RlbS5vdXQucHJpbnRsbihVdGlsLmRpc3BsYXlTdHJpbmcocmVzdWx0LCAyKSk7Ci0JCWFzc2VydEVxdWFscygiaW5jb3JyZWN0IHRva2VuaXplZCBjb21tYW5kIGxpbmUiLAotCQkJZXhwZWN0ZWQsCi0JCQlyZXN1bHQpOwotfQotcHVibGljIHZvaWQgdGVzdDA2KCkgewotCQotCQlTdHJpbmcgY29tbWFuZExpbmUgPSAiXCJkOi90bXAgQS9BLmphdmFcIiAgLWNsYXNzcGF0aCBkOi9qYXJzL3J0LmphcjtcImQ6L3RtcCBBXCI7ZDovdG1wQi8gLW5vd2FybiAtdGltZSAtZyAtZCBkOi90bXAiOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiIDxkOi90bXAgQS9BLmphdmE+IDwtY2xhc3NwYXRoPiA8ZDovamFycy9ydC5qYXI7ZDovdG1wIEE7ZDovdG1wQi8+IDwtbm93YXJuPiA8LXRpbWU+IDwtZz4gPC1kPiA8ZDovdG1wPiI7Ci0JCQotCQlTdHJpbmdbXSBhcmdzID0gTWFpbi50b2tlbml6ZShjb21tYW5kTGluZSk7Ci0JCVN0cmluZ0J1ZmZlciAgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigzMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKyl7Ci0JCQlidWZmZXIuYXBwZW5kKCIgPCIrYXJnc1tpXSsiPiIpOwotCQl9Ci0JCVN0cmluZyByZXN1bHQgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oVXRpbC5kaXNwbGF5U3RyaW5nKHJlc3VsdCwgMikpOwotCQlhc3NlcnRFcXVhbHMoImluY29ycmVjdCB0b2tlbml6ZWQgY29tbWFuZCBsaW5lIiwKLQkJCWV4cGVjdGVkLAotCQkJcmVzdWx0KTsKLX0KLXB1YmxpYyBzdGF0aWMgQ2xhc3MgdGVzdENsYXNzKCkgewotCXJldHVybiBCYXRjaENvbXBpbGVyVGVzdC5jbGFzczsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9yZWdyZXNzaW9uL0NsYXNzRmlsZUNvbXBhcmF0b3JUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcmVncmVzc2lvbi9DbGFzc0ZpbGVDb21wYXJhdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmZlOTUwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9yZWdyZXNzaW9uL0NsYXNzRmlsZUNvbXBhcmF0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci5yZWdyZXNzaW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy51dGlsLlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGb3JtYXRFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBDbGFzc0ZpbGVDb21wYXJhdG9yVGVzdCBleHRlbmRzIEFic3RyYWN0UmVncmVzc2lvblRlc3QgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VfRElSRUNUT1JZID0gVXRpbC5nZXRPdXRwdXREaXJlY3RvcnkoKSAgKyBGaWxlLnNlcGFyYXRvciArICJzb3VyY2UiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFVkFMX0RJUkVDVE9SWSA9IFV0aWwuZ2V0T3V0cHV0RGlyZWN0b3J5KCkgICsgRmlsZS5zZXBhcmF0b3IgKyAiZXZhbCI7Ci0KLQlwdWJsaWMgQ2xhc3NGaWxlQ29tcGFyYXRvclRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIHNldHVwU3VpdGUodGVzdENsYXNzKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ2xhc3MgdGVzdENsYXNzKCkgewotCQlyZXR1cm4gQ2xhc3NGaWxlQ29tcGFyYXRvclRlc3QuY2xhc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlVGVtcENsYXNzKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJRmlsZSBkaXIgPSBuZXcgRmlsZShTT1VSQ0VfRElSRUNUT1JZKTsKLQkJU3RyaW5nW10gZmlsZU5hbWVzID0gZGlyLmxpc3QoKTsKLQkJaWYgKGZpbGVOYW1lcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZmlsZU5hbWVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0JCQkJaWYgKGZpbGVOYW1lc1tpXS5pbmRleE9mKGNsYXNzTmFtZSkgIT0gLTEpIHsKLQkJCQkJbmV3IEZpbGUoU09VUkNFX0RJUkVDVE9SWSArIEZpbGUuc2VwYXJhdG9yICsgZmlsZU5hbWVzW2ldKS5kZWxldGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWRpciA9IG5ldyBGaWxlKEVWQUxfRElSRUNUT1JZKTsKLQkJZmlsZU5hbWVzID0gZGlyLmxpc3QoKTsKLQkJaWYgKGZpbGVOYW1lcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMCwgbWF4ID0gZmlsZU5hbWVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0JCQkJaWYgKGZpbGVOYW1lc1tpXS5pbmRleE9mKGNsYXNzTmFtZSkgIT0gLTEpIHsKLQkJCQkJbmV3IEZpbGUoRVZBTF9ESVJFQ1RPUlkgKyBGaWxlLnNlcGFyYXRvciArIGZpbGVOYW1lc1tpXSkuZGVsZXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCi0JfQotCi0JcHVibGljIHZvaWQgY29tcGlsZUFuZERlcGxveShTdHJpbmcgc291cmNlLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCUZpbGUgZGlyZWN0b3J5ID0gbmV3IEZpbGUoU09VUkNFX0RJUkVDVE9SWSk7Ci0JCWlmICghZGlyZWN0b3J5LmV4aXN0cygpKSB7Ci0JCQlpZiAoIWRpcmVjdG9yeS5ta2RpcnMoKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IGNyZWF0ZSAiICsgU09VUkNFX0RJUkVDVE9SWSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCVN0cmluZyBmaWxlTmFtZSA9IFNPVVJDRV9ESVJFQ1RPUlkgKyBGaWxlLnNlcGFyYXRvciArIGNsYXNzTmFtZSArICIuamF2YSI7Ci0JCXRyeSB7Ci0JCQlCdWZmZXJlZFdyaXRlciB3cml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIoZmlsZU5hbWUpKTsKLQkJCXdyaXRlci53cml0ZShzb3VyY2UpOwotCQkJd3JpdGVyLmZsdXNoKCk7Ci0JCQl3cml0ZXIuY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIKLQkJCS5hcHBlbmQoIlwiIikKLQkJCS5hcHBlbmQoZmlsZU5hbWUpCi0JCQkuYXBwZW5kKCJcIiAtZCBcIiIpCi0JCQkuYXBwZW5kKEVWQUxfRElSRUNUT1JZKQotCQkJLmFwcGVuZCgiXCIgLW5vd2FybiAtZyAtY2xhc3NwYXRoIFwiIikKLQkJCS5hcHBlbmQoVXRpbC5nZXRKUkVEaXJlY3RvcnkoKSArICIvbGliL3J0LmphcjsiKQotCQkJLmFwcGVuZChTT1VSQ0VfRElSRUNUT1JZKQotCQkJLmFwcGVuZCgiXCIiKTsKLQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmJhdGNoLk1haW4uY29tcGlsZShidWZmZXIudG9TdHJpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGFyZVN0cnVjdHVyYWxseURpZmZlcmVudChTdHJpbmcgY2xhc3NGaWxlMSwgU3RyaW5nIGNsYXNzRmlsZTIsIGJvb2xlYW4gb3JkZXJSZXF1aXJlZCwgYm9vbGVhbiBleGNsdWRlU3ludGhldGljKSB7Ci0JCXRyeSB7Ci0JCQlDbGFzc0ZpbGVSZWFkZXIgcmVhZGVyID0gQ2xhc3NGaWxlUmVhZGVyLnJlYWQoRVZBTF9ESVJFQ1RPUlkgKyBGaWxlLnNlcGFyYXRvciArIGNsYXNzRmlsZTEgKyAiLmNsYXNzIik7Ci0JCQlpbnQgZmlsZUxlbmd0aDsKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKEVWQUxfRElSRUNUT1JZICsgRmlsZS5zZXBhcmF0b3IgKyBjbGFzc0ZpbGUyICsgIi5jbGFzcyIpOwotCQkJYnl0ZSBjbGFzc0ZpbGVCeXRlc1tdID0gbmV3IGJ5dGVbZmlsZUxlbmd0aCA9IChpbnQpIGZpbGUubGVuZ3RoKCldOwotCQkJamF2YS5pby5GaWxlSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotCQkJaW50IGJ5dGVzUmVhZCA9IDA7Ci0JCQlpbnQgbGFzdFJlYWRTaXplID0gMDsKLQkJCXdoaWxlICgobGFzdFJlYWRTaXplICE9IC0xKSAmJiAoYnl0ZXNSZWFkICE9IGZpbGVMZW5ndGgpKSB7Ci0JCQkJbGFzdFJlYWRTaXplID0gc3RyZWFtLnJlYWQoY2xhc3NGaWxlQnl0ZXMsIGJ5dGVzUmVhZCwgZmlsZUxlbmd0aCAtIGJ5dGVzUmVhZCk7Ci0JCQkJYnl0ZXNSZWFkICs9IGxhc3RSZWFkU2l6ZTsKLQkJCX0KLQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJcmV0dXJuIHJlYWRlci5oYXNTdHJ1Y3R1cmFsQ2hhbmdlcyhjbGFzc0ZpbGVCeXRlcywgb3JkZXJSZXF1aXJlZCwgZXhjbHVkZVN5bnRoZXRpYyk7Ci0JCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2goQ2xhc3NGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdDAwMSgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzb3VyY2VBMDAxID0KLQkJCQkicHVibGljIGNsYXNzIEEwMDEge1xuIiArCi0JCQkJIiAgcHVibGljIGludCBmb28oKSB7XG4iICsKLQkJCQkiICAgIHJldHVybiAyO1xuIiArCi0JCQkJIiAgfVxuIiArCi0JCQkJIiAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHtcbiIgKwotCQkJCSIgICAgcmV0dXJuIFwiaGVsbG9cIjtcbiIgKwotCQkJCSIgIH1cbiIgKwotCQkJCSJ9IjsKLQkJCWNvbXBpbGVBbmREZXBsb3koc291cmNlQTAwMSwgIkEwMDEiKTsKLQkJCVN0cmluZyBzb3VyY2VBMDAxXzIgPQotCQkJCSJwdWJsaWMgY2xhc3MgQTAwMV8yIHtcbiIgKwotCQkJCSIgIHB1YmxpYyBpbnQgZm9vKCkge1xuIiArCi0JCQkJIiAgICByZXR1cm4gMjtcbiIgKwotCQkJCSIgIH1cbiIgKwotCQkJCSIgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7XG4iICsKLQkJCQkiICAgIHJldHVybiBcImhlbGxvXCI7XG4iICsKLQkJCQkiICB9XG4iICsKLQkJCQkifSI7Ci0JCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEwMDFfMiwgIkEwMDFfMiIpOwotCQkJQXNzZXJ0LmFzc2VydFRydWUoIWFyZVN0cnVjdHVyYWxseURpZmZlcmVudCgiQTAwMSIsICJBMDAxXzIiLCBmYWxzZSwgZmFsc2UpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlbW92ZVRlbXBDbGFzcygiQTAwMSIpOwotCQl9Ci0JfQkJCQotCi0JcHVibGljIHZvaWQgdGVzdDAwMigpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzb3VyY2VBMDAyID0KLQkJCQkicHVibGljIGNsYXNzIEEwMDIge1xuIiArCi0JCQkJIiAgcHVibGljIGludCBmb28oKSB7XG4iICsKLQkJCQkiICAgIHJldHVybiAyO1xuIiArCi0JCQkJIiAgfVxuIiArCi0JCQkJIn0iOwotCQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBMDAyLCAiQTAwMiIpOwotCQkJU3RyaW5nIHNvdXJjZUEwMDJfMiA9Ci0JCQkJInB1YmxpYyBjbGFzcyBBMDAyXzIge1xuIiArCi0JCQkJIiAgcHVibGljIGludCBmb28oKSB7XG4iICsKLQkJCQkiICAgIHJldHVybiAyO1xuIiArCi0JCQkJIiAgfVxuIiArCi0JCQkJIiAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHtcbiIgKwotCQkJCSIgICAgcmV0dXJuIFwiaGVsbG9cIjtcbiIgKwotCQkJCSIgIH1cbiIgKwotCQkJCSJ9IjsKLQkJCWNvbXBpbGVBbmREZXBsb3koc291cmNlQTAwMl8yLCAiQTAwMl8yIik7Ci0JCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhcmVTdHJ1Y3R1cmFsbHlEaWZmZXJlbnQoIkEwMDIiLCAiQTAwMl8yIiwgZmFsc2UsIGZhbHNlKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZW1vdmVUZW1wQ2xhc3MoIkEwMDIiKTsKLQkJfQotCX0JCQkKLQotCXB1YmxpYyB2b2lkIHRlc3QwMDMoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc291cmNlQTAwMyA9Ci0JCQkJInB1YmxpYyBjbGFzcyBBMDAzIHtcbiIgKwotCQkJCSJwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSSA9IDU7XG4iICsKLQkJCQkifSI7Ci0JCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEwMDMsICJBMDAzIik7Ci0JCQlTdHJpbmcgc291cmNlQTAwM18yID0KLQkJCQkicHVibGljIGNsYXNzIEEwMDNfMiB7XG4iICsKLQkJCQkicHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUkgPSA2O1xuIiArCi0JCQkJIn0iOwotCQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBMDAzXzIsICJBMDAzXzIiKTsKLQkJCUFzc2VydC5hc3NlcnRUcnVlKGFyZVN0cnVjdHVyYWxseURpZmZlcmVudCgiQTAwMyIsICJBMDAzXzIiLCBmYWxzZSwgZmFsc2UpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlbW92ZVRlbXBDbGFzcygiQTAwMyIpOwotCQl9Ci0JfQkJCQotCXB1YmxpYyB2b2lkIHRlc3QwMDQoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc291cmNlQTAwNCA9Ci0JCQkJInB1YmxpYyBjbGFzcyBBMDA0IHtcbiIgKwotCQkJCSIgIHB1YmxpYyBpbnQgZm9vKCkge1xuIiArCi0JCQkJIiAgICByZXR1cm4gMjtcbiIgKwotCQkJCSIgIH1cbiIgKwotCQkJCSIgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7XG4iICsKLQkJCQkiICAgIHJldHVybiBcImhlbGxvXCI7XG4iICsKLQkJCQkiICB9XG4iICsKLQkJCQkifSI7Ci0JCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEwMDQsICJBMDA0Iik7Ci0JCQlTdHJpbmcgc291cmNlQTAwNF8yID0KLQkJCQkicHVibGljIGNsYXNzIEEwMDRfMiB7XG4iICsKLQkJCQkiICBwdWJsaWMgaW50IGZvbygpIHtcbiIgKwotCQkJCSIgICAgcmV0dXJuIDI7XG4iICsKLQkJCQkiICB9XG4iICsKLQkJCQkiICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkge1xuIiArCi0JCQkJIiAgICByZXR1cm4gXCJoZWxsb1wiO1xuIiArCi0JCQkJIiAgfVxuIiArCi0JCQkJIn0iOwotCQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBMDA0XzIsICJBMDA0XzIiKTsKLQkJCUFzc2VydC5hc3NlcnRUcnVlKCFhcmVTdHJ1Y3R1cmFsbHlEaWZmZXJlbnQoIkEwMDQiLCAiQTAwNF8yIiwgdHJ1ZSwgdHJ1ZSkpOwotCQl9IGZpbmFsbHkgewotCQkJcmVtb3ZlVGVtcENsYXNzKCJBMDA0Iik7Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgdGVzdDAwNSgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzb3VyY2VBMDA1ID0KLQkJCQkicHVibGljIGNsYXNzIEEwMDUge1xuIiArCi0JCQkJIiAgcHVibGljIGludCBmb28oKSB7XG4iICsKLQkJCQkiICAgIHJldHVybiAyO1xuIiArCi0JCQkJIiAgfVxuIiArCi0JCQkJIn0iOwotCQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBMDA1LCAiQTAwNSIpOwotCQkJU3RyaW5nIHNvdXJjZUEwMDVfMiA9Ci0JCQkJInB1YmxpYyBjbGFzcyBBMDA1XzIge1xuIiArCi0JCQkJIiAgcHVibGljIGludCBmb28oKSB7XG4iICsKLQkJCQkiICAgIHJldHVybiAyO1xuIiArCi0JCQkJIiAgfVxuIiArCi0JCQkJIiAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHtcbiIgKwotCQkJCSIgICAgcmV0dXJuIFwiaGVsbG9cIjtcbiIgKwotCQkJCSIgIH1cbiIgKwotCQkJCSJ9IjsKLQkJCWNvbXBpbGVBbmREZXBsb3koc291cmNlQTAwNV8yLCAiQTAwNV8yIik7Ci0JCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhcmVTdHJ1Y3R1cmFsbHlEaWZmZXJlbnQoIkEwMDUiLCAiQTAwNV8yIiwgdHJ1ZSwgdHJ1ZSkpOwotCQl9IGZpbmFsbHkgewotCQkJcmVtb3ZlVGVtcENsYXNzKCJBMDA1Iik7Ci0JCX0KLQl9CQotCXB1YmxpYyB2b2lkIHRlc3QwMDYoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc291cmNlQTAwNiA9Ci0JCQkJInB1YmxpYyBjbGFzcyBBMDA2IHtcbiIgKwotCQkJCSJwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSSA9IDU7XG4iICsKLQkJCQkifSI7Ci0JCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEwMDYsICJBMDA2Iik7Ci0JCQlTdHJpbmcgc291cmNlQTAwNl8yID0KLQkJCQkicHVibGljIGNsYXNzIEEwMDZfMiB7XG4iICsKLQkJCQkicHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUkgPSA2O1xuIiArCi0JCQkJIn0iOwotCQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBMDA2XzIsICJBMDA2XzIiKTsKLQkJCUFzc2VydC5hc3NlcnRUcnVlKGFyZVN0cnVjdHVyYWxseURpZmZlcmVudCgiQTAwNiIsICJBMDA2XzIiLCB0cnVlLCB0cnVlKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZW1vdmVUZW1wQ2xhc3MoIkEwMDYiKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MDA3KCkgewotCQl0cnkgewotCQkJU3RyaW5nIHNvdXJjZUEwMDcgPQotCQkJCSJwdWJsaWMgY2xhc3MgQTAwNyB7XG4iICsKLQkJCQkicHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUkgPSA2O1xuIiArCi0JCQkJInB1YmxpYyBSdW5uYWJsZSBmb28oKSB7XG4iICsKLQkJCQkiXHRyZXR1cm4gbnVsbDtcbiIrCi0JCQkJIn1cbiIgKwotCQkJCSJ9IjsKLQkJCWNvbXBpbGVBbmREZXBsb3koc291cmNlQTAwNywgIkEwMDciKTsKLQkJCVN0cmluZyBzb3VyY2VBMDA3XzIgPQotCQkJCSJwdWJsaWMgY2xhc3MgQTAwN18yIHtcbiIgKwotCQkJCSJwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSSA9IDY7XG4iICsKLQkJCQkicHVibGljIFJ1bm5hYmxlIGZvbygpIHtcbiIgKwotCQkJCSJcdHJldHVybiBuZXcgUnVubmFibGUoKSB7cHVibGljIHZvaWQgcnVuKCkge319O1xuIisKLQkJCQkifVxuIiArCi0JCQkJIn0iOwotCQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBMDA3XzIsICJBMDA3XzIiKTsKLQkJCUFzc2VydC5hc3NlcnRUcnVlKCFhcmVTdHJ1Y3R1cmFsbHlEaWZmZXJlbnQoIkEwMDciLCAiQTAwN18yIiwgdHJ1ZSwgdHJ1ZSkpOwotCQl9IGZpbmFsbHkgewotCQkJcmVtb3ZlVGVtcENsYXNzKCJBMDA3Iik7Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgdGVzdDAwOCgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzb3VyY2VBMDA4ID0KLQkJCQkicHVibGljIGNsYXNzIEEwMDgge1xuIiArCi0JCQkJInByaXZhdGUgaW50IGkgPSA2O1xuIiArCi0JCQkJInB1YmxpYyBpbnQgZm9vKCkge1xuIiArCi0JCQkJIlx0cmV0dXJuIGk7XG4iKwotCQkJCSJ9XG4iICsKLQkJCQkifSI7Ci0JCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEwMDgsICJBMDA4Iik7Ci0JCQlTdHJpbmcgc291cmNlQTAwOF8yID0KLQkJCQkicHVibGljIGNsYXNzIEEwMDhfMiB7XG4iICsKLQkJCQkicHJpdmF0ZSBpbnQgaSA9IDY7XG4iICsKLQkJCQkicHVibGljIGludCBmb28oKSB7XG4iICsKLQkJCQkiXHRyZXR1cm4gMjtcbiIrCi0JCQkJIn1cbiIgKwotCQkJCSJ9IjsKLQkJCWNvbXBpbGVBbmREZXBsb3koc291cmNlQTAwOF8yLCAiQTAwOF8yIik7Ci0JCQlBc3NlcnQuYXNzZXJ0VHJ1ZSghYXJlU3RydWN0dXJhbGx5RGlmZmVyZW50KCJBMDA4IiwgIkEwMDhfMiIsIHRydWUsIGZhbHNlKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZW1vdmVUZW1wQ2xhc3MoIkEwMDgiKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MDA5KCkgewotCQl0cnkgewotCQkJU3RyaW5nIHNvdXJjZUEwMDkgPQotCQkJCSJwdWJsaWMgY2xhc3MgQTAwOSB7XG4iICsKLQkJCQkicHJpdmF0ZSBpbnQgaSA9IDY7XG4iICsKLQkJCQkicHVibGljIGludCBmb28oKSB7XG4iICsKLQkJCQkiXHRjbGFzcyBBIHtcbiIgKwotCQkJCSJcdFx0aW50IGdldCgpIHtcbiIgKwotCQkJCSJcdFx0XHRyZXR1cm4gaTtcbiIgKwotCQkJCSJcdFx0fVxuIiArCi0JCQkJIlx0fVxuIiArCi0JCQkJIlx0cmV0dXJuIG5ldyBBKCkuZ2V0KCk7XG4iICsKLQkJCQkifVxuIiArCi0JCQkJIn0iOwotCQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBMDA5LCAiQTAwOSIpOwotCQkJU3RyaW5nIHNvdXJjZUEwMDlfMiA9Ci0JCQkJInB1YmxpYyBjbGFzcyBBMDA5XzIge1xuIiArCi0JCQkJInByaXZhdGUgaW50IGkgPSA2O1xuIiArCi0JCQkJInB1YmxpYyBpbnQgZm9vKCkge1xuIiArCi0JCQkJIlx0cmV0dXJuIDI7XG4iKwotCQkJCSJ9XG4iICsKLQkJCQkifSI7Ci0JCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEwMDlfMiwgIkEwMDlfMiIpOwotCQkJQXNzZXJ0LmFzc2VydFRydWUoYXJlU3RydWN0dXJhbGx5RGlmZmVyZW50KCJBMDA5IiwgIkEwMDlfMiIsIHRydWUsIGZhbHNlKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZW1vdmVUZW1wQ2xhc3MoIkEwMDkiKTsKLQkJfQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0MDEwKCkgewotCQl0cnkgewotCQkJU3RyaW5nIHNvdXJjZUEwMTAgPQotCQkJCSJwdWJsaWMgY2xhc3MgQTAxMCB7XG4iICsKLQkJCQkicHJpdmF0ZSBpbnQgaSA9IDY7XG4iICsKLQkJCQkicHVibGljIGludCBmb28oKSB7XG4iICsKLQkJCQkiXHRjbGFzcyBBIHtcbiIgKwotCQkJCSJcdFx0aW50IGdldCgpIHtcbiIgKwotCQkJCSJcdFx0XHRyZXR1cm4gaTtcbiIgKwotCQkJCSJcdFx0fVxuIiArCi0JCQkJIlx0fVxuIiArCi0JCQkJIlx0cmV0dXJuIG5ldyBBKCkuZ2V0KCk7XG4iICsKLQkJCQkifVxuIiArCi0JCQkJIn0iOwotCQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBMDEwLCAiQTAxMCIpOwotCQkJU3RyaW5nIHNvdXJjZUEwMTBfMiA9Ci0JCQkJInB1YmxpYyBjbGFzcyBBMDEwXzIge1xuIiArCi0JCQkJInByaXZhdGUgaW50IGkgPSA2O1xuIiArCi0JCQkJInB1YmxpYyBpbnQgZm9vKCkge1xuIiArCi0JCQkJIlx0cmV0dXJuIDI7XG4iKwotCQkJCSJ9XG4iICsKLQkJCQkifSI7Ci0JCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEwMTBfMiwgIkEwMTBfMiIpOwotCQkJQXNzZXJ0LmFzc2VydFRydWUoIWFyZVN0cnVjdHVyYWxseURpZmZlcmVudCgiQTAxMCIsICJBMDEwXzIiLCB0cnVlLCB0cnVlKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZW1vdmVUZW1wQ2xhc3MoIkEwMTAiKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MDExKCkgewotCQl0cnkgewotCQkJU3RyaW5nIHNvdXJjZUEwMTEgPQotCQkJCSJwdWJsaWMgY2xhc3MgQTAxMSB7XG4iICsKLQkJCQkicHJpdmF0ZSBpbnQgaSA9IDY7XG4iICsKLQkJCQkicHVibGljIGludCBmb28oKSB7XG4iICsKLQkJCQkiXHRjbGFzcyBBIHtcbiIgKwotCQkJCSJcdFx0aW50IGdldCgpIHtcbiIgKwotCQkJCSJcdFx0XHRyZXR1cm4gaTtcbiIgKwotCQkJCSJcdFx0fVxuIiArCi0JCQkJIlx0fVxuIiArCi0JCQkJIlx0cmV0dXJuIG5ldyBBKCkuZ2V0KCk7XG4iICsKLQkJCQkifVxuIiArCi0JCQkJIn0iOwotCQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBMDExLCAiQTAxMSIpOwotCQkJU3RyaW5nIHNvdXJjZUEwMTFfMiA9Ci0JCQkJInB1YmxpYyBjbGFzcyBBMDExXzIge1xuIiArCi0JCQkJInByaXZhdGUgaW50IGkgPSA2O1xuIiArCi0JCQkJInB1YmxpYyBpbnQgZm9vKCkge1xuIiArCi0JCQkJIlx0cmV0dXJuIDI7XG4iKwotCQkJCSJ9XG4iICsKLQkJCQkifSI7Ci0JCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEwMTFfMiwgIkEwMTFfMiIpOwotCQkJQXNzZXJ0LmFzc2VydFRydWUoIWFyZVN0cnVjdHVyYWxseURpZmZlcmVudCgiQTAxMSIsICJBMDExXzIiLCBmYWxzZSwgdHJ1ZSkpOwotCQl9IGZpbmFsbHkgewotCQkJcmVtb3ZlVGVtcENsYXNzKCJBMDExIik7Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgdGVzdDAxMigpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzb3VyY2VBMDEyID0KLQkJCQkicHVibGljIGNsYXNzIEEwMTIge1xuIiArCi0JCQkJInB1YmxpYyBDbGFzcyBmb28oKSB7XG4iICsKLQkJCQkiXHRyZXR1cm4gbnVsbDtcbiIgKwotCQkJCSJ9XG4iICsKLQkJCQkifSI7Ci0JCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEwMTIsICJBMDEyIik7Ci0JCQlTdHJpbmcgc291cmNlQTAxMl8yID0KLQkJCQkicHVibGljIGNsYXNzIEEwMTJfMiB7XG4iICsKLQkJCQkicHVibGljIENsYXNzIGZvbygpIHtcbiIgKwotCQkJCSJcdHJldHVybiBBMDEyXzIuY2xhc3M7XG4iICsKLQkJCQkifVxuIiArCi0JCQkJIn0iOwotCQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBMDEyXzIsICJBMDEyXzIiKTsKLQkJCUFzc2VydC5hc3NlcnRUcnVlKGFyZVN0cnVjdHVyYWxseURpZmZlcmVudCgiQTAxMiIsICJBMDEyXzIiLCBmYWxzZSwgZmFsc2UpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlbW92ZVRlbXBDbGFzcygiQTAxMiIpOwotCQl9Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3QwMTMoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc291cmNlQTAxMyA9Ci0JCQkJInB1YmxpYyBjbGFzcyBBMDEzIHtcbiIgKwotCQkJCSJwdWJsaWMgQ2xhc3MgZm9vKCkge1xuIiArCi0JCQkJIlx0cmV0dXJuIG51bGw7XG4iICsKLQkJCQkifVxuIiArCi0JCQkJIn0iOwotCQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBMDEzLCAiQTAxMyIpOwotCQkJU3RyaW5nIHNvdXJjZUEwMTNfMiA9Ci0JCQkJInB1YmxpYyBjbGFzcyBBMDEzXzIge1xuIiArCi0JCQkJInB1YmxpYyBDbGFzcyBmb28oKSB7XG4iICsKLQkJCQkiXHRyZXR1cm4gQTAxM18yLmNsYXNzO1xuIiArCi0JCQkJIn1cbiIgKwotCQkJCSJ9IjsKLQkJCWNvbXBpbGVBbmREZXBsb3koc291cmNlQTAxM18yLCAiQTAxM18yIik7Ci0JCQlBc3NlcnQuYXNzZXJ0VHJ1ZSghYXJlU3RydWN0dXJhbGx5RGlmZmVyZW50KCJBMDEzIiwgIkEwMTNfMiIsIGZhbHNlLCB0cnVlKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZW1vdmVUZW1wQ2xhc3MoIkEwMTMiKTsKLQkJfQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0MDE0KCkgewotCQl0cnkgewotCQkJU3RyaW5nIHNvdXJjZUEwMTQgPQotCQkJCSJwdWJsaWMgY2xhc3MgQTAxNCB7XG4iICsKLQkJCQkicHVibGljIENsYXNzIGZvbygpIHtcbiIgKwotCQkJCSJcdHJldHVybiBudWxsO1xuIiArCi0JCQkJIn1cbiIgKwotCQkJCSJ9IjsKLQkJCWNvbXBpbGVBbmREZXBsb3koc291cmNlQTAxNCwgIkEwMTQiKTsKLQkJCVN0cmluZyBzb3VyY2VBMDE0XzIgPQotCQkJCSJwdWJsaWMgY2xhc3MgQTAxNF8yIHtcbiIgKwotCQkJCSJwdWJsaWMgQ2xhc3MgZm9vKCkge1xuIiArCi0JCQkJIlx0cmV0dXJuIEEwMTRfMi5jbGFzcztcbiIgKwotCQkJCSJ9XG4iICsKLQkJCQkifSI7Ci0JCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEwMTRfMiwgIkEwMTRfMiIpOwotCQkJQXNzZXJ0LmFzc2VydFRydWUoIWFyZVN0cnVjdHVyYWxseURpZmZlcmVudCgiQTAxNCIsICJBMDE0XzIiLCB0cnVlLCB0cnVlKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZW1vdmVUZW1wQ2xhc3MoIkEwMTQiKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MDE1KCkgewotCQl0cnkgewotCQkJU3RyaW5nIHNvdXJjZUEwMTUgPQotCQkJCSJwdWJsaWMgY2xhc3MgQTAxNSB7XG4iICsKLQkJCQkiCXB1YmxpYyBjbGFzcyBCIHtcbiIgKwotCQkJCSIJfVxuIiArCi0JCQkJIiAgcHVibGljIGludCBmb28oKSB7XG4iICsKLQkJCQkiICAgIHJldHVybiAyO1xuIiArCi0JCQkJIiAgfVxuIiArCi0JCQkJIiAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHtcbiIgKwotCQkJCSIgICAgcmV0dXJuIFwiaGVsbG9cIjtcbiIgKwotCQkJCSIgIH1cbiIgKwotCQkJCSJ9IjsKLQkJCWNvbXBpbGVBbmREZXBsb3koc291cmNlQTAxNSwgIkEwMTUiKTsKLQkJCUFzc2VydC5hc3NlcnRUcnVlKCFhcmVTdHJ1Y3R1cmFsbHlEaWZmZXJlbnQoIkEwMTUkQiIsICJBMDE1JEIiLCBmYWxzZSwgZmFsc2UpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlbW92ZVRlbXBDbGFzcygiQTAxNSIpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3QwMTYoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc291cmNlQTAxNiA9Ci0JCQkJInB1YmxpYyBjbGFzcyBBMDE2IHtcbiIgKwotCQkJCSJwdWJsaWMgdm9pZCBib28oKSB7XG4iICsKLQkJCQkifVxuIiArCi0JCQkJIn0iOwotCQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBMDE2LCAiQTAxNiIpOwotCQkJU3RyaW5nIHNvdXJjZUEwMTZfMiA9Ci0JCQkJInB1YmxpYyBjbGFzcyBBMDE2XzIge1xuIiArCi0JCQkJInB1YmxpYyB2b2lkIGZvbygpIHtcbiIgKwotCQkJCSJ9XG4iICsKLQkJCQkifSI7Ci0JCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEwMTZfMiwgIkEwMTZfMiIpOwotCQkJQXNzZXJ0LmFzc2VydFRydWUoYXJlU3RydWN0dXJhbGx5RGlmZmVyZW50KCJBMDE2IiwgIkEwMTZfMiIsIGZhbHNlLCBmYWxzZSkpOwotCQl9IGZpbmFsbHkgewotCQkJcmVtb3ZlVGVtcENsYXNzKCJBMDE2Iik7Ci0JCX0KLQl9CQkJCQkKLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9yZWdyZXNzaW9uL0NsYXNzRmlsZVJlYWRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9yZWdyZXNzaW9uL0NsYXNzRmlsZVJlYWRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFhZTJiOS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcmVncmVzc2lvbi9DbGFzc0ZpbGVSZWFkZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIucmVncmVzc2lvbjsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Ub29sRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy51dGlsLlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JQ2xhc3NGaWxlUmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNvZGVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5JRXhjZXB0aW9uVGFibGVFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklMaW5lTnVtYmVyQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSU1ldGhvZEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRm9ybWF0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5NZXRob2RJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeU1ldGhvZDsKLQotcHVibGljIGNsYXNzIENsYXNzRmlsZVJlYWRlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdFJlZ3Jlc3Npb25UZXN0IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX0RJUkVDVE9SWSA9IFV0aWwuZ2V0T3V0cHV0RGlyZWN0b3J5KCkgICsgRmlsZS5zZXBhcmF0b3IgKyAic291cmNlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZBTF9ESVJFQ1RPUlkgPSBVdGlsLmdldE91dHB1dERpcmVjdG9yeSgpICArIEZpbGUuc2VwYXJhdG9yICsgImV2YWwiOwotCi0JcHVibGljIENsYXNzRmlsZVJlYWRlclRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIHNldHVwU3VpdGUodGVzdENsYXNzKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ2xhc3MgdGVzdENsYXNzKCkgewotCQlyZXR1cm4gQ2xhc3NGaWxlUmVhZGVyVGVzdC5jbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVUZW1wQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlGaWxlIGRpciA9IG5ldyBGaWxlKFNPVVJDRV9ESVJFQ1RPUlkpOwotCQlTdHJpbmdbXSBmaWxlTmFtZXMgPSBkaXIubGlzdCgpOwotCQlpZiAoZmlsZU5hbWVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBmaWxlTmFtZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCQlpZiAoZmlsZU5hbWVzW2ldLmluZGV4T2YoY2xhc3NOYW1lKSAhPSAtMSkgewotCQkJCQluZXcgRmlsZShTT1VSQ0VfRElSRUNUT1JZICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlTmFtZXNbaV0pLmRlbGV0ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJZGlyID0gbmV3IEZpbGUoRVZBTF9ESVJFQ1RPUlkpOwotCQlmaWxlTmFtZXMgPSBkaXIubGlzdCgpOwotCQlpZiAoZmlsZU5hbWVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBmaWxlTmFtZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCQlpZiAoZmlsZU5hbWVzW2ldLmluZGV4T2YoY2xhc3NOYW1lKSAhPSAtMSkgewotCQkJCQluZXcgRmlsZShFVkFMX0RJUkVDVE9SWSArIEZpbGUuc2VwYXJhdG9yICsgZmlsZU5hbWVzW2ldKS5kZWxldGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb21waWxlQW5kRGVwbG95KFN0cmluZyBzb3VyY2UsIFN0cmluZyBjbGFzc05hbWUpIHsKLQkJRmlsZSBkaXJlY3RvcnkgPSBuZXcgRmlsZShTT1VSQ0VfRElSRUNUT1JZKTsKLQkJaWYgKCFkaXJlY3RvcnkuZXhpc3RzKCkpIHsKLQkJCWlmICghZGlyZWN0b3J5Lm1rZGlycygpKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgY3JlYXRlICIgKyBTT1VSQ0VfRElSRUNUT1JZKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGZpbGVOYW1lID0gU09VUkNFX0RJUkVDVE9SWSArIEZpbGUuc2VwYXJhdG9yICsgY2xhc3NOYW1lICsgIi5qYXZhIjsKLQkJdHJ5IHsKLQkJCUJ1ZmZlcmVkV3JpdGVyIHdyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihmaWxlTmFtZSkpOwotCQkJd3JpdGVyLndyaXRlKHNvdXJjZSk7Ci0JCQl3cml0ZXIuZmx1c2goKTsKLQkJCXdyaXRlci5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlcgotCQkJLmFwcGVuZCgiXCIiKQotCQkJLmFwcGVuZChmaWxlTmFtZSkKLQkJCS5hcHBlbmQoIlwiIC1kIFwiIikKLQkJCS5hcHBlbmQoRVZBTF9ESVJFQ1RPUlkpCi0JCQkuYXBwZW5kKCJcIiAtcHJlc2VydmVBbGxMb2NhbHMgLW5vd2FybiAtZyAtY2xhc3NwYXRoIFwiIikKLQkJCS5hcHBlbmQoVXRpbC5nZXRKUkVEaXJlY3RvcnkoKSArICIvbGliL3J0LmphcjsiKQotCQkJLmFwcGVuZChTT1VSQ0VfRElSRUNUT1JZKQotCQkJLmFwcGVuZCgiXCIiKTsKLQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmJhdGNoLk1haW4uY29tcGlsZShidWZmZXIudG9TdHJpbmcoKSk7Ci0JfQotCQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MDUxCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwMSgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzb3VyY2VBMDAxID0KLQkJCQkicHVibGljIGNsYXNzIEEwMDEge1xuIiArCi0JCQkJIglwcml2YXRlIGludCBpID0gNjtcbiIgKwotCQkJCSIJcHVibGljIGludCBmb28oKSB7XG4iICsKLQkJCQkiCQljbGFzcyBBIHtcbiIgKwotCQkJCSIJCQlpbnQgZ2V0KCkge1xuIiArCi0JCQkJIgkJCQlyZXR1cm4gaTtcbiIgKwotCQkJCSIJCQl9XG4iICsKLQkJCQkiCQl9XG4iICsKLQkJCQkiCQlyZXR1cm4gbmV3IEEoKS5nZXQoKTtcbiIgKwotCQkJCSIJfVxuIiArCi0JCQkJIn07IjsKLQkJCWNvbXBpbGVBbmREZXBsb3koc291cmNlQTAwMSwgIkEwMDEiKTsKLQkJCXRyeSB7Ci0JCQkJb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZVJlYWRlciBjbGFzc0ZpbGVSZWFkZXIgPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlUmVhZGVyLnJlYWQoRVZBTF9ESVJFQ1RPUlkgKyBGaWxlLnNlcGFyYXRvciArICJBMDAxLmNsYXNzIik7Ci0JCQkJSUJpbmFyeU1ldGhvZFtdIG1ldGhvZHMgPSBjbGFzc0ZpbGVSZWFkZXIuZ2V0TWV0aG9kcygpOwotCQkJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDMsIG1ldGhvZHMubGVuZ3RoKTsKLQkJCQlNZXRob2RJbmZvIG1ldGhvZEluZm8gPSAoTWV0aG9kSW5mbykgbWV0aG9kc1syXTsKLQkJCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAiYWNjZXNzJDAiLCBuZXcgU3RyaW5nKG1ldGhvZEluZm8uZ2V0U2VsZWN0b3IoKSkpOwotCQkJCWFzc2VydFRydWUoIk5vdCBzeW50aGV0aWMiLCBtZXRob2RJbmZvLmlzU3ludGhldGljKCkpOwotCQkJfSBjYXRjaCAoQ2xhc3NGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCWFzc2VydFRydWUoZmFsc2UpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWFzc2VydFRydWUoZmFsc2UpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJcmVtb3ZlVGVtcENsYXNzKCJBMDAxIik7Ci0JCX0KLQl9CQkJCi0KLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTE4OAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDIoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc291cmNlQTAwMiA9Ci0JCQkJInB1YmxpYyBjbGFzcyBBMDAyIHtcbiIgKwotCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArCi0JCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKCk7IC8qIFxcdTAwMGQ6IENBUlJJQUdFIFJFVFVSTiAqL1xuIiArCi0JCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKCk7XG4iICsKLQkJCQkiCX1cbiIgKwotCQkJCSJ9IjsKLQkJCWNvbXBpbGVBbmREZXBsb3koc291cmNlQTAwMiwgIkEwMDIiKTsKLQkJCUlDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyID0gVG9vbEZhY3RvcnkuY3JlYXRlRGVmYXVsdENsYXNzRmlsZVJlYWRlcihFVkFMX0RJUkVDVE9SWSArIEZpbGUuc2VwYXJhdG9yICsgIkEwMDIuY2xhc3MiLCBJQ2xhc3NGaWxlUmVhZGVyLkFMTCk7Ci0JCQlJTWV0aG9kSW5mb1tdIG1ldGhvZEluZm9zID0gY2xhc3NGaWxlUmVhZGVyLmdldE1ldGhvZEluZm9zKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAyLCBtZXRob2RJbmZvcy5sZW5ndGgpOwotCQkJSU1ldGhvZEluZm8gbWV0aG9kSW5mbyA9IG1ldGhvZEluZm9zWzFdOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgIm1haW4iLCBuZXcgU3RyaW5nKG1ldGhvZEluZm8uZ2V0TmFtZSgpKSk7Ci0JCQlJQ29kZUF0dHJpYnV0ZSBjb2RlQXR0cmlidXRlID0gbWV0aG9kSW5mby5nZXRDb2RlQXR0cmlidXRlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJObyBjb2RlIGF0dHJpYnV0ZSIsIGNvZGVBdHRyaWJ1dGUpOwotCQkJSUxpbmVOdW1iZXJBdHRyaWJ1dGUgbGluZU51bWJlckF0dHJpYnV0ZSA9IGNvZGVBdHRyaWJ1dGUuZ2V0TGluZU51bWJlckF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUiLCBsaW5lTnVtYmVyQXR0cmlidXRlKTsKLQkJCWludFtdW10gbGluZU51bWJlclRhYmxlID0gbGluZU51bWJlckF0dHJpYnV0ZS5nZXRMaW5lTnVtYmVyVGFibGUoKTsKLQkJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDMsIGxpbmVOdW1iZXJUYWJsZS5sZW5ndGgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1swXSIsIDAsIGxpbmVOdW1iZXJUYWJsZVswXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMF0iLCAzLCBsaW5lTnVtYmVyVGFibGVbMF1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1sxXSIsIDYsIGxpbmVOdW1iZXJUYWJsZVsxXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMV0iLCA0LCBsaW5lTnVtYmVyVGFibGVbMV1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1syXSIsIDEyLCBsaW5lTnVtYmVyVGFibGVbMl1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzJdIiwgNSwgbGluZU51bWJlclRhYmxlWzJdWzFdKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlbW92ZVRlbXBDbGFzcygiQTAwMiIpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2MDk4Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwMygpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzb3VyY2VBMDAzID0KLQkJCQkicHVibGljIGNsYXNzIEEwMDMge1xuIiArCi0JCQkJIlxuIiArCi0JCQkJIglwdWJsaWMgaW50IGJhcigpIHtcbiIgKwotCQkJCSIJCXJldHVybiAwO1xuIiArCi0JCQkJIgl9XG4iICsKLQkJCQkiCVxuIiArCi0JCQkJIglwdWJsaWMgdm9pZCBmb28oKSB7XG4iICsKLQkJCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oYmFyKCkpO1xuIiArCi0JCQkJIgl9XG4iICsKLQkJCQkifSI7Ci0JCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEwMDMsICJBMDAzIik7Ci0JCQlJQ2xhc3NGaWxlUmVhZGVyIGNsYXNzRmlsZVJlYWRlciA9IFRvb2xGYWN0b3J5LmNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVSZWFkZXIoRVZBTF9ESVJFQ1RPUlkgKyBGaWxlLnNlcGFyYXRvciArICJBMDAzLmNsYXNzIiwgSUNsYXNzRmlsZVJlYWRlci5BTEwpOwotCQkJSU1ldGhvZEluZm9bXSBtZXRob2RJbmZvcyA9IGNsYXNzRmlsZVJlYWRlci5nZXRNZXRob2RJbmZvcygpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMywgbWV0aG9kSW5mb3MubGVuZ3RoKTsKLQkJCUlNZXRob2RJbmZvIG1ldGhvZEluZm8gPSBtZXRob2RJbmZvc1syXTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJmb28iLCBuZXcgU3RyaW5nKG1ldGhvZEluZm8uZ2V0TmFtZSgpKSk7Ci0JCQlJQ29kZUF0dHJpYnV0ZSBjb2RlQXR0cmlidXRlID0gbWV0aG9kSW5mby5nZXRDb2RlQXR0cmlidXRlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJObyBjb2RlIGF0dHJpYnV0ZSIsIGNvZGVBdHRyaWJ1dGUpOwotCQkJSUxpbmVOdW1iZXJBdHRyaWJ1dGUgbGluZU51bWJlckF0dHJpYnV0ZSA9IGNvZGVBdHRyaWJ1dGUuZ2V0TGluZU51bWJlckF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUiLCBsaW5lTnVtYmVyQXR0cmlidXRlKTsKLQkJCWludFtdW10gbGluZU51bWJlclRhYmxlID0gbGluZU51bWJlckF0dHJpYnV0ZS5nZXRMaW5lTnVtYmVyVGFibGUoKTsKLQkJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDIsIGxpbmVOdW1iZXJUYWJsZS5sZW5ndGgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1swXSIsIDAsIGxpbmVOdW1iZXJUYWJsZVswXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMF0iLCA4LCBsaW5lTnVtYmVyVGFibGVbMF1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1sxXSIsIDEwLCBsaW5lTnVtYmVyVGFibGVbMV1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzFdIiwgOSwgbGluZU51bWJlclRhYmxlWzFdWzFdKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlbW92ZVRlbXBDbGFzcygiQTAwMyIpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NzUzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwNCgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzb3VyY2VBID0KLQkJCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsKLQkJCQkiCQlib29sZWFuIGIgPSBmYWxzZTtcbiIgKwotCQkJCSIJCWludCBpID0gNjtcbiIgKwotCQkJCSIJCWlmICgoaSA9PSA2KSBcbiIgKwotCQkJCSIJCSAgICYmICFiKSB7ICAgCVxuIiArCi0JCQkJIgkJICAgCVN5c3RlbS5vdXQucHJpbnRsbihpKTtcbiIgKwotCQkJCSIJCSAgIH1cbiIgKwotCQkJCSIJfVxuIiArCi0JCQkJIn0iOwotCQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBLCAiQSIpOwotCQkJSUNsYXNzRmlsZVJlYWRlciBjbGFzc0ZpbGVSZWFkZXIgPSBUb29sRmFjdG9yeS5jcmVhdGVEZWZhdWx0Q2xhc3NGaWxlUmVhZGVyKEVWQUxfRElSRUNUT1JZICsgRmlsZS5zZXBhcmF0b3IgKyAiQS5jbGFzcyIsIElDbGFzc0ZpbGVSZWFkZXIuQUxMKTsKLQkJCUlNZXRob2RJbmZvW10gbWV0aG9kSW5mb3MgPSBjbGFzc0ZpbGVSZWFkZXIuZ2V0TWV0aG9kSW5mb3MoKTsKLQkJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDIsIG1ldGhvZEluZm9zLmxlbmd0aCk7Ci0JCQlJTWV0aG9kSW5mbyBtZXRob2RJbmZvID0gbWV0aG9kSW5mb3NbMV07Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAibWFpbiIsIG5ldyBTdHJpbmcobWV0aG9kSW5mby5nZXROYW1lKCkpKTsKLQkJCUlDb2RlQXR0cmlidXRlIGNvZGVBdHRyaWJ1dGUgPSBtZXRob2RJbmZvLmdldENvZGVBdHRyaWJ1dGUoKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGNvZGUgYXR0cmlidXRlIiwgY29kZUF0dHJpYnV0ZSk7Ci0JCQlJTGluZU51bWJlckF0dHJpYnV0ZSBsaW5lTnVtYmVyQXR0cmlidXRlID0gY29kZUF0dHJpYnV0ZS5nZXRMaW5lTnVtYmVyQXR0cmlidXRlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJObyBjb2RlIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZSIsIGxpbmVOdW1iZXJBdHRyaWJ1dGUpOwotCQkJaW50W11bXSBsaW5lTnVtYmVyVGFibGUgPSBsaW5lTnVtYmVyQXR0cmlidXRlLmdldExpbmVOdW1iZXJUYWJsZSgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgNiwgbGluZU51bWJlclRhYmxlLmxlbmd0aCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzBdIiwgMCwgbGluZU51bWJlclRhYmxlWzBdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVswXSIsIDMsIGxpbmVOdW1iZXJUYWJsZVswXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzFdIiwgMiwgbGluZU51bWJlclRhYmxlWzFdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVsxXSIsIDQsIGxpbmVOdW1iZXJUYWJsZVsxXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzJdIiwgNSwgbGluZU51bWJlclRhYmxlWzJdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVsyXSIsIDUsIGxpbmVOdW1iZXJUYWJsZVsyXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzNdIiwgMTEsIGxpbmVOdW1iZXJUYWJsZVszXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbM10iLCA2LCBsaW5lTnVtYmVyVGFibGVbM11bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1s0XSIsIDE1LCBsaW5lTnVtYmVyVGFibGVbNF1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzRdIiwgNywgbGluZU51bWJlclRhYmxlWzRdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbNV0iLCAyMiwgbGluZU51bWJlclRhYmxlWzVdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVs1XSIsIDksIGxpbmVOdW1iZXJUYWJsZVs1XVsxXSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZW1vdmVUZW1wQ2xhc3MoIkEiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NzUzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwNSgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzb3VyY2VBID0KLQkJCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsKLQkJCQkiCQlpbnQgaSA9IDY7XG4iICsKLQkJCQkiCQlpZiAoKGkgPT0gNikgXG4iICsKLQkJCQkiCQkgICAmJiB0cnVlKSB7ICAgCVxuIiArCi0JCQkJIgkJICAgCVN5c3RlbS5vdXQucHJpbnRsbihpKTtcbiIgKwotCQkJCSIJCSAgIH1cbiIgKwotCQkJCSIJfVxuIiArCi0JCQkJIn0iOwotCQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBLCAiQSIpOwotCQkJSUNsYXNzRmlsZVJlYWRlciBjbGFzc0ZpbGVSZWFkZXIgPSBUb29sRmFjdG9yeS5jcmVhdGVEZWZhdWx0Q2xhc3NGaWxlUmVhZGVyKEVWQUxfRElSRUNUT1JZICsgRmlsZS5zZXBhcmF0b3IgKyAiQS5jbGFzcyIsIElDbGFzc0ZpbGVSZWFkZXIuQUxMKTsKLQkJCUlNZXRob2RJbmZvW10gbWV0aG9kSW5mb3MgPSBjbGFzc0ZpbGVSZWFkZXIuZ2V0TWV0aG9kSW5mb3MoKTsKLQkJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDIsIG1ldGhvZEluZm9zLmxlbmd0aCk7Ci0JCQlJTWV0aG9kSW5mbyBtZXRob2RJbmZvID0gbWV0aG9kSW5mb3NbMV07Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAibWFpbiIsIG5ldyBTdHJpbmcobWV0aG9kSW5mby5nZXROYW1lKCkpKTsKLQkJCUlDb2RlQXR0cmlidXRlIGNvZGVBdHRyaWJ1dGUgPSBtZXRob2RJbmZvLmdldENvZGVBdHRyaWJ1dGUoKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGNvZGUgYXR0cmlidXRlIiwgY29kZUF0dHJpYnV0ZSk7Ci0JCQlJTGluZU51bWJlckF0dHJpYnV0ZSBsaW5lTnVtYmVyQXR0cmlidXRlID0gY29kZUF0dHJpYnV0ZS5nZXRMaW5lTnVtYmVyQXR0cmlidXRlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJObyBjb2RlIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZSIsIGxpbmVOdW1iZXJBdHRyaWJ1dGUpOwotCQkJaW50W11bXSBsaW5lTnVtYmVyVGFibGUgPSBsaW5lTnVtYmVyQXR0cmlidXRlLmdldExpbmVOdW1iZXJUYWJsZSgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgNCwgbGluZU51bWJlclRhYmxlLmxlbmd0aCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzBdIiwgMCwgbGluZU51bWJlclRhYmxlWzBdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVswXSIsIDMsIGxpbmVOdW1iZXJUYWJsZVswXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzFdIiwgMywgbGluZU51bWJlclRhYmxlWzFdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVsxXSIsIDQsIGxpbmVOdW1iZXJUYWJsZVsxXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzJdIiwgOSwgbGluZU51bWJlclRhYmxlWzJdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVsyXSIsIDYsIGxpbmVOdW1iZXJUYWJsZVsyXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzNdIiwgMTYsIGxpbmVOdW1iZXJUYWJsZVszXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbM10iLCA4LCBsaW5lTnVtYmVyVGFibGVbM11bMV0pOwotCQl9IGZpbmFsbHkgewotCQkJcmVtb3ZlVGVtcENsYXNzKCJBIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjc1MwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDYoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc291cmNlQSA9Ci0JCQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArCi0JCQkJIgkJaW50IGkgPSA2O1xuIiArCi0JCQkJIgkJaWYgKChpID09IDYpIFxuIiArCi0JCQkJIgkJICAgJiYgZmFsc2UpIHsgICAJXG4iICsKLQkJCQkiCQkgICAJU3lzdGVtLm91dC5wcmludGxuKGkpO1xuIiArCi0JCQkJIgkJICAgfVxuIiArCi0JCQkJIgl9XG4iICsKLQkJCQkifSI7Ci0JCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEsICJBIik7Ci0JCQlJQ2xhc3NGaWxlUmVhZGVyIGNsYXNzRmlsZVJlYWRlciA9IFRvb2xGYWN0b3J5LmNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVSZWFkZXIoRVZBTF9ESVJFQ1RPUlkgKyBGaWxlLnNlcGFyYXRvciArICJBLmNsYXNzIiwgSUNsYXNzRmlsZVJlYWRlci5BTEwpOwotCQkJSU1ldGhvZEluZm9bXSBtZXRob2RJbmZvcyA9IGNsYXNzRmlsZVJlYWRlci5nZXRNZXRob2RJbmZvcygpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMiwgbWV0aG9kSW5mb3MubGVuZ3RoKTsKLQkJCUlNZXRob2RJbmZvIG1ldGhvZEluZm8gPSBtZXRob2RJbmZvc1sxXTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJtYWluIiwgbmV3IFN0cmluZyhtZXRob2RJbmZvLmdldE5hbWUoKSkpOwotCQkJSUNvZGVBdHRyaWJ1dGUgY29kZUF0dHJpYnV0ZSA9IG1ldGhvZEluZm8uZ2V0Q29kZUF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBhdHRyaWJ1dGUiLCBjb2RlQXR0cmlidXRlKTsKLQkJCUlMaW5lTnVtYmVyQXR0cmlidXRlIGxpbmVOdW1iZXJBdHRyaWJ1dGUgPSBjb2RlQXR0cmlidXRlLmdldExpbmVOdW1iZXJBdHRyaWJ1dGUoKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGNvZGUgbGluZSBudW1iZXIgYXR0cmlidXRlIiwgbGluZU51bWJlckF0dHJpYnV0ZSk7Ci0JCQlpbnRbXVtdIGxpbmVOdW1iZXJUYWJsZSA9IGxpbmVOdW1iZXJBdHRyaWJ1dGUuZ2V0TGluZU51bWJlclRhYmxlKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAyLCBsaW5lTnVtYmVyVGFibGUubGVuZ3RoKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMF0iLCAwLCBsaW5lTnVtYmVyVGFibGVbMF1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzBdIiwgMywgbGluZU51bWJlclRhYmxlWzBdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMV0iLCAzLCBsaW5lTnVtYmVyVGFibGVbMV1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzFdIiwgOCwgbGluZU51bWJlclRhYmxlWzFdWzFdKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlbW92ZVRlbXBDbGFzcygiQSIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY3NTMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDA3KCkgewotCQl0cnkgewotCQkJU3RyaW5nIHNvdXJjZUEgPQotCQkJCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKwotCQkJCSIJCWJvb2xlYW4gYiA9IGZhbHNlO1xuIiArCi0JCQkJIgkJaWYgKHRydWVcbiIgKwotCQkJCSIJCSAgICYmICFiKSB7ICAgCVxuIiArCi0JCQkJIgkJICAgCVN5c3RlbS5vdXQucHJpbnRsbigpO1xuIiArCi0JCQkJIgkJICAgfVxuIiArCi0JCQkJIgl9XG4iICsKLQkJCQkifSI7Ci0JCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEsICJBIik7Ci0JCQlJQ2xhc3NGaWxlUmVhZGVyIGNsYXNzRmlsZVJlYWRlciA9IFRvb2xGYWN0b3J5LmNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVSZWFkZXIoRVZBTF9ESVJFQ1RPUlkgKyBGaWxlLnNlcGFyYXRvciArICJBLmNsYXNzIiwgSUNsYXNzRmlsZVJlYWRlci5BTEwpOwotCQkJSU1ldGhvZEluZm9bXSBtZXRob2RJbmZvcyA9IGNsYXNzRmlsZVJlYWRlci5nZXRNZXRob2RJbmZvcygpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMiwgbWV0aG9kSW5mb3MubGVuZ3RoKTsKLQkJCUlNZXRob2RJbmZvIG1ldGhvZEluZm8gPSBtZXRob2RJbmZvc1sxXTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJtYWluIiwgbmV3IFN0cmluZyhtZXRob2RJbmZvLmdldE5hbWUoKSkpOwotCQkJSUNvZGVBdHRyaWJ1dGUgY29kZUF0dHJpYnV0ZSA9IG1ldGhvZEluZm8uZ2V0Q29kZUF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBhdHRyaWJ1dGUiLCBjb2RlQXR0cmlidXRlKTsKLQkJCUlMaW5lTnVtYmVyQXR0cmlidXRlIGxpbmVOdW1iZXJBdHRyaWJ1dGUgPSBjb2RlQXR0cmlidXRlLmdldExpbmVOdW1iZXJBdHRyaWJ1dGUoKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGNvZGUgbGluZSBudW1iZXIgYXR0cmlidXRlIiwgbGluZU51bWJlckF0dHJpYnV0ZSk7Ci0JCQlpbnRbXVtdIGxpbmVOdW1iZXJUYWJsZSA9IGxpbmVOdW1iZXJBdHRyaWJ1dGUuZ2V0TGluZU51bWJlclRhYmxlKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCA0LCBsaW5lTnVtYmVyVGFibGUubGVuZ3RoKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMF0iLCAwLCBsaW5lTnVtYmVyVGFibGVbMF1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzBdIiwgMywgbGluZU51bWJlclRhYmxlWzBdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMV0iLCAyLCBsaW5lTnVtYmVyVGFibGVbMV1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzFdIiwgNSwgbGluZU51bWJlclRhYmxlWzFdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMl0iLCA2LCBsaW5lTnVtYmVyVGFibGVbMl1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzJdIiwgNiwgbGluZU51bWJlclRhYmxlWzJdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbM10iLCAxMiwgbGluZU51bWJlclRhYmxlWzNdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVszXSIsIDgsIGxpbmVOdW1iZXJUYWJsZVszXVsxXSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZW1vdmVUZW1wQ2xhc3MoIkEiKTsKLQkJfQotCX0JCi0KLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjc1MwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDgoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc291cmNlQSA9Ci0JCQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArCi0JCQkJIgkJYm9vbGVhbiBiID0gZmFsc2U7XG4iICsKLQkJCQkiCQlpZiAoZmFsc2VcbiIgKwotCQkJCSIJCSAgICYmICFiKSB7ICAgCVxuIiArCi0JCQkJIgkJICAgCVN5c3RlbS5vdXQucHJpbnRsbigpO1xuIiArCi0JCQkJIgkJICAgfVxuIiArCi0JCQkJIgl9XG4iICsKLQkJCQkifSI7Ci0JCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEsICJBIik7Ci0JCQlJQ2xhc3NGaWxlUmVhZGVyIGNsYXNzRmlsZVJlYWRlciA9IFRvb2xGYWN0b3J5LmNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVSZWFkZXIoRVZBTF9ESVJFQ1RPUlkgKyBGaWxlLnNlcGFyYXRvciArICJBLmNsYXNzIiwgSUNsYXNzRmlsZVJlYWRlci5BTEwpOwotCQkJSU1ldGhvZEluZm9bXSBtZXRob2RJbmZvcyA9IGNsYXNzRmlsZVJlYWRlci5nZXRNZXRob2RJbmZvcygpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMiwgbWV0aG9kSW5mb3MubGVuZ3RoKTsKLQkJCUlNZXRob2RJbmZvIG1ldGhvZEluZm8gPSBtZXRob2RJbmZvc1sxXTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJtYWluIiwgbmV3IFN0cmluZyhtZXRob2RJbmZvLmdldE5hbWUoKSkpOwotCQkJSUNvZGVBdHRyaWJ1dGUgY29kZUF0dHJpYnV0ZSA9IG1ldGhvZEluZm8uZ2V0Q29kZUF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBhdHRyaWJ1dGUiLCBjb2RlQXR0cmlidXRlKTsKLQkJCUlMaW5lTnVtYmVyQXR0cmlidXRlIGxpbmVOdW1iZXJBdHRyaWJ1dGUgPSBjb2RlQXR0cmlidXRlLmdldExpbmVOdW1iZXJBdHRyaWJ1dGUoKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGNvZGUgbGluZSBudW1iZXIgYXR0cmlidXRlIiwgbGluZU51bWJlckF0dHJpYnV0ZSk7Ci0JCQlpbnRbXVtdIGxpbmVOdW1iZXJUYWJsZSA9IGxpbmVOdW1iZXJBdHRyaWJ1dGUuZ2V0TGluZU51bWJlclRhYmxlKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAyLCBsaW5lTnVtYmVyVGFibGUubGVuZ3RoKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMF0iLCAwLCBsaW5lTnVtYmVyVGFibGVbMF1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzBdIiwgMywgbGluZU51bWJlclRhYmxlWzBdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMV0iLCAyLCBsaW5lTnVtYmVyVGFibGVbMV1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzFdIiwgOCwgbGluZU51bWJlclRhYmxlWzFdWzFdKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlbW92ZVRlbXBDbGFzcygiQSIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY3NTMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDA5KCkgewotCQl0cnkgewotCQkJU3RyaW5nIHNvdXJjZUEgPQotCQkJCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKwotCQkJCSIJCWJvb2xlYW4gYiA9IGZhbHNlO1xuIiArCi0JCQkJIgkJaW50IGkgPSA2O1xuIiArCi0JCQkJIgkJaWYgKChpID09IDYpIFxuIiArCi0JCQkJIgkJICAgfHwgIWIpIHsgICAJXG4iICsKLQkJCQkiCQkgICAJU3lzdGVtLm91dC5wcmludGxuKGkpO1xuIiArCi0JCQkJIgkJICAgfVxuIiArCi0JCQkJIgl9XG4iICsKLQkJCQkifSI7Ci0JCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEsICJBIik7Ci0JCQlJQ2xhc3NGaWxlUmVhZGVyIGNsYXNzRmlsZVJlYWRlciA9IFRvb2xGYWN0b3J5LmNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVSZWFkZXIoRVZBTF9ESVJFQ1RPUlkgKyBGaWxlLnNlcGFyYXRvciArICJBLmNsYXNzIiwgSUNsYXNzRmlsZVJlYWRlci5BTEwpOwotCQkJSU1ldGhvZEluZm9bXSBtZXRob2RJbmZvcyA9IGNsYXNzRmlsZVJlYWRlci5nZXRNZXRob2RJbmZvcygpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMiwgbWV0aG9kSW5mb3MubGVuZ3RoKTsKLQkJCUlNZXRob2RJbmZvIG1ldGhvZEluZm8gPSBtZXRob2RJbmZvc1sxXTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJtYWluIiwgbmV3IFN0cmluZyhtZXRob2RJbmZvLmdldE5hbWUoKSkpOwotCQkJSUNvZGVBdHRyaWJ1dGUgY29kZUF0dHJpYnV0ZSA9IG1ldGhvZEluZm8uZ2V0Q29kZUF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBhdHRyaWJ1dGUiLCBjb2RlQXR0cmlidXRlKTsKLQkJCUlMaW5lTnVtYmVyQXR0cmlidXRlIGxpbmVOdW1iZXJBdHRyaWJ1dGUgPSBjb2RlQXR0cmlidXRlLmdldExpbmVOdW1iZXJBdHRyaWJ1dGUoKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGNvZGUgbGluZSBudW1iZXIgYXR0cmlidXRlIiwgbGluZU51bWJlckF0dHJpYnV0ZSk7Ci0JCQlpbnRbXVtdIGxpbmVOdW1iZXJUYWJsZSA9IGxpbmVOdW1iZXJBdHRyaWJ1dGUuZ2V0TGluZU51bWJlclRhYmxlKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCA2LCBsaW5lTnVtYmVyVGFibGUubGVuZ3RoKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMF0iLCAwLCBsaW5lTnVtYmVyVGFibGVbMF1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzBdIiwgMywgbGluZU51bWJlclRhYmxlWzBdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMV0iLCAyLCBsaW5lTnVtYmVyVGFibGVbMV1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzFdIiwgNCwgbGluZU51bWJlclRhYmxlWzFdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMl0iLCA1LCBsaW5lTnVtYmVyVGFibGVbMl1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzJdIiwgNSwgbGluZU51bWJlclRhYmxlWzJdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbM10iLCAxMSwgbGluZU51bWJlclRhYmxlWzNdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVszXSIsIDYsIGxpbmVOdW1iZXJUYWJsZVszXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzRdIiwgMTUsIGxpbmVOdW1iZXJUYWJsZVs0XVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbNF0iLCA3LCBsaW5lTnVtYmVyVGFibGVbNF1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1s1XSIsIDIyLCBsaW5lTnVtYmVyVGFibGVbNV1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzVdIiwgOSwgbGluZU51bWJlclRhYmxlWzVdWzFdKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlbW92ZVRlbXBDbGFzcygiQSIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY3NTMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDEwKCkgewotCQl0cnkgewotCQkJU3RyaW5nIHNvdXJjZUEgPQotCQkJCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKwotCQkJCSIJCWludCBpID0gNjtcbiIgKwotCQkJCSIJCWlmICgoaSA9PSA2KSBcbiIgKwotCQkJCSIJCSAgIHx8IHRydWUpIHsgICAJXG4iICsKLQkJCQkiCQkgICAJU3lzdGVtLm91dC5wcmludGxuKGkpO1xuIiArCi0JCQkJIgkJICAgfVxuIiArCi0JCQkJIgl9XG4iICsKLQkJCQkifSI7Ci0JCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEsICJBIik7Ci0JCQlJQ2xhc3NGaWxlUmVhZGVyIGNsYXNzRmlsZVJlYWRlciA9IFRvb2xGYWN0b3J5LmNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVSZWFkZXIoRVZBTF9ESVJFQ1RPUlkgKyBGaWxlLnNlcGFyYXRvciArICJBLmNsYXNzIiwgSUNsYXNzRmlsZVJlYWRlci5BTEwpOwotCQkJSU1ldGhvZEluZm9bXSBtZXRob2RJbmZvcyA9IGNsYXNzRmlsZVJlYWRlci5nZXRNZXRob2RJbmZvcygpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMiwgbWV0aG9kSW5mb3MubGVuZ3RoKTsKLQkJCUlNZXRob2RJbmZvIG1ldGhvZEluZm8gPSBtZXRob2RJbmZvc1sxXTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJtYWluIiwgbmV3IFN0cmluZyhtZXRob2RJbmZvLmdldE5hbWUoKSkpOwotCQkJSUNvZGVBdHRyaWJ1dGUgY29kZUF0dHJpYnV0ZSA9IG1ldGhvZEluZm8uZ2V0Q29kZUF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBhdHRyaWJ1dGUiLCBjb2RlQXR0cmlidXRlKTsKLQkJCUlMaW5lTnVtYmVyQXR0cmlidXRlIGxpbmVOdW1iZXJBdHRyaWJ1dGUgPSBjb2RlQXR0cmlidXRlLmdldExpbmVOdW1iZXJBdHRyaWJ1dGUoKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGNvZGUgbGluZSBudW1iZXIgYXR0cmlidXRlIiwgbGluZU51bWJlckF0dHJpYnV0ZSk7Ci0JCQlpbnRbXVtdIGxpbmVOdW1iZXJUYWJsZSA9IGxpbmVOdW1iZXJBdHRyaWJ1dGUuZ2V0TGluZU51bWJlclRhYmxlKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAzLCBsaW5lTnVtYmVyVGFibGUubGVuZ3RoKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMF0iLCAwLCBsaW5lTnVtYmVyVGFibGVbMF1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzBdIiwgMywgbGluZU51bWJlclRhYmxlWzBdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMV0iLCAzLCBsaW5lTnVtYmVyVGFibGVbMV1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzFdIiwgNiwgbGluZU51bWJlclRhYmxlWzFdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMl0iLCAxMCwgbGluZU51bWJlclRhYmxlWzJdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVsyXSIsIDgsIGxpbmVOdW1iZXJUYWJsZVsyXVsxXSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZW1vdmVUZW1wQ2xhc3MoIkEiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NzUzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAxMSgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzb3VyY2VBID0KLQkJCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsKLQkJCQkiCQlpbnQgaSA9IDY7XG4iICsKLQkJCQkiCQlpZiAoKGkgPT0gNikgXG4iICsKLQkJCQkiCQkgICB8fCBmYWxzZSkgeyAgIAlcbiIgKwotCQkJCSIJCSAgIAlTeXN0ZW0ub3V0LnByaW50bG4oaSk7XG4iICsKLQkJCQkiCQkgICB9XG4iICsKLQkJCQkiCX1cbiIgKwotCQkJCSJ9IjsKLQkJCWNvbXBpbGVBbmREZXBsb3koc291cmNlQSwgIkEiKTsKLQkJCUlDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyID0gVG9vbEZhY3RvcnkuY3JlYXRlRGVmYXVsdENsYXNzRmlsZVJlYWRlcihFVkFMX0RJUkVDVE9SWSArIEZpbGUuc2VwYXJhdG9yICsgIkEuY2xhc3MiLCBJQ2xhc3NGaWxlUmVhZGVyLkFMTCk7Ci0JCQlJTWV0aG9kSW5mb1tdIG1ldGhvZEluZm9zID0gY2xhc3NGaWxlUmVhZGVyLmdldE1ldGhvZEluZm9zKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAyLCBtZXRob2RJbmZvcy5sZW5ndGgpOwotCQkJSU1ldGhvZEluZm8gbWV0aG9kSW5mbyA9IG1ldGhvZEluZm9zWzFdOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgIm1haW4iLCBuZXcgU3RyaW5nKG1ldGhvZEluZm8uZ2V0TmFtZSgpKSk7Ci0JCQlJQ29kZUF0dHJpYnV0ZSBjb2RlQXR0cmlidXRlID0gbWV0aG9kSW5mby5nZXRDb2RlQXR0cmlidXRlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJObyBjb2RlIGF0dHJpYnV0ZSIsIGNvZGVBdHRyaWJ1dGUpOwotCQkJSUxpbmVOdW1iZXJBdHRyaWJ1dGUgbGluZU51bWJlckF0dHJpYnV0ZSA9IGNvZGVBdHRyaWJ1dGUuZ2V0TGluZU51bWJlckF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUiLCBsaW5lTnVtYmVyQXR0cmlidXRlKTsKLQkJCWludFtdW10gbGluZU51bWJlclRhYmxlID0gbGluZU51bWJlckF0dHJpYnV0ZS5nZXRMaW5lTnVtYmVyVGFibGUoKTsKLQkJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDQsIGxpbmVOdW1iZXJUYWJsZS5sZW5ndGgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1swXSIsIDAsIGxpbmVOdW1iZXJUYWJsZVswXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMF0iLCAzLCBsaW5lTnVtYmVyVGFibGVbMF1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1sxXSIsIDMsIGxpbmVOdW1iZXJUYWJsZVsxXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMV0iLCA0LCBsaW5lTnVtYmVyVGFibGVbMV1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1syXSIsIDksIGxpbmVOdW1iZXJUYWJsZVsyXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMl0iLCA2LCBsaW5lTnVtYmVyVGFibGVbMl1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1szXSIsIDE2LCBsaW5lTnVtYmVyVGFibGVbM11bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzNdIiwgOCwgbGluZU51bWJlclRhYmxlWzNdWzFdKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlbW92ZVRlbXBDbGFzcygiQSIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY3NTMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDEyKCkgewotCQl0cnkgewotCQkJU3RyaW5nIHNvdXJjZUEgPQotCQkJCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKwotCQkJCSIJCWJvb2xlYW4gYiA9IGZhbHNlO1xuIiArCi0JCQkJIgkJaWYgKHRydWVcbiIgKwotCQkJCSIJCSAgIHx8ICFiKSB7ICAgCVxuIiArCi0JCQkJIgkJICAgCVN5c3RlbS5vdXQucHJpbnRsbigpO1xuIiArCi0JCQkJIgkJICAgfVxuIiArCi0JCQkJIgl9XG4iICsKLQkJCQkifSI7Ci0JCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEsICJBIik7Ci0JCQlJQ2xhc3NGaWxlUmVhZGVyIGNsYXNzRmlsZVJlYWRlciA9IFRvb2xGYWN0b3J5LmNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVSZWFkZXIoRVZBTF9ESVJFQ1RPUlkgKyBGaWxlLnNlcGFyYXRvciArICJBLmNsYXNzIiwgSUNsYXNzRmlsZVJlYWRlci5BTEwpOwotCQkJSU1ldGhvZEluZm9bXSBtZXRob2RJbmZvcyA9IGNsYXNzRmlsZVJlYWRlci5nZXRNZXRob2RJbmZvcygpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMiwgbWV0aG9kSW5mb3MubGVuZ3RoKTsKLQkJCUlNZXRob2RJbmZvIG1ldGhvZEluZm8gPSBtZXRob2RJbmZvc1sxXTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJtYWluIiwgbmV3IFN0cmluZyhtZXRob2RJbmZvLmdldE5hbWUoKSkpOwotCQkJSUNvZGVBdHRyaWJ1dGUgY29kZUF0dHJpYnV0ZSA9IG1ldGhvZEluZm8uZ2V0Q29kZUF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBhdHRyaWJ1dGUiLCBjb2RlQXR0cmlidXRlKTsKLQkJCUlMaW5lTnVtYmVyQXR0cmlidXRlIGxpbmVOdW1iZXJBdHRyaWJ1dGUgPSBjb2RlQXR0cmlidXRlLmdldExpbmVOdW1iZXJBdHRyaWJ1dGUoKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGNvZGUgbGluZSBudW1iZXIgYXR0cmlidXRlIiwgbGluZU51bWJlckF0dHJpYnV0ZSk7Ci0JCQlpbnRbXVtdIGxpbmVOdW1iZXJUYWJsZSA9IGxpbmVOdW1iZXJBdHRyaWJ1dGUuZ2V0TGluZU51bWJlclRhYmxlKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAzLCBsaW5lTnVtYmVyVGFibGUubGVuZ3RoKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMF0iLCAwLCBsaW5lTnVtYmVyVGFibGVbMF1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzBdIiwgMywgbGluZU51bWJlclRhYmxlWzBdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMV0iLCAyLCBsaW5lTnVtYmVyVGFibGVbMV1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzFdIiwgNiwgbGluZU51bWJlclRhYmxlWzFdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMl0iLCA4LCBsaW5lTnVtYmVyVGFibGVbMl1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzJdIiwgOCwgbGluZU51bWJlclRhYmxlWzJdWzFdKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlbW92ZVRlbXBDbGFzcygiQSIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY3NTMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDEzKCkgewotCQl0cnkgewotCQkJU3RyaW5nIHNvdXJjZUEgPQotCQkJCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKwotCQkJCSIJCWJvb2xlYW4gYiA9IGZhbHNlO1xuIiArCi0JCQkJIgkJaWYgKGZhbHNlXG4iICsKLQkJCQkiCQkgICB8fCAhYikgeyAgIAlcbiIgKwotCQkJCSIJCSAgIAlTeXN0ZW0ub3V0LnByaW50bG4oKTtcbiIgKwotCQkJCSIJCSAgIH1cbiIgKwotCQkJCSIJfVxuIiArCi0JCQkJIn0iOwotCQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBLCAiQSIpOwotCQkJSUNsYXNzRmlsZVJlYWRlciBjbGFzc0ZpbGVSZWFkZXIgPSBUb29sRmFjdG9yeS5jcmVhdGVEZWZhdWx0Q2xhc3NGaWxlUmVhZGVyKEVWQUxfRElSRUNUT1JZICsgRmlsZS5zZXBhcmF0b3IgKyAiQS5jbGFzcyIsIElDbGFzc0ZpbGVSZWFkZXIuQUxMKTsKLQkJCUlNZXRob2RJbmZvW10gbWV0aG9kSW5mb3MgPSBjbGFzc0ZpbGVSZWFkZXIuZ2V0TWV0aG9kSW5mb3MoKTsKLQkJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDIsIG1ldGhvZEluZm9zLmxlbmd0aCk7Ci0JCQlJTWV0aG9kSW5mbyBtZXRob2RJbmZvID0gbWV0aG9kSW5mb3NbMV07Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAibWFpbiIsIG5ldyBTdHJpbmcobWV0aG9kSW5mby5nZXROYW1lKCkpKTsKLQkJCUlDb2RlQXR0cmlidXRlIGNvZGVBdHRyaWJ1dGUgPSBtZXRob2RJbmZvLmdldENvZGVBdHRyaWJ1dGUoKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGNvZGUgYXR0cmlidXRlIiwgY29kZUF0dHJpYnV0ZSk7Ci0JCQlJTGluZU51bWJlckF0dHJpYnV0ZSBsaW5lTnVtYmVyQXR0cmlidXRlID0gY29kZUF0dHJpYnV0ZS5nZXRMaW5lTnVtYmVyQXR0cmlidXRlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJObyBjb2RlIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZSIsIGxpbmVOdW1iZXJBdHRyaWJ1dGUpOwotCQkJaW50W11bXSBsaW5lTnVtYmVyVGFibGUgPSBsaW5lTnVtYmVyQXR0cmlidXRlLmdldExpbmVOdW1iZXJUYWJsZSgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgNCwgbGluZU51bWJlclRhYmxlLmxlbmd0aCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzBdIiwgMCwgbGluZU51bWJlclRhYmxlWzBdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVswXSIsIDMsIGxpbmVOdW1iZXJUYWJsZVswXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzFdIiwgMiwgbGluZU51bWJlclRhYmxlWzFdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVsxXSIsIDUsIGxpbmVOdW1iZXJUYWJsZVsxXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzJdIiwgNiwgbGluZU51bWJlclRhYmxlWzJdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVsyXSIsIDYsIGxpbmVOdW1iZXJUYWJsZVsyXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzNdIiwgMTIsIGxpbmVOdW1iZXJUYWJsZVszXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbM10iLCA4LCBsaW5lTnVtYmVyVGFibGVbM11bMV0pOwotCQl9IGZpbmFsbHkgewotCQkJcmVtb3ZlVGVtcENsYXNzKCJBIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjc1MwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTQoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc291cmNlQSA9Ci0JCQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArCi0JCQkJIgkJYm9vbGVhbiBiID0gZmFsc2U7XG4iICsKLQkJCQkiCQlpbnQgaSA9IDY7XG4iICsKLQkJCQkiCQlpZiAoKGkgPT0gNikgXG4iICsKLQkJCQkiCQkgICA9PSAhYikgeyAgIAlcbiIgKwotCQkJCSIJCSAgIAlTeXN0ZW0ub3V0LnByaW50bG4oaSk7XG4iICsKLQkJCQkiCQkgICB9XG4iICsKLQkJCQkiCX1cbiIgKwotCQkJCSJ9IjsKLQkJCWNvbXBpbGVBbmREZXBsb3koc291cmNlQSwgIkEiKTsKLQkJCUlDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyID0gVG9vbEZhY3RvcnkuY3JlYXRlRGVmYXVsdENsYXNzRmlsZVJlYWRlcihFVkFMX0RJUkVDVE9SWSArIEZpbGUuc2VwYXJhdG9yICsgIkEuY2xhc3MiLCBJQ2xhc3NGaWxlUmVhZGVyLkFMTCk7Ci0JCQlJTWV0aG9kSW5mb1tdIG1ldGhvZEluZm9zID0gY2xhc3NGaWxlUmVhZGVyLmdldE1ldGhvZEluZm9zKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAyLCBtZXRob2RJbmZvcy5sZW5ndGgpOwotCQkJSU1ldGhvZEluZm8gbWV0aG9kSW5mbyA9IG1ldGhvZEluZm9zWzFdOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgIm1haW4iLCBuZXcgU3RyaW5nKG1ldGhvZEluZm8uZ2V0TmFtZSgpKSk7Ci0JCQlJQ29kZUF0dHJpYnV0ZSBjb2RlQXR0cmlidXRlID0gbWV0aG9kSW5mby5nZXRDb2RlQXR0cmlidXRlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJObyBjb2RlIGF0dHJpYnV0ZSIsIGNvZGVBdHRyaWJ1dGUpOwotCQkJSUxpbmVOdW1iZXJBdHRyaWJ1dGUgbGluZU51bWJlckF0dHJpYnV0ZSA9IGNvZGVBdHRyaWJ1dGUuZ2V0TGluZU51bWJlckF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUiLCBsaW5lTnVtYmVyQXR0cmlidXRlKTsKLQkJCWludFtdW10gbGluZU51bWJlclRhYmxlID0gbGluZU51bWJlckF0dHJpYnV0ZS5nZXRMaW5lTnVtYmVyVGFibGUoKTsKLQkJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDYsIGxpbmVOdW1iZXJUYWJsZS5sZW5ndGgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1swXSIsIDAsIGxpbmVOdW1iZXJUYWJsZVswXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMF0iLCAzLCBsaW5lTnVtYmVyVGFibGVbMF1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1sxXSIsIDIsIGxpbmVOdW1iZXJUYWJsZVsxXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMV0iLCA0LCBsaW5lTnVtYmVyVGFibGVbMV1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1syXSIsIDUsIGxpbmVOdW1iZXJUYWJsZVsyXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMl0iLCA1LCBsaW5lTnVtYmVyVGFibGVbMl1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1szXSIsIDE2LCBsaW5lTnVtYmVyVGFibGVbM11bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzNdIiwgNiwgbGluZU51bWJlclRhYmxlWzNdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbNF0iLCAyOCwgbGluZU51bWJlclRhYmxlWzRdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVs0XSIsIDcsIGxpbmVOdW1iZXJUYWJsZVs0XVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzVdIiwgMzUsIGxpbmVOdW1iZXJUYWJsZVs1XVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbNV0iLCA5LCBsaW5lTnVtYmVyVGFibGVbNV1bMV0pOwotCQl9IGZpbmFsbHkgewotCQkJcmVtb3ZlVGVtcENsYXNzKCJBIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjc1MwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTUoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc291cmNlQSA9Ci0JCQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArCi0JCQkJIgkJaW50IGkgPSA2O1xuIiArCi0JCQkJIgkJaWYgKChpID09IDYpIFxuIiArCi0JCQkJIgkJICAgPT0gdHJ1ZSkgeyAgIAlcbiIgKwotCQkJCSIJCSAgIAlTeXN0ZW0ub3V0LnByaW50bG4oaSk7XG4iICsKLQkJCQkiCQkgICB9XG4iICsKLQkJCQkiCX1cbiIgKwotCQkJCSJ9IjsKLQkJCWNvbXBpbGVBbmREZXBsb3koc291cmNlQSwgIkEiKTsKLQkJCUlDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyID0gVG9vbEZhY3RvcnkuY3JlYXRlRGVmYXVsdENsYXNzRmlsZVJlYWRlcihFVkFMX0RJUkVDVE9SWSArIEZpbGUuc2VwYXJhdG9yICsgIkEuY2xhc3MiLCBJQ2xhc3NGaWxlUmVhZGVyLkFMTCk7Ci0JCQlJTWV0aG9kSW5mb1tdIG1ldGhvZEluZm9zID0gY2xhc3NGaWxlUmVhZGVyLmdldE1ldGhvZEluZm9zKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAyLCBtZXRob2RJbmZvcy5sZW5ndGgpOwotCQkJSU1ldGhvZEluZm8gbWV0aG9kSW5mbyA9IG1ldGhvZEluZm9zWzFdOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgIm1haW4iLCBuZXcgU3RyaW5nKG1ldGhvZEluZm8uZ2V0TmFtZSgpKSk7Ci0JCQlJQ29kZUF0dHJpYnV0ZSBjb2RlQXR0cmlidXRlID0gbWV0aG9kSW5mby5nZXRDb2RlQXR0cmlidXRlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJObyBjb2RlIGF0dHJpYnV0ZSIsIGNvZGVBdHRyaWJ1dGUpOwotCQkJSUxpbmVOdW1iZXJBdHRyaWJ1dGUgbGluZU51bWJlckF0dHJpYnV0ZSA9IGNvZGVBdHRyaWJ1dGUuZ2V0TGluZU51bWJlckF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUiLCBsaW5lTnVtYmVyQXR0cmlidXRlKTsKLQkJCWludFtdW10gbGluZU51bWJlclRhYmxlID0gbGluZU51bWJlckF0dHJpYnV0ZS5nZXRMaW5lTnVtYmVyVGFibGUoKTsKLQkJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDQsIGxpbmVOdW1iZXJUYWJsZS5sZW5ndGgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1swXSIsIDAsIGxpbmVOdW1iZXJUYWJsZVswXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMF0iLCAzLCBsaW5lTnVtYmVyVGFibGVbMF1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1sxXSIsIDMsIGxpbmVOdW1iZXJUYWJsZVsxXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMV0iLCA0LCBsaW5lTnVtYmVyVGFibGVbMV1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1syXSIsIDksIGxpbmVOdW1iZXJUYWJsZVsyXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMl0iLCA2LCBsaW5lTnVtYmVyVGFibGVbMl1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1szXSIsIDE2LCBsaW5lTnVtYmVyVGFibGVbM11bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzNdIiwgOCwgbGluZU51bWJlclRhYmxlWzNdWzFdKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlbW92ZVRlbXBDbGFzcygiQSIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY3NTMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDE2KCkgewotCQl0cnkgewotCQkJU3RyaW5nIHNvdXJjZUEgPQotCQkJCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKwotCQkJCSIJCWludCBpID0gNjtcbiIgKwotCQkJCSIJCWlmICgoaSA9PSA2KSBcbiIgKwotCQkJCSIJCSAgID09IGZhbHNlKSB7ICAgCVxuIiArCi0JCQkJIgkJICAgCVN5c3RlbS5vdXQucHJpbnRsbihpKTtcbiIgKwotCQkJCSIJCSAgIH1cbiIgKwotCQkJCSIJfVxuIiArCi0JCQkJIn0iOwotCQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBLCAiQSIpOwotCQkJSUNsYXNzRmlsZVJlYWRlciBjbGFzc0ZpbGVSZWFkZXIgPSBUb29sRmFjdG9yeS5jcmVhdGVEZWZhdWx0Q2xhc3NGaWxlUmVhZGVyKEVWQUxfRElSRUNUT1JZICsgRmlsZS5zZXBhcmF0b3IgKyAiQS5jbGFzcyIsIElDbGFzc0ZpbGVSZWFkZXIuQUxMKTsKLQkJCUlNZXRob2RJbmZvW10gbWV0aG9kSW5mb3MgPSBjbGFzc0ZpbGVSZWFkZXIuZ2V0TWV0aG9kSW5mb3MoKTsKLQkJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDIsIG1ldGhvZEluZm9zLmxlbmd0aCk7Ci0JCQlJTWV0aG9kSW5mbyBtZXRob2RJbmZvID0gbWV0aG9kSW5mb3NbMV07Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAibWFpbiIsIG5ldyBTdHJpbmcobWV0aG9kSW5mby5nZXROYW1lKCkpKTsKLQkJCUlDb2RlQXR0cmlidXRlIGNvZGVBdHRyaWJ1dGUgPSBtZXRob2RJbmZvLmdldENvZGVBdHRyaWJ1dGUoKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGNvZGUgYXR0cmlidXRlIiwgY29kZUF0dHJpYnV0ZSk7Ci0JCQlJTGluZU51bWJlckF0dHJpYnV0ZSBsaW5lTnVtYmVyQXR0cmlidXRlID0gY29kZUF0dHJpYnV0ZS5nZXRMaW5lTnVtYmVyQXR0cmlidXRlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJObyBjb2RlIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZSIsIGxpbmVOdW1iZXJBdHRyaWJ1dGUpOwotCQkJaW50W11bXSBsaW5lTnVtYmVyVGFibGUgPSBsaW5lTnVtYmVyQXR0cmlidXRlLmdldExpbmVOdW1iZXJUYWJsZSgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgNCwgbGluZU51bWJlclRhYmxlLmxlbmd0aCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzBdIiwgMCwgbGluZU51bWJlclRhYmxlWzBdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVswXSIsIDMsIGxpbmVOdW1iZXJUYWJsZVswXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzFdIiwgMywgbGluZU51bWJlclRhYmxlWzFdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVsxXSIsIDQsIGxpbmVOdW1iZXJUYWJsZVsxXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzJdIiwgOSwgbGluZU51bWJlclRhYmxlWzJdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVsyXSIsIDYsIGxpbmVOdW1iZXJUYWJsZVsyXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzNdIiwgMTYsIGxpbmVOdW1iZXJUYWJsZVszXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbM10iLCA4LCBsaW5lTnVtYmVyVGFibGVbM11bMV0pOwotCQl9IGZpbmFsbHkgewotCQkJcmVtb3ZlVGVtcENsYXNzKCJBIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjc1MwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTcoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc291cmNlQSA9Ci0JCQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArCi0JCQkJIgkJYm9vbGVhbiBiID0gZmFsc2U7XG4iICsKLQkJCQkiCQlpZiAodHJ1ZVxuIiArCi0JCQkJIgkJICAgPT0gIWIpIHsgICAJXG4iICsKLQkJCQkiCQkgICAJU3lzdGVtLm91dC5wcmludGxuKCk7XG4iICsKLQkJCQkiCQkgICB9XG4iICsKLQkJCQkiCX1cbiIgKwotCQkJCSJ9IjsKLQkJCWNvbXBpbGVBbmREZXBsb3koc291cmNlQSwgIkEiKTsKLQkJCUlDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyID0gVG9vbEZhY3RvcnkuY3JlYXRlRGVmYXVsdENsYXNzRmlsZVJlYWRlcihFVkFMX0RJUkVDVE9SWSArIEZpbGUuc2VwYXJhdG9yICsgIkEuY2xhc3MiLCBJQ2xhc3NGaWxlUmVhZGVyLkFMTCk7Ci0JCQlJTWV0aG9kSW5mb1tdIG1ldGhvZEluZm9zID0gY2xhc3NGaWxlUmVhZGVyLmdldE1ldGhvZEluZm9zKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAyLCBtZXRob2RJbmZvcy5sZW5ndGgpOwotCQkJSU1ldGhvZEluZm8gbWV0aG9kSW5mbyA9IG1ldGhvZEluZm9zWzFdOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgIm1haW4iLCBuZXcgU3RyaW5nKG1ldGhvZEluZm8uZ2V0TmFtZSgpKSk7Ci0JCQlJQ29kZUF0dHJpYnV0ZSBjb2RlQXR0cmlidXRlID0gbWV0aG9kSW5mby5nZXRDb2RlQXR0cmlidXRlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJObyBjb2RlIGF0dHJpYnV0ZSIsIGNvZGVBdHRyaWJ1dGUpOwotCQkJSUxpbmVOdW1iZXJBdHRyaWJ1dGUgbGluZU51bWJlckF0dHJpYnV0ZSA9IGNvZGVBdHRyaWJ1dGUuZ2V0TGluZU51bWJlckF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUiLCBsaW5lTnVtYmVyQXR0cmlidXRlKTsKLQkJCWludFtdW10gbGluZU51bWJlclRhYmxlID0gbGluZU51bWJlckF0dHJpYnV0ZS5nZXRMaW5lTnVtYmVyVGFibGUoKTsKLQkJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDQsIGxpbmVOdW1iZXJUYWJsZS5sZW5ndGgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1swXSIsIDAsIGxpbmVOdW1iZXJUYWJsZVswXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMF0iLCAzLCBsaW5lTnVtYmVyVGFibGVbMF1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1sxXSIsIDIsIGxpbmVOdW1iZXJUYWJsZVsxXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMV0iLCA1LCBsaW5lTnVtYmVyVGFibGVbMV1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1syXSIsIDYsIGxpbmVOdW1iZXJUYWJsZVsyXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMl0iLCA2LCBsaW5lTnVtYmVyVGFibGVbMl1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1szXSIsIDEyLCBsaW5lTnVtYmVyVGFibGVbM11bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzNdIiwgOCwgbGluZU51bWJlclRhYmxlWzNdWzFdKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlbW92ZVRlbXBDbGFzcygiQSIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY3NTMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDE4KCkgewotCQl0cnkgewotCQkJU3RyaW5nIHNvdXJjZUEgPQotCQkJCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKwotCQkJCSIJCWJvb2xlYW4gYiA9IGZhbHNlO1xuIiArCi0JCQkJIgkJaWYgKGZhbHNlXG4iICsKLQkJCQkiCQkgICA9PSAhYikgeyAgIAlcbiIgKwotCQkJCSIJCSAgIAlTeXN0ZW0ub3V0LnByaW50bG4oKTtcbiIgKwotCQkJCSIJCSAgIH1cbiIgKwotCQkJCSIJfVxuIiArCi0JCQkJIn0iOwotCQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBLCAiQSIpOwotCQkJSUNsYXNzRmlsZVJlYWRlciBjbGFzc0ZpbGVSZWFkZXIgPSBUb29sRmFjdG9yeS5jcmVhdGVEZWZhdWx0Q2xhc3NGaWxlUmVhZGVyKEVWQUxfRElSRUNUT1JZICsgRmlsZS5zZXBhcmF0b3IgKyAiQS5jbGFzcyIsIElDbGFzc0ZpbGVSZWFkZXIuQUxMKTsKLQkJCUlNZXRob2RJbmZvW10gbWV0aG9kSW5mb3MgPSBjbGFzc0ZpbGVSZWFkZXIuZ2V0TWV0aG9kSW5mb3MoKTsKLQkJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDIsIG1ldGhvZEluZm9zLmxlbmd0aCk7Ci0JCQlJTWV0aG9kSW5mbyBtZXRob2RJbmZvID0gbWV0aG9kSW5mb3NbMV07Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAibWFpbiIsIG5ldyBTdHJpbmcobWV0aG9kSW5mby5nZXROYW1lKCkpKTsKLQkJCUlDb2RlQXR0cmlidXRlIGNvZGVBdHRyaWJ1dGUgPSBtZXRob2RJbmZvLmdldENvZGVBdHRyaWJ1dGUoKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGNvZGUgYXR0cmlidXRlIiwgY29kZUF0dHJpYnV0ZSk7Ci0JCQlJTGluZU51bWJlckF0dHJpYnV0ZSBsaW5lTnVtYmVyQXR0cmlidXRlID0gY29kZUF0dHJpYnV0ZS5nZXRMaW5lTnVtYmVyQXR0cmlidXRlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJObyBjb2RlIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZSIsIGxpbmVOdW1iZXJBdHRyaWJ1dGUpOwotCQkJaW50W11bXSBsaW5lTnVtYmVyVGFibGUgPSBsaW5lTnVtYmVyQXR0cmlidXRlLmdldExpbmVOdW1iZXJUYWJsZSgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgNCwgbGluZU51bWJlclRhYmxlLmxlbmd0aCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzBdIiwgMCwgbGluZU51bWJlclRhYmxlWzBdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVswXSIsIDMsIGxpbmVOdW1iZXJUYWJsZVswXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzFdIiwgMiwgbGluZU51bWJlclRhYmxlWzFdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVsxXSIsIDUsIGxpbmVOdW1iZXJUYWJsZVsxXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzJdIiwgNiwgbGluZU51bWJlclRhYmxlWzJdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVsyXSIsIDYsIGxpbmVOdW1iZXJUYWJsZVsyXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzNdIiwgMTIsIGxpbmVOdW1iZXJUYWJsZVszXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbM10iLCA4LCBsaW5lTnVtYmVyVGFibGVbM11bMV0pOwotCQl9IGZpbmFsbHkgewotCQkJcmVtb3ZlVGVtcENsYXNzKCJBIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjc1MwotCSAqIGh0dHA6ICAvL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY4ODEKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDE5KCkgewotCQl0cnkgewotCQkJU3RyaW5nIHNvdXJjZUEgPQotCQkJCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKwotCQkJCSIJCWJvb2xlYW4gYiA9IGZhbHNlO1xuIiArCi0JCQkJIgkJaW50IGkgPSA2O1xuIiArCi0JCQkJIgkJaWYgKChpID09IDUpXG4iICsKLQkJCQkiCQkJPyBiIDogIWIpIHsgICAJXG4iICsKLQkJCQkiCQkgICAJU3lzdGVtLm91dC5wcmludGxuKGkpO1xuIiArCi0JCQkJIgkJICAgfVxuIiArCi0JCQkJIgl9XG4iICsKLQkJCQkifSI7Ci0JCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEsICJBIik7Ci0JCQlJQ2xhc3NGaWxlUmVhZGVyIGNsYXNzRmlsZVJlYWRlciA9IFRvb2xGYWN0b3J5LmNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVSZWFkZXIoRVZBTF9ESVJFQ1RPUlkgKyBGaWxlLnNlcGFyYXRvciArICJBLmNsYXNzIiwgSUNsYXNzRmlsZVJlYWRlci5BTEwpOwotCQkJSU1ldGhvZEluZm9bXSBtZXRob2RJbmZvcyA9IGNsYXNzRmlsZVJlYWRlci5nZXRNZXRob2RJbmZvcygpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMiwgbWV0aG9kSW5mb3MubGVuZ3RoKTsKLQkJCUlNZXRob2RJbmZvIG1ldGhvZEluZm8gPSBtZXRob2RJbmZvc1sxXTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJtYWluIiwgbmV3IFN0cmluZyhtZXRob2RJbmZvLmdldE5hbWUoKSkpOwotCQkJSUNvZGVBdHRyaWJ1dGUgY29kZUF0dHJpYnV0ZSA9IG1ldGhvZEluZm8uZ2V0Q29kZUF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBhdHRyaWJ1dGUiLCBjb2RlQXR0cmlidXRlKTsKLQkJCUlMaW5lTnVtYmVyQXR0cmlidXRlIGxpbmVOdW1iZXJBdHRyaWJ1dGUgPSBjb2RlQXR0cmlidXRlLmdldExpbmVOdW1iZXJBdHRyaWJ1dGUoKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGNvZGUgbGluZSBudW1iZXIgYXR0cmlidXRlIiwgbGluZU51bWJlckF0dHJpYnV0ZSk7Ci0JCQlpbnRbXVtdIGxpbmVOdW1iZXJUYWJsZSA9IGxpbmVOdW1iZXJBdHRyaWJ1dGUuZ2V0TGluZU51bWJlclRhYmxlKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCA2LCBsaW5lTnVtYmVyVGFibGUubGVuZ3RoKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMF0iLCAwLCBsaW5lTnVtYmVyVGFibGVbMF1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzBdIiwgMywgbGluZU51bWJlclRhYmxlWzBdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMV0iLCAyLCBsaW5lTnVtYmVyVGFibGVbMV1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzFdIiwgNCwgbGluZU51bWJlclRhYmxlWzFdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMl0iLCA1LCBsaW5lTnVtYmVyVGFibGVbMl1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzJdIiwgNSwgbGluZU51bWJlclRhYmxlWzJdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbM10iLCAxMCwgbGluZU51bWJlclRhYmxlWzNdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVszXSIsIDYsIGxpbmVOdW1iZXJUYWJsZVszXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzRdIiwgMjEsIGxpbmVOdW1iZXJUYWJsZVs0XVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbNF0iLCA3LCBsaW5lTnVtYmVyVGFibGVbNF1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1s1XSIsIDI4LCBsaW5lTnVtYmVyVGFibGVbNV1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzVdIiwgOSwgbGluZU51bWJlclRhYmxlWzVdWzFdKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlbW92ZVRlbXBDbGFzcygiQSIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY3NTMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDIwKCkgewotCQl0cnkgewotCQkJU3RyaW5nIHNvdXJjZUEgPQotCQkJCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKwotCQkJCSIJCWludCBpID0gNjtcbiIgKwotCQkJCSIJCWlmIChpXG4iICsKLQkJCQkiCQkJPj0gNSkgeyAgIAlcbiIgKwotCQkJCSIJCSAgIAlTeXN0ZW0ub3V0LnByaW50bG4oaSk7XG4iICsKLQkJCQkiCQkgICB9XG4iICsKLQkJCQkiCX1cbiIgKwotCQkJCSJ9IjsKLQkJCWNvbXBpbGVBbmREZXBsb3koc291cmNlQSwgIkEiKTsKLQkJCUlDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyID0gVG9vbEZhY3RvcnkuY3JlYXRlRGVmYXVsdENsYXNzRmlsZVJlYWRlcihFVkFMX0RJUkVDVE9SWSArIEZpbGUuc2VwYXJhdG9yICsgIkEuY2xhc3MiLCBJQ2xhc3NGaWxlUmVhZGVyLkFMTCk7Ci0JCQlJTWV0aG9kSW5mb1tdIG1ldGhvZEluZm9zID0gY2xhc3NGaWxlUmVhZGVyLmdldE1ldGhvZEluZm9zKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAyLCBtZXRob2RJbmZvcy5sZW5ndGgpOwotCQkJSU1ldGhvZEluZm8gbWV0aG9kSW5mbyA9IG1ldGhvZEluZm9zWzFdOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgIm1haW4iLCBuZXcgU3RyaW5nKG1ldGhvZEluZm8uZ2V0TmFtZSgpKSk7Ci0JCQlJQ29kZUF0dHJpYnV0ZSBjb2RlQXR0cmlidXRlID0gbWV0aG9kSW5mby5nZXRDb2RlQXR0cmlidXRlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJObyBjb2RlIGF0dHJpYnV0ZSIsIGNvZGVBdHRyaWJ1dGUpOwotCQkJSUxpbmVOdW1iZXJBdHRyaWJ1dGUgbGluZU51bWJlckF0dHJpYnV0ZSA9IGNvZGVBdHRyaWJ1dGUuZ2V0TGluZU51bWJlckF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUiLCBsaW5lTnVtYmVyQXR0cmlidXRlKTsKLQkJCWludFtdW10gbGluZU51bWJlclRhYmxlID0gbGluZU51bWJlckF0dHJpYnV0ZS5nZXRMaW5lTnVtYmVyVGFibGUoKTsKLQkJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDUsIGxpbmVOdW1iZXJUYWJsZS5sZW5ndGgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1swXSIsIDAsIGxpbmVOdW1iZXJUYWJsZVswXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMF0iLCAzLCBsaW5lTnVtYmVyVGFibGVbMF1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1sxXSIsIDMsIGxpbmVOdW1iZXJUYWJsZVsxXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMV0iLCA0LCBsaW5lTnVtYmVyVGFibGVbMV1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1syXSIsIDQsIGxpbmVOdW1iZXJUYWJsZVsyXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMl0iLCA1LCBsaW5lTnVtYmVyVGFibGVbMl1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1szXSIsIDgsIGxpbmVOdW1iZXJUYWJsZVszXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbM10iLCA2LCBsaW5lTnVtYmVyVGFibGVbM11bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1s0XSIsIDE1LCBsaW5lTnVtYmVyVGFibGVbNF1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzRdIiwgOCwgbGluZU51bWJlclRhYmxlWzRdWzFdKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlbW92ZVRlbXBDbGFzcygiQSIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY3NTMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDIxKCkgewotCQl0cnkgewotCQkJU3RyaW5nIHNvdXJjZUEgPQotCQkJCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKwotCQkJCSIJCWludCBpID0gNjtcbiIgKwotCQkJCSIJCWlmIChpXG4iICsKLQkJCQkiCQkJPj0gMCkgeyAgIAlcbiIgKwotCQkJCSIJCSAgIAlTeXN0ZW0ub3V0LnByaW50bG4oaSk7XG4iICsKLQkJCQkiCQkgICB9XG4iICsKLQkJCQkiCX1cbiIgKwotCQkJCSJ9IjsKLQkJCWNvbXBpbGVBbmREZXBsb3koc291cmNlQSwgIkEiKTsKLQkJCUlDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyID0gVG9vbEZhY3RvcnkuY3JlYXRlRGVmYXVsdENsYXNzRmlsZVJlYWRlcihFVkFMX0RJUkVDVE9SWSArIEZpbGUuc2VwYXJhdG9yICsgIkEuY2xhc3MiLCBJQ2xhc3NGaWxlUmVhZGVyLkFMTCk7Ci0JCQlJTWV0aG9kSW5mb1tdIG1ldGhvZEluZm9zID0gY2xhc3NGaWxlUmVhZGVyLmdldE1ldGhvZEluZm9zKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAyLCBtZXRob2RJbmZvcy5sZW5ndGgpOwotCQkJSU1ldGhvZEluZm8gbWV0aG9kSW5mbyA9IG1ldGhvZEluZm9zWzFdOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgIm1haW4iLCBuZXcgU3RyaW5nKG1ldGhvZEluZm8uZ2V0TmFtZSgpKSk7Ci0JCQlJQ29kZUF0dHJpYnV0ZSBjb2RlQXR0cmlidXRlID0gbWV0aG9kSW5mby5nZXRDb2RlQXR0cmlidXRlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJObyBjb2RlIGF0dHJpYnV0ZSIsIGNvZGVBdHRyaWJ1dGUpOwotCQkJSUxpbmVOdW1iZXJBdHRyaWJ1dGUgbGluZU51bWJlckF0dHJpYnV0ZSA9IGNvZGVBdHRyaWJ1dGUuZ2V0TGluZU51bWJlckF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUiLCBsaW5lTnVtYmVyQXR0cmlidXRlKTsKLQkJCWludFtdW10gbGluZU51bWJlclRhYmxlID0gbGluZU51bWJlckF0dHJpYnV0ZS5nZXRMaW5lTnVtYmVyVGFibGUoKTsKLQkJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDQsIGxpbmVOdW1iZXJUYWJsZS5sZW5ndGgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1swXSIsIDAsIGxpbmVOdW1iZXJUYWJsZVswXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMF0iLCAzLCBsaW5lTnVtYmVyVGFibGVbMF1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1sxXSIsIDMsIGxpbmVOdW1iZXJUYWJsZVsxXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMV0iLCA0LCBsaW5lTnVtYmVyVGFibGVbMV1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1syXSIsIDcsIGxpbmVOdW1iZXJUYWJsZVsyXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMl0iLCA2LCBsaW5lTnVtYmVyVGFibGVbMl1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1szXSIsIDE0LCBsaW5lTnVtYmVyVGFibGVbM11bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzNdIiwgOCwgbGluZU51bWJlclRhYmxlWzNdWzFdKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlbW92ZVRlbXBDbGFzcygiQSIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY3NTMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDIyKCkgewotCQl0cnkgewotCQkJU3RyaW5nIHNvdXJjZUEgPQotCQkJCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKwotCQkJCSIJCWludCBpID0gNjtcbiIgKwotCQkJCSIJCWlmICgwXG4iICsKLQkJCQkiCQkJPj0gaSkgeyAgIAlcbiIgKwotCQkJCSIJCSAgIAlTeXN0ZW0ub3V0LnByaW50bG4oaSk7XG4iICsKLQkJCQkiCQkgICB9XG4iICsKLQkJCQkiCX1cbiIgKwotCQkJCSJ9IjsKLQkJCWNvbXBpbGVBbmREZXBsb3koc291cmNlQSwgIkEiKTsKLQkJCUlDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyID0gVG9vbEZhY3RvcnkuY3JlYXRlRGVmYXVsdENsYXNzRmlsZVJlYWRlcihFVkFMX0RJUkVDVE9SWSArIEZpbGUuc2VwYXJhdG9yICsgIkEuY2xhc3MiLCBJQ2xhc3NGaWxlUmVhZGVyLkFMTCk7Ci0JCQlJTWV0aG9kSW5mb1tdIG1ldGhvZEluZm9zID0gY2xhc3NGaWxlUmVhZGVyLmdldE1ldGhvZEluZm9zKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAyLCBtZXRob2RJbmZvcy5sZW5ndGgpOwotCQkJSU1ldGhvZEluZm8gbWV0aG9kSW5mbyA9IG1ldGhvZEluZm9zWzFdOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgIm1haW4iLCBuZXcgU3RyaW5nKG1ldGhvZEluZm8uZ2V0TmFtZSgpKSk7Ci0JCQlJQ29kZUF0dHJpYnV0ZSBjb2RlQXR0cmlidXRlID0gbWV0aG9kSW5mby5nZXRDb2RlQXR0cmlidXRlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJObyBjb2RlIGF0dHJpYnV0ZSIsIGNvZGVBdHRyaWJ1dGUpOwotCQkJSUxpbmVOdW1iZXJBdHRyaWJ1dGUgbGluZU51bWJlckF0dHJpYnV0ZSA9IGNvZGVBdHRyaWJ1dGUuZ2V0TGluZU51bWJlckF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUiLCBsaW5lTnVtYmVyQXR0cmlidXRlKTsKLQkJCWludFtdW10gbGluZU51bWJlclRhYmxlID0gbGluZU51bWJlckF0dHJpYnV0ZS5nZXRMaW5lTnVtYmVyVGFibGUoKTsKLQkJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDQsIGxpbmVOdW1iZXJUYWJsZS5sZW5ndGgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1swXSIsIDAsIGxpbmVOdW1iZXJUYWJsZVswXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMF0iLCAzLCBsaW5lTnVtYmVyVGFibGVbMF1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1sxXSIsIDMsIGxpbmVOdW1iZXJUYWJsZVsxXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMV0iLCA1LCBsaW5lTnVtYmVyVGFibGVbMV1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1syXSIsIDcsIGxpbmVOdW1iZXJUYWJsZVsyXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMl0iLCA2LCBsaW5lTnVtYmVyVGFibGVbMl1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1szXSIsIDE0LCBsaW5lTnVtYmVyVGFibGVbM11bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzNdIiwgOCwgbGluZU51bWJlclRhYmxlWzNdWzFdKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlbW92ZVRlbXBDbGFzcygiQSIpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NzUzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyMygpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzb3VyY2VBID0KLQkJCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsKLQkJCQkiCQlpbnQgaSA9IDY7XG4iICsKLQkJCQkiCQlpZiAoaVxuIiArCi0JCQkJIgkJCT4gMCkgeyAgIAlcbiIgKwotCQkJCSIJCSAgIAlTeXN0ZW0ub3V0LnByaW50bG4oaSk7XG4iICsKLQkJCQkiCQkgICB9XG4iICsKLQkJCQkiCX1cbiIgKwotCQkJCSJ9IjsKLQkJCWNvbXBpbGVBbmREZXBsb3koc291cmNlQSwgIkEiKTsKLQkJCUlDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyID0gVG9vbEZhY3RvcnkuY3JlYXRlRGVmYXVsdENsYXNzRmlsZVJlYWRlcihFVkFMX0RJUkVDVE9SWSArIEZpbGUuc2VwYXJhdG9yICsgIkEuY2xhc3MiLCBJQ2xhc3NGaWxlUmVhZGVyLkFMTCk7Ci0JCQlJTWV0aG9kSW5mb1tdIG1ldGhvZEluZm9zID0gY2xhc3NGaWxlUmVhZGVyLmdldE1ldGhvZEluZm9zKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAyLCBtZXRob2RJbmZvcy5sZW5ndGgpOwotCQkJSU1ldGhvZEluZm8gbWV0aG9kSW5mbyA9IG1ldGhvZEluZm9zWzFdOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgIm1haW4iLCBuZXcgU3RyaW5nKG1ldGhvZEluZm8uZ2V0TmFtZSgpKSk7Ci0JCQlJQ29kZUF0dHJpYnV0ZSBjb2RlQXR0cmlidXRlID0gbWV0aG9kSW5mby5nZXRDb2RlQXR0cmlidXRlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJObyBjb2RlIGF0dHJpYnV0ZSIsIGNvZGVBdHRyaWJ1dGUpOwotCQkJSUxpbmVOdW1iZXJBdHRyaWJ1dGUgbGluZU51bWJlckF0dHJpYnV0ZSA9IGNvZGVBdHRyaWJ1dGUuZ2V0TGluZU51bWJlckF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUiLCBsaW5lTnVtYmVyQXR0cmlidXRlKTsKLQkJCWludFtdW10gbGluZU51bWJlclRhYmxlID0gbGluZU51bWJlckF0dHJpYnV0ZS5nZXRMaW5lTnVtYmVyVGFibGUoKTsKLQkJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDQsIGxpbmVOdW1iZXJUYWJsZS5sZW5ndGgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1swXSIsIDAsIGxpbmVOdW1iZXJUYWJsZVswXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMF0iLCAzLCBsaW5lTnVtYmVyVGFibGVbMF1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1sxXSIsIDMsIGxpbmVOdW1iZXJUYWJsZVsxXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMV0iLCA0LCBsaW5lTnVtYmVyVGFibGVbMV1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1syXSIsIDcsIGxpbmVOdW1iZXJUYWJsZVsyXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMl0iLCA2LCBsaW5lTnVtYmVyVGFibGVbMl1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1szXSIsIDE0LCBsaW5lTnVtYmVyVGFibGVbM11bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzNdIiwgOCwgbGluZU51bWJlclRhYmxlWzNdWzFdKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlbW92ZVRlbXBDbGFzcygiQSIpOwotCQl9Ci0JfQkKLQkKLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjc1MwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjQoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc291cmNlQSA9Ci0JCQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArCi0JCQkJIgkJaW50IGkgPSA2O1xuIiArCi0JCQkJIgkJaWYgKDBcbiIgKwotCQkJCSIJCQk+IGkpIHsgICAJXG4iICsKLQkJCQkiCQkgICAJU3lzdGVtLm91dC5wcmludGxuKGkpO1xuIiArCi0JCQkJIgkJICAgfVxuIiArCi0JCQkJIgl9XG4iICsKLQkJCQkifSI7Ci0JCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEsICJBIik7Ci0JCQlJQ2xhc3NGaWxlUmVhZGVyIGNsYXNzRmlsZVJlYWRlciA9IFRvb2xGYWN0b3J5LmNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVSZWFkZXIoRVZBTF9ESVJFQ1RPUlkgKyBGaWxlLnNlcGFyYXRvciArICJBLmNsYXNzIiwgSUNsYXNzRmlsZVJlYWRlci5BTEwpOwotCQkJSU1ldGhvZEluZm9bXSBtZXRob2RJbmZvcyA9IGNsYXNzRmlsZVJlYWRlci5nZXRNZXRob2RJbmZvcygpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMiwgbWV0aG9kSW5mb3MubGVuZ3RoKTsKLQkJCUlNZXRob2RJbmZvIG1ldGhvZEluZm8gPSBtZXRob2RJbmZvc1sxXTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJtYWluIiwgbmV3IFN0cmluZyhtZXRob2RJbmZvLmdldE5hbWUoKSkpOwotCQkJSUNvZGVBdHRyaWJ1dGUgY29kZUF0dHJpYnV0ZSA9IG1ldGhvZEluZm8uZ2V0Q29kZUF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBhdHRyaWJ1dGUiLCBjb2RlQXR0cmlidXRlKTsKLQkJCUlMaW5lTnVtYmVyQXR0cmlidXRlIGxpbmVOdW1iZXJBdHRyaWJ1dGUgPSBjb2RlQXR0cmlidXRlLmdldExpbmVOdW1iZXJBdHRyaWJ1dGUoKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGNvZGUgbGluZSBudW1iZXIgYXR0cmlidXRlIiwgbGluZU51bWJlckF0dHJpYnV0ZSk7Ci0JCQlpbnRbXVtdIGxpbmVOdW1iZXJUYWJsZSA9IGxpbmVOdW1iZXJBdHRyaWJ1dGUuZ2V0TGluZU51bWJlclRhYmxlKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCA0LCBsaW5lTnVtYmVyVGFibGUubGVuZ3RoKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMF0iLCAwLCBsaW5lTnVtYmVyVGFibGVbMF1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzBdIiwgMywgbGluZU51bWJlclRhYmxlWzBdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMV0iLCAzLCBsaW5lTnVtYmVyVGFibGVbMV1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzFdIiwgNSwgbGluZU51bWJlclRhYmxlWzFdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMl0iLCA3LCBsaW5lTnVtYmVyVGFibGVbMl1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzJdIiwgNiwgbGluZU51bWJlclRhYmxlWzJdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbM10iLCAxNCwgbGluZU51bWJlclRhYmxlWzNdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVszXSIsIDgsIGxpbmVOdW1iZXJUYWJsZVszXVsxXSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZW1vdmVUZW1wQ2xhc3MoIkEiKTsKLQkJfQotCX0JCi0KLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjc1MwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjUoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc291cmNlQSA9Ci0JCQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArCi0JCQkJIgkJaW50IGkgPSA2O1xuIiArCi0JCQkJIgkJaWYgKGlcbiIgKwotCQkJCSIJCQk+IDUpIHsgICAJXG4iICsKLQkJCQkiCQkgICAJU3lzdGVtLm91dC5wcmludGxuKGkpO1xuIiArCi0JCQkJIgkJICAgfVxuIiArCi0JCQkJIgl9XG4iICsKLQkJCQkifSI7Ci0JCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEsICJBIik7Ci0JCQlJQ2xhc3NGaWxlUmVhZGVyIGNsYXNzRmlsZVJlYWRlciA9IFRvb2xGYWN0b3J5LmNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVSZWFkZXIoRVZBTF9ESVJFQ1RPUlkgKyBGaWxlLnNlcGFyYXRvciArICJBLmNsYXNzIiwgSUNsYXNzRmlsZVJlYWRlci5BTEwpOwotCQkJSU1ldGhvZEluZm9bXSBtZXRob2RJbmZvcyA9IGNsYXNzRmlsZVJlYWRlci5nZXRNZXRob2RJbmZvcygpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMiwgbWV0aG9kSW5mb3MubGVuZ3RoKTsKLQkJCUlNZXRob2RJbmZvIG1ldGhvZEluZm8gPSBtZXRob2RJbmZvc1sxXTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJtYWluIiwgbmV3IFN0cmluZyhtZXRob2RJbmZvLmdldE5hbWUoKSkpOwotCQkJSUNvZGVBdHRyaWJ1dGUgY29kZUF0dHJpYnV0ZSA9IG1ldGhvZEluZm8uZ2V0Q29kZUF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBhdHRyaWJ1dGUiLCBjb2RlQXR0cmlidXRlKTsKLQkJCUlMaW5lTnVtYmVyQXR0cmlidXRlIGxpbmVOdW1iZXJBdHRyaWJ1dGUgPSBjb2RlQXR0cmlidXRlLmdldExpbmVOdW1iZXJBdHRyaWJ1dGUoKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGNvZGUgbGluZSBudW1iZXIgYXR0cmlidXRlIiwgbGluZU51bWJlckF0dHJpYnV0ZSk7Ci0JCQlpbnRbXVtdIGxpbmVOdW1iZXJUYWJsZSA9IGxpbmVOdW1iZXJBdHRyaWJ1dGUuZ2V0TGluZU51bWJlclRhYmxlKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCA1LCBsaW5lTnVtYmVyVGFibGUubGVuZ3RoKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMF0iLCAwLCBsaW5lTnVtYmVyVGFibGVbMF1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzBdIiwgMywgbGluZU51bWJlclRhYmxlWzBdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMV0iLCAzLCBsaW5lTnVtYmVyVGFibGVbMV1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzFdIiwgNCwgbGluZU51bWJlclRhYmxlWzFdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMl0iLCA0LCBsaW5lTnVtYmVyVGFibGVbMl1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzJdIiwgNSwgbGluZU51bWJlclRhYmxlWzJdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbM10iLCA4LCBsaW5lTnVtYmVyVGFibGVbM11bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzNdIiwgNiwgbGluZU51bWJlclRhYmxlWzNdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbNF0iLCAxNSwgbGluZU51bWJlclRhYmxlWzRdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVs0XSIsIDgsIGxpbmVOdW1iZXJUYWJsZVs0XVsxXSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZW1vdmVUZW1wQ2xhc3MoIkEiKTsKLQkJfQotCX0JCi0KLQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NzUzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyNigpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzb3VyY2VBID0KLQkJCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsKLQkJCQkiCQlpbnQgaSA9IDY7XG4iICsKLQkJCQkiCQlpZiAoaVxuIiArCi0JCQkJIgkJCTwgMCkgeyAgIAlcbiIgKwotCQkJCSIJCSAgIAlTeXN0ZW0ub3V0LnByaW50bG4oaSk7XG4iICsKLQkJCQkiCQkgICB9XG4iICsKLQkJCQkiCX1cbiIgKwotCQkJCSJ9IjsKLQkJCWNvbXBpbGVBbmREZXBsb3koc291cmNlQSwgIkEiKTsKLQkJCUlDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyID0gVG9vbEZhY3RvcnkuY3JlYXRlRGVmYXVsdENsYXNzRmlsZVJlYWRlcihFVkFMX0RJUkVDVE9SWSArIEZpbGUuc2VwYXJhdG9yICsgIkEuY2xhc3MiLCBJQ2xhc3NGaWxlUmVhZGVyLkFMTCk7Ci0JCQlJTWV0aG9kSW5mb1tdIG1ldGhvZEluZm9zID0gY2xhc3NGaWxlUmVhZGVyLmdldE1ldGhvZEluZm9zKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAyLCBtZXRob2RJbmZvcy5sZW5ndGgpOwotCQkJSU1ldGhvZEluZm8gbWV0aG9kSW5mbyA9IG1ldGhvZEluZm9zWzFdOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgIm1haW4iLCBuZXcgU3RyaW5nKG1ldGhvZEluZm8uZ2V0TmFtZSgpKSk7Ci0JCQlJQ29kZUF0dHJpYnV0ZSBjb2RlQXR0cmlidXRlID0gbWV0aG9kSW5mby5nZXRDb2RlQXR0cmlidXRlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJObyBjb2RlIGF0dHJpYnV0ZSIsIGNvZGVBdHRyaWJ1dGUpOwotCQkJSUxpbmVOdW1iZXJBdHRyaWJ1dGUgbGluZU51bWJlckF0dHJpYnV0ZSA9IGNvZGVBdHRyaWJ1dGUuZ2V0TGluZU51bWJlckF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUiLCBsaW5lTnVtYmVyQXR0cmlidXRlKTsKLQkJCWludFtdW10gbGluZU51bWJlclRhYmxlID0gbGluZU51bWJlckF0dHJpYnV0ZS5nZXRMaW5lTnVtYmVyVGFibGUoKTsKLQkJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDQsIGxpbmVOdW1iZXJUYWJsZS5sZW5ndGgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1swXSIsIDAsIGxpbmVOdW1iZXJUYWJsZVswXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMF0iLCAzLCBsaW5lTnVtYmVyVGFibGVbMF1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1sxXSIsIDMsIGxpbmVOdW1iZXJUYWJsZVsxXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMV0iLCA0LCBsaW5lTnVtYmVyVGFibGVbMV1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1syXSIsIDcsIGxpbmVOdW1iZXJUYWJsZVsyXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMl0iLCA2LCBsaW5lTnVtYmVyVGFibGVbMl1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1szXSIsIDE0LCBsaW5lTnVtYmVyVGFibGVbM11bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzNdIiwgOCwgbGluZU51bWJlclRhYmxlWzNdWzFdKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlbW92ZVRlbXBDbGFzcygiQSIpOwotCQl9Ci0JfQkKLQotCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY3NTMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDI3KCkgewotCQl0cnkgewotCQkJU3RyaW5nIHNvdXJjZUEgPQotCQkJCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKwotCQkJCSIJCWludCBpID0gNjtcbiIgKwotCQkJCSIJCWlmICgwXG4iICsKLQkJCQkiCQkJPCBpKSB7ICAgCVxuIiArCi0JCQkJIgkJICAgCVN5c3RlbS5vdXQucHJpbnRsbihpKTtcbiIgKwotCQkJCSIJCSAgIH1cbiIgKwotCQkJCSIJfVxuIiArCi0JCQkJIn0iOwotCQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBLCAiQSIpOwotCQkJSUNsYXNzRmlsZVJlYWRlciBjbGFzc0ZpbGVSZWFkZXIgPSBUb29sRmFjdG9yeS5jcmVhdGVEZWZhdWx0Q2xhc3NGaWxlUmVhZGVyKEVWQUxfRElSRUNUT1JZICsgRmlsZS5zZXBhcmF0b3IgKyAiQS5jbGFzcyIsIElDbGFzc0ZpbGVSZWFkZXIuQUxMKTsKLQkJCUlNZXRob2RJbmZvW10gbWV0aG9kSW5mb3MgPSBjbGFzc0ZpbGVSZWFkZXIuZ2V0TWV0aG9kSW5mb3MoKTsKLQkJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDIsIG1ldGhvZEluZm9zLmxlbmd0aCk7Ci0JCQlJTWV0aG9kSW5mbyBtZXRob2RJbmZvID0gbWV0aG9kSW5mb3NbMV07Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAibWFpbiIsIG5ldyBTdHJpbmcobWV0aG9kSW5mby5nZXROYW1lKCkpKTsKLQkJCUlDb2RlQXR0cmlidXRlIGNvZGVBdHRyaWJ1dGUgPSBtZXRob2RJbmZvLmdldENvZGVBdHRyaWJ1dGUoKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGNvZGUgYXR0cmlidXRlIiwgY29kZUF0dHJpYnV0ZSk7Ci0JCQlJTGluZU51bWJlckF0dHJpYnV0ZSBsaW5lTnVtYmVyQXR0cmlidXRlID0gY29kZUF0dHJpYnV0ZS5nZXRMaW5lTnVtYmVyQXR0cmlidXRlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJObyBjb2RlIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZSIsIGxpbmVOdW1iZXJBdHRyaWJ1dGUpOwotCQkJaW50W11bXSBsaW5lTnVtYmVyVGFibGUgPSBsaW5lTnVtYmVyQXR0cmlidXRlLmdldExpbmVOdW1iZXJUYWJsZSgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgNCwgbGluZU51bWJlclRhYmxlLmxlbmd0aCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzBdIiwgMCwgbGluZU51bWJlclRhYmxlWzBdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVswXSIsIDMsIGxpbmVOdW1iZXJUYWJsZVswXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzFdIiwgMywgbGluZU51bWJlclRhYmxlWzFdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVsxXSIsIDUsIGxpbmVOdW1iZXJUYWJsZVsxXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzJdIiwgNywgbGluZU51bWJlclRhYmxlWzJdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVsyXSIsIDYsIGxpbmVOdW1iZXJUYWJsZVsyXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzNdIiwgMTQsIGxpbmVOdW1iZXJUYWJsZVszXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbM10iLCA4LCBsaW5lTnVtYmVyVGFibGVbM11bMV0pOwotCQl9IGZpbmFsbHkgewotCQkJcmVtb3ZlVGVtcENsYXNzKCJBIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjc1MwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjgoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc291cmNlQSA9Ci0JCQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArCi0JCQkJIgkJaW50IGkgPSA2O1xuIiArCi0JCQkJIgkJaWYgKGlcbiIgKwotCQkJCSIJCQk8IDUpIHsgICAJXG4iICsKLQkJCQkiCQkgICAJU3lzdGVtLm91dC5wcmludGxuKGkpO1xuIiArCi0JCQkJIgkJICAgfVxuIiArCi0JCQkJIgl9XG4iICsKLQkJCQkifSI7Ci0JCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEsICJBIik7Ci0JCQlJQ2xhc3NGaWxlUmVhZGVyIGNsYXNzRmlsZVJlYWRlciA9IFRvb2xGYWN0b3J5LmNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVSZWFkZXIoRVZBTF9ESVJFQ1RPUlkgKyBGaWxlLnNlcGFyYXRvciArICJBLmNsYXNzIiwgSUNsYXNzRmlsZVJlYWRlci5BTEwpOwotCQkJSU1ldGhvZEluZm9bXSBtZXRob2RJbmZvcyA9IGNsYXNzRmlsZVJlYWRlci5nZXRNZXRob2RJbmZvcygpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMiwgbWV0aG9kSW5mb3MubGVuZ3RoKTsKLQkJCUlNZXRob2RJbmZvIG1ldGhvZEluZm8gPSBtZXRob2RJbmZvc1sxXTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJtYWluIiwgbmV3IFN0cmluZyhtZXRob2RJbmZvLmdldE5hbWUoKSkpOwotCQkJSUNvZGVBdHRyaWJ1dGUgY29kZUF0dHJpYnV0ZSA9IG1ldGhvZEluZm8uZ2V0Q29kZUF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBhdHRyaWJ1dGUiLCBjb2RlQXR0cmlidXRlKTsKLQkJCUlMaW5lTnVtYmVyQXR0cmlidXRlIGxpbmVOdW1iZXJBdHRyaWJ1dGUgPSBjb2RlQXR0cmlidXRlLmdldExpbmVOdW1iZXJBdHRyaWJ1dGUoKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGNvZGUgbGluZSBudW1iZXIgYXR0cmlidXRlIiwgbGluZU51bWJlckF0dHJpYnV0ZSk7Ci0JCQlpbnRbXVtdIGxpbmVOdW1iZXJUYWJsZSA9IGxpbmVOdW1iZXJBdHRyaWJ1dGUuZ2V0TGluZU51bWJlclRhYmxlKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCA1LCBsaW5lTnVtYmVyVGFibGUubGVuZ3RoKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMF0iLCAwLCBsaW5lTnVtYmVyVGFibGVbMF1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzBdIiwgMywgbGluZU51bWJlclRhYmxlWzBdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMV0iLCAzLCBsaW5lTnVtYmVyVGFibGVbMV1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzFdIiwgNCwgbGluZU51bWJlclRhYmxlWzFdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMl0iLCA0LCBsaW5lTnVtYmVyVGFibGVbMl1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzJdIiwgNSwgbGluZU51bWJlclRhYmxlWzJdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbM10iLCA4LCBsaW5lTnVtYmVyVGFibGVbM11bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzNdIiwgNiwgbGluZU51bWJlclRhYmxlWzNdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbNF0iLCAxNSwgbGluZU51bWJlclRhYmxlWzRdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVs0XSIsIDgsIGxpbmVOdW1iZXJUYWJsZVs0XVsxXSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZW1vdmVUZW1wQ2xhc3MoIkEiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NzUzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyOSgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzb3VyY2VBID0KLQkJCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsKLQkJCQkiCQlpbnQgaSA9IDY7XG4iICsKLQkJCQkiCQlpZiAoaVxuIiArCi0JCQkJIgkJCTw9IDApIHsgICAJXG4iICsKLQkJCQkiCQkgICAJU3lzdGVtLm91dC5wcmludGxuKGkpO1xuIiArCi0JCQkJIgkJICAgfVxuIiArCi0JCQkJIgl9XG4iICsKLQkJCQkifSI7Ci0JCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEsICJBIik7Ci0JCQlJQ2xhc3NGaWxlUmVhZGVyIGNsYXNzRmlsZVJlYWRlciA9IFRvb2xGYWN0b3J5LmNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVSZWFkZXIoRVZBTF9ESVJFQ1RPUlkgKyBGaWxlLnNlcGFyYXRvciArICJBLmNsYXNzIiwgSUNsYXNzRmlsZVJlYWRlci5BTEwpOwotCQkJSU1ldGhvZEluZm9bXSBtZXRob2RJbmZvcyA9IGNsYXNzRmlsZVJlYWRlci5nZXRNZXRob2RJbmZvcygpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMiwgbWV0aG9kSW5mb3MubGVuZ3RoKTsKLQkJCUlNZXRob2RJbmZvIG1ldGhvZEluZm8gPSBtZXRob2RJbmZvc1sxXTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJtYWluIiwgbmV3IFN0cmluZyhtZXRob2RJbmZvLmdldE5hbWUoKSkpOwotCQkJSUNvZGVBdHRyaWJ1dGUgY29kZUF0dHJpYnV0ZSA9IG1ldGhvZEluZm8uZ2V0Q29kZUF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBhdHRyaWJ1dGUiLCBjb2RlQXR0cmlidXRlKTsKLQkJCUlMaW5lTnVtYmVyQXR0cmlidXRlIGxpbmVOdW1iZXJBdHRyaWJ1dGUgPSBjb2RlQXR0cmlidXRlLmdldExpbmVOdW1iZXJBdHRyaWJ1dGUoKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGNvZGUgbGluZSBudW1iZXIgYXR0cmlidXRlIiwgbGluZU51bWJlckF0dHJpYnV0ZSk7Ci0JCQlpbnRbXVtdIGxpbmVOdW1iZXJUYWJsZSA9IGxpbmVOdW1iZXJBdHRyaWJ1dGUuZ2V0TGluZU51bWJlclRhYmxlKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCA0LCBsaW5lTnVtYmVyVGFibGUubGVuZ3RoKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMF0iLCAwLCBsaW5lTnVtYmVyVGFibGVbMF1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzBdIiwgMywgbGluZU51bWJlclRhYmxlWzBdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMV0iLCAzLCBsaW5lTnVtYmVyVGFibGVbMV1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzFdIiwgNCwgbGluZU51bWJlclRhYmxlWzFdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMl0iLCA3LCBsaW5lTnVtYmVyVGFibGVbMl1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzJdIiwgNiwgbGluZU51bWJlclRhYmxlWzJdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbM10iLCAxNCwgbGluZU51bWJlclRhYmxlWzNdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVszXSIsIDgsIGxpbmVOdW1iZXJUYWJsZVszXVsxXSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZW1vdmVUZW1wQ2xhc3MoIkEiKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY3NTMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDMwKCkgewotCQl0cnkgewotCQkJU3RyaW5nIHNvdXJjZUEgPQotCQkJCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKwotCQkJCSIJCWludCBpID0gNjtcbiIgKwotCQkJCSIJCWlmICgwXG4iICsKLQkJCQkiCQkJPD0gaSkgeyAgIAlcbiIgKwotCQkJCSIJCSAgIAlTeXN0ZW0ub3V0LnByaW50bG4oaSk7XG4iICsKLQkJCQkiCQkgICB9XG4iICsKLQkJCQkiCX1cbiIgKwotCQkJCSJ9IjsKLQkJCWNvbXBpbGVBbmREZXBsb3koc291cmNlQSwgIkEiKTsKLQkJCUlDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyID0gVG9vbEZhY3RvcnkuY3JlYXRlRGVmYXVsdENsYXNzRmlsZVJlYWRlcihFVkFMX0RJUkVDVE9SWSArIEZpbGUuc2VwYXJhdG9yICsgIkEuY2xhc3MiLCBJQ2xhc3NGaWxlUmVhZGVyLkFMTCk7Ci0JCQlJTWV0aG9kSW5mb1tdIG1ldGhvZEluZm9zID0gY2xhc3NGaWxlUmVhZGVyLmdldE1ldGhvZEluZm9zKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAyLCBtZXRob2RJbmZvcy5sZW5ndGgpOwotCQkJSU1ldGhvZEluZm8gbWV0aG9kSW5mbyA9IG1ldGhvZEluZm9zWzFdOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgIm1haW4iLCBuZXcgU3RyaW5nKG1ldGhvZEluZm8uZ2V0TmFtZSgpKSk7Ci0JCQlJQ29kZUF0dHJpYnV0ZSBjb2RlQXR0cmlidXRlID0gbWV0aG9kSW5mby5nZXRDb2RlQXR0cmlidXRlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJObyBjb2RlIGF0dHJpYnV0ZSIsIGNvZGVBdHRyaWJ1dGUpOwotCQkJSUxpbmVOdW1iZXJBdHRyaWJ1dGUgbGluZU51bWJlckF0dHJpYnV0ZSA9IGNvZGVBdHRyaWJ1dGUuZ2V0TGluZU51bWJlckF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUiLCBsaW5lTnVtYmVyQXR0cmlidXRlKTsKLQkJCWludFtdW10gbGluZU51bWJlclRhYmxlID0gbGluZU51bWJlckF0dHJpYnV0ZS5nZXRMaW5lTnVtYmVyVGFibGUoKTsKLQkJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDQsIGxpbmVOdW1iZXJUYWJsZS5sZW5ndGgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1swXSIsIDAsIGxpbmVOdW1iZXJUYWJsZVswXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMF0iLCAzLCBsaW5lTnVtYmVyVGFibGVbMF1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1sxXSIsIDMsIGxpbmVOdW1iZXJUYWJsZVsxXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMV0iLCA1LCBsaW5lTnVtYmVyVGFibGVbMV1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1syXSIsIDcsIGxpbmVOdW1iZXJUYWJsZVsyXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMl0iLCA2LCBsaW5lTnVtYmVyVGFibGVbMl1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1szXSIsIDE0LCBsaW5lTnVtYmVyVGFibGVbM11bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzNdIiwgOCwgbGluZU51bWJlclRhYmxlWzNdWzFdKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlbW92ZVRlbXBDbGFzcygiQSIpOwotCQl9Ci0JfQkKLQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NzUzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzMSgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzb3VyY2VBID0KLQkJCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsKLQkJCQkiCQlpbnQgaSA9IDY7XG4iICsKLQkJCQkiCQlpZiAoaVxuIiArCi0JCQkJIgkJCTw9IDUpIHsgICAJXG4iICsKLQkJCQkiCQkgICAJU3lzdGVtLm91dC5wcmludGxuKGkpO1xuIiArCi0JCQkJIgkJICAgfVxuIiArCi0JCQkJIgl9XG4iICsKLQkJCQkifSI7Ci0JCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEsICJBIik7Ci0JCQlJQ2xhc3NGaWxlUmVhZGVyIGNsYXNzRmlsZVJlYWRlciA9IFRvb2xGYWN0b3J5LmNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVSZWFkZXIoRVZBTF9ESVJFQ1RPUlkgKyBGaWxlLnNlcGFyYXRvciArICJBLmNsYXNzIiwgSUNsYXNzRmlsZVJlYWRlci5BTEwpOwotCQkJSU1ldGhvZEluZm9bXSBtZXRob2RJbmZvcyA9IGNsYXNzRmlsZVJlYWRlci5nZXRNZXRob2RJbmZvcygpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMiwgbWV0aG9kSW5mb3MubGVuZ3RoKTsKLQkJCUlNZXRob2RJbmZvIG1ldGhvZEluZm8gPSBtZXRob2RJbmZvc1sxXTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJtYWluIiwgbmV3IFN0cmluZyhtZXRob2RJbmZvLmdldE5hbWUoKSkpOwotCQkJSUNvZGVBdHRyaWJ1dGUgY29kZUF0dHJpYnV0ZSA9IG1ldGhvZEluZm8uZ2V0Q29kZUF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBhdHRyaWJ1dGUiLCBjb2RlQXR0cmlidXRlKTsKLQkJCUlMaW5lTnVtYmVyQXR0cmlidXRlIGxpbmVOdW1iZXJBdHRyaWJ1dGUgPSBjb2RlQXR0cmlidXRlLmdldExpbmVOdW1iZXJBdHRyaWJ1dGUoKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGNvZGUgbGluZSBudW1iZXIgYXR0cmlidXRlIiwgbGluZU51bWJlckF0dHJpYnV0ZSk7Ci0JCQlpbnRbXVtdIGxpbmVOdW1iZXJUYWJsZSA9IGxpbmVOdW1iZXJBdHRyaWJ1dGUuZ2V0TGluZU51bWJlclRhYmxlKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCA1LCBsaW5lTnVtYmVyVGFibGUubGVuZ3RoKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMF0iLCAwLCBsaW5lTnVtYmVyVGFibGVbMF1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzBdIiwgMywgbGluZU51bWJlclRhYmxlWzBdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMV0iLCAzLCBsaW5lTnVtYmVyVGFibGVbMV1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzFdIiwgNCwgbGluZU51bWJlclRhYmxlWzFdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMl0iLCA0LCBsaW5lTnVtYmVyVGFibGVbMl1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzJdIiwgNSwgbGluZU51bWJlclRhYmxlWzJdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbM10iLCA4LCBsaW5lTnVtYmVyVGFibGVbM11bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzNdIiwgNiwgbGluZU51bWJlclRhYmxlWzNdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbNF0iLCAxNSwgbGluZU51bWJlclRhYmxlWzRdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVs0XSIsIDgsIGxpbmVOdW1iZXJUYWJsZVs0XVsxXSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZW1vdmVUZW1wQ2xhc3MoIkEiKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjc1MwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzIoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc291cmNlQSA9Ci0JCQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArCi0JCQkJIgkJaW50IGkgPSA2O1xuIiArCi0JCQkJIgkJaWYgKGlcbiIgKwotCQkJCSIJCQk8PSA1KSB7ICAgCVxuIiArCi0JCQkJIgkJICAgCVN5c3RlbS5vdXQucHJpbnRsbihpKTtcbiIgKwotCQkJCSIJCSAgIH1cbiIgKwotCQkJCSIJfVxuIiArCi0JCQkJIn0iOwotCQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBLCAiQSIpOwotCQkJSUNsYXNzRmlsZVJlYWRlciBjbGFzc0ZpbGVSZWFkZXIgPSBUb29sRmFjdG9yeS5jcmVhdGVEZWZhdWx0Q2xhc3NGaWxlUmVhZGVyKEVWQUxfRElSRUNUT1JZICsgRmlsZS5zZXBhcmF0b3IgKyAiQS5jbGFzcyIsIElDbGFzc0ZpbGVSZWFkZXIuQUxMKTsKLQkJCUlNZXRob2RJbmZvW10gbWV0aG9kSW5mb3MgPSBjbGFzc0ZpbGVSZWFkZXIuZ2V0TWV0aG9kSW5mb3MoKTsKLQkJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDIsIG1ldGhvZEluZm9zLmxlbmd0aCk7Ci0JCQlJTWV0aG9kSW5mbyBtZXRob2RJbmZvID0gbWV0aG9kSW5mb3NbMV07Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAibWFpbiIsIG5ldyBTdHJpbmcobWV0aG9kSW5mby5nZXROYW1lKCkpKTsKLQkJCUlDb2RlQXR0cmlidXRlIGNvZGVBdHRyaWJ1dGUgPSBtZXRob2RJbmZvLmdldENvZGVBdHRyaWJ1dGUoKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGNvZGUgYXR0cmlidXRlIiwgY29kZUF0dHJpYnV0ZSk7Ci0JCQlJTGluZU51bWJlckF0dHJpYnV0ZSBsaW5lTnVtYmVyQXR0cmlidXRlID0gY29kZUF0dHJpYnV0ZS5nZXRMaW5lTnVtYmVyQXR0cmlidXRlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJObyBjb2RlIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZSIsIGxpbmVOdW1iZXJBdHRyaWJ1dGUpOwotCQkJaW50W11bXSBsaW5lTnVtYmVyVGFibGUgPSBsaW5lTnVtYmVyQXR0cmlidXRlLmdldExpbmVOdW1iZXJUYWJsZSgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgNSwgbGluZU51bWJlclRhYmxlLmxlbmd0aCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzBdIiwgMCwgbGluZU51bWJlclRhYmxlWzBdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVswXSIsIDMsIGxpbmVOdW1iZXJUYWJsZVswXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzFdIiwgMywgbGluZU51bWJlclRhYmxlWzFdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVsxXSIsIDQsIGxpbmVOdW1iZXJUYWJsZVsxXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzJdIiwgNCwgbGluZU51bWJlclRhYmxlWzJdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVsyXSIsIDUsIGxpbmVOdW1iZXJUYWJsZVsyXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzNdIiwgOCwgbGluZU51bWJlclRhYmxlWzNdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVszXSIsIDYsIGxpbmVOdW1iZXJUYWJsZVszXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzRdIiwgMTUsIGxpbmVOdW1iZXJUYWJsZVs0XVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbNF0iLCA4LCBsaW5lTnVtYmVyVGFibGVbNF1bMV0pOwotCQl9IGZpbmFsbHkgewotCQkJcmVtb3ZlVGVtcENsYXNzKCJBIik7Ci0JCX0KLQl9CQkKLQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NzUzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzMygpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzb3VyY2VBID0KLQkJCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsKLQkJCQkiCQlib29sZWFuIGIgPSBmYWxzZTtcbiIgKwotCQkJCSIJCWludCBpID0gNjtcbiIgKwotCQkJCSIJCWlmICgoaSA9PSA2KSBcbiIgKwotCQkJCSIJCSAgICYgIWIpIHsgICAJXG4iICsKLQkJCQkiCQkgICAJU3lzdGVtLm91dC5wcmludGxuKGkpO1xuIiArCi0JCQkJIgkJICAgfVxuIiArCi0JCQkJIgl9XG4iICsKLQkJCQkifSI7Ci0JCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEsICJBIik7Ci0JCQlJQ2xhc3NGaWxlUmVhZGVyIGNsYXNzRmlsZVJlYWRlciA9IFRvb2xGYWN0b3J5LmNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVSZWFkZXIoRVZBTF9ESVJFQ1RPUlkgKyBGaWxlLnNlcGFyYXRvciArICJBLmNsYXNzIiwgSUNsYXNzRmlsZVJlYWRlci5BTEwpOwotCQkJSU1ldGhvZEluZm9bXSBtZXRob2RJbmZvcyA9IGNsYXNzRmlsZVJlYWRlci5nZXRNZXRob2RJbmZvcygpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMiwgbWV0aG9kSW5mb3MubGVuZ3RoKTsKLQkJCUlNZXRob2RJbmZvIG1ldGhvZEluZm8gPSBtZXRob2RJbmZvc1sxXTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJtYWluIiwgbmV3IFN0cmluZyhtZXRob2RJbmZvLmdldE5hbWUoKSkpOwotCQkJSUNvZGVBdHRyaWJ1dGUgY29kZUF0dHJpYnV0ZSA9IG1ldGhvZEluZm8uZ2V0Q29kZUF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBhdHRyaWJ1dGUiLCBjb2RlQXR0cmlidXRlKTsKLQkJCUlMaW5lTnVtYmVyQXR0cmlidXRlIGxpbmVOdW1iZXJBdHRyaWJ1dGUgPSBjb2RlQXR0cmlidXRlLmdldExpbmVOdW1iZXJBdHRyaWJ1dGUoKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGNvZGUgbGluZSBudW1iZXIgYXR0cmlidXRlIiwgbGluZU51bWJlckF0dHJpYnV0ZSk7Ci0JCQlpbnRbXVtdIGxpbmVOdW1iZXJUYWJsZSA9IGxpbmVOdW1iZXJBdHRyaWJ1dGUuZ2V0TGluZU51bWJlclRhYmxlKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCA2LCBsaW5lTnVtYmVyVGFibGUubGVuZ3RoKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMF0iLCAwLCBsaW5lTnVtYmVyVGFibGVbMF1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzBdIiwgMywgbGluZU51bWJlclRhYmxlWzBdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMV0iLCAyLCBsaW5lTnVtYmVyVGFibGVbMV1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzFdIiwgNCwgbGluZU51bWJlclRhYmxlWzFdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMl0iLCA1LCBsaW5lTnVtYmVyVGFibGVbMl1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzJdIiwgNSwgbGluZU51bWJlclRhYmxlWzJdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbM10iLCAxNiwgbGluZU51bWJlclRhYmxlWzNdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVszXSIsIDYsIGxpbmVOdW1iZXJUYWJsZVszXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzRdIiwgMjksIGxpbmVOdW1iZXJUYWJsZVs0XVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbNF0iLCA3LCBsaW5lTnVtYmVyVGFibGVbNF1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1s1XSIsIDM2LCBsaW5lTnVtYmVyVGFibGVbNV1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzVdIiwgOSwgbGluZU51bWJlclRhYmxlWzVdWzFdKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlbW92ZVRlbXBDbGFzcygiQSIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY3NTMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDM0KCkgewotCQl0cnkgewotCQkJU3RyaW5nIHNvdXJjZUEgPQotCQkJCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKwotCQkJCSIJCWludCBpID0gNjtcbiIgKwotCQkJCSIJCWlmICgoaSA9PSA2KSBcbiIgKwotCQkJCSIJCSAgICYgdHJ1ZSkgeyAgIAlcbiIgKwotCQkJCSIJCSAgIAlTeXN0ZW0ub3V0LnByaW50bG4oaSk7XG4iICsKLQkJCQkiCQkgICB9XG4iICsKLQkJCQkiCX1cbiIgKwotCQkJCSJ9IjsKLQkJCWNvbXBpbGVBbmREZXBsb3koc291cmNlQSwgIkEiKTsKLQkJCUlDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyID0gVG9vbEZhY3RvcnkuY3JlYXRlRGVmYXVsdENsYXNzRmlsZVJlYWRlcihFVkFMX0RJUkVDVE9SWSArIEZpbGUuc2VwYXJhdG9yICsgIkEuY2xhc3MiLCBJQ2xhc3NGaWxlUmVhZGVyLkFMTCk7Ci0JCQlJTWV0aG9kSW5mb1tdIG1ldGhvZEluZm9zID0gY2xhc3NGaWxlUmVhZGVyLmdldE1ldGhvZEluZm9zKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAyLCBtZXRob2RJbmZvcy5sZW5ndGgpOwotCQkJSU1ldGhvZEluZm8gbWV0aG9kSW5mbyA9IG1ldGhvZEluZm9zWzFdOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgIm1haW4iLCBuZXcgU3RyaW5nKG1ldGhvZEluZm8uZ2V0TmFtZSgpKSk7Ci0JCQlJQ29kZUF0dHJpYnV0ZSBjb2RlQXR0cmlidXRlID0gbWV0aG9kSW5mby5nZXRDb2RlQXR0cmlidXRlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJObyBjb2RlIGF0dHJpYnV0ZSIsIGNvZGVBdHRyaWJ1dGUpOwotCQkJSUxpbmVOdW1iZXJBdHRyaWJ1dGUgbGluZU51bWJlckF0dHJpYnV0ZSA9IGNvZGVBdHRyaWJ1dGUuZ2V0TGluZU51bWJlckF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUiLCBsaW5lTnVtYmVyQXR0cmlidXRlKTsKLQkJCWludFtdW10gbGluZU51bWJlclRhYmxlID0gbGluZU51bWJlckF0dHJpYnV0ZS5nZXRMaW5lTnVtYmVyVGFibGUoKTsKLQkJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDQsIGxpbmVOdW1iZXJUYWJsZS5sZW5ndGgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1swXSIsIDAsIGxpbmVOdW1iZXJUYWJsZVswXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMF0iLCAzLCBsaW5lTnVtYmVyVGFibGVbMF1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1sxXSIsIDMsIGxpbmVOdW1iZXJUYWJsZVsxXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMV0iLCA0LCBsaW5lTnVtYmVyVGFibGVbMV1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1syXSIsIDksIGxpbmVOdW1iZXJUYWJsZVsyXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMl0iLCA2LCBsaW5lTnVtYmVyVGFibGVbMl1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1szXSIsIDE2LCBsaW5lTnVtYmVyVGFibGVbM11bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzNdIiwgOCwgbGluZU51bWJlclRhYmxlWzNdWzFdKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlbW92ZVRlbXBDbGFzcygiQSIpOwotCQl9Ci0JfQkKLQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NzUzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzNSgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzb3VyY2VBID0KLQkJCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsKLQkJCQkiCQlpbnQgaSA9IDY7XG4iICsKLQkJCQkiCQlpZiAoKGkgPT0gNikgXG4iICsKLQkJCQkiCQkgICAmIGZhbHNlKSB7ICAgCVxuIiArCi0JCQkJIgkJICAgCVN5c3RlbS5vdXQucHJpbnRsbihpKTtcbiIgKwotCQkJCSIJCSAgIH1cbiIgKwotCQkJCSIJfVxuIiArCi0JCQkJIn0iOwotCQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBLCAiQSIpOwotCQkJSUNsYXNzRmlsZVJlYWRlciBjbGFzc0ZpbGVSZWFkZXIgPSBUb29sRmFjdG9yeS5jcmVhdGVEZWZhdWx0Q2xhc3NGaWxlUmVhZGVyKEVWQUxfRElSRUNUT1JZICsgRmlsZS5zZXBhcmF0b3IgKyAiQS5jbGFzcyIsIElDbGFzc0ZpbGVSZWFkZXIuQUxMKTsKLQkJCUlNZXRob2RJbmZvW10gbWV0aG9kSW5mb3MgPSBjbGFzc0ZpbGVSZWFkZXIuZ2V0TWV0aG9kSW5mb3MoKTsKLQkJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDIsIG1ldGhvZEluZm9zLmxlbmd0aCk7Ci0JCQlJTWV0aG9kSW5mbyBtZXRob2RJbmZvID0gbWV0aG9kSW5mb3NbMV07Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAibWFpbiIsIG5ldyBTdHJpbmcobWV0aG9kSW5mby5nZXROYW1lKCkpKTsKLQkJCUlDb2RlQXR0cmlidXRlIGNvZGVBdHRyaWJ1dGUgPSBtZXRob2RJbmZvLmdldENvZGVBdHRyaWJ1dGUoKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGNvZGUgYXR0cmlidXRlIiwgY29kZUF0dHJpYnV0ZSk7Ci0JCQlJTGluZU51bWJlckF0dHJpYnV0ZSBsaW5lTnVtYmVyQXR0cmlidXRlID0gY29kZUF0dHJpYnV0ZS5nZXRMaW5lTnVtYmVyQXR0cmlidXRlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJObyBjb2RlIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZSIsIGxpbmVOdW1iZXJBdHRyaWJ1dGUpOwotCQkJaW50W11bXSBsaW5lTnVtYmVyVGFibGUgPSBsaW5lTnVtYmVyQXR0cmlidXRlLmdldExpbmVOdW1iZXJUYWJsZSgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMiwgbGluZU51bWJlclRhYmxlLmxlbmd0aCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzBdIiwgMCwgbGluZU51bWJlclRhYmxlWzBdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVswXSIsIDMsIGxpbmVOdW1iZXJUYWJsZVswXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzFdIiwgMywgbGluZU51bWJlclRhYmxlWzFdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVsxXSIsIDgsIGxpbmVOdW1iZXJUYWJsZVsxXVsxXSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZW1vdmVUZW1wQ2xhc3MoIkEiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NzUzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzNigpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzb3VyY2VBID0KLQkJCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsKLQkJCQkiCQlib29sZWFuIGIgPSBmYWxzZTtcbiIgKwotCQkJCSIJCWlmICh0cnVlXG4iICsKLQkJCQkiCQkgICAmICFiKSB7ICAgCVxuIiArCi0JCQkJIgkJICAgCVN5c3RlbS5vdXQucHJpbnRsbigpO1xuIiArCi0JCQkJIgkJICAgfVxuIiArCi0JCQkJIgl9XG4iICsKLQkJCQkifSI7Ci0JCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEsICJBIik7Ci0JCQlJQ2xhc3NGaWxlUmVhZGVyIGNsYXNzRmlsZVJlYWRlciA9IFRvb2xGYWN0b3J5LmNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVSZWFkZXIoRVZBTF9ESVJFQ1RPUlkgKyBGaWxlLnNlcGFyYXRvciArICJBLmNsYXNzIiwgSUNsYXNzRmlsZVJlYWRlci5BTEwpOwotCQkJSU1ldGhvZEluZm9bXSBtZXRob2RJbmZvcyA9IGNsYXNzRmlsZVJlYWRlci5nZXRNZXRob2RJbmZvcygpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMiwgbWV0aG9kSW5mb3MubGVuZ3RoKTsKLQkJCUlNZXRob2RJbmZvIG1ldGhvZEluZm8gPSBtZXRob2RJbmZvc1sxXTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJtYWluIiwgbmV3IFN0cmluZyhtZXRob2RJbmZvLmdldE5hbWUoKSkpOwotCQkJSUNvZGVBdHRyaWJ1dGUgY29kZUF0dHJpYnV0ZSA9IG1ldGhvZEluZm8uZ2V0Q29kZUF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBhdHRyaWJ1dGUiLCBjb2RlQXR0cmlidXRlKTsKLQkJCUlMaW5lTnVtYmVyQXR0cmlidXRlIGxpbmVOdW1iZXJBdHRyaWJ1dGUgPSBjb2RlQXR0cmlidXRlLmdldExpbmVOdW1iZXJBdHRyaWJ1dGUoKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGNvZGUgbGluZSBudW1iZXIgYXR0cmlidXRlIiwgbGluZU51bWJlckF0dHJpYnV0ZSk7Ci0JCQlpbnRbXVtdIGxpbmVOdW1iZXJUYWJsZSA9IGxpbmVOdW1iZXJBdHRyaWJ1dGUuZ2V0TGluZU51bWJlclRhYmxlKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCA0LCBsaW5lTnVtYmVyVGFibGUubGVuZ3RoKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMF0iLCAwLCBsaW5lTnVtYmVyVGFibGVbMF1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzBdIiwgMywgbGluZU51bWJlclRhYmxlWzBdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMV0iLCAyLCBsaW5lTnVtYmVyVGFibGVbMV1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzFdIiwgNSwgbGluZU51bWJlclRhYmxlWzFdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMl0iLCA2LCBsaW5lTnVtYmVyVGFibGVbMl1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzJdIiwgNiwgbGluZU51bWJlclRhYmxlWzJdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbM10iLCAxMiwgbGluZU51bWJlclRhYmxlWzNdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVszXSIsIDgsIGxpbmVOdW1iZXJUYWJsZVszXVsxXSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZW1vdmVUZW1wQ2xhc3MoIkEiKTsKLQkJfQotCX0JCi0KLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjc1MwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzcoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc291cmNlQSA9Ci0JCQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArCi0JCQkJIgkJYm9vbGVhbiBiID0gZmFsc2U7XG4iICsKLQkJCQkiCQlpZiAoZmFsc2VcbiIgKwotCQkJCSIJCSAgICYgIWIpIHsgICAJXG4iICsKLQkJCQkiCQkgICAJU3lzdGVtLm91dC5wcmludGxuKCk7XG4iICsKLQkJCQkiCQkgICB9XG4iICsKLQkJCQkiCX1cbiIgKwotCQkJCSJ9IjsKLQkJCWNvbXBpbGVBbmREZXBsb3koc291cmNlQSwgIkEiKTsKLQkJCUlDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyID0gVG9vbEZhY3RvcnkuY3JlYXRlRGVmYXVsdENsYXNzRmlsZVJlYWRlcihFVkFMX0RJUkVDVE9SWSArIEZpbGUuc2VwYXJhdG9yICsgIkEuY2xhc3MiLCBJQ2xhc3NGaWxlUmVhZGVyLkFMTCk7Ci0JCQlJTWV0aG9kSW5mb1tdIG1ldGhvZEluZm9zID0gY2xhc3NGaWxlUmVhZGVyLmdldE1ldGhvZEluZm9zKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAyLCBtZXRob2RJbmZvcy5sZW5ndGgpOwotCQkJSU1ldGhvZEluZm8gbWV0aG9kSW5mbyA9IG1ldGhvZEluZm9zWzFdOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgIm1haW4iLCBuZXcgU3RyaW5nKG1ldGhvZEluZm8uZ2V0TmFtZSgpKSk7Ci0JCQlJQ29kZUF0dHJpYnV0ZSBjb2RlQXR0cmlidXRlID0gbWV0aG9kSW5mby5nZXRDb2RlQXR0cmlidXRlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJObyBjb2RlIGF0dHJpYnV0ZSIsIGNvZGVBdHRyaWJ1dGUpOwotCQkJSUxpbmVOdW1iZXJBdHRyaWJ1dGUgbGluZU51bWJlckF0dHJpYnV0ZSA9IGNvZGVBdHRyaWJ1dGUuZ2V0TGluZU51bWJlckF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUiLCBsaW5lTnVtYmVyQXR0cmlidXRlKTsKLQkJCWludFtdW10gbGluZU51bWJlclRhYmxlID0gbGluZU51bWJlckF0dHJpYnV0ZS5nZXRMaW5lTnVtYmVyVGFibGUoKTsKLQkJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDIsIGxpbmVOdW1iZXJUYWJsZS5sZW5ndGgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1swXSIsIDAsIGxpbmVOdW1iZXJUYWJsZVswXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMF0iLCAzLCBsaW5lTnVtYmVyVGFibGVbMF1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1sxXSIsIDIsIGxpbmVOdW1iZXJUYWJsZVsxXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMV0iLCA4LCBsaW5lTnVtYmVyVGFibGVbMV1bMV0pOwotCQl9IGZpbmFsbHkgewotCQkJcmVtb3ZlVGVtcENsYXNzKCJBIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjc1MwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzgoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc291cmNlQSA9Ci0JCQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArCi0JCQkJIgkJYm9vbGVhbiBiID0gZmFsc2U7XG4iICsKLQkJCQkiCQlpbnQgaSA9IDY7XG4iICsKLQkJCQkiCQlpZiAoKGkgPT0gNikgXG4iICsKLQkJCQkiCQkgICB8ICFiKSB7ICAgCVxuIiArCi0JCQkJIgkJICAgCVN5c3RlbS5vdXQucHJpbnRsbihpKTtcbiIgKwotCQkJCSIJCSAgIH1cbiIgKwotCQkJCSIJfVxuIiArCi0JCQkJIn0iOwotCQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBLCAiQSIpOwotCQkJSUNsYXNzRmlsZVJlYWRlciBjbGFzc0ZpbGVSZWFkZXIgPSBUb29sRmFjdG9yeS5jcmVhdGVEZWZhdWx0Q2xhc3NGaWxlUmVhZGVyKEVWQUxfRElSRUNUT1JZICsgRmlsZS5zZXBhcmF0b3IgKyAiQS5jbGFzcyIsIElDbGFzc0ZpbGVSZWFkZXIuQUxMKTsKLQkJCUlNZXRob2RJbmZvW10gbWV0aG9kSW5mb3MgPSBjbGFzc0ZpbGVSZWFkZXIuZ2V0TWV0aG9kSW5mb3MoKTsKLQkJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDIsIG1ldGhvZEluZm9zLmxlbmd0aCk7Ci0JCQlJTWV0aG9kSW5mbyBtZXRob2RJbmZvID0gbWV0aG9kSW5mb3NbMV07Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAibWFpbiIsIG5ldyBTdHJpbmcobWV0aG9kSW5mby5nZXROYW1lKCkpKTsKLQkJCUlDb2RlQXR0cmlidXRlIGNvZGVBdHRyaWJ1dGUgPSBtZXRob2RJbmZvLmdldENvZGVBdHRyaWJ1dGUoKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGNvZGUgYXR0cmlidXRlIiwgY29kZUF0dHJpYnV0ZSk7Ci0JCQlJTGluZU51bWJlckF0dHJpYnV0ZSBsaW5lTnVtYmVyQXR0cmlidXRlID0gY29kZUF0dHJpYnV0ZS5nZXRMaW5lTnVtYmVyQXR0cmlidXRlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJObyBjb2RlIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZSIsIGxpbmVOdW1iZXJBdHRyaWJ1dGUpOwotCQkJaW50W11bXSBsaW5lTnVtYmVyVGFibGUgPSBsaW5lTnVtYmVyQXR0cmlidXRlLmdldExpbmVOdW1iZXJUYWJsZSgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgNiwgbGluZU51bWJlclRhYmxlLmxlbmd0aCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzBdIiwgMCwgbGluZU51bWJlclRhYmxlWzBdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVswXSIsIDMsIGxpbmVOdW1iZXJUYWJsZVswXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzFdIiwgMiwgbGluZU51bWJlclRhYmxlWzFdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVsxXSIsIDQsIGxpbmVOdW1iZXJUYWJsZVsxXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzJdIiwgNSwgbGluZU51bWJlclRhYmxlWzJdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVsyXSIsIDUsIGxpbmVOdW1iZXJUYWJsZVsyXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzNdIiwgMTYsIGxpbmVOdW1iZXJUYWJsZVszXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbM10iLCA2LCBsaW5lTnVtYmVyVGFibGVbM11bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1s0XSIsIDI5LCBsaW5lTnVtYmVyVGFibGVbNF1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzRdIiwgNywgbGluZU51bWJlclRhYmxlWzRdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbNV0iLCAzNiwgbGluZU51bWJlclRhYmxlWzVdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVs1XSIsIDksIGxpbmVOdW1iZXJUYWJsZVs1XVsxXSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZW1vdmVUZW1wQ2xhc3MoIkEiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NzUzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzOSgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzb3VyY2VBID0KLQkJCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsKLQkJCQkiCQlpbnQgaSA9IDY7XG4iICsKLQkJCQkiCQlpZiAoKGkgPT0gNikgXG4iICsKLQkJCQkiCQkgICB8IHRydWUpIHsgICAJXG4iICsKLQkJCQkiCQkgICAJU3lzdGVtLm91dC5wcmludGxuKGkpO1xuIiArCi0JCQkJIgkJICAgfVxuIiArCi0JCQkJIgl9XG4iICsKLQkJCQkifSI7Ci0JCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEsICJBIik7Ci0JCQlJQ2xhc3NGaWxlUmVhZGVyIGNsYXNzRmlsZVJlYWRlciA9IFRvb2xGYWN0b3J5LmNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVSZWFkZXIoRVZBTF9ESVJFQ1RPUlkgKyBGaWxlLnNlcGFyYXRvciArICJBLmNsYXNzIiwgSUNsYXNzRmlsZVJlYWRlci5BTEwpOwotCQkJSU1ldGhvZEluZm9bXSBtZXRob2RJbmZvcyA9IGNsYXNzRmlsZVJlYWRlci5nZXRNZXRob2RJbmZvcygpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMiwgbWV0aG9kSW5mb3MubGVuZ3RoKTsKLQkJCUlNZXRob2RJbmZvIG1ldGhvZEluZm8gPSBtZXRob2RJbmZvc1sxXTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJtYWluIiwgbmV3IFN0cmluZyhtZXRob2RJbmZvLmdldE5hbWUoKSkpOwotCQkJSUNvZGVBdHRyaWJ1dGUgY29kZUF0dHJpYnV0ZSA9IG1ldGhvZEluZm8uZ2V0Q29kZUF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBhdHRyaWJ1dGUiLCBjb2RlQXR0cmlidXRlKTsKLQkJCUlMaW5lTnVtYmVyQXR0cmlidXRlIGxpbmVOdW1iZXJBdHRyaWJ1dGUgPSBjb2RlQXR0cmlidXRlLmdldExpbmVOdW1iZXJBdHRyaWJ1dGUoKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGNvZGUgbGluZSBudW1iZXIgYXR0cmlidXRlIiwgbGluZU51bWJlckF0dHJpYnV0ZSk7Ci0JCQlpbnRbXVtdIGxpbmVOdW1iZXJUYWJsZSA9IGxpbmVOdW1iZXJBdHRyaWJ1dGUuZ2V0TGluZU51bWJlclRhYmxlKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAzLCBsaW5lTnVtYmVyVGFibGUubGVuZ3RoKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMF0iLCAwLCBsaW5lTnVtYmVyVGFibGVbMF1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzBdIiwgMywgbGluZU51bWJlclRhYmxlWzBdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMV0iLCAzLCBsaW5lTnVtYmVyVGFibGVbMV1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzFdIiwgNiwgbGluZU51bWJlclRhYmxlWzFdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMl0iLCAxMCwgbGluZU51bWJlclRhYmxlWzJdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVsyXSIsIDgsIGxpbmVOdW1iZXJUYWJsZVsyXVsxXSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZW1vdmVUZW1wQ2xhc3MoIkEiKTsKLQkJfQotCX0JCi0KLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjc1MwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwNDAoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc291cmNlQSA9Ci0JCQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArCi0JCQkJIgkJaW50IGkgPSA2O1xuIiArCi0JCQkJIgkJaWYgKChpID09IDYpIFxuIiArCi0JCQkJIgkJICAgfCBmYWxzZSkgeyAgIAlcbiIgKwotCQkJCSIJCSAgIAlTeXN0ZW0ub3V0LnByaW50bG4oaSk7XG4iICsKLQkJCQkiCQkgICB9XG4iICsKLQkJCQkiCX1cbiIgKwotCQkJCSJ9IjsKLQkJCWNvbXBpbGVBbmREZXBsb3koc291cmNlQSwgIkEiKTsKLQkJCUlDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyID0gVG9vbEZhY3RvcnkuY3JlYXRlRGVmYXVsdENsYXNzRmlsZVJlYWRlcihFVkFMX0RJUkVDVE9SWSArIEZpbGUuc2VwYXJhdG9yICsgIkEuY2xhc3MiLCBJQ2xhc3NGaWxlUmVhZGVyLkFMTCk7Ci0JCQlJTWV0aG9kSW5mb1tdIG1ldGhvZEluZm9zID0gY2xhc3NGaWxlUmVhZGVyLmdldE1ldGhvZEluZm9zKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAyLCBtZXRob2RJbmZvcy5sZW5ndGgpOwotCQkJSU1ldGhvZEluZm8gbWV0aG9kSW5mbyA9IG1ldGhvZEluZm9zWzFdOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgIm1haW4iLCBuZXcgU3RyaW5nKG1ldGhvZEluZm8uZ2V0TmFtZSgpKSk7Ci0JCQlJQ29kZUF0dHJpYnV0ZSBjb2RlQXR0cmlidXRlID0gbWV0aG9kSW5mby5nZXRDb2RlQXR0cmlidXRlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJObyBjb2RlIGF0dHJpYnV0ZSIsIGNvZGVBdHRyaWJ1dGUpOwotCQkJSUxpbmVOdW1iZXJBdHRyaWJ1dGUgbGluZU51bWJlckF0dHJpYnV0ZSA9IGNvZGVBdHRyaWJ1dGUuZ2V0TGluZU51bWJlckF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUiLCBsaW5lTnVtYmVyQXR0cmlidXRlKTsKLQkJCWludFtdW10gbGluZU51bWJlclRhYmxlID0gbGluZU51bWJlckF0dHJpYnV0ZS5nZXRMaW5lTnVtYmVyVGFibGUoKTsKLQkJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDQsIGxpbmVOdW1iZXJUYWJsZS5sZW5ndGgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1swXSIsIDAsIGxpbmVOdW1iZXJUYWJsZVswXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMF0iLCAzLCBsaW5lTnVtYmVyVGFibGVbMF1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1sxXSIsIDMsIGxpbmVOdW1iZXJUYWJsZVsxXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMV0iLCA0LCBsaW5lTnVtYmVyVGFibGVbMV1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1syXSIsIDksIGxpbmVOdW1iZXJUYWJsZVsyXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMl0iLCA2LCBsaW5lTnVtYmVyVGFibGVbMl1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1szXSIsIDE2LCBsaW5lTnVtYmVyVGFibGVbM11bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzNdIiwgOCwgbGluZU51bWJlclRhYmxlWzNdWzFdKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlbW92ZVRlbXBDbGFzcygiQSIpOwotCQl9Ci0JfQkKLQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NzUzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDA0MSgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzb3VyY2VBID0KLQkJCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsKLQkJCQkiCQlib29sZWFuIGIgPSBmYWxzZTtcbiIgKwotCQkJCSIJCWlmICh0cnVlXG4iICsKLQkJCQkiCQkgICB8ICFiKSB7ICAgCVxuIiArCi0JCQkJIgkJICAgCVN5c3RlbS5vdXQucHJpbnRsbigpO1xuIiArCi0JCQkJIgkJICAgfVxuIiArCi0JCQkJIgl9XG4iICsKLQkJCQkifSI7Ci0JCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEsICJBIik7Ci0JCQlJQ2xhc3NGaWxlUmVhZGVyIGNsYXNzRmlsZVJlYWRlciA9IFRvb2xGYWN0b3J5LmNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVSZWFkZXIoRVZBTF9ESVJFQ1RPUlkgKyBGaWxlLnNlcGFyYXRvciArICJBLmNsYXNzIiwgSUNsYXNzRmlsZVJlYWRlci5BTEwpOwotCQkJSU1ldGhvZEluZm9bXSBtZXRob2RJbmZvcyA9IGNsYXNzRmlsZVJlYWRlci5nZXRNZXRob2RJbmZvcygpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMiwgbWV0aG9kSW5mb3MubGVuZ3RoKTsKLQkJCUlNZXRob2RJbmZvIG1ldGhvZEluZm8gPSBtZXRob2RJbmZvc1sxXTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJtYWluIiwgbmV3IFN0cmluZyhtZXRob2RJbmZvLmdldE5hbWUoKSkpOwotCQkJSUNvZGVBdHRyaWJ1dGUgY29kZUF0dHJpYnV0ZSA9IG1ldGhvZEluZm8uZ2V0Q29kZUF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBhdHRyaWJ1dGUiLCBjb2RlQXR0cmlidXRlKTsKLQkJCUlMaW5lTnVtYmVyQXR0cmlidXRlIGxpbmVOdW1iZXJBdHRyaWJ1dGUgPSBjb2RlQXR0cmlidXRlLmdldExpbmVOdW1iZXJBdHRyaWJ1dGUoKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGNvZGUgbGluZSBudW1iZXIgYXR0cmlidXRlIiwgbGluZU51bWJlckF0dHJpYnV0ZSk7Ci0JCQlpbnRbXVtdIGxpbmVOdW1iZXJUYWJsZSA9IGxpbmVOdW1iZXJBdHRyaWJ1dGUuZ2V0TGluZU51bWJlclRhYmxlKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAzLCBsaW5lTnVtYmVyVGFibGUubGVuZ3RoKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMF0iLCAwLCBsaW5lTnVtYmVyVGFibGVbMF1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzBdIiwgMywgbGluZU51bWJlclRhYmxlWzBdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMV0iLCAyLCBsaW5lTnVtYmVyVGFibGVbMV1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzFdIiwgNiwgbGluZU51bWJlclRhYmxlWzFdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMl0iLCA4LCBsaW5lTnVtYmVyVGFibGVbMl1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzJdIiwgOCwgbGluZU51bWJlclRhYmxlWzJdWzFdKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlbW92ZVRlbXBDbGFzcygiQSIpOwotCQl9Ci0JfQkKLQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NzUzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDA0MigpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzb3VyY2VBID0KLQkJCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsKLQkJCQkiCQlib29sZWFuIGIgPSBmYWxzZTtcbiIgKwotCQkJCSIJCWlmIChmYWxzZVxuIiArCi0JCQkJIgkJICAgfCAhYikgeyAgIAlcbiIgKwotCQkJCSIJCSAgIAlTeXN0ZW0ub3V0LnByaW50bG4oKTtcbiIgKwotCQkJCSIJCSAgIH1cbiIgKwotCQkJCSIJfVxuIiArCi0JCQkJIn0iOwotCQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBLCAiQSIpOwotCQkJSUNsYXNzRmlsZVJlYWRlciBjbGFzc0ZpbGVSZWFkZXIgPSBUb29sRmFjdG9yeS5jcmVhdGVEZWZhdWx0Q2xhc3NGaWxlUmVhZGVyKEVWQUxfRElSRUNUT1JZICsgRmlsZS5zZXBhcmF0b3IgKyAiQS5jbGFzcyIsIElDbGFzc0ZpbGVSZWFkZXIuQUxMKTsKLQkJCUlNZXRob2RJbmZvW10gbWV0aG9kSW5mb3MgPSBjbGFzc0ZpbGVSZWFkZXIuZ2V0TWV0aG9kSW5mb3MoKTsKLQkJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDIsIG1ldGhvZEluZm9zLmxlbmd0aCk7Ci0JCQlJTWV0aG9kSW5mbyBtZXRob2RJbmZvID0gbWV0aG9kSW5mb3NbMV07Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAibWFpbiIsIG5ldyBTdHJpbmcobWV0aG9kSW5mby5nZXROYW1lKCkpKTsKLQkJCUlDb2RlQXR0cmlidXRlIGNvZGVBdHRyaWJ1dGUgPSBtZXRob2RJbmZvLmdldENvZGVBdHRyaWJ1dGUoKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGNvZGUgYXR0cmlidXRlIiwgY29kZUF0dHJpYnV0ZSk7Ci0JCQlJTGluZU51bWJlckF0dHJpYnV0ZSBsaW5lTnVtYmVyQXR0cmlidXRlID0gY29kZUF0dHJpYnV0ZS5nZXRMaW5lTnVtYmVyQXR0cmlidXRlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJObyBjb2RlIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZSIsIGxpbmVOdW1iZXJBdHRyaWJ1dGUpOwotCQkJaW50W11bXSBsaW5lTnVtYmVyVGFibGUgPSBsaW5lTnVtYmVyQXR0cmlidXRlLmdldExpbmVOdW1iZXJUYWJsZSgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgNCwgbGluZU51bWJlclRhYmxlLmxlbmd0aCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzBdIiwgMCwgbGluZU51bWJlclRhYmxlWzBdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVswXSIsIDMsIGxpbmVOdW1iZXJUYWJsZVswXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzFdIiwgMiwgbGluZU51bWJlclRhYmxlWzFdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVsxXSIsIDUsIGxpbmVOdW1iZXJUYWJsZVsxXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzJdIiwgNiwgbGluZU51bWJlclRhYmxlWzJdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVsyXSIsIDYsIGxpbmVOdW1iZXJUYWJsZVsyXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzNdIiwgMTIsIGxpbmVOdW1iZXJUYWJsZVszXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbM10iLCA4LCBsaW5lTnVtYmVyVGFibGVbM11bMV0pOwotCQl9IGZpbmFsbHkgewotCQkJcmVtb3ZlVGVtcENsYXNzKCJBIik7Ci0JCX0KLQl9CQotCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY3NTMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQzKCkgewotCQl0cnkgewotCQkJU3RyaW5nIHNvdXJjZUEgPQotCQkJCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKwotCQkJCSIJCWJvb2xlYW4gYiA9IGZhbHNlO1xuIiArCi0JCQkJIgkJaW50IGkgPSA2O1xuIiArCi0JCQkJIgkJaWYgKChpID09IDYpIFxuIiArCi0JCQkJIgkJICAgXiAhYikgeyAgIAlcbiIgKwotCQkJCSIJCSAgIAlTeXN0ZW0ub3V0LnByaW50bG4oaSk7XG4iICsKLQkJCQkiCQkgICB9XG4iICsKLQkJCQkiCX1cbiIgKwotCQkJCSJ9IjsKLQkJCWNvbXBpbGVBbmREZXBsb3koc291cmNlQSwgIkEiKTsKLQkJCUlDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyID0gVG9vbEZhY3RvcnkuY3JlYXRlRGVmYXVsdENsYXNzRmlsZVJlYWRlcihFVkFMX0RJUkVDVE9SWSArIEZpbGUuc2VwYXJhdG9yICsgIkEuY2xhc3MiLCBJQ2xhc3NGaWxlUmVhZGVyLkFMTCk7Ci0JCQlJTWV0aG9kSW5mb1tdIG1ldGhvZEluZm9zID0gY2xhc3NGaWxlUmVhZGVyLmdldE1ldGhvZEluZm9zKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAyLCBtZXRob2RJbmZvcy5sZW5ndGgpOwotCQkJSU1ldGhvZEluZm8gbWV0aG9kSW5mbyA9IG1ldGhvZEluZm9zWzFdOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgIm1haW4iLCBuZXcgU3RyaW5nKG1ldGhvZEluZm8uZ2V0TmFtZSgpKSk7Ci0JCQlJQ29kZUF0dHJpYnV0ZSBjb2RlQXR0cmlidXRlID0gbWV0aG9kSW5mby5nZXRDb2RlQXR0cmlidXRlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJObyBjb2RlIGF0dHJpYnV0ZSIsIGNvZGVBdHRyaWJ1dGUpOwotCQkJSUxpbmVOdW1iZXJBdHRyaWJ1dGUgbGluZU51bWJlckF0dHJpYnV0ZSA9IGNvZGVBdHRyaWJ1dGUuZ2V0TGluZU51bWJlckF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUiLCBsaW5lTnVtYmVyQXR0cmlidXRlKTsKLQkJCWludFtdW10gbGluZU51bWJlclRhYmxlID0gbGluZU51bWJlckF0dHJpYnV0ZS5nZXRMaW5lTnVtYmVyVGFibGUoKTsKLQkJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDYsIGxpbmVOdW1iZXJUYWJsZS5sZW5ndGgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1swXSIsIDAsIGxpbmVOdW1iZXJUYWJsZVswXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMF0iLCAzLCBsaW5lTnVtYmVyVGFibGVbMF1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1sxXSIsIDIsIGxpbmVOdW1iZXJUYWJsZVsxXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMV0iLCA0LCBsaW5lTnVtYmVyVGFibGVbMV1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1syXSIsIDUsIGxpbmVOdW1iZXJUYWJsZVsyXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMl0iLCA1LCBsaW5lTnVtYmVyVGFibGVbMl1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1szXSIsIDE2LCBsaW5lTnVtYmVyVGFibGVbM11bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzNdIiwgNiwgbGluZU51bWJlclRhYmxlWzNdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbNF0iLCAyOSwgbGluZU51bWJlclRhYmxlWzRdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVs0XSIsIDcsIGxpbmVOdW1iZXJUYWJsZVs0XVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzVdIiwgMzYsIGxpbmVOdW1iZXJUYWJsZVs1XVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbNV0iLCA5LCBsaW5lTnVtYmVyVGFibGVbNV1bMV0pOwotCQl9IGZpbmFsbHkgewotCQkJcmVtb3ZlVGVtcENsYXNzKCJBIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjc1MwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwNDQoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc291cmNlQSA9Ci0JCQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArCi0JCQkJIgkJaW50IGkgPSA2O1xuIiArCi0JCQkJIgkJaWYgKChpID09IDYpIFxuIiArCi0JCQkJIgkJICAgXiB0cnVlKSB7ICAgCVxuIiArCi0JCQkJIgkJICAgCVN5c3RlbS5vdXQucHJpbnRsbihpKTtcbiIgKwotCQkJCSIJCSAgIH1cbiIgKwotCQkJCSIJfVxuIiArCi0JCQkJIn0iOwotCQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBLCAiQSIpOwotCQkJSUNsYXNzRmlsZVJlYWRlciBjbGFzc0ZpbGVSZWFkZXIgPSBUb29sRmFjdG9yeS5jcmVhdGVEZWZhdWx0Q2xhc3NGaWxlUmVhZGVyKEVWQUxfRElSRUNUT1JZICsgRmlsZS5zZXBhcmF0b3IgKyAiQS5jbGFzcyIsIElDbGFzc0ZpbGVSZWFkZXIuQUxMKTsKLQkJCUlNZXRob2RJbmZvW10gbWV0aG9kSW5mb3MgPSBjbGFzc0ZpbGVSZWFkZXIuZ2V0TWV0aG9kSW5mb3MoKTsKLQkJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDIsIG1ldGhvZEluZm9zLmxlbmd0aCk7Ci0JCQlJTWV0aG9kSW5mbyBtZXRob2RJbmZvID0gbWV0aG9kSW5mb3NbMV07Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAibWFpbiIsIG5ldyBTdHJpbmcobWV0aG9kSW5mby5nZXROYW1lKCkpKTsKLQkJCUlDb2RlQXR0cmlidXRlIGNvZGVBdHRyaWJ1dGUgPSBtZXRob2RJbmZvLmdldENvZGVBdHRyaWJ1dGUoKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGNvZGUgYXR0cmlidXRlIiwgY29kZUF0dHJpYnV0ZSk7Ci0JCQlJTGluZU51bWJlckF0dHJpYnV0ZSBsaW5lTnVtYmVyQXR0cmlidXRlID0gY29kZUF0dHJpYnV0ZS5nZXRMaW5lTnVtYmVyQXR0cmlidXRlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJObyBjb2RlIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZSIsIGxpbmVOdW1iZXJBdHRyaWJ1dGUpOwotCQkJaW50W11bXSBsaW5lTnVtYmVyVGFibGUgPSBsaW5lTnVtYmVyQXR0cmlidXRlLmdldExpbmVOdW1iZXJUYWJsZSgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgNCwgbGluZU51bWJlclRhYmxlLmxlbmd0aCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzBdIiwgMCwgbGluZU51bWJlclRhYmxlWzBdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVswXSIsIDMsIGxpbmVOdW1iZXJUYWJsZVswXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzFdIiwgMywgbGluZU51bWJlclRhYmxlWzFdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVsxXSIsIDQsIGxpbmVOdW1iZXJUYWJsZVsxXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzJdIiwgOSwgbGluZU51bWJlclRhYmxlWzJdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVsyXSIsIDYsIGxpbmVOdW1iZXJUYWJsZVsyXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzNdIiwgMTYsIGxpbmVOdW1iZXJUYWJsZVszXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbM10iLCA4LCBsaW5lTnVtYmVyVGFibGVbM11bMV0pOwotCQl9IGZpbmFsbHkgewotCQkJcmVtb3ZlVGVtcENsYXNzKCJBIik7Ci0JCX0KLQl9CQotCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY3NTMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQ1KCkgewotCQl0cnkgewotCQkJU3RyaW5nIHNvdXJjZUEgPQotCQkJCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKwotCQkJCSIJCWludCBpID0gNjtcbiIgKwotCQkJCSIJCWlmICgoaSA9PSA2KSBcbiIgKwotCQkJCSIJCSAgIF4gZmFsc2UpIHsgICAJXG4iICsKLQkJCQkiCQkgICAJU3lzdGVtLm91dC5wcmludGxuKGkpO1xuIiArCi0JCQkJIgkJICAgfVxuIiArCi0JCQkJIgl9XG4iICsKLQkJCQkifSI7Ci0JCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEsICJBIik7Ci0JCQlJQ2xhc3NGaWxlUmVhZGVyIGNsYXNzRmlsZVJlYWRlciA9IFRvb2xGYWN0b3J5LmNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVSZWFkZXIoRVZBTF9ESVJFQ1RPUlkgKyBGaWxlLnNlcGFyYXRvciArICJBLmNsYXNzIiwgSUNsYXNzRmlsZVJlYWRlci5BTEwpOwotCQkJSU1ldGhvZEluZm9bXSBtZXRob2RJbmZvcyA9IGNsYXNzRmlsZVJlYWRlci5nZXRNZXRob2RJbmZvcygpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMiwgbWV0aG9kSW5mb3MubGVuZ3RoKTsKLQkJCUlNZXRob2RJbmZvIG1ldGhvZEluZm8gPSBtZXRob2RJbmZvc1sxXTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJtYWluIiwgbmV3IFN0cmluZyhtZXRob2RJbmZvLmdldE5hbWUoKSkpOwotCQkJSUNvZGVBdHRyaWJ1dGUgY29kZUF0dHJpYnV0ZSA9IG1ldGhvZEluZm8uZ2V0Q29kZUF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBhdHRyaWJ1dGUiLCBjb2RlQXR0cmlidXRlKTsKLQkJCUlMaW5lTnVtYmVyQXR0cmlidXRlIGxpbmVOdW1iZXJBdHRyaWJ1dGUgPSBjb2RlQXR0cmlidXRlLmdldExpbmVOdW1iZXJBdHRyaWJ1dGUoKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGNvZGUgbGluZSBudW1iZXIgYXR0cmlidXRlIiwgbGluZU51bWJlckF0dHJpYnV0ZSk7Ci0JCQlpbnRbXVtdIGxpbmVOdW1iZXJUYWJsZSA9IGxpbmVOdW1iZXJBdHRyaWJ1dGUuZ2V0TGluZU51bWJlclRhYmxlKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCA0LCBsaW5lTnVtYmVyVGFibGUubGVuZ3RoKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMF0iLCAwLCBsaW5lTnVtYmVyVGFibGVbMF1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzBdIiwgMywgbGluZU51bWJlclRhYmxlWzBdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMV0iLCAzLCBsaW5lTnVtYmVyVGFibGVbMV1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzFdIiwgNCwgbGluZU51bWJlclRhYmxlWzFdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbMl0iLCA5LCBsaW5lTnVtYmVyVGFibGVbMl1bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzJdIiwgNiwgbGluZU51bWJlclRhYmxlWzJdWzFdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgcGNbM10iLCAxNiwgbGluZU51bWJlclRhYmxlWzNdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVszXSIsIDgsIGxpbmVOdW1iZXJUYWJsZVszXVsxXSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZW1vdmVUZW1wQ2xhc3MoIkEiKTsKLQkJfQotCX0JCi0KLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjc1MwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwNDYoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc291cmNlQSA9Ci0JCQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArCi0JCQkJIgkJYm9vbGVhbiBiID0gZmFsc2U7XG4iICsKLQkJCQkiCQlpZiAodHJ1ZVxuIiArCi0JCQkJIgkJICAgXiAhYikgeyAgIAlcbiIgKwotCQkJCSIJCSAgIAlTeXN0ZW0ub3V0LnByaW50bG4oKTtcbiIgKwotCQkJCSIJCSAgIH1cbiIgKwotCQkJCSIJfVxuIiArCi0JCQkJIn0iOwotCQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBLCAiQSIpOwotCQkJSUNsYXNzRmlsZVJlYWRlciBjbGFzc0ZpbGVSZWFkZXIgPSBUb29sRmFjdG9yeS5jcmVhdGVEZWZhdWx0Q2xhc3NGaWxlUmVhZGVyKEVWQUxfRElSRUNUT1JZICsgRmlsZS5zZXBhcmF0b3IgKyAiQS5jbGFzcyIsIElDbGFzc0ZpbGVSZWFkZXIuQUxMKTsKLQkJCUlNZXRob2RJbmZvW10gbWV0aG9kSW5mb3MgPSBjbGFzc0ZpbGVSZWFkZXIuZ2V0TWV0aG9kSW5mb3MoKTsKLQkJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDIsIG1ldGhvZEluZm9zLmxlbmd0aCk7Ci0JCQlJTWV0aG9kSW5mbyBtZXRob2RJbmZvID0gbWV0aG9kSW5mb3NbMV07Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAibWFpbiIsIG5ldyBTdHJpbmcobWV0aG9kSW5mby5nZXROYW1lKCkpKTsKLQkJCUlDb2RlQXR0cmlidXRlIGNvZGVBdHRyaWJ1dGUgPSBtZXRob2RJbmZvLmdldENvZGVBdHRyaWJ1dGUoKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGNvZGUgYXR0cmlidXRlIiwgY29kZUF0dHJpYnV0ZSk7Ci0JCQlJTGluZU51bWJlckF0dHJpYnV0ZSBsaW5lTnVtYmVyQXR0cmlidXRlID0gY29kZUF0dHJpYnV0ZS5nZXRMaW5lTnVtYmVyQXR0cmlidXRlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJObyBjb2RlIGxpbmUgbnVtYmVyIGF0dHJpYnV0ZSIsIGxpbmVOdW1iZXJBdHRyaWJ1dGUpOwotCQkJaW50W11bXSBsaW5lTnVtYmVyVGFibGUgPSBsaW5lTnVtYmVyQXR0cmlidXRlLmdldExpbmVOdW1iZXJUYWJsZSgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgNCwgbGluZU51bWJlclRhYmxlLmxlbmd0aCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzBdIiwgMCwgbGluZU51bWJlclRhYmxlWzBdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVswXSIsIDMsIGxpbmVOdW1iZXJUYWJsZVswXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzFdIiwgMiwgbGluZU51bWJlclRhYmxlWzFdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVsxXSIsIDUsIGxpbmVOdW1iZXJUYWJsZVsxXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzJdIiwgNiwgbGluZU51bWJlclRhYmxlWzJdWzBdKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbGluZVsyXSIsIDYsIGxpbmVOdW1iZXJUYWJsZVsyXVsxXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHBjWzNdIiwgMTIsIGxpbmVOdW1iZXJUYWJsZVszXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbM10iLCA4LCBsaW5lTnVtYmVyVGFibGVbM11bMV0pOwotCQl9IGZpbmFsbHkgewotCQkJcmVtb3ZlVGVtcENsYXNzKCJBIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjc1MwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwNDcoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc291cmNlQSA9Ci0JCQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArCi0JCQkJIgkJYm9vbGVhbiBiID0gZmFsc2U7XG4iICsKLQkJCQkiCQlpZiAoZmFsc2VcbiIgKwotCQkJCSIJCSAgIF4gIWIpIHsgICAJXG4iICsKLQkJCQkiCQkgICAJU3lzdGVtLm91dC5wcmludGxuKCk7XG4iICsKLQkJCQkiCQkgICB9XG4iICsKLQkJCQkiCX1cbiIgKwotCQkJCSJ9IjsKLQkJCWNvbXBpbGVBbmREZXBsb3koc291cmNlQSwgIkEiKTsKLQkJCUlDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyID0gVG9vbEZhY3RvcnkuY3JlYXRlRGVmYXVsdENsYXNzRmlsZVJlYWRlcihFVkFMX0RJUkVDVE9SWSArIEZpbGUuc2VwYXJhdG9yICsgIkEuY2xhc3MiLCBJQ2xhc3NGaWxlUmVhZGVyLkFMTCk7Ci0JCQlJTWV0aG9kSW5mb1tdIG1ldGhvZEluZm9zID0gY2xhc3NGaWxlUmVhZGVyLmdldE1ldGhvZEluZm9zKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAyLCBtZXRob2RJbmZvcy5sZW5ndGgpOwotCQkJSU1ldGhvZEluZm8gbWV0aG9kSW5mbyA9IG1ldGhvZEluZm9zWzFdOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgIm1haW4iLCBuZXcgU3RyaW5nKG1ldGhvZEluZm8uZ2V0TmFtZSgpKSk7Ci0JCQlJQ29kZUF0dHJpYnV0ZSBjb2RlQXR0cmlidXRlID0gbWV0aG9kSW5mby5nZXRDb2RlQXR0cmlidXRlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKCJObyBjb2RlIGF0dHJpYnV0ZSIsIGNvZGVBdHRyaWJ1dGUpOwotCQkJSUxpbmVOdW1iZXJBdHRyaWJ1dGUgbGluZU51bWJlckF0dHJpYnV0ZSA9IGNvZGVBdHRyaWJ1dGUuZ2V0TGluZU51bWJlckF0dHJpYnV0ZSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29kZSBsaW5lIG51bWJlciBhdHRyaWJ1dGUiLCBsaW5lTnVtYmVyQXR0cmlidXRlKTsKLQkJCWludFtdW10gbGluZU51bWJlclRhYmxlID0gbGluZU51bWJlckF0dHJpYnV0ZS5nZXRMaW5lTnVtYmVyVGFibGUoKTsKLQkJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDQsIGxpbmVOdW1iZXJUYWJsZS5sZW5ndGgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1swXSIsIDAsIGxpbmVOdW1iZXJUYWJsZVswXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMF0iLCAzLCBsaW5lTnVtYmVyVGFibGVbMF1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1sxXSIsIDIsIGxpbmVOdW1iZXJUYWJsZVsxXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMV0iLCA1LCBsaW5lTnVtYmVyVGFibGVbMV1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1syXSIsIDYsIGxpbmVOdW1iZXJUYWJsZVsyXVswXSk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmVbMl0iLCA2LCBsaW5lTnVtYmVyVGFibGVbMl1bMV0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBwY1szXSIsIDEyLCBsaW5lTnVtYmVyVGFibGVbM11bMF0pOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsaW5lWzNdIiwgOCwgbGluZU51bWJlclRhYmxlWzNdWzFdKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlbW92ZVRlbXBDbGFzcygiQSIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdDA0OCgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzb3VyY2VBID0KLQkJCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCQkJIlxuIiArCi0JCQkJIglzdGF0aWMgaW50IGZvbyhib29sZWFuIGJvb2wpIHtcbiIgKwotCQkJCSIJICBpbnQgajtcbiIgKwotCQkJCSIJICB0cnkge1xuIiArCi0JCQkJIgkgICAgaWYgKGJvb2wpIHJldHVybiAxO1xuIiArCi0JCQkJIgkgICAgaiA9IDI7XG4iICsKLQkJCQkiCSAgfSBmaW5hbGx5IHtcbiIgKwotCQkJCSIJICAgIGogPSAzO1xuIiArCi0JCQkJIgkgIH1cbiIgKwotCQkJCSIJICByZXR1cm4gajtcbiIgKwotCQkJCSIJfVxuIiArCi0JCQkJIlxuIiArCi0JCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsKLQkJCQkiCQlmb28oZmFsc2UpO1xuIiArCi0JCQkJIgl9XG4iICsKLQkJCQkifSI7Ci0JCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEsICJBIik7Ci0JCQlJQ2xhc3NGaWxlUmVhZGVyIGNsYXNzRmlsZVJlYWRlciA9IFRvb2xGYWN0b3J5LmNyZWF0ZURlZmF1bHRDbGFzc0ZpbGVSZWFkZXIoRVZBTF9ESVJFQ1RPUlkgKyBGaWxlLnNlcGFyYXRvciArICJBLmNsYXNzIiwgSUNsYXNzRmlsZVJlYWRlci5BTEwpOwotCQkJSU1ldGhvZEluZm9bXSBtZXRob2RzID0gY2xhc3NGaWxlUmVhZGVyLmdldE1ldGhvZEluZm9zKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAzLCBtZXRob2RzLmxlbmd0aCk7Ci0JCQlJTWV0aG9kSW5mbyBtZXRob2RJbmZvID0gKElNZXRob2RJbmZvKSBtZXRob2RzWzFdOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgImZvbyIsIG5ldyBTdHJpbmcobWV0aG9kSW5mby5nZXROYW1lKCkpKTsKLQkJCUlDb2RlQXR0cmlidXRlIGNvZGVBdHRyaWJ1dGUgPSBtZXRob2RJbmZvLmdldENvZGVBdHRyaWJ1dGUoKTsKLQkJCWFzc2VydEVxdWFscygiV3Jvbmcgc2l6ZSIsIDMsIGNvZGVBdHRyaWJ1dGUuZ2V0RXhjZXB0aW9uVGFibGVMZW5ndGgoKSk7Ci0JCQlJRXhjZXB0aW9uVGFibGVFbnRyeVtdIGVudHJpZXMgPSBjb2RlQXR0cmlidXRlLmdldEV4Y2VwdGlvblRhYmxlKCk7Ci0JCQkvLyBhbnkgZXhjZXB0aW9uIGhhbmRsZXIKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgaW5kZXgiLCAwLCBlbnRyaWVzWzBdLmdldENhdGNoVHlwZUluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBpbmRleCIsIDAsIGVudHJpZXNbMV0uZ2V0Q2F0Y2hUeXBlSW5kZXgoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoIldyb25nIGluZGV4IiwgMCwgZW50cmllc1syXS5nZXRDYXRjaFR5cGVJbmRleCgpKTsKLQkJCQotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGFydHBjIiwgMCwgZW50cmllc1swXS5nZXRTdGFydFBDKCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBlbmRwYyIsIDcsIGVudHJpZXNbMF0uZ2V0RW5kUEMoKSk7Ci0KLQkJCWFzc2VydEVxdWFscygiV3Jvbmcgc3RhcnRwYyIsIDksIGVudHJpZXNbMV0uZ2V0U3RhcnRQQygpKTsKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgZW5kcGMiLCAxNCwgZW50cmllc1sxXS5nZXRFbmRQQygpKTsKLQotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdGFydHBjIiwgMjUsIGVudHJpZXNbMl0uZ2V0U3RhcnRQQygpKTsKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgZW5kcGMiLCAyOCwgZW50cmllc1syXS5nZXRFbmRQQygpKTsKLQkJCQotCQkJSUxpbmVOdW1iZXJBdHRyaWJ1dGUgbGluZU51bWJlckF0dHJpYnV0ZSA9IGNvZGVBdHRyaWJ1dGUuZ2V0TGluZU51bWJlckF0dHJpYnV0ZSgpOwotCQkJaWYgKGxpbmVOdW1iZXJBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJCWludFtdW10gbGluZUVudHJpZXMgPSBsaW5lTnVtYmVyQXR0cmlidXRlLmdldExpbmVOdW1iZXJUYWJsZSgpOwotCQkJCWFzc2VydE5vdE51bGwoIk5vIGVudHJpZXMiLCBsaW5lRW50cmllcyk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgNywgbGluZUVudHJpZXMubGVuZ3RoKTsKLQkJCQlsaW5lRW50cmllc1swXVswXSA9IDA7Ci0JCQkJbGluZUVudHJpZXNbMF1bMV0gPSA2OwotCQkJCWxpbmVFbnRyaWVzWzFdWzBdID0gOTsKLQkJCQlsaW5lRW50cmllc1sxXVsxXSA9IDc7Ci0JCQkJbGluZUVudHJpZXNbMl1bMF0gPSAxNDsKLQkJCQlsaW5lRW50cmllc1syXVsxXSA9IDg7Ci0JCQkJbGluZUVudHJpZXNbM11bMF0gPSAyMTsKLQkJCQlsaW5lRW50cmllc1szXVsxXSA9IDk7Ci0JCQkJbGluZUVudHJpZXNbNF1bMF0gPSAyMzsKLQkJCQlsaW5lRW50cmllc1s0XVsxXSA9IDEwOwotCQkJCWxpbmVFbnRyaWVzWzVdWzBdID0gMjU7Ci0JCQkJbGluZUVudHJpZXNbNV1bMV0gPSA4OwotCQkJCWxpbmVFbnRyaWVzWzZdWzBdID0gMjg7Ci0JCQkJbGluZUVudHJpZXNbNl1bMV0gPSAxMTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXJlbW92ZVRlbXBDbGFzcygiQSIpOwotCQl9Ci0JfQkJCQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3JlZ3Jlc3Npb24vQ29tcGxpYW5jZV8xXzMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9yZWdyZXNzaW9uL0NvbXBsaWFuY2VfMV8zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ODNmNmYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3JlZ3Jlc3Npb24vQ29tcGxpYW5jZV8xXzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci5yZWdyZXNzaW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuVG9vbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5DbGFzc0ZpbGVCeXRlc0Rpc2Fzc2VtYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSUluZGV4ZXJPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nLkJpbmFyeUluZGV4ZXI7Ci0KLXB1YmxpYyBjbGFzcyBDb21wbGlhbmNlXzFfMyBleHRlbmRzIEFic3RyYWN0UmVncmVzc2lvblRlc3QgewotcHVibGljIENvbXBsaWFuY2VfMV8zKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLS8qCi0gKiBUb2dnbGUgY29tcGlsZXIgaW4gbW9kZSAtMS4zCi0gKi8KLXByb3RlY3RlZCBNYXAgZ2V0Q29tcGlsZXJPcHRpb25zKCkgewotCU1hcCBvcHRpb25zID0gc3VwZXIuZ2V0Q29tcGlsZXJPcHRpb25zKCk7Ci0Jb3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Db21wbGlhbmNlLCBDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzMpOwotCXJldHVybiBvcHRpb25zOwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCXJldHVybiBzZXR1cFN1aXRlKHRlc3RDbGFzcygpKTsKLS8qCQotICAgCVRlc3RTdWl0ZSB0czsKLQkvL3NvbWUgb2YgdGhlIHRlc3RzIGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgdGhpcyBzdWl0ZS4KLQl0cyA9IG5ldyBUZXN0U3VpdGUoKTsKLQkvLwotCXRzLmFkZFRlc3QobmV3IENvbXBsaWFuY2VfMV8zKCJ0ZXN0MTciKSk7Ci0JcmV0dXJuIG5ldyBSZWdyZXNzaW9uVGVzdFNldHVwKHRzKTsKLSovCQotfQotcHVibGljIHZvaWQgdGVzdDAxKCkgewotCXRoaXMucnVuTmVnYXRpdmVUZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJInAxL1Rlc3QuamF2YSIsCi0JCQkicGFja2FnZSBwMTsgXG4iKwotCQkJInB1YmxpYyBjbGFzcyBUZXN0IHsgXG4iKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd1bWVudHMpIHsgXG4iKwotCQkJIgkJbmV3IFRlc3QoKS5mb28oKTsgXG4iKwotCQkJIgl9IFxuIisKLQkJCSIJY2xhc3MgTSB7IFxuIisKLQkJCSIJfSBcbiIrCi0JCQkiCXZvaWQgZm9vKCl7IFxuIisKLQkJCSIJCWNsYXNzIFkgZXh0ZW5kcyBTZWNvbmRhcnkgeyBcbiIrCi0JCQkiCQkJTSBtOyBcbiIrCi0JCQkiCQl9OyBcbiIrCi0JCQkiCX0gXG4iKwotCQkJIn0gXG4iICsKLQkJCSJjbGFzcyBTZWNvbmRhcnkgeyBcbiIgKwotCQkJIgljbGFzcyBNIHt9IFxuIiArCi0JCQkifSBcbiIKLQkJfSwKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjEuIEVSUk9SIGluIHAxXFxUZXN0LmphdmEgKGF0IGxpbmUgMTApXG4iICsgCi0JCSIJTSBtOyBcbiIgKyAKLQkJIgleXG4iICsgCi0JCSJUaGUgZmllbGQgdHlwZSBNIGlzIGRlZmluZWQgaW4gYW4gaW5oZXJpdGVkIHR5cGUgYW5kIGFuIGVuY2xvc2luZyBzY29wZVxuIiArIAotCQkiLS0tLS0tLS0tLVxuIgotCSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDIoKSB7Ci0JdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkicDEvVGVzdC5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOyBcbiIrCi0JCQkicHVibGljIGNsYXNzIFRlc3QgeyBcbiIrCi0JCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3VtZW50cykgeyBcbiIrCi0JCQkiCQluZXcgVGVzdCgpLmZvbygpOyBcbiIrCi0JCQkiCX0gXG4iKwotCQkJIglTdHJpbmcgYmFyKCkgeyBcbiIrCi0JCQkiCQlyZXR1cm4gXCJGQUlMRURcIjsJXG4iICsKLQkJCSIJfSBcbiIrCi0JCQkiCXZvaWQgZm9vKCl7IFxuIisKLQkJCSIJCWNsYXNzIFkgZXh0ZW5kcyBTZWNvbmRhcnkgeyBcbiIrCi0JCQkiCQkJU3RyaW5nIHogPSBiYXIoKTsJXG4iICsKLQkJCSIJCX07IFxuIisKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihuZXcgWSgpLnopOwlcbiIgKwotCQkJIgl9IFxuIisKLQkJCSJ9IFxuIiArCi0JCQkiY2xhc3MgU2Vjb25kYXJ5IHsgXG4iICsKLQkJCSIJU3RyaW5nIGJhcigpeyByZXR1cm4gXCJGQUlMRURcIjsgfSBcbiIgKwotCQkJIn0gXG4iCi0JCX0sCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIxLiBFUlJPUiBpbiBwMVxcVGVzdC5qYXZhIChhdCBsaW5lIDExKVxuIiArIAotCQkiCVN0cmluZyB6ID0gYmFyKCk7CVxuIiArIAotCQkiCSAgICAgICAgICAgXl5eXG4iICsgCi0JCSJUaGUgbWV0aG9kIGJhciBpcyBkZWZpbmVkIGluIGFuIGluaGVyaXRlZCB0eXBlIGFuZCBhbiBlbmNsb3Npbmcgc2NvcGVcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIKLQkpOwotfQotcHVibGljIHZvaWQgdGVzdDAzKCkgewotCXRoaXMucnVuTmVnYXRpdmVUZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJInAxL1Rlc3QuamF2YSIsCi0JCQkicGFja2FnZSBwMTsgXG4iKwotCQkJInB1YmxpYyBjbGFzcyBUZXN0IHsgXG4iKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd1bWVudHMpIHsgXG4iKwotCQkJIgkJbmV3IFRlc3QoKS5mb28oKTsgXG4iKwotCQkJIgl9IFxuIisKLQkJCSIJU3RyaW5nIGJhciA9IFwiRkFJTEVEXCI7IisKLQkJCSIJdm9pZCBmb28oKXsgXG4iKwotCQkJIgkJY2xhc3MgWSBleHRlbmRzIFNlY29uZGFyeSB7IFxuIisKLQkJCSIJCQlTdHJpbmcgeiA9IGJhcjsgXG4iKwotCQkJIgkJfTsgXG4iKwotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKG5ldyBZKCkueik7CVxuIiArCi0JCQkiCX0gXG4iKwotCQkJIn0gXG4iICsKLQkJCSJjbGFzcyBTZWNvbmRhcnkgeyBcbiIgKwotCQkJIglTdHJpbmcgYmFyID0gXCJGQUlMRURcIjsgXG4iICsKLQkJCSJ9IFxuIgotCQl9LAotCQkiLS0tLS0tLS0tLVxuIiArIAotCQkiMS4gRVJST1IgaW4gcDFcXFRlc3QuamF2YSAoYXQgbGluZSA4KVxuIiArIAotCQkiCVN0cmluZyB6ID0gYmFyOyBcbiIgKyAKLQkJIgkgICAgICAgICAgIF5eXlxuIiArIAotCQkiVGhlIGZpZWxkIGJhciBpcyBkZWZpbmVkIGluIGFuIGluaGVyaXRlZCB0eXBlIGFuZCBhbiBlbmNsb3Npbmcgc2NvcGUgXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iCi0JKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QwNCgpIHsKLQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJInAxL1Rlc3QuamF2YSIsCi0JCQkicGFja2FnZSBwMTsgXG4iKwotCQkJInB1YmxpYyBjbGFzcyBUZXN0IHsgXG4iKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd1bWVudHMpIHsgXG4iKwotCQkJIgkJbmV3IFRlc3QoKS5mb28oKTsgXG4iKwotCQkJIgl9IFxuIisKLQkJCSIJU3RyaW5nIGJhcigpIHsgXG4iKwotCQkJIgkJcmV0dXJuIFwiU1VDQ0VTU1wiOwlcbiIgKwotCQkJIgl9IFxuIisKLQkJCSIJdm9pZCBmb28oKXsgXG4iKwotCQkJIgkJY2xhc3MgWSBleHRlbmRzIFNlY29uZGFyeSB7IFxuIisKLQkJCSIJCQlTdHJpbmcgeiA9IGJhcigpOwlcbiIgKwotCQkJIgkJfTsgXG4iKwotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKG5ldyBZKCkueik7CVxuIiArCi0JCQkiCX0gXG4iKwotCQkJIn0gXG4iICsKLQkJCSJjbGFzcyBTZWNvbmRhcnkgeyBcbiIgKwotCQkJIglwcml2YXRlIFN0cmluZyBiYXIoKXsgcmV0dXJuIFwiRkFJTEVEXCI7IH0gXG4iICsKLQkJCSJ9IFxuIgotCQl9LAotCQkiU1VDQ0VTUyIpOwotfQotcHVibGljIHZvaWQgdGVzdDA1KCkgewotCXRoaXMucnVuQ29uZm9ybVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkicDEvVGVzdC5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOyBcbiIrCi0JCQkicHVibGljIGNsYXNzIFRlc3QgeyBcbiIrCi0JCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3VtZW50cykgeyBcbiIrCi0JCQkiCQluZXcgVGVzdCgpLmZvbygpOyBcbiIrCi0JCQkiCX0gXG4iKwotCQkJIglTdHJpbmcgYmFyID0gXCJTVUNDRVNTXCI7IisKLQkJCSIJdm9pZCBmb28oKXsgXG4iKwotCQkJIgkJY2xhc3MgWSBleHRlbmRzIFNlY29uZGFyeSB7IFxuIisKLQkJCSIJCQlTdHJpbmcgeiA9IGJhcjsgXG4iKwotCQkJIgkJfTsgXG4iKwotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKG5ldyBZKCkueik7CVxuIiArCi0JCQkiCX0gXG4iKwotCQkJIn0gXG4iICsKLQkJCSJjbGFzcyBTZWNvbmRhcnkgeyBcbiIgKwotCQkJIglwcml2YXRlIFN0cmluZyBiYXIgPSBcIkZBSUxFRFwiOyBcbiIgKwotCQkJIn0gXG4iCi0JCX0sCi0JCSJTVUNDRVNTIik7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDYoKSB7Ci0JdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkicDEvVGVzdC5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOyBcbiIrCi0JCQkicHVibGljIGNsYXNzIFRlc3QgeyBcbiIrCi0JCQkiCVN0cmluZyBiYXIoKSB7IFxuIisKLQkJCSIJCXJldHVybiBcIlNVQ0NFU1NcIjsJXG4iICsKLQkJCSIJfSBcbiIrCi0JCQkiCXZvaWQgZm9vKCl7IFxuIisKLQkJCSIJCWNsYXNzIFkgZXh0ZW5kcyBTZWNvbmRhcnkgeyBcbiIrCi0JCQkiCQkJU3RyaW5nIHogPSBiYXIoKTsJXG4iICsKLQkJCSIJCX07IFxuIisKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihuZXcgWSgpLnopOwlcbiIgKwotCQkJIgl9IFxuIisKLQkJCSJ9IFxuIiArCi0JCQkiY2xhc3MgU2Vjb25kYXJ5IHsgXG4iICsKLQkJCSIJU3RyaW5nIGJhcihpbnQgaSl7IHJldHVybiBcIkZBSUxFRFwiOyB9IFxuIiArCi0JCQkifSBcbiIKLQkJfSwKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjEuIEVSUk9SIGluIHAxXFxUZXN0LmphdmEgKGF0IGxpbmUgOClcbiIgKyAKLQkJIglTdHJpbmcgeiA9IGJhcigpOwlcbiIgKyAKLQkJIgkgICAgICAgICAgIF5eXlxuIiArIAotCQkiVGhlIG1ldGhvZCBiYXIoaW50KSBpbiB0aGUgdHlwZSBTZWNvbmRhcnkgaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKClcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIpOwotfQotcHVibGljIHZvaWQgdGVzdDA3KCkgewotCXRoaXMucnVuTmVnYXRpdmVUZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJInAxL1Rlc3QuamF2YSIsCi0JCQkicGFja2FnZSBwMTsgXG4iKwotCQkJInB1YmxpYyBjbGFzcyBUZXN0IHsgXG4iKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd1bWVudHMpIHsgXG4iKwotCQkJIgkJdHJ5IHsJXG4iICsKLQkJCSIJCQl0aHJvdyBudWxsOyBcbiIrCi0JCQkiCQl9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpeyAJXG4iICsKLQkJCSIJCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpOwlcbiIJKwotCQkJIgkJfQlcbiIgKwotCQkJIgl9IFxuIisKLQkJCSJ9IFxuIgotCQl9LAotCQkiLS0tLS0tLS0tLVxuIiArIAotCQkiMS4gRVJST1IgaW4gcDFcXFRlc3QuamF2YSAoYXQgbGluZSA1KVxuIiArIAotCQkiCXRocm93IG51bGw7IFxuIiArIAotCQkiCV5eXl5eXl5eXl5cbiIgKyAKLQkJIkNhbm5vdCB0aHJvdyBudWxsXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iCi0JKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QwOCgpIHsKLQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJInAxL1Rlc3QuamF2YSIsCi0JCQkicGFja2FnZSBwMTsgXG4iKwotCQkJImltcG9ydCBUZXN0MjsJXG4iICsKLQkJCSJpbXBvcnQgVGVzdDIuTWVtYmVyOwlcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBUZXN0IHsgXG4iKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd1bWVudHMpIHsgXG4iKwotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTsJXG4iCSsKLQkJCSIJfSBcbiIrCi0JCQkifSBcbiIsCi0JCQkiVGVzdDIuamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFRlc3QyIHsgXG4iKwotCQkJIglwdWJsaWMgY2xhc3MgTWVtYmVyIHsJXG4iICsKLQkJCSIJfSBcbiIrCi0JCQkifSBcbiIKLQkJfSwKLQkJIlNVQ0NFU1MiKTsKLX0KLS8vIGJpbmFyeSBjb21wYXRpYmlsaXR5Ci1wdWJsaWMgdm9pZCB0ZXN0MDkoKSB7Ci0JdGhpcy5ydW5Db25mb3JtVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJwMS9aLmphdmEiLAotCQkJInBhY2thZ2UgcDE7IFxuIisKLQkJCSJwdWJsaWMgY2xhc3MgWiB7CVxuIiArCi0JCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3VtZW50cykgeyBcbiIrCi0JCQkiCQlZIHkgPSBuZXcgWSgpOwlcbiIgKwotCQkJIgkJU3lzdGVtLm91dC5wcmludCh5LmZpZWxkKTsJXG4iCSsKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnQoeS5zdGF0aWNGaWVsZCk7CVxuIgkrCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50KHkubWV0aG9kKCkpOwlcbiIJKwotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKHkuc3RhdGljTWV0aG9kKCkpOwlcbiIJKwotCQkJIgl9IFxuIisKLQkJCSJ9IFxuIiwKLQkJCSJwMS9YLmphdmEiLAotCQkJInBhY2thZ2UgcDE7IFxuIisKLQkJCSJwdWJsaWMgY2xhc3MgWCB7IFxuIisKLQkJCSIJcHVibGljIFN0cmluZyBmaWVsZCA9IFwiWC5maWVsZC1cIjsJXG4iICsKLQkJCSIJcHVibGljIHN0YXRpYyBTdHJpbmcgc3RhdGljRmllbGQgPSBcIlguc3RhdGljRmllbGQtXCI7CVxuIiArCi0JCQkiCXB1YmxpYyBTdHJpbmcgbWV0aG9kKCl7IHJldHVybiBcIlgubWV0aG9kKCktXCI7CX0JXG4iICsKLQkJCSIJcHVibGljIHN0YXRpYyBTdHJpbmcgc3RhdGljTWV0aG9kKCl7IHJldHVybiBcIlguc3RhdGljTWV0aG9kKCktXCI7CX0JXG4iICsKLQkJCSJ9IFxuIiwKLQkJCSJwMS9ZLmphdmEiLAotCQkJInBhY2thZ2UgcDE7IFxuIisKLQkJCSJwdWJsaWMgY2xhc3MgWSBleHRlbmRzIFggeyBcbiIrCi0JCQkifSBcbiIKLQkJfSwKLQkJIlguZmllbGQtWC5zdGF0aWNGaWVsZC1YLm1ldGhvZCgpLVguc3RhdGljTWV0aG9kKCktIik7Ci0KLQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJInAxL1kuamF2YSIsCi0JCQkicGFja2FnZSBwMTsgXG4iKwotCQkJInB1YmxpYyBjbGFzcyBZIGV4dGVuZHMgWCB7IFxuIisKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndW1lbnRzKSB7IFxuIisKLQkJCSIJCVoubWFpbihhcmd1bWVudHMpOwlcbiIgKwotCQkJIgl9CVxuIiArCi0JCQkiCXB1YmxpYyBTdHJpbmcgZmllbGQgPSBcIlkuZmllbGQtXCI7CVxuIiArCi0JCQkiCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0YXRpY0ZpZWxkID0gXCJZLnN0YXRpY0ZpZWxkLVwiOwlcbiIgKwotCQkJIglwdWJsaWMgU3RyaW5nIG1ldGhvZCgpeyByZXR1cm4gXCJZLm1ldGhvZCgpLVwiOwl9CVxuIiArCi0JCQkiCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0YXRpY01ldGhvZCgpeyByZXR1cm4gXCJZLnN0YXRpY01ldGhvZCgpLVwiOwl9CVxuIiArCi0JCQkifSBcbiIKLQkJfSwKLQkJIlguZmllbGQtWC5zdGF0aWNGaWVsZC1ZLm1ldGhvZCgpLVguc3RhdGljTWV0aG9kKCktIiwgLy8gZXhwZWN0ZWQgb3V0cHV0Ci0JCW51bGwsIC8vIHVzZSBkZWZhdWx0IGNsYXNzLXBhdGgKLQkJZmFsc2UsIC8vIGRvIG5vdCBmbHVzaCBwcmV2aW91cyBvdXRwdXQgZGlyIGNvbnRlbnQKLQkJbnVsbCk7IC8vIG5vIHNwZWNpYWwgdm0gYXJncwotfQotCi0vLyBjaGVjayBhY3R1YWxSZWNlaXZlclR5cGUgd2hlbiBhcnJheSB0eXBlCi1wdWJsaWMgdm9pZCB0ZXN0MTAoKSB7Ci0JdGhpcy5ydW5Db25mb3JtVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJwMS9aLmphdmEiLAotCQkJInBhY2thZ2UgcDE7IFxuIisKLQkJCSJwdWJsaWMgY2xhc3MgWiB7CVxuIiArCi0JCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3VtZW50cykgeyBcbiIrCi0JCQkiCQlTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1tde1wiU1VDQ0VTU1wiIH07CVxuIiArCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50KHMubGVuZ3RoKTsJXG4iCSsKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnQoKChTdHJpbmdbXSlzLmNsb25lKCkpWzBdKTsJXG4iCSsKLQkJCSIJfSBcbiIrCi0JCQkifSBcbiIKLQkJfSwKLQkJIjFTVUNDRVNTIik7Ci19Ci0vLyB0ZXN0IHVucmVhY2hhYmxlIGNvZGUgY29tcGxhaW50cwotcHVibGljIHZvaWQgdGVzdDExKCkgewotCXRoaXMucnVuTmVnYXRpdmVUZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJInAxL1guamF2YSIsCi0JCQkicGFja2FnZSBwMTsgXG4iKwotCQkJInB1YmxpYyBjbGFzcyBYIHsgXG4iKwotCQkJIgl2b2lkIGZvbygpIHsgXG4iKwotCQkJIgkJd2hpbGUgKGZhbHNlKTsJXG4iICsKLQkJCSIJCXdoaWxlIChmYWxzZSkgU3lzdGVtLm91dC5wcmludGxuKFwidW5yZWFjaGFibGVcIik7CVxuIiArCi0JCQkiCQlkbyA7IHdoaWxlIChmYWxzZSk7CVxuIiArCi0JCQkiCQlkbyBTeXN0ZW0ub3V0LnByaW50bG4oXCJ1bnJlYWNoYWJsZVwiKTsgd2hpbGUgKGZhbHNlKTsJXG4iICsKLQkJCSIJCWZvciAoO2ZhbHNlOyk7CVxuIiArCi0JCQkiCQlmb3IgKDtmYWxzZTspIFN5c3RlbS5vdXQucHJpbnRsbihcInVucmVhY2hhYmxlXCIpOwlcbiIgKwotCQkJIgkJaWYgKGZhbHNlKTsJXG4iICsKLQkJCSIJCWlmIChmYWxzZSlTeXN0ZW0ub3V0LnByaW50bG4oXCJ1bnJlYWNoYWJsZVwiKTsJCVxuIiArCQkKLQkJCSIJfQlcbiIgKwotCQkJIn0gXG4iCi0JCX0sCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIxLiBFUlJPUiBpbiBwMVxcWC5qYXZhIChhdCBsaW5lIDUpXG4iICsgCi0JCSIJd2hpbGUgKGZhbHNlKSBTeXN0ZW0ub3V0LnByaW50bG4oXCJ1bnJlYWNoYWJsZVwiKTsJXG4iICsgCi0JCSIJICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKLQkJIlVucmVhY2hhYmxlIGNvZGVcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjIuIEVSUk9SIGluIHAxXFxYLmphdmEgKGF0IGxpbmUgOSlcbiIgKyAKLQkJIglmb3IgKDtmYWxzZTspIFN5c3RlbS5vdXQucHJpbnRsbihcInVucmVhY2hhYmxlXCIpOwlcbiIgKyAKLQkJIgkgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxuIiArIAotCQkiVW5yZWFjaGFibGUgY29kZVxuIiArIAotCQkiLS0tLS0tLS0tLVxuIgotCSk7Ci19CQkJCi0vLyBiaW5hcnkgY29tcGF0aWJpbGl0eQotcHVibGljIHZvaWQgdGVzdDEyKCkgewotCXRoaXMucnVuQ29uZm9ybVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkicDEvWS5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOwlcbiIgKwotCQkJImNsYXNzIFN0b3JlIHsJXG4iICsKLQkJCSIJU3RyaW5nIHZhbHVlOwlcbiIgKwotCQkJIglTdG9yZShTdHJpbmcgdmFsdWUpewlcbiIgKwotCQkJIgkJdGhpcy52YWx1ZSA9IHZhbHVlOwlcbiIgKwotCQkJIgl9CVxuIiArCi0JCQkifQlcbiIgKwotCQkJImNsYXNzIFRvcCB7CVxuIiArCi0JCQkiCXN0YXRpYyBTdHJpbmcgYmFyID0gXCJUb3AuYmFyXCI7CVxuIiArCi0JCQkiCVN0cmluZyBmb28gPSBcIlRvcC5mb29cIjsJXG4iICsKLQkJCSIJU3RvcmUgc3RvcmUgPSBuZXcgU3RvcmUoXCJUb3Auc3RvcmVcIik7CVxuIiArCi0JCQkiCXN0YXRpYyBTdG9yZSBzc3RvcmUgPSBuZXcgU3RvcmUoXCJUb3Auc3N0b3JlXCIpOwlcbiIgKwotCQkJIglzdGF0aWMgVG9wIHNzID0gbmV3IFRvcCgpOwlcbiIgKwotCQkJIn0JXG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgWSBleHRlbmRzIFVwZGF0ZWQgewkJXG4iICsKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndW1lbnRzKSB7CVxuIiArCi0JCQkiCQluZXcgWSgpLnRlc3QoKTsJXG4iICsKLQkJCSIJfQlcbiIgKwotCQkJIgl2b2lkIHRlc3QoKSB7CQlcbiIgKwotCQkJIgkJU3lzdGVtLm91dC5wcmludChcIioqKiBGSUVMRCBBQ0NFU1MgKioqXCIpOwlcbiIgKwotCQkJIgkJU3lzdGVtLm91dC5wcmludChcIioxKiBuZXcgVXBkYXRlZCgpLmJhcjogXCIgKyBuZXcgVXBkYXRlZCgpLmJhcik7CVxuIiArCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50KFwiKjIqIG5ldyBVcGRhdGVkKCkuZm9vOiBcIiArIG5ldyBVcGRhdGVkKCkuZm9vKTsJXG4iICsKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnQoXCIqMyogbmV3IFkoKS5mb286IFwiICsgbmV3IFkoKS5mb28pOwlcbiIgKwotCQkJIgkJU3lzdGVtLm91dC5wcmludChcIio0KiBuZXcgWSgpLmJhcjogXCIgKyBuZXcgWSgpLmJhcik7CVxuIiArCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50KFwiKjUqIGJhcjogXCIgKyBiYXIpOwlcbiIgKwotCQkJIgkJU3lzdGVtLm91dC5wcmludChcIio2KiBmb286IFwiICsgZm9vKTsJXG4iICsKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnQoXCIqNyogWS5iYXI6IFwiICsgWS5iYXIpOwlcbiIgKwotCQkJIgkJU3lzdGVtLm91dC5wcmludChcIio4KiB0aGlzLmJhcjogXCIgKyB0aGlzLmJhcik7CVxuIiArCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50KFwiKjkqIHRoaXMuZm9vOiBcIiArIHRoaXMuZm9vKTsJXG4iICsKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnQoXCIqMTAqIHN0b3JlLnZhbHVlOiBcIiArIHN0b3JlLnZhbHVlKTsJXG4iICsKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnQoXCIqMTEqIHNzdG9yZS52YWx1ZTogXCIgKyBzc3RvcmUudmFsdWUpOwlcbiIgKwotCQkJIgkJU3lzdGVtLm91dC5wcmludChcIioxMiogc3Muc3N0b3JlLnZhbHVlOiBcIiArIHNzLnNzdG9yZS52YWx1ZSk7CVxuIiArCi0JCQkiCX0JCVxuIiArCi0JCQkifQkJXG4iLAotCQkJInAxL1VwZGF0ZWQuamF2YSIsCi0JCQkicGFja2FnZSBwMTsJXG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgVXBkYXRlZCBleHRlbmRzIFRvcCB7CVxuIiArCi0JCQkifQlcbiIKLQkJfSwKLQkJIioqKiBGSUVMRCBBQ0NFU1MgKioqIgotCQkrIioxKiBuZXcgVXBkYXRlZCgpLmJhcjogVG9wLmJhciIKLQkJKyIqMiogbmV3IFVwZGF0ZWQoKS5mb286IFRvcC5mb28iCi0JCSsiKjMqIG5ldyBZKCkuZm9vOiBUb3AuZm9vIgotCQkrIio0KiBuZXcgWSgpLmJhcjogVG9wLmJhciIKLQkJKyIqNSogYmFyOiBUb3AuYmFyIgotCQkrIio2KiBmb286IFRvcC5mb28iCi0JCSsiKjcqIFkuYmFyOiBUb3AuYmFyIgotCQkrIio4KiB0aGlzLmJhcjogVG9wLmJhciIKLQkJKyIqOSogdGhpcy5mb286IFRvcC5mb28iCi0JCSsiKjEwKiBzdG9yZS52YWx1ZTogVG9wLnN0b3JlIgotCQkrIioxMSogc3N0b3JlLnZhbHVlOiBUb3Auc3N0b3JlIgotCQkrIioxMiogc3Muc3N0b3JlLnZhbHVlOiBUb3Auc3N0b3JlIik7Ci0KLQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJInAxL1VwZGF0ZWQuamF2YSIsCi0JCQkicGFja2FnZSBwMTsgXG4iKwotCQkJInB1YmxpYyBjbGFzcyBVcGRhdGVkIGV4dGVuZHMgVG9wIHsgXG4iKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd1bWVudHMpIHsgXG4iKwotCQkJIgkJWS5tYWluKGFyZ3VtZW50cyk7CVxuIiArCi0JCQkiCX0JXG4iICsKLQkJCSIJc3RhdGljIFN0cmluZyBiYXIgPSBcIlVwZGF0ZWQuYmFyXCI7CVxuIiArCi0JCQkiCVN0cmluZyBmb28gPSBcIlVwZGF0ZWQuZm9vXCI7CVxuIiArCi0JCQkiCVN0b3JlIHN0b3JlID0gbmV3IFN0b3JlKFwiVXBkYXRlZC5zdG9yZVwiKTsJXG4iICsKLQkJCSIJc3RhdGljIFN0b3JlIHNzdG9yZSA9IG5ldyBTdG9yZShcIlVwZGF0ZWQuc3N0b3JlXCIpOwlcbiIgKwotCQkJIglzdGF0aWMgVXBkYXRlZCBzcyA9IG5ldyBVcGRhdGVkKCk7CVxuIiArCi0JCQkifSBcbiIKLQkJfSwKLQkJIioqKiBGSUVMRCBBQ0NFU1MgKioqIgotCQkrIioxKiBuZXcgVXBkYXRlZCgpLmJhcjogVG9wLmJhciIKLQkJKyIqMiogbmV3IFVwZGF0ZWQoKS5mb286IFRvcC5mb28iCi0JCSsiKjMqIG5ldyBZKCkuZm9vOiBUb3AuZm9vIgotCQkrIio0KiBuZXcgWSgpLmJhcjogVG9wLmJhciIKLQkJKyIqNSogYmFyOiBUb3AuYmFyIgotCQkrIio2KiBmb286IFRvcC5mb28iCi0JCSsiKjcqIFkuYmFyOiBUb3AuYmFyIgotCQkrIio4KiB0aGlzLmJhcjogVG9wLmJhciIKLQkJKyIqOSogdGhpcy5mb286IFRvcC5mb28iCi0JCSsiKjEwKiBzdG9yZS52YWx1ZTogVG9wLnN0b3JlIgotCQkrIioxMSogc3N0b3JlLnZhbHVlOiBUb3Auc3N0b3JlIgotCQkrIioxMiogc3Muc3N0b3JlLnZhbHVlOiBUb3Auc3N0b3JlIiwKLQkJbnVsbCwgLy8gdXNlIGRlZmF1bHQgY2xhc3MtcGF0aAotCQlmYWxzZSwgLy8gZG8gbm90IGZsdXNoIHByZXZpb3VzIG91dHB1dCBkaXIgY29udGVudAotCQludWxsKTsgLy8gbm8gc3BlY2lhbCB2bSBhcmdzCQkKLX0KLS8vIGJpbmFyeSBjb21wYXRpYmlsaXR5Ci1wdWJsaWMgdm9pZCB0ZXN0MTMoKSB7Ci0JdGhpcy5ydW5Db25mb3JtVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJwMS9ZLmphdmEiLAotCQkJInBhY2thZ2UgcDE7CVxuIiArCi0JCQkiY2xhc3MgU3RvcmUgewlcbiIgKwotCQkJIglTdHJpbmcgdmFsdWU7CVxuIiArCi0JCQkiCVN0b3JlKFN0cmluZyB2YWx1ZSl7CVxuIiArCi0JCQkiCQl0aGlzLnZhbHVlID0gdmFsdWU7CVxuIiArCi0JCQkiCX0JXG4iICsKLQkJCSJ9CVxuIiArCi0JCQkiY2xhc3MgVG9wIHsJXG4iICsKLQkJCSIJc3RhdGljIFN0cmluZyBiYXIoKSB7IHJldHVybiBcIlRvcC5iYXIoKVwiOyB9CVxuIiArCi0JCQkiCVN0cmluZyBmb28oKSB7IHJldHVybiBcIlRvcC5mb28oKVwiOyB9CVxuIiArCi0JCQkifQlcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBZIGV4dGVuZHMgVXBkYXRlZCB7CQlcbiIgKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd1bWVudHMpIHsJXG4iICsKLQkJCSIJCW5ldyBZKCkudGVzdCgpOwlcbiIgKwotCQkJIgl9CVxuIiArCi0JCQkiCXZvaWQgdGVzdCgpIHsJCVxuIiArCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50KFwiKioqIE1FVEhPRCBBQ0NFU1MgKioqXCIpOwlcbiIgKwotCQkJIgkJU3lzdGVtLm91dC5wcmludChcIioxKiBuZXcgVXBkYXRlZCgpLmJhcigpOiBcIiArIG5ldyBVcGRhdGVkKCkuYmFyKCkpOwlcbiIgKwotCQkJIgkJU3lzdGVtLm91dC5wcmludChcIioyKiBuZXcgVXBkYXRlZCgpLmZvbygpOiBcIiArIG5ldyBVcGRhdGVkKCkuZm9vKCkpOwlcbiIgKwotCQkJIgkJU3lzdGVtLm91dC5wcmludChcIiozKiBuZXcgWSgpLmZvbygpOiBcIiArIG5ldyBZKCkuZm9vKCkpOwlcbiIgKwotCQkJIgkJU3lzdGVtLm91dC5wcmludChcIio0KiBuZXcgWSgpLmJhcigpOiBcIiArIG5ldyBZKCkuYmFyKCkpOwlcbiIgKwotCQkJIgkJU3lzdGVtLm91dC5wcmludChcIio1KiBiYXIoKTogXCIgKyBiYXIoKSk7CVxuIiArCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50KFwiKjYqIGZvbygpOiBcIiArIGZvbygpKTsJXG4iICsKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnQoXCIqNyogWS5iYXIoKTogXCIgKyBZLmJhcigpKTsJXG4iICsKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnQoXCIqOCogdGhpcy5iYXIoKTogXCIgKyB0aGlzLmJhcigpKTsJXG4iICsKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnQoXCIqOSogdGhpcy5mb28oKTogXCIgKyB0aGlzLmZvbygpKTsJXG4iICsKLQkJCSIJfQkJXG4iICsKLQkJCSJ9CQlcbiIsCi0JCQkicDEvVXBkYXRlZC5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOwlcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBVcGRhdGVkIGV4dGVuZHMgVG9wIHsJXG4iICsKLQkJCSJ9CVxuIgotCQl9LAotCQkiKioqIE1FVEhPRCBBQ0NFU1MgKioqIgotCQkrIioxKiBuZXcgVXBkYXRlZCgpLmJhcigpOiBUb3AuYmFyKCkiCi0JCSsiKjIqIG5ldyBVcGRhdGVkKCkuZm9vKCk6IFRvcC5mb28oKSIKLQkJKyIqMyogbmV3IFkoKS5mb28oKTogVG9wLmZvbygpIgotCQkrIio0KiBuZXcgWSgpLmJhcigpOiBUb3AuYmFyKCkiCi0JCSsiKjUqIGJhcigpOiBUb3AuYmFyKCkiCi0JCSsiKjYqIGZvbygpOiBUb3AuZm9vKCkiCi0JCSsiKjcqIFkuYmFyKCk6IFRvcC5iYXIoKSIKLQkJKyIqOCogdGhpcy5iYXIoKTogVG9wLmJhcigpIgotCQkrIio5KiB0aGlzLmZvbygpOiBUb3AuZm9vKCkiKTsKLQotCXRoaXMucnVuQ29uZm9ybVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkicDEvVXBkYXRlZC5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOyBcbiIrCi0JCQkicHVibGljIGNsYXNzIFVwZGF0ZWQgZXh0ZW5kcyBUb3AgeyBcbiIrCi0JCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3VtZW50cykgeyBcbiIrCi0JCQkiCQlZLm1haW4oYXJndW1lbnRzKTsJXG4iICsKLQkJCSIJfQlcbiIgKwotCQkJIglzdGF0aWMgU3RyaW5nIGJhcigpIHsgcmV0dXJuIFwiVXBkYXRlZC5iYXIoKVwiOyB9CVxuIiArCi0JCQkiCVN0cmluZyBmb28oKSB7IHJldHVybiBcIlVwZGF0ZWQuZm9vKClcIjsgfQlcbiIgKwotCQkJIn0gXG4iCi0JCX0sCi0JCSIqKiogTUVUSE9EIEFDQ0VTUyAqKioiCi0JCSsiKjEqIG5ldyBVcGRhdGVkKCkuYmFyKCk6IFRvcC5iYXIoKSIKLQkJKyIqMiogbmV3IFVwZGF0ZWQoKS5mb28oKTogVXBkYXRlZC5mb28oKSIKLQkJKyIqMyogbmV3IFkoKS5mb28oKTogVXBkYXRlZC5mb28oKSIKLQkJKyIqNCogbmV3IFkoKS5iYXIoKTogVG9wLmJhcigpIgotCQkrIio1KiBiYXIoKTogVG9wLmJhcigpIgotCQkrIio2KiBmb28oKTogVXBkYXRlZC5mb28oKSIKLQkJKyIqNyogWS5iYXIoKTogVG9wLmJhcigpIgotCQkrIio4KiB0aGlzLmJhcigpOiBUb3AuYmFyKCkiCi0JCSsiKjkqIHRoaXMuZm9vKCk6IFVwZGF0ZWQuZm9vKCkiLAotCQludWxsLCAvLyB1c2UgZGVmYXVsdCBjbGFzcy1wYXRoCi0JCWZhbHNlLCAvLyBkbyBub3QgZmx1c2ggcHJldmlvdXMgb3V0cHV0IGRpciBjb250ZW50Ci0JCW51bGwpOyAvLyBubyBzcGVjaWFsIHZtIGFyZ3MJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0MTQoKSB7Ci0JdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkicDEvWC5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOwlcbiIgKwotCQkJImNsYXNzIFQgewlcbiIgKwotCQkJIgl2b2lkIGZvbyhib29sZWFuIGIpIHsJXG4iICsKLQkJCSIJCSBTeXN0ZW0ub3V0LnByaW50KFwiVC5mb28oYm9vbGVhbikjXCIpOyAJXG4iICsKLQkJCSIJfQlcbiIgKwotCQkJIglib29sZWFuIGJhciA9IGZhbHNlOwlcbiIgKwotCQkJIgljbGFzcyBNZW1iZXIgewlcbiIgKwotCQkJIgkJdm9pZCBkaXNwbGF5KCl7IFN5c3RlbS5vdXQucHJpbnQoXCJULk1lbWJlciNcIik7IH0JXG4iICsKLQkJCSIJfQlcbiIgKwotCQkJIn0JXG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgWCB7CVxuIiArCi0JCQkiCXZvaWQgZm9vKGludCBpKSB7CVxuIiArCi0JCQkiCQkgU3lzdGVtLm91dC5wcmludGxuKFwiWC5mb28oaW50KSNcIik7IAkJCVxuIiArCi0JCQkiCX0JXG4iICsKLQkJCSIJaW50IGJhcjsJXG4iICsKLQkJCSIJY2xhc3MgTWVtYmVyIHsJXG4iICsKLQkJCSIJCXZvaWQgZGlzcGxheSgpeyBTeXN0ZW0ub3V0LnByaW50KFwiWC5NZW1iZXIjXCIpOyB9CVxuIiArCi0JCQkiCX0JXG4iICsKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndW1lbnRzKSB7CVxuIiArCi0JCQkiCQluZXcgWCgpLmJhcigpOwlcbiIgKwotCQkJIgl9CQkJCVxuIiArCi0JCQkiCXZvaWQgYmFyKCkgeyAJXG4iICsKLQkJCSIJCW5ldyBUKCkgewlcbiIgKwotCQkJIgkJCXsJXG4iICsKLQkJCSIJCQkJZm9vKHRydWUpOwlcbiIgKwotCQkJIgkJCQlTeXN0ZW0ub3V0LnByaW50KChib29sZWFuKWJhciArIFwiI1wiKTsJXG4iICsKLQkJCSIJCQkJTWVtYmVyIG0gPSBuZXcgTWVtYmVyKCk7CVxuIiArCQotCQkJIgkJCQltLmRpc3BsYXkoKTsJXG4iICsKLQkJCSIJCQl9IAlcbiIgKwotCQkJIgkJfTsJXG4iICsKLQkJCSIJfQlcbiIgKwotCQkJIn0JXG4iCi0JCX0sCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIxLiBFUlJPUiBpbiBwMVxcWC5qYXZhIChhdCBsaW5lIDI1KVxuIiArIAotCQkiCWZvbyh0cnVlKTsJXG4iICsgCi0JCSIJXl5eXG4iICsgCi0JCSJUaGUgbWV0aG9kIGZvbyBpcyBkZWZpbmVkIGluIGFuIGluaGVyaXRlZCB0eXBlIGFuZCBhbiBlbmNsb3Npbmcgc2NvcGVcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjIuIEVSUk9SIGluIHAxXFxYLmphdmEgKGF0IGxpbmUgMjYpXG4iICsgCi0JCSIJU3lzdGVtLm91dC5wcmludCgoYm9vbGVhbiliYXIgKyBcIiNcIik7CVxuIiArIAotCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXG4iICsgCi0JCSJUaGUgZmllbGQgYmFyIGlzIGRlZmluZWQgaW4gYW4gaW5oZXJpdGVkIHR5cGUgYW5kIGFuIGVuY2xvc2luZyBzY29wZSBcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjMuIEVSUk9SIGluIHAxXFxYLmphdmEgKGF0IGxpbmUgMjcpXG4iICsgCi0JCSIJTWVtYmVyIG0gPSBuZXcgTWVtYmVyKCk7CVxuIiArIAotCQkiCV5eXl5eXlxuIiArIAotCQkiVGhlIHR5cGUgTWVtYmVyIGlzIGRlZmluZWQgaW4gYW4gaW5oZXJpdGVkIHR5cGUgYW5kIGFuIGVuY2xvc2luZyBzY29wZVxuIiArIAotCQkiLS0tLS0tLS0tLVxuIiArIAotCQkiNC4gRVJST1IgaW4gcDFcXFguamF2YSAoYXQgbGluZSAyNylcbiIgKyAKLQkJIglNZW1iZXIgbSA9IG5ldyBNZW1iZXIoKTsJXG4iICsgCi0JCSIJICAgICAgICAgICAgICAgXl5eXl5eXG4iICsgCi0JCSJUaGUgdHlwZSBNZW1iZXIgaXMgZGVmaW5lZCBpbiBhbiBpbmhlcml0ZWQgdHlwZSBhbmQgYW4gZW5jbG9zaW5nIHNjb3BlXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iCi0JKTsKLX0KLQotLyoKLSAqIGNoZWNrIGhhbmRsaW5nIG9mIGRlZmF1bHQgYWJzdHJhY3QgbWV0aG9kcwotICovCi1wdWJsaWMgdm9pZCB0ZXN0MTUoKSB7Ci0JdGhpcy5ydW5Db25mb3JtVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJwMS9YLmphdmEiLAotCQkJInBhY2thZ2UgcDE7CVxuIisKLQkJCSJwdWJsaWMgY2xhc3MgWCB7CVxuIisKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndW1lbnRzKSB7CVxuIisKLQkJCSIJCUMgYyA9IG5ldyBDKCkgewlcbiIrCi0JCQkiCQkJcHVibGljIHZvaWQgZG9Tb21ldGhpbmcoKXsJXG4iKwotCQkJIgkJCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpOwlcbiIrCi0JCQkiCQkJfQlcbiIrCi0JCQkiCQl9OwlcbiIrCi0JCQkiCQljLmRvU29tZXRoaW5nKCk7CVxuIisKLQkJCSIJfQlcbiIrCi0JCQkifQlcbiIrCi0JCQkiaW50ZXJmYWNlIEkgewlcbiIrCi0JCQkiCXZvaWQgZG9Tb21ldGhpbmcoKTsJXG4iKwotCQkJIn0JXG4iKwotCQkJImFic3RyYWN0IGNsYXNzIEMgaW1wbGVtZW50cyBJIHsJXG4iKwotCQkJIn0JXG4iCi0JCX0sCi0JCSJTVUNDRVNTIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3QxNigpIHsKLQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJYLmphdmEiLAotCQkJImNsYXNzIFQgewlcbiIrCi0JCQkiICAgICAgdm9pZCBmb28oYm9vbGVhbiBiKSB7fQlcbiIrCi0JCQkifQlcbiIrCi0JCQkicHVibGljIGNsYXNzIFggewlcbiIrCi0JCQkiICAgICAgdm9pZCBmb28oaW50IGkpIHt9CVxuIisKLQkJCSIgICAgICB2b2lkIGJhcigpIHsJXG4iKwotCQkJIiAgICAgICAgICAgIG5ldyBUKCkgewlcbiIrCi0JCQkiICAgICAgICAgICAgICAgICAgewlcbiIrCi0JCQkiICAgICAgICAgICAgICAgICAgICAgICAgZm9vKDApOyAJXG4iKwotCQkJIiAgICAgICAgICAgICAgICAgIH0JXG4iKwotCQkJIiAgICAgICAgICAgIH07CVxuIisKLQkJCSIgICAgICB9CVxuIisKLQkJCSJ9IAlcbiIKLQkJfSwKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA5KVxuIiArIAotCQkiCWZvbygwKTsgCVxuIiArIAotCQkiCV5eXlxuIiArIAotCQkiVGhlIG1ldGhvZCBmb28oYm9vbGVhbikgaW4gdGhlIHR5cGUgVCBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoaW50KVxuIiArIAotCQkiLS0tLS0tLS0tLVxuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3QxNygpIHsKLQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJYLmphdmEiLAotCQkJImNsYXNzIFQgewlcbiIrCi0JCQkiICAgICAgdm9pZCBmb28oYm9vbGVhbiBiKSB7fQlcbiIrCi0JCQkifQlcbiIrCi0JCQkicHVibGljIGNsYXNzIFggewlcbiIrCi0JCQkiICAgICAgdm9pZCBmb28oaW50IGkpIHt9CVxuIisKLQkJCSIgICAgICB2b2lkIGJhcigpIHsJXG4iKwotCQkJIiAgICAgICAgICAgIG5ldyBUKCkgewlcbiIrCi0JCQkiICAgICAgICAgICAgICAgICAgewlcbiIrCi0JCQkiICAgICAgICAgICAgICAgICAgICAgICAgZm9vKGZhbHNlKTsgCVxuIisKLQkJCSIgICAgICAgICAgICAgICAgICB9CVxuIisKLQkJCSIgICAgICAgICAgICB9OwlcbiIrCi0JCQkiICAgICAgfQlcbiIrCi0JCQkifSAJXG4iCi0JCX0sCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgOSlcbiIgKyAKLQkJIglmb28oZmFsc2UpOyAJXG4iICsgCi0JCSIJXl5eXG4iICsgCi0JCSJUaGUgbWV0aG9kIGZvbyBpcyBkZWZpbmVkIGluIGFuIGluaGVyaXRlZCB0eXBlIGFuZCBhbiBlbmNsb3Npbmcgc2NvcGVcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0MTgoKSB7Ci0JdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkiWC5qYXZhIiwKLQkJCSJjbGFzcyBUIHsJXG4iKwotCQkJIiAgICAgIHZvaWQgZm9vKGludCBqKSB7fQlcbiIrCi0JCQkifQlcbiIrCi0JCQkicHVibGljIGNsYXNzIFggewlcbiIrCi0JCQkiICAgICAgdm9pZCBmb28oaW50IGkpIHt9CVxuIisKLQkJCSIgICAgICB2b2lkIGJhcigpIHsJXG4iKwotCQkJIiAgICAgICAgICAgIG5ldyBUKCkgewlcbiIrCi0JCQkiICAgICAgICAgICAgICAgICAgewlcbiIrCi0JCQkiICAgICAgICAgICAgICAgICAgICAgICAgZm9vKDApOyAJXG4iKwotCQkJIiAgICAgICAgICAgICAgICAgIH0JXG4iKwotCQkJIiAgICAgICAgICAgIH07CVxuIisKLQkJCSIgICAgICB9CVxuIisKLQkJCSJ9IAlcbiIKLQkJfSwKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA5KVxuIiArIAotCQkiCWZvbygwKTsgCVxuIiArIAotCQkiCV5eXlxuIiArIAotCQkiVGhlIG1ldGhvZCBmb28gaXMgZGVmaW5lZCBpbiBhbiBpbmhlcml0ZWQgdHlwZSBhbmQgYW4gZW5jbG9zaW5nIHNjb3BlXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QxOSgpIHsKLQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJIlguamF2YSIsCi0JCQkiY2xhc3MgVCB7CVxuIisKLQkJCSIgICAgICB2b2lkIGZvbyhpbnQgaikgeyBTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpOyB9CVxuIisKLQkJCSJ9CVxuIisKLQkJCSJjbGFzcyBVIHsJXG4iKwotCQkJIiAgICAgIHZvaWQgZm9vKGludCBqKSB7IFN5c3RlbS5vdXQucHJpbnRsbihcIkZBSUxFRFwiKTsgfQlcbiIrCi0JCQkifQlcbiIrCi0JCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBVIHsJXG4iKwotCQkJIiAgICAgIHZvaWQgYmFyKCkgewlcbiIrCi0JCQkiICAgICAgICAgICAgbmV3IFQoKSB7CVxuIisKLQkJCSIgICAgICAgICAgICAgICAgICB7CVxuIisKLQkJCSIgICAgICAgICAgICAgICAgICAgICAgICBmb28oMCk7IAlcbiIrCi0JCQkiICAgICAgICAgICAgICAgICAgfQlcbiIrCi0JCQkiICAgICAgICAgICAgfTsJXG4iKwotCQkJIiAgICAgIH0JXG4iKwotCQkJIiAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3VtZW50cykgewlcbiIrCi0JCQkiCQkJbmV3IFgoKS5iYXIoKTsJXG4iICsKLQkJCSIgICAgICB9CVxuIisKLQkJCSJ9IAlcbiIKLQkJfSwKLQkJIlNVQ0NFU1MiKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QyMCgpIHsKLQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJIlguamF2YSIsCi0JCQkiY2xhc3MgVCB7CVxuIisKLQkJCSIgICAgICB2b2lkIGZvbyhpbnQgaikgeyBTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpOyB9CVxuIisKLQkJCSJ9CVxuIisKLQkJCSJjbGFzcyBVIHsJXG4iKwotCQkJIiAgICAgIHZvaWQgZm9vKGJvb2xlYW4gaikgeyBTeXN0ZW0ub3V0LnByaW50bG4oXCJGQUlMRURcIik7IH0JXG4iKwotCQkJIn0JXG4iKwotCQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgVSB7CVxuIisKLQkJCSIgICAgICB2b2lkIGJhcigpIHsJXG4iKwotCQkJIiAgICAgICAgICAgIG5ldyBUKCkgewlcbiIrCi0JCQkiICAgICAgICAgICAgICAgICAgewlcbiIrCi0JCQkiICAgICAgICAgICAgICAgICAgICAgICAgZm9vKDApOyAJXG4iKwotCQkJIiAgICAgICAgICAgICAgICAgIH0JXG4iKwotCQkJIiAgICAgICAgICAgIH07CVxuIisKLQkJCSIgICAgICB9CVxuIisKLQkJCSIgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd1bWVudHMpIHsJXG4iKwotCQkJIgkJCW5ldyBYKCkuYmFyKCk7CVxuIiArCi0JCQkiICAgICAgfQlcbiIrCi0JCQkifSAJXG4iCi0JCX0sCi0JCSJTVUNDRVNTIik7Ci19Ci0vLyBiaW5hcnkgY2hlY2sgZm9yIDExNTExCi1wdWJsaWMgdm9pZCB0ZXN0MjEoKSB7Ci0JdGhpcy5ydW5Db25mb3JtVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJwMS9aLmphdmEiLAotCQkJInBhY2thZ2UgcDE7CVxuIiArCi0JCQkicHVibGljIGNsYXNzIFogZXh0ZW5kcyBBYnN0cmFjdEEgewlcbiIgKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd1bWVudHMpIHsJXG4iICsKLQkJCSIJCW5ldyBaKCkuaW5pdCgpOyAJXG4iICsKLQkJCSIJfQlcbiIgKwotCQkJIn0JXG4iICsKLQkJCSJhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEIgaW1wbGVtZW50cyBLIHsJXG4iICsKLQkJCSIJcHVibGljIHZvaWQgaW5pdCgpIHsJXG4iICsKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihcIkFic3RyYWN0Qi5pbml0KClcIik7CVxuIiArCi0JCQkiCX0JXG4iICsKLQkJCSJ9CVxuIiArCi0JCQkiaW50ZXJmYWNlIEsgewlcbiIgKwotCQkJIgl2b2lkIGluaXQoKTsJXG4iICsKLQkJCSIJdm9pZCBpbml0KGludCBpKTsJXG4iICsKLQkJCSJ9CVxuIiwKLQkJCSJwMS9BYnN0cmFjdEEuamF2YSIsCi0JCQkicGFja2FnZSBwMTsJXG4iICsKLQkJCSJwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBIGV4dGVuZHMgQWJzdHJhY3RCIGltcGxlbWVudHMgSyB7CVxuIiArCi0JCQkiCXB1YmxpYyB2b2lkIGluaXQoaW50IGkpIHsJXG4iICsKLQkJCSIJfQlcbiIgKwotCQkJIn0JXG4iCQkJCi0JCX0sCi0JCSJBYnN0cmFjdEIuaW5pdCgpIik7IC8vIG5vIHNwZWNpYWwgdm0gYXJncwkJCQotCi0JCS8vIGNoZWNrIHRoYXQgIm5ldyBaKCkuaW5pdCgpIiBpcyBib3VuZCB0byAiQWJzdHJhY3RCLmluaXQoKSIKLQkJZmluYWwgU3RyaW5nQnVmZmVyIHJlZmVyZW5jZXMgPSBuZXcgU3RyaW5nQnVmZmVyKDEwKTsKLQkJdHJ5IHsKLQkJCUJpbmFyeUluZGV4ZXIgaW5kZXhlciA9IG5ldyBCaW5hcnlJbmRleGVyKHRydWUpOwotCQkJaW5kZXhlci5pbmRleCgKLQkJCQluZXcgSURvY3VtZW50KCkgewotCQkJCQlwdWJsaWMgYnl0ZVtdIGdldEJ5dGVDb250ZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCQkJCXJldHVybiBVdGlsLmdldEZpbGVCeXRlQ29udGVudChuZXcgRmlsZShPVVRQVVRfRElSICsgIi9wMS9aLmNsYXNzIikpOwotCQkJCQl9Ci0JCQkJCXB1YmxpYyBjaGFyW10gZ2V0Q2hhckNvbnRlbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geyByZXR1cm4gbnVsbDsgfQotCQkJCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7IHJldHVybiAiWi5jbGFzcyI7IH0KLQkJCQkJcHVibGljIFN0cmluZyBnZXRTdHJpbmdDb250ZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsgcmV0dXJuIG51bGw7IH0KLQkJCQkJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeyByZXR1cm4gImNsYXNzIjsgfQotCQkJCQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgeyByZXR1cm4gIiI7IH0KLQotCQkJCX0sIAotCQkJCW5ldyBJSW5kZXhlck91dHB1dCgpIHsKLQkJCQkJcHVibGljIHZvaWQgYWRkRG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50KSB7IH0KLQkJCQkJcHVibGljIHZvaWQgYWRkUmVmKGNoYXJbXSB3b3JkKSB7IAotCQkJCQkJcmVmZXJlbmNlcy5hcHBlbmQod29yZCk7Ci0JCQkJCQlyZWZlcmVuY2VzLmFwcGVuZCgnXG4nKTsKLQkJCQkJfQotCQkJCQlwdWJsaWMgdm9pZCBhZGRSZWYoU3RyaW5nIHdvcmQpIHsKLQkJCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKHdvcmQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewotCQl9Ci0JCVN0cmluZyBjb21wdXRlZFJlZmVyZW5jZXMgPSByZWZlcmVuY2VzLnRvU3RyaW5nKCk7Ci0JCWJvb2xlYW4gY2hlY2sgPSBjb21wdXRlZFJlZmVyZW5jZXMuaW5kZXhPZigidHlwZVJlZi9BYnN0cmFjdEJcbnJlZi9wMVxucmVmL0Fic3RyYWN0QlxubWV0aG9kUmVmL2luaXQvMCIpID49IDA7Ci0JCWlmICghY2hlY2spewotCQkJU3lzdGVtLm91dC5wcmludGxuKGNvbXB1dGVkUmVmZXJlbmNlcyk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiZGlkIG5vdCBiaW5kICduZXcgWigpLmluaXQoKScgdG8gQWJzdHJhY3RCLmluaXQoKSciLCBjaGVjayk7Ci19Ci0gLyoKLSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNTExCi0gKiB2YXJpYW50IC0gYXBwbGljYWJsZSBlcnJvciBkaWFnbm9zaXMKLSAqLwotcHVibGljIHZvaWQgdGVzdDIyKCkgewotCi0JdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkicDEvVC5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOwlcbiIrCi0JCQkiaW50ZXJmYWNlIElJIHt9CVxuIisKLQkJCSJjbGFzcyBUVCB7CVxuIisKLQkJCSIJdm9pZCBmb28oYm9vbGVhbiBiKSB7fQlcbiIrCi0JCQkiCXZvaWQgZm9vKGludCBpLCBib29sZWFuIGIpIHt9CVxuIisKLQkJCSIJdm9pZCBmb28oU3RyaW5nIHMpIHt9CVxuIisKLQkJCSJ9CVxuIisKLQkJCSJwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVCBpbXBsZW1lbnRzIElJIHsJXG4iKwotCQkJIgl2b2lkIGZvbyhpbnQgaSkge30JXG4iKwotCQkJIgl2b2lkIGJhcigpIHsJXG4iKwotCQkJIgkJbmV3IFRUKCkgewlcbiIrCi0JCQkiCQkJewlcbiIrCi0JCQkiCQkJCWZvbygwKTsgLy8gc2hvdWxkIHNheSB0aGF0IGZvbyhpbnQsIGJvb2xlYW4pIGlzbid0IGFwcGxpY2FibGUJXG4iKwotCQkJIgkJCX0JXG4iKwotCQkJIgkJfTsJXG4iKwotCQkJIgl9CVxuIisKLQkJCSIJdm9pZCBib28oKSB7CVxuIisKLQkJCSIJCW5ldyBUVCgpIHsJXG4iKwotCQkJIgkJCXsJXG4iKwotCQkJIgkJCQlmb28odHJ1ZSk7IC8vIHNob3VsZCBjb21wbGFpbiBhbWJpZ3VpdHkJXG4iKwotCQkJIgkJCX0JXG4iKwotCQkJIgkJfTsJXG4iKwotCQkJIgl9CVxuIisKLQkJCSJ9IAlcbiIKLQkJfSwKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjEuIEVSUk9SIGluIHAxXFxULmphdmEgKGF0IGxpbmUgMTMpXG4iICsgCi0JCSIJZm9vKDApOyAvLyBzaG91bGQgc2F5IHRoYXQgZm9vKGludCwgYm9vbGVhbikgaXNuXCd0IGFwcGxpY2FibGUJXG4iICsgCi0JCSIJXl5eXG4iICsgCi0JCSJUaGUgbWV0aG9kIGZvbyhpbnQsIGJvb2xlYW4pIGluIHRoZSB0eXBlIFRUIGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChpbnQpXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIyLiBFUlJPUiBpbiBwMVxcVC5qYXZhIChhdCBsaW5lIDIwKVxuIiArIAotCQkiCWZvbyh0cnVlKTsgLy8gc2hvdWxkIGNvbXBsYWluIGFtYmlndWl0eQlcbiIgKyAKLQkJIgleXl5cbiIgKyAKLQkJIlRoZSBtZXRob2QgZm9vIGlzIGRlZmluZWQgaW4gYW4gaW5oZXJpdGVkIHR5cGUgYW5kIGFuIGVuY2xvc2luZyBzY29wZVxuIiArIAotCQkiLS0tLS0tLS0tLVxuIik7Ci19Ci0gICAKLSAvKgotICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE1MTEKLSAqIHZhcmlhbnQgLSBhcHBsaWNhYmxlIGVycm9yIGRpYWdub3NpcwotICovCi1wdWJsaWMgdm9pZCB0ZXN0MjMoKSB7Ci0KLQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJwMS9ULmphdmEiLAotCQkJInBhY2thZ2UgcDE7CVxuIisKLQkJCSJpbnRlcmZhY2UgSUkge30JXG4iKwotCQkJImFic3RyYWN0IGNsYXNzIFRUIHsJXG4iKwkJLy8gMjU5K0FCU1RSQUNUCi0JCQkiCXZvaWQgZm9vKGJvb2xlYW4gYikge30JXG4iKwotCQkJIgl2b2lkIGZvbyhpbnQgaSwgYm9vbGVhbiBiKSB7fQlcbiIrCi0JCQkiCXZvaWQgZm9vKFN0cmluZyBzKSB7fQlcbiIrCi0JCQkifQlcbiIrCi0JCQkicHVibGljIGFic3RyYWN0IGNsYXNzIFQgaW1wbGVtZW50cyBJSSB7CVxuIisKLQkJCSIJdm9pZCBmb28oaW50IGkpIHt9CVxuIisKLQkJCSIJdm9pZCBiYXIoKSB7CVxuIisKLQkJCSIJCW5ldyBUVCgpIHsJXG4iKwotCQkJIgkJCXsJXG4iKwotCQkJIgkJCQlmb28oMCk7IC8vIHNob3VsZCBzYXkgdGhhdCBmb28oaW50LCBib29sZWFuKSBpc24ndCBhcHBsaWNhYmxlCVxuIisKLQkJCSIJCQl9CVxuIisKLQkJCSIJCX07CVxuIisKLQkJCSIJfQlcbiIrCi0JCQkiCXZvaWQgYm9vKCkgewlcbiIrCi0JCQkiCQluZXcgVFQoKSB7CVxuIisKLQkJCSIJCQl7CVxuIisKLQkJCSIJCQkJZm9vKHRydWUpOyAvLyBzaG91bGQgY29tcGxhaW4gYW1iaWd1aXR5CVxuIisKLQkJCSIJCQl9CVxuIisKLQkJCSIJCX07CVxuIisKLQkJCSIJfQlcbiIrCi0JCQkifSAJXG4iCi0JCX0sCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIxLiBFUlJPUiBpbiBwMVxcVC5qYXZhIChhdCBsaW5lIDEzKVxuIiArIAotCQkiCWZvbygwKTsgLy8gc2hvdWxkIHNheSB0aGF0IGZvbyhpbnQsIGJvb2xlYW4pIGlzblwndCBhcHBsaWNhYmxlCVxuIiArIAotCQkiCV5eXlxuIiArIAotCQkiVGhlIG1ldGhvZCBmb28oaW50LCBib29sZWFuKSBpbiB0aGUgdHlwZSBUVCBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoaW50KVxuIiArIAotCQkiLS0tLS0tLS0tLVxuIiArIAotCQkiMi4gRVJST1IgaW4gcDFcXFQuamF2YSAoYXQgbGluZSAyMClcbiIgKyAKLQkJIglmb28odHJ1ZSk7IC8vIHNob3VsZCBjb21wbGFpbiBhbWJpZ3VpdHkJXG4iICsgCi0JCSIJXl5eXG4iICsgCi0JCSJUaGUgbWV0aG9kIGZvbyBpcyBkZWZpbmVkIGluIGFuIGluaGVyaXRlZCB0eXBlIGFuZCBhbiBlbmNsb3Npbmcgc2NvcGVcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIpOwotfQotLyoKLSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNTExCi0gKiB2YXJpYW50IC0gYXBwbGljYWJsZSBlcnJvciBkaWFnbm9zaXMKLSAqLwotcHVibGljIHZvaWQgdGVzdDI0KCkgewotCi0JdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkicDEvWC5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOwlcbiIrCi0JCQkiaW50ZXJmYWNlIElJIHt9CVxuIisKLQkJCSJhYnN0cmFjdCBjbGFzcyBUIGltcGxlbWVudHMgSUkgewlcbiIrCi0JCQkiCXZvaWQgZm9vKGJvb2xlYW4gYikge30JXG4iKwotCQkJIgl2b2lkIGZvbyhpbnQgaSwgYm9vbGVhbiBiKSB7fQlcbiIrCi0JCQkifQlcbiIrCi0JCQkiYWJzdHJhY3QgY2xhc3MgVFQgaW1wbGVtZW50cyBJSSB7CVxuIisKLQkJCSIJdm9pZCBmb28oYm9vbGVhbiBiKSB7fQlcbiIrCi0JCQkifQlcbiIrCi0JCQkicHVibGljIGNsYXNzIFggewlcbiIrCi0JCQkiCXZvaWQgZm9vKGludCBpKSB7fQlcbiIrCi0JCQkiCXZvaWQgYmFyKCkgewlcbiIrCi0JCQkiCQluZXcgVCgpIHsJXG4iKwotCQkJIgkJCXsJXG4iKwotCQkJIgkJCQlmb28oMCk7IC8vIGphdmFjIHNheXMgZm9vIGNhbm5vdCBiZSByZXNvbHZlZCBiZWNhdXNlIG9mIG11bHRpcGxlIG1hdGNoZXMJXG4iKwotCQkJIgkJCX0JXG4iKwotCQkJIgkJfTsJXG4iKwotCQkJIgl9CVxuIisKLQkJCSIJdm9pZCBiYXIyKCkgewlcbiIrCi0JCQkiCQluZXcgVFQoKSB7CVxuIisKLQkJCSIJCQl7CVxuIisKLQkJCSIJCQkJZm9vKDApOyAvLyBzaG91bGQgc2F5IHRoYXQgZm9vKGJvb2xlYW4pIGlzbid0IGFwcGxpY2FibGUJXG4iKwotCQkJIgkJCX0JXG4iKwotCQkJIgkJfTsJXG4iKwotCQkJIgl9CVxuIisKLQkJCSIJdm9pZCBib28oKSB7CVxuIisKLQkJCSIJCW5ldyBUKCkgewlcbiIrCi0JCQkiCQkJewlcbiIrCi0JCQkiCQkJCWZvbyh0cnVlKTsgLy8gc2hvdWxkIGNvbXBsYWluIGFtYmlndWl0eQlcbiIrCi0JCQkiCQkJfQlcbiIrCi0JCQkiCQl9OwlcbiIrCi0JCQkiCX0JXG4iKwotCQkJIn0JXG4iCi0JCX0sCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIxLiBFUlJPUiBpbiBwMVxcWC5qYXZhIChhdCBsaW5lIDE1KVxuIiArIAotCQkiCWZvbygwKTsgLy8gamF2YWMgc2F5cyBmb28gY2Fubm90IGJlIHJlc29sdmVkIGJlY2F1c2Ugb2YgbXVsdGlwbGUgbWF0Y2hlcwlcbiIgKyAKLQkJIgleXl5cbiIgKyAKLQkJIlRoZSBtZXRob2QgZm9vKGludCwgYm9vbGVhbikgaW4gdGhlIHR5cGUgVCBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoaW50KVxuIiArIAotCQkiLS0tLS0tLS0tLVxuIiArIAotCQkiMi4gRVJST1IgaW4gcDFcXFguamF2YSAoYXQgbGluZSAyMilcbiIgKyAKLQkJIglmb28oMCk7IC8vIHNob3VsZCBzYXkgdGhhdCBmb28oYm9vbGVhbikgaXNuXCd0IGFwcGxpY2FibGUJXG4iICsgCi0JCSIJXl5eXG4iICsgCi0JCSJUaGUgbWV0aG9kIGZvbyhib29sZWFuKSBpbiB0aGUgdHlwZSBUVCBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoaW50KVxuIiArIAotCQkiLS0tLS0tLS0tLVxuIiArIAotCQkiMy4gRVJST1IgaW4gcDFcXFguamF2YSAoYXQgbGluZSAyOSlcbiIgKyAKLQkJIglmb28odHJ1ZSk7IC8vIHNob3VsZCBjb21wbGFpbiBhbWJpZ3VpdHkJXG4iICsgCi0JCSIJXl5eXG4iICsgCi0JCSJUaGUgbWV0aG9kIGZvbyBpcyBkZWZpbmVkIGluIGFuIGluaGVyaXRlZCB0eXBlIGFuZCBhbiBlbmNsb3Npbmcgc2NvcGVcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIpOwotfQotLyoKLSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNTExCi0gKiB2YXJpYW50IC0gYXBwbGljYWJsZSBlcnJvciBkaWFnbm9zaXMgKG5vIG1hdHRlciBpZiBzdXBlciBpcyBhYnN0cmFjdCBvciBub3QpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QyNSgpIHsKLQotCXRoaXMucnVuTmVnYXRpdmVUZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJInAxL1guamF2YSIsCi0JCQkicGFja2FnZSBwMTsJXG4iKwotCQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgQWJzdHJhY3RZIHsJXG4iKwotCQkJIgl2b2lkIGJhcigpewlcbiIrCi0JCQkiCQlpbml0KFwiaGVsbG9cIik7CVxuIisKLQkJCSIJfQkJXG4iKwotCQkJIn0JXG4iKwotCQkJImFic3RyYWN0IGNsYXNzIEFic3RyYWN0WSBpbXBsZW1lbnRzIEkgewlcbiIrCi0JCQkifQlcbiIrCi0JCQkiaW50ZXJmYWNlIEkgewlcbiIrCi0JCQkiCXZvaWQgaW5pdChTdHJpbmcgcywgaW50IGkpOwlcbiIrCi0JCQkifQlcbiIKLQkJfSwKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjEuIEVSUk9SIGluIHAxXFxYLmphdmEgKGF0IGxpbmUgMilcbiIgKyAKLQkJIglwdWJsaWMgY2xhc3MgWCBleHRlbmRzIEFic3RyYWN0WSB7CVxuIiArIAotCQkiCSAgICAgICAgICAgICBeXG4iICsgCi0JCSJDbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgaW5oZXJpdGVkIGFic3RyYWN0IG1ldGhvZCBJLmluaXQoU3RyaW5nLCBpbnQpXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIyLiBFUlJPUiBpbiBwMVxcWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCi0JCSIJaW5pdChcImhlbGxvXCIpOwlcbiIgKyAKLQkJIgleXl5eXG4iICsgCi0JCSJUaGUgbWV0aG9kIGluaXQoU3RyaW5nLCBpbnQpIGluIHRoZSB0eXBlIEFic3RyYWN0WSBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoU3RyaW5nKVxuIiArIAotCQkiLS0tLS0tLS0tLVxuIik7Ci19Ci0KLS8qCi0gKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTUxMQotICogdmFyaWFudCAtIGFwcGxpY2FibGUgZXJyb3IgZGlhZ25vc2lzIChubyBtYXR0ZXIgaWYgc3VwZXIgaXMgYWJzdHJhY3Qgb3Igbm90KQotICovCi1wdWJsaWMgdm9pZCB0ZXN0MjYoKSB7Ci0KLQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJwMS9YLmphdmEiLAotCQkJInBhY2thZ2UgcDE7CVxuIisKLQkJCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIEFic3RyYWN0WSB7CVxuIisKLQkJCSIJdm9pZCBiYXIoKXsJXG4iKwotCQkJIgkJaW5pdChcImhlbGxvXCIpOwlcbiIrCi0JCQkiCX0JCVxuIisKLQkJCSJ9CVxuIisKLQkJCSJjbGFzcyBBYnN0cmFjdFkgaW1wbGVtZW50cyBJIHsJXG4iKwotCQkJIn0JXG4iKwotCQkJImludGVyZmFjZSBJIHsJXG4iKwotCQkJIgl2b2lkIGluaXQoU3RyaW5nIHMsIGludCBpKTsJXG4iKwotCQkJIn0JXG4iCi0JCX0sCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIxLiBFUlJPUiBpbiBwMVxcWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCi0JCSIJaW5pdChcImhlbGxvXCIpOwlcbiIgKyAKLQkJIgleXl5eXG4iICsgCi0JCSJUaGUgbWV0aG9kIGluaXQoU3RyaW5nLCBpbnQpIGluIHRoZSB0eXBlIEkgaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKFN0cmluZylcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjIuIEVSUk9SIGluIHAxXFxYLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKLQkJIgljbGFzcyBBYnN0cmFjdFkgaW1wbGVtZW50cyBJIHsJXG4iICsgCi0JCSIJICAgICAgXl5eXl5eXl5eXG4iICsgCi0JCSJDbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgaW5oZXJpdGVkIGFic3RyYWN0IG1ldGhvZCBJLmluaXQoU3RyaW5nLCBpbnQpXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iCi0pOwotfQotCi0vKgotICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE5MjIKLSAqIGNvZGUgZ2VuIGZvciBmb3IoO2ZhbHNlOy4uLikKLSAqLwotcHVibGljIHZvaWQgdGVzdDI3KCkgewotCi0JdGhpcy5ydW5Db25mb3JtVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJwMS9YLmphdmEiLAotCQkJInBhY2thZ2UgcDE7CVxuIisKLQkJCSJwdWJsaWMgY2xhc3MgWCB7CVxuIisKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndW1lbnRzKSB7CVxuIisKLQkJCSIJCWZvciAoO2ZhbHNlO3AoKSk7CVxuIisKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7CVxuIisKLQkJCSIJfQlcbiIrCi0JCQkiCXN0YXRpYyB2b2lkIHAoKXsJXG4iKwotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKFwiRkFJTEVEXCIpOwlcbiIrCi0JCQkiCX0JXG4iKwotCQkJIn0JXG4iCi0JCX0sCi0JCSJTVUNDRVNTIik7Ci19Ci0vKgotICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI0NDUKLSAqIHNob3VsZCByZXBvcnQgdW5yZWFjaGFibGUgZW1wdHkgc3RhdGVtZW50Ci0gKi8KLXB1YmxpYyB2b2lkIHRlc3QyOCgpIHsKLQotCXRoaXMucnVuQ29uZm9ybVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkicDEvWC5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOwlcbiIgKwotCQkJImludGVyZmFjZSBGb29JbnRlcmZhY2UgewlcbiIgKwotCQkJIglwdWJsaWMgYm9vbGVhbiBmb28oaW50IGEpOwlcbiIgKwotCQkJIglwdWJsaWMgYm9vbGVhbiBiYXIoaW50IGEpOwlcbiIgKwotCQkJIn0JXG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIFogewlcbiIgKwotCQkJIglwdWJsaWMgYm9vbGVhbiBmb28oaW50IGEpeyByZXR1cm4gdHJ1ZTsgfQlcbiIgKwotCQkJIglwdWJsaWMgYm9vbGVhbiBiYXIoaW50IGEpeyByZXR1cm4gZmFsc2U7IH0JXG4iICsKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndW1lbnRzKSB7CVxuIisKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihuZXcgWCgpLnRlc3QoMCkpOwlcbiIrCi0JCQkiCX0JXG4iICsKLQkJCSJ9XG4iICsKLQkJCSJhYnN0cmFjdCBjbGFzcyBaIGltcGxlbWVudHMgRm9vSW50ZXJmYWNlIHsJXG4iICsKLQkJCSIJcHVibGljIGJvb2xlYW4gZm9vKGludCBhLCBpbnQgYikgewlcbiIgKwotCQkJIgkJcmV0dXJuIHRydWU7CVxuIiArCi0JCQkiCX0JXG4iICsKLQkJCSIJcHVibGljIFN0cmluZyB0ZXN0KGludCBhKSB7CVxuIiArCi0JCQkiCQlib29sZWFuIHJlc3VsdCA9IGZvbyhhKTsgXG4iICsKLQkJCSIJCWlmIChyZXN1bHQpCVxuIiArCi0JCQkiCQkJcmV0dXJuIFwiU1VDQ0VTU1wiOwlcbiIgKwotCQkJIgkJZWxzZQlcbiIgKwotCQkJIgkJCXJldHVybiBcIkZBSUxFRFwiOwlcbiIgKwotCQkJIgl9CVxuIiArCi0JCQkifQlcbiIKLQkJfSwKLQkJIlNVQ0NFU1MiKTsKLX0KLS8qCi0gKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTU4MAotICogdmVyaWZ5IGVycm9yIG9uIHF1YWxpZmllZCBuYW1lIHJlZiBpbiAxLjQKLSAqLwotcHVibGljIHZvaWQgdGVzdDI5KCkgewotCi0JdGhpcy5ydW5Db25mb3JtVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJwL1guamF2YSIsCi0JCQkicGFja2FnZSBwOwlcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBYIHsJXG4iICsKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewlcbiIgKwotCQkJIgkJbmV3IFgoKTsJXG4iICsKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7CVxuIiArCi0JCQkiCX0gIAlcbiIgKwotCQkJIglXb29mIHdvb2ZfMTsJXG4iICsKLQkJCSIJcHVibGljIGNsYXNzIEhvbmsgewlcbiIgKwotCQkJIgkJSW50ZWdlciBob25rczsJXG4iICsKLQkJCSIJfQlcbiIgKwotCQkJIglwdWJsaWMgY2xhc3MgTWVvdyB7CVxuIiArCi0JCQkiCQlIb25rIGhvbmtfMTsJXG4iICsKLQkJCSIJfQlcbiIgKwotCQkJIglwdWJsaWMgY2xhc3MgV29vZiB7CVxuIiArCi0JCQkiCQlNZW93IG1lb3dfMTsJXG4iICsKLQkJCSIJfQlcbiIgKwotCQkJIglwdWJsaWMgdm9pZCBzZXRIb25rcyhpbnQgbnVtKSB7CVxuIiArCi0JCQkiCQkvLyBUaGlzIGlzIHRoZSBsaW5lIHRoYXQgY2F1c2VzIHRoZSBWZXJpZnlFcnJvcglcbiIgKwotCQkJIgkJd29vZl8xLm1lb3dfMS5ob25rXzEuaG9ua3MgPSBuZXcgSW50ZWdlcihudW0pOwlcbiIgKwotCQkJIgkJLy8gSGVyZSBpcyBlcXVpdmFsZW50IGNvZGUgdGhhdCBkb2VzIG5vdCBjYXVzZSB0aGUgZXJyb3IuCVxuIiArCi0JCQkiCQkvLyAgSG9uayBoID0gd29vZl8xLm1vb18xLm1lb3dfMS5ob25rXzE7CVxuIiArCi0JCQkiCQkvLyAgaC5ob25rcyA9IG5ldyBJbnRlZ2VyKG51bSk7CVxuIiArCi0JCQkiCX0JXG4iICsKLQkJCSJ9CVxuIgotCQl9LAotCQkiU1VDQ0VTUyIpOwotfQotLyoKLSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNTgwCi0gKiAxLjQgc2lnbmFscyBpbnZvY2F0aW9ucyBvZiBub24tdmlzaWJsZSBhYnN0cmFjdCBwcm90ZWN0ZWQgbWV0aG9kIGltcGxlbWVudGF0aW9ucy4KLSAqLwotcHVibGljIHZvaWQgdGVzdDMwKCkgewotCQotCXRoaXMucnVuTmVnYXRpdmVUZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJInAvWC5qYXZhIiwKLQkJCSJwYWNrYWdlIHA7CVxuIiArCi0JCQkicHVibGljIGNsYXNzIFggewlcbiIgKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKXsJXG4iICsKLQkJCSIJCW5ldyBxLlgyKCkuZm9vKFwiU3RyaW5nXCIpOwlcbiIgKwotCQkJIgkJbmV3IHEuWDIoKS5iYXIoXCJTdHJpbmdcIik7CVxuIiArCi0JCQkiCQluZXcgcS5YMigpLmJhcmJhcihcIlN0cmluZ1wiKTsJXG4iICsKLQkJCSIJCW5ldyBxLlgyKCkuYmF6KFwiU3RyaW5nXCIpOwlcbiIgKwotCQkJIgl9CVxuIiArCi0JCQkifQlcbiIsCi0JCQkKLQkJCSJwL1gxLmphdmEiLAotCQkJInBhY2thZ2UgcDsJXG4iICsKLQkJCSJwdWJsaWMgYWJzdHJhY3QgY2xhc3MgWDEgewlcbiIgKwotCQkJIglwcm90ZWN0ZWQgdm9pZCBmb28oT2JqZWN0IG8pewlTeXN0ZW0ub3V0LnByaW50bG4oXCJYMS5mb28oT2JqZWN0KVwiKTsgfQlcbiIgKwotCQkJIglwcm90ZWN0ZWQgdm9pZCBiYXIoT2JqZWN0IG8pewlTeXN0ZW0ub3V0LnByaW50bG4oXCJYMS5iYXIoT2JqZWN0KVwiKTsgfQlcbiIgKwotCQkJIgl2b2lkIGJhcmJhcihPYmplY3Qgbyl7CVN5c3RlbS5vdXQucHJpbnRsbihcIlgxLmJhcmJhcihPYmplY3QpXCIpOyB9CVxuIiArCi0JCQkiCXByb3RlY3RlZCB2b2lkIGJheihPYmplY3QgbykgeyBTeXN0ZW0ub3V0LnByaW50bG4oXCJYMS5iYXooT2JqZWN0KVwiKTsgfQlcbiIgKwotCQkJIn0JXG4iLAotCQkJCi0JCQkicS9YMi5qYXZhIiwKLQkJCSJwYWNrYWdlIHE7CVxuIiArCi0JCQkicHVibGljIGNsYXNzIFgyIGV4dGVuZHMgcC5YMSB7CVxuIiArCi0JCQkiCXByb3RlY3RlZCB2b2lkIGZvbyhpbnQgaSkgeyBTeXN0ZW0ub3V0LnByaW50bG4oXCJYMi5mb28oaW50KVwiKTsgfQlcbiIgKwotCQkJIglwcm90ZWN0ZWQgdm9pZCBiYXIoT2JqZWN0IG8pIHsgU3lzdGVtLm91dC5wcmludGxuKFwiWDIuYmFyKE9iamVjdClcIik7IH0JXG4iICsKLQkJCSIJdm9pZCBiYXJiYXIoT2JqZWN0IG8pewlTeXN0ZW0ub3V0LnByaW50bG4oXCJYMi5iYXJiYXIoT2JqZWN0KVwiKTsgfQlcbiIgKwotCQkJIglwcm90ZWN0ZWQgdm9pZCBiYXooU3RyaW5nIHMpIHsJU3lzdGVtLm91dC5wcmludGxuKFwiWDIuYmF6KFN0cmluZylcIik7IH0JXG4iICsKLQkJCSJ9CVxuIiwKLQkJfSwKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjEuIEVSUk9SIGluIHBcXFguamF2YSAoYXQgbGluZSA2KVxuIiArIAotCQkiCW5ldyBxLlgyKCkuYmFyYmFyKFwiU3RyaW5nXCIpOwlcbiIgKyAKLQkJIgkgICAgICAgICAgIF5eXl5eXlxuIiArIAotCQkiVGhlIG1ldGhvZCBiYXJiYXIoT2JqZWN0KSBmcm9tIHRoZSB0eXBlIFgyIGlzIG5vdCB2aXNpYmxlXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIxLiBXQVJOSU5HIGluIHFcXFgyLmphdmEgKGF0IGxpbmUgNSlcbiIgKyAKLQkJIgl2b2lkIGJhcmJhcihPYmplY3Qgbyl7CVN5c3RlbS5vdXQucHJpbnRsbihcIlgyLmJhcmJhcihPYmplY3QpXCIpOyB9CVxuIiArIAotCQkiCSAgICAgXl5eXl5eXl5eXl5eXl5eXlxuIiArIAotCQkiVGhlIG1ldGhvZCBYMi5iYXJiYXIoT2JqZWN0KSBkb2VzIG5vdCBvdmVycmlkZSB0aGUgaW5oZXJpdGVkIG1ldGhvZCBmcm9tIFgxIHNpbmNlIGl0IGlzIHByaXZhdGUgdG8gYSBkaWZmZXJlbnQgcGFja2FnZS5cbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIpOwotfQotCi0vKgotICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE1ODAKLSAqIDEuNCBzaWduYWxzIGludm9jYXRpb25zIG9mIG5vbi12aXNpYmxlIGFic3RyYWN0IHByb3RlY3RlZCBtZXRob2QgaW1wbGVtZW50YXRpb25zLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MzEoKSB7Ci0JCi0JdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkicC9YLmphdmEiLAotCQkJInBhY2thZ2UgcDsJXG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIHEuWDIgewlcbiIgKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKXsJXG4iICsKLQkJCSIJCQluZXcgWCgpLmRvU29tZXRoaW5nKCk7CVxuIiArCi0JCQkiCX0JXG4iICsKLQkJCSIJdm9pZCBkb1NvbWV0aGluZygpewlcbiIgKwotCQkJIgkJZm9vKFwiU3RyaW5nXCIpOwlcbiIgKwotCQkJIgkJYmFyKFwiU3RyaW5nXCIpOwlcbiIgKwotCQkJIgkJYmFyYmFyKFwiU3RyaW5nXCIpOwlcbiIgKwotCQkJIgkJYmF6KFwiU3RyaW5nXCIpOwlcbiIgKwotCQkJIgl9CVxuIiArCi0JCQkifQlcbiIsCi0JCQkKLQkJCSJwL1gxLmphdmEiLAotCQkJInBhY2thZ2UgcDsJXG4iICsKLQkJCSJwdWJsaWMgYWJzdHJhY3QgY2xhc3MgWDEgewlcbiIgKwotCQkJIglwcm90ZWN0ZWQgdm9pZCBmb28oT2JqZWN0IG8pewlTeXN0ZW0ub3V0LnByaW50bG4oXCJYMS5mb28oT2JqZWN0KVwiKTsgfQlcbiIgKwotCQkJIglwcm90ZWN0ZWQgdm9pZCBiYXIoT2JqZWN0IG8pewlTeXN0ZW0ub3V0LnByaW50bG4oXCJYMS5iYXIoT2JqZWN0KVwiKTsgfQlcbiIgKwotCQkJIgl2b2lkIGJhcmJhcihPYmplY3Qgbyl7CVN5c3RlbS5vdXQucHJpbnRsbihcIlgxLmJhcmJhcihPYmplY3QpXCIpOyB9CVxuIiArCi0JCQkiCXByb3RlY3RlZCB2b2lkIGJheihPYmplY3QgbykgeyBTeXN0ZW0ub3V0LnByaW50bG4oXCJYMS5iYXooT2JqZWN0KVwiKTsgfQlcbiIgKwotCQkJIn0JXG4iLAotCQkJCi0JCQkicS9YMi5qYXZhIiwKLQkJCSJwYWNrYWdlIHE7CVxuIiArCi0JCQkicHVibGljIGNsYXNzIFgyIGV4dGVuZHMgcC5YMSB7CVxuIiArCi0JCQkiCXByb3RlY3RlZCB2b2lkIGZvbyhpbnQgaSkgeyBTeXN0ZW0ub3V0LnByaW50bG4oXCJYMi5mb28oaW50KVwiKTsgfQlcbiIgKwotCQkJIglwcm90ZWN0ZWQgdm9pZCBiYXIoT2JqZWN0IG8pIHsgU3lzdGVtLm91dC5wcmludGxuKFwiWDIuYmFyKE9iamVjdClcIik7IH0JXG4iICsKLQkJCSIJdm9pZCBiYXJiYXIoT2JqZWN0IG8pewlTeXN0ZW0ub3V0LnByaW50bG4oXCJYMi5iYXJiYXIoT2JqZWN0KVwiKTsgfQlcbiIgKwotCQkJIglwcm90ZWN0ZWQgdm9pZCBiYXooU3RyaW5nIHMpIHsJU3lzdGVtLm91dC5wcmludGxuKFwiWDIuYmF6KFN0cmluZylcIik7IH0JXG4iICsKLQkJCSJ9CVxuIiwKLQkJfSwKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjEuIEVSUk9SIGluIHBcXFguamF2YSAoYXQgbGluZSA5KVxuIiArIAotCQkiCWJhcmJhcihcIlN0cmluZ1wiKTsJXG4iICsgCi0JCSIJXl5eXl5eXG4iICsgCi0JCSJUaGUgbWV0aG9kIGJhcmJhcihPYmplY3QpIGZyb20gdGhlIHR5cGUgWDIgaXMgbm90IHZpc2libGVcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjEuIFdBUk5JTkcgaW4gcVxcWDIuamF2YSAoYXQgbGluZSA1KVxuIiArIAotCQkiCXZvaWQgYmFyYmFyKE9iamVjdCBvKXsJU3lzdGVtLm91dC5wcmludGxuKFwiWDIuYmFyYmFyKE9iamVjdClcIik7IH0JXG4iICsgCi0JCSIJICAgICBeXl5eXl5eXl5eXl5eXl5eXG4iICsgCi0JCSJUaGUgbWV0aG9kIFgyLmJhcmJhcihPYmplY3QpIGRvZXMgbm90IG92ZXJyaWRlIHRoZSBpbmhlcml0ZWQgbWV0aG9kIGZyb20gWDEgc2luY2UgaXQgaXMgcHJpdmF0ZSB0byBhIGRpZmZlcmVudCBwYWNrYWdlLlxuIiArIAotCQkiLS0tLS0tLS0tLVxuIgotKTsKLX0KLQkJCQotLyoKLSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNTgwCi0gKiAxLjQgc2lnbmFscyBpbnZvY2F0aW9ucyBvZiBub24tdmlzaWJsZSBhYnN0cmFjdCBwcm90ZWN0ZWQgZmllbGQgaW1wbGVtZW50YXRpb25zLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MzIoKSB7Ci0JCi0JdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkicC9YLmphdmEiLAotCQkJInBhY2thZ2UgcDsJXG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgWCB7CVxuIiArCi0JCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpewlcbiIgKwotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKG5ldyBxLlgyKCkuZm9vKTsJXG4iICsKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihuZXcgcS5YMigpLmJhcik7CVxuIiArCi0JCQkiCX0JXG4iICsKLQkJCSJ9CVxuIiwKLQkJCQotCQkJInAvWDEuamF2YSIsCi0JCQkicGFja2FnZSBwOwlcbiIgKwotCQkJInB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYMSB7CVxuIiArCi0JCQkiCXByb3RlY3RlZCBTdHJpbmcgZm9vID0gXCJYMS5mb29cIjsgCVxuIiArCi0JCQkiCVN0cmluZyBiYXIgPSBcIlgxLmJhclwiOwlcbiIgKwotCQkJIn0JXG4iLAotCQkJCi0JCQkicS9YMi5qYXZhIiwKLQkJCSJwYWNrYWdlIHE7CVxuIiArCi0JCQkicHVibGljIGNsYXNzIFgyIGV4dGVuZHMgcC5YMSB7CVxuIiArCi0JCQkiCXByb3RlY3RlZCBTdHJpbmcgZm9vID0gXCJYMi5mb29cIjsJXG4iICsKLQkJCSIJU3RyaW5nIGJhciA9IFwiWDIuYmFyXCI7CVxuIiArCi0JCQkifQlcbiIsCi0JCX0sCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIxLiBFUlJPUiBpbiBwXFxYLmphdmEgKGF0IGxpbmUgNClcbiIgKyAKLQkJIglTeXN0ZW0ub3V0LnByaW50bG4obmV3IHEuWDIoKS5mb28pOwlcbiIgKyAKLQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5cbiIgKyAKLQkJIlRoZSBmaWVsZCBmb28gaXMgbm90IHZpc2libGVcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjIuIEVSUk9SIGluIHBcXFguamF2YSAoYXQgbGluZSA1KVxuIiArIAotCQkiCVN5c3RlbS5vdXQucHJpbnRsbihuZXcgcS5YMigpLmJhcik7CVxuIiArIAotCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXlxuIiArIAotCQkiVGhlIGZpZWxkIGJhciBpcyBub3QgdmlzaWJsZVxuIiArIAotCQkiLS0tLS0tLS0tLVxuIik7Ci19Ci0vKgotICogSW5pdGlhbGl6YXRpb24gb2Ygc3ludGhldGljIGZpZWxkcyBwcmlvciB0byBzdXBlciBjb25zdHJ1Y3RvciBjYWxsCi0gKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzA3NQotICovCi1wdWJsaWMgdm9pZCB0ZXN0MzMoKSB7Ci0KLQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJIkEuamF2YSIsCi0JCQkicHVibGljIGNsYXNzIEEgewlcbiIrCi0JCQkiICBwdWJsaWMgaW50IG07CVxuIisKLQkJCSIgIHB1YmxpYyB2b2lkIHBwKCkgewlcbiIrCi0JCQkiICAgICBDIGMgPSBuZXcgQyg0KTsJXG4iKwotCQkJIiAgICAgU3lzdGVtLm91dC5wcmludGxuKGMuZ2V0KCkpOwlcbiIrCi0JCQkiICB9CVxuIisKLQkJCSIgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsJXG4iKwotCQkJIiAgICAgQSBhID0gbmV3IEEoKTsJXG4iKwotCQkJIgkgIHRyeSB7CVxuIisKLQkJCSIgICAgICAgYS5wcCgpOyAJXG4iKwotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKFwiU3ludGhldGljSW5pdCBCRUZPUkUgU3VwZXJDb25zdHJ1Y3RvckNhbGxcIik7CVxuIisKLQkJCSIJICB9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsJXG4iKwotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKFwiU3ludGhldGljSW5pdCBBRlRFUiBTdXBlckNvbnN0cnVjdG9yQ2FsbFwiKTsgLy8gc2hvdWxkIG5vIGxvbmdlciBvY2N1ciB3aXRoIHRhcmdldCAxLjQgXG4iKwotCQkJIgkgIH0JXG4iKwotCQkJIiAgfQlcbiIrCi0JCQkiICBjbGFzcyBDIGV4dGVuZHMgQiB7CVxuIisKLQkJCSIgICAgcHVibGljIEMoaW50IHgxKSB7CVxuIisKLQkJCSIgICAgICBzdXBlcih4MSk7ICAgIAlcbiIrCi0JCQkiICAgIH0JXG4iKwotCQkJIiAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KGludCB4MSkgewlcbiIrCi0JCQkiICAgICAgIHggPSBtICogeDE7IC8vIDwtIE5VTEwgUE9JTlRFUiBFWENFUFRJT04gYmVjYXVzZSBvZiBtCVxuIisKLQkJCSIgICAgfSAgCVxuIisKLQkJCSIgIH0JXG4iKwotCQkJIn0JXG4iKwotCQkJImNsYXNzIEIgewlcbiIrCi0JCQkiICBpbnQgeDsJXG4iKwotCQkJIiAgcHVibGljIEIoaW50IHgxKSB7CVxuIisKLQkJCSIgICAgaW5pdCh4MSk7CVxuIisKLQkJCSIgIH0JXG4iKwotCQkJIiAgcHJvdGVjdGVkIHZvaWQgaW5pdChpbnQgeDEpIHsJXG4iKwotCQkJIiAgICB4ICA9IHgxOwlcbiIrCi0JCQkiICB9CVxuIisKLQkJCSIgIHB1YmxpYyBpbnQgZ2V0KCkgewlcbiIrCi0JCQkiICAgIHJldHVybiB4OwlcbiIrCi0JCQkiICB9CVxuIisKLQkJCSJ9CVxuIgotCQl9LAotCQkiU3ludGhldGljSW5pdCBBRlRFUiBTdXBlckNvbnN0cnVjdG9yQ2FsbCIpOwotfQotCi0vKgotICogSW5pdGlhbGl6YXRpb24gb2Ygc3ludGhldGljIGZpZWxkcyBwcmlvciB0byBzdXBlciBjb25zdHJ1Y3RvciBjYWxsIC0gTlBFIGNoZWNrCi0gKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTE3NAotICovCi1wdWJsaWMgdm9pZCB0ZXN0MzQoKSB7Ci0KLQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJIlguamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFggewlcbiIrCi0JCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3VtZW50cykgewlcbiIrCi0JCQkiCQluZXcgWCgpLm5ldyBYMigpOwlcbiIrCi0JCQkiCX0JXG4iKwotCQkJIgljbGFzcyBYMSB7CVxuIisKLQkJCSIJCVgxKCl7CVxuIisKLQkJCSIJCQl0aGlzLmJheigpOwlcbiIrCi0JCQkiCQl9CVxuIisKLQkJCSIJCXZvaWQgYmF6KCkgewlcbiIrCi0JCQkiCQkJU3lzdGVtLm91dC5wcmludGxuKFwiLVgxLmJheigpXCIpOwlcbiIrCi0JCQkiCQl9CVxuIisKLQkJCSIJfQlcbiIrCi0JCQkiCWNsYXNzIFgyIGV4dGVuZHMgWDEgewlcbiIrCi0JCQkiCQl2b2lkIGJheigpIHsJXG4iKwotCQkJIgkJCVN5c3RlbS5vdXQucHJpbnQoWC50aGlzPT1udWxsID8gXCJYLnRoaXMgPT0gbnVsbFwiIDogXCJYLnRoaXMgIT0gbnVsbFwiKTsJXG4iKwotCQkJIgkJCVgxIHgxID0gWC50aGlzLm5ldyBYMSgpewlcbiIrCi0JCQkiCQkJCXZvaWQgYmF6KCl7CVxuIisKLQkJCSIJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihcIi1YJDEuYmF6KClcIik7CVxuIisKLQkJCSIJCQkJfQlcbiIrCi0JCQkiCQkJfTsJXG4iKwotCQkJIgkJfQlcbiIrCi0JCQkiCX0JXG4iKwotCQkJIn1cbiIsCi0JCX0sCi0JCSJYLnRoaXMgPT0gbnVsbC1YJDEuYmF6KCkiKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdDM1KCkgewotCXRoaXMucnVuQ29uZm9ybVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkvKiBwMS9YLmphdmEgKi8KLQkJCSJwMS9YLmphdmEiLAotCQkJInBhY2thZ2UgcDE7CVxuIisKLQkJCSJwdWJsaWMgY2xhc3MgWCB7CVxuIisKLQkJCSIJY2xhc3MgWSB7IFkoaW50IGkpe30gfQlcbiIrCi0JCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3VtZW50cykgewlcbiIrCi0JCQkiCQlpbnQgaSA9IDE7CVxuIiArCi0JCQkiCQl0cnkgewlcbiIgKwotCQkJIgkJCVggeCA9bnVsbDsJXG4iICsKLQkJCSIJCQl4Lm5ldyBZKCsraSk7CVxuIiArIAotCQkJIgkJCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1M6XCIraSk7CVxuIiArCi0JCQkiCQl9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpewlcbiIgKwotCQkJIgkJCVN5c3RlbS5vdXQucHJpbnRsbihcIkZBSUxFRFwiKTsJXG4iICsKLQkJCSIJCX0JXG4iICsKLQkJCSIJfQlcbiIrCi0JCQkifQlcbiIsCi0JCX0sCi0JCSJTVUNDRVNTOjIiCi0JKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdDM2KCkgewotCXRoaXMucnVuQ29uZm9ybVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkvKiBwMS9YLmphdmEgKi8KLQkJCSJwMS9YLmphdmEiLAotCQkJInBhY2thZ2UgcDE7CVxuIisKLQkJCSJwdWJsaWMgY2xhc3MgWCB7CVxuIisKLQkJCSIJY2xhc3MgWSB7fQlcbiIrCi0JCQkiCXN0YXRpYyBjbGFzcyBaIGV4dGVuZHMgWSB7CVxuIisKLQkJCSIJCVogKFggeCl7CVxuIisKLQkJCSIJCQl4LnN1cGVyKCk7CVxuIiArCi0JCQkiCQl9CQlcbiIrCi0JCQkiCX0JXG4iKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd1bWVudHMpIHsJXG4iKwotCQkJIgkJdHJ5IHsJXG4iICsKLQkJCSIJCQluZXcgWihudWxsKTsJXG4iICsKLQkJCSIJCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpOwlcbiIgKwotCQkJIgkJfSBjYXRjaChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKXsJXG4iICsKLQkJCSIJCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJGQUlMRURcIik7CVxuIiArCi0JCQkiCQl9CVxuIiArCi0JCQkiCX0JXG4iKwotCQkJIn0JXG4iLAotCQl9LAotCQkiU1VDQ0VTUyIKLQkpOwotfQotCi0vKgotICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDc0NAotICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzA5NgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MzcoKSB7Ci0JTWFwIGN1c3RvbU9wdGlvbnMgPSBnZXRDb21waWxlck9wdGlvbnMoKTsKLQljdXN0b21PcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1Rhc2tUYWdzLCAiVE9ETzoiKTsKLQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJwL1guamF2YSIsCi0JCQkicGFja2FnZSBwOwlcbiIrCi0JCQkicHVibGljIGNsYXNzIFgge1xuIisKLQkJCSJ9XG4iKwotCQkJIi8vIFRPRE86IHNvbWV0aGluZyIKLQkJfSwKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjEuIFdBUk5JTkcgaW4gcFxcWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCi0JCSIJLy8gVE9ETzogc29tZXRoaW5nXG4iICsgCi0JCSIJICAgXl5eXl5eXl5eXl5eXl5eXG4iICsgCi0JCSJUT0RPOiBzb21ldGhpbmdcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIsCi0JCW51bGwsCi0JCXRydWUsCi0JCWN1c3RvbU9wdGlvbnMpOwotfQotCi0vKgotICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDgzMwotICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzA5NgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MzgoKSB7Ci0JTWFwIGN1c3RvbU9wdGlvbnMgPSBnZXRDb21waWxlck9wdGlvbnMoKTsKLQljdXN0b21PcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1Rhc2tUYWdzLCAiVE9ETzoiKTsKLQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJYLmphdmEiLAotCQkJIi8vIFRPRE86IHNvbWV0aGluZyIKLQkJfSwKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjEuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDEpXG4iICsgCi0JCSIJLy8gVE9ETzogc29tZXRoaW5nXG4iICsgCi0JCSIJICAgXl5eXl5eXl5eXl5eXl5eXG4iICsgCi0JCSJUT0RPOiBzb21ldGhpbmdcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIsCi0JCW51bGwsCi0JCXRydWUsCi0JCWN1c3RvbU9wdGlvbnMpOwotfQotCi0vKgotICogdW5yZWFjaGFibGUgZW1wdHkgc3RhdGVtZW50L2Jsb2NrIG5vdCBkaWFnbm9zZWQgaW4gMS4zCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QzOSgpIHsKLQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJIlguamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFggewlcbiIgKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKXsJXG4iKwotCQkJIgkJZm9yICg7bnVsbCAhPSBudWxsOyk7CVxuIisKLQkJCSIJCWZvciAoO251bGwgIT0gbnVsbDspe30JXG4iKwotCQkJIgkJZm9yICg7ZmFsc2U7KTsJXG4iKwotCQkJIgkJZm9yICg7ZmFsc2U7KXt9CVxuIisKLQkJCSIJCXdoaWxlIChmYWxzZSk7CVxuIisKLQkJCSIJCXdoaWxlIChmYWxzZSl7fQlcbiIrCi0JCQkiCQlpZiAoZmFsc2UpIHt9IGVsc2Uge30JXG4iKwotCQkJIgkJaWYgKGZhbHNlKSA7IGVsc2UgOwkJCVxuIisKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7CVxuIiArCi0JCQkiCX0JXG4iKwotCQkJIn0JXG4iLAotCQl9LAotCQkiU1VDQ0VTUyIpOwotfQotCi0vLyBqbHM2LjUuNS4xIC0gc2ltcGxlIHR5cGUgbmFtZXMgZmF2b3IgbWVtYmVyIHR5cGUgb3ZlciB0b3BsZXZlbCBvbmUuCi0vL2h0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNzA1Ci1wdWJsaWMgdm9pZCB0ZXN0NDAoKSB7Ci0JdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkiWC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWCB7CVxuIisKLQkJCSIJaW50ZXJmYWNlIEhvbW9ueW0ge30JXG4iKyAvLyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgb3RoZXJzLgotCQkJIgl2b2lkIGZvbygpIHsJXG4iKwotCQkJIgkJY2xhc3MgSG9tb255bSBleHRlbmRzIFggewlcbiIrCi0JCQkiCQkJewlcbiIrCi0JCQkiCQkJCWNsYXNzIFkgZXh0ZW5kcyBIb21vbnltIHt9OwlcbiIrIC8vIFgkSG9tb255bQotCQkJIgkJCX0JXG4iKwotCQkJIgkJfQlcbiIrCi0JCQkiCX0JXG4iKwotCQkJIn0JXG4iKwotCQkJImNsYXNzIEhvbW9ueW0gZXh0ZW5kcyBYIHsJXG4iKwotCQkJIgl7CVxuIisKLQkJCSIJCWNsYXNzIFkgZXh0ZW5kcyBIb21vbnltIHt9OwlcbiIrIC8vIFgkSG9tb255bQotCQkJIgl9CVxuIisKLQkJCSJ9CVxuIgotCQl9LAotCQkiLS0tLS0tLS0tLVxuIiArIAotCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDYpXG4iICsgCi0JCSIJY2xhc3MgWSBleHRlbmRzIEhvbW9ueW0ge307CVxuIiArIAotCQkiCSAgICAgICAgICAgICAgICBeXl5eXl5eXG4iICsgCi0JCSJTdXBlcmNsYXNzIEhvbW9ueW0gaXMgZGVmaW5lZCBpbiBhbiBpbmhlcml0ZWQgdHlwZSBhbmQgYW4gZW5jbG9zaW5nIHNjb3BlXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTMpXG4iICsgCi0JCSIJY2xhc3MgWSBleHRlbmRzIEhvbW9ueW0ge307CVxuIiArIAotCQkiCSAgICAgICAgICAgICAgICBeXl5eXl5eXG4iICsgCi0JCSJTdXBlcmNsYXNzIEhvbW9ueW0gaXMgZGVmaW5lZCBpbiBhbiBpbmhlcml0ZWQgdHlwZSBhbmQgYW4gZW5jbG9zaW5nIHNjb3BlXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iKTsKLX0KLS8qCi0gKiAzMDg1NiAtIDEuNCBjb21wbGlhbnQgbW9kZSBzaG91bGQgY29uc2lkZXIgYWJzdHJhY3QgbWV0aG9kIG1hdGNoZXMKLSAqLwotcHVibGljIHZvaWQgdGVzdDQxKCkgewotCXRoaXMucnVuQ29uZm9ybVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkicC9YLmphdmEiLCAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCQkicGFja2FnZSBwOwlcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBYIHsJXG4iICsKLQkJCSIJdm9pZCBmb28oaW50IGksIGZsb2F0IGYpe30JXG4iICsKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewlcbiIgKwotCQkJIgkJcS5ZIHkgPSBuZXcgcS5ZLlooKTsJXG4iICsKLQkJCSIJCXkuYmFyKCk7CVxuIiArCi0JCQkiCX0JXG4iICsKLQkJCSJ9CVxuIiwKLQkJCSJxL1kuamF2YSIsIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJCSJwYWNrYWdlIHE7CVxuIiArCi0JCQkicHVibGljIGFic3RyYWN0IGNsYXNzIFkgZXh0ZW5kcyBwLlggaW1wbGVtZW50cyBJIHsJXG4iICsKLQkJCSIJcHVibGljIHZvaWQgYmFyKCl7ICAgZm9vKDEsIDIpOyB9CVxuIiArCi0JCQkiCXB1YmxpYyBzdGF0aWMgY2xhc3MgWiBleHRlbmRzIFkgewlcbiIgKwotCQkJIgkJcHVibGljIHZvaWQgZm9vKGZsb2F0IGYsIGludCBpKSB7CVxuIiArCi0JCQkiCQkJU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTsJXG4iICsKLQkJCSIJCX0JXG4iICsKLQkJCSIJfQlcbiIgKwotCQkJIn0JXG4iICsKLQkJCSJpbnRlcmZhY2UgSSB7CVxuIiArCi0JCQkiCXZvaWQgZm9vKGZsb2F0IGYsIGludCBpKTsJXG4iICsKLQkJCSJ9CVxuIiwKLQkJfSwKLQkJIlNVQ0NFU1MiKTsKLX0KLS8qCi0gKiB2YXJpYXRpb24gLSAzMDg1NiAtIDEuNCBjb21wbGlhbnQgbW9kZSBzaG91bGQgY29uc2lkZXIgYWJzdHJhY3QgbWV0aG9kIG1hdGNoZXMKLSAqLwotcHVibGljIHZvaWQgdGVzdDQyKCkgewotCXRoaXMucnVuQ29uZm9ybVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkicC9YLmphdmEiLCAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCQkicGFja2FnZSBwOwlcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgWDAgewlcbiIgKwotCQkJIgl2b2lkIGZvbyhpbnQgaSwgZmxvYXQgZil7fQlcbiIgKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CVxuIiArCi0JCQkiCQlxLlkgeSA9IG5ldyBxLlkuWigpOwlcbiIgKwotCQkJIgkJeS5iYXIoKTsJXG4iICsKLQkJCSIJfQlcbiIgKwotCQkJIn0JXG4iICsKLQkJCSJjbGFzcyBYMCB7CVxuIiArCi0JCQkiCXZvaWQgZm9vKGludCBpLCBkb3VibGUgZCl7fQlcbiIgKyAvLyBleHRyYSBtYXRjaAotCQkJIn0JXG4iLAotCQkJInEvWS5qYXZhIiwgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQkJInBhY2thZ2UgcTsJXG4iICsKLQkJCSJwdWJsaWMgYWJzdHJhY3QgY2xhc3MgWSBleHRlbmRzIHAuWCBpbXBsZW1lbnRzIEkgewlcbiIgKwotCQkJIglwdWJsaWMgdm9pZCBiYXIoKXsgICBmb28oMSwgMik7IH0JXG4iICsKLQkJCSIJcHVibGljIHN0YXRpYyBjbGFzcyBaIGV4dGVuZHMgWSB7CVxuIiArCi0JCQkiCQlwdWJsaWMgdm9pZCBmb28oZmxvYXQgZiwgaW50IGkpIHsJXG4iICsKLQkJCSIJCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpOwlcbiIgKwotCQkJIgkJfQlcbiIgKwotCQkJIgl9CVxuIiArCi0JCQkifQlcbiIgKwotCQkJImludGVyZmFjZSBJIHsJXG4iICsKLQkJCSIJdm9pZCBmb28oZmxvYXQgZiwgaW50IGkpOwlcbiIgKwotCQkJIn0JXG4iLAotCQl9LAotCQkiU1VDQ0VTUyIpOwotfQotCQkJCi0vLyBiaW5hcnkgY29tcGF0aWJpbGl0eQotcHVibGljIHZvaWQgX3Rlc3Q0MygpIHsKLQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJInAxL1kuamF2YSIsCi0JCQkicGFja2FnZSBwMTsJXG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgWSBleHRlbmRzIEEgaW1wbGVtZW50cyBJIHsgXG4iICsKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewlcbiIgKwotCQkJIgkJWS5wcmludFZhbHVlcygpOwlcbiIgKwotCQkJIgl9CVxuIiArCi0JCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFZhbHVlcygpIHsJXG4iICsKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihcImk9XCIraStcIixqPVwiK2orXCIsWS5pPVwiK1kuaStcIixZLmo9XCIrWS5qKTsJXG4iICsKLQkJCSIJfQlcbiIgKwotCQkJIn0JXG4iLAotCQkJInAxL0EuamF2YSIsCi0JCQkicGFja2FnZSBwMTsJXG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgQSB7CVxuIiArCi0JCQkiCXN0YXRpYyBpbnQgaSA9IDE7CVxuIiArCi0JCQkifQlcbiIsCi0JCQkicDEvSS5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOwlcbiIgKwotCQkJImludGVyZmFjZSBJIHsJXG4iICsKLQkJCSIJaW50IGogPSBcImFhXCIubGVuZ3RoKCk7CVxuIiArCi0JCQkifQlcbiIsCi0JCX0sCi0JCSJpPTEsaj0yLFkuaT0xLFkuaj0yIik7Ci0KLQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJInAxL0EuamF2YSIsCi0JCQkicGFja2FnZSBwMTsJXG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgQSB7CVxuIiArCi0JCQkiCXN0YXRpYyBpbnQgaiA9IDM7CVxuIiArCi0JCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsJXG4iICsKLQkJCSIJCVkucHJpbnRWYWx1ZXMoKTsJXG4iICsKLQkJCSIJfQlcbiIgKwotCQkJIn0JXG4iLAotCQkJInAxL0kuamF2YSIsCi0JCQkicGFja2FnZSBwMTsJXG4iICsKLQkJCSJpbnRlcmZhY2UgSSB7CVxuIiArCi0JCQkiCWludCBqID0gXCJhYWFhXCIubGVuZ3RoKCk7CVxuIiArCi0JCQkifQlcbiIsCi0JCX0sCi0JCSJpPTQsaj0zLFkuaT00LFkuaj0zIiwKLQkJbnVsbCwgLy8gdXNlIGRlZmF1bHQgY2xhc3MtcGF0aAotCQlmYWxzZSwgLy8gZG8gbm90IGZsdXNoIHByZXZpb3VzIG91dHB1dCBkaXIgY29udGVudAotCQludWxsKTsgLy8gbm8gc3BlY2lhbCB2bSBhcmdzCQkKLX0KLS8qIAotICogYXJyYXkuY2xvbmUoKSBzaG91bGQgdXNlIGFycmF5IHR5cGUgaW4gbWV0aG9kUmVmCi0gKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNjMwNwotICovCi1wdWJsaWMgdm9pZCB0ZXN0NDQoKSB7Ci0JdGhpcy5ydW5Db25mb3JtVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJYLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsKLQkJCSIJCWFyZ3MuY2xvbmUoKTsJXG4iKwotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIgKwotCQkJIiAgICB9XG4iICsKLQkJCSJ9XG4iLAotCQl9LAotCQkiU1VDQ0VTUyIpOwotCQkKLQlDbGFzc0ZpbGVCeXRlc0Rpc2Fzc2VtYmxlciBkaXNhc3NlbWJsZXIgPSBUb29sRmFjdG9yeS5jcmVhdGVEZWZhdWx0Q2xhc3NGaWxlQnl0ZXNEaXNhc3NlbWJsZXIoKTsKLQlTdHJpbmcgYWN0dWFsT3V0cHV0ID0gbnVsbDsKLQl0cnkgewotCQlieXRlW10gY2xhc3NGaWxlQnl0ZXMgPSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLmdldEZpbGVCeXRlQ29udGVudChuZXcgRmlsZShPVVRQVVRfRElSICsgRmlsZS5zZXBhcmF0b3IgICsiWC5jbGFzcyIpKTsKLQkJYWN0dWFsT3V0cHV0ID0KLQkJCWRpc2Fzc2VtYmxlci5kaXNhc3NlbWJsZSgKLQkJCQljbGFzc0ZpbGVCeXRlcywKLQkJCQkiXG4iLAotCQkJCUNsYXNzRmlsZUJ5dGVzRGlzYXNzZW1ibGVyLkRFVEFJTEVEKTsgCi0JfSBjYXRjaCAob3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5DbGFzc0Zvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydFRydWUoIkNsYXNzRm9ybWF0RXhjZXB0aW9uIiwgZmFsc2UpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0VHJ1ZSgiSU9FeGNlcHRpb24iLCBmYWxzZSk7Ci0JfQotCQotCVN0cmluZyBleHBlY3RlZE91dHB1dCA9IAotCQkiICAgICAgIDEgIGludm9rZXZpcnR1YWwgIzE5IDxNZXRob2QgamF2YS5sYW5nLk9iamVjdCNjbG9uZSgpIGphdmEubGFuZy5PYmplY3Q+XG4iOwotCQkKLQlpZiAoYWN0dWFsT3V0cHV0LmluZGV4T2YoZXhwZWN0ZWRPdXRwdXQpID09IC0xKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy51dGlsLlV0aWwuZGlzcGxheVN0cmluZyhhY3R1YWxPdXRwdXQsIDIpKTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBieXRlY29kZSBzZXF1ZW5jZSIsIGFjdHVhbE91dHB1dC5pbmRleE9mKGV4cGVjdGVkT3V0cHV0KSAhPSAtMSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgQ2xhc3MgdGVzdENsYXNzKCkgewotCXJldHVybiBDb21wbGlhbmNlXzFfMy5jbGFzczsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9yZWdyZXNzaW9uL0NvbXBsaWFuY2VfMV80LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcmVncmVzc2lvbi9Db21wbGlhbmNlXzFfNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjY3ODczLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9yZWdyZXNzaW9uL0NvbXBsaWFuY2VfMV80LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIucmVncmVzc2lvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlRvb2xGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuQ2xhc3NGaWxlQnl0ZXNEaXNhc3NlbWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LklJbmRleGVyT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZy5CaW5hcnlJbmRleGVyOwotCi1wdWJsaWMgY2xhc3MgQ29tcGxpYW5jZV8xXzQgZXh0ZW5kcyBBYnN0cmFjdFJlZ3Jlc3Npb25UZXN0IHsKLXB1YmxpYyBDb21wbGlhbmNlXzFfNChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi0vKgotICogVG9nZ2xlIGNvbXBpbGVyIGluIG1vZGUgLTEuNAotICovCi1wcm90ZWN0ZWQgTWFwIGdldENvbXBpbGVyT3B0aW9ucygpIHsKLQlNYXAgb3B0aW9ucyA9IHN1cGVyLmdldENvbXBpbGVyT3B0aW9ucygpOwotCW9wdGlvbnMucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fQ29tcGxpYW5jZSwgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV80KTsKLQlvcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1NvdXJjZSwgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV80KTsJCi0Jb3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9UYXJnZXRQbGF0Zm9ybSwgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV80KTsJCi0JcmV0dXJuIG9wdGlvbnM7Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JcmV0dXJuIHNldHVwU3VpdGUodGVzdENsYXNzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdDAxKCkgewotCXRoaXMucnVuQ29uZm9ybVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkicDEvVGVzdC5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOyBcbiIrCi0JCQkicHVibGljIGNsYXNzIFRlc3QgeyBcbiIrCi0JCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3VtZW50cykgeyBcbiIrCi0JCQkiCQluZXcgVGVzdCgpLmZvbygpOyBcbiIrCi0JCQkiCX0gXG4iKwotCQkJIgljbGFzcyBNIHsgXG4iKwotCQkJIgl9IFxuIisKLQkJCSIJdm9pZCBmb28oKXsgXG4iKwotCQkJIgkJY2xhc3MgWSBleHRlbmRzIFNlY29uZGFyeSB7IFxuIisKLQkJCSIJCQlNIG07IFxuIisKLQkJCSIJCX07IFxuIisKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7CVxuIiArCi0JCQkiCX0gXG4iKwotCQkJIn0gXG4iICsKLQkJCSJjbGFzcyBTZWNvbmRhcnkgeyBcbiIgKwotCQkJIgljbGFzcyBNIHt9IFxuIiArCi0JCQkifSBcbiIKLQkJfSwKLQkJIlNVQ0NFU1MiKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QwMigpIHsKLQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJInAxL1Rlc3QuamF2YSIsCi0JCQkicGFja2FnZSBwMTsgXG4iKwotCQkJInB1YmxpYyBjbGFzcyBUZXN0IHsgXG4iKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd1bWVudHMpIHsgXG4iKwotCQkJIgkJbmV3IFRlc3QoKS5mb28oKTsgXG4iKwotCQkJIgl9IFxuIisKLQkJCSIJU3RyaW5nIGJhcigpIHsgXG4iKwotCQkJIgkJcmV0dXJuIFwiRkFJTEVEXCI7CVxuIiArCi0JCQkiCX0gXG4iKwotCQkJIgl2b2lkIGZvbygpeyBcbiIrCi0JCQkiCQljbGFzcyBZIGV4dGVuZHMgU2Vjb25kYXJ5IHsgXG4iKwotCQkJIgkJCVN0cmluZyB6ID0gYmFyKCk7CVxuIiArCi0JCQkiCQl9OyBcbiIrCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4obmV3IFkoKS56KTsJXG4iICsKLQkJCSIJfSBcbiIrCi0JCQkifSBcbiIgKwotCQkJImNsYXNzIFNlY29uZGFyeSB7IFxuIiArCi0JCQkiCVN0cmluZyBiYXIoKXsgcmV0dXJuIFwiU1VDQ0VTU1wiOyB9IFxuIiArCi0JCQkifSBcbiIKLQkJfSwKLQkJIlNVQ0NFU1MiKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QwMygpIHsKLQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJInAxL1Rlc3QuamF2YSIsCi0JCQkicGFja2FnZSBwMTsgXG4iKwotCQkJInB1YmxpYyBjbGFzcyBUZXN0IHsgXG4iKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd1bWVudHMpIHsgXG4iKwotCQkJIgkJbmV3IFRlc3QoKS5mb28oKTsgXG4iKwotCQkJIgl9IFxuIisKLQkJCSIJU3RyaW5nIGJhciA9IFwiRkFJTEVEXCI7IisKLQkJCSIJdm9pZCBmb28oKXsgXG4iKwotCQkJIgkJY2xhc3MgWSBleHRlbmRzIFNlY29uZGFyeSB7IFxuIisKLQkJCSIJCQlTdHJpbmcgeiA9IGJhcjsgXG4iKwotCQkJIgkJfTsgXG4iKwotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKG5ldyBZKCkueik7CVxuIiArCi0JCQkiCX0gXG4iKwotCQkJIn0gXG4iICsKLQkJCSJjbGFzcyBTZWNvbmRhcnkgeyBcbiIgKwotCQkJIglTdHJpbmcgYmFyID0gXCJTVUNDRVNTXCI7IFxuIiArCi0JCQkifSBcbiIKLQkJfSwKLQkJIlNVQ0NFU1MiKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QwNCgpIHsKLQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJInAxL1Rlc3QuamF2YSIsCi0JCQkicGFja2FnZSBwMTsgXG4iKwotCQkJInB1YmxpYyBjbGFzcyBUZXN0IHsgXG4iKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd1bWVudHMpIHsgXG4iKwotCQkJIgkJbmV3IFRlc3QoKS5mb28oKTsgXG4iKwotCQkJIgl9IFxuIisKLQkJCSIJU3RyaW5nIGJhcigpIHsgXG4iKwotCQkJIgkJcmV0dXJuIFwiU1VDQ0VTU1wiOwlcbiIgKwotCQkJIgl9IFxuIisKLQkJCSIJdm9pZCBmb28oKXsgXG4iKwotCQkJIgkJY2xhc3MgWSBleHRlbmRzIFNlY29uZGFyeSB7IFxuIisKLQkJCSIJCQlTdHJpbmcgeiA9IGJhcigpOwlcbiIgKwotCQkJIgkJfTsgXG4iKwotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKG5ldyBZKCkueik7CVxuIiArCi0JCQkiCX0gXG4iKwotCQkJIn0gXG4iICsKLQkJCSJjbGFzcyBTZWNvbmRhcnkgeyBcbiIgKwotCQkJIglwcml2YXRlIFN0cmluZyBiYXIoKXsgcmV0dXJuIFwiRkFJTEVEXCI7IH0gXG4iICsKLQkJCSJ9IFxuIgotCQl9LAotCQkiU1VDQ0VTUyIpOwotfQotcHVibGljIHZvaWQgdGVzdDA1KCkgewotCXRoaXMucnVuQ29uZm9ybVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkicDEvVGVzdC5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOyBcbiIrCi0JCQkicHVibGljIGNsYXNzIFRlc3QgeyBcbiIrCi0JCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3VtZW50cykgeyBcbiIrCi0JCQkiCQluZXcgVGVzdCgpLmZvbygpOyBcbiIrCi0JCQkiCX0gXG4iKwotCQkJIglTdHJpbmcgYmFyID0gXCJTVUNDRVNTXCI7IisKLQkJCSIJdm9pZCBmb28oKXsgXG4iKwotCQkJIgkJY2xhc3MgWSBleHRlbmRzIFNlY29uZGFyeSB7IFxuIisKLQkJCSIJCQlTdHJpbmcgeiA9IGJhcjsgXG4iKwotCQkJIgkJfTsgXG4iKwotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKG5ldyBZKCkueik7CVxuIiArCi0JCQkiCX0gXG4iKwotCQkJIn0gXG4iICsKLQkJCSJjbGFzcyBTZWNvbmRhcnkgeyBcbiIgKwotCQkJIglwcml2YXRlIFN0cmluZyBiYXIgPSBcIkZBSUxFRFwiOyBcbiIgKwotCQkJIn0gXG4iCi0JCX0sCi0JCSJTVUNDRVNTIik7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDYoKSB7Ci0JdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkicDEvVGVzdC5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOyBcbiIrCi0JCQkicHVibGljIGNsYXNzIFRlc3QgeyBcbiIrCi0JCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3VtZW50cykgeyBcbiIrCi0JCQkiCQluZXcgVGVzdCgpLmZvbygpOyBcbiIrCi0JCQkiCX0gXG4iKwotCQkJIglTdHJpbmcgYmFyKCkgeyBcbiIrCi0JCQkiCQlyZXR1cm4gXCJGQUlMRURcIjsJXG4iICsKLQkJCSIJfSBcbiIrCi0JCQkiCXZvaWQgZm9vKCl7IFxuIisKLQkJCSIJCWNsYXNzIFkgZXh0ZW5kcyBTZWNvbmRhcnkgeyBcbiIrCi0JCQkiCQkJU3RyaW5nIHogPSBiYXIoKTsJXG4iICsKLQkJCSIJCX07IFxuIisKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihuZXcgWSgpLnopOwlcbiIgKwotCQkJIgl9IFxuIisKLQkJCSJ9IFxuIiArCi0JCQkiY2xhc3MgU2Vjb25kYXJ5IHsgXG4iICsKLQkJCSIJU3RyaW5nIGJhcihpbnQgaSl7IHJldHVybiBcIlNVQ0NFU1NcIjsgfSBcbiIgKwotCQkJIn0gXG4iCi0JCX0sCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIxLiBFUlJPUiBpbiBwMVxcVGVzdC5qYXZhIChhdCBsaW5lIDExKVxuIiArIAotCQkiCVN0cmluZyB6ID0gYmFyKCk7CVxuIiArIAotCQkiCSAgICAgICAgICAgXl5eXG4iICsgCi0JCSJUaGUgbWV0aG9kIGJhcihpbnQpIGluIHRoZSB0eXBlIFNlY29uZGFyeSBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoKVxuIiArIAotCQkiLS0tLS0tLS0tLVxuIgotCSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDcoKSB7Ci0JdGhpcy5ydW5Db25mb3JtVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJwMS9UZXN0LmphdmEiLAotCQkJInBhY2thZ2UgcDE7IFxuIisKLQkJCSJwdWJsaWMgY2xhc3MgVGVzdCB7IFxuIisKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndW1lbnRzKSB7IFxuIisKLQkJCSIJCXRyeSB7CVxuIiArCi0JCQkiCQkJdGhyb3cgbnVsbDsgXG4iKwotCQkJIgkJfSBjYXRjaChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKXsgCVxuIiArCi0JCQkiCQkJU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTsJXG4iCSsKLQkJCSIJCX0JXG4iICsKLQkJCSIJfSBcbiIrCi0JCQkifSBcbiIKLQkJfSwKLQkJIlNVQ0NFU1MiKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QwOCgpIHsKLQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJwMS9UZXN0LmphdmEiLAotCQkJInBhY2thZ2UgcDE7IFxuIisKLQkJCSJpbXBvcnQgVGVzdDI7CVxuIiArCi0JCQkiaW1wb3J0IFRlc3QyLk1lbWJlcjsJXG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgVGVzdCB7IFxuIisKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndW1lbnRzKSB7IFxuIisKLQkJCSIJfSBcbiIrCi0JCQkifSBcbiIsCi0JCQkiVGVzdDIuamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFRlc3QyIHsgXG4iKwotCQkJIglwdWJsaWMgY2xhc3MgTWVtYmVyIHsJXG4iICsKLQkJCSIJfSBcbiIrCi0JCQkifSBcbiIKLQkJfSwKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjEuIEVSUk9SIGluIHAxXFxUZXN0LmphdmEgKGF0IGxpbmUgMilcbiIgKyAKLQkJIglpbXBvcnQgVGVzdDI7CVxuIiArIAotCQkiCSAgICAgICBeXl5eXlxuIiArIAotCQkiVGhlIGltcG9ydCBUZXN0MiBjYW5ub3QgYmUgcmVzb2x2ZWRcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjIuIEVSUk9SIGluIHAxXFxUZXN0LmphdmEgKGF0IGxpbmUgMylcbiIgKyAKLQkJIglpbXBvcnQgVGVzdDIuTWVtYmVyOwlcbiIgKyAKLQkJIgkgICAgICAgXl5eXl5eXl5eXl5eXG4iICsgCi0JCSJUaGUgaW1wb3J0IFRlc3QyIGNhbm5vdCBiZSByZXNvbHZlZFxuIiArIAotCQkiLS0tLS0tLS0tLVxuIgotCSk7Ci19Ci0vLyBiaW5hcnkgY29tcGF0aWJpbGl0eQotcHVibGljIHZvaWQgdGVzdDA5KCkgewotCXRoaXMucnVuQ29uZm9ybVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkicDEvWi5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOyBcbiIrCi0JCQkicHVibGljIGNsYXNzIFogewlcbiIgKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd1bWVudHMpIHsgXG4iKwotCQkJIgkJWSB5ID0gbmV3IFkoKTsJXG4iICsKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnQoeS5maWVsZCk7CVxuIgkrCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50KHkuc3RhdGljRmllbGQpOwlcbiIJKwotCQkJIgkJU3lzdGVtLm91dC5wcmludCh5Lm1ldGhvZCgpKTsJXG4iCSsKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbih5LnN0YXRpY01ldGhvZCgpKTsJXG4iCSsKLQkJCSIJfSBcbiIrCi0JCQkifSBcbiIsCi0JCQkicDEvWC5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOyBcbiIrCi0JCQkicHVibGljIGNsYXNzIFggeyBcbiIrCi0JCQkiCXB1YmxpYyBTdHJpbmcgZmllbGQgPSBcIlguZmllbGQtXCI7CVxuIiArCi0JCQkiCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0YXRpY0ZpZWxkID0gXCJYLnN0YXRpY0ZpZWxkLVwiOwlcbiIgKwotCQkJIglwdWJsaWMgU3RyaW5nIG1ldGhvZCgpeyByZXR1cm4gXCJYLm1ldGhvZCgpLVwiOwl9CVxuIiArCi0JCQkiCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0YXRpY01ldGhvZCgpeyByZXR1cm4gXCJYLnN0YXRpY01ldGhvZCgpLVwiOwl9CVxuIiArCi0JCQkifSBcbiIsCi0JCQkicDEvWS5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOyBcbiIrCi0JCQkicHVibGljIGNsYXNzIFkgZXh0ZW5kcyBYIHsgXG4iKwotCQkJIn0gXG4iCi0JCX0sCi0JCSJYLmZpZWxkLVguc3RhdGljRmllbGQtWC5tZXRob2QoKS1YLnN0YXRpY01ldGhvZCgpLSIpOwotCi0JdGhpcy5ydW5Db25mb3JtVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJwMS9ZLmphdmEiLAotCQkJInBhY2thZ2UgcDE7IFxuIisKLQkJCSJwdWJsaWMgY2xhc3MgWSBleHRlbmRzIFggeyBcbiIrCi0JCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3VtZW50cykgeyBcbiIrCi0JCQkiCQlaLm1haW4oYXJndW1lbnRzKTsJXG4iICsKLQkJCSIJfQlcbiIgKwotCQkJIglwdWJsaWMgU3RyaW5nIGZpZWxkID0gXCJZLmZpZWxkLVwiOwlcbiIgKwotCQkJIglwdWJsaWMgc3RhdGljIFN0cmluZyBzdGF0aWNGaWVsZCA9IFwiWS5zdGF0aWNGaWVsZC1cIjsJXG4iICsKLQkJCSIJcHVibGljIFN0cmluZyBtZXRob2QoKXsgcmV0dXJuIFwiWS5tZXRob2QoKS1cIjsJfQlcbiIgKwotCQkJIglwdWJsaWMgc3RhdGljIFN0cmluZyBzdGF0aWNNZXRob2QoKXsgcmV0dXJuIFwiWS5zdGF0aWNNZXRob2QoKS1cIjsJfQlcbiIgKwotCQkJIn0gXG4iCi0JCX0sCi0JCSJZLmZpZWxkLVkuc3RhdGljRmllbGQtWS5tZXRob2QoKS1ZLnN0YXRpY01ldGhvZCgpLSIsIC8vIGV4cGVjdGVkIG91dHB1dAotCQludWxsLCAvLyB1c2UgZGVmYXVsdCBjbGFzcy1wYXRoCi0JCWZhbHNlLCAvLyBkbyBub3QgZmx1c2ggcHJldmlvdXMgb3V0cHV0IGRpciBjb250ZW50Ci0JCW51bGwpOyAvLyBubyBzcGVjaWFsIHZtIGFyZ3MKLX0KLQotLy8gY2hlY2sgYWN0dWFsUmVjZWl2ZXJUeXBlIHdoZW4gYXJyYXkgdHlwZQotcHVibGljIHZvaWQgdGVzdDEwKCkgewotCXRoaXMucnVuQ29uZm9ybVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkicDEvWi5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOyBcbiIrCi0JCQkicHVibGljIGNsYXNzIFogewlcbiIgKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd1bWVudHMpIHsgXG4iKwotCQkJIgkJU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbXXtcIlNVQ0NFU1NcIiB9OwlcbiIgKwotCQkJIgkJU3lzdGVtLm91dC5wcmludChzLmxlbmd0aCk7CVxuIgkrCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50KCgoU3RyaW5nW10pcy5jbG9uZSgpKVswXSk7CVxuIgkrCi0JCQkiCX0gXG4iKwotCQkJIn0gXG4iCi0JCX0sCi0JCSIxU1VDQ0VTUyIpOwotfQotLy8gdGVzdCB1bnJlYWNoYWJsZSBjb2RlIGNvbXBsYWludHMKLXB1YmxpYyB2b2lkIHRlc3QxMSgpIHsKLQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJwMS9YLmphdmEiLAotCQkJInBhY2thZ2UgcDE7IFxuIisKLQkJCSJwdWJsaWMgY2xhc3MgWCB7IFxuIisKLQkJCSIJdm9pZCBmb28oKSB7IFxuIisKLQkJCSIJCXdoaWxlIChmYWxzZSk7CVxuIiArCi0JCQkiCQl3aGlsZSAoZmFsc2UpIFN5c3RlbS5vdXQucHJpbnRsbihcInVucmVhY2hhYmxlXCIpOwlcbiIgKwotCQkJIgkJZG8gOyB3aGlsZSAoZmFsc2UpOwlcbiIgKwotCQkJIgkJZG8gU3lzdGVtLm91dC5wcmludGxuKFwidW5yZWFjaGFibGVcIik7IHdoaWxlIChmYWxzZSk7CVxuIiArCi0JCQkiCQlmb3IgKDtmYWxzZTspOwlcbiIgKwotCQkJIgkJZm9yICg7ZmFsc2U7KSBTeXN0ZW0ub3V0LnByaW50bG4oXCJ1bnJlYWNoYWJsZVwiKTsJXG4iICsKLQkJCSIJCWlmIChmYWxzZSk7CVxuIiArCi0JCQkiCQlpZiAoZmFsc2UpU3lzdGVtLm91dC5wcmludGxuKFwidW5yZWFjaGFibGVcIik7CQlcbiIgKwkJCi0JCQkiCX0JXG4iICsKLQkJCSJ9IFxuIgotCQl9LAotCQkiLS0tLS0tLS0tLVxuIiArIAotCQkiMS4gRVJST1IgaW4gcDFcXFguamF2YSAoYXQgbGluZSA0KVxuIiArIAotCQkiCXdoaWxlIChmYWxzZSk7CVxuIiArIAotCQkiCSAgICAgICAgICAgICBeXG4iICsgCi0JCSJVbnJlYWNoYWJsZSBjb2RlXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIyLiBFUlJPUiBpbiBwMVxcWC5qYXZhIChhdCBsaW5lIDUpXG4iICsgCi0JCSIJd2hpbGUgKGZhbHNlKSBTeXN0ZW0ub3V0LnByaW50bG4oXCJ1bnJlYWNoYWJsZVwiKTsJXG4iICsgCi0JCSIJICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKLQkJIlVucmVhY2hhYmxlIGNvZGVcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjMuIEVSUk9SIGluIHAxXFxYLmphdmEgKGF0IGxpbmUgOClcbiIgKyAKLQkJIglmb3IgKDtmYWxzZTspOwlcbiIgKyAKLQkJIgkgICAgICAgICAgICAgXlxuIiArIAotCQkiVW5yZWFjaGFibGUgY29kZVxuIiArIAotCQkiLS0tLS0tLS0tLVxuIiArIAotCQkiNC4gRVJST1IgaW4gcDFcXFguamF2YSAoYXQgbGluZSA5KVxuIiArIAotCQkiCWZvciAoO2ZhbHNlOykgU3lzdGVtLm91dC5wcmludGxuKFwidW5yZWFjaGFibGVcIik7CVxuIiArIAotCQkiCSAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4iICsgCi0JCSJVbnJlYWNoYWJsZSBjb2RlXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iCi0JKTsKLX0KLS8vIGJpbmFyeSBjb21wYXRpYmlsaXR5Ci1wdWJsaWMgdm9pZCB0ZXN0MTIoKSB7Ci0JdGhpcy5ydW5Db25mb3JtVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJwMS9ZLmphdmEiLAotCQkJInBhY2thZ2UgcDE7CVxuIiArCi0JCQkiY2xhc3MgU3RvcmUgewlcbiIgKwotCQkJIglTdHJpbmcgdmFsdWU7CVxuIiArCi0JCQkiCVN0b3JlKFN0cmluZyB2YWx1ZSl7CVxuIiArCi0JCQkiCQl0aGlzLnZhbHVlID0gdmFsdWU7CVxuIiArCi0JCQkiCX0JXG4iICsKLQkJCSJ9CVxuIiArCi0JCQkiY2xhc3MgVG9wIHsJXG4iICsKLQkJCSIJc3RhdGljIFN0cmluZyBiYXIgPSBcIlRvcC5iYXJcIjsJXG4iICsKLQkJCSIJU3RyaW5nIGZvbyA9IFwiVG9wLmZvb1wiOwlcbiIgKwotCQkJIglTdG9yZSBzdG9yZSA9IG5ldyBTdG9yZShcIlRvcC5zdG9yZVwiKTsJXG4iICsKLQkJCSIJc3RhdGljIFN0b3JlIHNzdG9yZSA9IG5ldyBTdG9yZShcIlRvcC5zc3RvcmVcIik7CVxuIiArCi0JCQkiCXN0YXRpYyBUb3Agc3MgPSBuZXcgVG9wKCk7CVxuIiArCi0JCQkifQlcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBZIGV4dGVuZHMgVXBkYXRlZCB7CQlcbiIgKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd1bWVudHMpIHsJXG4iICsKLQkJCSIJCW5ldyBZKCkudGVzdCgpOwlcbiIgKwotCQkJIgl9CVxuIiArCi0JCQkiCXZvaWQgdGVzdCgpIHsJCVxuIiArCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50KFwiKioqIEZJRUxEIEFDQ0VTUyAqKipcIik7CVxuIiArCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50KFwiKjEqIG5ldyBVcGRhdGVkKCkuYmFyOiBcIiArIG5ldyBVcGRhdGVkKCkuYmFyKTsJXG4iICsKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnQoXCIqMiogbmV3IFVwZGF0ZWQoKS5mb286IFwiICsgbmV3IFVwZGF0ZWQoKS5mb28pOwlcbiIgKwotCQkJIgkJU3lzdGVtLm91dC5wcmludChcIiozKiBuZXcgWSgpLmZvbzogXCIgKyBuZXcgWSgpLmZvbyk7CVxuIiArCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50KFwiKjQqIG5ldyBZKCkuYmFyOiBcIiArIG5ldyBZKCkuYmFyKTsJXG4iICsKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnQoXCIqNSogYmFyOiBcIiArIGJhcik7CVxuIiArCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50KFwiKjYqIGZvbzogXCIgKyBmb28pOwlcbiIgKwotCQkJIgkJU3lzdGVtLm91dC5wcmludChcIio3KiBZLmJhcjogXCIgKyBZLmJhcik7CVxuIiArCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50KFwiKjgqIHRoaXMuYmFyOiBcIiArIHRoaXMuYmFyKTsJXG4iICsKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnQoXCIqOSogdGhpcy5mb286IFwiICsgdGhpcy5mb28pOwlcbiIgKwotCQkJIgkJU3lzdGVtLm91dC5wcmludChcIioxMCogc3RvcmUudmFsdWU6IFwiICsgc3RvcmUudmFsdWUpOwlcbiIgKwotCQkJIgkJU3lzdGVtLm91dC5wcmludChcIioxMSogc3N0b3JlLnZhbHVlOiBcIiArIHNzdG9yZS52YWx1ZSk7CVxuIiArCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50KFwiKjEyKiBzcy5zc3RvcmUudmFsdWU6IFwiICsgc3Muc3N0b3JlLnZhbHVlKTsJXG4iICsKLQkJCSIJfQkJXG4iICsKLQkJCSJ9CQlcbiIsCi0JCQkicDEvVXBkYXRlZC5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOwlcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBVcGRhdGVkIGV4dGVuZHMgVG9wIHsJXG4iICsKLQkJCSJ9CVxuIgotCQl9LAotCQkiKioqIEZJRUxEIEFDQ0VTUyAqKioiCi0JCSsiKjEqIG5ldyBVcGRhdGVkKCkuYmFyOiBUb3AuYmFyIgotCQkrIioyKiBuZXcgVXBkYXRlZCgpLmZvbzogVG9wLmZvbyIKLQkJKyIqMyogbmV3IFkoKS5mb286IFRvcC5mb28iCi0JCSsiKjQqIG5ldyBZKCkuYmFyOiBUb3AuYmFyIgotCQkrIio1KiBiYXI6IFRvcC5iYXIiCi0JCSsiKjYqIGZvbzogVG9wLmZvbyIKLQkJKyIqNyogWS5iYXI6IFRvcC5iYXIiCi0JCSsiKjgqIHRoaXMuYmFyOiBUb3AuYmFyIgotCQkrIio5KiB0aGlzLmZvbzogVG9wLmZvbyIKLQkJKyIqMTAqIHN0b3JlLnZhbHVlOiBUb3Auc3RvcmUiCi0JCSsiKjExKiBzc3RvcmUudmFsdWU6IFRvcC5zc3RvcmUiCi0JCSsiKjEyKiBzcy5zc3RvcmUudmFsdWU6IFRvcC5zc3RvcmUiKTsKLQotCXRoaXMucnVuQ29uZm9ybVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkicDEvVXBkYXRlZC5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOyBcbiIrCi0JCQkicHVibGljIGNsYXNzIFVwZGF0ZWQgZXh0ZW5kcyBUb3AgeyBcbiIrCi0JCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3VtZW50cykgeyBcbiIrCi0JCQkiCQlZLm1haW4oYXJndW1lbnRzKTsJXG4iICsKLQkJCSIJfQlcbiIgKwotCQkJIglzdGF0aWMgU3RyaW5nIGJhciA9IFwiVXBkYXRlZC5iYXJcIjsJXG4iICsKLQkJCSIJU3RyaW5nIGZvbyA9IFwiVXBkYXRlZC5mb29cIjsJXG4iICsKLQkJCSIJU3RvcmUgc3RvcmUgPSBuZXcgU3RvcmUoXCJVcGRhdGVkLnN0b3JlXCIpOwlcbiIgKwotCQkJIglzdGF0aWMgU3RvcmUgc3N0b3JlID0gbmV3IFN0b3JlKFwiVXBkYXRlZC5zc3RvcmVcIik7CVxuIiArCi0JCQkiCXN0YXRpYyBVcGRhdGVkIHNzID0gbmV3IFVwZGF0ZWQoKTsJXG4iICsKLQkJCSJ9IFxuIgotCQl9LAotCQkiKioqIEZJRUxEIEFDQ0VTUyAqKioiCi0JCSsiKjEqIG5ldyBVcGRhdGVkKCkuYmFyOiBVcGRhdGVkLmJhciIKLQkJKyIqMiogbmV3IFVwZGF0ZWQoKS5mb286IFVwZGF0ZWQuZm9vIgotCQkrIiozKiBuZXcgWSgpLmZvbzogVXBkYXRlZC5mb28iCi0JCSsiKjQqIG5ldyBZKCkuYmFyOiBVcGRhdGVkLmJhciIKLQkJKyIqNSogYmFyOiBUb3AuYmFyIgotCQkrIio2KiBmb286IFVwZGF0ZWQuZm9vIgotCQkrIio3KiBZLmJhcjogVXBkYXRlZC5iYXIiCi0JCSsiKjgqIHRoaXMuYmFyOiBVcGRhdGVkLmJhciIKLQkJKyIqOSogdGhpcy5mb286IFVwZGF0ZWQuZm9vIgotCQkrIioxMCogc3RvcmUudmFsdWU6IFVwZGF0ZWQuc3RvcmUiCi0JCSsiKjExKiBzc3RvcmUudmFsdWU6IFRvcC5zc3RvcmUiCi0JCSsiKjEyKiBzcy5zc3RvcmUudmFsdWU6IFRvcC5zc3RvcmUiLAotCQludWxsLCAvLyB1c2UgZGVmYXVsdCBjbGFzcy1wYXRoCi0JCWZhbHNlLCAvLyBkbyBub3QgZmx1c2ggcHJldmlvdXMgb3V0cHV0IGRpciBjb250ZW50Ci0JCW51bGwpOyAvLyBubyBzcGVjaWFsIHZtIGFyZ3MJCQotfQotLy8gYmluYXJ5IGNvbXBhdGliaWxpdHkKLXB1YmxpYyB2b2lkIHRlc3QxMygpIHsKLQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJInAxL1kuamF2YSIsCi0JCQkicGFja2FnZSBwMTsJXG4iICsKLQkJCSJjbGFzcyBTdG9yZSB7CVxuIiArCi0JCQkiCVN0cmluZyB2YWx1ZTsJXG4iICsKLQkJCSIJU3RvcmUoU3RyaW5nIHZhbHVlKXsJXG4iICsKLQkJCSIJCXRoaXMudmFsdWUgPSB2YWx1ZTsJXG4iICsKLQkJCSIJfQlcbiIgKwotCQkJIn0JXG4iICsKLQkJCSJjbGFzcyBUb3AgewlcbiIgKwotCQkJIglzdGF0aWMgU3RyaW5nIGJhcigpIHsgcmV0dXJuIFwiVG9wLmJhcigpXCI7IH0JXG4iICsKLQkJCSIJU3RyaW5nIGZvbygpIHsgcmV0dXJuIFwiVG9wLmZvbygpXCI7IH0JXG4iICsKLQkJCSJ9CVxuIiArCi0JCQkicHVibGljIGNsYXNzIFkgZXh0ZW5kcyBVcGRhdGVkIHsJCVxuIiArCi0JCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3VtZW50cykgewlcbiIgKwotCQkJIgkJbmV3IFkoKS50ZXN0KCk7CVxuIiArCi0JCQkiCX0JXG4iICsKLQkJCSIJdm9pZCB0ZXN0KCkgewkJXG4iICsKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnQoXCIqKiogTUVUSE9EIEFDQ0VTUyAqKipcIik7CVxuIiArCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50KFwiKjEqIG5ldyBVcGRhdGVkKCkuYmFyKCk6IFwiICsgbmV3IFVwZGF0ZWQoKS5iYXIoKSk7CVxuIiArCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50KFwiKjIqIG5ldyBVcGRhdGVkKCkuZm9vKCk6IFwiICsgbmV3IFVwZGF0ZWQoKS5mb28oKSk7CVxuIiArCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50KFwiKjMqIG5ldyBZKCkuZm9vKCk6IFwiICsgbmV3IFkoKS5mb28oKSk7CVxuIiArCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50KFwiKjQqIG5ldyBZKCkuYmFyKCk6IFwiICsgbmV3IFkoKS5iYXIoKSk7CVxuIiArCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50KFwiKjUqIGJhcigpOiBcIiArIGJhcigpKTsJXG4iICsKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnQoXCIqNiogZm9vKCk6IFwiICsgZm9vKCkpOwlcbiIgKwotCQkJIgkJU3lzdGVtLm91dC5wcmludChcIio3KiBZLmJhcigpOiBcIiArIFkuYmFyKCkpOwlcbiIgKwotCQkJIgkJU3lzdGVtLm91dC5wcmludChcIio4KiB0aGlzLmJhcigpOiBcIiArIHRoaXMuYmFyKCkpOwlcbiIgKwotCQkJIgkJU3lzdGVtLm91dC5wcmludChcIio5KiB0aGlzLmZvbygpOiBcIiArIHRoaXMuZm9vKCkpOwlcbiIgKwotCQkJIgl9CQlcbiIgKwotCQkJIn0JCVxuIiwKLQkJCSJwMS9VcGRhdGVkLmphdmEiLAotCQkJInBhY2thZ2UgcDE7CVxuIiArCi0JCQkicHVibGljIGNsYXNzIFVwZGF0ZWQgZXh0ZW5kcyBUb3AgewlcbiIgKwotCQkJIn0JXG4iCi0JCX0sCi0JCSIqKiogTUVUSE9EIEFDQ0VTUyAqKioiCi0JCSsiKjEqIG5ldyBVcGRhdGVkKCkuYmFyKCk6IFRvcC5iYXIoKSIKLQkJKyIqMiogbmV3IFVwZGF0ZWQoKS5mb28oKTogVG9wLmZvbygpIgotCQkrIiozKiBuZXcgWSgpLmZvbygpOiBUb3AuZm9vKCkiCi0JCSsiKjQqIG5ldyBZKCkuYmFyKCk6IFRvcC5iYXIoKSIKLQkJKyIqNSogYmFyKCk6IFRvcC5iYXIoKSIKLQkJKyIqNiogZm9vKCk6IFRvcC5mb28oKSIKLQkJKyIqNyogWS5iYXIoKTogVG9wLmJhcigpIgotCQkrIio4KiB0aGlzLmJhcigpOiBUb3AuYmFyKCkiCi0JCSsiKjkqIHRoaXMuZm9vKCk6IFRvcC5mb28oKSIpOwotCi0JdGhpcy5ydW5Db25mb3JtVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJwMS9VcGRhdGVkLmphdmEiLAotCQkJInBhY2thZ2UgcDE7IFxuIisKLQkJCSJwdWJsaWMgY2xhc3MgVXBkYXRlZCBleHRlbmRzIFRvcCB7IFxuIisKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndW1lbnRzKSB7IFxuIisKLQkJCSIJCVkubWFpbihhcmd1bWVudHMpOwlcbiIgKwotCQkJIgl9CVxuIiArCi0JCQkiCXN0YXRpYyBTdHJpbmcgYmFyKCkgeyByZXR1cm4gXCJVcGRhdGVkLmJhcigpXCI7IH0JXG4iICsKLQkJCSIJU3RyaW5nIGZvbygpIHsgcmV0dXJuIFwiVXBkYXRlZC5mb28oKVwiOyB9CVxuIiArCi0JCQkifSBcbiIKLQkJfSwKLQkJIioqKiBNRVRIT0QgQUNDRVNTICoqKiIKLQkJKyIqMSogbmV3IFVwZGF0ZWQoKS5iYXIoKTogVXBkYXRlZC5iYXIoKSIKLQkJKyIqMiogbmV3IFVwZGF0ZWQoKS5mb28oKTogVXBkYXRlZC5mb28oKSIKLQkJKyIqMyogbmV3IFkoKS5mb28oKTogVXBkYXRlZC5mb28oKSIKLQkJKyIqNCogbmV3IFkoKS5iYXIoKTogVXBkYXRlZC5iYXIoKSIKLQkJKyIqNSogYmFyKCk6IFRvcC5iYXIoKSIKLQkJKyIqNiogZm9vKCk6IFVwZGF0ZWQuZm9vKCkiCi0JCSsiKjcqIFkuYmFyKCk6IFVwZGF0ZWQuYmFyKCkiCi0JCSsiKjgqIHRoaXMuYmFyKCk6IFVwZGF0ZWQuYmFyKCkiCi0JCSsiKjkqIHRoaXMuZm9vKCk6IFVwZGF0ZWQuZm9vKCkiLAotCQludWxsLCAvLyB1c2UgZGVmYXVsdCBjbGFzcy1wYXRoCi0JCWZhbHNlLCAvLyBkbyBub3QgZmx1c2ggcHJldmlvdXMgb3V0cHV0IGRpciBjb250ZW50Ci0JCW51bGwpOyAvLyBubyBzcGVjaWFsIHZtIGFyZ3MJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0MTQoKSB7Ci0JdGhpcy5ydW5Db25mb3JtVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJwMS9YLmphdmEiLAotCQkJInBhY2thZ2UgcDE7CVxuIiArCi0JCQkiY2xhc3MgVCB7CVxuIiArCi0JCQkiCXZvaWQgZm9vKGJvb2xlYW4gYikgewlcbiIgKwotCQkJIgkJIFN5c3RlbS5vdXQucHJpbnQoXCJULmZvbyhib29sZWFuKSNcIik7IAlcbiIgKwotCQkJIgl9CVxuIiArCi0JCQkiCWJvb2xlYW4gYmFyID0gZmFsc2U7CVxuIiArCi0JCQkiCWNsYXNzIE1lbWJlciB7CVxuIiArCi0JCQkiCQl2b2lkIGRpc3BsYXkoKXsgU3lzdGVtLm91dC5wcmludChcIlQuTWVtYmVyI1wiKTsgfQlcbiIgKwotCQkJIgl9CVxuIiArCi0JCQkifQlcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBYIHsJXG4iICsKLQkJCSIJdm9pZCBmb28oaW50IGkpIHsJXG4iICsKLQkJCSIJCSBTeXN0ZW0ub3V0LnByaW50bG4oXCJYLmZvbyhpbnQpI1wiKTsgCQkJXG4iICsKLQkJCSIJfQlcbiIgKwotCQkJIglpbnQgYmFyOwlcbiIgKwotCQkJIgljbGFzcyBNZW1iZXIgewlcbiIgKwotCQkJIgkJdm9pZCBkaXNwbGF5KCl7IFN5c3RlbS5vdXQucHJpbnQoXCJYLk1lbWJlciNcIik7IH0JXG4iICsKLQkJCSIJfQlcbiIgKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd1bWVudHMpIHsJXG4iICsKLQkJCSIJCW5ldyBYKCkuYmFyKCk7CVxuIiArCi0JCQkiCX0JCQkJXG4iICsKLQkJCSIJdm9pZCBiYXIoKSB7IAlcbiIgKwotCQkJIgkJbmV3IFQoKSB7CVxuIiArCi0JCQkiCQkJewlcbiIgKwotCQkJIgkJCQlmb28odHJ1ZSk7CVxuIiArCi0JCQkiCQkJCVN5c3RlbS5vdXQucHJpbnQoKGJvb2xlYW4pYmFyICsgXCIjXCIpOwlcbiIgKwotCQkJIgkJCQlNZW1iZXIgbSA9IG5ldyBNZW1iZXIoKTsJXG4iICsJCi0JCQkiCQkJCW0uZGlzcGxheSgpOwlcbiIgKwotCQkJIgkJCX0gCVxuIiArCi0JCQkiCQl9OwlcbiIgKwotCQkJIgl9CVxuIiArCi0JCQkifQlcbiIKLQkJfSwKLQkJIlQuZm9vKGJvb2xlYW4pI2ZhbHNlI1QuTWVtYmVyIik7Ci19Ci0KLS8qCi0gKiBjaGVjayBoYW5kbGluZyBvZiBkZWZhdWx0IGFic3RyYWN0IG1ldGhvZHMKLSAqLwotcHVibGljIHZvaWQgdGVzdDE1KCkgewotCXRoaXMucnVuQ29uZm9ybVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkicDEvWC5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOwlcbiIrCi0JCQkicHVibGljIGNsYXNzIFggewlcbiIrCi0JCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3VtZW50cykgewlcbiIrCi0JCQkiCQlDIGMgPSBuZXcgQygpIHsJXG4iKwotCQkJIgkJCXB1YmxpYyB2b2lkIGRvU29tZXRoaW5nKCl7CVxuIisKLQkJCSIJCQkJU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTsJXG4iKwotCQkJIgkJCX0JXG4iKwotCQkJIgkJfTsJXG4iKwotCQkJIgkJYy5kb1NvbWV0aGluZygpOwlcbiIrCi0JCQkiCX0JXG4iKwotCQkJIn0JXG4iKwotCQkJImludGVyZmFjZSBJIHsJXG4iKwotCQkJIgl2b2lkIGRvU29tZXRoaW5nKCk7CVxuIisKLQkJCSJ9CVxuIisKLQkJCSJhYnN0cmFjdCBjbGFzcyBDIGltcGxlbWVudHMgSSB7CVxuIisKLQkJCSJ9CVxuIgotCQl9LAotCQkiU1VDQ0VTUyIpOwotfQotCQkJCi1wdWJsaWMgdm9pZCB0ZXN0MTYoKSB7Ci0JdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkiWC5qYXZhIiwKLQkJCSJjbGFzcyBUIHsJXG4iKwotCQkJIiAgICAgIHZvaWQgZm9vKGJvb2xlYW4gYikge30JXG4iKwotCQkJIn0JXG4iKwotCQkJInB1YmxpYyBjbGFzcyBYIHsJXG4iKwotCQkJIiAgICAgIHZvaWQgZm9vKGludCBpKSB7fQlcbiIrCi0JCQkiICAgICAgdm9pZCBiYXIoKSB7CVxuIisKLQkJCSIgICAgICAgICAgICBuZXcgVCgpIHsJXG4iKwotCQkJIiAgICAgICAgICAgICAgICAgIHsJXG4iKwotCQkJIiAgICAgICAgICAgICAgICAgICAgICAgIGZvbygwKTsgCVxuIisKLQkJCSIgICAgICAgICAgICAgICAgICB9CVxuIisKLQkJCSIgICAgICAgICAgICB9OwlcbiIrCi0JCQkiICAgICAgfQlcbiIrCi0JCQkifSAJXG4iCi0JCX0sCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgOSlcbiIgKyAKLQkJIglmb28oMCk7IAlcbiIgKyAKLQkJIgleXl5cbiIgKyAKLQkJIlRoZSBtZXRob2QgZm9vKGJvb2xlYW4pIGluIHRoZSB0eXBlIFQgaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKGludClcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0MTcoKSB7Ci0JdGhpcy5ydW5Db25mb3JtVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJYLmphdmEiLAotCQkJImNsYXNzIFQgewlcbiIrCi0JCQkiICAgICAgdm9pZCBmb28oYm9vbGVhbiBiKSB7IFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7IH0JXG4iKwotCQkJIn0JXG4iKwotCQkJInB1YmxpYyBjbGFzcyBYIHsJXG4iKwotCQkJIiAgICAgIHZvaWQgZm9vKGludCBpKSB7fQlcbiIrCi0JCQkiICAgICAgdm9pZCBiYXIoKSB7CVxuIisKLQkJCSIgICAgICAgICAgICBuZXcgVCgpIHsJXG4iKwotCQkJIiAgICAgICAgICAgICAgICAgIHsJXG4iKwotCQkJIiAgICAgICAgICAgICAgICAgICAgICAgIGZvbyhmYWxzZSk7IAlcbiIrCi0JCQkiICAgICAgICAgICAgICAgICAgfQlcbiIrCi0JCQkiICAgICAgICAgICAgfTsJXG4iKwotCQkJIiAgICAgIH0JXG4iKwotCQkJIiAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3VtZW50cykgewlcbiIrCi0JCQkiCQkJbmV3IFgoKS5iYXIoKTsJXG4iICsKLQkJCSIgICAgICB9CVxuIisKLQkJCSJ9IAlcbiIKLQkJfSwKLQkJIlNVQ0NFU1MiKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdDE4KCkgewotCXRoaXMucnVuQ29uZm9ybVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkiWC5qYXZhIiwKLQkJCSJjbGFzcyBUIHsJXG4iKwotCQkJIiAgICAgIHZvaWQgZm9vKGludCBqKSB7IFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7IH0JXG4iKwotCQkJIn0JXG4iKwotCQkJInB1YmxpYyBjbGFzcyBYIHsJXG4iKwotCQkJIiAgICAgIHZvaWQgZm9vKGludCBpKSB7fQlcbiIrCi0JCQkiICAgICAgdm9pZCBiYXIoKSB7CVxuIisKLQkJCSIgICAgICAgICAgICBuZXcgVCgpIHsJXG4iKwotCQkJIiAgICAgICAgICAgICAgICAgIHsJXG4iKwotCQkJIiAgICAgICAgICAgICAgICAgICAgICAgIGZvbygwKTsgCVxuIisKLQkJCSIgICAgICAgICAgICAgICAgICB9CVxuIisKLQkJCSIgICAgICAgICAgICB9OwlcbiIrCi0JCQkiICAgICAgfQlcbiIrCi0JCQkiICAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndW1lbnRzKSB7CVxuIisKLQkJCSIJCQluZXcgWCgpLmJhcigpOwlcbiIgKwotCQkJIiAgICAgIH0JXG4iKwotCQkJIn0gCVxuIgotCQl9LAotCQkiU1VDQ0VTUyIpOwotfQotcHVibGljIHZvaWQgdGVzdDE5KCkgewotCXRoaXMucnVuQ29uZm9ybVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkiWC5qYXZhIiwKLQkJCSJjbGFzcyBUIHsJXG4iKwotCQkJIiAgICAgIHZvaWQgZm9vKGludCBqKSB7IFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7IH0JXG4iKwotCQkJIn0JXG4iKwotCQkJImNsYXNzIFUgewlcbiIrCi0JCQkiICAgICAgdm9pZCBmb28oaW50IGopIHsgU3lzdGVtLm91dC5wcmludGxuKFwiRkFJTEVEXCIpOyB9CVxuIisKLQkJCSJ9CVxuIisKLQkJCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIFUgewlcbiIrCi0JCQkiICAgICAgdm9pZCBiYXIoKSB7CVxuIisKLQkJCSIgICAgICAgICAgICBuZXcgVCgpIHsJXG4iKwotCQkJIiAgICAgICAgICAgICAgICAgIHsJXG4iKwotCQkJIiAgICAgICAgICAgICAgICAgICAgICAgIGZvbygwKTsgCVxuIisKLQkJCSIgICAgICAgICAgICAgICAgICB9CVxuIisKLQkJCSIgICAgICAgICAgICB9OwlcbiIrCi0JCQkiICAgICAgfQlcbiIrCi0JCQkiICAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndW1lbnRzKSB7CVxuIisKLQkJCSIJCQluZXcgWCgpLmJhcigpOwlcbiIgKwotCQkJIiAgICAgIH0JXG4iKwotCQkJIn0gCVxuIgotCQl9LAotCQkiU1VDQ0VTUyIpOwotfQotcHVibGljIHZvaWQgdGVzdDIwKCkgewotCXRoaXMucnVuQ29uZm9ybVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkiWC5qYXZhIiwKLQkJCSJjbGFzcyBUIHsJXG4iKwotCQkJIiAgICAgIHZvaWQgZm9vKGludCBqKSB7IFN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7IH0JXG4iKwotCQkJIn0JXG4iKwotCQkJImNsYXNzIFUgewlcbiIrCi0JCQkiICAgICAgdm9pZCBmb28oYm9vbGVhbiBqKSB7IFN5c3RlbS5vdXQucHJpbnRsbihcIkZBSUxFRFwiKTsgfQlcbiIrCi0JCQkifQlcbiIrCi0JCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBVIHsJXG4iKwotCQkJIiAgICAgIHZvaWQgYmFyKCkgewlcbiIrCi0JCQkiICAgICAgICAgICAgbmV3IFQoKSB7CVxuIisKLQkJCSIgICAgICAgICAgICAgICAgICB7CVxuIisKLQkJCSIgICAgICAgICAgICAgICAgICAgICAgICBmb28oMCk7IAlcbiIrCi0JCQkiICAgICAgICAgICAgICAgICAgfQlcbiIrCi0JCQkiICAgICAgICAgICAgfTsJXG4iKwotCQkJIiAgICAgIH0JXG4iKwotCQkJIiAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3VtZW50cykgewlcbiIrCi0JCQkiCQkJbmV3IFgoKS5iYXIoKTsJXG4iICsKLQkJCSIgICAgICB9CVxuIisKLQkJCSJ9IAlcbiIKLQkJfSwKLQkJIlNVQ0NFU1MiKTsKLX0KLS8vIGJpbmFyeSBjaGVjayBmb3IgMTE1MTEKLXB1YmxpYyB2b2lkIHRlc3QyMSgpIHsKLQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJInAxL1ouamF2YSIsCi0JCQkicGFja2FnZSBwMTsJXG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgWiBleHRlbmRzIEFic3RyYWN0QSB7CVxuIiArCi0JCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3VtZW50cykgewlcbiIgKwotCQkJIgkJbmV3IFooKS5pbml0KCk7IAlcbiIgKwotCQkJIgl9CVxuIiArCi0JCQkifQlcbiIgKwotCQkJImFic3RyYWN0IGNsYXNzIEFic3RyYWN0QiBpbXBsZW1lbnRzIEsgewlcbiIgKwotCQkJIglwdWJsaWMgdm9pZCBpbml0KCkgewlcbiIgKwotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKFwiQWJzdHJhY3RCLmluaXQoKVwiKTsJXG4iICsKLQkJCSIJfQlcbiIgKwotCQkJIn0JXG4iICsKLQkJCSJpbnRlcmZhY2UgSyB7CVxuIiArCi0JCQkiCXZvaWQgaW5pdCgpOwlcbiIgKwotCQkJIgl2b2lkIGluaXQoaW50IGkpOwlcbiIgKwotCQkJIn0JXG4iLAotCQkJInAxL0Fic3RyYWN0QS5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOwlcbiIgKwotCQkJInB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEEgZXh0ZW5kcyBBYnN0cmFjdEIgaW1wbGVtZW50cyBLIHsJXG4iICsKLQkJCSIJcHVibGljIHZvaWQgaW5pdChpbnQgaSkgewlcbiIgKwotCQkJIgl9CVxuIiArCi0JCQkifQlcbiIJCQkKLQkJfSwKLQkJIkFic3RyYWN0Qi5pbml0KCkiKTsgLy8gbm8gc3BlY2lhbCB2bSBhcmdzCQkJCi0KLQkJLy8gY2hlY2sgdGhhdCAibmV3IFooKS5pbml0KCkiIGlzIGJvdW5kIHRvICJaLmluaXQoKSIKLQkJZmluYWwgU3RyaW5nQnVmZmVyIHJlZmVyZW5jZXMgPSBuZXcgU3RyaW5nQnVmZmVyKDEwKTsKLQkJdHJ5IHsKLQkJCUJpbmFyeUluZGV4ZXIgaW5kZXhlciA9IG5ldyBCaW5hcnlJbmRleGVyKHRydWUpOwotCQkJaW5kZXhlci5pbmRleCgKLQkJCQluZXcgSURvY3VtZW50KCkgewotCQkJCQlwdWJsaWMgYnl0ZVtdIGdldEJ5dGVDb250ZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCQkJCXJldHVybiBVdGlsLmdldEZpbGVCeXRlQ29udGVudChuZXcgRmlsZShPVVRQVVRfRElSICsgIi9wMS9aLmNsYXNzIikpOwotCQkJCQl9Ci0JCQkJCXB1YmxpYyBjaGFyW10gZ2V0Q2hhckNvbnRlbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geyByZXR1cm4gbnVsbDsgfQotCQkJCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7IHJldHVybiAiWi5jbGFzcyI7IH0KLQkJCQkJcHVibGljIFN0cmluZyBnZXRTdHJpbmdDb250ZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsgcmV0dXJuIG51bGw7IH0KLQkJCQkJcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeyByZXR1cm4gImNsYXNzIjsgfQotCQkJCQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgeyByZXR1cm4gbnVsbDsgfQotCQkJCX0sIAotCQkJCW5ldyBJSW5kZXhlck91dHB1dCgpIHsKLQkJCQkJcHVibGljIHZvaWQgYWRkRG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50KSB7IH0KLQkJCQkJcHVibGljIHZvaWQgYWRkUmVmKGNoYXJbXSB3b3JkKSB7IAotCQkJCQkJcmVmZXJlbmNlcy5hcHBlbmQod29yZCk7Ci0JCQkJCQlyZWZlcmVuY2VzLmFwcGVuZCgnXG4nKTsKLQkJCQkJfQotCQkJCQlwdWJsaWMgdm9pZCBhZGRSZWYoU3RyaW5nIHdvcmQpIHsKLQkJCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKHdvcmQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewotCQl9Ci0JCVN0cmluZyBjb21wdXRlZFJlZmVyZW5jZXMgPSByZWZlcmVuY2VzLnRvU3RyaW5nKCk7Ci0JCWJvb2xlYW4gY2hlY2sgPSBjb21wdXRlZFJlZmVyZW5jZXMuaW5kZXhPZigiY29uc3RydWN0b3JSZWYvWi8wXG5tZXRob2RSZWYvaW5pdC8wIikgPj0gMDsKLQkJaWYgKCFjaGVjayl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oY29tcHV0ZWRSZWZlcmVuY2VzKTsKLQkJfQotCQlhc3NlcnRUcnVlKCJkaWQgbm90IGJpbmQgJ25ldyBaKCkuaW5pdCgpJyB0byBaLmluaXQoKSciLCBjaGVjayk7Ci19Ci0gLyoKLSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNTExCi0gKiB2YXJpYW50IC0gYXBwbGljYWJsZSBlcnJvciBkaWFnbm9zaXMKLSAqLwotcHVibGljIHZvaWQgdGVzdDIyKCkgewotCi0JdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkicDEvVC5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOwlcbiIrCi0JCQkiaW50ZXJmYWNlIElJIHt9CVxuIisKLQkJCSJjbGFzcyBUVCB7CVxuIisKLQkJCSIJdm9pZCBmb28oYm9vbGVhbiBiKSB7fQlcbiIrCi0JCQkiCXZvaWQgZm9vKGludCBpLCBib29sZWFuIGIpIHt9CVxuIisKLQkJCSIJdm9pZCBmb28oU3RyaW5nIHMpIHt9CVxuIisKLQkJCSJ9CVxuIisKLQkJCSJwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVCBpbXBsZW1lbnRzIElJIHsJXG4iKwotCQkJIgl2b2lkIGZvbyhpbnQgaSkge30JXG4iKwotCQkJIgl2b2lkIGJhcigpIHsJXG4iKwotCQkJIgkJbmV3IFRUKCkgewlcbiIrCi0JCQkiCQkJewlcbiIrCi0JCQkiCQkJCWZvbygwKTsgLy8gc2hvdWxkIHNheSB0aGF0IGZvbyhpbnQsIGJvb2xlYW4pIGlzbid0IGFwcGxpY2FibGUJXG4iKwotCQkJIgkJCX0JXG4iKwotCQkJIgkJfTsJXG4iKwotCQkJIgl9CVxuIisKLQkJCSIJdm9pZCBib28oKSB7CVxuIisKLQkJCSIJCW5ldyBUVCgpIHsJXG4iKwotCQkJIgkJCXsJXG4iKwotCQkJIgkJCQlmb28odHJ1ZSk7IC8vIHNob3VsZCBub3QgY29tcGxhaW4gYWJvdXQgYW1iaWd1aXR5CVxuIisKLQkJCSIJCQl9CVxuIisKLQkJCSIJCX07CVxuIisKLQkJCSIJfQlcbiIrCi0JCQkifSAJXG4iCi0JCX0sCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIxLiBFUlJPUiBpbiBwMVxcVC5qYXZhIChhdCBsaW5lIDEzKVxuIiArIAotCQkiCWZvbygwKTsgLy8gc2hvdWxkIHNheSB0aGF0IGZvbyhpbnQsIGJvb2xlYW4pIGlzblwndCBhcHBsaWNhYmxlCVxuIiArIAotCQkiCV5eXlxuIiArIAotCQkiVGhlIG1ldGhvZCBmb28oaW50LCBib29sZWFuKSBpbiB0aGUgdHlwZSBUVCBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoaW50KVxuIiArIAotCQkiLS0tLS0tLS0tLVxuIik7Ci19Ci0gICAKLSAvKgotICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE1MTEKLSAqIHZhcmlhbnQgLSBhcHBsaWNhYmxlIGVycm9yIGRpYWdub3NpcwotICovCi1wdWJsaWMgdm9pZCB0ZXN0MjMoKSB7Ci0KLQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJwMS9ULmphdmEiLAotCQkJInBhY2thZ2UgcDE7CVxuIisKLQkJCSJpbnRlcmZhY2UgSUkge30JXG4iKwotCQkJImFic3RyYWN0IGNsYXNzIFRUIHsJXG4iKwkJLy8gMjU5K0FCU1RSQUNUCi0JCQkiCXZvaWQgZm9vKGJvb2xlYW4gYikge30JXG4iKwotCQkJIgl2b2lkIGZvbyhpbnQgaSwgYm9vbGVhbiBiKSB7fQlcbiIrCi0JCQkiCXZvaWQgZm9vKFN0cmluZyBzKSB7fQlcbiIrCi0JCQkifQlcbiIrCi0JCQkicHVibGljIGFic3RyYWN0IGNsYXNzIFQgaW1wbGVtZW50cyBJSSB7CVxuIisKLQkJCSIJdm9pZCBmb28oaW50IGkpIHt9CVxuIisKLQkJCSIJdm9pZCBiYXIoKSB7CVxuIisKLQkJCSIJCW5ldyBUVCgpIHsJXG4iKwotCQkJIgkJCXsJXG4iKwotCQkJIgkJCQlmb28oMCk7IC8vIHNob3VsZCBzYXkgdGhhdCBmb28oaW50LCBib29sZWFuKSBpc24ndCBhcHBsaWNhYmxlCVxuIisKLQkJCSIJCQl9CVxuIisKLQkJCSIJCX07CVxuIisKLQkJCSIJfQlcbiIrCi0JCQkiCXZvaWQgYm9vKCkgewlcbiIrCi0JCQkiCQluZXcgVFQoKSB7CVxuIisKLQkJCSIJCQl7CVxuIisKLQkJCSIJCQkJZm9vKHRydWUpOyAvLyBzaG91bGQgY29tcGxhaW4gYW1iaWd1aXR5CVxuIisKLQkJCSIJCQl9CVxuIisKLQkJCSIJCX07CVxuIisKLQkJCSIJfQlcbiIrCi0JCQkifSAJXG4iCi0JCX0sCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIxLiBFUlJPUiBpbiBwMVxcVC5qYXZhIChhdCBsaW5lIDEzKVxuIiArIAotCQkiCWZvbygwKTsgLy8gc2hvdWxkIHNheSB0aGF0IGZvbyhpbnQsIGJvb2xlYW4pIGlzblwndCBhcHBsaWNhYmxlCVxuIiArIAotCQkiCV5eXlxuIiArIAotCQkiVGhlIG1ldGhvZCBmb28oaW50LCBib29sZWFuKSBpbiB0aGUgdHlwZSBUVCBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhlIGFyZ3VtZW50cyAoaW50KVxuIiArIAotCQkiLS0tLS0tLS0tLVxuIik7Ci19Ci0vKgotICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE1MTEKLSAqIHZhcmlhbnQgLSBhcHBsaWNhYmxlIGVycm9yIGRpYWdub3NpcwotICovCi1wdWJsaWMgdm9pZCB0ZXN0MjQoKSB7Ci0KLQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJwMS9YLmphdmEiLAotCQkJInBhY2thZ2UgcDE7CVxuIisKLQkJCSJpbnRlcmZhY2UgSUkge30JXG4iKwotCQkJImFic3RyYWN0IGNsYXNzIFQgaW1wbGVtZW50cyBJSSB7CVxuIisKLQkJCSIJdm9pZCBmb28oYm9vbGVhbiBiKSB7fQlcbiIrCi0JCQkiCXZvaWQgZm9vKGludCBpLCBib29sZWFuIGIpIHt9CVxuIisKLQkJCSJ9CVxuIisKLQkJCSJhYnN0cmFjdCBjbGFzcyBUVCBpbXBsZW1lbnRzIElJIHsJXG4iKwotCQkJIgl2b2lkIGZvbyhib29sZWFuIGIpIHt9CVxuIisKLQkJCSJ9CVxuIisKLQkJCSJwdWJsaWMgY2xhc3MgWCB7CVxuIisKLQkJCSIJdm9pZCBmb28oaW50IGkpIHt9CVxuIisKLQkJCSIJdm9pZCBiYXIoKSB7CVxuIisKLQkJCSIJCW5ldyBUKCkgewlcbiIrCi0JCQkiCQkJewlcbiIrCi0JCQkiCQkJCWZvbygwKTsgLy8gamF2YWMgc2F5cyBmb28gY2Fubm90IGJlIHJlc29sdmVkIGJlY2F1c2Ugb2YgbXVsdGlwbGUgbWF0Y2hlcwlcbiIrCi0JCQkiCQkJfQlcbiIrCi0JCQkiCQl9OwlcbiIrCi0JCQkiCX0JXG4iKwotCQkJIgl2b2lkIGJhcjIoKSB7CVxuIisKLQkJCSIJCW5ldyBUVCgpIHsJXG4iKwotCQkJIgkJCXsJXG4iKwotCQkJIgkJCQlmb28oMCk7IC8vIHNob3VsZCBzYXkgdGhhdCBmb28oYm9vbGVhbikgaXNuJ3QgYXBwbGljYWJsZQlcbiIrCi0JCQkiCQkJfQlcbiIrCi0JCQkiCQl9OwlcbiIrCi0JCQkiCX0JXG4iKwotCQkJIgl2b2lkIGJvbygpIHsJXG4iKwotCQkJIgkJbmV3IFQoKSB7CVxuIisKLQkJCSIJCQl7CVxuIisKLQkJCSIJCQkJZm9vKHRydWUpOyAvLyBzaG91bGQgY29tcGxhaW4gYW1iaWd1aXR5CVxuIisKLQkJCSIJCQl9CVxuIisKLQkJCSIJCX07CVxuIisKLQkJCSIJfQlcbiIrCi0JCQkifQlcbiIKLQkJfSwKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjEuIEVSUk9SIGluIHAxXFxYLmphdmEgKGF0IGxpbmUgMTUpXG4iICsgCi0JCSIJZm9vKDApOyAvLyBqYXZhYyBzYXlzIGZvbyBjYW5ub3QgYmUgcmVzb2x2ZWQgYmVjYXVzZSBvZiBtdWx0aXBsZSBtYXRjaGVzCVxuIiArIAotCQkiCV5eXlxuIiArIAotCQkiVGhlIG1ldGhvZCBmb28oaW50LCBib29sZWFuKSBpbiB0aGUgdHlwZSBUIGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChpbnQpXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIyLiBFUlJPUiBpbiBwMVxcWC5qYXZhIChhdCBsaW5lIDIyKVxuIiArIAotCQkiCWZvbygwKTsgLy8gc2hvdWxkIHNheSB0aGF0IGZvbyhib29sZWFuKSBpc25cJ3QgYXBwbGljYWJsZQlcbiIgKyAKLQkJIgleXl5cbiIgKyAKLQkJIlRoZSBtZXRob2QgZm9vKGJvb2xlYW4pIGluIHRoZSB0eXBlIFRUIGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChpbnQpXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iKTsKLX0KLQotLyoKLSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNTExCi0gKiB2YXJpYW50IC0gYXBwbGljYWJsZSBlcnJvciBkaWFnbm9zaXMgKG5vIG1hdHRlciBpZiBzdXBlciBpcyBhYnN0cmFjdCBvciBub3QpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QyNSgpIHsKLQotCXRoaXMucnVuTmVnYXRpdmVUZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJInAxL1guamF2YSIsCi0JCQkicGFja2FnZSBwMTsJXG4iKwotCQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgQWJzdHJhY3RZIHsJXG4iKwotCQkJIgl2b2lkIGJhcigpewlcbiIrCi0JCQkiCQlpbml0KFwiaGVsbG9cIik7CVxuIisKLQkJCSIJfQkJXG4iKwotCQkJIn0JXG4iKwotCQkJImFic3RyYWN0IGNsYXNzIEFic3RyYWN0WSBpbXBsZW1lbnRzIEkgewlcbiIrCi0JCQkifQlcbiIrCi0JCQkiaW50ZXJmYWNlIEkgewlcbiIrCi0JCQkiCXZvaWQgaW5pdChTdHJpbmcgcywgaW50IGkpOwlcbiIrCi0JCQkifQlcbiIKLQkJfSwKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjEuIEVSUk9SIGluIHAxXFxYLmphdmEgKGF0IGxpbmUgMilcbiIgKyAKLQkJIglwdWJsaWMgY2xhc3MgWCBleHRlbmRzIEFic3RyYWN0WSB7CVxuIiArIAotCQkiCSAgICAgICAgICAgICBeXG4iICsgCi0JCSJDbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgaW5oZXJpdGVkIGFic3RyYWN0IG1ldGhvZCBJLmluaXQoU3RyaW5nLCBpbnQpXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIyLiBFUlJPUiBpbiBwMVxcWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCi0JCSIJaW5pdChcImhlbGxvXCIpOwlcbiIgKyAKLQkJIgleXl5eXG4iICsgCi0JCSJUaGUgbWV0aG9kIGluaXQoU3RyaW5nLCBpbnQpIGluIHRoZSB0eXBlIEkgaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoZSBhcmd1bWVudHMgKFN0cmluZylcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIpOwotfQotCi0vKgotICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE1MTEKLSAqIHZhcmlhbnQgLSBhcHBsaWNhYmxlIGVycm9yIGRpYWdub3NpcyAobm8gbWF0dGVyIGlmIHN1cGVyIGlzIGFic3RyYWN0IG9yIG5vdCkKLSAqLwotcHVibGljIHZvaWQgdGVzdDI2KCkgewotCi0JdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkicDEvWC5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOwlcbiIrCi0JCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBBYnN0cmFjdFkgewlcbiIrCi0JCQkiCXZvaWQgYmFyKCl7CVxuIisKLQkJCSIJCWluaXQoXCJoZWxsb1wiKTsJXG4iKwotCQkJIgl9CQlcbiIrCi0JCQkifQlcbiIrCi0JCQkiY2xhc3MgQWJzdHJhY3RZIGltcGxlbWVudHMgSSB7CVxuIisKLQkJCSJ9CVxuIisKLQkJCSJpbnRlcmZhY2UgSSB7CVxuIisKLQkJCSIJdm9pZCBpbml0KFN0cmluZyBzLCBpbnQgaSk7CVxuIisKLQkJCSJ9CVxuIgotCQl9LAotCQkiLS0tLS0tLS0tLVxuIiArIAotCQkiMS4gRVJST1IgaW4gcDFcXFguamF2YSAoYXQgbGluZSA0KVxuIiArIAotCQkiCWluaXQoXCJoZWxsb1wiKTsJXG4iICsgCi0JCSIJXl5eXlxuIiArIAotCQkiVGhlIG1ldGhvZCBpbml0KFN0cmluZywgaW50KSBpbiB0aGUgdHlwZSBJIGlzIG5vdCBhcHBsaWNhYmxlIGZvciB0aGUgYXJndW1lbnRzIChTdHJpbmcpXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIyLiBFUlJPUiBpbiBwMVxcWC5qYXZhIChhdCBsaW5lIDcpXG4iICsgCi0JCSIJY2xhc3MgQWJzdHJhY3RZIGltcGxlbWVudHMgSSB7CVxuIiArIAotCQkiCSAgICAgIF5eXl5eXl5eXlxuIiArIAotCQkiQ2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlIGluaGVyaXRlZCBhYnN0cmFjdCBtZXRob2QgSS5pbml0KFN0cmluZywgaW50KVxuIiArIAotCQkiLS0tLS0tLS0tLVxuIgotKTsKLX0KLS8qCi0gKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTkyMgotICogc2hvdWxkIHJlcG9ydCB1bnJlYWNoYWJsZSBlbXB0eSBzdGF0ZW1lbnQKLSAqLwotcHVibGljIHZvaWQgdGVzdDI3KCkgewotCi0JdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkicDEvWC5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOwlcbiIrCi0JCQkicHVibGljIGNsYXNzIFggewlcbiIrCi0JCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3VtZW50cykgewlcbiIrCi0JCQkiCQlmb3IgKDtmYWxzZTtwKCkpOwlcbiIrCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpOwlcbiIrCi0JCQkiCX0JXG4iKwotCQkJIglzdGF0aWMgdm9pZCBwKCl7CVxuIisKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihcIkZBSUxFRFwiKTsJXG4iKwotCQkJIgl9CVxuIisKLQkJCSJ9CVxuIgotCQl9LAotCQkiLS0tLS0tLS0tLVxuIiArIAotCQkiMS4gRVJST1IgaW4gcDFcXFguamF2YSAoYXQgbGluZSA0KVxuIiArIAotCQkiCWZvciAoO2ZhbHNlO3AoKSk7CVxuIiArIAotCQkiCSAgICAgICAgICAgICAgICBeXG4iICsgCi0JCSJVbnJlYWNoYWJsZSBjb2RlXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iKTsKLX0KLS8qCi0gKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjQ0NQotICogc2hvdWxkIHJlcG9ydCB1bnJlYWNoYWJsZSBlbXB0eSBzdGF0ZW1lbnQKLSAqLwotcHVibGljIHZvaWQgdGVzdDI4KCkgewotCi0JdGhpcy5ydW5Db25mb3JtVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJwMS9YLmphdmEiLAotCQkJInBhY2thZ2UgcDE7CVxuIiArCi0JCQkiaW50ZXJmYWNlIEZvb0ludGVyZmFjZSB7CVxuIiArCi0JCQkiCXB1YmxpYyBib29sZWFuIGZvbyhpbnQgYSk7CVxuIiArCi0JCQkiCXB1YmxpYyBib29sZWFuIGJhcihpbnQgYSk7CVxuIiArCi0JCQkifQlcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgWiB7CVxuIiArCi0JCQkiCXB1YmxpYyBib29sZWFuIGZvbyhpbnQgYSl7IHJldHVybiB0cnVlOyB9CVxuIiArCi0JCQkiCXB1YmxpYyBib29sZWFuIGJhcihpbnQgYSl7IHJldHVybiBmYWxzZTsgfQlcbiIgKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd1bWVudHMpIHsJXG4iKwotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKG5ldyBYKCkudGVzdCgwKSk7CVxuIisKLQkJCSIJfQlcbiIgKwotCQkJIn1cbiIgKwotCQkJImFic3RyYWN0IGNsYXNzIFogaW1wbGVtZW50cyBGb29JbnRlcmZhY2UgewlcbiIgKwotCQkJIglwdWJsaWMgYm9vbGVhbiBmb28oaW50IGEsIGludCBiKSB7CVxuIiArCi0JCQkiCQlyZXR1cm4gdHJ1ZTsJXG4iICsKLQkJCSIJfQlcbiIgKwotCQkJIglwdWJsaWMgU3RyaW5nIHRlc3QoaW50IGEpIHsJXG4iICsKLQkJCSIJCWJvb2xlYW4gcmVzdWx0ID0gZm9vKGEpOyBcbiIgKwotCQkJIgkJaWYgKHJlc3VsdCkJXG4iICsKLQkJCSIJCQlyZXR1cm4gXCJTVUNDRVNTXCI7CVxuIiArCi0JCQkiCQllbHNlCVxuIiArCi0JCQkiCQkJcmV0dXJuIFwiRkFJTEVEXCI7CVxuIiArCi0JCQkiCX0JXG4iICsKLQkJCSJ9CVxuIgotCQl9LAotCQkiU1VDQ0VTUyIpOwotfQotCi0vKgotICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE1ODAKLSAqIHZlcmlmeSBlcnJvciBvbiBxdWFsaWZpZWQgbmFtZSByZWYgaW4gMS40Ci0gKi8KLXB1YmxpYyB2b2lkIHRlc3QyOSgpIHsKLQotCXRoaXMucnVuQ29uZm9ybVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkicC9YLmphdmEiLAotCQkJInBhY2thZ2UgcDsJXG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgWCB7CVxuIiArCi0JCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsJXG4iICsKLQkJCSIJCW5ldyBYKCk7CVxuIiArCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpOwlcbiIgKwotCQkJIgl9ICAJXG4iICsKLQkJCSIJV29vZiB3b29mXzE7CVxuIiArCi0JCQkiCXB1YmxpYyBjbGFzcyBIb25rIHsJXG4iICsKLQkJCSIJCUludGVnZXIgaG9ua3M7CVxuIiArCi0JCQkiCX0JXG4iICsKLQkJCSIJcHVibGljIGNsYXNzIE1lb3cgewlcbiIgKwotCQkJIgkJSG9uayBob25rXzE7CVxuIiArCi0JCQkiCX0JXG4iICsKLQkJCSIJcHVibGljIGNsYXNzIFdvb2YgewlcbiIgKwotCQkJIgkJTWVvdyBtZW93XzE7CVxuIiArCi0JCQkiCX0JXG4iICsKLQkJCSIJcHVibGljIHZvaWQgc2V0SG9ua3MoaW50IG51bSkgewlcbiIgKwotCQkJIgkJLy8gVGhpcyBpcyB0aGUgbGluZSB0aGF0IGNhdXNlcyB0aGUgVmVyaWZ5RXJyb3IJXG4iICsKLQkJCSIJCXdvb2ZfMS5tZW93XzEuaG9ua18xLmhvbmtzID0gbmV3IEludGVnZXIobnVtKTsJXG4iICsKLQkJCSIJCS8vIEhlcmUgaXMgZXF1aXZhbGVudCBjb2RlIHRoYXQgZG9lcyBub3QgY2F1c2UgdGhlIGVycm9yLglcbiIgKwotCQkJIgkJLy8gIEhvbmsgaCA9IHdvb2ZfMS5tb29fMS5tZW93XzEuaG9ua18xOwlcbiIgKwotCQkJIgkJLy8gIGguaG9ua3MgPSBuZXcgSW50ZWdlcihudW0pOwlcbiIgKwotCQkJIgl9CVxuIiArCi0JCQkifQlcbiIKLQkJfSwKLQkJIlNVQ0NFU1MiKTsKLX0KLQotLyoKLSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNTgwCi0gKiAxLjQgc2lnbmFscyBpbnZvY2F0aW9ucyBvZiBub24tdmlzaWJsZSBhYnN0cmFjdCBwcm90ZWN0ZWQgbWV0aG9kIGltcGxlbWVudGF0aW9ucy4KLSAqLwotcHVibGljIHZvaWQgdGVzdDMwKCkgewotCQotCXRoaXMucnVuTmVnYXRpdmVUZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJInAvWC5qYXZhIiwKLQkJCSJwYWNrYWdlIHA7CVxuIiArCi0JCQkicHVibGljIGNsYXNzIFggewlcbiIgKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKXsJXG4iICsKLQkJCSIJCW5ldyBxLlgyKCkuZm9vKFwiU3RyaW5nXCIpOwlcbiIgKwotCQkJIgkJbmV3IHEuWDIoKS5iYXIoXCJTdHJpbmdcIik7CVxuIiArCi0JCQkiCQluZXcgcS5YMigpLmJhcmJhcihcIlN0cmluZ1wiKTsJXG4iICsKLQkJCSIJCW5ldyBxLlgyKCkuYmF6KFwiU3RyaW5nXCIpOwlcbiIgKwotCQkJIgl9CVxuIiArCi0JCQkifQlcbiIsCi0JCQkKLQkJCSJwL1gxLmphdmEiLAotCQkJInBhY2thZ2UgcDsJXG4iICsKLQkJCSJwdWJsaWMgYWJzdHJhY3QgY2xhc3MgWDEgewlcbiIgKwotCQkJIglwcm90ZWN0ZWQgdm9pZCBmb28oT2JqZWN0IG8pewlTeXN0ZW0ub3V0LnByaW50bG4oXCJYMS5mb28oT2JqZWN0KVwiKTsgfQlcbiIgKwotCQkJIglwcm90ZWN0ZWQgdm9pZCBiYXIoT2JqZWN0IG8pewlTeXN0ZW0ub3V0LnByaW50bG4oXCJYMS5iYXIoT2JqZWN0KVwiKTsgfQlcbiIgKwotCQkJIgl2b2lkIGJhcmJhcihPYmplY3Qgbyl7CVN5c3RlbS5vdXQucHJpbnRsbihcIlgxLmJhcmJhcihPYmplY3QpXCIpOyB9CVxuIiArCi0JCQkiCXByb3RlY3RlZCB2b2lkIGJheihPYmplY3QgbykgeyBTeXN0ZW0ub3V0LnByaW50bG4oXCJYMS5iYXooT2JqZWN0KVwiKTsgfQlcbiIgKwotCQkJIn0JXG4iLAotCQkJCi0JCQkicS9YMi5qYXZhIiwKLQkJCSJwYWNrYWdlIHE7CVxuIiArCi0JCQkicHVibGljIGNsYXNzIFgyIGV4dGVuZHMgcC5YMSB7CVxuIiArCi0JCQkiCXByb3RlY3RlZCB2b2lkIGZvbyhpbnQgaSkgeyBTeXN0ZW0ub3V0LnByaW50bG4oXCJYMi5mb28oaW50KVwiKTsgfQlcbiIgKwotCQkJIglwcm90ZWN0ZWQgdm9pZCBiYXIoT2JqZWN0IG8pIHsgU3lzdGVtLm91dC5wcmludGxuKFwiWDIuYmFyKE9iamVjdClcIik7IH0JXG4iICsKLQkJCSIJdm9pZCBiYXJiYXIoT2JqZWN0IG8pewlTeXN0ZW0ub3V0LnByaW50bG4oXCJYMi5iYXJiYXIoT2JqZWN0KVwiKTsgfQlcbiIgKwotCQkJIglwcm90ZWN0ZWQgdm9pZCBiYXooU3RyaW5nIHMpIHsJU3lzdGVtLm91dC5wcmludGxuKFwiWDIuYmF6KFN0cmluZylcIik7IH0JXG4iICsKLQkJCSJ9CVxuIiwKLQkJfSwKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjEuIEVSUk9SIGluIHBcXFguamF2YSAoYXQgbGluZSA1KVxuIiArIAotCQkiCW5ldyBxLlgyKCkuYmFyKFwiU3RyaW5nXCIpOwlcbiIgKyAKLQkJIgkgICAgICAgICAgIF5eXlxuIiArIAotCQkiVGhlIG1ldGhvZCBiYXIoT2JqZWN0KSBmcm9tIHRoZSB0eXBlIFgyIGlzIG5vdCB2aXNpYmxlXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIyLiBFUlJPUiBpbiBwXFxYLmphdmEgKGF0IGxpbmUgNilcbiIgKyAKLQkJIgluZXcgcS5YMigpLmJhcmJhcihcIlN0cmluZ1wiKTsJXG4iICsgCi0JCSIJICAgICAgICAgICBeXl5eXl5cbiIgKyAKLQkJIlRoZSBtZXRob2QgYmFyYmFyKE9iamVjdCkgZnJvbSB0aGUgdHlwZSBYMiBpcyBub3QgdmlzaWJsZVxuIiArIAotCQkiLS0tLS0tLS0tLVxuIiArIAotCQkiLS0tLS0tLS0tLVxuIiArIAotCQkiMS4gV0FSTklORyBpbiBxXFxYMi5qYXZhIChhdCBsaW5lIDUpXG4iICsgCi0JCSIJdm9pZCBiYXJiYXIoT2JqZWN0IG8pewlTeXN0ZW0ub3V0LnByaW50bG4oXCJYMi5iYXJiYXIoT2JqZWN0KVwiKTsgfQlcbiIgKyAKLQkJIgkgICAgIF5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKLQkJIlRoZSBtZXRob2QgWDIuYmFyYmFyKE9iamVjdCkgZG9lcyBub3Qgb3ZlcnJpZGUgdGhlIGluaGVyaXRlZCBtZXRob2QgZnJvbSBYMSBzaW5jZSBpdCBpcyBwcml2YXRlIHRvIGEgZGlmZmVyZW50IHBhY2thZ2UuXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iKTsKLX0KLQotLyoKLSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNTgwCi0gKiAxLjQgc2lnbmFscyBpbnZvY2F0aW9ucyBvZiBub24tdmlzaWJsZSBhYnN0cmFjdCBwcm90ZWN0ZWQgbWV0aG9kIGltcGxlbWVudGF0aW9ucy4KLSAqLwotcHVibGljIHZvaWQgdGVzdDMxKCkgewotCQotCXRoaXMucnVuTmVnYXRpdmVUZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJInAvWC5qYXZhIiwKLQkJCSJwYWNrYWdlIHA7CVxuIiArCi0JCQkicHVibGljIGNsYXNzIFggZXh0ZW5kcyBxLlgyIHsJXG4iICsKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncyl7CVxuIiArCi0JCQkiCQkJbmV3IFgoKS5kb1NvbWV0aGluZygpOwlcbiIgKwotCQkJIgl9CVxuIiArCi0JCQkiCXZvaWQgZG9Tb21ldGhpbmcoKXsJXG4iICsKLQkJCSIJCWZvbyhcIlN0cmluZ1wiKTsJXG4iICsKLQkJCSIJCWJhcihcIlN0cmluZ1wiKTsJXG4iICsKLQkJCSIJCWJhcmJhcihcIlN0cmluZ1wiKTsJXG4iICsKLQkJCSIJCWJheihcIlN0cmluZ1wiKTsJXG4iICsKLQkJCSIJfQlcbiIgKwotCQkJIn0JXG4iLAotCQkJCi0JCQkicC9YMS5qYXZhIiwKLQkJCSJwYWNrYWdlIHA7CVxuIiArCi0JCQkicHVibGljIGFic3RyYWN0IGNsYXNzIFgxIHsJXG4iICsKLQkJCSIJcHJvdGVjdGVkIHZvaWQgZm9vKE9iamVjdCBvKXsJU3lzdGVtLm91dC5wcmludGxuKFwiWDEuZm9vKE9iamVjdClcIik7IH0JXG4iICsKLQkJCSIJcHJvdGVjdGVkIHZvaWQgYmFyKE9iamVjdCBvKXsJU3lzdGVtLm91dC5wcmludGxuKFwiWDEuYmFyKE9iamVjdClcIik7IH0JXG4iICsKLQkJCSIJdm9pZCBiYXJiYXIoT2JqZWN0IG8pewlTeXN0ZW0ub3V0LnByaW50bG4oXCJYMS5iYXJiYXIoT2JqZWN0KVwiKTsgfQlcbiIgKwotCQkJIglwcm90ZWN0ZWQgdm9pZCBiYXooT2JqZWN0IG8pIHsgU3lzdGVtLm91dC5wcmludGxuKFwiWDEuYmF6KE9iamVjdClcIik7IH0JXG4iICsKLQkJCSJ9CVxuIiwKLQkJCQotCQkJInEvWDIuamF2YSIsCi0JCQkicGFja2FnZSBxOwlcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBYMiBleHRlbmRzIHAuWDEgewlcbiIgKwotCQkJIglwcm90ZWN0ZWQgdm9pZCBmb28oaW50IGkpIHsgU3lzdGVtLm91dC5wcmludGxuKFwiWDIuZm9vKGludClcIik7IH0JXG4iICsKLQkJCSIJcHJvdGVjdGVkIHZvaWQgYmFyKE9iamVjdCBvKSB7IFN5c3RlbS5vdXQucHJpbnRsbihcIlgyLmJhcihPYmplY3QpXCIpOyB9CVxuIiArCi0JCQkiCXZvaWQgYmFyYmFyKE9iamVjdCBvKXsJU3lzdGVtLm91dC5wcmludGxuKFwiWDIuYmFyYmFyKE9iamVjdClcIik7IH0JXG4iICsKLQkJCSIJcHJvdGVjdGVkIHZvaWQgYmF6KFN0cmluZyBzKSB7CVN5c3RlbS5vdXQucHJpbnRsbihcIlgyLmJheihTdHJpbmcpXCIpOyB9CVxuIiArCi0JCQkifQlcbiIsCi0JCX0sCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIxLiBFUlJPUiBpbiBwXFxYLmphdmEgKGF0IGxpbmUgOSlcbiIgKyAKLQkJIgliYXJiYXIoXCJTdHJpbmdcIik7CVxuIiArIAotCQkiCV5eXl5eXlxuIiArIAotCQkiVGhlIG1ldGhvZCBiYXJiYXIoT2JqZWN0KSBmcm9tIHRoZSB0eXBlIFgyIGlzIG5vdCB2aXNpYmxlXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIxLiBXQVJOSU5HIGluIHFcXFgyLmphdmEgKGF0IGxpbmUgNSlcbiIgKyAKLQkJIgl2b2lkIGJhcmJhcihPYmplY3Qgbyl7CVN5c3RlbS5vdXQucHJpbnRsbihcIlgyLmJhcmJhcihPYmplY3QpXCIpOyB9CVxuIiArIAotCQkiCSAgICAgXl5eXl5eXl5eXl5eXl5eXlxuIiArIAotCQkiVGhlIG1ldGhvZCBYMi5iYXJiYXIoT2JqZWN0KSBkb2VzIG5vdCBvdmVycmlkZSB0aGUgaW5oZXJpdGVkIG1ldGhvZCBmcm9tIFgxIHNpbmNlIGl0IGlzIHByaXZhdGUgdG8gYSBkaWZmZXJlbnQgcGFja2FnZS5cbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIKLSk7Ci19Ci0JCQkKLS8qCi0gKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTU4MAotICogMS40IHNpZ25hbHMgaW52b2NhdGlvbnMgb2Ygbm9uLXZpc2libGUgYWJzdHJhY3QgcHJvdGVjdGVkIGZpZWxkIGltcGxlbWVudGF0aW9ucy4KLSAqLwotcHVibGljIHZvaWQgdGVzdDMyKCkgewotCQotCXRoaXMucnVuTmVnYXRpdmVUZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJInAvWC5qYXZhIiwKLQkJCSJwYWNrYWdlIHA7CVxuIiArCi0JCQkicHVibGljIGNsYXNzIFggewlcbiIgKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKXsJXG4iICsKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihuZXcgcS5YMigpLmZvbyk7CVxuIiArCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4obmV3IHEuWDIoKS5iYXIpOwlcbiIgKwotCQkJIgl9CVxuIiArCi0JCQkifQlcbiIsCi0JCQkKLQkJCSJwL1gxLmphdmEiLAotCQkJInBhY2thZ2UgcDsJXG4iICsKLQkJCSJwdWJsaWMgYWJzdHJhY3QgY2xhc3MgWDEgewlcbiIgKwotCQkJIglwcm90ZWN0ZWQgU3RyaW5nIGZvbyA9IFwiWDEuZm9vXCI7IAlcbiIgKwotCQkJIglTdHJpbmcgYmFyID0gXCJYMS5iYXJcIjsJXG4iICsKLQkJCSJ9CVxuIiwKLQkJCQotCQkJInEvWDIuamF2YSIsCi0JCQkicGFja2FnZSBxOwlcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBYMiBleHRlbmRzIHAuWDEgewlcbiIgKwotCQkJIglwcm90ZWN0ZWQgU3RyaW5nIGZvbyA9IFwiWDIuZm9vXCI7CVxuIiArCi0JCQkiCVN0cmluZyBiYXIgPSBcIlgyLmJhclwiOwlcbiIgKwotCQkJIn0JXG4iLAotCQl9LAotCQkiLS0tLS0tLS0tLVxuIiArIAotCQkiMS4gRVJST1IgaW4gcFxcWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCi0JCSIJU3lzdGVtLm91dC5wcmludGxuKG5ldyBxLlgyKCkuZm9vKTsJXG4iICsgCi0JCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXG4iICsgCi0JCSJUaGUgZmllbGQgZm9vIGlzIG5vdCB2aXNpYmxlXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIyLiBFUlJPUiBpbiBwXFxYLmphdmEgKGF0IGxpbmUgNSlcbiIgKyAKLQkJIglTeXN0ZW0ub3V0LnByaW50bG4obmV3IHEuWDIoKS5iYXIpOwlcbiIgKyAKLQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5cbiIgKyAKLQkJIlRoZSBmaWVsZCBiYXIgaXMgbm90IHZpc2libGVcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIpOwotfQotCi0vKgotICogSW5pdGlhbGl6YXRpb24gb2Ygc3ludGhldGljIGZpZWxkcyBwcmlvciB0byBzdXBlciBjb25zdHJ1Y3RvciBjYWxsCi0gKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzA3NQotICovCi1wdWJsaWMgdm9pZCB0ZXN0MzMoKSB7Ci0KLQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJIkEuamF2YSIsCi0JCQkicHVibGljIGNsYXNzIEEgewlcbiIrCi0JCQkiICBwdWJsaWMgaW50IG07CVxuIisKLQkJCSIgIHB1YmxpYyB2b2lkIHBwKCkgewlcbiIrCi0JCQkiICAgICBDIGMgPSBuZXcgQyg0KTsJXG4iKwotCQkJIiAgICAgU3lzdGVtLm91dC5wcmludGxuKGMuZ2V0KCkpOwlcbiIrCi0JCQkiICB9CVxuIisKLQkJCSIgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsJXG4iKwotCQkJIiAgICAgQSBhID0gbmV3IEEoKTsJXG4iKwotCQkJIgkgIHRyeSB7CVxuIisKLQkJCSIgICAgICAgYS5wcCgpOyAJXG4iKwotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKFwiU3ludGhldGljSW5pdCBCRUZPUkUgU3VwZXJDb25zdHJ1Y3RvckNhbGxcIik7CVxuIisKLQkJCSIJICB9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsJXG4iKwotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKFwiU3ludGhldGljSW5pdCBBRlRFUiBTdXBlckNvbnN0cnVjdG9yQ2FsbFwiKTsgLy8gc2hvdWxkIG5vIGxvbmdlciBvY2N1ciB3aXRoIHRhcmdldCAxLjQgXG4iKwotCQkJIgkgIH0JXG4iKwotCQkJIiAgfQlcbiIrCi0JCQkiICBjbGFzcyBDIGV4dGVuZHMgQiB7CVxuIisKLQkJCSIgICAgcHVibGljIEMoaW50IHgxKSB7CVxuIisKLQkJCSIgICAgICBzdXBlcih4MSk7ICAgIAlcbiIrCi0JCQkiICAgIH0JXG4iKwotCQkJIiAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KGludCB4MSkgewlcbiIrCi0JCQkiICAgICAgIHggPSBtICogeDE7IC8vIDwtIE5VTEwgUE9JTlRFUiBFWENFUFRJT04gYmVjYXVzZSBvZiBtCVxuIisKLQkJCSIgICAgfSAgCVxuIisKLQkJCSIgIH0JXG4iKwotCQkJIn0JXG4iKwotCQkJImNsYXNzIEIgewlcbiIrCi0JCQkiICBpbnQgeDsJXG4iKwotCQkJIiAgcHVibGljIEIoaW50IHgxKSB7CVxuIisKLQkJCSIgICAgaW5pdCh4MSk7CVxuIisKLQkJCSIgIH0JXG4iKwotCQkJIiAgcHJvdGVjdGVkIHZvaWQgaW5pdChpbnQgeDEpIHsJXG4iKwotCQkJIiAgICB4ICA9IHgxOwlcbiIrCi0JCQkiICB9CVxuIisKLQkJCSIgIHB1YmxpYyBpbnQgZ2V0KCkgewlcbiIrCi0JCQkiICAgIHJldHVybiB4OwlcbiIrCi0JCQkiICB9CVxuIisKLQkJCSJ9CVxuIgotCQl9LAotCQkiU3ludGhldGljSW5pdCBCRUZPUkUgU3VwZXJDb25zdHJ1Y3RvckNhbGwiKTsKLX0KLS8qCi0gKiBJbml0aWFsaXphdGlvbiBvZiBzeW50aGV0aWMgZmllbGRzIHByaW9yIHRvIHN1cGVyIGNvbnN0cnVjdG9yIGNhbGwgLSBOUEUgY2hlY2sKLSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MTc0Ci0gKi8KLXB1YmxpYyB2b2lkIHRlc3QzNCgpIHsKLQotCXRoaXMucnVuQ29uZm9ybVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkiWC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWCB7CVxuIisKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndW1lbnRzKSB7CVxuIisKLQkJCSIJCW5ldyBYKCkubmV3IFgyKCk7CVxuIisKLQkJCSIJfQlcbiIrCi0JCQkiCWNsYXNzIFgxIHsJXG4iKwotCQkJIgkJWDEoKXsJXG4iKwotCQkJIgkJCXRoaXMuYmF6KCk7CVxuIisKLQkJCSIJCX0JXG4iKwotCQkJIgkJdm9pZCBiYXooKSB7CVxuIisKLQkJCSIJCQlTeXN0ZW0ub3V0LnByaW50bG4oXCItWDEuYmF6KClcIik7CVxuIisKLQkJCSIJCX0JXG4iKwotCQkJIgl9CVxuIisKLQkJCSIJY2xhc3MgWDIgZXh0ZW5kcyBYMSB7CVxuIisKLQkJCSIJCXZvaWQgYmF6KCkgewlcbiIrCi0JCQkiCQkJU3lzdGVtLm91dC5wcmludChYLnRoaXM9PW51bGwgPyBcIlgudGhpcyA9PSBudWxsXCIgOiBcIlgudGhpcyAhPSBudWxsXCIpOwlcbiIrCi0JCQkiCQkJWDEgeDEgPSBYLnRoaXMubmV3IFgxKCl7CVxuIisKLQkJCSIJCQkJdm9pZCBiYXooKXsJXG4iKwotCQkJIgkJCQkJU3lzdGVtLm91dC5wcmludGxuKFwiLVgkMS5iYXooKVwiKTsJXG4iKwotCQkJIgkJCQl9CVxuIisKLQkJCSIJCQl9OwlcbiIrCi0JCQkiCQl9CVxuIisKLQkJCSIJfQlcbiIrCi0JCQkifVxuIiwKLQkJfSwKLQkJIlgudGhpcyAhPSBudWxsLVgkMS5iYXooKSIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0MzUoKSB7Ci0JdGhpcy5ydW5Db25mb3JtVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCS8qIHAxL1guamF2YSAqLwotCQkJInAxL1guamF2YSIsCi0JCQkicGFja2FnZSBwMTsJXG4iKwotCQkJInB1YmxpYyBjbGFzcyBYIHsJXG4iKwotCQkJIgljbGFzcyBZIHsgWShpbnQgaSl7fSB9CVxuIisKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndW1lbnRzKSB7CVxuIisKLQkJCSIJCWludCBpID0gMTsJXG4iICsKLQkJCSIJCXRyeSB7CVxuIiArCi0JCQkiCQkJWCB4ID1udWxsOwlcbiIgKwotCQkJIgkJCXgubmV3IFkoKytpKTsJXG4iICsgLy8gaSB3b24ndCBnZXQgaW5jcmVtZW50ZWQgYmVmb3JlIE5QRQotCQkJIgkJCVN5c3RlbS5vdXQucHJpbnRsbihcIkZBSUxFRFwiKTsJXG4iICsKLQkJCSIJCX0gY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gZSl7CVxuIiArCi0JCQkiCQkJU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTUzpcIitpKTsJXG4iICsKLQkJCSIJCX0JXG4iICsKLQkJCSIJfQlcbiIrCi0JCQkifQlcbiIsCi0JCX0sCi0JCSJTVUNDRVNTOjEiCi0JKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdDM2KCkgewotCXRoaXMucnVuQ29uZm9ybVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkvKiBwMS9YLmphdmEgKi8KLQkJCSJwMS9YLmphdmEiLAotCQkJInBhY2thZ2UgcDE7CVxuIisKLQkJCSJwdWJsaWMgY2xhc3MgWCB7CVxuIisKLQkJCSIJY2xhc3MgWSB7fQlcbiIrCi0JCQkiCXN0YXRpYyBjbGFzcyBaIGV4dGVuZHMgWSB7CVxuIisKLQkJCSIJCVogKFggeCl7CVxuIisKLQkJCSIJCQl4LnN1cGVyKCk7CVxuIiArCi0JCQkiCQl9CQlcbiIrCi0JCQkiCX0JXG4iKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd1bWVudHMpIHsJXG4iKwotCQkJIgkJdHJ5IHsJXG4iICsKLQkJCSIJCQluZXcgWihudWxsKTsJXG4iICsKLQkJCSIJCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJGQUlMRURcIik7CVxuIiArCi0JCQkiCQl9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpewlcbiIgKwotCQkJIgkJCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7CVxuIiArCi0JCQkiCQl9CVxuIiArCi0JCQkiCX0JXG4iKwotCQkJIn0JXG4iLAotCQl9LAotCQkiU1VDQ0VTUyIKLQkpOwotfQotCi0vKgotICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDc0NAotICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzA5NgotICogCi0gKiBOT1RFOiBzaW5jZSBKTFMgZ290IHJldmlzZWQgdG8gYWxsb3cgdW50ZXJtaW5hdGVkIGxpbmUgY29tbWVudHMgKDMyNDc2KQotICovCi1wdWJsaWMgdm9pZCB0ZXN0MzcoKSB7Ci0JTWFwIGN1c3RvbU9wdGlvbnMgPSBnZXRDb21waWxlck9wdGlvbnMoKTsKLQljdXN0b21PcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1Rhc2tUYWdzLCAiVE9ETzoiKTsKLQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJwL1guamF2YSIsCi0JCQkicGFja2FnZSBwOwlcbiIrCi0JCQkicHVibGljIGNsYXNzIFgge1xuIisKLQkJCSJ9XG4iKwotCQkJIi8vIFRPRE86IHNvbWV0aGluZyIKLQkJfSwKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjEuIFdBUk5JTkcgaW4gcFxcWC5qYXZhIChhdCBsaW5lIDQpXG4iICsgCi0JCSIJLy8gVE9ETzogc29tZXRoaW5nXG4iICsgCi0JCSIJICAgXl5eXl5eXl5eXl5eXl5eXG4iICsgCi0JCSJUT0RPOiBzb21ldGhpbmdcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIsCi0JCW51bGwsCi0JCXRydWUsCi0JCWN1c3RvbU9wdGlvbnMpOwotfQotCi0vKgotICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDgzMwotICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzA5NgotICogCi0gKiBOT1RFOiBzaW5jZSBKTFMgZ290IHJldmlzZWQgdG8gYWxsb3cgdW50ZXJtaW5hdGVkIGxpbmUgY29tbWVudHMgKDMyNDc2KQotICovCi1wdWJsaWMgdm9pZCB0ZXN0MzgoKSB7Ci0JTWFwIGN1c3RvbU9wdGlvbnMgPSBnZXRDb21waWxlck9wdGlvbnMoKTsKLQljdXN0b21PcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1Rhc2tUYWdzLCAiVE9ETzoiKTsKLQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJYLmphdmEiLAotCQkJIi8vIFRPRE86IHNvbWV0aGluZyIKLQkJfSwKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjEuIFdBUk5JTkcgaW4gWC5qYXZhIChhdCBsaW5lIDEpXG4iICsgCi0JCSIJLy8gVE9ETzogc29tZXRoaW5nXG4iICsgCi0JCSIJICAgXl5eXl5eXl5eXl5eXl5eXG4iICsgCi0JCSJUT0RPOiBzb21ldGhpbmdcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIsCi0JCW51bGwsCi0JCXRydWUsCi0JCWN1c3RvbU9wdGlvbnMpOwotfQotCi0vKgotICogdW5yZWFjaGFibGUgZW1wdHkgc3RhdGVtZW50L2Jsb2NrIGFyZSBkaWFnbm9zZWQgaW4gMS4zCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QzOSgpIHsKLQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJYLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBYIHsJXG4iICsKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncyl7CVxuIisKLQkJCSIJCWZvciAoO251bGwgIT0gbnVsbDspOwlcbiIrCi0JCQkiCQlmb3IgKDtudWxsICE9IG51bGw7KXt9CVxuIisKLQkJCSIJCWZvciAoO2ZhbHNlOyk7CVxuIisKLQkJCSIJCWZvciAoO2ZhbHNlOyl7fQlcbiIrCi0JCQkiCQl3aGlsZSAoZmFsc2UpOwlcbiIrCi0JCQkiCQl3aGlsZSAoZmFsc2Upe30JXG4iKwotCQkJIgkJaWYgKGZhbHNlKSB7fSBlbHNlIHt9CVxuIisKLQkJCSIJCWlmIChmYWxzZSkgOyBlbHNlIDsJCQlcbiIrCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJGQUlMRURcIik7CVxuIiArCi0JCQkiCX0JXG4iKwotCQkJIn0JXG4iLAotCQl9LAotCQkiLS0tLS0tLS0tLVxuIiArIAotCQkiMS4gRVJST1IgaW4gWC5qYXZhIChhdCBsaW5lIDUpXG4iICsgCi0JCSIJZm9yICg7ZmFsc2U7KTsJXG4iICsgCi0JCSIJICAgICAgICAgICAgIF5cbiIgKyAKLQkJIlVucmVhY2hhYmxlIGNvZGVcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA2KVxuIiArIAotCQkiCWZvciAoO2ZhbHNlOyl7fQlcbiIgKyAKLQkJIgkgICAgICAgICAgICAgXl5cbiIgKyAKLQkJIlVucmVhY2hhYmxlIGNvZGVcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjMuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA3KVxuIiArIAotCQkiCXdoaWxlIChmYWxzZSk7CVxuIiArIAotCQkiCSAgICAgICAgICAgICBeXG4iICsgCi0JCSJVbnJlYWNoYWJsZSBjb2RlXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSI0LiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgOClcbiIgKyAKLQkJIgl3aGlsZSAoZmFsc2Upe30JXG4iICsgCi0JCSIJICAgICAgICAgICAgIF5eXG4iICsgCi0JCSJVbnJlYWNoYWJsZSBjb2RlXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iKTsKLX0KLS8vIGpsczYuNS41LjEgLSBzaW1wbGUgdHlwZSBuYW1lcyBmYXZvciBtZW1iZXIgdHlwZSBvdmVyIHRvcGxldmVsIG9uZS4KLS8vaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA3MDUKLXB1YmxpYyB2b2lkIHRlc3Q0MCgpIHsKLQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJYLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBYIHsJXG4iKwotCQkJIglpbnRlcmZhY2UgSG9tb255bSB7fQlcbiIrIC8vIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBvdGhlcnMuCi0JCQkiCXZvaWQgZm9vKCkgewlcbiIrCi0JCQkiCQljbGFzcyBIb21vbnltIGV4dGVuZHMgWCB7CVxuIisKLQkJCSIJCQl7CVxuIisKLQkJCSIJCQkJY2xhc3MgWSBleHRlbmRzIEhvbW9ueW0ge307CVxuIisgLy8gWCRIb21vbnltCi0JCQkiCQkJfQlcbiIrCi0JCQkiCQl9CVxuIisKLQkJCSIJfQlcbiIrCi0JCQkifQlcbiIrCi0JCQkiY2xhc3MgSG9tb255bSBleHRlbmRzIFggewlcbiIrCi0JCQkiCXsJXG4iKwotCQkJIgkJY2xhc3MgWSBleHRlbmRzIEhvbW9ueW0ge307CVxuIisgLy8gWCRIb21vbnltCi0JCQkiCX0JXG4iKwotCQkJIn0JXG4iCi0JCX0sCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNilcbiIgKyAKLQkJIgljbGFzcyBZIGV4dGVuZHMgSG9tb255bSB7fTsJXG4iICsgCi0JCSIJICAgICAgICAgICAgICAgIF5eXl5eXl5cbiIgKyAKLQkJIlRoZSBpbnRlcmZhY2UgWC5Ib21vbnltIGNhbm5vdCBiZSB0aGUgc3VwZXJjbGFzcyBvZiBZOyBhIHN1cGVyY2xhc3MgbXVzdCBiZSBhIGNsYXNzXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIyLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgMTMpXG4iICsgCi0JCSIJY2xhc3MgWSBleHRlbmRzIEhvbW9ueW0ge307CVxuIiArIAotCQkiCSAgICAgICAgICAgICAgICBeXl5eXl5eXG4iICsgCi0JCSJUaGUgaW50ZXJmYWNlIFguSG9tb255bSBjYW5ub3QgYmUgdGhlIHN1cGVyY2xhc3Mgb2YgWTsgYSBzdXBlcmNsYXNzIG11c3QgYmUgYSBjbGFzc1xuIiArIAotCQkiLS0tLS0tLS0tLVxuIik7Ci19Ci0vKgotICogMzA4NTYgLSAxLjQgY29tcGxpYW50IG1vZGUgc2hvdWxkIGNvbnNpZGVyIGFic3RyYWN0IG1ldGhvZCBtYXRjaGVzCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3Q0MSgpIHsKLQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJInAvWC5qYXZhIiwgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQkJInBhY2thZ2UgcDsJXG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgWCB7CVxuIiArCi0JCQkiCXZvaWQgZm9vKGludCBpLCBmbG9hdCBmKXt9CVxuIiArCi0JCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsJXG4iICsKLQkJCSIJCXEuWSB5ID0gbmV3IHEuWS5aKCk7CVxuIiArCi0JCQkiCQl5LmJhcigpOwlcbiIgKwotCQkJIgl9CVxuIiArCi0JCQkifQlcbiIsCi0JCQkicS9ZLmphdmEiLCAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCQkicGFja2FnZSBxOwlcbiIgKwotCQkJInB1YmxpYyBhYnN0cmFjdCBjbGFzcyBZIGV4dGVuZHMgcC5YIGltcGxlbWVudHMgSSB7CVxuIiArCi0JCQkiCXB1YmxpYyB2b2lkIGJhcigpeyAgIGZvbygxLCAyKTsgfQlcbiIgKwotCQkJIglwdWJsaWMgc3RhdGljIGNsYXNzIFogZXh0ZW5kcyBZIHsJXG4iICsKLQkJCSIJCXB1YmxpYyB2b2lkIGZvbyhmbG9hdCBmLCBpbnQgaSkgewlcbiIgKwotCQkJIgkJCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7CVxuIiArCi0JCQkiCQl9CVxuIiArCi0JCQkiCX0JXG4iICsKLQkJCSJ9CVxuIiArCi0JCQkiaW50ZXJmYWNlIEkgewlcbiIgKwotCQkJIgl2b2lkIGZvbyhmbG9hdCBmLCBpbnQgaSk7CVxuIiArCi0JCQkifQlcbiIsCi0JCX0sCi0JCSJTVUNDRVNTIik7Ci19Ci0vKgotICogdmFyaWF0aW9uIC0gMzA4NTYgLSAxLjQgY29tcGxpYW50IG1vZGUgc2hvdWxkIGNvbnNpZGVyIGFic3RyYWN0IG1ldGhvZCBtYXRjaGVzCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3Q0MigpIHsKLQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJInAvWC5qYXZhIiwgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQkJInBhY2thZ2UgcDsJXG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgWCBleHRlbmRzIFgwIHsJXG4iICsKLQkJCSIJdm9pZCBmb28oaW50IGksIGZsb2F0IGYpe30JXG4iICsKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewlcbiIgKwotCQkJIgkJcS5ZIHkgPSBuZXcgcS5ZLlooKTsJXG4iICsKLQkJCSIJCXkuYmFyKCk7CVxuIiArCi0JCQkiCX0JXG4iICsKLQkJCSJ9CVxuIiArCi0JCQkiY2xhc3MgWDAgewlcbiIgKwotCQkJIgl2b2lkIGZvbyhpbnQgaSwgZG91YmxlIGQpe30JXG4iICsgLy8gZXh0cmEgbWF0Y2gKLQkJCSJ9CVxuIiwKLQkJCSJxL1kuamF2YSIsIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJCSJwYWNrYWdlIHE7CVxuIiArCi0JCQkicHVibGljIGFic3RyYWN0IGNsYXNzIFkgZXh0ZW5kcyBwLlggaW1wbGVtZW50cyBJIHsJXG4iICsKLQkJCSIJcHVibGljIHZvaWQgYmFyKCl7ICAgZm9vKDEsIDIpOyB9CVxuIiArCi0JCQkiCXB1YmxpYyBzdGF0aWMgY2xhc3MgWiBleHRlbmRzIFkgewlcbiIgKwotCQkJIgkJcHVibGljIHZvaWQgZm9vKGZsb2F0IGYsIGludCBpKSB7CVxuIiArCi0JCQkiCQkJU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTsJXG4iICsKLQkJCSIJCX0JXG4iICsKLQkJCSIJfQlcbiIgKwotCQkJIn0JXG4iICsKLQkJCSJpbnRlcmZhY2UgSSB7CVxuIiArCi0JCQkiCXZvaWQgZm9vKGZsb2F0IGYsIGludCBpKTsJXG4iICsKLQkJCSJ9CVxuIiwKLQkJfSwKLQkJIlNVQ0NFU1MiKTsKLX0KLQotLy8gYmluYXJ5IGNvbXBhdGliaWxpdHkKLXB1YmxpYyB2b2lkIF90ZXN0NDMoKSB7Ci0JdGhpcy5ydW5Db25mb3JtVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJwMS9ZLmphdmEiLAotCQkJInBhY2thZ2UgcDE7CVxuIiArCi0JCQkicHVibGljIGNsYXNzIFkgZXh0ZW5kcyBBIGltcGxlbWVudHMgSSB7IFxuIiArCi0JCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsJXG4iICsKLQkJCSIJCVkucHJpbnRWYWx1ZXMoKTsJXG4iICsKLQkJCSIJfQlcbiIgKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRWYWx1ZXMoKSB7CVxuIiArCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJpPVwiK2krXCIsaj1cIitqK1wiLFkuaT1cIitZLmkrXCIsWS5qPVwiK1kuaik7CVxuIiArCi0JCQkiCX0JXG4iICsKLQkJCSJ9CVxuIiwKLQkJCSJwMS9BLmphdmEiLAotCQkJInBhY2thZ2UgcDE7CVxuIiArCi0JCQkicHVibGljIGNsYXNzIEEgewlcbiIgKwotCQkJIglzdGF0aWMgaW50IGkgPSAxOwlcbiIgKwotCQkJIn0JXG4iLAotCQkJInAxL0kuamF2YSIsCi0JCQkicGFja2FnZSBwMTsJXG4iICsKLQkJCSJpbnRlcmZhY2UgSSB7CVxuIiArCi0JCQkiCWludCBqID0gXCJhYVwiLmxlbmd0aCgpOwlcbiIgKwotCQkJIn0JXG4iLAotCQl9LAotCQkiaT0xLGo9MixZLmk9MSxZLmo9MiIpOwotCi0JdGhpcy5ydW5Db25mb3JtVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJwMS9BLmphdmEiLAotCQkJInBhY2thZ2UgcDE7CVxuIiArCi0JCQkicHVibGljIGNsYXNzIEEgewlcbiIgKwotCQkJIglzdGF0aWMgaW50IGogPSAzOwlcbiIgKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CVxuIiArCi0JCQkiCQlZLnByaW50VmFsdWVzKCk7CVxuIiArCi0JCQkiCX0JXG4iICsKLQkJCSJ9CVxuIiwKLQkJCSJwMS9JLmphdmEiLAotCQkJInBhY2thZ2UgcDE7CVxuIiArCi0JCQkiaW50ZXJmYWNlIEkgewlcbiIgKwotCQkJIglpbnQgaiA9IFwiYWFhYVwiLmxlbmd0aCgpOwlcbiIgKwotCQkJIn0JXG4iLAotCQl9LAotCQkiaT00LGo9MyxZLmk9NCxZLmo9MyIsCi0JCW51bGwsIC8vIHVzZSBkZWZhdWx0IGNsYXNzLXBhdGgKLQkJZmFsc2UsIC8vIGRvIG5vdCBmbHVzaCBwcmV2aW91cyBvdXRwdXQgZGlyIGNvbnRlbnQKLQkJbnVsbCk7IC8vIG5vIHNwZWNpYWwgdm0gYXJncwkJCi19Ci0vKiAKLSAqIGFycmF5LmNsb25lKCkgc2hvdWxkIHVzZSBhcnJheSB0eXBlIGluIG1ldGhvZFJlZgotICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzYzMDcKLSAqLwotcHVibGljIHZvaWQgdGVzdDQ0KCkgewotCXRoaXMucnVuQ29uZm9ybVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkiWC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSIgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArCi0JCQkiCQlhcmdzLmNsb25lKCk7CVxuIisKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iICsKLQkJCSIgICAgfVxuIiArCi0JCQkifVxuIiwKLQkJfSwKLQkJIlNVQ0NFU1MiKTsKLQkJCi0JQ2xhc3NGaWxlQnl0ZXNEaXNhc3NlbWJsZXIgZGlzYXNzZW1ibGVyID0gVG9vbEZhY3RvcnkuY3JlYXRlRGVmYXVsdENsYXNzRmlsZUJ5dGVzRGlzYXNzZW1ibGVyKCk7Ci0JU3RyaW5nIGFjdHVhbE91dHB1dCA9IG51bGw7Ci0JdHJ5IHsKLQkJYnl0ZVtdIGNsYXNzRmlsZUJ5dGVzID0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5nZXRGaWxlQnl0ZUNvbnRlbnQobmV3IEZpbGUoT1VUUFVUX0RJUiArIEZpbGUuc2VwYXJhdG9yICArIlguY2xhc3MiKSk7Ci0JCWFjdHVhbE91dHB1dCA9Ci0JCQlkaXNhc3NlbWJsZXIuZGlzYXNzZW1ibGUoCi0JCQkJY2xhc3NGaWxlQnl0ZXMsCi0JCQkJIlxuIiwKLQkJCQlDbGFzc0ZpbGVCeXRlc0Rpc2Fzc2VtYmxlci5ERVRBSUxFRCk7IAotCX0gY2F0Y2ggKG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuQ2xhc3NGb3JtYXRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRUcnVlKCJDbGFzc0Zvcm1hdEV4Y2VwdGlvbiIsIGZhbHNlKTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydFRydWUoIklPRXhjZXB0aW9uIiwgZmFsc2UpOwotCX0KLQkKLQlTdHJpbmcgZXhwZWN0ZWRPdXRwdXQgPSAKLQkJIiAgICAgICAxICBpbnZva2V2aXJ0dWFsICMyMSA8TWV0aG9kIFtMamF2YS5sYW5nLlN0cmluZzsjY2xvbmUoKSBqYXZhLmxhbmcuT2JqZWN0PlxuIjsKLQkJCi0JaWYgKGFjdHVhbE91dHB1dC5pbmRleE9mKGV4cGVjdGVkT3V0cHV0KSA9PSAtMSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4ob3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMudXRpbC5VdGlsLmRpc3BsYXlTdHJpbmcoYWN0dWFsT3V0cHV0LCAyKSk7Ci0JfQotCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgYnl0ZWNvZGUgc2VxdWVuY2UiLCBhY3R1YWxPdXRwdXQuaW5kZXhPZihleHBlY3RlZE91dHB1dCkgIT0gLTEpOwotfQotcHVibGljIHN0YXRpYyBDbGFzcyB0ZXN0Q2xhc3MoKSB7Ci0JcmV0dXJuIENvbXBsaWFuY2VfMV80LmNsYXNzOwotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3JlZ3Jlc3Npb24vRGVwcmVjYXRlZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9yZWdyZXNzaW9uL0RlcHJlY2F0ZWRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NTAyOTUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3JlZ3Jlc3Npb24vRGVwcmVjYXRlZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyLnJlZ3Jlc3Npb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLQotcHVibGljIGNsYXNzIERlcHJlY2F0ZWRUZXN0IGV4dGVuZHMgQWJzdHJhY3RSZWdyZXNzaW9uVGVzdCB7Ci1wdWJsaWMgRGVwcmVjYXRlZFRlc3QoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlyZXR1cm4gc2V0dXBTdWl0ZSh0ZXN0Q2xhc3MoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MSgpIHsKLQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdChuZXcgU3RyaW5nW10gewotCQkicC9CLmphdmEiLAotCQkicGFja2FnZSBwO1xuIiArIAotCQkiY2xhc3MgQiBleHRlbmRzIEEge1xuIiArIAotCQkiICAgIGZsb2F0IHggPSBzdXBlci54O1xuIiArIAotCQkifVxuIiwKLQotCQkicC9BLmphdmEiLAotCQkicGFja2FnZSBwO1xuIiArIAotCQkiY2xhc3MgQSB7XG4iICsgCi0JCSIgICAgLyoqIEBkZXByZWNhdGVkICovXG4iICsgCi0JCSIgICAgaW50IHggPSAxO1xuIiArIAotCQkifVxuIiwKLQl9LCAKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjEuIFdBUk5JTkcgaW4gcFxcQi5qYXZhIChhdCBsaW5lIDMpXG4iICsgCi0JCSIJZmxvYXQgeCA9IHN1cGVyLng7XG4iICsgCi0JCSIJICAgICAgXlxuIiArIAotCQkiVGhlIGZpZWxkIEIueCBpcyBoaWRpbmcgYSBmaWVsZCBmcm9tIHR5cGUgQVxuIiArIAotCQkiLS0tLS0tLS0tLVxuIiArIAotCQkiMi4gV0FSTklORyBpbiBwXFxCLmphdmEgKGF0IGxpbmUgMylcbiIgKyAKLQkJIglmbG9hdCB4ID0gc3VwZXIueDtcbiIgKyAKLQkJIgkgICAgICAgICAgXl5eXl5eXlxuIiArIAotCQkiVGhlIGZpZWxkIEEueCBpcyBkZXByZWNhdGVkXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iCi0JKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QyKCkgewotCXRoaXMucnVuTmVnYXRpdmVUZXN0KG5ldyBTdHJpbmdbXSB7Ci0JCSJwL0MuamF2YSIsCi0JCSJwYWNrYWdlIHA7XG4iICsgCi0JCSJjbGFzcyBDIHtcbiIgKyAKLQkJIiAgICBzdGF0aWMgaW50IHggPSBuZXcgQSgpLng7XG4iICsgCi0JCSJ9XG4iLAotCQkKLQkJInAvQS5qYXZhIiwKLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJImNsYXNzIEEge1xuIiArIAotCQkiICAgIC8qKiBAZGVwcmVjYXRlZCAqL1xuIiArIAotCQkiICAgIGludCB4ID0gMTtcbiIgKyAKLQkJIn1cbiIsCi0KLQl9LCAKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjEuIFdBUk5JTkcgaW4gcFxcQy5qYXZhIChhdCBsaW5lIDMpXG4iICsgCi0JCSIJc3RhdGljIGludCB4ID0gbmV3IEEoKS54O1xuIiArIAotCQkiCSAgICAgICAgICAgICAgICAgICAgICAgXlxuIiArIAotCQkiVGhlIGZpZWxkIEEueCBpcyBkZXByZWNhdGVkXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iCi0JKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QzKCkgewotCXRoaXMucnVuTmVnYXRpdmVUZXN0KG5ldyBTdHJpbmdbXSB7Ci0JCSJwL1RvcC5qYXZhIiwKLQkJInBhY2thZ2UgcDtcbiIgKyAKLQkJInB1YmxpYyBjbGFzcyBUb3Age1xuIiArIAotCQkiICBcbiIgKyAKLQkJIiAgY2xhc3MgTTEge1xuIiArIAotCQkiICAgIGNsYXNzIE0yIHt9XG4iICsgCi0JCSIgIH07XG4iICsgCi0JCSIgIFxuIiArIAotCQkiICBzdGF0aWMgY2xhc3MgU3RhdGljTTEge1xuIiArIAotCQkiICAgIHN0YXRpYyBjbGFzcyBTdGF0aWNNMiB7XG4iICsgCi0JCSIgICAgICBjbGFzcyBOb25TdGF0aWNNM3t9fTtcbiIgKyAKLQkJIiAgfTtcbiIgKyAKLQkJIiAgXG4iICsgCi0JCSJwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJndltdKXtcbiIgKyAKLQkJIiAgVG9wIHRpcCA9IG5ldyBUb3AoKTtcbiIgKyAKLQkJIiAgU3lzdGVtLm91dC5wcmludGxuKFwiU3RpbGwgYWxpdmUgMFwiKTtcbiIgKyAKLQkJIiAgdGlwLnRlc3RTdGF0aWNNZW1iZXIoKTtcbiIgKyAKLQkJIiAgU3lzdGVtLm91dC5wcmludGxuKFwiU3RpbGwgYWxpdmUgMVwiKTtcbiIgKyAKLQkJIiAgdGlwLnRlc3RTdGF0aWNNZW1iZXIxKCk7XG4iICsgCi0JCSIgIFN5c3RlbS5vdXQucHJpbnRsbihcIlN0aWxsIGFsaXZlIDJcIik7XG4iICsgCi0JCSIgIHRpcC50ZXN0U3RhdGljTWVtYmVyMigpO1xuIiArIAotCQkiICBTeXN0ZW0ub3V0LnByaW50bG4oXCJTdGlsbCBhbGl2ZSAzXCIpO1xuIiArIAotCQkiICB0aXAudGVzdFN0YXRpY01lbWJlcjMoKTtcbiIgKyAKLQkJIiAgU3lzdGVtLm91dC5wcmludGxuKFwiU3RpbGwgYWxpdmUgNFwiKTtcbiIgKyAKLQkJIiAgdGlwLnRlc3RTdGF0aWNNZW1iZXI0KCk7XG4iICsgCi0JCSIgIFN5c3RlbS5vdXQucHJpbnRsbihcIkNvbXBsZXRlZFwiKTtcbiIgKyAKLQkJIn1cbiIgKyAKLQkJIiAgdm9pZCB0ZXN0TWVtYmVyKCl7XG4iICsgCi0JCSIgICAgbmV3IE0xKCkubmV3IE0yKCk7fVxuIiArIAotCQkiICB2b2lkIHRlc3RTdGF0aWNNZW1iZXIoKXtcbiIgKyAKLQkJIiAgICBuZXcgU3RhdGljTTEoKS5uZXcgU3RhdGljTTIoKTt9XG4iICsgCi0JCSIgIHZvaWQgdGVzdFN0YXRpY01lbWJlcjEoKXtcbiIgKyAKLQkJIiAgICBuZXcgU3RhdGljTTEuU3RhdGljTTIoKTt9XG4iICsgCi0JCSIgIHZvaWQgdGVzdFN0YXRpY01lbWJlcjIoKXtcbiIgKyAKLQkJIiAgICBuZXcgU3RhdGljTTEuU3RhdGljTTIoKS5uZXcgTm9uU3RhdGljTTMoKTt9XG4iICsgCi0JCSIgIHZvaWQgdGVzdFN0YXRpY01lbWJlcjMoKXtcbiIgKyAKLQkJIiAgICAvLyBkZWZpbmUgYW4gYW5vbnltb3VzIHN1YmNsYXNzIG9mIHRoZSBub24tc3RhdGljIE0zXG4iICsgCi0JCSIgICAgbmV3IFN0YXRpY00xLlN0YXRpY00yKCkubmV3IE5vblN0YXRpY00zKCl7fTtcbiIgKyAKLQkJIiAgfSAgIFxuIiArIAotCQkiICB2b2lkIHRlc3RTdGF0aWNNZW1iZXI0KCl7XG4iICsgCi0JCSIgICAgLy8gZGVmaW5lIGFuIGFub255bW91cyBzdWJjbGFzcyBvZiB0aGUgbm9uLXN0YXRpYyBNM1xuIiArIAotCQkiICAgIG5ldyBTdGF0aWNNMS5TdGF0aWNNMigpLm5ldyBOb25TdGF0aWNNMygpe1xuIiArIAotCQkiICAgICAgT2JqZWN0IGhlbGxvKCl7XG4iICsgCi0JCSIgICAgICAgIHJldHVybiBuZXcgU3RhdGljTTEuU3RhdGljTTIoKS5uZXcgTm9uU3RhdGljTTMoKTtcbiIgKyAKLQkJIiAgICAgIH19O1xuIiArIAotCQkiICAgICAgXG4iICsgCi0JCSIgIH0gICAgXG4iICsgCi0JCSJ9XG4iLAotCQl9LCAKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjEuIEVSUk9SIGluIHBcXFRvcC5qYXZhIChhdCBsaW5lIDMwKVxuIiArIAotCQkiCW5ldyBTdGF0aWNNMSgpLm5ldyBTdGF0aWNNMigpO31cbiIgKyAKLQkJIgleXl5eXl5eXl5eXl5eXlxuIiArIAotCQkiSWxsZWdhbCBlbmNsb3NpbmcgaW5zdGFuY2Ugc3BlY2lmaWNhdGlvbiBmb3IgdHlwZSBUb3AuU3RhdGljTTEuU3RhdGljTTJcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIJKTsKLX0KLS8qKgotICogUmVncmVzc2lvbiB0ZXN0IGZvciBQUiAjMUc5RVM5QgotICovCi1wdWJsaWMgdm9pZCB0ZXN0NCgpIHsKLQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdChuZXcgU3RyaW5nW10gewotCQkicC9XYXJuaW5nLmphdmEiLAotCQkicGFja2FnZSBwO1xuIiArIAotCQkiaW1wb3J0IGphdmEudXRpbC5EYXRlO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgV2FybmluZyB7XG4iICsKLQkJInB1YmxpYyBXYXJuaW5nKCkge1xuIiArCi0JCSIgICAgIHN1cGVyKCk7XG4iICsKLQkJIiAgICAgRGF0ZSBkYXRlT2JqID0gbmV3IERhdGUoKTtcbiIgKwotCQkiICAgICBkYXRlT2JqLlVUQygxLDIsMyw0LDUsNik7XG4iICsKLQkJIn1cbiIgKwotCQkifVxuIiwKLQkJfSwgCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIxLiBXQVJOSU5HIGluIHBcXFdhcm5pbmcuamF2YSAoYXQgbGluZSA3KVxuIiArIAotCQkiCWRhdGVPYmouVVRDKDEsMiwzLDQsNSw2KTtcbiIgKyAKLQkJIgleXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKLQkJIlRoZSBtZXRob2QgVVRDKGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpIGZyb20gdGhlIHR5cGUgRGF0ZSBpcyBkZXByZWNhdGVkXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIyLiBXQVJOSU5HIGluIHBcXFdhcm5pbmcuamF2YSAoYXQgbGluZSA3KVxuIiArIAotCQkiCWRhdGVPYmouVVRDKDEsMiwzLDQsNSw2KTtcbiIgKyAKLQkJIgleXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKLQkJIlRoZSBzdGF0aWMgbWV0aG9kIFVUQyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50KSBmcm9tIHRoZSB0eXBlIERhdGUgc2hvdWxkIGJlIGFjY2Vzc2VkIGluIGEgc3RhdGljIHdheVxuIiArIAotCQkiLS0tLS0tLS0tLVxuIgotCi0JKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3Q1KCkgewotCXRoaXMucnVuQ29uZm9ybVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkiWC5qYXZhIiwKLQkJICAicHVibGljIGNsYXNzIFgge1xuIgotCQkJKyAiLyoqXG4iCi0JCQkrICIgKiBAZGVwcmVjYXRlZFxuIgotCQkJKyAiICovXG4iCi0JCQkrICIgCXB1YmxpYyBzdGF0aWMgY2xhc3MgWSB7XG4iCi0JCQkrICIJfVxuIiArCi0JCQkiICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewlcbiIgKwotCQkJIiAgICAgICAgU3lzdGVtLm91dC5wcmludChcIlNVQ0NFU1NcIik7CVxuIiArCi0JCQkiCX0JXG4iCi0JCQkrICJ9IgotCQl9LAotCQkiU1VDQ0VTUyIsIC8vIGV4cGVjdGVkIG91dHB1dAotCQludWxsLAotCQl0cnVlLCAvLyBmbHVzaCBwcmV2aW91cyBvdXRwdXQgZGlyIGNvbnRlbnQKLQkJbnVsbCwgLy8gc3BlY2lhbCB2bSBhcmdzCi0JCW51bGwpOyAgLy8gY3VzdG9tIG9wdGlvbnMKLQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJBLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBBIGV4dGVuZHMgWC5ZIHt9IgotCQl9LAotCQkiLS0tLS0tLS0tLVxuIiArIAotCQkiMS4gV0FSTklORyBpbiBBLmphdmEgKGF0IGxpbmUgMSlcbiIgKyAKLQkJIglwdWJsaWMgY2xhc3MgQSBleHRlbmRzIFguWSB7fVxuIiArIAotCQkiCSAgICAgICAgICAgICBeXG4iICsgCi0JCSJUaGUgY29uc3RydWN0b3IgWC5ZKCkgaXMgZGVwcmVjYXRlZFxuIiArIAotCQkiLS0tLS0tLS0tLVxuIiArIAotCQkiMi4gV0FSTklORyBpbiBBLmphdmEgKGF0IGxpbmUgMSlcbiIgKyAKLQkJIglwdWJsaWMgY2xhc3MgQSBleHRlbmRzIFguWSB7fVxuIiArIAotCQkiCSAgICAgICAgICAgICAgICAgICAgICAgXl5eXG4iICsgCi0JCSJUaGUgdHlwZSBYLlkgaXMgZGVwcmVjYXRlZFxuIiArIAotCQkiLS0tLS0tLS0tLVxuIiwvLyBleHBlY3RlZCBvdXRwdXQKLQkJbnVsbCwKLQkJZmFsc2UsIC8vIGZsdXNoIHByZXZpb3VzIG91dHB1dCBkaXIgY29udGVudAotCQludWxsKTsgIC8vIGN1c3RvbSBvcHRpb25zCi19Ci1wdWJsaWMgc3RhdGljIENsYXNzIHRlc3RDbGFzcygpIHsKLQlyZXR1cm4gRGVwcmVjYXRlZFRlc3QuY2xhc3M7Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcmVncmVzc2lvbi9FeHBlY3RlZFByb2JsZW0uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9yZWdyZXNzaW9uL0V4cGVjdGVkUHJvYmxlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmUzN2Y2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9yZWdyZXNzaW9uL0V4cGVjdGVkUHJvYmxlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci5yZWdyZXNzaW9uOwotCi1wdWJsaWMgY2xhc3MgRXhwZWN0ZWRQcm9ibGVtIHsKLQlTdHJpbmcgZmlsZU5hbWU7Ci0JaW50IGlkOwotCVN0cmluZ1tdIGFyZ3VtZW50czsKLXB1YmxpYyBFeHBlY3RlZFByb2JsZW0oU3RyaW5nIGZpbGVOYW1lLCBpbnQgaWQsIFN0cmluZ1tdIGFyZ3VtZW50cykgewotCXRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZTsKLQl0aGlzLmlkID0gaWQ7Ci0JdGhpcy5hcmd1bWVudHMgPSBhcmd1bWVudHM7Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcmVncmVzc2lvbi9Jbk1lbW9yeU5hbWVFbnZpcm9ubWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3JlZ3Jlc3Npb24vSW5NZW1vcnlOYW1lRW52aXJvbm1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RiODM5Mi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcmVncmVzc2lvbi9Jbk1lbW9yeU5hbWVFbnZpcm9ubWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci5yZWdyZXNzaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmJhdGNoLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5IYXNodGFibGVPZk9iamVjdDsKLQotcHVibGljIGNsYXNzIEluTWVtb3J5TmFtZUVudmlyb25tZW50IGltcGxlbWVudHMgSU5hbWVFbnZpcm9ubWVudCB7Ci0JSU5hbWVFbnZpcm9ubWVudFtdIGNsYXNzTGliczsKLQlIYXNodGFibGVPZk9iamVjdCBjb21waWxhdGlvblVuaXRzID0gbmV3IEhhc2h0YWJsZU9mT2JqZWN0KCk7Ci1wdWJsaWMgSW5NZW1vcnlOYW1lRW52aXJvbm1lbnQoU3RyaW5nW10gY29tcGlsYXRpb25Vbml0cywgSU5hbWVFbnZpcm9ubWVudFtdIGNsYXNzTGlicykgewotCXRoaXMuY2xhc3NMaWJzID0gY2xhc3NMaWJzOwotCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBjb21waWxhdGlvblVuaXRzLmxlbmd0aCAtIDE7IGkgPCBsZW5ndGg7IGkgKz0gMikgewotCQlTdHJpbmcgZmlsZU5hbWUgPSBjb21waWxhdGlvblVuaXRzW2ldOwotCQljaGFyW10gY29udGVudHMgPSBjb21waWxhdGlvblVuaXRzW2kgKyAxXS50b0NoYXJBcnJheSgpOwotCQlTdHJpbmcgZGlyTmFtZSA9ICIiOwotCQlpbnQgbGFzdFNsYXNoID0gLTE7Ci0JCWlmICgobGFzdFNsYXNoID0gZmlsZU5hbWUubGFzdEluZGV4T2YoJy8nKSkgIT0gLTEpIHsKLQkJCWRpck5hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgbGFzdFNsYXNoKTsKLQkJfQotCQljaGFyW10gcGFja2FnZU5hbWUgPSBkaXJOYW1lLnJlcGxhY2UoJy8nLCAnLicpLnRvQ2hhckFycmF5KCk7Ci0JCWNoYXJbXSBjdU5hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcobGFzdFNsYXNoID09IC0xID8gMCA6IGxhc3RTbGFzaCArIDEsIGZpbGVOYW1lLmxlbmd0aCgpIC0gNSkudG9DaGFyQXJyYXkoKTsgLy8gcmVtb3ZlICIuamF2YSIKLQkJSGFzaHRhYmxlT2ZPYmplY3QgY3VzID0gKEhhc2h0YWJsZU9mT2JqZWN0KXRoaXMuY29tcGlsYXRpb25Vbml0cy5nZXQocGFja2FnZU5hbWUpOwotCQlpZiAoY3VzID09IG51bGwpIHsKLQkJCWN1cyA9IG5ldyBIYXNodGFibGVPZk9iamVjdCgpOwotCQkJdGhpcy5jb21waWxhdGlvblVuaXRzLnB1dChwYWNrYWdlTmFtZSwgY3VzKTsKLQkJfQotCQlDb21waWxhdGlvblVuaXQgdW5pdCA9IG5ldyBDb21waWxhdGlvblVuaXQoY29udGVudHMsIGZpbGVOYW1lLCBudWxsKTsKLQkJY3VzLnB1dChjdU5hbWUsIHVuaXQpOwotCX0KLX0KLXB1YmxpYyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIgZmluZFR5cGUoY2hhcltdW10gY29tcG91bmRUeXBlTmFtZSkgewotCXJldHVybiBmaW5kVHlwZSgKLQkJY29tcG91bmRUeXBlTmFtZVtjb21wb3VuZFR5cGVOYW1lLmxlbmd0aCAtIDFdLAotCQlDaGFyT3BlcmF0aW9uLnN1YmFycmF5KGNvbXBvdW5kVHlwZU5hbWUsIDAsIGNvbXBvdW5kVHlwZU5hbWUubGVuZ3RoIC0gMSkpOwotfQotcHVibGljIE5hbWVFbnZpcm9ubWVudEFuc3dlciBmaW5kVHlwZShjaGFyW10gdHlwZU5hbWUsIGNoYXJbXVtdIHBhY2thZ2VOYW1lKSB7Ci0JSGFzaHRhYmxlT2ZPYmplY3QgY3VzID0gKEhhc2h0YWJsZU9mT2JqZWN0KXRoaXMuY29tcGlsYXRpb25Vbml0cy5nZXQoQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHBhY2thZ2VOYW1lLCAnLicpKTsKLQlpZiAoY3VzID09IG51bGwpIHsKLQkJcmV0dXJuIHRoaXMuZmluZFR5cGVGcm9tQ2xhc3NMaWJzKHR5cGVOYW1lLCBwYWNrYWdlTmFtZSk7Ci0JfQotCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gKENvbXBpbGF0aW9uVW5pdCljdXMuZ2V0KHR5cGVOYW1lKTsKLQlpZiAodW5pdCA9PSBudWxsKSB7Ci0JCXJldHVybiB0aGlzLmZpbmRUeXBlRnJvbUNsYXNzTGlicyh0eXBlTmFtZSwgcGFja2FnZU5hbWUpOwotCX0KLQlyZXR1cm4gbmV3IE5hbWVFbnZpcm9ubWVudEFuc3dlcih1bml0KTsKLX0KLXByaXZhdGUgTmFtZUVudmlyb25tZW50QW5zd2VyIGZpbmRUeXBlRnJvbUNsYXNzTGlicyhjaGFyW10gdHlwZU5hbWUsIGNoYXJbXVtdIHBhY2thZ2VOYW1lKSB7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmNsYXNzTGlicy5sZW5ndGg7IGkrKykgewotCQlOYW1lRW52aXJvbm1lbnRBbnN3ZXIgYW5zd2VyID0gdGhpcy5jbGFzc0xpYnNbaV0uZmluZFR5cGUodHlwZU5hbWUsIHBhY2thZ2VOYW1lKTsKLQkJaWYgKGFuc3dlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYW5zd2VyOwotCQl9Ci0JfQotCXJldHVybiBudWxsOwotfQotcHVibGljIGJvb2xlYW4gaXNQYWNrYWdlKGNoYXJbXVtdIHBhcmVudFBhY2thZ2VOYW1lLCBjaGFyW10gcGFja2FnZU5hbWUpIHsKLQljaGFyW10gcGtnID0gQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKHBhcmVudFBhY2thZ2VOYW1lLCBwYWNrYWdlTmFtZSwgJy4nKTsKLQlyZXR1cm4gCi0JCXRoaXMuY29tcGlsYXRpb25Vbml0cy5nZXQocGtnKSAhPSBudWxsIHx8IAotCQl0aGlzLmlzUGFja2FnZUZyb21DbGFzc0xpYnMocGFyZW50UGFja2FnZU5hbWUsIHBhY2thZ2VOYW1lKTsKLX0KLXB1YmxpYyBib29sZWFuIGlzUGFja2FnZUZyb21DbGFzc0xpYnMoY2hhcltdW10gcGFyZW50UGFja2FnZU5hbWUsIGNoYXJbXSBwYWNrYWdlTmFtZSkgewotCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5jbGFzc0xpYnMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKHRoaXMuY2xhc3NMaWJzW2ldLmlzUGFja2FnZShwYXJlbnRQYWNrYWdlTmFtZSwgcGFja2FnZU5hbWUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQlyZXR1cm4gZmFsc2U7Ci19IAotcHVibGljIHZvaWQgY2xlYW51cCgpIHsKLQlmb3IgKGludCBpID0gMCwgbWF4ID0gdGhpcy5jbGFzc0xpYnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJdGhpcy5jbGFzc0xpYnNbaV0uY2xlYW51cCgpOwotCX0KLQl0aGlzLmNvbXBpbGF0aW9uVW5pdHMgPSBuZXcgSGFzaHRhYmxlT2ZPYmplY3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9yZWdyZXNzaW9uL0xvZ1JlcXVlc3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3JlZ3Jlc3Npb24vTG9nUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YzhiZGEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3JlZ3Jlc3Npb24vTG9nUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyLnJlZ3Jlc3Npb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsYXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uRGVmYXVsdFByb2JsZW07Ci0KLXB1YmxpYyBjbGFzcyBMb2dSZXF1ZXN0b3IgZXh0ZW5kcyBSZXF1ZXN0b3IgewotCVN0cmluZyBwcm9ibGVtTG9nID0gIiI7Ci1wdWJsaWMgTG9nUmVxdWVzdG9yKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JUHJvYmxlbUZhY3RvcnkgcHJvYmxlbUZhY3RvcnksIFN0cmluZyBvdXRwdXRQYXRoKSB7Ci0Jc3VwZXIocHJvYmxlbUZhY3RvcnksIG91dHB1dFBhdGgsIGZhbHNlKTsKLX0KLXB1YmxpYyB2b2lkIGFjY2VwdFJlc3VsdChDb21waWxhdGlvblJlc3VsdCBjb21waWxhdGlvblJlc3VsdCkgewotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDEwMCk7Ci0JaGFzRXJyb3JzIHw9IGNvbXBpbGF0aW9uUmVzdWx0Lmhhc0Vycm9ycygpOwotCWlmIChjb21waWxhdGlvblJlc3VsdC5oYXNQcm9ibGVtcygpIHx8IGNvbXBpbGF0aW9uUmVzdWx0Lmhhc1Rhc2tzKCkpIHsKLQkJSVByb2JsZW1bXSBwcm9ibGVtcyA9IGNvbXBpbGF0aW9uUmVzdWx0LmdldEFsbFByb2JsZW1zKCk7Ci0JCWludCBjb3VudCA9IHByb2JsZW1zLmxlbmd0aDsKLQkJaW50IHByb2JsZW1Db3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeyAKLQkJCWlmIChwcm9ibGVtc1tpXSAhPSBudWxsKSB7Ci0JCQkJaWYgKHByb2JsZW1Db3VudCA9PSAwKQotCQkJCQlidWZmZXIuYXBwZW5kKCItLS0tLS0tLS0tXG4iKTsKLQkJCQlwcm9ibGVtQ291bnQrKzsKLQkJCQlidWZmZXIuYXBwZW5kKHByb2JsZW1Db3VudCArIChwcm9ibGVtc1tpXS5pc0Vycm9yKCkgPyAiLiBFUlJPUiIgOiAiLiBXQVJOSU5HIikpOwotCQkJCWJ1ZmZlci5hcHBlbmQoIiBpbiAiICsgbmV3IFN0cmluZyhwcm9ibGVtc1tpXS5nZXRPcmlnaW5hdGluZ0ZpbGVOYW1lKCkpKTsKLQkJCQl0cnkgewotCQkJCQlidWZmZXIuYXBwZW5kKCgoRGVmYXVsdFByb2JsZW0pcHJvYmxlbXNbaV0pLmVycm9yUmVwb3J0U291cmNlKGNvbXBpbGF0aW9uUmVzdWx0LmNvbXBpbGF0aW9uVW5pdCkpOwotCQkJCQlidWZmZXIuYXBwZW5kKCJcbiIpOwotCQkJCQlidWZmZXIuYXBwZW5kKHByb2JsZW1zW2ldLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlxuIik7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQkJYnVmZmVyLmFwcGVuZCgiLS0tLS0tLS0tLVxuIik7Ci0JCQl9Ci0JCX0KLQkJcHJvYmxlbUxvZyArPSBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0Jb3V0cHV0Q2xhc3NGaWxlcyhjb21waWxhdGlvblJlc3VsdCk7CQotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3JlZ3Jlc3Npb24vTG9va3VwVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3JlZ3Jlc3Npb24vTG9va3VwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmQ0ODQxLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9yZWdyZXNzaW9uL0xvb2t1cFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyLnJlZ3Jlc3Npb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLS8qKgotICogTmFtZSBMb29rdXAgd2l0aGluIElubmVyIENsYXNzZXMKLSAqIENyZWF0aW9uIGRhdGU6ICg4LzIvMDAgMTI6MDQ6NTMgUE0pCi0gKiBAYXV0aG9yOiBEZW5uaXMgQ29ud2F5Ci0gKi8KLXB1YmxpYyBjbGFzcyBMb29rdXBUZXN0IGV4dGVuZHMgQWJzdHJhY3RSZWdyZXNzaW9uVGVzdCB7Ci1wdWJsaWMgTG9va3VwVGVzdChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCXJldHVybiBzZXR1cFN1aXRlKHRlc3RDbGFzcygpKTsKLX0KLS8qKgotICogTm9uLXN0YXRpYyBtZW1iZXIgY2xhc3MKLSAqLwotcHVibGljIHZvaWQgdGVzdDAxKCkgewotCXRoaXMucnVuQ29uZm9ybVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkvKiBwMS5BICovCi0JCQkicDEvQS5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOwkJCQkJCQkJCQlcbiIrCi0JCQkicHVibGljIGNsYXNzIEEgewkJCQkJCQkJCVxuIisKLQkJCSIJcHJpdmF0ZSBzdGF0aWMgaW50IHZhbHVlID0gMjM7CQkJCQlcbiIrCi0JCQkiCWNsYXNzIEIgewkJCQkJCQkJCQlcbiIrCi0JCQkiCQlwcml2YXRlIGludCB2YWx1ZTsJCQkJCQkJXG4iKwotCQkJIgkJQiAoaW50IHZhbCkgewkJCQkJCQkJXG4iKwotCQkJIgkJCXZhbHVlID0gKEEudmFsdWUgKiAyKSArIHZhbDsJCQlcbiIrCi0JCQkiCQl9CQkJCQkJCQkJCQlcbiIrCi0JCQkiCX0JCQkJCQkJCQkJCQlcbiIrCi0JCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgYXJnc1tdKSB7CQlcbiIrCi0JCQkiCQlpbnQgcmVzdWx0ID0gbmV3IEEoKS5uZXcgQigxMikudmFsdWU7IAkJXG4iKwotCQkJIgkJaW50IGV4cGVjdGVkID0gNTg7IAkJCQkJCQlcbiIrCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oIAkJCQkJCVxuIisKLQkJCSIJCQlyZXN1bHQgPT0gZXhwZWN0ZWQgCQkJCQkJXG4iKwotCQkJIgkJCQk/IFwiU1VDQ0VTU1wiICAJCQkJCQlcbiIrCi0JCQkiCQkJCTogXCJGQUlMRUQgOiBnb3QgXCIrcmVzdWx0K1wiIGluc3RlYWQgb2YgXCIrIGV4cGVjdGVkKTsgXG4iKwotCQkJIgl9CQkJCQkJCQkJCQkJXG4iKwotCQkJIn0iCi0JCX0sCi0JCSJTVUNDRVNTIgkKLQkpOwkJCQkJCQkJCQotfQotLyoqCi0gKiBBdHRlbXB0IHRvIGFjY2VzcyBub24tc3RhdGljIGZpZWxkIGZyb20gc3RhdGljIGlubmVyIGNsYXNzIChpbGxlZ2FsKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDIoKSB7Ci0JdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkvKiBwMS5BICovCi0JCQkicDEvQS5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOwkJCQkJCQkJCQlcbiIrCi0JCQkiY2xhc3MgQSB7CQkJCQkJCQkJCQlcbiIrCi0JCQkiCXByaXZhdGUgaW50IHZhbHVlOwkJCQkJCQkJXG4iKwotCQkJIglzdGF0aWMgY2xhc3MgQiB7CQkJCQkJCQlcbiIrCi0JCQkiCQlCICgpIHsJCQkJCQkJCQkJXG4iKwotCQkJIgkJCXZhbHVlID0gMjsJCQkJCQkJCVxuIisKLQkJCSIJCX0JCQkJCQkJCQkJCVxuIisKLQkJCSIJfQkJCQkJCQkJCQkJCVxuIisKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBhcmd2W10pIHsJCVxuIisKLQkJCSIJCUIgcmVzdWx0ID0gbmV3IEIoKTsJCQkJCQkJXG4iKwotCQkJIgl9CQkJCQkJCQkJCQkJXG4iKwotCQkJIn0iCi0JCX0sCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIxLiBXQVJOSU5HIGluIHAxXFxBLmphdmEgKGF0IGxpbmUgMylcbiIgKyAKLQkJIglwcml2YXRlIGludCB2YWx1ZTsJCQkJCQkJCVxuIiArIAotCQkiCSAgICAgICAgICAgIF5eXl5eXG4iICsgCi0JCSJUaGUgcHJpdmF0ZSBmaWVsZCBBLnZhbHVlIGlzIG5ldmVyIHJlYWQgbG9jYWxseVxuIiArIAotCQkiLS0tLS0tLS0tLVxuIiArIAotCQkiMi4gRVJST1IgaW4gcDFcXEEuamF2YSAoYXQgbGluZSA2KVxuIiArIAotCQkiCXZhbHVlID0gMjsJCQkJCQkJCVxuIiArIAotCQkiCV5eXl5eXG4iICsgCi0JCSJDYW5ub3QgbWFrZSBhIHN0YXRpYyByZWZlcmVuY2UgdG8gdGhlIG5vbi1zdGF0aWMgZmllbGQgdmFsdWVcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIKLQkpOwkJCQkJCQkJCQotfQotLyoqCi0gKiBBY2Nlc3Mgc3RhdGljIGZpZWxkIGZyb20gc3RhdGljIGlubmVyIGNsYXNzCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMygpIHsKLQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJLyogcDEuQSAqLwotCQkJInAxL0EuamF2YSIsCi0JCQkicGFja2FnZSBwMTsJCQkJCQkJCQkJXG4iKwotCQkJInB1YmxpYyBjbGFzcyBBIHsJCQkJCQkJCQlcbiIrCi0JCQkiCXByaXZhdGUgc3RhdGljIGludCB2YWx1ZTsJCQkJCQlcbiIrCi0JCQkiCXN0YXRpYyBjbGFzcyBCIHsJCQkJCQkJCVxuIisKLQkJCSIJCUIgKCkgewkJCQkJCQkJCQlcbiIrCi0JCQkiCQkJdmFsdWUgPSAyOwkJCQkJCQkJXG4iKwotCQkJIgkJfQkJCQkJCQkJCQkJXG4iKwotCQkJIgl9CQkJCQkJCQkJCQkJXG4iKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIGFyZ3ZbXSkgewkJXG4iKwotCQkJIgkJQiByZXN1bHQgPSBuZXcgQigpOwkJCQkJCQlcbiIrCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJTVUNDRVNTXCIpOwkJCVxuIisKLQkJCSIJfQkJCQkJCQkJCQkJCVxuIisKLQkJCSJ9IiwKLQkJCSJTVUNDRVNTIgotCQl9Ci0JKTsJCQkJCQkJCQkKLX0KLS8qKgotICogCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwNCgpIHsKLQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJLyogcDEuQSAqLwotCQkJInAxL0EuamF2YSIsCi0JCQkicGFja2FnZSBwMTsJCQkJCQkJCQkJXG4iKwotCQkJInB1YmxpYyBjbGFzcyBBIHsJCQkJCQkJCQlcbiIrCi0JCQkiCXByaXZhdGUgU3RyaW5nIHZhbHVlOwkJCQkJCQlcbiIrCi0JCQkiCXByaXZhdGUgQSAoU3RyaW5nIHN0ckluKSB7CQkJCQkJXG4iKwotCQkJIgkJdmFsdWUgPSBuZXcgQihzdHJJbiwgXCJFXCIpLnN0cjsJCQlcbiIrCi0JCQkiCX0JCQkJCQkJCQkJCQlcbiIrCi0JCQkiCWNsYXNzIEIgewkJCQkJCQkJCQlcbiIrCi0JCQkiCQlTdHJpbmcgc3RyOwkJCQkJCQkJCVxuIisKLQkJCSIJCQlwcml2YXRlIEIgKFN0cmluZyBzdHJGcm9tQSwgU3RyaW5nIHN0ckluKQl7XG4iKwotCQkJIgkJCQlzdHIgPSBzdHJGcm9tQSArIHN0ckluICsgbmV3IEMoXCJTXCIpLnN0cjtcbiIrCi0JCQkiCQkJfQkJCQkJCQkJCQlcbiIrCi0JCQkiCQljbGFzcyBDIHsJCQkJCQkJCQlcbiIrCi0JCQkiCQkJU3RyaW5nIHN0cjsJCQkJCQkJCVxuIisKLQkJCSIJCQlwcml2YXRlIEMgKFN0cmluZyBzdHJJbikgewkJCQlcbiIrCi0JCQkiCQkJCXN0ciA9IHN0ckluICsgbmV3IEQoXCJTXCIpLnN0cjsJCVxuIisKLQkJCSIJCQl9CQkJCQkJCQkJCVxuIisKLQkJCSIJCQljbGFzcyBEIHsJCQkJCQkJCVxuIisKLQkJCSIJCQkJU3RyaW5nIHN0cjsJCQkJCQkJXG4iKwotCQkJIgkJCQlwcml2YXRlIEQgKFN0cmluZyBzdHJJbikgewkJCVxuIisKLQkJCSIJCQkJCXN0ciA9IHN0ckluOwkJCQkJXG4iKwotCQkJIgkJCQl9CQkJCQkJCQkJXG4iKwotCQkJIgkJCX0JCQkJCQkJCQkJXG4iKwotCQkJIgkJfQkJCQkJCQkJCQkJXG4iKwotCQkJIgl9CQkJCQkJCQkJCQkJXG4iKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIGFyZ3ZbXSkgewkJXG4iKwotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKG5ldyBBKFwiU1VDQ1wiKS52YWx1ZSk7CVxuIisKLQkJCSIJfQkJCQkJCQkJCQkJCVxuIisKLQkJCSJ9IgotCQl9LAotCQkiU1VDQ0VTUyIKLQkpOwotfQotLyoqCi0gKiAKLSAqLwotcHVibGljIHZvaWQgdGVzdDA1KCkgewotCXRoaXMucnVuQ29uZm9ybVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkvKiBwMS5BICovCi0JCQkicDEvQS5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOwkJCQkJCQkJCQlcbiIrCi0JCQkicHVibGljIGNsYXNzIEEgewkJCQkJCQkJCVxuIisKLQkJCSIJcHJpdmF0ZSBzdGF0aWMgdm9pZCBkb1NvbWV0aGluZyhTdHJpbmcgc2hvd1RoaXMpIHtcbiIrCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50KHNob3dUaGlzKTsJCQkJCVxuIisKLQkJCSIJCXJldHVybjsJCQkJCQkJCQkJXG4iKwotCQkJIgl9CQkJCQkJCQkJCQkJXG4iKwotCQkJIgljbGFzcyBCIHsJCQkJCQkJCQkJXG4iKwotCQkJIgkJdm9pZCBhTWV0aG9kICgpIHsJCQkJCQkJXG4iKwotCQkJIgkJCXAxLkEuZG9Tb21ldGhpbmcoXCJTVUNDXCIpOwkJCQlcbiIrCi0JCQkiCQkJQS5kb1NvbWV0aGluZyhcIkVTXCIpOwkJCQkJXG4iKwotCQkJIgkJCWRvU29tZXRoaW5nKFwiU1wiKTsJCQkJCQlcbiIrCi0JCQkiCQl9CQkJCQkJCQkJCQlcbiIrCQkKLQkJCSIJfQkJCQkJCQkJCQkJCVxuIisKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBhcmd2W10pIHsJCVxuIisKLQkJCSIJCUIgZm9vID0gbmV3IEEoKS5uZXcgQigpOwkJCQkJXG4iKwotCQkJIgkJZm9vLmFNZXRob2QoKTsJCQkJCQkJCVxuIisKLQkJCSIJfQkJCQkJCQkJCQkJCVxuIisKLQkJCSJ9IgotCQl9LAotCQkiU1VDQ0VTUyIKLQkpOwotfQotLyoqCi0gKiBqZGsxLjIuMiByZXBvcnRzOiBObyB2YXJpYWJsZSBzdWNlc3MgZGVmaW5lZCBpbiBuZXN0ZWQgY2xhc3MgcDEuQS4gQi5DLgotICogamRrMS4zIHJlcG9ydHM6IHN1Y2Nlc3MgaGFzIHByaXZhdGUgYWNjZXNzIGluIHAxLkEKLSAqLwotcHVibGljIHZvaWQgdGVzdDA2KCkgewotCXRoaXMucnVuTmVnYXRpdmVUZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJLyogcDEuQSAqLwotCQkJInAxL0EuamF2YSIsCi0JCQkicGFja2FnZSBwMTsJCQkJCQkJCQkJXG4iKwotCQkJImNsYXNzIEEgewkJCQkJCQkJCQkJXG4iKwotCQkJIglwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3VjY2VzcyA9IFwiU1VDQ0VTU1wiOwlcbiIrCi0JCQkiCXB1YmxpYyBpbnRlcmZhY2UgQiB7CQkJCQkJCVxuIisKLQkJCSIJCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFUYXNrKCk7CQkJCVxuIisKLQkJCSIJCWNsYXNzIEMgZXh0ZW5kcyBBIGltcGxlbWVudHMgQiB7CQkJXG4iKwotCQkJIgkJCXB1YmxpYyB2b2lkIGFUYXNrKCkge1N5c3RlbS5vdXQucHJpbnRsbih0aGlzLnN1Y2Nlc3MpO31cbiIrCi0JCQkiCQl9CQkJCQkJCQkJCQlcbiIrCi0JCQkiCX0JCQkJCQkJCQkJCQlcbiIrCi0JCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmd2KSB7CQlcbiIrCi0JCQkiCX0JCQkJCQkJCQkJCQlcbiIrCi0JCQkifSIKLQkJfSwKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjEuIFdBUk5JTkcgaW4gcDFcXEEuamF2YSAoYXQgbGluZSAzKVxuIiArIAotCQkiCXByaXZhdGUgc3RhdGljIFN0cmluZyBzdWNjZXNzID0gXCJTVUNDRVNTXCI7CVxuIiArIAotCQkiCSAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXG4iICsgCi0JCSJUaGUgcHJpdmF0ZSBmaWVsZCBBLnN1Y2Nlc3MgaXMgbmV2ZXIgcmVhZCBsb2NhbGx5XG4iICsgCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIyLiBFUlJPUiBpbiBwMVxcQS5qYXZhIChhdCBsaW5lIDcpXG4iICsgCi0JCSIJcHVibGljIHZvaWQgYVRhc2soKSB7U3lzdGVtLm91dC5wcmludGxuKHRoaXMuc3VjY2Vzcyk7fVxuIiArIAotCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5cbiIgKyAKLQkJIlRoZSBmaWVsZCBzdWNjZXNzIGlzIG5vdCB2aXNpYmxlXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iCi0KLQkpOwotfQotLyoqCi0gKiBObyBlcnJvcnMgaW4gamRrMS4yLjIsIGpkazEuMwotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDcoKSB7Ci0JdGhpcy5ydW5Db25mb3JtVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCS8qIHAxLkEgKi8KLQkJCSJwMS9BLmphdmEiLAotCQkJInBhY2thZ2UgcDE7CQkJCQkJCQkJCVxuIisKLQkJCSJwdWJsaWMgY2xhc3MgQSB7CQkJCQkJCQkJXG4iKwotCQkJIglwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3VjY2VzcyA9IFwiU1VDQ0VTU1wiOwlcbiIrCi0JCQkiCXB1YmxpYyBpbnRlcmZhY2UgQiB7CQkJCQkJCVxuIisKLQkJCSIJCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFUYXNrKCk7CQkJCVxuIisJCi0JCQkiCQljbGFzcyBDIGV4dGVuZHMgQSBpbXBsZW1lbnRzIEIgewkJCVxuIisKLQkJCSIJCQlwdWJsaWMgdm9pZCBhVGFzaygpIHtTeXN0ZW0ub3V0LnByaW50bG4oQS5zdWNjZXNzKTt9XG4iKwotCQkJIgkJfQkJCQkJCQkJCQkJXG4iKwotCQkJIgl9CQkJCQkJCQkJCQkJXG4iKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJndikgewkJXG4iKwotCQkJIgl9CQkJCQkJCQkJCQkJXG4iKwotCQkJIn0iCi0JCX0KLQkpOwotfQotLyoqCi0gKiBqZGsxLjIuMiByZXBvcnRzOiBVbmRlZmluZWQgdmFyaWFibGU6IEEudGhpcwotICogamRrMS4zIHJlcG9ydHM6IG5vbi1zdGF0aWMgdmFyaWFibGUgdGhpcyBjYW5ub3QgYmUgcmVmZXJlbmNlZCBmcm9tIGEgc3RhdGljIGNvbnRleHQKLSAqLwotcHVibGljIHZvaWQgdGVzdDA4KCkgewotCXRoaXMucnVuTmVnYXRpdmVUZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJLyogcDEuQSAqLwotCQkJInAxL0EuamF2YSIsCi0JCQkicGFja2FnZSBwMTsJCQkJCQkJCQkJXG4iKwotCQkJImNsYXNzIEEgewkJCQkJCQkJCQkJXG4iKwotCQkJIglwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3VjY2VzcyA9IFwiU1VDQ0VTU1wiOwlcbiIrCi0JCQkiCXB1YmxpYyBpbnRlcmZhY2UgQiB7CQkJCQkJCVxuIisKLQkJCSIJCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFUYXNrKCk7CQkJCVxuIisJCi0JCQkiCQljbGFzcyBDIGV4dGVuZHMgQSBpbXBsZW1lbnRzIEIgewkJCVxuIisKLQkJCSIJCQlwdWJsaWMgdm9pZCBhVGFzaygpIHtTeXN0ZW0ub3V0LnByaW50bG4oQS50aGlzLnN1Y2Nlc3MpO31cbiIrCi0JCQkiCQl9CQkJCQkJCQkJCQlcbiIrCi0JCQkiCX0JCQkJCQkJCQkJCQlcbiIrCi0JCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmd2KSB7CQlcbiIrCi0JCQkiCX0JCQkJCQkJCQkJCQlcbiIrCi0JCQkifSIKLQkJfSwKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjEuIEVSUk9SIGluIHAxXFxBLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKLQkJIglwdWJsaWMgdm9pZCBhVGFzaygpIHtTeXN0ZW0ub3V0LnByaW50bG4oQS50aGlzLnN1Y2Nlc3MpO31cbiIgKyAKLQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXG4iICsgCi0JCSJObyBlbmNsb3NpbmcgaW5zdGFuY2Ugb2YgdGhlIHR5cGUgQSBpcyBhY2Nlc3NpYmxlIGluIHNjb3BlXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIyLiBXQVJOSU5HIGluIHAxXFxBLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKLQkJIglwdWJsaWMgdm9pZCBhVGFzaygpIHtTeXN0ZW0ub3V0LnByaW50bG4oQS50aGlzLnN1Y2Nlc3MpO31cbiIgKyAKLQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5cbiIgKyAKLQkJIlRoZSBzdGF0aWMgZmllbGQgQS5zdWNjZXNzIHNob3VsZCBiZSBhY2Nlc3NlZCBpbiBhIHN0YXRpYyB3YXlcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIKLQkpOwotfQotLyoqCi0gKiBqZGsxLjIuMiByZXBvcnRzOiBObyB2YXJpYWJsZSBzdWNjZXNzIGRlZmluZWQgaW4gbmVzdGVkIGNsYXNzIHAxLkEuIEIuQwotICogamRrMS4zIHJlcG9ydHM6IHN1Y2Nlc3MgaGFzIHByaXZhdGUgYWNjZXNzIGluIHAxLkEKLSAqLwotcHVibGljIHZvaWQgdGVzdDA5KCkgewotCXRoaXMucnVuTmVnYXRpdmVUZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJLyogcDEuQSAqLwotCQkJInAxL0EuamF2YSIsCi0JCQkicGFja2FnZSBwMTsJCQkJCQkJCQkJXG4iKwotCQkJImNsYXNzIEEgewkJCQkJCQkJCQkJXG4iKwotCQkJIglwcml2YXRlIFN0cmluZyBzdWNjZXNzID0gXCJTVUNDRVNTXCI7CQkJXG4iKwotCQkJIglwdWJsaWMgaW50ZXJmYWNlIEIgewkJCQkJCQlcbiIrCi0JCQkiCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhVGFzaygpOwkJCQlcbiIrCi0JCQkiCQljbGFzcyBDIGV4dGVuZHMgQSBpbXBsZW1lbnRzIEIgewkJCVxuIisKLQkJCSIJCQlwdWJsaWMgdm9pZCBhVGFzaygpIHtTeXN0ZW0ub3V0LnByaW50bG4odGhpcy5zdWNjZXNzKTt9XG4iKwotCQkJIgkJfQkJCQkJCQkJCQkJXG4iKwotCQkJIgl9CQkJCQkJCQkJCQkJXG4iKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJndikgewkJXG4iKwotCQkJIgl9CQkJCQkJCQkJCQkJXG4iKwotCQkJIn0iCi0JCX0sCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIxLiBXQVJOSU5HIGluIHAxXFxBLmphdmEgKGF0IGxpbmUgMylcbiIgKyAKLQkJIglwcml2YXRlIFN0cmluZyBzdWNjZXNzID0gXCJTVUNDRVNTXCI7CQkJXG4iICsgCi0JCSIJICAgICAgICAgICAgICAgXl5eXl5eXlxuIiArIAotCQkiVGhlIHByaXZhdGUgZmllbGQgQS5zdWNjZXNzIGlzIG5ldmVyIHJlYWQgbG9jYWxseVxuIiArIAotCQkiLS0tLS0tLS0tLVxuIiArIAotCQkiMi4gRVJST1IgaW4gcDFcXEEuamF2YSAoYXQgbGluZSA3KVxuIiArIAotCQkiCXB1YmxpYyB2b2lkIGFUYXNrKCkge1N5c3RlbS5vdXQucHJpbnRsbih0aGlzLnN1Y2Nlc3MpO31cbiIgKyAKLQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXG4iICsgCi0JCSJUaGUgZmllbGQgc3VjY2VzcyBpcyBub3QgdmlzaWJsZVxuIiArIAotCQkiLS0tLS0tLS0tLVxuIgotCi0JKTsKLX0KLS8qKgotICogamRrMS4yLjIgcmVwb3J0czogQ2FuJ3QgbWFrZSBhIHN0YXRpYyByZWZlcmVuY2UgdG8gbm9uc3RhdGljIHZhcmlhYmxlIHN1Y2Nlc3MgaW4gY2xhc3MgcDEuQQotICogamRrMS4zIHJlcG9ydHM6IG5vbi1zdGF0aWMgdmFyaWFibGUgc3VjY2VzcyBjYW5ub3QgYmUgcmVmZXJlbmNlZCBmcm9tIGEgc3RhdGljIGNvbnRleHQKLSAqLwotcHVibGljIHZvaWQgdGVzdDEwKCkgewotCXRoaXMucnVuTmVnYXRpdmVUZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJLyogcDEuQSAqLwotCQkJInAxL0EuamF2YSIsCi0JCQkicGFja2FnZSBwMTsJCQkJCQkJCQkJXG4iKwotCQkJImNsYXNzIEEgewkJCQkJCQkJCQkJXG4iKwotCQkJIglwcml2YXRlIFN0cmluZyBzdWNjZXNzID0gXCJTVUNDRVNTXCI7CQkJXG4iKwotCQkJIglwdWJsaWMgaW50ZXJmYWNlIEIgewkJCQkJCQlcbiIrCi0JCQkiCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhVGFzaygpOwkJCQlcbiIrCQotCQkJIgkJY2xhc3MgQyBleHRlbmRzIEEgaW1wbGVtZW50cyBCIHsJCQlcbiIrCi0JCQkiCQkJcHVibGljIHZvaWQgYVRhc2soKSB7U3lzdGVtLm91dC5wcmludGxuKEEuc3VjY2Vzcyk7fVxuIisKLQkJCSIJCX0JCQkJCQkJCQkJCVxuIisKLQkJCSIJfQkJCQkJCQkJCQkJCVxuIisKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3YpIHsJCVxuIisKLQkJCSIJfQkJCQkJCQkJCQkJCVxuIisKLQkJCSJ9IgotCQl9LAotCQkiLS0tLS0tLS0tLVxuIiArIAotCQkiMS4gV0FSTklORyBpbiBwMVxcQS5qYXZhIChhdCBsaW5lIDMpXG4iICsgCi0JCSIJcHJpdmF0ZSBTdHJpbmcgc3VjY2VzcyA9IFwiU1VDQ0VTU1wiOwkJCVxuIiArIAotCQkiCSAgICAgICAgICAgICAgIF5eXl5eXl5cbiIgKyAKLQkJIlRoZSBwcml2YXRlIGZpZWxkIEEuc3VjY2VzcyBpcyBuZXZlciByZWFkIGxvY2FsbHlcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjIuIEVSUk9SIGluIHAxXFxBLmphdmEgKGF0IGxpbmUgNylcbiIgKyAKLQkJIglwdWJsaWMgdm9pZCBhVGFzaygpIHtTeXN0ZW0ub3V0LnByaW50bG4oQS5zdWNjZXNzKTt9XG4iICsgCi0JCSIJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXlxuIiArIAotCQkiQ2Fubm90IG1ha2UgYSBzdGF0aWMgcmVmZXJlbmNlIHRvIHRoZSBub24tc3RhdGljIGZpZWxkIEEuc3VjY2Vzc1xuIiArIAotCQkiLS0tLS0tLS0tLVxuIgotCSk7Ci19Ci0vKioKLSAqIAotICovCi1wdWJsaWMgdm9pZCB0ZXN0MTEoKSB7Ci0JdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkvKiBwMi5BYSAqLwotCQkJInAyL0FhLmphdmEiLAotCQkJInBhY2thZ2UgcDI7CQkJCQkJCQkJCVxuIisKLQkJCSJjbGFzcyBBYSBleHRlbmRzIHAxLkF7CQkJCQkJCQlcbiIrCi0JCQkiCWNsYXNzIEIgaW1wbGVtZW50cyBwMS5BLkMgewkJCQkJCVxuIisKLQkJCSIJfQkJCQkJCQkJCQkJCVxuIisKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBhcmdzW10pIHsJCVxuIisKLQkJCSIJfQkJCQkJCQkJCQkJCVxuIisKLQkJCSJ9IiwKLQkJCS8qIHAxLkEgKi8KLQkJCSJwMS9BLmphdmEiLAotCQkJInBhY2thZ2UgcDE7CQkJCQkJCQkJCVxuIisKLQkJCSJwdWJsaWMgY2xhc3MgQSB7CQkJCQkJCQkJXG4iKwotCQkJIiAgIHB1YmxpYyBBKCkgewkJCQkJCQkJCVxuIisKLQkJCSIJfQkJCQkJCQkJCQkJCVxuIisKLQkJCSIJY2xhc3MgQiBpbXBsZW1lbnRzIEMgewkJCQkJCQlcbiIrCi0JCQkiCQlwdWJsaWMgaW50IHNNZXRob2QoKSB7CQkJCQkJXG4iKwotCQkJIgkJCXJldHVybiAyMzsJCQkJCQkJCVxuIisKLQkJCSIJCX0JCQkJCQkJCQkJCVxuIisKLQkJCSIJfQkJCQkJCQkJCQkJCVxuIisKLQkJCSIJcHVibGljIGludGVyZmFjZSBDIHsJCQkJCQkJXG4iKwotCQkJIgkJcHVibGljIGFic3RyYWN0IGludCBzTWV0aG9kKCk7CQkJCVxuIisKLQkJCSIJfQkJCQkJCQkJCQkJCVxuIisKLQkJCSJ9IiwKLQotCQl9LAotCQkiLS0tLS0tLS0tLVxuIiArIAotCQkiMS4gRVJST1IgaW4gcDJcXEFhLmphdmEgKGF0IGxpbmUgMylcbiIgKyAKLQkJIgljbGFzcyBCIGltcGxlbWVudHMgcDEuQS5DIHsJCQkJCQlcbiIgKyAKLQkJIgkgICAgICBeXG4iICsgCi0JCSJDbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgaW5oZXJpdGVkIGFic3RyYWN0IG1ldGhvZCBBLkMuc01ldGhvZCgpXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iCi0JKTsKLX0KLS8qKgotICogCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QxMigpIHsKLQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJLyogcDEuQSAqLwotCQkJInAxL0EuamF2YSIsCi0JCQkicGFja2FnZSBwMTsJCQkJCQkJCQkJXG4iKwotCQkJInB1YmxpYyBjbGFzcyBBIHsJCQkJCQkJCQlcbiIrCi0JCQkiCXB1YmxpYyBpbnRlcmZhY2UgQiB7CQkJCQkJCVxuIisKLQkJCSIJCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFNZXRob2QgKGludCBBKTsJCVxuIisKLQkJCSIJCXB1YmxpYyBpbnRlcmZhY2UgQyB7CQkJCQkJXG4iKwotCQkJIgkJCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFub3RoZXJNZXRob2QoKTsJXG4iKwotCQkJIgkJfQkJCQkJCQkJCQkJXG4iKwotCQkJIgl9CQkJCQkJCQkJCQkJXG4iKwotCQkJIglwdWJsaWMgY2xhc3MgYUNsYXNzIGltcGxlbWVudHMgQiwgQi5DIHsJCQlcbiIrCi0JCQkiCQlwdWJsaWMgdm9pZCBhTWV0aG9kIChpbnQgQSkgewkJCQlcbiIrCi0JCQkiCQl9CQkJCQkJCQkJCQlcbiIrCi0JCQkiCQlwdWJsaWMgdm9pZCBhbm90aGVyTWV0aG9kKCl7fQkJCQlcbiIrCi0JCQkiCX0JCQkJCQkJCQkJCQlcbiIrCi0JCQkiICAgCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgYXJndltdKSB7CVxuIisKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7CQkJXG4iKwotCQkJIgl9CQkJCQkJCQkJCQkJXG4iKwotCQkJIn0iCi0JCX0sCi0JCSJTVUNDRVNTIgotCSk7Ci19Ci0vKioKLSAqIAotICovCi1wdWJsaWMgdm9pZCB0ZXN0MTMoKSB7Ci0JdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkvKiBwMS5BICovCi0JCQkicDEvQS5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOwkJCQkJCQkJCQlcbiIrCi0JCQkicHVibGljIGNsYXNzIEEgewkJCQkJCQkJCVxuIisKLQkJCSIJcHVibGljIGludGVyZmFjZSBCIHsJCQkJCQkJXG4iKwotCQkJIgkJcHVibGljIGFic3RyYWN0IHZvaWQgYU1ldGhvZCAoaW50IEEpOwkJXG4iKwotCQkJIgkJcHVibGljIGludGVyZmFjZSBDIHsJCQkJCQlcbiIrCi0JCQkiCQkJcHVibGljIGFic3RyYWN0IHZvaWQgYW5vdGhlck1ldGhvZChpbnQgQSk7XG4iKwotCQkJIgkJfQkJCQkJCQkJCQkJXG4iKwotCQkJIgl9CQkJCQkJCQkJCQkJXG4iKwotCQkJIglwdWJsaWMgY2xhc3MgYUNsYXNzIGltcGxlbWVudHMgQiwgQi5DIHsJCQlcbiIrCi0JCQkiCQlwdWJsaWMgdm9pZCBhTWV0aG9kIChpbnQgQSkgewkJCQlcbiIrCi0JCQkiCQkJcHVibGljIHZvaWQgYW5vdGhlck1ldGhvZChpbnQgQSkge307CVxuIisKLQkJCSIJCX0JCQkJCQkJCQkJCVxuIisKLQkJCSIJfQkJCQkJCQkJCQkJCVxuIisKLQkJCSIgICAJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBhcmd2W10pIHsJXG4iKwotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTsJCQlcbiIrCi0JCQkiCX0JCQkJCQkJCQkJCQlcbiIrCi0JCQkifSIKLQkJfSwKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjEuIEVSUk9SIGluIHAxXFxBLmphdmEgKGF0IGxpbmUgOSlcbiIgKyAKLQkJIglwdWJsaWMgY2xhc3MgYUNsYXNzIGltcGxlbWVudHMgQiwgQi5DIHsJCQlcbiIgKyAKLQkJIgkgICAgICAgICAgICAgXl5eXl5eXG4iICsgCi0JCSJDbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgaW5oZXJpdGVkIGFic3RyYWN0IG1ldGhvZCBBLkIuQy5hbm90aGVyTWV0aG9kKGludClcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjIuIEVSUk9SIGluIHAxXFxBLmphdmEgKGF0IGxpbmUgMTEpXG4iICsgCi0JCSIJcHVibGljIHZvaWQgYW5vdGhlck1ldGhvZChpbnQgQSkge307CVxuIiArIAotCQkiCSAgICAgICAgICAgICAgICAgICAgICAgICBeXG4iICsgCi0JCSJTeW50YXggZXJyb3Igb24gdG9rZW4gXCIoXCIsIFwiO1wiIGV4cGVjdGVkXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iCi0JKTsKLX0KLS8qKgotICoKLSAqLwotcHVibGljIHZvaWQgdGVzdDE0KCkgewotCXRoaXMucnVuTmVnYXRpdmVUZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJLyogcGFjazEuRmlyc3QgKi8KLQkJCSJwYWNrMS9GaXJzdC5qYXZhIiwKLQkJCSJwYWNrYWdlIHBhY2sxOwkJCQkJCQkJCQlcbiIrCi0JCQkicHVibGljIGNsYXNzIEZpcnN0IHsJCQkJCQkJCVxuIisKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIHNvbWV0aGluZygpIHt9CQkJCVxuIisKLQkJCSIJCWNsYXNzIElubmVyIHt9CQkJCQkJCQlcbiIrCQotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIGFyZ3ZbXSkgewkJXG4iKwotCQkJIgkJRmlyc3QuSW5uZXIgZm9vID0gbmV3IEZpcnN0KCkubmV3IElubmVyKCk7CVxuIisKLQkJCSIJCWZvby5zb21ldGhpbmcoKTsJCQkJCQkJXG4iKwotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTsJCQlcbiIrCi0JCQkiCX0JCQkJCQkJCQkJCQlcbiIrCi0JCQkifSIKLQkJfSwKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjEuIEVSUk9SIGluIHBhY2sxXFxGaXJzdC5qYXZhIChhdCBsaW5lIDcpXG4iICsgCi0JCSIJZm9vLnNvbWV0aGluZygpOwkJCQkJCQlcbiIgKyAKLQkJIgkgICAgXl5eXl5eXl5eXG4iICsgCi0JCSJUaGUgbWV0aG9kIHNvbWV0aGluZygpIGlzIHVuZGVmaW5lZCBmb3IgdGhlIHR5cGUgRmlyc3QuSW5uZXJcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIKLQkpOwotfQotLyoqCi0gKgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MTUoKSB7Ci0JdGhpcy5ydW5Db25mb3JtVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCS8qIHBhY2sxLkZpcnN0ICovCi0JCQkicGFjazEvRmlyc3QuamF2YSIsCi0JCQkicGFja2FnZSBwYWNrMTsJCQkJCQkJCQkJXG4iKwotCQkJInB1YmxpYyBjbGFzcyBGaXJzdCB7CQkJCQkJCQlcbiIrCi0JCQkiCQljbGFzcyBJbm5lciB7CQkJCQkJCQlcbiIrCi0JCQkiCQkJcHVibGljIHZvaWQgc29tZXRoaW5nKCkge30JCQkJXG4iKwotCQkJIgkJfQkJCQkJCQkJCQkJXG4iKwkKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBhcmd2W10pIHsJCVxuIisKLQkJCSIJCUZpcnN0LklubmVyIGZvbyA9IG5ldyBGaXJzdCgpLm5ldyBJbm5lcigpOwlcbiIrCi0JCQkiCQlmb28uc29tZXRoaW5nKCk7CQkJCQkJCVxuIisKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7CQkJXG4iKwotCQkJIgl9CQkJCQkJCQkJCQkJXG4iKwotCQkJIn0iCi0JCX0sCi0JCSJTVUNDRVNTIgotCSk7Ci19Ci0vKioKLSAqCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QxNigpIHsKLQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJLyogcGFjazEuT3V0ZXIgKi8KLQkJCSJwYWNrMS9PdXRlci5qYXZhIiwKLQkJCSJwYWNrYWdlIHBhY2sxOwkJCQkJCQkJCQlcbiIrCi0JCQkiaW1wb3J0IHBhY2syLio7CQkJCQkJCQkJXG4iKwotCQkJInB1YmxpYyBjbGFzcyBPdXRlciB7CQkJCQkJCQlcbiIrCi0JCQkiCWludCB0aW1lLCBkaXN0YW5jZTsJCQkJCQkJCVxuIisKLQkJCSIJcHVibGljIE91dGVyKCkgewkJCQkJCQkJXG4iKwotCQkJIgl9CQkJCQkJCQkJCQkJXG4iKwotCQkJIglwdWJsaWMgT3V0ZXIoaW50IGQpIHsJCQkJCQkJXG4iKwotCQkJIgkJZGlzdGFuY2UgPSBkOwkJCQkJCQkJXG4iKwotCQkJIgl9CQkJCQkJCQkJCQkJXG4iKwotCQkJIglwdWJsaWMgdm9pZCBhTWV0aG9kKCkgewkJCQkJCQlcbiIrCi0JCQkiCQl0aGlzLmRpc3RhbmNlICo9IDI7CQkJCQkJCVxuIisKLQkJCSIJCXJldHVybjsJCQkJCQkJCQkJXG4iKwotCQkJIgl9CQkJCQkJCQkJCQkJXG4iKwotCQkJIn0iLAotCQkJLyogcGFjazIuT3V0ZXJUd28gKi8KLQkJCSJwYWNrMi9PdXRlclR3by5qYXZhIiwKLQkJCSJwYWNrYWdlIHBhY2syOwkJCQkJCQkJCQlcbiIrCi0JCQkiaW1wb3J0IHBhY2sxLio7CQkJCQkJCQkJXG4iKwotCQkJInB1YmxpYyBjbGFzcyBPdXRlclR3byBleHRlbmRzIE91dGVyIHsJCQkJXG4iKwotCQkJIglwdWJsaWMgT3V0ZXJUd28oaW50IGJhcikgewkJCQkJCVxuIisKLQkJCSIJCU91dGVyIEEgPSBuZXcgT3V0ZXIoMykgewkJCQkJXG4iKwotCQkJIgkJCXB1YmxpYyB2b2lkIGJNZXRob2QoKXsJCQkJCVxuIisKLQkJCSIJCQkJZmluYWwgY2xhc3MgWCB7CQkJCQkJXG4iKwotCQkJIgkJCQkJaW50IHByaWNlOwkJCQkJCVxuIisKLQkJCSIJCQkJCXB1YmxpYyBYKGludCBpbnApIHsJCQkJXG4iKwotCQkJIgkJCQkJCXByaWNlID0gaW5wICsgMzI7CQkJXG4iKwotCQkJIgkJCQkJfQkJCQkJCQkJXG4iKwotCQkJIgkJCQl9CQkJCQkJCQkJXG4iKwotCQkJIgkJCX0JCQkJCQkJCQkJXG4iKwotCQkJIgkJfTsJCQkJCQkJCQkJCVxuIisKLQkJCSIJfQkJCQkJCQkJCQkJCVxuIisKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBhcmd2W10pIHsJCVxuIisKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihcIlwiKTsJCQkJCVxuIisKLQkJCSIJCU91dGVyVHdvIGZvbyA9IG5ldyBPdXRlclR3bygxMik7CQkJXG4iKwotCQkJIgkJT3V0ZXIgYmFyID0gbmV3IE91dGVyKDgpOwkJCQkJXG4iKwotCQkJIgl9CQkJCQkJCQkJCQkJXG4iKwotCQkJIn0iCi0JCX0KLQkpOwotfQotLyoqCi0gKgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MTcoKSB7Ci0JdGhpcy5ydW5Db25mb3JtVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCS8qIHAxLkEgKi8KLQkJCSJwMS9BLmphdmEiLAotCQkJInBhY2thZ2UgcDE7CQkJCQkJCQkJCVxuIisKLQkJCSJwdWJsaWMgY2xhc3MgQQl7CQkJCQkJCQkJXG4iKwotCQkJIglpbnQgdmFsdWU7CQkJCQkJCQkJCVxuIisKLQkJCSIJcHVibGljIEEoQiBiVmFsKSB7CQkJCQkJCQlcbiIrCi0JCQkiCQliVmFsLnN2YWwgKz0gXCJWXCI7CQkJCQkJCVxuIisKLQkJCSIJfQkJCQkJCQkJCQkJCVxuIisKLQkJCSIJc3RhdGljIGNsYXNzIEIgewkJCQkJCQkJXG4iKwotCQkJIgkJcHVibGljIHN0YXRpYyBTdHJpbmcgc3ZhbDsJCQkJCVxuIisKLQkJCSIJCXB1YmxpYyB2b2lkIGFNZXRob2QoKSB7CQkJCQkJXG4iKwotCQkJIgkJCXN2YWwgKz0gXCJTXCI7CQkJCQkJCVxuIisKLQkJCSIJCQlBIGJhciA9IG5ldyBBKHRoaXMpOwkJCQkJXG4iKwotCQkJIgkJfQkJCQkJCQkJCQkJXG4iKwotCQkJIgl9CQkJCQkJCQkJCQkJXG4iKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIGFyZ3ZbXSkgewkJXG4iKwotCQkJIgkJQiBmb28gPSBuZXcgQigpOwkJCQkJCQlcbiIrCi0JCQkiCQlmb28uc3ZhbCA9IFwiVVwiOwkJCQkJCQlcbiIrCi0JCQkiCQlmb28uYU1ldGhvZCgpOwkJCQkJCQkJXG4iKwotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKGZvby5zdmFsKTsJCQkJXG4iKwotCQkJIgl9CQkJCQkJCQkJCQkJXG4iKwotCQkJIn0iCi0JCX0sCi0JCSJVU1YiCi0JKTsKLX0KLS8qKgotICogbWVtYmVyIGNsYXNzCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QxOCgpIHsKLQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJLyogcDEuQSAqLwotCQkJInAxL0EuamF2YSIsCi0JCQkicGFja2FnZSBwMTsJCQkJCQkJCQkJXG4iKwotCQkJInB1YmxpYyBjbGFzcyBBCXsJCQkJCQkJCQlcbiIrCi0JCQkiCXByaXZhdGUgU3RyaW5nIHJhdGluZzsJCQkJCQkJXG4iKwotCQkJIglwdWJsaWMgY2xhc3MgQiB7CQkJCQkJCQlcbiIrCi0JCQkiCQlTdHJpbmcgcmF0aW5nOwkJCQkJCQkJXG4iKwotCQkJIgkJcHVibGljIEIgKEEgc3RoKSB7CQkJCQkJCVxuIisKLQkJCSIJCQlzdGgucmF0aW5nID0gXCJtXCI7CQkJCQkJXG4iKwotCQkJIgkJCXJhdGluZyA9IFwiZXJcIjsJCQkJCQlcbiIrCi0JCQkiCQl9CQkJCQkJCQkJCQlcbiIrCi0JCQkiCX0JCQkJCQkJCQkJCQlcbiIrCi0JCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgYXJndltdKSB7CQlcbiIrCi0JCQkiCQlBIGZvbyA9IG5ldyBBKCk7CQkJCQkJCVxuIisKLQkJCSIJCWZvby5yYXRpbmcgPSBcIm9cIjsJCQkJCQkJXG4iKwotCQkJIgkJQiBiYXIgPSBmb28ubmV3IEIoZm9vKTsJCQkJCQlcbiIrCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oZm9vLnJhdGluZyArIGJhci5yYXRpbmcpO1xuIisKLQkJCSIJfQkJCQkJCQkJCQkJCVxuIisKLQkJCSJ9IgotCQl9LAotCQkibWVyIgotCSk7Ci19Ci0vKioKLSAqIG1lbWJlciBjbGFzcwotICovCi1wdWJsaWMgdm9pZCB0ZXN0MTkoKSB7Ci0JdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkvKiBwMS5BICovCi0JCQkicDEvQS5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOwkJCQkJCQkJCQlcbiIrCi0JCQkicHVibGljIGNsYXNzIEEJewkJCQkJCQkJCVxuIisKLQkJCSIJcHJpdmF0ZSBTdHJpbmcgcmF0aW5nOwkJCQkJCQlcbiIrCi0JCQkiCXB1YmxpYyB2b2lkIHNldFJhdGluZyhBIHN0aCwgU3RyaW5nIHNldFRvKSB7CVxuIisKLQkJCSIJCXN0aC5yYXRpbmcgPSBzZXRUbzsJCQkJCQkJXG4iKwotCQkJIgkJcmV0dXJuOwkJCQkJCQkJCQlcbiIrCi0JCQkiCX0JCQkJCQkJCQkJCQlcbiIrCi0JCQkiCXB1YmxpYyBjbGFzcyBCIHsJCQkJCQkJCVxuIisKLQkJCSIJCXB1YmxpYyBCIChBIHN0aCkgewkJCQkJCQlcbiIrCi0JCQkiCQkJc2V0UmF0aW5nKHN0aCwgXCJtXCIpOwkJCQkJXG4iKwotCQkJIgkJfQkJCQkJCQkJCQkJXG4iKwotCQkJIgl9CQkJCQkJCQkJCQkJXG4iKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIGFyZ3ZbXSkgewkJXG4iKwotCQkJIgkJQSBmb28gPSBuZXcgQSgpOwkJCQkJCQlcbiIrCi0JCQkiCQlmb28ucmF0aW5nID0gXCJvXCI7CQkJCQkJCVxuIisKLQkJCSIJCUIgYmFyID0gZm9vLm5ldyBCKGZvbyk7CQkJCQkJXG4iKwotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKGZvby5yYXRpbmcgKyBiYXIub3RoZXIpOwlcbiIrCi0JCQkiCX0JCQkJCQkJCQkJCQlcbiIrCi0JCQkifSIKLQkJfSwKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjEuIEVSUk9SIGluIHAxXFxBLmphdmEgKGF0IGxpbmUgMTcpXG4iICsgCi0JCSIJU3lzdGVtLm91dC5wcmludGxuKGZvby5yYXRpbmcgKyBiYXIub3RoZXIpOwlcbiIgKyAKLQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXlxuIiArIAotCQkiYmFyLm90aGVyIGNhbm5vdCBiZSByZXNvbHZlZCBvciBpcyBub3QgYSBmaWVsZFxuIiArIAotCQkiLS0tLS0tLS0tLVxuIgotCSk7Ci19Ci0vKioKLSAqIG1lbWJlciBjbGFzcwotICovCi1wdWJsaWMgdm9pZCB0ZXN0MjAoKSB7Ci0JdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkvKiBwMS5BICovCi0JCQkicDEvQS5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOwkJCQkJCQkJCQlcbiIrCi0JCQkicHVibGljIGNsYXNzIEEJewkJCQkJCQkJCVxuIisKLQkJCSIJcHJpdmF0ZSBTdHJpbmcgcmF0aW5nOwkJCQkJCQlcbiIrCi0JCQkiCXB1YmxpYyBjbGFzcyBCIHsJCQkJCQkJCVxuIisKLQkJCSIJCXB1YmxpYyBCIChBIHN0aCkgewkJCQkJCQlcbiIrCi0JCQkiCQkJc3RoLnJhdGluZyA9IFwibVwiOwkJCQkJCVxuIisKLQkJCSIJCX0JCQkJCQkJCQkJCVxuIisKLQkJCSIJfQkJCQkJCQkJCQkJCVxuIisKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBhcmd2W10pIHsJCVxuIisKLQkJCSIJCUEgZm9vID0gbmV3IEEoKTsJCQkJCQkJXG4iKwotCQkJIgkJZm9vLnJhdGluZyA9IFwib1wiOwkJCQkJCQlcbiIrCi0JCQkiCQlCIGJhciA9IGZvby5uZXcgQihmb28pOwkJCQkJCVxuIisKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihmb28ucmF0aW5nICsgYmFyLm90aGVyKTsJXG4iKwotCQkJIgl9CQkJCQkJCQkJCQkJXG4iKwotCQkJIn0iCi0JCX0sCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIxLiBXQVJOSU5HIGluIHAxXFxBLmphdmEgKGF0IGxpbmUgNilcbiIgKyAKLQkJIglzdGgucmF0aW5nID0gXCJtXCI7CQkJCQkJXG4iICsgCi0JCSIJXl5eXl5eXl5eXlxuIiArIAotCQkiV3JpdGUgYWNjZXNzIHRvIGVuY2xvc2luZyBmaWVsZCBBLnJhdGluZyBpcyBlbXVsYXRlZCBieSBhIHN5bnRoZXRpYyBhY2Nlc3NvciBtZXRob2QuIEluY3JlYXNpbmcgaXRzIHZpc2liaWxpdHkgd2lsbCBpbXByb3ZlIHlvdXIgcGVyZm9ybWFuY2VcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjIuIEVSUk9SIGluIHAxXFxBLmphdmEgKGF0IGxpbmUgMTMpXG4iICsgCi0JCSIJU3lzdGVtLm91dC5wcmludGxuKGZvby5yYXRpbmcgKyBiYXIub3RoZXIpOwlcbiIgKyAKLQkJIgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXlxuIiArIAotCQkiYmFyLm90aGVyIGNhbm5vdCBiZSByZXNvbHZlZCBvciBpcyBub3QgYSBmaWVsZFxuIiArIAotCQkiLS0tLS0tLS0tLVxuIgotCSk7Ci19Ci0vKioKLSAqIG1lbWJlciBjbGFzcwotICovCi1wdWJsaWMgdm9pZCB0ZXN0MjEoKSB7Ci0JdGhpcy5ydW5Db25mb3JtVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCS8qIHAxLkEgKi8KLQkJCSJwMS9BLmphdmEiLAotCQkJInBhY2thZ2UgcDE7CQkJCQkJCQkJCVxuIisKLQkJCSJwdWJsaWMgY2xhc3MgQQl7CQkJCQkJCQkJXG4iKwotCQkJIglwcml2YXRlIFN0cmluZyByYXRpbmc7CQkJCQkJCVxuIisKLQkJCSIJcHVibGljIGNsYXNzIEIgewkJCQkJCQkJXG4iKwotCQkJIgkJcHVibGljIEIgKEEgc3RoKSB7CQkJCQkJCVxuIisKLQkJCSIJCQlzdGgucmF0aW5nID0gXCJtXCI7CQkJCQkJXG4iKwotCQkJIgkJfQkJCQkJCQkJCQkJXG4iKwotCQkJIgl9CQkJCQkJCQkJCQkJXG4iKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIGFyZ3ZbXSkgewkJXG4iKwotCQkJIgkJQSBmb28gPSBuZXcgQSgpOwkJCQkJCQlcbiIrCi0JCQkiCQlmb28ucmF0aW5nID0gXCJvXCI7CQkJCQkJCVxuIisKLQkJCSIJCUIgYmFyID0gZm9vLm5ldyBCKGZvbyk7CQkJCQkJXG4iKwotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKGZvby5yYXRpbmcpOwkJCQlcbiIrCi0JCQkiCX0JCQkJCQkJCQkJCQlcbiIrCi0JCQkifSIKLQkJfQotCSk7Ci19Ci0vKioKLSAqCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QyMigpIHsKLQl0aGlzLnJ1bkNvbmZvcm1UZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJLyogcDEuQSAqLwotCQkJInAxL0EuamF2YSIsCi0JCQkicGFja2FnZSBwMTsJCQkJCQkJCQkJXG4iKwotCQkJImltcG9ydCBwMi4qOwkJCQkJCQkJCQlcbiIrCi0JCQkicHVibGljIGNsYXNzIEEgewkJCQkJCQkJCVxuIisKLQkJCSIJcHVibGljIGludCBhVmFsdWU7CQkJCQkJCQlcbiIrCi0JCQkiCXB1YmxpYyBBKCkge30JCQkJCQkJCQlcbiIrCi0JCQkiCXB1YmxpYyBzdGF0aWMgY2xhc3MgQyBleHRlbmRzIEEgewkJCQlcbiIrCi0JCQkiCQlwdWJsaWMgU3RyaW5nIGFTdHJpbmc7CQkJCQkJXG4iKwotCQkJIgkJcHVibGljIEMoKSB7CQkJCQkJCQlcbiIrCi0JCQkiCQl9CQkJCQkJCQkJCQlcbiIrCi0JCQkiCX0JCQkJCQkJCQkJCQlcbiIrCi0JCQkifSIsCi0JCQkvKiBwMi5CICovCi0JCQkicDIvQi5qYXZhIiwKLQkJCSJwYWNrYWdlIHAyOwkJCQkJCQkJCQlcbiIrCi0JCQkiaW1wb3J0IHAxLio7CQkJCQkJCQkJCVxuIisKLQkJCSJwdWJsaWMgY2xhc3MgQiBleHRlbmRzIEEuQyB7CQkJCQkJXG4iKwotCQkJIglwdWJsaWMgQigpIHt9CQkJCQkJCQkJXG4iKwotCQkJIglwdWJsaWMgY2xhc3MgRCBleHRlbmRzIEEgewkJCQkJCVxuIisKLQkJCSIJCXB1YmxpYyBEKCkgewkJCQkJCQkJXG4iKwotCQkJIgkJCUMgdmFsMiA9IG5ldyBDKCk7CQkJCQkJXG4iKwotCQkJIgkJCXZhbDIuYVN0cmluZyA9IFwic1wiOwkJCQkJXG4iKwotCQkJIgkJCUEgdmFsID0gbmV3IEEoKTsJCQkJCQlcbiIrCi0JCQkiCQkJdmFsLmFWYWx1ZSA9IDIzOwkJCQkJCVxuIisKLQkJCSIJCX0JCQkJCQkJCQkJCVxuIisKLQkJCSIJfQkJCQkJCQkJCQkJCVxuIisKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBhcmd2W10pIHsJCVxuIisKLQkJCSIJCUQgZm9vID0gbmV3IEIoKS5uZXcgRCgpOwkJCQkJXG4iKwotCQkJIgl9CQkJCQkJCQkJCQkJXG4iKwotCQkJIn0iCi0JCX0KLQkpOwotfQotLyoqCi0gKgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MjMoKSB7Ci0JdGhpcy5ydW5Db25mb3JtVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCS8qIHAxLkEgKi8KLQkJCSJwMS9BLmphdmEiLAotCQkJInBhY2thZ2UgcDE7XG4iKwotCQkJInB1YmxpYyBjbGFzcyBBIGltcGxlbWVudHMgQiB7CQkJCQkJXG4iKwotCQkJIn0JCQkJCQkJCQkJCQkJXG4iKwotCQkJImludGVyZmFjZSBCIHsJCQkJCQkJCQkJXG4iKwotCQkJIglwdWJsaWMgY2xhc3MgQSBpbXBsZW1lbnRzIEIgewkJCQkJXG4iKwotCQkJIgkJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBhcmd2W10pIHsJXG4iKwotCQkJIgkJCWNsYXNzIEJhIHsJCQkJCQkJCVxuIisKLQkJCSIJCQkJaW50IHRpbWU7CQkJCQkJCVxuIisKLQkJCSIJCQl9CQkJCQkJCQkJCVxuIisKLQkJCSIJCQlCYSBmb28gPSBuZXcgQmEoKTsJCQkJCQlcbiIrCi0JCQkiCQkJZm9vLnRpbWUgPSAzOwkJCQkJCQlcbiIrCi0JCQkiCQl9CQkJCQkJCQkJCQlcbiIrCi0JCQkiCQlpbnRlcmZhY2UgQyB7CQkJCQkJCQlcbiIrCi0JCQkiCQl9CQkJCQkJCQkJCQlcbiIrCi0JCQkiCQlpbnRlcmZhY2UgQmIgZXh0ZW5kcyBDIHsJCQkJCVxuIisKLQkJCSIJCX0JCQkJCQkJCQkJCVxuIisKLQkJCSIJfQkJCQkJCQkJCQkJCVxuIisKLQkJCSJ9IgotCQl9Ci0JKTsKLX0KLS8qKgotICoKLSAqLwotcHVibGljIHZvaWQgdGVzdDI0KCkgewotCXRoaXMucnVuQ29uZm9ybVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkvKiBwMS5BICovCi0JCQkicDEvQS5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxOwkJCQkJCQkJCVxuIisKLQkJCSJwdWJsaWMgY2xhc3MgQSB7CQkJCQkJCQlcbiIrCi0JCQkiCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGJsZWg7CQkJCVxuIisKLQkJCSIJaW50ZXJmYWNlIEIgewkJCQkJCQkJXG4iKwotCQkJIgkJcHVibGljIFN0cmluZyBibGVoKCk7CQkJCQlcbiIrCi0JCQkiCQljbGFzcyBDewkJCQkJCQkJXG4iKwotCQkJIgkJCXB1YmxpYyBTdHJpbmcgYmxlaCgpIHtyZXR1cm4gXCJCXCI7fVxuIisKLQkJCSIJCX0JCQkJCQkJCQkJXG4iKwotCQkJIgl9CQkJCQkJCQkJCQlcbiIrCi0JCQkiCWNsYXNzIEMgaW1wbGVtZW50cyBCIHsJCQkJCQlcbiIrCi0JCQkiCQlwdWJsaWMgU3RyaW5nIGJsZWgoKSB7cmV0dXJuIFwiQVwiO30JXG4iKwotCQkJIgl9CQkJCQkJCQkJCQlcbiIrCi0JCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10pIHsJXG4iKwotCQkJIgkJQyBmb28gPSBuZXcgQSgpLm5ldyBDKCk7CQkJCVxuIisKLQkJCSIJfQkJCQkJCQkJCQkJXG4iKwotCQkJIn0iCi0JCX0KLQkpOwotfQotLyoqCi0gKgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MjUoKSB7Ci0JdGhpcy5ydW5Db25mb3JtVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCS8qIHAxLkEgKi8KLQkJCSJwMS9BLmphdmEiLAotCQkJInBhY2thZ2UgcDE7CQkJCQkJCQlcbiIrCi0JCQkiaW1wb3J0IHAyLio7CQkJCQkJCQlcbiIrCi0JCQkicHVibGljIGNsYXNzIEEgewkJCQkJCQlcbiIrCi0JCQkiCXB1YmxpYyBzdGF0aWMgY2xhc3MgQiB7CQkJCQlcbiIrCi0JCQkiCQlwdWJsaWMgc3RhdGljIGludCBCOwkJCQlcbiIrCi0JCQkiCX0JCQkJCQkJCQkJXG4iKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJndltdKSB7XG4iKwotCQkJIgkJQiBmb28gPSBuZXcgQS5CKCk7CQkJCQlcbiIrCi0JCQkiCQlCIGJhciA9IG5ldyBCKCk7CQkJCQlcbiIrCi0JCQkiCQlmb28uQiA9IDI7CQkJCQkJCVxuIisKLQkJCSIJCXAyLkIgYmJhciA9IG5ldyBwMi5CKCk7CQkJCVxuIisKLQkJCSIJCWlmIChiYXIuQiA9PSAzNSkgewkJCQkJXG4iKwotCQkJIgkJCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iKwotCQkJIgkJfQkJCQkJCQkJCVxuIisKLQkJCSIJCWVsc2UgewkJCQkJCQkJXG4iKwotCQkJIgkJCVN5c3RlbS5vdXQucHJpbnRsbihiYXIuQik7CQlcbiIrCi0JCQkiCQl9CQkJCQkJCQkJXG4iKwotCQkJIgl9CQkJCQkJCQkJCVxuIisKLQkJCSJ9IiwKLQkJCSJwMi9CLmphdmEiLAotCQkJInBhY2thZ2UgcDI7CQkJCQkJCQlcbiIrCi0JCQkiaW1wb3J0IHAxLio7CQkJCQkJCQlcbiIrCi0JCQkicHVibGljIGNsYXNzIEIgZXh0ZW5kcyBBIHsJCQkJCVxuIisKLQkJCSIJcHVibGljIEIoKSB7CQkJCQkJCVxuIisKLQkJCSIJCUEuQiBibGVoID0gbmV3IEEuQigpOwkJCQlcbiIrCi0JCQkiCQlibGVoLkIgPSAzNTsJCQkJCQlcbiIrCi0JCQkiCX0JCQkJCQkJCQkJXG4iKwotCQkJIn0iCi0JCX0sCi0JCSJTVUNDRVNTIgotCSk7Ci19Ci0vKioKLSAqCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QyNigpIHsKLQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCS8qIHAxLkEgKi8KLQkJCSJwMS9BLmphdmEiLAotCQkJInBhY2thZ2UgcDE7CQkJCQkJCQlcbiIrCi0JCQkicHVibGljIGNsYXNzIEEgewkJCQkJCQlcbiIrCi0JCQkiCXB1YmxpYyBzdGF0aWMgY2xhc3MgQiB7CQkJCQlcbiIrCi0JCQkiCQlwcm90ZWN0ZWQgc3RhdGljIGludCBCOwkJCQlcbiIrCi0JCQkiCX0JCQkJCQkJCQkJXG4iKwotCQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJndltdKSB7XG4iKwotCQkJIgkJQiBmb28gPSBuZXcgQS5CKCk7CQkJCQlcbiIrCi0JCQkiCQlCIGJhciA9IG5ldyBCKCk7CQkJCQlcbiIrCi0JCQkiCQlCLkIgPSAyOwkJCQkJCQlcbiIrCi0JCQkiCQlwMi5CIGJiYXIgPSBuZXcgcDIuQigpOwkJCQlcbiIrCi0JCQkiCQlpZiAoQi5CID09IDM1KSB7CQkJCQlcbiIrCi0JCQkiCQkJU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTtcbiIrCi0JCQkiCQl9CQkJCQkJCQkJXG4iKwotCQkJIgkJZWxzZSB7CQkJCQkJCQlcbiIrCi0JCQkiCQkJU3lzdGVtLm91dC5wcmludGxuKEIuQik7CQlcbiIrCi0JCQkiCQl9CQkJCQkJCQkJXG4iKwotCQkJIgl9CQkJCQkJCQkJCVxuIisKLQkJCSJ9IiwKLQkJCSJwMi9CLmphdmEiLAotCQkJInBhY2thZ2UgcDI7CQkJCQkJCQlcbiIrCi0JCQkiaW1wb3J0IHAxLio7CQkJCQkJCQlcbiIrCi0JCQkicHVibGljIGNsYXNzIEIgZXh0ZW5kcyBBIHsJCQkJCVxuIisKLQkJCSIJcHVibGljIEIoKSB7CQkJCQkJCVxuIisKLQkJCSIJCUEuQiBibGVoID0gbmV3IEEuQigpOwkJCQlcbiIrCi0JCQkiCQlibGVoLkIgPSAzNTsJCQkJCQlcbiIrCi0JCQkiCX0JCQkJCQkJCQkJXG4iKwotCQkJIn0iCi0JCX0sCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIxLiBFUlJPUiBpbiBwMlxcQi5qYXZhIChhdCBsaW5lIDYpXG4iICsgCi0JCSIJYmxlaC5CID0gMzU7CQkJCQkJXG4iICsgCi0JCSIJXl5eXl5eXG4iICsgCi0JCSJUaGUgZmllbGQgYmxlaC5CIGlzIG5vdCB2aXNpYmxlXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iCi0JKTsKLX0KLS8qKgotICoKLSAqLwotcHVibGljIHZvaWQgdGVzdDI3KCkgewotCXRoaXMucnVuTmVnYXRpdmVUZXN0KAotCQluZXcgU3RyaW5nW10gewotCQkJLyogcDEuQSAqLwotCQkJInAxL0EuamF2YSIsCi0JCQkicGFja2FnZSBwMTsJCQkJCQkJCVxuIisKLQkJCSJwdWJsaWMgY2xhc3MgQSB7CQkJCQkJCVxuIisKLQkJCSIJcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBCIHsJCQkJXG4iKwotCQkJIgkJcHVibGljIHN0YXRpYyBpbnQgQjsJCQkJXG4iKwotCQkJIgl9CQkJCQkJCQkJCVxuIisKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkge1xuIisKLQkJCSIJCUIgZm9vID0gbmV3IEEuQigpOwkJCQkJXG4iKwotCQkJIgkJQiBiYXIgPSBuZXcgQigpOwkJCQkJXG4iKwotCQkJIgkJQi5CID0gMjsJCQkJCQkJXG4iKwotCQkJIgkJcDIuQiBiYmFyID0gbmV3IHAyLkIoKTsJCQkJXG4iKwotCQkJIgkJaWYgKEIuQiA9PSAzNSkgewkJCQkJXG4iKwotCQkJIgkJCVN5c3RlbS5vdXQucHJpbnRsbihcIlNVQ0NFU1NcIik7XG4iKwotCQkJIgkJfQkJCQkJCQkJCVxuIisKLQkJCSIJCWVsc2UgewkJCQkJCQkJXG4iKwotCQkJIgkJCVN5c3RlbS5vdXQucHJpbnRsbihCLkIpOwkJXG4iKwotCQkJIgkJfQkJCQkJCQkJCVxuIisKLQkJCSIJfQkJCQkJCQkJCQlcbiIrCi0JCQkifSIsCi0JCQkicDIvQi5qYXZhIiwKLQkJCSJwYWNrYWdlIHAyOwkJCQkJCQkJXG4iKwotCQkJImltcG9ydCBwMS4qOwkJCQkJCQkJXG4iKwotCQkJInB1YmxpYyBjbGFzcyBCIGV4dGVuZHMgQSB7CQkJCQlcbiIrCi0JCQkiCXB1YmxpYyBCKCkgewkJCQkJCQlcbiIrCi0JCQkiCQlBLkIgYmxlaCA9IG5ldyBBLkIoKTsJCQkJXG4iKwotCQkJIgkJQS5CLkIgPSAzNTsJCQkJCQlcbiIrCi0JCQkiCX0JCQkJCQkJCQkJXG4iKwotCQkJIn0iCi0JCX0sCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIxLiBFUlJPUiBpbiBwMlxcQi5qYXZhIChhdCBsaW5lIDUpXG4iICsgCi0JCSIJQS5CIGJsZWggPSBuZXcgQS5CKCk7CQkJCVxuIiArIAotCQkiCSAgICAgICAgICAgXl5eXl5eXl5eXG4iICsgCi0JCSJUaGUgY29uc3RydWN0b3IgQS5CKCkgaXMgbm90IHZpc2libGVcbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIKLQkpOwotfQotLyoqCi0gKgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MjgoKSB7Ci0JdGhpcy5ydW5Db25mb3JtVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCS8qIHAxLkEgKi8KLQkJCSJwMS9BLmphdmEiLAotCQkJInBhY2thZ2UgcDE7CQkJCQkJCQkJXG4iKwotCQkJInB1YmxpYyBjbGFzcyBBIHsJCQkJCQkJCVxuIisKLQkJCSIJc3RhdGljIGNsYXNzIEIgewkJCQkJCQlcbiIrCi0JCQkiCQlwdWJsaWMgc3RhdGljIGNsYXNzIEMgewkJCQkJXG4iKwotCQkJIgkJCXByaXZhdGUgc3RhdGljIGludCBhOwkJCQlcbiIrCi0JCQkiCQkJcHJpdmF0ZSBpbnQgYjsJCQkJCQlcbiIrCi0JCQkiCQl9CQkJCQkJCQkJCVxuIisKLQkJCSIJfQkJCQkJCQkJCQkJXG4iKwotCQkJIgljbGFzcyBEIGV4dGVuZHMgQiB7CQkJCQkJCVxuIisKLQkJCSIJCWludCBqID0gcDEuQS5CLkMuYTsJCQkJCQlcbiIrCi0JCQkiCX0JCQkJCQkJCQkJCVxuIisKLQkJCSIJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBhcmd2W10pIHsJXG4iKwotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKFwiU1VDQ0VTU1wiKTsJCVxuIisKLQkJCSIJfQkJCQkJCQkJCQkJXG4iKwotCQkJIn0iCi0JCX0sCi0JCSJTVUNDRVNTIgotCSk7Ci19Ci1wdWJsaWMgc3RhdGljIENsYXNzIHRlc3RDbGFzcygpIHsKLQlyZXR1cm4gTG9va3VwVGVzdC5jbGFzczsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9yZWdyZXNzaW9uL1Byb2JsZW1Db25zdHJ1Y3RvclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9yZWdyZXNzaW9uL1Byb2JsZW1Db25zdHJ1Y3RvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIzN2Q0OS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcmVncmVzc2lvbi9Qcm9ibGVtQ29uc3RydWN0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci5yZWdyZXNzaW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ2xhc3NGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSVByb2JsZW1GYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgUHJvYmxlbUNvbnN0cnVjdG9yVGVzdCBleHRlbmRzIEFic3RyYWN0UmVncmVzc2lvblRlc3QgewotCi1wdWJsaWMgUHJvYmxlbUNvbnN0cnVjdG9yVGVzdChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCXJldHVybiBzZXR1cFN1aXRlKHRlc3RDbGFzcygpKTsKLX0KLXB1YmxpYyBzdGF0aWMgQ2xhc3MgdGVzdENsYXNzKCkgewotCXJldHVybiBQcm9ibGVtQ29uc3RydWN0b3JUZXN0LmNsYXNzOwotfQotCi1wcm90ZWN0ZWQgUmVxdWVzdG9yIGdldFJlcXVlc3RvcihJUHJvYmxlbUZhY3RvcnkgcHJvYmxlbUZhY3RvcnkpIHsKLQlyZXR1cm4gbmV3IFJlcXVlc3Rvcihwcm9ibGVtRmFjdG9yeSwgT1VUUFVUX0RJUi5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikgPyBPVVRQVVRfRElSIDogT1VUUFVUX0RJUiArIEZpbGUuc2VwYXJhdG9yLCBmYWxzZSkgewotCQlwdWJsaWMgdm9pZCBhY2NlcHRSZXN1bHQoQ29tcGlsYXRpb25SZXN1bHQgY3IpIHsKLQkJCXN1cGVyLmFjY2VwdFJlc3VsdChjcik7Ci0JCQlvdXRwdXRDbGFzc0ZpbGVzKGNyKTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIG91dHB1dENsYXNzRmlsZXMoQ29tcGlsYXRpb25SZXN1bHQgdW5pdFJlc3VsdCkgewotCQkKLQkJCWlmICh1bml0UmVzdWx0ICE9IG51bGwpIHsKLQkJCQlFbnVtZXJhdGlvbiBjbGFzc0ZpbGVzID0gdW5pdFJlc3VsdC5jb21waWxlZFR5cGVzLmVsZW1lbnRzKCk7Ci0JCQkJaWYgKG91dHB1dFBhdGggIT0gbnVsbCkgewotCQkJCQl3aGlsZSAoY2xhc3NGaWxlcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCQkJLy8gcmV0cmlldmUgdGhlIGtleSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3NmaWxlCi0JCQkJCQlDbGFzc0ZpbGUgY2xhc3NGaWxlID0gKENsYXNzRmlsZSkgY2xhc3NGaWxlcy5uZXh0RWxlbWVudCgpOwotCQkJCQkJU3RyaW5nIHJlbGF0aXZlTmFtZSA9IAotCQkJCQkJCW5ldyBTdHJpbmcoY2xhc3NGaWxlLmZpbGVOYW1lKCkpLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgIi5jbGFzcyI7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUNsYXNzRmlsZS53cml0ZVRvRGlzayh0cnVlLCBvdXRwdXRQYXRoLCByZWxhdGl2ZU5hbWUsIGNsYXNzRmlsZS5nZXRCeXRlcygpKTsKLQkJCQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9CQkKLQl9OwotfQotcHVibGljIHZvaWQgdGVzdDAwMSgpIHsKLQl0aGlzLnJ1bk5lZ2F0aXZlVGVzdCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCSJwcnMvVGVzdDEuamF2YSIsCi0JCQkicGFja2FnZSBwcnM7CVxuIiArCi0JCQkiaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CVxuIiArCi0JCQkicHVibGljIGNsYXNzIFRlc3QxIHsJXG4iICsKLQkJCSJTdHJpbmcgcyA9IDM7CVxuIiArCi0JCQkiVGVzdDEoKSB0aHJvd3MgSU9FeGNlcHRpb24gewlcbiIgKwotCQkJIn0JXG4iICsKLQkJCSJ9IgotCQl9LAotCQluZXcgRXhwZWN0ZWRQcm9ibGVtW10gewotCQkJbmV3IEV4cGVjdGVkUHJvYmxlbSgicHJzL1Rlc3QxLmphdmEiLCBJUHJvYmxlbS5UeXBlTWlzbWF0Y2gsIG5ldyBTdHJpbmdbXSB7ImludCIsICJTdHJpbmcifSkKLQkJfQotCQkpOwotCi0JdGhpcy5ydW5OZWdhdGl2ZVRlc3QoCi0JCW5ldyBTdHJpbmdbXSB7Ci0JCQkicHJzL1Rlc3QyLmphdmEiLAotCQkJInBhY2thZ2UgcHJzOwlcbiIgKwotCQkJImltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwlcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBUZXN0MiB7CVxuIiArCi0JCQkicHVibGljIHZvaWQgZm9vKCkgewlcbiIgKwotCQkJInRyeSB7CVxuIiArCi0JCQkiVGVzdDEgdCA9IG5ldyBUZXN0MSgpOwlcbiIgKwotCQkJIlN5c3RlbS5vdXQucHJpbnRsbigpOwlcbiIgKwotCQkJIn0gY2F0Y2goSU9FeGNlcHRpb24gZSkJXG4iICsKLQkJCSJ7CVxuIiArCi0JCQkiZS5wcmludFN0YWNrVHJhY2UoKTsJXG4iICsKLQkJCSJ9CVxuIiArCi0JCQkifQlcbiIgKwotCQkJIn0iCi0JCX0sCi0JCW5ldyBFeHBlY3RlZFByb2JsZW1bXSB7fSwKLQkJbnVsbCwKLQkJZmFsc2UpOwotfQotCi0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9yZWdyZXNzaW9uL1JlZ3Jlc3Npb25UZXN0U2V0dXAuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9yZWdyZXNzaW9uL1JlZ3Jlc3Npb25UZXN0U2V0dXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZiZTc4MC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcmVncmVzc2lvbi9SZWdyZXNzaW9uVGVzdFNldHVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyLnJlZ3Jlc3Npb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklOYW1lRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5iYXRjaC5GaWxlU3lzdGVtOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IGp1bml0LmV4dGVuc2lvbnMuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotcHVibGljIGNsYXNzIFJlZ3Jlc3Npb25UZXN0U2V0dXAgZXh0ZW5kcyBUZXN0RGVjb3JhdG9yIHsKLQlUZXN0VmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgVGVzdFZlcmlmaWVyKHRydWUpOwotcHVibGljIFJlZ3Jlc3Npb25UZXN0U2V0dXAoVGVzdCB0ZXN0KSB7Ci0Jc3VwZXIodGVzdCk7Ci19Ci1wcml2YXRlIHZvaWQgaW5pdFRlc3QoT2JqZWN0IHRlc3QsIFRlc3RWZXJpZmllciB0ZXN0VmVyaWZpZXIsIElOYW1lRW52aXJvbm1lbnQgamF2YUNsYXNzTGliKSB7Ci0JaWYgKHRlc3QgaW5zdGFuY2VvZiBBYnN0cmFjdFJlZ3Jlc3Npb25UZXN0KSB7Ci0JCUFic3RyYWN0UmVncmVzc2lvblRlc3QgcmVncmVzc2lvblRlc3QgPSAoQWJzdHJhY3RSZWdyZXNzaW9uVGVzdCl0ZXN0OwotCQlyZWdyZXNzaW9uVGVzdC52ZXJpZmllciA9IHRlc3RWZXJpZmllcjsKLQkJcmVncmVzc2lvblRlc3QuamF2YUNsYXNzTGliID0gamF2YUNsYXNzTGliOwotCQlyZXR1cm47Ci0JfQotCWlmICh0ZXN0IGluc3RhbmNlb2YgVGVzdFN1aXRlKSB7Ci0JCVRlc3RTdWl0ZSByZWdyZXNzaW9uVGVzdENsYXNzU3VpdGUgPSAoVGVzdFN1aXRlKSB0ZXN0OwotCQlFbnVtZXJhdGlvbiByZWdyZXNzaW9uVGVzdENsYXNzVGVzdHMgPSByZWdyZXNzaW9uVGVzdENsYXNzU3VpdGUudGVzdHMoKTsKLQkJd2hpbGUgKHJlZ3Jlc3Npb25UZXN0Q2xhc3NUZXN0cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJaW5pdFRlc3QocmVncmVzc2lvblRlc3RDbGFzc1Rlc3RzLm5leHRFbGVtZW50KCksIHRlc3RWZXJpZmllciwgamF2YUNsYXNzTGliKTsKLQkJfQotCQlyZXR1cm47Ci0JfQotCQkKLX0KLXB1YmxpYyB2b2lkIHJ1bihUZXN0UmVzdWx0IHJlc3VsdCkgewotCXRyeSB7Ci0JCXNldFVwKCk7Ci0JCXN1cGVyLnJ1bihyZXN1bHQpOwotCX0gZmluYWxseSB7Ci0JCXRlYXJEb3duKCk7Ci0JfQotfQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JLy8gQ3JlYXRlIG5hbWUgZW52aXJvbm1lbnQKLQlJTmFtZUVudmlyb25tZW50IGphdmFDbGFzc0xpYiA9IG5ldyBGaWxlU3lzdGVtKG5ldyBTdHJpbmdbXSB7VXRpbC5nZXRKYXZhQ2xhc3NMaWIoKX0sIG5ldyBTdHJpbmdbMF0sIG51bGwpOwotCi0JLy8gSW5pdCB3cmFwcGVkIHN1aXRlCi0JaW5pdFRlc3QoZlRlc3QsIHRoaXMudmVyaWZpZXIsIGphdmFDbGFzc0xpYik7Ci19Ci1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQl0aGlzLnZlcmlmaWVyLnNodXREb3duKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcmVncmVzc2lvbi9SZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9yZWdyZXNzaW9uL1JlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjVjNWJkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9yZWdyZXNzaW9uL1JlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIucmVncmVzc2lvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ2xhc3NGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUNvbXBpbGVyUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JUHJvYmxlbUZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBSZXF1ZXN0b3IgZXh0ZW5kcyBBc3NlcnQgaW1wbGVtZW50cyBJQ29tcGlsZXJSZXF1ZXN0b3IgewotCXB1YmxpYyBib29sZWFuIGhhc0Vycm9ycyA9IGZhbHNlOwotCXB1YmxpYyBJUHJvYmxlbUZhY3RvcnkgcHJvYmxlbUZhY3Rvcnk7Ci0JcHVibGljIFN0cmluZyBvdXRwdXRQYXRoOwotCXByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZU91dHB1dDsKLQlwdWJsaWMgSGFzaHRhYmxlIGV4cGVjdGVkUHJvYmxlbXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci1wdWJsaWMgUmVxdWVzdG9yKElQcm9ibGVtRmFjdG9yeSBwcm9ibGVtRmFjdG9yeSwgU3RyaW5nIG91dHB1dFBhdGgsIGJvb2xlYW4gZ2VuZXJhdGVPdXRwdXQpIHsKLQl0aGlzLnByb2JsZW1GYWN0b3J5ID0gcHJvYmxlbUZhY3Rvcnk7Ci0JdGhpcy5vdXRwdXRQYXRoID0gb3V0cHV0UGF0aDsKLQl0aGlzLmdlbmVyYXRlT3V0cHV0ID0gZ2VuZXJhdGVPdXRwdXQ7Ci19Ci0JcHVibGljIHZvaWQgYWNjZXB0UmVzdWx0KENvbXBpbGF0aW9uUmVzdWx0IGNyKSB7Ci0JCWlmIChjci5oYXNQcm9ibGVtcygpIHx8IGNyLmhhc1Rhc2tzKCkpIHsKLQkJCWlmIChjci5oYXNFcnJvcnMoKSkgewotCQkJCXRoaXMuaGFzRXJyb3JzID0gdHJ1ZTsKLQkJCX0KLQkJCQotCQkJSVByb2JsZW1bXSBhY3R1YWxQcm9ibGVtcyA9IGNyLmdldEFsbFByb2JsZW1zKCk7Ci0JCQlpbnQgYWN0dWFsUHJvYmxlbXNDb3VudCA9IGFjdHVhbFByb2JsZW1zID09IG51bGwgPyAwIDogYWN0dWFsUHJvYmxlbXMubGVuZ3RoOwotCQkJRXhwZWN0ZWRQcm9ibGVtW10gcHJvYmxlbXMgPSAoRXhwZWN0ZWRQcm9ibGVtW10pdGhpcy5leHBlY3RlZFByb2JsZW1zLmdldChuZXcgU3RyaW5nKGNyLmdldEZpbGVOYW1lKCkpKTsKLQkJCWludCBleHBlY3RlZFByb2JsZW1zQ291bnQgPSBwcm9ibGVtcyA9PSBudWxsID8gMCA6IHByb2JsZW1zLmxlbmd0aDsKLQotCQkJaWYgKGFjdHVhbFByb2JsZW1zQ291bnQgPiAwIHx8IGV4cGVjdGVkUHJvYmxlbXNDb3VudCA+IDApIHsKLQkJCQlib29sZWFuIGFyZU1lc3NhZ2VzRGlmZmVyZW50ID0gZmFsc2U7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBuZXcgU3RyaW5nKGNyLmdldEZpbGVOYW1lKCkpICsgIiBkb2VzIG5vdCBoYXZlIHRoZSBjb3JyZWN0IGVycm9ycy5cbkZvdW5kIDpcbiI7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY3R1YWxQcm9ibGVtc0NvdW50OyBpKyspIHsKLQkJCQkJbWVzc2FnZSArPSAiXHQiICsgYWN0dWFsUHJvYmxlbXNbaV0uZ2V0TWVzc2FnZSgpICsgIlxuIjsKLQkJCQkJLyogU1RBUlQgUFJJTlQgKi8KLS8qCQkJCQkKLQkJCQkJU3lzdGVtLm91dC5wcmludChhY3R1YWxQcm9ibGVtc1tpXS5nZXRJRCgpKyI6Iik7Ci0JCQkJCVN0cmluZ1tdIHBiQXJncyA9ICBhY3R1YWxQcm9ibGVtc1tpXS5nZXRBcmd1bWVudHMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwYkFyZ3MubGVuZ3RoOyBqKyspewotCQkJCQkJaWYgKGogPiAwKSBTeXN0ZW0ub3V0LnByaW50KCIsICIpOwotCQkJCQkJU3lzdGVtLm91dC5wcmludChwYkFyZ3Nbal0pOwotCQkJCQl9Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotKi8JCQkJCQotCQkJCQkvKiBFTkQgUFJJTlQgKi8KLQkJCQkJaWYgKGkgPCBleHBlY3RlZFByb2JsZW1zQ291bnQgCi0JCQkJCQkmJiAhYWN0dWFsUHJvYmxlbXNbaV0uZ2V0TWVzc2FnZSgpLmVxdWFscyhwcm9ibGVtRmFjdG9yeS5nZXRMb2NhbGl6ZWRNZXNzYWdlKHByb2JsZW1zW2ldLmlkLCBwcm9ibGVtc1tpXS5hcmd1bWVudHMpKSkgewotCQkJCQkJYXJlTWVzc2FnZXNEaWZmZXJlbnQgPSB0cnVlOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50KGFjdHVhbFByb2JsZW1zW2ldLmdldElEKCkrIjoiKTsKLQkJCQkJU3RyaW5nW10gcGJBcmdzID0gIGFjdHVhbFByb2JsZW1zW2ldLmdldEFyZ3VtZW50cygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHBiQXJncy5sZW5ndGg7IGorKyl7Ci0JCQkJCQlpZiAoaiA+IDApIFN5c3RlbS5vdXQucHJpbnQoIiwgIik7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50KHBiQXJnc1tqXSk7Ci0JCQkJCX0KLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGV4cGVjdGVkUHJvYmxlbXNDb3VudCA9PSAwKSB7Ci0JCQkJCW1lc3NhZ2UgKz0gIkV4cGVjdGluZyBubyBwcm9ibGVtcy4iOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW1lc3NhZ2UgKz0gIkV4cGVjdGluZyA6XG4iOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkUHJvYmxlbXNDb3VudDsgaSsrKSB7Ci0JCQkJCQlFeHBlY3RlZFByb2JsZW0gZXhwZWN0ZWRQcm9ibGVtID0gcHJvYmxlbXNbaV07Ci0JCQkJCQltZXNzYWdlICs9ICJcdCIgKyBwcm9ibGVtRmFjdG9yeS5nZXRMb2NhbGl6ZWRNZXNzYWdlKGV4cGVjdGVkUHJvYmxlbS5pZCwgZXhwZWN0ZWRQcm9ibGVtLmFyZ3VtZW50cykgKyAiXG4iOwotCQkJCQl9Ci0JCQkJfQotCQkJCWFzc2VydFRydWUobWVzc2FnZSwgKGFjdHVhbFByb2JsZW1zQ291bnQgPT0gZXhwZWN0ZWRQcm9ibGVtc0NvdW50KSAmJiAhYXJlTWVzc2FnZXNEaWZmZXJlbnQpOwotCQkJfQotCQl9Ci0JCW91dHB1dENsYXNzRmlsZXMoY3IpOwotCX0KLXB1YmxpYyB2b2lkIGV4cGVjdGVkUHJvYmxlbXMoRXhwZWN0ZWRQcm9ibGVtW10gcHJvYmxlbXMpIHsKLQlmb3IgKGludCBpID0gMDsgaSA8IHByb2JsZW1zLmxlbmd0aDsgaSsrKXsKLQkJRXhwZWN0ZWRQcm9ibGVtIHByb2JsZW0gPSBwcm9ibGVtc1tpXTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gcHJvYmxlbS5maWxlTmFtZTsKLQkJaWYgKEZpbGUuc2VwYXJhdG9yLmVxdWFscygiLyIpKSB7Ci0JCQlpZiAoZmlsZU5hbWUuaW5kZXhPZigiXFwiKSAhPSAtMSkgewotCQkJCWZpbGVOYW1lID0gZmlsZU5hbWUucmVwbGFjZSgnXFwnLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gdGhlIGZpbGUgc2VwYXJhdG9yIGlzIFwKLQkJCWlmIChmaWxlTmFtZS5pbmRleE9mKCcvJykgIT0gLTEpIHsKLQkJCQlmaWxlTmFtZSA9IGZpbGVOYW1lLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCQkJfQotCQl9Ci0JCQotCQlFeHBlY3RlZFByb2JsZW1bXSBleGlzdGluZ1Byb2JsZW1zID0gKEV4cGVjdGVkUHJvYmxlbVtdKXRoaXMuZXhwZWN0ZWRQcm9ibGVtcy5nZXQoZmlsZU5hbWUpOwotCQlpZiAoZXhpc3RpbmdQcm9ibGVtcyA9PSBudWxsKSB7Ci0JCQl0aGlzLmV4cGVjdGVkUHJvYmxlbXMucHV0KGZpbGVOYW1lLCBuZXcgRXhwZWN0ZWRQcm9ibGVtW10ge3Byb2JsZW19KTsKLQkJfSBlbHNlIHsKLQkJCWludCBsZW5ndGggPSBleGlzdGluZ1Byb2JsZW1zLmxlbmd0aDsKLQkJCUV4cGVjdGVkUHJvYmxlbVtdIG5ld1Byb2JsZW1zID0gbmV3IEV4cGVjdGVkUHJvYmxlbVtsZW5ndGggKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZXhpc3RpbmdQcm9ibGVtcywgMCwgbmV3UHJvYmxlbXMsIDAsIGxlbmd0aCk7Ci0JCQluZXdQcm9ibGVtc1tsZW5ndGhdID0gcHJvYmxlbTsKLQkJCXRoaXMuZXhwZWN0ZWRQcm9ibGVtcy5wdXQoZmlsZU5hbWUsIG5ld1Byb2JsZW1zKTsKLQkJfQotCX0KLX0KLXByb3RlY3RlZCB2b2lkIG91dHB1dENsYXNzRmlsZXMoQ29tcGlsYXRpb25SZXN1bHQgdW5pdFJlc3VsdCkgewotCi0JaWYgKCh1bml0UmVzdWx0ICE9IG51bGwpICYmICghdW5pdFJlc3VsdC5oYXNFcnJvcnMoKSB8fCBnZW5lcmF0ZU91dHB1dCkpIHsKLQkJRW51bWVyYXRpb24gY2xhc3NGaWxlcyA9IHVuaXRSZXN1bHQuY29tcGlsZWRUeXBlcy5lbGVtZW50cygpOwotCQlpZiAob3V0cHV0UGF0aCAhPSBudWxsKSB7Ci0JCQl3aGlsZSAoY2xhc3NGaWxlcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCS8vIHJldHJpZXZlIHRoZSBrZXkgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzZmlsZQotCQkJCUNsYXNzRmlsZSBjbGFzc0ZpbGUgPSAoQ2xhc3NGaWxlKSBjbGFzc0ZpbGVzLm5leHRFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIHJlbGF0aXZlTmFtZSA9IAotCQkJCQluZXcgU3RyaW5nKGNsYXNzRmlsZS5maWxlTmFtZSgpKS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKSArICIuY2xhc3MiOwotCQkJCXRyeSB7Ci0JCQkJCUNsYXNzRmlsZS53cml0ZVRvRGlzayh0cnVlLCBvdXRwdXRQYXRoLCByZWxhdGl2ZU5hbWUsIGNsYXNzRmlsZS5nZXRCeXRlcygpKTsKLQkJCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcmVncmVzc2lvbi9TY2FubmVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3JlZ3Jlc3Npb24vU2Nhbm5lclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI5OTQ3My4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvY29tcGlsZXIvcmVncmVzc2lvbi9TY2FubmVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci5yZWdyZXNzaW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Ub29sRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JU2Nhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JVGVybWluYWxTeW1ib2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkludmFsaWRJbnB1dEV4Y2VwdGlvbjsKLXB1YmxpYyBjbGFzcyBTY2FubmVyVGVzdCBleHRlbmRzIEFic3RyYWN0UmVncmVzc2lvblRlc3QgewotCi0JcHVibGljIFNjYW5uZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBzZXR1cFN1aXRlKHRlc3RDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENsYXNzIHRlc3RDbGFzcygpIHsKLQkJcmV0dXJuIFNjYW5uZXJUZXN0LmNsYXNzOwotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMTgxCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwMSgpIHsKLQkJU3RyaW5nIHNvdXJjZUEwMDEgPQkiXFx1MDAzYiI7Ci0JCUlTY2FubmVyIHNjYW5uZXIgPSBUb29sRmFjdG9yeS5jcmVhdGVTY2FubmVyKGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UpOwotCQlzY2FubmVyLnNldFNvdXJjZShzb3VyY2VBMDAxLnRvQ2hhckFycmF5KCkpOwotCQlpbnQgdG9rZW4gPSAwOwotCQl0cnkgewotCQkJdG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOwotCQl9IGNhdGNoIChJbnZhbGlkSW5wdXRFeGNlcHRpb24gZSkgewotCQl9Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgdG9rZW4gdHlwZSIsIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lU0VNSUNPTE9OLCB0b2tlbik7Ci0JfQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMTgxCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwMigpIHsKLQkJU3RyaW5nIHNvdXJjZUEwMDIgPQkiLy8gdGVzdHNcbiAgIjsKLQkJSVNjYW5uZXIgc2Nhbm5lciA9IFRvb2xGYWN0b3J5LmNyZWF0ZVNjYW5uZXIoZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSk7Ci0JCXNjYW5uZXIuc2V0U291cmNlKHNvdXJjZUEwMDIudG9DaGFyQXJyYXkoKSk7Ci0JCWludCB0b2tlbiA9IDA7Ci0JCXRyeSB7Ci0JCQl0b2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIldyb25nIHRva2VuIHR5cGUiLCBJVGVybWluYWxTeW1ib2xzLlRva2VuTmFtZVdISVRFU1BBQ0UsIHRva2VuKTsKLQkJCWFzc2VydEVxdWFscygiV3Jvbmcgc2l6ZSIsIDIsIHNjYW5uZXIuZ2V0Q3VycmVudFRva2VuU291cmNlKCkubGVuZ3RoKTsKLQkJCXRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgdG9rZW4gdHlwZSIsIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lRU9GLCB0b2tlbik7Ci0JCX0gY2F0Y2ggKEludmFsaWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMxODEKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDAzKCkgewotCQlTdHJpbmcgc291cmNlQTAwMyA9CSIvLyB0ZXN0c1xuICAiOwotCQlJU2Nhbm5lciBzY2FubmVyID0gVG9vbEZhY3RvcnkuY3JlYXRlU2Nhbm5lcih0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UpOwotCQlzY2FubmVyLnNldFNvdXJjZShzb3VyY2VBMDAzLnRvQ2hhckFycmF5KCkpOwotCQlpbnQgdG9rZW4gPSAwOwotCQl0cnkgewotCQkJdG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOwotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyB0b2tlbiB0eXBlIiwgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVDT01NRU5UX0xJTkUsIHRva2VuKTsKLQkJCXRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgdG9rZW4gdHlwZSIsIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lV0hJVEVTUEFDRSwgdG9rZW4pOwotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzaXplIiwgMiwgc2Nhbm5lci5nZXRDdXJyZW50VG9rZW5Tb3VyY2UoKS5sZW5ndGgpOwotCQkJdG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpOwotCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyB0b2tlbiB0eXBlIiwgSVRlcm1pbmFsU3ltYm9scy5Ub2tlbk5hbWVFT0YsIHRva2VuKTsKLQkJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJfQotCX0JCQkJCi0JCi0JLyoqCi0JICogZmxvYXQgY29uc3RhbnQgY2FuIGhhdmUgZXhwb25lbnQgcGFydCB3aXRob3V0IGRvdDogMDFlMGYKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDcwNAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDQoKSB7Ci0JCVN0cmluZyBzb3VyY2UgPQkiMDFlMGYiOwotCQlJU2Nhbm5lciBzY2FubmVyID0gVG9vbEZhY3RvcnkuY3JlYXRlU2Nhbm5lcihmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCXNjYW5uZXIuc2V0U291cmNlKHNvdXJjZS50b0NoYXJBcnJheSgpKTsKLQkJaW50IHRva2VuID0gMDsKLQkJdHJ5IHsKLQkJCXRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKTsKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgdG9rZW4gdHlwZSIsIElUZXJtaW5hbFN5bWJvbHMuVG9rZW5OYW1lRmxvYXRpbmdQb2ludExpdGVyYWwsIHRva2VuKTsKLQkJfSBjYXRjaCAoSW52YWxpZElucHV0RXhjZXB0aW9uIGUpIHsKLQkJfQotCX0JCQkJCQkKLQkJCQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3JlZ3Jlc3Npb24vVGVzdEFsbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3JlZ3Jlc3Npb24vVGVzdEFsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjRiMTU5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9yZWdyZXNzaW9uL1Rlc3RBbGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIucmVncmVzc2lvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuanVuaXQuZXh0ZW5zaW9uLkV4Y2x1ZGVkVGVzdFN1aXRlOwotCi0vKioKLSAqIFJ1biBhbGwgY29tcGlsZXIgcmVncmVzc2lvbiB0ZXN0cwotICovCi1wdWJsaWMgY2xhc3MgVGVzdEFsbCBleHRlbmRzIFRlc3RDYXNlIHsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gRVhQRVJUOyAvLyBhbiBleHBlcnQgZG9lc24ndCBleGNsdWRlIGFueSB0ZXN0cwotCXN0YXRpYyBTdHJpbmdbXSBFWENMVURFRF9URVNUUyA9IG5ldyBTdHJpbmdbXSB7fTsKLXB1YmxpYyBUZXN0QWxsKFN0cmluZyB0ZXN0TmFtZSkgewotCXN1cGVyKHRlc3ROYW1lKTsKLX0KLS8qKgotICogQWRkcyBhbGwgdGhlIHRlc3RzIGluIHRoZSBnaXZlbiBjbGFzcyB0byB0aGUgc3VpdGUgZXhjZXB0Ci0gKiB0aGUgb25lcyB0aGF0IGFyZSBleGNsdWRlZC4KLSAqLwotcHVibGljIHN0YXRpYyB2b2lkIGFkZFRlc3QoVGVzdFN1aXRlIHN1aXRlLCBDbGFzcyB0ZXN0Q2xhc3MpIHsKLQlUZXN0U3VpdGUgaW5uZXJTdWl0ZSA9IG5ldyBUZXN0U3VpdGUodGVzdENsYXNzKTsKLQlzdWl0ZS5hZGRUZXN0KGlubmVyU3VpdGUpOwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoVGVzdEFsbC5jbGFzcy5nZXROYW1lKCkpOwotCi0JU3RyaW5nIHNwZWNWZXJzaW9uID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnNwZWNpZmljYXRpb24udmVyc2lvbiIpOwotCWlmICghIjEuMCIuZXF1YWxzKHNwZWNWZXJzaW9uKSAmJiAhIjEuMSIuZXF1YWxzKHNwZWNWZXJzaW9uKSAmJiAhIjEuMiIuZXF1YWxzKHNwZWNWZXJzaW9uKSAmJiAhIjEuMyIuZXF1YWxzKHNwZWNWZXJzaW9uKSkgewotCQlhZGRUZXN0KHN1aXRlLCBBc3NlcnRpb25UZXN0LmNsYXNzKTsKLQl9Ci0KLQlhZGRUZXN0KHN1aXRlLCBCYXRjaENvbXBpbGVyVGVzdC5jbGFzcyk7Ci0JYWRkVGVzdChzdWl0ZSwgQ2xhc3NGaWxlQ29tcGFyYXRvclRlc3QuY2xhc3MpOwotCWFkZFRlc3Qoc3VpdGUsIENsYXNzRmlsZVJlYWRlclRlc3QuY2xhc3MpOwotCWFkZFRlc3Qoc3VpdGUsIENvbXBsaWFuY2VfMV8zLmNsYXNzKTsJCi0JYWRkVGVzdChzdWl0ZSwgQ29tcGxpYW5jZV8xXzQuY2xhc3MpOwkKLQlhZGRUZXN0KHN1aXRlLCBEZXByZWNhdGVkVGVzdC5jbGFzcyk7Ci0JYWRkVGVzdChzdWl0ZSwgTG9va3VwVGVzdC5jbGFzcyk7Ci0JYWRkVGVzdChzdWl0ZSwgUHJvYmxlbUNvbnN0cnVjdG9yVGVzdC5jbGFzcyk7Ci0JYWRkVGVzdChzdWl0ZSwgVXRpbFRlc3QuY2xhc3MpOwotCWFkZFRlc3Qoc3VpdGUsIFNjYW5uZXJUZXN0LmNsYXNzKTsKLQkJCi0JaWYgKEVYUEVSVCkgewotCQlyZXR1cm4gbmV3IFJlZ3Jlc3Npb25UZXN0U2V0dXAoc3VpdGUpOwotCX0gZWxzZSB7Ci0JCXJldHVybiBuZXcgUmVncmVzc2lvblRlc3RTZXR1cChuZXcgRXhjbHVkZWRUZXN0U3VpdGUoc3VpdGUsIEVYQ0xVREVEX1RFU1RTKSk7Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3JlZ3Jlc3Npb24vVXRpbFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9jb21waWxlci9yZWdyZXNzaW9uL1V0aWxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNGE3OWQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2NvbXBpbGVyL3JlZ3Jlc3Npb24vVXRpbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyLnJlZ3Jlc3Npb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotCi1wdWJsaWMgY2xhc3MgVXRpbFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFJlZ3Jlc3Npb25UZXN0IHsKLXB1YmxpYyBVdGlsVGVzdChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCXJldHVybiBzZXR1cFN1aXRlKHRlc3RDbGFzcygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QwMSgpIHsKLQotCWFzc2VydFRydWUoIlBhdHRlcm4gbWF0Y2hpbmcgZmFpbHVyZSIsCi0JCSFDaGFyT3BlcmF0aW9uLm1hdGNoKCJYIi50b0NoYXJBcnJheSgpLCAiWHl6Ii50b0NoYXJBcnJheSgpLCB0cnVlKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDIoKSB7Ci0KLQlhc3NlcnRUcnVlKCJQYXR0ZXJuIG1hdGNoaW5nIGZhaWx1cmUiLAotCQlDaGFyT3BlcmF0aW9uLm1hdGNoKCJYKiIudG9DaGFyQXJyYXkoKSwgIlh5eiIudG9DaGFyQXJyYXkoKSwgdHJ1ZSkpOwotfQotcHVibGljIHZvaWQgdGVzdDAzKCkgewotCi0JYXNzZXJ0VHJ1ZSgiUGF0dGVybiBtYXRjaGluZyBmYWlsdXJlIiwKLQkJQ2hhck9wZXJhdGlvbi5tYXRjaCgiWCIudG9DaGFyQXJyYXkoKSwgIlgiLnRvQ2hhckFycmF5KCksIHRydWUpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QwNCgpIHsKLQotCWFzc2VydFRydWUoIlBhdHRlcm4gbWF0Y2hpbmcgZmFpbHVyZSIsCi0JCUNoYXJPcGVyYXRpb24ubWF0Y2goIlgqWCIudG9DaGFyQXJyYXkoKSwgIlhZWCIudG9DaGFyQXJyYXkoKSwgdHJ1ZSkpOwotfQotcHVibGljIHZvaWQgdGVzdDA1KCkgewotCi0JYXNzZXJ0VHJ1ZSgiUGF0dGVybiBtYXRjaGluZyBmYWlsdXJlIiwKLQkJQ2hhck9wZXJhdGlvbi5tYXRjaCgiWFkqIi50b0NoYXJBcnJheSgpLCAiWFlaIi50b0NoYXJBcnJheSgpLCB0cnVlKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDYoKSB7Ci0KLQlhc3NlcnRUcnVlKCJQYXR0ZXJuIG1hdGNoaW5nIGZhaWx1cmUiLAotCQlDaGFyT3BlcmF0aW9uLm1hdGNoKCIqWFkqIi50b0NoYXJBcnJheSgpLCAiWFlaIi50b0NoYXJBcnJheSgpLCB0cnVlKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDcoKSB7Ci0KLQlhc3NlcnRUcnVlKCJQYXR0ZXJuIG1hdGNoaW5nIGZhaWx1cmUiLAotCQlDaGFyT3BlcmF0aW9uLm1hdGNoKCIqIi50b0NoYXJBcnJheSgpLCAiWFlaIi50b0NoYXJBcnJheSgpLCB0cnVlKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDgoKSB7Ci0KLQlhc3NlcnRUcnVlKCJQYXR0ZXJuIG1hdGNoaW5nIGZhaWx1cmUiLAotCQkhQ2hhck9wZXJhdGlvbi5tYXRjaCgiYSoiLnRvQ2hhckFycmF5KCksICJYWVoiLnRvQ2hhckFycmF5KCksIHRydWUpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QwOSgpIHsKLQotCWFzc2VydFRydWUoIlBhdHRlcm4gbWF0Y2hpbmcgZmFpbHVyZSIsCi0JCSFDaGFyT3BlcmF0aW9uLm1hdGNoKCJhYmMiLnRvQ2hhckFycmF5KCksICJYWVoiLnRvQ2hhckFycmF5KCksIHRydWUpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QxMCgpIHsKLQotCWFzc2VydFRydWUoIlBhdHRlcm4gbWF0Y2hpbmcgZmFpbHVyZSIsCi0JCSFDaGFyT3BlcmF0aW9uLm1hdGNoKCJhYipjIi50b0NoYXJBcnJheSgpLCAiYWJYIi50b0NoYXJBcnJheSgpLCB0cnVlKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MTEoKSB7Ci0KLQlhc3NlcnRUcnVlKCJQYXR0ZXJuIG1hdGNoaW5nIGZhaWx1cmUiLAotCQlDaGFyT3BlcmF0aW9uLm1hdGNoKCJhKmIqYyIudG9DaGFyQXJyYXkoKSwgImFYWGJZWWMiLnRvQ2hhckFycmF5KCksIHRydWUpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QxMigpIHsKLQotCWFzc2VydFRydWUoIlBhdHRlcm4gbWF0Y2hpbmcgZmFpbHVyZSIsCi0JCSFDaGFyT3BlcmF0aW9uLm1hdGNoKCIqYSpiYyIudG9DaGFyQXJyYXkoKSwgImFYWGJZWWMiLnRvQ2hhckFycmF5KCksIHRydWUpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QxMygpIHsKLQotCWFzc2VydFRydWUoIlBhdHRlcm4gbWF0Y2hpbmcgZmFpbHVyZSIsCi0JCSFDaGFyT3BlcmF0aW9uLm1hdGNoKCIqZm9vKmJhciIudG9DaGFyQXJyYXkoKSwgIiIudG9DaGFyQXJyYXkoKSwgdHJ1ZSkpOwotfQotcHVibGljIHZvaWQgdGVzdDE0KCkgewotCi0JYXNzZXJ0VHJ1ZSgiUGF0dGVybiBtYXRjaGluZyBmYWlsdXJlIiwKLQkJQ2hhck9wZXJhdGlvbi5tYXRjaCgiKmZvbypiYXIiLnRvQ2hhckFycmF5KCksICJmZm9vYmFiYXIiLnRvQ2hhckFycmF5KCksIHRydWUpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QxNSgpIHsKLQotCWFzc2VydFRydWUoIlBhdHRlcm4gbWF0Y2hpbmcgZmFpbHVyZSIsCi0JCSFDaGFyT3BlcmF0aW9uLm1hdGNoKCIqZm9sKmJhciIudG9DaGFyQXJyYXkoKSwgImZmb29iYWJhciIudG9DaGFyQXJyYXkoKSwgdHJ1ZSkpOwotfQotcHVibGljIHZvaWQgdGVzdDE2KCkgewotCi0JYXNzZXJ0VHJ1ZSgiUGF0dGVybiBtYXRjaGluZyBmYWlsdXJlIiwKLQkJQ2hhck9wZXJhdGlvbi5tYXRjaCgiKlgqWSoiLnRvQ2hhckFycmF5KCksICJYWSIudG9DaGFyQXJyYXkoKSwgdHJ1ZSkpOwotfQotcHVibGljIHZvaWQgdGVzdDE3KCkgewotCi0JYXNzZXJ0VHJ1ZSgiUGF0dGVybiBtYXRjaGluZyBmYWlsdXJlIiwKLQkJQ2hhck9wZXJhdGlvbi5tYXRjaCgiKlgqWSoiLnRvQ2hhckFycmF5KCksICJYWVoiLnRvQ2hhckFycmF5KCksIHRydWUpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QxOCgpIHsKLQotCWFzc2VydFRydWUoIlBhdHRlcm4gbWF0Y2hpbmcgZmFpbHVyZSIsCi0JCUNoYXJPcGVyYXRpb24ubWF0Y2goIm1haW4oKikiLnRvQ2hhckFycmF5KCksICJtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmd2KSIudG9DaGFyQXJyYXkoKSwgdHJ1ZSkpOwotfQotcHVibGljIHZvaWQgdGVzdDE5KCkgewotCi0JYXNzZXJ0VHJ1ZSgiUGF0dGVybiBtYXRjaGluZyBmYWlsdXJlIiwKLQkJQ2hhck9wZXJhdGlvbi5tYXRjaCgiKnJyKiIudG9DaGFyQXJyYXkoKSwgIkFSUkFZIi50b0NoYXJBcnJheSgpLCBmYWxzZSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0MjAoKSB7Ci0KLQlhc3NlcnRUcnVlKCJQYXR0ZXJuIG1hdGNoaW5nIGZhaWx1cmUiLAotCQlDaGFyT3BlcmF0aW9uLm1hdGNoKCJoZWxsbypXb3JsZCIudG9DaGFyQXJyYXkoKSwgImhlbGxvV29ybGQiLnRvQ2hhckFycmF5KCksIHRydWUpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdDIxKCkgewotCWFzc2VydEVxdWFscygiVHJpbSBmYWlsdXJlIiwgImhlbGxvIiwgbmV3IFN0cmluZyhDaGFyT3BlcmF0aW9uLnRyaW0oImhlbGxvIi50b0NoYXJBcnJheSgpKSkpOwotfQotcHVibGljIHZvaWQgdGVzdDIyKCkgewotCWFzc2VydEVxdWFscygiVHJpbSBmYWlsdXJlIiwgImhlbGxvIiwgbmV3IFN0cmluZyhDaGFyT3BlcmF0aW9uLnRyaW0oIiAgIGhlbGxvIi50b0NoYXJBcnJheSgpKSkpOwotfQotcHVibGljIHZvaWQgdGVzdDIzKCkgewotCWFzc2VydEVxdWFscygiVHJpbSBmYWlsdXJlIiwgImhlbGxvIiwgbmV3IFN0cmluZyhDaGFyT3BlcmF0aW9uLnRyaW0oIiAgIGhlbGxvICAgIi50b0NoYXJBcnJheSgpKSkpOwotfQotcHVibGljIHZvaWQgdGVzdDI0KCkgewotCWFzc2VydEVxdWFscygiVHJpbSBmYWlsdXJlIiwgImhlbGxvIiwgbmV3IFN0cmluZyhDaGFyT3BlcmF0aW9uLnRyaW0oImhlbGxvICAgIi50b0NoYXJBcnJheSgpKSkpOwotfQotcHVibGljIHZvaWQgdGVzdDI1KCkgewotCWFzc2VydEVxdWFscygiVHJpbSBmYWlsdXJlIiwgIiIsIG5ldyBTdHJpbmcoQ2hhck9wZXJhdGlvbi50cmltKCIgICAiLnRvQ2hhckFycmF5KCkpKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MjYoKSB7Ci0JYXNzZXJ0RXF1YWxzKCJUcmltIGZhaWx1cmUiLCAiaGVsbG8gd29ybGQiLCBuZXcgU3RyaW5nKENoYXJPcGVyYXRpb24udHJpbSgiIGhlbGxvIHdvcmxkICAiLnRvQ2hhckFycmF5KCkpKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MjcoKSB7Ci0JY2hhciBbXVtdIHRva2VucyA9IENoYXJPcGVyYXRpb24uc3BsaXRBbmRUcmltT24oJywnLCIgaGVsbG8sd29ybGQiLnRvQ2hhckFycmF5KCkpOwotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspewotCQlidWZmZXIuYXBwZW5kKCdbJykuYXBwZW5kKHRva2Vuc1tpXSkuYXBwZW5kKCddJyk7Ci0JfQotCWFzc2VydEVxdWFscygiU3BsaXRUcmltIGZhaWx1cmUiLCAiW2hlbGxvXVt3b3JsZF0iLCBidWZmZXIudG9TdHJpbmcoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MjgoKSB7Ci0JY2hhciBbXVtdIHRva2VucyA9IENoYXJPcGVyYXRpb24uc3BsaXRBbmRUcmltT24oJywnLCIgaGVsbG8gLCB3b3JsZCIudG9DaGFyQXJyYXkoKSk7Ci0JU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKyl7Ci0JCWJ1ZmZlci5hcHBlbmQoJ1snKS5hcHBlbmQodG9rZW5zW2ldKS5hcHBlbmQoJ10nKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKCJTcGxpdFRyaW0gZmFpbHVyZSIsICJbaGVsbG9dW3dvcmxkXSIsIGJ1ZmZlci50b1N0cmluZygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QyOSgpIHsKLQljaGFyIFtdW10gdG9rZW5zID0gQ2hhck9wZXJhdGlvbi5zcGxpdEFuZFRyaW1PbignLCcsIiBoZWxsbywgd29ybGQgICAiLnRvQ2hhckFycmF5KCkpOwotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspewotCQlidWZmZXIuYXBwZW5kKCdbJykuYXBwZW5kKHRva2Vuc1tpXSkuYXBwZW5kKCddJyk7Ci0JfQotCWFzc2VydEVxdWFscygiU3BsaXRUcmltIGZhaWx1cmUiLCAiW2hlbGxvXVt3b3JsZF0iLCBidWZmZXIudG9TdHJpbmcoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MzAoKSB7Ci0JY2hhciBbXVtdIHRva2VucyA9IENoYXJPcGVyYXRpb24uc3BsaXRBbmRUcmltT24oJywnLCIgaGVsbG8sIHdvcmxkICAgLHpvcmsvLCBhYWEgYmJiIi50b0NoYXJBcnJheSgpKTsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKXsKLQkJYnVmZmVyLmFwcGVuZCgnWycpLmFwcGVuZCh0b2tlbnNbaV0pLmFwcGVuZCgnXScpOwotCX0KLQlhc3NlcnRFcXVhbHMoIlNwbGl0VHJpbSBmYWlsdXJlIiwgIltoZWxsb11bd29ybGRdW3pvcmsvXVthYWEgYmJiXSIsIGJ1ZmZlci50b1N0cmluZygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QzMSgpIHsKLQljaGFyIFtdW10gdG9rZW5zID0gQ2hhck9wZXJhdGlvbi5zcGxpdEFuZFRyaW1PbignLCcsIiAgLCAgIi50b0NoYXJBcnJheSgpKTsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKXsKLQkJYnVmZmVyLmFwcGVuZCgnWycpLmFwcGVuZCh0b2tlbnNbaV0pLmFwcGVuZCgnXScpOwotCX0KLQlhc3NlcnRFcXVhbHMoIlNwbGl0VHJpbSBmYWlsdXJlIiwgIltdW10iLCBidWZmZXIudG9TdHJpbmcoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MzIoKSB7Ci0JY2hhciBbXVtdIHRva2VucyA9IENoYXJPcGVyYXRpb24uc3BsaXRBbmRUcmltT24oJywnLCIgICAiLnRvQ2hhckFycmF5KCkpOwotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspewotCQlidWZmZXIuYXBwZW5kKCdbJykuYXBwZW5kKHRva2Vuc1tpXSkuYXBwZW5kKCddJyk7Ci0JfQotCWFzc2VydEVxdWFscygiU3BsaXRUcmltIGZhaWx1cmUiLCAiW10iLCBidWZmZXIudG9TdHJpbmcoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MzMoKSB7Ci0JY2hhciBbXVtdIHRva2VucyA9IENoYXJPcGVyYXRpb24uc3BsaXRBbmRUcmltT24oJywnLCIgICwgaGVsbG8gICIudG9DaGFyQXJyYXkoKSk7Ci0JU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKyl7Ci0JCWJ1ZmZlci5hcHBlbmQoJ1snKS5hcHBlbmQodG9rZW5zW2ldKS5hcHBlbmQoJ10nKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKCJTcGxpdFRyaW0gZmFpbHVyZSIsICJbXVtoZWxsb10iLCBidWZmZXIudG9TdHJpbmcoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3QzNCgpIHsKLQotCWFzc2VydFRydWUoIlBhdGggcGF0dGVybiBtYXRjaGluZyBmYWlsdXJlIiwKLQkJQ2hhck9wZXJhdGlvbi5wYXRoTWF0Y2goImhlbGxvLyovV29ybGQiLnRvQ2hhckFycmF5KCksICJoZWxsby96enovV29ybGQiLnRvQ2hhckFycmF5KCksIHRydWUsICcvJykpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0MzUoKSB7Ci0KLQlhc3NlcnRUcnVlKCJQYXRoIHBhdHRlcm4gbWF0Y2hpbmcgZmFpbHVyZSIsCi0JCUNoYXJPcGVyYXRpb24ucGF0aE1hdGNoKCJoZWxsby8qKi9Xb3JsZCIudG9DaGFyQXJyYXkoKSwgImhlbGxvL3gveS96L1dvcmxkIi50b0NoYXJBcnJheSgpLCB0cnVlLCAnLycpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdDM2KCkgewotCi0JYXNzZXJ0VHJ1ZSgiUGF0aCBwYXR0ZXJuIG1hdGNoaW5nIGZhaWx1cmUiLAotCQlDaGFyT3BlcmF0aW9uLnBhdGhNYXRjaCgiaGVsbG8vKiovV29ybGQvKiovKi5qYXZhIi50b0NoYXJBcnJheSgpLCAiaGVsbG8veC95L3ovV29ybGQvWC5qYXZhIi50b0NoYXJBcnJheSgpLCB0cnVlLCAnLycpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdDM3KCkgewotCi0JYXNzZXJ0VHJ1ZSgiUGF0aCBwYXR0ZXJuIG1hdGNoaW5nIGZhaWx1cmUiLAotCQlDaGFyT3BlcmF0aW9uLnBhdGhNYXRjaCgiKiovV29ybGQvKiovKi5qYXZhIi50b0NoYXJBcnJheSgpLCAiaGVsbG8veC95L3ovV29ybGQvWC5qYXZhIi50b0NoYXJBcnJheSgpLCB0cnVlLCAnLycpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdDM4KCkgewotCi0JYXNzZXJ0VHJ1ZSgiUGF0aCBwYXR0ZXJuIG1hdGNoaW5nIGZhaWx1cmUiLAotCQkhQ2hhck9wZXJhdGlvbi5wYXRoTWF0Y2goIi8qLmphdmEiLnRvQ2hhckFycmF5KCksICIvaGVsbG8veC95L3ovV29ybGQvWC5qYXZhIi50b0NoYXJBcnJheSgpLCB0cnVlLCAnLycpKTsKLX0KLQotLyoKLSAqIEZyb20gQW50IHBhdHRlcm4gc2V0IGV4YW1wbGVzCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QzOSgpIHsKLQotCWFzc2VydFRydWUoIlBhdGggcGF0dGVybiBtYXRjaGluZyBmYWlsdXJlLTEiLAotCQlDaGFyT3BlcmF0aW9uLnBhdGhNYXRjaCgiKiovQ1ZTLyoiLnRvQ2hhckFycmF5KCksICJDVlMvUmVwb3NpdG9yeSIudG9DaGFyQXJyYXkoKSwgdHJ1ZSwgJy8nKSk7Ci0JYXNzZXJ0VHJ1ZSgiUGF0aCBwYXR0ZXJuIG1hdGNoaW5nIGZhaWx1cmUtMiIsCi0JCUNoYXJPcGVyYXRpb24ucGF0aE1hdGNoKCIqKi9DVlMvKiIudG9DaGFyQXJyYXkoKSwgIm9yZy9hcGFjaGUvQ1ZTL0VudHJpZXMiLnRvQ2hhckFycmF5KCksIHRydWUsICcvJykpOwotCWFzc2VydFRydWUoIlBhdGggcGF0dGVybiBtYXRjaGluZyBmYWlsdXJlLTMiLAotCQlDaGFyT3BlcmF0aW9uLnBhdGhNYXRjaCgiKiovQ1ZTLyoiLnRvQ2hhckFycmF5KCksICJvcmcvYXBhY2hlL2pha2FydGEvdG9vbHMvYW50L0NWUy9FbnRyaWVzIi50b0NoYXJBcnJheSgpLCB0cnVlLCAnLycpKTsKLQlhc3NlcnRUcnVlKCJQYXRoIHBhdHRlcm4gbWF0Y2hpbmcgZmFpbHVyZS00IiwKLQkJIUNoYXJPcGVyYXRpb24ucGF0aE1hdGNoKCIqKi9DVlMvKiIudG9DaGFyQXJyYXkoKSwgIm9yZy9hcGFjaGUvQ1ZTL2Zvby9iYXIvRW50cmllcyIudG9DaGFyQXJyYXkoKSwgdHJ1ZSwgJy8nKSk7Ci19Ci0KLS8qCi0gKiBGcm9tIEFudCBwYXR0ZXJuIHNldCBleGFtcGxlcwotICovCi1wdWJsaWMgdm9pZCB0ZXN0NDAoKSB7Ci0KLQlhc3NlcnRUcnVlKCJQYXRoIHBhdHRlcm4gbWF0Y2hpbmcgZmFpbHVyZS0xIiwKLQkJQ2hhck9wZXJhdGlvbi5wYXRoTWF0Y2goIm9yZy9hcGFjaGUvamFrYXJ0YS8qKiIudG9DaGFyQXJyYXkoKSwgIm9yZy9hcGFjaGUvamFrYXJ0YS90b29scy9hbnQvZG9jcy9pbmRleC5odG1sIi50b0NoYXJBcnJheSgpLCB0cnVlLCAnLycpKTsKLQlhc3NlcnRUcnVlKCJQYXRoIHBhdHRlcm4gbWF0Y2hpbmcgZmFpbHVyZS0yIiwKLQkJQ2hhck9wZXJhdGlvbi5wYXRoTWF0Y2goIm9yZy9hcGFjaGUvamFrYXJ0YS8qKiIudG9DaGFyQXJyYXkoKSwgIm9yZy9hcGFjaGUvamFrYXJ0YS90ZXN0LnhtbCIudG9DaGFyQXJyYXkoKSwgdHJ1ZSwgJy8nKSk7Ci0JYXNzZXJ0VHJ1ZSgiUGF0aCBwYXR0ZXJuIG1hdGNoaW5nIGZhaWx1cmUtMyIsCi0JCSFDaGFyT3BlcmF0aW9uLnBhdGhNYXRjaCgib3JnL2FwYWNoZS9qYWthcnRhLyoqIi50b0NoYXJBcnJheSgpLCAib3JnL2FwYWNoZS94eXouamF2YSIudG9DaGFyQXJyYXkoKSwgdHJ1ZSwgJy8nKSk7Ci19Ci0KLS8qCi0gKiBGcm9tIEFudCBwYXR0ZXJuIHNldCBleGFtcGxlcwotICovCi1wdWJsaWMgdm9pZCB0ZXN0NDEoKSB7Ci0KLQlhc3NlcnRUcnVlKCJQYXRoIHBhdHRlcm4gbWF0Y2hpbmcgZmFpbHVyZS0xIiwKLQkJQ2hhck9wZXJhdGlvbi5wYXRoTWF0Y2goIm9yZy9hcGFjaGUvKiovQ1ZTLyoiLnRvQ2hhckFycmF5KCksICJvcmcvYXBhY2hlL0NWUy9FbnRyaWVzIi50b0NoYXJBcnJheSgpLCB0cnVlLCAnLycpKTsKLQlhc3NlcnRUcnVlKCJQYXRoIHBhdHRlcm4gbWF0Y2hpbmcgZmFpbHVyZS0yIiwKLQkJQ2hhck9wZXJhdGlvbi5wYXRoTWF0Y2goIm9yZy9hcGFjaGUvKiovQ1ZTLyoiLnRvQ2hhckFycmF5KCksICJvcmcvYXBhY2hlL2pha2FydGEvdG9vbHMvYW50L0NWUy9FbnRyaWVzIi50b0NoYXJBcnJheSgpLCB0cnVlLCAnLycpKTsKLQlhc3NlcnRUcnVlKCJQYXRoIHBhdHRlcm4gbWF0Y2hpbmcgZmFpbHVyZS0zIiwKLQkJIUNoYXJPcGVyYXRpb24ucGF0aE1hdGNoKCJvcmcvYXBhY2hlLyoqL0NWUy8qIi50b0NoYXJBcnJheSgpLCAib3JnL2FwYWNoZS9DVlMvZm9vL2Jhci9FbnRyaWVzIi50b0NoYXJBcnJheSgpLCB0cnVlLCAnLycpKTsKLX0KLQotLyoKLSAqIEZyb20gQW50IHBhdHRlcm4gc2V0IGV4YW1wbGVzCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3Q0MigpIHsKLQotCWFzc2VydFRydWUoIlBhdGggcGF0dGVybiBtYXRjaGluZyBmYWlsdXJlLTEiLAotCQlDaGFyT3BlcmF0aW9uLnBhdGhNYXRjaCgiKiovdGVzdC8qKiIudG9DaGFyQXJyYXkoKSwgIm9yZy9hcGFjaGUvdGVzdC9DVlMvRW50cmllcyIudG9DaGFyQXJyYXkoKSwgdHJ1ZSwgJy8nKSk7Ci0JYXNzZXJ0VHJ1ZSgiUGF0aCBwYXR0ZXJuIG1hdGNoaW5nIGZhaWx1cmUtMiIsCi0JCUNoYXJPcGVyYXRpb24ucGF0aE1hdGNoKCIqKi90ZXN0LyoqIi50b0NoYXJBcnJheSgpLCAidGVzdCIudG9DaGFyQXJyYXkoKSwgdHJ1ZSwgJy8nKSk7Ci0JYXNzZXJ0VHJ1ZSgiUGF0aCBwYXR0ZXJuIG1hdGNoaW5nIGZhaWx1cmUtMyIsCi0JCUNoYXJPcGVyYXRpb24ucGF0aE1hdGNoKCIqKi90ZXN0LyoqIi50b0NoYXJBcnJheSgpLCAiYS90ZXN0Ii50b0NoYXJBcnJheSgpLCB0cnVlLCAnLycpKTsKLQlhc3NlcnRUcnVlKCJQYXRoIHBhdHRlcm4gbWF0Y2hpbmcgZmFpbHVyZS00IiwKLQkJQ2hhck9wZXJhdGlvbi5wYXRoTWF0Y2goIioqL3Rlc3QvKioiLnRvQ2hhckFycmF5KCksICJ0ZXN0L2EuamF2YSIudG9DaGFyQXJyYXkoKSwgdHJ1ZSwgJy8nKSk7Ci0JYXNzZXJ0VHJ1ZSgiUGF0aCBwYXR0ZXJuIG1hdGNoaW5nIGZhaWx1cmUtNSIsCi0JCSFDaGFyT3BlcmF0aW9uLnBhdGhNYXRjaCgiKiovdGVzdC8qKiIudG9DaGFyQXJyYXkoKSwgIm9yZy9hcGFjaGUvdGVzdC5qYXZhIi50b0NoYXJBcnJheSgpLCB0cnVlLCAnLycpKTsKLX0KLS8qCi0gKiBDb3JuZXIgY2FzZXMKLSAqLwotcHVibGljIHZvaWQgdGVzdDQzKCkgewotCi0JYXNzZXJ0VHJ1ZSgiUGF0aCBwYXR0ZXJuIG1hdGNoaW5nIGZhaWx1cmUtMSIsCi0JCUNoYXJPcGVyYXRpb24ucGF0aE1hdGNoKCIvdGVzdC8iLnRvQ2hhckFycmF5KCksICIvdGVzdC9DVlMvRW50cmllcyIudG9DaGFyQXJyYXkoKSwgdHJ1ZSwgJy8nKSk7Ci0JYXNzZXJ0VHJ1ZSgiUGF0aCBwYXR0ZXJuIG1hdGNoaW5nIGZhaWx1cmUtMiIsCi0JCUNoYXJPcGVyYXRpb24ucGF0aE1hdGNoKCIvdGVzdC8qKiIudG9DaGFyQXJyYXkoKSwgIi90ZXN0L0NWUy9FbnRyaWVzIi50b0NoYXJBcnJheSgpLCB0cnVlLCAnLycpKTsKLX0KLS8qCi0gKiBDb3JuZXIgY2FzZXMKLSAqLwotcHVibGljIHZvaWQgdGVzdDQ0KCkgewotCQkKLQlhc3NlcnRUcnVlKCJQYXRoIHBhdHRlcm4gbWF0Y2hpbmcgZmFpbHVyZS0xIiwKLQkJIUNoYXJPcGVyYXRpb24ucGF0aE1hdGNoKCJ0ZXN0Ii50b0NoYXJBcnJheSgpLCAidGVzdC9DVlMvRW50cmllcyIudG9DaGFyQXJyYXkoKSwgdHJ1ZSwgJy8nKSk7Ci0JYXNzZXJ0VHJ1ZSgiUGF0aCBwYXR0ZXJuIG1hdGNoaW5nIGZhaWx1cmUtMiIsCi0JCSFDaGFyT3BlcmF0aW9uLnBhdGhNYXRjaCgiKiovdGVzdCIudG9DaGFyQXJyYXkoKSwgInRlc3QvQ1ZTL0VudHJpZXMiLnRvQ2hhckFycmF5KCksIHRydWUsICcvJykpOwotfQotLyoKLSAqIENvcm5lciBjYXNlcwotICovCi1wdWJsaWMgdm9pZCB0ZXN0NDUoKSB7Ci0JCQotCWFzc2VydFRydWUoIlBhdGggcGF0dGVybiBtYXRjaGluZyBmYWlsdXJlLTEiLAotCQlDaGFyT3BlcmF0aW9uLnBhdGhNYXRjaCgiL3Rlc3QvdGVzdDEvIi50b0NoYXJBcnJheSgpLCAiL3Rlc3QvdGVzdDEvdGVzdC90ZXN0MSIudG9DaGFyQXJyYXkoKSwgdHJ1ZSwgJy8nKSk7Ci0JYXNzZXJ0VHJ1ZSgiUGF0aCBwYXR0ZXJuIG1hdGNoaW5nIGZhaWx1cmUtMiIsCi0JCSFDaGFyT3BlcmF0aW9uLnBhdGhNYXRjaCgiL3Rlc3QvdGVzdDEiLnRvQ2hhckFycmF5KCksICIvdGVzdC90ZXN0MS90ZXN0L3Rlc3QxIi50b0NoYXJBcnJheSgpLCB0cnVlLCAnLycpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3Q0NigpIHsKLQotCWFzc2VydFRydWUoIlBhdGggcGF0dGVybiBtYXRjaGluZyBmYWlsdXJlIiwKLQkJQ2hhck9wZXJhdGlvbi5wYXRoTWF0Y2goImhlbGxvLyoqL1dvcmxkIi50b0NoYXJBcnJheSgpLCAiaGVsbG8vV29ybGQiLnRvQ2hhckFycmF5KCksIHRydWUsICcvJykpOwotfQotLyoKLSAqIFJlZ3Jlc3Npb24gdGVzdCBmb3IgMjgzMTYgTWlzc2luZyByZWZlcmVuY2VzIHRvIGNvbnN0cnVjdG9yIAotICovCi1wdWJsaWMgdm9pZCB0ZXN0NDcoKSB7Ci0KLQlhc3NlcnRUcnVlKCJQYXR0ZXJuIG1hdGNoaW5nIGZhaWx1cmUiLAotCQlDaGFyT3BlcmF0aW9uLm1hdGNoKCIqeCIudG9DaGFyQXJyYXkoKSwgInguWCIudG9DaGFyQXJyYXkoKSwgZmFsc2UpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3Q0OCgpIHsKLQotCWFzc2VydFRydWUoIlBhdHRlcm4gbWF0Y2hpbmcgZmFpbHVyZSIsCi0JCUNoYXJPcGVyYXRpb24ubWF0Y2goIiphKiIudG9DaGFyQXJyYXkoKSwgImFiY2QiLnRvQ2hhckFycmF5KCksIGZhbHNlKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0NDkoKSB7Ci0KLQlhc3NlcnRUcnVlKCJQYXRoIHBhdHRlcm4gbWF0Y2hpbmcgZmFpbHVyZSIsCi0JCUNoYXJPcGVyYXRpb24ucGF0aE1hdGNoKCIqKi9oZWxsbyIudG9DaGFyQXJyYXkoKSwgImhlbGxvL2hlbGxvIi50b0NoYXJBcnJheSgpLCB0cnVlLCAnLycpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3Q1MCgpIHsKLQotCWFzc2VydFRydWUoIlBhdGggcGF0dGVybiBtYXRjaGluZyBmYWlsdXJlIiwKLQkJQ2hhck9wZXJhdGlvbi5wYXRoTWF0Y2goIioqL2hlbGxvLyoqIi50b0NoYXJBcnJheSgpLCAiaGVsbG8vaGVsbG8iLnRvQ2hhckFycmF5KCksIHRydWUsICcvJykpOwotfQotcHVibGljIHZvaWQgdGVzdDUxKCkgewotCi0JYXNzZXJ0VHJ1ZSgiUGF0aCBwYXR0ZXJuIG1hdGNoaW5nIGZhaWx1cmUiLAotCQlDaGFyT3BlcmF0aW9uLnBhdGhNYXRjaCgiKiovaGVsbG8vIi50b0NoYXJBcnJheSgpLCAiaGVsbG8vaGVsbG8iLnRvQ2hhckFycmF5KCksIHRydWUsICcvJykpOwotfQotcHVibGljIHZvaWQgdGVzdDUyKCkgewotCi0JYXNzZXJ0VHJ1ZSgiUGF0aCBwYXR0ZXJuIG1hdGNoaW5nIGZhaWx1cmUiLAotCQlDaGFyT3BlcmF0aW9uLnBhdGhNYXRjaCgiaGVsbG8vIi50b0NoYXJBcnJheSgpLCAiaGVsbG8vaGVsbG8iLnRvQ2hhckFycmF5KCksIHRydWUsICcvJykpOwotfQotcHVibGljIHZvaWQgdGVzdDUzKCkgewotCi0JYXNzZXJ0VHJ1ZSgiUGF0aCBwYXR0ZXJuIG1hdGNoaW5nIGZhaWx1cmUiLAotCQkhQ2hhck9wZXJhdGlvbi5wYXRoTWF0Y2goIi8iLnRvQ2hhckFycmF5KCksICJoZWxsby9oZWxsbyIudG9DaGFyQXJyYXkoKSwgdHJ1ZSwgJy8nKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0NTQoKSB7Ci0KLQlhc3NlcnRUcnVlKCJQYXRoIHBhdHRlcm4gbWF0Y2hpbmcgZmFpbHVyZS0xIiwKLQkJQ2hhck9wZXJhdGlvbi5wYXRoTWF0Y2goIngvIi50b0NoYXJBcnJheSgpLCAiaGVsbG8veCIudG9DaGFyQXJyYXkoKSwgdHJ1ZSwgJy8nKSk7Ci0KLQlhc3NlcnRUcnVlKCJQYXRoIHBhdHRlcm4gbWF0Y2hpbmcgZmFpbHVyZS0yIiwKLQkJIUNoYXJPcGVyYXRpb24ucGF0aE1hdGNoKCIveC8iLnRvQ2hhckFycmF5KCksICJoZWxsby94Ii50b0NoYXJBcnJheSgpLCB0cnVlLCAnLycpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3Q1NigpIHsKLQotCWFzc2VydFRydWUoIlBhdGggcGF0dGVybiBtYXRjaGluZyBmYWlsdXJlIiwKLQkJIUNoYXJPcGVyYXRpb24ucGF0aE1hdGNoKCIvKioiLnRvQ2hhckFycmF5KCksICJoZWxsby9oZWxsbyIudG9DaGFyQXJyYXkoKSwgdHJ1ZSwgJy8nKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0NTcoKSB7Ci0KLQlhc3NlcnRUcnVlKCJQYXRoIHBhdHRlcm4gbWF0Y2hpbmcgZmFpbHVyZSIsCi0JCUNoYXJPcGVyYXRpb24ucGF0aE1hdGNoKCIvIi50b0NoYXJBcnJheSgpLCAiL2hlbGxvL2hlbGxvIi50b0NoYXJBcnJheSgpLCB0cnVlLCAnLycpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3Q1OCgpIHsKLQotCWFzc2VydFRydWUoIlBhdGggcGF0dGVybiBtYXRjaGluZyBmYWlsdXJlIiwKLQkJQ2hhck9wZXJhdGlvbi5wYXRoTWF0Y2goIi8qKiIudG9DaGFyQXJyYXkoKSwgIi9oZWxsby9oZWxsbyIudG9DaGFyQXJyYXkoKSwgdHJ1ZSwgJy8nKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0NTkoKSB7Ci0KLQlhc3NlcnRUcnVlKCJQYXRoIHBhdHRlcm4gbWF0Y2hpbmcgZmFpbHVyZSIsCi0JCSFDaGFyT3BlcmF0aW9uLnBhdGhNYXRjaCgiKioiLnRvQ2hhckFycmF5KCksICIvaGVsbG8vaGVsbG8iLnRvQ2hhckFycmF5KCksIHRydWUsICcvJykpOwotfQotcHVibGljIHZvaWQgdGVzdDYwKCkgewotCi0JYXNzZXJ0VHJ1ZSgiUGF0aCBwYXR0ZXJuIG1hdGNoaW5nIGZhaWx1cmUtMSIsCi0JCSFDaGFyT3BlcmF0aW9uLnBhdGhNYXRjaCgiL1Avc3JjIi50b0NoYXJBcnJheSgpLCAiL1Avc3JjL1giLnRvQ2hhckFycmF5KCksIHRydWUsICcvJykpOwotCWFzc2VydFRydWUoIlBhdGggcGF0dGVybiBtYXRjaGluZyBmYWlsdXJlLTIiLAotCQkhQ2hhck9wZXJhdGlvbi5wYXRoTWF0Y2goIi9QLyoqL3NyYyIudG9DaGFyQXJyYXkoKSwgIi9QL3NyYy9YIi50b0NoYXJBcnJheSgpLCB0cnVlLCAnLycpKTsKLQlhc3NlcnRUcnVlKCJQYXRoIHBhdHRlcm4gbWF0Y2hpbmcgZmFpbHVyZS0zIiwKLQkJQ2hhck9wZXJhdGlvbi5wYXRoTWF0Y2goIi9QL3NyYyIudG9DaGFyQXJyYXkoKSwgIi9QL3NyYyIudG9DaGFyQXJyYXkoKSwgdHJ1ZSwgJy8nKSk7Ci0JYXNzZXJ0VHJ1ZSgiUGF0aCBwYXR0ZXJuIG1hdGNoaW5nIGZhaWx1cmUtNCIsCi0JCSFDaGFyT3BlcmF0aW9uLnBhdGhNYXRjaCgiQS5qYXZhIi50b0NoYXJBcnJheSgpLCAiL1Avc3JjL0EuamF2YSIudG9DaGFyQXJyYXkoKSwgdHJ1ZSwgJy8nKSk7CQkKLX0KLQotcHVibGljIHN0YXRpYyBDbGFzcyB0ZXN0Q2xhc3MoKSB7Ci0JcmV0dXJuIFV0aWxUZXN0LmNsYXNzOwotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2V2YWwvQ29kZVNuaXBwZXRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZXZhbC9Db2RlU25pcHBldFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMzMjk4NS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZXZhbC9Db2RlU25pcHBldFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmV2YWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsLkV2YWx1YXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWwuSVJlcXVlc3RvcjsKLS8qKgotICogVGVzdCB0aGUgY29kZSBzbmlwcGV0IGV2YWx1YXRpb24uCi0gKiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgRXZhbHVhdGlvbkNvbnRleHQgY2xhc3MgYW5kIHRoYXQgdGhlIEV2YWx1YXRpb25SZXN1bHQgY2xhc3MKLSAqIGFyZSB3b3JraW5nIGNvcnJlY3RseS4KLSAqLwotcHVibGljIGNsYXNzIENvZGVTbmlwcGV0VGVzdCBleHRlbmRzIEV2YWx1YXRpb25UZXN0IHsKLS8qKgotICogQ3JlYXRlcyBhIG5ldyBDb2RlU25pcHBldFRlc3QuCi0gKi8KLXB1YmxpYyBDb2RlU25pcHBldFRlc3QoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLS8qKgotICogUmV0dXJucyBhIHJlcXVlc3RvciB0aGF0IGV4cGVjdHMgbm8gcmVzdWx0LgotICovCi1wcml2YXRlIElSZXF1ZXN0b3IgZ2V0Tm9SZXN1bHRSZXF1ZXN0b3IoKSB7Ci0JcmV0dXJuIG5ldyBSZXF1ZXN0b3IoKSB7Ci0JCXB1YmxpYyB2b2lkIGFjY2VwdFJlc3VsdChFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCkgewotCQkJYXNzZXJ0VHJ1ZSgiTm8gcmVzdWx0IiwgZmFsc2UpOwotCQl9Ci0JfTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlyZXR1cm4gc2V0dXBTdWl0ZSh0ZXN0Q2xhc3MoKSk7Ci19Ci0vKioKLSAqIFRlc3RzIGNvZGUgc25pcHBldCB0aGF0IHRocm93cyBhIGNoZWNrZWQgZXhjZXB0aW9uLgotICogKFJlZ3Jlc3Npb24gdGVzdCBmb3IgMUcwVDVYSykKLSAqLwotcHVibGljIHZvaWQgdGVzdENoZWNrZWRFeGNlcHRpb24oKSB7Ci0JZXZhbHVhdGVXaXRoRXhwZWN0ZWREaXNwbGF5U3RyaW5nKGJ1aWxkQ2hhckFycmF5KG5ldyBTdHJpbmdbXSB7Ci0JCSJ0cnkgeyIsCi0JCSIJdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24oKTsiLAotCQkifSBmaW5hbGx5IHsiLAotCQkiCVN5c3RlbS5lcnIucHJpbnRsbihcIlRoaXMgaXMgYW4gZXhwZWN0ZWQgZXhjZXB0aW9uIHByaW50ZWQgYnkgdGhlIHRhcmdldCBWTTpcIik7IiwKLQkJIn0ifSksIAotCQludWxsKTsKLX0KLXB1YmxpYyBzdGF0aWMgQ2xhc3MgdGVzdENsYXNzKCkgewotCXJldHVybiBDb2RlU25pcHBldFRlc3QuY2xhc3M7Ci19Ci0vKioKLSAqIFRlc3RzIHRoYXQgbm8gZXJyb3JzIGFyZSByZXBvcnRlZCBmb3IgYW4gZW1wdHkgc3RhdGVtZW50IGZvbGxvd2VkIGJ5IGFuIGV4cHJlc3Npb24uCi0gKiAoUmVncmVzc2lvbiB0ZXN0IGZvciBQUiAjMUcxSEdIRSkKLSAqLwotcHVibGljIHZvaWQgdGVzdEVtcHR5U3RhdGVtZW50KCkgewotCWV2YWx1YXRlV2l0aEV4cGVjdGVkRGlzcGxheVN0cmluZyhidWlsZENoYXJBcnJheShuZXcgU3RyaW5nW10gewotCQkiY2xhc3MgWCB7IiwKLQkJIglwdWJsaWMgaW50IGZhY3QoaW50IG4peyIsCi0JCSIJCXJldHVybiBmYWN0MChuLCAxKTsiLAotCQkiCX0iLAotCQkiCXB1YmxpYyBpbnQgZmFjdDAoaW50IG4sIGludCBhY2MpeyIsCi0JCSIJCWlmIChuIDw9IDEpIHJldHVybiBhY2M7IiwKLQkJIgkJcmV0dXJuIGZhY3QwKG4gLSAxLCBhY2MgKiBuKTsiLAotCQkiCX0iLAotCQkifTsiLAotCQkibmV3IFgoKS5mYWN0KDEwKSJ9KSwgCi0JCSIzNjI4ODAwIi50b0NoYXJBcnJheSgpKTsKLX0KLS8qKgotICogVGVzdHMgdGhhdCBhbiBlcnJvciBpcyByZXBvcnRlZCBmb3IgYW4gZW1wdHkgaW1wb3J0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0RXZhbHVhdGVFbXB0eUltcG9ydCgpIHsKLQl0cnkgewotCQljaGFyW10gaW1wb3J0TmFtZSA9IG5ldyBjaGFyWzBdOwotCQljb250ZXh0LnNldEltcG9ydHMobmV3IGNoYXJbXVtdIHtpbXBvcnROYW1lfSk7Ci0JCVJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgUmVxdWVzdG9yKCk7Ci0JCWNvbnRleHQuZXZhbHVhdGVJbXBvcnRzKGdldEVudigpLCByZXF1ZXN0b3IsIGdldFByb2JsZW1GYWN0b3J5KCkpOwotCQlhc3NlcnRUcnVlKCJHb3Qgb25lIHJlc3VsdCIsIHJlcXVlc3Rvci5yZXN1bHRJbmRleCA9PSAwKTsKLQkJRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSByZXF1ZXN0b3IucmVzdWx0c1swXTsKLQkJYXNzZXJ0VHJ1ZSgiUHJvYmxlbXMiLCByZXN1bHQuaGFzUHJvYmxlbXMoKSk7Ci0JCWFzc2VydEVxdWFscygiRXZhbHVhdGlvbiB0eXBlIiwgRXZhbHVhdGlvblJlc3VsdC5UX0lNUE9SVCwgcmVzdWx0LmdldEV2YWx1YXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkV2YWx1YXRpb24gSUQiLCBpbXBvcnROYW1lLCByZXN1bHQuZ2V0RXZhbHVhdGlvbklEKCkpOwotCX0gZmluYWxseSB7Ci0JCS8vIGNsZWFuIHVwCi0JCWNvbnRleHQuc2V0SW1wb3J0cyhuZXcgY2hhclswXVtdKTsKLQl9Ci19Ci0vKioKLSAqIFRlc3RzIHRoYXQgYW4gZXJyb3IgaXMgcmVwb3J0ZWQgZm9yIGFuIGV4aXN0aW5nIHBhY2thZ2UgYW5kIGEgbm9uIGV4aXN0aW5nIHR5cGUgaW1wb3J0cy4KLSAqLwotcHVibGljIHZvaWQgdGVzdEV2YWx1YXRlRXhpc3RpbmdQYWNrYWdlQW5kTm9uRXhpc3RpbmdUeXBlSW1wb3J0cygpIHsKLQl0cnkgewotCQljaGFyW10gaW1wb3J0TmFtZSA9ICJub24uZXhpc3RpbmcuVHlwZSIudG9DaGFyQXJyYXkoKTsKLQkJY29udGV4dC5zZXRJbXBvcnRzKG5ldyBjaGFyW11bXSB7ImphdmEubGFuZy5yZWZsZWN0LioiLnRvQ2hhckFycmF5KCksIGltcG9ydE5hbWV9KTsKLQkJUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBSZXF1ZXN0b3IoKTsKLQkJY29udGV4dC5ldmFsdWF0ZUltcG9ydHMoZ2V0RW52KCksIHJlcXVlc3RvciwgZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JCWFzc2VydFRydWUoIkdvdCBvbmUgcmVzdWx0IiwgcmVxdWVzdG9yLnJlc3VsdEluZGV4ID09IDApOwotCQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCA9IHJlcXVlc3Rvci5yZXN1bHRzWzBdOwotCQlhc3NlcnRUcnVlKCJQcm9ibGVtcyIsIHJlc3VsdC5oYXNQcm9ibGVtcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJFdmFsdWF0aW9uIHR5cGUiLCBFdmFsdWF0aW9uUmVzdWx0LlRfSU1QT1JULCByZXN1bHQuZ2V0RXZhbHVhdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiRXZhbHVhdGlvbiBJRCIsIGltcG9ydE5hbWUsIHJlc3VsdC5nZXRFdmFsdWF0aW9uSUQoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJLy8gY2xlYW4gdXAKLQkJY29udGV4dC5zZXRJbXBvcnRzKG5ldyBjaGFyWzBdW10pOwotCX0KLX0KLS8qKgotICogVGVzdHMgdGhhdCBhbiBlcnJvciBpcyByZXBvcnRlZCBmb3IgYSBub24gZXhpc3RpbmcgcGFja2FnZSBhbmQgYW4gZXhpc3RpbmcgdHlwZSBpbXBvcnRzLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0RXZhbHVhdGVOb25FeGlzdGluZ1BhY2thZ2VBbmRFeGlzdGluZ1R5cGVJbXBvcnRzKCkgewotCXRyeSB7Ci0JCWNoYXJbXSBpbXBvcnROYW1lID0gIm5vbi5leGlzdGluZy4qIi50b0NoYXJBcnJheSgpOwotCQljb250ZXh0LnNldEltcG9ydHMobmV3IGNoYXJbXVtdIHtpbXBvcnROYW1lLCAiamF2YS5tYXRoLkJpZ0ludGVnZXIiLnRvQ2hhckFycmF5KCl9KTsKLQkJUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBSZXF1ZXN0b3IoKTsKLQkJY29udGV4dC5ldmFsdWF0ZUltcG9ydHMoZ2V0RW52KCksIHJlcXVlc3RvciwgZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JCWFzc2VydFRydWUoIkdvdCBvbmUgcmVzdWx0IiwgcmVxdWVzdG9yLnJlc3VsdEluZGV4ID09IDApOwotCQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCA9IHJlcXVlc3Rvci5yZXN1bHRzWzBdOwotCQlhc3NlcnRUcnVlKCJQcm9ibGVtcyIsIHJlc3VsdC5oYXNQcm9ibGVtcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJFdmFsdWF0aW9uIHR5cGUiLCBFdmFsdWF0aW9uUmVzdWx0LlRfSU1QT1JULCByZXN1bHQuZ2V0RXZhbHVhdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiRXZhbHVhdGlvbiBJRCIsIGltcG9ydE5hbWUsIHJlc3VsdC5nZXRFdmFsdWF0aW9uSUQoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJLy8gY2xlYW4gdXAKLQkJY29udGV4dC5zZXRJbXBvcnRzKG5ldyBjaGFyWzBdW10pOwotCX0KLX0KLS8qKgotICogVGVzdHMgdGhhdCBhbiBlcnJvciBpcyByZXBvcnRlZCBmb3IgYSBub24gZXhpc3RpbmcgcGFja2FnZSBpbXBvcnQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RFdmFsdWF0ZU5vbkV4aXN0aW5nUGFja2FnZUltcG9ydCgpIHsKLQl0cnkgewotCQljaGFyW10gaW1wb3J0TmFtZSA9ICJub24uZXhpc3RpbmcuKiIudG9DaGFyQXJyYXkoKTsKLQkJY29udGV4dC5zZXRJbXBvcnRzKG5ldyBjaGFyW11bXSB7aW1wb3J0TmFtZX0pOwotCQlSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IFJlcXVlc3RvcigpOwotCQljb250ZXh0LmV2YWx1YXRlSW1wb3J0cyhnZXRFbnYoKSwgcmVxdWVzdG9yLCBnZXRQcm9ibGVtRmFjdG9yeSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiR290IG9uZSByZXN1bHQiLCByZXF1ZXN0b3IucmVzdWx0SW5kZXggPT0gMCk7Ci0JCUV2YWx1YXRpb25SZXN1bHQgcmVzdWx0ID0gcmVxdWVzdG9yLnJlc3VsdHNbMF07Ci0JCWFzc2VydFRydWUoIlByb2JsZW1zIiwgcmVzdWx0Lmhhc1Byb2JsZW1zKCkpOwotCQlhc3NlcnRFcXVhbHMoIkV2YWx1YXRpb24gdHlwZSIsIEV2YWx1YXRpb25SZXN1bHQuVF9JTVBPUlQsIHJlc3VsdC5nZXRFdmFsdWF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJFdmFsdWF0aW9uIElEIiwgaW1wb3J0TmFtZSwgcmVzdWx0LmdldEV2YWx1YXRpb25JRCgpKTsKLQl9IGZpbmFsbHkgewotCQkvLyBjbGVhbiB1cAotCQljb250ZXh0LnNldEltcG9ydHMobmV3IGNoYXJbMF1bXSk7Ci0JfQotfQotLyoqCi0gKiBUZXN0cyB0aGF0IGFuIGVycm9yIGlzIHJlcG9ydGVkIGZvciBhIG5vbiBleGlzdGluZyB0eXBlIGltcG9ydC4KLSAqLwotcHVibGljIHZvaWQgdGVzdEV2YWx1YXRlTm9uRXhpc3RpbmdUeXBlSW1wb3J0KCkgewotCXRyeSB7Ci0JCWNoYXJbXSBpbXBvcnROYW1lID0gIm5vbi5leGlzdGluZy5UeXBlIi50b0NoYXJBcnJheSgpOwotCQljb250ZXh0LnNldEltcG9ydHMobmV3IGNoYXJbXVtdIHtpbXBvcnROYW1lfSk7Ci0JCVJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgUmVxdWVzdG9yKCk7Ci0JCWNvbnRleHQuZXZhbHVhdGVJbXBvcnRzKGdldEVudigpLCByZXF1ZXN0b3IsIGdldFByb2JsZW1GYWN0b3J5KCkpOwotCQlhc3NlcnRUcnVlKCJHb3Qgb25lIHJlc3VsdCIsIHJlcXVlc3Rvci5yZXN1bHRJbmRleCA9PSAwKTsKLQkJRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSByZXF1ZXN0b3IucmVzdWx0c1swXTsKLQkJYXNzZXJ0VHJ1ZSgiUHJvYmxlbXMiLCByZXN1bHQuaGFzUHJvYmxlbXMoKSk7Ci0JCWFzc2VydEVxdWFscygiRXZhbHVhdGlvbiB0eXBlIiwgRXZhbHVhdGlvblJlc3VsdC5UX0lNUE9SVCwgcmVzdWx0LmdldEV2YWx1YXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkV2YWx1YXRpb24gSUQiLCBpbXBvcnROYW1lLCByZXN1bHQuZ2V0RXZhbHVhdGlvbklEKCkpOwotCX0gZmluYWxseSB7Ci0JCS8vIGNsZWFuIHVwCi0JCWNvbnRleHQuc2V0SW1wb3J0cyhuZXcgY2hhclswXVtdKTsKLQl9Ci19Ci0vKioKLSAqIFRlc3RzIHRoYXQgbm8gZXJyb3JzIGFyZSByZXBvcnRlZCBmb3IgdmFsaWQgcGFja2FnZSBhbmQgdHlwZSBpbXBvcnRzLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0RXZhbHVhdGVWYWxpZFBhY2thZ2VBbmRUeXBlSW1wb3J0cygpIHsKLQl0cnkgewotCQljb250ZXh0LnNldEltcG9ydHMobmV3IGNoYXJbXVtdIHsiamF2YS51dGlsLkVudW1lcmF0aW9uIi50b0NoYXJBcnJheSgpLCAiamF2YS5sYW5nLnJlZmxlY3QuKiIudG9DaGFyQXJyYXkoKX0pOwotCQljb250ZXh0LmV2YWx1YXRlSW1wb3J0cyhnZXRFbnYoKSwgZ2V0Tm9SZXN1bHRSZXF1ZXN0b3IoKSwgZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJLy8gY2xlYW4gdXAKLQkJY29udGV4dC5zZXRJbXBvcnRzKG5ldyBjaGFyWzBdW10pOwotCX0KLX0KLS8qKgotICogVGVzdHMgdGhhdCBubyBlcnJvcnMgYXJlIHJlcG9ydGVkIGZvciBhIHZhbGlkIHBhY2thZ2UgaW1wb3J0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0RXZhbHVhdGVWYWxpZFBhY2thZ2VJbXBvcnQoKSB7Ci0JdHJ5IHsKLQkJY29udGV4dC5zZXRJbXBvcnRzKG5ldyBjaGFyW11bXSB7ImphdmEuaW8uKiIudG9DaGFyQXJyYXkoKX0pOwotCQljb250ZXh0LmV2YWx1YXRlSW1wb3J0cyhnZXRFbnYoKSwgZ2V0Tm9SZXN1bHRSZXF1ZXN0b3IoKSwgZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJLy8gY2xlYW4gdXAKLQkJY29udGV4dC5zZXRJbXBvcnRzKG5ldyBjaGFyWzBdW10pOwotCX0KLX0KLS8qKgotICogVGVzdHMgdGhhdCBubyBlcnJvcnMgYXJlIHJlcG9ydGVkIGZvciBhIHZhbGlkIHR5cGUgaW1wb3J0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0RXZhbHVhdGVWYWxpZFR5cGVJbXBvcnQoKSB7Ci0JdHJ5IHsKLQkJY29udGV4dC5zZXRJbXBvcnRzKG5ldyBjaGFyW11bXSB7ImphdmEubWF0aC5CaWdJbnRlZ2VyIi50b0NoYXJBcnJheSgpfSk7Ci0JCWNvbnRleHQuZXZhbHVhdGVJbXBvcnRzKGdldEVudigpLCBnZXROb1Jlc3VsdFJlcXVlc3RvcigpLCBnZXRQcm9ibGVtRmFjdG9yeSgpKTsKLQl9IGZpbmFsbHkgewotCQkvLyBjbGVhbiB1cAotCQljb250ZXh0LnNldEltcG9ydHMobmV3IGNoYXJbMF1bXSk7Ci0JfQotfQotLyoqCi0gKiBUZXN0cyBjb2RlIHNuaXBwZXQgdGhhdCBpbmNsdWRlIGEgZmluYWxseSBibG9jayB0cmlnZ2VyZWQgYnkgYW4gZXJyb3IuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RGaW5hbGx5RXJyb3IoKSB7Ci0JZXZhbHVhdGVXaXRoRXhwZWN0ZWREaXNwbGF5U3RyaW5nKGJ1aWxkQ2hhckFycmF5KG5ldyBTdHJpbmdbXSB7Ci0JCSJ0cnkgeyIsCi0JCSIJdGhyb3cgbmV3IEVycm9yKCk7IiwKLQkJIn0gZmluYWxseSB7IiwKLQkJIglTeXN0ZW0uZXJyLnByaW50bG4oXCJUaGlzIGlzIGFuIGV4cGVjdGVkIGVycm9yIHByaW50ZWQgYnkgdGhlIHRhcmdldCBWTTpcIik7IiwKLQkJIn0ifSksIAotCQludWxsKTsKLX0KLS8qKgotICogVGVzdHMgY29kZSBzbmlwcGV0IHRoYXQgaW5jbHVkZSBvbmUgZmluYWxseSBibG9jay4KLSAqLwotcHVibGljIHZvaWQgdGVzdEZpbmFsbHlPbmVCbG9jaygpIHsKLQlldmFsdWF0ZVdpdGhFeHBlY3RlZERpc3BsYXlTdHJpbmcoYnVpbGRDaGFyQXJyYXkobmV3IFN0cmluZ1tdIHsKLQkJInRyeSB7IiwKLQkJIglyZXR1cm4gMTsiLAotCQkifSBmaW5hbGx5IHsiLAotCQkiCXJldHVybiAyOyIsCi0JCSJ9In0pLCAKLQkJIjIiLnRvQ2hhckFycmF5KCkpOwotfQotLyoqCi0gKiBUZXN0cyBjb2RlIHNuaXBwZXQgdGhhdCBpbmNsdWRlIDIgZmluYWxseSBibG9ja3MuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RGaW5hbGx5VHdvQmxvY2soKSB7Ci0JZXZhbHVhdGVXaXRoRXhwZWN0ZWREaXNwbGF5U3RyaW5nKGJ1aWxkQ2hhckFycmF5KG5ldyBTdHJpbmdbXSB7Ci0JCSJ0cnkgeyIsCi0JCSIJdHJ5IHsiLAotCQkiCQlyZXR1cm4gMTsiLAotCQkiCX0gZmluYWxseSB7IiwKLQkJIgkJcmV0dXJuIDI7IiwKLQkJIgl9IiwKLQkJIn0gZmluYWxseSB7IiwKLQkJIglyZXR1cm4gMzsiLAotCQkifSJ9KSwgCi0JCSIzIi50b0NoYXJBcnJheSgpKTsKLX0KLS8qKgotICogVGVzdHMgdGhlIGZyZWUgcmV0dXJuIGFkZGl0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGNvZGUgc25pcHBldAotICogZm9yIGFuIGFub255bW91cyBpbm5lciBjbGFzcy4KLSAqLwotcHVibGljIHZvaWQgdGVzdEZyZWVSZXR1cm5Bbm9ueW1vdXMoKSB7Ci0JZXZhbHVhdGVXaXRoRXhwZWN0ZWREaXNwbGF5U3RyaW5nKGJ1aWxkQ2hhckFycmF5KG5ldyBTdHJpbmdbXSB7Ci0JCSJuZXcgT2JqZWN0KCkgeyIsCi0JCSIJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsiLAotCQkiCQlyZXR1cm4gXCJhbiBvYmplY3RcIjsiLAotCQkiCX0iLAotCQkifSJ9KSwgCi0JCSJhbiBvYmplY3QiLnRvQ2hhckFycmF5KCkpOwotfQotLyoqCi0gKiBUZXN0cyB0aGUgZnJlZSByZXR1cm4gYWRkaXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgY29kZSBzbmlwcGV0Ci0gKiBmb3IgYSBjbGFzcyBkZWNsYXJhdGlvbiBmb2xsb3dlZCBieSBhbiBleHByZXNzaW9uLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0RnJlZVJldHVybkNsYXNzRGVjbGFyYXRpb24oKSB7Ci0JZXZhbHVhdGVXaXRoRXhwZWN0ZWREaXNwbGF5U3RyaW5nKGJ1aWxkQ2hhckFycmF5KG5ldyBTdHJpbmdbXSB7Ci0JCSJjbGFzcyBQb2ludCB7IiwKLQkJIglpbnQgeDsiLAotCQkiCWludCB5OyIsCi0JCSIJUG9pbnQoaW50IHgsIGludCB5KSB7IiwKLQkJIgkJdGhpcy54ID0geDsiLAotCQkiCQl0aGlzLnkgPSB5OyIsCi0JCSIJfSIsCi0JCSJ9IiwKLQkJIm5ldyBQb2ludCg1NiwgOTkpLngifSksIAotCQkiNTYiLnRvQ2hhckFycmF5KCkpOwotfQotLyoqCi0gKiBUZXN0cyB0aGUgZnJlZSByZXR1cm4gYWRkaXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgY29kZSBzbmlwcGV0Ci0gKiBmb3IgYW4gZXhwcmVzc2lvbi4KLSAqLwotcHVibGljIHZvaWQgdGVzdEZyZWVSZXR1cm5FeHByZXNzaW9uKCkgewotCWV2YWx1YXRlV2l0aEV4cGVjdGVkRGlzcGxheVN0cmluZygiKDEgKyAyKSAqIDMuMCAvIDQiLnRvQ2hhckFycmF5KCksICIyLjI1Ii50b0NoYXJBcnJheSgpKTsKLX0KLS8qKgotICogVGVzdHMgdGhlIGZyZWUgcmV0dXJuIGFkZGl0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGNvZGUgc25pcHBldAotICogZm9yIGFuIGludGVnZXIuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RGcmVlUmV0dXJuSW50ZWdlcigpIHsKLQlldmFsdWF0ZVdpdGhFeHBlY3RlZERpc3BsYXlTdHJpbmcoIjEiLnRvQ2hhckFycmF5KCksICIxIi50b0NoYXJBcnJheSgpKTsKLX0KLS8qKgotICogVGVzdHMgdGhlIGZyZWUgcmV0dXJuIGFkZGl0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGNvZGUgc25pcHBldAotICogZm9yIGEgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24gZm9sbG93ZWQgYnkgYW4gZXhwcmVzc2lvbi4KLSAqLwotcHVibGljIHZvaWQgdGVzdEZyZWVSZXR1cm5Mb2NhbFZhcigpIHsKLQlldmFsdWF0ZVdpdGhFeHBlY3RlZERpc3BsYXlTdHJpbmcoYnVpbGRDaGFyQXJyYXkobmV3IFN0cmluZ1tdIHsKLQkJImludCBpID0gOTk7IiwKLQkJImkgKyA0In0pLCAKLQkJIjEwMyIudG9DaGFyQXJyYXkoKSk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoZSBmcmVlIHJldHVybiBhZGRpdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBjb2RlIHNuaXBwZXQKLSAqIGZvciBhIHN0YXRlbWVudCBmb2xsb3dlZCBieSBhbiBleHByZXNzaW9uLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0RnJlZVJldHVyblN0YXRlbWVudCgpIHsKLQlldmFsdWF0ZVdpdGhFeHBlY3RlZERpc3BsYXlTdHJpbmcoYnVpbGRDaGFyQXJyYXkobmV3IFN0cmluZ1tdIHsKLQkJImludCBpID0gMjsiLAotCQkiZm9yIChpbnQgaj0wO2o8MTA7aisrKSB7IiwKLQkJIglpKys7IiwKLQkJIn0iLAotCQkiaSJ9KSwgCi0JCSIxMiIudG9DaGFyQXJyYXkoKSk7Ci19Ci0vKioKLSAqIFRlc3RzIGNvZGUgc25pcHBldCB0aGF0IGluY2x1ZGUgYSBwYWNrYWdlIGltcG9ydC4KLSAqLwotcHVibGljIHZvaWQgdGVzdEltcG9ydFBhY2thZ2UoKSB7Ci0JdHJ5IHsKLQkJY29udGV4dC5zZXRJbXBvcnRzKG5ldyBjaGFyW11bXSB7ImphdmEuaW8uKiIudG9DaGFyQXJyYXkoKX0pOwotCQlldmFsdWF0ZVdpdGhFeHBlY3RlZERpc3BsYXlTdHJpbmcoInJldHVybiBuZXcgRmlsZShcIiFAIyVcIikuZXhpc3RzKCk7Ii50b0NoYXJBcnJheSgpLCAiZmFsc2UiLnRvQ2hhckFycmF5KCkpOwotCX0gZmluYWxseSB7Ci0JCS8vIGNsZWFuIHVwCi0JCWNvbnRleHQuc2V0SW1wb3J0cyhuZXcgY2hhclswXVtdKTsKLQl9Ci19Ci0vKioKLSAqIFRlc3RzIGNvZGUgc25pcHBldCB0aGF0IGluY2x1ZGUgYSB0eXBlIGltcG9ydC4KLSAqLwotcHVibGljIHZvaWQgdGVzdEltcG9ydFR5cGUoKSB7Ci0JdHJ5IHsKLQkJY29udGV4dC5zZXRJbXBvcnRzKG5ldyBjaGFyW11bXSB7ImphdmEubWF0aC5CaWdJbnRlZ2VyIi50b0NoYXJBcnJheSgpfSk7Ci0JCWV2YWx1YXRlV2l0aEV4cGVjdGVkRGlzcGxheVN0cmluZygicmV0dXJuIG5ldyBCaWdJbnRlZ2VyKFwiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwXCIpOyIudG9DaGFyQXJyYXkoKSwgIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIudG9DaGFyQXJyYXkoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJLy8gY2xlYW4gdXAKLQkJY29udGV4dC5zZXRJbXBvcnRzKG5ldyBjaGFyWzBdW10pOwotCX0KLX0KLS8qKgotICogVGVzdHMgY29kZSBzbmlwcGV0IHRoYXQgaW5jbHVkZSBhIHR5cGUgaW1wb3J0IGFuZCBhIHBhY2thZ2UgaW1wb3J0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0SW1wb3J0VHlwZUFuZFBhY2thZ2UoKSB7Ci0JdHJ5IHsKLQkJY29udGV4dC5zZXRJbXBvcnRzKG5ldyBjaGFyW11bXSB7ImphdmEudXRpbC5FbnVtZXJhdGlvbiIudG9DaGFyQXJyYXkoKSwgImphdmEubGFuZy5yZWZsZWN0LioiLnRvQ2hhckFycmF5KCl9KTsKLQkJZXZhbHVhdGVXaXRoRXhwZWN0ZWREaXNwbGF5U3RyaW5nKCJGaWVsZFtdIGZpZWxkcyA9IEVudW1lcmF0aW9uLmNsYXNzLmdldERlY2xhcmVkRmllbGRzKCk7IHJldHVybiBmaWVsZHMubGVuZ3RoOyIudG9DaGFyQXJyYXkoKSwgIjAiLnRvQ2hhckFycmF5KCkpOwotCX0gZmluYWxseSB7Ci0JCS8vIGNsZWFuIHVwCi0JCWNvbnRleHQuc2V0SW1wb3J0cyhuZXcgY2hhclswXVtdKTsKLQl9Ci19Ci0vKioKLSAqIFRlc3RzIGNvZGUgc25pcHBldCB0aGF0IGluY2x1ZGUgYW4gYW5vbnltb3VzIGlubmVyIGNsYXNzLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0SW5uZXJDbGFzc0Fub255bW91cygpIHsKLQlldmFsdWF0ZVdpdGhFeHBlY3RlZERpc3BsYXlTdHJpbmcoYnVpbGRDaGFyQXJyYXkobmV3IFN0cmluZ1tdIHsKLQkJInJldHVybiBuZXcgT2JqZWN0KCkgeyIsCi0JCSIJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsiLAotCQkiCQlyZXR1cm4gXCJhbiBpbm5lciBjbGFzc1wiOyIsCi0JCSIJfSIsCi0JCSJ9OyJ9KSwKLQkJImFuIGlubmVyIGNsYXNzIi50b0NoYXJBcnJheSgpKTsKLX0KLS8qKgotICogVGVzdHMgY29kZSBzbmlwcGV0IHRoYXQgaW5jbHVkZSBhIG5hbWVkIGlubmVyIGNsYXNzLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0SW5uZXJDbGFzc05hbWVkKCkgewotCWV2YWx1YXRlV2l0aEV4cGVjdGVkRGlzcGxheVN0cmluZyhidWlsZENoYXJBcnJheShuZXcgU3RyaW5nW10gewotCQkiY2xhc3MgWCB7IiwKLQkJIglpbnQgZm9vID0gMTsiLAotCQkifSIsCi0JCSJyZXR1cm4gbmV3IFgoKS5mb287In0pLCAKLQkJIjEiLnRvQ2hhckFycmF5KCkpOwotfQotLyoqCi0gKiBUZXN0cyBjb2RlIHNuaXBwZXQgdGhhdCBpbmNsdWRlIGEgcGFja2FnZSBkZWNsYXJhdGlvbi4KLSAqLwotcHVibGljIHZvaWQgdGVzdFBhY2thZ2UoKSB7Ci0JLy8gVEJEOiBUZXN0IGFjY2VzcyB0byBwYWNrYWdlIHByaXZhdGUgbWVtYmVyCi0JLy8gVEJEOiBUZXN0IGFjY2VzcyB0byBwYWNrYWdlIGNsYXNzIGFuZCBtZW1iZXJzIGluIGFub290aGVyIHBhY2thZ2UgdGhhbiBhIGphdmEuKiBwYWNrYWdlCi0JdHJ5IHsKLQkJLy8gZGVjbGFyZSB0aGF0IHRoZSBjb2RlIHNuaXBwZXQgaXMgcnVuIGluIGphdmEudXRpbC56aXAgYW5kIGFjY2VzcyBhIHBhY2thZ2UgcHJpdmF0ZSBjbGFzcwotCQljb250ZXh0LnNldFBhY2thZ2VOYW1lKCJqYXZhLnV0aWwuemlwIi50b0NoYXJBcnJheSgpKTsKLQkJZXZhbHVhdGVXaXRoRXhwZWN0ZWREaXNwbGF5U3RyaW5nKCJyZXR1cm4gWmlwQ29uc3RhbnRzLkxPQ1NJRzsiLnRvQ2hhckFycmF5KCksICI2NzMyNDc1MiIudG9DaGFyQXJyYXkoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJLy8gY2xlYW4gdXAKLQkJY29udGV4dC5zZXRQYWNrYWdlTmFtZShuZXcgY2hhclswXSk7Ci0JfQotfQotLyoqCi0gKiBUZXN0cyB0aGUgcmV0dXJuIHZhbHVlIGRpc3BsYXkgc3RyaW5ncyBmb3IgYSBib29sZWFuLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmV0dXJuRGlzcGxheVN0cmluZ0Jvb2xlYW4oKSB7Ci0JZXZhbHVhdGVXaXRoRXhwZWN0ZWREaXNwbGF5U3RyaW5nKCJyZXR1cm4gdHJ1ZTsiLnRvQ2hhckFycmF5KCksICJ0cnVlIi50b0NoYXJBcnJheSgpKTsKLX0KLS8qKgotICogVGVzdHMgdGhlIHJldHVybiB2YWx1ZSBkaXNwbGF5IHN0cmluZ3MgZm9yIGEgY2hhcmFjdGVyLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmV0dXJuRGlzcGxheVN0cmluZ0NoYXJhY3RlcigpIHsKLQlldmFsdWF0ZVdpdGhFeHBlY3RlZERpc3BsYXlTdHJpbmcoInJldHVybiAnYyc7Ii50b0NoYXJBcnJheSgpLCAiYyIudG9DaGFyQXJyYXkoKSk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoZSByZXR1cm4gdmFsdWUgZGlzcGxheSBzdHJpbmdzIGZvciBhIGRvdWJsZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJldHVybkRpc3BsYXlTdHJpbmdEb3VibGUoKSB7Ci0JZXZhbHVhdGVXaXRoRXhwZWN0ZWREaXNwbGF5U3RyaW5nKCJyZXR1cm4gMS4wOyIudG9DaGFyQXJyYXkoKSwgIjEuMCIudG9DaGFyQXJyYXkoKSk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoZSByZXR1cm4gdmFsdWUgZGlzcGxheSBzdHJpbmdzIGZvciBubyBleHBsaWNpdCByZXR1cm5lZCB2YWx1ZQotICogYmVjYXVzZSBvZiBhbiBlbXB0eSBjb2RlIHNuaXBwZXQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXR1cm5EaXNwbGF5U3RyaW5nRW1wdHlDb2RlU25pcHBldCgpIHsKLQlldmFsdWF0ZVdpdGhFeHBlY3RlZERpc3BsYXlTdHJpbmcobmV3IGNoYXJbMF0sIG51bGwpOwotfQotLyoqCi0gKiBUZXN0cyB0aGUgcmV0dXJuIHZhbHVlIGRpc3BsYXkgc3RyaW5ncyBmb3IgYSBmbG9hdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJldHVybkRpc3BsYXlTdHJpbmdGbG9hdCgpIHsKLQlldmFsdWF0ZVdpdGhFeHBlY3RlZERpc3BsYXlTdHJpbmcoInJldHVybiAoZmxvYXQpMS4wOyIudG9DaGFyQXJyYXkoKSwgIjEuMCIudG9DaGFyQXJyYXkoKSk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoZSByZXR1cm4gdmFsdWUgZGlzcGxheSBzdHJpbmdzIGZvciBhbiBpbnRlZ2VyLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmV0dXJuRGlzcGxheVN0cmluZ0ludGVnZXIoKSB7Ci0JZXZhbHVhdGVXaXRoRXhwZWN0ZWREaXNwbGF5U3RyaW5nKCJyZXR1cm4gMTsiLnRvQ2hhckFycmF5KCksICIxIi50b0NoYXJBcnJheSgpKTsKLX0KLS8qKgotICogVGVzdHMgdGhlIHJldHVybiB2YWx1ZSBkaXNwbGF5IHN0cmluZ3MgZm9yIGEgbG9uZy4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJldHVybkRpc3BsYXlTdHJpbmdMb25nKCkgewotCWV2YWx1YXRlV2l0aEV4cGVjdGVkRGlzcGxheVN0cmluZygicmV0dXJuIChsb25nKTE7Ii50b0NoYXJBcnJheSgpLCAiMSIudG9DaGFyQXJyYXkoKSk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoZSByZXR1cm4gdmFsdWUgZGlzcGxheSBzdHJpbmdzIGZvciBhIGNvZGUgc25pcHBldAotICogd2l0aCBubyBleHBsaWNpdCByZXR1cm5lZCB2YWx1ZSAoaW1wbGljaXRseSB0aGUgbGFzdCBleHByZXNzaW9uIGlzCi0gKiB3cmFwcGVkIGluc2lkZSBhIHJldHVybiBzdGF0ZW1lbnQpLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmV0dXJuRGlzcGxheVN0cmluZ05vRXhwbGljaXRSZXR1cm5lZFZhbHVlKCkgewotCWV2YWx1YXRlV2l0aEV4cGVjdGVkRGlzcGxheVN0cmluZygibmV3IFN0cmluZyhcImhlbGxvXCIudG9DaGFyQXJyYXkoKSk7Ii50b0NoYXJBcnJheSgpLCAiaGVsbG8iLnRvQ2hhckFycmF5KCkpOwotfQotLyoqCi0gKiBUZXN0cyB0aGUgcmV0dXJuIHZhbHVlIGRpc3BsYXkgc3RyaW5ncyBmb3IgYW4gb2JqZWN0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmV0dXJuRGlzcGxheVN0cmluZ09iamVjdCgpIHsKLQlldmFsdWF0ZVdpdGhFeHBlY3RlZERpc3BsYXlTdHJpbmcoYnVpbGRDaGFyQXJyYXkobmV3IFN0cmluZ1tdIHsKLQkJInJldHVybiBuZXcgT2JqZWN0KCkgeyIsCi0JCSIJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsiLAotCQkiCQlyZXR1cm4gXCJhbiBvYmplY3RcIjsiLAotCQkiCX0iLAotCQkifTsifSksIAotCQkiYW4gb2JqZWN0Ii50b0NoYXJBcnJheSgpKTsKLX0KLS8qKgotICogVGVzdHMgdGhlIHJldHVybiB2YWx1ZSBkaXNwbGF5IHN0cmluZ3MgZm9yIGEgc2hvcnQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXR1cm5EaXNwbGF5U3RyaW5nU2hvcnQoKSB7Ci0JZXZhbHVhdGVXaXRoRXhwZWN0ZWREaXNwbGF5U3RyaW5nKCJyZXR1cm4gKHNob3J0KTE7Ii50b0NoYXJBcnJheSgpLCAiMSIudG9DaGFyQXJyYXkoKSk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoZSByZXR1cm4gdmFsdWUgZGlzcGxheSBzdHJpbmdzIGZvciBhIFN0cmluZy4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJldHVybkRpc3BsYXlTdHJpbmdTdHJpbmcoKSB7Ci0JZXZhbHVhdGVXaXRoRXhwZWN0ZWREaXNwbGF5U3RyaW5nKCJyZXR1cm4gXCJoZWxsb1wiOyIudG9DaGFyQXJyYXkoKSwgImhlbGxvIi50b0NoYXJBcnJheSgpKTsKLX0KLS8qKgotICogVGVzdHMgdGhlIHJldHVybiB2YWx1ZSBkaXNwbGF5IHN0cmluZ3MgZm9yIGEgY29kZSBzbmlwcGV0Ci0gKiB3aXRoIGEgdm9pZCByZXR1cm5lZCB2YWx1ZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJldHVybkRpc3BsYXlTdHJpbmdWb2lkKCkgewotCWV2YWx1YXRlV2l0aEV4cGVjdGVkRGlzcGxheVN0cmluZygibmV3IFRocmVhZCgpLnN0YXJ0KCkiLnRvQ2hhckFycmF5KCksIG51bGwpOwotfQotLyoqCi0gKiBUZXN0cyB0aGUgcmV0dXJuIHR5cGUgZm9yIGEgYm9vbGVhbi4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJldHVyblR5cGVCb29sZWFuKCkgewotCWV2YWx1YXRlV2l0aEV4cGVjdGVkVHlwZSgicmV0dXJuIHRydWU7Ii50b0NoYXJBcnJheSgpLCAiYm9vbGVhbiIudG9DaGFyQXJyYXkoKSk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoZSByZXR1cm4gdHlwZSBmb3IgYSBib29sZWFuIGFycmF5LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmV0dXJuVHlwZUJvb2xlYW5BcnJheSgpIHsKLQlldmFsdWF0ZVdpdGhFeHBlY3RlZFR5cGUoInJldHVybiBuZXcgYm9vbGVhbltdIHt0cnVlfTsiLnRvQ2hhckFycmF5KCksICJbWiIudG9DaGFyQXJyYXkoKSk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoZSByZXR1cm4gdHlwZSBmb3IgYSBCb29sZWFuIG9iamVjdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJldHVyblR5cGVCb29sZWFuT2JqZWN0KCkgewotCWV2YWx1YXRlV2l0aEV4cGVjdGVkVHlwZSgicmV0dXJuIG5ldyBCb29sZWFuKHRydWUpOyIudG9DaGFyQXJyYXkoKSwgImphdmEubGFuZy5Cb29sZWFuIi50b0NoYXJBcnJheSgpKTsKLX0KLS8qKgotICogVGVzdHMgdGhlIHJldHVybiB0eXBlIGZvciBhIGNoYXIuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXR1cm5UeXBlQ2hhcigpIHsKLQlldmFsdWF0ZVdpdGhFeHBlY3RlZFR5cGUoInJldHVybiAnYyc7Ii50b0NoYXJBcnJheSgpLCAiY2hhciIudG9DaGFyQXJyYXkoKSk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoZSByZXR1cm4gdHlwZSBmb3IgYSBDaGFyYWN0ZXIgb2JqZWN0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmV0dXJuVHlwZUNoYXJhY3Rlck9iamVjdCgpIHsKLQlldmFsdWF0ZVdpdGhFeHBlY3RlZFR5cGUoInJldHVybiBuZXcgQ2hhcmFjdGVyKCdjJyk7Ii50b0NoYXJBcnJheSgpLCAiamF2YS5sYW5nLkNoYXJhY3RlciIudG9DaGFyQXJyYXkoKSk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoZSByZXR1cm4gdHlwZSBmb3IgYSBjaGFyIGFycmF5LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmV0dXJuVHlwZUNoYXJBcnJheSgpIHsKLQlldmFsdWF0ZVdpdGhFeHBlY3RlZFR5cGUoInJldHVybiBuZXcgY2hhcltdIHsnYyd9OyIudG9DaGFyQXJyYXkoKSwgIltDIi50b0NoYXJBcnJheSgpKTsKLX0KLS8qKgotICogVGVzdHMgdGhlIHJldHVybiB0eXBlIGZvciBhIGRvdWJsZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJldHVyblR5cGVEb3VibGUoKSB7Ci0JZXZhbHVhdGVXaXRoRXhwZWN0ZWRUeXBlKCJyZXR1cm4gMS4wOyIudG9DaGFyQXJyYXkoKSwgImRvdWJsZSIudG9DaGFyQXJyYXkoKSk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoZSByZXR1cm4gdHlwZSBmb3IgYSBkb3VibGUgYXJyYXkuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXR1cm5UeXBlRG91YmxlQXJyYXkoKSB7Ci0JZXZhbHVhdGVXaXRoRXhwZWN0ZWRUeXBlKCJyZXR1cm4gbmV3IGRvdWJsZVtdIHsxLjB9OyIudG9DaGFyQXJyYXkoKSwgIltEIi50b0NoYXJBcnJheSgpKTsKLX0KLS8qKgotICogVGVzdHMgdGhlIHJldHVybiB0eXBlIGZvciBhIERvdWJsZSBvYmplY3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXR1cm5UeXBlRG91YmxlT2JqZWN0KCkgewotCWV2YWx1YXRlV2l0aEV4cGVjdGVkVHlwZSgicmV0dXJuIG5ldyBEb3VibGUoMS4wKTsiLnRvQ2hhckFycmF5KCksICJqYXZhLmxhbmcuRG91YmxlIi50b0NoYXJBcnJheSgpKTsKLX0KLS8qKgotICogVGVzdHMgdGhlIHJldHVybiB0eXBlIGZvciBhbiBlbXB0eSBjb2RlIHNuaXBwZXQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXR1cm5UeXBlRW1wdHlDb2RlU25pcHBldCgpIHsKLQlldmFsdWF0ZVdpdGhFeHBlY3RlZFR5cGUobmV3IGNoYXJbMF0sIG51bGwpOwotfQotLyoqCi0gKiBUZXN0cyB0aGUgcmV0dXJuIHR5cGUgZm9yIGEgZmxvYXQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXR1cm5UeXBlRmxvYXQoKSB7Ci0JZXZhbHVhdGVXaXRoRXhwZWN0ZWRUeXBlKCJyZXR1cm4gKGZsb2F0KTEuMDsiLnRvQ2hhckFycmF5KCksICJmbG9hdCIudG9DaGFyQXJyYXkoKSk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoZSByZXR1cm4gdHlwZSBmb3IgYSBmbG9hdCBhcnJheS4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJldHVyblR5cGVGbG9hdEFycmF5KCkgewotCWV2YWx1YXRlV2l0aEV4cGVjdGVkVHlwZSgicmV0dXJuIG5ldyBmbG9hdFtdIHsoZmxvYXQpMS4wfTsiLnRvQ2hhckFycmF5KCksICJbRiIudG9DaGFyQXJyYXkoKSk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoZSByZXR1cm4gdHlwZSBmb3IgYSBGbG9hdCBvYmplY3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXR1cm5UeXBlRmxvYXRPYmplY3QoKSB7Ci0JZXZhbHVhdGVXaXRoRXhwZWN0ZWRUeXBlKCJyZXR1cm4gbmV3IEZsb2F0KDEuMCk7Ii50b0NoYXJBcnJheSgpLCAiamF2YS5sYW5nLkZsb2F0Ii50b0NoYXJBcnJheSgpKTsKLX0KLS8qKgotICogVGVzdHMgdGhlIHJldHVybiB0eXBlIGZvciBhbiBpbnQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXR1cm5UeXBlSW50KCkgewotCWV2YWx1YXRlV2l0aEV4cGVjdGVkVHlwZSgicmV0dXJuIDE7Ii50b0NoYXJBcnJheSgpLCAiaW50Ii50b0NoYXJBcnJheSgpKTsKLX0KLS8qKgotICogVGVzdHMgdGhlIHJldHVybiB0eXBlIGZvciBhbiBJbnRlZ2VyIG9iamVjdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJldHVyblR5cGVJbnRlZ2VyT2JqZWN0KCkgewotCWV2YWx1YXRlV2l0aEV4cGVjdGVkVHlwZSgicmV0dXJuIG5ldyBJbnRlZ2VyKDEpOyIudG9DaGFyQXJyYXkoKSwgImphdmEubGFuZy5JbnRlZ2VyIi50b0NoYXJBcnJheSgpKTsKLX0KLS8qKgotICogVGVzdHMgdGhlIHJldHVybiB0eXBlIGZvciBhIGxvbmcuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXR1cm5UeXBlTG9uZygpIHsKLQlldmFsdWF0ZVdpdGhFeHBlY3RlZFR5cGUoInJldHVybiAobG9uZykxOyIudG9DaGFyQXJyYXkoKSwgImxvbmciLnRvQ2hhckFycmF5KCkpOwotfQotLyoqCi0gKiBUZXN0cyB0aGUgcmV0dXJuIHR5cGUgZm9yIGEgbG9uZyBhcnJheS4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJldHVyblR5cGVMb25nQXJyYXkoKSB7Ci0JZXZhbHVhdGVXaXRoRXhwZWN0ZWRUeXBlKCJyZXR1cm4gbmV3IGxvbmdbXSB7KGxvbmcpMX07Ii50b0NoYXJBcnJheSgpLCAiW0oiLnRvQ2hhckFycmF5KCkpOwotfQotLyoqCi0gKiBUZXN0cyB0aGUgcmV0dXJuIHR5cGUgZm9yIGEgTG9uZyBvYmplY3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXR1cm5UeXBlTG9uZ09iamVjdCgpIHsKLQlldmFsdWF0ZVdpdGhFeHBlY3RlZFR5cGUoInJldHVybiBuZXcgTG9uZygxKTsiLnRvQ2hhckFycmF5KCksICJqYXZhLmxhbmcuTG9uZyIudG9DaGFyQXJyYXkoKSk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoZSByZXR1cm4gdHlwZSBmb3Igbm8gZXhwbGljaXQgcmV0dXJuZWQgdmFsdWUuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXR1cm5UeXBlTm9FeHBsaWNpdFJldHVybmVkVmFsdWUoKSB7Ci0JZXZhbHVhdGVXaXRoRXhwZWN0ZWRUeXBlKCJuZXcgT2JqZWN0KCk7Ii50b0NoYXJBcnJheSgpLCAiamF2YS5sYW5nLk9iamVjdCIudG9DaGFyQXJyYXkoKSk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoZSByZXR1cm4gdHlwZSBmb3IgYW4gT2JqZWN0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmV0dXJuVHlwZU9iamVjdCgpIHsKLQlldmFsdWF0ZVdpdGhFeHBlY3RlZFR5cGUoInJldHVybiBuZXcgT2JqZWN0KCk7Ii50b0NoYXJBcnJheSgpLCAiamF2YS5sYW5nLk9iamVjdCIudG9DaGFyQXJyYXkoKSk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoZSByZXR1cm4gdHlwZSBmb3IgYW4gT2JqZWN0IGFycmF5LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmV0dXJuVHlwZU9iamVjdEFycmF5KCkgewotCWV2YWx1YXRlV2l0aEV4cGVjdGVkVHlwZSgicmV0dXJuIG5ldyBPYmplY3RbXSB7bmV3IE9iamVjdCgpfTsiLnRvQ2hhckFycmF5KCksICJbTGphdmEubGFuZy5PYmplY3Q7Ii50b0NoYXJBcnJheSgpKTsKLX0KLS8qKgotICogVGVzdHMgdGhlIHJldHVybiB0eXBlIGZvciBhIHNob3J0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmV0dXJuVHlwZVNob3J0KCkgewotCWV2YWx1YXRlV2l0aEV4cGVjdGVkVHlwZSgicmV0dXJuIChzaG9ydCkxOyIudG9DaGFyQXJyYXkoKSwgInNob3J0Ii50b0NoYXJBcnJheSgpKTsKLX0KLS8qKgotICogVGVzdHMgdGhlIHJldHVybiB0eXBlIGZvciBhIHNob3J0IGFycmF5LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmV0dXJuVHlwZVNob3J0QXJyYXkoKSB7Ci0JZXZhbHVhdGVXaXRoRXhwZWN0ZWRUeXBlKCJyZXR1cm4gbmV3IHNob3J0W10geyhzaG9ydCkxfTsiLnRvQ2hhckFycmF5KCksICJbUyIudG9DaGFyQXJyYXkoKSk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoZSByZXR1cm4gdHlwZSBmb3IgYSBTaG9ydCBvYmplY3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXR1cm5UeXBlU2hvcnRPYmplY3QoKSB7Ci0JZXZhbHVhdGVXaXRoRXhwZWN0ZWRUeXBlKCJyZXR1cm4gbmV3IFNob3J0KChzaG9ydCkxKTsiLnRvQ2hhckFycmF5KCksICJqYXZhLmxhbmcuU2hvcnQiLnRvQ2hhckFycmF5KCkpOwotfQotLyoqCi0gKiBUZXN0cyB0aGUgcmV0dXJuIHR5cGUgZm9yIGFuIGludCBhcnJheS4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJldHVyblR5cGVzSW50QXJyYXkoKSB7Ci0JZXZhbHVhdGVXaXRoRXhwZWN0ZWRUeXBlKCJyZXR1cm4gbmV3IGludFtdIHsxfTsiLnRvQ2hhckFycmF5KCksICJbSSIudG9DaGFyQXJyYXkoKSk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoZSByZXR1cm4gdHlwZSBmb3IgYSBTdHJpbmcuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXR1cm5UeXBlU3RyaW5nKCkgewotCWV2YWx1YXRlV2l0aEV4cGVjdGVkVHlwZSgicmV0dXJuIFwiaGVsbG9cIjsiLnRvQ2hhckFycmF5KCksICJqYXZhLmxhbmcuU3RyaW5nIi50b0NoYXJBcnJheSgpKTsKLX0KLS8qKgotICogVGVzdHMgdGhlIHJldHVybiB0eXBlIGZvciBhIFN0cmluZyBhcnJheS4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJldHVyblR5cGVTdHJpbmdBcnJheSgpIHsKLQlldmFsdWF0ZVdpdGhFeHBlY3RlZFR5cGUoInJldHVybiBuZXcgU3RyaW5nW10ge1wiaGVsbG9cIn07Ii50b0NoYXJBcnJheSgpLCAiW0xqYXZhLmxhbmcuU3RyaW5nOyIudG9DaGFyQXJyYXkoKSk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoZSByZXR1cm4gdHlwZSBmb3IgYSB2b2lkIHZhbHVlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmV0dXJuVHlwZVZvaWQoKSB7Ci0JZXZhbHVhdGVXaXRoRXhwZWN0ZWRUeXBlKCJuZXcgVGhyZWFkKCkuc3RhcnQoKSIudG9DaGFyQXJyYXkoKSwgbnVsbCk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoYXQgdGhlIHJ1bigpIG1ldGhvZCBkZWZpbmVkIGluIGFuIGFub255bW91cyBjbGFzcyBkb2Vzbid0IGludGVyZmVyIHdpdGggdGhlCi0gKiBjb2RlIHNuaXBwZXQgc3VwcG9ydCAoc2VlIFBSICMxRzFDMEhSKS4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJ1bk1ldGhvZEluQW5vbnltb3VzKCkgewotCWV2YWx1YXRlV2l0aEV4cGVjdGVkRGlzcGxheVN0cmluZyhidWlsZENoYXJBcnJheShuZXcgU3RyaW5nW10gewotCQkiY2xhc3MgWCB7IiwKLQkJIglwdWJsaWMgaW50IGkgPSAwOyIsCi0JCSIgICBwdWJsaWMgYm9vbGVhbiBmaW5pc2hlZCA9IGZhbHNlOyIsCi0JCSJ9IiwKLQkJImZpbmFsIFggeCA9IG5ldyBYKCk7IiwKLQkJIihuZXcgVGhyZWFkKCkgeyIsCi0JCSIJcHVibGljIHZvaWQgcnVuKCkgeyIsCi0JCSIJCWZvciAoaW50IGk9MDtpPDEwO2krKykgeyIsCi0JCSIJCQl0cnkgeyIsCi0JCSIJCQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zbGVlcCgxMCk7IiwKLQkJIgkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsiLAotCQkiCQkJfSIsCi0JCSIJCQl4LmkrKzsiLAotCQkiCQl9IiwKLQkJIiAgICAgICB4LmZpbmlzaGVkID0gdHJ1ZTsiLAotCQkiCX0iLAotCQkifSkuc3RhcnQoKTsiLAotCQkid2hpbGUgKCF4LmZpbmlzaGVkKSBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNsZWVwKDEwMCk7IiwKLQkJInguaSJ9KSwgCi0JCSIxMCIudG9DaGFyQXJyYXkoKSk7Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZXZhbC9EZWJ1Z0V2YWx1YXRpb25TZXR1cC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2V2YWwvRGVidWdFdmFsdWF0aW9uU2V0dXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIwMzUxZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZXZhbC9EZWJ1Z0V2YWx1YXRpb25TZXR1cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuZXZhbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLnJ1bnRpbWUuTG9jYWxWTUxhdW5jaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLnJ1bnRpbWUuVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLnJ1bnRpbWUuVGFyZ2V0SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLnV0aWwuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYmF0Y2guRmlsZVN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklOYW1lRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWwuRXZhbHVhdGlvbkNvbnRleHQ7Ci0KLWltcG9ydCBjb20uc3VuLmpkaS5WaXJ0dWFsTWFjaGluZTsKLWltcG9ydCBjb20uc3VuLmpkaS5WaXJ0dWFsTWFjaGluZU1hbmFnZXI7Ci1pbXBvcnQgY29tLnN1bi5qZGkuY29ubmVjdC5BdHRhY2hpbmdDb25uZWN0b3I7Ci1pbXBvcnQgY29tLnN1bi5qZGkuY29ubmVjdC5Db25uZWN0b3I7Ci1pbXBvcnQgY29tLnN1bi5qZGkuY29ubmVjdC5JbGxlZ2FsQ29ubmVjdG9yQXJndW1lbnRzRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgRGVidWdFdmFsdWF0aW9uU2V0dXAgZXh0ZW5kcyBFdmFsdWF0aW9uU2V0dXAgewotcHVibGljIERlYnVnRXZhbHVhdGlvblNldHVwKGp1bml0LmZyYW1ld29yay5UZXN0IHRlc3QpIHsKLQlzdXBlcih0ZXN0KTsKLX0KLXByb3RlY3RlZCB2b2lkIGluaXRUZXN0KE9iamVjdCB0ZXN0LCBWaXJ0dWFsTWFjaGluZSBqZGlWTSkgewotCWlmICh0ZXN0IGluc3RhbmNlb2YgRGVidWdFdmFsdWF0aW9uVGVzdCkgewotCQlEZWJ1Z0V2YWx1YXRpb25UZXN0IGV2YWxUZXN0ID0gKERlYnVnRXZhbHVhdGlvblRlc3QpdGVzdDsKLQkJZXZhbFRlc3QuamRpVk0gPSBqZGlWTTsKLQkJcmV0dXJuOwotCX0KLQlpZiAodGVzdCBpbnN0YW5jZW9mIFRlc3RTdWl0ZSkgewotCQlUZXN0U3VpdGUgZXZhbHVhdGlvblRlc3RDbGFzc1N1aXRlID0gKFRlc3RTdWl0ZSkgdGVzdDsKLQkJRW51bWVyYXRpb24gZXZhbHVhdGlvblRlc3RDbGFzc1Rlc3RzID0gZXZhbHVhdGlvblRlc3RDbGFzc1N1aXRlLnRlc3RzKCk7Ci0JCXdoaWxlIChldmFsdWF0aW9uVGVzdENsYXNzVGVzdHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCWluaXRUZXN0KGV2YWx1YXRpb25UZXN0Q2xhc3NUZXN0cy5uZXh0RWxlbWVudCgpLCBqZGlWTSk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQkJCi19Ci1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQkvLyBMYXVuY2ggVk0gaW4gZXZhbHVhdGlvbiBtb2RlCi0JaW50IGRlYnVnUG9ydCA9IFV0aWwubmV4dEF2YWlsYWJsZVBvcnROdW1iZXIoKTsKLQlpbnQgZXZhbFBvcnQgPSBVdGlsLm5leHRBdmFpbGFibGVQb3J0TnVtYmVyKCk7Ci0JTG9jYWxWTUxhdW5jaGVyIGxhdW5jaGVyOwotCXRyeSB7Ci0JCWxhdW5jaGVyID0gTG9jYWxWTUxhdW5jaGVyLmdldExhdW5jaGVyKCk7Ci0JCWxhdW5jaGVyLnNldFZNQXJndW1lbnRzKG5ldyBTdHJpbmdbXSB7Ii12ZXJpZnkifSk7Ci0JCWxhdW5jaGVyLnNldFZNUGF0aCh0aGlzLmpyZVBhdGgpOwotCQlsYXVuY2hlci5zZXRFdmFsUG9ydChldmFsUG9ydCk7Ci0JCWxhdW5jaGVyLnNldEV2YWxUYXJnZXRQYXRoKHRoaXMuZXZhbERpcmVjdG9yeSk7Ci0JCWxhdW5jaGVyLnNldERlYnVnUG9ydChkZWJ1Z1BvcnQpOwotCQl0aGlzLmxhdW5jaGVkVk0gPSBsYXVuY2hlci5sYXVuY2goKTsKLQl9IGNhdGNoIChUYXJnZXRFeGNlcHRpb24gZSkgewotCQl0aHJvdyBuZXcgRXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotCX0KLQotCS8vIFRocmVhZCB0aGF0IHJlYWQgdGhlIHN0b3V0IG9mIHRoZSBWTSBzbyB0aGF0IHRoZSBWTSBkb2Vzbid0IGJsb2NrCi0JdHJ5IHsKLQkJc3RhcnRSZWFkZXIoIlZNJ3Mgc3Rkb3V0IHJlYWRlciIsIHRoaXMubGF1bmNoZWRWTS5nZXRJbnB1dFN0cmVhbSgpLCBTeXN0ZW0ub3V0KTsKLQl9IGNhdGNoIChUYXJnZXRFeGNlcHRpb24gZSkgewotCX0KLQotCS8vIFRocmVhZCB0aGF0IHJlYWQgdGhlIHN0ZXJyIG9mIHRoZSBWTSBzbyB0aGF0IHRoZSBWTSBkb2Vzbid0IGJsb2NrCi0JdHJ5IHsKLQkJc3RhcnRSZWFkZXIoIlZNJ3Mgc3RlcnIgcmVhZGVyIiwgdGhpcy5sYXVuY2hlZFZNLmdldEVycm9yU3RyZWFtKCksIFN5c3RlbS5lcnIpOwotCX0gY2F0Y2ggKFRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JLy8gU3RhcnQgSkRJIGNvbm5lY3Rpb24gKHRyeSAxMCB0aW1lcykKLQlWaXJ0dWFsTWFjaGluZSB2bSA9IG51bGw7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCXRyeSB7Ci0JCQlWaXJ0dWFsTWFjaGluZU1hbmFnZXIgbWFuYWdlciA9IG9yZy5lY2xpcHNlLmpkaS5Cb290c3RyYXAudmlydHVhbE1hY2hpbmVNYW5hZ2VyKCk7Ci0JCQlMaXN0IGNvbm5lY3RvcnMgPSBtYW5hZ2VyLmF0dGFjaGluZ0Nvbm5lY3RvcnMoKTsKLQkJCWlmIChjb25uZWN0b3JzLnNpemUoKSA9PSAwKQotCQkJCWJyZWFrOwotCQkJQXR0YWNoaW5nQ29ubmVjdG9yIGNvbm5lY3RvciA9IChBdHRhY2hpbmdDb25uZWN0b3IpY29ubmVjdG9ycy5nZXQoMCk7Ci0JCQlNYXAgYXJncyA9IGNvbm5lY3Rvci5kZWZhdWx0QXJndW1lbnRzKCk7Ci0JCQkoKENvbm5lY3Rvci5Bcmd1bWVudClhcmdzLmdldCgicG9ydCIpKS5zZXRWYWx1ZShTdHJpbmcudmFsdWVPZihkZWJ1Z1BvcnQpKTsKLQkJCSgoQ29ubmVjdG9yLkFyZ3VtZW50KWFyZ3MuZ2V0KCJob3N0bmFtZSIpKS5zZXRWYWx1ZShsYXVuY2hlci5nZXRUYXJnZXRBZGRyZXNzKCkpOwotCQkJdm0gPSBjb25uZWN0b3IuYXR0YWNoKGFyZ3MpOwotCQkJCi0JCQkvLyB3b3JrYXJvdW5kIHBiIHdpdGggc29tZSBWTXMKLQkJCXZtLnJlc3VtZSgpOwotCQkJCi0JCQlicmVhazsKLQkJfSBjYXRjaCAoSWxsZWdhbENvbm5lY3RvckFyZ3VtZW50c0V4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiR290IGV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXRyeSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgY29udGFjdCB0aGUgVk0gYXQgIiArIGxhdW5jaGVyLmdldFRhcmdldEFkZHJlc3MoKSArICI6IiArIGRlYnVnUG9ydCArICIuIFJldHJ5aW5nLi4uIik7Ci0JCQkJVGhyZWFkLnNsZWVwKDEwMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMikgewotCQkJfQotCQl9Ci0JfQotCWlmICh2bSA9PSBudWxsKSB7Ci0JCWlmICh0aGlzLmxhdW5jaGVkVk0gIT0gbnVsbCkgewotCQkJLy8gSWYgdGhlIFZNIGlzIG5vdCBydW5uaW5nLCBvdXRwdXQgZXJyb3Igc3RyZWFtCi0JCQl0cnkgewotCQkJCWlmICghdGhpcy5sYXVuY2hlZFZNLmlzUnVubmluZygpKSB7Ci0JCQkJCUlucHV0U3RyZWFtIGluID0gdGhpcy5sYXVuY2hlZFZNLmdldEVycm9yU3RyZWFtKCk7Ci0JCQkJCWludCByZWFkOwotCQkJCQlkbyB7Ci0JCQkJCQlyZWFkPSBpbi5yZWFkKCk7Ci0JCQkJCQlpZiAocmVhZCAhPSAtMSkKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50KChjaGFyKSByZWFkKTsKLQkJCQkJfSB3aGlsZSAocmVhZCAhPSAtMSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQotCQkJLy8gU2h1dCBpdCBkb3duCi0JCQl0cnkgewotCQkJCWlmICh0aGlzLnRhcmdldCAhPSBudWxsKSB7Ci0JCQkJCXRoaXMudGFyZ2V0LmRpc2Nvbm5lY3QoKTsgLy8gQ2xvc2UgdGhlIHNvY2tldCBmaXJzdCBzbyB0aGF0IHRoZSBPUyByZXNvdXJjZSBoYXMgYSBjaGFuY2UgdG8gYmUgZnJlZWQuIAotCQkJCX0KLQkJCQlpbnQgcmV0cnkgPSAwOwotCQkJCXdoaWxlIChsYXVuY2hlZFZNLmlzUnVubmluZygpICYmICgrK3JldHJ5IDwgMjApKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAocmV0cnkgKiAxMDApOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGxhdW5jaGVkVk0uaXNSdW5uaW5nKCkpIHsKLQkJCQkJbGF1bmNoZWRWTS5zaHV0RG93bigpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3QgY29udGFjdCB0aGUgVk0iKTsKLQl9Ci0KLQkvLyBDcmVhdGUgY29udGV4dAotCXRoaXMuY29udGV4dCA9IG5ldyBFdmFsdWF0aW9uQ29udGV4dCgpOwotCi0JLy8gQ3JlYXRlIHRhcmdldAotCXRoaXMudGFyZ2V0ID0gbmV3IFRhcmdldEludGVyZmFjZSgpOwotCXRoaXMudGFyZ2V0LmNvbm5lY3QoImxvY2FsaG9zdCIsIGV2YWxQb3J0LCAxMDAwMCk7Ci0KLQkvLyBDcmVhdGUgbmFtZSBlbnZpcm9ubWVudAotCUlOYW1lRW52aXJvbm1lbnQgZW52ID0gbmV3IEZpbGVTeXN0ZW0obmV3IFN0cmluZ1tdIHtVdGlsLmdldEphdmFDbGFzc0xpYigpfSwgbmV3IFN0cmluZ1swXSwgbnVsbCk7Ci0KLQkvLyBJbml0IHdyYXBwZWQgc3VpdGUKLQlpbml0VGVzdChmVGVzdCwgdGhpcy5jb250ZXh0LCB0aGlzLnRhcmdldCwgdGhpcy5sYXVuY2hlZFZNLCBlbnYpOwotCWluaXRUZXN0KGZUZXN0LCB2bSk7Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZXZhbC9EZWJ1Z0V2YWx1YXRpb25UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZXZhbC9EZWJ1Z0V2YWx1YXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMjk2NzguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2V2YWwvRGVidWdFdmFsdWF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmV2YWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5ydW50aW1lLkxvY2FsVk1MYXVuY2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5ydW50aW1lLlRhcmdldEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy51dGlsLlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsLkV2YWx1YXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWwuSW5zdGFsbEV4Y2VwdGlvbjsKLQotaW1wb3J0IGNvbS5zdW4uamRpLlZpcnR1YWxNYWNoaW5lOwotCi1wdWJsaWMgY2xhc3MgRGVidWdFdmFsdWF0aW9uVGVzdCBleHRlbmRzIEV2YWx1YXRpb25UZXN0IHsKLQlWaXJ0dWFsTWFjaGluZSBqZGlWTTsKLQlwdWJsaWMgSkRJU3RhY2tGcmFtZSBqZGlTdGFja0ZyYW1lOwotCWNsYXNzIERlYnVnUmVxdWVzdG9yIGV4dGVuZHMgUmVxdWVzdG9yIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0Q2xhc3NGaWxlcyhvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ2xhc3NGaWxlW10gY2xhc3NGaWxlcywgY2hhcltdIGNvZGVTbmlwcGV0Q2xhc3NOYW1lKSB7Ci0JCQlpZiAoamRpU3RhY2tGcmFtZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmFjY2VwdENsYXNzRmlsZXMoY2xhc3NGaWxlcywgY29kZVNuaXBwZXRDbGFzc05hbWUpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBTZW5kIGJ1dCBkb24ndCBydW4KLQkJCQlzdXBlci5hY2NlcHRDbGFzc0ZpbGVzKGNsYXNzRmlsZXMsIG51bGwpOwotCi0JCQkJLy8gUnVuIGlmIG5lZWRlZAotCQkJCWlmIChjb2RlU25pcHBldENsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGpkaVN0YWNrRnJhbWUucnVuKG5ldyBTdHJpbmcoY29kZVNuaXBwZXRDbGFzc05hbWUpKTsKLQkJCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQkJCVRhcmdldEludGVyZmFjZS5SZXN1bHQgcmVzdWx0ID0gdGFyZ2V0LmdldFJlc3VsdCgpOwotCQkJCQkJaWYgKHJlc3VsdC5kaXNwbGF5U3RyaW5nID09IG51bGwpIHsKLQkJCQkJCQl0aGlzLmFjY2VwdFJlc3VsdChuZXcgRXZhbHVhdGlvblJlc3VsdChudWxsLCBFdmFsdWF0aW9uUmVzdWx0LlRfQ09ERV9TTklQUEVULCBudWxsLCBudWxsKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXRoaXMuYWNjZXB0UmVzdWx0KG5ldyBFdmFsdWF0aW9uUmVzdWx0KG51bGwsIEV2YWx1YXRpb25SZXN1bHQuVF9DT0RFX1NOSVBQRVQsIHJlc3VsdC5kaXNwbGF5U3RyaW5nLCByZXN1bHQudHlwZU5hbWUpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VjY2VzczsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci1wdWJsaWMgRGVidWdFdmFsdWF0aW9uVGVzdChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIHZvaWQgY29tcGlsZUFuZERlcGxveShTdHJpbmcgc291cmNlLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JcmVzZXRFbnYoKTsgLy8gbmVlZGVkIHRvIHJlaW5pdGlhbGl6ZSB0aGUgY2FjaGVzCi0JRmlsZSBkaXJlY3RvcnkgPSBuZXcgRmlsZShTT1VSQ0VfRElSRUNUT1JZKTsKLQlpZiAoIWRpcmVjdG9yeS5leGlzdHMoKSkgewotCQlpZiAoIWRpcmVjdG9yeS5ta2RpcigpKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkIG5vdCBjcmVhdGUgIiArIFNPVVJDRV9ESVJFQ1RPUlkpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCVN0cmluZyBmaWxlTmFtZSA9IFNPVVJDRV9ESVJFQ1RPUlkgKyBGaWxlLnNlcGFyYXRvciArIGNsYXNzTmFtZSArICIuamF2YSI7Ci0JdHJ5IHsKLQkJQnVmZmVyZWRXcml0ZXIgd3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKGZpbGVOYW1lKSk7Ci0JCXdyaXRlci53cml0ZShzb3VyY2UpOwotCQl3cml0ZXIuZmx1c2goKTsKLQkJd3JpdGVyLmNsb3NlKCk7Ci0JfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0JCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCXJldHVybjsKLQl9Ci0JU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlidWZmZXIKLQkJLmFwcGVuZCgiXCIiKQotCQkuYXBwZW5kKGZpbGVOYW1lKQotCQkuYXBwZW5kKCJcIiAtZCBcIiIpCi0JCS5hcHBlbmQoRVZBTF9ESVJFQ1RPUlkgKyBGaWxlLnNlcGFyYXRvciArIExvY2FsVk1MYXVuY2hlci5SRUdVTEFSX0NMQVNTUEFUSF9ESVJFQ1RPUlkpCi0JCS5hcHBlbmQoIlwiIC1ub3dhcm4gLWcgLWNsYXNzcGF0aCBcIiIpCi0JCS5hcHBlbmQoVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKSkKLQkJLmFwcGVuZCgiOyIpCi0JCS5hcHBlbmQoU09VUkNFX0RJUkVDVE9SWSkKLQkJLmFwcGVuZCgiXCIiKTsKLQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYmF0Y2guTWFpbi5jb21waWxlKGJ1ZmZlci50b1N0cmluZygpKTsKLX0KLS8qKgotICogR2VuZXJhdGUgbG9jYWwgdmFyaWFibGUgYXR0cmlidXRlIGZvciB0aGVzZSB0ZXN0cy4KLSAqLwotcHVibGljIE1hcCBnZXRPcHRpb25zKCkgewotCU1hcCBvcHRpb25zID0gc3VwZXIuZ2V0T3B0aW9ucygpOwotCW9wdGlvbnMucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fTG9jYWxWYXJpYWJsZUF0dHJpYnV0ZSwgQ29tcGlsZXJPcHRpb25zLkdFTkVSQVRFKTsKLQlvcHRpb25zLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1ByZXNlcnZlVW51c2VkTG9jYWwsIENvbXBpbGVyT3B0aW9ucy5QUkVTRVJWRSk7Ci0JcmV0dXJuIG9wdGlvbnM7Ci19Ci1wdWJsaWMgdm9pZCByZW1vdmVUZW1wQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgewotCXJlc2V0RW52KCk7IC8vIG5lZWRlZCB0byByZWluaXRpYWxpemUgdGhlIGNhY2hlcwotCUZpbGUgc291cmNlRmlsZSA9IG5ldyBGaWxlKFNPVVJDRV9ESVJFQ1RPUlkgKyBGaWxlLnNlcGFyYXRvciArIGNsYXNzTmFtZSArICIuamF2YSIpOwotCXNvdXJjZUZpbGUuZGVsZXRlKCk7Ci0KLQlGaWxlIGJpbmFyeUZpbGUgPSBuZXcgRmlsZShFVkFMX0RJUkVDVE9SWSArIEZpbGUuc2VwYXJhdG9yICsgTG9jYWxWTUxhdW5jaGVyLlJFR1VMQVJfQ0xBU1NQQVRIX0RJUkVDVE9SWSArIEZpbGUuc2VwYXJhdG9yICsgY2xhc3NOYW1lICsgIi5jbGFzcyIpOwotCi0JYmluYXJ5RmlsZS5kZWxldGUoKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzZXR1cFN1aXRlKENsYXNzIGNsYXp6KSB7Ci0JRXZhbHVhdGlvblNldHVwIGV2YWxTZXR1cCA9IG5ldyBEZWJ1Z0V2YWx1YXRpb25TZXR1cChzdWl0ZShjbGF6eikpOwotCWV2YWxTZXR1cC5qcmVQYXRoID0gSlJFX1BBVEg7Ci0JZXZhbFNldHVwLmV2YWxEaXJlY3RvcnkgPSBFVkFMX0RJUkVDVE9SWTsKLQlyZXR1cm4gZXZhbFNldHVwOwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCXJldHVybiBzZXR1cFN1aXRlKHRlc3RDbGFzcygpKTsKLX0KLS8qcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKENsYXNzIGV2YWx1YXRpb25UZXN0Q2xhc3MpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgRGVidWdFdmFsdWF0aW9uVGVzdCgidGVzdDAyMyIpKTsKLQlyZXR1cm4gc3VpdGU7Ci19Ki8KLS8qKgotICogU2FuaXR5IHRlc3Qgb2YgSUV2YWx1YXRpb25Db250ZXh0LmV2YWx1YXRlKGNoYXJbXSwgY2hhcltdW10sIGNoYXJbXVtdLCBpbnRbXSwgY2hhcltdLCBib29sZWFuLCBib29sZWFuLCBJUnVubmVyLCBJTmFtZUVudmlyb25tZW50LCBDb25maWd1cmFibGVPcHRpb25bXSwgSVJlcXVlc3RvciAsIElQcm9ibGVtRmFjdG9yeSkKLSAqLwotcHVibGljIHZvaWQgdGVzdDAwMSgpIHsKLQlTdHJpbmcgdXNlckNvZGUgPQotCQkiIjsKLQlKRElTdGFja0ZyYW1lIHN0YWNrRnJhbWUgPSBuZXcgSkRJU3RhY2tGcmFtZSgKLQkJdGhpcy5qZGlWTSwgCi0JCXRoaXMsCi0JCXVzZXJDb2RlKTsKLQkKLQlEZWJ1Z1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgRGVidWdSZXF1ZXN0b3IoKTsKLQljaGFyW10gc25pcHBldCA9ICJyZXR1cm4gMTsiLnRvQ2hhckFycmF5KCk7Ci0JdHJ5IHsKLQkJY29udGV4dC5ldmFsdWF0ZSgKLQkJCXNuaXBwZXQsCi0JCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMoKSwKLQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU5hbWVzKCksCi0JCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCXN0YWNrRnJhbWUuZGVjbGFyaW5nVHlwZU5hbWUoKSwKLQkJCXN0YWNrRnJhbWUuaXNTdGF0aWMoKSwKLQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCWdldEVudigpLCAKLQkJCWdldE9wdGlvbnMoKSwgCi0JCQlyZXF1ZXN0b3IsIAotCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JfSBjYXRjaCAoSW5zdGFsbEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiU2hvdWxkIGdldCBvbmUgcmVzdWx0IGJ1dCBnb3QgIiArIHJlcXVlc3Rvci5yZXN1bHRJbmRleCsxLCByZXF1ZXN0b3IucmVzdWx0SW5kZXggPT0gMCk7Ci0JRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSByZXF1ZXN0b3IucmVzdWx0c1swXTsKLQlhc3NlcnRUcnVlKCJDb2RlIHNuaXBwZXQgc2hvdWxkIG5vdCBoYXZlIHByb2JsZW1zIiwgIXJlc3VsdC5oYXNQcm9ibGVtcygpKTsKLQlhc3NlcnRUcnVlKCJSZXN1bHQgc2hvdWxkIGhhdmUgYSB2YWx1ZSIsIHJlc3VsdC5oYXNWYWx1ZSgpKTsKLQlhc3NlcnRFcXVhbHMoIlZhbHVlIiwgIjEiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZURpc3BsYXlTdHJpbmcoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJUeXBlIiwgImludCIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlVHlwZU5hbWUoKSk7Ci19Ci0vKioKLSAqIFJldHVybiAndGhpcycuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDIoKSB7Ci0JdHJ5IHsKLQkJU3RyaW5nIHNvdXJjZUEwMDIgPQotCQkJInB1YmxpYyBjbGFzcyBBMDAyIHtcbiIgKwotCQkJIiAgcHVibGljIGludCBmb28oKSB7XG4iICsKLQkJCSIgICAgcmV0dXJuIDI7XG4iICsKLQkJCSIgIH1cbiIgKwotCQkJIiAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHtcbiIgKwotCQkJIiAgICByZXR1cm4gXCJoZWxsb1wiO1xuIiArCi0JCQkiICB9XG4iICsKLQkJCSJ9IjsKLQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBMDAyLCAiQTAwMiIpOwotCQlTdHJpbmcgdXNlckNvZGUgPQotCQkJIm5ldyBBMDAyKCkuZm9vKCk7IjsKLQkJSkRJU3RhY2tGcmFtZSBzdGFja0ZyYW1lID0gbmV3IEpESVN0YWNrRnJhbWUoCi0JCQl0aGlzLmpkaVZNLCAKLQkJCXRoaXMsCi0JCQl1c2VyQ29kZSwKLQkJCSJBMDAyIiwKLQkJCSJmb28iLAotCQkJLTEpOwotCQlEZWJ1Z1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgRGVidWdSZXF1ZXN0b3IoKTsKLQkJY2hhcltdIHNuaXBwZXQgPSAicmV0dXJuIHRoaXM7Ii50b0NoYXJBcnJheSgpOwotCQl0cnkgewotCQkJY29udGV4dC5ldmFsdWF0ZSgKLQkJCQlzbmlwcGV0LAotCQkJCW51bGwsIC8vIGxvY2FsIHZhciB0eXBlIG5hbWVzCi0JCQkJbnVsbCwgLy8gbG9jYWwgdmFyIG5hbWVzCi0JCQkJbnVsbCwgLy8gbG9jYWwgbW9kaWZpZXJzCi0JCQkJc3RhY2tGcmFtZS5kZWNsYXJpbmdUeXBlTmFtZSgpLAotCQkJCXN0YWNrRnJhbWUuaXNTdGF0aWMoKSwKLQkJCQlzdGFja0ZyYW1lLmlzQ29uc3RydWN0b3JDYWxsKCksCi0JCQkJZ2V0RW52KCksIAotCQkJCWdldE9wdGlvbnMoKSwgCi0JCQkJcmVxdWVzdG9yLCAKLQkJCQlnZXRQcm9ibGVtRmFjdG9yeSgpKTsKLQkJfSBjYXRjaCAoSW5zdGFsbEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKCJObyB0YXJnZXRFeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIGdldCBvbmUgcmVzdWx0IGJ1dCBnb3QgIiArIHJlcXVlc3Rvci5yZXN1bHRJbmRleCsxLCByZXF1ZXN0b3IucmVzdWx0SW5kZXggPT0gMCk7Ci0JCUV2YWx1YXRpb25SZXN1bHQgcmVzdWx0ID0gcmVxdWVzdG9yLnJlc3VsdHNbMF07Ci0JCWFzc2VydFRydWUoIkNvZGUgc25pcHBldCBzaG91bGQgbm90IGhhdmUgcHJvYmxlbXMiLCAhcmVzdWx0Lmhhc1Byb2JsZW1zKCkpOwotCQlhc3NlcnRUcnVlKCJSZXN1bHQgc2hvdWxkIGhhdmUgYSB2YWx1ZSIsIHJlc3VsdC5oYXNWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJWYWx1ZSIsICJoZWxsbyIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlRGlzcGxheVN0cmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUeXBlIiwgIkEwMDIiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZVR5cGVOYW1lKCkpOwotCX0gZmluYWxseSB7Ci0JCXJlbW92ZVRlbXBDbGFzcygiQTAwMiIpOwotCX0KLX0KLS8qKgotICogUmV0dXJuICd0aGlzJy4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwMygpIHsKLQl0cnkgewotCQlTdHJpbmcgc291cmNlQTAwMyA9Ci0JCQkicHVibGljIGNsYXNzIEEwMDMge1xuIiArCi0JCQkiICBwdWJsaWMgaW50IGZvbygpIHtcbiIgKwotCQkJIiAgICByZXR1cm4gMjtcbiIgKwotCQkJIiAgfVxuIiArCi0JCQkiICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkge1xuIiArCi0JCQkiICAgIHJldHVybiBcImhlbGxvXCI7XG4iICsKLQkJCSIgIH1cbiIgKwotCQkJIn0iOwotCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEwMDMsICJBMDAzIik7Ci0JCVN0cmluZyB1c2VyQ29kZSA9Ci0JCQkibmV3IEEwMDMoKS5mb28oKTsiOwotCQlKRElTdGFja0ZyYW1lIHN0YWNrRnJhbWUgPSBuZXcgSkRJU3RhY2tGcmFtZSgKLQkJCXRoaXMuamRpVk0sIAotCQkJdGhpcywKLQkJCXVzZXJDb2RlLAotCQkJIkEwMDMiLAotCQkJImZvbyIsCi0JCQktMSk7Ci0JCURlYnVnUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBEZWJ1Z1JlcXVlc3RvcigpOwotCQljaGFyW10gc25pcHBldCA9ICJyZXR1cm4gdGhpczsiLnRvQ2hhckFycmF5KCk7Ci0JCXRyeSB7Ci0JCQljb250ZXh0LmV2YWx1YXRlKAotCQkJCXNuaXBwZXQsCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCQludWxsLCAvLyBkZWNsYXJpbmcgdHlwZSAtLSBOTyBERUxFR0FURSBUSElTCi0JCQkJc3RhY2tGcmFtZS5pc1N0YXRpYygpLAotCQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCQlnZXRFbnYoKSwgCi0JCQkJZ2V0T3B0aW9ucygpLCAKLQkJCQlyZXF1ZXN0b3IsIAotCQkJCWdldFByb2JsZW1GYWN0b3J5KCkpOwotCQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQkJfQotCQlhc3NlcnRUcnVlKCJTaG91bGQgZ2V0IG9uZSByZXN1bHQgYnV0IGdvdCAiICsgcmVxdWVzdG9yLnJlc3VsdEluZGV4KzEsIHJlcXVlc3Rvci5yZXN1bHRJbmRleCA9PSAwKTsKLQkJRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSByZXF1ZXN0b3IucmVzdWx0c1swXTsKLQkJYXNzZXJ0VHJ1ZSgiQ29kZSBzbmlwcGV0IHNob3VsZCBoYXZlIGEgcHJvYmxlbSIsIHJlc3VsdC5oYXNQcm9ibGVtcygpKTsgLy8gJ3RoaXMnIGNhbm5vdCBiZSByZWZlcmVuY2VkIHNpbmNlIHRoZXJlIGlzIG5vIGRlY2xhcmluZyB0eXBlCi0JCWFzc2VydFRydWUoIlJlc3VsdCBzaG91bGQgbm90IGhhdmUgYSB2YWx1ZSIsICFyZXN1bHQuaGFzVmFsdWUoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJcmVtb3ZlVGVtcENsYXNzKCJBMDAzIik7Ci0JfQotfQotLyoqCi0gKiBSZXR1cm4gJ3RocmVhZCcuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMDQoKSB7Ci0JU3RyaW5nIHVzZXJDb2RlID0KLQkJImphdmEubGFuZy5UaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCgpIHtcbiIgKwotCQkiICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkge1xuIiArCi0JCSIgICAgcmV0dXJuIFwibXkgdGhyZWFkXCI7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9OyI7Ci0JSkRJU3RhY2tGcmFtZSBzdGFja0ZyYW1lID0gbmV3IEpESVN0YWNrRnJhbWUoCi0JCXRoaXMuamRpVk0sIAotCQl0aGlzLAotCQl1c2VyQ29kZSk7Ci0KLQlEZWJ1Z1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgRGVidWdSZXF1ZXN0b3IoKTsKLQljaGFyW10gc25pcHBldCA9ICJyZXR1cm4gdGhyZWFkOyIudG9DaGFyQXJyYXkoKTsKLQl0cnkgewotCQljb250ZXh0LmV2YWx1YXRlKAotCQkJc25pcHBldCwKLQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZVR5cGVOYW1lcygpLAotCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU1vZGlmaWVycygpLAotCQkJc3RhY2tGcmFtZS5kZWNsYXJpbmdUeXBlTmFtZSgpLAotCQkJc3RhY2tGcmFtZS5pc1N0YXRpYygpLAotCQkJc3RhY2tGcmFtZS5pc0NvbnN0cnVjdG9yQ2FsbCgpLAotCQkJZ2V0RW52KCksIAotCQkJZ2V0T3B0aW9ucygpLCAKLQkJCXJlcXVlc3RvciwgCi0JCQlnZXRQcm9ibGVtRmFjdG9yeSgpKTsKLQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0VHJ1ZSgiTm8gdGFyZ2V0RXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCX0KLQlhc3NlcnRUcnVlKCJTaG91bGQgZ2V0IG9uZSByZXN1bHQgYnV0IGdvdCAiICsgcmVxdWVzdG9yLnJlc3VsdEluZGV4KzEsIHJlcXVlc3Rvci5yZXN1bHRJbmRleCA9PSAwKTsKLQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCA9IHJlcXVlc3Rvci5yZXN1bHRzWzBdOwotCWFzc2VydFRydWUoIkNvZGUgc25pcHBldCBzaG91bGQgbm90IGhhdmUgcHJvYmxlbXMiLCAhcmVzdWx0Lmhhc1Byb2JsZW1zKCkpOwotCWFzc2VydFRydWUoIlJlc3VsdCBzaG91bGQgaGF2ZSBhIHZhbHVlIiwgcmVzdWx0Lmhhc1ZhbHVlKCkpOwotCWFzc2VydEVxdWFscygiVmFsdWUiLCAibXkgdGhyZWFkIi50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVEaXNwbGF5U3RyaW5nKCkpOwotCWFzc2VydEVxdWFscygiVHlwZSIsICJqYXZhLmxhbmcuVGhyZWFkIi50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVUeXBlTmFtZSgpKTsKLX0KLS8qKgotICogUmV0dXJuICd4Jy4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwNSgpIHsKLQl0cnkgewotCQlTdHJpbmcgc291cmNlQTAwNSA9Ci0JCQkicHVibGljIGNsYXNzIEEwMDUge1xuIiArCi0JCQkiICBwdWJsaWMgaW50IHggPSAwO1xuIiArCi0JCQkiICBwdWJsaWMgaW50IGZvbygpIHtcbiIgKwotCQkJIiAgICB4Kys7XG4iICsgLy8gd29ya2Fyb3VuZCBwYiB3aXRoIEpESyAxLjQuMSB0aGF0IGRvZXNuJ3Qgc3RvcCBpZiBvbmx5IHJldHVybgotCQkJIiAgICByZXR1cm4geDtcbiIgKwotCQkJIiAgfVxuIiArCi0JCQkifSI7Ci0JCWNvbXBpbGVBbmREZXBsb3koc291cmNlQTAwNSwgIkEwMDUiKTsKLQkJU3RyaW5nIHVzZXJDb2RlID0KLQkJCSJuZXcgQTAwNSgpLmZvbygpOyI7Ci0JCUpESVN0YWNrRnJhbWUgc3RhY2tGcmFtZSA9IG5ldyBKRElTdGFja0ZyYW1lKAotCQkJdGhpcy5qZGlWTSwgCi0JCQl0aGlzLAotCQkJdXNlckNvZGUsCi0JCQkiQTAwNSIsCi0JCQkiZm9vIiwKLQkJCS0xKTsKLQotCQlEZWJ1Z1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgRGVidWdSZXF1ZXN0b3IoKTsKLQkJY2hhcltdIHNuaXBwZXQgPSAicmV0dXJuIHg7Ii50b0NoYXJBcnJheSgpOwotCQl0cnkgewotCQkJY29udGV4dC5ldmFsdWF0ZSgKLQkJCQlzbmlwcGV0LAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZVR5cGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTW9kaWZpZXJzKCksCi0JCQkJc3RhY2tGcmFtZS5kZWNsYXJpbmdUeXBlTmFtZSgpLAotCQkJCXN0YWNrRnJhbWUuaXNTdGF0aWMoKSwKLQkJCQlzdGFja0ZyYW1lLmlzQ29uc3RydWN0b3JDYWxsKCksCi0JCQkJZ2V0RW52KCksIAotCQkJCWdldE9wdGlvbnMoKSwgCi0JCQkJcmVxdWVzdG9yLCAKLQkJCQlnZXRQcm9ibGVtRmFjdG9yeSgpKTsKLQkJfSBjYXRjaCAoSW5zdGFsbEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKCJObyB0YXJnZXRFeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIGdldCBvbmUgcmVzdWx0IGJ1dCBnb3QgIiArIHJlcXVlc3Rvci5yZXN1bHRJbmRleCsxLCByZXF1ZXN0b3IucmVzdWx0SW5kZXggPT0gMCk7Ci0JCUV2YWx1YXRpb25SZXN1bHQgcmVzdWx0ID0gcmVxdWVzdG9yLnJlc3VsdHNbMF07Ci0JCWFzc2VydFRydWUoIkNvZGUgc25pcHBldCBzaG91bGQgbm90IGhhdmUgcHJvYmxlbXMiLCAhcmVzdWx0Lmhhc1Byb2JsZW1zKCkpOwotCQlhc3NlcnRUcnVlKCJSZXN1bHQgc2hvdWxkIGhhdmUgYSB2YWx1ZSIsIHJlc3VsdC5oYXNWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJWYWx1ZSIsICIwIi50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVEaXNwbGF5U3RyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlR5cGUiLCAiaW50Ii50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVUeXBlTmFtZSgpKTsKLQl9IGZpbmFsbHkgewotCQlyZW1vdmVUZW1wQ2xhc3MoIkEwMDUiKTsKLQl9Ci19Ci0vKioKLSAqIFJldHVybiAneCcgKyBuZXcgT2JqZWN0KCl7IGludCBmb28oKXsgcmV0dXJuIDE3OyB9fS5mb28oKTsKLSAqLwotcHVibGljIHZvaWQgdGVzdDAwNigpIHsKLQl0cnkgewotCQlTdHJpbmcgc291cmNlQTAwNiA9Ci0JCQkicHVibGljIGNsYXNzIEEwMDYge1xuIiArCi0JCQkiICBwdWJsaWMgaW50IHggPSAwO1xuIiArCi0JCQkiICBwdWJsaWMgaW50IGZvbygpIHtcbiIgKwotCQkJIiAgICB4Kys7XG4iICsgLy8gd29ya2Fyb3VuZCBwYiB3aXRoIEpESyAxLjQuMSB0aGF0IGRvZXNuJ3Qgc3RvcCBpZiBvbmx5IHJldHVybgotCQkJIiAgICByZXR1cm4geDtcbiIgKwotCQkJIiAgfVxuIiArCi0JCQkifSI7Ci0JCWNvbXBpbGVBbmREZXBsb3koc291cmNlQTAwNiwgIkEwMDYiKTsKLQkJU3RyaW5nIHVzZXJDb2RlID0KLQkJCSJuZXcgQTAwNigpLmZvbygpOyI7Ci0JCUpESVN0YWNrRnJhbWUgc3RhY2tGcmFtZSA9IG5ldyBKRElTdGFja0ZyYW1lKAotCQkJdGhpcy5qZGlWTSwgCi0JCQl0aGlzLAotCQkJdXNlckNvZGUsCi0JCQkiQTAwNiIsCi0JCQkiZm9vIiwKLQkJCS0xKTsKLQotCQlEZWJ1Z1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgRGVidWdSZXF1ZXN0b3IoKTsKLQkJY2hhcltdIHNuaXBwZXQgPSAicmV0dXJuIHggKyBuZXcgT2JqZWN0KCl7IGludCBmb28oKXsgcmV0dXJuIDE3OyB9fS5mb28oKTsiLnRvQ2hhckFycmF5KCk7Ci0JCXRyeSB7Ci0JCQljb250ZXh0LmV2YWx1YXRlKAotCQkJCXNuaXBwZXQsCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCQlzdGFja0ZyYW1lLmRlY2xhcmluZ1R5cGVOYW1lKCksCi0JCQkJc3RhY2tGcmFtZS5pc1N0YXRpYygpLAotCQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCQlnZXRFbnYoKSwgCi0JCQkJZ2V0T3B0aW9ucygpLCAKLQkJCQlyZXF1ZXN0b3IsIAotCQkJCWdldFByb2JsZW1GYWN0b3J5KCkpOwotCQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQkJfQotCQlhc3NlcnRUcnVlKCJTaG91bGQgZ2V0IG9uZSByZXN1bHQgYnV0IGdvdCAiICsgcmVxdWVzdG9yLnJlc3VsdEluZGV4KzEsIHJlcXVlc3Rvci5yZXN1bHRJbmRleCA9PSAwKTsKLQkJRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSByZXF1ZXN0b3IucmVzdWx0c1swXTsKLQkJYXNzZXJ0VHJ1ZSgiQ29kZSBzbmlwcGV0IHNob3VsZCBub3QgaGF2ZSBwcm9ibGVtcyIsICFyZXN1bHQuaGFzUHJvYmxlbXMoKSk7Ci0JCWFzc2VydFRydWUoIlJlc3VsdCBzaG91bGQgaGF2ZSBhIHZhbHVlIiwgcmVzdWx0Lmhhc1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlZhbHVlIiwgIjE3Ii50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVEaXNwbGF5U3RyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlR5cGUiLCAiaW50Ii50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVUeXBlTmFtZSgpKTsKLQl9IGZpbmFsbHkgewotCQlyZW1vdmVUZW1wQ2xhc3MoIkEwMDYiKTsKLQl9Ci19Ci0vKioKLSAqIFJldHVybiBhIHN0YXRpYyBmaWVsZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAwNygpIHsKLQl0cnkgewotCQlTdHJpbmcgc291cmNlQTAwNyA9Ci0JCQkicHVibGljIGNsYXNzIEEwMDcge1xuIiArCi0JCQkiICBwdWJsaWMgc3RhdGljIGludCBYID0gMTtcbiIgKwotCQkJIiAgcHVibGljIGludCBmb28oKSB7XG4iICsKLQkJCSIgICAgWCsrO1xuIiArIC8vIHdvcmthcm91bmQgcGIgd2l0aCBKREsgMS40LjEgdGhhdCBkb2Vzbid0IHN0b3AgaWYgb25seSByZXR1cm4KLQkJCSIgICAgcmV0dXJuIFg7XG4iICsKLQkJCSIgIH1cbiIgKwotCQkJIn0iOwotCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEwMDcsICJBMDA3Iik7Ci0JCVN0cmluZyB1c2VyQ29kZSA9Ci0JCQkibmV3IEEwMDcoKS5mb28oKTsiOwotCQlKRElTdGFja0ZyYW1lIHN0YWNrRnJhbWUgPSBuZXcgSkRJU3RhY2tGcmFtZSgKLQkJCXRoaXMuamRpVk0sIAotCQkJdGhpcywKLQkJCXVzZXJDb2RlLAotCQkJIkEwMDciLAotCQkJImZvbyIsCi0JCQktMSk7Ci0KLQkJRGVidWdSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IERlYnVnUmVxdWVzdG9yKCk7Ci0JCWNoYXJbXSBzbmlwcGV0ID0gInJldHVybiBYOyIudG9DaGFyQXJyYXkoKTsKLQkJdHJ5IHsKLQkJCWNvbnRleHQuZXZhbHVhdGUoCi0JCQkJc25pcHBldCwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU1vZGlmaWVycygpLAotCQkJCXN0YWNrRnJhbWUuZGVjbGFyaW5nVHlwZU5hbWUoKSwKLQkJCQlzdGFja0ZyYW1lLmlzU3RhdGljKCksCi0JCQkJc3RhY2tGcmFtZS5pc0NvbnN0cnVjdG9yQ2FsbCgpLAotCQkJCWdldEVudigpLCAKLQkJCQlnZXRPcHRpb25zKCksIAotCQkJCXJlcXVlc3RvciwgCi0JCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgiTm8gdGFyZ2V0RXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCQl9Ci0JCWFzc2VydFRydWUoIlNob3VsZCBnZXQgb25lIHJlc3VsdCBidXQgZ290ICIgKyByZXF1ZXN0b3IucmVzdWx0SW5kZXgrMSwgcmVxdWVzdG9yLnJlc3VsdEluZGV4ID09IDApOwotCQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCA9IHJlcXVlc3Rvci5yZXN1bHRzWzBdOwotCQlhc3NlcnRUcnVlKCJDb2RlIHNuaXBwZXQgc2hvdWxkIG5vdCBoYXZlIHByb2JsZW1zIiwgIXJlc3VsdC5oYXNQcm9ibGVtcygpKTsKLQkJYXNzZXJ0VHJ1ZSgiUmVzdWx0IHNob3VsZCBoYXZlIGEgdmFsdWUiLCByZXN1bHQuaGFzVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiVmFsdWUiLCAiMSIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlRGlzcGxheVN0cmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUeXBlIiwgImludCIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlVHlwZU5hbWUoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJcmVtb3ZlVGVtcENsYXNzKCJBMDA3Iik7Ci0JfQotfQotLyoqCi0gKiBSZXR1cm4geCArIG5ldyBPYmplY3QoKXsgaW50IGZvbyhpbnQgeCl7IHJldHVybiB4OyB9fS5mb28oMTQpOwotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDA4KCkgewotCXRyeSB7Ci0JCVN0cmluZyBzb3VyY2VBMDA4ID0KLQkJCSJwdWJsaWMgY2xhc3MgQTAwOCB7XG4iICsKLQkJCSIgIHB1YmxpYyBpbnQgeCA9IDA7XG4iICsKLQkJCSIgIHB1YmxpYyBpbnQgZm9vKCkge1xuIiArCi0JCQkiICAgIHgrKztcbiIgKyAvLyB3b3JrYXJvdW5kIHBiIHdpdGggSkRLIDEuNC4xIHRoYXQgZG9lc24ndCBzdG9wIGlmIG9ubHkgcmV0dXJuCi0JCQkiICAgIHJldHVybiB4O1xuIiArCi0JCQkiICB9XG4iICsKLQkJCSJ9IjsKLQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBMDA4LCAiQTAwOCIpOwotCQlTdHJpbmcgdXNlckNvZGUgPQotCQkJIm5ldyBBMDA4KCkuZm9vKCk7IjsKLQkJSkRJU3RhY2tGcmFtZSBzdGFja0ZyYW1lID0gbmV3IEpESVN0YWNrRnJhbWUoCi0JCQl0aGlzLmpkaVZNLCAKLQkJCXRoaXMsCi0JCQl1c2VyQ29kZSwKLQkJCSJBMDA4IiwKLQkJCSJmb28iLAotCQkJLTEpOwotCi0JCURlYnVnUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBEZWJ1Z1JlcXVlc3RvcigpOwotCQljaGFyW10gc25pcHBldCA9ICJyZXR1cm4geCArIG5ldyBPYmplY3QoKXsgaW50IGZvbyhpbnQgeCl7IHJldHVybiB4OyB9fS5mb28oMTQpOyIudG9DaGFyQXJyYXkoKTsKLQkJdHJ5IHsKLQkJCWNvbnRleHQuZXZhbHVhdGUoCi0JCQkJc25pcHBldCwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU1vZGlmaWVycygpLAotCQkJCXN0YWNrRnJhbWUuZGVjbGFyaW5nVHlwZU5hbWUoKSwKLQkJCQlzdGFja0ZyYW1lLmlzU3RhdGljKCksCi0JCQkJc3RhY2tGcmFtZS5pc0NvbnN0cnVjdG9yQ2FsbCgpLAotCQkJCWdldEVudigpLCAKLQkJCQlnZXRPcHRpb25zKCksIAotCQkJCXJlcXVlc3RvciwgCi0JCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgiTm8gdGFyZ2V0RXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCQl9Ci0JCWFzc2VydFRydWUoIlNob3VsZCBnZXQgb25lIHJlc3VsdCBidXQgZ290ICIgKyByZXF1ZXN0b3IucmVzdWx0SW5kZXgrMSwgcmVxdWVzdG9yLnJlc3VsdEluZGV4ID09IDApOwotCQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCA9IHJlcXVlc3Rvci5yZXN1bHRzWzBdOwotCQlhc3NlcnRUcnVlKCJDb2RlIHNuaXBwZXQgc2hvdWxkIG5vdCBoYXZlIHByb2JsZW1zIiwgIXJlc3VsdC5oYXNQcm9ibGVtcygpKTsKLQkJYXNzZXJ0VHJ1ZSgiUmVzdWx0IHNob3VsZCBoYXZlIGEgdmFsdWUiLCByZXN1bHQuaGFzVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiVmFsdWUiLCAiMTQiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZURpc3BsYXlTdHJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiVHlwZSIsICJpbnQiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZVR5cGVOYW1lKCkpOwotCX0gZmluYWxseSB7Ci0JCXJlbW92ZVRlbXBDbGFzcygiQTAwOCIpOwotCX0KLX0KLS8qKgotICogRnJlZSByZXR1cm4gb2YgbG9jYWwgdmFyaWFibGUgJ3MnLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDA5KCkgewotCVN0cmluZyB1c2VyQ29kZSA9Ci0JCSJTdHJpbmcgcyA9IFwidGVzdDAwOVwiO1xuIjsKLQlKRElTdGFja0ZyYW1lIHN0YWNrRnJhbWUgPSBuZXcgSkRJU3RhY2tGcmFtZSgKLQkJdGhpcy5qZGlWTSwgCi0JCXRoaXMsCi0JCXVzZXJDb2RlKTsKLQotCURlYnVnUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBEZWJ1Z1JlcXVlc3RvcigpOwotCWNoYXJbXSBzbmlwcGV0ID0gInMiLnRvQ2hhckFycmF5KCk7Ci0JdHJ5IHsKLQkJY29udGV4dC5ldmFsdWF0ZSgKLQkJCXNuaXBwZXQsCi0JCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMoKSwKLQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU5hbWVzKCksCi0JCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCXN0YWNrRnJhbWUuZGVjbGFyaW5nVHlwZU5hbWUoKSwKLQkJCXN0YWNrRnJhbWUuaXNTdGF0aWMoKSwKLQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCWdldEVudigpLCAKLQkJCWdldE9wdGlvbnMoKSwgCi0JCQlyZXF1ZXN0b3IsIAotCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JfSBjYXRjaCAoSW5zdGFsbEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiU2hvdWxkIGdldCBvbmUgcmVzdWx0IGJ1dCBnb3QgIiArIHJlcXVlc3Rvci5yZXN1bHRJbmRleCsxLCByZXF1ZXN0b3IucmVzdWx0SW5kZXggPT0gMCk7Ci0JRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSByZXF1ZXN0b3IucmVzdWx0c1swXTsKLQlhc3NlcnRUcnVlKCJDb2RlIHNuaXBwZXQgc2hvdWxkIG5vdCBoYXZlIHByb2JsZW1zIiwgIXJlc3VsdC5oYXNQcm9ibGVtcygpKTsKLQlhc3NlcnRUcnVlKCJSZXN1bHQgc2hvdWxkIGhhdmUgYSB2YWx1ZSIsIHJlc3VsdC5oYXNWYWx1ZSgpKTsKLQlhc3NlcnRFcXVhbHMoIlZhbHVlIiwgInRlc3QwMDkiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZURpc3BsYXlTdHJpbmcoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJUeXBlIiwgImphdmEubGFuZy5TdHJpbmciLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZVR5cGVOYW1lKCkpOwotfQotLyoqCi0gKiBSZXR1cm4gJ3RoaXMnLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDEwKCkgewotCXRyeSB7Ci0JCVN0cmluZyBzb3VyY2VBMDEwID0KLQkJCSJwdWJsaWMgY2xhc3MgQTAxMCB7XG4iICsKLQkJCSIgIHB1YmxpYyBpbnQgZm9vKCkge1xuIiArCi0JCQkiICAgIG5ldyBPYmplY3QoKS50b1N0cmluZygpO1xuIiArIC8vIHdvcmthcm91bmQgcGIgd2l0aCBKREsgMS40LjEgdGhhdCBkb2Vzbid0IHN0b3AgaWYgb25seSByZXR1cm4KLQkJCSIgICAgcmV0dXJuIC0xO1xuIiArCi0JCQkiICB9XG4iICsKLQkJCSJ9IjsKLQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBMDEwLCAiQTAxMCIpOwotCQlTdHJpbmcgdXNlckNvZGUgPQotCQkJIkEwMTAgYSA9IG5ldyBBMDEwKCkge1xuIiArCi0JCQkiICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkge1xuIiArCi0JCQkiICAgIHJldHVybiBcIm15IG9iamVjdFwiO1xuIiArCi0JCQkiICB9XG4iICsKLQkJCSJ9O1xuIiArCi0JCQkiYS5mb28oKTsiOwotCQlKRElTdGFja0ZyYW1lIHN0YWNrRnJhbWUgPSBuZXcgSkRJU3RhY2tGcmFtZSgKLQkJCXRoaXMuamRpVk0sIAotCQkJdGhpcywKLQkJCXVzZXJDb2RlLAotCQkJIkEwMTAiLAotCQkJImZvbyIsCi0JCQktMSk7Ci0KLQkJRGVidWdSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IERlYnVnUmVxdWVzdG9yKCk7Ci0JCWNoYXJbXSBzbmlwcGV0ID0gInJldHVybiB0aGlzOyIudG9DaGFyQXJyYXkoKTsKLQkJdHJ5IHsKLQkJCWNvbnRleHQuZXZhbHVhdGUoCi0JCQkJc25pcHBldCwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU1vZGlmaWVycygpLAotCQkJCXN0YWNrRnJhbWUuZGVjbGFyaW5nVHlwZU5hbWUoKSwKLQkJCQlzdGFja0ZyYW1lLmlzU3RhdGljKCksCi0JCQkJc3RhY2tGcmFtZS5pc0NvbnN0cnVjdG9yQ2FsbCgpLAotCQkJCWdldEVudigpLCAKLQkJCQlnZXRPcHRpb25zKCksIAotCQkJCXJlcXVlc3RvciwgCi0JCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgiTm8gdGFyZ2V0RXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCQl9Ci0JCWFzc2VydFRydWUoIlNob3VsZCBnZXQgb25lIHJlc3VsdCBidXQgZ290ICIgKyByZXF1ZXN0b3IucmVzdWx0SW5kZXgrMSwgcmVxdWVzdG9yLnJlc3VsdEluZGV4ID09IDApOwotCQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCA9IHJlcXVlc3Rvci5yZXN1bHRzWzBdOwotCQlhc3NlcnRUcnVlKCJDb2RlIHNuaXBwZXQgc2hvdWxkIG5vdCBoYXZlIHByb2JsZW1zIiwgIXJlc3VsdC5oYXNQcm9ibGVtcygpKTsKLQkJYXNzZXJ0VHJ1ZSgiUmVzdWx0IHNob3VsZCBoYXZlIGEgdmFsdWUiLCByZXN1bHQuaGFzVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiVmFsdWUiLCAibXkgb2JqZWN0Ii50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVEaXNwbGF5U3RyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlR5cGUiLCAiQTAxMCIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlVHlwZU5hbWUoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJcmVtb3ZlVGVtcENsYXNzKCJBMDEwIik7Ci0JfQotfQotLyoqCi0gKiBSZXR1cm4gbG9jYWwgdmFyaWFibGUgJ3YnLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDExKCkgewotCVN0cmluZyB1c2VyQ29kZSA9Ci0JCSJTdHJpbmcgcyA9IFwic1wiO1xuIiArCi0JCSJqYXZhLnV0aWwuVmVjdG9yIHYgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpO1xuIiArCi0JCSJ2LmFkZEVsZW1lbnQocyk7XG4iOwotCUpESVN0YWNrRnJhbWUgc3RhY2tGcmFtZSA9IG5ldyBKRElTdGFja0ZyYW1lKAotCQl0aGlzLmpkaVZNLCAKLQkJdGhpcywKLQkJdXNlckNvZGUpOwotCQotCURlYnVnUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBEZWJ1Z1JlcXVlc3RvcigpOwotCWNoYXJbXSBzbmlwcGV0ID0gInJldHVybiB2OyIudG9DaGFyQXJyYXkoKTsKLQl0cnkgewotCQljb250ZXh0LmV2YWx1YXRlKAotCQkJc25pcHBldCwKLQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZVR5cGVOYW1lcygpLAotCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU1vZGlmaWVycygpLAotCQkJc3RhY2tGcmFtZS5kZWNsYXJpbmdUeXBlTmFtZSgpLAotCQkJc3RhY2tGcmFtZS5pc1N0YXRpYygpLAotCQkJc3RhY2tGcmFtZS5pc0NvbnN0cnVjdG9yQ2FsbCgpLAotCQkJZ2V0RW52KCksIAotCQkJZ2V0T3B0aW9ucygpLCAKLQkJCXJlcXVlc3RvciwgCi0JCQlnZXRQcm9ibGVtRmFjdG9yeSgpKTsKLQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0VHJ1ZSgiTm8gdGFyZ2V0RXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCX0KLQlhc3NlcnRUcnVlKCJTaG91bGQgZ2V0IG9uZSByZXN1bHQgYnV0IGdvdCAiICsgcmVxdWVzdG9yLnJlc3VsdEluZGV4KzEsIHJlcXVlc3Rvci5yZXN1bHRJbmRleCA9PSAwKTsKLQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCA9IHJlcXVlc3Rvci5yZXN1bHRzWzBdOwotCWFzc2VydFRydWUoIkNvZGUgc25pcHBldCBzaG91bGQgbm90IGhhdmUgcHJvYmxlbXMiLCAhcmVzdWx0Lmhhc1Byb2JsZW1zKCkpOwotCWFzc2VydFRydWUoIlJlc3VsdCBzaG91bGQgaGF2ZSBhIHZhbHVlIiwgcmVzdWx0Lmhhc1ZhbHVlKCkpOwotCWFzc2VydEVxdWFscygiVmFsdWUiLCAiW3NdIi50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVEaXNwbGF5U3RyaW5nKCkpOwotCWFzc2VydEVxdWFscygiVHlwZSIsICJqYXZhLnV0aWwuVmVjdG9yIi50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVUeXBlTmFtZSgpKTsKLX0KLS8qKgotICogU2V0IGxvY2FsIHZhcmlhYmxlICdkYXRlJy4KLSAqLwotcHVibGljIHZvaWQgdGVzdDAxMigpIHsKLQlTdHJpbmcgdXNlckNvZGUgPQotCQkiamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyIGNhbCA9IG5ldyBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIoKTtcbiIgKwotCQkiamF2YS51dGlsLkRhdGUgZGF0ZSA9IGNhbC5nZXRHcmVnb3JpYW5DaGFuZ2UoKTtcbiIgKwotCQkiZGF0ZS50b1N0cmluZygpOyI7Ci0JSkRJU3RhY2tGcmFtZSBzdGFja0ZyYW1lID0gbmV3IEpESVN0YWNrRnJhbWUoCi0JCXRoaXMuamRpVk0sIAotCQl0aGlzLAotCQl1c2VyQ29kZSk7Ci0KLQlEZWJ1Z1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgRGVidWdSZXF1ZXN0b3IoKTsKLQljaGFyW10gc25pcHBldCA9ICJkYXRlID0gbmV3IGphdmEudXRpbC5EYXRlKCk7Ii50b0NoYXJBcnJheSgpOwotCXRyeSB7Ci0JCWNvbnRleHQuZXZhbHVhdGUoCi0JCQlzbmlwcGV0LAotCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzKCksCi0JCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVOYW1lcygpLAotCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTW9kaWZpZXJzKCksCi0JCQlzdGFja0ZyYW1lLmRlY2xhcmluZ1R5cGVOYW1lKCksCi0JCQlzdGFja0ZyYW1lLmlzU3RhdGljKCksCi0JCQlzdGFja0ZyYW1lLmlzQ29uc3RydWN0b3JDYWxsKCksCi0JCQlnZXRFbnYoKSwgCi0JCQlnZXRPcHRpb25zKCksIAotCQkJcmVxdWVzdG9yLCAKLQkJCWdldFByb2JsZW1GYWN0b3J5KCkpOwotCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgewotCQlhc3NlcnRUcnVlKCJObyB0YXJnZXRFeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0JfQotCXJlcXVlc3RvciA9IG5ldyBEZWJ1Z1JlcXVlc3RvcigpOwotCXNuaXBwZXQgPSAicmV0dXJuIGRhdGUuYWZ0ZXIoY2FsLmdldEdyZWdvcmlhbkNoYW5nZSgpKTsiLnRvQ2hhckFycmF5KCk7Ci0JdHJ5IHsKLQkJY29udGV4dC5ldmFsdWF0ZSgKLQkJCXNuaXBwZXQsCi0JCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMoKSwKLQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU5hbWVzKCksCi0JCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCXN0YWNrRnJhbWUuZGVjbGFyaW5nVHlwZU5hbWUoKSwKLQkJCXN0YWNrRnJhbWUuaXNTdGF0aWMoKSwKLQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCWdldEVudigpLCAKLQkJCWdldE9wdGlvbnMoKSwgCi0JCQlyZXF1ZXN0b3IsIAotCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JfSBjYXRjaCAoSW5zdGFsbEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiU2hvdWxkIGdldCBvbmUgcmVzdWx0IGJ1dCBnb3QgIiArIHJlcXVlc3Rvci5yZXN1bHRJbmRleCsxLCByZXF1ZXN0b3IucmVzdWx0SW5kZXggPT0gMCk7Ci0JRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSByZXF1ZXN0b3IucmVzdWx0c1swXTsKLQlhc3NlcnRUcnVlKCJDb2RlIHNuaXBwZXQgc2hvdWxkIG5vdCBoYXZlIHByb2JsZW1zIiwgIXJlc3VsdC5oYXNQcm9ibGVtcygpKTsKLQlhc3NlcnRUcnVlKCJSZXN1bHQgc2hvdWxkIGhhdmUgYSB2YWx1ZSIsIHJlc3VsdC5oYXNWYWx1ZSgpKTsKLQlhc3NlcnRFcXVhbHMoIlZhbHVlIiwgInRydWUiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZURpc3BsYXlTdHJpbmcoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJUeXBlIiwgImJvb2xlYW4iLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZVR5cGVOYW1lKCkpOwotfQotLyoqCi0gKiBTZXQgbG9jYWwgdmFyaWFibGUgJ2knLgotICovCi0vKiBEaXNhYmxpbmcgc2luY2UgdGhpcyB0ZXN0IGlzIHNvbWV0aW1lcyBmYWlsaW5nIGZvciB1bmtub3duIHJlYXNvbnMKLSAqIChzdXNwZWN0aW5nIGEgcHJvYmxlbSBpbiB0aGUgSkRJIG9yIEpEV1AgaW1wbGVtZW50YXRpb24pCi1wdWJsaWMgdm9pZCB0ZXN0MDEzKCkgewotCVN0cmluZyB1c2VyQ29kZSA9ICJpbnQgaSA9IDA7IjsKLQlKRElTdGFja0ZyYW1lIHN0YWNrRnJhbWUgPSBuZXcgSkRJU3RhY2tGcmFtZSgKLQkJdGhpcy5qZGlWTSwgCi0JCXRoaXMsCi0JCXVzZXJDb2RlKTsKLQotCURlYnVnUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBEZWJ1Z1JlcXVlc3RvcigpOwotCWNoYXJbXSBzbmlwcGV0ID0gImkgPSAtMTsiLnRvQ2hhckFycmF5KCk7Ci0JdHJ5IHsKLQkJY29udGV4dC5ldmFsdWF0ZSgKLQkJCXNuaXBwZXQsCi0JCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMoKSwKLQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU5hbWVzKCksCi0JCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCXN0YWNrRnJhbWUuZGVjbGFyaW5nVHlwZU5hbWUoKSwKLQkJCXN0YWNrRnJhbWUuaXNTdGF0aWMoKSwKLQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCWdldEVudigpLCAKLQkJCWdldE9wdGlvbnMoKSwgCi0JCQlyZXF1ZXN0b3IsIAotCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JfSBjYXRjaCAoSW5zdGFsbEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQl9Ci0JcmVxdWVzdG9yID0gbmV3IERlYnVnUmVxdWVzdG9yKCk7Ci0Jc25pcHBldCA9ICJyZXR1cm4gaSAhPSAwOyIudG9DaGFyQXJyYXkoKTsKLQl0cnkgewotCQljb250ZXh0LmV2YWx1YXRlKAotCQkJc25pcHBldCwKLQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZVR5cGVOYW1lcygpLAotCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU1vZGlmaWVycygpLAotCQkJc3RhY2tGcmFtZS5kZWNsYXJpbmdUeXBlTmFtZSgpLAotCQkJc3RhY2tGcmFtZS5pc1N0YXRpYygpLAotCQkJc3RhY2tGcmFtZS5pc0NvbnN0cnVjdG9yQ2FsbCgpLAotCQkJZ2V0RW52KCksIAotCQkJZ2V0T3B0aW9ucygpLCAKLQkJCXJlcXVlc3RvciwgCi0JCQlnZXRQcm9ibGVtRmFjdG9yeSgpKTsKLQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0VHJ1ZSgiTm8gdGFyZ2V0RXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCX0KLQlhc3NlcnRUcnVlKCJTaG91bGQgZ2V0IG9uZSByZXN1bHQgYnV0IGdvdCAiICsgcmVxdWVzdG9yLnJlc3VsdEluZGV4KzEsIHJlcXVlc3Rvci5yZXN1bHRJbmRleCA9PSAwKTsKLQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCA9IHJlcXVlc3Rvci5yZXN1bHRzWzBdOwotCWFzc2VydFRydWUoIkNvZGUgc25pcHBldCBzaG91bGQgbm90IGhhdmUgcHJvYmxlbXMiLCAhcmVzdWx0Lmhhc1Byb2JsZW1zKCkpOwotCWFzc2VydFRydWUoIlJlc3VsdCBzaG91bGQgaGF2ZSBhIHZhbHVlIiwgcmVzdWx0Lmhhc1ZhbHVlKCkpOwotCWFzc2VydEVxdWFscygiVmFsdWUiLCAidHJ1ZSIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlRGlzcGxheVN0cmluZygpKTsKLQlhc3NlcnRFcXVhbHMoIlR5cGUiLCAiYm9vbGVhbiIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlVHlwZU5hbWUoKSk7Ci19Ci0qLwotLyoqCi0gKiBTZXQgbG9jYWwgdmFyaWFibGUgJ2knLgotICovCi0vKiBEaXNhYmxpbmcgc2luY2UgdGhpcyB0ZXN0IGlzIHNvbWV0aW1lcyBmYWlsaW5nIGZvciB1bmtub3duIHJlYXNvbnMKLSAqIChzdXNwZWN0aW5nIGEgcHJvYmxlbSBpbiB0aGUgSkRJIG9yIEpEV1AgaW1wbGVtZW50YXRpb24pCi1wdWJsaWMgdm9pZCB0ZXN0MDE0KCkgewotCVN0cmluZyB1c2VyQ29kZSA9ICJpbnQgaSA9IDA7IjsKLQlKRElTdGFja0ZyYW1lIHN0YWNrRnJhbWUgPSBuZXcgSkRJU3RhY2tGcmFtZSgKLQkJdGhpcy5qZGlWTSwgCi0JCXRoaXMsCi0JCXVzZXJDb2RlKTsKLQotCURlYnVnUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBEZWJ1Z1JlcXVlc3RvcigpOwotCWNoYXJbXSBzbmlwcGV0ID0gImkrKzsiLnRvQ2hhckFycmF5KCk7Ci0JdHJ5IHsKLQkJY29udGV4dC5ldmFsdWF0ZSgKLQkJCXNuaXBwZXQsCi0JCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMoKSwKLQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU5hbWVzKCksCi0JCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCXN0YWNrRnJhbWUuZGVjbGFyaW5nVHlwZU5hbWUoKSwKLQkJCXN0YWNrRnJhbWUuaXNTdGF0aWMoKSwKLQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCWdldEVudigpLCAKLQkJCWdldE9wdGlvbnMoKSwgCi0JCQlyZXF1ZXN0b3IsIAotCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JfSBjYXRjaCAoSW5zdGFsbEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQl9Ci0JcmVxdWVzdG9yID0gbmV3IERlYnVnUmVxdWVzdG9yKCk7Ci0Jc25pcHBldCA9ICJyZXR1cm4gaSE9IDA7Ii50b0NoYXJBcnJheSgpOwotCXRyeSB7Ci0JCWNvbnRleHQuZXZhbHVhdGUoCi0JCQlzbmlwcGV0LAotCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzKCksCi0JCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVOYW1lcygpLAotCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTW9kaWZpZXJzKCksCi0JCQlzdGFja0ZyYW1lLmRlY2xhcmluZ1R5cGVOYW1lKCksCi0JCQlzdGFja0ZyYW1lLmlzU3RhdGljKCksCi0JCQlzdGFja0ZyYW1lLmlzQ29uc3RydWN0b3JDYWxsKCksCi0JCQlnZXRFbnYoKSwgCi0JCQlnZXRPcHRpb25zKCksIAotCQkJcmVxdWVzdG9yLCAKLQkJCWdldFByb2JsZW1GYWN0b3J5KCkpOwotCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgewotCQlhc3NlcnRUcnVlKCJObyB0YXJnZXRFeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0JfQotCWFzc2VydFRydWUoIlNob3VsZCBnZXQgb25lIHJlc3VsdCBidXQgZ290ICIgKyByZXF1ZXN0b3IucmVzdWx0SW5kZXgrMSwgcmVxdWVzdG9yLnJlc3VsdEluZGV4ID09IDApOwotCUV2YWx1YXRpb25SZXN1bHQgcmVzdWx0ID0gcmVxdWVzdG9yLnJlc3VsdHNbMF07Ci0JYXNzZXJ0VHJ1ZSgiQ29kZSBzbmlwcGV0IHNob3VsZCBub3QgaGF2ZSBwcm9ibGVtcyIsICFyZXN1bHQuaGFzUHJvYmxlbXMoKSk7Ci0JYXNzZXJ0VHJ1ZSgiUmVzdWx0IHNob3VsZCBoYXZlIGEgdmFsdWUiLCByZXN1bHQuaGFzVmFsdWUoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJWYWx1ZSIsICJ0cnVlIi50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVEaXNwbGF5U3RyaW5nKCkpOwotCWFzc2VydEVxdWFscygiVHlwZSIsICJib29sZWFuIi50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVUeXBlTmFtZSgpKTsKLX0KLSovCi0vKioKLSAqIENoZWNrIGphdmEubGFuZy5TeXN0ZW0ub3V0ICE9IG51bGwKLSAqLwotLyogRGlzYWJsaW5nIHNpbmNlIHRoaXMgdGVzdCBpcyBzb21ldGltZXMgZmFpbGluZyBmb3IgdW5rbm93biByZWFzb25zCi0gKiAoc3VzcGVjdGluZyBhIHByb2JsZW0gaW4gdGhlIEpESSBvciBKRFdQIGltcGxlbWVudGF0aW9uKQotcHVibGljIHZvaWQgdGVzdDAxNSgpIHsKLQlTdHJpbmcgdXNlckNvZGUgPSAiaW50IGkgPSAwOyI7Ci0JSkRJU3RhY2tGcmFtZSBzdGFja0ZyYW1lID0gbmV3IEpESVN0YWNrRnJhbWUoCi0JCXRoaXMuamRpVk0sIAotCQl0aGlzLAotCQl1c2VyQ29kZSk7Ci0KLQlEZWJ1Z1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgRGVidWdSZXF1ZXN0b3IoKTsKLQljaGFyW10gc25pcHBldCA9ICJqYXZhLmxhbmcuU3lzdGVtLnNldE91dChuZXcgamF2YS5pby5QcmludFN0cmVhbShuZXcgamF2YS5pby5PdXRwdXRTdHJlYW0oKSkpOyIudG9DaGFyQXJyYXkoKTsKLQl0cnkgewotCQljb250ZXh0LmV2YWx1YXRlKAotCQkJc25pcHBldCwKLQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZVR5cGVOYW1lcygpLAotCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU1vZGlmaWVycygpLAotCQkJc3RhY2tGcmFtZS5kZWNsYXJpbmdUeXBlTmFtZSgpLAotCQkJc3RhY2tGcmFtZS5pc1N0YXRpYygpLAotCQkJc3RhY2tGcmFtZS5pc0NvbnN0cnVjdG9yQ2FsbCgpLAotCQkJZ2V0RW52KCksIAotCQkJZ2V0T3B0aW9ucygpLCAKLQkJCXJlcXVlc3RvciwgCi0JCQlnZXRQcm9ibGVtRmFjdG9yeSgpKTsKLQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0VHJ1ZSgiTm8gdGFyZ2V0RXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCX0JCi0KLQlyZXF1ZXN0b3IgPSBuZXcgRGVidWdSZXF1ZXN0b3IoKTsKLQlzbmlwcGV0ID0gInJldHVybiBqYXZhLmxhbmcuU3lzdGVtLm91dCAhPSBudWxsOyIudG9DaGFyQXJyYXkoKTsKLQl0cnkgewotCQljb250ZXh0LmV2YWx1YXRlKAotCQkJc25pcHBldCwKLQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZVR5cGVOYW1lcygpLAotCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU1vZGlmaWVycygpLAotCQkJc3RhY2tGcmFtZS5kZWNsYXJpbmdUeXBlTmFtZSgpLAotCQkJc3RhY2tGcmFtZS5pc1N0YXRpYygpLAotCQkJc3RhY2tGcmFtZS5pc0NvbnN0cnVjdG9yQ2FsbCgpLAotCQkJZ2V0RW52KCksIAotCQkJZ2V0T3B0aW9ucygpLCAKLQkJCXJlcXVlc3RvciwgCi0JCQlnZXRQcm9ibGVtRmFjdG9yeSgpKTsKLQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0VHJ1ZSgiTm8gdGFyZ2V0RXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCX0KLQlhc3NlcnRUcnVlKCJTaG91bGQgZ2V0IG9uZSByZXN1bHQgYnV0IGdvdCAiICsgcmVxdWVzdG9yLnJlc3VsdEluZGV4KzEsIHJlcXVlc3Rvci5yZXN1bHRJbmRleCA9PSAwKTsKLQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCA9IHJlcXVlc3Rvci5yZXN1bHRzWzBdOwotCWFzc2VydFRydWUoIkNvZGUgc25pcHBldCBzaG91bGQgbm90IGhhdmUgcHJvYmxlbXMiLCAhcmVzdWx0Lmhhc1Byb2JsZW1zKCkpOwotCWFzc2VydFRydWUoIlJlc3VsdCBzaG91bGQgaGF2ZSBhIHZhbHVlIiwgcmVzdWx0Lmhhc1ZhbHVlKCkpOwotCWFzc2VydEVxdWFscygiVmFsdWUiLCAidHJ1ZSIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlRGlzcGxheVN0cmluZygpKTsKLQlhc3NlcnRFcXVhbHMoIlR5cGUiLCAiYm9vbGVhbiIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlVHlwZU5hbWUoKSk7Ci19Ci0qLwotLyoqCi0gKiBDaGVjayBqYXZhLmxhbmcuU3lzdGVtLm91dCA9PSBudWxsCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTYoKSB7Ci0JU3RyaW5nIHVzZXJDb2RlID0gIiI7Ci0JSkRJU3RhY2tGcmFtZSBzdGFja0ZyYW1lID0gbmV3IEpESVN0YWNrRnJhbWUoCi0JCXRoaXMuamRpVk0sIAotCQl0aGlzLAotCQl1c2VyQ29kZSk7Ci0KLQlEZWJ1Z1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgRGVidWdSZXF1ZXN0b3IoKTsKLQljaGFyW10gc25pcHBldCA9ICJqYXZhLmxhbmcuU3lzdGVtLnNldE91dChudWxsKTsiLnRvQ2hhckFycmF5KCk7Ci0JdHJ5IHsKLQkJY29udGV4dC5ldmFsdWF0ZSgKLQkJCXNuaXBwZXQsCi0JCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMoKSwKLQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU5hbWVzKCksCi0JCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCXN0YWNrRnJhbWUuZGVjbGFyaW5nVHlwZU5hbWUoKSwKLQkJCXN0YWNrRnJhbWUuaXNTdGF0aWMoKSwKLQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCWdldEVudigpLCAKLQkJCWdldE9wdGlvbnMoKSwgCi0JCQlyZXF1ZXN0b3IsIAotCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JfSBjYXRjaCAoSW5zdGFsbEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQl9Ci0JcmVxdWVzdG9yID0gbmV3IERlYnVnUmVxdWVzdG9yKCk7Ci0Jc25pcHBldCA9ICJyZXR1cm4gamF2YS5sYW5nLlN5c3RlbS5vdXQgPT0gbnVsbDsiLnRvQ2hhckFycmF5KCk7Ci0JdHJ5IHsKLQkJY29udGV4dC5ldmFsdWF0ZSgKLQkJCXNuaXBwZXQsCi0JCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMoKSwKLQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU5hbWVzKCksCi0JCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCXN0YWNrRnJhbWUuZGVjbGFyaW5nVHlwZU5hbWUoKSwKLQkJCXN0YWNrRnJhbWUuaXNTdGF0aWMoKSwKLQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCWdldEVudigpLCAKLQkJCWdldE9wdGlvbnMoKSwgCi0JCQlyZXF1ZXN0b3IsIAotCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JfSBjYXRjaCAoSW5zdGFsbEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiU2hvdWxkIGdldCBvbmUgcmVzdWx0IGJ1dCBnb3QgIiArIHJlcXVlc3Rvci5yZXN1bHRJbmRleCsxLCByZXF1ZXN0b3IucmVzdWx0SW5kZXggPT0gMCk7Ci0JRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSByZXF1ZXN0b3IucmVzdWx0c1swXTsKLQlhc3NlcnRUcnVlKCJDb2RlIHNuaXBwZXQgc2hvdWxkIG5vdCBoYXZlIHByb2JsZW1zIiwgIXJlc3VsdC5oYXNQcm9ibGVtcygpKTsKLQlhc3NlcnRUcnVlKCJSZXN1bHQgc2hvdWxkIGhhdmUgYSB2YWx1ZSIsIHJlc3VsdC5oYXNWYWx1ZSgpKTsKLQlhc3NlcnRFcXVhbHMoIlZhbHVlIiwgInRydWUiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZURpc3BsYXlTdHJpbmcoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJUeXBlIiwgImJvb2xlYW4iLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZVR5cGVOYW1lKCkpOwotfQotLyoqCi0gKiBDaGVjayB0aGUgdGhpcmQgcHJpbWUgbnVtYmVyIGlzIDUKLSAqLwotcHVibGljIHZvaWQgdGVzdDAxNygpIHsKLQlTdHJpbmcgdXNlckNvZGUgPSAiIjsKLQotCUpESVN0YWNrRnJhbWUgc3RhY2tGcmFtZSA9IG5ldyBKRElTdGFja0ZyYW1lKHRoaXMuamRpVk0sIHRoaXMsIHVzZXJDb2RlKTsKLQotCURlYnVnUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBEZWJ1Z1JlcXVlc3RvcigpOwotCWNoYXJbXSBzbmlwcGV0ID0KLQkJKCJjbGFzcyBFcmF0b3N0aGVuZXMge1xuIgotCQkJKyAiICAgIGludFtdIHByaW1lTnVtYmVycztcbiIKLQkJCSsgIlxuIgotCQkJKyAiICAgIHB1YmxpYyBFcmF0b3N0aGVuZXMoaW50IG4pIHtcbiIKLQkJCSsgIiAgICAgICAgcHJpbWVOdW1iZXJzID0gbmV3IGludFtuICsgMV07XG4iCi0JCQkrICJcbiIKLQkJCSsgIiAgICAgICAgZm9yIChpbnQgaSA9IDI7IGkgPD0gbjsgaSsrKSB7XG4iCi0JCQkrICIgICAgICAgICAgICBwcmltZU51bWJlcnNbaV0gPSBpO1xuIgotCQkJKyAiICAgICAgICB9XG4iCi0JCQkrICIgICAgICAgIGludCBwID0gMjtcbiIKLQkJCSsgIiAgICAgICAgd2hpbGUgKHAgKiBwIDw9IG4pIHtcbiIKLQkJCSsgIiAgICAgICAgICAgIGludCBqID0gMiAqIHA7XG4iCi0JCQkrICIgICAgICAgICAgICB3aGlsZSAoaiA8PSBuKSB7XG4iCi0JCQkrICIgICAgICAgICAgICAgICAgcHJpbWVOdW1iZXJzW2pdID0gMDtcbiIKLQkJCSsgIiAgICAgICAgICAgICAgICBqICs9IHA7XG4iCi0JCQkrICIgICAgICAgICAgICB9XG4iCi0JCQkrICIgICAgICAgICAgICBkbyB7XG4iCi0JCQkrICIgICAgICAgICAgICAgICAgcCsrO1xuIgotCQkJKyAiICAgICAgICAgICAgfSB3aGlsZSAocHJpbWVOdW1iZXJzW3BdID09IDEpO1xuIgotCQkJKyAiICAgICAgICB9XG4iCi0JCQkrICIgICAgfVxuIgotCQkJKyAifVxuIgotCQkJKyAiaW50W10gcHJpbWVzID0gbmV3IEVyYXRvc3RoZW5lcygxMCkucHJpbWVOdW1iZXJzO1xuIgotCQkJKyAiaW50IGkgPSAwO1xuIgotCQkJKyAiaW50IG1heCA9IHByaW1lcy5sZW5ndGg7XG4iCi0JCQkrICJpbnQgaiA9IDA7XG4iCi0JCQkrICJmb3IgKDsgaSA8IG1heCAmJiBqICE9IDM7IGkrKykge1xuIgotCQkJKyAiIGlmIChwcmltZXNbaV0gIT0gMCkge1xuIgotCQkJKyAiICAgICBqKys7XG4iCi0JCQkrICIgfVxuIgotCQkJKyAifVxuIgotCQkJKyAicmV0dXJuIHByaW1lc1tpLTFdOyIpLnRvQ2hhckFycmF5KCk7Ci0JdHJ5IHsKLQkJY29udGV4dC5ldmFsdWF0ZSgKLQkJCXNuaXBwZXQsCi0JCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMoKSwKLQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU5hbWVzKCksCi0JCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCXN0YWNrRnJhbWUuZGVjbGFyaW5nVHlwZU5hbWUoKSwKLQkJCXN0YWNrRnJhbWUuaXNTdGF0aWMoKSwKLQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCWdldEVudigpLAotCQkJZ2V0T3B0aW9ucygpLAotCQkJcmVxdWVzdG9yLAotCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JfSBjYXRjaCAoSW5zdGFsbEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgKLQkJIlNob3VsZCBnZXQgb25lIHJlc3VsdCBidXQgZ290ICIgKyAocmVxdWVzdG9yLnJlc3VsdEluZGV4ICsgMSksCi0JCXJlcXVlc3Rvci5yZXN1bHRJbmRleCA9PSAwKTsKLQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCA9IHJlcXVlc3Rvci5yZXN1bHRzWzBdOwotCWFzc2VydFRydWUoIkNvZGUgc25pcHBldCBzaG91bGQgbm90IGhhdmUgcHJvYmxlbXMiLCAhcmVzdWx0Lmhhc1Byb2JsZW1zKCkpOwotCWFzc2VydFRydWUoIlJlc3VsdCBzaG91bGQgaGF2ZSBhIHZhbHVlIiwgcmVzdWx0Lmhhc1ZhbHVlKCkpOwotCWFzc2VydEVxdWFscygiVmFsdWUiLCAiNSIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlRGlzcGxheVN0cmluZygpKTsKLQlhc3NlcnRFcXVhbHMoIlR5cGUiLCAiaW50Ii50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVUeXBlTmFtZSgpKTsKLX0KLS8qKgotICogY2hhbmdpbmcgdGhlIHZhbHVlIG9mIGEgcHVibGljIGZpZWxkCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTgoKSB7Ci0JdHJ5IHsKLQkJU3RyaW5nIHNvdXJjZUEwMTggPQotCQkJInB1YmxpYyBjbGFzcyBBMDE4IHtcbiIgKwotCQkJIiAgcHVibGljIGludCB4ID0gMTtcbiIgKwotCQkJIiAgcHVibGljIGludCBmb28oKSB7XG4iICsKLQkJCSIgICAgeCsrO1xuIiArIC8vIHdvcmthcm91bmQgcGIgd2l0aCBKREsgMS40LjEgdGhhdCBkb2Vzbid0IHN0b3AgaWYgb25seSByZXR1cm4KLQkJCSIgICAgcmV0dXJuIHg7XG4iICsKLQkJCSIgIH1cbiIgKwotCQkJIn0iOwotCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEwMTgsICJBMDE4Iik7Ci0JCVN0cmluZyB1c2VyQ29kZSA9Ci0JCQkibmV3IEEwMTgoKS5mb28oKTsiOwotCQlKRElTdGFja0ZyYW1lIHN0YWNrRnJhbWUgPSBuZXcgSkRJU3RhY2tGcmFtZSgKLQkJCXRoaXMuamRpVk0sIAotCQkJdGhpcywKLQkJCXVzZXJDb2RlLAotCQkJIkEwMTgiLAotCQkJImZvbyIsCi0JCQktMSk7Ci0KLQkJRGVidWdSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IERlYnVnUmVxdWVzdG9yKCk7Ci0JCWNoYXJbXSBzbmlwcGV0ID0gInggPSA1OyIudG9DaGFyQXJyYXkoKTsKLQkJdHJ5IHsKLQkJCWNvbnRleHQuZXZhbHVhdGUoCi0JCQkJc25pcHBldCwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU1vZGlmaWVycygpLAotCQkJCXN0YWNrRnJhbWUuZGVjbGFyaW5nVHlwZU5hbWUoKSwKLQkJCQlzdGFja0ZyYW1lLmlzU3RhdGljKCksCi0JCQkJc3RhY2tGcmFtZS5pc0NvbnN0cnVjdG9yQ2FsbCgpLAotCQkJCWdldEVudigpLCAKLQkJCQlnZXRPcHRpb25zKCksIAotCQkJCXJlcXVlc3RvciwgCi0JCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgiTm8gdGFyZ2V0RXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCQl9Ci0JCXJlcXVlc3RvciA9IG5ldyBEZWJ1Z1JlcXVlc3RvcigpOwotCQlzbmlwcGV0ID0gInJldHVybiB4OyIudG9DaGFyQXJyYXkoKTsKLQkJdHJ5IHsKLQkJCWNvbnRleHQuZXZhbHVhdGUoCi0JCQkJc25pcHBldCwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU1vZGlmaWVycygpLAotCQkJCXN0YWNrRnJhbWUuZGVjbGFyaW5nVHlwZU5hbWUoKSwKLQkJCQlzdGFja0ZyYW1lLmlzU3RhdGljKCksCi0JCQkJc3RhY2tGcmFtZS5pc0NvbnN0cnVjdG9yQ2FsbCgpLAotCQkJCWdldEVudigpLCAKLQkJCQlnZXRPcHRpb25zKCksIAotCQkJCXJlcXVlc3RvciwgCi0JCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgiTm8gdGFyZ2V0RXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCQl9Ci0JCWFzc2VydFRydWUoIlNob3VsZCBnZXQgb25lIHJlc3VsdCBidXQgZ290ICIgKyByZXF1ZXN0b3IucmVzdWx0SW5kZXgrMSwgcmVxdWVzdG9yLnJlc3VsdEluZGV4ID09IDApOwotCQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCA9IHJlcXVlc3Rvci5yZXN1bHRzWzBdOwotCQlhc3NlcnRUcnVlKCJDb2RlIHNuaXBwZXQgc2hvdWxkIG5vdCBoYXZlIHByb2JsZW1zIiwgIXJlc3VsdC5oYXNQcm9ibGVtcygpKTsKLQkJYXNzZXJ0VHJ1ZSgiUmVzdWx0IHNob3VsZCBoYXZlIGEgdmFsdWUiLCByZXN1bHQuaGFzVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiVmFsdWUiLCAiNSIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlRGlzcGxheVN0cmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUeXBlIiwgImludCIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlVHlwZU5hbWUoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJcmVtb3ZlVGVtcENsYXNzKCJBMDE4Iik7Ci0JfQotfQotLyoqCi0gKiBBY2Nlc3MgdG8gc3VwZXIgcmVmZXJlbmNlCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMTkoKSB7Ci0vKiAgdHJ5IHsKLQkJU3RyaW5nIHNvdXJjZUEwMTkgPQotCQkJInB1YmxpYyBjbGFzcyBBMDE5IHtcbiIgKwotCQkJIiAgcHVibGljIGludCB4ID0gMTtcbiIgKwotCQkJIiAgcHVibGljIGludCBmb28oKSB7XG4iICsKLQkJCSIgICAgeCsrO1xuIiArIC8vIHdvcmthcm91bmQgcGIgd2l0aCBKREsgMS40LjEgdGhhdCBkb2Vzbid0IHN0b3AgaWYgb25seSByZXR1cm4KLQkJCSIgICAgcmV0dXJuIHg7XG4iICsKLQkJCSIgIH1cbiIgKwotCQkJIn0iOwotCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEwMTksICJBMDE5Iik7Ci0JCVN0cmluZyB1c2VyQ29kZSA9Ci0JCQkibmV3IEEwMTkoKS5mb28oKTsiOwotCQlKRElTdGFja0ZyYW1lIHN0YWNrRnJhbWUgPSBuZXcgSkRJU3RhY2tGcmFtZSgKLQkJCXRoaXMuamRpVk0sIAotCQkJdGhpcywKLQkJCXVzZXJDb2RlLAotCQkJIkEwMTkiLAotCQkJImZvbyIsCi0JCQktMSk7Ci0KLQkJRGVidWdSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IERlYnVnUmVxdWVzdG9yKCk7Ci0JCWNoYXJbXSBzbmlwcGV0ID0gInJldHVybiBzdXBlci5jbG9uZSgpLmVxdWFscyh0aGlzKTsiLnRvQ2hhckFycmF5KCk7Ci0JCXRyeSB7Ci0JCQljb250ZXh0LmV2YWx1YXRlKAotCQkJCXNuaXBwZXQsCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCQlzdGFja0ZyYW1lLmRlY2xhcmluZ1R5cGVOYW1lKCksCi0JCQkJc3RhY2tGcmFtZS5pc1N0YXRpYygpLAotCQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCQlnZXRFbnYoKSwgCi0JCQkJZ2V0T3B0aW9ucygpLCAKLQkJCQlyZXF1ZXN0b3IsIAotCQkJCWdldFByb2JsZW1GYWN0b3J5KCkpOwotCQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQkJfQotCQlhc3NlcnRUcnVlKCJTaG91bGQgZ2V0IG9uZSByZXN1bHQgYnV0IGdvdCAiICsgcmVxdWVzdG9yLnJlc3VsdEluZGV4KzEsIHJlcXVlc3Rvci5yZXN1bHRJbmRleCA9PSAwKTsKLQkJRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSByZXF1ZXN0b3IucmVzdWx0c1swXTsKLQkJYXNzZXJ0VHJ1ZSgiQ29kZSBzbmlwcGV0IHNob3VsZCBub3QgaGF2ZSBwcm9ibGVtcyIsICFyZXN1bHQuaGFzUHJvYmxlbXMoKSk7Ci0JCWFzc2VydFRydWUoIlJlc3VsdCBzaG91bGQgaGF2ZSBhIHZhbHVlIiwgcmVzdWx0Lmhhc1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlZhbHVlIiwgInRydWUiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZURpc3BsYXlTdHJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiVHlwZSIsICJib29sZWFuIi50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVUeXBlTmFtZSgpKTsKLQl9IGZpbmFsbHkgewotCQlyZW1vdmVUZW1wQ2xhc3MoIkEwMTkiKTsKLQl9Ci0qLwotfQotLyoqCi0gKiBJbXBsaWNpdCBtZXNzYWdlIGV4cHJlc3Npb24KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyMCgpIHsKLQl0cnkgewotCQlTdHJpbmcgc291cmNlQSA9Ci0JCQkicHVibGljIGNsYXNzIEEge1xuIgotCQkJCSsgIlx0T2JqZWN0IG8gPSBudWxsO1xuIgotCQkJCSsgIlx0cHVibGljIGludCBmb28oKSB7XG4iCi0JCQkJKyAiXHRcdHJldHVybiAyO1xuIgotCQkJCSsgIlx0fVxuIgotCQkJCSsgIlx0cHVibGljIHZvaWQgYmFyKCkge1xuIgotCQkJCSsgIlx0fVxuIgotCQkJCSsgIlx0cHVibGljIE9iamVjdCBiYXIyKCkge1xuIgotCQkJCSsgIlx0XHRyZXR1cm4gbmV3IE9iamVjdCgpO1xuIgotCQkJCSsgIlx0fVxuIgotCQkJCSsgIn0iOwotCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEsICJBIik7Ci0KLQkJU3RyaW5nIHVzZXJDb2RlID0gIm5ldyBBKCkuYmFyKCk7IjsKLQkJSkRJU3RhY2tGcmFtZSBzdGFja0ZyYW1lID0KLQkJCW5ldyBKRElTdGFja0ZyYW1lKAotCQkJCXRoaXMuamRpVk0sCi0JCQkJdGhpcywKLQkJCQl1c2VyQ29kZSwKLQkJCQkiQSIsCi0JCQkJImJhciIsCi0JCQkJLTEpOwotCi0JCURlYnVnUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBEZWJ1Z1JlcXVlc3RvcigpOwotCQljaGFyW10gc25pcHBldCA9ICJyZXR1cm4gZm9vKCk7Ii50b0NoYXJBcnJheSgpOwotCQl0cnkgewotCQkJY29udGV4dC5ldmFsdWF0ZSgKLQkJCQlzbmlwcGV0LAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZVR5cGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTW9kaWZpZXJzKCksCi0JCQkJc3RhY2tGcmFtZS5kZWNsYXJpbmdUeXBlTmFtZSgpLAotCQkJCXN0YWNrRnJhbWUuaXNTdGF0aWMoKSwKLQkJCQlzdGFja0ZyYW1lLmlzQ29uc3RydWN0b3JDYWxsKCksCi0JCQkJZ2V0RW52KCksCi0JCQkJZ2V0T3B0aW9ucygpLAotCQkJCXJlcXVlc3RvciwKLQkJCQlnZXRQcm9ibGVtRmFjdG9yeSgpKTsKLQkJfSBjYXRjaCAoSW5zdGFsbEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKCJObyB0YXJnZXRFeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJTaG91bGQgZ2V0IG9uZSByZXN1bHQgYnV0IGdvdCAiICsgKHJlcXVlc3Rvci5yZXN1bHRJbmRleCArIDEpLAotCQkJcmVxdWVzdG9yLnJlc3VsdEluZGV4ID09IDApOwotCQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCA9IHJlcXVlc3Rvci5yZXN1bHRzWzBdOwotCQlhc3NlcnRUcnVlKCJDb2RlIHNuaXBwZXQgc2hvdWxkIG5vdCBoYXZlIHByb2JsZW1zIiwgIXJlc3VsdC5oYXNQcm9ibGVtcygpKTsKLQkJYXNzZXJ0VHJ1ZSgiUmVzdWx0IHNob3VsZCBoYXZlIGEgdmFsdWUiLCByZXN1bHQuaGFzVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiVmFsdWUiLCAiMiIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlRGlzcGxheVN0cmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUeXBlIiwgImludCIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlVHlwZU5hbWUoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJcmVtb3ZlVGVtcENsYXNzKCJBIik7Ci0JfQotfQotLyoqCi0gKiBJbXBsaWNpdCBtZXNzYWdlIGV4cHJlc3Npb24KLSAqLwotcHVibGljIHZvaWQgdGVzdDAyMSgpIHsKLQl0cnkgewotCQlTdHJpbmcgc291cmNlQTIxID0KLQkJCSJwdWJsaWMgY2xhc3MgQTIxIHtcbiIKLQkJCQkrICJcdE9iamVjdCBvID0gbnVsbDtcbiIKLQkJCQkrICJcdHB1YmxpYyBpbnQgZm9vKCkge1xuIgotCQkJCSsgIlx0XHRyZXR1cm4gMjtcbiIKLQkJCQkrICJcdH1cbiIKLQkJCQkrICJcdHB1YmxpYyB2b2lkIGJhcigpIHtcbiIKLQkJCQkrICJcdH1cbiIKLQkJCQkrICJcdHB1YmxpYyBPYmplY3QgYmFyMigpIHtcbiIKLQkJCQkrICJcdFx0cmV0dXJuIFwidG90b1wiO1xuIgotCQkJCSsgIlx0fVxuIgotCQkJCSsgIn0iOwotCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEyMSwgIkEyMSIpOwotCi0JCVN0cmluZyB1c2VyQ29kZSA9ICJuZXcgQTIxKCkuYmFyKCk7IjsKLQkJSkRJU3RhY2tGcmFtZSBzdGFja0ZyYW1lID0KLQkJCW5ldyBKRElTdGFja0ZyYW1lKAotCQkJCXRoaXMuamRpVk0sCi0JCQkJdGhpcywKLQkJCQl1c2VyQ29kZSwKLQkJCQkiQTIxIiwKLQkJCQkiYmFyIiwKLQkJCQktMSk7Ci0KLQkJRGVidWdSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IERlYnVnUmVxdWVzdG9yKCk7Ci0JCWNoYXJbXSBzbmlwcGV0ID0gIm8gPSBiYXIyKCk7Ii50b0NoYXJBcnJheSgpOwotCQl0cnkgewotCQkJY29udGV4dC5ldmFsdWF0ZSgKLQkJCQlzbmlwcGV0LAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZVR5cGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTW9kaWZpZXJzKCksCi0JCQkJc3RhY2tGcmFtZS5kZWNsYXJpbmdUeXBlTmFtZSgpLAotCQkJCXN0YWNrRnJhbWUuaXNTdGF0aWMoKSwKLQkJCQlzdGFja0ZyYW1lLmlzQ29uc3RydWN0b3JDYWxsKCksCi0JCQkJZ2V0RW52KCksCi0JCQkJZ2V0T3B0aW9ucygpLAotCQkJCXJlcXVlc3RvciwKLQkJCQlnZXRQcm9ibGVtRmFjdG9yeSgpKTsKLQkJfSBjYXRjaCAoSW5zdGFsbEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKCJObyB0YXJnZXRFeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0JCX0KLQkJcmVxdWVzdG9yID0gbmV3IERlYnVnUmVxdWVzdG9yKCk7Ci0JCXNuaXBwZXQgPSAicmV0dXJuIG87Ii50b0NoYXJBcnJheSgpOwotCQl0cnkgewotCQkJY29udGV4dC5ldmFsdWF0ZSgKLQkJCQlzbmlwcGV0LAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZVR5cGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTW9kaWZpZXJzKCksCi0JCQkJc3RhY2tGcmFtZS5kZWNsYXJpbmdUeXBlTmFtZSgpLAotCQkJCXN0YWNrRnJhbWUuaXNTdGF0aWMoKSwKLQkJCQlzdGFja0ZyYW1lLmlzQ29uc3RydWN0b3JDYWxsKCksCi0JCQkJZ2V0RW52KCksCi0JCQkJZ2V0T3B0aW9ucygpLAotCQkJCXJlcXVlc3RvciwKLQkJCQlnZXRQcm9ibGVtRmFjdG9yeSgpKTsKLQkJfSBjYXRjaCAoSW5zdGFsbEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKCJObyB0YXJnZXRFeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJTaG91bGQgZ2V0IG9uZSByZXN1bHQgYnV0IGdvdCAiICsgKHJlcXVlc3Rvci5yZXN1bHRJbmRleCArIDEpLAotCQkJcmVxdWVzdG9yLnJlc3VsdEluZGV4ID09IDApOwotCQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCA9IHJlcXVlc3Rvci5yZXN1bHRzWzBdOwotCQlhc3NlcnRUcnVlKCJDb2RlIHNuaXBwZXQgc2hvdWxkIG5vdCBoYXZlIHByb2JsZW1zIiwgIXJlc3VsdC5oYXNQcm9ibGVtcygpKTsKLQkJYXNzZXJ0VHJ1ZSgiUmVzdWx0IHNob3VsZCBoYXZlIGEgdmFsdWUiLCByZXN1bHQuaGFzVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiVmFsdWUiLCAidG90byIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlRGlzcGxheVN0cmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUeXBlIiwgImphdmEubGFuZy5PYmplY3QiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZVR5cGVOYW1lKCkpOwotCX0gZmluYWxseSB7Ci0JCXJlbW92ZVRlbXBDbGFzcygiQTIxIik7Ci0JfQotfQotLyoqCi0gKiBRdWFsaWZpZWQgTmFtZSBSZWZlcmVuY2U6IGIucwotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDIyKCkgewotCXRyeSB7Ci0JCVN0cmluZyBzb3VyY2VCMjIgPQotCQkJInB1YmxpYyBjbGFzcyBCMjIge1xuIgotCQkJCSsgIlx0cHVibGljIFN0cmluZyBzID0gbnVsbDtcbiIKLQkJCQkrICJ9IjsKLQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VCMjIsICJCMjIiKTsKLQkJCi0JCVN0cmluZyBzb3VyY2VBMjIgPQotCQkJInB1YmxpYyBjbGFzcyBBMjIge1xuIgotCQkJCSsgIlx0cHVibGljIEIyMiBiID0gbmV3IEIyMigpO1xuIgotCQkJCSsgIlx0cHVibGljIGludCBmb28oKSB7XG4iCi0JCQkJKyAiXHRcdHJldHVybiAyO1xuIgotCQkJCSsgIlx0fVxuIgotCQkJCSsgIlx0cHVibGljIHZvaWQgYmFyKCkge1xuIgotCQkJCSsgIlx0fVxuIgotCQkJCSsgIlx0cHVibGljIE9iamVjdCBiYXIyKCkge1xuIgotCQkJCSsgIlx0XHRyZXR1cm4gXCJ0b3RvXCI7XG4iCi0JCQkJKyAiXHR9XG4iCi0JCQkJKyAifSI7Ci0JCWNvbXBpbGVBbmREZXBsb3koc291cmNlQTIyLCAiQTIyIik7Ci0KLQkJU3RyaW5nIHVzZXJDb2RlID0gIm5ldyBBMjIoKS5iYXIoKTsiOwotCQlKRElTdGFja0ZyYW1lIHN0YWNrRnJhbWUgPQotCQkJbmV3IEpESVN0YWNrRnJhbWUoCi0JCQkJdGhpcy5qZGlWTSwKLQkJCQl0aGlzLAotCQkJCXVzZXJDb2RlLAotCQkJCSJBMjIiLAotCQkJCSJiYXIiLAotCQkJCS0xKTsKLQotCQlEZWJ1Z1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgRGVidWdSZXF1ZXN0b3IoKTsKLQkJY2hhcltdIHNuaXBwZXQgPSAiYi5zID0gXCJ0b3RvXCIiLnRvQ2hhckFycmF5KCk7Ci0JCXRyeSB7Ci0JCQljb250ZXh0LmV2YWx1YXRlKAotCQkJCXNuaXBwZXQsCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCQlzdGFja0ZyYW1lLmRlY2xhcmluZ1R5cGVOYW1lKCksCi0JCQkJc3RhY2tGcmFtZS5pc1N0YXRpYygpLAotCQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCQlnZXRFbnYoKSwKLQkJCQlnZXRPcHRpb25zKCksCi0JCQkJcmVxdWVzdG9yLAotCQkJCWdldFByb2JsZW1GYWN0b3J5KCkpOwotCQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQkJfQotCQlhc3NlcnRUcnVlKAotCQkJIlNob3VsZCBnZXQgb25lIHJlc3VsdCBidXQgZ290ICIgKyAocmVxdWVzdG9yLnJlc3VsdEluZGV4ICsgMSksCi0JCQlyZXF1ZXN0b3IucmVzdWx0SW5kZXggPT0gMCk7Ci0JCUV2YWx1YXRpb25SZXN1bHQgcmVzdWx0ID0gcmVxdWVzdG9yLnJlc3VsdHNbMF07Ci0JCWFzc2VydFRydWUoIkNvZGUgc25pcHBldCBzaG91bGQgbm90IGhhdmUgcHJvYmxlbXMiLCAhcmVzdWx0Lmhhc1Byb2JsZW1zKCkpOwotCi0JCXJlcXVlc3RvciA9IG5ldyBEZWJ1Z1JlcXVlc3RvcigpOwotCQlzbmlwcGV0ID0gInJldHVybiBiLnM7Ii50b0NoYXJBcnJheSgpOwotCQl0cnkgewotCQkJY29udGV4dC5ldmFsdWF0ZSgKLQkJCQlzbmlwcGV0LAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZVR5cGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTW9kaWZpZXJzKCksCi0JCQkJc3RhY2tGcmFtZS5kZWNsYXJpbmdUeXBlTmFtZSgpLAotCQkJCXN0YWNrRnJhbWUuaXNTdGF0aWMoKSwKLQkJCQlzdGFja0ZyYW1lLmlzQ29uc3RydWN0b3JDYWxsKCksCi0JCQkJZ2V0RW52KCksCi0JCQkJZ2V0T3B0aW9ucygpLAotCQkJCXJlcXVlc3RvciwKLQkJCQlnZXRQcm9ibGVtRmFjdG9yeSgpKTsKLQkJfSBjYXRjaCAoSW5zdGFsbEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKCJObyB0YXJnZXRFeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJTaG91bGQgZ2V0IG9uZSByZXN1bHQgYnV0IGdvdCAiICsgKHJlcXVlc3Rvci5yZXN1bHRJbmRleCArIDEpLAotCQkJcmVxdWVzdG9yLnJlc3VsdEluZGV4ID09IDApOwotCQlyZXN1bHQgPSByZXF1ZXN0b3IucmVzdWx0c1swXTsKLQkJYXNzZXJ0VHJ1ZSgiQ29kZSBzbmlwcGV0IHNob3VsZCBub3QgaGF2ZSBwcm9ibGVtcyIsICFyZXN1bHQuaGFzUHJvYmxlbXMoKSk7Ci0JCWFzc2VydFRydWUoIlJlc3VsdCBzaG91bGQgaGF2ZSBhIHZhbHVlIiwgcmVzdWx0Lmhhc1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlZhbHVlIiwgInRvdG8iLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZURpc3BsYXlTdHJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiVHlwZSIsICJqYXZhLmxhbmcuU3RyaW5nIi50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVUeXBlTmFtZSgpKTsKLQl9IGZpbmFsbHkgewotCQlyZW1vdmVUZW1wQ2xhc3MoIkIyMiIpOwotCQlyZW1vdmVUZW1wQ2xhc3MoIkEyMiIpOwotCX0KLX0KLS8qKgotICogUXVhbGlmaWVkIE5hbWUgUmVmZXJlbmNlOiBiLmMuYwotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDIzKCkgewotCXRyeSB7Ci0JCVN0cmluZyBzb3VyY2VDMjMgPQotCQkJInB1YmxpYyBjbGFzcyBDMjMge1xuIgotCQkJCSsgIlx0cHVibGljIFN0cmluZyBjID0gbnVsbDtcbiIKLQkJCQkrICJ9IjsKLQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VDMjMsICJDMjMiKTsKLQotCQkKLQkJU3RyaW5nIHNvdXJjZUIyMyA9Ci0JCQkicHVibGljIGNsYXNzIEIyMyB7XG4iCi0JCQkJKyAiXHRwdWJsaWMgQzIzIGMgPSBuZXcgQzIzKCk7XG4iCi0JCQkJKyAifSI7Ci0JCWNvbXBpbGVBbmREZXBsb3koc291cmNlQjIzLCAiQjIzIik7Ci0JCQotCQlTdHJpbmcgc291cmNlQTIzID0KLQkJCSJwdWJsaWMgY2xhc3MgQTIzIHtcbiIKLQkJCQkrICJcdHB1YmxpYyBCMjMgYiA9IG5ldyBCMjMoKTtcbiIKLQkJCQkrICJcdHB1YmxpYyBpbnQgZm9vKCkge1xuIgotCQkJCSsgIlx0XHRyZXR1cm4gMjtcbiIKLQkJCQkrICJcdH1cbiIKLQkJCQkrICJcdHB1YmxpYyB2b2lkIGJhcigpIHtcbiIKLQkJCQkrICJcdH1cbiIKLQkJCQkrICJcdHB1YmxpYyBPYmplY3QgYmFyMigpIHtcbiIKLQkJCQkrICJcdFx0cmV0dXJuIFwidG90b1wiO1xuIgotCQkJCSsgIlx0fVxuIgotCQkJCSsgIn0iOwotCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEyMywgIkEyMyIpOwotCi0JCVN0cmluZyB1c2VyQ29kZSA9ICJuZXcgQTIzKCkuYmFyKCk7IjsKLQkJSkRJU3RhY2tGcmFtZSBzdGFja0ZyYW1lID0KLQkJCW5ldyBKRElTdGFja0ZyYW1lKAotCQkJCXRoaXMuamRpVk0sCi0JCQkJdGhpcywKLQkJCQl1c2VyQ29kZSwKLQkJCQkiQTIzIiwKLQkJCQkiYmFyIiwKLQkJCQktMSk7Ci0KLQkJRGVidWdSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IERlYnVnUmVxdWVzdG9yKCk7Ci0JCWNoYXJbXSBzbmlwcGV0ID0gImIuYy5jID0gXCJ0b3RvXCIiLnRvQ2hhckFycmF5KCk7Ci0JCXRyeSB7Ci0JCQljb250ZXh0LmV2YWx1YXRlKAotCQkJCXNuaXBwZXQsCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCQlzdGFja0ZyYW1lLmRlY2xhcmluZ1R5cGVOYW1lKCksCi0JCQkJc3RhY2tGcmFtZS5pc1N0YXRpYygpLAotCQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCQlnZXRFbnYoKSwKLQkJCQlnZXRPcHRpb25zKCksCi0JCQkJcmVxdWVzdG9yLAotCQkJCWdldFByb2JsZW1GYWN0b3J5KCkpOwotCQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQkJfQotCQlhc3NlcnRUcnVlKAotCQkJIlNob3VsZCBnZXQgb25lIHJlc3VsdCBidXQgZ290ICIgKyAocmVxdWVzdG9yLnJlc3VsdEluZGV4ICsgMSksCi0JCQlyZXF1ZXN0b3IucmVzdWx0SW5kZXggPT0gMCk7Ci0JCUV2YWx1YXRpb25SZXN1bHQgcmVzdWx0ID0gcmVxdWVzdG9yLnJlc3VsdHNbMF07Ci0JCWFzc2VydFRydWUoIkNvZGUgc25pcHBldCBzaG91bGQgbm90IGhhdmUgcHJvYmxlbXMiLCAhcmVzdWx0Lmhhc1Byb2JsZW1zKCkpOwotCi0JCXJlcXVlc3RvciA9IG5ldyBEZWJ1Z1JlcXVlc3RvcigpOwotCQlzbmlwcGV0ID0gInJldHVybiBiLmMuYzsiLnRvQ2hhckFycmF5KCk7Ci0JCXRyeSB7Ci0JCQljb250ZXh0LmV2YWx1YXRlKAotCQkJCXNuaXBwZXQsCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCQlzdGFja0ZyYW1lLmRlY2xhcmluZ1R5cGVOYW1lKCksCi0JCQkJc3RhY2tGcmFtZS5pc1N0YXRpYygpLAotCQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCQlnZXRFbnYoKSwKLQkJCQlnZXRPcHRpb25zKCksCi0JCQkJcmVxdWVzdG9yLAotCQkJCWdldFByb2JsZW1GYWN0b3J5KCkpOwotCQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQkJfQotCQlhc3NlcnRUcnVlKAotCQkJIlNob3VsZCBnZXQgb25lIHJlc3VsdCBidXQgZ290ICIgKyAocmVxdWVzdG9yLnJlc3VsdEluZGV4ICsgMSksCi0JCQlyZXF1ZXN0b3IucmVzdWx0SW5kZXggPT0gMCk7Ci0JCXJlc3VsdCA9IHJlcXVlc3Rvci5yZXN1bHRzWzBdOwotCQlhc3NlcnRUcnVlKCJDb2RlIHNuaXBwZXQgc2hvdWxkIG5vdCBoYXZlIHByb2JsZW1zIiwgIXJlc3VsdC5oYXNQcm9ibGVtcygpKTsKLQkJYXNzZXJ0VHJ1ZSgiUmVzdWx0IHNob3VsZCBoYXZlIGEgdmFsdWUiLCByZXN1bHQuaGFzVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiVmFsdWUiLCAidG90byIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlRGlzcGxheVN0cmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUeXBlIiwgImphdmEubGFuZy5TdHJpbmciLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZVR5cGVOYW1lKCkpOwotCX0gZmluYWxseSB7Ci0JCXJlbW92ZVRlbXBDbGFzcygiQzIzIik7ICAgICAKLQkJcmVtb3ZlVGVtcENsYXNzKCJCMjMiKTsKLQkJcmVtb3ZlVGVtcENsYXNzKCJBMjMiKTsKLQl9Ci19Ci0vKioKLSAqIEFycmF5IFJlZmVyZW5jZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDI0KCkgewotCXRyeSB7Ci0JCVN0cmluZyBzb3VyY2VDMjQgPQotCQkJInB1YmxpYyBjbGFzcyBDMjQge1xuIgotCQkJCSsgIlx0cHVibGljIGludFtdIHRhYiA9IHsxLDIsMyw0LDV9O1xuIgotCQkJCSsgIn0iOwotCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUMyNCwgIkMyNCIpOwotCi0JCQotCQlTdHJpbmcgc291cmNlQjI0ID0KLQkJCSJwdWJsaWMgY2xhc3MgQjI0IHtcbiIKLQkJCQkrICJcdHB1YmxpYyBDMjQgYyA9IG5ldyBDMjQoKTtcbiIKLQkJCQkrICJ9IjsKLQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VCMjQsICJCMjQiKTsKLQkJCi0JCVN0cmluZyBzb3VyY2VBMjQgPQotCQkJInB1YmxpYyBjbGFzcyBBMjQge1xuIgotCQkJCSsgIlx0cHVibGljIEIyNCBiID0gbmV3IEIyNCgpO1xuIgotCQkJCSsgIlx0cHVibGljIGludCBmb28oKSB7XG4iCi0JCQkJKyAiXHRcdHJldHVybiAyO1xuIgotCQkJCSsgIlx0fVxuIgotCQkJCSsgIlx0cHVibGljIHZvaWQgYmFyKCkge1xuIgotCQkJCSsgIlx0fVxuIgotCQkJCSsgIlx0cHVibGljIE9iamVjdCBiYXIyKCkge1xuIgotCQkJCSsgIlx0XHRyZXR1cm4gXCJ0b3RvXCI7XG4iCi0JCQkJKyAiXHR9XG4iCi0JCQkJKyAifSI7Ci0JCWNvbXBpbGVBbmREZXBsb3koc291cmNlQTI0LCAiQTI0Iik7Ci0KLQkJU3RyaW5nIHVzZXJDb2RlID0gIm5ldyBBMjQoKS5iYXIoKTsiOwotCQlKRElTdGFja0ZyYW1lIHN0YWNrRnJhbWUgPQotCQkJbmV3IEpESVN0YWNrRnJhbWUoCi0JCQkJdGhpcy5qZGlWTSwKLQkJCQl0aGlzLAotCQkJCXVzZXJDb2RlLAotCQkJCSJBMjQiLAotCQkJCSJiYXIiLAotCQkJCS0xKTsKLQotCQlEZWJ1Z1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgRGVidWdSZXF1ZXN0b3IoKTsKLQkJY2hhcltdIHNuaXBwZXQgPSAiYi5jLnRhYlszXSA9IDgiLnRvQ2hhckFycmF5KCk7Ci0JCXRyeSB7Ci0JCQljb250ZXh0LmV2YWx1YXRlKAotCQkJCXNuaXBwZXQsCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCQlzdGFja0ZyYW1lLmRlY2xhcmluZ1R5cGVOYW1lKCksCi0JCQkJc3RhY2tGcmFtZS5pc1N0YXRpYygpLAotCQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCQlnZXRFbnYoKSwKLQkJCQlnZXRPcHRpb25zKCksCi0JCQkJcmVxdWVzdG9yLAotCQkJCWdldFByb2JsZW1GYWN0b3J5KCkpOwotCQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQkJfQotCQlhc3NlcnRUcnVlKAotCQkJIlNob3VsZCBnZXQgb25lIHJlc3VsdCBidXQgZ290ICIgKyAocmVxdWVzdG9yLnJlc3VsdEluZGV4ICsgMSksCi0JCQlyZXF1ZXN0b3IucmVzdWx0SW5kZXggPT0gMCk7Ci0JCUV2YWx1YXRpb25SZXN1bHQgcmVzdWx0ID0gcmVxdWVzdG9yLnJlc3VsdHNbMF07Ci0JCWFzc2VydFRydWUoIkNvZGUgc25pcHBldCBzaG91bGQgbm90IGhhdmUgcHJvYmxlbXMiLCAhcmVzdWx0Lmhhc1Byb2JsZW1zKCkpOwotCi0JCXJlcXVlc3RvciA9IG5ldyBEZWJ1Z1JlcXVlc3RvcigpOwotCQlzbmlwcGV0ID0gInJldHVybiBiLmMudGFiWzNdOyIudG9DaGFyQXJyYXkoKTsKLQkJdHJ5IHsKLQkJCWNvbnRleHQuZXZhbHVhdGUoCi0JCQkJc25pcHBldCwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU1vZGlmaWVycygpLAotCQkJCXN0YWNrRnJhbWUuZGVjbGFyaW5nVHlwZU5hbWUoKSwKLQkJCQlzdGFja0ZyYW1lLmlzU3RhdGljKCksCi0JCQkJc3RhY2tGcmFtZS5pc0NvbnN0cnVjdG9yQ2FsbCgpLAotCQkJCWdldEVudigpLAotCQkJCWdldE9wdGlvbnMoKSwKLQkJCQlyZXF1ZXN0b3IsCi0JCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgiTm8gdGFyZ2V0RXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCQl9Ci0JCWFzc2VydFRydWUoCi0JCQkiU2hvdWxkIGdldCBvbmUgcmVzdWx0IGJ1dCBnb3QgIiArIChyZXF1ZXN0b3IucmVzdWx0SW5kZXggKyAxKSwKLQkJCXJlcXVlc3Rvci5yZXN1bHRJbmRleCA9PSAwKTsKLQkJcmVzdWx0ID0gcmVxdWVzdG9yLnJlc3VsdHNbMF07Ci0JCWFzc2VydFRydWUoIkNvZGUgc25pcHBldCBzaG91bGQgbm90IGhhdmUgcHJvYmxlbXMiLCAhcmVzdWx0Lmhhc1Byb2JsZW1zKCkpOwotCQlhc3NlcnRUcnVlKCJSZXN1bHQgc2hvdWxkIGhhdmUgYSB2YWx1ZSIsIHJlc3VsdC5oYXNWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJWYWx1ZSIsICI4Ii50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVEaXNwbGF5U3RyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlR5cGUiLCAiaW50Ii50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVUeXBlTmFtZSgpKTsKLQl9IGZpbmFsbHkgewotCQlyZW1vdmVUZW1wQ2xhc3MoIkMyNCIpOyAgICAgCi0JCXJlbW92ZVRlbXBDbGFzcygiQjI0Iik7Ci0JCXJlbW92ZVRlbXBDbGFzcygiQTI0Iik7Ci0JfQotfQotLyoqCi0gKiBBcnJheSBSZWZlcmVuY2UKLSAqLwotcHVibGljIHZvaWQgdGVzdDAyNSgpIHsKLQl0cnkgewotCQlTdHJpbmcgc291cmNlQTI1ID0KLQkJCSJwdWJsaWMgY2xhc3MgQTI1IHtcbiIKLQkJCQkrICJcdHB1YmxpYyBTdHJpbmdbXSB0YWJTdHJpbmcgPSBuZXcgU3RyaW5nWzJdO1xuIgotCQkJCSsgIlx0cHVibGljIGludCBmb28oKSB7XG4iCi0JCQkJKyAiXHRcdHJldHVybiAyO1xuIgotCQkJCSsgIlx0fVxuIgotCQkJCSsgIlx0cHVibGljIHZvaWQgYmFyKCkge1xuIgotCQkJCSsgIlx0fVxuIgotCQkJCSsgIlx0cHVibGljIE9iamVjdCBiYXIyKCkge1xuIgotCQkJCSsgIlx0XHRyZXR1cm4gXCJ0b3RvXCI7XG4iCi0JCQkJKyAiXHR9XG4iCi0JCQkJKyAifSI7Ci0JCWNvbXBpbGVBbmREZXBsb3koc291cmNlQTI1LCAiQTI1Iik7Ci0KLQkJU3RyaW5nIHVzZXJDb2RlID0gIm5ldyBBMjUoKS5iYXIoKTsiOwotCQlKRElTdGFja0ZyYW1lIHN0YWNrRnJhbWUgPQotCQkJbmV3IEpESVN0YWNrRnJhbWUoCi0JCQkJdGhpcy5qZGlWTSwKLQkJCQl0aGlzLAotCQkJCXVzZXJDb2RlLAotCQkJCSJBMjUiLAotCQkJCSJiYXIiLAotCQkJCS0xKTsKLQotCQlEZWJ1Z1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgRGVidWdSZXF1ZXN0b3IoKTsKLQkJY2hhcltdIHNuaXBwZXQgPSAidGFiU3RyaW5nWzFdID0gXCJ0b3RvXCIiLnRvQ2hhckFycmF5KCk7Ci0JCXRyeSB7Ci0JCQljb250ZXh0LmV2YWx1YXRlKAotCQkJCXNuaXBwZXQsCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCQlzdGFja0ZyYW1lLmRlY2xhcmluZ1R5cGVOYW1lKCksCi0JCQkJc3RhY2tGcmFtZS5pc1N0YXRpYygpLAotCQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCQlnZXRFbnYoKSwKLQkJCQlnZXRPcHRpb25zKCksCi0JCQkJcmVxdWVzdG9yLAotCQkJCWdldFByb2JsZW1GYWN0b3J5KCkpOwotCQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQkJfQotCQlhc3NlcnRUcnVlKAotCQkJIlNob3VsZCBnZXQgb25lIHJlc3VsdCBidXQgZ290ICIgKyAocmVxdWVzdG9yLnJlc3VsdEluZGV4ICsgMSksCi0JCQlyZXF1ZXN0b3IucmVzdWx0SW5kZXggPT0gMCk7Ci0JCUV2YWx1YXRpb25SZXN1bHQgcmVzdWx0ID0gcmVxdWVzdG9yLnJlc3VsdHNbMF07Ci0JCWFzc2VydFRydWUoIkNvZGUgc25pcHBldCBzaG91bGQgbm90IGhhdmUgcHJvYmxlbXMiLCAhcmVzdWx0Lmhhc1Byb2JsZW1zKCkpOwotCi0JCXJlcXVlc3RvciA9IG5ldyBEZWJ1Z1JlcXVlc3RvcigpOwotCQlzbmlwcGV0ID0gInJldHVybiB0YWJTdHJpbmdbMV07Ii50b0NoYXJBcnJheSgpOwotCQl0cnkgewotCQkJY29udGV4dC5ldmFsdWF0ZSgKLQkJCQlzbmlwcGV0LAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZVR5cGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTW9kaWZpZXJzKCksCi0JCQkJc3RhY2tGcmFtZS5kZWNsYXJpbmdUeXBlTmFtZSgpLAotCQkJCXN0YWNrRnJhbWUuaXNTdGF0aWMoKSwKLQkJCQlzdGFja0ZyYW1lLmlzQ29uc3RydWN0b3JDYWxsKCksCi0JCQkJZ2V0RW52KCksCi0JCQkJZ2V0T3B0aW9ucygpLAotCQkJCXJlcXVlc3RvciwKLQkJCQlnZXRQcm9ibGVtRmFjdG9yeSgpKTsKLQkJfSBjYXRjaCAoSW5zdGFsbEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKCJObyB0YXJnZXRFeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJTaG91bGQgZ2V0IG9uZSByZXN1bHQgYnV0IGdvdCAiICsgKHJlcXVlc3Rvci5yZXN1bHRJbmRleCArIDEpLAotCQkJcmVxdWVzdG9yLnJlc3VsdEluZGV4ID09IDApOwotCQlyZXN1bHQgPSByZXF1ZXN0b3IucmVzdWx0c1swXTsKLQkJYXNzZXJ0VHJ1ZSgiQ29kZSBzbmlwcGV0IHNob3VsZCBub3QgaGF2ZSBwcm9ibGVtcyIsICFyZXN1bHQuaGFzUHJvYmxlbXMoKSk7Ci0JCWFzc2VydFRydWUoIlJlc3VsdCBzaG91bGQgaGF2ZSBhIHZhbHVlIiwgcmVzdWx0Lmhhc1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlZhbHVlIiwgInRvdG8iLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZURpc3BsYXlTdHJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiVHlwZSIsICJqYXZhLmxhbmcuU3RyaW5nIi50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVUeXBlTmFtZSgpKTsKLQl9IGZpbmFsbHkgewotCQlyZW1vdmVUZW1wQ2xhc3MoIkEyNSIpOwotCX0KLX0KLS8qKgotICogQXJyYXkgUmVmZXJlbmNlCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjYoKSB7Ci0JdHJ5IHsKLQkJU3RyaW5nIHNvdXJjZUEyNiA9Ci0JCQkicHVibGljIGNsYXNzIEEyNiB7XG4iCi0JCQkJKyAiXHRwdWJsaWMgaW50IGZvbygpIHtcbiIKLQkJCQkrICJcdFx0cmV0dXJuIDI7XG4iCi0JCQkJKyAiXHR9XG4iCi0JCQkJKyAiXHRwdWJsaWMgdm9pZCBiYXIoKSB7XG4iCi0JCQkJKyAiXHR9XG4iCi0JCQkJKyAifSI7Ci0JCWNvbXBpbGVBbmREZXBsb3koc291cmNlQTI2LCAiQTI2Iik7Ci0KLQkJU3RyaW5nIHVzZXJDb2RlID0gIm5ldyBBMjYoKS5iYXIoKTsiOwotCQlKRElTdGFja0ZyYW1lIHN0YWNrRnJhbWUgPQotCQkJbmV3IEpESVN0YWNrRnJhbWUoCi0JCQkJdGhpcy5qZGlWTSwKLQkJCQl0aGlzLAotCQkJCXVzZXJDb2RlLAotCQkJCSJBMjYiLAotCQkJCSJiYXIiLAotCQkJCS0xKTsKLQotCQlEZWJ1Z1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgRGVidWdSZXF1ZXN0b3IoKTsKLQkJY2hhcltdIHNuaXBwZXQgPSAKLQkJCSgiaW50W10gdGFiID0gbmV3IGludFsxXTtcbiIKLQkJCSsgInRhYlswXSA9IGZvbygpO1xuIgotCQkJKyAidGFiWzBdIikudG9DaGFyQXJyYXkoKTsKLQkJdHJ5IHsKLQkJCWNvbnRleHQuZXZhbHVhdGUoCi0JCQkJc25pcHBldCwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU1vZGlmaWVycygpLAotCQkJCXN0YWNrRnJhbWUuZGVjbGFyaW5nVHlwZU5hbWUoKSwKLQkJCQlzdGFja0ZyYW1lLmlzU3RhdGljKCksCi0JCQkJc3RhY2tGcmFtZS5pc0NvbnN0cnVjdG9yQ2FsbCgpLAotCQkJCWdldEVudigpLAotCQkJCWdldE9wdGlvbnMoKSwKLQkJCQlyZXF1ZXN0b3IsCi0JCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgiTm8gdGFyZ2V0RXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCQl9Ci0JCWFzc2VydFRydWUoCi0JCQkiU2hvdWxkIGdldCBvbmUgcmVzdWx0IGJ1dCBnb3QgIiArIChyZXF1ZXN0b3IucmVzdWx0SW5kZXggKyAxKSwKLQkJCXJlcXVlc3Rvci5yZXN1bHRJbmRleCA9PSAwKTsKLQkJRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSByZXF1ZXN0b3IucmVzdWx0c1swXTsKLQkJYXNzZXJ0VHJ1ZSgiQ29kZSBzbmlwcGV0IHNob3VsZCBub3QgaGF2ZSBwcm9ibGVtcyIsICFyZXN1bHQuaGFzUHJvYmxlbXMoKSk7Ci0JCWFzc2VydFRydWUoIlJlc3VsdCBzaG91bGQgaGF2ZSBhIHZhbHVlIiwgcmVzdWx0Lmhhc1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlZhbHVlIiwgIjIiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZURpc3BsYXlTdHJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiVHlwZSIsICJpbnQiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZVR5cGVOYW1lKCkpOwotCX0gZmluYWxseSB7Ci0JCXJlbW92ZVRlbXBDbGFzcygiQTI2Iik7Ci0JfQotfQotLyoqCi0gKiBBcnJheSBSZWZlcmVuY2UKLSAqLwotcHVibGljIHZvaWQgdGVzdDAyNygpIHsKLQl0cnkgewotCQlTdHJpbmcgc291cmNlQTI3ID0KLQkJCSJwdWJsaWMgY2xhc3MgQTI3IHtcbiIKLQkJCQkrICJcdHB1YmxpYyBpbnQgZm9vKCkge1xuIgotCQkJCSsgIlx0XHRyZXR1cm4gMjtcbiIKLQkJCQkrICJcdH1cbiIKLQkJCQkrICJcdHB1YmxpYyB2b2lkIGJhcigpIHtcbiIKLQkJCQkrICJcdH1cbiIKLQkJCQkrICJcdHB1YmxpYyBpbnQgYmFyMihpbnQgaSkge1xuIgotCQkJCSsgIlx0XHRpZiAoaSA9PSAyKSB7XG4iCi0JCQkJKyAiXHRcdFx0cmV0dXJuIDM7XG4iCi0JCQkJKyAiXHRcdH0gZWxzZSB7XG4iCi0JCQkJKyAiXHRcdFx0cmV0dXJuIDQ7XG4iCi0JCQkJKyAiXHRcdH1cbiIKLQkJCQkrICJcdH1cbiIgICAgICAgICAgICAgICAKLQkJCQkrICJ9IjsKLQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBMjcsICJBMjciKTsKLQotCQlTdHJpbmcgdXNlckNvZGUgPSAibmV3IEEyNygpLmJhcigpOyI7Ci0JCUpESVN0YWNrRnJhbWUgc3RhY2tGcmFtZSA9Ci0JCQluZXcgSkRJU3RhY2tGcmFtZSgKLQkJCQl0aGlzLmpkaVZNLAotCQkJCXRoaXMsCi0JCQkJdXNlckNvZGUsCi0JCQkJIkEyNyIsCi0JCQkJImJhciIsCi0JCQkJLTEpOwotCi0JCURlYnVnUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBEZWJ1Z1JlcXVlc3RvcigpOwotCQljaGFyW10gc25pcHBldCA9IAotCQkJKCJpbnRbXSB0YWIgPSBuZXcgaW50W10geyAxLCAyLCAzLCA0LCA1fTtcbiIKLQkJCSsgInN3aXRjaChmb28oKSkge1xuIgotCQkJKyAiY2FzZSAxIDogcmV0dXJuIC0xO1xuIgotCQkJKyAiY2FzZSAyIDogcmV0dXJuIHRhYltiYXIyKGZvbygpKV07XG4iCi0JCQkrICJkZWZhdWx0OiByZXR1cm4gLTU7fSIpLnRvQ2hhckFycmF5KCk7Ci0JCXRyeSB7Ci0JCQljb250ZXh0LmV2YWx1YXRlKAotCQkJCXNuaXBwZXQsCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCQlzdGFja0ZyYW1lLmRlY2xhcmluZ1R5cGVOYW1lKCksCi0JCQkJc3RhY2tGcmFtZS5pc1N0YXRpYygpLAotCQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCQlnZXRFbnYoKSwKLQkJCQlnZXRPcHRpb25zKCksCi0JCQkJcmVxdWVzdG9yLAotCQkJCWdldFByb2JsZW1GYWN0b3J5KCkpOwotCQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQkJfQotCQlhc3NlcnRUcnVlKAotCQkJIlNob3VsZCBnZXQgb25lIHJlc3VsdCBidXQgZ290ICIgKyAocmVxdWVzdG9yLnJlc3VsdEluZGV4ICsgMSksCi0JCQlyZXF1ZXN0b3IucmVzdWx0SW5kZXggPT0gMCk7Ci0JCUV2YWx1YXRpb25SZXN1bHQgcmVzdWx0ID0gcmVxdWVzdG9yLnJlc3VsdHNbMF07Ci0JCWFzc2VydFRydWUoIkNvZGUgc25pcHBldCBzaG91bGQgbm90IGhhdmUgcHJvYmxlbXMiLCAhcmVzdWx0Lmhhc1Byb2JsZW1zKCkpOwotCQlhc3NlcnRUcnVlKCJSZXN1bHQgc2hvdWxkIGhhdmUgYSB2YWx1ZSIsIHJlc3VsdC5oYXNWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJWYWx1ZSIsICI0Ii50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVEaXNwbGF5U3RyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlR5cGUiLCAiaW50Ii50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVUeXBlTmFtZSgpKTsKLQl9IGZpbmFsbHkgewotCQlyZW1vdmVUZW1wQ2xhc3MoIkEyNyIpOwotCX0KLX0KLS8qKgotICogQXJyYXkgUmVmZXJlbmNlCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMjgoKSB7Ci0JdHJ5IHsKLQkJU3RyaW5nIHNvdXJjZUEyOCA9Ci0JCQkicHVibGljIGNsYXNzIEEyOCB7XG4iCi0JCQkJKyAiXHRwdWJsaWMgaW50IGZvbygpIHtcbiIKLQkJCQkrICJcdFx0cmV0dXJuIDI7XG4iCi0JCQkJKyAiXHR9XG4iCi0JCQkJKyAiXHRwdWJsaWMgdm9pZCBiYXIoKSB7XG4iCi0JCQkJKyAiXHR9XG4iCi0JCQkJKyAiXHRwdWJsaWMgaW50IGJhcjIoaW50IGkpIHtcbiIKLQkJCQkrICJcdFx0aWYgKGkgPT0gMikge1xuIgotCQkJCSsgIlx0XHRcdHJldHVybiAzO1xuIgotCQkJCSsgIlx0XHR9IGVsc2Uge1xuIgotCQkJCSsgIlx0XHRcdHJldHVybiA0O1xuIgotCQkJCSsgIlx0XHR9XG4iCi0JCQkJKyAiXHR9XG4iICAgICAgICAgICAgICAgCi0JCQkJKyAifSI7Ci0JCWNvbXBpbGVBbmREZXBsb3koc291cmNlQTI4LCAiQTI4Iik7Ci0KLQkJU3RyaW5nIHVzZXJDb2RlID0gIm5ldyBBMjgoKS5iYXIoKTsiOwotCQlKRElTdGFja0ZyYW1lIHN0YWNrRnJhbWUgPQotCQkJbmV3IEpESVN0YWNrRnJhbWUoCi0JCQkJdGhpcy5qZGlWTSwKLQkJCQl0aGlzLAotCQkJCXVzZXJDb2RlLAotCQkJCSJBMjgiLAotCQkJCSJiYXIiLAotCQkJCS0xKTsKLQotCQlEZWJ1Z1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgRGVidWdSZXF1ZXN0b3IoKTsKLQkJY2hhcltdIHNuaXBwZXQgPSAKLQkJCSgiaW50W10gdGFiID0gbmV3IGludFtdIHsgMSwgMiwgMywgNCwgNX07XG4iCi0JCQkrICJpbnQgaSA9MztcbiIKLQkJCSsgInN3aXRjaChmb28oKSkge1xuIgotCQkJKyAiY2FzZSAwIDogcmV0dXJuIC0xO1xuIgotCQkJKyAiY2FzZSAxIDogcmV0dXJuIHRhYltiYXIyKGZvbygpKV07XG4iCi0JCQkrICJ9XG4iCi0JCQkrICJyZXR1cm4gdGFiW2krK107IikudG9DaGFyQXJyYXkoKTsKLQkJdHJ5IHsKLQkJCWNvbnRleHQuZXZhbHVhdGUoCi0JCQkJc25pcHBldCwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU1vZGlmaWVycygpLAotCQkJCXN0YWNrRnJhbWUuZGVjbGFyaW5nVHlwZU5hbWUoKSwKLQkJCQlzdGFja0ZyYW1lLmlzU3RhdGljKCksCi0JCQkJc3RhY2tGcmFtZS5pc0NvbnN0cnVjdG9yQ2FsbCgpLAotCQkJCWdldEVudigpLAotCQkJCWdldE9wdGlvbnMoKSwKLQkJCQlyZXF1ZXN0b3IsCi0JCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgiTm8gdGFyZ2V0RXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCQl9Ci0JCWFzc2VydFRydWUoCi0JCQkiU2hvdWxkIGdldCBvbmUgcmVzdWx0IGJ1dCBnb3QgIiArIChyZXF1ZXN0b3IucmVzdWx0SW5kZXggKyAxKSwKLQkJCXJlcXVlc3Rvci5yZXN1bHRJbmRleCA9PSAwKTsKLQkJRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSByZXF1ZXN0b3IucmVzdWx0c1swXTsKLQkJYXNzZXJ0VHJ1ZSgiQ29kZSBzbmlwcGV0IHNob3VsZCBub3QgaGF2ZSBwcm9ibGVtcyIsICFyZXN1bHQuaGFzUHJvYmxlbXMoKSk7Ci0JCWFzc2VydFRydWUoIlJlc3VsdCBzaG91bGQgaGF2ZSBhIHZhbHVlIiwgcmVzdWx0Lmhhc1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlZhbHVlIiwgIjQiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZURpc3BsYXlTdHJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiVHlwZSIsICJpbnQiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZVR5cGVOYW1lKCkpOwotCX0gZmluYWxseSB7Ci0JCXJlbW92ZVRlbXBDbGFzcygiQTI4Iik7Ci0JfQotfQotLyoqCi0gKiBBcnJheSBSZWZlcmVuY2UKLSAqLwotcHVibGljIHZvaWQgdGVzdDAyOSgpIHsKLQl0cnkgewotCQlTdHJpbmcgc291cmNlQTI5ID0KLQkJCSJwdWJsaWMgY2xhc3MgQTI5IHtcbiIKLQkJCQkrICJcdHB1YmxpYyBpbnQgZm9vKCkge1xuIgotCQkJCSsgIlx0XHRyZXR1cm4gMjtcbiIKLQkJCQkrICJcdH1cbiIKLQkJCQkrICJcdHB1YmxpYyB2b2lkIGJhcigpIHtcbiIKLQkJCQkrICJcdH1cbiIKLQkJCQkrICJcdHB1YmxpYyBpbnQgYmFyMihpbnQgaSkge1xuIgotCQkJCSsgIlx0XHRpZiAoaSA9PSAyKSB7XG4iCi0JCQkJKyAiXHRcdFx0cmV0dXJuIDM7XG4iCi0JCQkJKyAiXHRcdH0gZWxzZSB7XG4iCi0JCQkJKyAiXHRcdFx0cmV0dXJuIDQ7XG4iCi0JCQkJKyAiXHRcdH1cbiIKLQkJCQkrICJcdH1cbiIgICAgICAgICAgICAgICAKLQkJCQkrICJ9IjsKLQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBMjksICJBMjkiKTsKLQotCQlTdHJpbmcgdXNlckNvZGUgPSAibmV3IEEyOSgpLmJhcigpOyI7Ci0JCUpESVN0YWNrRnJhbWUgc3RhY2tGcmFtZSA9Ci0JCQluZXcgSkRJU3RhY2tGcmFtZSgKLQkJCQl0aGlzLmpkaVZNLAotCQkJCXRoaXMsCi0JCQkJdXNlckNvZGUsCi0JCQkJIkEyOSIsCi0JCQkJImJhciIsCi0JCQkJLTEpOwotCi0JCURlYnVnUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBEZWJ1Z1JlcXVlc3RvcigpOwotCQljaGFyW10gc25pcHBldCA9IAotCQkJKCJpbnRbXSB0YWIgPSBuZXcgaW50W10geyAxLCAyLCAzLCA0LCA1fTtcbiIKLQkJCSsgImludCBpID0zO1xuIgotCQkJKyAic3dpdGNoKGZvbygpKSB7XG4iCi0JCQkrICJjYXNlIDAgOiByZXR1cm4gLTE7XG4iCi0JCQkrICJjYXNlIDEgOiByZXR1cm4gdGFiW2JhcjIoZm9vKCkpXTtcbiIKLQkJCSsgIn1cbiIKLQkJCSsgInJldHVybiB0YWJbKytpXTsiKS50b0NoYXJBcnJheSgpOwotCQl0cnkgewotCQkJY29udGV4dC5ldmFsdWF0ZSgKLQkJCQlzbmlwcGV0LAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZVR5cGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTW9kaWZpZXJzKCksCi0JCQkJc3RhY2tGcmFtZS5kZWNsYXJpbmdUeXBlTmFtZSgpLAotCQkJCXN0YWNrRnJhbWUuaXNTdGF0aWMoKSwKLQkJCQlzdGFja0ZyYW1lLmlzQ29uc3RydWN0b3JDYWxsKCksCi0JCQkJZ2V0RW52KCksCi0JCQkJZ2V0T3B0aW9ucygpLAotCQkJCXJlcXVlc3RvciwKLQkJCQlnZXRQcm9ibGVtRmFjdG9yeSgpKTsKLQkJfSBjYXRjaCAoSW5zdGFsbEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKCJObyB0YXJnZXRFeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJTaG91bGQgZ2V0IG9uZSByZXN1bHQgYnV0IGdvdCAiICsgKHJlcXVlc3Rvci5yZXN1bHRJbmRleCArIDEpLAotCQkJcmVxdWVzdG9yLnJlc3VsdEluZGV4ID09IDApOwotCQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCA9IHJlcXVlc3Rvci5yZXN1bHRzWzBdOwotCQlhc3NlcnRUcnVlKCJDb2RlIHNuaXBwZXQgc2hvdWxkIG5vdCBoYXZlIHByb2JsZW1zIiwgIXJlc3VsdC5oYXNQcm9ibGVtcygpKTsKLQkJYXNzZXJ0VHJ1ZSgiUmVzdWx0IHNob3VsZCBoYXZlIGEgdmFsdWUiLCByZXN1bHQuaGFzVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiVmFsdWUiLCAiNSIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlRGlzcGxheVN0cmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUeXBlIiwgImludCIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlVHlwZU5hbWUoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJcmVtb3ZlVGVtcENsYXNzKCJBMjkiKTsKLQl9Ci19Ci0vKioKLSAqIEFycmF5IFJlZmVyZW5jZTogQXJyYXlJbmRleE91dE9mQm91bmRFeGNlcHRpb24KLSAqLwotcHVibGljIHZvaWQgdGVzdDAzMCgpIHsKLQl0cnkgewotCQlTdHJpbmcgc291cmNlQTMwID0KLQkJCSJwdWJsaWMgY2xhc3MgQTMwIHtcbiIKLQkJCQkrICJcdHB1YmxpYyBpbnQgZm9vKCkge1xuIgotCQkJCSsgIlx0XHRyZXR1cm4gMjtcbiIKLQkJCQkrICJcdH1cbiIKLQkJCQkrICJcdHB1YmxpYyB2b2lkIGJhcigpIHtcbiIKLQkJCQkrICJcdH1cbiIKLQkJCQkrICJcdHB1YmxpYyBpbnQgYmFyMihpbnQgaSkge1xuIgotCQkJCSsgIlx0XHRpZiAoaSA9PSAyKSB7XG4iCi0JCQkJKyAiXHRcdFx0cmV0dXJuIDM7XG4iCi0JCQkJKyAiXHRcdH0gZWxzZSB7XG4iCi0JCQkJKyAiXHRcdFx0cmV0dXJuIDQ7XG4iCi0JCQkJKyAiXHRcdH1cbiIKLQkJCQkrICJcdH1cbiIgICAgICAgICAgICAgICAKLQkJCQkrICJ9IjsKLQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBMzAsICJBMzAiKTsKLQotCQlTdHJpbmcgdXNlckNvZGUgPSAibmV3IEEzMCgpLmJhcigpOyI7Ci0JCUpESVN0YWNrRnJhbWUgc3RhY2tGcmFtZSA9Ci0JCQluZXcgSkRJU3RhY2tGcmFtZSgKLQkJCQl0aGlzLmpkaVZNLAotCQkJCXRoaXMsCi0JCQkJdXNlckNvZGUsCi0JCQkJIkEzMCIsCi0JCQkJImJhciIsCi0JCQkJLTEpOwotCi0JCURlYnVnUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBEZWJ1Z1JlcXVlc3RvcigpOwotCQljaGFyW10gc25pcHBldCA9IAotCQkJKCJ0cnkge1xuIgotCQkJKyAiaW50W10gdGFiID0gbmV3IGludFtdIHsgMSwgMiwgMywgNH07XG4iCi0JCQkrICJpbnQgaSA9MztcbiIKLQkJCSsgInN3aXRjaChmb28oKSkge1xuIgotCQkJKyAiY2FzZSAwIDogcmV0dXJuIC0xO1xuIgotCQkJKyAiY2FzZSAxIDogcmV0dXJuIHRhYltiYXIyKGZvbygpKV07XG4iCi0JCQkrICJ9XG4iCi0JCQkrICJyZXR1cm4gdGFiWysraV07IgotCQkJKyAifSBjYXRjaChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkge1xuIgotCQkJKyAicmV0dXJuIC0yO1xuIgotCQkJKyAifSIpLnRvQ2hhckFycmF5KCk7Ci0JCXRyeSB7Ci0JCQljb250ZXh0LmV2YWx1YXRlKAotCQkJCXNuaXBwZXQsCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCQlzdGFja0ZyYW1lLmRlY2xhcmluZ1R5cGVOYW1lKCksCi0JCQkJc3RhY2tGcmFtZS5pc1N0YXRpYygpLAotCQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCQlnZXRFbnYoKSwKLQkJCQlnZXRPcHRpb25zKCksCi0JCQkJcmVxdWVzdG9yLAotCQkJCWdldFByb2JsZW1GYWN0b3J5KCkpOwotCQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsgCi0JCQlhc3NlcnRUcnVlKCJPbmUgdGFyZ2V0RXhjZXB0aW9uIDogQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgdHJ1ZSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJTaG91bGQgZ2V0IG9uZSByZXN1bHQgYnV0IGdvdCAiICsgKHJlcXVlc3Rvci5yZXN1bHRJbmRleCArIDEpLAotCQkJcmVxdWVzdG9yLnJlc3VsdEluZGV4ID09IDApOwotCQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCA9IHJlcXVlc3Rvci5yZXN1bHRzWzBdOwotCQlhc3NlcnRUcnVlKCJDb2RlIHNuaXBwZXQgc2hvdWxkIG5vdCBoYXZlIHByb2JsZW1zIiwgIXJlc3VsdC5oYXNQcm9ibGVtcygpKTsKLQkJYXNzZXJ0VHJ1ZSgiUmVzdWx0IHNob3VsZCBoYXZlIGEgdmFsdWUiLCByZXN1bHQuaGFzVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiVmFsdWUiLCAiLTIiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZURpc3BsYXlTdHJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiVHlwZSIsICJpbnQiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZVR5cGVOYW1lKCkpOwotCX0gZmluYWxseSB7Ci0JCXJlbW92ZVRlbXBDbGFzcygiQTMwIik7Ci0JfQotfQotLyoqCi0gKiBSZWFkIGFjY2VzcyB0byBhbiBpbnN0YW5jZSBwcml2YXRlIG1lbWJlciBvZiB0aGUgZW5jbG9zaW5nIGNsYXNzCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzEoKSB7Ci0JdHJ5IHsKLQkJU3RyaW5nIHNvdXJjZUEzMSA9Ci0JCQkicHVibGljIGNsYXNzIEEzMSB7XG4iCi0JCQkJKyAiXHRwcml2YXRlIGludCBpID0gMjtcbiIKLQkJCQkrICJcdHB1YmxpYyB2b2lkIGJhcigpIHtcbiIKLQkJCQkrICJcdH1cbiIKLQkJCQkrICJ9IjsKLQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBMzEsICJBMzEiKTsKLQotCQlTdHJpbmcgdXNlckNvZGUgPSAibmV3IEEzMSgpLmJhcigpOyI7Ci0JCUpESVN0YWNrRnJhbWUgc3RhY2tGcmFtZSA9Ci0JCQluZXcgSkRJU3RhY2tGcmFtZSgKLQkJCQl0aGlzLmpkaVZNLAotCQkJCXRoaXMsCi0JCQkJdXNlckNvZGUsCi0JCQkJIkEzMSIsCi0JCQkJImJhciIsCi0JCQkJLTEpOwotCi0JCURlYnVnUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBEZWJ1Z1JlcXVlc3RvcigpOwotCQljaGFyW10gc25pcHBldCA9ICJyZXR1cm4gaTsiLnRvQ2hhckFycmF5KCk7Ci0JCXRyeSB7Ci0JCQljb250ZXh0LmV2YWx1YXRlKAotCQkJCXNuaXBwZXQsCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCQlzdGFja0ZyYW1lLmRlY2xhcmluZ1R5cGVOYW1lKCksCi0JCQkJc3RhY2tGcmFtZS5pc1N0YXRpYygpLAotCQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCQlnZXRFbnYoKSwKLQkJCQlnZXRPcHRpb25zKCksCi0JCQkJcmVxdWVzdG9yLAotCQkJCWdldFByb2JsZW1GYWN0b3J5KCkpOwotCQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsgCi0JCQlhc3NlcnRUcnVlKCJObyB0YXJnZXRFeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJTaG91bGQgZ2V0IG9uZSByZXN1bHQgYnV0IGdvdCAiICsgKHJlcXVlc3Rvci5yZXN1bHRJbmRleCArIDEpLAotCQkJcmVxdWVzdG9yLnJlc3VsdEluZGV4ID09IDApOwotCQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCA9IHJlcXVlc3Rvci5yZXN1bHRzWzBdOwotCQlhc3NlcnRUcnVlKCJDb2RlIHNuaXBwZXQgc2hvdWxkIG5vdCBoYXZlIHByb2JsZW1zIiwgIXJlc3VsdC5oYXNQcm9ibGVtcygpKTsKLQkJYXNzZXJ0VHJ1ZSgiUmVzdWx0IHNob3VsZCBoYXZlIGEgdmFsdWUiLCByZXN1bHQuaGFzVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiVmFsdWUiLCAiMiIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlRGlzcGxheVN0cmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUeXBlIiwgImludCIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlVHlwZU5hbWUoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJcmVtb3ZlVGVtcENsYXNzKCJBMzEiKTsKLQl9Ci19Ci0vKioKLSAqIFJlYWQgYWNjZXNzIHRvIGEgaW5zdGFuY2UgcHJpdmF0ZSBtZW1iZXIgb2YgdGhlIGNsYXNzIGRpZmZlcmVudCBmcm9tIHRoZSBlbmNsb3NpbmcgY2xhc3MKLSAqLwotcHVibGljIHZvaWQgdGVzdDAzMigpIHsKLQl0cnkgewotCQlTdHJpbmcgc291cmNlQTMyID0KLQkJCSJwdWJsaWMgY2xhc3MgQTMyIHtcbiIKLQkJCQkrICJcdHByaXZhdGUgaW50IGkgPSAyO1xuIgotCQkJCSsgIlx0cHVibGljIHZvaWQgYmFyKCkge1xuIgotCQkJCSsgIlx0fVxuIgotCQkJCSsgIn0iOwotCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEzMiwgIkEzMiIpOwotCi0JCVN0cmluZyBzb3VyY2VCMzIgPQotCQkJInB1YmxpYyBjbGFzcyBCMzIge1xuIgotCQkJCSsgIlx0cHJpdmF0ZSBpbnQgaiA9IDI7XG4iCi0JCQkJKyAiXHRwdWJsaWMgdm9pZCBiYXIoKSB7XG4iCi0JCQkJKyAiXHR9XG4iCi0JCQkJKyAifSI7Ci0JCWNvbXBpbGVBbmREZXBsb3koc291cmNlQjMyLCAiQjMyIik7Ci0KLQkJU3RyaW5nIHVzZXJDb2RlID0gIm5ldyBBMzIoKS5iYXIoKTsiOwotCQlKRElTdGFja0ZyYW1lIHN0YWNrRnJhbWUgPQotCQkJbmV3IEpESVN0YWNrRnJhbWUoCi0JCQkJdGhpcy5qZGlWTSwKLQkJCQl0aGlzLAotCQkJCXVzZXJDb2RlLAotCQkJCSJBMzIiLAotCQkJCSJiYXIiLAotCQkJCS0xKTsKLQotCQlEZWJ1Z1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgRGVidWdSZXF1ZXN0b3IoKTsKLQkJY2hhcltdIHNuaXBwZXQgPSAicmV0dXJuIG5ldyBCMzIoKS5qOyIudG9DaGFyQXJyYXkoKTsKLQkJdHJ5IHsKLQkJCWNvbnRleHQuZXZhbHVhdGUoCi0JCQkJc25pcHBldCwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU1vZGlmaWVycygpLAotCQkJCXN0YWNrRnJhbWUuZGVjbGFyaW5nVHlwZU5hbWUoKSwKLQkJCQlzdGFja0ZyYW1lLmlzU3RhdGljKCksCi0JCQkJc3RhY2tGcmFtZS5pc0NvbnN0cnVjdG9yQ2FsbCgpLAotCQkJCWdldEVudigpLAotCQkJCWdldE9wdGlvbnMoKSwKLQkJCQlyZXF1ZXN0b3IsCi0JCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgeyAKLQkJCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQkJfQotCQlhc3NlcnRUcnVlKAotCQkJIlNob3VsZCBnZXQgb25lIHJlc3VsdCBidXQgZ290ICIgKyAocmVxdWVzdG9yLnJlc3VsdEluZGV4ICsgMSksCi0JCQlyZXF1ZXN0b3IucmVzdWx0SW5kZXggPT0gMCk7Ci0JCUV2YWx1YXRpb25SZXN1bHQgcmVzdWx0ID0gcmVxdWVzdG9yLnJlc3VsdHNbMF07Ci0JCWFzc2VydFRydWUoIkNvZGUgc25pcHBldCBzaG91bGQgbm90IGhhdmUgcHJvYmxlbXMiLCByZXN1bHQuaGFzUHJvYmxlbXMoKSk7Ci0JCUlQcm9ibGVtW10gcHJvYmxlbXMgPSByZXN1bHQuZ2V0UHJvYmxlbXMoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwLCBtYXggPSBwcm9ibGVtcy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7Ci0JCQlpZiAocHJvYmxlbXNbaV0uaXNFcnJvcigpKXsKLQkJCQlpZiAoYnVmZmVyID09IG51bGwpIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMTApOwotCQkJCWJ1ZmZlci5hcHBlbmQocHJvYmxlbXNbaV0uZ2V0TWVzc2FnZSgpKTsKLQkJCQlidWZmZXIuYXBwZW5kKCd8Jyk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGVycm9ycyIsCi0JCQkiVGhlIGZpZWxkIGogaXMgbm90IHZpc2libGV8IiwKLQkJCWJ1ZmZlciA9PSBudWxsID8gIm5vbmUiIDogYnVmZmVyLnRvU3RyaW5nKCkpOyAgICAgICAKLQl9IGZpbmFsbHkgewotCQlyZW1vdmVUZW1wQ2xhc3MoIkIzMiIpOwotCQlyZW1vdmVUZW1wQ2xhc3MoIkEzMiIpOwotCX0KLX0KLS8qKgotICogUmVhZCBhY2Nlc3MgdG8gYW4gaW5zdGFuY2UgcHJpdmF0ZSBtZW1iZXIgb2YgdGhlIGVuY2xvc2luZyBjbGFzcwotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDMzKCkgewotCXRyeSB7Ci0JCVN0cmluZyBzb3VyY2VBMzMgPQotCQkJInB1YmxpYyBjbGFzcyBBMzMge1xuIgotCQkJCSsgIlx0cHJpdmF0ZSBsb25nIGwgPSAyMDAwMDAwTDtcbiIKLQkJCQkrICJcdHB1YmxpYyB2b2lkIGJhcigpIHtcbiIKLQkJCQkrICJcdH1cbiIKLQkJCQkrICJ9IjsKLQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBMzMsICJBMzMiKTsKLQotCQlTdHJpbmcgdXNlckNvZGUgPSAibmV3IEEzMygpLmJhcigpOyI7Ci0JCUpESVN0YWNrRnJhbWUgc3RhY2tGcmFtZSA9Ci0JCQluZXcgSkRJU3RhY2tGcmFtZSgKLQkJCQl0aGlzLmpkaVZNLAotCQkJCXRoaXMsCi0JCQkJdXNlckNvZGUsCi0JCQkJIkEzMyIsCi0JCQkJImJhciIsCi0JCQkJLTEpOwotCi0JCURlYnVnUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBEZWJ1Z1JlcXVlc3RvcigpOwotCQljaGFyW10gc25pcHBldCA9Ci0JCQkoInRyeSB7XG4iICsKLQkJCSJDbGFzcyBjID0gQ2xhc3MuZm9yTmFtZShcIkEzM1wiKTtcbiIgKwotCQkJImphdmEubGFuZy5yZWZsZWN0LkZpZWxkIGZpZWxkID0gYy5nZXREZWNsYXJlZEZpZWxkKFwibFwiKTtcbiIgKwotCQkJImZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7XG4iICsKLQkJCSJPYmplY3QgbyA9IGMubmV3SW5zdGFuY2UoKTtcbiIgKwotCQkJIlN5c3RlbS5vdXQucHJpbnRsbihmaWVsZC5nZXRJbnQobykpO1xuIiArCi0JCQkifSBjYXRjaChFeGNlcHRpb24gZSkge31cbiIgKwotCQkJInJldHVybiBsOyIpLnRvQ2hhckFycmF5KCk7Ci0JCXRyeSB7Ci0JCQljb250ZXh0LmV2YWx1YXRlKAotCQkJCXNuaXBwZXQsCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCQlzdGFja0ZyYW1lLmRlY2xhcmluZ1R5cGVOYW1lKCksCi0JCQkJc3RhY2tGcmFtZS5pc1N0YXRpYygpLAotCQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCQlnZXRFbnYoKSwKLQkJCQlnZXRPcHRpb25zKCksCi0JCQkJcmVxdWVzdG9yLAotCQkJCWdldFByb2JsZW1GYWN0b3J5KCkpOwotCQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsgCi0JCQlhc3NlcnRUcnVlKCJObyB0YXJnZXRFeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJTaG91bGQgZ2V0IG9uZSByZXN1bHQgYnV0IGdvdCAiICsgKHJlcXVlc3Rvci5yZXN1bHRJbmRleCArIDEpLAotCQkJcmVxdWVzdG9yLnJlc3VsdEluZGV4ID09IDApOwotCQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCA9IHJlcXVlc3Rvci5yZXN1bHRzWzBdOwotCQlhc3NlcnRUcnVlKCJDb2RlIHNuaXBwZXQgc2hvdWxkIG5vdCBoYXZlIHByb2JsZW1zIiwgIXJlc3VsdC5oYXNQcm9ibGVtcygpKTsKLQkJYXNzZXJ0VHJ1ZSgiUmVzdWx0IHNob3VsZCBoYXZlIGEgdmFsdWUiLCByZXN1bHQuaGFzVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiVmFsdWUiLCAiMjAwMDAwMCIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlRGlzcGxheVN0cmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUeXBlIiwgImxvbmciLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZVR5cGVOYW1lKCkpOwotCX0gZmluYWxseSB7Ci0JCXJlbW92ZVRlbXBDbGFzcygiQTMzIik7Ci0JfQotfQotLyoqCi0gKiBXcml0ZSBhY2Nlc3MgdG8gYW4gaW5zdGFuY2UgcHJpdmF0ZSBtZW1iZXIgb2YgdGhlIGVuY2xvc2luZyBjbGFzcwotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDM0KCkgewotCXRyeSB7Ci0JCVN0cmluZyBzb3VyY2VBMzQgPQotCQkJInB1YmxpYyBjbGFzcyBBMzQge1xuIgotCQkJCSsgIlx0cHJpdmF0ZSBsb25nIGwgPSAyMDAwMDAwTDtcbiIKLQkJCQkrICJcdHB1YmxpYyB2b2lkIGJhcigpIHtcbiIKLQkJCQkrICJcdH1cbiIKLQkJCQkrICJ9IjsKLQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBMzQsICJBMzQiKTsKLQotCQlTdHJpbmcgdXNlckNvZGUgPSAibmV3IEEzNCgpLmJhcigpOyI7Ci0JCUpESVN0YWNrRnJhbWUgc3RhY2tGcmFtZSA9Ci0JCQluZXcgSkRJU3RhY2tGcmFtZSh0aGlzLmpkaVZNLCB0aGlzLCB1c2VyQ29kZSwgIkEzNCIsICJiYXIiLCAtMSk7Ci0KLQkJRGVidWdSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IERlYnVnUmVxdWVzdG9yKCk7Ci0JCWNoYXJbXSBzbmlwcGV0ID0KLQkJCSgibCA9IDEwMEw7XG4iICsKLQkJCSJyZXR1cm4gbDsiKS50b0NoYXJBcnJheSgpOwotCQl0cnkgewotCQkJY29udGV4dC5ldmFsdWF0ZSgKLQkJCQlzbmlwcGV0LAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZVR5cGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTW9kaWZpZXJzKCksCi0JCQkJc3RhY2tGcmFtZS5kZWNsYXJpbmdUeXBlTmFtZSgpLAotCQkJCXN0YWNrRnJhbWUuaXNTdGF0aWMoKSwKLQkJCQlzdGFja0ZyYW1lLmlzQ29uc3RydWN0b3JDYWxsKCksCi0JCQkJZ2V0RW52KCksCi0JCQkJZ2V0T3B0aW9ucygpLAotCQkJCXJlcXVlc3RvciwKLQkJCQlnZXRQcm9ibGVtRmFjdG9yeSgpKTsKLQkJfSBjYXRjaCAoSW5zdGFsbEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKCJObyB0YXJnZXRFeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJTaG91bGQgZ2V0IG9uZSByZXN1bHQgYnV0IGdvdCAiICsgKHJlcXVlc3Rvci5yZXN1bHRJbmRleCArIDEpLAotCQkJcmVxdWVzdG9yLnJlc3VsdEluZGV4ID09IDApOwotCQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCA9IHJlcXVlc3Rvci5yZXN1bHRzWzBdOwotCQlhc3NlcnRUcnVlKCJDb2RlIHNuaXBwZXQgc2hvdWxkIG5vdCBoYXZlIHByb2JsZW1zIiwgIXJlc3VsdC5oYXNQcm9ibGVtcygpKTsKLQkJYXNzZXJ0VHJ1ZSgiUmVzdWx0IHNob3VsZCBoYXZlIGEgdmFsdWUiLCByZXN1bHQuaGFzVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiVmFsdWUiLCAiMTAwIi50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVEaXNwbGF5U3RyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlR5cGUiLCAibG9uZyIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlVHlwZU5hbWUoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJcmVtb3ZlVGVtcENsYXNzKCJBMzQiKTsKLQl9Ci19Ci0vKioKLSAqIFJlYWQgYWNjZXNzIHRvIGEgc3RhdGljIHByaXZhdGUgbWVtYmVyIG9mIHRoZSBlbmNsb3NpbmcgY2xhc3MKLSAqLwotcHVibGljIHZvaWQgdGVzdDAzNSgpIHsKLQl0cnkgewotCQlTdHJpbmcgc291cmNlQTM1ID0KLQkJCSJwdWJsaWMgY2xhc3MgQTM1IHtcbiIKLQkJCQkrICJcdHN0YXRpYyBwcml2YXRlIGludCBpID0gMjtcbiIKLQkJCQkrICJcdHB1YmxpYyB2b2lkIGJhcigpIHtcbiIKLQkJCQkrICJcdH1cbiIKLQkJCQkrICJ9IjsKLQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBMzUsICJBMzUiKTsKLQotCQlTdHJpbmcgdXNlckNvZGUgPSAibmV3IEEzNSgpLmJhcigpOyI7Ci0JCUpESVN0YWNrRnJhbWUgc3RhY2tGcmFtZSA9Ci0JCQluZXcgSkRJU3RhY2tGcmFtZSgKLQkJCQl0aGlzLmpkaVZNLAotCQkJCXRoaXMsCi0JCQkJdXNlckNvZGUsCi0JCQkJIkEzNSIsCi0JCQkJImJhciIsCi0JCQkJLTEpOwotCi0JCURlYnVnUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBEZWJ1Z1JlcXVlc3RvcigpOwotCQljaGFyW10gc25pcHBldCA9ICJyZXR1cm4gaTsiLnRvQ2hhckFycmF5KCk7Ci0JCXRyeSB7Ci0JCQljb250ZXh0LmV2YWx1YXRlKAotCQkJCXNuaXBwZXQsCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCQlzdGFja0ZyYW1lLmRlY2xhcmluZ1R5cGVOYW1lKCksCi0JCQkJc3RhY2tGcmFtZS5pc1N0YXRpYygpLAotCQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCQlnZXRFbnYoKSwKLQkJCQlnZXRPcHRpb25zKCksCi0JCQkJcmVxdWVzdG9yLAotCQkJCWdldFByb2JsZW1GYWN0b3J5KCkpOwotCQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsgCi0JCQlhc3NlcnRUcnVlKCJObyB0YXJnZXRFeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJTaG91bGQgZ2V0IG9uZSByZXN1bHQgYnV0IGdvdCAiICsgKHJlcXVlc3Rvci5yZXN1bHRJbmRleCArIDEpLAotCQkJcmVxdWVzdG9yLnJlc3VsdEluZGV4ID09IDApOwotCQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCA9IHJlcXVlc3Rvci5yZXN1bHRzWzBdOwotCQlhc3NlcnRUcnVlKCJDb2RlIHNuaXBwZXQgc2hvdWxkIG5vdCBoYXZlIHByb2JsZW1zIiwgIXJlc3VsdC5oYXNQcm9ibGVtcygpKTsKLQkJYXNzZXJ0VHJ1ZSgiUmVzdWx0IHNob3VsZCBoYXZlIGEgdmFsdWUiLCByZXN1bHQuaGFzVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiVmFsdWUiLCAiMiIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlRGlzcGxheVN0cmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUeXBlIiwgImludCIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlVHlwZU5hbWUoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJcmVtb3ZlVGVtcENsYXNzKCJBMzUiKTsKLQl9Ci19Ci0vKioKLSAqIENvdW1wb3VuZCBhc3NpZ25lbWVudCB0byBhbiBpbnN0YW5jZSBwcml2YXRlIG1lbWJlciBvZiB0aGUgZW5jbG9zaW5nIGNsYXNzCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzYoKSB7Ci0JdHJ5IHsKLQkJU3RyaW5nIHNvdXJjZUEzNiA9Ci0JCQkicHVibGljIGNsYXNzIEEzNiB7XG4iCi0JCQkJKyAiXHRwcml2YXRlIGxvbmcgbCA9IDIwMDAwMDBMO1xuIgotCQkJCSsgIlx0cHVibGljIHZvaWQgYmFyKCkge1xuIgotCQkJCSsgIlx0fVxuIgotCQkJCSsgIn0iOwotCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEzNiwgIkEzNiIpOwotCi0JCVN0cmluZyB1c2VyQ29kZSA9ICJuZXcgQTM2KCkuYmFyKCk7IjsKLQkJSkRJU3RhY2tGcmFtZSBzdGFja0ZyYW1lID0KLQkJCW5ldyBKRElTdGFja0ZyYW1lKHRoaXMuamRpVk0sIHRoaXMsIHVzZXJDb2RlLCAiQTM2IiwgImJhciIsIC0xKTsKLQotCQlEZWJ1Z1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgRGVidWdSZXF1ZXN0b3IoKTsKLQkJY2hhcltdIHNuaXBwZXQgPQotCQkJKCJsKz00O1xuIiArCi0JCQkicmV0dXJuIGw7IikudG9DaGFyQXJyYXkoKTsKLQkJdHJ5IHsKLQkJCWNvbnRleHQuZXZhbHVhdGUoCi0JCQkJc25pcHBldCwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU1vZGlmaWVycygpLAotCQkJCXN0YWNrRnJhbWUuZGVjbGFyaW5nVHlwZU5hbWUoKSwKLQkJCQlzdGFja0ZyYW1lLmlzU3RhdGljKCksCi0JCQkJc3RhY2tGcmFtZS5pc0NvbnN0cnVjdG9yQ2FsbCgpLAotCQkJCWdldEVudigpLAotCQkJCWdldE9wdGlvbnMoKSwKLQkJCQlyZXF1ZXN0b3IsCi0JCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgiTm8gdGFyZ2V0RXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCQl9Ci0JCWFzc2VydFRydWUoCi0JCQkiU2hvdWxkIGdldCBvbmUgcmVzdWx0IGJ1dCBnb3QgIiArIChyZXF1ZXN0b3IucmVzdWx0SW5kZXggKyAxKSwKLQkJCXJlcXVlc3Rvci5yZXN1bHRJbmRleCA9PSAwKTsKLQkJRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSByZXF1ZXN0b3IucmVzdWx0c1swXTsKLQkJYXNzZXJ0VHJ1ZSgiQ29kZSBzbmlwcGV0IHNob3VsZCBub3QgaGF2ZSBwcm9ibGVtcyIsICFyZXN1bHQuaGFzUHJvYmxlbXMoKSk7Ci0JCWFzc2VydFRydWUoIlJlc3VsdCBzaG91bGQgaGF2ZSBhIHZhbHVlIiwgcmVzdWx0Lmhhc1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlZhbHVlIiwgIjIwMDAwMDQiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZURpc3BsYXlTdHJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiVHlwZSIsICJsb25nIi50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVUeXBlTmFtZSgpKTsKLQl9IGZpbmFsbHkgewotCQlyZW1vdmVUZW1wQ2xhc3MoIkEzNiIpOwotCX0KLX0KLS8qKgotICogQ291bXBvdW5kIGFzc2lnbmVtZW50IHRvIGFuIGluc3RhbmNlIHByaXZhdGUgbWVtYmVyIG9mIHRoZSBlbmNsb3NpbmcgY2xhc3MKLSAqLwotcHVibGljIHZvaWQgdGVzdDAzNygpIHsKLQl0cnkgewotCQlTdHJpbmcgc291cmNlQTM3ID0KLQkJCSJwdWJsaWMgY2xhc3MgQTM3IHtcbiIKLQkJCQkrICJcdHByaXZhdGUgbG9uZyBsID0gMjAwMDAwMEw7XG4iCi0JCQkJKyAiXHRwdWJsaWMgdm9pZCBiYXIoKSB7XG4iCi0JCQkJKyAiXHR9XG4iCi0JCQkJKyAifSI7Ci0JCWNvbXBpbGVBbmREZXBsb3koc291cmNlQTM3LCAiQTM3Iik7Ci0KLQkJU3RyaW5nIHVzZXJDb2RlID0gIm5ldyBBMzcoKS5iYXIoKTsiOwotCQlKRElTdGFja0ZyYW1lIHN0YWNrRnJhbWUgPQotCQkJbmV3IEpESVN0YWNrRnJhbWUodGhpcy5qZGlWTSwgdGhpcywgdXNlckNvZGUsICJBMzciLCAiYmFyIiwgLTEpOwotCi0JCURlYnVnUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBEZWJ1Z1JlcXVlc3RvcigpOwotCQljaGFyW10gc25pcHBldCA9Ci0JCQkoImwrKztcbiIgKwotCQkJInJldHVybiBsOyIpLnRvQ2hhckFycmF5KCk7Ci0JCXRyeSB7Ci0JCQljb250ZXh0LmV2YWx1YXRlKAotCQkJCXNuaXBwZXQsCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCQlzdGFja0ZyYW1lLmRlY2xhcmluZ1R5cGVOYW1lKCksCi0JCQkJc3RhY2tGcmFtZS5pc1N0YXRpYygpLAotCQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCQlnZXRFbnYoKSwKLQkJCQlnZXRPcHRpb25zKCksCi0JCQkJcmVxdWVzdG9yLAotCQkJCWdldFByb2JsZW1GYWN0b3J5KCkpOwotCQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQkJfQotCQlhc3NlcnRUcnVlKAotCQkJIlNob3VsZCBnZXQgb25lIHJlc3VsdCBidXQgZ290ICIgKyAocmVxdWVzdG9yLnJlc3VsdEluZGV4ICsgMSksCi0JCQlyZXF1ZXN0b3IucmVzdWx0SW5kZXggPT0gMCk7Ci0JCUV2YWx1YXRpb25SZXN1bHQgcmVzdWx0ID0gcmVxdWVzdG9yLnJlc3VsdHNbMF07Ci0JCWFzc2VydFRydWUoIkNvZGUgc25pcHBldCBzaG91bGQgbm90IGhhdmUgcHJvYmxlbXMiLCAhcmVzdWx0Lmhhc1Byb2JsZW1zKCkpOwotCQlhc3NlcnRUcnVlKCJSZXN1bHQgc2hvdWxkIGhhdmUgYSB2YWx1ZSIsIHJlc3VsdC5oYXNWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJWYWx1ZSIsICIyMDAwMDAxIi50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVEaXNwbGF5U3RyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlR5cGUiLCAibG9uZyIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlVHlwZU5hbWUoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJcmVtb3ZlVGVtcENsYXNzKCJBMzciKTsKLQl9Ci19Ci0vKioKLSAqIENvdW1wb3VuZCBhc3NpZ25lbWVudCB0byBhbiBpbnN0YW5jZSBwcml2YXRlIG1lbWJlciBvZiB0aGUgZW5jbG9zaW5nIGNsYXNzCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMzgoKSB7Ci0JdHJ5IHsKLQkJU3RyaW5nIHNvdXJjZUEzOCA9Ci0JCQkicHVibGljIGNsYXNzIEEzOCB7XG4iCi0JCQkJKyAiXHRwcml2YXRlIGxvbmcgbCA9IDIwMDAwMDBMO1xuIgotCQkJCSsgIlx0cHVibGljIHZvaWQgYmFyKCkge1xuIgotCQkJCSsgIlx0fVxuIgotCQkJCSsgIn0iOwotCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEzOCwgIkEzOCIpOwotCi0JCVN0cmluZyB1c2VyQ29kZSA9ICJuZXcgQTM4KCkuYmFyKCk7IjsKLQkJSkRJU3RhY2tGcmFtZSBzdGFja0ZyYW1lID0KLQkJCW5ldyBKRElTdGFja0ZyYW1lKHRoaXMuamRpVk0sIHRoaXMsIHVzZXJDb2RlLCAiQTM4IiwgImJhciIsIC0xKTsKLQotCQlEZWJ1Z1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgRGVidWdSZXF1ZXN0b3IoKTsKLQkJY2hhcltdIHNuaXBwZXQgPSAicmV0dXJuIGwrKzsiLnRvQ2hhckFycmF5KCk7Ci0JCXRyeSB7Ci0JCQljb250ZXh0LmV2YWx1YXRlKAotCQkJCXNuaXBwZXQsCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCQlzdGFja0ZyYW1lLmRlY2xhcmluZ1R5cGVOYW1lKCksCi0JCQkJc3RhY2tGcmFtZS5pc1N0YXRpYygpLAotCQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCQlnZXRFbnYoKSwKLQkJCQlnZXRPcHRpb25zKCksCi0JCQkJcmVxdWVzdG9yLAotCQkJCWdldFByb2JsZW1GYWN0b3J5KCkpOwotCQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQkJfQotCQlhc3NlcnRUcnVlKAotCQkJIlNob3VsZCBnZXQgb25lIHJlc3VsdCBidXQgZ290ICIgKyAocmVxdWVzdG9yLnJlc3VsdEluZGV4ICsgMSksCi0JCQlyZXF1ZXN0b3IucmVzdWx0SW5kZXggPT0gMCk7Ci0JCUV2YWx1YXRpb25SZXN1bHQgcmVzdWx0ID0gcmVxdWVzdG9yLnJlc3VsdHNbMF07Ci0JCWFzc2VydFRydWUoIkNvZGUgc25pcHBldCBzaG91bGQgbm90IGhhdmUgcHJvYmxlbXMiLCAhcmVzdWx0Lmhhc1Byb2JsZW1zKCkpOwotCQlhc3NlcnRUcnVlKCJSZXN1bHQgc2hvdWxkIGhhdmUgYSB2YWx1ZSIsIHJlc3VsdC5oYXNWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJWYWx1ZSIsICIyMDAwMDAwIi50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVEaXNwbGF5U3RyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlR5cGUiLCAibG9uZyIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlVHlwZU5hbWUoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJcmVtb3ZlVGVtcENsYXNzKCJBMzgiKTsKLQl9Ci19Ci0vKioKLSAqIENvdW1wb3VuZCBhc3NpZ25lbWVudCB0byBhbiBzdGF0aWMgcHJpdmF0ZSBtZW1iZXIgb2YgdGhlIGVuY2xvc2luZyBjbGFzcwotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDM5KCkgewotCXRyeSB7Ci0JCVN0cmluZyBzb3VyY2VBMzkgPQotCQkJInB1YmxpYyBjbGFzcyBBMzkge1xuIgotCQkJCSsgIlx0c3RhdGljIHByaXZhdGUgaW50IGkgPSAyO1xuIgotCQkJCSsgIlx0cHVibGljIHZvaWQgYmFyKCkge1xuIgotCQkJCSsgIlx0fVxuIgotCQkJCSsgIn0iOwotCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUEzOSwgIkEzOSIpOwotCi0JCVN0cmluZyB1c2VyQ29kZSA9ICJuZXcgQTM5KCkuYmFyKCk7IjsKLQkJSkRJU3RhY2tGcmFtZSBzdGFja0ZyYW1lID0KLQkJCW5ldyBKRElTdGFja0ZyYW1lKHRoaXMuamRpVk0sIHRoaXMsIHVzZXJDb2RlLCAiQTM5IiwgImJhciIsIC0xKTsKLQotCQlEZWJ1Z1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgRGVidWdSZXF1ZXN0b3IoKTsKLQkJY2hhcltdIHNuaXBwZXQgPSAicmV0dXJuIEEzOS5pOyIudG9DaGFyQXJyYXkoKTsKLQkJdHJ5IHsKLQkJCWNvbnRleHQuZXZhbHVhdGUoCi0JCQkJc25pcHBldCwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU1vZGlmaWVycygpLAotCQkJCXN0YWNrRnJhbWUuZGVjbGFyaW5nVHlwZU5hbWUoKSwKLQkJCQlzdGFja0ZyYW1lLmlzU3RhdGljKCksCi0JCQkJc3RhY2tGcmFtZS5pc0NvbnN0cnVjdG9yQ2FsbCgpLAotCQkJCWdldEVudigpLAotCQkJCWdldE9wdGlvbnMoKSwKLQkJCQlyZXF1ZXN0b3IsCi0JCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgiTm8gdGFyZ2V0RXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCQl9Ci0JCWFzc2VydFRydWUoCi0JCQkiU2hvdWxkIGdldCBvbmUgcmVzdWx0IGJ1dCBnb3QgIiArIChyZXF1ZXN0b3IucmVzdWx0SW5kZXggKyAxKSwKLQkJCXJlcXVlc3Rvci5yZXN1bHRJbmRleCA9PSAwKTsKLQkJRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSByZXF1ZXN0b3IucmVzdWx0c1swXTsKLQkJYXNzZXJ0VHJ1ZSgiQ29kZSBzbmlwcGV0IHNob3VsZCBub3QgaGF2ZSBwcm9ibGVtcyIsICFyZXN1bHQuaGFzUHJvYmxlbXMoKSk7Ci0JCWFzc2VydFRydWUoIlJlc3VsdCBzaG91bGQgaGF2ZSBhIHZhbHVlIiwgcmVzdWx0Lmhhc1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlZhbHVlIiwgIjIiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZURpc3BsYXlTdHJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiVHlwZSIsICJpbnQiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZVR5cGVOYW1lKCkpOwotCX0gZmluYWxseSB7Ci0JCXJlbW92ZVRlbXBDbGFzcygiQTM5Iik7Ci0JfQotfQotLyoqCi0gKiBDb3VtcG91bmQgYXNzaWduZW1lbnQgdG8gYW4gc3RhdGljIHByaXZhdGUgbWVtYmVyIG9mIHRoZSBlbmNsb3NpbmcgY2xhc3MKLSAqLwotcHVibGljIHZvaWQgdGVzdDA0MCgpIHsKLQl0cnkgewotCQlTdHJpbmcgc291cmNlQTQwID0KLQkJCSJwdWJsaWMgY2xhc3MgQTQwIHtcbiIKLQkJCQkrICJcdHN0YXRpYyBwcml2YXRlIGludFtdIHRhYiA9IG5ldyBpbnRbXSB7MSwgMn07XG4iCi0JCQkJKyAiXHRwdWJsaWMgdm9pZCBiYXIoKSB7XG4iCi0JCQkJKyAiXHR9XG4iCi0JCQkJKyAifSI7Ci0JCWNvbXBpbGVBbmREZXBsb3koc291cmNlQTQwLCAiQTQwIik7Ci0KLQkJU3RyaW5nIHVzZXJDb2RlID0gIm5ldyBBNDAoKS5iYXIoKTsiOwotCQlKRElTdGFja0ZyYW1lIHN0YWNrRnJhbWUgPQotCQkJbmV3IEpESVN0YWNrRnJhbWUodGhpcy5qZGlWTSwgdGhpcywgdXNlckNvZGUsICJBNDAiLCAiYmFyIiwgLTEpOwotCi0JCURlYnVnUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBEZWJ1Z1JlcXVlc3RvcigpOwotCQljaGFyW10gc25pcHBldCA9ICJyZXR1cm4gQTQwLnRhYi5sZW5ndGg7Ii50b0NoYXJBcnJheSgpOwotCQl0cnkgewotCQkJY29udGV4dC5ldmFsdWF0ZSgKLQkJCQlzbmlwcGV0LAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZVR5cGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTW9kaWZpZXJzKCksCi0JCQkJc3RhY2tGcmFtZS5kZWNsYXJpbmdUeXBlTmFtZSgpLAotCQkJCXN0YWNrRnJhbWUuaXNTdGF0aWMoKSwKLQkJCQlzdGFja0ZyYW1lLmlzQ29uc3RydWN0b3JDYWxsKCksCi0JCQkJZ2V0RW52KCksCi0JCQkJZ2V0T3B0aW9ucygpLAotCQkJCXJlcXVlc3RvciwKLQkJCQlnZXRQcm9ibGVtRmFjdG9yeSgpKTsKLQkJfSBjYXRjaCAoSW5zdGFsbEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKCJObyB0YXJnZXRFeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJTaG91bGQgZ2V0IG9uZSByZXN1bHQgYnV0IGdvdCAiICsgKHJlcXVlc3Rvci5yZXN1bHRJbmRleCArIDEpLAotCQkJcmVxdWVzdG9yLnJlc3VsdEluZGV4ID09IDApOwotCQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCA9IHJlcXVlc3Rvci5yZXN1bHRzWzBdOwotCQlhc3NlcnRUcnVlKCJDb2RlIHNuaXBwZXQgc2hvdWxkIG5vdCBoYXZlIHByb2JsZW1zIiwgIXJlc3VsdC5oYXNQcm9ibGVtcygpKTsKLQkJYXNzZXJ0VHJ1ZSgiUmVzdWx0IHNob3VsZCBoYXZlIGEgdmFsdWUiLCByZXN1bHQuaGFzVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiVmFsdWUiLCAiMiIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlRGlzcGxheVN0cmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUeXBlIiwgImludCIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlVHlwZU5hbWUoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJcmVtb3ZlVGVtcENsYXNzKCJBNDAiKTsKLQl9Ci19Ci0vKioKLSAqIENvdW1wb3VuZCBhc3NpZ25lbWVudCB0byBhbiBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBtZW1iZXIgb2YgdGhlIGVuY2xvc2luZyBjbGFzcwotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDQxKCkgewotCXRyeSB7Ci0JCVN0cmluZyBzb3VyY2VBNDEgPQotCQkJInB1YmxpYyBjbGFzcyBBNDEge1xuIgotCQkJCSsgIlx0c3RhdGljIHByaXZhdGUgZmluYWwgaW50W10gdGFiID0gbmV3IGludFtdIHsxLCAyfTtcbiIKLQkJCQkrICJcdHB1YmxpYyB2b2lkIGJhcigpIHtcbiIKLQkJCQkrICJcdH1cbiIKLQkJCQkrICJ9IjsKLQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBNDEsICJBNDEiKTsKLQotCQlTdHJpbmcgdXNlckNvZGUgPSAibmV3IEE0MSgpLmJhcigpOyI7Ci0JCUpESVN0YWNrRnJhbWUgc3RhY2tGcmFtZSA9Ci0JCQluZXcgSkRJU3RhY2tGcmFtZSh0aGlzLmpkaVZNLCB0aGlzLCB1c2VyQ29kZSwgIkE0MSIsICJiYXIiLCAtMSk7Ci0KLQkJRGVidWdSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IERlYnVnUmVxdWVzdG9yKCk7Ci0JCWNoYXJbXSBzbmlwcGV0ID0gInJldHVybiBBNDEudGFiLmxlbmd0aDsiLnRvQ2hhckFycmF5KCk7Ci0JCXRyeSB7Ci0JCQljb250ZXh0LmV2YWx1YXRlKAotCQkJCXNuaXBwZXQsCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCQlzdGFja0ZyYW1lLmRlY2xhcmluZ1R5cGVOYW1lKCksCi0JCQkJc3RhY2tGcmFtZS5pc1N0YXRpYygpLAotCQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCQlnZXRFbnYoKSwKLQkJCQlnZXRPcHRpb25zKCksCi0JCQkJcmVxdWVzdG9yLAotCQkJCWdldFByb2JsZW1GYWN0b3J5KCkpOwotCQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQkJfQotCQlhc3NlcnRUcnVlKAotCQkJIlNob3VsZCBnZXQgb25lIHJlc3VsdCBidXQgZ290ICIgKyAocmVxdWVzdG9yLnJlc3VsdEluZGV4ICsgMSksCi0JCQlyZXF1ZXN0b3IucmVzdWx0SW5kZXggPT0gMCk7Ci0JCUV2YWx1YXRpb25SZXN1bHQgcmVzdWx0ID0gcmVxdWVzdG9yLnJlc3VsdHNbMF07Ci0JCWFzc2VydFRydWUoIkNvZGUgc25pcHBldCBzaG91bGQgbm90IGhhdmUgcHJvYmxlbXMiLCAhcmVzdWx0Lmhhc1Byb2JsZW1zKCkpOwotCQlhc3NlcnRUcnVlKCJSZXN1bHQgc2hvdWxkIGhhdmUgYSB2YWx1ZSIsIHJlc3VsdC5oYXNWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJWYWx1ZSIsICIyIi50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVEaXNwbGF5U3RyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlR5cGUiLCAiaW50Ii50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVUeXBlTmFtZSgpKTsKLQl9IGZpbmFsbHkgewotCQlyZW1vdmVUZW1wQ2xhc3MoIkE0MSIpOwotCX0KLX0KLS8qKgotICogQ291bXBvdW5kIGFzc2lnbmVtZW50IHRvIGFuIHN0YXRpYyBwcml2YXRlIGZpbmFsIG1lbWJlciBvZiB0aGUgZW5jbG9zaW5nIGNsYXNzCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwNDIoKSB7Ci0JdHJ5IHsKLQkJU3RyaW5nIHNvdXJjZUE0MiA9Ci0JCQkicHVibGljIGNsYXNzIEE0MiB7XG4iCi0JCQkJKyAiXHRzdGF0aWMgcHJpdmF0ZSBpbnQgQ291bnRlciA9IDA7XG4iCi0JCQkJKyAiXHRwdWJsaWMgdm9pZCBiYXIoKSB7XG4iCi0JCQkJKyAiXHR9XG4iCi0JCQkJKyAifSI7Ci0JCWNvbXBpbGVBbmREZXBsb3koc291cmNlQTQyLCAiQTQyIik7Ci0KLQkJU3RyaW5nIHVzZXJDb2RlID0gIm5ldyBBNDIoKS5iYXIoKTsiOwotCQlKRElTdGFja0ZyYW1lIHN0YWNrRnJhbWUgPQotCQkJbmV3IEpESVN0YWNrRnJhbWUodGhpcy5qZGlWTSwgdGhpcywgdXNlckNvZGUsICJBNDIiLCAiYmFyIiwgLTEpOwotCi0JCURlYnVnUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBEZWJ1Z1JlcXVlc3RvcigpOwotCQljaGFyW10gc25pcHBldCA9ICJyZXR1cm4gKytBNDIuQ291bnRlcjsiLnRvQ2hhckFycmF5KCk7Ci0JCXRyeSB7Ci0JCQljb250ZXh0LmV2YWx1YXRlKAotCQkJCXNuaXBwZXQsCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCQlzdGFja0ZyYW1lLmRlY2xhcmluZ1R5cGVOYW1lKCksCi0JCQkJc3RhY2tGcmFtZS5pc1N0YXRpYygpLAotCQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCQlnZXRFbnYoKSwKLQkJCQlnZXRPcHRpb25zKCksCi0JCQkJcmVxdWVzdG9yLAotCQkJCWdldFByb2JsZW1GYWN0b3J5KCkpOwotCQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQkJfQotCQlhc3NlcnRUcnVlKAotCQkJIlNob3VsZCBnZXQgb25lIHJlc3VsdCBidXQgZ290ICIgKyAocmVxdWVzdG9yLnJlc3VsdEluZGV4ICsgMSksCi0JCQlyZXF1ZXN0b3IucmVzdWx0SW5kZXggPT0gMCk7Ci0JCUV2YWx1YXRpb25SZXN1bHQgcmVzdWx0ID0gcmVxdWVzdG9yLnJlc3VsdHNbMF07Ci0JCWFzc2VydFRydWUoIkNvZGUgc25pcHBldCBzaG91bGQgbm90IGhhdmUgcHJvYmxlbXMiLCAhcmVzdWx0Lmhhc1Byb2JsZW1zKCkpOwotCQlhc3NlcnRUcnVlKCJSZXN1bHQgc2hvdWxkIGhhdmUgYSB2YWx1ZSIsIHJlc3VsdC5oYXNWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJWYWx1ZSIsICIxIi50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVEaXNwbGF5U3RyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlR5cGUiLCAiaW50Ii50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVUeXBlTmFtZSgpKTsKLQl9IGZpbmFsbHkgewotCQlyZW1vdmVUZW1wQ2xhc3MoIkE0MiIpOwotCX0KLX0KLS8qKgotICogQ291bXBvdW5kIGFzc2lnbmVtZW50IHRvIGFuIHN0YXRpYyBwcml2YXRlIGZpbmFsIG1lbWJlciBvZiB0aGUgZW5jbG9zaW5nIGNsYXNzCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwNDMoKSB7Ci0JdHJ5IHsKLQkJU3RyaW5nIHNvdXJjZUE0MyA9Ci0JCQkicHVibGljIGNsYXNzIEE0MyB7XG4iCi0JCQkJKyAiXHRzdGF0aWMgcHJpdmF0ZSBpbnQgQ291bnRlciA9IDA7XG4iCi0JCQkJKyAiXHRwdWJsaWMgdm9pZCBiYXIoKSB7XG4iCi0JCQkJKyAiXHR9XG4iCi0JCQkJKyAifSI7Ci0JCWNvbXBpbGVBbmREZXBsb3koc291cmNlQTQzLCAiQTQzIik7Ci0KLQkJU3RyaW5nIHVzZXJDb2RlID0gIm5ldyBBNDMoKS5iYXIoKTsiOwotCQlKRElTdGFja0ZyYW1lIHN0YWNrRnJhbWUgPQotCQkJbmV3IEpESVN0YWNrRnJhbWUodGhpcy5qZGlWTSwgdGhpcywgdXNlckNvZGUsICJBNDMiLCAiYmFyIiwgLTEpOwotCi0JCURlYnVnUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBEZWJ1Z1JlcXVlc3RvcigpOwotCQljaGFyW10gc25pcHBldCA9ICJBNDMuQ291bnRlcisrOyByZXR1cm4gQTQzLkNvdW50ZXI7Ii50b0NoYXJBcnJheSgpOwotCQl0cnkgewotCQkJY29udGV4dC5ldmFsdWF0ZSgKLQkJCQlzbmlwcGV0LAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZVR5cGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTW9kaWZpZXJzKCksCi0JCQkJc3RhY2tGcmFtZS5kZWNsYXJpbmdUeXBlTmFtZSgpLAotCQkJCXN0YWNrRnJhbWUuaXNTdGF0aWMoKSwKLQkJCQlzdGFja0ZyYW1lLmlzQ29uc3RydWN0b3JDYWxsKCksCi0JCQkJZ2V0RW52KCksCi0JCQkJZ2V0T3B0aW9ucygpLAotCQkJCXJlcXVlc3RvciwKLQkJCQlnZXRQcm9ibGVtRmFjdG9yeSgpKTsKLQkJfSBjYXRjaCAoSW5zdGFsbEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKCJObyB0YXJnZXRFeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJTaG91bGQgZ2V0IG9uZSByZXN1bHQgYnV0IGdvdCAiICsgKHJlcXVlc3Rvci5yZXN1bHRJbmRleCArIDEpLAotCQkJcmVxdWVzdG9yLnJlc3VsdEluZGV4ID09IDApOwotCQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCA9IHJlcXVlc3Rvci5yZXN1bHRzWzBdOwotCQlhc3NlcnRUcnVlKCJDb2RlIHNuaXBwZXQgc2hvdWxkIG5vdCBoYXZlIHByb2JsZW1zIiwgIXJlc3VsdC5oYXNQcm9ibGVtcygpKTsKLQkJYXNzZXJ0VHJ1ZSgiUmVzdWx0IHNob3VsZCBoYXZlIGEgdmFsdWUiLCByZXN1bHQuaGFzVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiVmFsdWUiLCAiMSIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlRGlzcGxheVN0cmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUeXBlIiwgImludCIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlVHlwZU5hbWUoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJcmVtb3ZlVGVtcENsYXNzKCJBNDMiKTsKLQl9Ci19Ci0vKioKLSAqIENvdW1wb3VuZCBhc3NpZ25lbWVudCB0byBhbiBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBtZW1iZXIgb2YgdGhlIGVuY2xvc2luZyBjbGFzcwotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDQ0KCkgewotCXRyeSB7Ci0JCVN0cmluZyBzb3VyY2VBNDQgPQotCQkJInB1YmxpYyBjbGFzcyBBNDQge1xuIgotCQkJCSsgIlx0c3RhdGljIHByaXZhdGUgaW50IENvdW50ZXIgPSAwO1xuIgotCQkJCSsgIlx0cHVibGljIHZvaWQgYmFyKCkge1xuIgotCQkJCSsgIlx0fVxuIgotCQkJCSsgIn0iOwotCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUE0NCwgIkE0NCIpOwotCi0JCVN0cmluZyB1c2VyQ29kZSA9ICJuZXcgQTQ0KCkuYmFyKCk7IjsKLQkJSkRJU3RhY2tGcmFtZSBzdGFja0ZyYW1lID0KLQkJCW5ldyBKRElTdGFja0ZyYW1lKHRoaXMuamRpVk0sIHRoaXMsIHVzZXJDb2RlLCAiQTQ0IiwgImJhciIsIC0xKTsKLQotCQlEZWJ1Z1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgRGVidWdSZXF1ZXN0b3IoKTsKLQkJY2hhcltdIHNuaXBwZXQgPSAiaW50IGogPSBBNDQuQ291bnRlcisrOyByZXR1cm4gQTQ0LkNvdW50ZXIgKyBqOyIudG9DaGFyQXJyYXkoKTsKLQkJdHJ5IHsKLQkJCWNvbnRleHQuZXZhbHVhdGUoCi0JCQkJc25pcHBldCwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU1vZGlmaWVycygpLAotCQkJCXN0YWNrRnJhbWUuZGVjbGFyaW5nVHlwZU5hbWUoKSwKLQkJCQlzdGFja0ZyYW1lLmlzU3RhdGljKCksCi0JCQkJc3RhY2tGcmFtZS5pc0NvbnN0cnVjdG9yQ2FsbCgpLAotCQkJCWdldEVudigpLAotCQkJCWdldE9wdGlvbnMoKSwKLQkJCQlyZXF1ZXN0b3IsCi0JCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgiTm8gdGFyZ2V0RXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCQl9Ci0JCWFzc2VydFRydWUoCi0JCQkiU2hvdWxkIGdldCBvbmUgcmVzdWx0IGJ1dCBnb3QgIiArIChyZXF1ZXN0b3IucmVzdWx0SW5kZXggKyAxKSwKLQkJCXJlcXVlc3Rvci5yZXN1bHRJbmRleCA9PSAwKTsKLQkJRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSByZXF1ZXN0b3IucmVzdWx0c1swXTsKLQkJYXNzZXJ0VHJ1ZSgiQ29kZSBzbmlwcGV0IHNob3VsZCBub3QgaGF2ZSBwcm9ibGVtcyIsICFyZXN1bHQuaGFzUHJvYmxlbXMoKSk7Ci0JCWFzc2VydFRydWUoIlJlc3VsdCBzaG91bGQgaGF2ZSBhIHZhbHVlIiwgcmVzdWx0Lmhhc1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlZhbHVlIiwgIjEiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZURpc3BsYXlTdHJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiVHlwZSIsICJpbnQiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZVR5cGVOYW1lKCkpOwotCX0gZmluYWxseSB7Ci0JCXJlbW92ZVRlbXBDbGFzcygiQTQ0Iik7Ci0JfQotfQotLyoqCi0gKiBDb3VtcG91bmQgYXNzaWduZW1lbnQgdG8gYW4gc3RhdGljIHByaXZhdGUgZmluYWwgbWVtYmVyIG9mIHRoZSBlbmNsb3NpbmcgY2xhc3MKLSAqLwotcHVibGljIHZvaWQgdGVzdDA0NSgpIHsKLQl0cnkgewotCQlTdHJpbmcgc291cmNlQTQ1ID0KLQkJCSJwdWJsaWMgY2xhc3MgQTQ1IHtcbiIKLQkJCQkrICJcdHN0YXRpYyBwcml2YXRlIGludCBDb3VudGVyID0gMDtcbiIKLQkJCQkrICJcdHB1YmxpYyB2b2lkIGJhcigpIHtcbiIKLQkJCQkrICJcdH1cbiIKLQkJCQkrICJ9IjsKLQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBNDUsICJBNDUiKTsKLQotCQlTdHJpbmcgdXNlckNvZGUgPSAibmV3IEE0NSgpLmJhcigpOyI7Ci0JCUpESVN0YWNrRnJhbWUgc3RhY2tGcmFtZSA9Ci0JCQluZXcgSkRJU3RhY2tGcmFtZSh0aGlzLmpkaVZNLCB0aGlzLCB1c2VyQ29kZSwgIkE0NSIsICJiYXIiLCAtMSk7Ci0KLQkJRGVidWdSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IERlYnVnUmVxdWVzdG9yKCk7Ci0JCWNoYXJbXSBzbmlwcGV0ID0gImludCBqID0gKytBNDUuQ291bnRlcjsgcmV0dXJuIEE0NS5Db3VudGVyICsgajsiLnRvQ2hhckFycmF5KCk7Ci0JCXRyeSB7Ci0JCQljb250ZXh0LmV2YWx1YXRlKAotCQkJCXNuaXBwZXQsCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCQlzdGFja0ZyYW1lLmRlY2xhcmluZ1R5cGVOYW1lKCksCi0JCQkJc3RhY2tGcmFtZS5pc1N0YXRpYygpLAotCQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCQlnZXRFbnYoKSwKLQkJCQlnZXRPcHRpb25zKCksCi0JCQkJcmVxdWVzdG9yLAotCQkJCWdldFByb2JsZW1GYWN0b3J5KCkpOwotCQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQkJfQotCQlhc3NlcnRUcnVlKAotCQkJIlNob3VsZCBnZXQgb25lIHJlc3VsdCBidXQgZ290ICIgKyAocmVxdWVzdG9yLnJlc3VsdEluZGV4ICsgMSksCi0JCQlyZXF1ZXN0b3IucmVzdWx0SW5kZXggPT0gMCk7Ci0JCUV2YWx1YXRpb25SZXN1bHQgcmVzdWx0ID0gcmVxdWVzdG9yLnJlc3VsdHNbMF07Ci0JCWFzc2VydFRydWUoIkNvZGUgc25pcHBldCBzaG91bGQgbm90IGhhdmUgcHJvYmxlbXMiLCAhcmVzdWx0Lmhhc1Byb2JsZW1zKCkpOwotCQlhc3NlcnRUcnVlKCJSZXN1bHQgc2hvdWxkIGhhdmUgYSB2YWx1ZSIsIHJlc3VsdC5oYXNWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJWYWx1ZSIsICIyIi50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVEaXNwbGF5U3RyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlR5cGUiLCAiaW50Ii50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVUeXBlTmFtZSgpKTsKLQl9IGZpbmFsbHkgewotCQlyZW1vdmVUZW1wQ2xhc3MoIkE0NSIpOwotCX0KLX0KLS8qKgotICogQ291bXBvdW5kIGFzc2lnbmVtZW50IHRvIGFuIHN0YXRpYyBwcm90ZWN0ZWQgZmluYWwgbWVtYmVyIG9mIHRoZSBlbmNsb3NpbmcgY2xhc3MKLSAqLwotcHVibGljIHZvaWQgdGVzdDA0NigpIHsKLQl0cnkgewotCQlTdHJpbmcgc291cmNlQTQ2ID0KLQkJCSJwdWJsaWMgY2xhc3MgQTQ2IHtcbiIKLQkJCQkrICJcdHN0YXRpYyBwcm90ZWN0ZWQgaW50IENvdW50ZXIgPSAwO1xuIgotCQkJCSsgIlx0cHVibGljIHZvaWQgYmFyKCkge1xuIgotCQkJCSsgIlx0fVxuIgotCQkJCSsgIn0iOwotCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUE0NiwgIkE0NiIpOwotCi0JCVN0cmluZyB1c2VyQ29kZSA9ICJuZXcgQTQ2KCkuYmFyKCk7IjsKLQkJSkRJU3RhY2tGcmFtZSBzdGFja0ZyYW1lID0KLQkJCW5ldyBKRElTdGFja0ZyYW1lKHRoaXMuamRpVk0sIHRoaXMsIHVzZXJDb2RlLCAiQTQ2IiwgImJhciIsIC0xKTsKLQotCQlEZWJ1Z1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgRGVidWdSZXF1ZXN0b3IoKTsKLQkJY2hhcltdIHNuaXBwZXQgPSAiaW50IGogPSArK0E0Ni5Db3VudGVyOyByZXR1cm4gQTQ2LkNvdW50ZXIgKyBqOyIudG9DaGFyQXJyYXkoKTsKLQkJdHJ5IHsKLQkJCWNvbnRleHQuZXZhbHVhdGUoCi0JCQkJc25pcHBldCwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU1vZGlmaWVycygpLAotCQkJCXN0YWNrRnJhbWUuZGVjbGFyaW5nVHlwZU5hbWUoKSwKLQkJCQlzdGFja0ZyYW1lLmlzU3RhdGljKCksCi0JCQkJc3RhY2tGcmFtZS5pc0NvbnN0cnVjdG9yQ2FsbCgpLAotCQkJCWdldEVudigpLAotCQkJCWdldE9wdGlvbnMoKSwKLQkJCQlyZXF1ZXN0b3IsCi0JCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgiTm8gdGFyZ2V0RXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCQl9Ci0JCWFzc2VydFRydWUoCi0JCQkiU2hvdWxkIGdldCBvbmUgcmVzdWx0IGJ1dCBnb3QgIiArIChyZXF1ZXN0b3IucmVzdWx0SW5kZXggKyAxKSwKLQkJCXJlcXVlc3Rvci5yZXN1bHRJbmRleCA9PSAwKTsKLQkJRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSByZXF1ZXN0b3IucmVzdWx0c1swXTsKLQkJYXNzZXJ0VHJ1ZSgiQ29kZSBzbmlwcGV0IHNob3VsZCBub3QgaGF2ZSBwcm9ibGVtcyIsICFyZXN1bHQuaGFzUHJvYmxlbXMoKSk7Ci0JCWFzc2VydFRydWUoIlJlc3VsdCBzaG91bGQgaGF2ZSBhIHZhbHVlIiwgcmVzdWx0Lmhhc1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlZhbHVlIiwgIjIiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZURpc3BsYXlTdHJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiVHlwZSIsICJpbnQiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZVR5cGVOYW1lKCkpOwotCX0gZmluYWxseSB7Ci0JCXJlbW92ZVRlbXBDbGFzcygiQTQ2Iik7Ci0JfQotfQotLyoqCi0gKiBSZXR1cm4gdGhlIHZhbHVlIG9mIGEgcHJpdmF0ZSBzdGF0aWMgZmllbGQgdGhyb3VnaHQgYSBwcml2YXRlIHN0YXRpYyBmaWVsZAotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDQ3KCkgewotCXRyeSB7Ci0JCVN0cmluZyBzb3VyY2VBNDcgPQotCQkJInB1YmxpYyBjbGFzcyBBNDcge1xuIgotCQkJCSsgIlx0c3RhdGljIHByaXZhdGUgQTQ3IGluc3RhbmNlID0gbmV3IEE0NygpO1xuIgotCQkJCSsgIlx0c3RhdGljIHByaXZhdGUgaW50IENvdW50ZXIgPSAyO1xuIiAgICAgICAgICAgICAKLQkJCQkrICJcdHB1YmxpYyB2b2lkIGJhcigpIHtcbiIKLQkJCQkrICJcdH1cbiIKLQkJCQkrICJ9IjsKLQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBNDcsICJBNDciKTsKLQotCQlTdHJpbmcgdXNlckNvZGUgPSAibmV3IEE0NygpLmJhcigpOyI7Ci0JCUpESVN0YWNrRnJhbWUgc3RhY2tGcmFtZSA9Ci0JCQluZXcgSkRJU3RhY2tGcmFtZSh0aGlzLmpkaVZNLCB0aGlzLCB1c2VyQ29kZSwgIkE0NyIsICJiYXIiLCAtMSk7Ci0KLQkJRGVidWdSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IERlYnVnUmVxdWVzdG9yKCk7Ci0JCWNoYXJbXSBzbmlwcGV0ID0gInJldHVybiBBNDcuaW5zdGFuY2UuQ291bnRlcjsiLnRvQ2hhckFycmF5KCk7Ci0JCXRyeSB7Ci0JCQljb250ZXh0LmV2YWx1YXRlKAotCQkJCXNuaXBwZXQsCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCQlzdGFja0ZyYW1lLmRlY2xhcmluZ1R5cGVOYW1lKCksCi0JCQkJc3RhY2tGcmFtZS5pc1N0YXRpYygpLAotCQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCQlnZXRFbnYoKSwKLQkJCQlnZXRPcHRpb25zKCksCi0JCQkJcmVxdWVzdG9yLAotCQkJCWdldFByb2JsZW1GYWN0b3J5KCkpOwotCQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQkJfQotCQlhc3NlcnRUcnVlKAotCQkJIlNob3VsZCBnZXQgb25lIHJlc3VsdCBidXQgZ290ICIgKyAocmVxdWVzdG9yLnJlc3VsdEluZGV4ICsgMSksCi0JCQlyZXF1ZXN0b3IucmVzdWx0SW5kZXggPT0gMCk7Ci0JCUV2YWx1YXRpb25SZXN1bHQgcmVzdWx0ID0gcmVxdWVzdG9yLnJlc3VsdHNbMF07Ci0JCWFzc2VydFRydWUoIkNvZGUgc25pcHBldCBzaG91bGQgbm90IGhhdmUgcHJvYmxlbXMiLCAhcmVzdWx0Lmhhc1Byb2JsZW1zKCkpOwotCQlhc3NlcnRUcnVlKCJSZXN1bHQgc2hvdWxkIGhhdmUgYSB2YWx1ZSIsIHJlc3VsdC5oYXNWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJWYWx1ZSIsICIyIi50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVEaXNwbGF5U3RyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlR5cGUiLCAiaW50Ii50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVUeXBlTmFtZSgpKTsKLQl9IGZpbmFsbHkgewotCQlyZW1vdmVUZW1wQ2xhc3MoIkE0NyIpOwotCX0KLX0KLS8qKgotICogUmV0dXJuIHRoZSB2YWx1ZSBvZiBhIHByaXZhdGUgc3RhdGljIGZpZWxkIHRocm91Z2h0IGEgcHJpdmF0ZSBzdGF0aWMgZmllbGQKLSAqIFVzaW5nIHByaXZhdGUgZmllbGQgZW11bGF0aW9uIG9uIGEgZmllbGQgcmVmZXJlbmNlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDQ4KCkgewotCXRyeSB7Ci0JCVN0cmluZyBzb3VyY2VBNDggPQotCQkJInB1YmxpYyBjbGFzcyBBNDgge1xuIgotCQkJCSsgIlx0c3RhdGljIHByaXZhdGUgQTQ4IGluc3RhbmNlID0gbmV3IEE0OCgpO1xuIgotCQkJCSsgIlx0c3RhdGljIHByaXZhdGUgaW50IENvdW50ZXIgPSAyO1xuIiAgICAgICAgICAgICAKLQkJCQkrICJcdHB1YmxpYyB2b2lkIGJhcigpIHtcbiIKLQkJCQkrICJcdH1cbiIKLQkJCQkrICJ9IjsKLQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBNDgsICJBNDgiKTsKLQotCQlTdHJpbmcgdXNlckNvZGUgPSAibmV3IEE0OCgpLmJhcigpOyI7Ci0JCUpESVN0YWNrRnJhbWUgc3RhY2tGcmFtZSA9Ci0JCQluZXcgSkRJU3RhY2tGcmFtZSh0aGlzLmpkaVZNLCB0aGlzLCB1c2VyQ29kZSwgIkE0OCIsICJiYXIiLCAtMSk7Ci0KLQkJRGVidWdSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IERlYnVnUmVxdWVzdG9yKCk7Ci0JCWNoYXJbXSBzbmlwcGV0ID0gInJldHVybiBuZXcgQTQ4KCkuaW5zdGFuY2UuQ291bnRlcjsiLnRvQ2hhckFycmF5KCk7Ci0JCXRyeSB7Ci0JCQljb250ZXh0LmV2YWx1YXRlKAotCQkJCXNuaXBwZXQsCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCQlzdGFja0ZyYW1lLmRlY2xhcmluZ1R5cGVOYW1lKCksCi0JCQkJc3RhY2tGcmFtZS5pc1N0YXRpYygpLAotCQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCQlnZXRFbnYoKSwKLQkJCQlnZXRPcHRpb25zKCksCi0JCQkJcmVxdWVzdG9yLAotCQkJCWdldFByb2JsZW1GYWN0b3J5KCkpOwotCQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQkJfQotCQlhc3NlcnRUcnVlKAotCQkJIlNob3VsZCBnZXQgb25lIHJlc3VsdCBidXQgZ290ICIgKyAocmVxdWVzdG9yLnJlc3VsdEluZGV4ICsgMSksCi0JCQlyZXF1ZXN0b3IucmVzdWx0SW5kZXggPT0gMCk7Ci0JCUV2YWx1YXRpb25SZXN1bHQgcmVzdWx0ID0gcmVxdWVzdG9yLnJlc3VsdHNbMF07Ci0JCWFzc2VydFRydWUoIkNvZGUgc25pcHBldCBzaG91bGQgbm90IGhhdmUgcHJvYmxlbXMiLCAhcmVzdWx0Lmhhc1Byb2JsZW1zKCkpOwotCQlhc3NlcnRUcnVlKCJSZXN1bHQgc2hvdWxkIGhhdmUgYSB2YWx1ZSIsIHJlc3VsdC5oYXNWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJWYWx1ZSIsICIyIi50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVEaXNwbGF5U3RyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlR5cGUiLCAiaW50Ii50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVUeXBlTmFtZSgpKTsKLQl9IGZpbmFsbHkgewotCQlyZW1vdmVUZW1wQ2xhc3MoIkE0OCIpOwotCX0KLX0KLS8qKgotICogQ29tcG91bmQgYXNzaWdubWVudCBvZiBhIHByaXZhdGUgZmllbGQuCi0gKiBVc2luZyBwcml2YXRlIGZpZWxkIGVtdWxhdGlvbiBvbiBhIGZpZWxkIHJlZmVyZW5jZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdDA0OSgpIHsKLQl0cnkgewotCQlTdHJpbmcgc291cmNlQTQ5ID0KLQkJCSJwdWJsaWMgY2xhc3MgQTQ5IHtcbiIKLQkJCQkrICJcdHN0YXRpYyBwcml2YXRlIEE0OSBpbnN0YW5jZSA9IG5ldyBBNDkoKTtcbiIKLQkJCQkrICJcdHN0YXRpYyBwcml2YXRlIGludCBDb3VudGVyID0gMjtcbiIgICAgICAgICAgICAgCi0JCQkJKyAiXHRwdWJsaWMgdm9pZCBiYXIoKSB7XG4iCi0JCQkJKyAiXHR9XG4iCi0JCQkJKyAifSI7Ci0JCWNvbXBpbGVBbmREZXBsb3koc291cmNlQTQ5LCAiQTQ5Iik7Ci0KLQkJU3RyaW5nIHVzZXJDb2RlID0gIm5ldyBBNDkoKS5iYXIoKTsiOwotCQlKRElTdGFja0ZyYW1lIHN0YWNrRnJhbWUgPQotCQkJbmV3IEpESVN0YWNrRnJhbWUodGhpcy5qZGlWTSwgdGhpcywgdXNlckNvZGUsICJBNDkiLCAiYmFyIiwgLTEpOwotCi0JCURlYnVnUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBEZWJ1Z1JlcXVlc3RvcigpOwotCQljaGFyW10gc25pcHBldCA9ICJyZXR1cm4gKysobmV3IEE0OSgpLkNvdW50ZXIpOyIudG9DaGFyQXJyYXkoKTsKLQkJdHJ5IHsKLQkJCWNvbnRleHQuZXZhbHVhdGUoCi0JCQkJc25pcHBldCwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU1vZGlmaWVycygpLAotCQkJCXN0YWNrRnJhbWUuZGVjbGFyaW5nVHlwZU5hbWUoKSwKLQkJCQlzdGFja0ZyYW1lLmlzU3RhdGljKCksCi0JCQkJc3RhY2tGcmFtZS5pc0NvbnN0cnVjdG9yQ2FsbCgpLAotCQkJCWdldEVudigpLAotCQkJCWdldE9wdGlvbnMoKSwKLQkJCQlyZXF1ZXN0b3IsCi0JCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgiTm8gdGFyZ2V0RXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCQl9Ci0JCWFzc2VydFRydWUoCi0JCQkiU2hvdWxkIGdldCBvbmUgcmVzdWx0IGJ1dCBnb3QgIiArIChyZXF1ZXN0b3IucmVzdWx0SW5kZXggKyAxKSwKLQkJCXJlcXVlc3Rvci5yZXN1bHRJbmRleCA9PSAwKTsKLQkJRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSByZXF1ZXN0b3IucmVzdWx0c1swXTsKLQkJYXNzZXJ0VHJ1ZSgiQ29kZSBzbmlwcGV0IHNob3VsZCBub3QgaGF2ZSBwcm9ibGVtcyIsICFyZXN1bHQuaGFzUHJvYmxlbXMoKSk7Ci0JCWFzc2VydFRydWUoIlJlc3VsdCBzaG91bGQgaGF2ZSBhIHZhbHVlIiwgcmVzdWx0Lmhhc1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlZhbHVlIiwgIjMiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZURpc3BsYXlTdHJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiVHlwZSIsICJpbnQiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZVR5cGVOYW1lKCkpOwotCX0gZmluYWxseSB7Ci0JCXJlbW92ZVRlbXBDbGFzcygiQTQ5Iik7Ci0JfQotfQotLyoqCi0gKiBDb21wb3VuZCBhc3NpZ25tZW50IG9mIGEgcHJpdmF0ZSBmaWVsZC4KLSAqIFVzaW5nIHByaXZhdGUgZmllbGQgZW11bGF0aW9uIG9uIGEgZmllbGQgcmVmZXJlbmNlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDUwKCkgewotCXRyeSB7Ci0JCVN0cmluZyBzb3VyY2VBNTAgPQotCQkJInB1YmxpYyBjbGFzcyBBNTAge1xuIgotCQkJCSsgIlx0c3RhdGljIHByaXZhdGUgQTUwIGluc3RhbmNlID0gbmV3IEE1MCgpO1xuIgotCQkJCSsgIlx0c3RhdGljIHByaXZhdGUgaW50IENvdW50ZXIgPSAyO1xuIiAgICAgICAgICAgICAKLQkJCQkrICJcdHB1YmxpYyB2b2lkIGJhcigpIHtcbiIKLQkJCQkrICJcdH1cbiIKLQkJCQkrICJ9IjsKLQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBNTAsICJBNTAiKTsKLQotCQlTdHJpbmcgdXNlckNvZGUgPSAibmV3IEE1MCgpLmJhcigpOyI7Ci0JCUpESVN0YWNrRnJhbWUgc3RhY2tGcmFtZSA9Ci0JCQluZXcgSkRJU3RhY2tGcmFtZSh0aGlzLmpkaVZNLCB0aGlzLCB1c2VyQ29kZSwgIkE1MCIsICJiYXIiLCAtMSk7Ci0KLQkJRGVidWdSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IERlYnVnUmVxdWVzdG9yKCk7Ci0JCWNoYXJbXSBzbmlwcGV0ID0gIkE1MCBhID0gbmV3IEE1MCgpOyBhLkNvdW50ZXIgPSA1OyByZXR1cm4gYS5Db3VudGVyOyIudG9DaGFyQXJyYXkoKTsKLQkJdHJ5IHsKLQkJCWNvbnRleHQuZXZhbHVhdGUoCi0JCQkJc25pcHBldCwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU1vZGlmaWVycygpLAotCQkJCXN0YWNrRnJhbWUuZGVjbGFyaW5nVHlwZU5hbWUoKSwKLQkJCQlzdGFja0ZyYW1lLmlzU3RhdGljKCksCi0JCQkJc3RhY2tGcmFtZS5pc0NvbnN0cnVjdG9yQ2FsbCgpLAotCQkJCWdldEVudigpLAotCQkJCWdldE9wdGlvbnMoKSwKLQkJCQlyZXF1ZXN0b3IsCi0JCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgiTm8gdGFyZ2V0RXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCQl9Ci0JCWFzc2VydFRydWUoCi0JCQkiU2hvdWxkIGdldCBvbmUgcmVzdWx0IGJ1dCBnb3QgIiArIChyZXF1ZXN0b3IucmVzdWx0SW5kZXggKyAxKSwKLQkJCXJlcXVlc3Rvci5yZXN1bHRJbmRleCA9PSAwKTsKLQkJRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSByZXF1ZXN0b3IucmVzdWx0c1swXTsKLQkJYXNzZXJ0VHJ1ZSgiQ29kZSBzbmlwcGV0IHNob3VsZCBub3QgaGF2ZSBwcm9ibGVtcyIsICFyZXN1bHQuaGFzUHJvYmxlbXMoKSk7Ci0JCWFzc2VydFRydWUoIlJlc3VsdCBzaG91bGQgaGF2ZSBhIHZhbHVlIiwgcmVzdWx0Lmhhc1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlZhbHVlIiwgIjUiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZURpc3BsYXlTdHJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiVHlwZSIsICJpbnQiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZVR5cGVOYW1lKCkpOwotCX0gZmluYWxseSB7Ci0JCXJlbW92ZVRlbXBDbGFzcygiQTUwIik7Ci0JfQotfQotLyoqCi0gKiBBc3NpZ25tZW50IG9mIGEgcHJpdmF0ZSBmaWVsZC4KLSAqIFVzaW5nIHByaXZhdGUgZmllbGQgZW11bGF0aW9uIG9uIGEgZmllbGQgcmVmZXJlbmNlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDUxKCkgewotCXRyeSB7Ci0JCVN0cmluZyBzb3VyY2VBNTEgPQotCQkJInB1YmxpYyBjbGFzcyBBNTEge1xuIgotCQkJCSsgIlx0c3RhdGljIHByaXZhdGUgQTUxIGluc3RhbmNlID0gbmV3IEE1MSgpO1xuIgotCQkJCSsgIlx0c3RhdGljIHByaXZhdGUgaW50IENvdW50ZXIgPSAyO1xuIiAgICAgICAgICAgICAKLQkJCQkrICJcdHB1YmxpYyB2b2lkIGJhcigpIHtcbiIKLQkJCQkrICJcdH1cbiIKLQkJCQkrICJ9IjsKLQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBNTEsICJBNTEiKTsKLQotCQlTdHJpbmcgdXNlckNvZGUgPSAibmV3IEE1MSgpLmJhcigpOyI7Ci0JCUpESVN0YWNrRnJhbWUgc3RhY2tGcmFtZSA9Ci0JCQluZXcgSkRJU3RhY2tGcmFtZSh0aGlzLmpkaVZNLCB0aGlzLCB1c2VyQ29kZSwgIkE1MSIsICJiYXIiLCAtMSk7Ci0KLQkJRGVidWdSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IERlYnVnUmVxdWVzdG9yKCk7Ci0JCWNoYXJbXSBzbmlwcGV0ID0gIkNvdW50ZXIgPSA1OyByZXR1cm4gQ291bnRlcjsiLnRvQ2hhckFycmF5KCk7Ci0JCXRyeSB7Ci0JCQljb250ZXh0LmV2YWx1YXRlKAotCQkJCXNuaXBwZXQsCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCQlzdGFja0ZyYW1lLmRlY2xhcmluZ1R5cGVOYW1lKCksCi0JCQkJc3RhY2tGcmFtZS5pc1N0YXRpYygpLAotCQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCQlnZXRFbnYoKSwKLQkJCQlnZXRPcHRpb25zKCksCi0JCQkJcmVxdWVzdG9yLAotCQkJCWdldFByb2JsZW1GYWN0b3J5KCkpOwotCQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQkJfQotCQlhc3NlcnRUcnVlKAotCQkJIlNob3VsZCBnZXQgb25lIHJlc3VsdCBidXQgZ290ICIgKyAocmVxdWVzdG9yLnJlc3VsdEluZGV4ICsgMSksCi0JCQlyZXF1ZXN0b3IucmVzdWx0SW5kZXggPT0gMCk7Ci0JCUV2YWx1YXRpb25SZXN1bHQgcmVzdWx0ID0gcmVxdWVzdG9yLnJlc3VsdHNbMF07Ci0JCWFzc2VydFRydWUoIkNvZGUgc25pcHBldCBzaG91bGQgbm90IGhhdmUgcHJvYmxlbXMiLCAhcmVzdWx0Lmhhc1Byb2JsZW1zKCkpOwotCQlhc3NlcnRUcnVlKCJSZXN1bHQgc2hvdWxkIGhhdmUgYSB2YWx1ZSIsIHJlc3VsdC5oYXNWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJWYWx1ZSIsICI1Ii50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVEaXNwbGF5U3RyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlR5cGUiLCAiaW50Ii50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVUeXBlTmFtZSgpKTsKLQl9IGZpbmFsbHkgewotCQlyZW1vdmVUZW1wQ2xhc3MoIkE1MSIpOwotCX0KLX0KLS8qKgotICogQXNzaWdubWVudCBvZiBhIHByaXZhdGUgZmllbGQuCi0gKiBVc2luZyBwcml2YXRlIGZpZWxkIGVtdWxhdGlvbiBvbiBhIGZpZWxkIHJlZmVyZW5jZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdDA1MigpIHsKLQl0cnkgewotCQlTdHJpbmcgc291cmNlQTUyID0KLQkJCSJwdWJsaWMgY2xhc3MgQTUyIHtcbiIKLQkJCQkrICJcdHN0YXRpYyBwcml2YXRlIEE1MiBpbnN0YW5jZSA9IG5ldyBBNTIoKTtcbiIKLQkJCQkrICJcdHN0YXRpYyBwcml2YXRlIGludCBDb3VudGVyID0gMjtcbiIgICAgICAgICAgICAgCi0JCQkJKyAiXHRwdWJsaWMgdm9pZCBiYXIoKSB7XG4iCi0JCQkJKyAiXHR9XG4iCi0JCQkJKyAifSI7Ci0JCWNvbXBpbGVBbmREZXBsb3koc291cmNlQTUyLCAiQTUyIik7Ci0KLQkJU3RyaW5nIHVzZXJDb2RlID0gIm5ldyBBNTIoKS5iYXIoKTsiOwotCQlKRElTdGFja0ZyYW1lIHN0YWNrRnJhbWUgPQotCQkJbmV3IEpESVN0YWNrRnJhbWUodGhpcy5qZGlWTSwgdGhpcywgdXNlckNvZGUsICJBNTIiLCAiYmFyIiwgLTEpOwotCi0JCURlYnVnUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBEZWJ1Z1JlcXVlc3RvcigpOwotCQljaGFyW10gc25pcHBldCA9ICJ0aGlzLkNvdW50ZXIgPSA1OyByZXR1cm4gdGhpcy5Db3VudGVyOyIudG9DaGFyQXJyYXkoKTsKLQkJdHJ5IHsKLQkJCWNvbnRleHQuZXZhbHVhdGUoCi0JCQkJc25pcHBldCwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU1vZGlmaWVycygpLAotCQkJCXN0YWNrRnJhbWUuZGVjbGFyaW5nVHlwZU5hbWUoKSwKLQkJCQlzdGFja0ZyYW1lLmlzU3RhdGljKCksCi0JCQkJc3RhY2tGcmFtZS5pc0NvbnN0cnVjdG9yQ2FsbCgpLAotCQkJCWdldEVudigpLAotCQkJCWdldE9wdGlvbnMoKSwKLQkJCQlyZXF1ZXN0b3IsCi0JCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgiTm8gdGFyZ2V0RXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCQl9Ci0JCWFzc2VydFRydWUoCi0JCQkiU2hvdWxkIGdldCBvbmUgcmVzdWx0IGJ1dCBnb3QgIiArIChyZXF1ZXN0b3IucmVzdWx0SW5kZXggKyAxKSwKLQkJCXJlcXVlc3Rvci5yZXN1bHRJbmRleCA9PSAwKTsKLQkJRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSByZXF1ZXN0b3IucmVzdWx0c1swXTsKLQkJYXNzZXJ0VHJ1ZSgiQ29kZSBzbmlwcGV0IHNob3VsZCBub3QgaGF2ZSBwcm9ibGVtcyIsICFyZXN1bHQuaGFzUHJvYmxlbXMoKSk7Ci0JCWFzc2VydFRydWUoIlJlc3VsdCBzaG91bGQgaGF2ZSBhIHZhbHVlIiwgcmVzdWx0Lmhhc1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlZhbHVlIiwgIjUiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZURpc3BsYXlTdHJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiVHlwZSIsICJpbnQiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZVR5cGVOYW1lKCkpOwotCX0gZmluYWxseSB7Ci0JCXJlbW92ZVRlbXBDbGFzcygiQTUyIik7Ci0JfQotfQotLyoqCi0gKiBQb3N0IGFzc2lnbmVtZW50IG9mIGEgcHJpdmF0ZSBmaWVsZC4KLSAqIFVzaW5nIHByaXZhdGUgZmllbGQgZW11bGF0aW9uIG9uIGEgZmllbGQgcmVmZXJlbmNlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDUzKCkgewotCXRyeSB7Ci0JCVN0cmluZyBzb3VyY2VBNTMgPQotCQkJInB1YmxpYyBjbGFzcyBBNTMge1xuIgotCQkJCSsgIlx0c3RhdGljIHByaXZhdGUgQTUzIGluc3RhbmNlID0gbmV3IEE1MygpO1xuIgotCQkJCSsgIlx0c3RhdGljIHByaXZhdGUgaW50IENvdW50ZXIgPSAyO1xuIiAgICAgICAgICAgICAKLQkJCQkrICJcdHB1YmxpYyB2b2lkIGJhcigpIHtcbiIKLQkJCQkrICJcdH1cbiIKLQkJCQkrICJ9IjsKLQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBNTMsICJBNTMiKTsKLQotCQlTdHJpbmcgdXNlckNvZGUgPSAibmV3IEE1MygpLmJhcigpOyI7Ci0JCUpESVN0YWNrRnJhbWUgc3RhY2tGcmFtZSA9Ci0JCQluZXcgSkRJU3RhY2tGcmFtZSh0aGlzLmpkaVZNLCB0aGlzLCB1c2VyQ29kZSwgIkE1MyIsICJiYXIiLCAtMSk7Ci0KLQkJRGVidWdSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IERlYnVnUmVxdWVzdG9yKCk7Ci0JCWNoYXJbXSBzbmlwcGV0ID0gInRoaXMuQ291bnRlcisrOyByZXR1cm4gdGhpcy5Db3VudGVyOyIudG9DaGFyQXJyYXkoKTsKLQkJdHJ5IHsKLQkJCWNvbnRleHQuZXZhbHVhdGUoCi0JCQkJc25pcHBldCwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU1vZGlmaWVycygpLAotCQkJCXN0YWNrRnJhbWUuZGVjbGFyaW5nVHlwZU5hbWUoKSwKLQkJCQlzdGFja0ZyYW1lLmlzU3RhdGljKCksCi0JCQkJc3RhY2tGcmFtZS5pc0NvbnN0cnVjdG9yQ2FsbCgpLAotCQkJCWdldEVudigpLAotCQkJCWdldE9wdGlvbnMoKSwKLQkJCQlyZXF1ZXN0b3IsCi0JCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgiTm8gdGFyZ2V0RXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCQl9Ci0JCWFzc2VydFRydWUoCi0JCQkiU2hvdWxkIGdldCBvbmUgcmVzdWx0IGJ1dCBnb3QgIiArIChyZXF1ZXN0b3IucmVzdWx0SW5kZXggKyAxKSwKLQkJCXJlcXVlc3Rvci5yZXN1bHRJbmRleCA9PSAwKTsKLQkJRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSByZXF1ZXN0b3IucmVzdWx0c1swXTsKLQkJYXNzZXJ0VHJ1ZSgiQ29kZSBzbmlwcGV0IHNob3VsZCBub3QgaGF2ZSBwcm9ibGVtcyIsICFyZXN1bHQuaGFzUHJvYmxlbXMoKSk7Ci0JCWFzc2VydFRydWUoIlJlc3VsdCBzaG91bGQgaGF2ZSBhIHZhbHVlIiwgcmVzdWx0Lmhhc1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlZhbHVlIiwgIjMiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZURpc3BsYXlTdHJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiVHlwZSIsICJpbnQiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZVR5cGVOYW1lKCkpOwotCX0gZmluYWxseSB7Ci0JCXJlbW92ZVRlbXBDbGFzcygiQTUzIik7Ci0JfQotfQotLyoqCi0gKiBQb3N0IGFzc2lnbmVtZW50IG9mIGEgcHJpdmF0ZSBmaWVsZC4KLSAqIFVzaW5nIHByaXZhdGUgZmllbGQgZW11bGF0aW9uIG9uIGEgZmllbGQgcmVmZXJlbmNlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDU0KCkgewotCXRyeSB7Ci0JCVN0cmluZyBzb3VyY2VBNTQgPQotCQkJInB1YmxpYyBjbGFzcyBBNTQge1xuIgotCQkJCSsgIlx0c3RhdGljIHByaXZhdGUgQTU0IGluc3RhbmNlID0gbmV3IEE1NCgpO1xuIgotCQkJCSsgIlx0c3RhdGljIHByaXZhdGUgbG9uZyBDb3VudGVyID0gMkw7XG4iICAgICAgICAgICAgICAgCi0JCQkJKyAiXHRwdWJsaWMgdm9pZCBiYXIoKSB7XG4iCi0JCQkJKyAiXHR9XG4iCi0JCQkJKyAifSI7Ci0JCWNvbXBpbGVBbmREZXBsb3koc291cmNlQTU0LCAiQTU0Iik7Ci0KLQkJU3RyaW5nIHVzZXJDb2RlID0gIm5ldyBBNTQoKS5iYXIoKTsiOwotCQlKRElTdGFja0ZyYW1lIHN0YWNrRnJhbWUgPQotCQkJbmV3IEpESVN0YWNrRnJhbWUodGhpcy5qZGlWTSwgdGhpcywgdXNlckNvZGUsICJBNTQiLCAiYmFyIiwgLTEpOwotCi0JCURlYnVnUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBEZWJ1Z1JlcXVlc3RvcigpOwotCQljaGFyW10gc25pcHBldCA9ICJ0aGlzLkNvdW50ZXIrKzsgcmV0dXJuIHRoaXMuQ291bnRlcjsiLnRvQ2hhckFycmF5KCk7Ci0JCXRyeSB7Ci0JCQljb250ZXh0LmV2YWx1YXRlKAotCQkJCXNuaXBwZXQsCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCQlzdGFja0ZyYW1lLmRlY2xhcmluZ1R5cGVOYW1lKCksCi0JCQkJc3RhY2tGcmFtZS5pc1N0YXRpYygpLAotCQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCQlnZXRFbnYoKSwKLQkJCQlnZXRPcHRpb25zKCksCi0JCQkJcmVxdWVzdG9yLAotCQkJCWdldFByb2JsZW1GYWN0b3J5KCkpOwotCQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQkJfQotCQlhc3NlcnRUcnVlKAotCQkJIlNob3VsZCBnZXQgb25lIHJlc3VsdCBidXQgZ290ICIgKyAocmVxdWVzdG9yLnJlc3VsdEluZGV4ICsgMSksCi0JCQlyZXF1ZXN0b3IucmVzdWx0SW5kZXggPT0gMCk7Ci0JCUV2YWx1YXRpb25SZXN1bHQgcmVzdWx0ID0gcmVxdWVzdG9yLnJlc3VsdHNbMF07Ci0JCWFzc2VydFRydWUoIkNvZGUgc25pcHBldCBzaG91bGQgbm90IGhhdmUgcHJvYmxlbXMiLCAhcmVzdWx0Lmhhc1Byb2JsZW1zKCkpOwotCQlhc3NlcnRUcnVlKCJSZXN1bHQgc2hvdWxkIGhhdmUgYSB2YWx1ZSIsIHJlc3VsdC5oYXNWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJWYWx1ZSIsICIzIi50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVEaXNwbGF5U3RyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlR5cGUiLCAibG9uZyIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlVHlwZU5hbWUoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJcmVtb3ZlVGVtcENsYXNzKCJBNTQiKTsKLQl9Ci19Ci0vKioKLSAqIFJlYWQgYWNjZXNzIHRvIGEgcHJpdmF0ZSBtZXRob2QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwNTUoKSB7Ci0JdHJ5IHsKLQkJU3RyaW5nIHNvdXJjZUE1NSA9Ci0JCQkicHVibGljIGNsYXNzIEE1NSB7XG4iCi0JCQkJKyAiXHRwcml2YXRlIGludCBmb28oKSB7O1xuIiAgICAgICAgICAgICAgICAKLQkJCQkrICJcdFx0cmV0dXJuIDM7XG4iCi0JCQkJKyAiXHR9XG4iICAgICAgICAgICAgICAgCi0JCQkJKyAiXHRwdWJsaWMgdm9pZCBiYXIoKSB7XG4iCi0JCQkJKyAiXHR9XG4iCi0JCQkJKyAifSI7Ci0JCWNvbXBpbGVBbmREZXBsb3koc291cmNlQTU1LCAiQTU1Iik7Ci0KLQkJU3RyaW5nIHVzZXJDb2RlID0gIm5ldyBBNTUoKS5iYXIoKTsiOwotCQlKRElTdGFja0ZyYW1lIHN0YWNrRnJhbWUgPQotCQkJbmV3IEpESVN0YWNrRnJhbWUodGhpcy5qZGlWTSwgdGhpcywgdXNlckNvZGUsICJBNTUiLCAiYmFyIiwgLTEpOwotCi0JCURlYnVnUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBEZWJ1Z1JlcXVlc3RvcigpOwotCQljaGFyW10gc25pcHBldCA9ICJyZXR1cm4gZm9vKCk7Ii50b0NoYXJBcnJheSgpOwotCQl0cnkgewotCQkJY29udGV4dC5ldmFsdWF0ZSgKLQkJCQlzbmlwcGV0LAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZVR5cGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTW9kaWZpZXJzKCksCi0JCQkJc3RhY2tGcmFtZS5kZWNsYXJpbmdUeXBlTmFtZSgpLAotCQkJCXN0YWNrRnJhbWUuaXNTdGF0aWMoKSwKLQkJCQlzdGFja0ZyYW1lLmlzQ29uc3RydWN0b3JDYWxsKCksCi0JCQkJZ2V0RW52KCksCi0JCQkJZ2V0T3B0aW9ucygpLAotCQkJCXJlcXVlc3RvciwKLQkJCQlnZXRQcm9ibGVtRmFjdG9yeSgpKTsKLQkJfSBjYXRjaCAoSW5zdGFsbEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKCJObyB0YXJnZXRFeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJTaG91bGQgZ2V0IG9uZSByZXN1bHQgYnV0IGdvdCAiICsgKHJlcXVlc3Rvci5yZXN1bHRJbmRleCArIDEpLAotCQkJcmVxdWVzdG9yLnJlc3VsdEluZGV4ID09IDApOwotCQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCA9IHJlcXVlc3Rvci5yZXN1bHRzWzBdOwotCQlhc3NlcnRUcnVlKCJDb2RlIHNuaXBwZXQgc2hvdWxkIG5vdCBoYXZlIHByb2JsZW1zIiwgIXJlc3VsdC5oYXNQcm9ibGVtcygpKTsKLQkJYXNzZXJ0VHJ1ZSgiUmVzdWx0IHNob3VsZCBoYXZlIGEgdmFsdWUiLCByZXN1bHQuaGFzVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiVmFsdWUiLCAiMyIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlRGlzcGxheVN0cmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUeXBlIiwgImludCIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlVHlwZU5hbWUoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJcmVtb3ZlVGVtcENsYXNzKCJBNTUiKTsKLQl9Ci19Ci0vKioKLSAqIFJlYWQgYWNjZXNzIHRvIGEgcHJpdmF0ZSBtZXRob2QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwNTYoKSB7Ci0JdHJ5IHsKLQkJU3RyaW5nIHNvdXJjZUE1NiA9Ci0JCQkicHVibGljIGNsYXNzIEE1NiB7XG4iCi0JCQkJKyAiXHRwcml2YXRlIEludGVnZXIgZm9vKCkgeztcbiIgICAgICAgICAgICAgICAgCi0JCQkJKyAiXHRcdHJldHVybiBuZXcgSW50ZWdlcigzKTtcbiIKLQkJCQkrICJcdH1cbiIgICAgICAgICAgICAgICAKLQkJCQkrICJcdHB1YmxpYyB2b2lkIGJhcigpIHtcbiIKLQkJCQkrICJcdH1cbiIKLQkJCQkrICJ9IjsKLQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBNTYsICJBNTYiKTsKLQotCQlTdHJpbmcgdXNlckNvZGUgPSAibmV3IEE1NigpLmJhcigpOyI7Ci0JCUpESVN0YWNrRnJhbWUgc3RhY2tGcmFtZSA9Ci0JCQluZXcgSkRJU3RhY2tGcmFtZSh0aGlzLmpkaVZNLCB0aGlzLCB1c2VyQ29kZSwgIkE1NiIsICJiYXIiLCAtMSk7Ci0KLQkJRGVidWdSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IERlYnVnUmVxdWVzdG9yKCk7Ci0JCWNoYXJbXSBzbmlwcGV0ID0gInJldHVybiBmb28oKS5pbnRWYWx1ZSgpOyIudG9DaGFyQXJyYXkoKTsKLQkJdHJ5IHsKLQkJCWNvbnRleHQuZXZhbHVhdGUoCi0JCQkJc25pcHBldCwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU1vZGlmaWVycygpLAotCQkJCXN0YWNrRnJhbWUuZGVjbGFyaW5nVHlwZU5hbWUoKSwKLQkJCQlzdGFja0ZyYW1lLmlzU3RhdGljKCksCi0JCQkJc3RhY2tGcmFtZS5pc0NvbnN0cnVjdG9yQ2FsbCgpLAotCQkJCWdldEVudigpLAotCQkJCWdldE9wdGlvbnMoKSwKLQkJCQlyZXF1ZXN0b3IsCi0JCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgiTm8gdGFyZ2V0RXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCQl9Ci0JCWFzc2VydFRydWUoCi0JCQkiU2hvdWxkIGdldCBvbmUgcmVzdWx0IGJ1dCBnb3QgIiArIChyZXF1ZXN0b3IucmVzdWx0SW5kZXggKyAxKSwKLQkJCXJlcXVlc3Rvci5yZXN1bHRJbmRleCA9PSAwKTsKLQkJRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSByZXF1ZXN0b3IucmVzdWx0c1swXTsKLQkJYXNzZXJ0VHJ1ZSgiQ29kZSBzbmlwcGV0IHNob3VsZCBub3QgaGF2ZSBwcm9ibGVtcyIsICFyZXN1bHQuaGFzUHJvYmxlbXMoKSk7Ci0JCWFzc2VydFRydWUoIlJlc3VsdCBzaG91bGQgaGF2ZSBhIHZhbHVlIiwgcmVzdWx0Lmhhc1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlZhbHVlIiwgIjMiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZURpc3BsYXlTdHJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiVHlwZSIsICJpbnQiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZVR5cGVOYW1lKCkpOwotCX0gZmluYWxseSB7Ci0JCXJlbW92ZVRlbXBDbGFzcygiQTU2Iik7Ci0JfQotfQotLyoqCi0gKiBSZWFkIGFjY2VzcyB0byBhIHByaXZhdGUgbWV0aG9kLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDU3KCkgewotCXRyeSB7Ci0JCVN0cmluZyBzb3VyY2VBNTcgPQotCQkJInB1YmxpYyBjbGFzcyBBNTcge1xuIgotCQkJCSsgIlx0cHJpdmF0ZSBJbnRlZ2VyIGZvbyhpbnQgaSkgeztcbiIgICAgICAgICAgICAgICAKLQkJCQkrICJcdFx0cmV0dXJuIG5ldyBJbnRlZ2VyKGkpO1xuIgotCQkJCSsgIlx0fVxuIiAgICAgICAgICAgICAgIAotCQkJCSsgIlx0cHVibGljIHZvaWQgYmFyKCkge1xuIgotCQkJCSsgIlx0fVxuIgotCQkJCSsgIn0iOwotCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUE1NywgIkE1NyIpOwotCi0JCVN0cmluZyB1c2VyQ29kZSA9ICJuZXcgQTU3KCkuYmFyKCk7IjsKLQkJSkRJU3RhY2tGcmFtZSBzdGFja0ZyYW1lID0KLQkJCW5ldyBKRElTdGFja0ZyYW1lKHRoaXMuamRpVk0sIHRoaXMsIHVzZXJDb2RlLCAiQTU3IiwgImJhciIsIC0xKTsKLQotCQlEZWJ1Z1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgRGVidWdSZXF1ZXN0b3IoKTsKLQkJY2hhcltdIHNuaXBwZXQgPSAicmV0dXJuIGZvbygzKS5pbnRWYWx1ZSgpOyIudG9DaGFyQXJyYXkoKTsKLQkJdHJ5IHsKLQkJCWNvbnRleHQuZXZhbHVhdGUoCi0JCQkJc25pcHBldCwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU1vZGlmaWVycygpLAotCQkJCXN0YWNrRnJhbWUuZGVjbGFyaW5nVHlwZU5hbWUoKSwKLQkJCQlzdGFja0ZyYW1lLmlzU3RhdGljKCksCi0JCQkJc3RhY2tGcmFtZS5pc0NvbnN0cnVjdG9yQ2FsbCgpLAotCQkJCWdldEVudigpLAotCQkJCWdldE9wdGlvbnMoKSwKLQkJCQlyZXF1ZXN0b3IsCi0JCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgiTm8gdGFyZ2V0RXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCQl9Ci0JCWFzc2VydFRydWUoCi0JCQkiU2hvdWxkIGdldCBvbmUgcmVzdWx0IGJ1dCBnb3QgIiArIChyZXF1ZXN0b3IucmVzdWx0SW5kZXggKyAxKSwKLQkJCXJlcXVlc3Rvci5yZXN1bHRJbmRleCA9PSAwKTsKLQkJRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSByZXF1ZXN0b3IucmVzdWx0c1swXTsKLQkJYXNzZXJ0VHJ1ZSgiQ29kZSBzbmlwcGV0IHNob3VsZCBub3QgaGF2ZSBwcm9ibGVtcyIsICFyZXN1bHQuaGFzUHJvYmxlbXMoKSk7Ci0JCWFzc2VydFRydWUoIlJlc3VsdCBzaG91bGQgaGF2ZSBhIHZhbHVlIiwgcmVzdWx0Lmhhc1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlZhbHVlIiwgIjMiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZURpc3BsYXlTdHJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiVHlwZSIsICJpbnQiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZVR5cGVOYW1lKCkpOwotCX0gZmluYWxseSB7Ci0JCXJlbW92ZVRlbXBDbGFzcygiQTU3Iik7Ci0JfQotfQotLyoqCi0gKiBSZWFkIGFjY2VzcyB0byBhIHByaXZhdGUgbWV0aG9kLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDU4KCkgewotCXRyeSB7Ci0JCVN0cmluZyBzb3VyY2VBNTggPQotCQkJInB1YmxpYyBjbGFzcyBBNTgge1xuIgotCQkJCSsgIlx0cHJpdmF0ZSBJbnRlZ2VyIGZvbyhpbnQgaSwgaW50W10gdGFiKSB7O1xuIgotCQkJCSsgIlx0XHRyZXR1cm4gbmV3IEludGVnZXIoaSArIHRhYi5sZW5ndGgpO1xuIgotCQkJCSsgIlx0fVxuIiAgICAgICAgICAgICAgIAotCQkJCSsgIlx0cHVibGljIHZvaWQgYmFyKCkge1xuIgotCQkJCSsgIlx0fVxuIgotCQkJCSsgIn0iOwotCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUE1OCwgIkE1OCIpOwotCi0JCVN0cmluZyB1c2VyQ29kZSA9ICJuZXcgQTU4KCkuYmFyKCk7IjsKLQkJSkRJU3RhY2tGcmFtZSBzdGFja0ZyYW1lID0KLQkJCW5ldyBKRElTdGFja0ZyYW1lKHRoaXMuamRpVk0sIHRoaXMsIHVzZXJDb2RlLCAiQTU4IiwgImJhciIsIC0xKTsKLQotCQlEZWJ1Z1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgRGVidWdSZXF1ZXN0b3IoKTsKLQkJY2hhcltdIHNuaXBwZXQgPSAiaW50W10gdGFiID0gbmV3IGludFtdIHsxLDIsM307cmV0dXJuIGZvbygwLCB0YWIpLmludFZhbHVlKCk7Ii50b0NoYXJBcnJheSgpOwotCQl0cnkgewotCQkJY29udGV4dC5ldmFsdWF0ZSgKLQkJCQlzbmlwcGV0LAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZVR5cGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTW9kaWZpZXJzKCksCi0JCQkJc3RhY2tGcmFtZS5kZWNsYXJpbmdUeXBlTmFtZSgpLAotCQkJCXN0YWNrRnJhbWUuaXNTdGF0aWMoKSwKLQkJCQlzdGFja0ZyYW1lLmlzQ29uc3RydWN0b3JDYWxsKCksCi0JCQkJZ2V0RW52KCksCi0JCQkJZ2V0T3B0aW9ucygpLAotCQkJCXJlcXVlc3RvciwKLQkJCQlnZXRQcm9ibGVtRmFjdG9yeSgpKTsKLQkJfSBjYXRjaCAoSW5zdGFsbEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKCJObyB0YXJnZXRFeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJTaG91bGQgZ2V0IG9uZSByZXN1bHQgYnV0IGdvdCAiICsgKHJlcXVlc3Rvci5yZXN1bHRJbmRleCArIDEpLAotCQkJcmVxdWVzdG9yLnJlc3VsdEluZGV4ID09IDApOwotCQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCA9IHJlcXVlc3Rvci5yZXN1bHRzWzBdOwotCQlhc3NlcnRUcnVlKCJDb2RlIHNuaXBwZXQgc2hvdWxkIG5vdCBoYXZlIHByb2JsZW1zIiwgIXJlc3VsdC5oYXNQcm9ibGVtcygpKTsKLQkJYXNzZXJ0VHJ1ZSgiUmVzdWx0IHNob3VsZCBoYXZlIGEgdmFsdWUiLCByZXN1bHQuaGFzVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiVmFsdWUiLCAiMyIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlRGlzcGxheVN0cmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUeXBlIiwgImludCIudG9DaGFyQXJyYXkoKSwgcmVzdWx0LmdldFZhbHVlVHlwZU5hbWUoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJcmVtb3ZlVGVtcENsYXNzKCJBNTgiKTsKLQl9Ci19Ci0vKioKLSAqIFJlYWQgYWNjZXNzIHRvIGEgcHJpdmF0ZSBtZXRob2QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwNTkoKSB7Ci0JdHJ5IHsKLQkJU3RyaW5nIHNvdXJjZUE1OSA9Ci0JCQkicHVibGljIGNsYXNzIEE1OSB7XG4iCi0JCQkJKyAiXHRwcml2YXRlIEludGVnZXIgZm9vKGludCBpLCBPYmplY3RbXVtdIHRhYikgeztcbiIKLQkJCQkrICJcdFx0cmV0dXJuIG5ldyBJbnRlZ2VyKGkgKyB0YWIubGVuZ3RoKTtcbiIKLQkJCQkrICJcdH1cbiIgICAgICAgICAgICAgICAKLQkJCQkrICJcdHB1YmxpYyB2b2lkIGJhcigpIHtcbiIKLQkJCQkrICJcdH1cbiIKLQkJCQkrICJ9IjsKLQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBNTksICJBNTkiKTsKLQotCQlTdHJpbmcgdXNlckNvZGUgPSAibmV3IEE1OSgpLmJhcigpOyI7Ci0JCUpESVN0YWNrRnJhbWUgc3RhY2tGcmFtZSA9Ci0JCQluZXcgSkRJU3RhY2tGcmFtZSh0aGlzLmpkaVZNLCB0aGlzLCB1c2VyQ29kZSwgIkE1OSIsICJiYXIiLCAtMSk7Ci0KLQkJRGVidWdSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IERlYnVnUmVxdWVzdG9yKCk7Ci0JCWNoYXJbXSBzbmlwcGV0ID0gIk9iamVjdFtdW10gdGFiID0gbmV3IE9iamVjdFswXVswXTtyZXR1cm4gZm9vKDMsIHRhYikuaW50VmFsdWUoKTsiLnRvQ2hhckFycmF5KCk7Ci0JCXRyeSB7Ci0JCQljb250ZXh0LmV2YWx1YXRlKAotCQkJCXNuaXBwZXQsCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCQlzdGFja0ZyYW1lLmRlY2xhcmluZ1R5cGVOYW1lKCksCi0JCQkJc3RhY2tGcmFtZS5pc1N0YXRpYygpLAotCQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCQlnZXRFbnYoKSwKLQkJCQlnZXRPcHRpb25zKCksCi0JCQkJcmVxdWVzdG9yLAotCQkJCWdldFByb2JsZW1GYWN0b3J5KCkpOwotCQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQkJfQotCQlhc3NlcnRUcnVlKAotCQkJIlNob3VsZCBnZXQgb25lIHJlc3VsdCBidXQgZ290ICIgKyAocmVxdWVzdG9yLnJlc3VsdEluZGV4ICsgMSksCi0JCQlyZXF1ZXN0b3IucmVzdWx0SW5kZXggPT0gMCk7Ci0JCUV2YWx1YXRpb25SZXN1bHQgcmVzdWx0ID0gcmVxdWVzdG9yLnJlc3VsdHNbMF07Ci0JCWFzc2VydFRydWUoIkNvZGUgc25pcHBldCBzaG91bGQgbm90IGhhdmUgcHJvYmxlbXMiLCAhcmVzdWx0Lmhhc1Byb2JsZW1zKCkpOwotCQlhc3NlcnRUcnVlKCJSZXN1bHQgc2hvdWxkIGhhdmUgYSB2YWx1ZSIsIHJlc3VsdC5oYXNWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJWYWx1ZSIsICIzIi50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVEaXNwbGF5U3RyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlR5cGUiLCAiaW50Ii50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVUeXBlTmFtZSgpKTsKLQl9IGZpbmFsbHkgewotCQlyZW1vdmVUZW1wQ2xhc3MoIkE1OSIpOwotCX0KLX0KLS8qKgotICogUmVhZCBhY2Nlc3MgdG8gYSBwcml2YXRlIG1ldGhvZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDA2MCgpIHsKLQl0cnkgewotCQlTdHJpbmcgc291cmNlQTYwID0KLQkJCSJwdWJsaWMgY2xhc3MgQTYwIHtcbiIKLQkJCQkrICJcdHByaXZhdGUgaW50IGk7XG4iCi0JCQkJKyAiXHRwdWJsaWMgQTYwKCkgeztcbiIKLQkJCQkrICJcdH1cbiIKLQkJCQkrICJcdHByaXZhdGUgQTYwKGludCBpKSB7O1xuIgotCQkJCSsgIlx0XHR0aGlzLmkgPSBpO1xuIgotCQkJCSsgIlx0fVxuIiAgICAgICAgICAgICAgIAotCQkJCSsgIlx0cHVibGljIHZvaWQgYmFyKCkge1xuIgotCQkJCSsgIlx0fVxuIgotCQkJCSsgIn0iOwotCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUE2MCwgIkE2MCIpOwotCi0JCVN0cmluZyB1c2VyQ29kZSA9ICJuZXcgQTYwKCkuYmFyKCk7IjsKLQkJSkRJU3RhY2tGcmFtZSBzdGFja0ZyYW1lID0KLQkJCW5ldyBKRElTdGFja0ZyYW1lKHRoaXMuamRpVk0sIHRoaXMsIHVzZXJDb2RlLCAiQTYwIiwgImJhciIsIC0xKTsKLQotCQlEZWJ1Z1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgRGVidWdSZXF1ZXN0b3IoKTsKLQkJY2hhcltdIHNuaXBwZXQgPSAicmV0dXJuIG5ldyBBNjAoMykuaTsiLnRvQ2hhckFycmF5KCk7Ci0JCXRyeSB7Ci0JCQljb250ZXh0LmV2YWx1YXRlKAotCQkJCXNuaXBwZXQsCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCQlzdGFja0ZyYW1lLmRlY2xhcmluZ1R5cGVOYW1lKCksCi0JCQkJc3RhY2tGcmFtZS5pc1N0YXRpYygpLAotCQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCQlnZXRFbnYoKSwKLQkJCQlnZXRPcHRpb25zKCksCi0JCQkJcmVxdWVzdG9yLAotCQkJCWdldFByb2JsZW1GYWN0b3J5KCkpOwotCQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQkJfQotCQlhc3NlcnRUcnVlKAotCQkJIlNob3VsZCBnZXQgb25lIHJlc3VsdCBidXQgZ290ICIgKyAocmVxdWVzdG9yLnJlc3VsdEluZGV4ICsgMSksCi0JCQlyZXF1ZXN0b3IucmVzdWx0SW5kZXggPT0gMCk7Ci0JCUV2YWx1YXRpb25SZXN1bHQgcmVzdWx0ID0gcmVxdWVzdG9yLnJlc3VsdHNbMF07Ci0JCWFzc2VydFRydWUoIkNvZGUgc25pcHBldCBzaG91bGQgbm90IGhhdmUgcHJvYmxlbXMiLCAhcmVzdWx0Lmhhc1Byb2JsZW1zKCkpOwotCQlhc3NlcnRUcnVlKCJSZXN1bHQgc2hvdWxkIGhhdmUgYSB2YWx1ZSIsIHJlc3VsdC5oYXNWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJWYWx1ZSIsICIzIi50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVEaXNwbGF5U3RyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlR5cGUiLCAiaW50Ii50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVUeXBlTmFtZSgpKTsKLQl9IGZpbmFsbHkgewotCQlyZW1vdmVUZW1wQ2xhc3MoIkE2MCIpOwotCX0KLX0KLS8qKgotICogUmVhZCBhY2Nlc3MgdG8gYSBwcml2YXRlIG1ldGhvZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdDA2MSgpIHsKLQl0cnkgewotCQlTdHJpbmcgc291cmNlQTYxID0KLQkJCSJwdWJsaWMgY2xhc3MgQTYxIHtcbiIKLQkJCQkrICJcdHByaXZhdGUgaW50IGk7XG4iCi0JCQkJKyAiXHRwdWJsaWMgQTYxKCkgeztcbiIKLQkJCQkrICJcdH1cbiIKLQkJCQkrICJcdHByaXZhdGUgQTYxKGludFtdIHRhYikgeztcbiIKLQkJCQkrICJcdFx0dGhpcy5pID0gdGFiLmxlbmd0aDtcbiIKLQkJCQkrICJcdH1cbiIgICAgICAgICAgICAgICAKLQkJCQkrICJcdHB1YmxpYyB2b2lkIGJhcigpIHtcbiIKLQkJCQkrICJcdH1cbiIKLQkJCQkrICJ9IjsKLQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBNjEsICJBNjEiKTsKLQotCQlTdHJpbmcgdXNlckNvZGUgPSAibmV3IEE2MSgpLmJhcigpOyI7Ci0JCUpESVN0YWNrRnJhbWUgc3RhY2tGcmFtZSA9Ci0JCQluZXcgSkRJU3RhY2tGcmFtZSh0aGlzLmpkaVZNLCB0aGlzLCB1c2VyQ29kZSwgIkE2MSIsICJiYXIiLCAtMSk7Ci0KLQkJRGVidWdSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IERlYnVnUmVxdWVzdG9yKCk7Ci0JCWNoYXJbXSBzbmlwcGV0ID0gInJldHVybiBuZXcgQTYxKG5ldyBpbnRbXSB7MSwyLDN9KS5pOyIudG9DaGFyQXJyYXkoKTsKLQkJdHJ5IHsKLQkJCWNvbnRleHQuZXZhbHVhdGUoCi0JCQkJc25pcHBldCwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU1vZGlmaWVycygpLAotCQkJCXN0YWNrRnJhbWUuZGVjbGFyaW5nVHlwZU5hbWUoKSwKLQkJCQlzdGFja0ZyYW1lLmlzU3RhdGljKCksCi0JCQkJc3RhY2tGcmFtZS5pc0NvbnN0cnVjdG9yQ2FsbCgpLAotCQkJCWdldEVudigpLAotCQkJCWdldE9wdGlvbnMoKSwKLQkJCQlyZXF1ZXN0b3IsCi0JCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgiTm8gdGFyZ2V0RXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCQl9Ci0JCWFzc2VydFRydWUoCi0JCQkiU2hvdWxkIGdldCBvbmUgcmVzdWx0IGJ1dCBnb3QgIiArIChyZXF1ZXN0b3IucmVzdWx0SW5kZXggKyAxKSwKLQkJCXJlcXVlc3Rvci5yZXN1bHRJbmRleCA9PSAwKTsKLQkJRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSByZXF1ZXN0b3IucmVzdWx0c1swXTsKLQkJYXNzZXJ0VHJ1ZSgiQ29kZSBzbmlwcGV0IHNob3VsZCBub3QgaGF2ZSBwcm9ibGVtcyIsICFyZXN1bHQuaGFzUHJvYmxlbXMoKSk7Ci0JCWFzc2VydFRydWUoIlJlc3VsdCBzaG91bGQgaGF2ZSBhIHZhbHVlIiwgcmVzdWx0Lmhhc1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlZhbHVlIiwgIjMiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZURpc3BsYXlTdHJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiVHlwZSIsICJpbnQiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZVR5cGVOYW1lKCkpOwotCX0gZmluYWxseSB7Ci0JCXJlbW92ZVRlbXBDbGFzcygiQTYxIik7Ci0JfQotfQotLyoqCi0gKiBTdGF0aWMgY29udGV4dCB3aXRoIGEgZGVjbGFyaW5nIHR5cGUuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwNjIoKSB7Ci0JdHJ5IHsKLQkJU3RyaW5nIHNvdXJjZUE2MiA9Ci0JCQkicHVibGljIGNsYXNzIEE2MiB7XG4iICsKLQkJCSIgIHB1YmxpYyBzdGF0aWMgdm9pZCBiYXIoKSB7XG4iICsKLQkJCSIgIH1cbiIgKwotCQkJIn0iOwotCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUE2MiwgIkE2MiIpOwotCi0JCVN0cmluZyB1c2VyQ29kZSA9ICJuZXcgQTYyKCkuYmFyKCk7IjsKLQkJSkRJU3RhY2tGcmFtZSBzdGFja0ZyYW1lID0KLQkJCW5ldyBKRElTdGFja0ZyYW1lKHRoaXMuamRpVk0sIHRoaXMsIHVzZXJDb2RlLCAiQTYyIiwgImJhciIsIC0xKTsKLQotCQlEZWJ1Z1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgRGVidWdSZXF1ZXN0b3IoKTsKLQkJY2hhcltdIHNuaXBwZXQgPSAiMSArIDEiLnRvQ2hhckFycmF5KCk7Ci0JCXRyeSB7Ci0JCQljb250ZXh0LmV2YWx1YXRlKAotCQkJCXNuaXBwZXQsCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCQlzdGFja0ZyYW1lLmRlY2xhcmluZ1R5cGVOYW1lKCksCi0JCQkJc3RhY2tGcmFtZS5pc1N0YXRpYygpLAotCQkJCXN0YWNrRnJhbWUuaXNDb25zdHJ1Y3RvckNhbGwoKSwKLQkJCQlnZXRFbnYoKSwKLQkJCQlnZXRPcHRpb25zKCksCi0JCQkJcmVxdWVzdG9yLAotCQkJCWdldFByb2JsZW1GYWN0b3J5KCkpOwotCQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQkJfQotCQlhc3NlcnRUcnVlKAotCQkJIlNob3VsZCBnZXQgb25lIHJlc3VsdCBidXQgZ290ICIgKyAocmVxdWVzdG9yLnJlc3VsdEluZGV4ICsgMSksCi0JCQlyZXF1ZXN0b3IucmVzdWx0SW5kZXggPT0gMCk7Ci0JCUV2YWx1YXRpb25SZXN1bHQgcmVzdWx0ID0gcmVxdWVzdG9yLnJlc3VsdHNbMF07Ci0JCWFzc2VydFRydWUoIkNvZGUgc25pcHBldCBzaG91bGQgbm90IGhhdmUgcHJvYmxlbXMiLCAhcmVzdWx0Lmhhc1Byb2JsZW1zKCkpOwotCQlhc3NlcnRUcnVlKCJSZXN1bHQgc2hvdWxkIGhhdmUgYSB2YWx1ZSIsIHJlc3VsdC5oYXNWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJWYWx1ZSIsICIyIi50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVEaXNwbGF5U3RyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlR5cGUiLCAiaW50Ii50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVUeXBlTmFtZSgpKTsKLQl9IGZpbmFsbHkgewotCQlyZW1vdmVUZW1wQ2xhc3MoIkE2MiIpOwotCX0KLX0KLXB1YmxpYyBzdGF0aWMgQ2xhc3MgdGVzdENsYXNzKCkgewotCXJldHVybiBEZWJ1Z0V2YWx1YXRpb25UZXN0LmNsYXNzOwotfQotLyoqCi0gKiBSZXR1cm4gbm9uLXN0YXRpYyBmaWVsZCBpbiBzdGF0aWMgZW52aXJvbm1lbnQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3ROZWdhdGl2ZTAwMSgpIHsKLQl0cnkgewotCQlTdHJpbmcgc291cmNlQU5lZ2F0aXZlMDAxID0KLQkJCSJwdWJsaWMgY2xhc3MgQU5lZ2F0aXZlMDAxIHtcbiIgKwotCQkJIiAgcHVibGljIGludCB4ID0gMTtcbiIgKwotCQkJIiAgcHVibGljIGludCBmb28oKSB7XG4iICsKLQkJCSIgICAgeCsrO1xuIiArIC8vIHdvcmthcm91bmQgcGIgd2l0aCBKREsgMS40LjEgdGhhdCBkb2Vzbid0IHN0b3AgaWYgb25seSByZXR1cm4KLQkJCSIgICAgcmV0dXJuIHg7XG4iICsKLQkJCSIgIH1cbiIgKwotCQkJIn0iOwotCQljb21waWxlQW5kRGVwbG95KHNvdXJjZUFOZWdhdGl2ZTAwMSwgIkFOZWdhdGl2ZTAwMSIpOwotCQlTdHJpbmcgdXNlckNvZGUgPQotCQkJIm5ldyBBTmVnYXRpdmUwMDEoKS5mb28oKTsiOwotCQlKRElTdGFja0ZyYW1lIHN0YWNrRnJhbWUgPSBuZXcgSkRJU3RhY2tGcmFtZSgKLQkJCXRoaXMuamRpVk0sIAotCQkJdGhpcywKLQkJCXVzZXJDb2RlLAotCQkJIkFOZWdhdGl2ZTAwMSIsCi0JCQkiZm9vIiwKLQkJCS0xKTsKLQotCQlEZWJ1Z1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgRGVidWdSZXF1ZXN0b3IoKTsKLQkJY2hhcltdIHNuaXBwZXQgPSAicmV0dXJuIHRoaXMueDsiLnRvQ2hhckFycmF5KCk7Ci0JCXRyeSB7Ci0JCQljb250ZXh0LmV2YWx1YXRlKAotCQkJCXNuaXBwZXQsCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCQlzdGFja0ZyYW1lLmRlY2xhcmluZ1R5cGVOYW1lKCksCi0JCQkJdHJ1ZSwgLy8gZm9yY2UgaXMgc3RhdGljCi0JCQkJc3RhY2tGcmFtZS5pc0NvbnN0cnVjdG9yQ2FsbCgpLAotCQkJCWdldEVudigpLCAKLQkJCQlnZXRPcHRpb25zKCksIAotCQkJCXJlcXVlc3RvciwgCi0JCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgiTm8gdGFyZ2V0RXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCQl9Ci0JCWFzc2VydFRydWUoIkdvdCBvbmUgcmVzdWx0IiwgcmVxdWVzdG9yLnJlc3VsdEluZGV4ID09IDApOwotCQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCA9IHJlcXVlc3Rvci5yZXN1bHRzWzBdOwotCQlJUHJvYmxlbVtdIHByb2JsZW1zID0gcmVzdWx0LmdldFByb2JsZW1zKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCQlmb3IgKGludCBpID0gMCwgbWF4ID0gcHJvYmxlbXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspewotCQkJaWYgKHByb2JsZW1zW2ldLmlzRXJyb3IoKSl7Ci0JCQkJaWYgKGJ1ZmZlciA9PSBudWxsKSBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDEwKTsKLQkJCQlidWZmZXIuYXBwZW5kKHByb2JsZW1zW2ldLmdldE1lc3NhZ2UoKSk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgnfCcpOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBlcnJvcnMiLAotCQkJIkNhbm5vdCB1c2UgdGhpcyBpbiBhIHN0YXRpYyBjb250ZXh0IHwiLAotCQkJYnVmZmVyID09IG51bGwgPyAibm9uZSIgOiBidWZmZXIudG9TdHJpbmcoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJcmVtb3ZlVGVtcENsYXNzKCJBTmVnYXRpdmUwMDEiKTsKLQl9Ci19Ci0vKioKLSAqIFJldHVybiBub24tc3RhdGljIGZpZWxkIGluIHN0YXRpYyBlbnZpcm9ubWVudC4KLSAqLwotcHVibGljIHZvaWQgdGVzdE5lZ2F0aXZlMDAyKCkgewotCXRyeSB7Ci0JCVN0cmluZyBzb3VyY2VBTmVnYXRpdmUwMDIgPQotCQkJInB1YmxpYyBjbGFzcyBBTmVnYXRpdmUwMDIge1xuIiArCi0JCQkiICBwdWJsaWMgaW50IHggPSAxO1xuIiArCi0JCQkiICBwdWJsaWMgaW50IGZvbygpIHtcbiIgKwotCQkJIiAgICB4Kys7XG4iICsgLy8gd29ya2Fyb3VuZCBwYiB3aXRoIEpESyAxLjQuMSB0aGF0IGRvZXNuJ3Qgc3RvcCBpZiBvbmx5IHJldHVybgotCQkJIiAgICByZXR1cm4geDtcbiIgKwotCQkJIiAgfVxuIiArCi0JCQkifSI7Ci0JCWNvbXBpbGVBbmREZXBsb3koc291cmNlQU5lZ2F0aXZlMDAyLCAiQU5lZ2F0aXZlMDAyIik7Ci0JCVN0cmluZyB1c2VyQ29kZSA9Ci0JCQkibmV3IEFOZWdhdGl2ZTAwMigpLmZvbygpOyI7Ci0JCUpESVN0YWNrRnJhbWUgc3RhY2tGcmFtZSA9IG5ldyBKRElTdGFja0ZyYW1lKAotCQkJdGhpcy5qZGlWTSwgCi0JCQl0aGlzLAotCQkJdXNlckNvZGUsCi0JCQkiQU5lZ2F0aXZlMDAyIiwKLQkJCSJmb28iLAotCQkJLTEpOwotCi0JCURlYnVnUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBEZWJ1Z1JlcXVlc3RvcigpOwotCQljaGFyW10gc25pcHBldCA9ICJyZXR1cm4geDsiLnRvQ2hhckFycmF5KCk7Ci0JCXRyeSB7Ci0JCQljb250ZXh0LmV2YWx1YXRlKAotCQkJCXNuaXBwZXQsCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzKCksCi0JCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVNb2RpZmllcnMoKSwKLQkJCQlzdGFja0ZyYW1lLmRlY2xhcmluZ1R5cGVOYW1lKCksCi0JCQkJdHJ1ZSwgLy8gZm9yY2UgaXMgc3RhdGljCi0JCQkJc3RhY2tGcmFtZS5pc0NvbnN0cnVjdG9yQ2FsbCgpLAotCQkJCWdldEVudigpLCAKLQkJCQlnZXRPcHRpb25zKCksIAotCQkJCXJlcXVlc3RvciwgCi0JCQkJZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgiTm8gdGFyZ2V0RXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCQl9Ci0JCWFzc2VydFRydWUoIkdvdCBvbmUgcmVzdWx0IiwgcmVxdWVzdG9yLnJlc3VsdEluZGV4ID09IDApOwotCQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCA9IHJlcXVlc3Rvci5yZXN1bHRzWzBdOwotCQlJUHJvYmxlbVtdIHByb2JsZW1zID0gcmVzdWx0LmdldFByb2JsZW1zKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCQlmb3IgKGludCBpID0gMCwgbWF4ID0gcHJvYmxlbXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspewotCQkJaWYgKHByb2JsZW1zW2ldLmlzRXJyb3IoKSl7Ci0JCQkJaWYgKGJ1ZmZlciA9PSBudWxsKSBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDEwKTsKLQkJCQlidWZmZXIuYXBwZW5kKHByb2JsZW1zW2ldLmdldE1lc3NhZ2UoKSk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgnfCcpOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBlcnJvcnMiLAotCQkJIkNhbm5vdCBtYWtlIGEgc3RhdGljIHJlZmVyZW5jZSB0byB0aGUgbm9uLXN0YXRpYyBmaWVsZCB4fCIsCi0JCQlidWZmZXIgPT0gbnVsbCA/ICJub25lIiA6IGJ1ZmZlci50b1N0cmluZygpKTsKLQl9IGZpbmFsbHkgewotCQlyZW1vdmVUZW1wQ2xhc3MoIkFOZWdhdGl2ZTAwMiIpOwotCX0KLX0KLS8qKgotICogUmV0dXJuIGluZXhpc3RpbmcgZmllbGQgaW4gc3RhdGljIGVudmlyb25tZW50LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TmVnYXRpdmUwMDMoKSB7Ci0JdHJ5IHsKLQkJU3RyaW5nIHNvdXJjZUFOZWdhdGl2ZTAwMyA9Ci0JCQkicHVibGljIGNsYXNzIEFOZWdhdGl2ZTAwMyB7XG4iICsKLQkJCSIgIHB1YmxpYyBpbnQgeCA9IDE7XG4iICsKLQkJCSIgIHB1YmxpYyBpbnQgZm9vKCkge1xuIiArCi0JCQkiICAgIHgrKztcbiIgKyAvLyB3b3JrYXJvdW5kIHBiIHdpdGggSkRLIDEuNC4xIHRoYXQgZG9lc24ndCBzdG9wIGlmIG9ubHkgcmV0dXJuCi0JCQkiICAgIHJldHVybiB4O1xuIiArCi0JCQkiICB9XG4iICsKLQkJCSJ9IjsKLQkJY29tcGlsZUFuZERlcGxveShzb3VyY2VBTmVnYXRpdmUwMDMsICJBTmVnYXRpdmUwMDMiKTsKLQkJU3RyaW5nIHVzZXJDb2RlID0KLQkJCSJuZXcgQU5lZ2F0aXZlMDAzKCkuZm9vKCk7IjsKLQkJSkRJU3RhY2tGcmFtZSBzdGFja0ZyYW1lID0gbmV3IEpESVN0YWNrRnJhbWUoCi0JCQl0aGlzLmpkaVZNLCAKLQkJCXRoaXMsCi0JCQl1c2VyQ29kZSwKLQkJCSJBTmVnYXRpdmUwMDMiLAotCQkJImZvbyIsCi0JCQktMSk7Ci0KLQkJRGVidWdSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IERlYnVnUmVxdWVzdG9yKCk7Ci0JCWNoYXJbXSBzbmlwcGV0ID0gInJldHVybiB6b3JrOyIudG9DaGFyQXJyYXkoKTsKLQkJdHJ5IHsKLQkJCWNvbnRleHQuZXZhbHVhdGUoCi0JCQkJc25pcHBldCwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVUeXBlTmFtZXMoKSwKLQkJCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVOYW1lcygpLAotCQkJCXN0YWNrRnJhbWUubG9jYWxWYXJpYWJsZU1vZGlmaWVycygpLAotCQkJCXN0YWNrRnJhbWUuZGVjbGFyaW5nVHlwZU5hbWUoKSwKLQkJCQl0cnVlLCAvLyBmb3JjZSBpcyBzdGF0aWMKLQkJCQlzdGFja0ZyYW1lLmlzQ29uc3RydWN0b3JDYWxsKCksCi0JCQkJZ2V0RW52KCksIAotCQkJCWdldE9wdGlvbnMoKSwgCi0JCQkJcmVxdWVzdG9yLCAKLQkJCQlnZXRQcm9ibGVtRmFjdG9yeSgpKTsKLQkJfSBjYXRjaCAoSW5zdGFsbEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKCJObyB0YXJnZXRFeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiR290IG9uZSByZXN1bHQiLCByZXF1ZXN0b3IucmVzdWx0SW5kZXggPT0gMCk7Ci0JCUV2YWx1YXRpb25SZXN1bHQgcmVzdWx0ID0gcmVxdWVzdG9yLnJlc3VsdHNbMF07Ci0JCUlQcm9ibGVtW10gcHJvYmxlbXMgPSByZXN1bHQuZ2V0UHJvYmxlbXMoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwLCBtYXggPSBwcm9ibGVtcy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7Ci0JCQlpZiAocHJvYmxlbXNbaV0uaXNFcnJvcigpKXsKLQkJCQlpZiAoYnVmZmVyID09IG51bGwpIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMTApOwotCQkJCWJ1ZmZlci5hcHBlbmQocHJvYmxlbXNbaV0uZ2V0TWVzc2FnZSgpKTsKLQkJCQlidWZmZXIuYXBwZW5kKCd8Jyk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGVycm9ycyIsCi0JCQkiem9yayBjYW5ub3QgYmUgcmVzb2x2ZWR8IiwKLQkJCWJ1ZmZlciA9PSBudWxsID8gIm5vbmUiIDogYnVmZmVyLnRvU3RyaW5nKCkpOwotCX0gZmluYWxseSB7Ci0JCXJlbW92ZVRlbXBDbGFzcygiQU5lZ2F0aXZlMDAzIik7Ci0JfQotfQotLyoqCi0gKiBDaGVjayBqYXZhLmxhbmcuU3lzdGVtLm91dCA9IG51bGwgcmV0dXJucyBhbiBlcnJvcgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TmVnYXRpdmUwMDQoKSB7Ci0JU3RyaW5nIHVzZXJDb2RlID0gIiI7Ci0JSkRJU3RhY2tGcmFtZSBzdGFja0ZyYW1lID0gbmV3IEpESVN0YWNrRnJhbWUoCi0JCXRoaXMuamRpVk0sIAotCQl0aGlzLAotCQl1c2VyQ29kZSk7Ci0KLQlEZWJ1Z1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgRGVidWdSZXF1ZXN0b3IoKTsKLQljaGFyW10gc25pcHBldCA9ICJqYXZhLmxhbmcuU3lzdGVtLm91dCA9IG51bGw7Ii50b0NoYXJBcnJheSgpOwotCXRyeSB7Ci0JCWNvbnRleHQuZXZhbHVhdGUoCi0JCQlzbmlwcGV0LAotCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlVHlwZU5hbWVzKCksCi0JCQlzdGFja0ZyYW1lLmxvY2FsVmFyaWFibGVOYW1lcygpLAotCQkJc3RhY2tGcmFtZS5sb2NhbFZhcmlhYmxlTW9kaWZpZXJzKCksCi0JCQlzdGFja0ZyYW1lLmRlY2xhcmluZ1R5cGVOYW1lKCksCi0JCQlzdGFja0ZyYW1lLmlzU3RhdGljKCksCi0JCQlzdGFja0ZyYW1lLmlzQ29uc3RydWN0b3JDYWxsKCksCi0JCQlnZXRFbnYoKSwgCi0JCQlnZXRPcHRpb25zKCksIAotCQkJcmVxdWVzdG9yLCAKLQkJCWdldFByb2JsZW1GYWN0b3J5KCkpOwotCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgewotCQlhc3NlcnRUcnVlKCJObyB0YXJnZXRFeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0JfQotCWFzc2VydFRydWUoIkdvdCBvbmUgcmVzdWx0IiwgcmVxdWVzdG9yLnJlc3VsdEluZGV4ID09IDApOwotCUV2YWx1YXRpb25SZXN1bHQgcmVzdWx0ID0gcmVxdWVzdG9yLnJlc3VsdHNbMF07Ci0JSVByb2JsZW1bXSBwcm9ibGVtcyA9IHJlc3VsdC5nZXRQcm9ibGVtcygpOwotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCWZvciAoaW50IGkgPSAwLCBtYXggPSBwcm9ibGVtcy5sZW5ndGg7IGkgPCBtYXg7IGkrKyl7Ci0JCWlmIChwcm9ibGVtc1tpXS5pc0Vycm9yKCkpewotCQkJaWYgKGJ1ZmZlciA9PSBudWxsKSBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDEwKTsKLQkJCWJ1ZmZlci5hcHBlbmQocHJvYmxlbXNbaV0uZ2V0TWVzc2FnZSgpKTsKLQkJCWJ1ZmZlci5hcHBlbmQoJ3wnKTsKLQkJfQotCX0KLQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgZXJyb3JzIiwKLQkJIlRoZSBmaW5hbCBmaWVsZCBTeXN0ZW0ub3V0IGNhbm5vdCBiZSBhc3NpZ25lZC4gSXQgbXVzdCBiZSBibGFuayBpbiB0aGlzIGNvbnRleHQsIG5vdCBxdWFsaWZpZWQgYW5kIG5vdCBpbiBjb21wb3VuZCBhc3NpZ25tZW50fCIsCi0JCWJ1ZmZlciA9PSBudWxsID8gIm5vbmUiIDogYnVmZmVyLnRvU3RyaW5nKCkpOwotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2V2YWwvRXZhbHVhdGlvblNldHVwLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZXZhbC9FdmFsdWF0aW9uU2V0dXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgyZGIyZi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZXZhbC9FdmFsdWF0aW9uU2V0dXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmV2YWw7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQganVuaXQuZXh0ZW5zaW9ucy5UZXN0RGVjb3JhdG9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5ydW50aW1lLkxvY2FsVmlydHVhbE1hY2hpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5ydW50aW1lLkxvY2FsVk1MYXVuY2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5ydW50aW1lLlRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5ydW50aW1lLlRhcmdldEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy51dGlsLlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmJhdGNoLkZpbGVTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JTmFtZUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsLkV2YWx1YXRpb25Db250ZXh0OwotCi1wdWJsaWMgY2xhc3MgRXZhbHVhdGlvblNldHVwIGV4dGVuZHMgVGVzdERlY29yYXRvciB7Ci0JU3RyaW5nIGpyZVBhdGg7Ci0JU3RyaW5nIGV2YWxEaXJlY3Rvcnk7Ci0JRXZhbHVhdGlvbkNvbnRleHQgY29udGV4dDsKLQlUYXJnZXRJbnRlcmZhY2UgdGFyZ2V0OwotCUxvY2FsVmlydHVhbE1hY2hpbmUgbGF1bmNoZWRWTTsKLXB1YmxpYyBFdmFsdWF0aW9uU2V0dXAoVGVzdCB0ZXN0KSB7Ci0Jc3VwZXIodGVzdCk7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBpbml0VGVzdChPYmplY3QgdGVzdCwgRXZhbHVhdGlvbkNvbnRleHQgZXZhbENvbnRleHQsIFRhcmdldEludGVyZmFjZSB0YXJnZXRJbnRlcmZhY2UsIExvY2FsVmlydHVhbE1hY2hpbmUgbG9jYWxWTSwgSU5hbWVFbnZpcm9ubWVudCBlbnYpIHsKLQlpZiAodGVzdCBpbnN0YW5jZW9mIEV2YWx1YXRpb25UZXN0KSB7Ci0JCUV2YWx1YXRpb25UZXN0IGV2YWxUZXN0ID0gKEV2YWx1YXRpb25UZXN0KXRlc3Q7Ci0JCWV2YWxUZXN0LmNvbnRleHQgPSBldmFsQ29udGV4dDsKLQkJZXZhbFRlc3QudGFyZ2V0ID0gdGFyZ2V0SW50ZXJmYWNlOwotCQlldmFsVGVzdC5sYXVuY2hlZFZNID0gbG9jYWxWTTsKLQkJZXZhbFRlc3QuZW52ID0gZW52OwotCQlyZXR1cm47Ci0JfQotCWlmICh0ZXN0IGluc3RhbmNlb2YgVGVzdFN1aXRlKSB7Ci0JCVRlc3RTdWl0ZSBldmFsdWF0aW9uVGVzdENsYXNzU3VpdGUgPSAoVGVzdFN1aXRlKSB0ZXN0OwotCQlFbnVtZXJhdGlvbiBldmFsdWF0aW9uVGVzdENsYXNzVGVzdHMgPSBldmFsdWF0aW9uVGVzdENsYXNzU3VpdGUudGVzdHMoKTsKLQkJd2hpbGUgKGV2YWx1YXRpb25UZXN0Q2xhc3NUZXN0cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJaW5pdFRlc3QoZXZhbHVhdGlvblRlc3RDbGFzc1Rlc3RzLm5leHRFbGVtZW50KCksIGV2YWxDb250ZXh0LCB0YXJnZXRJbnRlcmZhY2UsIGxvY2FsVk0sIGVudik7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQkJCi19Ci1wdWJsaWMgdm9pZCBydW4oVGVzdFJlc3VsdCByZXN1bHQpIHsKLQl0cnkgewotCQlzZXRVcCgpOwotCQlzdXBlci5ydW4ocmVzdWx0KTsKLQl9IGZpbmFsbHkgewotCQl0ZWFyRG93bigpOwotCX0KLX0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCS8vIExhdW5jaCBWTSBpbiBldmFsdWF0aW9uIG1vZGUKLQlpbnQgZXZhbFBvcnQgPSBVdGlsLm5leHRBdmFpbGFibGVQb3J0TnVtYmVyKCk7Ci0JdHJ5IHsKLQkJTG9jYWxWTUxhdW5jaGVyIGxhdW5jaGVyID0gTG9jYWxWTUxhdW5jaGVyLmdldExhdW5jaGVyKCk7Ci0JCWxhdW5jaGVyLnNldFZNUGF0aCh0aGlzLmpyZVBhdGgpOwotCQlsYXVuY2hlci5zZXRFdmFsUG9ydChldmFsUG9ydCk7Ci0JCWxhdW5jaGVyLnNldEV2YWxUYXJnZXRQYXRoKHRoaXMuZXZhbERpcmVjdG9yeSk7Ci0JCXRoaXMubGF1bmNoZWRWTSA9IGxhdW5jaGVyLmxhdW5jaCgpOwotCX0gY2F0Y2ggKFRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCXRocm93IG5ldyBFcnJvcihlLmdldE1lc3NhZ2UoKSk7Ci0JfQotCi0JLy8gVGhyZWFkIHRoYXQgcmVhZCB0aGUgc3RvdXQgb2YgdGhlIFZNIHNvIHRoYXQgdGhlIFZNIGRvZXNuJ3QgYmxvY2sKLQl0cnkgewotCQlzdGFydFJlYWRlcigiVk0ncyBzdGRvdXQgcmVhZGVyIiwgdGhpcy5sYXVuY2hlZFZNLmdldElucHV0U3RyZWFtKCksIFN5c3RlbS5vdXQpOwotCX0gY2F0Y2ggKFRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JLy8gVGhyZWFkIHRoYXQgcmVhZCB0aGUgc3RlcnIgb2YgdGhlIFZNIHNvIHRoYXQgdGhlIFZNIGRvZXNuJ3QgYmxvY2sKLQl0cnkgewotCQlzdGFydFJlYWRlcigiVk0ncyBzdGVyciByZWFkZXIiLHRoaXMubGF1bmNoZWRWTS5nZXRFcnJvclN0cmVhbSgpLCBTeXN0ZW0uZXJyKTsKLQl9IGNhdGNoIChUYXJnZXRFeGNlcHRpb24gZSkgewotCX0KLQotCS8vIENyZWF0ZSBjb250ZXh0Ci0JdGhpcy5jb250ZXh0ID0gbmV3IEV2YWx1YXRpb25Db250ZXh0KCk7Ci0KLQkvLyBDcmVhdGUgdGFyZ2V0Ci0JdGhpcy50YXJnZXQgPSBuZXcgVGFyZ2V0SW50ZXJmYWNlKCk7Ci0JdGhpcy50YXJnZXQuY29ubmVjdCgibG9jYWxob3N0IiwgZXZhbFBvcnQsIDEwMDAwKTsKLQotCS8vIENyZWF0ZSBuYW1lIGVudmlyb25tZW50Ci0JSU5hbWVFbnZpcm9ubWVudCBlbnYgPSBuZXcgRmlsZVN5c3RlbShuZXcgU3RyaW5nW10ge1V0aWwuZ2V0SmF2YUNsYXNzTGliKCl9LCBuZXcgU3RyaW5nWzBdLCBudWxsKTsKLQotCS8vIEluaXQgd3JhcHBlZCBzdWl0ZQotCWluaXRUZXN0KGZUZXN0LCB0aGlzLmNvbnRleHQsIHRoaXMudGFyZ2V0LCB0aGlzLmxhdW5jaGVkVk0sIGVudik7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBzdGFydFJlYWRlcihTdHJpbmcgbmFtZSwgZmluYWwgSW5wdXRTdHJlYW0gaW4sIGZpbmFsIFByaW50U3RyZWFtIG91dCkgewotCShuZXcgVGhyZWFkKG5hbWUpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJaW50IHJlYWQgPSAwOwotCQkJd2hpbGUgKHJlYWQgIT0gLTEpIHsKLQkJCQl0cnkgewotCQkJCQlyZWFkID0gaW4ucmVhZCgpOwotCQkJCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCQlyZWFkID0gLTE7Ci0JCQkJfQotCQkJCWlmIChyZWFkICE9IC0xKSB7Ci0JCQkJCW91dC5wcmludCgoY2hhcikgcmVhZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSkuc3RhcnQoKTsKLX0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCWlmIChjb250ZXh0ICE9IG51bGwpIHsKLQkJTG9jYWxWaXJ0dWFsTWFjaGluZSB2bSA9IHRoaXMubGF1bmNoZWRWTTsKLQkJaWYgKHZtICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHRoaXMudGFyZ2V0ICE9IG51bGwpIHsKLQkJCQkJdGhpcy50YXJnZXQuZGlzY29ubmVjdCgpOyAvLyBDbG9zZSB0aGUgc29ja2V0IGZpcnN0IHNvIHRoYXQgdGhlIE9TIHJlc291cmNlIGhhcyBhIGNoYW5jZSB0byBiZSBmcmVlZC4gCi0JCQkJfQotCQkJCWludCByZXRyeSA9IDA7Ci0JCQkJd2hpbGUgKHZtLmlzUnVubmluZygpICYmICgrK3JldHJ5IDwgMjApKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAocmV0cnkgKiAxMDApOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHZtLmlzUnVubmluZygpKSB7Ci0JCQkJCXZtLnNodXREb3duKCk7Ci0JCQkJfQotCQkJCXRoaXMuY29udGV4dCA9IG51bGw7Ci0JCQl9IGNhdGNoIChUYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBFcnJvcihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZXZhbC9FdmFsdWF0aW9uVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2V2YWwvRXZhbHVhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRmZDU5My4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZXZhbC9FdmFsdWF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuZXZhbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmp1bml0LmV4dGVuc2lvbi5TdG9wYWJsZVRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLnJ1bnRpbWUuTG9jYWxWTUxhdW5jaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLnJ1bnRpbWUuTG9jYWxWaXJ0dWFsTWFjaGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5ydW50aW1lLlRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5ydW50aW1lLlRhcmdldEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy51dGlsLlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkNsYXNzRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSVByb2JsZW1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5iYXRjaC5GaWxlU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5iYXRjaC5NYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRm9ybWF0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUJpbmFyeUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSU5hbWVFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uRGVmYXVsdFByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uRGVmYXVsdFByb2JsZW1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWwuRXZhbHVhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWwuRXZhbHVhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbC5HbG9iYWxWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbC5JUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsLkluc3RhbGxFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBFdmFsdWF0aW9uVGVzdCBleHRlbmRzIFN0b3BhYmxlVGVzdENhc2UgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEpSRV9QQVRIID0gVXRpbC5nZXRKUkVEaXJlY3RvcnkoKTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFVkFMX0RJUkVDVE9SWSA9IFV0aWwuZ2V0T3V0cHV0RGlyZWN0b3J5KCkgKyBGaWxlLnNlcGFyYXRvciArICJldmFsdWF0aW9uIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VfRElSRUNUT1JZID0gVXRpbC5nZXRPdXRwdXREaXJlY3RvcnkoKSArIEZpbGUuc2VwYXJhdG9yICsgInNvdXJjZSI7Ci0JcHVibGljIEV2YWx1YXRpb25Db250ZXh0IGNvbnRleHQ7Ci0JTG9jYWxWaXJ0dWFsTWFjaGluZSBsYXVuY2hlZFZNOwotCVN0cmluZ1tdIGNsYXNzUGF0aDsKLQlJTmFtZUVudmlyb25tZW50IGVudjsKLQlUYXJnZXRJbnRlcmZhY2UgdGFyZ2V0OwotCi0JcHVibGljIGNsYXNzIFJlcXVlc3RvciBpbXBsZW1lbnRzIElSZXF1ZXN0b3IgewotCQlwdWJsaWMgaW50IHJlc3VsdEluZGV4ID0gLTE7Ci0JCXB1YmxpYyBFdmFsdWF0aW9uUmVzdWx0W10gcmVzdWx0cyA9IG5ldyBFdmFsdWF0aW9uUmVzdWx0WzVdOwotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHRDbGFzc0ZpbGVzKENsYXNzRmlsZVtdIGNsYXNzRmlsZXMsIGNoYXJbXSBjb2RlU25pcHBldENsYXNzTmFtZSkgewotCQkJdHJ5IHsKLQkJCQl0YXJnZXQuc2VuZENsYXNzZXMoY29kZVNuaXBwZXRDbGFzc05hbWUgIT0gbnVsbCwgY2xhc3NGaWxlcyk7Ci0JCQl9IGNhdGNoIChUYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmIChjb2RlU25pcHBldENsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQkJVGFyZ2V0SW50ZXJmYWNlLlJlc3VsdCByZXN1bHQgPSB0YXJnZXQuZ2V0UmVzdWx0KCk7Ci0JCQkJaWYgKHJlc3VsdC5kaXNwbGF5U3RyaW5nID09IG51bGwpIHsKLQkJCQkJdGhpcy5hY2NlcHRSZXN1bHQobmV3IEV2YWx1YXRpb25SZXN1bHQobnVsbCwgRXZhbHVhdGlvblJlc3VsdC5UX0NPREVfU05JUFBFVCwgbnVsbCwgbnVsbCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRoaXMuYWNjZXB0UmVzdWx0KG5ldyBFdmFsdWF0aW9uUmVzdWx0KG51bGwsIEV2YWx1YXRpb25SZXN1bHQuVF9DT0RFX1NOSVBQRVQsIHJlc3VsdC5kaXNwbGF5U3RyaW5nLCByZXN1bHQudHlwZU5hbWUpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBjbGFzc0ZpbGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJCWNoYXJbXVtdIGNvbXBvdW5kTmFtZSA9IGNsYXNzRmlsZXNbaV0uZ2V0Q29tcG91bmROYW1lKCk7Ci0JCQkJCWlmIChuZXcgU3RyaW5nKGNvbXBvdW5kTmFtZVtjb21wb3VuZE5hbWUubGVuZ3RoLTFdKS5zdGFydHNXaXRoKCJHbG9iYWxWYXJpYWJsZSIpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUlCaW5hcnlGaWVsZFtdIGZpZWxkcyA9IG5ldyBDbGFzc0ZpbGVSZWFkZXIoY2xhc3NGaWxlc1tpXS5nZXRCeXRlcygpLCBudWxsKS5nZXRGaWVsZHMoKTsKLQkJCQkJCQlpZiAoZmllbGRzICE9IG51bGwpIHsKLQkJCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmaWVsZHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCQkJCUlCaW5hcnlGaWVsZCBmaWVsZCA9IGZpZWxkc1tqXTsKLQkJCQkJCQkJCWlmIChNb2RpZmllci5pc1B1YmxpYyhmaWVsZC5nZXRNb2RpZmllcnMoKSkpIHsKLQkJCQkJCQkJCQlUYXJnZXRJbnRlcmZhY2UuUmVzdWx0IHJlc3VsdCA9IHRhcmdldC5nZXRSZXN1bHQoKTsKLQkJCQkJCQkJCQlpZiAocmVzdWx0LmRpc3BsYXlTdHJpbmcgPT0gbnVsbCkgewotCQkJCQkJCQkJCQl0aGlzLmFjY2VwdFJlc3VsdChuZXcgRXZhbHVhdGlvblJlc3VsdChmaWVsZC5nZXROYW1lKCksIEV2YWx1YXRpb25SZXN1bHQuVF9WQVJJQUJMRSwgbnVsbCwgbnVsbCkpOwotCQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJCXRoaXMuYWNjZXB0UmVzdWx0KG5ldyBFdmFsdWF0aW9uUmVzdWx0KGZpZWxkLmdldE5hbWUoKSwgRXZhbHVhdGlvblJlc3VsdC5UX1ZBUklBQkxFLCByZXN1bHQuZGlzcGxheVN0cmluZywgcmVzdWx0LnR5cGVOYW1lKSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoQ2xhc3NGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSAKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFjY2VwdFByb2JsZW0oSVByb2JsZW0gcHJvYmxlbSwgY2hhcltdIGZyYWdtZW50U291cmNlLCBpbnQgZnJhZ21lbnRLaW5kKSB7Ci0JCQl0aGlzLmFjY2VwdFJlc3VsdChuZXcgRXZhbHVhdGlvblJlc3VsdChmcmFnbWVudFNvdXJjZSwgZnJhZ21lbnRLaW5kLCBuZXcgSVByb2JsZW1bXSB7cHJvYmxlbX0pKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhY2NlcHRSZXN1bHQoRXZhbHVhdGlvblJlc3VsdCByZXN1bHQpIHsKLQkJCXRyeSB7Ci0JCQkJdGhpcy5yZXN1bHRzWysrdGhpcy5yZXN1bHRJbmRleF0gPSByZXN1bHQ7Ci0JCQl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJCWludCBvbGRSZXN1bHRMZW5ndGggPSB0aGlzLnJlc3VsdHMubGVuZ3RoOwotCQkJCVN5c3RlbS5hcnJheWNvcHkodGhpcy5yZXN1bHRzICwgMCwgKHRoaXMucmVzdWx0cyA9IG5ldyBFdmFsdWF0aW9uUmVzdWx0W29sZFJlc3VsdExlbmd0aCAqIDJdKSwgMCwgb2xkUmVzdWx0TGVuZ3RoKTsKLQkJCQl0aGlzLnJlc3VsdHNbdGhpcy5yZXN1bHRJbmRleF0gPSByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQl9Ci0vKioKLSAqIENyZWF0ZXMgYSBuZXcgRXZhbHVhdGlvblRlc3QuCi0gKi8KLXB1YmxpYyBFdmFsdWF0aW9uVGVzdChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotLyoqCi0gKiBBc3NlcnRzIHRoYXQgdHdvIGNoYXIgYXJyYXlzIGFyZSBlcXVhbC4gSWYgdGhleSBhcmUgbm90Ci0gKiBhbiBBc3NlcnRpb25GYWlsZWRFcnJvciBpcyB0aHJvd24uCi0gKiBAcGFyYW0gbWVzc2FnZSB0aGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgYXNzZXJ0aW9uCi0gKiBAcGFyYW0gZXhwZWN0ZWQgdGhlIGV4cGVjdGVkIHZhbHVlIG9mIGEgY2hhciBhcnJheQotICogQHBhcmFtIGFjdHVhbCB0aGUgYWN0dWFsIHZhbHVlIG9mIGEgY2hhciBhcnJheQotICovCi1wdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIGNoYXJbXSBleHBlY3RlZCwgY2hhcltdIGFjdHVhbCkgewotCWlmIChleHBlY3RlZCA9PSBudWxsICYmIGFjdHVhbCA9PSBudWxsKQotCQlyZXR1cm47Ci0JaWYgKGV4cGVjdGVkICE9IG51bGwpIHsKLQkJaWYgKGFjdHVhbCA9PSBudWxsKSB7Ci0JCQlmYWlsTm90RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkLCBhY3R1YWwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChleHBlY3RlZC5sZW5ndGggPT0gYWN0dWFsLmxlbmd0aCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykgewotCQkJCWlmIChleHBlY3RlZFtpXSAhPSBhY3R1YWxbaV0pIHsKLQkJCQkJZmFpbE5vdEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCX0KLQlmYWlsTm90RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkLCBhY3R1YWwpOwotfQotLyoqCi0gKiBCdWlsZCBhIGNoYXIgYXJyYXkgZnJvbSB0aGUgZ2l2ZW4gbGluZXMKLSAqLwotcHJvdGVjdGVkIGNoYXJbXSBidWlsZENoYXJBcnJheShTdHJpbmdbXSBsaW5lcykgewotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewotCQlidWZmZXIuYXBwZW5kKGxpbmVzW2ldKTsKLQkJaWYgKGkgPCBsaW5lcy5sZW5ndGggLSAxKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCJcbiIpOwotCQl9Ci0JfQotCWludCBsZW5ndGggPSBidWZmZXIubGVuZ3RoKCk7Ci0JY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aF07Ci0JYnVmZmVyLmdldENoYXJzKDAsIGxlbmd0aCwgcmVzdWx0LCAwKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJldHVybnMgd2hldGhlciB0aGUgMiBnaXZlbiBwcm9ibGVtcyBhcmUgZXF1YWxzLgotICovCi1wdWJsaWMgYm9vbGVhbiBlcXVhbHMoSVByb2JsZW0gcGIxLCBJUHJvYmxlbSBwYjIpIHsKLQlpZiAoKHBiMSA9PSBudWxsKSAmJiAocGIyID09IG51bGwpKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlpZiAoKHBiMSA9PSBudWxsKSB8fCAocGIyID09IG51bGwpKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcmV0dXJuCi0JCShwYjEuZ2V0SUQoKSA9PSBwYjIuZ2V0SUQoKSkgJiYKLQkJKHBiMS5pc0Vycm9yKCkgPT0gcGIyLmlzRXJyb3IoKSkgJiYKLQkJKHBiMS5nZXRTb3VyY2VTdGFydCgpID09IHBiMi5nZXRTb3VyY2VTdGFydCgpKSAmJgotCQkocGIxLmdldFNvdXJjZUVuZCgpID09IHBiMi5nZXRTb3VyY2VFbmQoKSkgJiYKLQkJKHBiMS5nZXRTb3VyY2VMaW5lTnVtYmVyKCkgPT0gcGIyLmdldFNvdXJjZUxpbmVOdW1iZXIoKSk7Ci19Ci0vKioKLSAqIEV2YWx1YXRlcyB0aGUgZ2l2ZW4gY29kZSBzbmlwcGV0IGFuZCBtYWtlcyBzdXJlIGl0IHJldHVybnMgYSByZXN1bHQgd2l0aCB0aGUgZ2l2ZW4gZGlzcGxheSBzdHJpbmcuCi0gKi8KLXB1YmxpYyB2b2lkIGV2YWx1YXRlV2l0aEV4cGVjdGVkRGlzcGxheVN0cmluZyhjaGFyW10gY29kZVNuaXBwZXQsIGNoYXJbXSBkaXNwbGF5U3RyaW5nKSB7Ci0JUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBSZXF1ZXN0b3IoKTsKLQl0cnkgewotCQljb250ZXh0LmV2YWx1YXRlKGNvZGVTbmlwcGV0LCBnZXRFbnYoKSwgZ2V0T3B0aW9ucygpLCByZXF1ZXN0b3IsIGdldFByb2JsZW1GYWN0b3J5KCkpOwotCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgewotCQlhc3NlcnRUcnVlKCJUYXJnZXQgZXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCX0KLQlpZiAocmVxdWVzdG9yLnJlc3VsdEluZGV4ICE9IDApIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1ZXN0b3IucmVzdWx0SW5kZXg7IGkrKyl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInVuZXhwZWN0ZWQgcmVzdWx0WyIraSsiXTogIiArIHJlcXVlc3Rvci5yZXN1bHRzW2ldKTsKLQkJfQotCX0KLQlhc3NlcnRUcnVlKCJVbmV4cGVjdGVkIHJlc3VsdCIsIHJlcXVlc3Rvci5yZXN1bHRJbmRleCA9PSAwKTsKLQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCA9IHJlcXVlc3Rvci5yZXN1bHRzWzBdOwotCWFzc2VydFRydWUoIkhhcyBwcm9ibGVtIiwgIXJlc3VsdC5oYXNQcm9ibGVtcygpKTsKLQlhc3NlcnRUcnVlKCJFbXB0eSBwcm9ibGVtIGxpc3QiLCByZXN1bHQuZ2V0UHJvYmxlbXMoKS5sZW5ndGggPT0gMCk7Ci0JaWYgKGRpc3BsYXlTdHJpbmcgPT0gbnVsbCkgewotCQlhc3NlcnRUcnVlKCJIYXMgdmFsdWUiLCAhcmVzdWx0Lmhhc1ZhbHVlKCkpOwotCX0gZWxzZSB7Ci0JCWFzc2VydFRydWUoIkhhcyB2YWx1ZSIsIHJlc3VsdC5oYXNWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJFdmFsdWF0aW9uIHR5cGUiLCBFdmFsdWF0aW9uUmVzdWx0LlRfQ09ERV9TTklQUEVULCByZXN1bHQuZ2V0RXZhbHVhdGlvblR5cGUoKSk7Ci0JCS8vYXNzZXJ0RXF1YWxzKCJFdmFsdWF0aW9uIGlkIiwgY29kZVNuaXBwZXQsIHJlc3VsdC5nZXRFdmFsdWF0aW9uSUQoKSk7Ci0JCWFzc2VydEVxdWFscygiVmFsdWUgZGlzcGxheSBzdHJpbmciLCBkaXNwbGF5U3RyaW5nLCByZXN1bHQuZ2V0VmFsdWVEaXNwbGF5U3RyaW5nKCkpOwotCX0KLX0KLS8qKgotICogRXZhbHVhdGVzIHRoZSBnaXZlbiBjb2RlIHNuaXBwZXQgYW5kIG1ha2VzIHN1cmUgdGhlIGV2YWx1YXRpb24gcmVzdWx0IGhhcyBhdCBsZWFzdCB0aGUgZ2l2ZW4gcHJvYmxlbQotICogb24gdGhlIGdpdmVuIGltcG9ydC4KLSAqLwotcHJvdGVjdGVkIHZvaWQgZXZhbHVhdGVXaXRoRXhwZWN0ZWRJbXBvcnRQcm9ibGVtKGNoYXJbXSBjb2RlU25pcHBldCwgY2hhcltdIGltcG9ydERlY2xhcmF0aW9uLCBJUHJvYmxlbSBleHBlY3RlZCkgewotCWV2YWx1YXRlV2l0aEV4cGVjdGVkSW1wb3J0UHJvYmxlbShjb2RlU25pcHBldCwgaW1wb3J0RGVjbGFyYXRpb24sIGdldE9wdGlvbnMoKSwgZXhwZWN0ZWQpOwotfQotLyoqCi0gKiBFdmFsdWF0ZXMgdGhlIGdpdmVuIGNvZGUgc25pcHBldCBhbmQgbWFrZXMgc3VyZSB0aGUgZXZhbHVhdGlvbiByZXN1bHQgaGFzIGF0IGxlYXN0IHRoZSBnaXZlbiBwcm9ibGVtCi0gKiBvbiB0aGUgZ2l2ZW4gaW1wb3J0LgotICovCi1wcm90ZWN0ZWQgdm9pZCBldmFsdWF0ZVdpdGhFeHBlY3RlZEltcG9ydFByb2JsZW0oY2hhcltdIGNvZGVTbmlwcGV0LCBjaGFyW10gaW1wb3J0RGVjbGFyYXRpb24sIE1hcCBvcHRpb25zLCBJUHJvYmxlbSBleHBlY3RlZCkgewotCVJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgUmVxdWVzdG9yKCk7Ci0JdHJ5IHsKLQkJY29udGV4dC5ldmFsdWF0ZShjb2RlU25pcHBldCwgZ2V0RW52KCksIG9wdGlvbnMsIHJlcXVlc3RvciwgZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JfSBjYXRjaCAoSW5zdGFsbEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydFRydWUoIlRhcmdldCBleGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDw9IHJlcXVlc3Rvci5yZXN1bHRJbmRleDsgaSsrKSB7Ci0JCUV2YWx1YXRpb25SZXN1bHQgcmVzdWx0ID0gcmVxdWVzdG9yLnJlc3VsdHNbaV07Ci0JCWFzc2VydFRydWUoIkhhcyB2YWx1ZSIsICFyZXN1bHQuaGFzVmFsdWUoKSk7Ci0JCWFzc2VydFRydWUoIkhhcyBwcm9ibGVtIiwgcmVzdWx0Lmhhc1Byb2JsZW1zKCkpOwotCQlhc3NlcnRFcXVhbHMoIkV2YWx1YXRpb24gdHlwZSIsIEV2YWx1YXRpb25SZXN1bHQuVF9JTVBPUlQsIHJlc3VsdC5nZXRFdmFsdWF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJFdmFsdWF0aW9uIGlkIiwgaW1wb3J0RGVjbGFyYXRpb24sIHJlc3VsdC5nZXRFdmFsdWF0aW9uSUQoKSk7Ci0JCUlQcm9ibGVtW10gcHJvYmxlbXMgPSByZXN1bHQuZ2V0UHJvYmxlbXMoKTsKLQkJaWYgKGVxdWFscyhleHBlY3RlZCwgcHJvYmxlbXNbMF0pKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgcHJvYmxlbSBub3QgZm91bmQiLCBmYWxzZSk7Ci19Ci0vKioKLSAqIEV2YWx1YXRlcyB0aGUgZ2l2ZW4gY29kZSBzbmlwcGV0IGFuZCBtYWtlcyBzdXJlIHRoZSBldmFsdWF0aW9uIHJlc3VsdCBoYXMgYXQgbGVhc3QgdGhlIGdpdmVuIHByb2JsZW0uCi0gKi8KLXByb3RlY3RlZCB2b2lkIGV2YWx1YXRlV2l0aEV4cGVjdGVkUHJvYmxlbShjaGFyW10gY29kZVNuaXBwZXQsIFN0cmluZyBwcm9ibGVtc1N0cmluZykgewotCVJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgUmVxdWVzdG9yKCk7Ci0JdHJ5IHsKLQkJY29udGV4dC5ldmFsdWF0ZShjb2RlU25pcHBldCwgZ2V0RW52KCksIGdldE9wdGlvbnMoKSwgcmVxdWVzdG9yLCBnZXRQcm9ibGVtRmFjdG9yeSgpKTsKLQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0VHJ1ZSgiVGFyZ2V0IGV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiR290IG9uZSByZXN1bHQiLCByZXF1ZXN0b3IucmVzdWx0SW5kZXggPT0gMCk7Ci0JRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSByZXF1ZXN0b3IucmVzdWx0c1swXTsKLQlhc3NlcnRUcnVlKCJIYXMgdmFsdWUiLCAhcmVzdWx0Lmhhc1ZhbHVlKCkpOwotCWFzc2VydFRydWUoIkhhcyBwcm9ibGVtIiwgcmVzdWx0Lmhhc1Byb2JsZW1zKCkpOwotCWFzc2VydEVxdWFscygiRXZhbHVhdGlvbiB0eXBlIiwgRXZhbHVhdGlvblJlc3VsdC5UX0NPREVfU05JUFBFVCwgcmVzdWx0LmdldEV2YWx1YXRpb25UeXBlKCkpOwotCWFzc2VydEVxdWFscygiRXZhbHVhdGlvbiBpZCIsIGNvZGVTbmlwcGV0LCByZXN1bHQuZ2V0RXZhbHVhdGlvbklEKCkpOwotCVN0cmluZ0J1ZmZlciBwcm9ibGVtQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigyMCk7Ci0JSVByb2JsZW1bXSBwcm9ibGVtcyA9IHJlc3VsdC5nZXRQcm9ibGVtcygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvYmxlbXMubGVuZ3RoOyBpKyspIHsKLQkJcHJvYmxlbUJ1ZmZlci5hcHBlbmQocHJvYmxlbXNbaV0uZ2V0TWVzc2FnZSgpKS5hcHBlbmQoJ1xuJyk7Ci0JfQotCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBwcm9ibGVtcyIsIHByb2JsZW1zU3RyaW5nLCBwcm9ibGVtQnVmZmVyLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBFdmFsdWF0ZXMgdGhlIGdpdmVuIGNvZGUgc25pcHBldCBhbmQgbWFrZXMgc3VyZSB0aGUgZXZhbHVhdGlvbiByZXN1bHQgaGFzIGF0IGxlYXN0IHRoZSBnaXZlbiBwcm9ibGVtLgotICovCi1wcm90ZWN0ZWQgdm9pZCBldmFsdWF0ZVdpdGhFeHBlY3RlZFByb2JsZW0oY2hhcltdIGNvZGVTbmlwcGV0LCBJUHJvYmxlbSBleHBlY3RlZCkgewotCVJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgUmVxdWVzdG9yKCk7Ci0JdHJ5IHsKLQkJY29udGV4dC5ldmFsdWF0ZShjb2RlU25pcHBldCwgZ2V0RW52KCksIGdldE9wdGlvbnMoKSwgcmVxdWVzdG9yLCBnZXRQcm9ibGVtRmFjdG9yeSgpKTsKLQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0VHJ1ZSgiVGFyZ2V0IGV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPD0gcmVxdWVzdG9yLnJlc3VsdEluZGV4OyBpKyspIHsKLQkJRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSByZXF1ZXN0b3IucmVzdWx0c1tpXTsKLQkJYXNzZXJ0VHJ1ZSgiSGFzIHZhbHVlIiwgIXJlc3VsdC5oYXNWYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiSGFzIHByb2JsZW0iLCByZXN1bHQuaGFzUHJvYmxlbXMoKSk7Ci0JCWFzc2VydEVxdWFscygiRXZhbHVhdGlvbiB0eXBlIiwgRXZhbHVhdGlvblJlc3VsdC5UX0NPREVfU05JUFBFVCwgcmVzdWx0LmdldEV2YWx1YXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkV2YWx1YXRpb24gaWQiLCBjb2RlU25pcHBldCwgcmVzdWx0LmdldEV2YWx1YXRpb25JRCgpKTsKLQkJSVByb2JsZW1bXSBwcm9ibGVtcyA9IHJlc3VsdC5nZXRQcm9ibGVtcygpOwotCQlpZiAoZXF1YWxzKGV4cGVjdGVkLCBwcm9ibGVtc1swXSkpIHsKLQkJCXJldHVybjsKLQkJfQotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBwcm9ibGVtIG5vdCBmb3VuZCIsIGZhbHNlKTsKLX0KLS8qKgotICogRXZhbHVhdGVzIHRoZSBnaXZlbiB2YXJpYWJsZSBhbmQgbWFrZXMgc3VyZSB0aGUgZXZhbHVhdGlvbiByZXN1bHQgaGFzIGF0IGxlYXN0IHRoZSBnaXZlbiBwcm9ibGVtLgotICovCi1wcm90ZWN0ZWQgdm9pZCBldmFsdWF0ZVdpdGhFeHBlY3RlZFByb2JsZW0oR2xvYmFsVmFyaWFibGUgdmFyLCBJUHJvYmxlbSBleHBlY3RlZCkgewotCVJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgUmVxdWVzdG9yKCk7Ci0JdHJ5IHsKLQkJY29udGV4dC5ldmFsdWF0ZVZhcmlhYmxlcyhnZXRFbnYoKSwgZ2V0T3B0aW9ucygpLCByZXF1ZXN0b3IsIGdldFByb2JsZW1GYWN0b3J5KCkpOwotCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgewotCQlhc3NlcnRUcnVlKCJUYXJnZXQgZXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8PSByZXF1ZXN0b3IucmVzdWx0SW5kZXg7IGkrKykgewotCQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCA9IHJlcXVlc3Rvci5yZXN1bHRzW2ldOwotCQlhc3NlcnRUcnVlKCJIYXMgdmFsdWUiLCAhcmVzdWx0Lmhhc1ZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKCJIYXMgcHJvYmxlbSIsIHJlc3VsdC5oYXNQcm9ibGVtcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJFdmFsdWF0aW9uIHR5cGUiLCBFdmFsdWF0aW9uUmVzdWx0LlRfVkFSSUFCTEUsIHJlc3VsdC5nZXRFdmFsdWF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJFdmFsdWF0aW9uIGlkIiwgdmFyLmdldE5hbWUoKSwgcmVzdWx0LmdldEV2YWx1YXRpb25JRCgpKTsKLQkJSVByb2JsZW1bXSBwcm9ibGVtcyA9IHJlc3VsdC5nZXRQcm9ibGVtcygpOwotCQlpZiAoZXF1YWxzKGV4cGVjdGVkLCBwcm9ibGVtc1swXSkpIHsKLQkJCXJldHVybjsKLQkJfQotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBwcm9ibGVtIG5vdCBmb3VuZCIsIGZhbHNlKTsKLX0KLS8qKgotICogRXZhbHVhdGVzIHRoZSBnaXZlbiBjb2RlIHNuaXBwZXQgYW5kIG1ha2VzIHN1cmUgaXQgcmV0dXJucyBhIHJlc3VsdCB3aXRoIHRoZSBnaXZlbiB0eXBlIG5hbWUuCi0gKi8KLXByb3RlY3RlZCB2b2lkIGV2YWx1YXRlV2l0aEV4cGVjdGVkVHlwZShjaGFyW10gY29kZVNuaXBwZXQsIGNoYXJbXSBleHBlY3RlZFR5cGVOYW1lKSB7Ci0JUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBSZXF1ZXN0b3IoKTsKLQl0cnkgewotCQljb250ZXh0LmV2YWx1YXRlKGNvZGVTbmlwcGV0LCBnZXRFbnYoKSwgZ2V0T3B0aW9ucygpLCByZXF1ZXN0b3IsIGdldFByb2JsZW1GYWN0b3J5KCkpOwotCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgewotCQlhc3NlcnRUcnVlKCJUYXJnZXQgZXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCX0KLQlpZiAocmVxdWVzdG9yLnJlc3VsdEluZGV4ICE9IDApIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1ZXN0b3IucmVzdWx0SW5kZXg7IGkrKyl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInVuZXhwZWN0ZWQgcmVzdWx0WyIraSsiXTogIiArIHJlcXVlc3Rvci5yZXN1bHRzW2ldKTsKLQkJfQotCX0KLQlhc3NlcnRUcnVlKCJHb3Qgb25lIHJlc3VsdCIsIHJlcXVlc3Rvci5yZXN1bHRJbmRleCA9PSAwKTsKLQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCA9IHJlcXVlc3Rvci5yZXN1bHRzWzBdOwotCWlmIChleHBlY3RlZFR5cGVOYW1lID09IG51bGwpIHsKLQkJYXNzZXJ0VHJ1ZSgiSGFzIHZhbHVlIiwgIXJlc3VsdC5oYXNWYWx1ZSgpKTsKLQl9IGVsc2UgewotCQlhc3NlcnRUcnVlKCJIYXMgdmFsdWUiLCByZXN1bHQuaGFzVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRXZhbHVhdGlvbiB0eXBlIiwgRXZhbHVhdGlvblJlc3VsdC5UX0NPREVfU05JUFBFVCwgcmVzdWx0LmdldEV2YWx1YXRpb25UeXBlKCkpOwotCQkvL2Fzc2VydEVxdWFscygiRXZhbHVhdGlvbiBpZCIsIGNvZGVTbmlwcGV0LCByZXN1bHQuZ2V0RXZhbHVhdGlvbklEKCkpOwotCQlhc3NlcnRFcXVhbHMoIlZhbHVlIHR5cGUgbmFtZSIsIGV4cGVjdGVkVHlwZU5hbWUsIHJlc3VsdC5nZXRWYWx1ZVR5cGVOYW1lKCkpOwotCX0KLX0KLS8qKgotICogRXZhbHVhdGVzIHRoZSBnaXZlbiBjb2RlIHNuaXBwZXQgYW5kIG1ha2VzIHN1cmUgaXQgcmV0dXJucyBhIHJlc3VsdCB3aXRoIHRoZSBnaXZlbiBkaXNwbGF5IHN0cmluZyBhbmQgdHlwZSBuYW1lLgotICovCi1wcm90ZWN0ZWQgdm9pZCBldmFsdWF0ZVdpdGhFeHBlY3RlZFZhbHVlKGNoYXJbXSBjb2RlU25pcHBldCwgY2hhcltdIGRpc3BsYXlTdHJpbmcsIGNoYXJbXSB0eXBlTmFtZSkgewotCVJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgUmVxdWVzdG9yKCk7Ci0JdHJ5IHsKLQkJY29udGV4dC5ldmFsdWF0ZShjb2RlU25pcHBldCwgZ2V0RW52KCksIGdldE9wdGlvbnMoKSwgcmVxdWVzdG9yLCBnZXRQcm9ibGVtRmFjdG9yeSgpKTsKLQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0VHJ1ZSgiVGFyZ2V0IGV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiR290IG9uZSByZXN1bHQiLCByZXF1ZXN0b3IucmVzdWx0SW5kZXggPT0gMCk7Ci0JRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSByZXF1ZXN0b3IucmVzdWx0c1swXTsKLQlpZiAoZGlzcGxheVN0cmluZyA9PSBudWxsKSB7Ci0JCWFzc2VydFRydWUoIk1pc3NpbmcgdmFsdWUiLCAhcmVzdWx0Lmhhc1ZhbHVlKCkpOwotCX0gZWxzZSB7Ci0JCWFzc2VydFRydWUoIkhhcyB2YWx1ZSIsIHJlc3VsdC5oYXNWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJFdmFsdWF0aW9uIHR5cGUiLCBFdmFsdWF0aW9uUmVzdWx0LlRfQ09ERV9TTklQUEVULCByZXN1bHQuZ2V0RXZhbHVhdGlvblR5cGUoKSk7Ci0JCS8vYXNzZXJ0RXF1YWxzKCJFdmFsdWF0aW9uIGlkIiwgY29kZVNuaXBwZXQsIHJlc3VsdC5nZXRFdmFsdWF0aW9uSUQoKSk7Ci0JCWFzc2VydEVxdWFscygiVmFsdWUgZGlzcGxheSBzdHJpbmciLCBkaXNwbGF5U3RyaW5nLCByZXN1bHQuZ2V0VmFsdWVEaXNwbGF5U3RyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlZhbHVlIHR5cGUgbmFtZSIsIHR5cGVOYW1lLCByZXN1bHQuZ2V0VmFsdWVUeXBlTmFtZSgpKTsKLQl9Ci19Ci0vKioKLSAqIEV2YWx1YXRlcyB0aGUgZ2l2ZW4gdmFyaWFibGUgYW5kIG1ha2VzIHN1cmUgaXQgcmV0dXJucyBhIHJlc3VsdCB3aXRoIHRoZSBnaXZlbiBkaXNwbGF5IHN0cmluZyBhbmQgdHlwZSBuYW1lLgotICovCi1wcm90ZWN0ZWQgdm9pZCBldmFsdWF0ZVdpdGhFeHBlY3RlZFZhbHVlKEdsb2JhbFZhcmlhYmxlIHZhciwgY2hhcltdIGRpc3BsYXlTdHJpbmcsIGNoYXJbXSB0eXBlTmFtZSkgewotCVJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgUmVxdWVzdG9yKCk7Ci0JdHJ5IHsKLQkJY29udGV4dC5ldmFsdWF0ZVZhcmlhYmxlKHZhciwgZ2V0RW52KCksIGdldE9wdGlvbnMoKSwgcmVxdWVzdG9yLCBnZXRQcm9ibGVtRmFjdG9yeSgpKTsKLQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0VHJ1ZSgiVGFyZ2V0IGV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQl9Ci0JaWYgKHJlcXVlc3Rvci5yZXN1bHRJbmRleCAhPSAwKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVxdWVzdG9yLnJlc3VsdEluZGV4OyBpKyspewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJ1bmV4cGVjdGVkIHJlc3VsdFsiK2krIl06ICIgKyByZXF1ZXN0b3IucmVzdWx0c1tpXSk7Ci0JCX0KLQl9Ci0JYXNzZXJ0VHJ1ZSgiVW5leHBlY3RlZCByZXN1bHQiLCByZXF1ZXN0b3IucmVzdWx0SW5kZXggPT0gMCk7Ci0JRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSByZXF1ZXN0b3IucmVzdWx0c1swXTsKLQlpZiAoZGlzcGxheVN0cmluZyA9PSBudWxsKSB7Ci0JCWFzc2VydFRydWUoIkhhcyB2YWx1ZSIsICFyZXN1bHQuaGFzVmFsdWUoKSk7Ci0JfSBlbHNlIHsKLQkJYXNzZXJ0VHJ1ZSgiSGFzIHZhbHVlIiwgcmVzdWx0Lmhhc1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlZhbHVlIGRpc3BsYXkgc3RyaW5nIiwgZGlzcGxheVN0cmluZywgcmVzdWx0LmdldFZhbHVlRGlzcGxheVN0cmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJWYWx1ZSB0eXBlIG5hbWUiLCB0eXBlTmFtZSwgcmVzdWx0LmdldFZhbHVlVHlwZU5hbWUoKSk7Ci0JfQotfQotLyoqCi0gKiBFdmFsdWF0ZXMgdGhlIGdpdmVuIGNvZGUgc25pcHBldCBhbmQgbWFrZXMgc3VyZSBhbiBldmFsdWF0aW9uIHJlc3VsdCBoYXMgYXQgbGVhc3QgdGhlIGdpdmVuIHdhcm5pbmcsCi0gKiBhbmQgdGhhdCBhbm90aGVyIGV2YWx1YXRpb24gcmVzdWx0IGhhcyB0aGUgZ2l2ZW4gZGlzcGxheSBzdHJpbmcuCi0gKi8KLXByb3RlY3RlZCB2b2lkIGV2YWx1YXRlV2l0aEV4cGVjdGVkV2FybmluZ0FuZERpc3BsYXlTdHJpbmcoZmluYWwgY2hhcltdIGNvZGVTbmlwcGV0LCBmaW5hbCBJUHJvYmxlbSBleHBlY3RlZCwgZmluYWwgY2hhcltdIGRpc3BsYXlTdHJpbmcpIHsKLQljbGFzcyBSZXN1bHRSZXF1ZXN0b3IgZXh0ZW5kcyBSZXF1ZXN0b3IgewotCQlib29sZWFuIGdvdFByb2JsZW0gPSBmYWxzZTsKLQkJYm9vbGVhbiBnb3REaXNwbGF5U3RyaW5nID0gZmFsc2U7Ci0JCXB1YmxpYyB2b2lkIGFjY2VwdFJlc3VsdChFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCkgewotCQkJYXNzZXJ0RXF1YWxzKCJFdmFsdWF0aW9uIHR5cGUiLCBFdmFsdWF0aW9uUmVzdWx0LlRfQ09ERV9TTklQUEVULCByZXN1bHQuZ2V0RXZhbHVhdGlvblR5cGUoKSk7Ci0JCQkvL2Fzc2VydEVxdWFscygiRXZhbHVhdGlvbiBpZCIsIGNvZGVTbmlwcGV0LCByZXN1bHQuZ2V0RXZhbHVhdGlvbklEKCkpOwotCQkJaWYgKHJlc3VsdC5oYXNWYWx1ZSgpKSB7Ci0JCQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHJlc3VsdC5nZXRWYWx1ZURpc3BsYXlTdHJpbmcoKSwgZGlzcGxheVN0cmluZykpIHsKLQkJCQkJZ290RGlzcGxheVN0cmluZyA9IHRydWU7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRUcnVlKCJIYXMgcHJvYmxlbSIsIHJlc3VsdC5oYXNQcm9ibGVtcygpKTsKLQkJCQlJUHJvYmxlbVtdIHByb2JsZW1zID0gcmVzdWx0LmdldFByb2JsZW1zKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9ibGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoRXZhbHVhdGlvblRlc3QudGhpcy5lcXVhbHMoZXhwZWN0ZWQsIHByb2JsZW1zW2ldKSkgewotCQkJCQkJZ290UHJvYmxlbSA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCVJlc3VsdFJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgUmVzdWx0UmVxdWVzdG9yKCk7Ci0JdHJ5IHsKLQkJY29udGV4dC5ldmFsdWF0ZShjb2RlU25pcHBldCwgZ2V0RW52KCksIGdldE9wdGlvbnMoKSwgcmVxdWVzdG9yLCBnZXRQcm9ibGVtRmFjdG9yeSgpKTsKLQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0VHJ1ZSgiVGFyZ2V0IGV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgd2FybmluZyIsIHJlcXVlc3Rvci5nb3RQcm9ibGVtKTsKLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBkaXNwbGF5IHN0cmluZyIsIHJlcXVlc3Rvci5nb3REaXNwbGF5U3RyaW5nKTsKLX0KLXByaXZhdGUgdm9pZCBmYWlsTm90RXF1YWxzKFN0cmluZyBtZXNzYWdlLCBjaGFyW10gZXhwZWN0ZWQsIGNoYXJbXSBhY3R1YWwpIHsKLQlTdHJpbmcgZm9ybWF0dGVkID0gIiI7Ci0JaWYgKG1lc3NhZ2UgIT0gbnVsbCkKLQkJZm9ybWF0dGVkID0gbWVzc2FnZSArICIgIjsKLQlTdHJpbmcgZXhwZWN0ZWRTdHJpbmcgPSBleHBlY3RlZCA9PSBudWxsID8gIm51bGwiIDogbmV3IFN0cmluZyhleHBlY3RlZCk7Ci0JU3RyaW5nIGFjdHVhbFN0cmluZyA9IGFjdHVhbCA9PSBudWxsID8gIm51bGwiIDogbmV3IFN0cmluZyhhY3R1YWwpOwotCWZhaWwoZm9ybWF0dGVkICsgImV4cGVjdGVkOjwiICsgZXhwZWN0ZWRTdHJpbmcgKyAiPiBidXQgd2FzOjwiICsgYWN0dWFsU3RyaW5nICsgIj4iKTsKLX0KLXB1YmxpYyBJTmFtZUVudmlyb25tZW50IGdldEVudigpIHsKLQlyZXR1cm4gZW52OwotfQotcHVibGljIE1hcCBnZXRPcHRpb25zKCkgewotCQotCQlNYXAgZGVmYXVsdE9wdGlvbnMgPSBNYWluLmdldERlZmF1bHRPcHRpb25zKCk7Ci0JCWRlZmF1bHRPcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fTG9jYWxWYXJpYWJsZUF0dHJpYnV0ZSwKLQkJCUNvbXBpbGVyT3B0aW9ucy5ET19OT1RfR0VORVJBVEUpOwotCQlkZWZhdWx0T3B0aW9ucy5wdXQoCi0JCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX0xpbmVOdW1iZXJBdHRyaWJ1dGUsCi0JCQlDb21waWxlck9wdGlvbnMuRE9fTk9UX0dFTkVSQVRFKTsKLQkJZGVmYXVsdE9wdGlvbnMucHV0KAotCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Tb3VyY2VGaWxlQXR0cmlidXRlLAotCQkJQ29tcGlsZXJPcHRpb25zLkRPX05PVF9HRU5FUkFURSk7Ci0JCWRlZmF1bHRPcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0VW51c2VkTG9jYWwsIAotCQkJQ29tcGlsZXJPcHRpb25zLldBUk5JTkcpOwotCQlkZWZhdWx0T3B0aW9ucy5wdXQoCi0JCQlDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydFVudXNlZEltcG9ydCwgCi0JCQlDb21waWxlck9wdGlvbnMuSUdOT1JFKTsKLQkJZGVmYXVsdE9wdGlvbnMucHV0KAotCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbnVzZWRQYXJhbWV0ZXIsCi0JCQlDb21waWxlck9wdGlvbnMuV0FSTklORyk7Ci0JCWRlZmF1bHRPcHRpb25zLnB1dCgKLQkJCUNvbXBpbGVyT3B0aW9ucy5PUFRJT05fUmVwb3J0TG9jYWxWYXJpYWJsZUhpZGluZywKLQkJCUNvbXBpbGVyT3B0aW9ucy5XQVJOSU5HKTsKLQkJZGVmYXVsdE9wdGlvbnMucHV0KAotCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRGaWVsZEhpZGluZywKLQkJCUNvbXBpbGVyT3B0aW9ucy5XQVJOSU5HKTsKLQkJZGVmYXVsdE9wdGlvbnMucHV0KAotCQkJQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRQb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudCwKLQkJCUNvbXBpbGVyT3B0aW9ucy5XQVJOSU5HKTsKLQkJcmV0dXJuIGRlZmF1bHRPcHRpb25zOwotfQotCi1wdWJsaWMgSVByb2JsZW1GYWN0b3J5IGdldFByb2JsZW1GYWN0b3J5KCkgewotCXJldHVybiBuZXcgRGVmYXVsdFByb2JsZW1GYWN0b3J5KGphdmEudXRpbC5Mb2NhbGUuZ2V0RGVmYXVsdCgpKTsKLX0KLS8qKgotICogSW5zdGFsbHMgYWxsIHRoZSB2YXJpYWJsZXMgYW5kIGNoZWNrIHRoYXQgdGhlIG51bWJlciBvZiBpbnN0YWxsZWQgdmFyaWFibGVzIGlzIHRoZSBnaXZlbiBudW1iZXIuCi0gKi8KLXByb3RlY3RlZCB2b2lkIGluc3RhbGxWYXJpYWJsZXMoZmluYWwgaW50IGV4cGVjdGVkTnVtYmVyKSB7Ci0JY2xhc3MgSW5zdGFsbFJlcXVlc3RvciBleHRlbmRzIFJlcXVlc3RvciB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCXB1YmxpYyB2b2lkIGFjY2VwdFJlc3VsdChFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCkgewotCQkJYXNzZXJ0VHJ1ZSgiSGFzIHByb2JsZW1zIiwgIXJlc3VsdC5oYXNQcm9ibGVtcygpKTsKLQkJCWFzc2VydFRydWUoIkhhcyB2YWx1ZSIsIHJlc3VsdC5oYXNWYWx1ZSgpKTsKLQkJCXRoaXMuY291bnQrKzsKLQkJfQotCX0KLQkKLQlJbnN0YWxsUmVxdWVzdG9yIGluc3RhbGxSZXF1ZXN0b3IgPSBuZXcgSW5zdGFsbFJlcXVlc3RvcigpOwotCXRyeSB7Ci0JCWNvbnRleHQuZXZhbHVhdGVWYXJpYWJsZXMoZ2V0RW52KCksIGdldE9wdGlvbnMoKSwgaW5zdGFsbFJlcXVlc3RvciwgZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JfSBjYXRjaCAoSW5zdGFsbEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydFRydWUoIlRhcmdldCBleGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCX0KLQlhc3NlcnRFcXVhbHMoIk51bWJlciBvZiBpbnN0YWxsZWQgdmFyaWFibGVzIiwgZXhwZWN0ZWROdW1iZXIsIGluc3RhbGxSZXF1ZXN0b3IuY291bnQpOwotfQotLyoqCi0gKiBSZXR1cm5zIGEgbmV3IHByb2JsZW0gd2l0aCB0aGUgZ2l2ZW4gaWQsIHNldmVyaXR5LCBzb3VyY2UgcG9zaXRpb25zIGFuZCBsaW5lIG51bWJlci4KLSAqLwotcHJvdGVjdGVkIERlZmF1bHRQcm9ibGVtIG5ld1Byb2JsZW0oaW50IGlkLCBpbnQgc2V2ZXJpdHksIGludCBzdGFydFBvcywgaW50IGVuZFBvcywgaW50IGxpbmUpIHsKLQlyZXR1cm4gbmV3IERlZmF1bHRQcm9ibGVtKG51bGwsIG51bGwsIGlkLCBudWxsLCBzZXZlcml0eSwgc3RhcnRQb3MsIGVuZFBvcywgbGluZSk7Ci19Ci1wdWJsaWMgdm9pZCByZXNldEVudigpIHsKLQlTdHJpbmcgZW5jb2RpbmcgPSAoU3RyaW5nKSBnZXRPcHRpb25zKCkuZ2V0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fRW5jb2RpbmcpOwotCWlmICgiIi5lcXVhbHMoZW5jb2RpbmcpKSBlbmNvZGluZyA9IG51bGw7Ci0JZW52ID0gbmV3IEZpbGVTeXN0ZW0obmV3IFN0cmluZ1tdIHtVdGlsLmdldEphdmFDbGFzc0xpYigpLCBFdmFsdWF0aW9uVGVzdC5FVkFMX0RJUkVDVE9SWSArIEZpbGUuc2VwYXJhdG9yICsgTG9jYWxWTUxhdW5jaGVyLlJFR1VMQVJfQ0xBU1NQQVRIX0RJUkVDVE9SWX0sIG5ldyBTdHJpbmdbMF0sIGVuY29kaW5nKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzZXR1cFN1aXRlKENsYXNzIGNsYXp6KSB7Ci0JRXZhbHVhdGlvblNldHVwIGV2YWxTZXR1cCA9IG5ldyBFdmFsdWF0aW9uU2V0dXAoc3VpdGUoY2xhenopKTsKLQlldmFsU2V0dXAuanJlUGF0aCA9IEpSRV9QQVRIOwotCWV2YWxTZXR1cC5ldmFsRGlyZWN0b3J5ID0gRVZBTF9ESVJFQ1RPUlk7Ci0JcmV0dXJuIGV2YWxTZXR1cDsKLX0KLXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JaWYgKHRoaXMudGFyZ2V0ICE9IG51bGwpIHsKLQkJdGhpcy50YXJnZXQuZGlzY29ubmVjdCgpOyAvLyBDbG9zZSB0aGUgc29ja2V0IGZpcnN0IHNvIHRoYXQgdGhlIE9TIHJlc291cmNlIGhhcyBhIGNoYW5jZSB0byBiZSBmcmVlZC4gCi0JfQotCWlmICh0aGlzLmxhdW5jaGVkVk0gIT0gbnVsbCkgewotCQl0cnkgewotCQkJaW50IHJldHJ5ID0gMDsKLQkJCXdoaWxlICh0aGlzLmxhdW5jaGVkVk0uaXNSdW5uaW5nKCkgJiYgKCsrcmV0cnkgPCAyMCkpIHsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAocmV0cnkgKiAxMDApOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodGhpcy5sYXVuY2hlZFZNLmlzUnVubmluZygpKSB7Ci0JCQkJdGhpcy5sYXVuY2hlZFZNLnNodXREb3duKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoQ2xhc3MgZXZhbHVhdGlvblRlc3RDbGFzcykgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoZXZhbHVhdGlvblRlc3RDbGFzcyk7Ci0JcmV0dXJuIHN1aXRlOwotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2V2YWwvSkRJU3RhY2tGcmFtZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2V2YWwvSkRJU3RhY2tGcmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjRhODFjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ldmFsL0pESVN0YWNrRnJhbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmV2YWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMucnVudGltZS5SdW50aW1lQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsLkV2YWx1YXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWwuRXZhbHVhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbC5JbnN0YWxsRXhjZXB0aW9uOwotCi1pbXBvcnQgY29tLnN1bi5qZGkuQWJzZW50SW5mb3JtYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi5qZGkuQ2xhc3NOb3RMb2FkZWRFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi5qZGkuQ2xhc3NUeXBlOwotaW1wb3J0IGNvbS5zdW4uamRpLkZpZWxkOwotaW1wb3J0IGNvbS5zdW4uamRpLkluY29tcGF0aWJsZVRocmVhZFN0YXRlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4uamRpLkludmFsaWRUeXBlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4uamRpLkludm9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi5qZGkuTG9jYWxWYXJpYWJsZTsKLWltcG9ydCBjb20uc3VuLmpkaS5Mb2NhdGlvbjsKLWltcG9ydCBjb20uc3VuLmpkaS5NZXRob2Q7Ci1pbXBvcnQgY29tLnN1bi5qZGkuT2JqZWN0UmVmZXJlbmNlOwotaW1wb3J0IGNvbS5zdW4uamRpLlJlZmVyZW5jZVR5cGU7Ci1pbXBvcnQgY29tLnN1bi5qZGkuU3RhY2tGcmFtZTsKLWltcG9ydCBjb20uc3VuLmpkaS5UaHJlYWRSZWZlcmVuY2U7Ci1pbXBvcnQgY29tLnN1bi5qZGkuVmFsdWU7Ci1pbXBvcnQgY29tLnN1bi5qZGkuVmlydHVhbE1hY2hpbmU7Ci1pbXBvcnQgY29tLnN1bi5qZGkuZXZlbnQuQnJlYWtwb2ludEV2ZW50OwotaW1wb3J0IGNvbS5zdW4uamRpLmV2ZW50LkV2ZW50OwotaW1wb3J0IGNvbS5zdW4uamRpLmV2ZW50LkV2ZW50U2V0OwotaW1wb3J0IGNvbS5zdW4uamRpLnJlcXVlc3QuQnJlYWtwb2ludFJlcXVlc3Q7Ci1pbXBvcnQgY29tLnN1bi5qZGkucmVxdWVzdC5FdmVudFJlcXVlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBKRElTdGFja0ZyYW1lIGltcGxlbWVudHMgRXZhbHVhdGlvbkNvbnN0YW50cywgUnVudGltZUNvbnN0YW50cyB7Ci0JVmlydHVhbE1hY2hpbmUgamRpVk07Ci0JVGhyZWFkUmVmZXJlbmNlIGpkaVRocmVhZDsKLQlTdHJpbmcgdXNlckNvZGU7Ci0JU3RyaW5nIGJyZWFrcG9pbnRDbGFzc05hbWU7Ci0JU3RyaW5nIGJyZWFrcG9pbnRNZXRob2ROYW1lOwotCWludCBicmVha3BvaW50TGluZTsKLXB1YmxpYyBKRElTdGFja0ZyYW1lKFZpcnR1YWxNYWNoaW5lIGpkaVZNLCBEZWJ1Z0V2YWx1YXRpb25UZXN0IHRlc3QsIFN0cmluZyB1c2VyQ29kZSkgewotCXRoaXMoamRpVk0sIHRlc3QsIHVzZXJDb2RlLCAiX0pESVN0YWNrRnJhbWVfIiwgImZvbyIsIEludGVnZXIuTUFYX1ZBTFVFKTsKLX0KLXB1YmxpYyBKRElTdGFja0ZyYW1lKAotCVZpcnR1YWxNYWNoaW5lIGpkaVZNLCAKLQlEZWJ1Z0V2YWx1YXRpb25UZXN0IHRlc3QsIAotCVN0cmluZyB1c2VyQ29kZSwKLQlTdHJpbmcgYnJlYWtwb2ludENsYXNzTmFtZSwKLQlTdHJpbmcgYnJlYWtwb2ludE1ldGhvZE5hbWUsCi0JaW50IGJyZWFrcG9pbnRMaW5lKSB7Ci0JCQotCXRoaXMuamRpVk0gPSBqZGlWTTsKLQl0aGlzLnVzZXJDb2RlID0gdXNlckNvZGU7Ci0JdGhpcy5icmVha3BvaW50Q2xhc3NOYW1lID0gYnJlYWtwb2ludENsYXNzTmFtZTsKLQl0aGlzLmJyZWFrcG9pbnRNZXRob2ROYW1lID0gYnJlYWtwb2ludE1ldGhvZE5hbWU7Ci0JdGhpcy5icmVha3BvaW50TGluZSA9IGJyZWFrcG9pbnRMaW5lOwotCQotCXRlc3QuamRpU3RhY2tGcmFtZSA9IG51bGw7Ci0JdGhpcy5qZGlUaHJlYWQgPSB0aGlzLmdldERlYnVnZ2VkVGhyZWFkKHRlc3QpOwotCXRlc3QuamRpU3RhY2tGcmFtZSA9IHRoaXM7Ci19Ci1wdWJsaWMgY2hhcltdIGRlY2xhcmluZ1R5cGVOYW1lKCkgewotCWlmICh0aGlzLmJyZWFrcG9pbnRMaW5lICE9IEludGVnZXIuTUFYX1ZBTFVFKSB7IC8vIGlmIG5vdCBpbiBhIGNvZGUgc25pcHBldAotCQlTdGFja0ZyYW1lIGZyYW1lID0gZ2V0U3RhY2tGcmFtZSgpOwotCQlyZXR1cm4gZnJhbWUubG9jYXRpb24oKS5kZWNsYXJpbmdUeXBlKCkubmFtZSgpLnRvQ2hhckFycmF5KCk7Ci0JfQotCXJldHVybiBudWxsOwotfQotcHJvdGVjdGVkIFRocmVhZFJlZmVyZW5jZSBnZXREZWJ1Z2dlZFRocmVhZChEZWJ1Z0V2YWx1YXRpb25UZXN0IHRlc3QpIHsKLQl0cnkgewotCQkvLyBkZXNpbnRhbGwgcHJldmlvdXMgYnJlYWtwb2ludHMKLQkJdGhpcy5qZGlWTS5ldmVudFJlcXVlc3RNYW5hZ2VyKCkuZGVsZXRlQWxsQnJlYWtwb2ludHMoKTsKLQotCQkvLyBpbnN0YWxsIGEgYnJlYWtwb2ludCBhdCB0aGUgYnJlYWtwb2ludExpbmUKLQkJTGlzdCBjbGFzc2VzID0gdGhpcy5qZGlWTS5jbGFzc2VzQnlOYW1lKHRoaXMuYnJlYWtwb2ludENsYXNzTmFtZSk7Ci0JCWlmIChjbGFzc2VzLnNpemUoKSA9PSAwKSB7Ci0JCQlpZiAodGhpcy5icmVha3BvaW50Q2xhc3NOYW1lLmVxdWFscygiX0pESVN0YWNrRnJhbWVfIikpIHsKLQkJCQkvLyBpbnN0YWxsIHNwZWNpYWwgY2xhc3MKLQkJCQlTdHJpbmcgc291cmNlID0KLQkJCQkJInB1YmxpYyBjbGFzcyBfSkRJU3RhY2tGcmFtZV8ge1xuIiArCi0JCQkJCSIgIHB1YmxpYyBpbnQgZm9vKCkge1xuIiArCi0JCQkJCSIgICAgcmV0dXJuIC0xO1xuIiArCi0JCQkJCSIgIH1cbiIgKwotCQkJCQkifSI7Ci0JCQkJdGVzdC5jb21waWxlQW5kRGVwbG95KHNvdXJjZSwgIl9KRElTdGFja0ZyYW1lXyIpOwotCQkJfQotCQkJCi0JCQkvLyBmb3JjZSBsb2FkIG9mIGNsYXNzIAotCQkJdGVzdC5ldmFsdWF0ZVdpdGhFeHBlY3RlZERpc3BsYXlTdHJpbmcoCi0JCQkJKCJyZXR1cm4gQ2xhc3MuZm9yTmFtZShcIiIgKyB0aGlzLmJyZWFrcG9pbnRDbGFzc05hbWUgKyAiXCIpOyIpLnRvQ2hhckFycmF5KCksCi0JCQkJKCJjbGFzcyAiICsgdGhpcy5icmVha3BvaW50Q2xhc3NOYW1lKS50b0NoYXJBcnJheSgpCi0JCQkpOwotCQkJY2xhc3NlcyA9IHRoaXMuamRpVk0uY2xhc3Nlc0J5TmFtZSh0aGlzLmJyZWFrcG9pbnRDbGFzc05hbWUpOwotCQkJaWYgKGNsYXNzZXMuc2l6ZSgpID09IDApIHsKLQkJCQkvLyB3b3JrYXJvdW5kIGJ1ZyBpbiBTdGFuZGFyZCBWTQotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdGhpcy5qZGlWTS5hbGxDbGFzc2VzKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCVJlZmVyZW5jZVR5cGUgdHlwZSA9IChSZWZlcmVuY2VUeXBlKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKHR5cGUubmFtZSgpLmVxdWFscyh0aGlzLmJyZWFrcG9pbnRDbGFzc05hbWUpKSB7Ci0JCQkJCQljbGFzc2VzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJCQkJCWNsYXNzZXMuYWRkKHR5cGUpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGNsYXNzZXMuc2l6ZSgpID09IDApIHsKLQkJCQkJdGhyb3cgbmV3IEVycm9yKCJKREkgY291bGQgbm90IHJldHJpZXZlIGNsYXNzIGZvciAiICsgdGhpcy5icmVha3BvaW50Q2xhc3NOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJQ2xhc3NUeXBlIGNsYXp6ID0gKENsYXNzVHlwZSljbGFzc2VzLmdldCgwKTsKLQkJTWV0aG9kIG1ldGhvZCA9IChNZXRob2QpY2xhenoubWV0aG9kc0J5TmFtZSh0aGlzLmJyZWFrcG9pbnRNZXRob2ROYW1lKS5nZXQoMCk7Ci0JCUxvY2F0aW9uIGxvY2F0aW9uOwotCQlpZiAodGhpcy5icmVha3BvaW50TGluZSA8IDAgfHwgdGhpcy5icmVha3BvaW50TGluZSA9PSBJbnRlZ2VyLk1BWF9WQUxVRSkgewotCQkJbG9jYXRpb24gPSBtZXRob2QubG9jYXRpb24oKTsKLQkJfSBlbHNlIHsKLQkJCWxvY2F0aW9uID0gKExvY2F0aW9uKW1ldGhvZC5sb2NhdGlvbnNPZkxpbmUodGhpcy5icmVha3BvaW50TGluZSkuZ2V0KDApOwotCQl9Ci0JCUJyZWFrcG9pbnRSZXF1ZXN0IHJlcXVlc3QgPSB0aGlzLmpkaVZNLmV2ZW50UmVxdWVzdE1hbmFnZXIoKS5jcmVhdGVCcmVha3BvaW50UmVxdWVzdChsb2NhdGlvbik7Ci0JCXJlcXVlc3Quc2V0U3VzcGVuZFBvbGljeShFdmVudFJlcXVlc3QuU1VTUEVORF9FVkVOVF9USFJFQUQpOwotCQlyZXF1ZXN0LmVuYWJsZSgpOwotCi0JCS8vIGNyZWF0ZSBhIG5ldyB0aHJlYWQgdGhhdCBoaXQgdGhlIGJyZWFrcG9pbnQKLQkJRXZhbHVhdGlvblRlc3QuUmVxdWVzdG9yIHJlcXVlc3RvciA9IHRlc3QubmV3IFJlcXVlc3RvcigpOwotCQl0cnkgewotCQkJdGVzdC5yZXNldEVudigpOwotCQkJdGVzdC5jb250ZXh0LmV2YWx1YXRlKAotCQkJCSgiKG5ldyBUaHJlYWQoKSB7XG4iICsKLQkJCQkiICBwdWJsaWMgdm9pZCBydW4oKSB7XG4iICsKLQkJCQkgICAgIHVzZXJDb2RlICsgIlxuIiArCi0JCQkJKHRoaXMuYnJlYWtwb2ludENsYXNzTmFtZS5lcXVhbHMoIl9KRElTdGFja0ZyYW1lXyIpID8gIiAgICBuZXcgX0pESVN0YWNrRnJhbWVfKCkuZm9vKCk7XG4iIDogIiIpICsKLQkJCQkiICB9XG4iICsKLQkJCQkiICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkge1xuIiArCi0JCQkJIiAgICByZXR1cm4gXCJteSB0aHJlYWRcIjtcbiIgKwotCQkJCSIgIH1cbiIgKwotCQkJCSJ9KS5zdGFydCgpO1xuIikudG9DaGFyQXJyYXkoKSwKLQkJCQl0ZXN0LmdldEVudigpLCAKLQkJCQl0ZXN0LmdldE9wdGlvbnMoKSwgCi0JCQkJcmVxdWVzdG9yLCAKLQkJCQl0ZXN0LmdldFByb2JsZW1GYWN0b3J5KCkpOwotCQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJCUV2YWx1YXRpb25UZXN0LmFzc2VydFRydWUoIlRhcmdldCBleGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0JCX0KLQkJRXZhbHVhdGlvblJlc3VsdFtdIHJlc3VsdHMgPSByZXF1ZXN0b3IucmVzdWx0czsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1ZXN0b3IucmVzdWx0SW5kZXggKyAxOyBpKyspewotCQkJaWYgKHJlc3VsdHNbaV0uaGFzRXJyb3JzKCkpIHsKLQkJCQlFdmFsdWF0aW9uVGVzdC5hc3NlcnRUcnVlKCJDb21waWxhdGlvbiBlcnJvciBpbiB1c2VyIGNvZGUiLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBXYWl0IGZvciB0aGUgYnJlYWtwb2ludCBldmVudAotCQlFdmVudCBldmVudCA9IG51bGw7Ci0JCWRvIHsKLQkJCUV2ZW50U2V0IHNldCA9IHRoaXMuamRpVk0uZXZlbnRRdWV1ZSgpLnJlbW92ZSgpOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzZXQuZXZlbnRJdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCWV2ZW50ID0gKEV2ZW50KWl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBCcmVha3BvaW50RXZlbnQpCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9IHdoaWxlICghKGV2ZW50IGluc3RhbmNlb2YgQnJlYWtwb2ludEV2ZW50KSk7Ci0KLQkJLy8gUmV0dXJuIHRoZSBzdXNwZW5kZWQgdGhyZWFkCi0JCXJldHVybiAoKEJyZWFrcG9pbnRFdmVudClldmVudCkudGhyZWFkKCk7Ci0JfSBjYXRjaCAoQWJzZW50SW5mb3JtYXRpb25FeGNlcHRpb24gZSkgewotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci1wcm90ZWN0ZWQgU3RhY2tGcmFtZSBnZXRTdGFja0ZyYW1lKCkgewotCXRyeSB7Ci0JCWlmICh0aGlzLmJyZWFrcG9pbnRMaW5lID09IEludGVnZXIuTUFYX1ZBTFVFKSB7Ci0JCQlyZXR1cm4gdGhpcy5qZGlUaHJlYWQuZnJhbWUoMSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gdGhpcy5qZGlUaHJlYWQuZnJhbWUoMCk7Ci0JCX0KLQl9IGNhdGNoIChJbmNvbXBhdGlibGVUaHJlYWRTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KLXB1YmxpYyBib29sZWFuIGlzQ29uc3RydWN0b3JDYWxsKCkgewotCWlmICh0aGlzLmJyZWFrcG9pbnRMaW5lICE9IEludGVnZXIuTUFYX1ZBTFVFKSB7IC8vIGlmIG5vdCBpbiBhIGNvZGUgc25pcHBldAotCQlTdGFja0ZyYW1lIGZyYW1lID0gZ2V0U3RhY2tGcmFtZSgpOwotCQlyZXR1cm4gZnJhbWUubG9jYXRpb24oKS5tZXRob2QoKS5pc0NvbnN0cnVjdG9yKCk7Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLXB1YmxpYyBib29sZWFuIGlzU3RhdGljKCkgewotCWlmICh0aGlzLmJyZWFrcG9pbnRMaW5lICE9IEludGVnZXIuTUFYX1ZBTFVFKSB7IC8vIGlmIG5vdCBpbiBhIGNvZGUgc25pcHBldAotCQlTdGFja0ZyYW1lIGZyYW1lID0gZ2V0U3RhY2tGcmFtZSgpOwotCQlyZXR1cm4gZnJhbWUubG9jYXRpb24oKS5tZXRob2QoKS5pc1N0YXRpYygpOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci1wdWJsaWMgaW50W10gbG9jYWxWYXJpYWJsZU1vZGlmaWVycygpIHsKLQl0cnkgewotCQlTdGFja0ZyYW1lIGZyYW1lID0gZ2V0U3RhY2tGcmFtZSgpOwotCQlMaXN0IHZhcmlhYmxlcyA9IGZyYW1lLnZpc2libGVWYXJpYWJsZXMoKTsKLQkJaW50W10gbW9kaWZpZXJzID0gbmV3IGludFt2YXJpYWJsZXMuc2l6ZSgpXTsKLS8qCQlJdGVyYXRvciBpdGVyYXRvciA9IHZhcmlhYmxlcy5pdGVyYXRvcigpOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUxvY2FsVmFyaWFibGUgdmFyID0gKExvY2FsVmFyaWFibGUpaXRlcmF0b3IubmV4dCgpOwotCQkJLy8gVEJEIG1vZGlmaWVyc1tpKytdID0gdmFyLiA/Pz8gOwotCQl9Ci0qLwkJcmV0dXJuIG1vZGlmaWVyczsKLQl9IGNhdGNoIChBYnNlbnRJbmZvcm1hdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KLXB1YmxpYyBjaGFyW11bXSBsb2NhbFZhcmlhYmxlTmFtZXMoKSB7Ci0JdHJ5IHsKLQkJU3RhY2tGcmFtZSBmcmFtZSA9IGdldFN0YWNrRnJhbWUoKTsKLQkJSXRlcmF0b3IgdmFyaWFibGVzID0gZnJhbWUudmlzaWJsZVZhcmlhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCVZlY3RvciBuYW1lcyA9IG5ldyBWZWN0b3IoKTsKLQkJd2hpbGUgKHZhcmlhYmxlcy5oYXNOZXh0KCkpIHsKLQkJCUxvY2FsVmFyaWFibGUgdmFyID0gKExvY2FsVmFyaWFibGUpdmFyaWFibGVzLm5leHQoKTsKLQkJCW5hbWVzLmFkZEVsZW1lbnQodmFyLm5hbWUoKS50b0NoYXJBcnJheSgpKTsKLQkJfQotCQljaGFyW11bXSByZXN1bHQgPSBuZXcgY2hhcltuYW1lcy5zaXplKCldW107Ci0JCW5hbWVzLmNvcHlJbnRvKHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfSBjYXRjaCAoQWJzZW50SW5mb3JtYXRpb25FeGNlcHRpb24gZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19Ci1wdWJsaWMgY2hhcltdW10gbG9jYWxWYXJpYWJsZVR5cGVOYW1lcygpIHsKLQl0cnkgewotCQlTdGFja0ZyYW1lIGZyYW1lID0gZ2V0U3RhY2tGcmFtZSgpOwotCQlJdGVyYXRvciB2YXJpYWJsZXMgPSBmcmFtZS52aXNpYmxlVmFyaWFibGVzKCkuaXRlcmF0b3IoKTsKLQkJVmVjdG9yIG5hbWVzID0gbmV3IFZlY3RvcigpOwotCQl3aGlsZSAodmFyaWFibGVzLmhhc05leHQoKSkgewotCQkJTG9jYWxWYXJpYWJsZSB2YXIgPSAoTG9jYWxWYXJpYWJsZSl2YXJpYWJsZXMubmV4dCgpOwotCQkJbmFtZXMuYWRkRWxlbWVudCh2YXIudHlwZU5hbWUoKS50b0NoYXJBcnJheSgpKTsKLQkJfQotCQljaGFyW11bXSByZXN1bHQgPSBuZXcgY2hhcltuYW1lcy5zaXplKCldW107Ci0JCW5hbWVzLmNvcHlJbnRvKHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfSBjYXRjaCAoQWJzZW50SW5mb3JtYXRpb25FeGNlcHRpb24gZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19Ci1wdWJsaWMgYm9vbGVhbiBydW4oU3RyaW5nIGNvZGVTbmlwcGV0Q2xhc3NOYW1lKSB7Ci0JCUNsYXNzVHlwZSBjb2RlU25pcHBldENsYXNzOwotCQlPYmplY3RSZWZlcmVuY2UgY29kZVNuaXBwZXQ7Ci0JCU1ldGhvZCBtZXRob2Q7Ci0JCUxpc3QgYXJndW1lbnRzOwotCQlPYmplY3RSZWZlcmVuY2UgY29kZVNuaXBwZXRSdW5uZXI7Ci0JCXRyeSB7Ci0JCQkvLyBHZXQgdGhlIGNvZGUgc25pcHBldCBjbGFzcwotCQkJTGlzdCBjbGFzc2VzID0gamRpVk0uY2xhc3Nlc0J5TmFtZShjb2RlU25pcHBldENsYXNzTmFtZSk7Ci0JCQl3aGlsZSAoY2xhc3Nlcy5zaXplKCkgPT0gMCkgewotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCgxMDApOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQkJY2xhc3NlcyA9IGpkaVZNLmNsYXNzZXNCeU5hbWUoY29kZVNuaXBwZXRDbGFzc05hbWUpOwotCQkJCWlmIChjbGFzc2VzLnNpemUoKSA9PSAwKSB7Ci0JCQkJCS8vIHdvcmthcm91bmQgYnVnIGluIFN0YW5kYXJkIFZNCi0JCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdGhpcy5qZGlWTS5hbGxDbGFzc2VzKCkuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJUmVmZXJlbmNlVHlwZSB0eXBlID0gKFJlZmVyZW5jZVR5cGUpaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYgKHR5cGUubmFtZSgpLmVxdWFscyhjb2RlU25pcHBldENsYXNzTmFtZSkpIHsKLQkJCQkJCQljbGFzc2VzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJCQkJCQljbGFzc2VzLmFkZCh0eXBlKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNvZGVTbmlwcGV0Q2xhc3MgPSAoQ2xhc3NUeXBlKWNsYXNzZXMuZ2V0KDApOwotCi0JCQkvLyBDcmVhdGUgYSBuZXcgY29kZSBzbmlwcGV0Ci0JCQlNZXRob2QgY29uc3RydWN0b3IgPSAoTWV0aG9kKWNvZGVTbmlwcGV0Q2xhc3MubWV0aG9kc0J5TmFtZSgiPGluaXQ+IikuZ2V0KDApOwotCQkJY29kZVNuaXBwZXQgPSBjb2RlU25pcHBldENsYXNzLm5ld0luc3RhbmNlKGpkaVRocmVhZCwgY29uc3RydWN0b3IsIG5ldyBBcnJheUxpc3QoKSwgQ2xhc3NUeXBlLklOVk9LRV9TSU5HTEVfVEhSRUFERUQpOwotCi0JCQkvLyBJbnN0YWxsIGxvY2FsIHZhcmlhYmxlcyBhbmQgInRoaXMiIGludG8gZ2VuZXJhdGVkIGZpZWxkcwotCQkJU3RhY2tGcmFtZSBzdGFja0ZyYW1lID0gZ2V0U3RhY2tGcmFtZSgpOwotCQkJdHJ5IHsKLQkJCQlJdGVyYXRvciB2YXJpYWJsZXMgPSBzdGFja0ZyYW1lLnZpc2libGVWYXJpYWJsZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlICh2YXJpYWJsZXMuaGFzTmV4dCgpKSB7Ci0JCQkJCUxvY2FsVmFyaWFibGUgamRpVmFyaWFibGUgPSAoTG9jYWxWYXJpYWJsZSl2YXJpYWJsZXMubmV4dCgpOwotCQkJCQlWYWx1ZSB2YWx1ZSA9IHN0YWNrRnJhbWUuZ2V0VmFsdWUoamRpVmFyaWFibGUpOwotCQkJCQlGaWVsZCBmaWVsZCA9IGNvZGVTbmlwcGV0Q2xhc3MuZmllbGRCeU5hbWUobmV3IFN0cmluZyhMT0NBTF9WQVJfUFJFRklYKSArIGpkaVZhcmlhYmxlLm5hbWUoKSk7Ci0JCQkJCWNvZGVTbmlwcGV0LnNldFZhbHVlKGZpZWxkLCB2YWx1ZSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQWJzZW50SW5mb3JtYXRpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIE5vIHZhcmlhYmxlcwotCQkJfQotCQkJRmllbGQgZGVsZWdhdGVUaGlzID0gY29kZVNuaXBwZXRDbGFzcy5maWVsZEJ5TmFtZShuZXcgU3RyaW5nKERFTEVHQVRFX1RISVMpKTsKLQkJCU9iamVjdFJlZmVyZW5jZSB0aGlzT2JqZWN0OwotCQkJaWYgKGRlbGVnYXRlVGhpcyAhPSBudWxsICYmICgodGhpc09iamVjdCA9IHN0YWNrRnJhbWUudGhpc09iamVjdCgpKSAhPSBudWxsKSkgewotCQkJCWNvZGVTbmlwcGV0LnNldFZhbHVlKGRlbGVnYXRlVGhpcywgdGhpc09iamVjdCk7Ci0JCQl9Ci0KLQkJCS8vIEdldCB0aGUgY29kZSBzbmlwcGV0IHJ1bm5lcgotCQkJQ2xhc3NUeXBlIGNvZGVTbmlwcGV0UnVubmVyQ2xhc3MgPSAoQ2xhc3NUeXBlKWpkaVZNLmNsYXNzZXNCeU5hbWUoQ09ERV9TTklQUEVUX1JVTk5FUl9DTEFTU19OQU1FKS5nZXQoMCk7Ci0JCQlGaWVsZCB0aGVSdW5uZXIgPSBjb2RlU25pcHBldFJ1bm5lckNsYXNzLmZpZWxkQnlOYW1lKFRIRV9SVU5ORVJfRklFTEQpOwotCQkJY29kZVNuaXBwZXRSdW5uZXIgPSAoT2JqZWN0UmVmZXJlbmNlKWNvZGVTbmlwcGV0UnVubmVyQ2xhc3MuZ2V0VmFsdWUodGhlUnVubmVyKTsKLQotCQkJLy8gR2V0IHRoZSBtZXRob2QgJ3J1bkNvZGVTbmlwcGV0JyBhbmQgaXRzIGFyZ3VtZW50cwkJCi0JCQltZXRob2QgPSAoTWV0aG9kKWNvZGVTbmlwcGV0UnVubmVyQ2xhc3MubWV0aG9kc0J5TmFtZShSVU5fQ09ERV9TTklQUEVUX01FVEhPRCkuZ2V0KDApOwotCQkJYXJndW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJYXJndW1lbnRzLmFkZChjb2RlU25pcHBldCk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90TG9hZGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEluY29tcGF0aWJsZVRocmVhZFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludmFsaWRUeXBlRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXRyeSB7Ci0JCQkvLyBJbnZva2UgcnVuQ29kZVNuaXBwZXQoQ29kZVNuaXBwZXQpCi0JCQljb2RlU25pcHBldFJ1bm5lci5pbnZva2VNZXRob2QoamRpVGhyZWFkLCBtZXRob2QsIGFyZ3VtZW50cywgQ2xhc3NUeXBlLklOVk9LRV9TSU5HTEVfVEhSRUFERUQpOwotCi0JCQkvLyBSZXRyaWV2ZSB2YWx1ZXMgb2YgbG9jYWwgdmFyaWFibGVzIGFuZCBwdXQgdGhlbSBiYWNrIGluIHRoZSBzdGFjayBmcmFtZQotCQkJU3RhY2tGcmFtZSBzdGFja0ZyYW1lID0gZ2V0U3RhY2tGcmFtZSgpOwotCQkJdHJ5IHsKLQkJCQlJdGVyYXRvciB2YXJpYWJsZXMgPSBzdGFja0ZyYW1lLnZpc2libGVWYXJpYWJsZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlICh2YXJpYWJsZXMuaGFzTmV4dCgpKSB7Ci0JCQkJCUxvY2FsVmFyaWFibGUgamRpVmFyaWFibGUgPSAoTG9jYWxWYXJpYWJsZSl2YXJpYWJsZXMubmV4dCgpOwotCQkJCQlGaWVsZCBmaWVsZCA9IGNvZGVTbmlwcGV0Q2xhc3MuZmllbGRCeU5hbWUobmV3IFN0cmluZyhMT0NBTF9WQVJfUFJFRklYKSArIGpkaVZhcmlhYmxlLm5hbWUoKSk7Ci0JCQkJCVZhbHVlIHZhbHVlID0gY29kZVNuaXBwZXQuZ2V0VmFsdWUoZmllbGQpOwotCQkJCQlzdGFja0ZyYW1lLnNldFZhbHVlKGpkaVZhcmlhYmxlLCB2YWx1ZSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQWJzZW50SW5mb3JtYXRpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIE5vIHZhcmlhYmxlcwotCQkJfQotCQl9IGNhdGNoIChDbGFzc05vdExvYWRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbmNvbXBhdGlibGVUaHJlYWRTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnZhbGlkVHlwZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2V2YWwvTmVnYXRpdmVDb2RlU25pcHBldFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ldmFsL05lZ2F0aXZlQ29kZVNuaXBwZXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MDhhZWIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2V2YWwvTmVnYXRpdmVDb2RlU25pcHBldFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmV2YWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuaW1wbC5Db21waWxlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Qcm9ibGVtUmVhc29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIucHJvYmxlbS5Qcm9ibGVtU2V2ZXJpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbC5HbG9iYWxWYXJpYWJsZTsKLS8qKgotICogTmVnYXRpdmUgdGVzdHMgZm9yIGNvZGUgc25pcHBldC4gT25seSBjb21waWxhdGlvbiBwcm9ibGVtcyBzaG91bGQgYmUgcmVwb3J0ZWQgaW4KLSAqIHRoZXNlIHRlc3RzLgotICovCi1wdWJsaWMgY2xhc3MgTmVnYXRpdmVDb2RlU25pcHBldFRlc3QgZXh0ZW5kcyBFdmFsdWF0aW9uVGVzdCBpbXBsZW1lbnRzIFByb2JsZW1TZXZlcml0aWVzLCBQcm9ibGVtUmVhc29ucyB7Ci0vKioKLSAqIENyZWF0ZXMgYSBuZXcgTmVnYXRpdmVDb2RlU25pcHBldFRlc3QuCi0gKi8KLXB1YmxpYyBOZWdhdGl2ZUNvZGVTbmlwcGV0VGVzdChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCXJldHVybiBzZXR1cFN1aXRlKHRlc3RDbGFzcygpKTsKLX0KLS8qKgotICogVGVzdCBhIHNjZW5hcmlvIHdoZXJlIHRoZSBjaGFuZ2Ugb2YgdGhlIHBhY2thZ2UgZGVjbGFyYXRpb24gY2F1c2VzIGEgcHJvYmxlbSBpbiBhIGNvZGUgc25pcHBldC4KLSAqLwotcHVibGljIHZvaWQgdGVzdENoYW5nZVBhY2thZ2UoKSB7Ci0JdHJ5IHsKLQkJLy8gZGVmaW5lIHRoZSBwYWNrYWdlCi0JCWNvbnRleHQuc2V0UGFja2FnZU5hbWUoImphdmEudXRpbC56aXAiLnRvQ2hhckFycmF5KCkpOwotCQkKLQkJLy8gZXZhbHVhdGUgYSBjb2RlIHNuaXBwZXQgdGhhdCB1c2VzIHRoaXMgdmFyaWFibGUKLQkJY2hhcltdIGNvZGVTbmlwcGV0ID0gIm5ldyBJbmZsYXRlcklucHV0U3RyZWFtKG5ldyBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzBdKSkubGVuIi50b0NoYXJBcnJheSgpOwotCQlldmFsdWF0ZVdpdGhFeHBlY3RlZERpc3BsYXlTdHJpbmcoCi0JCQljb2RlU25pcHBldCwKLQkJCSIwIi50b0NoYXJBcnJheSgpKTsgCi0KLQkJLy8gYmFjayB0byB0aGUgZGVmYXVsdCBwYWNrYWdlIGJ1dCB3aXRoIGNvcnJlY3QgaW1wb3J0Ci0JCXRoaXMuY29udGV4dC5zZXRQYWNrYWdlTmFtZShuZXcgY2hhclswXSk7Ci0JCXRoaXMuY29udGV4dC5zZXRJbXBvcnRzKG5ldyBjaGFyW11bXSB7ImphdmEudXRpbC56aXAuKiIudG9DaGFyQXJyYXkoKX0pOwotCi0JCS8vIGV2YWx1YXRlIHNhbWUgY29kZSBzbmlwcGV0Ci0JCWV2YWx1YXRlV2l0aEV4cGVjdGVkUHJvYmxlbSgKLQkJCWNvZGVTbmlwcGV0LAotCQkJbmV3UHJvYmxlbShJUHJvYmxlbS5Ob3RWaXNpYmxlRmllbGQsIEVycm9yLCA3MSwgNzMsIDEpKTsgLy8gVGhlIGZpZWxkIGxlbiBpcyBub3QgdmlzaWJsZQotCi0JCS8vIGJhY2sgdG8gdGhlIGRlZmF1bHQgcGFja2FnZSBhbmQgd2l0aCBubyBpbXBvcnRzCi0JCXRoaXMuY29udGV4dC5zZXRJbXBvcnRzKG5ldyBjaGFyWzBdW10pOwotCQkKLQkJLy8gZXZhbHVhdGUgc2FtZSBjb2RlIHNuaXBwZXQKLQkJZXZhbHVhdGVXaXRoRXhwZWN0ZWRQcm9ibGVtKAotCQkJY29kZVNuaXBwZXQsCi0JCQluZXdQcm9ibGVtKElQcm9ibGVtLlVuZGVmaW5lZFR5cGUsIEVycm9yLCA0LCAyMiwgMSkpOyAvLyBUaGUgdHlwZSBJbmZsYXRlcklucHV0U3RyZWFtIGlzIHVuZGVmaW5lZAotCX0gZmluYWxseSB7Ci0JCS8vIENsZWFuIHVwCi0JCXRoaXMuY29udGV4dC5zZXRQYWNrYWdlTmFtZShuZXcgY2hhclswXSk7Ci0JCXRoaXMuY29udGV4dC5zZXRJbXBvcnRzKG5ldyBjaGFyWzBdW10pOwotCX0KLX0KLXB1YmxpYyBzdGF0aWMgQ2xhc3MgdGVzdENsYXNzKCkgewotCXJldHVybiBOZWdhdGl2ZUNvZGVTbmlwcGV0VGVzdC5jbGFzczsKLX0KLS8qKgotICogVGVzdCBhIGNvZGUgc25pcHBldCB3aGljaCBkZWNsYXJlcyBhIGNsYXNzIHRoYXQgdXNlcyBhbiBleHByZXNzaW9uIGFzIGEgcmV0dXJuZWQgc3RhdGVtZW50Ci0gKiBpbiBvbmUgb2YgaXRzIG1ldGhvZHMuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RFeHByZXNzaW9uSW5Jbm5lckNsYXNzKCkgewotCWV2YWx1YXRlV2l0aEV4cGVjdGVkUHJvYmxlbShidWlsZENoYXJBcnJheShuZXcgU3RyaW5nW10gewotCQkiY2xhc3MgWCB7IiwKLQkJIglpbnQgZm9vKCkgeyIsCi0JCSIJCTEgKyAxIiwKLQkJIgl9IiwKLQkJIn0iLAotCQkicmV0dXJuIG5ldyBYKCkuZm9vKCk7In0pLCAKLQkJbmV3UHJvYmxlbShJUHJvYmxlbS5JbnZhbGlkRXhwcmVzc2lvbkFzU3RhdGVtZW50LCBFcnJvciwgMjUsIDI1LCAzKSk7IC8vIFN5bnRheCBlcnJvciBvbiB0b2tlbiAiKyIKLX0KLS8qKgotICogVGVzdCBleHRyYSBjbG9zaW5nIGN1cmx5IGJyYWNrZXQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RFeHRyYUNsb3NpbmdDdXJseUJyYWNrZXQoKSB7Ci0JLy8ganVzdCBhbiBleHByZXNzaW9uIHdpdGggYW4gZXh0cmEgY3VybHkgYnJhY2tldAotCWV2YWx1YXRlV2l0aEV4cGVjdGVkUHJvYmxlbSgKLQkJIjEgKyAyfSIudG9DaGFyQXJyYXkoKSwgCi0JCW5ld1Byb2JsZW0oSVByb2JsZW0uVW5tYXRjaGVkQnJhY2tldCwgRXJyb3IsIDUsIDUsIDEpKTsgLy8gVW5tYXRjaGVkIGJyYWNrZXQKLQotCS8vIGEgc3RhdGVtZW50IGZvbGxvd2VkIGJ5IGFuIHVucmVhY2hhYmxlIGV4cHJlc3Npb24gd2l0aCBhbiBleHRyYSBjdXJseSBicmFja2V0Ci0JZXZhbHVhdGVXaXRoRXhwZWN0ZWRQcm9ibGVtKGJ1aWxkQ2hhckFycmF5KG5ldyBTdHJpbmdbXSB7Ci0JCSJyZXR1cm4gMSArIDE7IiwKLQkJIiAyICsgMn0ifSksIAotCQluZXdQcm9ibGVtKElQcm9ibGVtLlVubWF0Y2hlZEJyYWNrZXQsIEVycm9yLCAyMCwgMjAsIDIpKTsgLy8gVW5tYXRjaGVkIGJyYWNrZXQKLX0KLS8qKgotICogVGVzdCBleHRyYSBvcGVuIHJvdW5kIGJyYWNrZXQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RFeHRyYU9wZW5Sb3VuZEJyYWNrZXQoKSB7Ci0JZXZhbHVhdGVXaXRoRXhwZWN0ZWRQcm9ibGVtKAotCQkiZm9vKChhKTsiLnRvQ2hhckFycmF5KCksIAotCQluZXdQcm9ibGVtKElQcm9ibGVtLlVubWF0Y2hlZEJyYWNrZXQsIEVycm9yLCAzLCAzLCAxKSk7IC8vIFVubWF0Y2hlZCBicmFja2V0Ci19Ci0vKioKLSAqIFRlc3QgYSBjb2RlIHNuaXBwZXQgdGhhdCBjb250YWlucyBhbiBleHByZXNzaW9uIGZvbGxvd2VkIGJ5IGEgc2VtaS1jb2xvbi4KLSAqLwotcHVibGljIHZvaWQgdGVzdEV4dHJhU2VtaUNvbG9uSW5FeHByZXNzaW9uKCkgewotCWV2YWx1YXRlV2l0aEV4cGVjdGVkUHJvYmxlbSgKLQkJIjE7Ii50b0NoYXJBcnJheSgpLCAKLQkJbmV3UHJvYmxlbShJUHJvYmxlbS5QYXJzaW5nRXJyb3IsIEVycm9yLCAxLCAxLCAxKSk7IC8vIFN5bnRheCBlcnJvciBvbiB0b2tlbiBFT0YKLX0KLS8qKgotICogVGVzdCBhY2Nlc3MgdG8gYSBub24gZXhpc3RpbmcgZmllbGQuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMjUyNTAgU2NyYXBib29rIHNob3dzIHdyb25nIGVycm9yIG1lc3NhZ2UpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkRmllbGQoKSB7Ci0JZXZhbHVhdGVXaXRoRXhwZWN0ZWRQcm9ibGVtKAotCQkoIlN0cmluZyBzID0gXCJcIjtcbiIgKwotCQkicy5sZW5ndGgiKS50b0NoYXJBcnJheSgpLCAKLQkJInMubGVuZ3RoIGNhbm5vdCBiZSByZXNvbHZlZCBvciBpcyBub3QgYSBmaWVsZFxuIik7IAotfQotLyoqCi0gKiBUZXN0IGEgY29kZSBzbmlwcGV0IHdoaWNoIGlzIHZhbGlkIGJ1dCB0aGUgZXZhbHVhdGlvbiBjb250ZXh0IGltcG9ydHMgaGF2ZSBwcm9ibGVtcy4KLSAqLwotcHVibGljIHZvaWQgdGVzdEludmFsaWRJbXBvcnQoKSB7Ci0JdHJ5IHsKLQkJLy8gcHJvYmxlbSBvbiB0aGUgZmlyc3QgaW1wb3J0Ci0JCWNvbnRleHQuc2V0SW1wb3J0cyhuZXcgY2hhcltdW10geyJiYXIuWSIudG9DaGFyQXJyYXkoKX0pOwotCQlldmFsdWF0ZVdpdGhFeHBlY3RlZEltcG9ydFByb2JsZW0oYnVpbGRDaGFyQXJyYXkobmV3IFN0cmluZ1tdIHsKLQkJCSJjbGFzcyBYIHsiLAotCQkJIglZIGZvbyA9IG5ldyBZKCk7IiwKLQkJCSJ9IiwKLQkJCSJyZXR1cm4gbmV3IFgoKS5mb287In0pLAotCQkJImJhci5ZIi50b0NoYXJBcnJheSgpLAotCQkJbmV3UHJvYmxlbShJUHJvYmxlbS5JbXBvcnROb3RGb3VuZCwgRXJyb3IsIDAsIDQsIDEpKTsgLy8gVGhlIGltcG9ydCBiYXIuWSBjb3VsZCBub3QgYmUgcmVzb2x2ZWQKLQotCQkvLyBwcm9ibGVtIG9uIHRoZSBzZWNvbmQgaW1wb3J0Ci0JCWNvbnRleHQuc2V0SW1wb3J0cyhuZXcgY2hhcltdW10geyJqYXZhLmlvLioiLnRvQ2hhckFycmF5KCksICJ7Ii50b0NoYXJBcnJheSgpfSk7Ci0JCWV2YWx1YXRlV2l0aEV4cGVjdGVkSW1wb3J0UHJvYmxlbShidWlsZENoYXJBcnJheShuZXcgU3RyaW5nW10gewotCQkJIm5ldyBGaWxlKFwiYzpcXHRlbXBcIikifSksCi0JCQkieyIudG9DaGFyQXJyYXkoKSwKLQkJCW5ld1Byb2JsZW0oSVByb2JsZW0uUGFyc2luZ0Vycm9yLCBFcnJvciwgMCwgMCwgMSkpOyAvLyBTeW50YXggZXJyb3Igb24gdG9rZW4gInsiLCAiSWRlbnRpZmllciIgZXhwZWN0ZWQKLQl9IGZpbmFsbHkgewotCQkvLyBDbGVhbiB1cAotCQljb250ZXh0LnNldEltcG9ydHMobmV3IGNoYXJbMF1bXSk7Ci0JfQotfQotLyoqCi0gKiBUZXN0IHVzZSBvZiB0aGlzLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFVzZU9mVGhpc0luU25pcHBldCgpIHsKLQlldmFsdWF0ZVdpdGhFeHBlY3RlZFByb2JsZW0oCi0JCSJ0aGlzIi50b0NoYXJBcnJheSgpLCAKLQkJIkNhbm5vdCB1c2UgdGhpcyBpbiBhIHN0YXRpYyBjb250ZXh0IFxuIik7IAotfQotLyoqCi0gKiBUZXN0IHVzZSBvZiB0aGlzLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFVzZU9mVGhpc0luU25pcHBldDIoKSB7Ci0JLy8ganVzdCBhbiBleHByZXNzaW9uIHdpdGggYW4gZXh0cmEgY3VybHkgYnJhY2tldAotCWV2YWx1YXRlV2l0aEV4cGVjdGVkUHJvYmxlbSgKLQkJInJldHVybiB0aGlzOyIudG9DaGFyQXJyYXkoKSwgCi0JCSJDYW5ub3QgdXNlIHRoaXMgaW4gYSBzdGF0aWMgY29udGV4dCBcbiIpOyAKLX0KLS8qKgotICogVGVzdCBhIGNvZGUgc25pcHBldCB0aGF0IG1pc3NlcyBhIGNsb3Npbmcgcm91bmQgYnJhY2tldC4KLSAqLwotcHVibGljIHZvaWQgdGVzdE1pc3NpbmdDbG9zaW5nUm91bmRCcmFja2V0KCkgewotCWV2YWx1YXRlV2l0aEV4cGVjdGVkUHJvYmxlbShidWlsZENoYXJBcnJheShuZXcgU3RyaW5nW10gewotCQkiU3lzdGVtLm91dC5wcmludGxuKFwiMyArIDNcIjsifSksIAotCQluZXdQcm9ibGVtKElQcm9ibGVtLlVubWF0Y2hlZEJyYWNrZXQsIEVycm9yLCAxOCwgMTgsIDEpKTsgLy8gVW5tYXRjaGVkIGJyYWNrZXQKLX0KLS8qKgotICogVGVzdCBhIGNvZGUgc25pcHBldCB0aGF0IGNvbnRhaW5zIGEgc3RyaW5nIHRoYXQgbWlzc2VzIHRoZSBjbG9zaW5nIGRvdWJsZSBxdW90ZSAuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nRG91YmxlUXVvdGUoKSB7Ci0JZXZhbHVhdGVXaXRoRXhwZWN0ZWRQcm9ibGVtKGJ1aWxkQ2hhckFycmF5KG5ldyBTdHJpbmdbXSB7Ci0JCSJTeXN0ZW0ub3V0LnByaW50bG4oXCIzICsgMyA9ICk7IiwKLQkJIjMgKyAzIn0pLCAKLQkJbmV3UHJvYmxlbShJUHJvYmxlbS5VbnRlcm1pbmF0ZWRTdHJpbmcgLCBFcnJvciwgMTksIDMwLCAxKSk7IC8vIFN0cmluZyBsaXRlcmFsIGlzIG5vdCBwcm9wZXJseSBjbG9zZWQgYnkgYSBkb3VibGUtcXVvdGUKLX0KLS8qKgotICogVGVzdCBhbiBleHByZXNzaW9uIHdoaWNoIGlzIG5vdCB0aGUgbGFzdCBzdGF0ZW1lbnQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3ROb25MYXN0RXhwcmVzc2lvblN0YXRlbWVudCgpIHsKLQlldmFsdWF0ZVdpdGhFeHBlY3RlZFByb2JsZW0oYnVpbGRDaGFyQXJyYXkobmV3IFN0cmluZ1tdIHsKLQkJIjEgPT0gJzEnOyIsCi0JCSJ0cnVlIn0pLCAKLQkJbmV3UHJvYmxlbShJUHJvYmxlbS5QYXJzaW5nRXJyb3IsIEVycm9yLCA4LCA4LCAxKSk7IC8vIFN5bnRheCBlcnJvciBvbiB0b2tlbiAiOyIKLX0KLS8qKgotICogVGVzdCBhIHByb2JsZW0gaW4gdGhlIHJldHVybmVkIGV4cHJlc3Npb24uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RQcm9ibGVtSW5FeHByZXNzaW9uKCkgewotCWV2YWx1YXRlV2l0aEV4cGVjdGVkUHJvYmxlbSgKLQkJIm5ldyBPYmplY3QoKTsgMyArICIudG9DaGFyQXJyYXkoKSwgCi0JCW5ld1Byb2JsZW0oSVByb2JsZW0uUGFyc2luZ0Vycm9yLCBFcnJvciwgMTcsIDE3LCAxKSk7IC8vIFN5bnRheCBlcnJvciBvbiB0b2tlbiBFT0YKLX0KLS8qKgotICogVGVzdCBhIHByb2JsZW0gaW4gdGhlIHJldHVybmVkIGV4cHJlc3Npb24uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RQcm9ibGVtSW5FeHByZXNzaW9uMigpIHsKLQlldmFsdWF0ZVdpdGhFeHBlY3RlZFByb2JsZW0oCi0JCSJuZXcgVW5rbm93bkNsYXNzKCkiLnRvQ2hhckFycmF5KCksIAotCQluZXdQcm9ibGVtKElQcm9ibGVtLlVuZGVmaW5lZFR5cGUsIEVycm9yLCA0LCAxNSwgMSkpOyAvLyBVbmtub3duQ2xhc3MgY2Fubm90IGJlIHJlc29sdmVkIG9yIGlzIG5vdCBhIHR5cGUKLX0KLS8qKgotICogVGVzdCBhIGNvZGUgc25pcHBldCB3aGljaCBkZWNsYXJlcyBhIGNsYXNzIHRoYXQgaGFzIGEgcHJvYmxlbS4KLSAqLwotcHVibGljIHZvaWQgdGVzdFByb2JsZW1JbklubmVyQ2xhc3MoKSB7Ci0JLy8gY2xhc3MgZGVjbGFyZWQgYmVmb3JlIHRoZSBsYXN0IGV4cHJlc3Npb24KLQlldmFsdWF0ZVdpdGhFeHBlY3RlZFByb2JsZW0oYnVpbGRDaGFyQXJyYXkobmV3IFN0cmluZ1tdIHsKLQkJImNsYXNzIFggeyIsCi0JCSIJWSBmb28gPSBuZXcgWSgpOyIsCi0JCSJ9IiwKLQkJInJldHVybiBuZXcgWCgpLmZvbzsifSksIAotCQluZXdQcm9ibGVtKElQcm9ibGVtLkZpZWxkVHlwZU5vdEZvdW5kLCBFcnJvciwgMTEsIDExLCAyKSk7IC8vIFRoZSB0eXBlIFkgaXMgdW5kZWZpbmVkIGZvciB0aGUgZmllbGQgWC5mb28KLQotCS8vIGNsYXNzIGRlY2xhcmVkIGFzIHBhcnQgb2YgdGhlIGxhc3QgZXhwcmVzc2lvbgotCWV2YWx1YXRlV2l0aEV4cGVjdGVkV2FybmluZ0FuZERpc3BsYXlTdHJpbmcoYnVpbGRDaGFyQXJyYXkobmV3IFN0cmluZ1tdIHsKLQkJInJldHVybiBuZXcgT2JqZWN0KCkgeyIsCi0JCSIJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsiLAotCQkiCQlpbnQgaSA9IDA7IiwKLQkJIgkJcmV0dXJuIFwiYW4gaW5uZXIgY2xhc3NcIjsiLAotCQkiCX0iLAotCQkifTsifSksIAotCQluZXdQcm9ibGVtKElQcm9ibGVtLkxvY2FsVmFyaWFibGVJc05ldmVyVXNlZCwgV2FybmluZywgNTYsIDU2LCAzKSwgLy8gVGhlIGxvY2FsIHZhcmlhYmxlIGkgaXMgbmV2ZXIgdXNlZAotCQkiYW4gaW5uZXIgY2xhc3MiLnRvQ2hhckFycmF5KCkpOyAKLX0KLS8qKgotICogVGVzdCBhIHByb2JsZW0gaW4gdGhlIHN0YXRlbWVudCBiZWZvcmUgdGhlIHJldHVybmVkIGV4cHJlc3Npb24uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RQcm9ibGVtSW5QcmV2aW91c1N0YXRlbWVudCgpIHsKLQlldmFsdWF0ZVdpdGhFeHBlY3RlZFByb2JsZW0oYnVpbGRDaGFyQXJyYXkobmV3IFN0cmluZ1tdIHsKLQkJInJldHVybiBmb28oYSBhKTsiLAotCQkiMSArIDMifSksIAotCQluZXdQcm9ibGVtKElQcm9ibGVtLlBhcnNpbmdFcnJvciwgRXJyb3IsIDEzLCAxMywgMSkpOyAvLyAgU3ludGF4IGVycm9yIG9uIHRva2VuICJhIgotfQotLyoqCi0gKiBUZXN0IGEgY29kZSBzbmlwcGV0IHRoYXQgaGFzIGEgcHJvYmxlbSBpbiBhIHJldHVybiBzdGF0ZW1lbnQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RQcm9ibGVtSW5SZXR1cm5TdGF0ZW1lbnQoKSB7Ci0JZXZhbHVhdGVXaXRoRXhwZWN0ZWRQcm9ibGVtKAotCQkicmV0dXJuIDEgKysgMTsiLnRvQ2hhckFycmF5KCksIAotCQluZXdQcm9ibGVtKElQcm9ibGVtLkludmFsaWRVbmFyeUV4cHJlc3Npb24sIEVycm9yLCA3LCA3LCAxKSk7IC8vIEludmFsaWQgYXJndW1lbnQgdG8gb3BlcmF0aW9uICsrLy0tCi19Ci0vKioKLSAqIFRlc3QgYSBzY2VuYXJpbyB3aGVyZSB0aGUgcmVtb3ZhbCBvZiBhbiBpbXBvcnQgY2F1c2VzIGEgcHJvYmxlbSBpbiBhIGNvZGUgc25pcHBldC4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJlbW92ZUltcG9ydCgpIHsKLQl0cnkgewotCQkvLyBkZWZpbmUgdGhlIGltcG9ydAotCQl0aGlzLmNvbnRleHQuc2V0SW1wb3J0cyhuZXcgY2hhcltdW10geyJqYXZhLmlvLioiLnRvQ2hhckFycmF5KCl9KTsKLQkJCi0JCS8vIGV2YWx1YXRlIGEgY29kZSBzbmlwcGV0IHRoYXQgdXNlcyB0aGlzIHZhcmlhYmxlCi0JCWNoYXJbXSBjb2RlU25pcHBldCA9ICJuZXcgRmlsZShcImM6XFxcXHRlbXBcIikiLnRvQ2hhckFycmF5KCk7Ci0JCWV2YWx1YXRlV2l0aEV4cGVjdGVkRGlzcGxheVN0cmluZygKLQkJCWNvZGVTbmlwcGV0LAotCQkJImM6XFx0ZW1wIi50b0NoYXJBcnJheSgpKTsgCi0KLQkJLy8gcmVtb3ZlIHRoZSBpbXBvcnQKLQkJdGhpcy5jb250ZXh0LnNldEltcG9ydHMobmV3IGNoYXJbMF1bXSk7Ci0KLQkJLy8gZXZhbHVhdGUgc2FtZSBjb2RlIHNuaXBwZXQKLQkJZXZhbHVhdGVXaXRoRXhwZWN0ZWRQcm9ibGVtKAotCQkJY29kZVNuaXBwZXQsCi0JCQluZXdQcm9ibGVtKElQcm9ibGVtLlVuZGVmaW5lZFR5cGUsIEVycm9yLCA0LCA3LCAxKSk7IC8vIFRoZSB0eXBlIEZpbGUgaXMgdW5kZWZpbmVkCi0JfSBmaW5hbGx5IHsKLQkJLy8gQ2xlYW4gdXAKLQkJdGhpcy5jb250ZXh0LnNldEltcG9ydHMobmV3IGNoYXJbMF1bXSk7Ci0JfQotfQotLyoqCi0gKiBUZXN0IGEgc2NlbmFyaW8gd2hlcmUgdGhlIHJlbW92YWwgb2YgYSB2YXJpYWJsZSBjYXVzZXMgYSBwcm9ibGVtIGluIGEgY29kZSBzbmlwcGV0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVmFyaWFibGUoKSB7Ci0JR2xvYmFsVmFyaWFibGUgdmFyID0gbnVsbDsKLQl0cnkgewotCQkvLyBkZWZpbmUgdGhlIHZhcmlhYmxlCi0JCXZhciA9IHRoaXMuY29udGV4dC5uZXdWYXJpYWJsZSgiaW50Ii50b0NoYXJBcnJheSgpLCAiaSIudG9DaGFyQXJyYXkoKSwgIjEiLnRvQ2hhckFycmF5KCkpOwotCQlpbnN0YWxsVmFyaWFibGVzKDEpOwotCQkKLQkJLy8gZXZhbHVhdGUgYSBjb2RlIHNuaXBwZXQgdGhhdCB1c2VzIHRoaXMgdmFyaWFibGUKLQkJY2hhcltdIGNvZGVTbmlwcGV0ID0gImkiLnRvQ2hhckFycmF5KCk7Ci0JCWV2YWx1YXRlV2l0aEV4cGVjdGVkRGlzcGxheVN0cmluZygKLQkJCWNvZGVTbmlwcGV0LAotCQkJIjEiLnRvQ2hhckFycmF5KCkpOyAKLQotCQkvLyByZW1vdmUgdGhlIHZhcmlhYmxlCi0JCXRoaXMuY29udGV4dC5kZWxldGVWYXJpYWJsZSh2YXIpOwotCQlpbnN0YWxsVmFyaWFibGVzKDApOwotCi0JCS8vIGV2YWx1YXRlIHNhbWUgY29kZSBzbmlwcGV0Ci0JCWV2YWx1YXRlV2l0aEV4cGVjdGVkUHJvYmxlbSgKLQkJCWNvZGVTbmlwcGV0LAotCQkJbmV3UHJvYmxlbShJUHJvYmxlbS5VbmRlZmluZWROYW1lLCBFcnJvciwgMCwgMCwgMSkpOyAvLyBpIGNhbm5vdCBiZSByZXNvbHZlZAotCX0gZmluYWxseSB7Ci0JCS8vIENsZWFuIHVwCi0JCWlmICh2YXIgIT0gbnVsbCkgewotCQkJdGhpcy5jb250ZXh0LmRlbGV0ZVZhcmlhYmxlKHZhcik7Ci0JCX0KLQl9Ci19Ci0vKioKLSAqIFRlc3QgYSBjb2RlIHNuaXBwZXQgdGhhdCBjb250YWlucyBhbiBleHByZXNzaW9uIHdoaWNoIGlzIG5vdCByZWFjaGFibGUuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RVbnJlYWNoYWJsZUV4cHJlc3Npb24oKSB7Ci0JZXZhbHVhdGVXaXRoRXhwZWN0ZWRQcm9ibGVtKGJ1aWxkQ2hhckFycmF5KG5ldyBTdHJpbmdbXSB7Ci0JCSJyZXR1cm4gMSArIDE7IiwKLQkJIjIgKyAyIn0pLCAKLQkJbmV3UHJvYmxlbShJUHJvYmxlbS5Db2RlQ2Fubm90QmVSZWFjaGVkLCBFcnJvciwgMTQsIDE4LCAyKSk7IC8vIFVucmVhY2hhYmxlIGNvZGUKLX0KLS8qKgotICogVGVzdCBhIGNvZGUgc25pcHBldCB3aGljaCBpcyB2YWxpZCBidXQgbmV2ZXIgdXNlcyB0aGUgZXZhbHVhdGlvbiBjb250ZXh0IGltcG9ydHMuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMTg5MjIgU2NyYXBib29rIGRvZXMgbm90IGNvbWUgYmFjayB3aGVuIGVycm9ycyBpbiBzbmlwcGV0KQotICovCi1wdWJsaWMgdm9pZCB0ZXN0VW51c2VkSW1wb3J0KCkgewotCXRyeSB7Ci0JCWNvbnRleHQuc2V0SW1wb3J0cyhuZXcgY2hhcltdW10geyJqYXZhLnV0aWwuKiIudG9DaGFyQXJyYXkoKX0pOwotCQkKLQkJLy8gZXZhbHVhdGUgd2l0aCBpbXBvcnQgYXMgZXJyb3IKLQkJTWFwIG9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbnMoKTsKLQkJb3B0aW9ucy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9SZXBvcnRVbnVzZWRJbXBvcnQsIENvbXBpbGVyT3B0aW9ucy5FUlJPUik7Ci0JCQotCQkvLyBmb3JjZSBldmFsdWF0aW9uIHNvIHRoYXQgdGhlIGZvbGxvd2luZyBldmFsdWF0aW9uIHdpbGwgdXNlIGEgQ29kZVNuaXBwZXRFdmFsdWF0b3IgaW5zdGVhZAotCQkvLyBvZiBhIFZhcmlhYmxlRXZ1YWxhdG9yCi0JCWV2YWx1YXRlV2l0aEV4cGVjdGVkVmFsdWUoIjEiLnRvQ2hhckFycmF5KCksICIxIi50b0NoYXJBcnJheSgpLCAiaW50Ii50b0NoYXJBcnJheSgpKTsKLQkJCi0JCWV2YWx1YXRlV2l0aEV4cGVjdGVkSW1wb3J0UHJvYmxlbSgKLQkJCSJuZXcgU3RyaW5nKFwiTk9QRVwiKSIudG9DaGFyQXJyYXkoKSwKLQkJCSJqYXZhLnV0aWwuKiIudG9DaGFyQXJyYXkoKSwKLQkJCW9wdGlvbnMsCi0JCQluZXdQcm9ibGVtKElQcm9ibGVtLlVudXNlZEltcG9ydCwgRXJyb3IsIDAsIDEwLCAxKSk7IC8vIFRoZSBpbXBvcnQgamF2YS51dGlsLiogaXMgdW51c2VkCi0JfSBmaW5hbGx5IHsKLQkJLy8gQ2xlYW4gdXAKLQkJY29udGV4dC5zZXRJbXBvcnRzKG5ldyBjaGFyWzBdW10pOwotCX0KLX0KLS8qKgotICogVGVzdCBhIGNvZGUgc25pcHBldCB0aGF0IGhhcyB3YXJuaW5ncyBidXQgbm8gZXJyb3JzLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0V2FybmluZygpIHsKLQlldmFsdWF0ZVdpdGhFeHBlY3RlZFdhcm5pbmdBbmREaXNwbGF5U3RyaW5nKGJ1aWxkQ2hhckFycmF5KG5ldyBTdHJpbmdbXSB7Ci0JCSJpbnQgaTsiLAotCQkiMSArIDEifSksIAotCQluZXdQcm9ibGVtKElQcm9ibGVtLkxvY2FsVmFyaWFibGVJc05ldmVyVXNlZCwgV2FybmluZywgNCwgNCwgMSksIC8vIFRoZSBsb2NhbCB2YXJpYWJsZSBpIGlzIG5ldmVyIHVzZWQKLQkJIjIiLnRvQ2hhckFycmF5KCkpOwotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2V2YWwvTmVnYXRpdmVWYXJpYWJsZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ldmFsL05lZ2F0aXZlVmFyaWFibGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MTI5MTIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2V2YWwvTmVnYXRpdmVWYXJpYWJsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmV2YWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5sb29rdXAuUHJvYmxlbVJlYXNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnByb2JsZW0uUHJvYmxlbVNldmVyaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWwuR2xvYmFsVmFyaWFibGU7Ci0vKioKLSAqIE5lZ2F0aXZlIHRlc3RzIGZvciB2YXJpYWJsZXMuIE9ubHkgY29tcGlsYXRpb24gcHJvYmxlbXMgc2hvdWxkIGJlIHJlcG9ydGVkIGluCi0gKiB0aGVzZSB0ZXN0cy4KLSAqLwotcHVibGljIGNsYXNzIE5lZ2F0aXZlVmFyaWFibGVUZXN0IGV4dGVuZHMgRXZhbHVhdGlvblRlc3QgaW1wbGVtZW50cyBQcm9ibGVtU2V2ZXJpdGllcywgUHJvYmxlbVJlYXNvbnMgewotLyoqCi0gKiBDcmVhdGVzIGEgbmV3IE5lZ2F0aXZlVmFyaWFibGVUZXN0LgotICovCi1wdWJsaWMgTmVnYXRpdmVWYXJpYWJsZVRlc3QoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlyZXR1cm4gc2V0dXBTdWl0ZSh0ZXN0Q2xhc3MoKSk7Ci19Ci1wdWJsaWMgc3RhdGljIENsYXNzIHRlc3RDbGFzcygpIHsKLQlyZXR1cm4gTmVnYXRpdmVWYXJpYWJsZVRlc3QuY2xhc3M7Ci19Ci0vKioKLSAqIFRlc3QgYSB2YXJpYWJsZSB0aGF0IGhhcyBhIHByb2JsZW0gaW4gaXRzIGluaXRpYWxpemVyLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbGl6ZXJQcm9ibGVtKCkgewotCS8vIFByb2JsZW0gaW4gZmlyc3QgdmFyaWFibGUKLQlHbG9iYWxWYXJpYWJsZSB2YXIgPSBudWxsOwotCXRyeSB7Ci0JCXZhciA9IGNvbnRleHQubmV3VmFyaWFibGUoImludCIudG9DaGFyQXJyYXkoKSwgImkiLnRvQ2hhckFycmF5KCksIGJ1aWxkQ2hhckFycmF5KG5ldyBTdHJpbmdbXSB7Ci0JCQkiKDEgKyAxKSAqIiwKLQkJCSIoaiArIDIpIn0pKTsKLQkJZXZhbHVhdGVXaXRoRXhwZWN0ZWRQcm9ibGVtKAotCQkJdmFyLCAKLQkJCW5ld1Byb2JsZW0oSVByb2JsZW0uVW5kZWZpbmVkTmFtZSwgRXJyb3IsIDExLCAxMSwgMikpOyAvLyBqIGNhbm5vdCBiZSByZXNvbHZlZAotCX0gZmluYWxseSB7Ci0JCWlmICh2YXIgIT0gbnVsbCkgewotCQkJY29udGV4dC5kZWxldGVWYXJpYWJsZSh2YXIpOwotCQl9Ci0JfQotCi0JLy8gUHJvYmxlbSBpbiBzZWNvbmQgdmFyaWFibGUKLQlHbG9iYWxWYXJpYWJsZSB2YXIxID0gbnVsbDsKLQlHbG9iYWxWYXJpYWJsZSB2YXIyID0gbnVsbDsKLQl0cnkgewotCQl2YXIxID0gY29udGV4dC5uZXdWYXJpYWJsZSgiT2JqZWN0Ii50b0NoYXJBcnJheSgpLCAibyIudG9DaGFyQXJyYXkoKSwgIm5ldyBPYmplY3QoKSIudG9DaGFyQXJyYXkoKSk7Ci0JCXZhcjIgPSBjb250ZXh0Lm5ld1ZhcmlhYmxlKCJpbnQiLnRvQ2hhckFycmF5KCksICJpIi50b0NoYXJBcnJheSgpLCBidWlsZENoYXJBcnJheShuZXcgU3RyaW5nW10gewotCQkJIigxICsgMSkgKiIsCi0JCQkiKDEgKysgMikifSkpOwotCQlldmFsdWF0ZVdpdGhFeHBlY3RlZFByb2JsZW0oCi0JCQl2YXIyLCAKLQkJCW5ld1Byb2JsZW0oSVByb2JsZW0uSW52YWxpZFVuYXJ5RXhwcmVzc2lvbiwgRXJyb3IsIDExLCAxMSwgMikpOyAvLyBJbnZhbGlkIGFyZ3VtZW50IHRvIG9wZXJhdGlvbiArKy8tLQotCX0gZmluYWxseSB7Ci0JCWlmICh2YXIxICE9IG51bGwpIHsKLQkJCWNvbnRleHQuZGVsZXRlVmFyaWFibGUodmFyMSk7Ci0JCX0KLQkJaWYgKHZhcjIgIT0gbnVsbCkgewotCQkJY29udGV4dC5kZWxldGVWYXJpYWJsZSh2YXIyKTsKLQkJfQotCX0KLQkKLX0KLS8qKgotICogVGVzdCBhIHZhcmlhYmxlIHRoYXQgaGFzIGEgcHJvYmxlbSBpbiBpdHMgbmFtZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdEludmFsaWROYW1lKCkgewotCS8vIFByb2JsZW0gaW4gZmlyc3QgdmFyaWFibGUKLQlHbG9iYWxWYXJpYWJsZSB2YXIgPSBudWxsOwotCXRyeSB7Ci0JCXZhciA9IGNvbnRleHQubmV3VmFyaWFibGUoImludCIudG9DaGFyQXJyYXkoKSwgIiFAIyQlXiYqKClfIi50b0NoYXJBcnJheSgpLCAiMSIudG9DaGFyQXJyYXkoKSk7Ci0JCWV2YWx1YXRlV2l0aEV4cGVjdGVkUHJvYmxlbSgKLQkJCXZhciwgCi0JCQluZXdQcm9ibGVtKElQcm9ibGVtLlBhcnNpbmdFcnJvciwgRXJyb3IsIDAsIDAsIDApKTsgLy8gU3ludGF4IGVycm9yIG9uIHRva2VuICIhIiwgIklkZW50aWZpZXIiIGV4cGVjdGVkCi0JfSBmaW5hbGx5IHsKLQkJaWYgKHZhciAhPSBudWxsKSB7Ci0JCQljb250ZXh0LmRlbGV0ZVZhcmlhYmxlKHZhcik7Ci0JCX0KLQl9Ci0KLQkvLyBQcm9ibGVtIGluIHNlY29uZCB2YXJpYWJsZQotCUdsb2JhbFZhcmlhYmxlIHZhcjEgPSBudWxsOwotCUdsb2JhbFZhcmlhYmxlIHZhcjIgPSBudWxsOwotCXRyeSB7Ci0JCXZhcjEgPSBjb250ZXh0Lm5ld1ZhcmlhYmxlKCJTdHJpbmciLnRvQ2hhckFycmF5KCksICJmb28iLnRvQ2hhckFycmF5KCksICJcImJhclwiIi50b0NoYXJBcnJheSgpKTsKLQkJdmFyMiA9IGNvbnRleHQubmV3VmFyaWFibGUoImludCIudG9DaGFyQXJyYXkoKSwgIiFAIyQlXiYqKClfIi50b0NoYXJBcnJheSgpLCAiMSIudG9DaGFyQXJyYXkoKSk7Ci0JCWV2YWx1YXRlV2l0aEV4cGVjdGVkUHJvYmxlbSgKLQkJCXZhcjIsIAotCQkJbmV3UHJvYmxlbShJUHJvYmxlbS5QYXJzaW5nRXJyb3IsIEVycm9yLCAwLCAwLCAwKSk7IC8vIFN5bnRheCBlcnJvciBvbiB0b2tlbiAiISIsICJJZGVudGlmaWVyIiBleHBlY3RlZAotCX0gZmluYWxseSB7Ci0JCWlmICh2YXIxICE9IG51bGwpIHsKLQkJCWNvbnRleHQuZGVsZXRlVmFyaWFibGUodmFyMSk7Ci0JCX0KLQkJaWYgKHZhcjIgIT0gbnVsbCkgewotCQkJY29udGV4dC5kZWxldGVWYXJpYWJsZSh2YXIyKTsKLQkJfQotCX0KLX0KLS8qKgotICogVGVzdCBhIHZhcmlhYmxlIHRoYXQgaGFzIGEgcHJvYmxlbSBpbiBpdHMgdHlwZSBkZWNsYXJhdGlvbi4KLSAqLwotcHVibGljIHZvaWQgdGVzdFVua25vd25UeXBlKCkgewotCS8vIFByb2JsZW0gaW4gZmlyc3QgdmFyaWFibGUKLQlHbG9iYWxWYXJpYWJsZSB2YXIgPSBudWxsOwotCXRyeSB7Ci0JCXZhciA9IGNvbnRleHQubmV3VmFyaWFibGUoImZvby5CYXIiLnRvQ2hhckFycmF5KCksICJ2YXIiLnRvQ2hhckFycmF5KCksIG51bGwpOwotCQlldmFsdWF0ZVdpdGhFeHBlY3RlZFByb2JsZW0oCi0JCQl2YXIsIAotCQkJbmV3UHJvYmxlbShJUHJvYmxlbS5GaWVsZFR5cGVOb3RGb3VuZCwgRXJyb3IsIDAsIDYsIC0xKSk7IC8vIFRoZSB0eXBlIGZvbyBpcyB1bmRlZmluZWQgZm9yIHRoZSBmaWVsZCBHbG9iYWxWYXJpYWJsZXNfMS52YXIKLQl9IGZpbmFsbHkgewotCQlpZiAodmFyICE9IG51bGwpIHsKLQkJCWNvbnRleHQuZGVsZXRlVmFyaWFibGUodmFyKTsKLQkJfQotCX0KLQotCS8vIFByb2JsZW0gaW4gc2Vjb25kIHZhcmlhYmxlCi0JR2xvYmFsVmFyaWFibGUgdmFyMSA9IG51bGw7Ci0JR2xvYmFsVmFyaWFibGUgdmFyMiA9IG51bGw7Ci0JdHJ5IHsKLQkJdmFyMSA9IGNvbnRleHQubmV3VmFyaWFibGUoImludCIudG9DaGFyQXJyYXkoKSwgIngiLnRvQ2hhckFycmF5KCksIG51bGwpOwotCQl2YXIyID0gY29udGV4dC5uZXdWYXJpYWJsZSgiZm9vLkJhciIudG9DaGFyQXJyYXkoKSwgInZhciIudG9DaGFyQXJyYXkoKSwgbnVsbCk7Ci0JCWV2YWx1YXRlV2l0aEV4cGVjdGVkUHJvYmxlbSgKLQkJCXZhcjIsIAotCQkJbmV3UHJvYmxlbShJUHJvYmxlbS5GaWVsZFR5cGVOb3RGb3VuZCwgRXJyb3IsIDAsIDYsIC0xKSk7IC8vIFRoZSB0eXBlIGZvbyBpcyB1bmRlZmluZWQgZm9yIHRoZSBmaWVsZCBHbG9iYWxWYXJpYWJsZXNfMS52YXIKLQl9IGZpbmFsbHkgewotCQlpZiAodmFyMSAhPSBudWxsKSB7Ci0JCQljb250ZXh0LmRlbGV0ZVZhcmlhYmxlKHZhcjEpOwotCQl9Ci0JCWlmICh2YXIyICE9IG51bGwpIHsKLQkJCWNvbnRleHQuZGVsZXRlVmFyaWFibGUodmFyMik7Ci0JCX0KLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZXZhbC9TYW5pdHlUZXN0RXZhbHVhdGlvbkNvbnRleHQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ldmFsL1Nhbml0eVRlc3RFdmFsdWF0aW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDUwZTAwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ldmFsL1Nhbml0eVRlc3RFdmFsdWF0aW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuZXZhbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWwuRXZhbHVhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbC5HbG9iYWxWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbC5JUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsLkluc3RhbGxFeGNlcHRpb247Ci0vKioKLSAqIFNhbml0eSB0ZXN0IHRoZSBJRXZhbHVhdGlvbkNvbnRleHQgaW50ZXJmYWNlLgotICogRm9yIGluIGRlcHRoIHRlc3RzLCBzZWUgVmFyaWFibGVUZXN0IG9yIENvZGVTbmlwcGV0VGVzdC4KLSAqLwotcHVibGljIGNsYXNzIFNhbml0eVRlc3RFdmFsdWF0aW9uQ29udGV4dCBleHRlbmRzIEV2YWx1YXRpb25UZXN0IHsKLS8qKgotICogQ3JlYXRlcyBhIG5ldyBTYW5pdHlFdmFsdWF0aW9uQ29udGV4dFRlc3QuCi0gKi8KLXB1YmxpYyBTYW5pdHlUZXN0RXZhbHVhdGlvbkNvbnRleHQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlyZXR1cm4gc2V0dXBTdWl0ZSh0ZXN0Q2xhc3MoKSk7Ci19Ci0vKioKLSAqIFNhbml0eSB0ZXN0IG9mIElFdmFsdWF0aW9uQ29udGV4dC5hbGxWYXJpYWJsZXMoKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0QWxsVmFyaWFibGVzKCkgewotCS8vIE5vIHZhcmlhYmxlcyBkZWZpbmVkIHlldAotCUdsb2JhbFZhcmlhYmxlW10gdmFycyA9IGNvbnRleHQuYWxsVmFyaWFibGVzKCk7Ci0JYXNzZXJ0RXF1YWxzKCJObyB2YXJpYWJsZXMgc2hvdWxkIGJlIGRlZmluZWQiLCAwLCB2YXJzLmxlbmd0aCk7Ci0KLQkvLyBEZWZpbmUgMyB2YXJpYWJsZXMKLQljb250ZXh0Lm5ld1ZhcmlhYmxlKCJpbnQiLnRvQ2hhckFycmF5KCksICJmb28iLnRvQ2hhckFycmF5KCksICIxIi50b0NoYXJBcnJheSgpKTsKLQljb250ZXh0Lm5ld1ZhcmlhYmxlKCJPYmplY3QiLnRvQ2hhckFycmF5KCksICJiYXIiLnRvQ2hhckFycmF5KCksIG51bGwpOwotCWNvbnRleHQubmV3VmFyaWFibGUoIlN0cmluZyIudG9DaGFyQXJyYXkoKSwgInppcCIudG9DaGFyQXJyYXkoKSwgIlwiYWJjZGVmZ1wiIi50b0NoYXJBcnJheSgpKTsKLQl2YXJzID0gY29udGV4dC5hbGxWYXJpYWJsZXMoKTsKLQlhc3NlcnRFcXVhbHMoIjMgdmFyaWFibGVzIHNob3VsZCBiZSBkZWZpbmVkIiwgMywgdmFycy5sZW5ndGgpOwotCWFzc2VydEVxdWFscygiMXN0IHZhcmlhYmxlIiwgImZvbyIudG9DaGFyQXJyYXkoKSwgdmFyc1swXS5nZXROYW1lKCkpOwotCWFzc2VydEVxdWFscygiMm5kIHZhcmlhYmxlIiwgImJhciIudG9DaGFyQXJyYXkoKSwgdmFyc1sxXS5nZXROYW1lKCkpOwotCWFzc2VydEVxdWFscygiM3JkIHZhcmlhYmxlIiwgInppcCIudG9DaGFyQXJyYXkoKSwgdmFyc1syXS5nZXROYW1lKCkpOwotCi0JLy8gUmVtb3ZlIDJuZCB2YXJpYWJsZQotCWNvbnRleHQuZGVsZXRlVmFyaWFibGUodmFyc1sxXSk7Ci0JdmFycyA9IGNvbnRleHQuYWxsVmFyaWFibGVzKCk7Ci0JYXNzZXJ0RXF1YWxzKCIyIHZhcmlhYmxlcyBzaG91bGQgYmUgZGVmaW5lZCIsIDIsIHZhcnMubGVuZ3RoKTsKLQlhc3NlcnRFcXVhbHMoIjFzdCB2YXJpYWJsZSIsICJmb28iLnRvQ2hhckFycmF5KCksIHZhcnNbMF0uZ2V0TmFtZSgpKTsKLQlhc3NlcnRFcXVhbHMoIjJuZCB2YXJpYWJsZSIsICJ6aXAiLnRvQ2hhckFycmF5KCksIHZhcnNbMV0uZ2V0TmFtZSgpKTsKLQotCS8vIFJlbW92ZSBsYXN0IHZhcmlhYmxlCi0JY29udGV4dC5kZWxldGVWYXJpYWJsZSh2YXJzWzFdKTsKLQl2YXJzID0gY29udGV4dC5hbGxWYXJpYWJsZXMoKTsKLQlhc3NlcnRFcXVhbHMoIjEgdmFyaWFibGUgc2hvdWxkIGJlIGRlZmluZWQiLCAxLCB2YXJzLmxlbmd0aCk7Ci0JYXNzZXJ0RXF1YWxzKCIxc3QgdmFyaWFibGUiLCAiZm9vIi50b0NoYXJBcnJheSgpLCB2YXJzWzBdLmdldE5hbWUoKSk7Ci0KLQkvLyBSZW1vdmUgMXN0IHZhcmlhYmxlCi0JY29udGV4dC5kZWxldGVWYXJpYWJsZSh2YXJzWzBdKTsKLQl2YXJzID0gY29udGV4dC5hbGxWYXJpYWJsZXMoKTsKLQlhc3NlcnRFcXVhbHMoIk5vIHZhcmlhYmxlcyBzaG91bGQgYmUgZGVmaW5lZCIsIDAsIHZhcnMubGVuZ3RoKTsKLX0KLXB1YmxpYyBzdGF0aWMgQ2xhc3MgdGVzdENsYXNzKCkgewotCXJldHVybiBTYW5pdHlUZXN0RXZhbHVhdGlvbkNvbnRleHQuY2xhc3M7Ci19Ci0vKioKLSAqIFNhbml0eSB0ZXN0IG9mIElFdmFsdWF0aW9uQ29udGV4dC5ldmFsdWF0ZShjaGFyW10sIElOYW1lRW52aXJvbm1lbnQsIENvbmZpZ3VyYWJsZU9wdGlvbltdLCBJUmVxdWVzdG9yICwgSVByb2JsZW1GYWN0b3J5KQotICovCi1wdWJsaWMgdm9pZCB0ZXN0RXZhbHVhdGUoKSB7Ci0JUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBSZXF1ZXN0b3IoKTsKLQljaGFyW10gc25pcHBldCA9ICJyZXR1cm4gMTsiLnRvQ2hhckFycmF5KCk7Ci0JdHJ5IHsKLQkJY29udGV4dC5ldmFsdWF0ZShzbmlwcGV0LCBnZXRFbnYoKSwgZ2V0T3B0aW9ucygpLCByZXF1ZXN0b3IsIGdldFByb2JsZW1GYWN0b3J5KCkpOwotCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgewotCQlhc3NlcnRUcnVlKCJObyB0YXJnZXRFeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0JfQotCWFzc2VydFRydWUoIkdvdCBvbmUgcmVzdWx0IiwgcmVxdWVzdG9yLnJlc3VsdEluZGV4ID09IDApOwotCUV2YWx1YXRpb25SZXN1bHQgcmVzdWx0ID0gcmVxdWVzdG9yLnJlc3VsdHNbMF07Ci0JYXNzZXJ0VHJ1ZSgiTm8gcHJvYmxlbXMgd2l0aCB0aGUgY29kZSBzbmlwcGV0IiwgIXJlc3VsdC5oYXNQcm9ibGVtcygpKTsKLQlhc3NlcnRUcnVlKCJSZXN1bHQgaGFzIGEgdmFsdWUiLCByZXN1bHQuaGFzVmFsdWUoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJWYWx1ZSIsICIxIi50b0NoYXJBcnJheSgpLCByZXN1bHQuZ2V0VmFsdWVEaXNwbGF5U3RyaW5nKCkpOwotCWFzc2VydEVxdWFscygiVHlwZSIsICJpbnQiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZVR5cGVOYW1lKCkpOwotfQotLyoqCi0gKiBTYW5pdHkgdGVzdCBvZiBJRXZhbHVhdGlvbkNvbnRleHQuZXZhbHVhdGVJbXBvcnRzKElOYW1lRW52aXJvbm1lbnQsIElSZXF1ZXN0b3IgLCBJUHJvYmxlbUZhY3RvcnkpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RFdmFsdWF0ZUltcG9ydHMoKSB7Ci0JdHJ5IHsKLQkJLy8gRGVmaW5lIGltcG9ydHMKLQkJY29udGV4dC5zZXRJbXBvcnRzKG5ldyBjaGFyW11bXSB7ImphdmEudXRpbC4qIi50b0NoYXJBcnJheSgpLCAiamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIi50b0NoYXJBcnJheSgpfSk7Ci0KLQkJLy8gRXZhbHVhdGUgdGhlbQotCQlJUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBSZXF1ZXN0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY2NlcHRSZXN1bHQoRXZhbHVhdGlvblJlc3VsdCByZXN1bHQpIHsKLQkJCQlhc3NlcnRUcnVlKCJObyBwcm9ibGVtcyB3aXRoIHRoZSBpbXBvcnRzIiwgIXJlc3VsdC5oYXNQcm9ibGVtcygpKTsKLQkJCX0KLQkJfTsKLQkJY29udGV4dC5ldmFsdWF0ZUltcG9ydHMoZ2V0RW52KCksIHJlcXVlc3RvciwgZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJLy8gQ2xlYW4gdXAKLQkJY29udGV4dC5zZXRJbXBvcnRzKG5ldyBjaGFyWzBdW10pOwotCX0KLX0KLS8qKgotICogU2FuaXR5IHRlc3Qgb2YgSUV2YWx1YXRpb25Db250ZXh0LmV2YWx1YXRlVmFyaWFibGUoSUdsb2JhbFZhcmlhYmxlLCBJUmVxdWVzdG9yKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0RXZhbHVhdGVWYXJpYWJsZSgpIHsKLQlHbG9iYWxWYXJpYWJsZSB2YXIgPSBudWxsOwotCXRyeSB7Ci0JCS8vIENyZWF0ZSB0aGUgdmFyaWFibGUKLQkJdmFyID0gY29udGV4dC5uZXdWYXJpYWJsZSgiaW50Ii50b0NoYXJBcnJheSgpLCAiZm9vIi50b0NoYXJBcnJheSgpLCAiMSIudG9DaGFyQXJyYXkoKSk7Ci0KLQkJLy8gSW5zdGFsbCBpdAkKLQkJY2xhc3MgTm9QYlJlcXVlc3RvciBleHRlbmRzIFJlcXVlc3RvciB7Ci0JCQlwdWJsaWMgdm9pZCBhY2NlcHRSZXN1bHQoRXZhbHVhdGlvblJlc3VsdCByZXN1bHQpIHsKLQkJCQlhc3NlcnRUcnVlKCJObyBwcm9ibGVtcyB3aXRoIHRoZSB2YXJpYWJsZSIsICFyZXN1bHQuaGFzUHJvYmxlbXMoKSk7Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQljb250ZXh0LmV2YWx1YXRlVmFyaWFibGVzKGdldEVudigpLCBnZXRPcHRpb25zKCksIG5ldyBOb1BiUmVxdWVzdG9yKCksIGdldFByb2JsZW1GYWN0b3J5KCkpOwotCQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQkJfQotCi0JCS8vIEdldCBpdHMgdmFsdWUKLQkJUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBSZXF1ZXN0b3IoKTsKLQkJdHJ5IHsKLQkJCWNvbnRleHQuZXZhbHVhdGVWYXJpYWJsZSh2YXIsIGdldEVudigpLCBnZXRPcHRpb25zKCksIHJlcXVlc3RvciwgZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JCX0gY2F0Y2ggKEluc3RhbGxFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgiTm8gdGFyZ2V0RXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCQl9Ci0JCWFzc2VydFRydWUoIkdvdCBvbmUgcmVzdWx0IiwgcmVxdWVzdG9yLnJlc3VsdEluZGV4ID09IDApOwotCQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdCA9IHJlcXVlc3Rvci5yZXN1bHRzWzBdOwotCQlhc3NlcnRUcnVlKCJSZXN1bHQgaGFzIHZhbHVlIiwgcmVzdWx0Lmhhc1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlZhbHVlIiwgIjEiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZURpc3BsYXlTdHJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiVHlwZSIsICJpbnQiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZVR5cGVOYW1lKCkpOwotCX0gZmluYWxseSB7Ci0JCS8vIENsZWFuIHVwCi0JCWlmICh2YXIgIT0gbnVsbCkgewotCQkJY29udGV4dC5kZWxldGVWYXJpYWJsZSh2YXIpOwotCQl9Ci0JfQotfQotLyoqCi0gKiBTYW5pdHkgdGVzdCBvZiBJRXZhbHVhdGlvbkNvbnRleHQuZXZhbHVhdGVWYXJpYWJsZXMoSU5hbWVFbnZpcm9ubWVudCwgQ29uZmlndXJhYmxlT3B0aW9uW10sIElSZXF1ZXN0b3IsIElQcm9ibGVtRmFjdG9yeSkKLSAqLwotcHVibGljIHZvaWQgdGVzdEV2YWx1YXRlVmFyaWFibGVzKCkgewotCUdsb2JhbFZhcmlhYmxlIHZhciA9IG51bGw7Ci0JdHJ5IHsKLQkJLy8gQ3JlYXRlIDEgdmFyaWFibGUKLQkJdmFyID0gY29udGV4dC5uZXdWYXJpYWJsZSgiaW50Ii50b0NoYXJBcnJheSgpLCAiZm9vIi50b0NoYXJBcnJheSgpLCAiMSIudG9DaGFyQXJyYXkoKSk7Ci0KLQkJLy8gSW5zdGFsbCBpdCBhbmQgZ2V0IGl0cyB2YWx1ZQotCQlSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IFJlcXVlc3RvcigpOwotCQl0cnkgewotCQkJY29udGV4dC5ldmFsdWF0ZVZhcmlhYmxlcyhnZXRFbnYoKSwgZ2V0T3B0aW9ucygpLCByZXF1ZXN0b3IsIGdldFByb2JsZW1GYWN0b3J5KCkpOwotCQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoIk5vIHRhcmdldEV4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKLQkJfQotCQlhc3NlcnRUcnVlKCJHb3Qgb25lIHJlc3VsdCIsIHJlcXVlc3Rvci5yZXN1bHRJbmRleCA9PSAwKTsKLQkJRXZhbHVhdGlvblJlc3VsdCByZXN1bHQgPSByZXF1ZXN0b3IucmVzdWx0c1swXTsKLQkJYXNzZXJ0VHJ1ZSgiTm8gcHJvYmxlbXMgd2l0aCB0aGUgdmFyaWFibGUiLCAhcmVzdWx0Lmhhc1Byb2JsZW1zKCkpOwotCQlhc3NlcnRUcnVlKCJSZXN1bHQgaGFzIHZhbHVlIiwgcmVzdWx0Lmhhc1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlZhbHVlIiwgIjEiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZURpc3BsYXlTdHJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiVHlwZSIsICJpbnQiLnRvQ2hhckFycmF5KCksIHJlc3VsdC5nZXRWYWx1ZVR5cGVOYW1lKCkpOwotCX0gZmluYWxseSB7Ci0JCS8vIENsZWFuIHVwCi0JCWlmICh2YXIgIT0gbnVsbCkgewotCQkJY29udGV4dC5kZWxldGVWYXJpYWJsZSh2YXIpOwotCQl9Ci0JfQotfQotLyoqCi0gKiBTYW5pdHkgdGVzdCBvZiBJRXZhbHVhdGlvbkNvbnRleHQuZ2V0SW1wb3J0cygpIGFuZCBJRXZhbHVhdGlvbkNvbnRleHQuc2V0SW1wb3J0cyhjaGFyW11bXSkKLSAqLwotcHVibGljIHZvaWQgdGVzdEdldFNldEltcG9ydHMoKSB7Ci0JdHJ5IHsKLQkJLy8gTm8gaW1wb3J0cwotCQlhc3NlcnRUcnVlKCJObyBpbXBvcnRzIGRlZmluZWQiLCBjb250ZXh0LmdldEltcG9ydHMoKS5sZW5ndGggPT0gMCk7Ci0KLQkJLy8gRGVmaW5lIHNvbWUgaW1wb3J0cwotCQljaGFyW11bXSBpbXBvcnRzID0gbmV3IGNoYXJbXVtdIHsiamF2YS51dGlsIi50b0NoYXJBcnJheSgpLCAiamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIi50b0NoYXJBcnJheSgpfTsKLQkJY29udGV4dC5zZXRJbXBvcnRzKGltcG9ydHMpOwotCQljaGFyW11bXSBzdG9yZWRJbXBvcnRzID0gY29udGV4dC5nZXRJbXBvcnRzKCk7Ci0JCWFzc2VydEVxdWFscygiU2FtZSBsZW5ndGgiLCBpbXBvcnRzLmxlbmd0aCwgc3RvcmVkSW1wb3J0cy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspewotCQkJYXNzZXJ0RXF1YWxzKCJJbXBvcnQgIyIgKyBpLCBpbXBvcnRzW2ldLCBzdG9yZWRJbXBvcnRzW2ldKTsKLQkJfQotCX0gZmluYWxseSB7Ci0JCS8vIENsZWFuIHVwCi0JCWNvbnRleHQuc2V0SW1wb3J0cyhuZXcgY2hhclswXVtdKTsKLQl9Ci19Ci0vKioKLSAqIFNhbml0eSB0ZXN0IG9mIElFdmFsdWF0aW9uQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpIGFuZCBJRXZhbHVhdGlvbkNvbnRleHQuc2V0UGFja2FnZU5hbWUoY2hhcltdKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0R2V0U2V0UGFja2FnZU5hbWUoKSB7Ci0JdHJ5IHsKLQkJLy8gRGVmYXVsdCBwYWNrYWdlCi0JCWFzc2VydFRydWUoIkRlZmF1bHQgcGFja2FnZSIsIGNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKS5sZW5ndGggPT0gMCk7Ci0KLQkJLy8gRGVmaW5lIGEgcGFja2FnZQotCQljaGFyW10gcGFja2FnZU5hbWUgPSAieC55LnoiLnRvQ2hhckFycmF5KCk7Ci0JCWNvbnRleHQuc2V0UGFja2FnZU5hbWUocGFja2FnZU5hbWUpOwotCQljaGFyW10gc3RvcmVkUGFja2FnZU5hbWUgPSBjb250ZXh0LmdldFBhY2thZ2VOYW1lKCk7Ci0JCWFzc2VydEVxdWFscygiU2FtZSBwYWNrYWdlIG5hbWUiLCBwYWNrYWdlTmFtZSwgc3RvcmVkUGFja2FnZU5hbWUpOwotCX0gZmluYWxseSB7Ci0JCS8vIENsZWFuIHVwCi0JCWNvbnRleHQuc2V0UGFja2FnZU5hbWUobmV3IGNoYXJbMF0pOwotCX0KLX0KLS8qKgotICogU2FuaXR5IHRlc3Qgb2YgSUV2YWx1YXRpb25Db250ZXh0Lm5ld1ZhcmlhYmxlKGNoYXJbXSwgY2hhcltdLCBjaGFyW10pIGFuZAotICogSUV2YWx1YXRpb25Db250ZXh0LmRlbGV0ZVZhcmlhYmxlKElHbG9iYWxWYXJpYWJsZSkKLSAqLwotcHVibGljIHZvaWQgdGVzdE5ld0RlbGV0ZVZhcmlhYmxlKCkgewotCS8vIERlZmluZSAxIHZhcmlhYmxlCi0JR2xvYmFsVmFyaWFibGUgdmFyID0gY29udGV4dC5uZXdWYXJpYWJsZSgiaW50Ii50b0NoYXJBcnJheSgpLCAiZGVsZXRlZCIudG9DaGFyQXJyYXkoKSwgbnVsbCk7Ci0KLQkvLyBEZWxldGUgaXQKLQljb250ZXh0LmRlbGV0ZVZhcmlhYmxlKHZhcik7Ci0JR2xvYmFsVmFyaWFibGVbXSB2YXJzID0gY29udGV4dC5hbGxWYXJpYWJsZXMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHZhcnMubGVuZ3RoOyBpKyspIHsKLQkJYXNzZXJ0VHJ1ZSgiVmFyaWFibGUgc2hvdWxkIG5vdCBleGlzdCIsICF2YXIuZ2V0TmFtZSgpLmVxdWFscyh2YXJzW2ldLmdldE5hbWUoKSkpOwotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ldmFsL1Nhbml0eVRlc3RFdmFsdWF0aW9uUmVzdWx0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZXZhbC9TYW5pdHlUZXN0RXZhbHVhdGlvblJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDc3YjFhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ldmFsL1Nhbml0eVRlc3RFdmFsdWF0aW9uUmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5ldmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbC5FdmFsdWF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsLklSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWwuSW5zdGFsbEV4Y2VwdGlvbjsKLS8qKgotICogU2FuaXR5IHRlc3QgdGhlIElFdmFsdWF0aW9uUmVzdWx0IGludGVyZmFjZS4KLSAqIEZvciBpbiBkZXB0aCB0ZXN0cywgc2VlIFZhcmlhYmxlVGVzdCBvciBDb2RlU25pcHBldFRlc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBTYW5pdHlUZXN0RXZhbHVhdGlvblJlc3VsdCBleHRlbmRzIEV2YWx1YXRpb25UZXN0IHsKLQlFdmFsdWF0aW9uUmVzdWx0IHJlc3VsdDsKLS8qKgotICogQ3JlYXRlcyBhIG5ldyBTYW5pdHlFdmFsdWF0aW9uUmVzdWx0VGVzdC4KLSAqLwotcHVibGljIFNhbml0eVRlc3RFdmFsdWF0aW9uUmVzdWx0KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0vKioKLSAqIEluaXRpYWxpemVzIHRoaXMgdGVzdCB3aXRoIGFuIGV2YWx1YXRpb24gcmVzdWx0IGNvbWluZyBmcm9tIHRoZQotICogZXZhbHVhdGlvbiBvZiB0aGUgZm9sbG93aW5nIGNvZGUgc25pcHBldDogInJldHVybiAxOyIuCi0gKi8KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCUlSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IFJlcXVlc3RvcigpIHsKLQkJcHVibGljIHZvaWQgYWNjZXB0UmVzdWx0KEV2YWx1YXRpb25SZXN1bHQgZXZhbFJlc3VsdCkgewotCQkJU2FuaXR5VGVzdEV2YWx1YXRpb25SZXN1bHQudGhpcy5yZXN1bHQgPSBldmFsUmVzdWx0OwotCQl9Ci0JfTsKLQl0cnkgewotCQl0aGlzLmNvbnRleHQuZXZhbHVhdGUoInJldHVybiAxOyIudG9DaGFyQXJyYXkoKSwgZ2V0RW52KCksIGdldE9wdGlvbnMoKSwgcmVxdWVzdG9yLCBnZXRQcm9ibGVtRmFjdG9yeSgpKTsKLQl9IGNhdGNoIChJbnN0YWxsRXhjZXB0aW9uIGUpIHsKLQkJdGhyb3cgbmV3IEVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKLQl9Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JcmV0dXJuIHNldHVwU3VpdGUodGVzdENsYXNzKCkpOwotfQotcHVibGljIHN0YXRpYyBDbGFzcyB0ZXN0Q2xhc3MoKSB7Ci0JcmV0dXJuIFNhbml0eVRlc3RFdmFsdWF0aW9uUmVzdWx0LmNsYXNzOwotfQotLyoqCi0gKiBTYW5pdHkgdGVzdCBvZiBJRXZhbHVhdGlvblJlc3VsdC5nZXRFdmFsdWF0aW9uVHlwZSgpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXRFdmFsdWF0aW9uVHlwZSgpIHsKLQlpbnQgZXZhbHVhdGlvblR5cGUgPSByZXN1bHQuZ2V0RXZhbHVhdGlvblR5cGUoKTsKLQlhc3NlcnRFcXVhbHMoIkV2YWx1YXRpb24gdHlwZSIsIEV2YWx1YXRpb25SZXN1bHQuVF9DT0RFX1NOSVBQRVQsIGV2YWx1YXRpb25UeXBlKTsKLX0KLS8qKgotICogU2FuaXR5IHRlc3Qgb2YgSUV2YWx1YXRpb25SZXN1bHQuZ2V0UHJvYmxlbXMoKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0R2V0UHJvYmxlbXMoKSB7Ci0JSVByb2JsZW1bXSBwcm9ibGVtcyA9IHJlc3VsdC5nZXRQcm9ibGVtcygpOwotCWFzc2VydFRydWUoIlByb2JsZW1zIiwgcHJvYmxlbXMgPT0gbnVsbCB8fCBwcm9ibGVtcy5sZW5ndGggPT0gMCk7Ci19Ci0vKioKLSAqIFNhbml0eSB0ZXN0IG9mIElFdmFsdWF0aW9uUmVzdWx0LmdldFZhbHVlKCkKLSAqLwotcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgewotCS8vIFRCRDogTm90IGltcGxlbWVudGVkIHlldAotfQotLyoqCi0gKiBTYW5pdHkgdGVzdCBvZiBJRXZhbHVhdGlvblJlc3VsdC5nZXRWYWx1ZURpc3BsYXlTdHJpbmcoKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVEaXNwbGF5U3RyaW5nKCkgewotCWNoYXJbXSBkaXNwbGF5U3RyaW5nID0gdGhpcy5yZXN1bHQuZ2V0VmFsdWVEaXNwbGF5U3RyaW5nKCk7Ci0JYXNzZXJ0RXF1YWxzKCJWYWx1ZSBkaXNwbGF5IHN0cmluZyIsICIxIi50b0NoYXJBcnJheSgpLCBkaXNwbGF5U3RyaW5nKTsKLX0KLS8qKgotICogU2FuaXR5IHRlc3Qgb2YgSUV2YWx1YXRpb25SZXN1bHQuZ2V0VmFsdWVUeXBlTmFtZSgpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZVR5cGVOYW1lKCkgewotCWNoYXJbXSB0eXBlTmFtZSA9IHRoaXMucmVzdWx0LmdldFZhbHVlVHlwZU5hbWUoKTsKLQlhc3NlcnRFcXVhbHMoIlZhbHVlIHR5cGUgbmFtZSIsICJpbnQiLnRvQ2hhckFycmF5KCksIHR5cGVOYW1lKTsKLX0KLS8qKgotICogU2FuaXR5IHRlc3Qgb2YgSUV2YWx1YXRpb25SZXN1bHQuaGFzRXJyb3JzKCkKLSAqLwotcHVibGljIHZvaWQgdGVzdEhhc0Vycm9ycygpIHsKLQlhc3NlcnRUcnVlKCJSZXN1bHQgaGFzIG5vIGVycm9ycyIsICFyZXN1bHQuaGFzRXJyb3JzKCkpOwotfQotLyoqCi0gKiBTYW5pdHkgdGVzdCBvZiBJRXZhbHVhdGlvblJlc3VsdC5oYXNQcm9ibGVtcygpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RIYXNQcm9ibGVtcygpIHsKLQlhc3NlcnRUcnVlKCJSZXN1bHQgaGFzIG5vIHByb2JsZW1zIiwgIXJlc3VsdC5oYXNQcm9ibGVtcygpKTsKLX0KLS8qKgotICogU2FuaXR5IHRlc3Qgb2YgSUV2YWx1YXRpb25SZXN1bHQuaGFzVmFsdWUoKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0SGFzVmFsdWUoKSB7Ci0JYXNzZXJ0VHJ1ZSgiUmVzdWx0IGhhcyBhIHZhbHVlIiwgcmVzdWx0Lmhhc1ZhbHVlKCkpOwotfQotLyoqCi0gKiBTYW5pdHkgdGVzdCBvZiBJRXZhbHVhdGlvblJlc3VsdC5oYXNXYXJuaW5ncygpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RIYXNXYXJuaW5ncygpIHsKLQlhc3NlcnRUcnVlKCJSZXN1bHQgaGFzIG5vIHdhcm5pbmdzIiwgIXJlc3VsdC5oYXNXYXJuaW5ncygpKTsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ldmFsL1NpbXBsZUNvZGVTbmlwcGV0VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2V2YWwvU2ltcGxlQ29kZVNuaXBwZXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZWVhNmMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2V2YWwvU2ltcGxlQ29kZVNuaXBwZXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmV2YWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5ydW50aW1lLlRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklOYW1lRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWwuSW5zdGFsbEV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ29kZVNuaXBwZXRUZXN0Ci0gICAgZXh0ZW5kcyBTaW1wbGVUZXN0IHsKLSAgICBwdWJsaWMgY2hhcltdIGdldENvZGVTbmlwcGV0U291cmNlKCkgewotCi0gICAgICAgIHJldHVybiBidWlsZENoYXJBcnJheShuZXcgU3RyaW5nW10geyAiMSArIDEiIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gICAgICAgICAgICAgICAgICAgICB0aHJvd3MgVGFyZ2V0RXhjZXB0aW9uLCBJbnN0YWxsRXhjZXB0aW9uIHsKLQotICAgICAgICBTaW1wbGVDb2RlU25pcHBldFRlc3QgdGVzdCA9IG5ldyBTaW1wbGVDb2RlU25pcHBldFRlc3QoKTsKLSAgICAgICAgdGVzdC5ydW5Db2RlU25pcHBldCgpOwotICAgIH0KLQotICAgIHZvaWQgcnVuQ29kZVNuaXBwZXQoKQotICAgICAgICAgICAgICAgICB0aHJvd3MgVGFyZ2V0RXhjZXB0aW9uLCBJbnN0YWxsRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5zdGFydEV2YWx1YXRpb25Db250ZXh0KCk7Ci0KLSAgICAgICAgY2hhcltdIHNuaXBwZXQgPSBnZXRDb2RlU25pcHBldFNvdXJjZSgpOwotICAgICAgICBJTmFtZUVudmlyb25tZW50IGVudiA9IGdldEVudigpOwotICAgICAgICB0aGlzLmNvbnRleHQuZXZhbHVhdGUoc25pcHBldCwgZW52LCBudWxsLCB0aGlzLnJlcXVlc3RvciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9ibGVtRmFjdG9yeSgpKTsKLSAgICAgICAgdGhpcy5zdG9wRXZhbHVhdGlvbkNvbnRleHQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZXZhbC9TaW1wbGVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZXZhbC9TaW1wbGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMTZjYTQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2V2YWwvU2ltcGxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuZXZhbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLnJ1bnRpbWUuTG9jYWxWTUxhdW5jaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLnJ1bnRpbWUuTG9jYWxWaXJ0dWFsTWFjaGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLnJ1bnRpbWUuVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLnJ1bnRpbWUuVGFyZ2V0SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLnV0aWwuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ2xhc3NGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5JUHJvYmxlbUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmJhdGNoLkZpbGVTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmNsYXNzZm10LkNsYXNzRmlsZVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGb3JtYXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQmluYXJ5RmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JTmFtZUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkRlZmF1bHRQcm9ibGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkRlZmF1bHRQcm9ibGVtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsLkV2YWx1YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5ldmFsLkV2YWx1YXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWwuR2xvYmFsVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWwuSVJlcXVlc3RvcjsKLQotcHVibGljIGNsYXNzIFNpbXBsZVRlc3QgewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSlJFX1BBVEggPSBVdGlsLmdldEpSRURpcmVjdG9yeSgpOwotCXN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT01QSUxBVElPTl9DTEFTU1BBVEggPSBuZXcgU3RyaW5nW10ge1V0aWwuZ2V0SmF2YUNsYXNzTGliKCksIFV0aWwuZ2V0T3V0cHV0RGlyZWN0b3J5KCl9OwotCXN0YXRpYyBmaW5hbCBTdHJpbmdbXSBSVU5USU1FX0NMQVNTUEFUSCA9ICBuZXcgU3RyaW5nW10ge1V0aWwuZ2V0T3V0cHV0RGlyZWN0b3J5KCl9OwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX1BBVEggPSBVdGlsLmdldE91dHB1dERpcmVjdG9yeSgpICsgRmlsZS5zZXBhcmF0b3IgKyAiZXZhbHVhdGlvbiI7Ci0JcHJvdGVjdGVkIEV2YWx1YXRpb25Db250ZXh0IGNvbnRleHQ7Ci0JcHJvdGVjdGVkIExvY2FsVmlydHVhbE1hY2hpbmUgbGF1bmNoZWRWTTsKLQlwcm90ZWN0ZWQgVGFyZ2V0SW50ZXJmYWNlIHRhcmdldDsKLQlwcm90ZWN0ZWQgUmVxdWVzdG9yIHJlcXVlc3RvcjsKLQotCWNsYXNzIFJlcXVlc3RvciBpbXBsZW1lbnRzIElSZXF1ZXN0b3IgewotCQlpbnQgZ2xvYmFsUHJvYmxlbUNvdW50ID0gMDsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0Q2xhc3NGaWxlcyhDbGFzc0ZpbGVbXSBjbGFzc0ZpbGVzLCBjaGFyW10gY29kZVNuaXBwZXRDbGFzc05hbWUpIHsKLQkJCXRyeSB7Ci0JCQkJdGFyZ2V0LnNlbmRDbGFzc2VzKGNvZGVTbmlwcGV0Q2xhc3NOYW1lICE9IG51bGwsIGNsYXNzRmlsZXMpOwotCQkJfSBjYXRjaCAoVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoY29kZVNuaXBwZXRDbGFzc05hbWUgIT0gbnVsbCkgewotCQkJCVRhcmdldEludGVyZmFjZS5SZXN1bHQgcmVzdWx0ID0gdGFyZ2V0LmdldFJlc3VsdCgpOwotCQkJCWlmIChyZXN1bHQuZGlzcGxheVN0cmluZyA9PSBudWxsKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKE5vIGV4cGxpY2l0IHJldHVybiB2YWx1ZSkiKTsKLQkJCQl9IGVsc2UgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50KCIoIik7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnQocmVzdWx0LnR5cGVOYW1lKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludCgiKSAiKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHJlc3VsdC5kaXNwbGF5U3RyaW5nKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBjbGFzc0ZpbGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJCWNoYXJbXVtdIGNvbXBvdW5kTmFtZSA9IGNsYXNzRmlsZXNbaV0uZ2V0Q29tcG91bmROYW1lKCk7Ci0JCQkJCWlmIChuZXcgU3RyaW5nKGNvbXBvdW5kTmFtZVtjb21wb3VuZE5hbWUubGVuZ3RoLTFdKS5zdGFydHNXaXRoKCJHbG9iYWxWYXJpYWJsZSIpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUlCaW5hcnlGaWVsZFtdIGZpZWxkcyA9IG5ldyBDbGFzc0ZpbGVSZWFkZXIoY2xhc3NGaWxlc1tpXS5nZXRCeXRlcygpLCBudWxsKS5nZXRGaWVsZHMoKTsKLQkJCQkJCQlpZiAoZmllbGRzICE9IG51bGwpIHsKLQkJCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmaWVsZHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCQkJCVRhcmdldEludGVyZmFjZS5SZXN1bHQgcmVzdWx0ID0gdGFyZ2V0LmdldFJlc3VsdCgpOwotCQkJCQkJCQkJaWYgKHJlc3VsdC5kaXNwbGF5U3RyaW5nID09IG51bGwpIHsKLQkJCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIihObyBleHBsaWNpdCByZXR1cm4gdmFsdWUpIik7Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnQoIigiKTsKLQkJCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50KHJlc3VsdC50eXBlTmFtZSk7Ci0JCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludCgiKSAiKTsKLQkJCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4ocmVzdWx0LmRpc3BsYXlTdHJpbmcpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoQ2xhc3NGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSAKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFjY2VwdFByb2JsZW0oSVByb2JsZW0gcHJvYmxlbSwgY2hhcltdIGZyYWdtZW50U291cmNlLCBpbnQgZnJhZ21lbnRLaW5kKSB7Ci0JCQlpbnQgbG9jYWxFcnJvckNvdW50ID0gMDsKLQkJCWdsb2JhbFByb2JsZW1Db3VudCsrOwotCQkJY2hhcltdIHNvdXJjZSA9IGZyYWdtZW50U291cmNlOwotCQkJaWYgKGxvY2FsRXJyb3JDb3VudCA9PSAwKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLSIpOwotCQkJaWYgKGZyYWdtZW50S2luZCA9PSBFdmFsdWF0aW9uUmVzdWx0LlRfSU5URVJOQUwpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50KGdsb2JhbFByb2JsZW1Db3VudCArIChwcm9ibGVtLmlzRXJyb3IoKSA/ICIuIElOVEVSTkFMIEVSUk9SIiA6ICIuIElOVEVSTkFMIFdBUk5JTkciKSk7Ci0JCQkJU3lzdGVtLm91dC5wcmludCgiIGluIGdlbmVyYXRlZCBjb21waWxhdGlvbiB1bml0Iik7Ci0JCQl9IGVsc2UgewotCQkJCVN5c3RlbS5vdXQucHJpbnQoZ2xvYmFsUHJvYmxlbUNvdW50ICsgKHByb2JsZW0uaXNFcnJvcigpID8gIi4gRVJST1IiIDogIi4gV0FSTklORyIpKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50KCIgaW4gIik7Ci0JCQkJc3dpdGNoIChmcmFnbWVudEtpbmQpIHsKLQkJCQkJY2FzZSBFdmFsdWF0aW9uUmVzdWx0LlRfUEFDS0FHRToKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnQoInBhY2thZ2UiKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEV2YWx1YXRpb25SZXN1bHQuVF9JTVBPUlQ6Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50KCJpbXBvcnQiKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEV2YWx1YXRpb25SZXN1bHQuVF9DT0RFX1NOSVBQRVQ6Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50KCJjb2RlIHNuaXBwZXQiKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEV2YWx1YXRpb25SZXN1bHQuVF9WQVJJQUJMRToKLQkJCQkJCWludCBsaW5lID0gcHJvYmxlbS5nZXRTb3VyY2VMaW5lTnVtYmVyKCk7Ci0JCQkJCQlpZiAobGluZSA9PSAtMSkgewotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnQoInZhcmlhYmxlIHR5cGUiKTsKLQkJCQkJCQlzb3VyY2UgPSBmaW5kVmFyKGZyYWdtZW50U291cmNlKS5nZXRUeXBlTmFtZSgpOwotCQkJCQkJfSBlbHNlIGlmIChsaW5lID09IDApIHsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50KCJ2YXJpYWJsZSBuYW1lIik7Ci0JCQkJCQkJc291cmNlID0gZmluZFZhcihmcmFnbWVudFNvdXJjZSkuZ2V0TmFtZSgpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50KCJ2YXJpYWJsZSBpbml0aWFsaXplciIpOwotCQkJCQkJCXNvdXJjZSA9IGZpbmRWYXIoZnJhZ21lbnRTb3VyY2UpLmdldEluaXRpYWxpemVyKCk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZXJyb3JSZXBvcnRTb3VyY2UoKERlZmF1bHRQcm9ibGVtKXByb2JsZW0sIHNvdXJjZSkpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKHByb2JsZW0uZ2V0TWVzc2FnZSgpKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLSIpOwotCQkJaWYgKHByb2JsZW0uaXNFcnJvcigpKQotCQkJCWxvY2FsRXJyb3JDb3VudCsrOwotCQl9Ci0JfQotLyoqCi0gKiBCdWlsZCBhIGNoYXIgYXJyYXkgZnJvbSB0aGUgZ2l2ZW4gbGluZXMKLSAqLwotcHJvdGVjdGVkIGNoYXJbXSBidWlsZENoYXJBcnJheShTdHJpbmdbXSBsaW5lcykgewotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewotCQlidWZmZXIuYXBwZW5kKGxpbmVzW2ldKTsKLQkJaWYgKGkgPCBsaW5lcy5sZW5ndGggLTEpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIlxuIik7Ci0JCX0KLQl9Ci0JaW50IGxlbmd0aCA9IGJ1ZmZlci5sZW5ndGgoKTsKLQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuZ3RoXTsKLQlidWZmZXIuZ2V0Q2hhcnMoMCwgbGVuZ3RoLCByZXN1bHQsIDApOwotCXJldHVybiByZXN1bHQ7Ci19Ci1wcm90ZWN0ZWQgU3RyaW5nIGVycm9yUmVwb3J0U291cmNlKERlZmF1bHRQcm9ibGVtIHByb2JsZW0sIGNoYXJbXSBzb3VyY2UpIHsKLQkvL2V4dHJhIGZyb20gdGhlIHNvdXJjZSB0aGUgaW5uYWN1cmF0ZSAgICAgdG9rZW4KLQkvL2FuZCAiaGlnaGxpZ2h0IiBpdCB1c2luZyBzb21lIHVuZGVybmVhdGggXl5eXl4KLQkvL3B1dCBzb21lIGNvbnRleHQgYXJvdW5kIHRvby4KLQotCS8vdGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB0aGUgZm9udCB1c2VkIGluIHRoZSBjb25zb2xlIGlzIGZpeGVkIHNpemUKLQotCS8vc2FuaXR5IC4uLi4uCi0JaWYgKChwcm9ibGVtLmdldFNvdXJjZVN0YXJ0KCkgPiBwcm9ibGVtLmdldFNvdXJjZUVuZCgpKSB8fCAoKHByb2JsZW0uZ2V0U291cmNlU3RhcnQoKSA8IDApICYmIChwcm9ibGVtLmdldFNvdXJjZUVuZCgpIDwgMCkpKQotCQlyZXR1cm4gIlxuISEgbm8gc291cmNlIGluZm9ybWF0aW9uIGF2YWlsYWJsZSAhISI7Ci0KLQkvL3JlZ3VsYXIgYmVoYXZpb3IuLi4uKHNsb3cgY29kZSkKLQotCWZpbmFsIGNoYXIgU1BBQ0UgPSAnXHUwMDIwJzsKLQlmaW5hbCBjaGFyIE1BUksgPSAnXic7Ci0JZmluYWwgY2hhciBUQUIgPSAnXHQnOwotCS8vdGhlIG5leHQgY29kZSB0cmllcyB0byB1bmRlcmxpbmUgdGhlIHRva2VuLi4uLi4KLQkvL2l0IGFzc3VtZXMgKGZvciBhIGdvb2QgZGlzcGxheSkgdGhhdCB0b2tlbiBzb3VyY2UgZG9lcyBub3QKLQkvL2NvbnRhaW4gYW55IFxyIFxuLiBUaGlzIGlzIGZhbHNlIG9uIHN0YXRlbWVudHMgISAKLQkvLyh0aGUgY29kZSBzdGlsbCB3b3JrcyBidXQgdGhlIGRpc3BsYXkgaXMgbm90IG9wdGltYWwgISkKLQotCS8vY29tcHV0ZSB0aGUgaG93LW11Y2gtY2hhciB3ZSBhcmUgZGlzcGxheWluZyBhcm91bmQgdGhlIGluYWNjdXJhdGUgdG9rZW4KLQlpbnQgYmVnaW4gPSBwcm9ibGVtLmdldFNvdXJjZVN0YXJ0KCkgPj0gc291cmNlLmxlbmd0aCA/IHNvdXJjZS5sZW5ndGggLSAxIDogcHJvYmxlbS5nZXRTb3VyY2VTdGFydCgpOwotCWludCByZWxhdGl2ZVN0YXJ0ID0gMDsKLQlpbnQgZW5kID0gcHJvYmxlbS5nZXRTb3VyY2VFbmQoKSA+PSBzb3VyY2UubGVuZ3RoID8gc291cmNlLmxlbmd0aCAtIDEgOiBwcm9ibGVtLmdldFNvdXJjZUVuZCgpOwotCWludCByZWxhdGl2ZUVuZCA9IDA7Ci0JbGFiZWwgOiBmb3IgKHJlbGF0aXZlU3RhcnQgPSAwOzsgcmVsYXRpdmVTdGFydCsrKSB7Ci0JCWlmIChiZWdpbiA9PSAwKQotCQkJYnJlYWsgbGFiZWw7Ci0JCWlmICgoc291cmNlW2JlZ2luIC0gMV0gPT0gJ1xuJykgfHwgKHNvdXJjZVtiZWdpbiAtIDFdID09ICdccicpKQotCQkJYnJlYWsgbGFiZWw7Ci0JCWJlZ2luLS07Ci0JfQotCWxhYmVsIDogZm9yIChyZWxhdGl2ZUVuZCA9IDA7OyByZWxhdGl2ZUVuZCsrKSB7Ci0JCWlmICgoZW5kICsgMSkgPj0gc291cmNlLmxlbmd0aCkKLQkJCWJyZWFrIGxhYmVsOwotCQlpZiAoKHNvdXJjZVtlbmQgKyAxXSA9PSAnXHInKSB8fCAoc291cmNlW2VuZCArIDFdID09ICdcbicpKSB7Ci0JCQlicmVhayBsYWJlbDsKLQkJfQotCQllbmQrKzsKLQl9Ci0JLy9leHRyYWN0IHRoZSBtZXNzYWdlIGZvcm0gdGhlIHNvdXJjZQotCWNoYXJbXSBleHRyYWN0ID0gbmV3IGNoYXJbZW5kIC0gYmVnaW4gKyAxXTsKLQlTeXN0ZW0uYXJyYXljb3B5KHNvdXJjZSwgYmVnaW4sIGV4dHJhY3QsIDAsIGV4dHJhY3QubGVuZ3RoKTsKLQljaGFyIGM7Ci0JLy9yZW1vdmUgYWxsIFNQQUNFIGFuZCBUQUIgdGhhdCBiZWdpbiB0aGUgZXJyb3IgbWVzc2FnZS4uLgotCWludCB0cmltTGVmdEluZGV4ID0gMDsKLQl3aGlsZSAoKChjID0gZXh0cmFjdFt0cmltTGVmdEluZGV4KytdKSA9PSBUQUIpIHx8IChjID09IFNQQUNFKSkgewotCX07Ci0JU3lzdGVtLmFycmF5Y29weShleHRyYWN0LCB0cmltTGVmdEluZGV4IC0gMSwgZXh0cmFjdCA9IG5ldyBjaGFyW2V4dHJhY3QubGVuZ3RoIC0gdHJpbUxlZnRJbmRleCArIDFdLCAwLCBleHRyYWN0Lmxlbmd0aCk7Ci0JcmVsYXRpdmVTdGFydCAtPSB0cmltTGVmdEluZGV4OwotCS8vYnVmZmVyIHNwYWNlcyBhbmQgdGFicyBpbiBvcmRlciB0byByZWFjaCB0aGUgZXJyb3IgcG9zaXRpb24KLQlpbnQgcG9zID0gMDsKLQljaGFyW10gdW5kZXJuZWF0aCA9IG5ldyBjaGFyW2V4dHJhY3QubGVuZ3RoXTsgLy8gY2FuJ3QgYmUgYmlnZ2VyCi0JZm9yIChpbnQgaSA9IDA7IGkgPD0gcmVsYXRpdmVTdGFydDsgaSsrKSB7Ci0JCWlmIChleHRyYWN0W2ldID09IFRBQikgewotCQkJdW5kZXJuZWF0aFtwb3MrK10gPSBUQUI7Ci0JCX0gZWxzZSB7Ci0JCQl1bmRlcm5lYXRoW3BvcysrXSA9IFNQQUNFOwotCQl9Ci0JfQotCS8vbWFyayB0aGUgZXJyb3IgcG9zaXRpb24KLQlmb3IgKGludCBpID0gcHJvYmxlbS5nZXRTb3VyY2VTdGFydCgpOyBpIDw9IChwcm9ibGVtLmdldFNvdXJjZUVuZCgpID49IHNvdXJjZS5sZW5ndGggPyBzb3VyY2UubGVuZ3RoIC0gMSA6IHByb2JsZW0uZ2V0U291cmNlRW5kKCkpOyBpKyspCi0JCXVuZGVybmVhdGhbcG9zKytdID0gTUFSSzsKLQkvL3Jlc2l6ZSB1bmRlcm5lYXRodG8gcmVtb3ZlICdudWxsJyBjaGFycwotCVN5c3RlbS5hcnJheWNvcHkodW5kZXJuZWF0aCwgMCwgdW5kZXJuZWF0aCA9IG5ldyBjaGFyW3Bvc10sIDAsIHBvcyk7Ci0JcmV0dXJuIAotCQkoKHByb2JsZW0uZ2V0U291cmNlTGluZU51bWJlcigpID4gMCkgPyAKLQkJCSgiIChhdCBsaW5lICIgKyBTdHJpbmcudmFsdWVPZihwcm9ibGVtLmdldFNvdXJjZUxpbmVOdW1iZXIoKSkgKyAiKSIpIDoKLQkJCSIiCi0JCSkgKyAKLQkJIlxuXHQiICsgbmV3IFN0cmluZyhleHRyYWN0KSArICJcblx0IiArIG5ldyBTdHJpbmcodW5kZXJuZWF0aCk7Ci19Ci1wcm90ZWN0ZWQgR2xvYmFsVmFyaWFibGUgZmluZFZhcihjaGFyW10gdmFyTmFtZSkgewotCUdsb2JhbFZhcmlhYmxlW10gdmFycyA9IHRoaXMuY29udGV4dC5hbGxWYXJpYWJsZXMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHZhcnMubGVuZ3RoOyBpKyspIHsKLQkJR2xvYmFsVmFyaWFibGUgdmFyID0gdmFyc1tpXTsKLQkJaWYgKENoYXJPcGVyYXRpb24uZXF1YWxzKHZhci5nZXROYW1lKCksIHZhck5hbWUpKSB7Ci0JCQlyZXR1cm4gdmFyOwotCQl9Ci0JfQotCXJldHVybiBudWxsOwotfQotcHJvdGVjdGVkIElOYW1lRW52aXJvbm1lbnQgZ2V0RW52KCkgewotCQotCXJldHVybiBuZXcgRmlsZVN5c3RlbShDT01QSUxBVElPTl9DTEFTU1BBVEgsIG5ldyBTdHJpbmdbMF0sIG51bGwpOwotfQotcHJvdGVjdGVkIElQcm9ibGVtRmFjdG9yeSBnZXRQcm9ibGVtRmFjdG9yeSgpIHsKLQlyZXR1cm4gbmV3IERlZmF1bHRQcm9ibGVtRmFjdG9yeShqYXZhLnV0aWwuTG9jYWxlLmdldERlZmF1bHQoKSk7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBzdGFydEV2YWx1YXRpb25Db250ZXh0KCkgdGhyb3dzIFRhcmdldEV4Y2VwdGlvbiB7Ci0JTG9jYWxWTUxhdW5jaGVyIGxhdW5jaGVyID0gTG9jYWxWTUxhdW5jaGVyLmdldExhdW5jaGVyKCk7Ci0JbGF1bmNoZXIuc2V0Vk1QYXRoKEpSRV9QQVRIKTsKLQlsYXVuY2hlci5zZXRDbGFzc1BhdGgoUlVOVElNRV9DTEFTU1BBVEgpOwotCWludCBldmFsUG9ydCA9IFV0aWwubmV4dEF2YWlsYWJsZVBvcnROdW1iZXIoKTsKLQlsYXVuY2hlci5zZXRFdmFsUG9ydChldmFsUG9ydCk7Ci0JbGF1bmNoZXIuc2V0RXZhbFRhcmdldFBhdGgoVEFSR0VUX1BBVEgpOwotCXRoaXMubGF1bmNoZWRWTSA9IGxhdW5jaGVyLmxhdW5jaCgpOwotCi0JKG5ldyBUaHJlYWQoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRyeSB7Ci0JCQkJamF2YS5pby5JbnB1dFN0cmVhbSBpbiA9IFNpbXBsZVRlc3QudGhpcy5sYXVuY2hlZFZNLmdldElucHV0U3RyZWFtKCk7Ci0JCQkJaW50IHJlYWQgPSAwOwotCQkJCXdoaWxlIChyZWFkICE9IC0xKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZWFkID0gaW4ucmVhZCgpOwotCQkJCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXJlYWQgPSAtMTsKLQkJCQkJfQotCQkJCQlpZiAocmVhZCAhPSAtMSkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludCgoY2hhcilyZWFkKTsKLQkJCQkJfQkKLQkJCQl9Ci0JCQl9IGNhdGNoIChUYXJnZXRFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfSkuc3RhcnQoKTsKLQkKLQkobmV3IFRocmVhZCgpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdHJ5IHsKLQkJCQlqYXZhLmlvLklucHV0U3RyZWFtIGluID0gU2ltcGxlVGVzdC50aGlzLmxhdW5jaGVkVk0uZ2V0RXJyb3JTdHJlYW0oKTsKLQkJCQlpbnQgcmVhZCA9IDA7Ci0JCQkJd2hpbGUgKHJlYWQgIT0gLTEpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJlYWQgPSBpbi5yZWFkKCk7Ci0JCQkJCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCQkJcmVhZCA9IC0xOwotCQkJCQl9Ci0JCQkJCWlmIChyZWFkICE9IC0xKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50KChjaGFyKXJlYWQpOwotCQkJCQl9CQotCQkJCX0KLQkJCX0gY2F0Y2ggKFRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9KS5zdGFydCgpOwotCi0JdGhpcy5yZXF1ZXN0b3IgPSBuZXcgUmVxdWVzdG9yKCk7Ci0JdGhpcy50YXJnZXQgPSBuZXcgVGFyZ2V0SW50ZXJmYWNlKCk7Ci0JdGhpcy50YXJnZXQuY29ubmVjdCgibG9jYWxob3N0IiwgZXZhbFBvcnQsIDEwMDAwKTsKLQl0aGlzLmNvbnRleHQgPSBuZXcgRXZhbHVhdGlvbkNvbnRleHQoKTsKLX0KLXByb3RlY3RlZCB2b2lkIHN0b3BFdmFsdWF0aW9uQ29udGV4dCgpIHRocm93cyBUYXJnZXRFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMudGFyZ2V0LmRpc2Nvbm5lY3QoKTsgLy8gQ2xvc2UgdGhlIHNvY2tldCBmaXJzdCBzbyB0aGF0IHRoZSBPUyByZXNvdXJjZSBoYXMgYSBjaGFuY2UgdG8gYmUgZnJlZWQuIAotCQlpbnQgcmV0cnkgPSAwOwotCQl3aGlsZSAodGhpcy5sYXVuY2hlZFZNLmlzUnVubmluZygpICYmICgrK3JldHJ5IDwgMjApKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcChyZXRyeSAqIDEwMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJaWYgKHRoaXMubGF1bmNoZWRWTS5pc1J1bm5pbmcoKSkgewotCQkJdGhpcy5sYXVuY2hlZFZNLnNodXREb3duKCk7Ci0JCX0KLQkJdGhpcy5jb250ZXh0ID0gbnVsbDsKLQl9IGNhdGNoIChUYXJnZXRFeGNlcHRpb24gZSkgewotCQl0aHJvdyBuZXcgRXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ldmFsL1NpbXBsZVZhcmlhYmxlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2V2YWwvU2ltcGxlVmFyaWFibGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YmEyZDUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2V2YWwvU2ltcGxlVmFyaWFibGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmV2YWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5ydW50aW1lLlRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklOYW1lRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWwuR2xvYmFsVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmV2YWwuSW5zdGFsbEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFNpbXBsZVZhcmlhYmxlVGVzdCBleHRlbmRzIFNpbXBsZVRlc3Qgewotdm9pZCBldmFsdWF0ZVZhcmlhYmxlKCkgdGhyb3dzIFRhcmdldEV4Y2VwdGlvbiwgSW5zdGFsbEV4Y2VwdGlvbiB7Ci0Jc3RhcnRFdmFsdWF0aW9uQ29udGV4dCgpOwotCUdsb2JhbFZhcmlhYmxlIHZhciA9IGdldFZhcmlhYmxlKCk7Ci0JSU5hbWVFbnZpcm9ubWVudCBlbnYgPSBnZXRFbnYoKTsKLQl0aGlzLmNvbnRleHQuZXZhbHVhdGVWYXJpYWJsZXMoZW52LCBudWxsLCB0aGlzLnJlcXVlc3RvciwgZ2V0UHJvYmxlbUZhY3RvcnkoKSk7Ci0JdGhpcy5jb250ZXh0LmRlbGV0ZVZhcmlhYmxlKHZhcik7Ci0Jc3RvcEV2YWx1YXRpb25Db250ZXh0KCk7Ci19Ci1wdWJsaWMgR2xvYmFsVmFyaWFibGUgZ2V0VmFyaWFibGUoKSB7Ci0JcmV0dXJuIHRoaXMuY29udGV4dC5uZXdWYXJpYWJsZSgKLQkJImludCIudG9DaGFyQXJyYXkoKSwKLQkJInZhciIudG9DaGFyQXJyYXkoKSwKLQkJIjEiLnRvQ2hhckFycmF5KCkpOwotfQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIFRhcmdldEV4Y2VwdGlvbiwgSW5zdGFsbEV4Y2VwdGlvbiB7Ci0JU2ltcGxlVmFyaWFibGVUZXN0IHRlc3QgPSBuZXcgU2ltcGxlVmFyaWFibGVUZXN0KCk7Ci0JdGVzdC5ldmFsdWF0ZVZhcmlhYmxlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZXZhbC9UZXN0QWxsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZXZhbC9UZXN0QWxsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMjcxOTQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2V2YWwvVGVzdEFsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5ldmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLS8qKgotICogUnVuIGFsbCB0ZXN0cyBkZWZpbmVkIGluIHRoaXMgcGFja2FnZS4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RBbGwgZXh0ZW5kcyBFdmFsdWF0aW9uVGVzdCB7Ci1wdWJsaWMgVGVzdEFsbChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCXJldHVybiBzdWl0ZShKUkVfUEFUSCwgRVZBTF9ESVJFQ1RPUlkpOwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKFN0cmluZyBqcmVQYXRoLCBTdHJpbmcgZXZhbERpcmVjdG9yeSkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoVGVzdEFsbC5jbGFzcy5nZXROYW1lKCkpOwotCXN1aXRlLmFkZFRlc3Qoc3VpdGUoU2FuaXR5VGVzdEV2YWx1YXRpb25Db250ZXh0LmNsYXNzKSk7Ci0Jc3VpdGUuYWRkVGVzdChzdWl0ZShTYW5pdHlUZXN0RXZhbHVhdGlvblJlc3VsdC5jbGFzcykpOwotCXN1aXRlLmFkZFRlc3Qoc3VpdGUoVmFyaWFibGVUZXN0LmNsYXNzKSk7Ci0Jc3VpdGUuYWRkVGVzdChzdWl0ZShDb2RlU25pcHBldFRlc3QuY2xhc3MpKTsKLQlzdWl0ZS5hZGRUZXN0KHN1aXRlKE5lZ2F0aXZlQ29kZVNuaXBwZXRUZXN0LmNsYXNzKSk7Ci0Jc3VpdGUuYWRkVGVzdChzdWl0ZShOZWdhdGl2ZVZhcmlhYmxlVGVzdC5jbGFzcykpOwotCXN1aXRlLmFkZFRlc3Qoc3VpdGUoRGVidWdFdmFsdWF0aW9uVGVzdC5jbGFzcykpOwotCUV2YWx1YXRpb25TZXR1cCBldmFsU2V0dXAgPSBuZXcgRGVidWdFdmFsdWF0aW9uU2V0dXAoc3VpdGUpOwotCWV2YWxTZXR1cC5qcmVQYXRoID0ganJlUGF0aDsKLQlldmFsU2V0dXAuZXZhbERpcmVjdG9yeSA9IGV2YWxEaXJlY3Rvcnk7Ci0JcmV0dXJuIGV2YWxTZXR1cDsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ldmFsL1ZhcmlhYmxlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2V2YWwvVmFyaWFibGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MjhmMmMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2V2YWwvVmFyaWFibGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5ldmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbC5HbG9iYWxWYXJpYWJsZTsKLS8qKgotICogVGVzdCB0aGUgZ2xvYmFsIHZhcmlhYmxlIGV2YWx1YXRpb24uCi0gKiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgRXZhbHVhdGlvbkNvbnRleHQgY2xhc3MgYW5kIHRoYXQgdGhlIEdsb2JhbFZhcmlhYmxlIGNsYXNzCi0gKiBhcmUgd29ya2luZyBjb3JyZWN0bHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYXJpYWJsZVRlc3QgZXh0ZW5kcyBFdmFsdWF0aW9uVGVzdCB7Ci0vKioKLSAqIENyZWF0ZXMgYSBuZXcgRXZhbHVhdGlvbkNvbnRleHRUZXN0LgotICovCi1wdWJsaWMgVmFyaWFibGVUZXN0KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JcmV0dXJuIHNldHVwU3VpdGUodGVzdENsYXNzKCkpOwotfQotLyoqCi0gKiBUZXN0cyB0aGUgaW5kaXZpZHVhbCBldmFsdWF0aW9uIG9mIHZhcmlhYmxlcyB3aXRoIGV4cGVjdGVkIHZhbHVlcyBvZiBhbGwga2luZCBvZiB0eXBlcy4KLSAqLwotcHVibGljIHZvaWQgdGVzdEFsbEtpbmRPZlZhbHVlcygpIHsKLQl0cnkgewotCQkvLyBDcmVhdGVzIHRoZSB2YXJpYWJsZXMKLQkJR2xvYmFsVmFyaWFibGUgdmFyMSA9IGNvbnRleHQubmV3VmFyaWFibGUoImludCIudG9DaGFyQXJyYXkoKSwgInZhcjEiLnRvQ2hhckFycmF5KCksICIxIi50b0NoYXJBcnJheSgpKTsKLQkJR2xvYmFsVmFyaWFibGUgdmFyMiA9IGNvbnRleHQubmV3VmFyaWFibGUoImJvb2xlYW4iLnRvQ2hhckFycmF5KCksICJ2YXIyIi50b0NoYXJBcnJheSgpLCAidHJ1ZSIudG9DaGFyQXJyYXkoKSk7Ci0JCUdsb2JhbFZhcmlhYmxlIHZhcjMgPSBjb250ZXh0Lm5ld1ZhcmlhYmxlKCJjaGFyIi50b0NoYXJBcnJheSgpLCAidmFyMyIudG9DaGFyQXJyYXkoKSwgIidjJyIudG9DaGFyQXJyYXkoKSk7Ci0JCUdsb2JhbFZhcmlhYmxlIHZhcjQgPSBjb250ZXh0Lm5ld1ZhcmlhYmxlKCJmbG9hdCIudG9DaGFyQXJyYXkoKSwgInZhcjQiLnRvQ2hhckFycmF5KCksICIoZmxvYXQpMS4wIi50b0NoYXJBcnJheSgpKTsKLQkJR2xvYmFsVmFyaWFibGUgdmFyNSA9IGNvbnRleHQubmV3VmFyaWFibGUoImRvdWJsZSIudG9DaGFyQXJyYXkoKSwgInZhcjUiLnRvQ2hhckFycmF5KCksICIxLjAiLnRvQ2hhckFycmF5KCkpOwotCQlHbG9iYWxWYXJpYWJsZSB2YXI2ID0gY29udGV4dC5uZXdWYXJpYWJsZSgic2hvcnQiLnRvQ2hhckFycmF5KCksICJ2YXI2Ii50b0NoYXJBcnJheSgpLCAiKHNob3J0KTEiLnRvQ2hhckFycmF5KCkpOwotCQlHbG9iYWxWYXJpYWJsZSB2YXI3ID0gY29udGV4dC5uZXdWYXJpYWJsZSgibG9uZyIudG9DaGFyQXJyYXkoKSwgInZhcjciLnRvQ2hhckFycmF5KCksICIobG9uZykxIi50b0NoYXJBcnJheSgpKTsKLQkJR2xvYmFsVmFyaWFibGUgdmFyOCA9IGNvbnRleHQubmV3VmFyaWFibGUoIlN0cmluZyIudG9DaGFyQXJyYXkoKSwgInZhcjgiLnRvQ2hhckFycmF5KCksICJcImhlbGxvXCIiLnRvQ2hhckFycmF5KCkpOwotCQlHbG9iYWxWYXJpYWJsZSB2YXI5ID0gY29udGV4dC5uZXdWYXJpYWJsZSgiT2JqZWN0Ii50b0NoYXJBcnJheSgpLCAidmFyOSIudG9DaGFyQXJyYXkoKSwgYnVpbGRDaGFyQXJyYXkobmV3IFN0cmluZ1tdIHsKLQkJCSJuZXcgT2JqZWN0KCkgeyIsIAotCQkJIglwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyIsIAotCQkJIgkJcmV0dXJuIFwiYW4gb2JqZWN0XCI7IiwgCi0JCQkiCX0iLCAKLQkJCSJ9In0pKTsKLQkJR2xvYmFsVmFyaWFibGUgdmFyMTAgPSBjb250ZXh0Lm5ld1ZhcmlhYmxlKCJPYmplY3QiLnRvQ2hhckFycmF5KCksICJ2YXIxMCIudG9DaGFyQXJyYXkoKSwgbnVsbCk7Ci0KLQkJLy8gSW5zdGFsbCB0aGVtCi0JCWluc3RhbGxWYXJpYWJsZXMoMTApOwotCi0JCS8vIEdldCB2YWx1ZXMgb25lIGJ5IG9uZQotCQlldmFsdWF0ZVdpdGhFeHBlY3RlZFZhbHVlKHZhcjEsICIxIi50b0NoYXJBcnJheSgpLCAiaW50Ii50b0NoYXJBcnJheSgpKTsKLQkJZXZhbHVhdGVXaXRoRXhwZWN0ZWRWYWx1ZSh2YXIyLCAidHJ1ZSIudG9DaGFyQXJyYXkoKSwgImJvb2xlYW4iLnRvQ2hhckFycmF5KCkpOwotCQlldmFsdWF0ZVdpdGhFeHBlY3RlZFZhbHVlKHZhcjMsICJjIi50b0NoYXJBcnJheSgpLCAiY2hhciIudG9DaGFyQXJyYXkoKSk7Ci0JCWV2YWx1YXRlV2l0aEV4cGVjdGVkVmFsdWUodmFyNCwgIjEuMCIudG9DaGFyQXJyYXkoKSwgImZsb2F0Ii50b0NoYXJBcnJheSgpKTsKLQkJZXZhbHVhdGVXaXRoRXhwZWN0ZWRWYWx1ZSh2YXI1LCAiMS4wIi50b0NoYXJBcnJheSgpLCAiZG91YmxlIi50b0NoYXJBcnJheSgpKTsKLQkJZXZhbHVhdGVXaXRoRXhwZWN0ZWRWYWx1ZSh2YXI2LCAiMSIudG9DaGFyQXJyYXkoKSwgInNob3J0Ii50b0NoYXJBcnJheSgpKTsKLQkJZXZhbHVhdGVXaXRoRXhwZWN0ZWRWYWx1ZSh2YXI3LCAiMSIudG9DaGFyQXJyYXkoKSwgImxvbmciLnRvQ2hhckFycmF5KCkpOwotCQlldmFsdWF0ZVdpdGhFeHBlY3RlZFZhbHVlKHZhcjgsICJoZWxsbyIudG9DaGFyQXJyYXkoKSwgImphdmEubGFuZy5TdHJpbmciLnRvQ2hhckFycmF5KCkpOwotCQlldmFsdWF0ZVdpdGhFeHBlY3RlZFZhbHVlKHZhcjksICJhbiBvYmplY3QiLnRvQ2hhckFycmF5KCksICJqYXZhLmxhbmcuT2JqZWN0Ii50b0NoYXJBcnJheSgpKTsKLQkJZXZhbHVhdGVXaXRoRXhwZWN0ZWRWYWx1ZSh2YXIxMCwgIm51bGwiLnRvQ2hhckFycmF5KCksICJqYXZhLmxhbmcuT2JqZWN0Ii50b0NoYXJBcnJheSgpKTsKLQl9IGZpbmFsbHkgewotCQkvLyBDbGVhbiB1cAotCQlHbG9iYWxWYXJpYWJsZVtdIHZhcnMgPSBjb250ZXh0LmFsbFZhcmlhYmxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhcnMubGVuZ3RoOyBpKyspIHsKLQkJCWNvbnRleHQuZGVsZXRlVmFyaWFibGUodmFyc1tpXSk7Ci0JCX0KLQl9Ci19Ci1wdWJsaWMgc3RhdGljIENsYXNzIHRlc3RDbGFzcygpIHsKLQlyZXR1cm4gVmFyaWFibGVUZXN0LmNsYXNzOwotfQotLyoqCi0gKiBUZXN0cyB0aGUgYXNzaWdubWVudCBvZiBhIGdsb2JhbCB2YXJpYWJsZSBpbiBhIGNvZGUgc25pcHBldC4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvZGVTbmlwcGV0VmFyQXNzaWduKCkgewotCXRyeSB7Ci0JCS8vIENyZWF0ZXMgdGhlIHZhcmlhYmxlcwotCQlHbG9iYWxWYXJpYWJsZSB2YXIxID0gY29udGV4dC5uZXdWYXJpYWJsZSgiaW50Ii50b0NoYXJBcnJheSgpLCAidmFyMSIudG9DaGFyQXJyYXkoKSwgbnVsbCk7Ci0JCUdsb2JhbFZhcmlhYmxlIHZhcjIgPSBjb250ZXh0Lm5ld1ZhcmlhYmxlKCJib29sZWFuIi50b0NoYXJBcnJheSgpLCAidmFyMiIudG9DaGFyQXJyYXkoKSwgbnVsbCk7Ci0JCUdsb2JhbFZhcmlhYmxlIHZhcjMgPSBjb250ZXh0Lm5ld1ZhcmlhYmxlKCJjaGFyIi50b0NoYXJBcnJheSgpLCAidmFyMyIudG9DaGFyQXJyYXkoKSwgbnVsbCk7Ci0JCUdsb2JhbFZhcmlhYmxlIHZhcjQgPSBjb250ZXh0Lm5ld1ZhcmlhYmxlKCJmbG9hdCIudG9DaGFyQXJyYXkoKSwgInZhcjQiLnRvQ2hhckFycmF5KCksIG51bGwpOwotCQlHbG9iYWxWYXJpYWJsZSB2YXI1ID0gY29udGV4dC5uZXdWYXJpYWJsZSgiZG91YmxlIi50b0NoYXJBcnJheSgpLCAidmFyNSIudG9DaGFyQXJyYXkoKSwgbnVsbCk7Ci0JCUdsb2JhbFZhcmlhYmxlIHZhcjYgPSBjb250ZXh0Lm5ld1ZhcmlhYmxlKCJzaG9ydCIudG9DaGFyQXJyYXkoKSwgInZhcjYiLnRvQ2hhckFycmF5KCksIG51bGwpOwotCQlHbG9iYWxWYXJpYWJsZSB2YXI3ID0gY29udGV4dC5uZXdWYXJpYWJsZSgibG9uZyIudG9DaGFyQXJyYXkoKSwgInZhcjciLnRvQ2hhckFycmF5KCksIG51bGwpOwotCQlHbG9iYWxWYXJpYWJsZSB2YXI4ID0gY29udGV4dC5uZXdWYXJpYWJsZSgiU3RyaW5nIi50b0NoYXJBcnJheSgpLCAidmFyOCIudG9DaGFyQXJyYXkoKSwgbnVsbCk7Ci0JCUdsb2JhbFZhcmlhYmxlIHZhcjkgPSBjb250ZXh0Lm5ld1ZhcmlhYmxlKCJPYmplY3QiLnRvQ2hhckFycmF5KCksICJ2YXI5Ii50b0NoYXJBcnJheSgpLCBudWxsKTsKLQkJR2xvYmFsVmFyaWFibGUgdmFyMTAgPSBjb250ZXh0Lm5ld1ZhcmlhYmxlKCJPYmplY3QiLnRvQ2hhckFycmF5KCksICJ2YXIxMCIudG9DaGFyQXJyYXkoKSwgbnVsbCk7Ci0KLQkJLy8gSW5zdGFsbCB0aGVtCi0JCWluc3RhbGxWYXJpYWJsZXMoMTApOwotCi0JCS8vIEFzc2lnbiBlYWNoIG9mIHRoZSB2YXJpYWJsZSBhbmQgZ2V0IGl0cyB2YWx1ZQotCQlldmFsdWF0ZVdpdGhFeHBlY3RlZERpc3BsYXlTdHJpbmcoInZhcjEgPSAxOyIudG9DaGFyQXJyYXkoKSwgIjEiLnRvQ2hhckFycmF5KCkpOwotCQlldmFsdWF0ZVdpdGhFeHBlY3RlZFZhbHVlKHZhcjEsICIxIi50b0NoYXJBcnJheSgpLCAiaW50Ii50b0NoYXJBcnJheSgpKTsKLQkJCi0JCWV2YWx1YXRlV2l0aEV4cGVjdGVkRGlzcGxheVN0cmluZygidmFyMiA9IHRydWU7Ii50b0NoYXJBcnJheSgpLCAidHJ1ZSIudG9DaGFyQXJyYXkoKSk7Ci0JCWV2YWx1YXRlV2l0aEV4cGVjdGVkVmFsdWUodmFyMiwgInRydWUiLnRvQ2hhckFycmF5KCksICJib29sZWFuIi50b0NoYXJBcnJheSgpKTsKLQotCQlldmFsdWF0ZVdpdGhFeHBlY3RlZERpc3BsYXlTdHJpbmcoInZhcjMgPSAnYyc7Ii50b0NoYXJBcnJheSgpLCAiYyIudG9DaGFyQXJyYXkoKSk7Ci0JCWV2YWx1YXRlV2l0aEV4cGVjdGVkVmFsdWUodmFyMywgImMiLnRvQ2hhckFycmF5KCksICJjaGFyIi50b0NoYXJBcnJheSgpKTsKLQkJCi0JCWV2YWx1YXRlV2l0aEV4cGVjdGVkRGlzcGxheVN0cmluZygidmFyNCA9IChmbG9hdCkxLjA7Ii50b0NoYXJBcnJheSgpLCAiMS4wIi50b0NoYXJBcnJheSgpKTsKLQkJZXZhbHVhdGVXaXRoRXhwZWN0ZWRWYWx1ZSh2YXI0LCAiMS4wIi50b0NoYXJBcnJheSgpLCAiZmxvYXQiLnRvQ2hhckFycmF5KCkpOwotCQkKLQkJZXZhbHVhdGVXaXRoRXhwZWN0ZWREaXNwbGF5U3RyaW5nKCJ2YXI1ID0gMS4wOyIudG9DaGFyQXJyYXkoKSwgIjEuMCIudG9DaGFyQXJyYXkoKSk7Ci0JCWV2YWx1YXRlV2l0aEV4cGVjdGVkVmFsdWUodmFyNSwgIjEuMCIudG9DaGFyQXJyYXkoKSwgImRvdWJsZSIudG9DaGFyQXJyYXkoKSk7Ci0KLQkJZXZhbHVhdGVXaXRoRXhwZWN0ZWREaXNwbGF5U3RyaW5nKCJ2YXI2ID0gKHNob3J0KTE7Ii50b0NoYXJBcnJheSgpLCAiMSIudG9DaGFyQXJyYXkoKSk7Ci0JCWV2YWx1YXRlV2l0aEV4cGVjdGVkVmFsdWUodmFyNiwgIjEiLnRvQ2hhckFycmF5KCksICJzaG9ydCIudG9DaGFyQXJyYXkoKSk7Ci0JCQotCQlldmFsdWF0ZVdpdGhFeHBlY3RlZERpc3BsYXlTdHJpbmcoInZhcjcgPSAobG9uZykxOyIudG9DaGFyQXJyYXkoKSwgIjEiLnRvQ2hhckFycmF5KCkpOwotCQlldmFsdWF0ZVdpdGhFeHBlY3RlZFZhbHVlKHZhcjcsICIxIi50b0NoYXJBcnJheSgpLCAibG9uZyIudG9DaGFyQXJyYXkoKSk7Ci0JCQotCQlldmFsdWF0ZVdpdGhFeHBlY3RlZERpc3BsYXlTdHJpbmcoInZhcjggPSBcImhlbGxvXCI7Ii50b0NoYXJBcnJheSgpLCAiaGVsbG8iLnRvQ2hhckFycmF5KCkpOwotCQlldmFsdWF0ZVdpdGhFeHBlY3RlZFZhbHVlKHZhcjgsICJoZWxsbyIudG9DaGFyQXJyYXkoKSwgImphdmEubGFuZy5TdHJpbmciLnRvQ2hhckFycmF5KCkpOwotCQkKLQkJZXZhbHVhdGVXaXRoRXhwZWN0ZWREaXNwbGF5U3RyaW5nKGJ1aWxkQ2hhckFycmF5KG5ldyBTdHJpbmdbXSB7Ci0JCQkidmFyOSA9IG5ldyBPYmplY3QoKSB7IiwgCi0JCQkiCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IiwgCi0JCQkiCQlyZXR1cm4gXCJhbiBvYmplY3RcIjsiLCAKLQkJCSIJfSIsIAotCQkJIn07In0pLCAiYW4gb2JqZWN0Ii50b0NoYXJBcnJheSgpKTsKLQkJZXZhbHVhdGVXaXRoRXhwZWN0ZWRWYWx1ZSh2YXI5LCAiYW4gb2JqZWN0Ii50b0NoYXJBcnJheSgpLCAiamF2YS5sYW5nLk9iamVjdCIudG9DaGFyQXJyYXkoKSk7Ci0KLQkJZXZhbHVhdGVXaXRoRXhwZWN0ZWREaXNwbGF5U3RyaW5nKCJ2YXIxMCA9IG51bGw7Ii50b0NoYXJBcnJheSgpLCAibnVsbCIudG9DaGFyQXJyYXkoKSk7Ci0JCWV2YWx1YXRlV2l0aEV4cGVjdGVkVmFsdWUodmFyMTAsICJudWxsIi50b0NoYXJBcnJheSgpLCAiamF2YS5sYW5nLk9iamVjdCIudG9DaGFyQXJyYXkoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJLy8gQ2xlYW4gdXAKLQkJR2xvYmFsVmFyaWFibGVbXSB2YXJzID0gY29udGV4dC5hbGxWYXJpYWJsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQljb250ZXh0LmRlbGV0ZVZhcmlhYmxlKHZhcnNbaV0pOwotCQl9Ci0JfQotfQotLyoqCi0gKiBUZXN0cyB0aGUgcmV0cmlldmFsIG9mIGEgZ2xvYmFsIHZhcmlhYmxlIGZyb20gYSBjb2RlIHNuaXBwZXQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb2RlU25pcHBldFZhclJldHJpZXZhbCgpIHsKLQl0cnkgewotCQkvLyBDcmVhdGVzIHRoZSB2YXJpYWJsZXMKLQkJR2xvYmFsVmFyaWFibGUgdmFyMSA9IGNvbnRleHQubmV3VmFyaWFibGUoImludCIudG9DaGFyQXJyYXkoKSwgInZhcjEiLnRvQ2hhckFycmF5KCksICIxIi50b0NoYXJBcnJheSgpKTsKLQkJR2xvYmFsVmFyaWFibGUgdmFyMiA9IGNvbnRleHQubmV3VmFyaWFibGUoImJvb2xlYW4iLnRvQ2hhckFycmF5KCksICJ2YXIyIi50b0NoYXJBcnJheSgpLCAidHJ1ZSIudG9DaGFyQXJyYXkoKSk7Ci0JCUdsb2JhbFZhcmlhYmxlIHZhcjMgPSBjb250ZXh0Lm5ld1ZhcmlhYmxlKCJjaGFyIi50b0NoYXJBcnJheSgpLCAidmFyMyIudG9DaGFyQXJyYXkoKSwgIidjJyIudG9DaGFyQXJyYXkoKSk7Ci0JCUdsb2JhbFZhcmlhYmxlIHZhcjQgPSBjb250ZXh0Lm5ld1ZhcmlhYmxlKCJmbG9hdCIudG9DaGFyQXJyYXkoKSwgInZhcjQiLnRvQ2hhckFycmF5KCksICIoZmxvYXQpMS4wIi50b0NoYXJBcnJheSgpKTsKLQkJR2xvYmFsVmFyaWFibGUgdmFyNSA9IGNvbnRleHQubmV3VmFyaWFibGUoImRvdWJsZSIudG9DaGFyQXJyYXkoKSwgInZhcjUiLnRvQ2hhckFycmF5KCksICIxLjAiLnRvQ2hhckFycmF5KCkpOwotCQlHbG9iYWxWYXJpYWJsZSB2YXI2ID0gY29udGV4dC5uZXdWYXJpYWJsZSgic2hvcnQiLnRvQ2hhckFycmF5KCksICJ2YXI2Ii50b0NoYXJBcnJheSgpLCAiKHNob3J0KTEiLnRvQ2hhckFycmF5KCkpOwotCQlHbG9iYWxWYXJpYWJsZSB2YXI3ID0gY29udGV4dC5uZXdWYXJpYWJsZSgibG9uZyIudG9DaGFyQXJyYXkoKSwgInZhcjciLnRvQ2hhckFycmF5KCksICIobG9uZykxIi50b0NoYXJBcnJheSgpKTsKLQkJR2xvYmFsVmFyaWFibGUgdmFyOCA9IGNvbnRleHQubmV3VmFyaWFibGUoIlN0cmluZyIudG9DaGFyQXJyYXkoKSwgInZhcjgiLnRvQ2hhckFycmF5KCksICJcImhlbGxvXCIiLnRvQ2hhckFycmF5KCkpOwotCQlHbG9iYWxWYXJpYWJsZSB2YXI5ID0gY29udGV4dC5uZXdWYXJpYWJsZSgiT2JqZWN0Ii50b0NoYXJBcnJheSgpLCAidmFyOSIudG9DaGFyQXJyYXkoKSwgYnVpbGRDaGFyQXJyYXkobmV3IFN0cmluZ1tdIHsKLQkJCSJuZXcgT2JqZWN0KCkgeyIsIAotCQkJIglwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyIsIAotCQkJIgkJcmV0dXJuIFwiYW4gb2JqZWN0XCI7IiwgCi0JCQkiCX0iLCAKLQkJCSJ9In0pKTsKLQkJR2xvYmFsVmFyaWFibGUgdmFyMTAgPSBjb250ZXh0Lm5ld1ZhcmlhYmxlKCJPYmplY3QiLnRvQ2hhckFycmF5KCksICJ2YXIxMCIudG9DaGFyQXJyYXkoKSwgbnVsbCk7Ci0KLQkJLy8gSW5zdGFsbCB0aGVtCi0JCWluc3RhbGxWYXJpYWJsZXMoMTApOwotCi0JCS8vIEdldCB2YWx1ZXMgb25lIGJ5IG9uZQotCQlldmFsdWF0ZVdpdGhFeHBlY3RlZFZhbHVlKHZhcjEsICIxIi50b0NoYXJBcnJheSgpLCAiaW50Ii50b0NoYXJBcnJheSgpKTsKLQkJZXZhbHVhdGVXaXRoRXhwZWN0ZWRWYWx1ZSh2YXIyLCAidHJ1ZSIudG9DaGFyQXJyYXkoKSwgImJvb2xlYW4iLnRvQ2hhckFycmF5KCkpOwotCQlldmFsdWF0ZVdpdGhFeHBlY3RlZFZhbHVlKHZhcjMsICJjIi50b0NoYXJBcnJheSgpLCAiY2hhciIudG9DaGFyQXJyYXkoKSk7Ci0JCWV2YWx1YXRlV2l0aEV4cGVjdGVkVmFsdWUodmFyNCwgIjEuMCIudG9DaGFyQXJyYXkoKSwgImZsb2F0Ii50b0NoYXJBcnJheSgpKTsKLQkJZXZhbHVhdGVXaXRoRXhwZWN0ZWRWYWx1ZSh2YXI1LCAiMS4wIi50b0NoYXJBcnJheSgpLCAiZG91YmxlIi50b0NoYXJBcnJheSgpKTsKLQkJZXZhbHVhdGVXaXRoRXhwZWN0ZWRWYWx1ZSh2YXI2LCAiMSIudG9DaGFyQXJyYXkoKSwgInNob3J0Ii50b0NoYXJBcnJheSgpKTsKLQkJZXZhbHVhdGVXaXRoRXhwZWN0ZWRWYWx1ZSh2YXI3LCAiMSIudG9DaGFyQXJyYXkoKSwgImxvbmciLnRvQ2hhckFycmF5KCkpOwotCQlldmFsdWF0ZVdpdGhFeHBlY3RlZFZhbHVlKHZhcjgsICJoZWxsbyIudG9DaGFyQXJyYXkoKSwgImphdmEubGFuZy5TdHJpbmciLnRvQ2hhckFycmF5KCkpOwotCQlldmFsdWF0ZVdpdGhFeHBlY3RlZFZhbHVlKHZhcjksICJhbiBvYmplY3QiLnRvQ2hhckFycmF5KCksICJqYXZhLmxhbmcuT2JqZWN0Ii50b0NoYXJBcnJheSgpKTsKLQkJZXZhbHVhdGVXaXRoRXhwZWN0ZWRWYWx1ZSh2YXIxMCwgIm51bGwiLnRvQ2hhckFycmF5KCksICJqYXZhLmxhbmcuT2JqZWN0Ii50b0NoYXJBcnJheSgpKTsKLQl9IGZpbmFsbHkgewotCQkvLyBDbGVhbiB1cAotCQlHbG9iYWxWYXJpYWJsZVtdIHZhcnMgPSBjb250ZXh0LmFsbFZhcmlhYmxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhcnMubGVuZ3RoOyBpKyspIHsKLQkJCWNvbnRleHQuZGVsZXRlVmFyaWFibGUodmFyc1tpXSk7Ci0JCX0KLQl9Ci19Ci0vKioKLSAqIFRlc3RzIHZhcmlhYmxlcyB0aGF0IGluY2x1ZGUgb25lIG9yIG1vcmUgaW1wb3J0cy4KLSAqLwotcHVibGljIHZvaWQgdGVzdEltcG9ydHMoKSB7Ci0JdHJ5IHsKLQkJLy8gaW1wb3J0IGEgcGFja2FnZQotCQljb250ZXh0LnNldEltcG9ydHMobmV3IGNoYXJbXVtdIHsiamF2YS5pby4qIi50b0NoYXJBcnJheSgpfSk7Ci0JCUdsb2JhbFZhcmlhYmxlIGZpbGUgPSBjb250ZXh0Lm5ld1ZhcmlhYmxlKCJib29sZWFuIi50b0NoYXJBcnJheSgpLCAiZmlsZSIudG9DaGFyQXJyYXkoKSwgIm5ldyBGaWxlKFwiIUAjJVwiKS5leGlzdHMoKSIudG9DaGFyQXJyYXkoKSk7Ci0JCWluc3RhbGxWYXJpYWJsZXMoMSk7Ci0JCWV2YWx1YXRlV2l0aEV4cGVjdGVkVmFsdWUoZmlsZSwgImZhbHNlIi50b0NoYXJBcnJheSgpLCAiYm9vbGVhbiIudG9DaGFyQXJyYXkoKSk7Ci0JCWNvbnRleHQuZGVsZXRlVmFyaWFibGUoZmlsZSk7Ci0KLQkJLy8gaW1wb3J0IGEgdHlwZQotCQljb250ZXh0LnNldEltcG9ydHMobmV3IGNoYXJbXVtdIHsiamF2YS5tYXRoLkJpZ0ludGVnZXIiLnRvQ2hhckFycmF5KCl9KTsKLQkJR2xvYmFsVmFyaWFibGUgYmlnID0gY29udGV4dC5uZXdWYXJpYWJsZSgiQmlnSW50ZWdlciIudG9DaGFyQXJyYXkoKSwgImJpZyIudG9DaGFyQXJyYXkoKSwgIm5ldyBCaWdJbnRlZ2VyKFwiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwXCIpIi50b0NoYXJBcnJheSgpKTsKLQkJaW5zdGFsbFZhcmlhYmxlcygxKTsKLQkJZXZhbHVhdGVXaXRoRXhwZWN0ZWRWYWx1ZShiaWcsICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiLnRvQ2hhckFycmF5KCksICJqYXZhLm1hdGguQmlnSW50ZWdlciIudG9DaGFyQXJyYXkoKSk7Ci0JCWNvbnRleHQuZGVsZXRlVmFyaWFibGUoYmlnKTsKLQotCQkvLyBpbXBvcnQgYSB0eXBlIGFuZCBhIHBhY2thZ2UKLQkJY29udGV4dC5zZXRJbXBvcnRzKG5ldyBjaGFyW11bXSB7ImphdmEudXRpbC5FbnVtZXJhdGlvbiIudG9DaGFyQXJyYXkoKSwgImphdmEubGFuZy5yZWZsZWN0LioiLnRvQ2hhckFycmF5KCl9KTsKLQkJR2xvYmFsVmFyaWFibGUgZmllbGRzID0gY29udGV4dC5uZXdWYXJpYWJsZSgiRmllbGRbXSIudG9DaGFyQXJyYXkoKSwgImZpZWxkcyIudG9DaGFyQXJyYXkoKSwgIkVudW1lcmF0aW9uLmNsYXNzLmdldERlY2xhcmVkRmllbGRzKCkiLnRvQ2hhckFycmF5KCkpOwotCQlpbnN0YWxsVmFyaWFibGVzKDEpOwotCQlldmFsdWF0ZVdpdGhFeHBlY3RlZFR5cGUoInJldHVybiBmaWVsZHM7Ii50b0NoYXJBcnJheSgpLCAiW0xqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsiLnRvQ2hhckFycmF5KCkpOwotCQljb250ZXh0LmRlbGV0ZVZhcmlhYmxlKGZpZWxkcyk7Ci0JfSBmaW5hbGx5IHsKLQkJLy8gY2xlYW4gdXAKLQkJY29udGV4dC5zZXRJbXBvcnRzKG5ldyBjaGFyWzBdW10pOwotCX0KLX0KLS8qKgotICogVGVzdHMgdGhlIGFkZGl0aW9ucyBhbmQgZGVsZXRpb24gb2YgdmFyaWFibGVzLCBpbnN0YWxsaW5nIHRoZW0gZWFjaCB0aW1lLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0U2V2ZXJhbFZhcmlhYmxlSW5zdGFsbGF0aW9ucygpIHsKLQl0cnkgewotCQkvLyBDcmVhdGVzIDYgdmFyaWFibGVzCi0JCUdsb2JhbFZhcmlhYmxlIHZhcjEgPSBjb250ZXh0Lm5ld1ZhcmlhYmxlKCJpbnQiLnRvQ2hhckFycmF5KCksICJ2YXIxIi50b0NoYXJBcnJheSgpLCAiMSIudG9DaGFyQXJyYXkoKSk7Ci0JCUdsb2JhbFZhcmlhYmxlIHZhcjIgPSBjb250ZXh0Lm5ld1ZhcmlhYmxlKCJib29sZWFuIi50b0NoYXJBcnJheSgpLCAidmFyMiIudG9DaGFyQXJyYXkoKSwgInRydWUiLnRvQ2hhckFycmF5KCkpOwotCQlHbG9iYWxWYXJpYWJsZSB2YXIzID0gY29udGV4dC5uZXdWYXJpYWJsZSgiY2hhciIudG9DaGFyQXJyYXkoKSwgInZhcjMiLnRvQ2hhckFycmF5KCksICInYyciLnRvQ2hhckFycmF5KCkpOwotCQlHbG9iYWxWYXJpYWJsZSB2YXI0ID0gY29udGV4dC5uZXdWYXJpYWJsZSgiZmxvYXQiLnRvQ2hhckFycmF5KCksICJ2YXI0Ii50b0NoYXJBcnJheSgpLCAiKGZsb2F0KTEuMCIudG9DaGFyQXJyYXkoKSk7Ci0JCUdsb2JhbFZhcmlhYmxlIHZhcjUgPSBjb250ZXh0Lm5ld1ZhcmlhYmxlKCJkb3VibGUiLnRvQ2hhckFycmF5KCksICJ2YXI1Ii50b0NoYXJBcnJheSgpLCAiMS4wIi50b0NoYXJBcnJheSgpKTsKLQkJR2xvYmFsVmFyaWFibGUgdmFyNiA9IGNvbnRleHQubmV3VmFyaWFibGUoInNob3J0Ii50b0NoYXJBcnJheSgpLCAidmFyNiIudG9DaGFyQXJyYXkoKSwgIihzaG9ydCkxIi50b0NoYXJBcnJheSgpKTsKLQotCQkvLyBJbnN0YWxsIHRoZSB2YXJpYWJsZXMKLQkJaW5zdGFsbFZhcmlhYmxlcyg2KTsKLQotCQkvLyBHZXQgdGhlaXIgdmFsdWVzCi0JCWV2YWx1YXRlV2l0aEV4cGVjdGVkVmFsdWUodmFyMSwgIjEiLnRvQ2hhckFycmF5KCksICJpbnQiLnRvQ2hhckFycmF5KCkpOwotCQlldmFsdWF0ZVdpdGhFeHBlY3RlZFZhbHVlKHZhcjIsICJ0cnVlIi50b0NoYXJBcnJheSgpLCAiYm9vbGVhbiIudG9DaGFyQXJyYXkoKSk7Ci0JCWV2YWx1YXRlV2l0aEV4cGVjdGVkVmFsdWUodmFyMywgImMiLnRvQ2hhckFycmF5KCksICJjaGFyIi50b0NoYXJBcnJheSgpKTsKLQkJZXZhbHVhdGVXaXRoRXhwZWN0ZWRWYWx1ZSh2YXI0LCAiMS4wIi50b0NoYXJBcnJheSgpLCAiZmxvYXQiLnRvQ2hhckFycmF5KCkpOwotCQlldmFsdWF0ZVdpdGhFeHBlY3RlZFZhbHVlKHZhcjUsICIxLjAiLnRvQ2hhckFycmF5KCksICJkb3VibGUiLnRvQ2hhckFycmF5KCkpOwotCQlldmFsdWF0ZVdpdGhFeHBlY3RlZFZhbHVlKHZhcjYsICIxIi50b0NoYXJBcnJheSgpLCAic2hvcnQiLnRvQ2hhckFycmF5KCkpOwotCi0JCS8vIERlbGV0ZSAzIHZhcmlhYmxlcwotCQljb250ZXh0LmRlbGV0ZVZhcmlhYmxlKHZhcjIpOwotCQljb250ZXh0LmRlbGV0ZVZhcmlhYmxlKHZhcjUpOwotCQljb250ZXh0LmRlbGV0ZVZhcmlhYmxlKHZhcjYpOwotCQkKLQkJLy8gSW5zdGFsbCB0aGUgdmFyaWFibGVzCi0JCWluc3RhbGxWYXJpYWJsZXMoMyk7Ci0KLQkJLy8gR2V0IHRoZWlyIHZhbHVlcwotCQlldmFsdWF0ZVdpdGhFeHBlY3RlZFZhbHVlKHZhcjEsICIxIi50b0NoYXJBcnJheSgpLCAiaW50Ii50b0NoYXJBcnJheSgpKTsKLQkJZXZhbHVhdGVXaXRoRXhwZWN0ZWRWYWx1ZSh2YXIzLCAiYyIudG9DaGFyQXJyYXkoKSwgImNoYXIiLnRvQ2hhckFycmF5KCkpOwotCQlldmFsdWF0ZVdpdGhFeHBlY3RlZFZhbHVlKHZhcjQsICIxLjAiLnRvQ2hhckFycmF5KCksICJmbG9hdCIudG9DaGFyQXJyYXkoKSk7Ci0KLQkJLy8gQWRkIDQgbW9yZSB2YXJpYWJsZXMKLQkJR2xvYmFsVmFyaWFibGUgdmFyNyA9IGNvbnRleHQubmV3VmFyaWFibGUoImxvbmciLnRvQ2hhckFycmF5KCksICJ2YXI3Ii50b0NoYXJBcnJheSgpLCAiKGxvbmcpMSIudG9DaGFyQXJyYXkoKSk7Ci0JCUdsb2JhbFZhcmlhYmxlIHZhcjggPSBjb250ZXh0Lm5ld1ZhcmlhYmxlKCJTdHJpbmciLnRvQ2hhckFycmF5KCksICJ2YXI4Ii50b0NoYXJBcnJheSgpLCAiXCJoZWxsb1wiIi50b0NoYXJBcnJheSgpKTsKLQkJR2xvYmFsVmFyaWFibGUgdmFyOSA9IGNvbnRleHQubmV3VmFyaWFibGUoIk9iamVjdCIudG9DaGFyQXJyYXkoKSwgInZhcjkiLnRvQ2hhckFycmF5KCksIGJ1aWxkQ2hhckFycmF5KG5ldyBTdHJpbmdbXSB7Ci0JCQkibmV3IE9iamVjdCgpIHsiLCAKLQkJCSIJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsiLCAKLQkJCSIJCXJldHVybiBcImFuIG9iamVjdFwiOyIsIAotCQkJIgl9IiwgCi0JCQkifSJ9KSk7Ci0JCUdsb2JhbFZhcmlhYmxlIHZhcjEwID0gY29udGV4dC5uZXdWYXJpYWJsZSgiT2JqZWN0Ii50b0NoYXJBcnJheSgpLCAidmFyMTAiLnRvQ2hhckFycmF5KCksIG51bGwpOwotCi0JCS8vIEluc3RhbGwgdGhlIHZhcmlhYmxlcwotCQlpbnN0YWxsVmFyaWFibGVzKDcpOwotCi0JCS8vIENoYW5nZSB2YWx1ZSBvZiBhIHZhcmlhYmxlIHVzaW5nIGEgY29kZSBzbmlwcGV0IGFuZCBtb3ZlIGl0Ci0JCWV2YWx1YXRlV2l0aEV4cGVjdGVkVmFsdWUoInZhcjMgPSAneic7IHJldHVybiB2YXIzOyIudG9DaGFyQXJyYXkoKSwgInoiLnRvQ2hhckFycmF5KCksICJjaGFyIi50b0NoYXJBcnJheSgpKTsKLQkJY29udGV4dC5kZWxldGVWYXJpYWJsZSh2YXIzKTsKLQkJdmFyMyA9IGNvbnRleHQubmV3VmFyaWFibGUodmFyMy5nZXRUeXBlTmFtZSgpLCB2YXIzLmdldE5hbWUoKSwgdmFyMy5nZXRJbml0aWFsaXplcigpKTsKLQotCQkvLyBDaGFuZ2UgdGhlIHR5cGUgb2YgYW5vdGhlciB2YXJpYWJsZSB0byBhbiBpbmNvbXBhdGlibGUgdHlwZQotCQljb250ZXh0LmRlbGV0ZVZhcmlhYmxlKHZhcjQpOwotCQl2YXI0ID0gY29udGV4dC5uZXdWYXJpYWJsZSgiamF2YS5uZXQuVVJMIi50b0NoYXJBcnJheSgpLCAidmFyNCIudG9DaGFyQXJyYXkoKSwgIm5ldyBqYXZhLm5ldC5VUkwoXCJodHRwOi8vd3d3LmlibS5jb20vaW5kZXguaHRtbFwiKSIudG9DaGFyQXJyYXkoKSk7Ci0KLQkJLy8gVXBhZHRlIHRoZSB2YXJpYWJsZXMKLQkJaW5zdGFsbFZhcmlhYmxlcyg3KTsKLQotCQkvLyBHZXQgdGhlaXIgdmFsdWVzCi0JCWV2YWx1YXRlV2l0aEV4cGVjdGVkVmFsdWUodmFyMSwgIjEiLnRvQ2hhckFycmF5KCksICJpbnQiLnRvQ2hhckFycmF5KCkpOwotCQlldmFsdWF0ZVdpdGhFeHBlY3RlZFZhbHVlKHZhcjMsICJ6Ii50b0NoYXJBcnJheSgpLCAiY2hhciIudG9DaGFyQXJyYXkoKSk7Ci0JCWV2YWx1YXRlV2l0aEV4cGVjdGVkVmFsdWUodmFyNCwgImh0dHA6Ly93d3cuaWJtLmNvbS9pbmRleC5odG1sIi50b0NoYXJBcnJheSgpLCAiamF2YS5uZXQuVVJMIi50b0NoYXJBcnJheSgpKTsKLQkJZXZhbHVhdGVXaXRoRXhwZWN0ZWRWYWx1ZSh2YXI3LCAiMSIudG9DaGFyQXJyYXkoKSwgImxvbmciLnRvQ2hhckFycmF5KCkpOwotCQlldmFsdWF0ZVdpdGhFeHBlY3RlZFZhbHVlKHZhcjgsICJoZWxsbyIudG9DaGFyQXJyYXkoKSwgImphdmEubGFuZy5TdHJpbmciLnRvQ2hhckFycmF5KCkpOwotCQlldmFsdWF0ZVdpdGhFeHBlY3RlZFZhbHVlKHZhcjksICJhbiBvYmplY3QiLnRvQ2hhckFycmF5KCksICJqYXZhLmxhbmcuT2JqZWN0Ii50b0NoYXJBcnJheSgpKTsKLQkJZXZhbHVhdGVXaXRoRXhwZWN0ZWRWYWx1ZSh2YXIxMCwgIm51bGwiLnRvQ2hhckFycmF5KCksICJqYXZhLmxhbmcuT2JqZWN0Ii50b0NoYXJBcnJheSgpKTsKLQl9IGZpbmFsbHkgewotCQkvLyBDbGVhbiB1cAotCQlHbG9iYWxWYXJpYWJsZVtdIHZhcnMgPSBjb250ZXh0LmFsbFZhcmlhYmxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhcnMubGVuZ3RoOyBpKyspIHsKLQkJCWNvbnRleHQuZGVsZXRlVmFyaWFibGUodmFyc1tpXSk7Ci0JCX0KLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZXZhbC90YXJnZXQvQ29kZVNuaXBwZXRDbGFzc0xvYWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2V2YWwvdGFyZ2V0L0NvZGVTbmlwcGV0Q2xhc3NMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYwYTVhMC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZXZhbC90YXJnZXQvQ29kZVNuaXBwZXRDbGFzc0xvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuZXZhbC50YXJnZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBBIGNvZGUgc25pcHBldCBjbGFzcyBsb2FkZXIgaXMgYSBjbGFzcyBsb2FkZXIgdGhhdCBsb2FkcyBjb2RlIHNuaXBwZXQgY2xhc3NlcyBhbmQgZ2xvYmFsCi0gKiB2YXJpYWJsZSBjbGFzc2VzLgotICovCi1wdWJsaWMgY2xhc3MgQ29kZVNuaXBwZXRDbGFzc0xvYWRlciBleHRlbmRzIENsYXNzTG9hZGVyIHsKLQkvKioKLQkgKiBXaGV0aGVyIHRoZSBjb2RlIHNuaXBwZXQgc3VwcG9ydCBjbGFzc2VzIHNob3VsZCBiZSBnaXZlbiBieSB0aGUgSURFCi0JICogb3Igc2hvdWxkIGJlIGZvdW5kIG9uIGRpc2suCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gREVWRUxPUE1FTlRfTU9ERSA9IGZhbHNlOwotCi0JSGFzaHRhYmxlIGxvYWRlZENsYXNzZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0vKioKLSAqIEFza3MgdGhlIGNsYXNzIGxvYWRlciB0aGF0IGxvYWRlZCB0aGlzIGNsYXNzIHRvIGxvYWQgdGhlIGdpdmVuIGNsYXNzLgotICogQHRocm93cyBhIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWYgaXQgY291bGQgbm90IGJlIGxvYWRlZC4KLSAqLwotcHJpdmF0ZSBDbGFzcyBkZWxlZ2F0ZUxvYWRDbGFzcyhTdHJpbmcgbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCUNsYXNzTG9hZGVyIG15TG9hZGVyID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotCWlmIChteUxvYWRlciA9PSBudWxsKSB7Ci0JCXJldHVybiBDbGFzcy5mb3JOYW1lKG5hbWUpOwotCX0gZWxzZSB7Ci0JCXJldHVybiBteUxvYWRlci5sb2FkQ2xhc3MobmFtZSk7Ci0JfQotfQotLyoqCi0gKiBMb2FkcyB0aGUgZ2l2ZW4gY2xhc3MuIElmIHRoZSBjbGFzcyBpcyBrbm93biB0byB0aGlzIHJ1bm5lciwgcmV0dXJucyBpdC4KLSAqIElmIG9ubHkgIHRoZSBjbGFzcyBkZWZpbml0aW9uIGlzIGtub3duIHRvIHRoaXMgcnVubmVyLCBtYWtlcyBpdCBhIGNsYXNzIGFuZCByZXR1cm5zIGl0LgotICogT3RoZXJ3aXNlIGRlbGVnYXRlcyB0byB0aGUgcmVhbCBjbGFzcyBsb2FkZXIuCi0gKi8KLXByb3RlY3RlZCBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIG5hbWUsIGJvb2xlYW4gcmVzb2x2ZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCWlmIChERVZFTE9QTUVOVF9NT0RFKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZGVsZWdhdGVMb2FkQ2xhc3MobmFtZSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJQ2xhc3MgY2xhenogPSBtYWtlQ2xhc3MobmFtZSwgcmVzb2x2ZSk7Ci0JCQlpZiAoY2xhenogPT0gbnVsbCkgewotCQkJCXRocm93IGU7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBjbGF6ejsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCUNsYXNzIGNsYXp6ID0gbWFrZUNsYXNzKG5hbWUsIHJlc29sdmUpOwotCQlpZiAoY2xhenogPT0gbnVsbCkgewotCQkJcmV0dXJuIGRlbGVnYXRlTG9hZENsYXNzKG5hbWUpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGNsYXp6OwotCQl9Ci0JfQotfQotLyoqCi0gKiBMb2FkcyB0aGUgZ2l2ZW4gY2xhc3MgZWl0aGVyIGZyb20gdGhlIHN0b3JlZCBjbGFzcyBkZWZpbml0aW9uIG9yIGZyb20gdGhlIHN5c3RlbS4KLSAqIFJldHVybnMgdGhlIGV4aXN0aW5nIGNsYXNzIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkLgotICogUmV0dXJucyBudWxsIGlmIG5vIGNsYXNzIGRlZmluaXRpb24gY2FuIGJlIGZvdW5kLgotICovCi1DbGFzcyBsb2FkSWZOZWVkZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCUNsYXNzIGNsYXp6ID0gbnVsbDsKLQlpZiAoIXN1cHBvcnRzSG90Q29kZVJlcGxhY2VtZW50KCkpIHsKLQkJY2xhenogPSBmaW5kTG9hZGVkQ2xhc3MoY2xhc3NOYW1lKTsKLQl9Ci0JaWYgKGNsYXp6ID09IG51bGwpIHsKLQkJdHJ5IHsKLQkJCWNsYXp6ID0gbG9hZENsYXNzKGNsYXNzTmFtZSwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQlyZXR1cm4gY2xheno7Ci19Ci0vKioKLSAqIE1ha2VzIHRoZSBjbGFzcyBkZWZpbml0aW9uIGtub3duIGJ5IHRoaXMgY29kZSBzbmlwcGV0IHJ1bm5lciBhIHJlYWwgY2xhc3MgYW5kCi0gKiByZXR1cm5zIGl0LgotICogUmV0dXJucyBudWxsIGlmIHRoZXJlIGlzIG5vIGNsYXNzIGRlZmluaXRpb24uCi0gKi8KLXByaXZhdGUgQ2xhc3MgbWFrZUNsYXNzKFN0cmluZyBuYW1lLCBib29sZWFuIHJlc29sdmUpIHsKLQlPYmplY3QgbyA9IHRoaXMubG9hZGVkQ2xhc3Nlcy5nZXQobmFtZSk7Ci0JaWYgKG8gPT0gbnVsbCkgewotCQlyZXR1cm4gbnVsbDsKLQl9IGVsc2UgewotCQlpZiAobyBpbnN0YW5jZW9mIENsYXNzKSB7Ci0JCQlyZXR1cm4gKENsYXNzKSBvOwotCQl9IGVsc2UgewotCQkJYnl0ZVtdIGNsYXNzRGVmaW5pdGlvbiA9IChieXRlW10pIG87Ci0JCQlDbGFzcyBjbGF6eiA9IGRlZmluZUNsYXNzKG51bGwsIGNsYXNzRGVmaW5pdGlvbiwgMCwgY2xhc3NEZWZpbml0aW9uLmxlbmd0aCk7Ci0JCQlpZiAocmVzb2x2ZSkgewotCQkJCXJlc29sdmVDbGFzcyhjbGF6eik7Ci0JCQl9Ci0JCQl0aGlzLmxvYWRlZENsYXNzZXMucHV0KG5hbWUsIGNsYXp6KTsKLQkJCXJldHVybiBjbGF6ejsKLQkJfQotCX0KLX0KLS8qKgotICogU3RvcmVzIHRoZSBnaXZlbiBjbGFzcyBkZWZpbml0aW9uIGZvciB0aGUgZ2l2ZW4gY2xhc3MuCi0gKi8KLXZvaWQgc3RvcmVDbGFzc0RlZmluaXRpb24oU3RyaW5nIGNsYXNzTmFtZSwgYnl0ZVtdIGNsYXNzRGVmaW5pdGlvbikgewotCU9iamVjdCBjbGF6eiA9IHRoaXMubG9hZGVkQ2xhc3Nlcy5nZXQoY2xhc3NOYW1lKTsKLQlpZiAoY2xhenogPT0gbnVsbCB8fCBzdXBwb3J0c0hvdENvZGVSZXBsYWNlbWVudCgpKSB7Ci0JCXRoaXMubG9hZGVkQ2xhc3Nlcy5wdXQoY2xhc3NOYW1lLCBjbGFzc0RlZmluaXRpb24pOwotCX0KLX0KLS8qKgotICogUmV0dXJucyB3aGV0aGVyIHRoaXMgY2xhc3MgbG9hZGVyIHN1cHBvcnRzIEhvdCBDb2RlIFJlcGxhY2VtZW50LgotICovCi1wcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0hvdENvZGVSZXBsYWNlbWVudCgpIHsKLQlyZXR1cm4gZmFsc2U7Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZXZhbC90YXJnZXQvQ29kZVNuaXBwZXRSdW5uZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ldmFsL3RhcmdldC9Db2RlU25pcHBldFJ1bm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmY2OGZjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ldmFsL3RhcmdldC9Db2RlU25pcHBldFJ1bm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuZXZhbC50YXJnZXQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBBIGNvZGUgc25pcHBldCBydW5uZXIgbG9hZHMgY29kZSBzbmlwcGV0IGNsYXNzZXMgYW5kIGdsb2JhbAotICogdmFyaWFibGUgY2xhc3NlcywgYW5kIHRoYXQgcnVuIHRoZSBjb2RlIHNuaXBwZXQgY2xhc3Nlcy4KLSAqIDxwPgotICogV2hlbiBzdGFydGVkLCB0aGlzIHJ1bm5lciBmaXJzdCBjb25uZWN0cyB1c2luZyBUQ1AvSVAgdG8gdGhlIHByb3ZpZGVkIHBvcnQgbnVtYmVyLgotICogSWYgYSByZWd1bGFyIGNsYXNzcGF0aCBkaXJlY3RvcnkgaXMgcHJvdmlkZWQsIGl0IHdyaXRlcyB0aGUgY2xhc3MgZGVmaW5pdGlvbnMgaXQgZ2V0cyBmcm9tIHRoZSBJREUKLSAqIHRvIHRoaXMgZGlyZWN0b3J5IChvciB0byB0aGUgYm9vdGNsYXNzcGF0aCBkaXJlY3RvcnkgaWYgdGhlIGNsYXNzIG5hbWUgc3RhcnRzIHdpdGggImphdmEiKSBhbmQgaXQKLSAqIGxldHMgdGhlIHN5c3RlbSBjbGFzcyBsb2FkZXIgKG9yIHRoZSBib290c3RyYXAgY2xhc3MgbG9hZGVyIGlmIGl0IGlzIGEgImphdmEiIGNsYXNzKSBsb2FkCi0gKiB0aGUgY2xhc3MuCi0gKiBJZiB0aGUgcmVndWxhciBjbGFzc3BhdGggZGlyZWN0b3J5IGlzIG51bGwsIGl0IHVzZXMgYSBjb2RlIHNuaXBwZXQgY2xhc3MgbG9hZGVyIHRvIGxvYWQgdGhlIGNsYXNzZXMKLSAqIGl0IGdldHMgZnJvbSB0aGUgSURFLiAKLSAqIDxwPgotICogSU1QT1JUQU5UIE5PVEU6Ci0gKiBVc2luZyBhIGNvZGUgc25pcHBldCBjbGFzcyBsb2FkZXIgaGFzIHRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbiB3aGVuIHRoZSBjb2RlIHNuaXBwZXQgaXMgcmFuOgotICogPHVsPgotICogPGxpPlRoZSBjb2RlIHNuaXBwZXQgY2xhc3MgY2FuIGFjY2VzcyBvbmx5IHB1YmxpYyBjbGFzc2VzLCBhbmQgcHVibGljIG1lbWJlcnMgb3IgdGhlc2UgY2xhc3Nlcy4KLSAqCSAgIFRoaXMgaXMgYmVjYXVzZSB0aGUgInJ1bnRpbWUgcGFja2FnZSIgb2YgdGhlIGNvZGUgc25pcHBldCBjbGFzcyBpcyBhbHdheXMgZGlmZmVyZW50IGZyb20KLSAqCSAgIHRoZSAicnVudGltZSBwYWNrYWdlIiBvZiB0aGUgY2xhc3MgaXQgaXMgdHJ5aW5nIHRvIGFjY2VzcyBzaW5jZSB0aGUgY2xhc3MgbG9hZGVycyBhcmUgCi0gKiAJICAgZGlmZmVyZW50LgotICogPGxpPlRoZSBjb2RlIHNuaXBwZXQgY2xhc3MgY2Fubm90IGJlIGRlZmluZWQgaW4gYSAiamF2YS4qIiBwYWNrYWdlLiBPbmx5IHRoZSBib290c3RyYXAgY2xhc3MgCi0gKgkgICBsb2FkZXIgY2FuIGxvYWQgc3VjaCBhIGNsYXNzLgotICogPC91bD4gCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2RlU25pcHBldFJ1bm5lciB7Ci0JcHVibGljIHN0YXRpYyBDb2RlU25pcHBldFJ1bm5lciB0aGVSdW5uZXI7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBDT0RFX1NOSVBQRVRfQ0xBU1NfTkFNRSA9ICJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZXZhbC50YXJnZXQuQ29kZVNuaXBwZXQiOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOX01FVEhPRF9OQU1FID0gInJ1biI7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfUkVTVUxUX1RZUEVfTUVUSE9EX05BTUUgPSAiZ2V0UmVzdWx0VHlwZSI7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfUkVTVUxUX1ZBTFVFX01FVEhPRF9OQU1FID0gImdldFJlc3VsdFZhbHVlIjsKLQkKLQlJREVJbnRlcmZhY2UgaWRlOwotCVN0cmluZyBjbGFzc1BhdGhEaXJlY3Rvcnk7Ci0JU3RyaW5nIGJvb3RjbGFzc1BhdGhEaXJlY3Rvcnk7Ci0JQ29kZVNuaXBwZXRDbGFzc0xvYWRlciBsb2FkZXI7Ci0JQ2xhc3MgY29kZVNuaXBwZXRDbGFzcyA9IG51bGw7Ci0vKioKLSAqIENyZWF0ZXMgYSBuZXcgY29kZSBzbmlwcGV0IHJ1bm5lci4gCi0gKi8KLXB1YmxpYyBDb2RlU25pcHBldFJ1bm5lcihpbnQgcG9ydE51bWJlciwgU3RyaW5nIGNsYXNzUGF0aERpcmVjdG9yeSwgU3RyaW5nIGJvb3RjbGFzc1BhdGhEaXJlY3RvcnkpIHsKLQl0aGlzLmlkZSA9IG5ldyBJREVJbnRlcmZhY2UocG9ydE51bWJlcik7Ci0JaWYgKGNsYXNzUGF0aERpcmVjdG9yeSAhPSBudWxsKSB7Ci0JCXRoaXMuY2xhc3NQYXRoRGlyZWN0b3J5ID0gY2xhc3NQYXRoRGlyZWN0b3J5OwotCQlpZiAoYm9vdGNsYXNzUGF0aERpcmVjdG9yeSAhPSBudWxsKSB7Ci0JCQl0aGlzLmJvb3RjbGFzc1BhdGhEaXJlY3RvcnkgPSBib290Y2xhc3NQYXRoRGlyZWN0b3J5OwotCQl9Ci0JfSBlbHNlIHsKLQkJdGhpcy5sb2FkZXIgPSBuZXcgQ29kZVNuaXBwZXRDbGFzc0xvYWRlcigpOwotCX0KLX0KLS8qKgotICogUmV0dXJucyB0aGUgZm9yd2FyZCBzbGFzaCBzZXBhcmF0ZWQgY2xhc3MgbmFtZSBmcm9tIHRoZSBnaXZlbiBjbGFzcyBkZWZpbml0aW9uLgotICovCi1wcml2YXRlIFN0cmluZyBjbGFzc05hbWUoYnl0ZVtdIGNsYXNzRGVmaW5pdGlvbikgewotCS8vIE5COiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGNvcGllZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jZm10LCAKLQkvLyAgICAgdGh1cyBpdCBpcyBoaWdobHkgZGVwZW5kZW50IG9uIHRoZSBjbGFzcyBmaWxlIGZvcm1hdC4KLQlpbnQgcmVhZE9mZnNldCA9IDEwOwotCXRyeSB7Ci0JCWludCBjb25zdGFudFBvb2xDb3VudCA9IHUyQXQoOCwgY2xhc3NEZWZpbml0aW9uKTsKLQkJaW50W10gY29uc3RhbnRQb29sT2Zmc2V0cyA9IG5ldyBpbnRbY29uc3RhbnRQb29sQ291bnRdOwotCQlmb3IgKGludCBpID0gMTsgaSA8IGNvbnN0YW50UG9vbENvdW50OyBpKyspIHsKLQkJCWludCB0YWcgPSB1MUF0KHJlYWRPZmZzZXQsIGNsYXNzRGVmaW5pdGlvbik7Ci0JCQlzd2l0Y2ggKHRhZykgewotCQkJCWNhc2UgMSA6IC8vIFV0ZjhUYWcKLQkJCQkJY29uc3RhbnRQb29sT2Zmc2V0c1tpXSA9IHJlYWRPZmZzZXQ7Ci0JCQkJCXJlYWRPZmZzZXQgKz0gdTJBdChyZWFkT2Zmc2V0ICsgMSwgY2xhc3NEZWZpbml0aW9uKTsKLQkJCQkJcmVhZE9mZnNldCArPSAzOyAvLyBDb25zdGFudFV0ZjguZml4ZWRTaXplCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMyA6IC8vIEludGVnZXJUYWcKLQkJCQkJY29uc3RhbnRQb29sT2Zmc2V0c1tpXSA9IHJlYWRPZmZzZXQ7Ci0JCQkJCXJlYWRPZmZzZXQgKz0gNTsgLy8gQ29uc3RhbnRJbnRlZ2VyLmZpeGVkU2l6ZQotCQkJCQlicmVhazsKLQkJCQljYXNlIDQgOiAvLyBGbG9hdFRhZwotCQkJCQljb25zdGFudFBvb2xPZmZzZXRzW2ldID0gcmVhZE9mZnNldDsKLQkJCQkJcmVhZE9mZnNldCArPSA1OyAvLyBDb25zdGFudEZsb2F0LmZpeGVkU2l6ZQotCQkJCQlicmVhazsKLQkJCQljYXNlIDUgOiAvLyBMb25nVGFnCi0JCQkJCWNvbnN0YW50UG9vbE9mZnNldHNbaV0gPSByZWFkT2Zmc2V0OwotCQkJCQlyZWFkT2Zmc2V0ICs9IDk7IC8vIENvbnN0YW50TG9uZy5maXhlZFNpemUKLQkJCQkJaSsrOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDYgOiAvLyBEb3VibGVUYWcKLQkJCQkJY29uc3RhbnRQb29sT2Zmc2V0c1tpXSA9IHJlYWRPZmZzZXQ7Ci0JCQkJCXJlYWRPZmZzZXQgKz0gOTsgLy8gQ29uc3RhbnREb3VibGUuZml4ZWRTaXplCi0JCQkJCWkrKzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA3IDogLy8gQ2xhc3NUYWcKLQkJCQkJY29uc3RhbnRQb29sT2Zmc2V0c1tpXSA9IHJlYWRPZmZzZXQ7Ci0JCQkJCXJlYWRPZmZzZXQgKz0gMzsgLy8gQ29uc3RhbnRDbGFzcy5maXhlZFNpemUKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA4IDogLy8gU3RyaW5nVGFnCi0JCQkJCWNvbnN0YW50UG9vbE9mZnNldHNbaV0gPSByZWFkT2Zmc2V0OwotCQkJCQlyZWFkT2Zmc2V0ICs9IDM7IC8vIENvbnN0YW50U3RyaW5nLmZpeGVkU2l6ZQotCQkJCQlicmVhazsKLQkJCQljYXNlIDkgOiAvLyBGaWVsZFJlZlRhZwotCQkJCQljb25zdGFudFBvb2xPZmZzZXRzW2ldID0gcmVhZE9mZnNldDsKLQkJCQkJcmVhZE9mZnNldCArPSA1OyAvLyBDb25zdGFudEZpZWxkUmVmLmZpeGVkU2l6ZQotCQkJCQlicmVhazsKLQkJCQljYXNlIDEwIDogLy8gTWV0aG9kUmVmVGFnCi0JCQkJCWNvbnN0YW50UG9vbE9mZnNldHNbaV0gPSByZWFkT2Zmc2V0OwotCQkJCQlyZWFkT2Zmc2V0ICs9IDU7IC8vIENvbnN0YW50TWV0aG9kUmVmLmZpeGVkU2l6ZQotCQkJCQlicmVhazsKLQkJCQljYXNlIDExIDogLy8gSW50ZXJmYWNlTWV0aG9kUmVmVGFnCi0JCQkJCWNvbnN0YW50UG9vbE9mZnNldHNbaV0gPSByZWFkT2Zmc2V0OwotCQkJCQlyZWFkT2Zmc2V0ICs9IDU7IC8vIENvbnN0YW50SW50ZXJmYWNlTWV0aG9kUmVmLmZpeGVkU2l6ZQotCQkJCQlicmVhazsKLQkJCQljYXNlIDEyIDogLy8gTmFtZUFuZFR5cGVUYWcKLQkJCQkJY29uc3RhbnRQb29sT2Zmc2V0c1tpXSA9IHJlYWRPZmZzZXQ7Ci0JCQkJCXJlYWRPZmZzZXQgKz0gNTsgLy8gQ29uc3RhbnROYW1lQW5kVHlwZS5maXhlZFNpemUKLQkJCX0KLQkJfQotCQkvLyBTa2lwIGFjY2VzcyBmbGFncwotCQlyZWFkT2Zmc2V0ICs9IDI7Ci0KLQkJLy8gUmVhZCB0aGUgY2xhc3NuYW1lLCB1c2UgZXhjZXB0aW9uIGhhbmRsZXJzIHRvIGNhdGNoIGJhZCBmb3JtYXQKLQkJaW50IGNvbnN0YW50UG9vbEluZGV4ID0gdTJBdChyZWFkT2Zmc2V0LCBjbGFzc0RlZmluaXRpb24pOwotCQlpbnQgdXRmOE9mZnNldCA9IGNvbnN0YW50UG9vbE9mZnNldHNbdTJBdChjb25zdGFudFBvb2xPZmZzZXRzW2NvbnN0YW50UG9vbEluZGV4XSArIDEsIGNsYXNzRGVmaW5pdGlvbildOwotCQljaGFyW10gY2xhc3NOYW1lID0gdXRmOEF0KHV0ZjhPZmZzZXQgKyAzLCB1MkF0KHV0ZjhPZmZzZXQgKyAxLCBjbGFzc0RlZmluaXRpb24pLCBjbGFzc0RlZmluaXRpb24pOwotCQlyZXR1cm4gbmV3IFN0cmluZyhjbGFzc05hbWUpOwotCX0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KLS8qKgotICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gY2xhc3MuIEl0IGlzCi0gKiBhc3N1bWVkIHRoYXQgaXQgaXMgYSBzdWJjbGFzcyBvZiBDb2RlU25pcHBldC4KLSAqLwotT2JqZWN0IGNyZWF0ZUNvZGVTbmlwcGV0KENsYXNzIHNuaXBwZXRDbGFzcykgewotCU9iamVjdCBvYmplY3QgPSBudWxsOwotCXRyeSB7Ci0JCW9iamVjdCA9IHNuaXBwZXRDbGFzcy5uZXdJbnN0YW5jZSgpOwotCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl0aGlzLmlkZS5zZW5kUmVzdWx0KHZvaWQuY2xhc3MsIG51bGwpOwotCQlyZXR1cm4gbnVsbDsKLQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJdGhpcy5pZGUuc2VuZFJlc3VsdCh2b2lkLmNsYXNzLCBudWxsKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXJldHVybiBvYmplY3Q7Ci19Ci0vKioKLSAqIFdoZXRoZXIgdGhpcyBjb2RlIHNuaXBwZXQgcnVubmVyIGlzIGN1cnJlbnRseSBydW5uaW5nLgotICovCi1wdWJsaWMgYm9vbGVhbiBpc1J1bm5pbmcoKSB7Ci0JcmV0dXJuIHRoaXMuaWRlLmlzQ29ubmVjdGVkKCk7Ci19Ci0vKioKLSAqIFN0YXJ0cyBhIG5ldyBDb2RlU25pcHBldFJ1bm5lciB0aGF0IHdpbGwgc2VydmUgY29kZSBzbmlwcGV0cyBmcm9tIHRoZSBJREUuCi0gKiBJdCB3YWl0cyBmb3IgYSBjb25uZWN0aW9uIG9uIHRoZSBnaXZlbiBldmFsdWF0aW9uIHBvcnQgbnVtYmVyLgotICogPHA+IAotICogVXNhZ2U6IGphdmEgb3JnLmVjbGlwc2UuamR0LnRlc3RzLmV2YWwudGFyZ2V0LkNvZGVTbmlwcGV0UnVubmVyIC1ldmFscG9ydCA8cG9ydE51bWJlcj4gWy1vcHRpb25zXSBbPG1haW5DbGFzc05hbWU+XSBbPGFyZ3VtZW50cz5dCi0gKiB3aGVyZSBvcHRpb25zIGluY2x1ZGU6Ci0gKiAtY3NjcCA8Y29kZVNuaXBwZXRDbGFzc3BhdGg+IHRoZSB0aGUgY2xhc3NwYXRoIGRpcmVjdG9yeSBmb3IgdGhlIGNvZGUgc25pcHBldCBjbGFzc2VzLgotICogdGhhdCBhcmUgbm90IGRlZmluZWQgaW4gYSAiamF2YS4qIiBwYWNrYWdlLgotICogLWNzYnAgPGNvZGVTbmlwcGV0Qm9vdENsYXNzcGF0aD4gdGhlIGJvb3RjbGFzc3BhdGggZGlyZWN0b3J5IGZvciB0aGUgY29kZSBzbmlwcGV0IGNsYXNzZXMKLSAqIHRoYXQgYXJlIGRlZmluZWQgaW4gYSAiamF2YS4qIiBwYWNrYWdlLgotICogPHA+Ci0gKiBUaGUgbWFpbkNsYXNzTmFtZSBhbmQgaXRzIGFyZ3VtZW50cyBhcmUgb3B0aW9uYWw6IHdoZW4gbm90IHByZXNlbnQgb25seSB0aGUgc2VydmVyIHdpbGwgc3RhcnQgCi0gKiBhbmQgcnVuIHVudGlsIHRoZSBWTSBpcyBzaHV0IGRvd24sIHdoZW4gcHJlc2VudCB0aGUgc2VydmVyIHdpbGwgc3RhcnQsIHRoZSBtYWluIGNsYXNzIHdpbGwgcnVuCi0gKiBidXQgdGhlIHNlcnZlciB3aWxsIGV4aXQgd2hlbiB0aGUgbWFpbiBjbGFzcyBoYXMgZmluaXNoZWQgcnVubmluZy4KLSAqLwotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWludCBsZW5ndGggPSBhcmdzLmxlbmd0aDsKLQlpZiAobGVuZ3RoIDwgMiB8fCAhYXJnc1swXS50b0xvd2VyQ2FzZSgpLmVxdWFscygiLWV2YWxwb3J0IikpIHsKLQkJcHJpbnRVc2FnZSgpOwotCQlyZXR1cm47Ci0JfSBlbHNlIHsKLQkJaW50IGV2YWxQb3J0ID0gSW50ZWdlci5wYXJzZUludChhcmdzWzFdKTsKLQkJU3RyaW5nIGNsYXNzUGF0aCA9IG51bGw7Ci0JCVN0cmluZyBib290UGF0aCA9IG51bGw7Ci0JCWludCBtYWluQ2xhc3MgPSAtMTsKLQkJZm9yIChpbnQgaSA9IDI7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGFyZyA9IGFyZ3NbaV07Ci0JCQlpZiAoYXJnLnN0YXJ0c1dpdGgoIi0iKSkgewotCQkJCWlmIChhcmcudG9Mb3dlckNhc2UoKS5lcXVhbHMoIi1jc2NwIikpIHsKLQkJCQkJaWYgKCsraSA8IGxlbmd0aCkgewotCQkJCQkJY2xhc3NQYXRoID0gYXJnc1tpXTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXByaW50VXNhZ2UoKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoYXJnLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCItY3NicCIpKSB7Ci0JCQkJCWlmICgrK2kgPCBsZW5ndGgpIHsKLQkJCQkJCWJvb3RQYXRoID0gYXJnc1tpXTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXByaW50VXNhZ2UoKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbWFpbkNsYXNzID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQl0aGVSdW5uZXIgPSBuZXcgQ29kZVNuaXBwZXRSdW5uZXIoZXZhbFBvcnQsIGNsYXNzUGF0aCwgYm9vdFBhdGgpOwotCQlpZiAobWFpbkNsYXNzID09IC0xKSB7Ci0JCQl0aGVSdW5uZXIuc3RhcnQoKTsKLQkJfSBlbHNlIHsKLQkJCVRocmVhZCBzZXJ2ZXIgPSBuZXcgVGhyZWFkKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdGhlUnVubmVyLnN0YXJ0KCk7Ci0JCQkJfQotCQkJfTsKLQkJCXNlcnZlci5zZXREYWVtb24odHJ1ZSk7Ci0JCQlzZXJ2ZXIuc3RhcnQoKTsKLQkJCWludCBtYWluQXJnc0xlbmd0aCA9IGxlbmd0aC1tYWluQ2xhc3MtMTsKLQkJCVN0cmluZ1tdIG1haW5BcmdzID0gbmV3IFN0cmluZ1ttYWluQXJnc0xlbmd0aF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3MsIG1haW5DbGFzcysxLCBtYWluQXJncywgMCwgbWFpbkFyZ3NMZW5ndGgpOwotCQkJdHJ5IHsKLQkJCQlDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoYXJnc1ttYWluQ2xhc3NdKTsKLQkJCQlNZXRob2QgbWFpbk1ldGhvZCA9IGNsYXp6LmdldE1ldGhvZCgibWFpbiIsIG5ldyBDbGFzc1tdIHtTdHJpbmdbXS5jbGFzc30pOwotCQkJCW1haW5NZXRob2QuaW52b2tlKG51bGwsIG5ldyBTdHJpbmdbXVtdIHttYWluQXJnc30pOwotCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQkJCi19Ci1wcml2YXRlIHN0YXRpYyB2b2lkIHByaW50VXNhZ2UoKSB7Ci0JU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogamF2YSBvcmcuZWNsaXBzZS5qZHQudGVzdHMuZXZhbC50YXJnZXQuQ29kZVNuaXBwZXRSdW5uZXIgLWV2YWxwb3J0IDxwb3J0TnVtYmVyPiBbLW9wdGlvbnNdIFs8bWFpbkNsYXNzTmFtZT5dIFs8YXJndW1lbnRzPl0iKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4oIndoZXJlIG9wdGlvbnMgaW5jbHVkZToiKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4oIi1jc2NwIDxjb2RlU25pcHBldENsYXNzcGF0aD4gdGhlIHRoZSBjbGFzc3BhdGggZGlyZWN0b3J5IGZvciB0aGUgY29kZSBzbmlwcGV0IGNsYXNzZXMuIik7Ci0JU3lzdGVtLm91dC5wcmludGxuKCJ0aGF0IGFyZSBub3QgZGVmaW5lZCBpbiBhIFwiamF2YS4qXCIgcGFja2FnZS4iKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4oIi1jc2JwIDxjb2RlU25pcHBldEJvb3RDbGFzc3BhdGg+IHRoZSBib290Y2xhc3NwYXRoIGRpcmVjdG9yeSBmb3IgdGhlIGNvZGUgc25pcHBldCBjbGFzc2VzIik7Ci0JU3lzdGVtLm91dC5wcmludGxuKCJ0aGF0IGFyZSBkZWZpbmVkIGluIGEgXCJqYXZhLipcIiBwYWNrYWdlLiIpOwotfQotLyoqCi0gKiBMb2FkcyB0aGUgZ2l2ZW4gY2xhc3MgZGVmaW5pdGlvbnMuIFRoZSB3YXkgdGhlc2UgY2xhc3MgZGVmaW5pdGlvbnMgYXJlIGxvYWRlZCBpcyBkZXNjcmliZWQKLSAqIGluIHRoZSBDb2RlU25pcHBldFJ1bm5lciBjb25zdHJ1Y3Rvci4KLSAqIFRoZSBjbGFzcyBkZWZpbml0aW9ucyBhcmUgY29kZSBzbmlwcGV0IGNsYXNzZXMgYW5kL29yIGdsb2JhbCB2YXJpYWJsZSBjbGFzc2VzLgotICogQ29kZSBzbmlwcGV0IGNsYXNzZXMgYXJlIGFzc3VtZWQgYmUgZGlyZWN0IG9yIGluZGlyZWN0IHN1YmNsYXNzZXMgb2YgQ29kZVNuaXBwZXQgYW5kIGltcGxlbWVudCAKLSAqIG9ubHkgdGhlIHJ1bigpViBtZXRob2QuIAotICogVGhleSBhcmUgaW5zdGFuY2lhdGVkIGFuZCBydW4uCi0gKiBHbG9iYWwgdmFyaWFibGUgY2xhc3NlcyBhcmUgYXNzdW1lZCB0byBiZSBkaXJlY3Qgc3ViY2xhc3NlcyBvZiBDb2RlU25pcHBldC4gVGhlaXIgZmllbGRzIGFyZSBhc3N1bWVkCi0gKiB0byBiZSBzdGF0aWMuIFRoZSB2YWx1ZSBvZiBlYWNoIGZpZWxkIGlzIHNlbnQgYmFjayB0byB0aGUgSURFLgotICovCi12b2lkIHByb2Nlc3NDbGFzc2VzKGJvb2xlYW4gbXVzdFJ1biwgYnl0ZVtdW10gY2xhc3NEZWZpbml0aW9ucykgewotCS8vIHN0b3JlIHRoZSBjbGFzcyBkZWZpbml0aW9ucyAoZWl0aGVyIGluIHRoZSBjb2RlIHNuaXBwZXQgY2xhc3MgbG9hZGVyIG9yIG9uIGRpc2spCi0JU3RyaW5nW10gbmV3Q2xhc3NlcyA9IG5ldyBTdHJpbmdbY2xhc3NEZWZpbml0aW9ucy5sZW5ndGhdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NEZWZpbml0aW9ucy5sZW5ndGg7IGkrKykgewotCQlieXRlW10gY2xhc3NEZWZpbml0aW9uID0gY2xhc3NEZWZpbml0aW9uc1tpXTsKLQkJU3RyaW5nIGNsYXNzRmlsZU5hbWUgPSBjbGFzc05hbWUoY2xhc3NEZWZpbml0aW9uKTsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNsYXNzRmlsZU5hbWUucmVwbGFjZSgnLycsICcuJyk7Ci0JCWlmICh0aGlzLmxvYWRlciAhPSBudWxsKSB7Ci0JCQl0aGlzLmxvYWRlci5zdG9yZUNsYXNzRGVmaW5pdGlvbihjbGFzc05hbWUsIGNsYXNzRGVmaW5pdGlvbik7Ci0JCX0gZWxzZSB7Ci0JCQl3cml0ZUNsYXNzT25EaXNrKGNsYXNzRmlsZU5hbWUsIGNsYXNzRGVmaW5pdGlvbik7Ci0JCX0KLQkJbmV3Q2xhc3Nlc1tpXSA9IGNsYXNzTmFtZTsKLQl9Ci0KLQkvLyBsb2FkIHRoZSBjbGFzc2VzIGFuZCBjb2xsZWN0IGNvZGUgc25pcHBldCBjbGFzc2VzCi0JVmVjdG9yIGNvZGVTbmlwcGV0Q2xhc3NlcyA9IG5ldyBWZWN0b3IoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG5ld0NsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IG5ld0NsYXNzZXNbaV07Ci0JCUNsYXNzIGNsYXp6ID0gbnVsbDsKLQkJaWYgKHRoaXMubG9hZGVyICE9IG51bGwpIHsKLQkJCWNsYXp6ID0gdGhpcy5sb2FkZXIubG9hZElmTmVlZGVkKGNsYXNzTmFtZSk7Ci0JCQlpZiAoY2xhenogPT0gbnVsbCkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiQ291bGQgbm90IGZpbmQgY2xhc3MgZGVmaW5pdGlvbiBmb3IgIiArIGNsYXNzTmFtZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyB1c2UgdGhlIHN5c3RlbSBjbGFzcyBsb2FkZXIKLQkJCXRyeSB7Ci0JCQkJY2xhenogPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0JCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOyAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuIHNpbmNlIHdlIGp1c3Qgd3JvdGUgaXQgb24gZGlzawotCQkJCXRoaXMuaWRlLnNlbmRSZXN1bHQodm9pZC5jbGFzcywgbnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJCi0JCUNsYXNzIHN1cGVyY2xhc3MgPSBjbGF6ei5nZXRTdXBlcmNsYXNzKCk7Ci0JCU1ldGhvZFtdIG1ldGhvZHMgPSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQkJaWYgKHRoaXMuY29kZVNuaXBwZXRDbGFzcyA9PSBudWxsKSB7Ci0JCQlpZiAoc3VwZXJjbGFzcy5lcXVhbHMoT2JqZWN0LmNsYXNzKSAmJiBjbGF6ei5nZXROYW1lKCkuZXF1YWxzKENPREVfU05JUFBFVF9DTEFTU19OQU1FKSkgewotCQkJCS8vIFRoZSBDb2RlU25pcHBldCBjbGFzcyBpcyBiZWluZyBkZXBsb3llZAotCQkJCXRoaXMuY29kZVNuaXBwZXRDbGFzcyA9IGNsYXp6OwotCQkJfSBlbHNlIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGVjdGluZyBDb2RlU25pcHBldCBjbGFzcyB0byBiZSBkZXBsb3llZCBmaXJzdCIpOwotCQkJfQotCQl9IGVsc2UgaWYgKHN1cGVyY2xhc3MuZXF1YWxzKHRoaXMuY29kZVNuaXBwZXRDbGFzcykpIHsKLQkJCS8vIEl0IG1heSBiZSBhIGNvZGUgc25pcHBldCBjbGFzcyB3aXRoIG5vIGdsb2JhbCB2YXJpYWJsZQotCQkJaWYgKG1ldGhvZHMubGVuZ3RoID09IDEgJiYgbWV0aG9kc1swXS5nZXROYW1lKCkuZXF1YWxzKFJVTl9NRVRIT0RfTkFNRSkpIHsKLQkJCQljb2RlU25pcHBldENsYXNzZXMuYWRkRWxlbWVudChjbGF6eik7Ci0JCQl9Ci0JCQkvLyBFdmFsdWF0ZSBnbG9iYWwgdmFyaWFibGVzIGFuZCBzZW5kIHJlc3VsdCBiYWNrCi0JCQlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGZpZWxkcy5sZW5ndGg7IGorKykgewotCQkJCUZpZWxkIGZpZWxkID0gZmllbGRzW2pdOwotCQkJCWlmIChNb2RpZmllci5pc1B1YmxpYyhmaWVsZC5nZXRNb2RpZmllcnMoKSkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXRoaXMuaWRlLnNlbmRSZXN1bHQoZmllbGQuZ2V0VHlwZSgpLCBmaWVsZC5nZXQobnVsbCkpOwotCQkJCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7IC8vIENhbm5vdCBoYXBwZW4gYmVjYXVzZSB0aGUgZmllbGQgaXMgcHVibGljCi0JCQkJCQl0aGlzLmlkZS5zZW5kUmVzdWx0KHZvaWQuY2xhc3MsIG51bGwpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAodGhpcy5jb2RlU25pcHBldENsYXNzLmVxdWFscyhzdXBlcmNsYXNzLmdldFN1cGVyY2xhc3MoKSkgJiYgbWV0aG9kcy5sZW5ndGggPT0gMSAmJiBtZXRob2RzWzBdLmdldE5hbWUoKS5lcXVhbHMoInJ1biIpKSB7Ci0JCQkvLyBJdCBpcyBhIGNvZGUgc25pcHBldCBjbGFzcyB3aXRoIGEgZ2xvYmFsIHZhcmlhYmxlIHN1cGVyY2xhc3MKLQkJCWNvZGVTbmlwcGV0Q2xhc3Nlcy5hZGRFbGVtZW50KGNsYXp6KTsKLQkJfQotCX0KLQotCS8vIHJ1biB0aGUgY29kZSBzbmlwcGV0IGNsYXNzZXMKLQlpZiAoY29kZVNuaXBwZXRDbGFzc2VzLnNpemUoKSAhPSAwICYmIG11c3RSdW4pIHsKLQkJZm9yIChFbnVtZXJhdGlvbiBlID0gY29kZVNuaXBwZXRDbGFzc2VzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlPYmplY3QgY29kZVNuaXBwZXQgPSB0aGlzLmNyZWF0ZUNvZGVTbmlwcGV0KChDbGFzcykgZS5uZXh0RWxlbWVudCgpKTsKLQkJCWlmIChjb2RlU25pcHBldCAhPSBudWxsKSB7Ci0JCQkJdGhpcy5ydW5Db2RlU25pcHBldChjb2RlU25pcHBldCk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0vKioKLSAqIFJ1bnMgdGhlIGdpdmVuIGNvZGUgc25pcHBldCBpbiBhIG5ldyB0aHJlYWQgYW5kIHNlbmQgdGhlIHJlc3VsdCBiYWNrIHRvIHRoZSBJREUuCi0gKi8KLXZvaWQgcnVuQ29kZVNuaXBwZXQoZmluYWwgT2JqZWN0IHNuaXBwZXQpIHsKLQlUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCgpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdHJ5IHsKLQkJCQl0cnkgewotCQkJCQlNZXRob2QgcnVuTWV0aG9kID0gY29kZVNuaXBwZXRDbGFzcy5nZXRNZXRob2QoUlVOX01FVEhPRF9OQU1FLCBuZXcgQ2xhc3NbXSB7fSk7Ci0JCQkJCXJ1bk1ldGhvZC5pbnZva2Uoc25pcHBldCwgbmV3IE9iamVjdFtdIHt9KTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlNZXRob2QgZ2V0UmVzdWx0VHlwZU1ldGhvZCA9IGNvZGVTbmlwcGV0Q2xhc3MuZ2V0TWV0aG9kKEdFVF9SRVNVTFRfVFlQRV9NRVRIT0RfTkFNRSwgbmV3IENsYXNzW10ge30pOwotCQkJCQlDbGFzcyByZXN1bHRUeXBlID0gKENsYXNzKWdldFJlc3VsdFR5cGVNZXRob2QuaW52b2tlKHNuaXBwZXQsIG5ldyBPYmplY3RbXSB7fSk7Ci0JCQkJCU1ldGhvZCBnZXRSZXN1bHRWYWx1ZU1ldGhvZCA9IGNvZGVTbmlwcGV0Q2xhc3MuZ2V0TWV0aG9kKEdFVF9SRVNVTFRfVkFMVUVfTUVUSE9EX05BTUUsIG5ldyBDbGFzc1tdIHt9KTsKLQkJCQkJT2JqZWN0IHJlc3VsdFZhbHVlID0gZ2V0UmVzdWx0VmFsdWVNZXRob2QuaW52b2tlKHNuaXBwZXQsIG5ldyBPYmplY3RbXSB7fSk7Ci0JCQkJCUNvZGVTbmlwcGV0UnVubmVyLnRoaXMuaWRlLnNlbmRSZXN1bHQocmVzdWx0VHlwZSwgcmVzdWx0VmFsdWUpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY29kZVNuaXBwZXRDbGFzcyA9ICIgKyBjb2RlU25pcHBldENsYXNzLmdldE5hbWUoKSk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJzbmlwcGV0LmNsYXNzID0gIiArIHNuaXBwZXQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQkJCUNsYXNzIHN1cGVyY2xhc3MgPSBzbmlwcGV0LmdldENsYXNzKCkuZ2V0U3VwZXJjbGFzcygpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic25pcHBldC5zdXBlcmNsYXNzID0gIiArIChzdXBlcmNsYXNzID09IG51bGwgPyAibnVsbCIgOiBzdXBlcmNsYXNzLmdldE5hbWUoKSkpOwotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQllLmdldFRhcmdldEV4Y2VwdGlvbigpLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfTsKLQl0aHJlYWQuc2V0RGFlbW9uKHRydWUpOwotCXRocmVhZC5zdGFydCgpOwotfQotLyoqCi0gKiBTdGFydHMgdGhpcyBjb2RlIHNuaXBwZXQgcnVubmVyIGluIGEgZGlmZmVyZW50IHRocmVhZC4KLSAqLwotcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0JVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQoIkNvZGUgc25pcHBldCBydW5uZXIiKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRyeSB7Ci0JCQkJaWRlLmNvbm5lY3QoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJd2hpbGUgKGlkZS5pc0Nvbm5lY3RlZCgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcHJvY2Vzc0NsYXNzZXMoaWRlLmdldFJ1bkZsYWcoKSwgaWRlLmdldE5leHRDbGFzc2VzKCkpOwotCQkJCX0gY2F0Y2ggKEVycm9yIGUpIHsKLQkJCQkJaWRlLnNlbmRSZXN1bHQodm9pZC5jbGFzcywgbnVsbCk7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlkZS5zZW5kUmVzdWx0KHZvaWQuY2xhc3MsIG51bGwpOwotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9OwotCXRocmVhZC5zdGFydCgpOwotfQotLyoqCi0gKiBTdG9wcyB0aGlzIGNvZGUgc25pcHBldCBydW5uZXIuCi0gKi8KLXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JdGhpcy5pZGUuZGlzY29ubmVjdCgpOwotfQotcHJpdmF0ZSBpbnQgdTFBdChpbnQgcG9zaXRpb24sIGJ5dGVbXSBieXRlcykgewotCXJldHVybiBieXRlc1twb3NpdGlvbl0gJiAweEZGOwotfQotcHJpdmF0ZSBpbnQgdTJBdChpbnQgcG9zaXRpb24sIGJ5dGVbXSBieXRlcykgewotCXJldHVybiAoKGJ5dGVzW3Bvc2l0aW9uKytdICYgMHhGRikgPDwgOCkgKyAoYnl0ZXNbcG9zaXRpb25dICYgMHhGRik7Ci19Ci1wcml2YXRlIGNoYXJbXSB1dGY4QXQoaW50IHJlYWRPZmZzZXQsIGludCBieXRlc0F2YWlsYWJsZSwgYnl0ZVtdIGJ5dGVzKSB7Ci0JaW50IHgsIHksIHo7Ci0JaW50IGxlbmd0aCA9IGJ5dGVzQXZhaWxhYmxlOwotCWNoYXIgb3V0cHV0QnVmW10gPSBuZXcgY2hhcltieXRlc0F2YWlsYWJsZV07Ci0JaW50IG91dHB1dFBvcyA9IDA7Ci0Jd2hpbGUgKGxlbmd0aCAhPSAwKSB7Ci0JCXggPSBieXRlc1tyZWFkT2Zmc2V0KytdICYgMHhGRjsKLQkJbGVuZ3RoLS07Ci0JCWlmICgoMHg4MCAmIHgpICE9IDApIHsKLQkJCXkgPSBieXRlc1tyZWFkT2Zmc2V0KytdICYgMHhGRjsKLQkJCWxlbmd0aC0tOwotCQkJaWYgKCh4ICYgMHgyMCkgIT0gMCkgewotCQkJCXogPSBieXRlc1tyZWFkT2Zmc2V0KytdICYgMHhGRjsKLQkJCQlsZW5ndGgtLTsKLQkJCQl4ID0gKCh4ICYgMHgxRikgPDwgMTIpICsgKCh5ICYgMHgzRikgPDwgNikgKyAoeiAmIDB4M0YpOwotCQkJfSBlbHNlIHsKLQkJCQl4ID0gKCh4ICYgMHgxRikgPDwgNikgKyAoeSAmIDB4M0YpOwotCQkJfQotCQl9Ci0JCW91dHB1dEJ1ZltvdXRwdXRQb3MrK10gPSAoY2hhcikgeDsKLQl9Ci0KLQlpZiAob3V0cHV0UG9zICE9IGJ5dGVzQXZhaWxhYmxlKSB7Ci0JCVN5c3RlbS5hcnJheWNvcHkob3V0cHV0QnVmLCAwLCAob3V0cHV0QnVmID0gbmV3IGNoYXJbb3V0cHV0UG9zXSksIDAsIG91dHB1dFBvcyk7Ci0JfQotCXJldHVybiBvdXRwdXRCdWY7Ci19Ci0vKioKLSAqIFdyaXRlcyB0aGUgZ2l2ZW4gY2xhc3MgZGVmaW5pdGlvbiBvbiBkaXNrLiBUaGUgZ2l2ZSBuYW1lIGlzIHRoZSBmb3J3YXJkIHNsYXNoIHNlcGFyYXRlZAotICogZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzLgotICovCi1wcml2YXRlIHZvaWQgd3JpdGVDbGFzc09uRGlzayhTdHJpbmcgY2xhc3NOYW1lLCBieXRlW10gY2xhc3NEZWZpbml0aW9uKSB7Ci0JdHJ5IHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gY2xhc3NOYW1lLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgIi5jbGFzcyI7Ci0JCUZpbGUgY2xhc3NGaWxlID0gbmV3IEZpbGUoCi0JCQkodGhpcy5ib290Y2xhc3NQYXRoRGlyZWN0b3J5ICE9IG51bGwgJiYgCi0JCQkoY2xhc3NOYW1lLnN0YXJ0c1dpdGgoImphdmEiKSB8fCBjbGFzc05hbWUucmVwbGFjZSgnLycsICcuJykuZXF1YWxzKENPREVfU05JUFBFVF9DTEFTU19OQU1FKSkpID8gCi0JCQkJdGhpcy5ib290Y2xhc3NQYXRoRGlyZWN0b3J5IDogCi0JCQkJdGhpcy5jbGFzc1BhdGhEaXJlY3RvcnksIGZpbGVOYW1lKTsKLQkJRmlsZSBwYXJlbnQgPSBuZXcgRmlsZShjbGFzc0ZpbGUuZ2V0UGFyZW50KCkpOwotCQlwYXJlbnQubWtkaXJzKCk7Ci0JCWlmICghcGFyZW50LmV4aXN0cygpKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgZGlyZWN0b3J5ICIgKyBwYXJlbnQuZ2V0UGF0aCgpKTsKLQkJfQotCQlGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShjbGFzc0ZpbGUpOwotCQkJb3V0LndyaXRlKGNsYXNzRGVmaW5pdGlvbik7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAob3V0ICE9IG51bGwpIHsKLQkJCQlvdXQuY2xvc2UoKTsKLQkJCX0KLQkJfQotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZXZhbC90YXJnZXQvSURFSW50ZXJmYWNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZXZhbC90YXJnZXQvSURFSW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZGM5ZmEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2V2YWwvdGFyZ2V0L0lERUludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuZXZhbC50YXJnZXQ7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLS8qKgotICogVGhlIGludGVyZmFjZSB0byB0aGUgSURFLiBXaGVuIGNvbm5lY3RlZCwgaXQgdXNlcyBUQ1AvSVAgc29ja2V0cwotICogdG8gZ2V0IGNvZGUgc25pcHBldCBjbGFzc2VzIGFuZCBnbG9iYWwgdmFyaWFibGUgY2xhc3NlcyBmcm9tIHRoZSBJREUuCi0gKiBJdCBzZW5kcyB0aGUgcmVzdWx0IG9mIHRoZSBldmFsdWF0aW9uIGJhY2sgdXNpbmcgdGhlIHNhbWUgc29ja2V0LgotICogPHA+Ci0gKiBUaGUgZm9ybWF0IGZyb20gdGhlIHNvY2tldCBpbnB1dCBzdHJlYW0gaXMgdGhlIGZvbGxvd2luZzoKLSAqIDxwcmU+Ci0gKgkJW3J1biBmbGFnOiBib29sZWFuIGNvZGVkIG9uIDEgYnl0ZV0KLSAqIAkJW251bWJlciBvZiBjbGFzcyBmaWxlczogaW50IGNvZGVkIG9uIDQgYnl0ZXNdCi0gKgkJKlsKLSAqCQkJW2xlbmd0aCBvZiBjbGFzcyBmaWxlOiBpbnQgY29kZWQgb24gNCBieXRlc10KLSAqICAgICAgCVtjbGFzcyBmaWxlOiBKYXZhIENsYXNzIGZpbGUgZm9ybWF0XQotICogICAgICAgXQotICogPC9wcmU+Ci0gKiBUaGlzIHNlcXVlbmNlIGlzIGluZmluaXRlbHkgcmVwZWF0ZWQgdW50aWwgdGhlIGlucHV0IHNvY2tldCBzdHJlYW0gaXMgY2xvc2VkLgotICogPHA+Ci0gKiBUaGUgZm9ybWF0IGZyb20gdGhlIHNvY2tldCBvdXRwdXQgc3RyZWFtIGlzIHRoZSBmb2xsb3dpbmc6Ci0gKiA8cHJlPgotICogCQlbaGFzIHJlc3VsdCBmbGFnOiAxIGlmIHRoZXJlIGlzIGEgcmVzdWx0LCAwIG90aGVyd2lzZV0KLSAqIAkJaWYgdGhlcmUgaXMgYSByZXN1bHQ6Ci0gKgkJW2Z1bGx5IHF1YWxpZmllZCB0eXBlIG5hbWUgb2YgcmVzdWx0OiB1dGY4IGVuY29kZWQgc3RyaW5nXQotICogICAgICBbdG9TdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgcmVzdWx0OiB1dGY4IGVuY29kZWQgc3RyaW5nXQotICogPC9wcmU+Ci0gKiBUaGlzIHNlcXVlbmNlIGlzIGluZmluaXRlbHkgcmVwZWF0ZWQgdW50aWwgdGhlIG91dHB1dCBzb2NrZXQgc3RyZWFtIGlzIGNsb3NlZC4KLSAqLwotcHVibGljIGNsYXNzIElERUludGVyZmFjZSB7Ci0JLyoqCi0JICogV2hldGhlciB0aW1pbmcgaW5mbyBzaG91bGQgYmUgcHJpbnRlZCB0byBzdGRvdXQKLQkgKi8KLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBUSU1JTkcgPSBmYWxzZTsKLQlsb25nIHN0YXJ0VGltZTsKLQotCWludCBwb3J0TnVtYmVyID0gMDsKLQlTb2NrZXQgc29ja2V0OwotLyoqCi0gKiBDcmVhdGVzIGEgbmV3IElERUludGVyZmFjZS4KLSAqLwotSURFSW50ZXJmYWNlKGludCBwb3J0TnVtYmVyKSB7Ci0JdGhpcy5wb3J0TnVtYmVyID0gcG9ydE51bWJlcjsKLX0KLS8qKgotICogV2FpdHMgZm9yIGEgY29ubmVjdGlvbiBmcm9tIHRoZSBpZGUgb24gdGhlIGdpdmVuIHBvcnQuCi0gKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBjb25uZWN0aW9uIGNvdWxkIG5vdCBiZSBlc3RhYmxpc2hlZC4KLSAqLwotdm9pZCBjb25uZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlTZXJ2ZXJTb2NrZXQgc2VydmVyID0gbmV3IFNlcnZlclNvY2tldCh0aGlzLnBvcnROdW1iZXIpOwotCXRoaXMuc29ja2V0ID0gc2VydmVyLmFjY2VwdCgpOwotCXRoaXMuc29ja2V0LnNldFRjcE5vRGVsYXkodHJ1ZSk7Ci0Jc2VydmVyLmNsb3NlKCk7Ci19Ci0vKioKLSAqIERpc2Nvbm5lY3RzIHRoaXMgaW50ZXJmYWNlIGZyb20gdGhlIElERS4KLSAqLwotdm9pZCBkaXNjb25uZWN0KCkgewotCWlmICh0aGlzLnNvY2tldCAhPSBudWxsKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLnNvY2tldC5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMikgewotCQkJLy8gSWdub3JlCi0JCX0KLQkJdGhpcy5zb2NrZXQgPSBudWxsOwotCX0KLX0KLS8qKgotICogUmV0dXJucyB0aGUgY2xhc3MgZGVmaW5pdGlvbnMgb2YgdGhlIGNsYXNzZXMgdGhhdCBjb21wb3NlIHRoZSBuZXh0IGNvZGUgc25pcHBldCB0byBldmFsdWF0ZS4KLSAqLwotcHJvdGVjdGVkIGJ5dGVbXVtdIGdldE5leHRDbGFzc2VzKCkgewotCWlmICh0aGlzLnNvY2tldCA9PSBudWxsKSB7Ci0JCXJldHVybiBuZXcgYnl0ZVswXVtdOwotCX0KLQlpZiAoVElNSU5HKSB7Ci0JCXRoaXMuc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JfQotCXRyeSB7Ci0JCURhdGFJbnB1dFN0cmVhbSBpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0odGhpcy5zb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0JCWludCBudW1iZXJPZkNsYXNzZXMgPSBpbi5yZWFkSW50KCk7Ci0JCWJ5dGVbXVtdIHJlc3VsdCA9IG5ldyBieXRlW251bWJlck9mQ2xhc3Nlc11bXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZkNsYXNzZXM7IGkrKykgewotCQkJaW50IGxlbmd0aE9mQ2xhc3NGaWxlID0gaW4ucmVhZEludCgpOwotCQkJYnl0ZVtdIGNsYXNzRmlsZSA9IG5ldyBieXRlW2xlbmd0aE9mQ2xhc3NGaWxlXTsKLQkJCWludCByZWFkID0gMDsKLQkJCXdoaWxlIChyZWFkIDwgbGVuZ3RoT2ZDbGFzc0ZpbGUgJiYgcmVhZCAhPSAtMSkgewotCQkJCXJlYWQgKz0gaW4ucmVhZChjbGFzc0ZpbGUsIHJlYWQsIGxlbmd0aE9mQ2xhc3NGaWxlIC0gcmVhZCk7Ci0JCQl9Ci0JCQlyZXN1bHRbaV0gPSBjbGFzc0ZpbGU7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCS8vIFRoZSBzb2NrZXQgaGFzIGxpa2VseSBiZWVuIGNsb3NlZCBvbiB0aGUgb3RoZXIgZW5kLCBjbG9zZSB0aGlzIGVuZCB0b28uCi0JCWRpc2Nvbm5lY3QoKTsKLQkJcmV0dXJuIG5ldyBieXRlWzBdW107Ci0JfQotfQotLyoqCi0gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvZGUgc25pcHBldCBjbGFzc2VzIHRoYXQgZm9sbG93IHNob3VsZCBiZSBydW4gb3IganVzdCBsb2FkZWQuCi0gKi8KLXByb3RlY3RlZCBib29sZWFuIGdldFJ1bkZsYWcoKSB7Ci0JaWYgKHRoaXMuc29ja2V0ID09IG51bGwpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlpZiAoVElNSU5HKSB7Ci0JCXRoaXMuc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JfQotCXRyeSB7Ci0JCURhdGFJbnB1dFN0cmVhbSBpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0odGhpcy5zb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0JCXJldHVybiBpbi5yZWFkQm9vbGVhbigpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJLy8gVGhlIHNvY2tldCBoYXMgbGlrZWx5IGJlZW4gY2xvc2VkIG9uIHRoZSBvdGhlciBlbmQsIGNsb3NlIHRoaXMgZW5kIHRvby4KLQkJZGlzY29ubmVjdCgpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQotLyoqCi0gKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBpbnRlcmZhY2UgaXMgY29ubmVjdGVkIHRvIHRoZSBJREUuCi0gKi8KLWJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7Ci0JcmV0dXJuIHRoaXMuc29ja2V0ICE9IG51bGw7Ci19Ci0vKioKLSAqIFNlbmRzIHRoZSByZXN1bHQgb2YgdGhlIGV2YWx1YXRpb24gdG8gdGhlIElERS4KLSAqLwotcHJvdGVjdGVkIHZvaWQgc2VuZFJlc3VsdChDbGFzcyByZXN1bHRUeXBlLCBPYmplY3QgcmVzdWx0VmFsdWUpIHsKLQlpZiAodGhpcy5zb2NrZXQgPT0gbnVsbCkgewotCQlyZXR1cm47Ci0JfQotCXRyeSB7Ci0JCURhdGFPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0odGhpcy5zb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCkpOwotCQlpZiAocmVzdWx0VHlwZSA9PSB2b2lkLmNsYXNzKSB7Ci0JCQlvdXQud3JpdGVCb29sZWFuKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCW91dC53cml0ZUJvb2xlYW4odHJ1ZSk7Ci0JCQlvdXQud3JpdGVVVEYocmVzdWx0VHlwZS5pc1ByaW1pdGl2ZSgpID8gcmVzdWx0VHlwZS50b1N0cmluZygpIDogcmVzdWx0VHlwZS5nZXROYW1lKCkpOwotCQkJb3V0LndyaXRlVVRGKHJlc3VsdFZhbHVlID09IG51bGwgPyAibnVsbCIgOiByZXN1bHRWYWx1ZS50b1N0cmluZygpKTsKLQkJfQotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJLy8gVGhlIHNvY2tldCBoYXMgbGlrZWx5IGJlZW4gY2xvc2VkIG9uIHRoZSBvdGhlciBlbmQsIGRpc2Nvbm5lY3QgdGhpcyBlbmQgdG9vCi0JCWRpc2Nvbm5lY3QoKTsKLQl9Ci0JaWYgKFRJTUlORykgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRpbWUgdG8gcnVuIG9uIHRhcmdldCBpcyAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGhpcy5zdGFydFRpbWUpICsgIm1zIik7Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2p1bml0L2V4dGVuc2lvbi9FeGNsdWRlZFRlc3RTdWl0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2p1bml0L2V4dGVuc2lvbi9FeGNsdWRlZFRlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWFiZTBhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9qdW5pdC9leHRlbnNpb24vRXhjbHVkZWRUZXN0U3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuanVuaXQuZXh0ZW5zaW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1wdWJsaWMgY2xhc3MgRXhjbHVkZWRUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCVN0cmluZ1tdIGV4Y2x1ZGVkVGVzdHMgPSBudWxsOwotLyoqCi0gKiBDcmVhdGVzIGEgbmV3IHRlc3Qgc3VpdGUgYnkgZXhjbHVkaW5nIHRoZSBnaXZlbiB0ZXN0cwotICogZnJvbSB0aGUgZ2l2ZW4gdGVzdCBzdWl0ZS4KLSAqLwotcHVibGljIEV4Y2x1ZGVkVGVzdFN1aXRlKFRlc3Qgc3VpdGUsIFN0cmluZ1tdIGV4Y2x1ZGVkVGVzdHMpIHsKLQl0aGlzLmV4Y2x1ZGVkVGVzdHMgPSBleGNsdWRlZFRlc3RzOwotCXRoaXMuYWRkVGVzdChzdWl0ZSk7Ci19Ci0vKioKLSAqIEFkZHMgYSB0ZXN0IHRvIHRoZSBzdWl0ZS4KLSAqLwotcHVibGljIHZvaWQgYWRkVGVzdChUZXN0IHRlc3QpIHsKLQlpZiAodGVzdCBpbnN0YW5jZW9mIFRlc3RDYXNlKSB7Ci0JCWlmICghaXNFeGNsdWRlZCgoVGVzdENhc2UpdGVzdCkpIHsKLQkJCXN1cGVyLmFkZFRlc3QodGVzdCk7Ci0JCX0KLQl9IGVsc2UgaWYgKHRlc3QgaW5zdGFuY2VvZiBUZXN0U3VpdGUpIHsKLQkJamF2YS51dGlsLkVudW1lcmF0aW9uIGVudW0gPSAoKFRlc3RTdWl0ZSl0ZXN0KS50ZXN0cygpOwotCQl3aGlsZSAoZW51bS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJdGhpcy5hZGRUZXN0KChUZXN0KWVudW0ubmV4dEVsZW1lbnQoKSk7Ci0JCX0KLQl9Ci19Ci0vKioKLSAqIFJldHVybnMgd2hldGhlciB0aGUgdGVzdCBpcyBleGNsdWRlZC4KLSAqLwotcHVibGljIGJvb2xlYW4gaXNFeGNsdWRlZChUZXN0Q2FzZSB0ZXN0KSB7Ci0JaWYgKHRoaXMuZXhjbHVkZWRUZXN0cyA9PSBudWxsKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmV4Y2x1ZGVkVGVzdHMubGVuZ3RoOyBpICs9IDIpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IHRoaXMuZXhjbHVkZWRUZXN0c1tpXTsKLQkJU3RyaW5nIG1ldGhvZE5hbWUgPSB0aGlzLmV4Y2x1ZGVkVGVzdHNbaSsxXTsKLQkJaWYgKHRlc3QuZ2V0TmFtZSgpLmVxdWFscyhtZXRob2ROYW1lKSAmJgotCQkJdGVzdC5nZXRDbGFzcygpLmdldE5hbWUoKS5lbmRzV2l0aChjbGFzc05hbWUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2p1bml0L2V4dGVuc2lvbi9TdG9wYWJsZVRlc3RDYXNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvanVuaXQvZXh0ZW5zaW9uL1N0b3BhYmxlVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NiNWEyYi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvanVuaXQvZXh0ZW5zaW9uL1N0b3BhYmxlVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuanVuaXQuZXh0ZW5zaW9uOwotCi0vKioKLSAqIEEgdGVzdCBjYXNlIHRoYXQgaXMgYmVpbmcgc2VudCBzdG9wKCkgd2hlbiB0aGUgdXNlciBwcmVzc2VzICdTdG9wJyBvciAnRXhpdCcuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdG9wYWJsZVRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgewotcHVibGljIFN0b3BhYmxlVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLS8qKgotICogRGVmYXVsdCBpcyB0byBkbyBub3RoaW5nLgotICovCi1wdWJsaWMgdm9pZCBzdG9wKCkgewotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2p1bml0L2V4dGVuc2lvbi9UZXN0Q2FzZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2p1bml0L2V4dGVuc2lvbi9UZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTYzZGM4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9qdW5pdC9leHRlbnNpb24vVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuanVuaXQuZXh0ZW5zaW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkNvbXBhcmlzb25GYWlsdXJlOwotCi1wdWJsaWMgY2xhc3MgVGVzdENhc2UgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewotCXB1YmxpYyBUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci1wdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIGFjdHVhbCkgewotICAgIGFzc2VydEVxdWFscyhudWxsLCBleHBlY3RlZCwgYWN0dWFsKTsKLX0KLXB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIGFjdHVhbCkgewotCWlmIChleHBlY3RlZCA9PSBudWxsICYmIGFjdHVhbCA9PSBudWxsKQotCQlyZXR1cm47Ci0JaWYgKGV4cGVjdGVkICE9IG51bGwgJiYgZXhwZWN0ZWQuZXF1YWxzKGFjdHVhbCkpCi0JCXJldHVybjsKLQlTdHJpbmcgZm9ybWF0dGVkOwotCWlmIChtZXNzYWdlICE9IG51bGwpIHsKLQkJZm9ybWF0dGVkID0gbWVzc2FnZSsiLiI7IC8vJE5PTi1OTFMtMSQKLQl9IGVsc2UgewotCQlmb3JtYXR0ZWQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQlleHBlY3RlZCA9IGV4cGVjdGVkID09IG51bGwgPyBudWxsIDogc2hvd0xpbmVTZXBhcmF0b3JzKGV4cGVjdGVkKTsKLQlhY3R1YWwgPSBhY3R1YWwgPT0gbnVsbCA/IG51bGwgOiBzaG93TGluZVNlcGFyYXRvcnMoYWN0dWFsKTsKLQlmb3JtYXR0ZWQgPSAKLQkJZm9ybWF0dGVkCi0JCSsgIlxuLS0tLS0tLS0tLS0gRXhwZWN0ZWQgLS0tLS0tLS0tLS0tXG4iIC8vJE5PTi1OTFMtMSQKLQkJKyBleHBlY3RlZAotCQkrICJcbi0tLS0tLS0tLS0tLSBidXQgd2FzIC0tLS0tLS0tLS0tLVxuIiAvLyROT04tTkxTLTEkCi0JCSsgYWN0dWFsCi0JCSsgIlxuLS0tLS0tLS0tIERpZmZlcmVuY2UgaXMgLS0tLS0tLS0tLVxuIiAvLyROT04tTkxTLTEkCi0JCSsgbmV3IENvbXBhcmlzb25GYWlsdXJlKG51bGwsIGV4cGVjdGVkLCBhY3R1YWwpLmdldE1lc3NhZ2UoKTsKLQlmYWlsKGZvcm1hdHRlZCk7Ci19Ci0vKgotICogU2hvd3MgdGhlIGxpbmUgc2VwYXJhdG9ycyBpbiB0aGUgZ2l2ZW4gU3RyaW5nLgotICovCi1wcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBzaG93TGluZVNlcGFyYXRvcnMoU3RyaW5nIHN0cmluZykgewotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JaW50IGxlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCWNoYXIgY2FyID0gc3RyaW5nLmNoYXJBdChpKTsKLQkJc3dpdGNoIChjYXIpIHsKLQkJCWNhc2UgJ1xuJzogCi0JCQkJYnVmZmVyLmFwcGVuZCgiXFxuXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXHInOgotCQkJCWlmIChpIDwgbGVuZ3RoLTEgJiYgc3RyaW5nLmNoYXJBdChpKzEpID09ICdcbicpIHsKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXFxyXFxuXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpKys7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXFxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJYnVmZmVyLmFwcGVuZChjYXIpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9qdW5pdC9leHRlbnNpb24vVGVzdExpc3RlbmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvanVuaXQvZXh0ZW5zaW9uL1Rlc3RMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDgwMmM1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9qdW5pdC9leHRlbnNpb24vVGVzdExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmp1bml0LmV4dGVuc2lvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0RmFpbHVyZTsKLS8qKgotICogQSBMaXN0ZW5lciBmb3IgdGVzdCBwcm9ncmVzcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRlc3RMaXN0ZW5lciBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0TGlzdGVuZXIgewotICAgLyoqCi0gCSogQW4gZXJyb3Igb2NjdXJyZWQuCi0gCSovCi0JcHVibGljIHZvaWQgYWRkRXJyb3IoVGVzdCB0ZXN0LCBUZXN0RmFpbHVyZSB0ZXN0RmFpbHVyZSk7Ci0gICAvKioKLSAJKiBBIGZhaWx1cmUgb2NjdXJyZWQuCi0gCSovCi0gCXB1YmxpYyB2b2lkIGFkZEZhaWx1cmUoVGVzdCB0ZXN0LCBUZXN0RmFpbHVyZSB0ZXN0RmFpbHVyZSk7IAotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2p1bml0L2V4dGVuc2lvbi9UZXN0UmVzdWx0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvanVuaXQvZXh0ZW5zaW9uL1Rlc3RSZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGExMDkxYS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvanVuaXQvZXh0ZW5zaW9uL1Rlc3RSZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuanVuaXQuZXh0ZW5zaW9uOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0UmVzdWx0IGV4dGVuZHMganVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQgewotCVRlc3RDYXNlIGN1cnJlbnRUZXN0OwotLyoqCi0gKiBUZXN0UmVzdWx0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBUZXN0UmVzdWx0KCkgewotCXN1cGVyKCk7Ci19Ci0JLyoqCi0JICogQWRkcyBhbiBlcnJvciB0byB0aGUgbGlzdCBvZiBlcnJvcnMuIFRoZSBwYXNzZWQgaW4gZXhjZXB0aW9uCi0JICogY2F1c2VkIHRoZSBlcnJvci4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkRXJyb3IoVGVzdCB0ZXN0LCBUaHJvd2FibGUgdCkgewotCQlUZXN0RmFpbHVyZSB0ZXN0RmFpbHVyZT0gbmV3IFRlc3RGYWlsdXJlKHRlc3QsIHQpOwotCQlmRXJyb3JzLmFkZEVsZW1lbnQodGVzdEZhaWx1cmUpOwotCQlmb3IgKEVudW1lcmF0aW9uIGU9IGNsb25lTGlzdGVuZXJzKCkuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTsgKSB7Ci0JCQkoKFRlc3RMaXN0ZW5lcillLm5leHRFbGVtZW50KCkpLmFkZEVycm9yKHRlc3QsIHRlc3RGYWlsdXJlKTsKLQkJfQotCX0KLQkvKioKLQkgKiBBZGRzIGEgZmFpbHVyZSB0byB0aGUgbGlzdCBvZiBmYWlsdXJlcy4gVGhlIHBhc3NlZCBpbiBleGNlcHRpb24KLQkgKiBjYXVzZWQgdGhlIGZhaWx1cmUuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZEZhaWx1cmUoVGVzdCB0ZXN0LCBBc3NlcnRpb25GYWlsZWRFcnJvciB0KSB7Ci0JCVRlc3RGYWlsdXJlIHRlc3RGYWlsdXJlPSBuZXcgVGVzdEZhaWx1cmUodGVzdCwgdCk7Ci0JCWZGYWlsdXJlcy5hZGRFbGVtZW50KHRlc3RGYWlsdXJlKTsKLQkJZm9yIChFbnVtZXJhdGlvbiBlPSBjbG9uZUxpc3RlbmVycygpLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7ICkgewotCQkJKChUZXN0TGlzdGVuZXIpZS5uZXh0RWxlbWVudCgpKS5hZGRGYWlsdXJlKHRlc3QsIHRlc3RGYWlsdXJlKTsKLQkJfQotCX0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgbGlzdGVuZXJzLgotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIFZlY3RvciBjbG9uZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuIChWZWN0b3IpZkxpc3RlbmVycy5jbG9uZSgpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBydW4oZmluYWwgVGVzdENhc2UgdGVzdCkgewotCQl0aGlzLmN1cnJlbnRUZXN0ID0gdGVzdDsKLQkJc3VwZXIucnVuKHRlc3QpOwotCQl0aGlzLmN1cnJlbnRUZXN0ID0gbnVsbDsKLQl9Ci1wdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHsKLQlzdXBlci5zdG9wKCk7Ci0JaWYgKHRoaXMuY3VycmVudFRlc3QgIT0gbnVsbCAmJiB0aGlzLmN1cnJlbnRUZXN0IGluc3RhbmNlb2YgU3RvcGFibGVUZXN0Q2FzZSkgewotCQkoKFN0b3BhYmxlVGVzdENhc2UpdGhpcy5jdXJyZW50VGVzdCkuc3RvcCgpOwotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ydW50aW1lL0Fic3RyYWN0UmVhZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcnVudGltZS9BYnN0cmFjdFJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjFjNDQxLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ydW50aW1lL0Fic3RyYWN0UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLnJ1bnRpbWU7Ci0KLS8qKgotICogQW4gYWJzdHJhY3QgcmVhZGVyIHRoYXQgY29udGludW91c2x5IHJlYWRzLgotICovCi0KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBBYnN0cmFjdFJlYWRlciB7Ci0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCXByb3RlY3RlZCBUaHJlYWQgcmVhZGVyVGhyZWFkOwotCXByb3RlY3RlZCBib29sZWFuIGlzU3RvcHBpbmc9IGZhbHNlOwotLyoKLSAqIENyZWF0ZXMgYSBuZXcgcmVhZGVyIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gKi8KLXB1YmxpYyBBYnN0cmFjdFJlYWRlcihTdHJpbmcgbmFtZSkgewotCXRoaXMubmFtZSA9IG5hbWU7Ci19Ci0vKioKLSAqIENvbnRpbnVvdXNseSByZWFkcy4gTm90ZSB0aGF0IGlmIHRoZSByZWFkIGludm9sdmVzIHdhaXRpbmcKLSAqIGl0IGNhbiBiZSBpbnRlcnJ1cHRlZCBhbmQgYSBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAqLwotYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgcmVhZGVyTG9vcCgpOwotLyoqCi0gKiBTdGFydCB0aGUgdGhyZWFkIHRoYXQgcmVhZHMgZXZlbnRzLgotICogCi0gKi8KLXB1YmxpYyB2b2lkIHN0YXJ0KCkgewotCXRoaXMucmVhZGVyVGhyZWFkID0gbmV3IFRocmVhZCgKLQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuICgpIHsKLQkJCQlyZWFkZXJMb29wKCk7Ci0JCQl9Ci0JCX0sCi0JCUFic3RyYWN0UmVhZGVyLnRoaXMubmFtZSk7Ci0JdGhpcy5yZWFkZXJUaHJlYWQuc3RhcnQoKTsKLX0KLS8qKgotICogVGVsbHMgdGhlIHJlYWRlciBsb29wIHRoYXQgaXQgc2hvdWxkIHN0b3AuCi0gKi8KLXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JdGhpcy5pc1N0b3BwaW5nPSB0cnVlOwotCWlmICh0aGlzLnJlYWRlclRocmVhZCAhPSBudWxsKQotCQl0aGlzLnJlYWRlclRocmVhZC5pbnRlcnJ1cHQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ydW50aW1lL0o5Vk1MYXVuY2hlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3J1bnRpbWUvSjlWTUxhdW5jaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZmVkOWIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3J1bnRpbWUvSjlWTUxhdW5jaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5ydW50aW1lOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLnV0aWwuVXRpbDsKLQotLyoqCi0gKiBBIEo5IFZNIGxhdW5jaGVyIGxhdW5jaGVzIGFuIGV4dGVybmFsIEo5IFZNIChhbmQgSjkgUHJveHkgaWYgbmVlZGVkKSB3aXRoCi0gKiB0aGUgZ2l2ZW4gYXJndW1lbnRzIG9uIHRoZSBzYW1lIG1hY2hpbmUuCi0gKiA8cD4KLSAqIFVubGlrZSB3aXRoIHRoZSA8Y29kZT5TdGFuZGFyZFZNTGF1bmNoZXI8L2NvZGU+LCBhIGRlYnVnZ2VyIHdvdWxkIGhhdmUgdG8KLSAqIGNvbm5lY3QgdG8gdGhlIEo5IFByb3h5IGluc3RlYWQgb2YgY29ubmVjdGluZyB0byB0aGUgVk0gZGlyZWN0bHkuIEluIHRoaXMgY2FzZSwKLSAqIHRoZSBQcm94eSBwb3J0IGlzIHRoZSBzcGVjaWZpZWQgZGVidWcgcG9ydC4gTm90ZSB0aGF0IGFuIGludGVybmFsIGRlYnVnIHBvcnQKLSAqIG11c3QgYWxzbyBiZSBzcGVjaWZpZWQuIFRoaXMgcG9ydCBpcyB1c2VkIGZvciB0aGUgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZQotICogUHJveHkgYW5kIHRoZSBWTS4KLSAqLwotcHVibGljIGNsYXNzIEo5Vk1MYXVuY2hlciBleHRlbmRzIExvY2FsVk1MYXVuY2hlciBpbXBsZW1lbnRzIFJ1bnRpbWVDb25zdGFudHMgewotCWludCBpbnRlcm5hbERlYnVnUG9ydCA9IC0xOwotCVN0cmluZyBwcm94eU91dEZpbGU7Ci0JU3RyaW5nIHN5bWJvbFBhdGg7Ci0vKioKLSAqIENyZWF0ZXMgYSBuZXcgSjlWTUxhdW5jaGVyIHRoYXQgbGF1bmNoZXMgYSBKOSBWTQotICogKGFuZCBKOSBQcm94eSBpZiBuZWVkZWQpIG9uIHRoZSBzYW1lIG1hY2hpbmUuCi0gKi8KLXB1YmxpYyBKOVZNTGF1bmNoZXIoKSB7Ci0Jc3VwZXIoKTsKLX0KLS8qKgotICogQnVpbGRzIHRoZSBhY3R1YWwgYm9vdCBjbGFzcyBwYXRoIHRoYXQgaXMgZ29pbmcgdG8gYmUgcGFzc2VkIHRvIHRoZSBWTS4KLSAqLwotcHJvdGVjdGVkIFN0cmluZyBidWlsZEJvb3RDbGFzc1BhdGgoKSB7Ci0JU3RyaW5nQnVmZmVyIGJvb3RQYXRoU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCWNoYXIgcGF0aFNlcGFyYXRvciA9IEZpbGUucGF0aFNlcGFyYXRvckNoYXI7Ci0JCi0JaWYgKHRoaXMuYm9vdFBhdGggIT0gbnVsbCkgewotCQkvLyBBZGQgYm9vdCBjbGFzcyBwYXRoIGdpdmVuIGJ5IGNsaWVudAotCQlpbnQgbGVuZ3RoID0gdGhpcy5ib290UGF0aC5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspewotCQkJYm9vdFBhdGhTdHJpbmcuYXBwZW5kKHRoaXMuYm9vdFBhdGhbaV0pOwotCQkJYm9vdFBhdGhTdHJpbmcuYXBwZW5kKHBhdGhTZXBhcmF0b3IpOwotCQl9Ci0JfSBlbHNlIHsKLQkJLy8gQWRkIHJlZ3VsYXIgY2xhc3Nlcy56aXAKLQkJYm9vdFBhdGhTdHJpbmcuYXBwZW5kKHRoaXMudm1QYXRoKTsKLQkJYm9vdFBhdGhTdHJpbmcuYXBwZW5kKEZpbGUuc2VwYXJhdG9yKTsKLQkJYm9vdFBhdGhTdHJpbmcuYXBwZW5kKCJsaWIiKTsKLQkJYm9vdFBhdGhTdHJpbmcuYXBwZW5kKEZpbGUuc2VwYXJhdG9yKTsKLQkJYm9vdFBhdGhTdHJpbmcuYXBwZW5kKCJqY2xNYXgiKTsKLQkJYm9vdFBhdGhTdHJpbmcuYXBwZW5kKEZpbGUuc2VwYXJhdG9yKTsKLQkJYm9vdFBhdGhTdHJpbmcuYXBwZW5kKCJjbGFzc2VzLnppcCIpOwotCQlib290UGF0aFN0cmluZy5hcHBlbmQocGF0aFNlcGFyYXRvcik7Ci0JfQotCQotCS8vIEFkZCBib290IGNsYXNzIHBhdGggZGlyZWN0b3J5IGlmIG5lZWRlZAotCWlmICh0aGlzLmV2YWxUYXJnZXRQYXRoICE9IG51bGwgJiYgVEFSR0VUX0hBU19GSUxFX1NZU1RFTSkgewotCQlib290UGF0aFN0cmluZy5hcHBlbmQodGhpcy5ldmFsVGFyZ2V0UGF0aCk7Ci0JCWJvb3RQYXRoU3RyaW5nLmFwcGVuZChGaWxlLnNlcGFyYXRvckNoYXIpOwotCQlib290UGF0aFN0cmluZy5hcHBlbmQoQk9PVF9DTEFTU1BBVEhfRElSRUNUT1JZKTsKLQl9Ci0KLQlyZXR1cm4gYm9vdFBhdGhTdHJpbmcudG9TdHJpbmcoKTsKLX0KLS8qKgotICogQHNlZSBMb2NhbFZNTGF1bmNoZXIjZXhlY0NvbW1hbmRMaW5lCi0gKi8KLXByb3RlY3RlZCBQcm9jZXNzIGV4ZWNDb21tYW5kTGluZSgpIHRocm93cyBUYXJnZXRFeGNlcHRpb24gewotCS8vIENoZWNrIHRoYXQgdGhlIGludGVybmFsIGRlYnVnIHBvcnQgaGFzIGJlZW4gc3BlY2lmaWVkIGlmIGluIGRlYnVnIG1vZGUKLQlpZiAodGhpcy5kZWJ1Z1BvcnQgIT0gLTEgJiYgdGhpcy5pbnRlcm5hbERlYnVnUG9ydCA9PSAtMSkgewotCQl0aHJvdyBuZXcgVGFyZ2V0RXhjZXB0aW9uKCJJbnRlcm5hbCBkZWJ1ZyBwb3J0IGhhcyBub3QgYmVlbiBzcGVjaWZpZWQiKTsKLQl9Ci0KLQlyZXR1cm4gc3VwZXIuZXhlY0NvbW1hbmRMaW5lKCk7Ci19Ci0vKioKLSAqIEBzZWUgTG9jYWxWTUxhdW5jaGVyI2dldENvbW1hbmRMaW5lCi0gKi8KLXB1YmxpYyBTdHJpbmdbXSBnZXRDb21tYW5kTGluZSgpIHsJCi0JVmVjdG9yIGNvbW1hbmRMaW5lID0gbmV3IFZlY3RvcigpOwotCQotCS8vIFZNIGJpbmFyeQotCWNvbW1hbmRMaW5lLmFkZEVsZW1lbnQoCi0JCXRoaXMudm1QYXRoICsgCi0JCSh0aGlzLnZtUGF0aC5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikgPyAiIiA6IEZpbGUuc2VwYXJhdG9yKSArIAotCQkiYmluIiArIAotCQlGaWxlLnNlcGFyYXRvciArIAotCQkiajkiKTsKLQotCS8vIFZNIGFyZ3VtZW50cwotCWlmICh0aGlzLnZtQXJndW1lbnRzICE9IG51bGwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnZtQXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQljb21tYW5kTGluZS5hZGRFbGVtZW50KHRoaXMudm1Bcmd1bWVudHNbaV0pOwotCQl9Ci0JfQotCi0JLy8gZGVidWcgbW9kZQotCWlmICh0aGlzLmRlYnVnUG9ydCAhPSAtMSAmJiB0aGlzLmludGVybmFsRGVidWdQb3J0ICE9IC0xKSB7Ci0JCWNvbW1hbmRMaW5lLmFkZEVsZW1lbnQoIi1kZWJ1ZzoiICsgdGhpcy5pbnRlcm5hbERlYnVnUG9ydCk7Ci0JfQotCi0JLy8gYm9vdCBjbGFzcyBwYXRoCi0JY29tbWFuZExpbmUuYWRkRWxlbWVudCgiLVhib290Y2xhc3NwYXRoOiIgKyBidWlsZEJvb3RDbGFzc1BhdGgoKSk7Ci0KLQkvLyByZWd1bGFyIGNsYXNzIHBhdGgKLQljb21tYW5kTGluZS5hZGRFbGVtZW50KCItY2xhc3NwYXRoIik7Ci0JY29tbWFuZExpbmUuYWRkRWxlbWVudChidWlsZENsYXNzUGF0aCgpKTsKLQkKLQkvLyBjb2RlIHNuaXBwZXQgcnVubmVyIGNsYXNzCi0JaWYgKHRoaXMuZXZhbFBvcnQgIT0gLTEpIHsKLQkJY29tbWFuZExpbmUuYWRkRWxlbWVudChDT0RFX1NOSVBQRVRfUlVOTkVSX0NMQVNTX05BTUUpOwotCX0KLQkKLQkvLyBjb2RlIHNuaXBwZXQgcnVubmVyIGFyZ3VtZW50cwotCWlmICh0aGlzLmV2YWxQb3J0ICE9IC0xKSB7Ci0JCWNvbW1hbmRMaW5lLmFkZEVsZW1lbnQoRVZBTFBPUlRfQVJHKTsKLQkJY29tbWFuZExpbmUuYWRkRWxlbWVudChJbnRlZ2VyLnRvU3RyaW5nKHRoaXMuZXZhbFBvcnQpKTsKLQkJaWYgKFRBUkdFVF9IQVNfRklMRV9TWVNURU0pIHsKLQkJCWNvbW1hbmRMaW5lLmFkZEVsZW1lbnQoQ09ERVNOSVBQRVRfQ0xBU1NQQVRIX0FSRyk7Ci0JCQljb21tYW5kTGluZS5hZGRFbGVtZW50KHRoaXMuZXZhbFRhcmdldFBhdGggKyBGaWxlLnNlcGFyYXRvciArIFJFR1VMQVJfQ0xBU1NQQVRIX0RJUkVDVE9SWSk7Ci0JCQljb21tYW5kTGluZS5hZGRFbGVtZW50KENPREVTTklQUEVUX0JPT1RQQVRIX0FSRyk7Ci0JCQljb21tYW5kTGluZS5hZGRFbGVtZW50KHRoaXMuZXZhbFRhcmdldFBhdGggKyBGaWxlLnNlcGFyYXRvciArIEJPT1RfQ0xBU1NQQVRIX0RJUkVDVE9SWSk7Ci0JCX0KLQl9Ci0JCi0JLy8gcHJvZ3JhbSBjbGFzcwotCWlmICh0aGlzLnByb2dyYW1DbGFzcyAhPSBudWxsKSB7Ci0JCWNvbW1hbmRMaW5lLmFkZEVsZW1lbnQodGhpcy5wcm9ncmFtQ2xhc3MpOwotCX0KLQkKLQkvLyBwcm9ncmFtIGFyZ3VtZW50cwotCWlmICh0aGlzLnByb2dyYW1Bcmd1bWVudHMgIT0gbnVsbCkgewotCQlmb3IgKGludCBpPTA7aTx0aGlzLnByb2dyYW1Bcmd1bWVudHMubGVuZ3RoO2krKykgewotCQkJY29tbWFuZExpbmUuYWRkRWxlbWVudCh0aGlzLnByb2dyYW1Bcmd1bWVudHNbaV0pOwotCQl9Ci0JfQotCi0JU3RyaW5nW10gcmVzdWx0PSBuZXcgU3RyaW5nW2NvbW1hbmRMaW5lLnNpemUoKV07Ci0JY29tbWFuZExpbmUuY29weUludG8ocmVzdWx0KTsKLQotCS8vIGNoZWNrIGZvciBzcGFjZXMgaW4gcmVzdWx0Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHsKLQkJU3RyaW5nIGFyZ3VtZW50ID0gcmVzdWx0W2ldOwotCQlpZiAoYXJndW1lbnQuaW5kZXhPZignICcpICE9IC0xKSB7Ci0JCQlyZXN1bHRbaV0gPSAiXCIiICsgYXJndW1lbnQgKyAiXCIiOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgZGVidWcgcG9ydCB0aGUgSjkgUHJveHkgdXNlcyB0byBjb25uZWN0IHRvIHRoZSBKOSBWTS4gCi0gKiBUaGUgdmFsdWUgaXMgdW5zcGVjaWZpZWQgaWYgZGVidWcgbW9kZSBpcyBkaXNhYmxlZC4KLSAqIE5vdGUgdGhhdCB0aGUgcmVndWxhciBkZWJ1ZyBwb3J0IGlzIHRoZSBwb3J0IHVzZWQgdG8gY29ubmVjdCB0aGUgSjkgUHJveHkgYW5kIAotICogdGhlIElERSBpbiB0aGUgY2FzZSBvZiB0aGUgSjkgVk0gTGF1bmNoZXIuCi0gKi8KLXB1YmxpYyBpbnQgZ2V0SW50ZXJuYWxEZWJ1Z1BvcnQoKSB7Ci0JcmV0dXJuIHRoaXMuaW50ZXJuYWxEZWJ1Z1BvcnQ7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIGNvbW1hbmQgbGluZSB3aGljaCB3aWxsIGJlIHVzZWQgdG8gbGF1bmNoIHRoZSBQcm94eS4gCi0gKi8KLXB1YmxpYyBTdHJpbmdbXSBnZXRQcm94eUNvbW1hbmRMaW5lKCkgewkKLQlWZWN0b3IgY29tbWFuZExpbmUgPSBuZXcgVmVjdG9yKCk7Ci0JCi0JLy8gUHJveHkgYmluYXJ5Ci0JY29tbWFuZExpbmUuYWRkRWxlbWVudCgKLQkJdGhpcy52bVBhdGggKyAKLQkJKHRoaXMudm1QYXRoLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSA/ICIiIDogRmlsZS5zZXBhcmF0b3IpICsgCi0JCSJiaW4iICsgCi0JCUZpbGUuc2VwYXJhdG9yICsgCi0JCSJqOXByb3h5Iik7Ci0KLQkvLyBBcmd1bWVudHMKLQljb21tYW5kTGluZS5hZGRFbGVtZW50KGdldFRhcmdldEFkZHJlc3MoKSArICI6IiArIHRoaXMuaW50ZXJuYWxEZWJ1Z1BvcnQpOwotCWNvbW1hbmRMaW5lLmFkZEVsZW1lbnQoSW50ZWdlci50b1N0cmluZyh0aGlzLmRlYnVnUG9ydCkpOwotCWlmICh0aGlzLnN5bWJvbFBhdGggIT0gbnVsbCAmJiB0aGlzLnN5bWJvbFBhdGggIT0gIiIpIHsKLQkJY29tbWFuZExpbmUuYWRkRWxlbWVudCh0aGlzLnN5bWJvbFBhdGgpOwotCX0KLQkKLQlTdHJpbmdbXSByZXN1bHQ9IG5ldyBTdHJpbmdbY29tbWFuZExpbmUuc2l6ZSgpXTsKLQljb21tYW5kTGluZS5jb3B5SW50byhyZXN1bHQpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIGZ1bGwgcGF0aCBuYW1lIHRvIHRoZSBmaWxlIHdoZXJlIHRoZSBwcm94eSBvdXRwdXQgaXMgcmVkaXJlY3RlZC4KLSAqIFJldHVybnMgImNvbiIgaWYgdGhlIHByb3h5IG91dHB1dCBpcyByZWRpcmVjdGVkIHRvIHRoZSBzdGRvdXQuCi0gKiBSZXR1cm5zIG51bGwgaWYgdGhlIHByb3h5IG91dHB1dCBpcyBub3QgcmVkaXJlY3RlZC4KLSAqLwotcHVibGljIFN0cmluZyBnZXRQcm94eU91dEZpbGUoKSB7Ci0JcmV0dXJuIHRoaXMucHJveHlPdXRGaWxlOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBmdWxsIHBhdGggbmFtZSB0byB0aGUgc3ltYm9sIGZpbGUgdXNlZCBieSB0aGUgSjkgUHJveHkuCi0gKiBSZXR1cm5zIG51bGwgaWYgdGhlIG5vIHN5bWJvbCBmaWxlIGlzIHBhc3NlZCB0byB0aGUgSjkgUHJveHkuCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0U3ltYm9sUGF0aCgpIHsKLQlyZXR1cm4gdGhpcy5zeW1ib2xQYXRoOwotfQotLyoqCi0gKiBAc2VlIExvY2FsVk1MYXVuY2hlciNsYXVuY2gKLSAqLwotcHVibGljIExvY2FsVmlydHVhbE1hY2hpbmUgbGF1bmNoKCkgdGhyb3dzIFRhcmdldEV4Y2VwdGlvbiB7Ci0JLy8gTGF1bmNoIFZNCi0JTG9jYWxWaXJ0dWFsTWFjaGluZSBsb2NhbFZNID0gKExvY2FsVmlydHVhbE1hY2hpbmUpc3VwZXIubGF1bmNoKCk7Ci0KLQkvLyBMYXVuY2ggUHJveHkgaWYgbmVlZGVkCi0JUHJvY2VzcyBwcm94eVByb2Nlc3M9IG51bGw7Ci0JaWYgKHRoaXMuZGVidWdQb3J0ICE9IC0xKSB7Ci0JCXRyeSB7Ci0JCQkvLyBVc2UgUnVudGltZS5leGVjKFN0cmluZ1tdKSB3aXRoIHRva2VucyBiZWNhdXNlIFJ1bnRpbWUuZXhlYyhTdHJpbmcpIHdpdGggY29tbWFuZExpbmVTdHJpbmcKLQkJCS8vIGRvZXMgbm90IHByb3Blcmx5IGhhbmRsZSBzcGFjZXMgaW4gYXJndW1lbnRzIG9uIFVuaXgvTGludXggcGxhdGZvcm1zLgotCQkJU3RyaW5nW10gY29tbWFuZExpbmUgPSBnZXRQcm94eUNvbW1hbmRMaW5lKCk7Ci0JCQkKLQkJCS8vIERFQlVHCi0JCQkvKgotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21tYW5kTGluZS5sZW5ndGg7IGkrKykgewotCQkJCVN5c3RlbS5vdXQucHJpbnQoY29tbWFuZExpbmVbaV0gKyAiICIpOwotCQkJfQotCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQkqLwotCi0JCQlwcm94eVByb2Nlc3M9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoY29tbWFuZExpbmUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlsb2NhbFZNLnNodXREb3duKCk7Ci0JCQl0aHJvdyBuZXcgVGFyZ2V0RXhjZXB0aW9uKCJFcnJvciBsYXVuY2hpbmcgSjkgUHJveHkgYXQgIiArIHRoaXMudm1QYXRoKTsKLQkJfQotCX0KLQotCS8vIFRyYW5zZm9ybSBsYXVuY2hlZCBWTSBpbnRvIEo5IFZNCi0JUHJvY2VzcyB2bVByb2Nlc3MgPSBsb2NhbFZNLnByb2Nlc3M7Ci0JdGhpcy5ydW5uaW5nVk1zLnJlbW92ZUVsZW1lbnQobG9jYWxWTSk7Ci0JSjlWaXJ0dWFsTWFjaGluZSB2bT0gbmV3IEo5VmlydHVhbE1hY2hpbmUodm1Qcm9jZXNzLCB0aGlzLmRlYnVnUG9ydCwgdGhpcy5ldmFsVGFyZ2V0UGF0aCwgcHJveHlQcm9jZXNzLCB0aGlzLnByb3h5T3V0RmlsZSk7Ci0JdGhpcy5ydW5uaW5nVk1zLmFkZEVsZW1lbnQodm0pOwotCXJldHVybiB2bTsKLX0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMucnVudGltZS5Mb2NhbFZNTGF1bmNoZXIjc2V0RGVidWdQb3J0KGludCkKLSAqLwotcHVibGljIHZvaWQgc2V0RGVidWdQb3J0KGludCBkZWJ1Z1BvcnQpIHsKLQlzdXBlci5zZXREZWJ1Z1BvcnQoZGVidWdQb3J0KTsKLQkKLQkvLyBzcGVjaWZ5IGRlZmF1bHQgaW50ZXJuYWwgZGVidWcgcG9ydCBhcyB3ZWxsCi0JdGhpcy5zZXRJbnRlcm5hbERlYnVnUG9ydChVdGlsLm5leHRBdmFpbGFibGVQb3J0TnVtYmVyKCkpOwotfQotCi0vKioKLSAqIFNldHMgdGhlIGRlYnVnIHBvcnQgdGhlIEo5IFByb3h5IHVzZXMgdG8gY29ubmVjdCB0byB0aGUgSjkgVk0uCi0gKiBUaGlzIGlzIG1hbmRhdG9yeSBpZiBkZWJ1ZyBtb2RlIGlzIGVuYWJsZWQuCi0gKiBUaGlzIGlzIGlnbm9yZWQgaWYgZGVidWcgbW9kZSBpcyBkaXNhYmxlZC4KLSAqIE5vdGUgdGhhdCB0aGUgcmVndWxhciBkZWJ1ZyBwb3J0IGlzIHRoZSBwb3J0IHVzZWQgdG8gY29ubmVjdCB0aGUgSjkgUHJveHkgYW5kIAotICogdGhlIElERSBpbiB0aGUgY2FzZSBvZiB0aGUgSjkgVk0gTGF1bmNoZXIuCi0gKi8KLXB1YmxpYyB2b2lkIHNldEludGVybmFsRGVidWdQb3J0KGludCBpbnRlcm5hbERlYnVnUG9ydCkgewotCXRoaXMuaW50ZXJuYWxEZWJ1Z1BvcnQgPSBpbnRlcm5hbERlYnVnUG9ydDsKLX0KLS8qKgotICogU2V0cyB0aGUgZnVsbCBwYXRoIG5hbWUgdG8gdGhlIGZpbGUgd2hlcmUgdGhlIHByb3h5IG91dHB1dCBtdXN0IGJlIHJlZGlyZWN0ZWQuCi0gKiBTcGVjaWZ5ICJjb24iIGlmIHRoZSBwcm94eSBvdXRwdXQgbXVzdCBiZSByZWRpcmVjdGVkIHRvIHRoZSBzdGRvdXQuCi0gKiBTcGVjaWZ5IG51bGwgaWYgdGhlIHByb3h5IG91dHB1dCBtdXN0IG5vdCBiZSByZWRpcmVjdGVkIChkZWZhdWx0IHZhbHVlKS4KLSAqIFRoaXMgaXMgaWdub3JlZCBpZiBkZWJ1ZyBtb2RlIGlzIGRpc2FibGVkLgotICovCi1wdWJsaWMgdm9pZCBzZXRQcm94eU91dEZpbGUoU3RyaW5nIHByb3h5T3V0RmlsZSkgewotCXRoaXMucHJveHlPdXRGaWxlID0gcHJveHlPdXRGaWxlOwotfQotLyoqCi0gKiBTZXRzIHRoZSBmdWxsIHBhdGggbmFtZSB0byB0aGUgc3ltYm9sIGZpbGUgdXNlZCBieSB0aGUgSjkgUHJveHkuCi0gKiBTcGVjaWZ5IG51bGwgaWYgdGhlIG5vIHN5bWJvbCBmaWxlIG11c3QgYmUgcGFzc2VkIHRvIHRoZSBKOSBQcm94eSAoZGVmYXVsdCB2YWx1ZSkuCi0gKiBUaGlzIGlzIGlnbm9yZWQgaWYgZGVidWcgbW9kZSBpcyBkaXNhYmxlZC4KLSAqLwotcHVibGljIHZvaWQgc2V0U3ltYm9sUGF0aChTdHJpbmcgc3ltYm9sUGF0aCkgewotCXRoaXMuc3ltYm9sUGF0aCA9IHN5bWJvbFBhdGg7Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcnVudGltZS9KOVZpcnR1YWxNYWNoaW5lLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcnVudGltZS9KOVZpcnR1YWxNYWNoaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNjMxZGQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3J1bnRpbWUvSjlWaXJ0dWFsTWFjaGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5ydW50aW1lOwotCi0vKioKLSAqIFdyYXBwZXIgYXJvdW5kIHRoZSBleHRlcm5hbCBwcm9jZXNzZXMgdGhhdCBhcmUgcnVubmluZyBhIEo5IFZNCi0gKiBhbmQgYSBKOSBQcm94eS4KLSAqIFRoaXMgYWxsb3dzIHRvIGtpbGwgdGhlc2UgcHJvY2Vzc2VzIHdoZW4gd2UgZXhpdCB0aGlzIHZtLgotICovCi1jbGFzcyBKOVZpcnR1YWxNYWNoaW5lIGV4dGVuZHMgTG9jYWxWaXJ0dWFsTWFjaGluZSB7Ci0JcHJpdmF0ZSBQcm9jZXNzIHByb3h5UHJvY2VzczsKLQlwcml2YXRlIEFic3RyYWN0UmVhZGVyIHByb3h5Q29uc29sZVJlYWRlcjsKLQlwcml2YXRlIFN0cmluZyBwcm94eU91dHB1dEZpbGU7Ci0vKioKLSAqIENyZWF0ZXMgYSBuZXcgSjlWaXJ0dWFsTWFjaGluZSBmcm9tIHRoZSBQcm9jZXNzZXMgdGhhdCBydW5zIHRoaXMgVk0KLSAqIGFuZCBpdHMgSjkgUHJveHkgYW5kIHdpdGggdGhlIGdpdmVuIGluZm8uCi0gKi8KLXB1YmxpYyBKOVZpcnR1YWxNYWNoaW5lKFByb2Nlc3Mgdm1Qcm9jZXNzLCBpbnQgZGVidWdQb3J0LCBTdHJpbmcgZXZhbFRhcmdldFBhdGgsIFByb2Nlc3MgcHJveHlQcm9jZXNzLCBTdHJpbmcgcHJveHlPdXRwdXRGaWxlKSB7Ci0Jc3VwZXIodm1Qcm9jZXNzLCBkZWJ1Z1BvcnQsIGV2YWxUYXJnZXRQYXRoKTsKLQl0aGlzLnByb3h5UHJvY2VzcyA9IHByb3h5UHJvY2VzczsKLQl0aGlzLnByb3h5T3V0cHV0RmlsZSA9IHByb3h5T3V0cHV0RmlsZTsKLQkKLQkvLyBTdGFydCB0aGUgUHJveHkgY29uc29sZSByZWFkZXIgc28gdGhhdCB0aGUgcHJveHkgaXMgbm90IGJsb2NrZWQgb24gaXRzIHN0ZG91dC4KLQlpZiAodGhpcy5wcm94eVByb2Nlc3MgIT0gbnVsbCkgewotCQlpZiAodGhpcy5wcm94eU91dHB1dEZpbGUgPT0gbnVsbCkgewotCQkJdGhpcy5wcm94eUNvbnNvbGVSZWFkZXI9IAotCQkJCW5ldyBOdWxsQ29uc29sZVJlYWRlcigKLQkJCQkJIko5IFByb3h5IENvbnNvbGUgUmVhZGVyIiwgCi0JCQkJCXRoaXMucHJveHlQcm9jZXNzLmdldElucHV0U3RyZWFtKCkpOwotCQl9IGVsc2UgewotCQkJdGhpcy5wcm94eUNvbnNvbGVSZWFkZXI9IAotCQkJCW5ldyBQcm94eUNvbnNvbGVSZWFkZXIoCi0JCQkJCSJKOSBQcm94eSBDb25zb2xlIFJlYWRlciIsIAotCQkJCQl0aGlzLnByb3h5UHJvY2Vzcy5nZXRJbnB1dFN0cmVhbSgpLAotCQkJCQl0aGlzLnByb3h5T3V0cHV0RmlsZSk7Ci0JCX0KLQkJdGhpcy5wcm94eUNvbnNvbGVSZWFkZXIuc3RhcnQoKTsKLQl9Ci0KLX0KLXByaXZhdGUgYm9vbGVhbiBpc1Byb3h5UnVubmluZygpIHsKLQlpZiAodGhpcy5wcm94eVByb2Nlc3MgPT0gbnVsbCkKLQkJcmV0dXJuIGZhbHNlOwotCWVsc2UgewotCQlib29sZWFuIGhhc0V4aXRlZDsKLQkJdHJ5IHsKLQkJCXRoaXMucHJveHlQcm9jZXNzLmV4aXRWYWx1ZSgpOwotCQkJaGFzRXhpdGVkID0gdHJ1ZTsKLQkJfSBjYXRjaCAoSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCWhhc0V4aXRlZCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiAhaGFzRXhpdGVkOwotCX0KLX0KLS8qKgotICogQHNlZSBMb2NhbFZpcnR1YWxNYWNoaW5lI3NodXREb3duCi0gKi8KLXB1YmxpYyB2b2lkIHNodXREb3duKCkgIHRocm93cyBUYXJnZXRFeGNlcHRpb24gewotCXN1cGVyLnNodXREb3duKCk7Ci0JaWYgKHRoaXMucHJveHlDb25zb2xlUmVhZGVyICE9IG51bGwpCi0JCXRoaXMucHJveHlDb25zb2xlUmVhZGVyLnN0b3AoKTsKLQlpZiAoKHRoaXMucHJveHlQcm9jZXNzICE9IG51bGwpICYmIGlzUHJveHlSdW5uaW5nKCkpIAotCQl0aGlzLnByb3h5UHJvY2Vzcy5kZXN0cm95KCk7Ci19Ci0vKioKLSAqIEBzZWUgTG9jYWxWaXJ0dWFsTWFjaGluZSNzaHV0RG93bgotICovCi1wdWJsaWMgdm9pZCB3YWl0Rm9yVGVybWluYXRpb24oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCXN1cGVyLndhaXRGb3JUZXJtaW5hdGlvbigpOwotCWlmICh0aGlzLnByb3h5UHJvY2VzcyAhPSBudWxsKQotCQl0aGlzLnByb3h5UHJvY2Vzcy53YWl0Rm9yKCk7Ci0JaWYgKHRoaXMucHJveHlDb25zb2xlUmVhZGVyICE9IG51bGwpCi0JCXRoaXMucHJveHlDb25zb2xlUmVhZGVyLnN0b3AoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ydW50aW1lL0xvY2FsVk1MYXVuY2hlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3J1bnRpbWUvTG9jYWxWTUxhdW5jaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMjI4ZTEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3J1bnRpbWUvTG9jYWxWTUxhdW5jaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5ydW50aW1lOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIFRoZSByb290IG9mIHRoZSBWTSBsYXVuY2hlcnMgdGhhdCBsYXVuY2ggVk1zIG9uIHRoZSBzYW1lIG1hY2hpbmUuCi0gKiA8cD4KLSAqIEEgbG9jYWwgVk0gbGF1bmNoZXIgaGFzIHRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnM6Ci0gKiA8dWw+Ci0gKiAgIDxsaT5JdCBjYW4gb25seSByZXRyaWV2ZSB0aGUgcnVubmluZyB2aXJ0dWFsIG1hY2hpbmVzIHRoYXQgaXQgaGFzIGxhdW5jaGVkLiBTbyBpZgotICogICAgICAgYSBjbGllbnQgaXMgdXNpbmcgMiBpbnN0YW5jZXMgb2YgPGNvZGU+TG9jYWxWTUxhdW5jaGVyPC9jb2RlPiwgZWFjaCBvZiB0aGVzZQotICogICAgICAgaW5zdGFuY2VzIHdpbGwgYmUgYWJsZSB0byByZXRyaWV2ZSBvbmx5IGEgcGFydCBvZiB0aGUgcnVubmluZyBWTXMuCi0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTG9jYWxWTUxhdW5jaGVyIGltcGxlbWVudHMgUnVudGltZUNvbnN0YW50cyB7Ci0KLQkvKioKLQkgKiBXaGV0aGVyIHRoZSB0YXJnZXQgaGFzIGEgZmlsZSBzeXN0ZW0gYW5kIHRodXMgd2hldGhlciBpdCBzdXBwb3J0cyB3cml0aW5nCi0JICogY2xhc3MgZmlsZXMgdG8gZGlzay4gU2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmV2YWwudGFyZ2V0LkNvZGVTbmlwcGV0UnVubmVyIGZvciBtb3JlCi0JICogaW5mb3JtYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIFRBUkdFVF9IQVNfRklMRV9TWVNURU0gPSB0cnVlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR1VMQVJfQ0xBU1NQQVRIX0RJUkVDVE9SWSA9ICJyZWd1bGFyUGF0aCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PVF9DTEFTU1BBVEhfRElSRUNUT1JZID0gImJvb3RQYXRoIjsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nW10gYm9vdFBhdGg7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIGNsYXNzUGF0aDsKLQlwcm90ZWN0ZWQgaW50IGRlYnVnUG9ydCA9IC0xOwotCXByb3RlY3RlZCBpbnQgZXZhbFBvcnQgPSAtMTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGV2YWxUYXJnZXRQYXRoOwotCXByb3RlY3RlZCBTdHJpbmdbXSBwcm9ncmFtQXJndW1lbnRzOwotCXByb3RlY3RlZCBTdHJpbmcgcHJvZ3JhbUNsYXNzOwotCXByb3RlY3RlZCBWZWN0b3IgcnVubmluZ1ZNcyA9IG5ldyBWZWN0b3IoKTsgLy8gYSBWZWN0b3Igb2YgTG9jYWxWaXJ0dWFsTWFjaGluZQotCXByb3RlY3RlZCBTdHJpbmdbXSB2bUFyZ3VtZW50czsKLQlwcm90ZWN0ZWQgU3RyaW5nIHZtUGF0aDsKLQkKLS8qKgotICogUmV0dXJucyBhIGxhdW5jaGVyIHRoYXQgd2lsbCBsYXVuY2ggdGhlIHNhbWUga2luZCBvZiBWTSB0aGF0IGlzIGN1cnJlbnRseSBydW5uaW5nCi0gKi8KLXB1YmxpYyBzdGF0aWMgTG9jYWxWTUxhdW5jaGVyIGdldExhdW5jaGVyKCkgewotCWlmICgiSjkiLmVxdWFscyhTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudm0ubmFtZSIpKSkgewotCQlyZXR1cm4gbmV3IEo5Vk1MYXVuY2hlcigpOwotCX0gZWxzZSB7Ci0JCXJldHVybiBuZXcgU3RhbmRhcmRWTUxhdW5jaGVyKCk7Ci0JfQotfQotLyoqCi0gKiBCdWlsZHMgdGhlIGFjdHVhbCBjbGFzcyBwYXRoIHRoYXQgaXMgZ29pbmcgdG8gYmUgcGFzc2VkIHRvIHRoZSBWTS4KLSAqLwotcHJvdGVjdGVkIFN0cmluZyBidWlsZENsYXNzUGF0aCgpIHsKLQlTdHJpbmdCdWZmZXIgY2xhc3NQYXRoU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCWNoYXIgcGF0aFNlcGFyYXRvciA9IEZpbGUucGF0aFNlcGFyYXRvckNoYXI7Ci0JCi0JLy8gQWRkIGphciBzdXBwb3J0IGlmIGluIGV2YWx1YXRpb24gbW9kZQotCWlmICh0aGlzLmV2YWxQb3J0ICE9IC0xKSB7Ci0JCWNsYXNzUGF0aFN0cmluZy5hcHBlbmQobmV3IEZpbGUodGhpcy5ldmFsVGFyZ2V0UGF0aCwgU1VQUE9SVF9aSVBfRklMRV9OQU1FKS5nZXRQYXRoKCkpOwotCQljbGFzc1BhdGhTdHJpbmcuYXBwZW5kKHBhdGhTZXBhcmF0b3IpOwotCX0KLQotCS8vIEFkZCBjbGFzcyBwYXRoIGdpdmVuIGJ5IGNsaWVudAotCWlmICh0aGlzLmNsYXNzUGF0aCAhPSBudWxsKSB7Ci0JCWludCBsZW5ndGggPSB0aGlzLmNsYXNzUGF0aC5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspewotCQkJY2xhc3NQYXRoU3RyaW5nLmFwcGVuZCh0aGlzLmNsYXNzUGF0aFtpXSk7Ci0JCQljbGFzc1BhdGhTdHJpbmcuYXBwZW5kKHBhdGhTZXBhcmF0b3IpOwotCQl9Ci0JfQotCQotCS8vIEFkZCByZWd1bGFyIGNsYXNzcGF0aCBkaXJlY3RvcnkgaWYgbmVlZGVkCi0JaWYgKHRoaXMuZXZhbFBvcnQgIT0gLTEgJiYgVEFSR0VUX0hBU19GSUxFX1NZU1RFTSkgewotCQljbGFzc1BhdGhTdHJpbmcuYXBwZW5kKHRoaXMuZXZhbFRhcmdldFBhdGgpOwotCQljbGFzc1BhdGhTdHJpbmcuYXBwZW5kKEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0JCWNsYXNzUGF0aFN0cmluZy5hcHBlbmQoUkVHVUxBUl9DTEFTU1BBVEhfRElSRUNUT1JZKTsKLQl9Ci0KLQlyZXR1cm4gY2xhc3NQYXRoU3RyaW5nLnRvU3RyaW5nKCk7Ci19Ci0vKioKLSAqIExhdW5jaGVzIHRoZSBWTSBieSBleGVjJ2luZyB0aGUgY29tbWFuZCBsaW5lIGFuZCByZXR1cm5zIHRoZSByZXN1bHRpbmcgUHJvY2Vzcy4KLSAqLwotcHJvdGVjdGVkIFByb2Nlc3MgZXhlY0NvbW1hbmRMaW5lKCkgdGhyb3dzIFRhcmdldEV4Y2VwdGlvbiB7Ci0JLy8gQ2hlY2sgdGhhdCB0aGUgVk0gcGF0aCBoYXMgYmVlbiBzcGVjaWZpZWQKLQlpZiAodGhpcy52bVBhdGggPT0gbnVsbCkgewotCQl0aHJvdyBuZXcgVGFyZ2V0RXhjZXB0aW9uKCJQYXRoIHRvIHRoZSBWTSBoYXMgbm90IGJlZW4gc3BlY2lmaWVkIik7Ci0JfQotCQotCS8vIENoZWNrIHRoYXQgdGhlIHByb2dyYW0gY2xhc3MgaGFzIGJlZW4gc3BlY2lmaWVkIGlmIG5vdCBpbiBldmFsdWF0aW9uIG1vZGUKLQlpZiAoKHRoaXMucHJvZ3JhbUNsYXNzID09IG51bGwpICYmICh0aGlzLmV2YWxQb3J0ID09IC0xKSkgewotCQl0aHJvdyBuZXcgVGFyZ2V0RXhjZXB0aW9uKCJQcm9ncmFtIGNsYXNzIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQiKTsKLQl9Ci0KLQkvLyBMYXVuY2ggVk0KLQlQcm9jZXNzIHZtUHJvY2Vzcz0gbnVsbDsKLQl0cnkgewotCQkvLyBVc2UgUnVudGltZS5leGVjKFN0cmluZ1tdKSB3aXRoIHRva2VucyBiZWNhdXNlIFJ1bnRpbWUuZXhlYyhTdHJpbmcpIHdpdGggY29tbWFuZExpbmVTdHJpbmcKLQkJLy8gZG9lcyBub3QgcHJvcGVybHkgaGFuZGxlIHNwYWNlcyBpbiBhcmd1bWVudHMgb24gVW5peC9MaW51eCBwbGF0Zm9ybXMuCi0JCVN0cmluZ1tdIGNvbW1hbmRMaW5lID0gZ2V0Q29tbWFuZExpbmUoKTsKLQkJCi0JCS8vIERFQlVHCi0JCS8qZm9yIChpbnQgaSA9IDA7IGkgPCBjb21tYW5kTGluZS5sZW5ndGg7IGkrKykgewotCQkJU3lzdGVtLm91dC5wcmludChjb21tYW5kTGluZVtpXSArICIgIik7Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCSovCi0JCQotCQl2bVByb2Nlc3M9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoY29tbWFuZExpbmUpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJdGhyb3cgbmV3IFRhcmdldEV4Y2VwdGlvbigiRXJyb3IgbGF1bmNoaW5nIFZNIGF0ICIgKyB0aGlzLnZtUGF0aCk7Ci0JfQotCXJldHVybiB2bVByb2Nlc3M7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIGJvb3QgY2xhc3MgcGF0aCB1c2VkIHdoZW4gYSBWTSBpcyBsYXVuY2hlZC4KLSAqLwotcHVibGljIFN0cmluZ1tdIGdldEJvb3RDbGFzc1BhdGgoKSB7Ci0JcmV0dXJuIHRoaXMuYm9vdFBhdGg7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIGNsYXNzIHBhdGggdXNlZCB3aGVuIGEgVk0gaXMgbGF1bmNoZWQuCi0gKi8KLXB1YmxpYyBTdHJpbmdbXSBnZXRDbGFzc1BhdGgoKSB7Ci0JcmV0dXJuIHRoaXMuY2xhc3NQYXRoOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBjb21tYW5kIGxpbmUgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGxhdW5jaCB0aGUgVk0uCi0gKiBUaGUgc2VnbWVudHMgYXJlIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6Ci0gKiA8cD48dWw+Ci0gKiA8bGk+IFZNIHBhdGgsCi0gKiA8bGk+IFZNIGFyZ3VtZW50cywKLSAqIDxsaT4gdGhlIGNsYXNzIHBhdGgsIAotICogPGxpPiB0aGUgcHJvZ3JhbSBjbGFzcwotICogPGxpPiB0aGUgcHJvZ3JhbSBhcmd1bWVudHMKLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBTdHJpbmdbXSBnZXRDb21tYW5kTGluZSgpOwotLyoqCi0gKiBSZXR1cm5zIHRoZSBkZWJ1ZyBwb3J0LCBvciAtMSBpZiBkZWJ1ZyBtb2RlIGlzIGRpc2FibGVkLgotICogVGhlIGRlZmF1bHQgaXMgLTEuCi0gKi8KLXB1YmxpYyBpbnQgZ2V0RGVidWdQb3J0KCkgewotCXJldHVybiB0aGlzLmRlYnVnUG9ydDsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgZXZhbHVhdGlvbiBwb3J0IGZvciBldmFsdWF0aW9uIHN1cHBvcnQuCi0gKiBUaGUgZGVmYXVsdCBpcyAtMSwgaW5kaWNhdGluZyBubyBldmFsdWF0aW9uIHN1cHBvcnQuCi0gKgotICogQHNlZSBzZXRFdmFsUG9ydAotICovCi1wdWJsaWMgaW50IGdldEV2YWxQb3J0KCkgewotCXJldHVybiB0aGlzLmV2YWxQb3J0OwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBldmFsdWF0aW9uIHRhcmdldCBwYXRoIGZvciBldmFsdWF0aW9uIHN1cHBvcnQuCi0gKgotICogQHNlZSBzZXRFdmFsVGFyZ2V0UGF0aAotICovCi1wdWJsaWMgU3RyaW5nIGdldEV2YWxUYXJnZXRQYXRoKCkgewotCXJldHVybiB0aGlzLmV2YWxUYXJnZXRQYXRoOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBwcm9ncmFtIGNsYXNzLgotICogUmV0dXJucyBudWxsIGlmIHRoZSBWTSBpcyBiZWluZyBsYXVuY2hlZCBmb3IgZXZhbHVhdGlvbiBzdXBwb3J0IG9ubHkuCi0gKi8KLXB1YmxpYyBTdHJpbmdbXSBnZXRQcm9ncmFtQXJndW1lbnRzKCkgewotCWlmICh0aGlzLmV2YWxQb3J0ICE9IC0xKSB7Ci0JCXJldHVybiBudWxsOwotCX0gZWxzZSB7Ci0JCXJldHVybiB0aGlzLnByb2dyYW1Bcmd1bWVudHM7Ci0JfQotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBkb3Qtc2VwYXJhdGVkLCBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MgdG8gcnVuLiAgCi0gKiBJdCBtdXN0IGltcGxlbWVudCBtYWluKFN0cmluZ1tdIGFyZ3MpLgotICogUmV0dXJucyBudWxsIGlmIHRoZSBWTSBpcyBiZWluZyBsYXVuY2hlZCBmb3IgZXZhbHVhdGlvbiBzdXBwb3J0IG9ubHkuCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0UHJvZ3JhbUNsYXNzKCkgewotCWlmICh0aGlzLmV2YWxQb3J0ICE9IC0xKSB7Ci0JCXJldHVybiBudWxsOwotCX0gZWxzZSB7Ci0JCXJldHVybiB0aGlzLnByb2dyYW1DbGFzczsKLQl9Ci19Ci0vKioKLSAqIFJldHVybnMgYWxsIHRoZSB0YXJnZXQgVk1zIHRoYXQgYXJlIHJ1bm5pbmcgYXQgdGhpcyBsYXVuY2hlcidzIHRhcmdldCAKLSAqIGFkZHJlc3MuCi0gKiBOb3RlIHRoYXQgdGhlc2UgdGFyZ2V0IFZNcyBtYXkgb3IgbWF5IG5vdCBoYXZlIGJlZW4gbGF1bmNoZWQgYnkgdGhpcyAKLSAqIGxhdW5jaGVyLgotICogTm90ZSBhbHNvIHRoYXQgaWYgdGhlIGxpc3Qgb2YgcnVubmluZyBWTXMgZG9lc24ndCBjaGFuZ2Ugb24gdGhlIHRhcmdldCwKLSAqIHR3byBjYWxscyB0byB0aGlzIG1ldGhvZCByZXR1cm4gVk1zIHRoYXQgYXJlIGVxdWFsLgotICogCi0gKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHJ1bm5pbmcgdGFyZ2V0IFZNcwotICogQGV4Y2VwdGlvbiBUYXJnZXRFeGNlcHRpb24gaWYgdGhlIHRhcmdldCBWTXMgY291bGQgbm90IGJlIHJldHJpZXZlZC4KLSAqLwotcHVibGljIExvY2FsVmlydHVhbE1hY2hpbmVbXSBnZXRSdW5uaW5nVmlydHVhbE1hY2hpbmVzKCkgdGhyb3dzIFRhcmdldEV4Y2VwdGlvbiB7Ci0JLy8gU2VsZWN0IHRoZSBWTXMgdGhhdCBhcmUgYWN0dWFsbHkgcnVubmluZwotCVZlY3RvciBhY3R1YWxseVJ1bm5pbmcgPSBuZXcgVmVjdG9yKCk7Ci0JRW51bWVyYXRpb24gZW51bSA9IHRoaXMucnVubmluZ1ZNcy5lbGVtZW50cygpOwotCXdoaWxlIChlbnVtLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCUxvY2FsVmlydHVhbE1hY2hpbmUgdm0gPSAoTG9jYWxWaXJ0dWFsTWFjaGluZSllbnVtLm5leHRFbGVtZW50KCk7Ci0JCWlmICh2bS5pc1J1bm5pbmcoKSkKLQkJCWFjdHVhbGx5UnVubmluZy5hZGRFbGVtZW50KHZtKTsKLQl9Ci0JdGhpcy5ydW5uaW5nVk1zID0gYWN0dWFsbHlSdW5uaW5nOwotCi0JLy8gUmV0dXJuIHRoZSBydW5uaW5nIFZNcwotCWludCBzaXplID0gYWN0dWFsbHlSdW5uaW5nLnNpemUoKTsKLQlMb2NhbFZpcnR1YWxNYWNoaW5lW10gcmVzdWx0ID0gbmV3IExvY2FsVmlydHVhbE1hY2hpbmVbc2l6ZV07Ci0JZm9yIChpbnQgaT0wOyBpPHNpemU7IGkrKykKLQkJcmVzdWx0W2ldID0gKExvY2FsVmlydHVhbE1hY2hpbmUpYWN0dWFsbHlSdW5uaW5nLmVsZW1lbnRBdChpKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgd2hlcmUgdGhpcyBsYXVuY2hlciBydW5zIHRoZSB0YXJnZXQgVk1zLiBUaGUgZm9ybWF0Ci0gKiBvZiB0aGlzIGFkZHJlc3MgaXMgdHJhbnNwb3J0IHNwZWNpZmljLgotICogRm9yIGV4YW1wbGUsIGEgVk0gbGF1bmNoZXIgdXNpbmcgYSBUQ1AvSVAgdHJhbnNwb3J0IHJldHVybnMgdGFyZ2V0IGFkZHJlc3NlcyBsb29raW5nIGxpa2U6Ci0gKiA8Y29kZT4ibG9jYWxob3N0OjIwMTAiPC9jb2RlPiwgb3IgPGNvZGU+ImpvZS5pYm0uY29tIjwvY29kZT4uCi0gKgotICogQHJldHVybiB0cmFuc3BvcnQgc3BlY2lmaWMgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0Ci0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0QWRkcmVzcygpIHsKLQlyZXR1cm4gImxvY2FsaG9zdCI7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIFZNLXNwZWNpZmljIGFyZ3VtZW50cy4gVGhpcyBkb2VzIG5vdCBpbmNsdWRlOgotICogPHA+PHVsPgotICogPGxpPnRoZSBWTSBwYXRoCi0gKiA8bGk+dGhlIGNsYXNzIHBhdGggb3IgdGhlIGJvb3QgY2xhc3MgcGF0aAotICogPGxpPnRoZSBwcm9ncmFtIGNsYXNzIG9yIHByb2dyYW0gYXJndW1lbnRzCi0gKiA8L3VsPgotICovCi1wdWJsaWMgU3RyaW5nW10gZ2V0Vk1Bcmd1bWVudHMoKSB7Ci0JcmV0dXJuIHRoaXMudm1Bcmd1bWVudHM7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIHBhdGggb24gZGlzayBvZiB0aGUgVk0gdG8gbGF1bmNoLgotICovCi1wdWJsaWMgU3RyaW5nIGdldFZNUGF0aCgpIHsKLQlyZXR1cm4gdGhpcy52bVBhdGg7Ci19Ci0vKioKLSAqIEluaXRpYWxpemVzIHRoaXMgY29udGV4dCdzIHRhcmdldCBwYXRoIGJ5IGNvcHlpbmcgdGhlIGphciBmaWxlIGZvciB0aGUgY29kZSBzbmlwcGV0IHN1cHBvcnQgCi0gKiBhbmQgYnkgY3JlYXRpbmcgdGhlIDIgZGlyZWN0b3JpZXMgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIGNvZGUgc25pcHBldCBjbGFzc2VzIChzZWUgVEFSR0VUX0hBU19GSUxFX1NZU1RFTSkuCi0gKiBBZGQgdGhlIGNvZGUgc25pcHBvcnQgcm9vdCBjbGFzcyB0byB0aGUgYm9vdCBwYXRoIGRpcmVjdG9yeSBzbyB0aGF0IGNvZGUgc25pcHBldHMgY2FuIGJlIHJ1biBpbgotICogamF2YS4qIHBhY2thZ2VzCi0gKgotICogQHRocm93cyBUYXJnZXRFeGNlcHRpb24gaWYgdGhlIHBhdGggY291bGQgbm90IGJlIGluaXRpYWxpemVkIHdpdGggdGhlIGNvZGUgc25pcHBldCBzdXBwb3J0Ci0gKi8KLXByb3RlY3RlZCB2b2lkIGluaXRUYXJnZXRQYXRoKCkgdGhyb3dzIFRhcmdldEV4Y2VwdGlvbiB7Ci0JLy8gY3JlYXRlIGRpcmVjdG9yaWVzCi0JRmlsZSBkaXJlY3RvcnkgPSBuZXcgRmlsZSh0aGlzLmV2YWxUYXJnZXRQYXRoKTsKLQlkaXJlY3RvcnkubWtkaXJzKCk7Ci0JaWYgKCFkaXJlY3RvcnkuZXhpc3RzKCkpIHsKLQkJdGhyb3cgbmV3IFRhcmdldEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBkaXJlY3RvcnkgIiArIHRoaXMuZXZhbFRhcmdldFBhdGgpOwotCX0KLQlpZiAoVEFSR0VUX0hBU19GSUxFX1NZU1RFTSkgewotCQlGaWxlIGNsYXNzZXNEaXJlY3RvcnkgPSBuZXcgRmlsZShkaXJlY3RvcnksIFJFR1VMQVJfQ0xBU1NQQVRIX0RJUkVDVE9SWSk7Ci0JCWNsYXNzZXNEaXJlY3RvcnkubWtkaXIoKTsKLQkJaWYgKCFjbGFzc2VzRGlyZWN0b3J5LmV4aXN0cygpKSB7Ci0JCQl0aHJvdyBuZXcgVGFyZ2V0RXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIGRpcmVjdG9yeSAiICsgY2xhc3Nlc0RpcmVjdG9yeS5nZXRQYXRoKCkpOwotCQl9Ci0JCUZpbGUgYm9vdERpcmVjdG9yeSA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgQk9PVF9DTEFTU1BBVEhfRElSRUNUT1JZKTsKLQkJYm9vdERpcmVjdG9yeS5ta2RpcigpOwotCQlpZiAoIWJvb3REaXJlY3RvcnkuZXhpc3RzKCkpIHsKLQkJCXRocm93IG5ldyBUYXJnZXRFeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgZGlyZWN0b3J5ICIgKyBib290RGlyZWN0b3J5LmdldFBhdGgoKSk7Ci0JCX0KLQkJLyoKLQkJLy8gYWRkIHRoZSBjb2RlIHNuaXBwZXQgcm9vdCBjbGFzcyB0byB0aGUgYm9vdCBwYXRoIGRpcmVjdG9yeQotCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbiA9IEV2YWx1YXRpb25Db250ZXh0LmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oIi8iICsgU1VQUE9SVF9aSVBfRklMRV9OQU1FKTsKLQkJCVppcElucHV0U3RyZWFtIHppcCA9IG5ldyBaaXBJbnB1dFN0cmVhbShpbik7Ci0JCQlTdHJpbmcgcm9vdENsYXNzRmlsZU5hbWUgPSBST09UX0ZVTExfQ0xBU1NfTkFNRS5yZXBsYWNlKCcuJywgJy8nKSArICIuY2xhc3MiOwotCQkJd2hpbGUgKHRydWUpIHsKLQkJCQlaaXBFbnRyeSBlbnRyeSA9IHppcC5nZXROZXh0RW50cnkoKTsKLQkJCQlpZiAoZW50cnkuZ2V0TmFtZSgpLmVxdWFscyhyb290Q2xhc3NGaWxlTmFtZSkpIHsKLQkJCQkJLy8gcmVhZCByb290IGNsYXNzIGZpbGUgY29udGVudHMKLQkJCQkJaW50IHNpemUgPSAoaW50KWVudHJ5LmdldFNpemUoKTsKLQkJCQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW3NpemVdOwotCQkJCQlpbnQgdG90YWxSZWFkID0gMDsKLQkJCQkJaW50IHJlYWQgPSAwOwotCQkJCQl3aGlsZSAodG90YWxSZWFkIDwgc2l6ZSkgewotCQkJCQkJcmVhZCA9IHppcC5yZWFkKGJ1ZmZlciwgdG90YWxSZWFkLCBzaXplIC0gdG90YWxSZWFkKTsKLQkJCQkJCWlmIChyZWFkICE9IC0xKSB7Ci0JCQkJCQkJdG90YWxSZWFkICs9IHJlYWQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gd3JpdGUgcm9vdCBjbGFzcyBmaWxlIGNvbnRlbnRzCi0JCQkJCUZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCUZpbGUgcm9vdEZpbGUgPSBuZXcgRmlsZShib290RGlyZWN0b3J5LCByb290Q2xhc3NGaWxlTmFtZS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKSk7Ci0JCQkJCQlGaWxlIHBhcmVudCA9IG5ldyBGaWxlKHJvb3RGaWxlLmdldFBhcmVudCgpKTsKLQkJCQkJCXBhcmVudC5ta2RpcnMoKTsKLQkJCQkJCW91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHJvb3RGaWxlKTsKLQkJCQkJCW91dC53cml0ZShidWZmZXIpOwotCQkJCQkJb3V0LmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQlpZiAob3V0ICE9IG51bGwpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlvdXQuY2xvc2UoKTsKLQkJCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMikgewotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpbi5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJaWYgKGluICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbi5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUyKSB7Ci0JCQkJfQotCQkJfQotCQl9Ki8KLQl9Ci0KLQkvLyBjb3B5IGphciBmaWxlCi0JSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCUZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLQl0cnkgewotCQlpbiA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCIvIiArIFNVUFBPUlRfWklQX0ZJTEVfTkFNRSk7Ci0JCWlmIChpbiA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgVGFyZ2V0RXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCByZXNvdXJjZSAvIiArIFNVUFBPUlRfWklQX0ZJTEVfTkFNRSk7Ci0JCX0KLQkJaW50IGJ1ZmZlckxlbmd0aCA9IDEwMjQ7Ci0JCWJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtidWZmZXJMZW5ndGhdOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXJlY3RvcnksIFNVUFBPUlRfWklQX0ZJTEVfTkFNRSk7Ci0JCW91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCQlpbnQgcmVhZCA9IDA7Ci0JCXdoaWxlIChyZWFkICE9IC0xKSB7Ci0JCQlyZWFkID0gaW4ucmVhZChidWZmZXIsIDAsIGJ1ZmZlckxlbmd0aCk7Ci0JCQlpZiAocmVhZCAhPSAtMSkgewotCQkJCW91dC53cml0ZShidWZmZXIsIDAsIHJlYWQpOwotCQkJfQotCQl9Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl0aHJvdyBuZXcgVGFyZ2V0RXhjZXB0aW9uKCJJT0V4Y2VwdGlvbiB3aGlsZSBjb3B5aW5nICIgKyBTVVBQT1JUX1pJUF9GSUxFX05BTUUgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCX0gZmluYWxseSB7Ci0JCWlmIChpbiAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWluLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJaWYgKG91dCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW91dC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQotfQotLyoqCi0gKiBMYXVuY2hlcyBhIG5ldyB0YXJnZXQgVk0gd2l0aCB0aGUgcmVnaXN0ZXJlZCBhcmd1bWVudHMuCi0gKiBUaGlzIG9wZXJhdGlvbiByZXR1cm5zIG9uY2UgYSBuZXcgdGFyZ2V0IFZNIGhhcyBiZWVuIGxhdW5jaGVkLgotICoKLSAqIEBleGNlcHRpb24gVGFyZ2V0RXhjZXB0aW9uIGlmIHRoZSB0YXJnZXQgVk0gY291bGQgbm90IGJlIGxhdW5jaGVkLgotICovCi1wdWJsaWMgTG9jYWxWaXJ0dWFsTWFjaGluZSBsYXVuY2goKSB0aHJvd3MgVGFyZ2V0RXhjZXB0aW9uIHsKLQkvLyBldmFsdWF0aW9uIG1vZGUKLQlpZiAodGhpcy5ldmFsVGFyZ2V0UGF0aCAhPSBudWxsKSB7Ci0JCS8vIGluaXQgdGFyZ2V0IHBhdGgKLQkJdGhpcy5pbml0VGFyZ2V0UGF0aCgpOwotCX0KLQotCS8vIGxhdW5jaCBWTQotCUxvY2FsVmlydHVhbE1hY2hpbmUgdm07Ci0JUHJvY2VzcyBwID0gZXhlY0NvbW1hbmRMaW5lKCk7Ci0Jdm0gPSBuZXcgTG9jYWxWaXJ0dWFsTWFjaGluZShwLCB0aGlzLmRlYnVnUG9ydCwgdGhpcy5ldmFsVGFyZ2V0UGF0aCk7Ci0KLQkvLyBUQkQ6IFN0YXJ0IHJlYWRpbmcgVk0gc3Rkb3V0IGFuZCBzdGRlcnIgcmlnaHQgYXdheSBvdGhlcndpc2UgdGhpcyBtYXkgcHJldmVudCB0aGUgY29ubmVjdGlvbgotCS8vCQlmcm9tIGhhcHBlbmluZy4KLQotCS8vIGFkZCBWTSB0byBsaXN0IG9mIGtub3duIHJ1bm5pbmcgVk1zCi0JdGhpcy5ydW5uaW5nVk1zLmFkZEVsZW1lbnQodm0pOwotCXJldHVybiB2bTsKLX0KLS8qKgotICogU2V0cyB0aGUgYm9vdCBjbGFzcyBwYXRoIHVzZWQgd2hlbiBhIFZNIGlzIGxhdW5jaGVkLgotICovCi1wdWJsaWMgdm9pZCBzZXRCb290Q2xhc3NQYXRoKGphdmEubGFuZy5TdHJpbmdbXSBib290Q2xhc3NQYXRoKSB7Ci0JdGhpcy5ib290UGF0aCA9IGJvb3RDbGFzc1BhdGg7Ci19Ci0vKioKLSAqIFNldHMgdGhlIGNsYXNzIHBhdGggdXNlZCB3aGVuIGEgVk0gaXMgbGF1bmNoZWQuCi0gKi8KLXB1YmxpYyB2b2lkIHNldENsYXNzUGF0aChTdHJpbmdbXSBjbGFzc1BhdGgpIHsKLQl0aGlzLmNsYXNzUGF0aCA9IGNsYXNzUGF0aDsKLX0KLS8qKgotICogU2V0cyB0aGUgZGVidWcgcG9ydCB0byB1c2UgZm9yIGRlYnVnIHN1cHBvcnQuCi0gKiBTcGVjaWZ5IC0xIHRvIGRpc2FibGUgZGVidWcgbW9kZS4KLSAqLwotcHVibGljIHZvaWQgc2V0RGVidWdQb3J0KGludCBkZWJ1Z1BvcnQpIHsKLQl0aGlzLmRlYnVnUG9ydCA9IGRlYnVnUG9ydDsKLX0KLS8qKgotICogU2V0cyB0aGUgZXZhbHVhdGlvbiBwb3J0IHRvIHVzZSBmb3IgZXZhbHVhdGlvbiBzdXBwb3J0LgotICogU2V0dGluZyB0aGUgcG9ydCBlbmFibGVzIGV2YWx1YXRpb24gc3VwcG9ydC4KLSAqIFNwZWNpZnkgbnVsbCB0byBkaXNhYmxlIGV2YWx1YXRpb24gc3VwcG9ydC4KLSAqLwotcHVibGljIHZvaWQgc2V0RXZhbFBvcnQoaW50IGV2YWxQb3J0KSB7Ci0JdGhpcy5ldmFsUG9ydCA9IGV2YWxQb3J0OwotfQotLyoqCi0gKiBTZXRzIHRoZSBldmFsdWF0aW9uIHRhcmdldCBwYXRoIHRvIHVzZSBmb3IgZXZhbHVhdGlvbiBzdXBwb3J0LgotICovCi1wdWJsaWMgdm9pZCBzZXRFdmFsVGFyZ2V0UGF0aChTdHJpbmcgZXZhbFRhcmdldFBhdGgpIHsKLQl0aGlzLmV2YWxUYXJnZXRQYXRoID0gZXZhbFRhcmdldFBhdGg7Ci19Ci0vKioKLSAqIFNldHMgdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIHByb2dyYW0gY2xhc3MuCi0gKiBUaGlzIGlzIGlnbm9yZWQgaWYgdGhlIFZNIGlzIGJlaW5nIGxhdW5jaGVkIGZvciBldmFsdWF0aW9uIHN1cHBvcnQgb25seS4KLSAqLwotcHVibGljIHZvaWQgc2V0UHJvZ3JhbUFyZ3VtZW50cyhTdHJpbmdbXSBhcmdzKSB7Ci0JdGhpcy5wcm9ncmFtQXJndW1lbnRzID0gYXJnczsKLX0KLS8qKgotICogU2V0cyB0aGUgZG90LXNlcGFyYXRlZCwgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIHRvIHJ1bi4gIAotICogSXQgbXVzdCBpbXBsZW1lbnQgbWFpbihTdHJpbmdbXSBhcmdzKS4KLSAqIFRoaXMgaXMgaWdub3JlZCBpZiB0aGUgVk0gaXMgYmVpbmcgbGF1bmNoZWQgZm9yIGV2YWx1YXRpb24gc3VwcG9ydCBvbmx5LgotICovCi1wdWJsaWMgdm9pZCBzZXRQcm9ncmFtQ2xhc3MoU3RyaW5nIHByb2dyYW1DbGFzcykgewotCXRoaXMucHJvZ3JhbUNsYXNzID0gcHJvZ3JhbUNsYXNzOwotfQotLyoqCi0gKiBTZXRzIHRoZSBWTS1zcGVjaWZpYyBhcmd1bWVudHMuIFRoaXMgZG9lcyBub3QgaW5jbHVkZToKLSAqIDxwPjx1bD4KLSAqIDxsaT50aGUgVk0gcGF0aAotICogPGxpPnRoZSBjbGFzcyBwYXRoIG9yIHRoZSBib290IGNsYXNzIHBhdGgKLSAqIDxsaT50aGUgcHJvZ3JhbSBjbGFzcyBvciBwcm9ncmFtIGFyZ3VtZW50cwotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2V0Vk1Bcmd1bWVudHMoU3RyaW5nW10gYXJncykgewotCXRoaXMudm1Bcmd1bWVudHMgPSBhcmdzOwotfQotLyoqCi0gKiBTZXRzIHRoZSBwYXRoIG9uIGRpc2sgb2YgdGhlIFZNIHRvIGxhdW5jaC4KLSAqLwotcHVibGljIHZvaWQgc2V0Vk1QYXRoKFN0cmluZyB2bVBhdGgpIHsKLQl0aGlzLnZtUGF0aCA9IHZtUGF0aDsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ydW50aW1lL0xvY2FsVmlydHVhbE1hY2hpbmUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ydW50aW1lL0xvY2FsVmlydHVhbE1hY2hpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlkMTRkOC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcnVudGltZS9Mb2NhbFZpcnR1YWxNYWNoaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5ydW50aW1lOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi0vKioKLSAqIFdyYXBwZXIgYXJvdW5kIHRoZSBleHRlcm5hbCBwcm9jZXNzIHRoYXQgaXMgcnVubmluZyBhIGxvY2FsIFZNLgotICogVGhpcyBhbGxvd3MgdG8ga2lsbCB0aGlzIHByb2Nlc3Mgd2hlbiB3ZSBleGl0IHRoaXMgdm0uCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbFZpcnR1YWxNYWNoaW5lIHsKLQlwcm90ZWN0ZWQgUHJvY2VzcyBwcm9jZXNzOwotCXByb3RlY3RlZCBpbnQgZGVidWdQb3J0OwotCXByb3RlY3RlZCBTdHJpbmcgZXZhbFRhcmdldFBhdGg7Ci0vKioKLSAqIENyZWF0ZXMgYSBuZXcgTG9jYWxWaXJ0dWFsTWFjaGluZSB0aGF0IGRvZXNuJ3QgcnVuIGFuZCB0aGF0IGNhbm5vdCBiZSBkZWJ1Z2dlZCBub3IgdXNlZCB0bwotICogZXZhbHVhdGUuCi0gKi8KLXB1YmxpYyBMb2NhbFZpcnR1YWxNYWNoaW5lKCkgewotCXRoaXMucHJvY2VzcyA9IG51bGw7Ci0JdGhpcy5kZWJ1Z1BvcnQgPSAtMTsKLQl0aGlzLmV2YWxUYXJnZXRQYXRoID0gbnVsbDsKLX0KLS8qKgotICogQ3JlYXRlcyBhIG5ldyBMb2NhbFZpcnR1YWxNYWNoaW5lIGZyb20gdGhlIFByb2Nlc3MgdGhhdCBydW5zIHRoaXMgVk0KLSAqIGFuZCB3aXRoIHRoZSBnaXZlbiBkZWJ1ZyBwb3J0IG51bWJlci4KLSAqLwotcHVibGljIExvY2FsVmlydHVhbE1hY2hpbmUoUHJvY2VzcyBwLCBpbnQgZGVidWdQb3J0LCBTdHJpbmcgZXZhbFRhcmdldFBhdGgpIHsKLQl0aGlzLnByb2Nlc3MgPSBwOwotCXRoaXMuZGVidWdQb3J0ID0gZGVidWdQb3J0OwotCXRoaXMuZXZhbFRhcmdldFBhdGggPSBldmFsVGFyZ2V0UGF0aDsKLX0KLS8qKgotICogRGVzdHJveXMgdGhlIHByb2Nlc3MgcnVubmluZyB0aGlzIFZNLgotICovCi1wcm90ZWN0ZWQgdm9pZCBiYXNpY1NodXREb3duKCkgewotCWlmICgodGhpcy5wcm9jZXNzICE9IG51bGwpICYmIHRoaXMuaXNSdW5uaW5nKCkpIHsKLQkJdGhpcy5wcm9jZXNzLmRlc3Ryb3koKTsKLQl9Ci19Ci0vKioKLSAqIENsZWFucyB1cCB0aGUgZ2l2ZW4gZGlyZWN0b3J5IGJ5IHJlbW92aW5nIGFsbCB0aGUgZmlsZXMgaXQgY29udGFpbnMgYXMgd2VsbAotICogYnV0IGxlYXZpbmcgdGhlIGRpcmVjdG9yeS4KLSAqIEB0aHJvd3MgVGFyZ2V0RXhjZXB0aW9uIGlmIHRoZSB0YXJnZXQgcGF0aCBjb3VsZCBub3QgYmUgY2xlYW5lZCB1cAotICovCi1wcml2YXRlIHZvaWQgY2xlYW51cERpcmVjdG9yeShGaWxlIGRpcmVjdG9yeSkgdGhyb3dzIFRhcmdldEV4Y2VwdGlvbiB7Ci0JaWYgKCFkaXJlY3RvcnkuZXhpc3RzKCkpIHsKLQkJcmV0dXJuOwotCX0KLQlTdHJpbmdbXSBmaWxlTmFtZXMgPSBkaXJlY3RvcnkubGlzdCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgZmlsZU5hbWVzW2ldKTsKLQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJY2xlYW51cERpcmVjdG9yeShmaWxlKTsKLQkJCWlmICghZmlsZS5kZWxldGUoKSkgewotCQkJCXRocm93IG5ldyBUYXJnZXRFeGNlcHRpb24oIkNvdWxkIG5vdCBkZWxldGUgZGlyZWN0b3J5ICIgKyBkaXJlY3RvcnkuZ2V0UGF0aCgpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICghZmlsZS5kZWxldGUoKSkgewotCQkJCXRocm93IG5ldyBUYXJnZXRFeGNlcHRpb24oIkNvdWxkIG5vdCBkZWxldGUgZmlsZSAiICsgZmlsZS5nZXRQYXRoKCkpOwotCQkJfQotCQl9Ci0JfQotfQotLyoqCi0gKiBDbGVhbnMgdXAgdGhpcyBjb250ZXh0J3MgdGFyZ2V0IHBhdGggYnkgcmVtb3ZpbmcgYWxsIHRoZSBmaWxlcyBpdCBjb250YWlucwotICogYnV0IGxlYXZpbmcgdGhlIGRpcmVjdG9yeS4KLSAqIEB0aHJvd3MgVGFyZ2V0RXhjZXB0aW9uIGlmIHRoZSB0YXJnZXQgcGF0aCBjb3VsZCBub3QgYmUgY2xlYW5lZCB1cAotICovCi1wcm90ZWN0ZWQgdm9pZCBjbGVhbnVwVGFyZ2V0UGF0aCgpIHRocm93cyBUYXJnZXRFeGNlcHRpb24gewotCWlmICh0aGlzLmV2YWxUYXJnZXRQYXRoID09IG51bGwpIHJldHVybjsKLQlTdHJpbmcgdGFyZ2V0UGF0aCA9IHRoaXMuZXZhbFRhcmdldFBhdGg7Ci0JaWYgKExvY2FsVk1MYXVuY2hlci5UQVJHRVRfSEFTX0ZJTEVfU1lTVEVNKSB7Ci0JCWNsZWFudXBEaXJlY3RvcnkobmV3IEZpbGUodGFyZ2V0UGF0aCwgTG9jYWxWTUxhdW5jaGVyLlJFR1VMQVJfQ0xBU1NQQVRIX0RJUkVDVE9SWSkpOwotCQljbGVhbnVwRGlyZWN0b3J5KG5ldyBGaWxlKHRhcmdldFBhdGgsIExvY2FsVk1MYXVuY2hlci5CT09UX0NMQVNTUEFUSF9ESVJFQ1RPUlkpKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodGFyZ2V0UGF0aCwgTG9jYWxWTUxhdW5jaGVyLlNVUFBPUlRfWklQX0ZJTEVfTkFNRSk7Ci0KLQkJLy8gd29ya2Fyb3VuZCBwYiB3aXRoIFByb2Nlc3MuZXhpdFZhbHVlKCkgdGhhdCByZXR1cm5zIHRoZSBwcm9jZXNzIGhhcyBleGl0ZWQsIGJ1dCBpdCBoYXMgbm90IGZyZWUgdGhlIGZpbGUgeWV0Ci0JCWludCBjb3VudCA9IDEwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCWlmIChmaWxlLmRlbGV0ZSgpKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcChjb3VudCAqIDEwMCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJdGhyb3cgbmV3IFRhcmdldEV4Y2VwdGlvbigiQ291bGQgbm90IGRlbGV0ZSAiICsgZmlsZS5nZXRQYXRoKCkpOwotCQl9Ci0JfSBlbHNlIHsKLQkJY2xlYW51cERpcmVjdG9yeShuZXcgRmlsZSh0YXJnZXRQYXRoKSk7Ci0JfQotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBkZWJ1ZyBwb3J0IG51bWJlciBmb3IgdGhpcyBWTS4gVGhpcyBpcyB0aGUgcG9ydCBudW1iZXIgdGhhdCB3YXMKLSAqIHBhc3NlZCBhcyB0aGUgIi1kZWJ1ZyIgb3B0aW9uIGlmIHRoaXMgVk0gd2FzIGxhdW5jaGVkIHVzaW5nIGEgPGNvZGU+TG9jYWxWTUxhdW5jaGVyPC9jb2RlPi4KLSAqIFJldHVybnMgLTEgaWYgdGhpcyBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIG9yIGlmIHRoaXMgVk0gaXMgbm90IHJ1bm5pbmcgaW4KLSAqIGRlYnVnIG1vZGUuCi0gKi8KLXB1YmxpYyBpbnQgZ2V0RGVidWdQb3J0TnVtYmVyKCkgewotCXJldHVybiB0aGlzLmRlYnVnUG9ydDsKLX0KLS8qKgotICogUmV0dXJucyBhbiBpbnB1dCBzdHJlYW0gdGhhdCBpcyBjb25uZWN0ZWQgdG8gdGhlIHN0YW5kYXJkIGVycm9yIAotICogKDxjb2RlPlN5c3RlbS5lcnI8L2NvZGU+KSBvZiB0aGlzIHRhcmdldCBWTS4KLSAqIEJ5dGVzIHRoYXQgYXJlIHdyaXR0ZW4gdG8gPGNvZGU+U3lzdGVtLmVycjwvY29kZT4gYnkgdGhlIHRhcmdldAotICogcHJvZ3JhbSBiZWNvbWUgYXZhaWxhYmxlIGluIHRoZSBpbnB1dCBzdHJlYW0uCi0gKiA8cD4KLSAqIE5vdGUgMTogVGhpcyBzdHJlYW0gaXMgdXN1YWxseSB1bmJ1ZmZlcmVkLgotICogPHA+Ci0gKiBOb3RlIDI6IFR3byBjYWxscyB0byB0aGlzIG1ldGhvZCByZXR1cm4gdGhlIHNhbWUgaWRlbnRpY2FsIGlucHV0IHN0cmVhbS4KLSAqIDxwPgotICogU2VlIGFsc28gPGNvZGU+amF2YS5sYW5nLlByb2Nlc3MuZ2V0RXJyb3JTdHJlYW0oKTwvY29kZT4uCi0gKiAKLSAqIEByZXR1cm4gYW4gaW5wdXQgc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgdGFyZ2V0IFZNJ3MgPGNvZGU+U3lzdGVtLmVycjwvY29kZT4uCi0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLmpkdC50ZXN0cy5ldmFsLnJ1bnRpbWUuVGFyZ2V0RXhjZXB0aW9uIGlmIHRoZSB0YXJnZXQgVk0gaXMgbm90IHJlYWNoYWJsZS4KLSAqLwotcHVibGljIElucHV0U3RyZWFtIGdldEVycm9yU3RyZWFtKCkgdGhyb3dzIFRhcmdldEV4Y2VwdGlvbiB7Ci0JaWYgKHRoaXMucHJvY2VzcyA9PSBudWxsKQotCQl0aHJvdyBuZXcgVGFyZ2V0RXhjZXB0aW9uKCJUaGUgVk0gaXMgbm90IHJ1bm5pbmciKTsKLQllbHNlCi0JCXJldHVybiB0aGlzLnByb2Nlc3MuZ2V0RXJyb3JTdHJlYW0oKTsKLX0KLS8qKiAKLSAqIFJldHVybnMgYW4gaW5wdXQgc3RyZWFtIHRoYXQgaXMgY29ubmVjdGVkIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgCi0gKiAoPGNvZGU+U3lzdGVtLm91dDwvY29kZT4pIG9mIHRoaXMgdGFyZ2V0IFZNLgotICogQnl0ZXMgdGhhdCBhcmUgd3JpdHRlbiB0byA8Y29kZT5TeXN0ZW0ub3V0PC9jb2RlPiBieSB0aGUgdGFyZ2V0Ci0gKiBwcm9ncmFtIGJlY29tZSBhdmFpbGFibGUgaW4gdGhlIGlucHV0IHN0cmVhbS4KLSAqIDxwPgotICogTm90ZSAxOiBUaGlzIHN0cmVhbSBpcyB1c3VhbGx5IGJ1ZmZlcmVkLgotICogPHA+Ci0gKiBOb3RlIDI6IFR3byBjYWxscyB0byB0aGlzIG1ldGhvZCByZXR1cm4gdGhlIHNhbWUgaWRlbnRpY2FsIGlucHV0IHN0cmVhbS4KLSAqIDxwPgotICogU2VlIGFsc28gPGNvZGU+amF2YS5sYW5nLlByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKTwvY29kZT4uCi0gKgotICogQHJldHVybiBhbiBpbnB1dCBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSB0YXJnZXQgVk0ncyA8Y29kZT5TeXN0ZW0ub3V0PC9jb2RlPi4KLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2UuamR0LnRlc3RzLmV2YWwucnVudGltZS5UYXJnZXRFeGNlcHRpb24gaWYgdGhlIHRhcmdldCBWTSBpcyBub3QgcmVhY2hhYmxlLgotICovCi1wdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgVGFyZ2V0RXhjZXB0aW9uIHsKLQlpZiAodGhpcy5wcm9jZXNzID09IG51bGwpCi0JCXRocm93IG5ldyBUYXJnZXRFeGNlcHRpb24oIlRoZSBWTSBpcyBub3QgcnVubmluZyIpOwotCWVsc2UKLQkJLy8gV29ya2Fyb3VuZCBwcm9ibGVtIHdpdGggaW5wdXQgc3RyZWFtIG9mIGEgUHJvY2VzcwotCQlyZXR1cm4gbmV3IFZNSW5wdXRTdHJlYW0odGhpcy5wcm9jZXNzLCB0aGlzLnByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKSk7Ci19Ci0vKioKLSAqIFJldHVybnMgYW4gb3V0cHV0IHN0cmVhbSB0aGF0IGlzIGNvbm5lY3RlZCB0byB0aGUgc3RhbmRhcmQgaW5wdXQgCi0gKiAoPGNvZGU+U3lzdGVtLmluPC9jb2RlPikgb2YgdGhpcyB0YXJnZXQgVk0uCi0gKiBCeXRlcyB0aGF0IGFyZSB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc3RyZWFtIGJ5IGEgY2xpZW50IGJlY29tZSBhdmFpbGFibGUgdG8gdGhlIHRhcmdldCAKLSAqIHByb2dyYW0gaW4gPGNvZGU+U3lzdGVtLmluPC9jb2RlPi4KLSAqIDxwPgotICogTm90ZSAxOiBUaGlzIHN0cmVhbSBpcyB1c3VhbGx5IGJ1ZmZlcmVkLgotICogPHA+Ci0gKiBOb3RlIDI6IFR3byBjYWxscyB0byB0aGlzIG1ldGhvZCByZXR1cm4gdGhlIHNhbWUgaWRlbnRpY2FsIG91dHB1dCBzdHJlYW0uCi0gKiA8cD4KLSAqIFNlZSBhbHNvIDxjb2RlPmphdmEubGFuZy5Qcm9jZXNzLmdldE91dHB1dFN0cmVhbSgpPC9jb2RlPi4KLSAqCi0gKiBAcmV0dXJuIGFuIG91dHB1dCBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSB0YXJnZXQgVk0ncyA8Y29kZT5TeXN0ZW0uaW48L2NvZGU+LgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5qZHQudGVzdHMuZXZhbC5ydW50aW1lLlRhcmdldEV4Y2VwdGlvbiBpZiB0aGUgdGFyZ2V0IFZNIGlzIG5vdCByZWFjaGFibGUuCi0gKi8KLXB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIFRhcmdldEV4Y2VwdGlvbiB7Ci0JaWYgKHRoaXMucHJvY2VzcyA9PSBudWxsKQotCQl0aHJvdyBuZXcgVGFyZ2V0RXhjZXB0aW9uKCJUaGUgVk0gaXMgbm90IHJ1bm5pbmciKTsKLQllbHNlCi0JCXJldHVybiB0aGlzLnByb2Nlc3MuZ2V0T3V0cHV0U3RyZWFtKCk7Ci19Ci0vKioKLSAqIFJldHVybnMgd2hldGhlciB0aGlzIHRhcmdldCBWTSBpcyBzdGlsbCBydW5uaW5nLgotICogPHA+Ci0gKiBOb3RlOiBUaGlzIG9wZXJhdGlvbiBtYXkgcmVxdWlyZSBjb250YWN0aW5nIHRoZSB0YXJnZXQgVk0gdG8gZmluZCBvdXQgCi0gKiAgICAgICBpZiBpdCBpcyBzdGlsbCBydW5uaW5nLgotICovCi1wdWJsaWMgYm9vbGVhbiBpc1J1bm5pbmcoKSB7Ci0JaWYgKHRoaXMucHJvY2VzcyA9PSBudWxsKQotCQlyZXR1cm4gZmFsc2U7Ci0JZWxzZSB7Ci0JCWJvb2xlYW4gaGFzRXhpdGVkOwotCQl0cnkgewotCQkJdGhpcy5wcm9jZXNzLmV4aXRWYWx1ZSgpOwotCQkJaGFzRXhpdGVkID0gdHJ1ZTsKLQkJfSBjYXRjaCAoSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCWhhc0V4aXRlZCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiAhaGFzRXhpdGVkOwotCX0KLX0KLS8qKgotICogU2h1dHMgZG93biB0aGlzIHRhcmdldCBWTS4gCi0gKiBUaGlzIGNhdXNlcyB0aGUgVk0gdG8gZXhpdC4gVGhpcyBvcGVyYXRpb24gaXMgaWdub3JlZAotICogaWYgdGhlIFZNIGhhcyBhbHJlYWR5IHNodXQgZG93bi4KLSAqCi0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLmpkdC50ZXN0cy5ldmFsLnJ1bnRpbWUuVGFyZ2V0RXhjZXB0aW9uIGlmIHRoZSB0YXJnZXQgVk0gY291bGQgbm90IGJlIHNodXQgZG93bi4KLSAqLwotcHVibGljIHZvaWQgc2h1dERvd24oKSAgdGhyb3dzIFRhcmdldEV4Y2VwdGlvbiB7Ci0JdGhpcy5iYXNpY1NodXREb3duKCk7Ci0JaW50IHJldHJ5ID0gMDsKLQl3aGlsZSAodGhpcy5pc1J1bm5pbmcoKSAmJiAoKytyZXRyeSA8IDIwKSkgewotCQl0cnkgewotCQkJVGhyZWFkLnNsZWVwKHJldHJ5ICogMTAwKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCWlmICh0aGlzLmlzUnVubmluZygpKSB7IC8vIGdpdmUgdXAgY2xlYW5pbmcgdGhlIHRhcmdldCBwYXRoIGlmIFZNIGlzIHN0aWxsIHJ1bm5pbmcKLQkJdGhyb3cgbmV3IFRhcmdldEV4Y2VwdGlvbigiQ291bGQgbm90IHNodXQgdGhlIFZNIGRvd24iKTsKLQl9IGVsc2UgewotCQl0aGlzLmNsZWFudXBUYXJnZXRQYXRoKCk7Ci0JfQotfQotLyoqCi0gKiBXYWl0cyBmb3IgdGhlIFZNIHRvIHNodXQgZG93bi4gVGhpcyBtZXRob2QgcmV0dXJucyAKLSAqIGltbWVkaWF0ZWx5IGlmIHRoZSBWTSBoYXMgYWxyZWFkeSBzaHV0IGRvd24uIElmIHRoZQotICogVk0gaGFzIG5vdCB5ZXQgc2h1dCBkb3duLCB0aGUgY2FsbGluZyB0aHJlYWQgd2lsbCBiZQotICogYmxvY2tlZCB1bnRpbCB0aGUgVk0gc2h1dHMgZG93bi4KLSAqCi0gKiBAZXhjZXB0aW9uICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiAgaWYgdGhlIDxjb2RlPndhaXRGb3JUZXJtaW5hdGlvbjwvY29kZT4gd2FzCi0gKiAgICAgICAgICAgICAgIGludGVycnVwdGVkLgotICovCi1wdWJsaWMgdm9pZCB3YWl0Rm9yVGVybWluYXRpb24oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCWlmICh0aGlzLnByb2Nlc3MgPT0gbnVsbCkKLQkJcmV0dXJuOwotCWVsc2UKLQkJdGhpcy5wcm9jZXNzLndhaXRGb3IoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ydW50aW1lL051bGxDb25zb2xlUmVhZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcnVudGltZS9OdWxsQ29uc29sZVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzc4MjYzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ydW50aW1lL051bGxDb25zb2xlUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLnJ1bnRpbWU7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi0vKioKLSAqIEEgbnVsbCBjb25zb2xlIHJlYWRlciB0aGF0IGNvbnRpbnVvdXNseSByZWFkcyBmcm9tIHRoZSBWTSBpbnB1dCBzdHJlYW0KLSAqIHNvIHRoYXQgdGhlIFZNIGRvZXNuJ3QgYmxvY2sgd2hlbiB0aGUgcHJvZ3JhbSB3cml0ZXMgdG8gdGhlIHN0b3V0LgotICovCi0KLXB1YmxpYyBjbGFzcyBOdWxsQ29uc29sZVJlYWRlciBleHRlbmRzIEFic3RyYWN0UmVhZGVyIHsKLQlwcml2YXRlIElucHV0U3RyZWFtIGlucHV0OwotLyoKLSAqIENyZWF0ZXMgYSBuZXcgY29uc29sZSByZWFkZXIgdGhhdCB3aWxsIHJlYWQgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgc3RyZWFtLgotICovCi1wdWJsaWMgTnVsbENvbnNvbGVSZWFkZXIoU3RyaW5nIG5hbWUsIElucHV0U3RyZWFtIGlucHV0KSB7Ci0Jc3VwZXIobmFtZSk7Ci0JdGhpcy5pbnB1dCA9IGlucHV0OwotfQotLyoqCi0gKiBDb250aW51b3VzbHkgcmVhZHMgZXZlbnRzIHRoYXQgYXJlIGNvbWluZyBmcm9tIHRoZSBldmVudCBxdWV1ZS4KLSAqLwotcHJvdGVjdGVkIHZvaWQgcmVhZGVyTG9vcCgpIHsKLQlqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyIGJ1ZmZlcmVkSW5wdXQgPSBuZXcgamF2YS5pby5CdWZmZXJlZFJlYWRlcihuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcih0aGlzLmlucHV0KSk7Ci0JdHJ5IHsKLQkJaW50IHJlYWQ9IDA7Ci0JCXdoaWxlICghdGhpcy5pc1N0b3BwaW5nICYmIHJlYWQgIT0gLTEpIHsKLQkJCXJlYWQ9IGJ1ZmZlcmVkSW5wdXQucmVhZCgpOwotCQl9Ci0JfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3J1bnRpbWUvUHJveHlDb25zb2xlUmVhZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcnVudGltZS9Qcm94eUNvbnNvbGVSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY1NzdmZi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcnVudGltZS9Qcm94eUNvbnNvbGVSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMucnVudGltZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotLyoqCi0gKiBBIDxjb2RlPlByb3h5Q29uc29sZVJlYWRlcjwvY29kZT4gcmVhZHMgdGhlIG91cHV0IGZyb20gdGhlIHByb3h5IGFuZAotICogcmVkaXJlY3RzIGl0IHRvIGEgZmlsZSBvciB0byB0aGUgc3Rkb3V0IGlmICJjb24iIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgotICovCi1jbGFzcyBQcm94eUNvbnNvbGVSZWFkZXIgZXh0ZW5kcyBBYnN0cmFjdFJlYWRlciB7Ci0JcHJpdmF0ZSBJbnB1dFN0cmVhbSBpbnB1dDsKLQlwcml2YXRlIE91dHB1dFN0cmVhbSBvdXRwdXQ7Ci0vKgotICogQ3JlYXRlcyBhIG5ldyBwcm94eSBjb25zb2xlIHJlYWRlciB0aGF0IHdpbGwgcmVhZCBmcm9tIHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0KLSAqIGFuZCByZXdyaXRlIHdoYXQncyByZWFkIHRvIHRoZSBnaXZlbiBmaWxlIChvciB0aGUgc3Rkb3V0IGlzIHRoZSBmaWxlIG5hbWUgaXMKLSAqICJjb24iKQotICovCi1wdWJsaWMgUHJveHlDb25zb2xlUmVhZGVyKFN0cmluZyBuYW1lLCBJbnB1dFN0cmVhbSBpbnB1dCwgU3RyaW5nIGZpbGVOYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci0JdGhpcy5pbnB1dCA9IGlucHV0OwotCWlmIChmaWxlTmFtZS5lcXVhbHMoImNvbiIpKSB7Ci0JCXRoaXMub3V0cHV0PSBTeXN0ZW0ub3V0OwotCX0gZWxzZSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLm91dHB1dD0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZU5hbWUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkIG5vdCBjcmVhdGUgZmlsZSAiICsgZmlsZU5hbWUgKyAiLiBSZWRpcmVjdGluZyB0byBzdGRvdXQiKTsKLQkJCXRoaXMub3V0cHV0PSBTeXN0ZW0ub3V0OwotCQl9Ci0JfQotfQotLyoqCi0gKiBDb250aW51b3VzbHkgcmVhZHMgZnJvbSB0aGUgcHJveHkgb3V0cHV0IGFuZCByZWRpcmVjdCB3aGF0J3MgcmVhZCB0bwotICogdGhpcyByZWFkZXIncyBmaWxlLgotICovCi1wcm90ZWN0ZWQgdm9pZCByZWFkZXJMb29wKCkgewotCXRyeSB7Ci0JCWJ5dGVbXSBidWZmZXI9IG5ldyBieXRlWzEwMjRdOwotCQlpbnQgcmVhZD0gMDsKLQkJd2hpbGUgKCF0aGlzLmlzU3RvcHBpbmcgJiYgcmVhZCAhPSAtMSkgewotCQkJcmVhZD0gdGhpcy5pbnB1dC5yZWFkKGJ1ZmZlcik7Ci0JCQlpZiAocmVhZCAhPSAtMSkKLQkJCQl0aGlzLm91dHB1dC53cml0ZShidWZmZXIsIDAsIHJlYWQpOwotCQl9Ci0JfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JfQotfQotLyoqCi0gKiBTdG9wIHRoaXMgcmVhZGVyCi0gKi8KLXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0Jc3VwZXIuc3RvcCgpOwotCXRyeSB7Ci0JCWlmICh0aGlzLm91dHB1dCAhPSBTeXN0ZW0ub3V0KQotCQkJdGhpcy5vdXRwdXQuY2xvc2UoKTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3J1bnRpbWUvUnVudGltZUNvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3J1bnRpbWUvUnVudGltZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWVhOTVkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ydW50aW1lL1J1bnRpbWVDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMucnVudGltZTsKLQotcHVibGljIGludGVyZmFjZSBSdW50aW1lQ29uc3RhbnRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBQT1JUX1pJUF9GSUxFX05BTUUgPSAiRXZhbFRlc3RzVGFyZ2V0LnppcCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ERV9TTklQUEVUX1JVTk5FUl9DTEFTU19OQU1FID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmV2YWwudGFyZ2V0LkNvZGVTbmlwcGV0UnVubmVyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5fQ09ERV9TTklQUEVUX01FVEhPRCA9ICJydW5Db2RlU25pcHBldCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhFX1JVTk5FUl9GSUVMRCA9ICJ0aGVSdW5uZXIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWQUxQT1JUX0FSRyA9ICItZXZhbHBvcnQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPREVTTklQUEVUX0NMQVNTUEFUSF9BUkcgPSAiLWNzY3AiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPREVTTklQUEVUX0JPT1RQQVRIX0FSRyA9ICItY3NicCI7Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcnVudGltZS9TdGFuZGFyZFZNTGF1bmNoZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ydW50aW1lL1N0YW5kYXJkVk1MYXVuY2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTYxYmY4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9ydW50aW1lL1N0YW5kYXJkVk1MYXVuY2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMucnVudGltZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLnJ1bnRpbWUuUnVudGltZUNvbnN0YW50czsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi0vKioKLSAqIEEgc3RhbmRhcmQgVk0gbGF1bmNoZXIgbGF1bmNoZXMgYW4gZXh0ZXJuYWwgc3RhbmRhcmQgVk0gd2l0aAotICogdGhlIGdpdmVuIGFyZ3VtZW50cyBvbiB0aGUgc2FtZSBtYWNoaW5lLgotICovCi1wdWJsaWMgY2xhc3MgU3RhbmRhcmRWTUxhdW5jaGVyIGV4dGVuZHMgTG9jYWxWTUxhdW5jaGVyIGltcGxlbWVudHMgUnVudGltZUNvbnN0YW50cyB7Ci0JU3RyaW5nIGJhdGNoRmlsZU5hbWU7Ci0vKioKLSAqIENyZWF0ZXMgYSBuZXcgU3RhbmRhcmRWTUxhdW5jaGVyIHRoYXQgbGF1bmNoZXMgYSBzdGFuZGFyZCBWTQotICogb24gdGhlIHNhbWUgbWFjaGluZS4KLSAqLwotcHVibGljIFN0YW5kYXJkVk1MYXVuY2hlcigpIHsKLQlzdXBlcigpOwotfQotLyoqCi0gKiBCdWlsZHMgdGhlIGFjdHVhbCBib290IGNsYXNzIHBhdGggdGhhdCBpcyBnb2luZyB0byBiZSBwYXNzZWQgdG8gdGhlIFZNLgotICovCi1wcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkQm9vdENsYXNzUGF0aCgpIHsKLQlTdHJpbmdCdWZmZXIgYm9vdFBhdGhTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JY2hhciBwYXRoU2VwYXJhdG9yID0gRmlsZS5wYXRoU2VwYXJhdG9yQ2hhcjsKLQkKLQlpZiAodGhpcy5ib290UGF0aCAhPSBudWxsKSB7Ci0JCS8vIEFkZCBib290IGNsYXNzIHBhdGggZ2l2ZW4gYnkgY2xpZW50Ci0JCWludCBsZW5ndGggPSB0aGlzLmJvb3RQYXRoLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKyl7Ci0JCQlib290UGF0aFN0cmluZy5hcHBlbmQodGhpcy5ib290UGF0aFtpXSk7Ci0JCQlib290UGF0aFN0cmluZy5hcHBlbmQocGF0aFNlcGFyYXRvcik7Ci0JCX0KLQl9IGVsc2UgewotCQkvLyBBZGQgcmVndWxhciBydC5qYXIKLQkJYm9vdFBhdGhTdHJpbmcuYXBwZW5kKHRoaXMudm1QYXRoKTsKLQkJYm9vdFBhdGhTdHJpbmcuYXBwZW5kKEZpbGUuc2VwYXJhdG9yKTsKLQkJaWYgKCEodGhpcy52bVBhdGgudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgianJlIikgfHwgdGhpcy52bVBhdGgudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgianJlIiArIEZpbGUuc2VwYXJhdG9yKSkpIHsKLQkJCWJvb3RQYXRoU3RyaW5nLmFwcGVuZCgianJlIik7Ci0JCQlib290UGF0aFN0cmluZy5hcHBlbmQoRmlsZS5zZXBhcmF0b3IpOwotCQl9Ci0JCWJvb3RQYXRoU3RyaW5nLmFwcGVuZCgibGliIik7Ci0JCWJvb3RQYXRoU3RyaW5nLmFwcGVuZChGaWxlLnNlcGFyYXRvcik7Ci0JCWJvb3RQYXRoU3RyaW5nLmFwcGVuZCgicnQuamFyIik7Ci0JCWJvb3RQYXRoU3RyaW5nLmFwcGVuZChwYXRoU2VwYXJhdG9yKTsKLQl9Ci0JCi0JLy8gQWRkIGJvb3QgY2xhc3MgcGF0aCBkaXJlY3RvcnkgaWYgbmVlZGVkCi0JaWYgKHRoaXMuZXZhbFRhcmdldFBhdGggIT0gbnVsbCAmJiBUQVJHRVRfSEFTX0ZJTEVfU1lTVEVNKSB7Ci0JCWJvb3RQYXRoU3RyaW5nLmFwcGVuZCh0aGlzLmV2YWxUYXJnZXRQYXRoKTsKLQkJYm9vdFBhdGhTdHJpbmcuYXBwZW5kKEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0JCWJvb3RQYXRoU3RyaW5nLmFwcGVuZChCT09UX0NMQVNTUEFUSF9ESVJFQ1RPUlkpOwotCX0KLQotCXJldHVybiBib290UGF0aFN0cmluZy50b1N0cmluZygpOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBiYXRjaCBmaWxlIHVzZWQgdG8gbGF1bmNoIHRoZSBWTS4KLSAqLwotcHVibGljIFN0cmluZyBnZXRCYXRjaEZpbGVOYW1lKCkgewotCXJldHVybiB0aGlzLmJhdGNoRmlsZU5hbWU7Ci19Ci0vKioKLSAqIEBzZWUgTG9jYWxWTUxhdW5jaGVyI2dldENvbW1hbmRMaW5lCi0gKi8KLXB1YmxpYyBTdHJpbmdbXSBnZXRDb21tYW5kTGluZSgpIHsJCi0JVmVjdG9yIGNvbW1hbmRMaW5lPSBuZXcgVmVjdG9yKCk7Ci0JCi0JLy8gVk0gYmluYXJ5Ci0JY29tbWFuZExpbmUuYWRkRWxlbWVudCgKLQkJdGhpcy52bVBhdGggKyAKLQkJKHRoaXMudm1QYXRoLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSA/ICIiIDogRmlsZS5zZXBhcmF0b3IpICsgCi0JCSJiaW4iICsgCi0JCUZpbGUuc2VwYXJhdG9yICsgCi0JCSJqYXZhdyIpOwotCi0JLy8gVk0gYXJndW1lbnRzCi0JaWYgKHRoaXMudm1Bcmd1bWVudHMgIT0gbnVsbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMudm1Bcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWNvbW1hbmRMaW5lLmFkZEVsZW1lbnQodGhpcy52bUFyZ3VtZW50c1tpXSk7Ci0JCX0KLQl9Ci0KLQkvLyBkZWJ1ZyBtb2RlCi0JaWYgKHRoaXMuZGVidWdQb3J0ICE9IC0xKSB7Ci0JCWNvbW1hbmRMaW5lLmFkZEVsZW1lbnQoIi1YZGVidWciKTsKLQkJY29tbWFuZExpbmUuYWRkRWxlbWVudCgiLVhub2FnZW50Iik7Ci0JCS8vY29tbWFuZExpbmUuYWRkRWxlbWVudCgiLURqYXZhLmNvbXBpbGVyPU5PTkUiKTsKLQkJY29tbWFuZExpbmUuYWRkRWxlbWVudCgKLQkJCSItWHJ1bmpkd3A6dHJhbnNwb3J0PWR0X3NvY2tldCxhZGRyZXNzPSIgKwotCQkJdGhpcy5kZWJ1Z1BvcnQgKwotCQkJIixzZXJ2ZXI9eSxzdXNwZW5kPW4iKTsKLQl9Ci0KLQkvLyBib290IGNsYXNzcGF0aAotCWNvbW1hbmRMaW5lLmFkZEVsZW1lbnQoIi1YYm9vdGNsYXNzcGF0aDoiICsgYnVpbGRCb290Q2xhc3NQYXRoKCkpOwotCi0JLy8gcmVndWxhciBjbGFzc3BhdGgKLQljb21tYW5kTGluZS5hZGRFbGVtZW50KCItY2xhc3NwYXRoIik7Ci0JY29tbWFuZExpbmUuYWRkRWxlbWVudChidWlsZENsYXNzUGF0aCgpKTsKLQotCS8vIGNvZGUgc25pcHBldCBydW5uZXIgY2xhc3MKLQlpZiAodGhpcy5ldmFsUG9ydCAhPSAtMSkgewotCQljb21tYW5kTGluZS5hZGRFbGVtZW50KENPREVfU05JUFBFVF9SVU5ORVJfQ0xBU1NfTkFNRSk7Ci0JfQotCQotCS8vIGNvZGUgc25pcHBldCBydW5uZXIgYXJndW1lbnRzCi0JaWYgKHRoaXMuZXZhbFBvcnQgIT0gLTEpIHsKLQkJY29tbWFuZExpbmUuYWRkRWxlbWVudChFVkFMUE9SVF9BUkcpOwotCQljb21tYW5kTGluZS5hZGRFbGVtZW50KEludGVnZXIudG9TdHJpbmcodGhpcy5ldmFsUG9ydCkpOwotCQlpZiAoVEFSR0VUX0hBU19GSUxFX1NZU1RFTSkgewotCQkJY29tbWFuZExpbmUuYWRkRWxlbWVudChDT0RFU05JUFBFVF9DTEFTU1BBVEhfQVJHKTsKLQkJCWNvbW1hbmRMaW5lLmFkZEVsZW1lbnQodGhpcy5ldmFsVGFyZ2V0UGF0aCArIEZpbGUuc2VwYXJhdG9yICsgUkVHVUxBUl9DTEFTU1BBVEhfRElSRUNUT1JZKTsKLQkJCWNvbW1hbmRMaW5lLmFkZEVsZW1lbnQoQ09ERVNOSVBQRVRfQk9PVFBBVEhfQVJHKTsKLQkJCWNvbW1hbmRMaW5lLmFkZEVsZW1lbnQodGhpcy5ldmFsVGFyZ2V0UGF0aCArIEZpbGUuc2VwYXJhdG9yICsgQk9PVF9DTEFTU1BBVEhfRElSRUNUT1JZKTsKLQkJfQotCX0KLQotCS8vIHByb2dyYW0gY2xhc3MKLQlpZiAodGhpcy5wcm9ncmFtQ2xhc3MgIT0gbnVsbCkgewotCQljb21tYW5kTGluZS5hZGRFbGVtZW50KHRoaXMucHJvZ3JhbUNsYXNzKTsKLQl9Ci0JCi0JLy8gcHJvZ3JhbSBhcmd1bWVudHMKLQlpZiAodGhpcy5wcm9ncmFtQXJndW1lbnRzICE9IG51bGwpIHsKLQkJZm9yIChpbnQgaT0wO2k8dGhpcy5wcm9ncmFtQXJndW1lbnRzLmxlbmd0aDtpKyspIHsKLQkJCWNvbW1hbmRMaW5lLmFkZEVsZW1lbnQodGhpcy5wcm9ncmFtQXJndW1lbnRzW2ldKTsKLQkJfQotCX0KLQotCVN0cmluZ1tdIHJlc3VsdDsKLQlpZiAodGhpcy5iYXRjaEZpbGVOYW1lIT0gbnVsbCkgewotCQkvLyBXcml0ZSB0byBiYXRjaCBmaWxlIGlmIHNwZWNpZmllZAotCQl3cml0ZUJhdGNoRmlsZSh0aGlzLmJhdGNoRmlsZU5hbWUsIGNvbW1hbmRMaW5lKTsKLQkJcmVzdWx0ID0gbmV3IFN0cmluZ1tdIHt0aGlzLmJhdGNoRmlsZU5hbWV9OwotCX0gZWxzZSB7Ci0JCXJlc3VsdCA9IG5ldyBTdHJpbmdbY29tbWFuZExpbmUuc2l6ZSgpXTsKLQkJY29tbWFuZExpbmUuY29weUludG8ocmVzdWx0KTsKLQl9Ci0KLQkvLyBjaGVjayBmb3Igc3BhY2VzIGluIHJlc3VsdAotCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7Ci0JCVN0cmluZyBhcmd1bWVudCA9IHJlc3VsdFtpXTsKLQkJaWYgKGFyZ3VtZW50LmluZGV4T2YoJyAnKSAhPSAtMSkgewotCQkJcmVzdWx0W2ldID0gIlwiIiArIGFyZ3VtZW50ICsgIlwiIjsKLQkJfQotCX0KLQkKLQlyZXR1cm4gcmVzdWx0OwotfQotLyoqCi0gKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBiYXRjaCBmaWxlIHVzZWQgdG8gbGF1bmNoIHRoZSBWTS4KLSAqIFdoZW4gdGhpcyBvcHRpb24gaXMgc2V0LCB0aGUgbGF1bmNoZXIgd3JpdGVzIHRoZSBjb21tYW5kIGxpbmUgdG8gdGhlIGdpdmVuIGJhdGNoIGZpbGUsIAotICogYW5kIGl0IGxhdW5jaGVzIHRoZSAgYmF0Y2ggZmlsZS4gVGhpcyBjYXVzZXMgYSBET1MgY29uc29sZSB0byBiZSBvcGVuZWQuIE5vdGUgaXQgCi0gKiBkb2Vzbid0IGRlbGV0ZSB0aGUgYmF0Y2ggZmlsZSB3aGVuIGRvbmUuCi0gKi8KLXB1YmxpYyB2b2lkIHNldEJhdGNoRmlsZU5hbWUoU3RyaW5nIGJhdGNoRmlsZU5hbWUpIHsKLQl0aGlzLmJhdGNoRmlsZU5hbWUgPSBiYXRjaEZpbGVOYW1lOwotfQotcHJpdmF0ZSB2b2lkIHdyaXRlQmF0Y2hGaWxlKFN0cmluZyBmaWxlTmFtZSwgVmVjdG9yIGNvbW1hbmRMaW5lKSB7Ci0JRmlsZU91dHB1dFN0cmVhbSBvdXRwdXQgPSBudWxsOwotCXRyeSB7Ci0JCW91dHB1dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVOYW1lKTsKLQkJUHJpbnRXcml0ZXIgb3V0PSBuZXcgUHJpbnRXcml0ZXIob3V0cHV0KTsKLQkJZm9yIChFbnVtZXJhdGlvbiBlID0gY29tbWFuZExpbmUuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCW91dC5wcmludCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSk7Ci0JCQlvdXQucHJpbnQoIiAiKTsKLQkJfQotCQlvdXQucHJpbnRsbigicGF1c2UiKTsKLQkJb3V0LmNsb3NlKCk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQlpZiAob3V0cHV0ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJb3V0cHV0LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMikgewotCQkJfQotCQl9Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3J1bnRpbWUvVGFyZ2V0RXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcnVudGltZS9UYXJnZXRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE2MDU1Ny4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcnVudGltZS9UYXJnZXRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMucnVudGltZTsKLQotLyoqCi0gKiBBIFRhcmdldEV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gb24gYSB0YXJnZXQgaGFzIGZhaWxlZAotICogZm9yIGFueSByZWFzb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXJnZXRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotLyoqCi0gKiBDb25zdHJ1Y3RzIGEgPGNvZGU+VGFyZ2V0RXhjZXB0aW9uPC9jb2RlPiB3aXRoIG5vIGRldGFpbCAgbWVzc2FnZS4KLSAqLwotcHVibGljIFRhcmdldEV4Y2VwdGlvbigpIHsKLQlzdXBlcigpOwotfQotLyoqCi0gKiBDb25zdHJ1Y3RzIGEgPGNvZGU+VGFyZ2V0RXhjZXB0aW9uPC9jb2RlPiB3aXRoIHRoZSBzcGVjaWZpZWQgCi0gKiBkZXRhaWwgbWVzc2FnZS4gCi0gKgotICogQHBhcmFtICAgcyAgIHRoZSBkZXRhaWwgbWVzc2FnZS4KLSAqLwotcHVibGljIFRhcmdldEV4Y2VwdGlvbihTdHJpbmcgcykgewotCXN1cGVyKHMpOwotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3J1bnRpbWUvVGFyZ2V0SW50ZXJmYWNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcnVudGltZS9UYXJnZXRJbnRlcmZhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMxYzJkYy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcnVudGltZS9UYXJnZXRJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLnJ1bnRpbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ2xhc3NGaWxlOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotLyoqCi0gKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgdG8gdGhlIHRhcmdldCBWTS4gSXQgY29ubmVjdHMgdG8gYW4gSURFSW50ZXJmYWNlIG9uIHRoZSB0YXJnZXQgc2lkZSAKLSAqIHVzaW5nIFRDUC9JTyB0byBzZW5kIHJlcXVlc3QgZm9yIGNvZGUgc25pcHBldCBldmFsdWF0aW9uIGFuZCB0byBnZXQgdGhlIHJlc3VsdCBiYWNrLgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuZXZhbC50YXJnZXQuSURFSW50ZXJmYWNlIGZvciBkZXRhaWxzIGFib3V0IHRoZSBwcm90b2NvbC4KLSAqLwotcHVibGljIGNsYXNzIFRhcmdldEludGVyZmFjZSB7Ci0JLyoqCi0JICogV2hldGhlciBjbGFzcyBmaWxlcyBzaG91bGQgYmUgd3JpdHRlbiBpbiBkOlxldmFsXCBpbnN0ZWFkIG9mIHNlbmRpbmcgdGhlbSB0byB0aGUgdGFyZ2V0Ci0JICogTkI6IGQ6XGV2YWwgc2hvdWxkIGNvbnRhaW4gYSBiYXRjaCBmaWxlIFRlc3RDb2RlU25pcHBldC5iYXQgd2l0aCB0aGUgZm9sbG93aW5nIGNvbnRlbnRzOgotCSAqCQlTRVQgSkRLPWM6XGpkazEuMi4yCi0JICoJCVNFVCBFVkFMPWQ6XGV2YWwKLQkgKgkJJUpESyVcYmluXGphdmEgLVhib290Y2xhc3NwYXRoOiVKREslXGpyZVxsaWJccnQuamFyOyVFVkFMJVxqYXZhQ2xhc3NlczsgLWNsYXNzcGF0aCBjOlx0ZW1wOyVFVkFMJVxzbmlwcGV0czslRVZBTCVcY2xhc3NlczsiZDpcaWRlXHByb2plY3RfcmVzb3VyY2VzXEVjbGlwc2UgSmF2YSBFdmFsdWF0aW9uXENvZGVTbmlwcGV0U3VwcG9ydC5qYXIiIENvZGVTbmlwcGV0VGVzdGVyICUxCi0JICovCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQlTdHJpbmcgY29kZVNuaXBwZXRDbGFzc05hbWU7Ci0KLQkvKioKLQkgKiBXaGV0aGVyIHRpbWluZyBpbmZvIHNob3VsZCBiZSBwcmludGVkIHRvIHN0ZG91dAotCSAqLwotCXN0YXRpYyBmaW5hbCBib29sZWFuIFRJTUlORyA9IGZhbHNlOwotCWxvbmcgc2VudFRpbWU7Ci0JCi0JLyoqCi0JICogVGhlIGNvbm5lY3Rpb24gdG8gdGhlIHRhcmdldCdzIGlkZSBpbnRlcmZhY2UuCi0JICovCi0JU29ja2V0IHNvY2tldDsKLQotCXB1YmxpYyBjbGFzcyBSZXN1bHQgewotCQlwdWJsaWMgY2hhcltdIGRpc3BsYXlTdHJpbmc7Ci0JCXB1YmxpYyBjaGFyW10gdHlwZU5hbWU7Ci0JfQotCi0vKioKLSAqIChQUklWQVRFIEFQSSkKLSAqIENvbm5lY3RzIHRoaXMgaW50ZXJmYWNlIHRvIHRoZSB0YXJnZXQuCi0gKiBUcnkgYXMgbG9uZyBhcyB0aGUgZ2l2ZW4gdGltZSAoaW4gbXMpIGhhcyBub3QgZXhwaXJlZC4KLSAqIFVzZSBpc0Nvbm5lY3RlZCgpIHRvIGZpbmQgb3V0IGlmIHRoZSBjb25uZWN0aW9uIHdhcyBzdWNjZXNzZnVsLgotICovCi1wdWJsaWMgdm9pZCBjb25uZWN0KFN0cmluZyB0YXJnZXRBZGRyZXNzLCBpbnQgcG9ydE51bWJlciwgaW50IHRpbWVvdXQpIHsKLQlpZiAoaXNDb25uZWN0ZWQoKSkgewotCQlyZXR1cm47Ci0JfQotCWlmIChwb3J0TnVtYmVyID4gMCkgewotCQlsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlkbyB7Ci0JCQl0cnkgewotCQkJCXRoaXMuc29ja2V0ID0gbmV3IFNvY2tldCh0YXJnZXRBZGRyZXNzLCBwb3J0TnVtYmVyKTsKLQkJCQl0aGlzLnNvY2tldC5zZXRUY3BOb0RlbGF5KHRydWUpOwotCQkJCWJyZWFrOwotCQkJfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgewotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfQotCQkJaWYgKHRoaXMuc29ja2V0ID09IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoMTAwKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9IHdoaWxlICghaXNDb25uZWN0ZWQoKSAmJiAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWUpIDwgdGltZW91dCk7Ci0JfQotfQotLyoqCi0gKiAoUFJJVkFURSBBUEkpCi0gKiBEaXNjb25uZWN0cyB0aGlzIGludGVyZmFjZSBmcm9tIHRoZSB0YXJnZXQuIAotICovCi1wdWJsaWMgdm9pZCBkaXNjb25uZWN0KCkgewotCWlmICh0aGlzLnNvY2tldCAhPSBudWxsKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLnNvY2tldC5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBBbHJlYWR5IGNsb3NlZC4gTm90aGluZyBtb3JlIHRvIGRvCi0JCX0KLQkJdGhpcy5zb2NrZXQgPSBudWxsOwotCX0KLX0KLS8qKgotICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBldmFsdWF0aW9uIHNlbnQgcHJldmlvdXNseSB0byB0aGUgdGFyZ2V0LiAKLSAqLwotcHVibGljIFJlc3VsdCBnZXRSZXN1bHQoKSB7Ci0JYm9vbGVhbiBoYXNWYWx1ZSA9IGZhbHNlOwotCVN0cmluZyB0eXBlTmFtZSA9IG51bGw7Ci0JU3RyaW5nIHRvU3RyaW5nID0gbnVsbDsKLQlpZiAoREVCVUcpIHsKLQkJaGFzVmFsdWUgPSB0cnVlOwotCQl0eXBlTmFtZSA9ICJUYXJnZXRJbnRlcmZhY2UgaW4gZGVidWcgbW9kZS4gUnVuIGQ6XFxldmFsXFxUZXN0Q29kZVNuaXBwZXQuYmF0IGQ6XFxldmFsXFxzbmlwcGV0c1xcIiArIGNvZGVTbmlwcGV0Q2xhc3NOYW1lOwotCQl0b1N0cmluZyA9ICIiOwotCX0gZWxzZSB7Ci0JCWlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIHsKLQkJCS8vIFRCRDogUmVhZCB0eXBlIG5hbWUgYW5kIHRvU3RyaW5nIGFzIGEgY2hhcmFjdGVyIGFycmF5Ci0JCQl0cnkgewotCQkJCURhdGFJbnB1dFN0cmVhbSBpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0odGhpcy5zb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0JCQkJaGFzVmFsdWUgPSBpbi5yZWFkQm9vbGVhbigpOwotCQkJCWlmIChoYXNWYWx1ZSkgewotCQkJCQl0eXBlTmFtZSA9IGluLnJlYWRVVEYoKTsKLQkJCQkJdG9TdHJpbmcgPSBpbi5yZWFkVVRGKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdHlwZU5hbWUgPSBudWxsOwotCQkJCQl0b1N0cmluZyA9IG51bGw7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIFRoZSBzb2NrZXQgaGFzIGxpa2VseSBiZWVuIGNsb3NlZCBvbiB0aGUgb3RoZXIgZW5kLiBTbyB0aGUgY29kZSBzbmlwcGV0IHJ1bm5lciBoYXMgc3RvcHBlZC4KLQkJCQloYXNWYWx1ZSA9IHRydWU7Ci0JCQkJdHlwZU5hbWUgPSBlLmdldE1lc3NhZ2UoKTsKLQkJCQl0b1N0cmluZyA9ICIiOwotCQkJCXRoaXMuZGlzY29ubmVjdCgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaGFzVmFsdWUgPSB0cnVlOwotCQkJdHlwZU5hbWUgPSAiQ29ubmVjdGlvbiBoYXMgYmVlbiBsb3N0IjsKLQkJCXRvU3RyaW5nID0gIiI7Ci0JCX0KLQl9Ci0JaWYgKFRJTUlORykgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRpbWUgdG8gc2VuZCBjb21waWxlZCBjbGFzc2VzLCBydW4gb24gdGFyZ2V0IGFuZCBnZXQgcmVzdWx0IGlzICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aGlzLnNlbnRUaW1lKSArICJtcyIpOwotCX0KLQlSZXN1bHQgcmVzdWx0ID0gbmV3IFJlc3VsdCgpOwotCXJlc3VsdC5kaXNwbGF5U3RyaW5nID0gdG9TdHJpbmcgPT0gbnVsbCA/IG51bGwgOiB0b1N0cmluZy50b0NoYXJBcnJheSgpOwotCXJlc3VsdC50eXBlTmFtZSA9IHR5cGVOYW1lID09IG51bGwgPyBudWxsIDogdHlwZU5hbWUudG9DaGFyQXJyYXkoKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotLyoqCi0gKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBpbnRlcmZhY2UgaXMgY29ubmVjdGVkIHRvIHRoZSB0YXJnZXQuCi0gKi8KLWJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7Ci0JcmV0dXJuIHRoaXMuc29ja2V0ICE9IG51bGw7Ci19Ci0vKioKLSAqIFNlbmRzIHRoZSBnaXZlbiBjbGFzcyBkZWZpbml0aW9ucyB0byB0aGUgdGFyZ2V0IGZvciBsb2FkaW5nIGFuZCAoaWYgc3BlY2lmaWVkKSBmb3IgcnVubmluZy4KLSAqLwotcHVibGljIHZvaWQgc2VuZENsYXNzZXMoYm9vbGVhbiBtdXN0UnVuLCBDbGFzc0ZpbGVbXSBjbGFzc2VzKSB0aHJvd3MgVGFyZ2V0RXhjZXB0aW9uIHsKLQlpZiAoREVCVUcpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gbmV3IFN0cmluZyhjbGFzc2VzW2ldLmZpbGVOYW1lKCkpLnJlcGxhY2UoJy8nLCAnXFwnKSArICIuY2xhc3MiOwotCQkJaWYgKChpID09IDApICYmIChjbGFzc05hbWUuaW5kZXhPZigiQ29kZVNuaXBwZXQiKSAhPSAtMSkpIHsKLQkJCQljb2RlU25pcHBldENsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQkJCQl0cnkgewotCQkJCQlDbGFzc0ZpbGUud3JpdGVUb0Rpc2sodHJ1ZSwgImQ6XFxldmFsXFxzbmlwcGV0cyIsIGNsYXNzTmFtZSwgY2xhc3Nlc1swXS5nZXRCeXRlcygpKTsKLQkJCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCVN0cmluZyBkaXJOYW1lOwotCQkJCWlmIChjbGFzc05hbWUuc3RhcnRzV2l0aCgiamF2YSIpKSB7Ci0JCQkJCWRpck5hbWUgPSAiZDpcXGV2YWxcXCIgKyBMb2NhbFZNTGF1bmNoZXIuQk9PVF9DTEFTU1BBVEhfRElSRUNUT1JZOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWRpck5hbWUgPSAiZDpcXGV2YWxcXCIgKyBMb2NhbFZNTGF1bmNoZXIuUkVHVUxBUl9DTEFTU1BBVEhfRElSRUNUT1JZOwotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlDbGFzc0ZpbGUud3JpdGVUb0Rpc2sodHJ1ZSwgZGlyTmFtZSwgY2xhc3NOYW1lLCBjbGFzc2VzW2ldLmdldEJ5dGVzKCkpOwotCQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChUSU1JTkcpIHsKLQkJCXRoaXMuc2VudFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlpZiAoIWlzQ29ubmVjdGVkKCkpIHsKLQkJCXRocm93IG5ldyBUYXJnZXRFeGNlcHRpb24oIkNvbm5lY3Rpb24gdG8gdGhlIHRhcmdldCBWTSBoYXMgYmVlbiBsb3N0Iik7Ci0JCX0KLQkJdHJ5IHsKLQkJCURhdGFPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0odGhpcy5zb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCkpOwotCQkJb3V0LndyaXRlQm9vbGVhbihtdXN0UnVuKTsKLQkJCW91dC53cml0ZUludChjbGFzc2VzLmxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlieXRlW10gY2xhc3NEZWZpbml0aW9uID0gY2xhc3Nlc1tpXS5nZXRCeXRlcygpOwotCQkJCW91dC53cml0ZUludChjbGFzc0RlZmluaXRpb24ubGVuZ3RoKTsKLQkJCQlvdXQud3JpdGUoY2xhc3NEZWZpbml0aW9uKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gVGhlIHNvY2tldCBoYXMgbGlrZWx5IGJlZW4gY2xvc2VkIG9uIHRoZSBvdGhlciBlbmQuIFNvIHRoZSBjb2RlIHNuaXBwZXQgcnVubmVyIGhhcyBzdG9wcGVkLgotCQkJdGhpcy5kaXNjb25uZWN0KCk7Ci0JCX0KLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcnVudGltZS9WTUlucHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvcnVudGltZS9WTUlucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMDA2MDcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3J1bnRpbWUvVk1JbnB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMucnVudGltZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotLyoqCi0gKiBXb3JrYXJvdW5kIHByb2JsZW0gd2l0aCBpbnB1dCBzdHJlYW0gZnJvbSBhIDxjb2RlPmphdmEubGFuZy5Qcm9jZXNzPC9jb2RlPgotICogdGhhdCB0aHJvd3MgYW4gPGNvZGU+SU9FeGNlcHRpb248L2NvZGU+IGV2ZW4gaWYgdGhlcmUgaXMgc29tZXRoaW5nIHRvIHJlYWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBWTUlucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0gewotCUlucHV0U3RyZWFtIGlucHV0OwotCVByb2Nlc3MgcHJvY2VzczsKLXB1YmxpYyBWTUlucHV0U3RyZWFtKFByb2Nlc3MgcHJvY2VzcywgSW5wdXRTdHJlYW0gaW5wdXQpIHsKLQl0aGlzLnByb2Nlc3M9IHByb2Nlc3M7Ci0JdGhpcy5pbnB1dD0gaW5wdXQ7Ci19Ci1wdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JcmV0dXJuIHRoaXMuaW5wdXQuYXZhaWxhYmxlKCk7Ci19Ci1wdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JdGhpcy5pbnB1dC5jbG9zZSgpOwotfQotcHJpdmF0ZSBib29sZWFuIGlzUnVubmluZygpIHsKLQlpZiAodGhpcy5wcm9jZXNzID09IG51bGwpCi0JCXJldHVybiBmYWxzZTsKLQllbHNlIHsKLQkJYm9vbGVhbiBoYXNFeGl0ZWQ7Ci0JCXRyeSB7Ci0JCQl0aGlzLnByb2Nlc3MuZXhpdFZhbHVlKCk7Ci0JCQloYXNFeGl0ZWQgPSB0cnVlOwotCQl9IGNhdGNoIChJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb24gZSkgewotCQkJaGFzRXhpdGVkID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuICFoYXNFeGl0ZWQ7Ci0JfQotfQotcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1hcmsoaW50IHJlYWRsaW1pdCkgewotCXRoaXMuaW5wdXQubWFyayhyZWFkbGltaXQpOwotfQotcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKLQlyZXR1cm4gdGhpcy5pbnB1dC5tYXJrU3VwcG9ydGVkKCk7Ci19Ci1wdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCXRyeSB7Ci0JCXJldHVybiB0aGlzLmlucHV0LnJlYWQoKTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCWlmIChpc1J1bm5pbmcoKSkgewotCQkJcmV0dXJuIHJlYWQoKTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci19Ci1wdWJsaWMgaW50IHJlYWQoYnl0ZSBiW10pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JLy8gTWFrZSBzdXJlIHRoZSBieXRlIGFycmF5IGlzIGluaXRpYWxpemVkICh2YWx1ZSBvZiAwIGlzIHVzZWQgaW4gdGhlIHdvcmthcm91bmQgYmVsb3cpCi0JZm9yIChpbnQgaT0wO2k8Yi5sZW5ndGg7aSsrKQotCQliW2ldPTA7Ci0JCQotCWludCByZWFkOwotCXRyeSB7Ci0JCXJlYWQgPSB0aGlzLmlucHV0LnJlYWQoYik7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQlpZiAoaXNSdW5uaW5nKCkpIHsKLQkJCS8vIFdvcmthcm91bmQgcHJvYmxlbSB3aXRoIGltcGxlbWVudGF0aW9uIG9mIFByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKQotCQkJLy8gKHNlZSBQUiAxUFJXNjcwOiBMRlJFOldJTk5UIC0gUHJvZ3JhbSBoYW5ncyBydW5uaW5nIGluIExlYXBGcm9nKQotCQkJcmVhZD0gMDsKLQkJCXdoaWxlIChyZWFkIDwgYi5sZW5ndGggJiYgYltyZWFkXSAhPSAwKSB7Ci0JCQkJcmVhZCsrOwotCQkJfQotCQl9IGVsc2UKLQkJCXRocm93IGU7Ci0JfQotCi0JcmV0dXJuIHJlYWQ7Ci19Ci1wdWJsaWMgaW50IHJlYWQoYnl0ZSBiW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JLy8gTWFrZSBzdXJlIHRoZSBieXRlIGFycmF5IGlzIGluaXRpYWxpemVkICh2YWx1ZSBvZiAwIGlzIHVzZWQgaW4gdGhlIHdvcmthcm91bmQgYmVsb3cpCi0JZm9yIChpbnQgaSA9IG9mZjsgaSA8IGxlbjsgaSsrKQotCQliW2ldID0gMDsKLQotCWludCByZWFkOwotCXRyeSB7Ci0JCXJlYWQgPSB0aGlzLmlucHV0LnJlYWQoYiwgb2ZmLCBsZW4pOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJaWYgKGlzUnVubmluZygpKSB7Ci0JCQkvLyBXb3JrYXJvdW5kIHByb2JsZW0gd2l0aCBpbXBsZW1lbnRhdGlvbiBvZiBQcm9jZXNzLmdldElucHV0U3RyZWFtKCkKLQkJCS8vIChzZWUgUFIgMVBSVzY3MDogTEZSRTpXSU5OVCAtIFByb2dyYW0gaGFuZ3MgcnVubmluZyBpbiBMZWFwRnJvZykKLQkJCXJlYWQgPSAwOwotCQkJd2hpbGUgKG9mZiArIHJlYWQgPCBsZW4gJiYgYltvZmYgKyByZWFkXSAhPSAwKSB7Ci0JCQkJcmVhZCsrOwotCQkJfQotCQl9IGVsc2UKLQkJCXRocm93IGU7Ci0JfQotCXJldHVybiByZWFkOwotfQotcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQl0aGlzLmlucHV0LnJlc2V0KCk7Ci19Ci1wdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlyZXR1cm4gdGhpcy5pbnB1dC5za2lwKG4pOwotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3V0aWwvU29ja2V0SGVscGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvdXRpbC9Tb2NrZXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg2NmYwNC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvdXRpbC9Tb2NrZXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotcHVibGljIGNsYXNzIFNvY2tldEhlbHBlciB7Ci0JaW50IGxvY2FsUG9ydCA9IC0xOwotLyoqCi0gKiBVc2luZyB0aGUgZ2l2ZW4gcG9ydCBudW1iZXIgdG8gY3JlYXRlIGEgc2VydmVyLCBjcmVhdGVzIGEgY29ubmVjdGlvbiB0byB0aGlzIHNlcnZlcgotICogYW5kIHJldHVybnMgdGhlIGxvY2FsIHBvcnQgb2YgdGhlIGNsaWVudCAoYWZ0ZXIgY2xvc2luZyB0aGUgY29ubmVjdGlvbiBzbyB0aGF0Ci0gKiB0aGUgbG9jYWwgcG9ydCBpcyBub3cgYXZhaWxhYmxlKS4KLSAqIFJldHVybnMgLTEgaWYgdGhlIHNlcnZlciBjb3VsZCBub3QgYmUgY3JlYXRlZC4KLSAqLwotcHVibGljIGludCBnZXRBdmFpbGFibGVQb3J0KGZpbmFsIGludCBwb3J0TnVtYmVyKSB7Ci0JdGhpcy5sb2NhbFBvcnQgPSAtMTsKLQlUaHJlYWQgc2VydmVyID0gbmV3IFRocmVhZCgpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdHJ5IHsKLQkJCQluZXcgU2VydmVyU29ja2V0KHBvcnROdW1iZXIpLmFjY2VwdCgpLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gYWRkcmVzcyBpbiB1c2UKLQkJCX0KLQkJfQotCX07Ci0Jc2VydmVyLnN0YXJ0KCk7Ci0KLQl0cnkgewotCQlTb2NrZXQgc29ja2V0ID0gbmV3IFNvY2tldCgiMTI3LjAuMC4xIiwgcG9ydE51bWJlcik7Ci0JCXNlcnZlci5qb2luKDIwMDApOwotCQl0aGlzLmxvY2FsUG9ydCA9IHNvY2tldC5nZXRMb2NhbFBvcnQoKTsKLQkJc29ja2V0LmNsb3NlKCk7Ci0JfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJLy8gY29ubmVjdGlvbiByZWZ1c2VkCi0JfQotCQotCXJldHVybiB0aGlzLmxvY2FsUG9ydDsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy91dGlsL1Rlc3RWZXJpZmllci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3V0aWwvVGVzdFZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NTk5ZTQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3V0aWwvVGVzdFZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMucnVudGltZS4qOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotLyoqCi0gKiBWZXJpZmllcyB0aGF0IHRoZSAuY2xhc3MgZmlsZXMgcmVzdWx0aW5nIGZyb20gYSBjb21waWxhdGlvbiBjYW4gYmUgbG9hZGVkCi0gKiBpbiBhIFZNIGFuZCB0aGF0IHRoZXkgY2FuIGJlIHJ1bi4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RWZXJpZmllciB7Ci0JcHVibGljIFN0cmluZyBmYWlsdXJlUmVhc29uOwotCQotCWJvb2xlYW4gcmV1c2VWTSA9IHRydWU7Ci0JU3RyaW5nW10gY2xhc3NwYXRoQ2FjaGU7Ci0JTG9jYWxWaXJ0dWFsTWFjaGluZSB2bTsKLQlTdHJpbmdCdWZmZXIgb3V0cHV0QnVmZmVyOwotCVN0cmluZ0J1ZmZlciBlcnJvckJ1ZmZlcjsKLQlTb2NrZXQgc29ja2V0OwotcHVibGljIFRlc3RWZXJpZmllcihib29sZWFuIHJldXNlVk0pIHsKLQl0aGlzLnJldXNlVk0gPSByZXVzZVZNOwotfQotcHJpdmF0ZSBib29sZWFuIGNoZWNrQnVmZmVycyhTdHJpbmcgZXJyb3JTdHJpbmcsIFN0cmluZyBvdXRwdXRTdHJpbmcsIFN0cmluZyBzb3VyY2VGaWxlTmFtZSwgU3RyaW5nIGV4cGVjdGVkU3VjY2Vzc091dHB1dFN0cmluZykgewotCi0JaWYgKGVycm9yU3RyaW5nLmxlbmd0aCgpID4gMCkgewotCQl0aGlzLmZhaWx1cmVSZWFzb24gPQotCQkJIlVuZXhwZWN0ZWQgdGFyZ2V0IGVycm9yIHJ1bm5pbmcgcmVzdWx0aW5nIGNsYXNzIGZpbGUgZm9yICIKLQkJCQkrIHNvdXJjZUZpbGVOYW1lCi0JCQkJKyAiOlxuIgotCQkJCSsgZXJyb3JTdHJpbmc7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JU3RyaW5nIHBsYXRmb3JtSW5kZXBlbmRhbnRPdXRwdXRTdHJpbmcgPSBVdGlsLmNvbnZlcnRUb0luZGVwZW5kYW50TGluZURlbGltaXRlcihvdXRwdXRTdHJpbmcpOwotCWlmIChleHBlY3RlZFN1Y2Nlc3NPdXRwdXRTdHJpbmcgIT0gbnVsbCAmJiAocGxhdGZvcm1JbmRlcGVuZGFudE91dHB1dFN0cmluZy5pbmRleE9mKGV4cGVjdGVkU3VjY2Vzc091dHB1dFN0cmluZykgPT0gLTEKLQkJfHwgZXhwZWN0ZWRTdWNjZXNzT3V0cHV0U3RyaW5nLmxlbmd0aCgpID09IDAgJiYgcGxhdGZvcm1JbmRlcGVuZGFudE91dHB1dFN0cmluZy5sZW5ndGgoKSAhPSAwKSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oVXRpbC5kaXNwbGF5U3RyaW5nKHBsYXRmb3JtSW5kZXBlbmRhbnRPdXRwdXRTdHJpbmcsIDIpKTsKLQkJdGhpcy5mYWlsdXJlUmVhc29uID0KLQkJCSJVbmV4cGVjdGVkIG91dHB1dCBydW5uaW5nIHJlc3VsdGluZyBjbGFzcyBmaWxlIGZvciAiCi0JCQkJKyBzb3VyY2VGaWxlTmFtZQotCQkJCSsgIjpcbiIKLQkJCQkrICItLVtTVEFSVF0tLVxuIgotCQkJCSsgb3V0cHV0U3RyaW5nCi0JCQkJKyAiLS0tW0VORF0tLS1cbiI7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcmV0dXJuIHRydWU7Ci19Ci0KLXByaXZhdGUgYm9vbGVhbiBjaGVja0J1ZmZlcnNUaHJvd2luZ0Vycm9yKFN0cmluZyBlcnJvclN0cmluZywgU3RyaW5nIHNvdXJjZUZpbGVOYW1lLCBTdHJpbmcgZXhwZWN0ZWRTdWNjZXNzT3V0cHV0U3RyaW5nKSB7Ci0KLQlpZiAoZXJyb3JTdHJpbmcubGVuZ3RoKCkgPiAwICYmIGVycm9yU3RyaW5nLmluZGV4T2YoZXhwZWN0ZWRTdWNjZXNzT3V0cHV0U3RyaW5nKSAhPSAtMSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JdGhpcy5mYWlsdXJlUmVhc29uID0KLQkJIkV4cGVjdGVkIGVycm9yIG5vdCB0aHJvd24gZm9yICIKLQkJCSsgc291cmNlRmlsZU5hbWUKLQkJCSsgIjpcbiIKLQkJCSsgZXhwZWN0ZWRTdWNjZXNzT3V0cHV0U3RyaW5nOwotCXJldHVybiBmYWxzZTsKLX0KLQotcHJpdmF0ZSB2b2lkIGNvbXBpbGVWZXJpZnlUZXN0cyhTdHJpbmcgdmVyaWZpZXJEaXIpIHsKLQlTdHJpbmcgZnVsbHlRdWFsaWZpZWROYW1lID0gVmVyaWZ5VGVzdHMuY2xhc3MuZ2V0TmFtZSgpOwotCi0JaW50IGxhc3REb3QgPSBmdWxseVF1YWxpZmllZE5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQlTdHJpbmcgcGFja2FnZU5hbWUgPSBmdWxseVF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKDAsIGxhc3REb3QpOwotCVN0cmluZyBzaW1wbGVOYW1lID0gZnVsbHlRdWFsaWZpZWROYW1lLnN1YnN0cmluZyhsYXN0RG90ICsgMSk7Ci0JCi0JU3RyaW5nIGRpck5hbWUgPSB2ZXJpZmllckRpci5yZXBsYWNlKCdcXCcsICcvJykgKyAiLyIgKyBwYWNrYWdlTmFtZS5yZXBsYWNlKCcuJywgJy8nKTsKLQlGaWxlIGRpciA9IG5ldyBGaWxlKGRpck5hbWUucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcikpOwotCWlmICghZGlyLmV4aXN0cygpICYmICFkaXIubWtkaXJzKCkpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgY3JlYXRlICIgKyBkaXIpOwotCQlyZXR1cm47Ci0JfQotCVN0cmluZyBmaWxlTmFtZSA9IGRpciArIEZpbGUuc2VwYXJhdG9yICsgc2ltcGxlTmFtZSArICIuamF2YSI7Ci0JVXRpbC53cml0ZVRvRmlsZSh0aGlzLmdldFZlcmlmeVRlc3RzQ29kZSgpLCBmaWxlTmFtZSk7Ci0Jb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmJhdGNoLk1haW4uY29tcGlsZSgiXCIiICsgZmlsZU5hbWUgKyAiXCIgLWQgXCIiICsgdmVyaWZpZXJEaXIgKyAiXCIgLWNsYXNzcGF0aCBcIiIgKyBVdGlsLmdldEphdmFDbGFzc0xpYigpICsgIlwiIik7Ci19Ci1wdWJsaWMgdm9pZCBleGVjdXRlKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZ1tdIGNsYXNzcGF0aHMpIHsKLQl0aGlzLm91dHB1dEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQl0aGlzLmVycm9yQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQotCWxhdW5jaEFuZFJ1bihjbGFzc05hbWUsIGNsYXNzcGF0aHMsIG51bGwsIG51bGwpOwotfQotcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQl0aGlzLnNodXREb3duKCk7Ci19Ci1wdWJsaWMgU3RyaW5nIGdldEV4ZWN1dGlvbk91dHB1dCgpewotCXJldHVybiBvdXRwdXRCdWZmZXIudG9TdHJpbmcoKTsKLX0KLQotcHVibGljIFN0cmluZyBnZXRFeGVjdXRpb25FcnJvcigpewotCXJldHVybiBlcnJvckJ1ZmZlci50b1N0cmluZygpOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBjb2RlIG9mIHRoZSBWZXJpZnlUZXN0cyBjbGFzcy4KLSAqCi0gKiBUbyBnZW5lcmF0ZToKLSAqCS0gZXhwb3J0IFZlcmlmeVRlc3RzIHRvIGM6L3RlbXAvdGVzdAotICogIC0gaW5zcGVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy51dGlsLlV0aWwuZmlsZUNvbnRlbnRUb0Rpc3BsYXlTdHJpbmcoImM6L3RlbXAvdGVzdC9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy91dGlsL1ZlcmlmeVRlc3RzLmphdmEiLCAyKQotICovCi1wcml2YXRlIFN0cmluZyBnZXRWZXJpZnlUZXN0c0NvZGUoKSB7Ci0JcmV0dXJuIAotCQkicGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy51dGlsO1xuIiArIAotCQkiaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7XG4iICsgCi0JCSJpbXBvcnQgamF2YS5pby4qO1xuIiArIAotCQkiaW1wb3J0IGphdmEubmV0Lio7XG4iICsgCi0JCSJpbXBvcnQgamF2YS51dGlsLio7XG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgVmVyaWZ5VGVzdHMge1xuIiArIAotCQkiCWludCBwb3J0TnVtYmVyO1xuIiArIAotCQkiCVNvY2tldCBzb2NrZXQ7XG4iICsgCi0JCSIvKipcbiIgKyAKLQkJIiAqIE5PVEU6IENvZGUgY29waWVkIGZyb20ganVuaXQudXRpbC5UZXN0Q2FzZUNsYXNzTG9hZGVyLlxuIiArIAotCQkiICpcbiIgKyAKLQkJIiAqIEEgY3VzdG9tIGNsYXNzIGxvYWRlciB3aGljaCBlbmFibGVzIHRoZSByZWxvYWRpbmdcbiIgKyAKLQkJIiAqIG9mIGNsYXNzZXMgZm9yIGVhY2ggdGVzdCBydW4uIFRoZSBjbGFzcyBsb2FkZXJcbiIgKyAKLQkJIiAqIGNhbiBiZSBjb25maWd1cmVkIHdpdGggYSBsaXN0IG9mIHBhY2thZ2UgcGF0aHMgdGhhdFxuIiArIAotCQkiICogc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gbG9hZGluZy4gVGhlIGxvYWRpbmdcbiIgKyAKLQkJIiAqIG9mIHRoZXNlIHBhY2thZ2VzIGlzIGRlbGVnYXRlZCB0byB0aGUgc3lzdGVtIGNsYXNzXG4iICsgCi0JCSIgKiBsb2FkZXIuIFRoZXkgd2lsbCBiZSBzaGFyZWQgYWNyb3NzIHRlc3QgcnVucy5cbiIgKyAKLQkJIiAqIDxwPlxuIiArIAotCQkiICogVGhlIGxpc3Qgb2YgZXhjbHVkZWQgcGFja2FnZSBwYXRocyBpcyBzcGVjaWZpZWQgaW5cbiIgKyAKLQkJIiAqIGEgcHJvcGVydGllcyBmaWxlIFwiZXhjbHVkZWQucHJvcGVydGllc1wiIHRoYXQgaXMgbG9jYXRlZCBpbiBcbiIgKyAKLQkJIiAqIHRoZSBzYW1lIHBsYWNlIGFzIHRoZSBUZXN0Q2FzZUNsYXNzTG9hZGVyIGNsYXNzLlxuIiArIAotCQkiICogPHA+XG4iICsgCi0JCSIgKiA8Yj5Lbm93biBsaW1pdGF0aW9uOjwvYj4gdGhlIFZlcmlmeUNsYXNzTG9hZGVyIGNhbm5vdCBsb2FkIGNsYXNzZXNcbiIgKyAKLQkJIiAqIGZyb20gamFyIGZpbGVzLlxuIiArIAotCQkiICovXG4iICsgCi0JCSJwdWJsaWMgY2xhc3MgVmVyaWZ5Q2xhc3NMb2FkZXIgZXh0ZW5kcyBDbGFzc0xvYWRlciB7XG4iICsgCi0JCSIJLyoqIHNjYW5uZWQgY2xhc3MgcGF0aCAqL1xuIiArIAotCQkiCXByaXZhdGUgU3RyaW5nW10gZlBhdGhJdGVtcztcbiIgKyAKLQkJIglcbiIgKyAKLQkJIgkvKiogZXhjbHVkZWQgcGF0aHMgKi9cbiIgKyAKLQkJIglwcml2YXRlIFN0cmluZ1tdIGZFeGNsdWRlZD0ge307XG4iICsgCi0JCSIJLyoqXG4iICsgCi0JCSIJICogQ29uc3RydWN0cyBhIFZlcmlmeUNsYXNzTG9hZGVyLiBJdCBzY2FucyB0aGUgY2xhc3MgcGF0aFxuIiArIAotCQkiCSAqIGFuZCB0aGUgZXhjbHVkZWQgcGFja2FnZSBwYXRoc1xuIiArIAotCQkiCSAqL1xuIiArIAotCQkiCXB1YmxpYyBWZXJpZnlDbGFzc0xvYWRlcigpIHtcbiIgKyAKLQkJIgkJc3VwZXIoKTtcbiIgKyAKLQkJIgkJU3RyaW5nIGNsYXNzUGF0aD0gU3lzdGVtLmdldFByb3BlcnR5KFwiamF2YS5jbGFzcy5wYXRoXCIpO1xuIiArIAotCQkiCQlTdHJpbmcgc2VwYXJhdG9yPSBTeXN0ZW0uZ2V0UHJvcGVydHkoXCJwYXRoLnNlcGFyYXRvclwiKTtcbiIgKyAKLQkJIgkJXG4iICsgCi0JCSIJCS8vIGZpcnN0IHBhc3M6IGNvdW50IGVsZW1lbnRzXG4iICsgCi0JCSIJCVN0cmluZ1Rva2VuaXplciBzdD0gbmV3IFN0cmluZ1Rva2VuaXplcihjbGFzc1BhdGgsIHNlcGFyYXRvcik7XG4iICsgCi0JCSIJCWludCBpPSAwO1xuIiArIAotCQkiCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7XG4iICsgCi0JCSIJCQlzdC5uZXh0VG9rZW4oKTtcbiIgKyAKLQkJIgkJCWkrKztcbiIgKyAKLQkJIgkJfVxuIiArIAotCQkiCQkvLyBzZWNvbmQgcGFzczogc3BsaXRcbiIgKyAKLQkJIgkJZlBhdGhJdGVtcz0gbmV3IFN0cmluZ1tpXTtcbiIgKyAKLQkJIgkJc3Q9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY2xhc3NQYXRoLCBzZXBhcmF0b3IpO1xuIiArIAotCQkiCQlpPSAwO1xuIiArIAotCQkiCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7XG4iICsgCi0JCSIJCQlmUGF0aEl0ZW1zW2krK109IHN0Lm5leHRUb2tlbigpO1xuIiArIAotCQkiCQl9XG4iICsgCi0JCSIJfVxuIiArIAotCQkiCXB1YmxpYyBqYXZhLm5ldC5VUkwgZ2V0UmVzb3VyY2UoU3RyaW5nIG5hbWUpIHtcbiIgKyAKLQkJIgkJcmV0dXJuIENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlKG5hbWUpO1xuIiArIAotCQkiCX1cbiIgKyAKLQkJIglwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShTdHJpbmcgbmFtZSkge1xuIiArIAotCQkiCQlyZXR1cm4gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtUmVzb3VyY2VBc1N0cmVhbShuYW1lKTtcbiIgKyAKLQkJIgl9XG4iICsgCi0JCSIJcHJvdGVjdGVkIGJvb2xlYW4gaXNFeGNsdWRlZChTdHJpbmcgbmFtZSkge1xuIiArIAotCQkiCQkvLyBleGNsdWRlIHRoZSBcImphdmFcIiBwYWNrYWdlcy5cbiIgKyAKLQkJIgkJLy8gVGhleSBhbHdheXMgbmVlZCB0byBiZSBleGNsdWRlZCBzbyB0aGF0IHRoZXkgYXJlIGxvYWRlZCBieSB0aGUgc3lzdGVtIGNsYXNzIGxvYWRlclxuIiArIAotCQkiCQlpZiAobmFtZS5zdGFydHNXaXRoKFwiamF2YVwiKSlcbiIgKyAKLQkJIgkJCXJldHVybiB0cnVlO1xuIiArIAotCQkiCQkJXG4iICsgCi0JCSIJCS8vIGV4Y2x1ZGUgdGhlIHVzZXIgZGVmaW5lZCBwYWNrYWdlIHBhdGhzXG4iICsgCi0JCSIJCWZvciAoaW50IGk9IDA7IGkgPCBmRXhjbHVkZWQubGVuZ3RoOyBpKyspIHtcbiIgKyAKLQkJIgkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoZkV4Y2x1ZGVkW2ldKSkge1xuIiArIAotCQkiCQkJCXJldHVybiB0cnVlO1xuIiArIAotCQkiCQkJfVxuIiArIAotCQkiCQl9XG4iICsgCi0JCSIJCXJldHVybiBmYWxzZTsJXG4iICsgCi0JCSIJfVxuIiArIAotCQkiCXB1YmxpYyBzeW5jaHJvbml6ZWQgQ2xhc3MgbG9hZENsYXNzKFN0cmluZyBuYW1lLCBib29sZWFuIHJlc29sdmUpXG4iICsgCi0JCSIJCXRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHtcbiIgKyAKLQkJIgkJCVxuIiArIAotCQkiCQlDbGFzcyBjPSBmaW5kTG9hZGVkQ2xhc3MobmFtZSk7XG4iICsgCi0JCSIJCWlmIChjICE9IG51bGwpXG4iICsgCi0JCSIJCQlyZXR1cm4gYztcbiIgKyAKLQkJIgkJLy9cbiIgKyAKLQkJIgkJLy8gRGVsZWdhdGUgdGhlIGxvYWRpbmcgb2YgZXhjbHVkZWQgY2xhc3NlcyB0byB0aGVcbiIgKyAKLQkJIgkJLy8gc3RhbmRhcmQgY2xhc3MgbG9hZGVyLlxuIiArIAotCQkiCQkvL1xuIiArIAotCQkiCQlpZiAoaXNFeGNsdWRlZChuYW1lKSkge1xuIiArIAotCQkiCQkJdHJ5IHtcbiIgKyAKLQkJIgkJCQljPSBmaW5kU3lzdGVtQ2xhc3MobmFtZSk7XG4iICsgCi0JCSIJCQkJcmV0dXJuIGM7XG4iICsgCi0JCSIJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHtcbiIgKyAKLQkJIgkJCQkvLyBrZWVwIHNlYXJjaGluZ1xuIiArIAotCQkiCQkJfVxuIiArIAotCQkiCQl9XG4iICsgCi0JCSIJCWlmIChjID09IG51bGwpIHtcbiIgKyAKLQkJIgkJCUZpbGUgZmlsZT0gbG9jYXRlKG5hbWUpO1xuIiArIAotCQkiCQkJaWYgKGZpbGUgPT0gbnVsbClcbiIgKyAKLQkJIgkJCQl0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigpO1xuIiArIAotCQkiCQkJYnl0ZSBkYXRhW109IGxvYWRDbGFzc0RhdGEoZmlsZSk7XG4iICsgCi0JCSIJCQljPSBkZWZpbmVDbGFzcyhuYW1lLCBkYXRhLCAwLCBkYXRhLmxlbmd0aCk7XG4iICsgCi0JCSIJCX1cbiIgKyAKLQkJIgkJaWYgKHJlc29sdmUpIFxuIiArIAotCQkiCQkJcmVzb2x2ZUNsYXNzKGMpO1xuIiArIAotCQkiCQlyZXR1cm4gYztcbiIgKyAKLQkJIgl9XG4iICsgCi0JCSIJcHJpdmF0ZSBieXRlW10gbG9hZENsYXNzRGF0YShGaWxlIGYpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHtcbiIgKyAKLQkJIgkJdHJ5IHtcbiIgKyAKLQkJIgkJCS8vU3lzdGVtLm91dC5wcmludGxuKFwibG9hZGluZzogXCIrZi5nZXRQYXRoKCkpO1xuIiArIAotCQkiCQkJRmlsZUlucHV0U3RyZWFtIHN0cmVhbT0gbmV3IEZpbGVJbnB1dFN0cmVhbShmKTtcbiIgKyAKLQkJIgkJCVxuIiArIAotCQkiCQkJdHJ5IHtcbiIgKyAKLQkJIgkJCQlieXRlW10gYj0gbmV3IGJ5dGVbc3RyZWFtLmF2YWlsYWJsZSgpXTtcbiIgKyAKLQkJIgkJCQlzdHJlYW0ucmVhZChiKTtcbiIgKyAKLQkJIgkJCQlzdHJlYW0uY2xvc2UoKTtcbiIgKyAKLQkJIgkJCQlyZXR1cm4gYjtcbiIgKyAKLQkJIgkJCX1cbiIgKyAKLQkJIgkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7XG4iICsgCi0JCSIJCQkJdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oKTtcbiIgKyAKLQkJIgkJCX1cbiIgKyAKLQkJIgkJfVxuIiArIAotCQkiCQljYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHtcbiIgKyAKLQkJIgkJCXRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKCk7XG4iICsgCi0JCSIJCX1cbiIgKyAKLQkJIgl9XG4iICsgCi0JCSIJLyoqXG4iICsgCi0JCSIJICogTG9jYXRlIHRoZSBnaXZlbiBmaWxlLlxuIiArIAotCQkiCSAqIEByZXR1cm4gUmV0dXJucyBudWxsIGlmIGZpbGUgY291bGRuXCd0IGJlIGZvdW5kLlxuIiArIAotCQkiCSAqL1xuIiArIAotCQkiCXByaXZhdGUgRmlsZSBsb2NhdGUoU3RyaW5nIGZpbGVOYW1lKSB7IFxuIiArIAotCQkiCQlmaWxlTmFtZT0gZmlsZU5hbWUucmVwbGFjZShcJy5cJywgXCcvXCcpK1wiLmNsYXNzXCI7XG4iICsgCi0JCSIJCUZpbGUgcGF0aD0gbnVsbDtcbiIgKyAKLQkJIgkJXG4iICsgCi0JCSIJCWlmIChmaWxlTmFtZSAhPSBudWxsKSB7XG4iICsgCi0JCSIJCQlmb3IgKGludCBpPSAwOyBpIDwgZlBhdGhJdGVtcy5sZW5ndGg7IGkrKykge1xuIiArIAotCQkiCQkJCXBhdGg9IG5ldyBGaWxlKGZQYXRoSXRlbXNbaV0sIGZpbGVOYW1lKTtcbiIgKyAKLQkJIgkJCQlpZiAocGF0aC5leGlzdHMoKSlcbiIgKyAKLQkJIgkJCQkJcmV0dXJuIHBhdGg7XG4iICsgCi0JCSIJCQl9XG4iICsgCi0JCSIJCX1cbiIgKyAKLQkJIgkJcmV0dXJuIG51bGw7XG4iICsgCi0JCSIJfVxuIiArIAotCQkifVxuIiArIAotCQkiCVxuIiArIAotCQkicHVibGljIHZvaWQgbG9hZEFuZFJ1bihTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgVGhyb3dhYmxlIHtcbiIgKyAKLQkJIgkvL1N5c3RlbS5vdXQucHJpbnRsbihcIkxvYWRpbmcgXCIgKyBjbGFzc05hbWUgKyBcIi4uLlwiKTtcbiIgKyAKLQkJIglDbGFzcyB0ZXN0Q2xhc3MgPSBuZXcgVmVyaWZ5Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoY2xhc3NOYW1lKTtcbiIgKyAKLQkJIgkvL1N5c3RlbS5vdXQucHJpbnRsbihcIkxvYWRlZCBcIiArIGNsYXNzTmFtZSk7XG4iICsgCi0JCSIJdHJ5IHtcbiIgKyAKLQkJIgkJTWV0aG9kIG1haW4gPSB0ZXN0Q2xhc3MuZ2V0TWV0aG9kKFwibWFpblwiLCBuZXcgQ2xhc3NbXSB7U3RyaW5nW10uY2xhc3N9KTtcbiIgKyAKLQkJIgkJLy9TeXN0ZW0ub3V0LnByaW50bG4oXCJSdW5uaW5nIFwiICsgY2xhc3NOYW1lKTtcbiIgKyAKLQkJIgkJbWFpbi5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtdIHtuZXcgU3RyaW5nW10ge319KTtcbiIgKyAKLQkJIgkJLy9TeXN0ZW0ub3V0LnByaW50bG4oXCJGaW5pc2hlZCBydW5uaW5nIFwiICsgY2xhc3NOYW1lKTtcbiIgKyAKLQkJIgl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkge1xuIiArIAotCQkiCQlyZXR1cm47XG4iICsgCi0JCSIJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7XG4iICsgCi0JCSIJCXRocm93IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7XG4iICsgCi0JCSIJfVxuIiArIAotCQkifVxuIiArIAotCQkicHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uIHtcbiIgKyAKLQkJIglWZXJpZnlUZXN0cyB2ZXJpZnkgPSBuZXcgVmVyaWZ5VGVzdHMoKTtcbiIgKyAKLQkJIgl2ZXJpZnkucG9ydE51bWJlciA9IEludGVnZXIucGFyc2VJbnQoYXJnc1swXSk7XG4iICsgCi0JCSIJdmVyaWZ5LnJ1bigpO1xuIiArIAotCQkifVxuIiArIAotCQkicHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHtcbiIgKyAKLQkJIglTZXJ2ZXJTb2NrZXQgc2VydmVyID0gbmV3IFNlcnZlclNvY2tldCh0aGlzLnBvcnROdW1iZXIpO1xuIiArIAotCQkiCXRoaXMuc29ja2V0ID0gc2VydmVyLmFjY2VwdCgpO1xuIiArIAotCQkiCXRoaXMuc29ja2V0LnNldFRjcE5vRGVsYXkodHJ1ZSk7XG4iICsgCi0JCSIJc2VydmVyLmNsb3NlKCk7XG4iICsgCi0JCSIJRGF0YUlucHV0U3RyZWFtIGluID0gbmV3IERhdGFJbnB1dFN0cmVhbSh0aGlzLnNvY2tldC5nZXRJbnB1dFN0cmVhbSgpKTtcbiIgKyAKLQkJIglmaW5hbCBEYXRhT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKHRoaXMuc29ja2V0LmdldE91dHB1dFN0cmVhbSgpKTtcbiIgKyAKLQkJIgl3aGlsZSAodHJ1ZSkge1xuIiArIAotCQkiCQlmaW5hbCBTdHJpbmcgY2xhc3NOYW1lID0gaW4ucmVhZFVURigpO1xuIiArIAotCQkiCQlUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCgpIHtcbiIgKyAKLQkJIgkJCXB1YmxpYyB2b2lkIHJ1bigpIHtcbiIgKyAKLQkJIgkJCQl0cnkge1xuIiArIAotCQkiCQkJCQlsb2FkQW5kUnVuKGNsYXNzTmFtZSk7XG4iICsgCi0JCSIJCQkJCW91dC53cml0ZUJvb2xlYW4odHJ1ZSk7XG4iICsgCi0JCSIJCQkJCVN5c3RlbS5lcnIucHJpbnRsbihWZXJpZnlUZXN0cy5jbGFzcy5nZXROYW1lKCkpO1xuIiArIAotCQkiCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oVmVyaWZ5VGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTtcbiIgKyAKLQkJIgkJCQl9IGNhdGNoIChUaHJvd2FibGUgZSkge1xuIiArIAotCQkiCQkJCQllLnByaW50U3RhY2tUcmFjZSgpO1xuIiArIAotCQkiCQkJCQl0cnkge1xuIiArIAotCQkiCQkJCQkJU3lzdGVtLmVyci5wcmludGxuKFZlcmlmeVRlc3RzLmNsYXNzLmdldE5hbWUoKSk7XG4iICsgCi0JCSIJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oVmVyaWZ5VGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTtcbiIgKyAKLQkJIgkJCQkJCW91dC53cml0ZUJvb2xlYW4oZmFsc2UpO1xuIiArIAotCQkiCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkge1xuIiArIAotCQkiCQkJCQl9XG4iICsgCi0JCSIJCQkJfVxuIiArIAotCQkiCQkJfVxuIiArIAotCQkiCQl9O1xuIiArIAotCQkiCQl0aHJlYWQuc3RhcnQoKTtcbiIgKyAKLQkJIgl9XG4iICsgCi0JCSJ9XG4iICsgCi0JCSJ9XG4iOwotfQotcHJpdmF0ZSB2b2lkIGxhdW5jaEFuZFJ1bihTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmdbXSBjbGFzc3BhdGhzLCBTdHJpbmdbXSBwcm9ncmFtQXJndW1lbnRzLCBTdHJpbmdbXSB2bUFyZ3VtZW50cykgewotCS8vIHdlIHdvbid0IHJldXNlIHRoZSB2bSwgc2h1dCB0aGUgZXhpc3Rpbmcgb25lIGlmIHJ1bm5pbmcKLQlpZiAodGhpcy52bSAhPSBudWxsKSB7Ci0JCXRyeSB7Ci0JCQl2bS5zaHV0RG93bigpOwotCQl9IGNhdGNoIChUYXJnZXRFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCXRoaXMuY2xhc3NwYXRoQ2FjaGUgPSBudWxsOwotCi0JLy8gbGF1bmNoIGEgbmV3IG9uZQotCUxvY2FsVk1MYXVuY2hlciBsYXVuY2hlciA9IExvY2FsVk1MYXVuY2hlci5nZXRMYXVuY2hlcigpOwotCWxhdW5jaGVyLnNldENsYXNzUGF0aChjbGFzc3BhdGhzKTsKLQlsYXVuY2hlci5zZXRWTVBhdGgoVXRpbC5nZXRKUkVEaXJlY3RvcnkoKSk7Ci0JaWYgKHZtQXJndW1lbnRzICE9IG51bGwpIHsKLQkJU3RyaW5nW10gY29tcGxldGVWbUFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbdm1Bcmd1bWVudHMubGVuZ3RoICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkodm1Bcmd1bWVudHMsIDAsIGNvbXBsZXRlVm1Bcmd1bWVudHMsIDEsIHZtQXJndW1lbnRzLmxlbmd0aCk7Ci0JCWNvbXBsZXRlVm1Bcmd1bWVudHNbMF0gPSAiLXZlcmlmeSI7Ci0JCWxhdW5jaGVyLnNldFZNQXJndW1lbnRzKGNvbXBsZXRlVm1Bcmd1bWVudHMpOwotCX0gZWxzZSB7Ci0JCWxhdW5jaGVyLnNldFZNQXJndW1lbnRzKG5ldyBTdHJpbmdbXSB7Ii12ZXJpZnkifSk7Ci0JfQotCWxhdW5jaGVyLnNldFByb2dyYW1DbGFzcyhjbGFzc05hbWUpOwotCWxhdW5jaGVyLnNldFByb2dyYW1Bcmd1bWVudHMocHJvZ3JhbUFyZ3VtZW50cyk7Ci0JVGhyZWFkIG91dHB1dFRocmVhZDsKLQlUaHJlYWQgZXJyb3JUaHJlYWQ7Ci0JdHJ5IHsKLQkJdGhpcy52bSA9IGxhdW5jaGVyLmxhdW5jaCgpOwotCQlmaW5hbCBJbnB1dFN0cmVhbSBpbnB1dCA9IHRoaXMudm0uZ2V0SW5wdXRTdHJlYW0oKTsKLQkJb3V0cHV0VGhyZWFkID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW50IGMgPSBpbnB1dC5yZWFkKCk7Ci0JCQkJCXdoaWxlIChjICE9IC0xKSB7Ci0JCQkJCQlvdXRwdXRCdWZmZXIuYXBwZW5kKChjaGFyKSBjKTsKLQkJCQkJCWMgPSBpbnB1dC5yZWFkKCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoKElPRXhjZXB0aW9uIGlvRXgpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlmaW5hbCBJbnB1dFN0cmVhbSBlcnJvclN0cmVhbSA9IHRoaXMudm0uZ2V0RXJyb3JTdHJlYW0oKTsKLQkJZXJyb3JUaHJlYWQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlpbnQgYyA9IGVycm9yU3RyZWFtLnJlYWQoKTsKLQkJCQkJd2hpbGUgKGMgIT0gLTEpIHsKLQkJCQkJCWVycm9yQnVmZmVyLmFwcGVuZCgoY2hhcikgYyk7Ci0JCQkJCQljID0gZXJyb3JTdHJlYW0ucmVhZCgpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBpb0V4KSB7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJb3V0cHV0VGhyZWFkLnN0YXJ0KCk7Ci0JCWVycm9yVGhyZWFkLnN0YXJ0KCk7Ci0JfSBjYXRjaChUYXJnZXRFeGNlcHRpb24gZSkgewotCQl0aHJvdyBuZXcgRXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotCX0KLQotCS8vIHdhaXQgZm9yIHZtIHRvIHNodXQgZG93biBieSBpdHNlbGYKLQl0cnkgewotCQlvdXRwdXRUaHJlYWQuam9pbig1MDAwKTsKLQkJZXJyb3JUaHJlYWQuam9pbig1MDAwKTsKLQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotcHJpdmF0ZSB2b2lkIGxhdW5jaFZlcmlmeVRlc3RzSWZOZWVkZWQoU3RyaW5nW10gY2xhc3NwYXRocywgU3RyaW5nW10gdm1Bcmd1bWVudHMpIHsKLQkvLyBkZXRlcm1pbmUgaWYgd2UgY2FuIHJldXNlIHRoZSB2bQotCWlmICh0aGlzLnZtICE9IG51bGwgJiYgdGhpcy52bS5pc1J1bm5pbmcoKSAmJiB0aGlzLmNsYXNzcGF0aENhY2hlICE9IG51bGwpIHsKLQkJYm9vbGVhbiBzYW1lQ2xhc3NwYXRocyA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NwYXRocy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCF0aGlzLmNsYXNzcGF0aENhY2hlW2ldLmVxdWFscyhjbGFzc3BhdGhzW2ldKSkgewotCQkJCXNhbWVDbGFzc3BhdGhzID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNhbWVDbGFzc3BhdGhzKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkvLyB3ZSBjb3VsZCBub3QgcmV1c2UgdGhlIHZtLCBzaHV0IHRoZSBleGlzdGluZyBvbmUgaWYgcnVubmluZwotCWlmICh0aGlzLnZtICE9IG51bGwpIHsKLQkJdHJ5IHsKLQkJCXZtLnNodXREb3duKCk7Ci0JCX0gY2F0Y2ggKFRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLQl0aGlzLmNsYXNzcGF0aENhY2hlID0gY2xhc3NwYXRoczsKLQotCS8vIGxhdW5jaCBhIG5ldyBvbmUKLQlMb2NhbFZNTGF1bmNoZXIgbGF1bmNoZXIgPSBMb2NhbFZNTGF1bmNoZXIuZ2V0TGF1bmNoZXIoKTsKLQlpbnQgbGVuZ3RoID0gY2xhc3NwYXRocy5sZW5ndGg7Ci0JU3RyaW5nW10gY3AgPSBuZXcgU3RyaW5nW2xlbmd0aCArIDFdOwotCVN5c3RlbS5hcnJheWNvcHkoY2xhc3NwYXRocywgMCwgY3AsIDAsIGxlbmd0aCk7Ci0JU3RyaW5nIHZlcmlmaWVyRGlyID0gVXRpbC5nZXRPdXRwdXREaXJlY3RvcnkoKSArIEZpbGUuc2VwYXJhdG9yICsgInZlcmlmaWVyIjsKLQl0aGlzLmNvbXBpbGVWZXJpZnlUZXN0cyh2ZXJpZmllckRpcik7Ci0JY3BbbGVuZ3RoXSA9IHZlcmlmaWVyRGlyOwotCWxhdW5jaGVyLnNldENsYXNzUGF0aChjcCk7Ci0JbGF1bmNoZXIuc2V0Vk1QYXRoKFV0aWwuZ2V0SlJFRGlyZWN0b3J5KCkpOwotCWlmICh2bUFyZ3VtZW50cyAhPSBudWxsKSB7Ci0JCVN0cmluZ1tdIGNvbXBsZXRlVm1Bcmd1bWVudHMgPSBuZXcgU3RyaW5nW3ZtQXJndW1lbnRzLmxlbmd0aCArIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHZtQXJndW1lbnRzLCAwLCBjb21wbGV0ZVZtQXJndW1lbnRzLCAxLCB2bUFyZ3VtZW50cy5sZW5ndGgpOwotCQljb21wbGV0ZVZtQXJndW1lbnRzWzBdID0gIi12ZXJpZnkiOwotCQlsYXVuY2hlci5zZXRWTUFyZ3VtZW50cyhjb21wbGV0ZVZtQXJndW1lbnRzKTsKLQl9IGVsc2UgewotCQlsYXVuY2hlci5zZXRWTUFyZ3VtZW50cyhuZXcgU3RyaW5nW10geyItdmVyaWZ5In0pOwotCX0KLQlsYXVuY2hlci5zZXRQcm9ncmFtQ2xhc3MoVmVyaWZ5VGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQlpbnQgcG9ydE51bWJlciA9IFV0aWwubmV4dEF2YWlsYWJsZVBvcnROdW1iZXIoKTsKLQlsYXVuY2hlci5zZXRQcm9ncmFtQXJndW1lbnRzKG5ldyBTdHJpbmdbXSB7SW50ZWdlci50b1N0cmluZyhwb3J0TnVtYmVyKX0pOwotCXRyeSB7Ci0JCXRoaXMudm0gPSBsYXVuY2hlci5sYXVuY2goKTsKLQkJZmluYWwgSW5wdXRTdHJlYW0gaW5wdXQgPSB0aGlzLnZtLmdldElucHV0U3RyZWFtKCk7Ci0JCVRocmVhZCBvdXRwdXRUaHJlYWQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlpbnQgYyA9IGlucHV0LnJlYWQoKTsKLQkJCQkJd2hpbGUgKGMgIT0gLTEpIHsKLQkJCQkJCW91dHB1dEJ1ZmZlci5hcHBlbmQoKGNoYXIpIGMpOwotCQkJCQkJYyA9IGlucHV0LnJlYWQoKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gaW9FeCkgewotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWZpbmFsIElucHV0U3RyZWFtIGVycm9yU3RyZWFtID0gdGhpcy52bS5nZXRFcnJvclN0cmVhbSgpOwotCQlUaHJlYWQgZXJyb3JUaHJlYWQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlpbnQgYyA9IGVycm9yU3RyZWFtLnJlYWQoKTsKLQkJCQkJd2hpbGUgKGMgIT0gLTEpIHsKLQkJCQkJCWVycm9yQnVmZmVyLmFwcGVuZCgoY2hhcikgYyk7Ci0JCQkJCQljID0gZXJyb3JTdHJlYW0ucmVhZCgpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBpb0V4KSB7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJb3V0cHV0VGhyZWFkLnN0YXJ0KCk7Ci0JCWVycm9yVGhyZWFkLnN0YXJ0KCk7Ci0JfSBjYXRjaChUYXJnZXRFeGNlcHRpb24gZSkgewotCQl0aHJvdyBuZXcgRXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotCX0KLQotCS8vIGNvbm5lY3QgdG8gdGhlIHZtCi0JdGhpcy5zb2NrZXQgPSBudWxsOwotCWJvb2xlYW4gaXNWTVJ1bm5pbmcgPSBmYWxzZTsKLQlkbyB7Ci0JCXRyeSB7Ci0JCQl0aGlzLnNvY2tldCA9IG5ldyBTb2NrZXQoImxvY2FsaG9zdCIsIHBvcnROdW1iZXIpOwotCQkJdGhpcy5zb2NrZXQuc2V0VGNwTm9EZWxheSh0cnVlKTsKLQkJCWJyZWFrOwotCQl9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlpZiAodGhpcy5zb2NrZXQgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMTAwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCWlzVk1SdW5uaW5nID0gdm0uaXNSdW5uaW5nKCk7Ci0JCX0KLQl9IHdoaWxlICh0aGlzLnNvY2tldCA9PSBudWxsICYmIGlzVk1SdW5uaW5nKTsKLQkKLX0KLS8qKgotICogTG9hZHMgYW5kIHJ1bnMgdGhlIGdpdmVuIGNsYXNzLgotICogUmV0dXJuIHdoZXRoZXIgbm8gZXhjZXB0aW9uIHdhcyB0aHJvd24gd2hpbGUgcnVubmluZyB0aGUgY2xhc3MuCi0gKi8KLXByaXZhdGUgYm9vbGVhbiBsb2FkQW5kUnVuKFN0cmluZyBjbGFzc05hbWUpIHsKLQlpZiAodGhpcy5zb2NrZXQgIT0gbnVsbCkgewotCQl0cnkgewotCQkJRGF0YU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbSh0aGlzLnNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSk7Ci0JCQlvdXQud3JpdGVVVEYoY2xhc3NOYW1lKTsKLQkJCURhdGFJbnB1dFN0cmVhbSBpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0odGhpcy5zb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0JCQl0cnkgewotCQkJCWJvb2xlYW4gcmVzdWx0ID0gaW4ucmVhZEJvb2xlYW4oKTsKLQkJCQl0aGlzLndhaXRGb3JGdWxsQnVmZmVycygpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgewotCQkJCS8vIGNvbm5lY3Rpb24gd2FzIHJlc2V0IGJlY2F1c2UgdGFyZ2V0IHByb2dyYW0gaGFzIGV4aXRlZAotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCXJldHVybiB0cnVlOwotfQotcHVibGljIHZvaWQgc2h1dERvd24oKSB7Ci0JLy8gQ2xvc2UgdGhlIHNvY2tldCBmaXJzdCBzbyB0aGF0IHRoZSBPUyByZXNvdXJjZSBoYXMgYSBjaGFuY2UgdG8gYmUgZnJlZWQuCi0JaWYgKHRoaXMuc29ja2V0ICE9IG51bGwpIHsKLQkJdHJ5IHsKLQkJCXRoaXMuc29ja2V0LmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JLy8gV2FpdCBmb3IgdGhlIHZtIHRvIHNodXQgZG93biBieSBpdHNlbGYgZm9yIDIgc2Vjb25kcy4gSWYgbm90IHN1Y2Nlc2Z1bGwsIGZvcmNlIHRoZSBzaHV0IGRvd24uCi0JaWYgKHRoaXMudm0gIT0gbnVsbCkgewotCQl0cnkgewotCQkJaW50IHJldHJ5ID0gMDsKLQkJCXdoaWxlICh0aGlzLnZtLmlzUnVubmluZygpICYmICgrK3JldHJ5IDwgMjApKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJVGhyZWFkLnNsZWVwKDEwMCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJCWlmICh0aGlzLnZtLmlzUnVubmluZygpKSB7Ci0JCQkJdGhpcy52bS5zaHV0RG93bigpOwotCQkJfQotCQl9IGNhdGNoIChUYXJnZXRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLX0KLS8qKgotICogVmVyaWZ5IHRoYXQgdGhlIGNsYXNzIGZpbGVzIGNyZWF0ZWQgZm9yIHRoZSBnaXZlbiB0ZXN0IGZpbGUgY2FuIGJlIGxvYWRlZCBieQotICogYSB2aXJ0dWFsIG1hY2hpbmUuCi0gKi8KLXB1YmxpYyBib29sZWFuIHZlcmlmeUNsYXNzRmlsZXMoU3RyaW5nIHNvdXJjZUZpbGVQYXRoLCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgZXhwZWN0ZWRTdWNjZXNzT3V0cHV0U3RyaW5nLCBTdHJpbmdbXSBjbGFzc3BhdGhzKSB7Ci0JcmV0dXJuIHZlcmlmeUNsYXNzRmlsZXMoc291cmNlRmlsZVBhdGgsIGNsYXNzTmFtZSwgZXhwZWN0ZWRTdWNjZXNzT3V0cHV0U3RyaW5nLCBjbGFzc3BhdGhzLCBudWxsLCBudWxsKTsKLX0KLS8qKgotICogVmVyaWZ5IHRoYXQgdGhlIGNsYXNzIGZpbGVzIGNyZWF0ZWQgZm9yIHRoZSBnaXZlbiB0ZXN0IGZpbGUgY2FuIGJlIGxvYWRlZCBieQotICogYSB2aXJ0dWFsIG1hY2hpbmUuCi0gKi8KLXB1YmxpYyBib29sZWFuIHZlcmlmeUNsYXNzRmlsZXMoU3RyaW5nIHNvdXJjZUZpbGVQYXRoLCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgZXhwZWN0ZWRTdWNjZXNzT3V0cHV0U3RyaW5nLCBTdHJpbmdbXSBjbGFzc3BhdGhzLCBTdHJpbmdbXSBwcm9ncmFtQXJndW1lbnRzLCBTdHJpbmdbXSB2bUFyZ3VtZW50cykgewotCXRoaXMub3V0cHV0QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCXRoaXMuZXJyb3JCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JaWYgKHRoaXMucmV1c2VWTSAmJiBwcm9ncmFtQXJndW1lbnRzID09IG51bGwpIHsKLQkJdGhpcy5sYXVuY2hWZXJpZnlUZXN0c0lmTmVlZGVkKGNsYXNzcGF0aHMsIHZtQXJndW1lbnRzKTsKLQkJdGhpcy5sb2FkQW5kUnVuKGNsYXNzTmFtZSk7Ci0JfSBlbHNlIHsKLQkJdGhpcy5sYXVuY2hBbmRSdW4oY2xhc3NOYW1lLCBjbGFzc3BhdGhzLCBwcm9ncmFtQXJndW1lbnRzLCB2bUFyZ3VtZW50cyk7Ci0JfQotCQotCXRoaXMuZmFpbHVyZVJlYXNvbiA9IG51bGw7Ci0JcmV0dXJuIHRoaXMuY2hlY2tCdWZmZXJzKHRoaXMuZXJyb3JCdWZmZXIudG9TdHJpbmcoKSwgdGhpcy5vdXRwdXRCdWZmZXIudG9TdHJpbmcoKSwgc291cmNlRmlsZVBhdGgsIGV4cGVjdGVkU3VjY2Vzc091dHB1dFN0cmluZyk7Ci19Ci0KLS8qKgotICogVmVyaWZ5IHRoYXQgdGhlIGNsYXNzIGZpbGVzIGNyZWF0ZWQgZm9yIHRoZSBnaXZlbiB0ZXN0IGZpbGUgY2FuIGJlIGxvYWRlZCBhbmQgcnVuIHdpdGggYW4gZXhwZWN0ZWQgZXJyb3IgY29udGFpbmVkCi0gKiBpbiB0aGUgZXhwZWN0ZWRTdWNjZXNzT3V0cHV0U3RyaW5nIHN0cmluZy4KLSAqLwotcHVibGljIGJvb2xlYW4gdmVyaWZ5Q2xhc3NGaWxlc1Rocm93aW5nRXJyb3IoU3RyaW5nIHNvdXJjZUZpbGVQYXRoLCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgZXhwZWN0ZWRTdWNjZXNzT3V0cHV0U3RyaW5nLCBTdHJpbmdbXSBjbGFzc3BhdGhzLCBTdHJpbmdbXSBwcm9ncmFtQXJndW1lbnRzLCBTdHJpbmdbXSB2bUFyZ3VtZW50cykgewotCXRoaXMub3V0cHV0QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCXRoaXMuZXJyb3JCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JaWYgKHRoaXMucmV1c2VWTSAmJiBwcm9ncmFtQXJndW1lbnRzID09IG51bGwpIHsKLQkJdGhpcy5sYXVuY2hWZXJpZnlUZXN0c0lmTmVlZGVkKGNsYXNzcGF0aHMsIHZtQXJndW1lbnRzKTsKLQkJdGhpcy5sb2FkQW5kUnVuKGNsYXNzTmFtZSk7Ci0JfSBlbHNlIHsKLQkJdGhpcy5sYXVuY2hBbmRSdW4oY2xhc3NOYW1lLCBjbGFzc3BhdGhzLCBwcm9ncmFtQXJndW1lbnRzLCB2bUFyZ3VtZW50cyk7Ci0JfQotCQotCXRoaXMuZmFpbHVyZVJlYXNvbiA9IG51bGw7Ci0JcmV0dXJuIHRoaXMuY2hlY2tCdWZmZXJzVGhyb3dpbmdFcnJvcih0aGlzLmVycm9yQnVmZmVyLnRvU3RyaW5nKCksIHNvdXJjZUZpbGVQYXRoLCBleHBlY3RlZFN1Y2Nlc3NPdXRwdXRTdHJpbmcpOwotfQotCi0vKioKLSAqIFdhaXQgdW50aWwgdGhlcmUgaXMgbm90aGluZyBtb3JlIHRvIHJlYWQgZnJvbSB0aGUgc3Rkb3V0IG9yIHN0ZXJyLgotICovCi1wcml2YXRlIHZvaWQgd2FpdEZvckZ1bGxCdWZmZXJzKCkgewotCVN0cmluZyBlbmRTdHJpbmcgPSBWZXJpZnlUZXN0cy5jbGFzcy5nZXROYW1lKCk7Ci0JaW50IGNvdW50ID0gNTA7Ci0JaW50IGVycm9yRW5kU3RyaW5nU3RhcnQgPSB0aGlzLmVycm9yQnVmZmVyLnRvU3RyaW5nKCkuaW5kZXhPZihlbmRTdHJpbmcpOwotCWludCBvdXRwdXRFbmRTdHJpbmdTdGFydCA9IHRoaXMub3V0cHV0QnVmZmVyLnRvU3RyaW5nKCkuaW5kZXhPZihlbmRTdHJpbmcpOwotCXdoaWxlIChlcnJvckVuZFN0cmluZ1N0YXJ0ID09IC0xIHx8IG91dHB1dEVuZFN0cmluZ1N0YXJ0ID09IC0xKSB7Ci0JCXRyeSB7Ci0JCQlUaHJlYWQuc2xlZXAoMTAwKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQl9Ci0JCWlmICgtLWNvdW50ID09IDApIHJldHVybjsKLQkJZXJyb3JFbmRTdHJpbmdTdGFydCA9IHRoaXMuZXJyb3JCdWZmZXIudG9TdHJpbmcoKS5pbmRleE9mKGVuZFN0cmluZyk7Ci0JCW91dHB1dEVuZFN0cmluZ1N0YXJ0ID0gdGhpcy5vdXRwdXRCdWZmZXIudG9TdHJpbmcoKS5pbmRleE9mKGVuZFN0cmluZyk7Ci0JfQotCXRoaXMuZXJyb3JCdWZmZXIuc2V0TGVuZ3RoKGVycm9yRW5kU3RyaW5nU3RhcnQpOwotCXRoaXMub3V0cHV0QnVmZmVyLnNldExlbmd0aChvdXRwdXRFbmRTdHJpbmdTdGFydCk7Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvdXRpbC9VdGlsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5jb21waWxlci9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvdXRpbC9VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZTk1NTEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3V0aWwvVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLXB1YmxpYyBjbGFzcyBVdGlsIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPVVRQVVRfRElSRUNUT1JZID0gImNvbXB0ZXN0IjsKLQotCXB1YmxpYyBzdGF0aWMgaW50IE1BWF9QT1JUX05VTUJFUiA9IDk5OTk7Ci0vKioKLSAqIENvcHkgdGhlIGdpdmVuIHNvdXJjZSAoYSBmaWxlIG9yIGEgZGlyZWN0b3J5IHRoYXQgbXVzdCBleGlzdHMpIHRvIHRoZSBnaXZlbiBkZXN0aW5hdGlvbiAoYSBkaXJlY3RvcnkgdGhhdCBtdXN0IGV4aXN0cykuCi0gKi8KLXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5KFN0cmluZyBzb3VyY2VQYXRoLCBTdHJpbmcgZGVzdFBhdGgpIHsKLQlzb3VyY2VQYXRoID0gdG9OYXRpdmVQYXRoKHNvdXJjZVBhdGgpOwotCWRlc3RQYXRoID0gdG9OYXRpdmVQYXRoKGRlc3RQYXRoKTsKLQlGaWxlIHNvdXJjZSA9IG5ldyBGaWxlKHNvdXJjZVBhdGgpOwotCWlmICghc291cmNlLmV4aXN0cygpKSByZXR1cm47Ci0JRmlsZSBkZXN0ID0gbmV3IEZpbGUoZGVzdFBhdGgpOwotCWlmICghZGVzdC5leGlzdHMoKSkgcmV0dXJuOwotCWlmIChzb3VyY2UuaXNEaXJlY3RvcnkoKSkgewotCQlTdHJpbmdbXSBmaWxlcyA9IHNvdXJjZS5saXN0KCk7Ci0JCWlmIChmaWxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIGZpbGUgPSBmaWxlc1tpXTsKLQkJCQlGaWxlIHNvdXJjZUZpbGUgPSBuZXcgRmlsZShzb3VyY2UsIGZpbGUpOwotCQkJCWlmIChzb3VyY2VGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJRmlsZSBkZXN0U3ViRGlyID0gbmV3IEZpbGUoZGVzdCwgZmlsZSk7Ci0JCQkJCWRlc3RTdWJEaXIubWtkaXIoKTsKLQkJCQkJY29weShzb3VyY2VGaWxlLmdldFBhdGgoKSwgZGVzdFN1YkRpci5nZXRQYXRoKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNvcHkoc291cmNlRmlsZS5nZXRQYXRoKCksIGRlc3QuZ2V0UGF0aCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQlGaWxlSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQlGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc291cmNlKTsKLQkJCUZpbGUgZGVzdEZpbGUgPSBuZXcgRmlsZShkZXN0LCBzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCWlmIChkZXN0RmlsZS5leGlzdHMoKSAmJiAhZGVzdEZpbGUuZGVsZXRlKCkpIHsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZGVzdEZpbGUgKyAiIGlzIGluIHVzZSIpOwotCQkJfQotCQkgCW91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3RGaWxlKTsKLQkJCWludCBidWZmZXJMZW5ndGggPSAxMDI0OwotCQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW2J1ZmZlckxlbmd0aF07Ci0JCQlpbnQgcmVhZCA9IDA7Ci0JCQl3aGlsZSAocmVhZCAhPSAtMSkgewotCQkJCXJlYWQgPSBpbi5yZWFkKGJ1ZmZlciwgMCwgYnVmZmVyTGVuZ3RoKTsKLQkJCQlpZiAocmVhZCAhPSAtMSkgewotCQkJCQlvdXQud3JpdGUoYnVmZmVyLCAwLCByZWFkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBFcnJvcihlLnRvU3RyaW5nKCkpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGluICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbi5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAob3V0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlvdXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQotLyoqCi0gKiBHZW5lcmF0ZSBhIGRpc3BsYXkgc3RyaW5nIGZyb20gdGhlIGdpdmVuIFN0cmluZy4KLSAqIEBwYXJhbSBpbmRlbnQgbnVtYmVyIG9mIHRhYnMgYXJlIGFkZGVkIGF0IHRoZSBiZWdpbmluZyBvZiBlYWNoIGxpbmUuCi0gKgotICogRXhhbXBsZSBvZiB1c2U6IFtvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy51dGlsLlV0aWwuZGlzcGxheVN0cmluZygiYWJjXG5kZWZcdGdoaSIpXQotKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoU3RyaW5nIGlucHV0U3RyaW5nKXsKLQlyZXR1cm4gZGlzcGxheVN0cmluZyhpbnB1dFN0cmluZywgMCk7Ci19Ci0vKioKLSAqIEdlbmVyYXRlIGEgZGlzcGxheSBzdHJpbmcgZnJvbSB0aGUgZ2l2ZW4gU3RyaW5nLgotICogSXQgY29udmVydHM6Ci0gKiA8dWw+Ci0gKiA8bGk+XHQgdG8gXHQ8L2xpPgotICogPGxpPlxyIHRvIFxccjwvbGk+Ci0gKiA8bGk+XG4gdG8gXG48L2xpPgotICogPGxpPlxiIHRvIFxcYjwvbGk+Ci0gKiA8bGk+XGYgdG8gXFxmPC9saT4KLSAqIDxsaT5cIiB0byBcXFwiPC9saT4KLSAqIDxsaT5cJyB0byBcXCc8L2xpPgotICogPGxpPlxcIHRvIFxcXFw8L2xpPgotICogPGxpPkFsbCBvdGhlciBjaGFyYWN0ZXJzIGFyZSB1bmNoYW5nZWQuPC9saT4KLSAqIDwvdWw+Ci0gKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGNvbnZlcnQgXHJcbiB0byBcbi4gCi0gKiA8cD4KLSAqIEV4YW1wbGUgb2YgdXNlOgotICogPG8+Ci0gKiA8bGk+Ci0gKiA8cHJlPgotICogaW5wdXQgc3RyaW5nID0gImFiY1xuZGVmXHRnaGkiLAotICogaW5kZW50ID0gMwotICogcmVzdWx0ID0gIlwiXHRcdFx0YWJjXFxuIiArCi0gKiAJCQkiXHRcdFx0ZGVmXHRnaGlcIiIKLSAqIDwvcHJlPgotICogPC9saT4KLSAqIDxsaT4KLSAqIDxwcmU+Ci0gKiBpbnB1dCBzdHJpbmcgPSAiYWJjXG5kZWZcdGdoaVxuIiwKLSAqIGluZGVudCA9IDMKLSAqIHJlc3VsdCA9ICJcIlx0XHRcdGFiY1xcbiIgKwotICogCQkJIlx0XHRcdGRlZlx0Z2hpXFxuXCIiCi0gKiA8L3ByZT4KLSAqIDwvbGk+Ci0gKiA8bGk+Ci0gKiA8cHJlPgotICogaW5wdXQgc3RyaW5nID0gImFiY1xyXG5kZWZcdGdoaVxyXG4iLAotICogaW5kZW50ID0gMwotICogcmVzdWx0ID0gIlwiXHRcdFx0YWJjXFxyXFxuIiArCi0gKiAJCQkiXHRcdFx0ZGVmXHRnaGlcXHJcXG5cIiIKLSAqIDwvcHJlPgotICogPC9saT4KLSAqIDwvb2w+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBwYXJhbSBpbnB1dFN0cmluZyB0aGUgZ2l2ZW4gaW5wdXQgc3RyaW5nCi0gKiBAcGFyYW0gaW5kZW50IG51bWJlciBvZiB0YWJzIGFyZSBhZGRlZCBhdCB0aGUgYmVnaW5pbmcgb2YgZWFjaCBsaW5lLgotICoKLSAqIEByZXR1cm4gdGhlIGRpc3BsYXllZCBzdHJpbmcKLSovCi1wdWJsaWMgc3RhdGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKFN0cmluZyBpbnB1dFN0cmluZywgaW50IGluZGVudCkgewotCWludCBsZW5ndGggPSBpbnB1dFN0cmluZy5sZW5ndGgoKTsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGgpOwotCWphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIoaW5wdXRTdHJpbmcsICJcblxyIiwgdHJ1ZSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykgYnVmZmVyLmFwcGVuZCgiXHQiKTsKLQlidWZmZXIuYXBwZW5kKCJcIiIpOwotCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKXsKLQotCQlTdHJpbmcgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCWlmICh0b2tlbi5lcXVhbHMoIlxyIikpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIlxcciIpOwotCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQl0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCQlpZiAodG9rZW4uZXF1YWxzKCJcbiIpKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlxcbiIpOwotCQkJCQlpZiAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJYnVmZmVyLmFwcGVuZCgiXCIgKyBcbiIpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykgYnVmZmVyLmFwcGVuZCgiXHQiKTsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoIlwiIik7Ci0JCQkJCX0KLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXCIgKyBcbiIpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudDsgaSsrKSBidWZmZXIuYXBwZW5kKCJcdCIpOwotCQkJCQlidWZmZXIuYXBwZW5kKCJcIiIpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJcbiIpKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCJcXG4iKTsKLQkJCWlmICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiXCIgKyBcbiIpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50OyBpKyspIGJ1ZmZlci5hcHBlbmQoIlx0Iik7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiXCIiKTsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9CQotCi0JCVN0cmluZ0J1ZmZlciB0b2tlbkJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbi5sZW5ndGgoKTsgaSsrKXsgCi0JCQljaGFyIGMgPSB0b2tlbi5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGMpIHsKLQkJCQljYXNlICdccicgOgotCQkJCQl0b2tlbkJ1ZmZlci5hcHBlbmQoIlxcciIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlICdcbicgOgotCQkJCQl0b2tlbkJ1ZmZlci5hcHBlbmQoIlxcbiIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlICdcYicgOgotCQkJCQl0b2tlbkJ1ZmZlci5hcHBlbmQoIlxcYiIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlICdcdCcgOgotCQkJCQl0b2tlbkJ1ZmZlci5hcHBlbmQoIlx0Iik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xmJyA6Ci0JCQkJCXRva2VuQnVmZmVyLmFwcGVuZCgiXFxmIik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1wiJyA6Ci0JCQkJCXRva2VuQnVmZmVyLmFwcGVuZCgiXFxcIiIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlICdcJycgOgotCQkJCQl0b2tlbkJ1ZmZlci5hcHBlbmQoIlxcJyIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlICdcXCcgOgotCQkJCQl0b2tlbkJ1ZmZlci5hcHBlbmQoIlxcXFwiKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXRva2VuQnVmZmVyLmFwcGVuZChjKTsKLQkJCX0KLQkJfQotCQlidWZmZXIuYXBwZW5kKHRva2VuQnVmZmVyLnRvU3RyaW5nKCkpOwotCX0KLQlidWZmZXIuYXBwZW5kKCJcIiIpOwotCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLX0KLS8qKgotICogUmVhZHMgdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuIHNvdXJjZSBmaWxlIGFuZCBjb252ZXJ0cyBpdCB0byBhIGRpc3BsYXkgc3RyaW5nLgotICoKLSAqIEV4YW1wbGUgb2YgdXNlOiBbb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMudXRpbC5VdGlsLmZpbGVDb250ZW50VG9EaXNwbGF5U3RyaW5nKCJjOi90ZW1wL1guamF2YSIsIDApXQotKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVDb250ZW50VG9EaXNwbGF5U3RyaW5nKFN0cmluZyBzb3VyY2VGaWxlUGF0aCwgaW50IGluZGVudCkgewotCUZpbGUgc291cmNlRmlsZSA9IG5ldyBGaWxlKHNvdXJjZUZpbGVQYXRoKTsKLQlpZiAoIXNvdXJjZUZpbGUuZXhpc3RzKCkpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJGaWxlICIgKyBzb3VyY2VGaWxlUGF0aCArICIgZG9lcyBub3QgZXhpc3RzLiIpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JaWYgKCFzb3VyY2VGaWxlLmlzRmlsZSgpKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihzb3VyY2VGaWxlUGF0aCArICIgaXMgbm90IGEgZmlsZS4iKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCVN0cmluZ0J1ZmZlciBzb3VyY2VDb250ZW50QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCUZpbGVJbnB1dFN0cmVhbSBpbnB1dCA9IG51bGw7Ci0JdHJ5IHsKLQkJaW5wdXQgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNvdXJjZUZpbGUpOwotCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQl0cnkgeyAKLQkJaW50IHJlYWQ7Ci0JCWRvIHsKLQkJCXJlYWQgPSBpbnB1dC5yZWFkKCk7Ci0JCQlpZiAocmVhZCAhPSAtMSkgewotCQkJCXNvdXJjZUNvbnRlbnRCdWZmZXIuYXBwZW5kKChjaGFyKXJlYWQpOwotCQkJfQotCQl9IHdoaWxlIChyZWFkICE9IC0xKTsKLQkJaW5wdXQuY2xvc2UoKTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCXJldHVybiBudWxsOwotCX0gZmluYWxseSB7Ci0JCXRyeSB7Ci0JCQlpbnB1dC5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMikgewotCQl9Ci0JfQotCXJldHVybiBkaXNwbGF5U3RyaW5nKHNvdXJjZUNvbnRlbnRCdWZmZXIudG9TdHJpbmcoKSwgaW5kZW50KTsKLX0KLS8qKgotICogUmVhZHMgdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuIHNvdXJjZSBmaWxlLCBjb252ZXJ0cyBpdCB0byBhIGRpc3BsYXkgc3RyaW5nLgotICogSWYgdGhlIGRlc3RpbmF0aW9uIGZpbGUgcGF0aCBpcyBub3QgbnVsbCwgd3JpdGVzIHRoZSByZXN1bHQgdG8gdGhpcyBmaWxlLgotICogT3RoZXJ3aXNlIHdyaXRlcyBpdCB0byB0aGUgY29uc29sZS4KLSAqCi0gKiBFeGFtcGxlIG9mIHVzZTogW29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLnV0aWwuVXRpbC5maWxlQ29udGVudFRvRGlzcGxheVN0cmluZygiYzovdGVtcC9YLmphdmEiLCAwLCBudWxsKV0KLSovCi1wdWJsaWMgc3RhdGljIHZvaWQgZmlsZUNvbnRlbnRUb0Rpc3BsYXlTdHJpbmcoU3RyaW5nIHNvdXJjZUZpbGVQYXRoLCBpbnQgaW5kZW50LCBTdHJpbmcgZGVzdGluYXRpb25GaWxlUGF0aCkgewotCVN0cmluZyBkaXNwbGF5U3RyaW5nID0gZmlsZUNvbnRlbnRUb0Rpc3BsYXlTdHJpbmcoc291cmNlRmlsZVBhdGgsIGluZGVudCk7Ci0JaWYgKGRlc3RpbmF0aW9uRmlsZVBhdGggPT0gbnVsbCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oZGlzcGxheVN0cmluZyk7Ci0JCXJldHVybjsKLQl9Ci0Jd3JpdGVUb0ZpbGUoZGlzcGxheVN0cmluZywgZGVzdGluYXRpb25GaWxlUGF0aCk7Ci19Ci0vKioKLSAqIEZsdXNoIGNvbnRlbnQgb2YgYSBnaXZlbiBkaXJlY3RvcnkgKGxlYXZpbmcgaXQgZW1wdHkpLAotICogbm8tb3AgaWYgbm90IGEgZGlyZWN0b3J5LgotICovCi1wdWJsaWMgc3RhdGljIHZvaWQgZmx1c2hEaXJlY3RvcnlDb250ZW50KEZpbGUgZGlyKSB7Ci0JaWYgKGRpci5pc0RpcmVjdG9yeSgpKSB7Ci0JCVN0cmluZ1tdIGZpbGVzID0gZGlyLmxpc3QoKTsKLQkJaWYgKGZpbGVzID09IG51bGwpIHJldHVybjsKLQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IGZpbGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0JCQlGaWxlIGN1cnJlbnQgPSBuZXcgRmlsZShkaXIsIGZpbGVzW2ldKTsKLQkJCWlmIChjdXJyZW50LmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlmbHVzaERpcmVjdG9yeUNvbnRlbnQoY3VycmVudCk7Ci0JCQl9Ci0JCQljdXJyZW50LmRlbGV0ZSgpOwotCQl9Ci0JfQotfQotLyoqCi0gKiBTZWFyY2ggdGhlIHVzZXIgaGFyZC1kcml2ZSBmb3IgYSBKYXZhIGNsYXNzIGxpYnJhcnkuCi0gKiBSZXR1cm5zIG51bGwgaWYgbm9uZSBjb3VsZCBiZSBmb3VuZC4KLSAqCi0gKiBFeGFtcGxlIG9mIHVzZTogW29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLnV0aWwuVXRpbC5nZXRKYXZhQ2xhc3NMaWIoKV0KLSovCi1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKYXZhQ2xhc3NMaWIoKSB7Ci0JU3RyaW5nIGpyZURpciA9IGdldEpSRURpcmVjdG9yeSgpOwotCWlmIChqcmVEaXIgPT0gbnVsbCkgIHsKLQkJcmV0dXJuIG51bGw7Ci0JfSBlbHNlIHsKLQkJaWYgKCJKOSIuZXF1YWxzKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52bS5uYW1lIikpKSB7Ci0JCQlyZXR1cm4gdG9OYXRpdmVQYXRoKGpyZURpciArICIvbGliL2pjbE1heC9jbGFzc2VzLnppcCIpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHRvTmF0aXZlUGF0aChqcmVEaXIgKyAiL2xpYi9ydC5qYXIiKTsKLQkJfQotCX0KLX0KLS8qKgotICogUmV0dXJucyB0aGUgSlJFIGRpcmVjdG9yeSB0aGlzIHRlc3RzIGFyZSBydW5uaW5nIG9uLgotICogUmV0dXJucyBudWxsIGlmIG5vbmUgY291bGQgYmUgZm91bmQuCi0gKgotICogRXhhbXBsZSBvZiB1c2U6IFtvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy51dGlsLlV0aWwuZ2V0SlJFRGlyZWN0b3J5KCldCi0qLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SlJFRGlyZWN0b3J5KCkgewotCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpOwotfQotLyoqCi0gKiBTZWFyY2ggdGhlIHVzZXIgaGFyZC1kcml2ZSBmb3IgYSBwb3NzaWJsZSBvdXRwdXQgZGlyZWN0b3J5LgotICogUmV0dXJucyBudWxsIGlmIG5vbmUgY291bGQgYmUgZm91bmQuCi0gKgotICogRXhhbXBsZSBvZiB1c2U6IFtvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy51dGlsLlV0aWwuZ2V0T3V0cHV0RGlyZWN0b3J5KCldCi0qLwotcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0T3V0cHV0RGlyZWN0b3J5KCkgewotCVN0cmluZyBjb250YWluZXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIik7Ci0JaWYgKGNvbnRhaW5lciA9PSBudWxsKXsKLQkJcmV0dXJuIG51bGw7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIHRvTmF0aXZlUGF0aChjb250YWluZXIpICsgRmlsZS5zZXBhcmF0b3IgKyBPVVRQVVRfRElSRUNUT1JZOwotCX0KLX0KLS8qKgotICogUmV0dXJucyB3aGV0aGVyIG9uZSBvZiB0aGUgYXJndW1lbnRzIGlzICItZXhwZXJ0Ii4KLSAqLwotcHVibGljIHN0YXRpYyBib29sZWFuIGlzRXhwZXJ0KFN0cmluZ1tdIGFyZ3MpIHsKLQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGFyZ3NbaV0udG9Mb3dlckNhc2UoKS5lcXVhbHMoIi1leHBlcnQiKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBuZXh0IGF2YWlsYWJsZSBwb3J0IG51bWJlciBvbiB0aGUgbG9jYWwgaG9zdC4KLSAqLwotcHVibGljIHN0YXRpYyBpbnQgbmV4dEF2YWlsYWJsZVBvcnROdW1iZXIoKSB7Ci0JZm9yIChpbnQgaSA9IE1BWF9QT1JUX05VTUJFUjsgaSA+IDEwMDA7IGktLSkgewotCQlpbnQgbG9jYWxQb3J0ID0gbmV3IFNvY2tldEhlbHBlcigpLmdldEF2YWlsYWJsZVBvcnQoaSk7Ci0JCWlmIChsb2NhbFBvcnQgIT0gLTEpIHsKLQkJCXJldHVybiBsb2NhbFBvcnQ7Ci0JCX0KLQl9Ci0JcmV0dXJuIC0xOwotfQotLyoqCi0gKiBNYWtlcyB0aGUgZ2l2ZW4gcGF0aCBhIHBhdGggdXNpbmcgbmF0aXZlIHBhdGggc2VwYXJhdG9ycyBhcyByZXR1cm5lZCBieSBGaWxlLmdldFBhdGgoKQotICogYW5kIHRyaW1taW5nIGFueSBleHRyYSBzbGFzaC4KLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmcgdG9OYXRpdmVQYXRoKFN0cmluZyBwYXRoKSB7Ci0JU3RyaW5nIG5hdGl2ZVBhdGggPSBwYXRoLnJlcGxhY2UoJ1xcJywgRmlsZS5zZXBhcmF0b3JDaGFyKS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQlyZXR1cm4KLQkJbmF0aXZlUGF0aC5lbmRzV2l0aCgiLyIpIHx8IG5hdGl2ZVBhdGguZW5kc1dpdGgoIlxcIikgPwotCQkJbmF0aXZlUGF0aC5zdWJzdHJpbmcoMCwgbmF0aXZlUGF0aC5sZW5ndGgoKSAtIDEpIDoKLQkJCW5hdGl2ZVBhdGg7Ci19Ci1wdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVUb0ZpbGUoU3RyaW5nIGNvbnRlbnRzLCBTdHJpbmcgZGVzdGluYXRpb25GaWxlUGF0aCkgewotCUZpbGUgZGVzdEZpbGUgPSBuZXcgRmlsZShkZXN0aW5hdGlvbkZpbGVQYXRoKTsKLQlGaWxlT3V0cHV0U3RyZWFtIG91dHB1dCA9IG51bGw7Ci0JdHJ5IHsKLQkJb3V0cHV0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdEZpbGUpOwotCQlQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIob3V0cHV0KTsKLQkJd3JpdGVyLnByaW50KGNvbnRlbnRzKTsKLQkJd3JpdGVyLmZsdXNoKCk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQlyZXR1cm47Ci0JfSBmaW5hbGx5IHsKLQkJaWYgKG91dHB1dCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW91dHB1dC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTIpIHsKLQkJCX0KLQkJfQotCX0KLX0KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0luZGVwZW5kYW50TGluZURlbGltaXRlcihTdHJpbmcgc291cmNlKSB7Ci0JU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gc291cmNlLmxlbmd0aCgpOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJY2hhciBjYXIgPSBzb3VyY2UuY2hhckF0KGkpOwotCQlpZiAoY2FyID09ICdccicpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoJ1xuJyk7Ci0JCQlpZiAoaSA8IGxlbmd0aC0xICYmIHNvdXJjZS5jaGFyQXQoaSsxKSA9PSAnXG4nKSB7Ci0JCQkJaSsrOyAvLyBza2lwIFxuIGFmdGVyIFxyCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlidWZmZXIuYXBwZW5kKGNhcik7Ci0JCX0KLQl9Ci0JcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3V0aWwvVmVyaWZ5VGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy91dGlsL1ZlcmlmeVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZDFkYzguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL3V0aWwvVmVyaWZ5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgVmVyaWZ5VGVzdHMgewotCWludCBwb3J0TnVtYmVyOwotCVNvY2tldCBzb2NrZXQ7Ci0KLS8qKgotICogTk9URTogQ29kZSBjb3BpZWQgZnJvbSBqdW5pdC51dGlsLlRlc3RDYXNlQ2xhc3NMb2FkZXIuCi0gKgotICogQSBjdXN0b20gY2xhc3MgbG9hZGVyIHdoaWNoIGVuYWJsZXMgdGhlIHJlbG9hZGluZwotICogb2YgY2xhc3NlcyBmb3IgZWFjaCB0ZXN0IHJ1bi4gVGhlIGNsYXNzIGxvYWRlcgotICogY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aCBhIGxpc3Qgb2YgcGFja2FnZSBwYXRocyB0aGF0Ci0gKiBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSBsb2FkaW5nLiBUaGUgbG9hZGluZwotICogb2YgdGhlc2UgcGFja2FnZXMgaXMgZGVsZWdhdGVkIHRvIHRoZSBzeXN0ZW0gY2xhc3MKLSAqIGxvYWRlci4gVGhleSB3aWxsIGJlIHNoYXJlZCBhY3Jvc3MgdGVzdCBydW5zLgotICogPHA+Ci0gKiBUaGUgbGlzdCBvZiBleGNsdWRlZCBwYWNrYWdlIHBhdGhzIGlzIHNwZWNpZmllZCBpbgotICogYSBwcm9wZXJ0aWVzIGZpbGUgImV4Y2x1ZGVkLnByb3BlcnRpZXMiIHRoYXQgaXMgbG9jYXRlZCBpbiAKLSAqIHRoZSBzYW1lIHBsYWNlIGFzIHRoZSBUZXN0Q2FzZUNsYXNzTG9hZGVyIGNsYXNzLgotICogPHA+Ci0gKiA8Yj5Lbm93biBsaW1pdGF0aW9uOjwvYj4gdGhlIFZlcmlmeUNsYXNzTG9hZGVyIGNhbm5vdCBsb2FkIGNsYXNzZXMKLSAqIGZyb20gamFyIGZpbGVzLgotICovCi0KLQotcHVibGljIGNsYXNzIFZlcmlmeUNsYXNzTG9hZGVyIGV4dGVuZHMgQ2xhc3NMb2FkZXIgewotCS8qKiBzY2FubmVkIGNsYXNzIHBhdGggKi8KLQlwcml2YXRlIFN0cmluZ1tdIGZQYXRoSXRlbXM7Ci0JCi0JLyoqIGV4Y2x1ZGVkIHBhdGhzICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBmRXhjbHVkZWQ9IHt9OwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIFZlcmlmeUNsYXNzTG9hZGVyLiBJdCBzY2FucyB0aGUgY2xhc3MgcGF0aAotCSAqIGFuZCB0aGUgZXhjbHVkZWQgcGFja2FnZSBwYXRocwotCSAqLwotCXB1YmxpYyBWZXJpZnlDbGFzc0xvYWRlcigpIHsKLQkJc3VwZXIoKTsKLQkJU3RyaW5nIGNsYXNzUGF0aD0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKTsKLQkJU3RyaW5nIHNlcGFyYXRvcj0gU3lzdGVtLmdldFByb3BlcnR5KCJwYXRoLnNlcGFyYXRvciIpOwotCQkKLQkJLy8gZmlyc3QgcGFzczogY291bnQgZWxlbWVudHMKLQkJU3RyaW5nVG9rZW5pemVyIHN0PSBuZXcgU3RyaW5nVG9rZW5pemVyKGNsYXNzUGF0aCwgc2VwYXJhdG9yKTsKLQkJaW50IGk9IDA7Ci0JCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCXN0Lm5leHRUb2tlbigpOwotCQkJaSsrOwotCQl9Ci0JCS8vIHNlY29uZCBwYXNzOiBzcGxpdAotCQlmUGF0aEl0ZW1zPSBuZXcgU3RyaW5nW2ldOwotCQlzdD0gbmV3IFN0cmluZ1Rva2VuaXplcihjbGFzc1BhdGgsIHNlcGFyYXRvcik7Ci0JCWk9IDA7Ci0JCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCWZQYXRoSXRlbXNbaSsrXT0gc3QubmV4dFRva2VuKCk7Ci0JCX0KLQotCX0KLQlwdWJsaWMgamF2YS5uZXQuVVJMIGdldFJlc291cmNlKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBDbGFzc0xvYWRlci5nZXRTeXN0ZW1SZXNvdXJjZShuYW1lKTsKLQl9Ci0JcHVibGljIElucHV0U3RyZWFtIGdldFJlc291cmNlQXNTdHJlYW0oU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlQXNTdHJlYW0obmFtZSk7Ci0JfQotCXByb3RlY3RlZCBib29sZWFuIGlzRXhjbHVkZWQoU3RyaW5nIG5hbWUpIHsKLQkJLy8gZXhjbHVkZSB0aGUgImphdmEiIHBhY2thZ2VzLgotCQkvLyBUaGV5IGFsd2F5cyBuZWVkIHRvIGJlIGV4Y2x1ZGVkIHNvIHRoYXQgdGhleSBhcmUgbG9hZGVkIGJ5IHRoZSBzeXN0ZW0gY2xhc3MgbG9hZGVyCi0JCWlmIChuYW1lLnN0YXJ0c1dpdGgoImphdmEiKSkKLQkJCXJldHVybiB0cnVlOwotCQkJCi0JCS8vIGV4Y2x1ZGUgdGhlIHVzZXIgZGVmaW5lZCBwYWNrYWdlIHBhdGhzCi0JCWZvciAoaW50IGk9IDA7IGkgPCBmRXhjbHVkZWQubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoZkV4Y2x1ZGVkW2ldKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsJCi0JfQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgQ2xhc3MgbG9hZENsYXNzKFN0cmluZyBuYW1lLCBib29sZWFuIHJlc29sdmUpCi0JCXRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJCQotCQlDbGFzcyBjPSBmaW5kTG9hZGVkQ2xhc3MobmFtZSk7Ci0JCWlmIChjICE9IG51bGwpCi0JCQlyZXR1cm4gYzsKLQkJLy8KLQkJLy8gRGVsZWdhdGUgdGhlIGxvYWRpbmcgb2YgZXhjbHVkZWQgY2xhc3NlcyB0byB0aGUKLQkJLy8gc3RhbmRhcmQgY2xhc3MgbG9hZGVyLgotCQkvLwotCQlpZiAoaXNFeGNsdWRlZChuYW1lKSkgewotCQkJdHJ5IHsKLQkJCQljPSBmaW5kU3lzdGVtQ2xhc3MobmFtZSk7Ci0JCQkJcmV0dXJuIGM7Ci0JCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBrZWVwIHNlYXJjaGluZwotCQkJfQotCQl9Ci0JCWlmIChjID09IG51bGwpIHsKLQkJCUZpbGUgZmlsZT0gbG9jYXRlKG5hbWUpOwotCQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigpOwotCQkJYnl0ZSBkYXRhW109IGxvYWRDbGFzc0RhdGEoZmlsZSk7Ci0JCQljPSBkZWZpbmVDbGFzcyhuYW1lLCBkYXRhLCAwLCBkYXRhLmxlbmd0aCk7Ci0JCX0KLQkJaWYgKHJlc29sdmUpIAotCQkJcmVzb2x2ZUNsYXNzKGMpOwotCQlyZXR1cm4gYzsKLQl9Ci0JcHJpdmF0ZSBieXRlW10gbG9hZENsYXNzRGF0YShGaWxlIGYpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsb2FkaW5nOiAiK2YuZ2V0UGF0aCgpKTsKLQkJCUZpbGVJbnB1dFN0cmVhbSBzdHJlYW09IG5ldyBGaWxlSW5wdXRTdHJlYW0oZik7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJYnl0ZVtdIGI9IG5ldyBieXRlW3N0cmVhbS5hdmFpbGFibGUoKV07Ci0JCQkJc3RyZWFtLnJlYWQoYik7Ci0JCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQkJcmV0dXJuIGI7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCS8qKgotCSAqIExvY2F0ZSB0aGUgZ2l2ZW4gZmlsZS4KLQkgKiBAcmV0dXJuIFJldHVybnMgbnVsbCBpZiBmaWxlIGNvdWxkbid0IGJlIGZvdW5kLgotCSAqLwotCXByaXZhdGUgRmlsZSBsb2NhdGUoU3RyaW5nIGZpbGVOYW1lKSB7IAotCQlmaWxlTmFtZT0gZmlsZU5hbWUucmVwbGFjZSgnLicsICcvJykrIi5jbGFzcyI7Ci0JCUZpbGUgcGF0aD0gbnVsbDsKLQkJCi0JCWlmIChmaWxlTmFtZSAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgZlBhdGhJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCXBhdGg9IG5ldyBGaWxlKGZQYXRoSXRlbXNbaV0sIGZpbGVOYW1lKTsKLQkJCQlpZiAocGF0aC5leGlzdHMoKSkKLQkJCQkJcmV0dXJuIHBhdGg7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQotCQotcHVibGljIHZvaWQgbG9hZEFuZFJ1bihTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkvL1N5c3RlbS5vdXQucHJpbnRsbigiTG9hZGluZyAiICsgY2xhc3NOYW1lICsgIi4uLiIpOwotCUNsYXNzIHRlc3RDbGFzcyA9IG5ldyBWZXJpZnlDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCS8vU3lzdGVtLm91dC5wcmludGxuKCJMb2FkZWQgIiArIGNsYXNzTmFtZSk7Ci0JdHJ5IHsKLQkJTWV0aG9kIG1haW4gPSB0ZXN0Q2xhc3MuZ2V0TWV0aG9kKCJtYWluIiwgbmV3IENsYXNzW10ge1N0cmluZ1tdLmNsYXNzfSk7Ci0JCS8vU3lzdGVtLm91dC5wcmludGxuKCJSdW5uaW5nICIgKyBjbGFzc05hbWUpOwotCQltYWluLmludm9rZShudWxsLCBuZXcgT2JqZWN0W10ge25ldyBTdHJpbmdbXSB7fX0pOwotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiRmluaXNoZWQgcnVubmluZyAiICsgY2xhc3NOYW1lKTsKLQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQlyZXR1cm47Ci0JfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCXRocm93IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JfQotfQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlWZXJpZnlUZXN0cyB2ZXJpZnkgPSBuZXcgVmVyaWZ5VGVzdHMoKTsKLQl2ZXJpZnkucG9ydE51bWJlciA9IEludGVnZXIucGFyc2VJbnQoYXJnc1swXSk7Ci0JdmVyaWZ5LnJ1bigpOwotfQotcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlTZXJ2ZXJTb2NrZXQgc2VydmVyID0gbmV3IFNlcnZlclNvY2tldCh0aGlzLnBvcnROdW1iZXIpOwotCXRoaXMuc29ja2V0ID0gc2VydmVyLmFjY2VwdCgpOwotCXRoaXMuc29ja2V0LnNldFRjcE5vRGVsYXkodHJ1ZSk7Ci0Jc2VydmVyLmNsb3NlKCk7Ci0KLQlEYXRhSW5wdXRTdHJlYW0gaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKHRoaXMuc29ja2V0LmdldElucHV0U3RyZWFtKCkpOwotCWZpbmFsIERhdGFPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0odGhpcy5zb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCkpOwotCXdoaWxlICh0cnVlKSB7Ci0JCWZpbmFsIFN0cmluZyBjbGFzc05hbWUgPSBpbi5yZWFkVVRGKCk7Ci0JCVRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCWxvYWRBbmRSdW4oY2xhc3NOYW1lKTsKLQkJCQkJb3V0LndyaXRlQm9vbGVhbih0cnVlKTsKLQkJCQkJU3lzdGVtLmVyci5wcmludGxuKFZlcmlmeVRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihWZXJpZnlUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oVmVyaWZ5VGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihWZXJpZnlUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQkJCQkJb3V0LndyaXRlQm9vbGVhbihmYWxzZSk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRocmVhZC5zdGFydCgpOwotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyL3Rlc3QueG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MmUyZDQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPgotICA8IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgotICA8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotICA8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfVwuLlwuLiIvPgotCi0gIDwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBlY2xpcHNlLWhvbWUsIGFuZCBsaWJyYXJ5LWZpbGUgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LWZpbGUiCi0gICAgICAgICAgICB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvb3JnLmVjbGlwc2UudGVzdC9saWJyYXJ5LnhtbCIvPgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLSAgPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KLSAgPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgPHRzdGFtcC8+Ci0gICAgPGRlbGV0ZT4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtlY2xpcHNlLWhvbWV9IiBpbmNsdWRlcz0ib3JnKi54bWwiLz4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJzdWl0ZSI+Ci0gICAgPCEtLSBQYXJzZXIgdGVzdHMgLS0+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImpkdC1wYXJzZXItZm9sZGVyIiAKLSAgICAgICAgICAgICAgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9qZHRfcGFyc2VyX2ZvbGRlciIvPgotICAgIDxkZWxldGUgZGlyPSIke2pkdC1wYXJzZXItZm9sZGVyfSIgcXVpZXQ9InRydWUiLz4KLSAgICA8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7amR0LXBhcnNlci1mb2xkZXJ9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgCi0gICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyLnBhcnNlci5UZXN0QWxsIi8+Ci0gICAgPC9hbnQ+Ci0KLSAgICA8IS0tIENvbXBpbGVyIHJlZ3Jlc3Npb24gdGVzdHMgLS0+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImpkdC1jb21waWxlci1mb2xkZXIiIAotICAgICAgICAgICAgICB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L2pkdF9jb21waWxlcl9mb2xkZXIiLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtqZHQtY29tcGlsZXItZm9sZGVyfSIgcXVpZXQ9InRydWUiLz4KLSAgICA8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7amR0LWNvbXBpbGVyLWZvbGRlcn0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiAKLSAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIucmVncmVzc2lvbi5UZXN0QWxsIi8+Ci0gICAgPC9hbnQ+Ci0KLSAgICA8IS0tIEV2YWx1YXRpb24gdGVzdHMgLS0+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImpkdC1ldmFsLWZvbGRlciIgCi0gICAgICAgICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vamR0X2V2YWxfZm9sZGVyIi8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7amR0LWV2YWwtZm9sZGVyfSIgcXVpZXQ9InRydWUiLz4KLSAgICA8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7amR0LWV2YWwtZm9sZGVyfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIAotICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5ldmFsLlRlc3RBbGwiLz4KLSAgICA8L2FudD4KLQotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLSAgPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLSAgPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxzdWl0ZSxjbGVhbnVwIj4KLSAgICA8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcqLnhtbCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC8uY2xhc3NwYXRoIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU4NWJkZi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLmpkdC5kZWJ1ZyIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuZWNsaXBzZS5qZHQuY29yZSIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuanVuaXQiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuY29tcGlsZXIiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLmNvcmUuYm9vdCIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC8uY3ZzaWdub3JlIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA4ZTY2Yi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUuYm9vdDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuamR0LmNvcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qZHQuZGVidWc8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5qdW5pdDwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvSkNML2NvbnZlcnRlckpjbE1pbi5qYXIgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9KQ0wvY29udmVydGVySmNsTWluLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA0MmQyMS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9KQ0wvY29udmVydGVySmNsTWluLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL0pDTC9jb252ZXJ0ZXJKY2xNaW5zcmMuemlwIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvSkNML2NvbnZlcnRlckpjbE1pbnNyYy56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMTFkMDguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvSkNML2NvbnZlcnRlckpjbE1pbnNyYy56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9KQ0wvamNsTWluLmphciBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL0pDTC9qY2xNaW4uamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTA3Mzc5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL0pDTC9qY2xNaW4uamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvSkNML2pjbE1pbnNyYy56aXAgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9KQ0wvamNsTWluc3JjLnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MzODA5Yy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9KQ0wvamNsTWluc3JjLnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL2Fib3V0Lmh0bWwgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDNiNDkzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD4yMHRoIEp1bmUsIDIwMDI8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotPHA+RWNsaXBzZS5vcmcgbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlRoaXJkIFBhcnR5IENvbnRlbnQ8L2gzPgotCi08cD5UaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IG1heSBiZSBoYXZlIGJlZW4gc291cmNlZCBmcm9tIHRoaXJkIHBhcnRpZXMgYXMgZm9sbG93czo8L3A+Ci0KLTxwPjxiPkpVbml0IDMuNzwvYj48L3A+Ci08cD5UaGUgcGx1Zy1pbiBpcyBiYXNlZCBvbiBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgSlVuaXQub3JnLiAgWW91ciB1c2Ugb2YgSlVuaXQgMy43IGluIGJvdGggc291cmNlIGFuZCBiaW5hcnkgY29kZQotZm9ybSBjb250YWluZWQgaW4gdGhlIHBsdWctaW4gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0Ci08YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+LgotVGhlIHNvdXJjZSBjb2RlIGlzIGxvY2F0ZWQgaW4gd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC48L3A+Ci0KLTxwPmkpIElCTSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOzwvcD4KLTxwPmlpKSBJQk0gZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7PC9wPgotPHA+aWlpKSBJQk0gc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eS48L3A+Ci0KLTxoMz5Db250cmlidXRpb25zPC9oMz4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCwgYW55IENvbnRyaWJ1dGlvbnMsIGFzIGRlZmluZWQgaW4gdGhlIENQTCwgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlCi1tYWRlIGF2YWlsYWJsZSB0byBFY2xpcHNlLm9yZywgbWVtYmVycyBvZiBFY2xpcHNlLm9yZyBhbmQvb3IgdGhlIGhvc3Qgb2YgRWNsaXBzZS5vcmcgd2ViIHNpdGUsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoCi1Db250ZW50IGFyZSBwcm92aWRlZCB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENQTC48L3A+Ci0KLTxwPklmIHRoaXMgQ29udGVudCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvdGhlciB0aGFuIHRoZSBDUEwgKCZxdW90O090aGVyIExpY2Vuc2UmcXVvdDspLCBhbnkgbW9kaWZpY2F0aW9ucywgZW5oYW5jZW1lbnRzIGFuZC9vcgotb3RoZXIgY29kZSBhbmQvb3IgZG9jdW1lbnRhdGlvbiAoJnF1b3Q7TW9kaWZpY2F0aW9ucyZxdW90OykgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUKLWhvc3Qgb2YgRWNsaXBzZS5vcmcsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoIENvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBPdGhlciBMaWNlbnNlIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUKLXRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE90aGVyIExpY2Vuc2UuICBJbiBhZGRpdGlvbiwgd2l0aCByZWdhcmQgdG8gTW9kaWZpY2F0aW9ucyBmb3Igd2hpY2ggeW91IGFyZSB0aGUgY29weXJpZ2h0IGhvbGRlciwgeW91IGFyZSBhbHNvCi1wcm92aWRpbmcgdGhlIE1vZGlmaWNhdGlvbnMgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwgYW5kIHN1Y2ggTW9kaWZpY2F0aW9ucyBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZgotdGhlIENQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTExZTYwZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICAqLmphcixcCi0gICAgICAgICAgICAgICBKQ0wvLFwKLSAgICAgICAgICAgICAgIHdvcmtzcGFjZS8KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKLXNvdXJjZS5qZHRjb3JldGVzdHNtb2RlbC5qYXIgPSBzcmMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3BsdWdpbi54bWwgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGIyMjAzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsIgotICAgbmFtZT0iSmF2YSBNb2RlbCBUZXN0cyIKLSAgIHZlcnNpb249IjIuMS4wIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJqZHRjb3JldGVzdHNtb2RlbC5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuZGVidWciLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5qdW5pdCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmNvbXBpbGVyIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0JPGV4dGVuc2lvbiBwb2ludCA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyIj4KLQkJPGNsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIKLQkJCXZhcmlhYmxlPSJURVNUX0xJQiIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC5WYXJpYWJsZXNJbml0aWFsaXplciIvPgotCQk8Y2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplcgotCQkJdmFyaWFibGU9IlRFU1RfU1JDIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsLlZhcmlhYmxlc0luaXRpYWxpemVyIi8+Ci0JCTxjbGFzc3BhdGhWYXJpYWJsZUluaXRpYWxpemVyCi0JCQl2YXJpYWJsZT0iVEVTVF9ST09UIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsLlZhcmlhYmxlc0luaXRpYWxpemVyIi8+Ci0JPC9leHRlbnNpb24+CQkKLQotCTxleHRlbnNpb24gcG9pbnQgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIiPgotCQk8Y2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC5URVNUX0NPTlRBSU5FUiIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC5Db250YWluZXJJbml0aWFsaXplciIvPgotCTwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9kb20vQVNUQ29udmVydGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2RvbS9BU1RDb252ZXJ0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNmQ2ZjUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2RvbS9BU1RDb252ZXJ0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NzU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5kb207Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSU1vZGlmaWVyQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgQVNUQ29udmVydGVyVGVzdCBleHRlbmRzIENvbnZlcnRlclRlc3RTZXR1cCB7Ci0JCi0JcHVibGljIEFTVENvbnZlcnRlclRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgU3VpdGUoQVNUQ29udmVydGVyVGVzdC5jbGFzcy5nZXROYW1lKCkpOwkJCi0KLQkJaWYgKHRydWUpIHsKLQkJCUNsYXNzIGMgPSBBU1RDb252ZXJ0ZXJUZXN0LmNsYXNzOwotCQkJTWV0aG9kW10gbWV0aG9kcyA9IGMuZ2V0TWV0aG9kcygpOwotCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG1ldGhvZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCQlpZiAobWV0aG9kc1tpXS5nZXROYW1lKCkuc3RhcnRzV2l0aCgidGVzdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc3VpdGUuYWRkVGVzdChuZXcgQVNUQ29udmVydGVyVGVzdChtZXRob2RzW2ldLmdldE5hbWUoKSkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzdWl0ZTsKLQkJfQotCQlzdWl0ZS5hZGRUZXN0KG5ldyBBU1RDb252ZXJ0ZXJUZXN0KCJ0ZXN0MDIwNCIpKTsJCQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkJCi0JcHVibGljIHZvaWQgdGVzdDAwMDEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDAwMSIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQkKLQkJLy8gY2hlY2sgdGhhdCB3ZSBoYXZlIHRoZSByaWdodCB0cmVlCi0JCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gdGhpcy5hc3QubmV3Q29tcGlsYXRpb25Vbml0KCk7Ci0JCVBhY2thZ2VEZWNsYXJhdGlvbiBwYWNrYWdlRGVjbGFyYXRpb24gPSB0aGlzLmFzdC5uZXdQYWNrYWdlRGVjbGFyYXRpb24oKTsKLQkJcGFja2FnZURlY2xhcmF0aW9uLnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgidGVzdDAwMDEiKSk7Ly8kTk9OLU5MUy0xJAotCQl1bml0LnNldFBhY2thZ2UocGFja2FnZURlY2xhcmF0aW9uKTsKLQkJSW1wb3J0RGVjbGFyYXRpb24gaW1wb3J0RGVjbGFyYXRpb24gPSB0aGlzLmFzdC5uZXdJbXBvcnREZWNsYXJhdGlvbigpOwotCQlRdWFsaWZpZWROYW1lIG5hbWUgPSAKLQkJCXRoaXMuYXN0Lm5ld1F1YWxpZmllZE5hbWUoCi0JCQkJdGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiamF2YSIpLC8vJE5PTi1OTFMtMSQKLQkJCQl0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJ1dGlsIikpOy8vJE5PTi1OTFMtMSQKLQkJaW1wb3J0RGVjbGFyYXRpb24uc2V0TmFtZShuYW1lKTsKLQkJaW1wb3J0RGVjbGFyYXRpb24uc2V0T25EZW1hbmQodHJ1ZSk7Ci0JCXVuaXQuaW1wb3J0cygpLmFkZChpbXBvcnREZWNsYXJhdGlvbik7Ci0JCVR5cGVEZWNsYXJhdGlvbiB0eXBlID0gdGhpcy5hc3QubmV3VHlwZURlY2xhcmF0aW9uKCk7Ci0JCXR5cGUuc2V0SW50ZXJmYWNlKGZhbHNlKTsKLQkJdHlwZS5zZXRNb2RpZmllcnMoTW9kaWZpZXIuUFVCTElDKTsKLQkJdHlwZS5zZXROYW1lKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoIlRlc3QiKSk7Ly8kTk9OLU5MUy0xJAotCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IHRoaXMuYXN0Lm5ld01ldGhvZERlY2xhcmF0aW9uKCk7Ci0JCW1ldGhvZERlY2xhcmF0aW9uLnNldENvbnN0cnVjdG9yKGZhbHNlKTsKLQkJbWV0aG9kRGVjbGFyYXRpb24uc2V0TW9kaWZpZXJzKE1vZGlmaWVyLlBVQkxJQyB8IE1vZGlmaWVyLlNUQVRJQyk7Ci0JCW1ldGhvZERlY2xhcmF0aW9uLnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgibWFpbiIpKTsvLyROT04tTkxTLTEkCi0JCW1ldGhvZERlY2xhcmF0aW9uLnNldFJldHVyblR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLlZPSUQpKTsKLQkJU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiB2YXJpYWJsZURlY2xhcmF0aW9uID0gdGhpcy5hc3QubmV3U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbigpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uLnNldE1vZGlmaWVycyhNb2RpZmllci5OT05FKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbi5zZXRUeXBlKHRoaXMuYXN0Lm5ld0FycmF5VHlwZSh0aGlzLmFzdC5uZXdTaW1wbGVUeXBlKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoIlN0cmluZyIpKSkpOy8vJE5PTi1OTFMtMSQKLQkJdmFyaWFibGVEZWNsYXJhdGlvbi5zZXROYW1lKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImFyZ3MiKSk7Ly8kTk9OLU5MUy0xJAotCQltZXRob2REZWNsYXJhdGlvbi5wYXJhbWV0ZXJzKCkuYWRkKHZhcmlhYmxlRGVjbGFyYXRpb24pOwotCQlvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQmxvY2sgYmxvY2sgPSB0aGlzLmFzdC5uZXdCbG9jaygpOwotCQlNZXRob2RJbnZvY2F0aW9uIG1ldGhvZEludm9jYXRpb24gPSB0aGlzLmFzdC5uZXdNZXRob2RJbnZvY2F0aW9uKCk7Ci0JCW5hbWUgPSAKLQkJCXRoaXMuYXN0Lm5ld1F1YWxpZmllZE5hbWUoCi0JCQkJdGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiU3lzdGVtIiksLy8kTk9OLU5MUy0xJAotCQkJCXRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoIm91dCIpKTsvLyROT04tTkxTLTEkCi0JCW1ldGhvZEludm9jYXRpb24uc2V0RXhwcmVzc2lvbihuYW1lKTsKLQkJbWV0aG9kSW52b2NhdGlvbi5zZXROYW1lKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoInByaW50bG4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJSW5maXhFeHByZXNzaW9uIGluZml4RXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld0luZml4RXhwcmVzc2lvbigpOwotCQlpbmZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLlBMVVMpOwotCQlTdHJpbmdMaXRlcmFsIGxpdGVyYWwgPSB0aGlzLmFzdC5uZXdTdHJpbmdMaXRlcmFsKCk7Ci0JCWxpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKCJIZWxsbyIpOy8vJE5PTi1OTFMtMSQKLQkJaW5maXhFeHByZXNzaW9uLnNldExlZnRPcGVyYW5kKGxpdGVyYWwpOwotCQlsaXRlcmFsID0gdGhpcy5hc3QubmV3U3RyaW5nTGl0ZXJhbCgpOwotCQlsaXRlcmFsLnNldExpdGVyYWxWYWx1ZSgiIHdvcmxkIik7Ly8kTk9OLU5MUy0xJAotCQlpbmZpeEV4cHJlc3Npb24uc2V0UmlnaHRPcGVyYW5kKGxpdGVyYWwpOy8vJE5PTi1OTFMtMSQKLQkJbWV0aG9kSW52b2NhdGlvbi5hcmd1bWVudHMoKS5hZGQoaW5maXhFeHByZXNzaW9uKTsKLQkJRXhwcmVzc2lvblN0YXRlbWVudCBleHByZXNzaW9uU3RhdGVtZW50ID0gdGhpcy5hc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChtZXRob2RJbnZvY2F0aW9uKTsKLQkJYmxvY2suc3RhdGVtZW50cygpLmFkZChleHByZXNzaW9uU3RhdGVtZW50KTsKLQkJbWV0aG9kRGVjbGFyYXRpb24uc2V0Qm9keShibG9jayk7Ci0JCXR5cGUuYm9keURlY2xhcmF0aW9ucygpLmFkZChtZXRob2REZWNsYXJhdGlvbik7Ci0JCXVuaXQudHlwZXMoKS5hZGQodHlwZSk7Ci0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCByZXN1bHQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIHVuaXQpKTsvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UocmVzdWx0LCBuZXcgU3RyaW5nKHNvdXJjZSksIHNvdXJjZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3QgYWxsb2NhdGlvbiBleHByZXNzaW9uOiBuZXcgT2JqZWN0KCkgPT0+IENsYXNzSW5zdGFuY2VDcmVhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDAyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwMDIiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBleHByZXNzaW9uID0gZ2V0QVNUTm9kZVRvQ29tcGFyZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIGV4cHJlc3Npb24pOyAvLyROT04tTkxTLTEkCi0JCUNsYXNzSW5zdGFuY2VDcmVhdGlvbiBjbGFzc0luc3RhbmNlQ3JlYXRpb24gPSB0aGlzLmFzdC5uZXdDbGFzc0luc3RhbmNlQ3JlYXRpb24oKTsKLQkJY2xhc3NJbnN0YW5jZUNyZWF0aW9uLnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiT2JqZWN0IikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBjbGFzc0luc3RhbmNlQ3JlYXRpb24uc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIGV4cHJlc3Npb24pKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShleHByZXNzaW9uLCAibmV3IE9iamVjdCgpIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRlc3QgYWxsb2NhdGlvbiBleHByZXNzaW9uOiBuZXcgamF2YS5sYW5nLk9iamVjdCgpID09PiBDbGFzc0luc3RhbmNlQ3JlYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDAwMygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMDAzIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgZXhwcmVzc2lvbiA9IGdldEFTVE5vZGVUb0NvbXBhcmUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0KTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBleHByZXNzaW9uKTsgLy8kTk9OLU5MUy0xJAotCQlDbGFzc0luc3RhbmNlQ3JlYXRpb24gY2xhc3NJbnN0YW5jZUNyZWF0aW9uID0gdGhpcy5hc3QubmV3Q2xhc3NJbnN0YW5jZUNyZWF0aW9uKCk7Ci0JCVF1YWxpZmllZE5hbWUgbmFtZSA9IAotCQkJdGhpcy5hc3QubmV3UXVhbGlmaWVkTmFtZSgKLQkJCQl0aGlzLmFzdC5uZXdRdWFsaWZpZWROYW1lKAotCQkJCQl0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJqYXZhIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJdGhpcy5hc3QubmV3U2ltcGxlTmFtZSgibGFuZyIpKSwgLy8kTk9OLU5MUy0xJAotCQkJCXRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoIk9iamVjdCIpKTsvLyROT04tTkxTLTEkCi0JCWNsYXNzSW5zdGFuY2VDcmVhdGlvbi5zZXROYW1lKG5hbWUpOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgY2xhc3NJbnN0YW5jZUNyZWF0aW9uLnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBleHByZXNzaW9uKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UoZXhwcmVzc2lvbiwgIm5ldyBqYXZhLmxhbmcuT2JqZWN0KCkiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGVzdCBhbGxvY2F0aW9uIGV4cHJlc3Npb246IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKCJFUlJPUiIpID09PiBDbGFzc0luc3RhbmNlQ3JlYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDAwNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMDA0IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgZXhwcmVzc2lvbiA9IGdldEFTVE5vZGVUb0NvbXBhcmUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0KTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBleHByZXNzaW9uKTsgLy8kTk9OLU5MUy0xJAotCQlDbGFzc0luc3RhbmNlQ3JlYXRpb24gY2xhc3NJbnN0YW5jZUNyZWF0aW9uID0gdGhpcy5hc3QubmV3Q2xhc3NJbnN0YW5jZUNyZWF0aW9uKCk7Ci0JCVF1YWxpZmllZE5hbWUgbmFtZSA9IAotCQkJdGhpcy5hc3QubmV3UXVhbGlmaWVkTmFtZSgKLQkJCQl0aGlzLmFzdC5uZXdRdWFsaWZpZWROYW1lKAotCQkJCQl0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJqYXZhIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJdGhpcy5hc3QubmV3U2ltcGxlTmFtZSgibGFuZyIpKSwgLy8kTk9OLU5MUy0xJAotCQkJCXRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoIkV4Y2VwdGlvbiIpKTsvLyROT04tTkxTLTEkCi0JCWNsYXNzSW5zdGFuY2VDcmVhdGlvbi5zZXROYW1lKG5hbWUpOwotCQlTdHJpbmdMaXRlcmFsIGxpdGVyYWwgPSB0aGlzLmFzdC5uZXdTdHJpbmdMaXRlcmFsKCk7Ci0JCWxpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKCJFUlJPUiIpOyAvLyROT04tTkxTLTEkCi0JCWNsYXNzSW5zdGFuY2VDcmVhdGlvbi5hcmd1bWVudHMoKS5hZGQobGl0ZXJhbCk7Ci0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBjbGFzc0luc3RhbmNlQ3JlYXRpb24uc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIGV4cHJlc3Npb24pKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShleHByZXNzaW9uLCAibmV3IGphdmEubGFuZy5FeGNlcHRpb24oXCJFUlJPUlwiKSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IGFsbG9jYXRpb24gZXhwcmVzc2lvbjogbmV3IGphdmEubGFuZy5PYmplY3QoKSB7fSA9PT4gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwMDUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDAwNSIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIGV4cHJlc3Npb24gPSBnZXRBU1ROb2RlVG9Db21wYXJlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgZXhwcmVzc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIGNsYXNzSW5zdGFuY2VDcmVhdGlvbiA9IHRoaXMuYXN0Lm5ld0NsYXNzSW5zdGFuY2VDcmVhdGlvbigpOwotCQlRdWFsaWZpZWROYW1lIG5hbWUgPSAKLQkJCXRoaXMuYXN0Lm5ld1F1YWxpZmllZE5hbWUoCi0JCQkJdGhpcy5hc3QubmV3UXVhbGlmaWVkTmFtZSgKLQkJCQkJdGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiamF2YSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCXRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImxhbmciKSksIC8vJE5PTi1OTFMtMSQKLQkJCQl0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJPYmplY3QiKSk7Ly8kTk9OLU5MUy0xJAotCQljbGFzc0luc3RhbmNlQ3JlYXRpb24uc2V0TmFtZShuYW1lKTsKLQkJQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBhbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uID0gdGhpcy5hc3QubmV3QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpOwotCQljbGFzc0luc3RhbmNlQ3JlYXRpb24uc2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbihhbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIGNsYXNzSW5zdGFuY2VDcmVhdGlvbi5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgZXhwcmVzc2lvbikpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb24sICJuZXcgamF2YS5sYW5nLk9iamVjdCgpIHt9Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlDbGFzc0luc3RhbmNlQ3JlYXRpb24gY2xhc3NJbnN0YW5jZUNyZWF0aW9uMiA9IChDbGFzc0luc3RhbmNlQ3JlYXRpb24pIGV4cHJlc3Npb247Ci0JCU5hbWUgbmFtZTIgPSBjbGFzc0luc3RhbmNlQ3JlYXRpb24yLmdldE5hbWUoKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShuYW1lMiwgImphdmEubGFuZy5PYmplY3QiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCQkJCQotCS8qKgotCSAqIFRlc3QgYWxsb2NhdGlvbiBleHByZXNzaW9uOiBuZXcgamF2YS5sYW5nLlJ1bm5hYmxlKCkgeyBwdWJsaWMgdm9pZCBydW4oKSB7fX0gPT0+IENsYXNzSW5zdGFuY2VDcmVhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDA2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwMDYiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBleHByZXNzaW9uID0gZ2V0QVNUTm9kZVRvQ29tcGFyZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIGV4cHJlc3Npb24pOyAvLyROT04tTkxTLTEkCi0JCUNsYXNzSW5zdGFuY2VDcmVhdGlvbiBjbGFzc0luc3RhbmNlQ3JlYXRpb24gPSB0aGlzLmFzdC5uZXdDbGFzc0luc3RhbmNlQ3JlYXRpb24oKTsKLQkJUXVhbGlmaWVkTmFtZSBuYW1lID0gCi0JCQl0aGlzLmFzdC5uZXdRdWFsaWZpZWROYW1lKAotCQkJCXRoaXMuYXN0Lm5ld1F1YWxpZmllZE5hbWUoCi0JCQkJCXRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImphdmEiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQl0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJsYW5nIikpLCAvLyROT04tTkxTLTEkCi0JCQkJdGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiUnVubmFibGUiKSk7Ly8kTk9OLU5MUy0xJAotCQljbGFzc0luc3RhbmNlQ3JlYXRpb24uc2V0TmFtZShuYW1lKTsKLQkJTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSB0aGlzLmFzdC5uZXdNZXRob2REZWNsYXJhdGlvbigpOwotCQltZXRob2REZWNsYXJhdGlvbi5zZXRCb2R5KHRoaXMuYXN0Lm5ld0Jsb2NrKCkpOwotCQltZXRob2REZWNsYXJhdGlvbi5zZXRDb25zdHJ1Y3RvcihmYWxzZSk7Ci0JCW1ldGhvZERlY2xhcmF0aW9uLnNldE1vZGlmaWVycyhNb2RpZmllci5QVUJMSUMpOwotCQltZXRob2REZWNsYXJhdGlvbi5zZXROYW1lKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoInJ1biIpKTsvLyROT04tTkxTLTEkCi0JCW1ldGhvZERlY2xhcmF0aW9uLnNldFJldHVyblR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLlZPSUQpKTsKLQkJQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBhbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uID0gdGhpcy5hc3QubmV3QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpOwotCQlhbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLmJvZHlEZWNsYXJhdGlvbnMoKS5hZGQobWV0aG9kRGVjbGFyYXRpb24pOwotCQljbGFzc0luc3RhbmNlQ3JlYXRpb24uc2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbihhbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIGNsYXNzSW5zdGFuY2VDcmVhdGlvbi5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgZXhwcmVzc2lvbikpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb24sICJuZXcgamF2YS5sYW5nLlJ1bm5hYmxlKCkgeyBwdWJsaWMgdm9pZCBydW4oKSB7fX0iLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGVzdCBhbGxvY2F0aW9uIGV4cHJlc3Npb246IG5ldyBUZXN0KCkubmV3IEQoKSA9PT4gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwMDcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDAwNyIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhbiBFeHByZXNzaW9uU3RhdGVtZW50Iiwgbm9kZSBpbnN0YW5jZW9mIEV4cHJlc3Npb25TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCUV4cHJlc3Npb25TdGF0ZW1lbnQgZXhwcmVzc2lvblN0YXRlbWVudCA9IChFeHByZXNzaW9uU3RhdGVtZW50KSBub2RlOwotCQlBU1ROb2RlIGV4cHJlc3Npb24gPSAoQVNUTm9kZSkgKChNZXRob2RJbnZvY2F0aW9uKSBleHByZXNzaW9uU3RhdGVtZW50LmdldEV4cHJlc3Npb24oKSkuYXJndW1lbnRzKCkuZ2V0KDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIGV4cHJlc3Npb24pOyAvLyROT04tTkxTLTEkCi0JCUNsYXNzSW5zdGFuY2VDcmVhdGlvbiBjbGFzc0luc3RhbmNlQ3JlYXRpb24gPSB0aGlzLmFzdC5uZXdDbGFzc0luc3RhbmNlQ3JlYXRpb24oKTsKLQkJY2xhc3NJbnN0YW5jZUNyZWF0aW9uLnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiRCIpKTsgLy8kTk9OLU5MUy0xJAotCQlDbGFzc0luc3RhbmNlQ3JlYXRpb24gY2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld0NsYXNzSW5zdGFuY2VDcmVhdGlvbigpOwotCQljbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uLnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiVGVzdCIpKTsgLy8kTk9OLU5MUy0xJAotCQljbGFzc0luc3RhbmNlQ3JlYXRpb24uc2V0RXhwcmVzc2lvbihjbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uKTsKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIGNsYXNzSW5zdGFuY2VDcmVhdGlvbi5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgZXhwcmVzc2lvbikpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb24sICJuZXcgVGVzdCgpLm5ldyBEKCkiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGVzdCBhbGxvY2F0aW9uIGV4cHJlc3Npb246IG5ldyBpbnRbXSB7MSwgMiwgMywgNH0gPT0+IEFycmF5Q3JlYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDAwOCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMDA4IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgZXhwcmVzc2lvbiA9IGdldEFTVE5vZGVUb0NvbXBhcmUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0KTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBleHByZXNzaW9uKTsgLy8kTk9OLU5MUy0xJAotCQlBcnJheUNyZWF0aW9uIGFycmF5Q3JlYXRpb24gPSB0aGlzLmFzdC5uZXdBcnJheUNyZWF0aW9uKCk7Ci0JCWFycmF5Q3JlYXRpb24uc2V0VHlwZSh0aGlzLmFzdC5uZXdBcnJheVR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLklOVCksIDEpKTsKLQkJQXJyYXlJbml0aWFsaXplciBhcnJheUluaXRpYWxpemVyID0gdGhpcy5hc3QubmV3QXJyYXlJbml0aWFsaXplcigpOwotCQlhcnJheUluaXRpYWxpemVyLmV4cHJlc3Npb25zKCkuYWRkKHRoaXMuYXN0Lm5ld051bWJlckxpdGVyYWwoIjEiKSk7Ly8kTk9OLU5MUy0xJAotCQlhcnJheUluaXRpYWxpemVyLmV4cHJlc3Npb25zKCkuYWRkKHRoaXMuYXN0Lm5ld051bWJlckxpdGVyYWwoIjIiKSk7Ly8kTk9OLU5MUy0xJAotCQlhcnJheUluaXRpYWxpemVyLmV4cHJlc3Npb25zKCkuYWRkKHRoaXMuYXN0Lm5ld051bWJlckxpdGVyYWwoIjMiKSk7Ly8kTk9OLU5MUy0xJAotCQlhcnJheUluaXRpYWxpemVyLmV4cHJlc3Npb25zKCkuYWRkKHRoaXMuYXN0Lm5ld051bWJlckxpdGVyYWwoIjQiKSk7Ly8kTk9OLU5MUy0xJAotCQlhcnJheUNyZWF0aW9uLnNldEluaXRpYWxpemVyKGFycmF5SW5pdGlhbGl6ZXIpOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgYXJyYXlDcmVhdGlvbi5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgZXhwcmVzc2lvbikpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb24sICJuZXcgaW50W10gezEsIDIsIDMsIDR9Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRlc3QgYWxsb2NhdGlvbiBleHByZXNzaW9uOiBuZXcgaW50W11bXSB7ezF9LCB7Mn19ID09PiBBcnJheUNyZWF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwMDkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDAwOSIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIGV4cHJlc3Npb24gPSBnZXRBU1ROb2RlVG9Db21wYXJlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgZXhwcmVzc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJQXJyYXlDcmVhdGlvbiBhcnJheUNyZWF0aW9uID0gdGhpcy5hc3QubmV3QXJyYXlDcmVhdGlvbigpOwotCQlhcnJheUNyZWF0aW9uLnNldFR5cGUodGhpcy5hc3QubmV3QXJyYXlUeXBlKHRoaXMuYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5JTlQpLCAyKSk7Ci0JCUFycmF5SW5pdGlhbGl6ZXIgYXJyYXlJbml0aWFsaXplciA9IHRoaXMuYXN0Lm5ld0FycmF5SW5pdGlhbGl6ZXIoKTsKLQkJQXJyYXlJbml0aWFsaXplciBpbm5lckFycmF5SW5pdGlhbGl6ZXIgPSB0aGlzLmFzdC5uZXdBcnJheUluaXRpYWxpemVyKCk7Ci0JCWlubmVyQXJyYXlJbml0aWFsaXplci5leHByZXNzaW9ucygpLmFkZCh0aGlzLmFzdC5uZXdOdW1iZXJMaXRlcmFsKCIxIikpOy8vJE5PTi1OTFMtMSQKLQkJYXJyYXlJbml0aWFsaXplci5leHByZXNzaW9ucygpLmFkZChpbm5lckFycmF5SW5pdGlhbGl6ZXIpOwotCQlpbm5lckFycmF5SW5pdGlhbGl6ZXIgPSB0aGlzLmFzdC5uZXdBcnJheUluaXRpYWxpemVyKCk7Ci0JCWlubmVyQXJyYXlJbml0aWFsaXplci5leHByZXNzaW9ucygpLmFkZCh0aGlzLmFzdC5uZXdOdW1iZXJMaXRlcmFsKCIyIikpOy8vJE5PTi1OTFMtMSQKLQkJYXJyYXlJbml0aWFsaXplci5leHByZXNzaW9ucygpLmFkZChpbm5lckFycmF5SW5pdGlhbGl6ZXIpOwotCQlhcnJheUNyZWF0aW9uLnNldEluaXRpYWxpemVyKGFycmF5SW5pdGlhbGl6ZXIpOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgYXJyYXlDcmVhdGlvbi5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgZXhwcmVzc2lvbikpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb24sICJuZXcgaW50W11bXSB7ezF9LCB7Mn19Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRlc3QgYWxsb2NhdGlvbiBleHByZXNzaW9uOiBuZXcgaW50WzNdID09PiBBcnJheUNyZWF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwMTAoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDAxMCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIGV4cHJlc3Npb24gPSBnZXRBU1ROb2RlVG9Db21wYXJlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgZXhwcmVzc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJQXJyYXlDcmVhdGlvbiBhcnJheUNyZWF0aW9uID0gdGhpcy5hc3QubmV3QXJyYXlDcmVhdGlvbigpOwotCQlhcnJheUNyZWF0aW9uLnNldFR5cGUodGhpcy5hc3QubmV3QXJyYXlUeXBlKHRoaXMuYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5JTlQpLCAxKSk7Ci0JCWFycmF5Q3JlYXRpb24uZGltZW5zaW9ucygpLmFkZCh0aGlzLmFzdC5uZXdOdW1iZXJMaXRlcmFsKCIzIikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBhcnJheUNyZWF0aW9uLnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBleHByZXNzaW9uKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UoZXhwcmVzc2lvbiwgIm5ldyBpbnRbM10iLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGVzdCBhbGxvY2F0aW9uIGV4cHJlc3Npb246IG5ldyBpbnRbM11bXSA9PT4gQXJyYXlDcmVhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDExKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwMTEiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBleHByZXNzaW9uID0gZ2V0QVNUTm9kZVRvQ29tcGFyZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIGV4cHJlc3Npb24pOyAvLyROT04tTkxTLTEkCi0JCUFycmF5Q3JlYXRpb24gYXJyYXlDcmVhdGlvbiA9IHRoaXMuYXN0Lm5ld0FycmF5Q3JlYXRpb24oKTsKLQkJYXJyYXlDcmVhdGlvbi5zZXRUeXBlKHRoaXMuYXN0Lm5ld0FycmF5VHlwZSh0aGlzLmFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuSU5UKSwgMikpOwotCQlhcnJheUNyZWF0aW9uLmRpbWVuc2lvbnMoKS5hZGQodGhpcy5hc3QubmV3TnVtYmVyTGl0ZXJhbCgiMyIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgYXJyYXlDcmVhdGlvbi5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgZXhwcmVzc2lvbikpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb24sICJuZXcgaW50WzNdW10iLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCQkKLQkvKioKLQkgKiBUZXN0IGFsbG9jYXRpb24gZXhwcmVzc2lvbjogbmV3IGludFtdW10ge3t9LHt9fSA9PT4gQXJyYXlDcmVhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDEyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwMTIiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBleHByZXNzaW9uID0gZ2V0QVNUTm9kZVRvQ29tcGFyZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIGV4cHJlc3Npb24pOyAvLyROT04tTkxTLTEkCi0JCUFycmF5Q3JlYXRpb24gYXJyYXlDcmVhdGlvbiA9IHRoaXMuYXN0Lm5ld0FycmF5Q3JlYXRpb24oKTsKLQkJYXJyYXlDcmVhdGlvbi5zZXRUeXBlKHRoaXMuYXN0Lm5ld0FycmF5VHlwZSh0aGlzLmFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuSU5UKSwgMikpOwotCQlBcnJheUluaXRpYWxpemVyIGFycmF5SW5pdGlhbGl6ZXIgPSB0aGlzLmFzdC5uZXdBcnJheUluaXRpYWxpemVyKCk7Ci0JCUFycmF5SW5pdGlhbGl6ZXIgaW5uZXJBcnJheUluaXRpYWxpemVyID0gdGhpcy5hc3QubmV3QXJyYXlJbml0aWFsaXplcigpOwotCQlhcnJheUluaXRpYWxpemVyLmV4cHJlc3Npb25zKCkuYWRkKGlubmVyQXJyYXlJbml0aWFsaXplcik7Ci0JCWlubmVyQXJyYXlJbml0aWFsaXplciA9IHRoaXMuYXN0Lm5ld0FycmF5SW5pdGlhbGl6ZXIoKTsKLQkJYXJyYXlJbml0aWFsaXplci5leHByZXNzaW9ucygpLmFkZChpbm5lckFycmF5SW5pdGlhbGl6ZXIpOwotCQlhcnJheUNyZWF0aW9uLnNldEluaXRpYWxpemVyKGFycmF5SW5pdGlhbGl6ZXIpOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgYXJyYXlDcmVhdGlvbi5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgZXhwcmVzc2lvbikpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb24sICJuZXcgaW50W11bXSB7e30sIHt9fSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBpbnQgaTsgPT0+IFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDEzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwMTMiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiaSIpKTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQodmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KTsKLQkJc3RhdGVtZW50LnNldE1vZGlmaWVycyhNb2RpZmllci5OT05FKTsKLQkJc3RhdGVtZW50LnNldFR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLklOVCkpOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImludCBpOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBpbnQgaSA9IDA7ID09PiBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDAxNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMDE0IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXROYW1lKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImkiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldEluaXRpYWxpemVyKHRoaXMuYXN0Lm5ld051bWJlckxpdGVyYWwoIjAiKSk7Ly8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQodmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KTsKLQkJc3RhdGVtZW50LnNldE1vZGlmaWVycyhNb2RpZmllci5OT05FKTsKLQkJc3RhdGVtZW50LnNldFR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLklOVCkpOwotCi0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBzdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiaW50IGkgPSAwOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBpID0gMTsgPT0+IEV4cHJlc3Npb25TdGF0ZW1lbnQoQXNzaWdubWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDAxNSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMDE1IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAxKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlBc3NpZ25tZW50IGFzc2lnbm1lbnQgPSB0aGlzLmFzdC5uZXdBc3NpZ25tZW50KCk7Ci0JCWFzc2lnbm1lbnQuc2V0TGVmdEhhbmRTaWRlKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImkiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzaWdubWVudC5zZXRSaWdodEhhbmRTaWRlKHRoaXMuYXN0Lm5ld051bWJlckxpdGVyYWwoIjEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzaWdubWVudC5zZXRPcGVyYXRvcihBc3NpZ25tZW50Lk9wZXJhdG9yLkFTU0lHTik7Ci0JCUV4cHJlc3Npb25TdGF0ZW1lbnQgc3RhdGVtZW50ID0gdGhpcy5hc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChhc3NpZ25tZW50KTsKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIHN0YXRlbWVudC5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgbm9kZSkpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJpID0gMTsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogaSArPSAyOyA9PT4gRXhwcmVzc2lvblN0YXRlbWVudChBc3NpZ25tZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDE2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwMTYiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDEpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCUFzc2lnbm1lbnQgYXNzaWdubWVudCA9IHRoaXMuYXN0Lm5ld0Fzc2lnbm1lbnQoKTsKLQkJYXNzaWdubWVudC5zZXRMZWZ0SGFuZFNpZGUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiaSIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NpZ25tZW50LnNldFJpZ2h0SGFuZFNpZGUodGhpcy5hc3QubmV3TnVtYmVyTGl0ZXJhbCgiMiIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NpZ25tZW50LnNldE9wZXJhdG9yKEFzc2lnbm1lbnQuT3BlcmF0b3IuUExVU19BU1NJR04pOwotCQlFeHByZXNzaW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld0V4cHJlc3Npb25TdGF0ZW1lbnQoYXNzaWdubWVudCk7Ci0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBzdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiaSArPSAyOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBpIC09IDI7ID09PiBFeHByZXNzaW9uU3RhdGVtZW50KEFzc2lnbm1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwMTcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDAxNyIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMSk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJQXNzaWdubWVudCBhc3NpZ25tZW50ID0gdGhpcy5hc3QubmV3QXNzaWdubWVudCgpOwotCQlhc3NpZ25tZW50LnNldExlZnRIYW5kU2lkZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJpIikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2lnbm1lbnQuc2V0UmlnaHRIYW5kU2lkZSh0aGlzLmFzdC5uZXdOdW1iZXJMaXRlcmFsKCIyIikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2lnbm1lbnQuc2V0T3BlcmF0b3IoQXNzaWdubWVudC5PcGVyYXRvci5NSU5VU19BU1NJR04pOwotCQlFeHByZXNzaW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld0V4cHJlc3Npb25TdGF0ZW1lbnQoYXNzaWdubWVudCk7Ci0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBzdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiaSAtPSAyOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogaSAqPSAyOyA9PT4gRXhwcmVzc2lvblN0YXRlbWVudChBc3NpZ25tZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDE4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwMTgiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDEpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCUFzc2lnbm1lbnQgYXNzaWdubWVudCA9IHRoaXMuYXN0Lm5ld0Fzc2lnbm1lbnQoKTsKLQkJYXNzaWdubWVudC5zZXRMZWZ0SGFuZFNpZGUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiaSIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NpZ25tZW50LnNldFJpZ2h0SGFuZFNpZGUodGhpcy5hc3QubmV3TnVtYmVyTGl0ZXJhbCgiMiIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NpZ25tZW50LnNldE9wZXJhdG9yKEFzc2lnbm1lbnQuT3BlcmF0b3IuVElNRVNfQVNTSUdOKTsKLQkJRXhwcmVzc2lvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KGFzc2lnbm1lbnQpOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImkgKj0gMjsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogaSAvPSAyOyA9PT4gRXhwcmVzc2lvblN0YXRlbWVudChBc3NpZ25tZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDE5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwMTkiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDEpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCUFzc2lnbm1lbnQgYXNzaWdubWVudCA9IHRoaXMuYXN0Lm5ld0Fzc2lnbm1lbnQoKTsKLQkJYXNzaWdubWVudC5zZXRMZWZ0SGFuZFNpZGUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiaSIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NpZ25tZW50LnNldFJpZ2h0SGFuZFNpZGUodGhpcy5hc3QubmV3TnVtYmVyTGl0ZXJhbCgiMiIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NpZ25tZW50LnNldE9wZXJhdG9yKEFzc2lnbm1lbnQuT3BlcmF0b3IuRElWSURFX0FTU0lHTik7Ci0JCUV4cHJlc3Npb25TdGF0ZW1lbnQgc3RhdGVtZW50ID0gdGhpcy5hc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChhc3NpZ25tZW50KTsKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIHN0YXRlbWVudC5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgbm9kZSkpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJpIC89IDI7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGkgJj0gMiA9PT4gRXhwcmVzc2lvblN0YXRlbWVudChBc3NpZ25tZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDIwKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwMjAiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDEpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCUFzc2lnbm1lbnQgYXNzaWdubWVudCA9IHRoaXMuYXN0Lm5ld0Fzc2lnbm1lbnQoKTsKLQkJYXNzaWdubWVudC5zZXRMZWZ0SGFuZFNpZGUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiaSIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NpZ25tZW50LnNldFJpZ2h0SGFuZFNpZGUodGhpcy5hc3QubmV3TnVtYmVyTGl0ZXJhbCgiMiIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NpZ25tZW50LnNldE9wZXJhdG9yKEFzc2lnbm1lbnQuT3BlcmF0b3IuQklUX0FORF9BU1NJR04pOwotCQlFeHByZXNzaW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld0V4cHJlc3Npb25TdGF0ZW1lbnQoYXNzaWdubWVudCk7Ci0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBzdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiaSAmPSAyOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBpIHw9IDI7ID09PiBFeHByZXNzaW9uU3RhdGVtZW50KEFzc2lnbm1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwMjEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDAyMSIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMSk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJQXNzaWdubWVudCBhc3NpZ25tZW50ID0gdGhpcy5hc3QubmV3QXNzaWdubWVudCgpOwotCQlhc3NpZ25tZW50LnNldExlZnRIYW5kU2lkZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJpIikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2lnbm1lbnQuc2V0UmlnaHRIYW5kU2lkZSh0aGlzLmFzdC5uZXdOdW1iZXJMaXRlcmFsKCIyIikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2lnbm1lbnQuc2V0T3BlcmF0b3IoQXNzaWdubWVudC5PcGVyYXRvci5CSVRfT1JfQVNTSUdOKTsKLQkJRXhwcmVzc2lvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KGFzc2lnbm1lbnQpOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImkgfD0gMjsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogaSBePSAyOyA9PT4gRXhwcmVzc2lvblN0YXRlbWVudChBc3NpZ25tZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDIyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwMjIiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDEpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCUFzc2lnbm1lbnQgYXNzaWdubWVudCA9IHRoaXMuYXN0Lm5ld0Fzc2lnbm1lbnQoKTsKLQkJYXNzaWdubWVudC5zZXRMZWZ0SGFuZFNpZGUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiaSIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NpZ25tZW50LnNldFJpZ2h0SGFuZFNpZGUodGhpcy5hc3QubmV3TnVtYmVyTGl0ZXJhbCgiMiIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NpZ25tZW50LnNldE9wZXJhdG9yKEFzc2lnbm1lbnQuT3BlcmF0b3IuQklUX1hPUl9BU1NJR04pOwotCQlFeHByZXNzaW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld0V4cHJlc3Npb25TdGF0ZW1lbnQoYXNzaWdubWVudCk7Ci0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBzdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiaSBePSAyOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBpICU9IDI7ID09PiBFeHByZXNzaW9uU3RhdGVtZW50KEFzc2lnbm1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwMjMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDAyMyIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMSk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJQXNzaWdubWVudCBhc3NpZ25tZW50ID0gdGhpcy5hc3QubmV3QXNzaWdubWVudCgpOwotCQlhc3NpZ25tZW50LnNldExlZnRIYW5kU2lkZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJpIikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2lnbm1lbnQuc2V0UmlnaHRIYW5kU2lkZSh0aGlzLmFzdC5uZXdOdW1iZXJMaXRlcmFsKCIyIikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2lnbm1lbnQuc2V0T3BlcmF0b3IoQXNzaWdubWVudC5PcGVyYXRvci5SRU1BSU5ERVJfQVNTSUdOKTsKLQkJRXhwcmVzc2lvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KGFzc2lnbm1lbnQpOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImkgJT0gMjsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogaSA8PD0gMjsgPT0+IEV4cHJlc3Npb25TdGF0ZW1lbnQoQXNzaWdubWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDAyNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMDI0IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAxKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlBc3NpZ25tZW50IGFzc2lnbm1lbnQgPSB0aGlzLmFzdC5uZXdBc3NpZ25tZW50KCk7Ci0JCWFzc2lnbm1lbnQuc2V0TGVmdEhhbmRTaWRlKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImkiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzaWdubWVudC5zZXRSaWdodEhhbmRTaWRlKHRoaXMuYXN0Lm5ld051bWJlckxpdGVyYWwoIjIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzaWdubWVudC5zZXRPcGVyYXRvcihBc3NpZ25tZW50Lk9wZXJhdG9yLkxFRlRfU0hJRlRfQVNTSUdOKTsKLQkJRXhwcmVzc2lvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KGFzc2lnbm1lbnQpOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImkgPDw9IDI7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGkgPj49IDI7ID09PiBFeHByZXNzaW9uU3RhdGVtZW50KEFzc2lnbm1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwMjUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDAyNSIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMSk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJQXNzaWdubWVudCBhc3NpZ25tZW50ID0gdGhpcy5hc3QubmV3QXNzaWdubWVudCgpOwotCQlhc3NpZ25tZW50LnNldExlZnRIYW5kU2lkZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJpIikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2lnbm1lbnQuc2V0UmlnaHRIYW5kU2lkZSh0aGlzLmFzdC5uZXdOdW1iZXJMaXRlcmFsKCIyIikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2lnbm1lbnQuc2V0T3BlcmF0b3IoQXNzaWdubWVudC5PcGVyYXRvci5SSUdIVF9TSElGVF9TSUdORURfQVNTSUdOKTsKLQkJRXhwcmVzc2lvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KGFzc2lnbm1lbnQpOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImkgPj49IDI7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGkgPj4+PSAyOyA9PT4gRXhwcmVzc2lvblN0YXRlbWVudChBc3NpZ25tZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDI2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwMjYiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDEpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCUFzc2lnbm1lbnQgYXNzaWdubWVudCA9IHRoaXMuYXN0Lm5ld0Fzc2lnbm1lbnQoKTsKLQkJYXNzaWdubWVudC5zZXRMZWZ0SGFuZFNpZGUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiaSIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NpZ25tZW50LnNldFJpZ2h0SGFuZFNpZGUodGhpcy5hc3QubmV3TnVtYmVyTGl0ZXJhbCgiMiIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NpZ25tZW50LnNldE9wZXJhdG9yKEFzc2lnbm1lbnQuT3BlcmF0b3IuUklHSFRfU0hJRlRfVU5TSUdORURfQVNTSUdOKTsKLQkJRXhwcmVzc2lvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KGFzc2lnbm1lbnQpOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImkgPj4+PSAyOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAtLWk7ID09PiBFeHByZXNzaW9uU3RhdGVtZW50KFByZWZpeEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwMjcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDAyNyIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMSk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJUHJlZml4RXhwcmVzc2lvbiBwcmVmaXhFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3UHJlZml4RXhwcmVzc2lvbigpOwotCQlwcmVmaXhFeHByZXNzaW9uLnNldE9wZXJhbmQodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiaSIpKTsvLyROT04tTkxTLTEkCi0JCXByZWZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoUHJlZml4RXhwcmVzc2lvbi5PcGVyYXRvci5ERUNSRU1FTlQpOy8vJE5PTi1OTFMtMSQKLQkJRXhwcmVzc2lvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KHByZWZpeEV4cHJlc3Npb24pOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgIi0taTsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogLS1pOyA9PT4gRXhwcmVzc2lvblN0YXRlbWVudChQcmVmaXhFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDI4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwMjgiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDEpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCVByZWZpeEV4cHJlc3Npb24gcHJlZml4RXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld1ByZWZpeEV4cHJlc3Npb24oKTsKLQkJcHJlZml4RXhwcmVzc2lvbi5zZXRPcGVyYW5kKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImkiKSk7Ly8kTk9OLU5MUy0xJAotCQlwcmVmaXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKFByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3IuSU5DUkVNRU5UKTsvLyROT04tTkxTLTEkCi0JCUV4cHJlc3Npb25TdGF0ZW1lbnQgc3RhdGVtZW50ID0gdGhpcy5hc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChwcmVmaXhFeHByZXNzaW9uKTsKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIHN0YXRlbWVudC5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgbm9kZSkpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICIrK2k7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBpLS07ID09PiBFeHByZXNzaW9uU3RhdGVtZW50KFBvc3RmaXhFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDI5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwMjkiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDEpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCVBvc3RmaXhFeHByZXNzaW9uIHBvc3RmaXhFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3UG9zdGZpeEV4cHJlc3Npb24oKTsKLQkJcG9zdGZpeEV4cHJlc3Npb24uc2V0T3BlcmFuZCh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJpIikpOy8vJE5PTi1OTFMtMSQKLQkJcG9zdGZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoUG9zdGZpeEV4cHJlc3Npb24uT3BlcmF0b3IuREVDUkVNRU5UKTsvLyROT04tTkxTLTEkCi0JCUV4cHJlc3Npb25TdGF0ZW1lbnQgc3RhdGVtZW50ID0gdGhpcy5hc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChwb3N0Zml4RXhwcmVzc2lvbik7Ci0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBzdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiaS0tOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBpKys7ID09PiBFeHByZXNzaW9uU3RhdGVtZW50KFBvc3RmaXhFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDMwKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwMzAiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDEpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCVBvc3RmaXhFeHByZXNzaW9uIHBvc3RmaXhFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3UG9zdGZpeEV4cHJlc3Npb24oKTsKLQkJcG9zdGZpeEV4cHJlc3Npb24uc2V0T3BlcmFuZCh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJpIikpOy8vJE5PTi1OTFMtMSQKLQkJcG9zdGZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoUG9zdGZpeEV4cHJlc3Npb24uT3BlcmF0b3IuSU5DUkVNRU5UKTsvLyROT04tTkxTLTEkCi0JCUV4cHJlc3Npb25TdGF0ZW1lbnQgc3RhdGVtZW50ID0gdGhpcy5hc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChwb3N0Zml4RXhwcmVzc2lvbik7Ci0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBzdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiaSsrOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAoU3RyaW5nKSBvOyA9PT4gRXhwcmVzc2lvblN0YXRlbWVudChDYXN0RXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDAzMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMDMxIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAxKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXROYW1lKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoInMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJQ2FzdEV4cHJlc3Npb24gY2FzdEV4cHJlc3Npb24gPSB0aGlzLmFzdC5uZXdDYXN0RXhwcmVzc2lvbigpOwotCQljYXN0RXhwcmVzc2lvbi5zZXRFeHByZXNzaW9uKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoIm8iKSk7Ly8kTk9OLU5MUy0xJAotCQljYXN0RXhwcmVzc2lvbi5zZXRUeXBlKHRoaXMuYXN0Lm5ld1NpbXBsZVR5cGUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiU3RyaW5nIikpKTsvLyROT04tTkxTLTEkCi0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXRJbml0aWFsaXplcihjYXN0RXhwcmVzc2lvbik7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgc3RhdGVtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCh2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpOwotCQlzdGF0ZW1lbnQuc2V0TW9kaWZpZXJzKE1vZGlmaWVyLk5PTkUpOwotCQlzdGF0ZW1lbnQuc2V0VHlwZSh0aGlzLmFzdC5uZXdTaW1wbGVUeXBlKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoIlN0cmluZyIpKSk7Ly8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgIlN0cmluZyBzID0gKFN0cmluZykgbzsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQkJCQkJCQotCi0JLyoqCi0JICogKGludCkgZDsgPT0+IEV4cHJlc3Npb25TdGF0ZW1lbnQoQ2FzdEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwMzIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDAzMiIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMSk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0TmFtZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJpIikpOyAvLyROT04tTkxTLTEkCi0JCUNhc3RFeHByZXNzaW9uIGNhc3RFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3Q2FzdEV4cHJlc3Npb24oKTsKLQkJY2FzdEV4cHJlc3Npb24uc2V0RXhwcmVzc2lvbih0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJkIikpOy8vJE5PTi1OTFMtMSQKLQkJY2FzdEV4cHJlc3Npb24uc2V0VHlwZSh0aGlzLmFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuSU5UKSk7Ly8kTk9OLU5MUy0xJAotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0SW5pdGlhbGl6ZXIoY2FzdEV4cHJlc3Npb24pOwotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQodmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KTsKLQkJc3RhdGVtZW50LnNldE1vZGlmaWVycyhNb2RpZmllci5OT05FKTsKLQkJc3RhdGVtZW50LnNldFR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLklOVCkpOy8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIHN0YXRlbWVudC5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgbm9kZSkpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJpbnQgaSA9IChpbnQpIGQ7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0JCi0JCi0JLyoqCi0JICogKGZsb2F0KSBkOyA9PT4gRXhwcmVzc2lvblN0YXRlbWVudChDYXN0RXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDAzMygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMDMzIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAxKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlDYXN0RXhwcmVzc2lvbiBjYXN0RXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld0Nhc3RFeHByZXNzaW9uKCk7Ci0JCWNhc3RFeHByZXNzaW9uLnNldEV4cHJlc3Npb24odGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiZCIpKTsvLyROT04tTkxTLTEkCi0JCWNhc3RFeHByZXNzaW9uLnNldFR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLkZMT0FUKSk7Ly8kTk9OLU5MUy0xJAotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0SW5pdGlhbGl6ZXIoY2FzdEV4cHJlc3Npb24pOwotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQodmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KTsKLQkJc3RhdGVtZW50LnNldE1vZGlmaWVycyhNb2RpZmllci5OT05FKTsKLQkJc3RhdGVtZW50LnNldFR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLkZMT0FUKSk7Ly8kTk9OLU5MUy0xJAotCi0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBzdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiZmxvYXQgZiA9IChmbG9hdCkgZDsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQkKLQotCS8qKgotCSAqIChieXRlKSBkOyA9PT4gRXhwcmVzc2lvblN0YXRlbWVudChDYXN0RXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDAzNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMDM0IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAxKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiYiIpKTsgLy8kTk9OLU5MUy0xJAotCQlDYXN0RXhwcmVzc2lvbiBjYXN0RXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld0Nhc3RFeHByZXNzaW9uKCk7Ci0JCWNhc3RFeHByZXNzaW9uLnNldEV4cHJlc3Npb24odGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiZCIpKTsvLyROT04tTkxTLTEkCi0JCWNhc3RFeHByZXNzaW9uLnNldFR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLkJZVEUpKTsvLyROT04tTkxTLTEkCi0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXRJbml0aWFsaXplcihjYXN0RXhwcmVzc2lvbik7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgc3RhdGVtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCh2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpOwotCQlzdGF0ZW1lbnQuc2V0TW9kaWZpZXJzKE1vZGlmaWVyLk5PTkUpOwotCQlzdGF0ZW1lbnQuc2V0VHlwZSh0aGlzLmFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuQllURSkpOy8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImJ5dGUgYiA9IChieXRlKSBkOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9CQotCi0JLyoqCi0JICogKHNob3J0KSBkOyA9PT4gRXhwcmVzc2lvblN0YXRlbWVudChDYXN0RXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDAzNSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMDM1IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAxKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgicyIpKTsgLy8kTk9OLU5MUy0xJAotCQlDYXN0RXhwcmVzc2lvbiBjYXN0RXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld0Nhc3RFeHByZXNzaW9uKCk7Ci0JCWNhc3RFeHByZXNzaW9uLnNldEV4cHJlc3Npb24odGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiZCIpKTsvLyROT04tTkxTLTEkCi0JCWNhc3RFeHByZXNzaW9uLnNldFR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLlNIT1JUKSk7Ly8kTk9OLU5MUy0xJAotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0SW5pdGlhbGl6ZXIoY2FzdEV4cHJlc3Npb24pOwotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQodmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KTsKLQkJc3RhdGVtZW50LnNldE1vZGlmaWVycyhNb2RpZmllci5OT05FKTsKLQkJc3RhdGVtZW50LnNldFR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLlNIT1JUKSk7Ly8kTk9OLU5MUy0xJAotCi0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBzdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAic2hvcnQgcyA9IChzaG9ydCkgZDsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogKGxvbmcpIGQ7ID09PiBFeHByZXNzaW9uU3RhdGVtZW50KENhc3RFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDM2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwMzYiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDEpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0KLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0TmFtZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJsIikpOyAvLyROT04tTkxTLTEkCi0JCUNhc3RFeHByZXNzaW9uIGNhc3RFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3Q2FzdEV4cHJlc3Npb24oKTsKLQkJY2FzdEV4cHJlc3Npb24uc2V0RXhwcmVzc2lvbih0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJkIikpOy8vJE5PTi1OTFMtMSQKLQkJY2FzdEV4cHJlc3Npb24uc2V0VHlwZSh0aGlzLmFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuTE9ORykpOy8vJE5PTi1OTFMtMSQKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldEluaXRpYWxpemVyKGNhc3RFeHByZXNzaW9uKTsKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCk7Ci0JCXN0YXRlbWVudC5zZXRNb2RpZmllcnMoTW9kaWZpZXIuTk9ORSk7Ci0JCXN0YXRlbWVudC5zZXRUeXBlKHRoaXMuYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5MT05HKSk7Ly8kTk9OLU5MUy0xJAotCi0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBzdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAibG9uZyBsID0gKGxvbmcpIGQ7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIChjaGFyKSBpOyA9PT4gRXhwcmVzc2lvblN0YXRlbWVudChDYXN0RXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDAzNygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMDM3IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAxKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiYyIpKTsgLy8kTk9OLU5MUy0xJAotCQlDYXN0RXhwcmVzc2lvbiBjYXN0RXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld0Nhc3RFeHByZXNzaW9uKCk7Ci0JCWNhc3RFeHByZXNzaW9uLnNldEV4cHJlc3Npb24odGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiaSIpKTsvLyROT04tTkxTLTEkCi0JCWNhc3RFeHByZXNzaW9uLnNldFR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLkNIQVIpKTsvLyROT04tTkxTLTEkCi0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXRJbml0aWFsaXplcihjYXN0RXhwcmVzc2lvbik7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgc3RhdGVtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCh2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpOwotCQlzdGF0ZW1lbnQuc2V0TW9kaWZpZXJzKE1vZGlmaWVyLk5PTkUpOwotCQlzdGF0ZW1lbnQuc2V0VHlwZSh0aGlzLmFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuQ0hBUikpOy8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImNoYXIgYyA9IChjaGFyKSBpOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9CQotCi0JLyoqCi0JICogaW50LmNsYXNzOyA9PT4gRXhwcmVzc2lvblN0YXRlbWVudChUeXBlTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDAzOCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMDM4IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiYyIpKTsgLy8kTk9OLU5MUy0xJAotCQlUeXBlTGl0ZXJhbCB0eXBlTGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld1R5cGVMaXRlcmFsKCk7Ci0JCXR5cGVMaXRlcmFsLnNldFR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLklOVCkpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0SW5pdGlhbGl6ZXIodHlwZUxpdGVyYWwpOwotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQodmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KTsKLQkJc3RhdGVtZW50LnNldE1vZGlmaWVycyhNb2RpZmllci5OT05FKTsKLQkJc3RhdGVtZW50LnNldFR5cGUodGhpcy5hc3QubmV3U2ltcGxlVHlwZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJDbGFzcyIpKSk7Ly8kTk9OLU5MUy0xJAotCi0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBzdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZSgoKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkoKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpbm9kZSkuZnJhZ21lbnRzKCkuZ2V0KDApKS5nZXRJbml0aWFsaXplcigpLCAiaW50LmNsYXNzIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0JCi0KLQkvKioKLQkgKiB2b2lkLmNsYXNzOyA9PT4gRXhwcmVzc2lvblN0YXRlbWVudChUeXBlTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDAzOSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMDM5IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiYyIpKTsgLy8kTk9OLU5MUy0xJAotCQlUeXBlTGl0ZXJhbCB0eXBlTGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld1R5cGVMaXRlcmFsKCk7Ci0JCXR5cGVMaXRlcmFsLnNldFR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLlZPSUQpKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldEluaXRpYWxpemVyKHR5cGVMaXRlcmFsKTsKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCk7Ci0JCXN0YXRlbWVudC5zZXRNb2RpZmllcnMoTW9kaWZpZXIuTk9ORSk7Ci0JCXN0YXRlbWVudC5zZXRUeXBlKHRoaXMuYXN0Lm5ld1NpbXBsZVR5cGUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiQ2xhc3MiKSkpOy8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UoKChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpKChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KW5vZGUpLmZyYWdtZW50cygpLmdldCgwKSkuZ2V0SW5pdGlhbGl6ZXIoKSwgInZvaWQuY2xhc3MiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQkKLQotCS8qKgotCSAqIGRvdWJsZS5jbGFzczsgPT0+IEV4cHJlc3Npb25TdGF0ZW1lbnQoVHlwZUxpdGVyYWwpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwNDAoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDA0MCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXROYW1lKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJVHlwZUxpdGVyYWwgdHlwZUxpdGVyYWwgPSB0aGlzLmFzdC5uZXdUeXBlTGl0ZXJhbCgpOwotCQl0eXBlTGl0ZXJhbC5zZXRUeXBlKHRoaXMuYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5ET1VCTEUpKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldEluaXRpYWxpemVyKHR5cGVMaXRlcmFsKTsKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCk7Ci0JCXN0YXRlbWVudC5zZXRNb2RpZmllcnMoTW9kaWZpZXIuTk9ORSk7Ci0JCXN0YXRlbWVudC5zZXRUeXBlKHRoaXMuYXN0Lm5ld1NpbXBsZVR5cGUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiQ2xhc3MiKSkpOy8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UoKChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpKChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KW5vZGUpLmZyYWdtZW50cygpLmdldCgwKSkuZ2V0SW5pdGlhbGl6ZXIoKSwgImRvdWJsZS5jbGFzcyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9CQotCi0JLyoqCi0JICogbG9uZy5jbGFzczsgPT0+IEV4cHJlc3Npb25TdGF0ZW1lbnQoVHlwZUxpdGVyYWwpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwNDEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDA0MSIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXROYW1lKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJVHlwZUxpdGVyYWwgdHlwZUxpdGVyYWwgPSB0aGlzLmFzdC5uZXdUeXBlTGl0ZXJhbCgpOwotCQl0eXBlTGl0ZXJhbC5zZXRUeXBlKHRoaXMuYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5MT05HKSk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXRJbml0aWFsaXplcih0eXBlTGl0ZXJhbCk7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgc3RhdGVtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCh2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpOwotCQlzdGF0ZW1lbnQuc2V0TW9kaWZpZXJzKE1vZGlmaWVyLk5PTkUpOwotCQlzdGF0ZW1lbnQuc2V0VHlwZSh0aGlzLmFzdC5uZXdTaW1wbGVUeXBlKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoIkNsYXNzIikpKTsvLyROT04tTkxTLTEkCi0KLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIHN0YXRlbWVudC5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgbm9kZSkpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKCgoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSgoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudClub2RlKS5mcmFnbWVudHMoKS5nZXQoMCkpLmdldEluaXRpYWxpemVyKCksICJsb25nLmNsYXNzIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0JCi0JCQotCS8qKgotCSAqIGZhbHNlID09PiBCb29sZWFuTGl0ZXJhbAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDQyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwNDIiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBleHByZXNzaW9uID0gZ2V0QVNUTm9kZVRvQ29tcGFyZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIGV4cHJlc3Npb24pOyAvLyROT04tTkxTLTEkCi0JCUJvb2xlYW5MaXRlcmFsIGxpdGVyYWwgPSB0aGlzLmFzdC5uZXdCb29sZWFuTGl0ZXJhbChmYWxzZSk7Ci0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBsaXRlcmFsLnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBleHByZXNzaW9uKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UoZXhwcmVzc2lvbiwgImZhbHNlIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIHRydWUgPT0+IEJvb2xlYW5MaXRlcmFsCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwNDMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDA0MyIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIGV4cHJlc3Npb24gPSBnZXRBU1ROb2RlVG9Db21wYXJlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgZXhwcmVzc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJQm9vbGVhbkxpdGVyYWwgbGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld0Jvb2xlYW5MaXRlcmFsKHRydWUpOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgbGl0ZXJhbC5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgZXhwcmVzc2lvbikpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb24sICJ0cnVlIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIG51bGwgPT0+IE51bGxMaXRlcmFsCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwNDQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDA0NCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIGV4cHJlc3Npb24gPSBnZXRBU1ROb2RlVG9Db21wYXJlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgZXhwcmVzc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJTnVsbExpdGVyYWwgbGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld051bGxMaXRlcmFsKCk7Ci0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBsaXRlcmFsLnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBleHByZXNzaW9uKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UoZXhwcmVzc2lvbiwgIm51bGwiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCQkKLQkvKioKLQkgKiBDaGFyTGl0ZXJhbCA9PT4gQ2hhcmFjdGVyTGl0ZXJhbAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDQ1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwNDUiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBleHByZXNzaW9uID0gZ2V0QVNUTm9kZVRvQ29tcGFyZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIGV4cHJlc3Npb24pOyAvLyROT04tTkxTLTEkCi0JCUNoYXJhY3RlckxpdGVyYWwgbGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld0NoYXJhY3RlckxpdGVyYWwoKTsKLQkJbGl0ZXJhbC5zZXRFc2NhcGVkVmFsdWUoIidjJyIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBsaXRlcmFsLnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBleHByZXNzaW9uKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UoZXhwcmVzc2lvbiwgIidjJyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBEb3VibGVMaXRlcmFsID09PiBOdW1iZXJMaXRlcmFsCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwNDYoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDA0NiIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIGV4cHJlc3Npb24gPSBnZXRBU1ROb2RlVG9Db21wYXJlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgZXhwcmVzc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJTnVtYmVyTGl0ZXJhbCBsaXRlcmFsID0gdGhpcy5hc3QubmV3TnVtYmVyTGl0ZXJhbCgiMS4wMDAwMSIpOy8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIGxpdGVyYWwuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIGV4cHJlc3Npb24pKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShleHByZXNzaW9uLCAiMS4wMDAwMSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBGbG9hdExpdGVyYWwgPT0+IE51bWJlckxpdGVyYWwKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDA0NygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMDQ3IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgZXhwcmVzc2lvbiA9IGdldEFTVE5vZGVUb0NvbXBhcmUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0KTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBleHByZXNzaW9uKTsgLy8kTk9OLU5MUy0xJAotCQlOdW1iZXJMaXRlcmFsIGxpdGVyYWwgPSB0aGlzLmFzdC5uZXdOdW1iZXJMaXRlcmFsKCIxLjAwMDAxZiIpOy8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIGxpdGVyYWwuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIGV4cHJlc3Npb24pKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShleHByZXNzaW9uLCAiMS4wMDAwMWYiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogSW50TGl0ZXJhbCA9PT4gTnVtYmVyTGl0ZXJhbAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDQ4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwNDgiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBleHByZXNzaW9uID0gZ2V0QVNUTm9kZVRvQ29tcGFyZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIGV4cHJlc3Npb24pOyAvLyROT04tTkxTLTEkCi0JCU51bWJlckxpdGVyYWwgbGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld051bWJlckxpdGVyYWwoIjMwMDAwIik7Ly8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgbGl0ZXJhbC5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgZXhwcmVzc2lvbikpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb24sICIzMDAwMCIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBJbnRMaXRlcmFsTWluVmFsdWUgPT0+IE51bWJlckxpdGVyYWwKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDA0OSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMDQ5IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgZXhwcmVzc2lvbiA9IGdldEFTVE5vZGVUb0NvbXBhcmUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0KTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBleHByZXNzaW9uKTsgLy8kTk9OLU5MUy0xJAotCQlOdW1iZXJMaXRlcmFsIGxpdGVyYWwgPSB0aGlzLmFzdC5uZXdOdW1iZXJMaXRlcmFsKCItMjE0NzQ4MzY0OCIpOy8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIGxpdGVyYWwuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIGV4cHJlc3Npb24pKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShleHByZXNzaW9uLCAiLTIxNDc0ODM2NDgiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTG9uZ0xpdGVyYWwgPT0+IE51bWJlckxpdGVyYWwKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDA1MCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMDUwIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgZXhwcmVzc2lvbiA9IGdldEFTVE5vZGVUb0NvbXBhcmUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0KTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBleHByZXNzaW9uKTsgLy8kTk9OLU5MUy0xJAotCQlOdW1iZXJMaXRlcmFsIGxpdGVyYWwgPSB0aGlzLmFzdC5uZXdOdW1iZXJMaXRlcmFsKCIyMTQ3NDgzNjQ4TCIpOy8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIGxpdGVyYWwuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIGV4cHJlc3Npb24pKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShleHByZXNzaW9uLCAiMjE0NzQ4MzY0OEwiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTG9uZ0xpdGVyYWwgPT0+IE51bWJlckxpdGVyYWwgKG5lZ2F0aXZlIHZhbHVlKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDUxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwNTEiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBleHByZXNzaW9uID0gZ2V0QVNUTm9kZVRvQ29tcGFyZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIGV4cHJlc3Npb24pOyAvLyROT04tTkxTLTEkCi0JCU51bWJlckxpdGVyYWwgbGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld051bWJlckxpdGVyYWwoIjIxNDc0ODM2NDhMIik7Ly8kTk9OLU5MUy0xJAotCQlQcmVmaXhFeHByZXNzaW9uIHByZWZpeEV4cHJlc3Npb24gPSB0aGlzLmFzdC5uZXdQcmVmaXhFeHByZXNzaW9uKCk7Ci0JCXByZWZpeEV4cHJlc3Npb24uc2V0T3BlcmFuZChsaXRlcmFsKTsKLQkJcHJlZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihQcmVmaXhFeHByZXNzaW9uLk9wZXJhdG9yLk1JTlVTKTsKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIHByZWZpeEV4cHJlc3Npb24uc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIGV4cHJlc3Npb24pKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShleHByZXNzaW9uLCAiLTIxNDc0ODM2NDhMIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIExvbmdMaXRlcmFsTWluVmFsdWUgPT0+IE51bWJlckxpdGVyYWwKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDA1MigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMDUyIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgZXhwcmVzc2lvbiA9IGdldEFTVE5vZGVUb0NvbXBhcmUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0KTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBleHByZXNzaW9uKTsgLy8kTk9OLU5MUy0xJAotCQlOdW1iZXJMaXRlcmFsIGxpdGVyYWwgPSB0aGlzLmFzdC5uZXdOdW1iZXJMaXRlcmFsKCItOTIyMzM3MjAzNjg1NDc3NTgwOEwiKTsvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBsaXRlcmFsLnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBleHByZXNzaW9uKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UoZXhwcmVzc2lvbiwgIi05MjIzMzcyMDM2ODU0Nzc1ODA4TCIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmRlZFN0cmluZ0xpdGVyYWwgPT0+IFN0cmluZ0xpdGVyYWwKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDA1MygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMDUzIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgZXhwcmVzc2lvbiA9IGdldEFTVE5vZGVUb0NvbXBhcmUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0KTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBleHByZXNzaW9uKTsgLy8kTk9OLU5MUy0xJAotCQkvKgotCQlTdHJpbmdMaXRlcmFsIGxpdGVyYWwgPSB0aGlzLmFzdC5uZXdTdHJpbmdMaXRlcmFsKCk7Ly8kTk9OLU5MUy0xJAotCQlsaXRlcmFsLnNldExpdGVyYWxWYWx1ZSgiSGVsbG8gV29ybGQiKTsqLwotCQlJbmZpeEV4cHJlc3Npb24gaW5maXhFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3SW5maXhFeHByZXNzaW9uKCk7Ci0JCWluZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUExVUyk7Ci0JCVN0cmluZ0xpdGVyYWwgbGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld1N0cmluZ0xpdGVyYWwoKTsKLQkJbGl0ZXJhbC5zZXRMaXRlcmFsVmFsdWUoIkhlbGxvIik7Ly8kTk9OLU5MUy0xJAotCQlpbmZpeEV4cHJlc3Npb24uc2V0TGVmdE9wZXJhbmQobGl0ZXJhbCk7Ci0JCWxpdGVyYWwgPSB0aGlzLmFzdC5uZXdTdHJpbmdMaXRlcmFsKCk7Ci0JCWxpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKCIgV29ybGQiKTsvLyROT04tTkxTLTEkCi0JCWluZml4RXhwcmVzc2lvbi5zZXRSaWdodE9wZXJhbmQobGl0ZXJhbCk7Ly8kTk9OLU5MUy0xJAotCQkKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIGluZml4RXhwcmVzc2lvbi5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgZXhwcmVzc2lvbikpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb24sICJcIkhlbGxvXCIgKyBcIiBXb3JsZFwiIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEFORF9BTkRfRXhwcmVzc2lvbiA9PT4gSW5maXhFeHByZXNzaW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwNTQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDA1NCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMik7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiYjMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJSW5maXhFeHByZXNzaW9uIGluZml4RXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld0luZml4RXhwcmVzc2lvbigpOwotCQlpbmZpeEV4cHJlc3Npb24uc2V0TGVmdE9wZXJhbmQodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiYiIpKTsgLy8kTk9OLU5MUy0xJAotCQlpbmZpeEV4cHJlc3Npb24uc2V0UmlnaHRPcGVyYW5kKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImIyIikpOyAvLyROT04tTkxTLTEkCi0JCWluZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuQ09ORElUSU9OQUxfQU5EKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldEluaXRpYWxpemVyKGluZml4RXhwcmVzc2lvbik7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgc3RhdGVtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCh2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpOwotCQlzdGF0ZW1lbnQuc2V0TW9kaWZpZXJzKE1vZGlmaWVyLk5PTkUpOwotCQlzdGF0ZW1lbnQuc2V0VHlwZSh0aGlzLmFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuQk9PTEVBTikpOwotCi0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBzdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiYm9vbGVhbiBiMyA9IGIgJiYgYjI7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0JCi0KLQkvKioKLQkgKiBPUl9PUl9FeHByZXNzaW9uID09PiBJbmZpeEV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDA1NSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMDU1IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAyKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiYjMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJSW5maXhFeHByZXNzaW9uIGluZml4RXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld0luZml4RXhwcmVzc2lvbigpOwotCQlpbmZpeEV4cHJlc3Npb24uc2V0TGVmdE9wZXJhbmQodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiYiIpKTsgLy8kTk9OLU5MUy0xJAotCQlpbmZpeEV4cHJlc3Npb24uc2V0UmlnaHRPcGVyYW5kKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImIyIikpOyAvLyROT04tTkxTLTEkCi0JCWluZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuQ09ORElUSU9OQUxfT1IpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0SW5pdGlhbGl6ZXIoaW5maXhFeHByZXNzaW9uKTsKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCk7Ci0JCXN0YXRlbWVudC5zZXRNb2RpZmllcnMoTW9kaWZpZXIuTk9ORSk7Ci0JCXN0YXRlbWVudC5zZXRUeXBlKHRoaXMuYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5CT09MRUFOKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIHN0YXRlbWVudC5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgbm9kZSkpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJib29sZWFuIGIzID0gYiB8fCBiMjsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQkKLQotCS8qKgotCSAqIEVxdWFsRXhwcmVzc2lvbiA9PT4gSW5maXhFeHByZXNzaW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwNTYoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDA1NiIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMik7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXROYW1lKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImIzIikpOyAvLyROT04tTkxTLTEkCi0JCUluZml4RXhwcmVzc2lvbiBpbmZpeEV4cHJlc3Npb24gPSB0aGlzLmFzdC5uZXdJbmZpeEV4cHJlc3Npb24oKTsKLQkJaW5maXhFeHByZXNzaW9uLnNldExlZnRPcGVyYW5kKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5maXhFeHByZXNzaW9uLnNldFJpZ2h0T3BlcmFuZCh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJiMiIpKTsgLy8kTk9OLU5MUy0xJAotCQlpbmZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkVRVUFMUyk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXRJbml0aWFsaXplcihpbmZpeEV4cHJlc3Npb24pOwotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQodmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KTsKLQkJc3RhdGVtZW50LnNldE1vZGlmaWVycyhNb2RpZmllci5OT05FKTsKLQkJc3RhdGVtZW50LnNldFR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLkJPT0xFQU4pKTsKLQotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImJvb2xlYW4gYjMgPSBiID09IGIyOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9CQotCi0JLyoqCi0JICogQmluYXJ5RXhwcmVzc2lvbiAoKykgPT0+IEluZml4RXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDU3KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwNTciLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDIpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0KLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0TmFtZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJuIikpOyAvLyROT04tTkxTLTEkCi0JCUluZml4RXhwcmVzc2lvbiBpbmZpeEV4cHJlc3Npb24gPSB0aGlzLmFzdC5uZXdJbmZpeEV4cHJlc3Npb24oKTsKLQkJaW5maXhFeHByZXNzaW9uLnNldExlZnRPcGVyYW5kKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImkiKSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5maXhFeHByZXNzaW9uLnNldFJpZ2h0T3BlcmFuZCh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJqIikpOyAvLyROT04tTkxTLTEkCi0JCWluZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUExVUyk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXRJbml0aWFsaXplcihpbmZpeEV4cHJlc3Npb24pOwotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQodmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KTsKLQkJc3RhdGVtZW50LnNldE1vZGlmaWVycyhNb2RpZmllci5OT05FKTsKLQkJc3RhdGVtZW50LnNldFR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLklOVCkpOwotCi0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBzdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiaW50IG4gPSBpICsgajsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQkKLQotCS8qKgotCSAqIEJpbmFyeUV4cHJlc3Npb24gKC0pID09PiBJbmZpeEV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDA1OCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMDU4IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAyKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgibiIpKTsgLy8kTk9OLU5MUy0xJAotCQlJbmZpeEV4cHJlc3Npb24gaW5maXhFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3SW5maXhFeHByZXNzaW9uKCk7Ci0JCWluZml4RXhwcmVzc2lvbi5zZXRMZWZ0T3BlcmFuZCh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJpIikpOyAvLyROT04tTkxTLTEkCi0JCWluZml4RXhwcmVzc2lvbi5zZXRSaWdodE9wZXJhbmQodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiaiIpKTsgLy8kTk9OLU5MUy0xJAotCQlpbmZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLk1JTlVTKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldEluaXRpYWxpemVyKGluZml4RXhwcmVzc2lvbik7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgc3RhdGVtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCh2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpOwotCQlzdGF0ZW1lbnQuc2V0TW9kaWZpZXJzKE1vZGlmaWVyLk5PTkUpOwotCQlzdGF0ZW1lbnQuc2V0VHlwZSh0aGlzLmFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuSU5UKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIHN0YXRlbWVudC5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgbm9kZSkpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJpbnQgbiA9IGkgLSBqOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9CQotCi0JLyoqCi0JICogQmluYXJ5RXhwcmVzc2lvbiAoKikgPT0+IEluZml4RXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDU5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwNTkiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDIpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0KLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0TmFtZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJuIikpOyAvLyROT04tTkxTLTEkCi0JCUluZml4RXhwcmVzc2lvbiBpbmZpeEV4cHJlc3Npb24gPSB0aGlzLmFzdC5uZXdJbmZpeEV4cHJlc3Npb24oKTsKLQkJaW5maXhFeHByZXNzaW9uLnNldExlZnRPcGVyYW5kKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImkiKSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5maXhFeHByZXNzaW9uLnNldFJpZ2h0T3BlcmFuZCh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJqIikpOyAvLyROT04tTkxTLTEkCi0JCWluZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuVElNRVMpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0SW5pdGlhbGl6ZXIoaW5maXhFeHByZXNzaW9uKTsKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCk7Ci0JCXN0YXRlbWVudC5zZXRNb2RpZmllcnMoTW9kaWZpZXIuTk9ORSk7Ci0JCXN0YXRlbWVudC5zZXRUeXBlKHRoaXMuYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5JTlQpKTsKLQotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImludCBuID0gaSAqIGo7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0JCi0KLQkvKioKLQkgKiBCaW5hcnlFeHByZXNzaW9uICgvKSA9PT4gSW5maXhFeHByZXNzaW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwNjAoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDA2MCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMik7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXROYW1lKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoIm4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJSW5maXhFeHByZXNzaW9uIGluZml4RXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld0luZml4RXhwcmVzc2lvbigpOwotCQlpbmZpeEV4cHJlc3Npb24uc2V0TGVmdE9wZXJhbmQodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiaSIpKTsgLy8kTk9OLU5MUy0xJAotCQlpbmZpeEV4cHJlc3Npb24uc2V0UmlnaHRPcGVyYW5kKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImoiKSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5maXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5ESVZJREUpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0SW5pdGlhbGl6ZXIoaW5maXhFeHByZXNzaW9uKTsKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCk7Ci0JCXN0YXRlbWVudC5zZXRNb2RpZmllcnMoTW9kaWZpZXIuTk9ORSk7Ci0JCXN0YXRlbWVudC5zZXRUeXBlKHRoaXMuYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5JTlQpKTsKLQotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImludCBuID0gaSAvIGo7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0JCi0KLQkvKioKLQkgKiBCaW5hcnlFeHByZXNzaW9uICglKSA9PT4gSW5maXhFeHByZXNzaW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwNjEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDA2MSIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMik7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXROYW1lKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoIm4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJSW5maXhFeHByZXNzaW9uIGluZml4RXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld0luZml4RXhwcmVzc2lvbigpOwotCQlpbmZpeEV4cHJlc3Npb24uc2V0TGVmdE9wZXJhbmQodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiaSIpKTsgLy8kTk9OLU5MUy0xJAotCQlpbmZpeEV4cHJlc3Npb24uc2V0UmlnaHRPcGVyYW5kKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImoiKSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5maXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5SRU1BSU5ERVIpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0SW5pdGlhbGl6ZXIoaW5maXhFeHByZXNzaW9uKTsKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCk7Ci0JCXN0YXRlbWVudC5zZXRNb2RpZmllcnMoTW9kaWZpZXIuTk9ORSk7Ci0JCXN0YXRlbWVudC5zZXRUeXBlKHRoaXMuYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5JTlQpKTsKLQotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImludCBuID0gaSAlIGo7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0JCi0KLQkvKioKLQkgKiBCaW5hcnlFeHByZXNzaW9uICheKSA9PT4gSW5maXhFeHByZXNzaW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwNjIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDA2MiIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMik7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXROYW1lKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoIm4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJSW5maXhFeHByZXNzaW9uIGluZml4RXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld0luZml4RXhwcmVzc2lvbigpOwotCQlpbmZpeEV4cHJlc3Npb24uc2V0TGVmdE9wZXJhbmQodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiaSIpKTsgLy8kTk9OLU5MUy0xJAotCQlpbmZpeEV4cHJlc3Npb24uc2V0UmlnaHRPcGVyYW5kKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImoiKSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5maXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5YT1IpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0SW5pdGlhbGl6ZXIoaW5maXhFeHByZXNzaW9uKTsKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCk7Ci0JCXN0YXRlbWVudC5zZXRNb2RpZmllcnMoTW9kaWZpZXIuTk9ORSk7Ci0JCXN0YXRlbWVudC5zZXRUeXBlKHRoaXMuYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5JTlQpKTsKLQotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImludCBuID0gaSBeIGo7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0JCi0KLQkvKioKLQkgKiBCaW5hcnlFeHByZXNzaW9uICgmKSA9PT4gSW5maXhFeHByZXNzaW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwNjMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDA2MyIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMik7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXROYW1lKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoIm4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJSW5maXhFeHByZXNzaW9uIGluZml4RXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld0luZml4RXhwcmVzc2lvbigpOwotCQlpbmZpeEV4cHJlc3Npb24uc2V0TGVmdE9wZXJhbmQodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiaSIpKTsgLy8kTk9OLU5MUy0xJAotCQlpbmZpeEV4cHJlc3Npb24uc2V0UmlnaHRPcGVyYW5kKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImoiKSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5maXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5BTkQpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0SW5pdGlhbGl6ZXIoaW5maXhFeHByZXNzaW9uKTsKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCk7Ci0JCXN0YXRlbWVudC5zZXRNb2RpZmllcnMoTW9kaWZpZXIuTk9ORSk7Ci0JCXN0YXRlbWVudC5zZXRUeXBlKHRoaXMuYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5JTlQpKTsKLQotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImludCBuID0gaSAmIGo7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0JCi0KLQkvKioKLQkgKiBCaW5hcnlFeHByZXNzaW9uICh8KSA9PT4gSW5maXhFeHByZXNzaW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwNjQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDA2NCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMik7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXROYW1lKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoIm4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJSW5maXhFeHByZXNzaW9uIGluZml4RXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld0luZml4RXhwcmVzc2lvbigpOwotCQlpbmZpeEV4cHJlc3Npb24uc2V0TGVmdE9wZXJhbmQodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiaSIpKTsgLy8kTk9OLU5MUy0xJAotCQlpbmZpeEV4cHJlc3Npb24uc2V0UmlnaHRPcGVyYW5kKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImoiKSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5maXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5PUik7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXRJbml0aWFsaXplcihpbmZpeEV4cHJlc3Npb24pOwotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQodmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KTsKLQkJc3RhdGVtZW50LnNldE1vZGlmaWVycyhNb2RpZmllci5OT05FKTsKLQkJc3RhdGVtZW50LnNldFR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLklOVCkpOwotCi0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBzdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiaW50IG4gPSBpIHwgajsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQkKLQotCS8qKgotCSAqIEJpbmFyeUV4cHJlc3Npb24gKDwpID09PiBJbmZpeEV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDA2NSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMDY1IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAyKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiYjIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJSW5maXhFeHByZXNzaW9uIGluZml4RXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld0luZml4RXhwcmVzc2lvbigpOwotCQlpbmZpeEV4cHJlc3Npb24uc2V0TGVmdE9wZXJhbmQodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiYiIpKTsgLy8kTk9OLU5MUy0xJAotCQlpbmZpeEV4cHJlc3Npb24uc2V0UmlnaHRPcGVyYW5kKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImIxIikpOyAvLyROT04tTkxTLTEkCi0JCWluZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTEVTUyk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXRJbml0aWFsaXplcihpbmZpeEV4cHJlc3Npb24pOwotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQodmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KTsKLQkJc3RhdGVtZW50LnNldE1vZGlmaWVycyhNb2RpZmllci5OT05FKTsKLQkJc3RhdGVtZW50LnNldFR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLkJPT0xFQU4pKTsKLQotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImJvb2xlYW4gYjIgPSBiIDwgYjE7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0JCi0KLQkvKioKLQkgKiBCaW5hcnlFeHByZXNzaW9uICg8PSkgPT0+IEluZml4RXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDY2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwNjYiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDIpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0KLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0TmFtZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJiMiIpKTsgLy8kTk9OLU5MUy0xJAotCQlJbmZpeEV4cHJlc3Npb24gaW5maXhFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3SW5maXhFeHByZXNzaW9uKCk7Ci0JCWluZml4RXhwcmVzc2lvbi5zZXRMZWZ0T3BlcmFuZCh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJiIikpOyAvLyROT04tTkxTLTEkCi0JCWluZml4RXhwcmVzc2lvbi5zZXRSaWdodE9wZXJhbmQodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiYjEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5maXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5MRVNTX0VRVUFMUyk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXRJbml0aWFsaXplcihpbmZpeEV4cHJlc3Npb24pOwotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQodmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KTsKLQkJc3RhdGVtZW50LnNldE1vZGlmaWVycyhNb2RpZmllci5OT05FKTsKLQkJc3RhdGVtZW50LnNldFR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLkJPT0xFQU4pKTsKLQotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImJvb2xlYW4gYjIgPSBiIDw9IGIxOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9CQotCi0JLyoqCi0JICogQmluYXJ5RXhwcmVzc2lvbiAoPikgPT0+IEluZml4RXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDY3KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwNjciLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDIpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0KLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0TmFtZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJiMiIpKTsgLy8kTk9OLU5MUy0xJAotCQlJbmZpeEV4cHJlc3Npb24gaW5maXhFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3SW5maXhFeHByZXNzaW9uKCk7Ci0JCWluZml4RXhwcmVzc2lvbi5zZXRMZWZ0T3BlcmFuZCh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJiIikpOyAvLyROT04tTkxTLTEkCi0JCWluZml4RXhwcmVzc2lvbi5zZXRSaWdodE9wZXJhbmQodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiYjEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5maXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5HUkVBVEVSKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldEluaXRpYWxpemVyKGluZml4RXhwcmVzc2lvbik7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgc3RhdGVtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCh2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpOwotCQlzdGF0ZW1lbnQuc2V0TW9kaWZpZXJzKE1vZGlmaWVyLk5PTkUpOwotCQlzdGF0ZW1lbnQuc2V0VHlwZSh0aGlzLmFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuQk9PTEVBTikpOwotCi0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBzdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiYm9vbGVhbiBiMiA9IGIgPiBiMTsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQkKLQotCS8qKgotCSAqIEJpbmFyeUV4cHJlc3Npb24gKD49KSA9PT4gSW5maXhFeHByZXNzaW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwNjgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDA2OCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMik7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXROYW1lKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImIyIikpOyAvLyROT04tTkxTLTEkCi0JCUluZml4RXhwcmVzc2lvbiBpbmZpeEV4cHJlc3Npb24gPSB0aGlzLmFzdC5uZXdJbmZpeEV4cHJlc3Npb24oKTsKLQkJaW5maXhFeHByZXNzaW9uLnNldExlZnRPcGVyYW5kKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5maXhFeHByZXNzaW9uLnNldFJpZ2h0T3BlcmFuZCh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJiMSIpKTsgLy8kTk9OLU5MUy0xJAotCQlpbmZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkdSRUFURVJfRVFVQUxTKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldEluaXRpYWxpemVyKGluZml4RXhwcmVzc2lvbik7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgc3RhdGVtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCh2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpOwotCQlzdGF0ZW1lbnQuc2V0TW9kaWZpZXJzKE1vZGlmaWVyLk5PTkUpOwotCQlzdGF0ZW1lbnQuc2V0VHlwZSh0aGlzLmFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuQk9PTEVBTikpOwotCi0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBzdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiYm9vbGVhbiBiMiA9IGIgPj0gYjE7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0JCi0KLQkvKioKLQkgKiBCaW5hcnlFeHByZXNzaW9uICghPSkgPT0+IEluZml4RXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDY5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwNjkiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDIpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0KLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0TmFtZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJiMiIpKTsgLy8kTk9OLU5MUy0xJAotCQlJbmZpeEV4cHJlc3Npb24gaW5maXhFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3SW5maXhFeHByZXNzaW9uKCk7Ci0JCWluZml4RXhwcmVzc2lvbi5zZXRMZWZ0T3BlcmFuZCh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJiIikpOyAvLyROT04tTkxTLTEkCi0JCWluZml4RXhwcmVzc2lvbi5zZXRSaWdodE9wZXJhbmQodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiYjEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5maXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5OT1RfRVFVQUxTKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldEluaXRpYWxpemVyKGluZml4RXhwcmVzc2lvbik7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgc3RhdGVtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCh2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpOwotCQlzdGF0ZW1lbnQuc2V0TW9kaWZpZXJzKE1vZGlmaWVyLk5PTkUpOwotCQlzdGF0ZW1lbnQuc2V0VHlwZSh0aGlzLmFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuQk9PTEVBTikpOwotCi0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBzdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiYm9vbGVhbiBiMiA9IGIgIT0gYjE7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0JCi0KLQkvKioKLQkgKiBJbnN0YW5jZW9mRXhwcmVzc2lvbiA9PT4gSW5maXhFeHByZXNzaW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwNzAoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDA3MCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMSk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0TmFtZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJiIikpOyAvLyROT04tTkxTLTEkCi0JCUluc3RhbmNlb2ZFeHByZXNzaW9uIGluc3RhbmNlT2ZFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3SW5zdGFuY2VvZkV4cHJlc3Npb24oKTsKLQkJaW5zdGFuY2VPZkV4cHJlc3Npb24uc2V0TGVmdE9wZXJhbmQodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgibyIpKTsvLyROT04tTkxTLTEkIAotCQlTaW1wbGVUeXBlIHNpbXBsZVR5cGUgPSB0aGlzLmFzdC5uZXdTaW1wbGVUeXBlKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoIkludGVnZXIiKSk7Ly8kTk9OLU5MUy0xJAotCQlpbnN0YW5jZU9mRXhwcmVzc2lvbi5zZXRSaWdodE9wZXJhbmQoc2ltcGxlVHlwZSk7IAotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0SW5pdGlhbGl6ZXIoaW5zdGFuY2VPZkV4cHJlc3Npb24pOwotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQodmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KTsKLQkJc3RhdGVtZW50LnNldE1vZGlmaWVycyhNb2RpZmllci5OT05FKTsKLQkJc3RhdGVtZW50LnNldFR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLkJPT0xFQU4pKTsKLQotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImJvb2xlYW4gYiA9IG8gaW5zdGFuY2VvZiBJbnRlZ2VyOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9CQotCi0JLyoqCi0JICogSW5zdGFuY2VvZkV4cHJlc3Npb24gPT0+IEluZml4RXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDcxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwNzEiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDEpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0KLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0TmFtZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJiIikpOyAvLyROT04tTkxTLTEkCi0JCUluc3RhbmNlb2ZFeHByZXNzaW9uIGluc3RhbmNlT2ZFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3SW5zdGFuY2VvZkV4cHJlc3Npb24oKTsKLQkJaW5zdGFuY2VPZkV4cHJlc3Npb24uc2V0TGVmdE9wZXJhbmQodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgibyIpKTsgLy8kTk9OLU5MUy0xJAotCQlRdWFsaWZpZWROYW1lIG5hbWUgPQotCQkJdGhpcy5hc3QubmV3UXVhbGlmaWVkTmFtZSgKLQkJCQl0aGlzLmFzdC5uZXdRdWFsaWZpZWROYW1lKAotCQkJCQl0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJqYXZhIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJdGhpcy5hc3QubmV3U2ltcGxlTmFtZSgibGFuZyIpKSwgLy8kTk9OLU5MUy0xJAotCQkJCXRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoIkludGVnZXIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJVHlwZSB0eXBlID0gYXN0Lm5ld1NpbXBsZVR5cGUobmFtZSk7Ci0JCWluc3RhbmNlT2ZFeHByZXNzaW9uLnNldFJpZ2h0T3BlcmFuZCh0eXBlKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldEluaXRpYWxpemVyKGluc3RhbmNlT2ZFeHByZXNzaW9uKTsKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCk7Ci0JCXN0YXRlbWVudC5zZXRNb2RpZmllcnMoTW9kaWZpZXIuTk9ORSk7Ci0JCXN0YXRlbWVudC5zZXRUeXBlKHRoaXMuYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5CT09MRUFOKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIHN0YXRlbWVudC5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgbm9kZSkpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJib29sZWFuIGIgPSBvIGluc3RhbmNlb2YgamF2YS5sYW5nLkludGVnZXI7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0JCi0KLQkvKioKLQkgKiBVbmFyeUV4cHJlc3Npb24gKCEpID09PiBQcmVmaXhFeHByZXNzaW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwNzIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDA3MiIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMSk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0TmFtZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJiMSIpKTsgLy8kTk9OLU5MUy0xJAotCQlQcmVmaXhFeHByZXNzaW9uIHByZWZpeEV4cHJlc3Npb24gPSB0aGlzLmFzdC5uZXdQcmVmaXhFeHByZXNzaW9uKCk7Ci0JCXByZWZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoUHJlZml4RXhwcmVzc2lvbi5PcGVyYXRvci5OT1QpOwotCQlwcmVmaXhFeHByZXNzaW9uLnNldE9wZXJhbmQodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiYiIpKTsvLyROT04tTkxTLTEkCi0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXRJbml0aWFsaXplcihwcmVmaXhFeHByZXNzaW9uKTsKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCk7Ci0JCXN0YXRlbWVudC5zZXRNb2RpZmllcnMoTW9kaWZpZXIuTk9ORSk7Ci0JCXN0YXRlbWVudC5zZXRUeXBlKHRoaXMuYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5CT09MRUFOKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIHN0YXRlbWVudC5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgbm9kZSkpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJib29sZWFuIGIxID0gIWI7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0JCi0KLQkvKioKLQkgKiBVbmFyeUV4cHJlc3Npb24gKH4pID09PiBQcmVmaXhFeHByZXNzaW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwNzMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDA3MyIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMSk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0TmFtZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJuIikpOyAvLyROT04tTkxTLTEkCi0JCVByZWZpeEV4cHJlc3Npb24gcHJlZml4RXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld1ByZWZpeEV4cHJlc3Npb24oKTsKLQkJcHJlZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihQcmVmaXhFeHByZXNzaW9uLk9wZXJhdG9yLkNPTVBMRU1FTlQpOwotCQlwcmVmaXhFeHByZXNzaW9uLnNldE9wZXJhbmQodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiaSIpKTsvLyROT04tTkxTLTEkCi0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXRJbml0aWFsaXplcihwcmVmaXhFeHByZXNzaW9uKTsKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCk7Ci0JCXN0YXRlbWVudC5zZXRNb2RpZmllcnMoTW9kaWZpZXIuTk9ORSk7Ci0JCXN0YXRlbWVudC5zZXRUeXBlKHRoaXMuYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5JTlQpKTsKLQotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImludCBuID0gfmk7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0JCi0KLQkvKioKLQkgKiBVbmFyeUV4cHJlc3Npb24gKCspID09PiBQcmVmaXhFeHByZXNzaW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwNzQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDA3NCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXROYW1lKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImkiKSk7IC8vJE5PTi1OTFMtMSQKLQkJUHJlZml4RXhwcmVzc2lvbiBwcmVmaXhFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3UHJlZml4RXhwcmVzc2lvbigpOwotCQlwcmVmaXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKFByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUExVUyk7Ci0JCXByZWZpeEV4cHJlc3Npb24uc2V0T3BlcmFuZCh0aGlzLmFzdC5uZXdOdW1iZXJMaXRlcmFsKCIyIikpOy8vJE5PTi1OTFMtMSQKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldEluaXRpYWxpemVyKHByZWZpeEV4cHJlc3Npb24pOwotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQodmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KTsKLQkJc3RhdGVtZW50LnNldE1vZGlmaWVycyhNb2RpZmllci5OT05FKTsKLQkJc3RhdGVtZW50LnNldFR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLklOVCkpOwotCi0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBzdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiaW50IGkgPSArMjsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQkKLQotCS8qKgotCSAqIFVuYXJ5RXhwcmVzc2lvbiAoLSkgPT0+IFByZWZpeEV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDA3NSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMDc1IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiaSIpKTsgLy8kTk9OLU5MUy0xJAotCQlQcmVmaXhFeHByZXNzaW9uIHByZWZpeEV4cHJlc3Npb24gPSB0aGlzLmFzdC5uZXdQcmVmaXhFeHByZXNzaW9uKCk7Ci0JCXByZWZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoUHJlZml4RXhwcmVzc2lvbi5PcGVyYXRvci5NSU5VUyk7Ci0JCXByZWZpeEV4cHJlc3Npb24uc2V0T3BlcmFuZCh0aGlzLmFzdC5uZXdOdW1iZXJMaXRlcmFsKCIyIikpOy8vJE5PTi1OTFMtMSQKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldEluaXRpYWxpemVyKHByZWZpeEV4cHJlc3Npb24pOwotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQodmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KTsKLQkJc3RhdGVtZW50LnNldE1vZGlmaWVycyhNb2RpZmllci5OT05FKTsKLQkJc3RhdGVtZW50LnNldFR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLklOVCkpOwotCi0KLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIHN0YXRlbWVudC5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgbm9kZSkpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJpbnQgaSA9IC0yOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9CQotCi0JLyoqCi0JICogQ29uZGl0aW9uYWxFeHByZXNzaW9uID09PiBDb25kaXRpb25hbEV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDA3NigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMDc2IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiYiIpKTsgLy8kTk9OLU5MUy0xJAotCQlDb25kaXRpb25hbEV4cHJlc3Npb24gY29uZGl0aW9uYWxFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3Q29uZGl0aW9uYWxFeHByZXNzaW9uKCk7Ci0JCUluZml4RXhwcmVzc2lvbiBjb25kaXRpb24gPSB0aGlzLmFzdC5uZXdJbmZpeEV4cHJlc3Npb24oKTsKLQkJY29uZGl0aW9uLnNldExlZnRPcGVyYW5kKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImFyZ3MiKSk7IC8vJE5PTi1OTFMtMSQKLQkJY29uZGl0aW9uLnNldFJpZ2h0T3BlcmFuZCh0aGlzLmFzdC5uZXdOdWxsTGl0ZXJhbCgpKTsgLy8kTk9OLU5MUy0xJAotCQljb25kaXRpb24uc2V0T3BlcmF0b3IoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLk5PVF9FUVVBTFMpOwotCQljb25kaXRpb25hbEV4cHJlc3Npb24uc2V0RXhwcmVzc2lvbihjb25kaXRpb24pOwotCQljb25kaXRpb25hbEV4cHJlc3Npb24uc2V0VGhlbkV4cHJlc3Npb24odGhpcy5hc3QubmV3Qm9vbGVhbkxpdGVyYWwodHJ1ZSkpOwotCQljb25kaXRpb25hbEV4cHJlc3Npb24uc2V0RWxzZUV4cHJlc3Npb24odGhpcy5hc3QubmV3Qm9vbGVhbkxpdGVyYWwoZmFsc2UpKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldEluaXRpYWxpemVyKGNvbmRpdGlvbmFsRXhwcmVzc2lvbik7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgc3RhdGVtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCh2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpOwotCQlzdGF0ZW1lbnQuc2V0TW9kaWZpZXJzKE1vZGlmaWVyLk5PTkUpOwotCQlzdGF0ZW1lbnQuc2V0VHlwZSh0aGlzLmFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuQk9PTEVBTikpOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImJvb2xlYW4gYiA9IGFyZ3MgIT0gbnVsbCA/IHRydWUgOiBmYWxzZTsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQkKLQotCS8qKgotCSAqIENvbmRpdGlvbmFsRXhwcmVzc2lvbiA9PT4gQ29uZGl0aW9uYWxFeHByZXNzaW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwNzcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDA3NyIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0TmFtZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJpIikpOyAvLyROT04tTkxTLTEkCi0JCUNvbmRpdGlvbmFsRXhwcmVzc2lvbiBjb25kaXRpb25hbEV4cHJlc3Npb24gPSB0aGlzLmFzdC5uZXdDb25kaXRpb25hbEV4cHJlc3Npb24oKTsKLQkJY29uZGl0aW9uYWxFeHByZXNzaW9uLnNldEV4cHJlc3Npb24odGhpcy5hc3QubmV3Qm9vbGVhbkxpdGVyYWwodHJ1ZSkpOwotCQlRdWFsaWZpZWROYW1lIG5hbWUgPSAKLQkJCXRoaXMuYXN0Lm5ld1F1YWxpZmllZE5hbWUoCi0JCQkJdGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiYXJncyIpLCAvLyROT04tTkxTLTEkCi0JCQkJdGhpcy5hc3QubmV3U2ltcGxlTmFtZSgibGVuZ3RoIikpOyAvLyROT04tTkxTLTEkCi0JCWNvbmRpdGlvbmFsRXhwcmVzc2lvbi5zZXRUaGVuRXhwcmVzc2lvbihuYW1lKTsKLQkJY29uZGl0aW9uYWxFeHByZXNzaW9uLnNldEVsc2VFeHByZXNzaW9uKHRoaXMuYXN0Lm5ld051bWJlckxpdGVyYWwoIjAiKSk7Ly8kTk9OLU5MUy0xJAotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0SW5pdGlhbGl6ZXIoY29uZGl0aW9uYWxFeHByZXNzaW9uKTsKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCk7Ci0JCXN0YXRlbWVudC5zZXRNb2RpZmllcnMoTW9kaWZpZXIuTk9ORSk7Ci0JCXN0YXRlbWVudC5zZXRUeXBlKHRoaXMuYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5JTlQpKTsKLQotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImludCBpID0gdHJ1ZSA/IGFyZ3MubGVuZ3RoOiAwOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9CQotCi0JLyoqCi0JICogTWVzc2FnZVNlbmQgPT0+IFN1cGVyTWV0aG9kSW52b2NhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDc4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwNzgiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCVN1cGVyTWV0aG9kSW52b2NhdGlvbiBzdXBlck1ldGhvZEludm9jYXRpb24gPSB0aGlzLmFzdC5uZXdTdXBlck1ldGhvZEludm9jYXRpb24oKTsKLQkJc3VwZXJNZXRob2RJbnZvY2F0aW9uLnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiYmFyIikpOyAvLyROT04tTkxTLTEkCi0JCUV4cHJlc3Npb25TdGF0ZW1lbnQgc3RhdGVtZW50ID0gdGhpcy5hc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChzdXBlck1ldGhvZEludm9jYXRpb24pOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgInN1cGVyLmJhcigpOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9CQotCi0JLyoqCi0JICogTWVzc2FnZVNlbmQgPT0+IFN1cGVyTWV0aG9kSW52b2NhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDc5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwNzkiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCVN1cGVyTWV0aG9kSW52b2NhdGlvbiBzdXBlck1ldGhvZEludm9jYXRpb24gPSB0aGlzLmFzdC5uZXdTdXBlck1ldGhvZEludm9jYXRpb24oKTsKLQkJc3VwZXJNZXRob2RJbnZvY2F0aW9uLnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiYmFyIikpOyAvLyROT04tTkxTLTEkCi0JCXN1cGVyTWV0aG9kSW52b2NhdGlvbi5hcmd1bWVudHMoKS5hZGQodGhpcy5hc3QubmV3TnVtYmVyTGl0ZXJhbCgiNCIpKTsvLyROT04tTkxTLTEkCi0JCUV4cHJlc3Npb25TdGF0ZW1lbnQgc3RhdGVtZW50ID0gdGhpcy5hc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChzdXBlck1ldGhvZEludm9jYXRpb24pOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgInN1cGVyLmJhcig0KTsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQkKLQkKLQkvKioKLQkgKiBNZXNzYWdlU2VuZCA9PT4gTWV0aG9kSW52b2NhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDgwKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwODAiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCU1ldGhvZEludm9jYXRpb24gbWV0aG9kSW52b2NhdGlvbiA9IHRoaXMuYXN0Lm5ld01ldGhvZEludm9jYXRpb24oKTsKLQkJbWV0aG9kSW52b2NhdGlvbi5zZXROYW1lKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImJhciIpKTsgLy8kTk9OLU5MUy0xJAotCQltZXRob2RJbnZvY2F0aW9uLmFyZ3VtZW50cygpLmFkZCh0aGlzLmFzdC5uZXdOdW1iZXJMaXRlcmFsKCI0IikpOy8vJE5PTi1OTFMtMSQKLQkJRXhwcmVzc2lvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KG1ldGhvZEludm9jYXRpb24pOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImJhcig0KTsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIE1lc3NhZ2VTZW5kID09PiBNZXRob2RJbnZvY2F0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwODEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDA4MSIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJTWV0aG9kSW52b2NhdGlvbiBtZXRob2RJbnZvY2F0aW9uID0gdGhpcy5hc3QubmV3TWV0aG9kSW52b2NhdGlvbigpOwotCQltZXRob2RJbnZvY2F0aW9uLnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiYmFyIikpOyAvLyROT04tTkxTLTEkCi0JCW1ldGhvZEludm9jYXRpb24uc2V0RXhwcmVzc2lvbih0aGlzLmFzdC5uZXdUaGlzRXhwcmVzc2lvbigpKTsKLQkJbWV0aG9kSW52b2NhdGlvbi5hcmd1bWVudHMoKS5hZGQodGhpcy5hc3QubmV3TnVtYmVyTGl0ZXJhbCgiNCIpKTsvLyROT04tTkxTLTEkCi0JCUV4cHJlc3Npb25TdGF0ZW1lbnQgc3RhdGVtZW50ID0gdGhpcy5hc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChtZXRob2RJbnZvY2F0aW9uKTsKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIHN0YXRlbWVudC5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgbm9kZSkpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJ0aGlzLmJhcig0KTsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIEZvclN0YXRlbWVudCA9PT4gRm9yU3RhdGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwODIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDA4MiIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJRm9yU3RhdGVtZW50IGZvclN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld0ZvclN0YXRlbWVudCgpOwotCQlmb3JTdGF0ZW1lbnQuc2V0Qm9keSh0aGlzLmFzdC5uZXdFbXB0eVN0YXRlbWVudCgpKTsKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIGZvclN0YXRlbWVudC5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgbm9kZSkpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJmb3IgKDs7KTsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIEZvclN0YXRlbWVudCA9PT4gRm9yU3RhdGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwODMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDA4MyIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJRm9yU3RhdGVtZW50IGZvclN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld0ZvclN0YXRlbWVudCgpOwotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXROYW1lKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImkiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldEluaXRpYWxpemVyKHRoaXMuYXN0Lm5ld051bWJlckxpdGVyYWwoIjAiKSk7Ly8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiB2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uLnNldE1vZGlmaWVycyhNb2RpZmllci5OT05FKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24uc2V0VHlwZSh0aGlzLmFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuSU5UKSk7Ci0JCWZvclN0YXRlbWVudC5pbml0aWFsaXplcnMoKS5hZGQodmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24pOwotCQlQb3N0Zml4RXhwcmVzc2lvbiBwb3N0Zml4RXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld1Bvc3RmaXhFeHByZXNzaW9uKCk7Ci0JCXBvc3RmaXhFeHByZXNzaW9uLnNldE9wZXJhbmQodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiaSIpKTsvLyROT04tTkxTLTEkCi0JCXBvc3RmaXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKFBvc3RmaXhFeHByZXNzaW9uLk9wZXJhdG9yLklOQ1JFTUVOVCk7Ci0JCWZvclN0YXRlbWVudC51cGRhdGVycygpLmFkZChwb3N0Zml4RXhwcmVzc2lvbik7Ci0JCWZvclN0YXRlbWVudC5zZXRCb2R5KHRoaXMuYXN0Lm5ld0Jsb2NrKCkpOwotCQlJbmZpeEV4cHJlc3Npb24gaW5maXhFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3SW5maXhFeHByZXNzaW9uKCk7Ci0JCWluZml4RXhwcmVzc2lvbi5zZXRMZWZ0T3BlcmFuZCh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJpIikpOyAvLyROT04tTkxTLTEkCi0JCWluZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTEVTUyk7Ci0JCWluZml4RXhwcmVzc2lvbi5zZXRSaWdodE9wZXJhbmQodGhpcy5hc3QubmV3TnVtYmVyTGl0ZXJhbCgiMTAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZm9yU3RhdGVtZW50LnNldEV4cHJlc3Npb24oaW5maXhFeHByZXNzaW9uKTsKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIGZvclN0YXRlbWVudC5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgbm9kZSkpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHt9Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBGb3JTdGF0ZW1lbnQgPT0+IEZvclN0YXRlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDg0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwODQiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCUZvclN0YXRlbWVudCBmb3JTdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdGb3JTdGF0ZW1lbnQoKTsKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0TmFtZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJpIikpOyAvLyROT04tTkxTLTEkCi0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXRJbml0aWFsaXplcih0aGlzLmFzdC5uZXdOdW1iZXJMaXRlcmFsKCIwIikpOy8vJE5PTi1OTFMtMSQKLQotCQlWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiB2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uLnNldE1vZGlmaWVycyhNb2RpZmllci5OT05FKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24uc2V0VHlwZSh0aGlzLmFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuSU5UKSk7Ci0JCQotCQlmb3JTdGF0ZW1lbnQuaW5pdGlhbGl6ZXJzKCkuYWRkKHZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKTsKLQkJUG9zdGZpeEV4cHJlc3Npb24gcG9zdGZpeEV4cHJlc3Npb24gPSB0aGlzLmFzdC5uZXdQb3N0Zml4RXhwcmVzc2lvbigpOwotCQlwb3N0Zml4RXhwcmVzc2lvbi5zZXRPcGVyYW5kKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImkiKSk7Ly8kTk9OLU5MUy0xJAotCQlwb3N0Zml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihQb3N0Zml4RXhwcmVzc2lvbi5PcGVyYXRvci5JTkNSRU1FTlQpOwotCQlmb3JTdGF0ZW1lbnQudXBkYXRlcnMoKS5hZGQocG9zdGZpeEV4cHJlc3Npb24pOwotCQlJbmZpeEV4cHJlc3Npb24gaW5maXhFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3SW5maXhFeHByZXNzaW9uKCk7Ci0JCWluZml4RXhwcmVzc2lvbi5zZXRMZWZ0T3BlcmFuZCh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJpIikpOyAvLyROT04tTkxTLTEkCi0JCWluZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTEVTUyk7Ci0JCWluZml4RXhwcmVzc2lvbi5zZXRSaWdodE9wZXJhbmQodGhpcy5hc3QubmV3TnVtYmVyTGl0ZXJhbCgiMTAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZm9yU3RhdGVtZW50LnNldEV4cHJlc3Npb24oaW5maXhFeHByZXNzaW9uKTsKLQkJZm9yU3RhdGVtZW50LnNldEJvZHkodGhpcy5hc3QubmV3RW1wdHlTdGF0ZW1lbnQoKSk7Ci0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBmb3JTdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKTsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogRm9yU3RhdGVtZW50ID09PiBGb3JTdGF0ZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDA4NSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMDg1IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlGb3JTdGF0ZW1lbnQgZm9yU3RhdGVtZW50ID0gdGhpcy5hc3QubmV3Rm9yU3RhdGVtZW50KCk7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiaSIpKTsgLy8kTk9OLU5MUy0xJAotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0SW5pdGlhbGl6ZXIodGhpcy5hc3QubmV3TnVtYmVyTGl0ZXJhbCgiMCIpKTsvLyROT04tTkxTLTEkCi0KLQkJVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbih2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbi5zZXRNb2RpZmllcnMoTW9kaWZpZXIuTk9ORSk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uLnNldFR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLklOVCkpOwotCQkKLQkJZm9yU3RhdGVtZW50LmluaXRpYWxpemVycygpLmFkZCh2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbik7Ci0JCVBvc3RmaXhFeHByZXNzaW9uIHBvc3RmaXhFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3UG9zdGZpeEV4cHJlc3Npb24oKTsKLQkJcG9zdGZpeEV4cHJlc3Npb24uc2V0T3BlcmFuZCh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJpIikpOy8vJE5PTi1OTFMtMSQKLQkJcG9zdGZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoUG9zdGZpeEV4cHJlc3Npb24uT3BlcmF0b3IuSU5DUkVNRU5UKTsKLQkJZm9yU3RhdGVtZW50LnVwZGF0ZXJzKCkuYWRkKHBvc3RmaXhFeHByZXNzaW9uKTsKLQkJZm9yU3RhdGVtZW50LnNldEJvZHkodGhpcy5hc3QubmV3RW1wdHlTdGF0ZW1lbnQoKSk7Ci0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBmb3JTdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiZm9yIChpbnQgaSA9IDA7OyBpKyspOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBGb3JTdGF0ZW1lbnQgPT0+IEZvclN0YXRlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDg2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwODYiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCUZvclN0YXRlbWVudCBmb3JTdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdGb3JTdGF0ZW1lbnQoKTsKLQkJUG9zdGZpeEV4cHJlc3Npb24gcG9zdGZpeEV4cHJlc3Npb24gPSB0aGlzLmFzdC5uZXdQb3N0Zml4RXhwcmVzc2lvbigpOwotCQlwb3N0Zml4RXhwcmVzc2lvbi5zZXRPcGVyYW5kKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImkiKSk7Ly8kTk9OLU5MUy0xJAotCQlwb3N0Zml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihQb3N0Zml4RXhwcmVzc2lvbi5PcGVyYXRvci5JTkNSRU1FTlQpOwotCQlmb3JTdGF0ZW1lbnQudXBkYXRlcnMoKS5hZGQocG9zdGZpeEV4cHJlc3Npb24pOwotCQlJbmZpeEV4cHJlc3Npb24gaW5maXhFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3SW5maXhFeHByZXNzaW9uKCk7Ci0JCWluZml4RXhwcmVzc2lvbi5zZXRMZWZ0T3BlcmFuZCh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJpIikpOyAvLyROT04tTkxTLTEkCi0JCWluZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTEVTUyk7Ci0JCWluZml4RXhwcmVzc2lvbi5zZXRSaWdodE9wZXJhbmQodGhpcy5hc3QubmV3TnVtYmVyTGl0ZXJhbCgiMTAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZm9yU3RhdGVtZW50LnNldEV4cHJlc3Npb24oaW5maXhFeHByZXNzaW9uKTsKLQkJZm9yU3RhdGVtZW50LnNldEJvZHkodGhpcy5hc3QubmV3RW1wdHlTdGF0ZW1lbnQoKSk7Ci0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBmb3JTdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiZm9yICg7IGkgPCAxMDsgaSsrKTsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogRm9yU3RhdGVtZW50ID09PiBGb3JTdGF0ZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDA4NygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMDg3IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlGb3JTdGF0ZW1lbnQgZm9yU3RhdGVtZW50ID0gdGhpcy5hc3QubmV3Rm9yU3RhdGVtZW50KCk7Ci0JCVBvc3RmaXhFeHByZXNzaW9uIHBvc3RmaXhFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3UG9zdGZpeEV4cHJlc3Npb24oKTsKLQkJcG9zdGZpeEV4cHJlc3Npb24uc2V0T3BlcmFuZCh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJpIikpOy8vJE5PTi1OTFMtMSQKLQkJcG9zdGZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoUG9zdGZpeEV4cHJlc3Npb24uT3BlcmF0b3IuSU5DUkVNRU5UKTsKLQkJZm9yU3RhdGVtZW50LnVwZGF0ZXJzKCkuYWRkKHBvc3RmaXhFeHByZXNzaW9uKTsKLQkJZm9yU3RhdGVtZW50LnNldEJvZHkodGhpcy5hc3QubmV3RW1wdHlTdGF0ZW1lbnQoKSk7Ci0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBmb3JTdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiZm9yICg7O2krKyk7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIExvY2FsRGVjbGFyYXRpb24gPT0+IFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDA4OCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMDg4IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiaSIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgc3RhdGVtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCh2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpOwotCQlzdGF0ZW1lbnQuc2V0VHlwZSh0aGlzLmFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuSU5UKSk7Ci0JCXN0YXRlbWVudC5zZXRNb2RpZmllcnMoTW9kaWZpZXIuTk9ORSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIHN0YXRlbWVudC5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgbm9kZSkpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJpbnQgaTsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTG9jYWxEZWNsYXJhdGlvbiA9PT4gVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDg5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwODkiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0KLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0TmFtZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJzIikpOyAvLyROT04tTkxTLTEkCi0KLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCk7Ci0JCVF1YWxpZmllZE5hbWUgbmFtZSA9IAotCQkJdGhpcy5hc3QubmV3UXVhbGlmaWVkTmFtZSgKLQkJCQl0aGlzLmFzdC5uZXdRdWFsaWZpZWROYW1lKAotCQkJCQl0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJqYXZhIiksLy8kTk9OLU5MUy0xJAotCQkJCQl0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJsYW5nIikvLyROT04tTkxTLTEkCi0JCQkJKSwKLQkJCQl0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJTdHJpbmciKSAvLyROT04tTkxTLTEkCi0JCQkpOwotCQlzdGF0ZW1lbnQuc2V0VHlwZSh0aGlzLmFzdC5uZXdTaW1wbGVUeXBlKG5hbWUpKTsKLQkJc3RhdGVtZW50LnNldE1vZGlmaWVycyhNb2RpZmllci5OT05FKTsKLQotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImphdmEubGFuZy5TdHJpbmcgczsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTG9jYWxEZWNsYXJhdGlvbiA9PT4gVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDkwKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwOTAiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJQXJyYXlJbml0aWFsaXplciBpbml0aWFsaXplciA9IHRoaXMuYXN0Lm5ld0FycmF5SW5pdGlhbGl6ZXIoKTsKLQkJaW5pdGlhbGl6ZXIuZXhwcmVzc2lvbnMoKS5hZGQodGhpcy5hc3QubmV3TnVtYmVyTGl0ZXJhbCgiMSIpKTsvLyROT04tTkxTLTEkCi0JCWluaXRpYWxpemVyLmV4cHJlc3Npb25zKCkuYWRkKHRoaXMuYXN0Lm5ld051bWJlckxpdGVyYWwoIjIiKSk7Ly8kTk9OLU5MUy0xJAotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0SW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXIpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0TmFtZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJ0YWIiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQodmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KTsKLQkJc3RhdGVtZW50LnNldFR5cGUodGhpcy5hc3QubmV3QXJyYXlUeXBlKHRoaXMuYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5JTlQpLCAxKSk7Ci0JCXN0YXRlbWVudC5zZXRNb2RpZmllcnMoTW9kaWZpZXIuTk9ORSk7Ci0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBzdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiaW50W10gdGFiID0gezEsIDJ9OyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogQXJndW1lbnQgPT0+IFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDA5MSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMDkxIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IChNZXRob2REZWNsYXJhdGlvbikoKFR5cGVEZWNsYXJhdGlvbikgKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCkudHlwZXMoKS5nZXQoMCkpLmJvZHlEZWNsYXJhdGlvbnMoKS5nZXQoMCk7Ci0JCVNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSA9IChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSBtZXRob2QucGFyYW1ldGVycygpLmdldCgwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlRGVjbGFyYXRpb24gPSB0aGlzLmFzdC5uZXdTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKCk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb24uc2V0TW9kaWZpZXJzKE1vZGlmaWVyLk5PTkUpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uLnNldFR5cGUodGhpcy5hc3QubmV3U2ltcGxlVHlwZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJTdHJpbmciKSkpOy8vJE5PTi1OTFMtMSQKLQkJdmFyaWFibGVEZWNsYXJhdGlvbi5zZXROYW1lKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoInMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIHZhcmlhYmxlRGVjbGFyYXRpb24uc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiU3RyaW5nIHMiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQXJndW1lbnQgPT0+IFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDA5MigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMDkyIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IChNZXRob2REZWNsYXJhdGlvbikoKFR5cGVEZWNsYXJhdGlvbikgKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCkudHlwZXMoKS5nZXQoMCkpLmJvZHlEZWNsYXJhdGlvbnMoKS5nZXQoMCk7Ci0JCVNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSA9IChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSBtZXRob2QucGFyYW1ldGVycygpLmdldCgwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHZhcmlhYmxlRGVjbGFyYXRpb24gPSB0aGlzLmFzdC5uZXdTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKCk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb24uc2V0TW9kaWZpZXJzKE1vZGlmaWVyLkZJTkFMKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbi5zZXRUeXBlKHRoaXMuYXN0Lm5ld1NpbXBsZVR5cGUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiU3RyaW5nIikpKTsvLyROT04tTkxTLTEkCi0JCXZhcmlhYmxlRGVjbGFyYXRpb24uc2V0TmFtZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJzIikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCB2YXJpYWJsZURlY2xhcmF0aW9uLnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImZpbmFsIFN0cmluZyBzIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIGRpbWVuc2lvbiIsIDAsIG5vZGUuZ2V0RXh0cmFEaW1lbnNpb25zKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQnJlYWsgPT0+IEJyZWFrU3RhdGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwOTMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDA5MyIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMCk7Ci0JCUZvclN0YXRlbWVudCBmb3JTdGF0ZW1lbnQgPSAoRm9yU3RhdGVtZW50KSBub2RlOwotCQlCcmVha1N0YXRlbWVudCBzdGF0ZW1lbnQgPSAoQnJlYWtTdGF0ZW1lbnQpICgoQmxvY2spIGZvclN0YXRlbWVudC5nZXRCb2R5KCkpLnN0YXRlbWVudHMoKS5nZXQoMCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgc3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlCcmVha1N0YXRlbWVudCBicmVha1N0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld0JyZWFrU3RhdGVtZW50KCk7Ci0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBicmVha1N0YXRlbWVudC5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgc3RhdGVtZW50KSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uoc3RhdGVtZW50LCAiYnJlYWs7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENvbnRpbnVlID09PiBDb250aW51ZVN0YXRlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDk0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwOTQiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlGb3JTdGF0ZW1lbnQgZm9yU3RhdGVtZW50ID0gKEZvclN0YXRlbWVudCkgbm9kZTsKLQkJQ29udGludWVTdGF0ZW1lbnQgc3RhdGVtZW50ID0gKENvbnRpbnVlU3RhdGVtZW50KSAoKEJsb2NrKSBmb3JTdGF0ZW1lbnQuZ2V0Qm9keSgpKS5zdGF0ZW1lbnRzKCkuZ2V0KDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIHN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29udGludWVTdGF0ZW1lbnQgY29udGludWVTdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdDb250aW51ZVN0YXRlbWVudCgpOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgY29udGludWVTdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIHN0YXRlbWVudCkpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKHN0YXRlbWVudCwgImNvbnRpbnVlOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogQ29udGludWUgd2l0aCBMYWJlbCA9PT4gQ29udGludWVTdGF0ZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDA5NSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMDk1IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUxhYmVsZWRTdGF0ZW1lbnQgbGFiZWxlZFN0YXRlbWVudCA9IChMYWJlbGVkU3RhdGVtZW50KSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMCk7Ci0JCUZvclN0YXRlbWVudCBmb3JTdGF0ZW1lbnQgPSAoRm9yU3RhdGVtZW50KSBsYWJlbGVkU3RhdGVtZW50LmdldEJvZHkoKTsKLQkJQ29udGludWVTdGF0ZW1lbnQgc3RhdGVtZW50ID0gKENvbnRpbnVlU3RhdGVtZW50KSAoKEJsb2NrKSBmb3JTdGF0ZW1lbnQuZ2V0Qm9keSgpKS5zdGF0ZW1lbnRzKCkuZ2V0KDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIHN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29udGludWVTdGF0ZW1lbnQgY29udGludWVTdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdDb250aW51ZVN0YXRlbWVudCgpOwotCQljb250aW51ZVN0YXRlbWVudC5zZXRMYWJlbCh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJsYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgY29udGludWVTdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIHN0YXRlbWVudCkpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKHN0YXRlbWVudCwgImNvbnRpbnVlIGxhYmVsOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogQnJlYWsgKyBsYWJlbCAgPT0+IEJyZWFrU3RhdGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwOTYoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDA5NiIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlMYWJlbGVkU3RhdGVtZW50IGxhYmVsZWRTdGF0ZW1lbnQgPSAoTGFiZWxlZFN0YXRlbWVudCkgZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlGb3JTdGF0ZW1lbnQgZm9yU3RhdGVtZW50ID0gKEZvclN0YXRlbWVudCkgbGFiZWxlZFN0YXRlbWVudC5nZXRCb2R5KCk7Ci0JCUJyZWFrU3RhdGVtZW50IHN0YXRlbWVudCA9IChCcmVha1N0YXRlbWVudCkgKChCbG9jaykgZm9yU3RhdGVtZW50LmdldEJvZHkoKSkuc3RhdGVtZW50cygpLmdldCgwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBzdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCUJyZWFrU3RhdGVtZW50IGJyZWFrU3RhdGVtZW50ID0gdGhpcy5hc3QubmV3QnJlYWtTdGF0ZW1lbnQoKTsKLQkJYnJlYWtTdGF0ZW1lbnQuc2V0TGFiZWwodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgibGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIGJyZWFrU3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBzdGF0ZW1lbnQpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShzdGF0ZW1lbnQsICJicmVhayBsYWJlbDsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogU3dpdGNoU3RhdGVtZW50ID09PiBTd2l0Y2hTdGF0ZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDA5NygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMDk3IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlTd2l0Y2hTdGF0ZW1lbnQgc3dpdGNoU3RhdGVtZW50ID0gdGhpcy5hc3QubmV3U3dpdGNoU3RhdGVtZW50KCk7Ci0JCXN3aXRjaFN0YXRlbWVudC5zZXRFeHByZXNzaW9uKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImkiKSk7Ly8kTk9OLU5MUy0xJAotCQlTd2l0Y2hDYXNlIF9jYXNlID0gdGhpcy5hc3QubmV3U3dpdGNoQ2FzZSgpOwotCQlfY2FzZS5zZXRFeHByZXNzaW9uKHRoaXMuYXN0Lm5ld051bWJlckxpdGVyYWwoIjEiKSk7Ly8kTk9OLU5MUy0xJAotCQlzd2l0Y2hTdGF0ZW1lbnQuc3RhdGVtZW50cygpLmFkZChfY2FzZSk7Ci0JCXN3aXRjaFN0YXRlbWVudC5zdGF0ZW1lbnRzKCkuYWRkKHRoaXMuYXN0Lm5ld0JyZWFrU3RhdGVtZW50KCkpOwotCQlfY2FzZSA9IHRoaXMuYXN0Lm5ld1N3aXRjaENhc2UoKTsKLQkJX2Nhc2Uuc2V0RXhwcmVzc2lvbih0aGlzLmFzdC5uZXdOdW1iZXJMaXRlcmFsKCIyIikpOy8vJE5PTi1OTFMtMSQKLQkJc3dpdGNoU3RhdGVtZW50LnN0YXRlbWVudHMoKS5hZGQoX2Nhc2UpOwotCQlNZXRob2RJbnZvY2F0aW9uIG1ldGhvZEludm9jYXRpb24gPSB0aGlzLmFzdC5uZXdNZXRob2RJbnZvY2F0aW9uKCk7Ci0JCVF1YWxpZmllZE5hbWUgbmFtZSA9IAotCQkJdGhpcy5hc3QubmV3UXVhbGlmaWVkTmFtZSgKLQkJCQl0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJTeXN0ZW0iKSwvLyROT04tTkxTLTEkCi0JCQkJdGhpcy5hc3QubmV3U2ltcGxlTmFtZSgib3V0IikpOy8vJE5PTi1OTFMtMSQKLQkJbWV0aG9kSW52b2NhdGlvbi5zZXRFeHByZXNzaW9uKG5hbWUpOwotCQltZXRob2RJbnZvY2F0aW9uLnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgicHJpbnRsbiIpKTsgLy8kTk9OLU5MUy0xJAotCQltZXRob2RJbnZvY2F0aW9uLmFyZ3VtZW50cygpLmFkZCh0aGlzLmFzdC5uZXdOdW1iZXJMaXRlcmFsKCIyIikpOy8vJE5PTi1OTFMtMSQKLQkJRXhwcmVzc2lvblN0YXRlbWVudCBleHByZXNzaW9uU3RhdGVtZW50ID0gdGhpcy5hc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChtZXRob2RJbnZvY2F0aW9uKTsKLQkJc3dpdGNoU3RhdGVtZW50LnN0YXRlbWVudHMoKS5hZGQoZXhwcmVzc2lvblN0YXRlbWVudCk7Ci0JCXN3aXRjaFN0YXRlbWVudC5zdGF0ZW1lbnRzKCkuYWRkKHRoaXMuYXN0Lm5ld0JyZWFrU3RhdGVtZW50KCkpOwotCQlfY2FzZSA9IHRoaXMuYXN0Lm5ld1N3aXRjaENhc2UoKTsKLQkJX2Nhc2Uuc2V0RXhwcmVzc2lvbihudWxsKTsKLQkJc3dpdGNoU3RhdGVtZW50LnN0YXRlbWVudHMoKS5hZGQoX2Nhc2UpOwotCQltZXRob2RJbnZvY2F0aW9uID0gdGhpcy5hc3QubmV3TWV0aG9kSW52b2NhdGlvbigpOwotCQluYW1lID0gCi0JCQl0aGlzLmFzdC5uZXdRdWFsaWZpZWROYW1lKAotCQkJCXRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoIlN5c3RlbSIpLC8vJE5PTi1OTFMtMSQKLQkJCQl0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJvdXQiKSk7Ly8kTk9OLU5MUy0xJAotCQltZXRob2RJbnZvY2F0aW9uLnNldEV4cHJlc3Npb24obmFtZSk7Ci0JCW1ldGhvZEludm9jYXRpb24uc2V0TmFtZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJwcmludGxuIikpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ0xpdGVyYWwgbGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld1N0cmluZ0xpdGVyYWwoKTsKLQkJbGl0ZXJhbC5zZXRMaXRlcmFsVmFsdWUoImRlZmF1bHQiKTsJLy8kTk9OLU5MUy0xJAotCQltZXRob2RJbnZvY2F0aW9uLmFyZ3VtZW50cygpLmFkZChsaXRlcmFsKTsKLQkJZXhwcmVzc2lvblN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld0V4cHJlc3Npb25TdGF0ZW1lbnQobWV0aG9kSW52b2NhdGlvbik7Ci0JCXN3aXRjaFN0YXRlbWVudC5zdGF0ZW1lbnRzKCkuYWRkKGV4cHJlc3Npb25TdGF0ZW1lbnQpOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3dpdGNoU3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CS8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGV4cGVjdGVkU291cmNlID0gInN3aXRjaChpKSB7XG4iICsvLyROT04tTkxTLTEkCi0JCQkgIgkJCWNhc2UgMTogXG4iICsvLyROT04tTkxTLTEkCi0JCQkgIiAgICAgICAgICAgICAgYnJlYWs7XG4iICsvLyROT04tTkxTLTEkCi0JCQkgIgkJCWNhc2UgMjpcbiIgKy8vJE5PTi1OTFMtMSQKLQkJCSAiCQkJCVN5c3RlbS5vdXQucHJpbnRsbigyKTtcbiIgKy8vJE5PTi1OTFMtMSQKLQkJCSAiICAgICAgICAgICAgICBicmVhaztcbiIgKy8vJE5PTi1OTFMtMSQKLQkJCSAiICAgICAgICAgIGRlZmF1bHQ6XG4iICsvLyROT04tTkxTLTEkCi0JCQkgIgkJCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJkZWZhdWx0XCIpO1xuIiArLy8kTk9OLU5MUy0xJAotCQkJICIJCX0iOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgZXhwZWN0ZWRTb3VyY2UsIHNvdXJjZSk7Ci0JCVN3aXRjaFN0YXRlbWVudCBzd2l0Y2hTdGF0ZW1lbnQyID0gKFN3aXRjaFN0YXRlbWVudCkgbm9kZTsKLQkJTGlzdCBzdGF0ZW1lbnRzID0gc3dpdGNoU3RhdGVtZW50Mi5zdGF0ZW1lbnRzKCk7Ci0JCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDcsIHN0YXRlbWVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlTdGF0ZW1lbnQgc3RtdCA9IChTdGF0ZW1lbnQpIHN0YXRlbWVudHMuZ2V0KDUpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBjYXNlIHN0YXRlbWVudCIsIHN0bXQgaW5zdGFuY2VvZiBTd2l0Y2hDYXNlKTsgLy8kTk9OLU5MUy0xJAotCQlTd2l0Y2hDYXNlIHN3aXRjaENhc2UgPSAoU3dpdGNoQ2FzZSkgc3RtdDsKLQkJYXNzZXJ0VHJ1ZSgiTm90IHRoZSBkZWZhdWx0IGNhc2UiLCBzd2l0Y2hDYXNlLmlzRGVmYXVsdCgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEVtcHR5U3RhdGVtZW50ID09PiBFbXB0eVN0YXRlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDk4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAwOTgiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCUVtcHR5U3RhdGVtZW50IGVtcHR5U3RhdGVtZW50ID0gdGhpcy5hc3QubmV3RW1wdHlTdGF0ZW1lbnQoKTsKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIGVtcHR5U3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgIjsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogRG9TdGF0ZW1lbnQgPT0+IERvU3RhdGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwOTkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDA5OSIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJRG9TdGF0ZW1lbnQgZG9TdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdEb1N0YXRlbWVudCgpOwotCQlCbG9jayBibG9jayA9IHRoaXMuYXN0Lm5ld0Jsb2NrKCk7Ci0JCWJsb2NrLnN0YXRlbWVudHMoKS5hZGQodGhpcy5hc3QubmV3RW1wdHlTdGF0ZW1lbnQoKSk7Ci0JCWRvU3RhdGVtZW50LnNldEJvZHkoYmxvY2spOwotCQlkb1N0YXRlbWVudC5zZXRFeHByZXNzaW9uKHRoaXMuYXN0Lm5ld0Jvb2xlYW5MaXRlcmFsKHRydWUpKTsKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIGRvU3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCVN0cmluZyBleHBlY3RlZFNvdXJjZSA9ICJkbyB7O1xuIiArLy8kTk9OLU5MUy0xJAotCQkJICIJCX0gd2hpbGUodHJ1ZSk7IjsvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgZXhwZWN0ZWRTb3VyY2UsIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogV2hpbGVTdGF0ZW1lbnQgPT0+IFdoaWxlU3RhdGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAxMDAoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDEwMCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJV2hpbGVTdGF0ZW1lbnQgd2hpbGVTdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdXaGlsZVN0YXRlbWVudCgpOwotCQl3aGlsZVN0YXRlbWVudC5zZXRFeHByZXNzaW9uKHRoaXMuYXN0Lm5ld0Jvb2xlYW5MaXRlcmFsKHRydWUpKTsKLQkJd2hpbGVTdGF0ZW1lbnQuc2V0Qm9keSh0aGlzLmFzdC5uZXdFbXB0eVN0YXRlbWVudCgpKTsKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIHdoaWxlU3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgIndoaWxlKHRydWUpOyIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFdoaWxlU3RhdGVtZW50ID09PiBXaGlsZVN0YXRlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTAxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxMDEiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCVdoaWxlU3RhdGVtZW50IHdoaWxlU3RhdGVtZW50ID0gdGhpcy5hc3QubmV3V2hpbGVTdGF0ZW1lbnQoKTsKLQkJd2hpbGVTdGF0ZW1lbnQuc2V0RXhwcmVzc2lvbih0aGlzLmFzdC5uZXdCb29sZWFuTGl0ZXJhbCh0cnVlKSk7Ci0JCXdoaWxlU3RhdGVtZW50LnNldEJvZHkodGhpcy5hc3QubmV3QmxvY2soKSk7Ci0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCB3aGlsZVN0YXRlbWVudC5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgbm9kZSkpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJ3aGlsZSh0cnVlKSB7fSIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBFeHRlbmRlZFN0cmluZ0xpdGVyYWwgPT0+IFN0cmluZ0xpdGVyYWwKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDEwMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTAyIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgZXhwcmVzc2lvbiA9IGdldEFTVE5vZGVUb0NvbXBhcmUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0KTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBleHByZXNzaW9uKTsgLy8kTk9OLU5MUy0xJAotCQlJbmZpeEV4cHJlc3Npb24gaW5maXhFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3SW5maXhFeHByZXNzaW9uKCk7Ci0JCWluZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUExVUyk7Ci0JCVN0cmluZ0xpdGVyYWwgbGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld1N0cmluZ0xpdGVyYWwoKTsvLyROT04tTkxTLTEkCi0JCWxpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKCJIZWxsbyIpOyAvLyROT04tTkxTLTEkCi0JCWluZml4RXhwcmVzc2lvbi5zZXRMZWZ0T3BlcmFuZChsaXRlcmFsKTsKLQkJbGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld1N0cmluZ0xpdGVyYWwoKTsvLyROT04tTkxTLTEkCi0JCWxpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKCIgV29ybGQiKTsgLy8kTk9OLU5MUy0xJAotCQlpbmZpeEV4cHJlc3Npb24uc2V0UmlnaHRPcGVyYW5kKGxpdGVyYWwpOwkJCi0JCWxpdGVyYWwgPSB0aGlzLmFzdC5uZXdTdHJpbmdMaXRlcmFsKCk7Ly8kTk9OLU5MUy0xJAotCQlsaXRlcmFsLnNldExpdGVyYWxWYWx1ZSgiISIpOyAvLyROT04tTkxTLTEkCi0JCWluZml4RXhwcmVzc2lvbi5leHRlbmRlZE9wZXJhbmRzKCkuYWRkKGxpdGVyYWwpOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgaW5maXhFeHByZXNzaW9uLnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBleHByZXNzaW9uKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UoZXhwcmVzc2lvbiwgIlwiSGVsbG9cIiArIFwiIFdvcmxkXCIgKyBcIiFcIiIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBFeHRlbmRlZFN0cmluZ0xpdGVyYWwgPT0+IFN0cmluZ0xpdGVyYWwKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDEwMygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTAzIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgZXhwcmVzc2lvbiA9IGdldEFTVE5vZGVUb0NvbXBhcmUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0KTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBleHByZXNzaW9uKTsgLy8kTk9OLU5MUy0xJAotCQlJbmZpeEV4cHJlc3Npb24gaW5maXhFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3SW5maXhFeHByZXNzaW9uKCk7Ci0JCWluZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUExVUyk7Ci0JCVN0cmluZ0xpdGVyYWwgbGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld1N0cmluZ0xpdGVyYWwoKTsvLyROT04tTkxTLTEkCi0JCWxpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKCJIZWxsbyIpOyAvLyROT04tTkxTLTEkCi0JCWluZml4RXhwcmVzc2lvbi5zZXRMZWZ0T3BlcmFuZChsaXRlcmFsKTsKLQkJbGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld1N0cmluZ0xpdGVyYWwoKTsvLyROT04tTkxTLTEkCi0JCWxpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKCIgV29ybGQiKTsgLy8kTk9OLU5MUy0xJAotCQlpbmZpeEV4cHJlc3Npb24uc2V0UmlnaHRPcGVyYW5kKGxpdGVyYWwpOwkJCi0JCWxpdGVyYWwgPSB0aGlzLmFzdC5uZXdTdHJpbmdMaXRlcmFsKCk7Ly8kTk9OLU5MUy0xJAotCQlsaXRlcmFsLnNldExpdGVyYWxWYWx1ZSgiISIpOyAvLyROT04tTkxTLTEkCi0JCWluZml4RXhwcmVzc2lvbi5leHRlbmRlZE9wZXJhbmRzKCkuYWRkKGxpdGVyYWwpOwotCQlsaXRlcmFsID0gdGhpcy5hc3QubmV3U3RyaW5nTGl0ZXJhbCgpOy8vJE5PTi1OTFMtMSQKLQkJbGl0ZXJhbC5zZXRMaXRlcmFsVmFsdWUoIiEiKTsgLy8kTk9OLU5MUy0xJAotCQlpbmZpeEV4cHJlc3Npb24uZXh0ZW5kZWRPcGVyYW5kcygpLmFkZChsaXRlcmFsKTsKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIGluZml4RXhwcmVzc2lvbi5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgZXhwcmVzc2lvbikpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb24sICJcIkhlbGxvXCIgKyBcIiBXb3JsZFwiICsgXCIhXCIgKyBcIiFcIiIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEV4dGVuZGVkU3RyaW5nTGl0ZXJhbCA9PT4gU3RyaW5nTGl0ZXJhbAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTA0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxMDQiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBleHByZXNzaW9uID0gZ2V0QVNUTm9kZVRvQ29tcGFyZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIGV4cHJlc3Npb24pOyAvLyROT04tTkxTLTEkCi0JCUluZml4RXhwcmVzc2lvbiBpbmZpeEV4cHJlc3Npb24gPSB0aGlzLmFzdC5uZXdJbmZpeEV4cHJlc3Npb24oKTsKLQkJaW5maXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5QTFVTKTsKLQkJU3RyaW5nTGl0ZXJhbCBsaXRlcmFsID0gdGhpcy5hc3QubmV3U3RyaW5nTGl0ZXJhbCgpOy8vJE5PTi1OTFMtMSQKLQkJbGl0ZXJhbC5zZXRMaXRlcmFsVmFsdWUoIkhlbGxvIik7IC8vJE5PTi1OTFMtMSQKLQkJaW5maXhFeHByZXNzaW9uLnNldExlZnRPcGVyYW5kKGxpdGVyYWwpOwotCQlsaXRlcmFsID0gdGhpcy5hc3QubmV3U3RyaW5nTGl0ZXJhbCgpOy8vJE5PTi1OTFMtMSQKLQkJbGl0ZXJhbC5zZXRMaXRlcmFsVmFsdWUoIiBXb3JsZCIpOyAvLyROT04tTkxTLTEkCi0JCWluZml4RXhwcmVzc2lvbi5zZXRSaWdodE9wZXJhbmQobGl0ZXJhbCk7CQkKLQkJbGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld1N0cmluZ0xpdGVyYWwoKTsvLyROT04tTkxTLTEkCi0JCWxpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKCIhIik7IC8vJE5PTi1OTFMtMSQKLQkJaW5maXhFeHByZXNzaW9uLmV4dGVuZGVkT3BlcmFuZHMoKS5hZGQobGl0ZXJhbCk7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld051bWJlckxpdGVyYWwoKTsvLyROT04tTkxTLTEkCi0JCW51bWJlckxpdGVyYWwuc2V0VG9rZW4oIjQiKTsgLy8kTk9OLU5MUy0xJAotCQlpbmZpeEV4cHJlc3Npb24uZXh0ZW5kZWRPcGVyYW5kcygpLmFkZChudW1iZXJMaXRlcmFsKTsKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIGluZml4RXhwcmVzc2lvbi5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgZXhwcmVzc2lvbikpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb24sICJcIkhlbGxvXCIgKyBcIiBXb3JsZFwiICsgXCIhXCIgKyA0Iiwgc291cmNlKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTnVtYmVyTGl0ZXJhbCA9PT4gSW5maXhFeHByZXNzaW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAxMDUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDEwNSIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIGV4cHJlc3Npb24gPSBnZXRBU1ROb2RlVG9Db21wYXJlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgZXhwcmVzc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJSW5maXhFeHByZXNzaW9uIGluZml4RXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld0luZml4RXhwcmVzc2lvbigpOwotCQlpbmZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLlBMVVMpOwotCQlOdW1iZXJMaXRlcmFsIGxpdGVyYWwgPSB0aGlzLmFzdC5uZXdOdW1iZXJMaXRlcmFsKCk7Ly8kTk9OLU5MUy0xJAotCQlsaXRlcmFsLnNldFRva2VuKCI0Iik7IC8vJE5PTi1OTFMtMSQKLQkJaW5maXhFeHByZXNzaW9uLnNldExlZnRPcGVyYW5kKGxpdGVyYWwpOwotCQlsaXRlcmFsID0gdGhpcy5hc3QubmV3TnVtYmVyTGl0ZXJhbCgpOy8vJE5PTi1OTFMtMSQKLQkJbGl0ZXJhbC5zZXRUb2tlbigiNSIpOyAvLyROT04tTkxTLTEkCi0JCWluZml4RXhwcmVzc2lvbi5zZXRSaWdodE9wZXJhbmQobGl0ZXJhbCk7CQkKLQkJbGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld051bWJlckxpdGVyYWwoKTsvLyROT04tTkxTLTEkCi0JCWxpdGVyYWwuc2V0VG9rZW4oIjYiKTsgLy8kTk9OLU5MUy0xJAotCQlpbmZpeEV4cHJlc3Npb24uZXh0ZW5kZWRPcGVyYW5kcygpLmFkZChsaXRlcmFsKTsKLQkJbGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld051bWJlckxpdGVyYWwoKTsvLyROT04tTkxTLTEkCi0JCWxpdGVyYWwuc2V0VG9rZW4oIjQiKTsgLy8kTk9OLU5MUy0xJAotCQlpbmZpeEV4cHJlc3Npb24uZXh0ZW5kZWRPcGVyYW5kcygpLmFkZChsaXRlcmFsKTsKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIGluZml4RXhwcmVzc2lvbi5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgZXhwcmVzc2lvbikpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb24sICI0ICsgNSArIDYgKyA0Iiwgc291cmNlKTsvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIE51bWJlckxpdGVyYWwgPT0+IEluZml4RXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTA2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxMDYiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBleHByZXNzaW9uID0gZ2V0QVNUTm9kZVRvQ29tcGFyZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIGV4cHJlc3Npb24pOyAvLyROT04tTkxTLTEkCi0JCUluZml4RXhwcmVzc2lvbiBpbmZpeEV4cHJlc3Npb24gPSB0aGlzLmFzdC5uZXdJbmZpeEV4cHJlc3Npb24oKTsKLQkJaW5maXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5NSU5VUyk7Ci0JCU51bWJlckxpdGVyYWwgbGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld051bWJlckxpdGVyYWwoKTsvLyROT04tTkxTLTEkCi0JCWxpdGVyYWwuc2V0VG9rZW4oIjQiKTsgLy8kTk9OLU5MUy0xJAotCQlpbmZpeEV4cHJlc3Npb24uc2V0TGVmdE9wZXJhbmQobGl0ZXJhbCk7Ci0JCWxpdGVyYWwgPSB0aGlzLmFzdC5uZXdOdW1iZXJMaXRlcmFsKCk7Ly8kTk9OLU5MUy0xJAotCQlsaXRlcmFsLnNldFRva2VuKCI1Iik7IC8vJE5PTi1OTFMtMSQKLQkJaW5maXhFeHByZXNzaW9uLnNldFJpZ2h0T3BlcmFuZChsaXRlcmFsKTsJCQotCQkKLQkJSW5maXhFeHByZXNzaW9uIGluZml4RXhwcmVzc2lvbjIgPSB0aGlzLmFzdC5uZXdJbmZpeEV4cHJlc3Npb24oKTsKLQkJaW5maXhFeHByZXNzaW9uMi5zZXRPcGVyYXRvcihJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUExVUyk7Ci0JCWluZml4RXhwcmVzc2lvbjIuc2V0TGVmdE9wZXJhbmQoaW5maXhFeHByZXNzaW9uKTsKLQkJbGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld051bWJlckxpdGVyYWwoKTsvLyROT04tTkxTLTEkCi0JCWxpdGVyYWwuc2V0VG9rZW4oIjYiKTsgLy8kTk9OLU5MUy0xJAotCQlpbmZpeEV4cHJlc3Npb24yLnNldFJpZ2h0T3BlcmFuZChsaXRlcmFsKTsJCQotCQkKLQkJSW5maXhFeHByZXNzaW9uIGluZml4RXhwcmVzc2lvbjMgPSB0aGlzLmFzdC5uZXdJbmZpeEV4cHJlc3Npb24oKTsKLQkJaW5maXhFeHByZXNzaW9uMy5zZXRPcGVyYXRvcihJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUExVUyk7Ci0JCWluZml4RXhwcmVzc2lvbjMuc2V0TGVmdE9wZXJhbmQoaW5maXhFeHByZXNzaW9uMik7Ci0JCWxpdGVyYWwgPSB0aGlzLmFzdC5uZXdOdW1iZXJMaXRlcmFsKCk7Ly8kTk9OLU5MUy0xJAotCQlsaXRlcmFsLnNldFRva2VuKCI0Iik7IC8vJE5PTi1OTFMtMSQKLQkJaW5maXhFeHByZXNzaW9uMy5zZXRSaWdodE9wZXJhbmQobGl0ZXJhbCk7CQkKLQkJCi0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBpbmZpeEV4cHJlc3Npb24zLnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBleHByZXNzaW9uKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UoZXhwcmVzc2lvbiwgIjQgLSA1ICsgNiArIDQiLCBzb3VyY2UpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOdW1iZXJMaXRlcmFsID09PiBJbmZpeEV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDEwNygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTA3IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgZXhwcmVzc2lvbiA9IGdldEFTVE5vZGVUb0NvbXBhcmUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0KTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBleHByZXNzaW9uKTsgLy8kTk9OLU5MUy0xJAotCQlJbmZpeEV4cHJlc3Npb24gaW5maXhFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3SW5maXhFeHByZXNzaW9uKCk7Ci0JCWluZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTUlOVVMpOwotCQlOdW1iZXJMaXRlcmFsIGxpdGVyYWwgPSB0aGlzLmFzdC5uZXdOdW1iZXJMaXRlcmFsKCk7Ly8kTk9OLU5MUy0xJAotCQlsaXRlcmFsLnNldFRva2VuKCI0Iik7IC8vJE5PTi1OTFMtMSQKLQkJaW5maXhFeHByZXNzaW9uLnNldExlZnRPcGVyYW5kKGxpdGVyYWwpOwotCQlsaXRlcmFsID0gdGhpcy5hc3QubmV3TnVtYmVyTGl0ZXJhbCgpOy8vJE5PTi1OTFMtMSQKLQkJbGl0ZXJhbC5zZXRUb2tlbigiNSIpOyAvLyROT04tTkxTLTEkCi0JCWluZml4RXhwcmVzc2lvbi5zZXRSaWdodE9wZXJhbmQobGl0ZXJhbCk7CQkKLQkJbGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld051bWJlckxpdGVyYWwoKTsvLyROT04tTkxTLTEkCi0JCWxpdGVyYWwuc2V0VG9rZW4oIjYiKTsgLy8kTk9OLU5MUy0xJAotCQlpbmZpeEV4cHJlc3Npb24uZXh0ZW5kZWRPcGVyYW5kcygpLmFkZChsaXRlcmFsKTsKLQkJbGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld051bWJlckxpdGVyYWwoKTsvLyROT04tTkxTLTEkCi0JCWxpdGVyYWwuc2V0VG9rZW4oIjQiKTsgLy8kTk9OLU5MUy0xJAotCQlpbmZpeEV4cHJlc3Npb24uZXh0ZW5kZWRPcGVyYW5kcygpLmFkZChsaXRlcmFsKTsKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIGluZml4RXhwcmVzc2lvbi5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgZXhwcmVzc2lvbikpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb24sICI0IC0gNSAtIDYgLSA0Iiwgc291cmNlKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTnVtYmVyTGl0ZXJhbCA9PT4gSW5maXhFeHByZXNzaW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAxMDgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDEwOCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIGV4cHJlc3Npb24gPSBnZXRBU1ROb2RlVG9Db21wYXJlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgZXhwcmVzc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJSW5maXhFeHByZXNzaW9uIGluZml4RXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld0luZml4RXhwcmVzc2lvbigpOwotCQlpbmZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLlBMVVMpOwotCQlTdHJpbmdMaXRlcmFsIHN0cmluZ0xpdGVyYWwgPSB0aGlzLmFzdC5uZXdTdHJpbmdMaXRlcmFsKCk7Ly8kTk9OLU5MUy0xJAotCQlzdHJpbmdMaXRlcmFsLnNldExpdGVyYWxWYWx1ZSgiNCIpOyAvLyROT04tTkxTLTEkCi0JCWluZml4RXhwcmVzc2lvbi5zZXRMZWZ0T3BlcmFuZChzdHJpbmdMaXRlcmFsKTsKLQkJTnVtYmVyTGl0ZXJhbCBsaXRlcmFsID0gdGhpcy5hc3QubmV3TnVtYmVyTGl0ZXJhbCgpOy8vJE5PTi1OTFMtMSQKLQkJbGl0ZXJhbC5zZXRUb2tlbigiNSIpOyAvLyROT04tTkxTLTEkCi0JCWluZml4RXhwcmVzc2lvbi5zZXRSaWdodE9wZXJhbmQobGl0ZXJhbCk7CQkKLQkJbGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld051bWJlckxpdGVyYWwoKTsvLyROT04tTkxTLTEkCi0JCWxpdGVyYWwuc2V0VG9rZW4oIjYiKTsgLy8kTk9OLU5MUy0xJAotCQlpbmZpeEV4cHJlc3Npb24uZXh0ZW5kZWRPcGVyYW5kcygpLmFkZChsaXRlcmFsKTsKLQkJbGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld051bWJlckxpdGVyYWwoKTsvLyROT04tTkxTLTEkCi0JCWxpdGVyYWwuc2V0VG9rZW4oIjQiKTsgLy8kTk9OLU5MUy0xJAotCQlpbmZpeEV4cHJlc3Npb24uZXh0ZW5kZWRPcGVyYW5kcygpLmFkZChsaXRlcmFsKTsKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIGluZml4RXhwcmVzc2lvbi5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgZXhwcmVzc2lvbikpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb24sICJcIjRcIiArIDUgKyA2ICsgNCIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBOdW1iZXJMaXRlcmFsID09PiBJbmZpeEV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDEwOSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTA5IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgZXhwcmVzc2lvbiA9IGdldEFTVE5vZGVUb0NvbXBhcmUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0KTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBleHByZXNzaW9uKTsgLy8kTk9OLU5MUy0xJAotCQlJbmZpeEV4cHJlc3Npb24gaW5maXhFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3SW5maXhFeHByZXNzaW9uKCk7Ci0JCWluZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTUlOVVMpOwotCQlTdHJpbmdMaXRlcmFsIHN0cmluZ0xpdGVyYWwgPSB0aGlzLmFzdC5uZXdTdHJpbmdMaXRlcmFsKCk7Ly8kTk9OLU5MUy0xJAotCQlzdHJpbmdMaXRlcmFsLnNldExpdGVyYWxWYWx1ZSgiNCIpOyAvLyROT04tTkxTLTEkCi0JCWluZml4RXhwcmVzc2lvbi5zZXRMZWZ0T3BlcmFuZChzdHJpbmdMaXRlcmFsKTsKLQkJTnVtYmVyTGl0ZXJhbCBsaXRlcmFsID0gdGhpcy5hc3QubmV3TnVtYmVyTGl0ZXJhbCgpOy8vJE5PTi1OTFMtMSQKLQkJbGl0ZXJhbC5zZXRUb2tlbigiNSIpOyAvLyROT04tTkxTLTEkCi0JCWluZml4RXhwcmVzc2lvbi5zZXRSaWdodE9wZXJhbmQobGl0ZXJhbCk7CQkKLQkJCi0JCUluZml4RXhwcmVzc2lvbiBpbmZpeEV4cHJlc3Npb24yID0gdGhpcy5hc3QubmV3SW5maXhFeHByZXNzaW9uKCk7Ci0JCWluZml4RXhwcmVzc2lvbjIuc2V0T3BlcmF0b3IoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLlBMVVMpOwotCQlpbmZpeEV4cHJlc3Npb24yLnNldExlZnRPcGVyYW5kKGluZml4RXhwcmVzc2lvbik7Ci0JCWxpdGVyYWwgPSB0aGlzLmFzdC5uZXdOdW1iZXJMaXRlcmFsKCk7Ly8kTk9OLU5MUy0xJAotCQlsaXRlcmFsLnNldFRva2VuKCI2Iik7IC8vJE5PTi1OTFMtMSQKLQkJaW5maXhFeHByZXNzaW9uMi5zZXRSaWdodE9wZXJhbmQobGl0ZXJhbCk7CQkKLQkJCi0JCUluZml4RXhwcmVzc2lvbiBpbmZpeEV4cHJlc3Npb24zID0gdGhpcy5hc3QubmV3SW5maXhFeHByZXNzaW9uKCk7Ci0JCWluZml4RXhwcmVzc2lvbjMuc2V0T3BlcmF0b3IoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLlBMVVMpOwotCQlpbmZpeEV4cHJlc3Npb24zLnNldExlZnRPcGVyYW5kKGluZml4RXhwcmVzc2lvbjIpOwotCQlsaXRlcmFsID0gdGhpcy5hc3QubmV3TnVtYmVyTGl0ZXJhbCgpOy8vJE5PTi1OTFMtMSQKLQkJbGl0ZXJhbC5zZXRUb2tlbigiNCIpOyAvLyROT04tTkxTLTEkCi0JCWluZml4RXhwcmVzc2lvbjMuc2V0UmlnaHRPcGVyYW5kKGxpdGVyYWwpOwkJCi0JCQotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgaW5maXhFeHByZXNzaW9uMy5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgZXhwcmVzc2lvbikpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb24sICJcIjRcIiAtIDUgKyA2ICsgNCIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVyblN0YXRlbWVudCA9PT4gUmV0dXJuU3RhdGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAxMTAoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDExMCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJUmV0dXJuU3RhdGVtZW50IHJldHVyblN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld1JldHVyblN0YXRlbWVudCgpOwotCQlOdW1iZXJMaXRlcmFsIGxpdGVyYWwgPSB0aGlzLmFzdC5uZXdOdW1iZXJMaXRlcmFsKCk7Ci0JCWxpdGVyYWwuc2V0VG9rZW4oIjIiKTsvLyROT04tTkxTLTEkCi0JCXJldHVyblN0YXRlbWVudC5zZXRFeHByZXNzaW9uKGxpdGVyYWwpOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgcmV0dXJuU3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgInJldHVybiAyOyIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVyblN0YXRlbWVudCA9PT4gUmV0dXJuU3RhdGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAxMTEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDExMSIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJUmV0dXJuU3RhdGVtZW50IHJldHVyblN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld1JldHVyblN0YXRlbWVudCgpOwotCQlOdW1iZXJMaXRlcmFsIGxpdGVyYWwgPSB0aGlzLmFzdC5uZXdOdW1iZXJMaXRlcmFsKCk7Ci0JCWxpdGVyYWwuc2V0VG9rZW4oIjIiKTsvLyROT04tTkxTLTEkCi0JCXJldHVyblN0YXRlbWVudC5zZXRFeHByZXNzaW9uKGxpdGVyYWwpOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgcmV0dXJuU3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgInJldHVybiAyXFx1MDAzQiIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgPT0+IFN5bmNocm9uaXplZFN0YXRlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTEyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxMTIiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCVN5bmNocm9uaXplZFN0YXRlbWVudCBzeW5jaHJvbml6ZWRTdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdTeW5jaHJvbml6ZWRTdGF0ZW1lbnQoKTsKLQkJc3luY2hyb25pemVkU3RhdGVtZW50LnNldEV4cHJlc3Npb24odGhpcy5hc3QubmV3VGhpc0V4cHJlc3Npb24oKSk7Ci0JCXN5bmNocm9uaXplZFN0YXRlbWVudC5zZXRCb2R5KHRoaXMuYXN0Lm5ld0Jsb2NrKCkpOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3luY2hyb25pemVkU3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCVN0cmluZyBleHBlY3RlZFNvdXJjZSA9ICJzeW5jaHJvbml6ZWQodGhpcykge1xuIiArLy8kTk9OLU5MUy0xJAotCQkJICIJCX0iOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgZXhwZWN0ZWRTb3VyY2UsIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogVHJ5U3RhdGVtZW50ID09PiBUcnlTdGF0ZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDExMygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTEzIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlUcnlTdGF0ZW1lbnQgdHJ5U3RhdGVtZW50ID0gdGhpcy5hc3QubmV3VHJ5U3RhdGVtZW50KCk7Ci0JCXRyeVN0YXRlbWVudC5zZXRCb2R5KHRoaXMuYXN0Lm5ld0Jsb2NrKCkpOwotCQl0cnlTdGF0ZW1lbnQuc2V0RmluYWxseSh0aGlzLmFzdC5uZXdCbG9jaygpKTsKLQkJQ2F0Y2hDbGF1c2UgY2F0Y2hCbG9jayA9IHRoaXMuYXN0Lm5ld0NhdGNoQ2xhdXNlKCk7Ci0JCWNhdGNoQmxvY2suc2V0Qm9keSh0aGlzLmFzdC5uZXdCbG9jaygpKTsKLQkJU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBleGNlcHRpb25WYXJpYWJsZSA9IHRoaXMuYXN0Lm5ld1NpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24oKTsKLQkJZXhjZXB0aW9uVmFyaWFibGUuc2V0TW9kaWZpZXJzKE1vZGlmaWVyLk5PTkUpOwotCQlleGNlcHRpb25WYXJpYWJsZS5zZXROYW1lKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImUiKSk7Ly8kTk9OLU5MUy0xJAotCQlleGNlcHRpb25WYXJpYWJsZS5zZXRUeXBlKHRoaXMuYXN0Lm5ld1NpbXBsZVR5cGUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiRXhjZXB0aW9uIikpKTsvLyROT04tTkxTLTEkCi0JCWNhdGNoQmxvY2suc2V0RXhjZXB0aW9uKGV4Y2VwdGlvblZhcmlhYmxlKTsKLQkJdHJ5U3RhdGVtZW50LmNhdGNoQ2xhdXNlcygpLmFkZChjYXRjaEJsb2NrKTsKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIHRyeVN0YXRlbWVudC5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgbm9kZSkpOwkJLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZXhwZWN0ZWRTb3VyY2UgPSAidHJ5IHtcbiIgKy8vJE5PTi1OTFMtMSQKLQkJCSAiCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7XG4iICsvLyROT04tTkxTLTEkCi0JCQkgIgkJfSBmaW5hbGx5IHtcbiIgKy8vJE5PTi1OTFMtMSQKLQkJCSAiCQl9IjsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsIGV4cGVjdGVkU291cmNlLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIFRyeVN0YXRlbWVudCA9PT4gVHJ5U3RhdGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAxMTQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDExNCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJVHJ5U3RhdGVtZW50IHRyeVN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld1RyeVN0YXRlbWVudCgpOwotCQl0cnlTdGF0ZW1lbnQuc2V0Qm9keSh0aGlzLmFzdC5uZXdCbG9jaygpKTsKLQkJQ2F0Y2hDbGF1c2UgY2F0Y2hCbG9jayA9IHRoaXMuYXN0Lm5ld0NhdGNoQ2xhdXNlKCk7Ci0JCWNhdGNoQmxvY2suc2V0Qm9keSh0aGlzLmFzdC5uZXdCbG9jaygpKTsKLQkJU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBleGNlcHRpb25WYXJpYWJsZSA9IHRoaXMuYXN0Lm5ld1NpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24oKTsKLQkJZXhjZXB0aW9uVmFyaWFibGUuc2V0TW9kaWZpZXJzKE1vZGlmaWVyLk5PTkUpOwotCQlleGNlcHRpb25WYXJpYWJsZS5zZXROYW1lKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImUiKSk7Ly8kTk9OLU5MUy0xJAotCQlleGNlcHRpb25WYXJpYWJsZS5zZXRUeXBlKHRoaXMuYXN0Lm5ld1NpbXBsZVR5cGUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiRXhjZXB0aW9uIikpKTsvLyROT04tTkxTLTEkCi0JCWNhdGNoQmxvY2suc2V0RXhjZXB0aW9uKGV4Y2VwdGlvblZhcmlhYmxlKTsKLQkJdHJ5U3RhdGVtZW50LmNhdGNoQ2xhdXNlcygpLmFkZChjYXRjaEJsb2NrKTsKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIHRyeVN0YXRlbWVudC5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgbm9kZSkpOwkJLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZXhwZWN0ZWRTb3VyY2UgPSAidHJ5IHtcbiIgKy8vJE5PTi1OTFMtMSQKLQkJCSAiCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7XG4iICsvLyROT04tTkxTLTEkCi0JCQkgIgkJfSI7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCBleHBlY3RlZFNvdXJjZSwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBUcnlTdGF0ZW1lbnQgPT0+IFRyeVN0YXRlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTE1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxMTUiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCVRyeVN0YXRlbWVudCB0cnlTdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdUcnlTdGF0ZW1lbnQoKTsKLQkJQmxvY2sgYmxvY2sgPSB0aGlzLmFzdC5uZXdCbG9jaygpOwotCQlSZXR1cm5TdGF0ZW1lbnQgcmV0dXJuU3RhdGVtZW50ID0gdGhpcy5hc3QubmV3UmV0dXJuU3RhdGVtZW50KCk7Ci0JCU51bWJlckxpdGVyYWwgbGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld051bWJlckxpdGVyYWwoKTsKLQkJbGl0ZXJhbC5zZXRUb2tlbigiMiIpOy8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuU3RhdGVtZW50LnNldEV4cHJlc3Npb24obGl0ZXJhbCk7Ci0JCWJsb2NrLnN0YXRlbWVudHMoKS5hZGQocmV0dXJuU3RhdGVtZW50KTsKLQkJdHJ5U3RhdGVtZW50LnNldEJvZHkoYmxvY2spOwotCQlDYXRjaENsYXVzZSBjYXRjaEJsb2NrID0gdGhpcy5hc3QubmV3Q2F0Y2hDbGF1c2UoKTsKLQkJY2F0Y2hCbG9jay5zZXRCb2R5KHRoaXMuYXN0Lm5ld0Jsb2NrKCkpOwotCQlTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIGV4Y2VwdGlvblZhcmlhYmxlID0gdGhpcy5hc3QubmV3U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbigpOwotCQlleGNlcHRpb25WYXJpYWJsZS5zZXRNb2RpZmllcnMoTW9kaWZpZXIuTk9ORSk7Ci0JCWV4Y2VwdGlvblZhcmlhYmxlLnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiZSIpKTsvLyROT04tTkxTLTEkCi0JCWV4Y2VwdGlvblZhcmlhYmxlLnNldFR5cGUodGhpcy5hc3QubmV3U2ltcGxlVHlwZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJFeGNlcHRpb24iKSkpOy8vJE5PTi1OTFMtMSQKLQkJY2F0Y2hCbG9jay5zZXRFeGNlcHRpb24oZXhjZXB0aW9uVmFyaWFibGUpOwotCQl0cnlTdGF0ZW1lbnQuY2F0Y2hDbGF1c2VzKCkuYWRkKGNhdGNoQmxvY2spOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgdHJ5U3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCVN0cmluZyBleHBlY3RlZFNvdXJjZSA9ICJ0cnkge1xuIiArLy8kTk9OLU5MUy0xJAotCQkJICIJCQlyZXR1cm4gMjtcbiIgKy8vJE5PTi1OTFMtMSQKLQkJCSAiCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7XG4iICsvLyROT04tTkxTLTEkCi0JCQkgIgkJfSI7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCBleHBlY3RlZFNvdXJjZSwgc291cmNlKTsKLQl9Ci0JCQotCS8qKgotCSAqIFRocm93U3RhdGVtZW50ID09PiBUaHJvd1N0YXRlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTE2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxMTYiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCVRocm93U3RhdGVtZW50IHRocm93U3RhdGVtZW50ID0gdGhpcy5hc3QubmV3VGhyb3dTdGF0ZW1lbnQoKTsKLQkJdGhyb3dTdGF0ZW1lbnQuc2V0RXhwcmVzc2lvbih0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJlIikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCB0aHJvd1N0YXRlbWVudC5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgbm9kZSkpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJ0aHJvdyBlICAgXFx1MDAzQiIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRocm93U3RhdGVtZW50ID09PiBUaHJvd1N0YXRlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTE3KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxMTciLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCVRocm93U3RhdGVtZW50IHRocm93U3RhdGVtZW50ID0gdGhpcy5hc3QubmV3VGhyb3dTdGF0ZW1lbnQoKTsKLQkJdGhyb3dTdGF0ZW1lbnQuc2V0RXhwcmVzc2lvbih0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJlIikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCB0aHJvd1N0YXRlbWVudC5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgbm9kZSkpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJ0aHJvdyBlIC8qIGNvbW1lbnQgaW4gdGhlIG1pZGRsZSBvZiBhIHRocm93ICovICBcXHUwMDNCIiwgc291cmNlKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhyb3dTdGF0ZW1lbnQgPT0+IFRocm93U3RhdGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAxMTgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDExOCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJVGhyb3dTdGF0ZW1lbnQgdGhyb3dTdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdUaHJvd1N0YXRlbWVudCgpOwotCQl0aHJvd1N0YXRlbWVudC5zZXRFeHByZXNzaW9uKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIHRocm93U3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgInRocm93IGUgLyogY29tbWVudCBpbiB0aGUgbWlkZGxlIG9mIGEgdGhyb3cgKi8gIFxcdTAwM0IiLCBzb3VyY2UpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBJZlN0YXRlbWVudCA9PT4gSWZTdGF0ZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDExOSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTE5IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlJZlN0YXRlbWVudCBpZlN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld0lmU3RhdGVtZW50KCk7Ci0JCWlmU3RhdGVtZW50LnNldEV4cHJlc3Npb24odGhpcy5hc3QubmV3Qm9vbGVhbkxpdGVyYWwodHJ1ZSkpOwotCQlpZlN0YXRlbWVudC5zZXRUaGVuU3RhdGVtZW50KHRoaXMuYXN0Lm5ld0VtcHR5U3RhdGVtZW50KCkpOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgaWZTdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiaWYgKHRydWUpXFx1MDAzQiIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIElmU3RhdGVtZW50ID09PiBJZlN0YXRlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTIwKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxMjAiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCUlmU3RhdGVtZW50IGlmU3RhdGVtZW50ID0gdGhpcy5hc3QubmV3SWZTdGF0ZW1lbnQoKTsKLQkJaWZTdGF0ZW1lbnQuc2V0RXhwcmVzc2lvbih0aGlzLmFzdC5uZXdCb29sZWFuTGl0ZXJhbCh0cnVlKSk7Ci0JCWlmU3RhdGVtZW50LnNldFRoZW5TdGF0ZW1lbnQodGhpcy5hc3QubmV3RW1wdHlTdGF0ZW1lbnQoKSk7Ci0JCWlmU3RhdGVtZW50LnNldEVsc2VTdGF0ZW1lbnQodGhpcy5hc3QubmV3RW1wdHlTdGF0ZW1lbnQoKSk7Ci0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBpZlN0YXRlbWVudC5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgbm9kZSkpOwkJLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZXhwZWN0ZWRTb3VyY2UgPSAiaWYgKHRydWUpXFx1MDAzQlxuIiArLy8kTk9OLU5MUy0xJAotCQkJICJcdFx0ZWxzZSA7IjsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsIGV4cGVjdGVkU291cmNlLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIElmU3RhdGVtZW50ID09PiBJZlN0YXRlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTIxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxMjEiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCUlmU3RhdGVtZW50IGlmU3RhdGVtZW50ID0gdGhpcy5hc3QubmV3SWZTdGF0ZW1lbnQoKTsKLQkJaWZTdGF0ZW1lbnQuc2V0RXhwcmVzc2lvbih0aGlzLmFzdC5uZXdCb29sZWFuTGl0ZXJhbCh0cnVlKSk7Ci0JCWlmU3RhdGVtZW50LnNldFRoZW5TdGF0ZW1lbnQodGhpcy5hc3QubmV3QmxvY2soKSk7Ci0JCWlmU3RhdGVtZW50LnNldEVsc2VTdGF0ZW1lbnQodGhpcy5hc3QubmV3RW1wdHlTdGF0ZW1lbnQoKSk7Ci0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBpZlN0YXRlbWVudC5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgbm9kZSkpOwkJLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZXhwZWN0ZWRTb3VyY2UgPSAiaWYgKHRydWUpIHt9XG4iICsvLyROT04tTkxTLTEkCi0JCQkgIgkJZWxzZSA7IjsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsIGV4cGVjdGVkU291cmNlLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIElmU3RhdGVtZW50ID09PiBJZlN0YXRlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTIyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxMjIiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCUlmU3RhdGVtZW50IGlmU3RhdGVtZW50ID0gdGhpcy5hc3QubmV3SWZTdGF0ZW1lbnQoKTsKLQkJaWZTdGF0ZW1lbnQuc2V0RXhwcmVzc2lvbih0aGlzLmFzdC5uZXdCb29sZWFuTGl0ZXJhbCh0cnVlKSk7Ci0JCVJldHVyblN0YXRlbWVudCByZXR1cm5TdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdSZXR1cm5TdGF0ZW1lbnQoKTsKLQkJTnVtYmVyTGl0ZXJhbCBsaXRlcmFsID0gdGhpcy5hc3QubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQlsaXRlcmFsLnNldFRva2VuKCIyIik7Ly8kTk9OLU5MUy0xJAotCQlyZXR1cm5TdGF0ZW1lbnQuc2V0RXhwcmVzc2lvbihsaXRlcmFsKTsKLQkJaWZTdGF0ZW1lbnQuc2V0VGhlblN0YXRlbWVudChyZXR1cm5TdGF0ZW1lbnQpOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgaWZTdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiaWYgKHRydWUpIHJldHVybiAyXFx1MDAzQiIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIElmU3RhdGVtZW50ID09PiBJZlN0YXRlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTIzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxMjMiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCUlmU3RhdGVtZW50IGlmU3RhdGVtZW50ID0gdGhpcy5hc3QubmV3SWZTdGF0ZW1lbnQoKTsKLQkJaWZTdGF0ZW1lbnQuc2V0RXhwcmVzc2lvbih0aGlzLmFzdC5uZXdCb29sZWFuTGl0ZXJhbCh0cnVlKSk7Ci0JCVJldHVyblN0YXRlbWVudCByZXR1cm5TdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdSZXR1cm5TdGF0ZW1lbnQoKTsKLQkJTnVtYmVyTGl0ZXJhbCBsaXRlcmFsID0gdGhpcy5hc3QubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQlsaXRlcmFsLnNldFRva2VuKCIyIik7Ly8kTk9OLU5MUy0xJAotCQlyZXR1cm5TdGF0ZW1lbnQuc2V0RXhwcmVzc2lvbihsaXRlcmFsKTsKLQkJaWZTdGF0ZW1lbnQuc2V0VGhlblN0YXRlbWVudChyZXR1cm5TdGF0ZW1lbnQpOwotCQlyZXR1cm5TdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdSZXR1cm5TdGF0ZW1lbnQoKTsKLQkJbGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld051bWJlckxpdGVyYWwoKTsKLQkJbGl0ZXJhbC5zZXRUb2tlbigiMyIpOy8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuU3RhdGVtZW50LnNldEV4cHJlc3Npb24obGl0ZXJhbCk7CQkKLQkJaWZTdGF0ZW1lbnQuc2V0RWxzZVN0YXRlbWVudChyZXR1cm5TdGF0ZW1lbnQpOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgaWZTdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGV4cGVjdGVkU291cmNlID0gImlmICh0cnVlKSByZXR1cm4gMjtcbiIgKy8vJE5PTi1OTFMtMSQKLQkJCSAiCQllbHNlIHJldHVybiAzOyI7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCBleHBlY3RlZFNvdXJjZSwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBNdWx0aXBsZSBsb2NhbCBkZWNsYXJhdGlvbiA9PiBWYXJpYWJsZWRlY2xhcmF0aW9uU3RhdGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAxMjQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDEyNCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IGZyYWdtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCWZyYWdtZW50LnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgieCIpKTsvLyROT04tTkxTLTEkCi0JCU51bWJlckxpdGVyYWwgbGl0ZXJhbCA9IHRoaXMuYXN0Lm5ld051bWJlckxpdGVyYWwoKTsKLQkJbGl0ZXJhbC5zZXRUb2tlbigiMTAiKTsvLyROT04tTkxTLTEkCi0JCWZyYWdtZW50LnNldEluaXRpYWxpemVyKGxpdGVyYWwpOwotCQlmcmFnbWVudC5zZXRFeHRyYURpbWVuc2lvbnMoMCk7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgc3RhdGVtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudChmcmFnbWVudCk7Ci0JCWZyYWdtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCWZyYWdtZW50LnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgieiIpKTsvLyROT04tTkxTLTEkCi0JCWZyYWdtZW50LnNldEluaXRpYWxpemVyKHRoaXMuYXN0Lm5ld051bGxMaXRlcmFsKCkpOwotCQlmcmFnbWVudC5zZXRFeHRyYURpbWVuc2lvbnMoMSk7Ci0JCXN0YXRlbWVudC5mcmFnbWVudHMoKS5hZGQoZnJhZ21lbnQpOwotCQlmcmFnbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQlmcmFnbWVudC5zZXROYW1lKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImkiKSk7Ly8kTk9OLU5MUy0xJAotCQlmcmFnbWVudC5zZXRFeHRyYURpbWVuc2lvbnMoMCk7Ci0JCXN0YXRlbWVudC5mcmFnbWVudHMoKS5hZGQoZnJhZ21lbnQpOwotCQlmcmFnbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQlmcmFnbWVudC5zZXROYW1lKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImoiKSk7Ly8kTk9OLU5MUy0xJAotCQlmcmFnbWVudC5zZXRFeHRyYURpbWVuc2lvbnMoMik7Ci0JCXN0YXRlbWVudC5mcmFnbWVudHMoKS5hZGQoZnJhZ21lbnQpOwotCQlzdGF0ZW1lbnQuc2V0VHlwZSh0aGlzLmFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuSU5UKSk7Ci0JCXN0YXRlbWVudC5zZXRNb2RpZmllcnMoTW9kaWZpZXIuTk9ORSk7Ci0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBzdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50W10gZnJhZ21lbnRzID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudFtdKSgoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCkgbm9kZSkuZnJhZ21lbnRzKCkudG9BcnJheShuZXcgVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50WzRdKTsKLQkJYXNzZXJ0VHJ1ZSgiZnJhZ21lbnRzLmxlbmd0aCAhPSA0IiwgZnJhZ21lbnRzLmxlbmd0aCA9PSA0KTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGZyYWdtZW50c1swXSwgIng9IDEwIiwgc291cmNlKTsvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UoZnJhZ21lbnRzWzFdLCAieltdID0gbnVsbCIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGZyYWdtZW50c1syXSwgImkiLCBzb3VyY2UpOy8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShmcmFnbWVudHNbM10sICJqW11bXSIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJpbnQgeD0gMTAsIHpbXSA9IG51bGwsIGksIGpbXVtdOyIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE11bHRpcGxlIGxvY2FsIGRlY2xhcmF0aW9uID0+IFZhcmlhYmxlZGVjbGFyYXRpb25TdGF0ZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDEyNSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTI1IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgZnJhZ21lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJZnJhZ21lbnQuc2V0TmFtZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJ4IikpOy8vJE5PTi1OTFMtMSQKLQkJTnVtYmVyTGl0ZXJhbCBsaXRlcmFsID0gdGhpcy5hc3QubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQlsaXRlcmFsLnNldFRva2VuKCIxMCIpOy8vJE5PTi1OTFMtMSQKLQkJZnJhZ21lbnQuc2V0SW5pdGlhbGl6ZXIobGl0ZXJhbCk7Ci0JCWZyYWdtZW50LnNldEV4dHJhRGltZW5zaW9ucygwKTsKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KGZyYWdtZW50KTsKLQkJZnJhZ21lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJZnJhZ21lbnQuc2V0TmFtZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJ6IikpOy8vJE5PTi1OTFMtMSQKLQkJZnJhZ21lbnQuc2V0SW5pdGlhbGl6ZXIodGhpcy5hc3QubmV3TnVsbExpdGVyYWwoKSk7Ci0JCWZyYWdtZW50LnNldEV4dHJhRGltZW5zaW9ucygxKTsKLQkJc3RhdGVtZW50LmZyYWdtZW50cygpLmFkZChmcmFnbWVudCk7Ci0JCWZyYWdtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCWZyYWdtZW50LnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiaSIpKTsvLyROT04tTkxTLTEkCi0JCWZyYWdtZW50LnNldEV4dHJhRGltZW5zaW9ucygwKTsKLQkJc3RhdGVtZW50LmZyYWdtZW50cygpLmFkZChmcmFnbWVudCk7Ci0JCWZyYWdtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCWZyYWdtZW50LnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiaiIpKTsvLyROT04tTkxTLTEkCi0JCWZyYWdtZW50LnNldEV4dHJhRGltZW5zaW9ucygyKTsKLQkJc3RhdGVtZW50LmZyYWdtZW50cygpLmFkZChmcmFnbWVudCk7Ci0JCXN0YXRlbWVudC5zZXRUeXBlKHRoaXMuYXN0Lm5ld0FycmF5VHlwZSh0aGlzLmFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuSU5UKSwgMSkpOwotCQlzdGF0ZW1lbnQuc2V0TW9kaWZpZXJzKE1vZGlmaWVyLk5PTkUpOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImludFtdIHg9IDEwLCB6W10gPSBudWxsLCBpLCBqW11bXTsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudFtdIGZyYWdtZW50cyA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnRbXSkoKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIG5vZGUpLmZyYWdtZW50cygpLnRvQXJyYXkobmV3IFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudFs0XSk7Ci0JCWFzc2VydFRydWUoImZyYWdtZW50cy5sZW5ndGggIT0gNCIsIGZyYWdtZW50cy5sZW5ndGggPT0gNCk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShmcmFnbWVudHNbMF0sICJ4PSAxMCIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGZyYWdtZW50c1sxXSwgInpbXSA9IG51bGwiLCBzb3VyY2UpOy8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShmcmFnbWVudHNbMl0sICJpIiwgc291cmNlKTsvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UoZnJhZ21lbnRzWzNdLCAialtdW10iLCBzb3VyY2UpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBGb3JTdGF0ZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDEyNigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTI2IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlGb3JTdGF0ZW1lbnQgZm9yU3RhdGVtZW50ID0gdGhpcy5hc3QubmV3Rm9yU3RhdGVtZW50KCk7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgidGFiIikpOyAvLyROT04tTkxTLTEkCi0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXRJbml0aWFsaXplcih0aGlzLmFzdC5uZXdOdWxsTGl0ZXJhbCgpKTsvLyROT04tTkxTLTEkCi0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXRFeHRyYURpbWVuc2lvbnMoMSk7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uIHZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24odmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24uc2V0TW9kaWZpZXJzKE1vZGlmaWVyLk5PTkUpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbi5zZXRUeXBlKHRoaXMuYXN0Lm5ld0FycmF5VHlwZSh0aGlzLmFzdC5uZXdTaW1wbGVUeXBlKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoIlN0cmluZyIpKSwgMSkpOy8vJE5PTi1OTFMtMSQKLQkJZm9yU3RhdGVtZW50LmluaXRpYWxpemVycygpLmFkZCh2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbik7Ci0JCVByZWZpeEV4cHJlc3Npb24gcHJlZml4RXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld1ByZWZpeEV4cHJlc3Npb24oKTsKLQkJcHJlZml4RXhwcmVzc2lvbi5zZXRPcGVyYW5kKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImkiKSk7Ly8kTk9OLU5MUy0xJAotCQlwcmVmaXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKFByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3IuSU5DUkVNRU5UKTsKLQkJZm9yU3RhdGVtZW50LnVwZGF0ZXJzKCkuYWRkKHByZWZpeEV4cHJlc3Npb24pOwotCQlmb3JTdGF0ZW1lbnQuc2V0Qm9keSh0aGlzLmFzdC5uZXdCbG9jaygpKTsKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIGZvclN0YXRlbWVudC5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgbm9kZSkpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJmb3IgKFN0cmluZ1tdIHRhYltdID0gbnVsbDs7ICsraSkge30iLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UoKEFTVE5vZGUpICgoRm9yU3RhdGVtZW50KSBub2RlKS51cGRhdGVycygpLmdldCgwKSwgIisraSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZSgoQVNUTm9kZSkgKChGb3JTdGF0ZW1lbnQpIG5vZGUpLmluaXRpYWxpemVycygpLmdldCgwKSwgIlN0cmluZ1tdIHRhYltdID0gbnVsbCIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBGb3JTdGF0ZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDEyNygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTI3IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlGb3JTdGF0ZW1lbnQgZm9yU3RhdGVtZW50ID0gdGhpcy5hc3QubmV3Rm9yU3RhdGVtZW50KCk7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgidGFiIikpOyAvLyROT04tTkxTLTEkCi0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXRJbml0aWFsaXplcih0aGlzLmFzdC5uZXdOdWxsTGl0ZXJhbCgpKTsvLyROT04tTkxTLTEkCi0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXRFeHRyYURpbWVuc2lvbnMoMSk7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uIHZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24odmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24uc2V0TW9kaWZpZXJzKE1vZGlmaWVyLk5PTkUpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbi5zZXRUeXBlKHRoaXMuYXN0Lm5ld1NpbXBsZVR5cGUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiU3RyaW5nIikpKTsvLyROT04tTkxTLTEkCi0JCWZvclN0YXRlbWVudC5pbml0aWFsaXplcnMoKS5hZGQodmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24pOwotCQlQcmVmaXhFeHByZXNzaW9uIHByZWZpeEV4cHJlc3Npb24gPSB0aGlzLmFzdC5uZXdQcmVmaXhFeHByZXNzaW9uKCk7Ci0JCXByZWZpeEV4cHJlc3Npb24uc2V0T3BlcmFuZCh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJpIikpOy8vJE5PTi1OTFMtMSQKLQkJcHJlZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihQcmVmaXhFeHByZXNzaW9uLk9wZXJhdG9yLklOQ1JFTUVOVCk7Ci0JCWZvclN0YXRlbWVudC51cGRhdGVycygpLmFkZChwcmVmaXhFeHByZXNzaW9uKTsKLQkJZm9yU3RhdGVtZW50LnNldEJvZHkodGhpcy5hc3QubmV3QmxvY2soKSk7Ci0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBmb3JTdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiZm9yIChTdHJpbmcgdGFiW10gPSBudWxsOzsgKytpKSB7fSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZSgoQVNUTm9kZSkgKChGb3JTdGF0ZW1lbnQpIG5vZGUpLnVwZGF0ZXJzKCkuZ2V0KDApLCAiKytpIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKChBU1ROb2RlKSAoKEZvclN0YXRlbWVudCkgbm9kZSkuaW5pdGlhbGl6ZXJzKCkuZ2V0KDApLCAiU3RyaW5nIHRhYltdID0gbnVsbCIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBGb3JTdGF0ZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDEyOCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTI4IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlGb3JTdGF0ZW1lbnQgZm9yU3RhdGVtZW50ID0gdGhpcy5hc3QubmV3Rm9yU3RhdGVtZW50KCk7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgidGFiIikpOyAvLyROT04tTkxTLTEkCi0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXRJbml0aWFsaXplcih0aGlzLmFzdC5uZXdOdWxsTGl0ZXJhbCgpKTsvLyROT04tTkxTLTEkCi0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXRFeHRyYURpbWVuc2lvbnMoMSk7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uIHZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24odmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24uc2V0TW9kaWZpZXJzKE1vZGlmaWVyLk5PTkUpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbi5zZXRUeXBlKHRoaXMuYXN0Lm5ld1NpbXBsZVR5cGUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiU3RyaW5nIikpKTsvLyROT04tTkxTLTEkCi0JCWZvclN0YXRlbWVudC5pbml0aWFsaXplcnMoKS5hZGQodmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24pOwotCQlQb3N0Zml4RXhwcmVzc2lvbiBwb3N0Zml4RXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld1Bvc3RmaXhFeHByZXNzaW9uKCk7Ci0JCXBvc3RmaXhFeHByZXNzaW9uLnNldE9wZXJhbmQodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiaSIpKTsvLyROT04tTkxTLTEkCi0JCXBvc3RmaXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKFBvc3RmaXhFeHByZXNzaW9uLk9wZXJhdG9yLklOQ1JFTUVOVCk7Ci0JCWZvclN0YXRlbWVudC51cGRhdGVycygpLmFkZChwb3N0Zml4RXhwcmVzc2lvbik7Ci0JCWZvclN0YXRlbWVudC5zZXRCb2R5KHRoaXMuYXN0Lm5ld0Jsb2NrKCkpOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgZm9yU3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImZvciAoU3RyaW5nIHRhYltdID0gbnVsbDs7IGkrKy8qKi8pIHt9Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKChBU1ROb2RlKSAoKEZvclN0YXRlbWVudCkgbm9kZSkudXBkYXRlcnMoKS5nZXQoMCksICJpKysiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UoKEFTVE5vZGUpICgoRm9yU3RhdGVtZW50KSBub2RlKS5pbml0aWFsaXplcnMoKS5nZXQoMCksICJTdHJpbmcgdGFiW10gPSBudWxsIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEZpZWxkRGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDEyOSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTI5IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgbm9kZSBpcyBub3QgYSBGaWVsZERlY2xhcmF0aW9uIiwgbm9kZSBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBmcmFnID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgKChGaWVsZERlY2xhcmF0aW9uKSBub2RlKS5mcmFnbWVudHMoKS5nZXQoMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIGRlY2xhcmF0aW9uIiwgZnJhZy5nZXROYW1lKCkuaXNEZWNsYXJhdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgZnJhZ21lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJZnJhZ21lbnQuc2V0TmFtZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJpIikpOyAvLyROT04tTkxTLTEkCi0JCWZyYWdtZW50LnNldEV4dHJhRGltZW5zaW9ucygwKTsKLQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gdGhpcy5hc3QubmV3RmllbGREZWNsYXJhdGlvbihmcmFnbWVudCk7Ci0JCWZpZWxkRGVjbGFyYXRpb24uc2V0TW9kaWZpZXJzKE1vZGlmaWVyLk5PTkUpOwotCQlmaWVsZERlY2xhcmF0aW9uLnNldFR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLklOVCkpOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgZmllbGREZWNsYXJhdGlvbi5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgbm9kZSkpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJpbnQgaTsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogRmllbGREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTMwKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxMzAiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBub2RlIGlzIG5vdCBhIEZpZWxkRGVjbGFyYXRpb24iLCBub2RlIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IGZyYWdtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCWZyYWdtZW50LnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgieCIpKTsgLy8kTk9OLU5MUy0xJAotCQlOdW1iZXJMaXRlcmFsIGxpdGVyYWwgPSB0aGlzLmFzdC5uZXdOdW1iZXJMaXRlcmFsKCk7Ci0JCWxpdGVyYWwuc2V0VG9rZW4oIjEwIik7IC8vJE5PTi1OTFMtMSQKLQkJZnJhZ21lbnQuc2V0SW5pdGlhbGl6ZXIobGl0ZXJhbCk7Ci0JCWZyYWdtZW50LnNldEV4dHJhRGltZW5zaW9ucygwKTsKLQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gdGhpcy5hc3QubmV3RmllbGREZWNsYXJhdGlvbihmcmFnbWVudCk7Ci0JCWZpZWxkRGVjbGFyYXRpb24uc2V0TW9kaWZpZXJzKE1vZGlmaWVyLlBVQkxJQyk7Ci0JCWZpZWxkRGVjbGFyYXRpb24uc2V0VHlwZSh0aGlzLmFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuSU5UKSk7Ci0JCWZyYWdtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCWZyYWdtZW50LnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgieSIpKTsvLyROT04tTkxTLTEkCi0JCWZyYWdtZW50LnNldEV4dHJhRGltZW5zaW9ucygxKTsKLQkJZnJhZ21lbnQuc2V0SW5pdGlhbGl6ZXIodGhpcy5hc3QubmV3TnVsbExpdGVyYWwoKSk7Ci0JCWZpZWxkRGVjbGFyYXRpb24uZnJhZ21lbnRzKCkuYWRkKGZyYWdtZW50KTsKLQkJZnJhZ21lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJZnJhZ21lbnQuc2V0TmFtZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJpIikpOy8vJE5PTi1OTFMtMSQKLQkJZnJhZ21lbnQuc2V0RXh0cmFEaW1lbnNpb25zKDApOwotCQlmaWVsZERlY2xhcmF0aW9uLmZyYWdtZW50cygpLmFkZChmcmFnbWVudCk7Ci0JCWZyYWdtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCWZyYWdtZW50LnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiaiIpKTsvLyROT04tTkxTLTEkCi0JCWZyYWdtZW50LnNldEV4dHJhRGltZW5zaW9ucygyKTsKLQkJZmllbGREZWNsYXJhdGlvbi5mcmFnbWVudHMoKS5hZGQoZnJhZ21lbnQpOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgZmllbGREZWNsYXJhdGlvbi5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgbm9kZSkpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJwdWJsaWMgaW50IHg9IDEwLCB5W10gPSBudWxsLCBpLCBqW11bXTsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudFtdIGZyYWdtZW50cyA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnRbXSkoKEZpZWxkRGVjbGFyYXRpb24pIG5vZGUpLmZyYWdtZW50cygpLnRvQXJyYXkobmV3IFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudFs0XSk7Ci0JCWFzc2VydFRydWUoImZyYWdtZW50cy5sZW5ndGggIT0gNCIsIGZyYWdtZW50cy5sZW5ndGggPT0gNCk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShmcmFnbWVudHNbMF0sICJ4PSAxMCIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGZyYWdtZW50c1sxXSwgInlbXSA9IG51bGwiLCBzb3VyY2UpOy8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShmcmFnbWVudHNbMl0sICJpIiwgc291cmNlKTsvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UoZnJhZ21lbnRzWzNdLCAialtdW10iLCBzb3VyY2UpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBcmd1bWVudCB3aXRoIGZpbmFsIG1vZGlmaWVyCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAxMzEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDEzMSIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIG5vZGUgaXMgbm90IGEgTWV0aG9kRGVjbGFyYXRpb24iLCBub2RlIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhIGRlY2xhcmF0aW9uIiwgKChNZXRob2REZWNsYXJhdGlvbikgbm9kZSkuZ2V0TmFtZSgpLmlzRGVjbGFyYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJTGlzdCBwYXJhbWV0ZXJzID0gKChNZXRob2REZWNsYXJhdGlvbikgbm9kZSkucGFyYW1ldGVycygpOwotCQlhc3NlcnRUcnVlKCJQYXJhbWV0ZXJzLmxlbmd0aCAhPSAxIiwgcGFyYW1ldGVycy5zaXplKCkgPT0gMSk7CQkvLyROT04tTkxTLTEkCi0JCVNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gYXJnID0gKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pICgoTWV0aG9kRGVjbGFyYXRpb24pIG5vZGUpLnBhcmFtZXRlcnMoKS5nZXQoMCk7Ci0JCVNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gc2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiA9IHRoaXMuYXN0Lm5ld1NpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24oKTsKLQkJc2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbi5zZXRNb2RpZmllcnMoTW9kaWZpZXIuRklOQUwpOwotCQlzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiaSIpKTsgLy8kTk9OLU5MUy0xJAotCQlzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLnNldFR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLklOVCkpOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbi5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgYXJnKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgInZvaWQgZm9vKGZpbmFsIGludCBpKSB7fSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShhcmcsICJmaW5hbCBpbnQgaSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBqYXZhZG9jIGZvciBNZXRob2REZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTMyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxMzIiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBub2RlIGlzIG5vdCBhIE1ldGhvZERlY2xhcmF0aW9uIiwgbm9kZSBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlKYXZhZG9jIGFjdHVhbEphdmFkb2MgPSAoKE1ldGhvZERlY2xhcmF0aW9uKSBub2RlKS5nZXRKYXZhZG9jKCk7Ci0JCUphdmFkb2MgamF2YWRvYyA9IHRoaXMuYXN0Lm5ld0phdmFkb2MoKTsKLQkJamF2YWRvYy5zZXRDb21tZW50KCIvKiogSmF2YURvYyBDb21tZW50Ki8iKTsvLyROT04tTkxTLTEkKi8KLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIGphdmFkb2Muc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIGFjdHVhbEphdmFkb2MpKTsvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgIi8qKiBKYXZhRG9jIENvbW1lbnQqL1xuICB2b2lkIGZvbyhmaW5hbCBpbnQgaSkge30iLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UoYWN0dWFsSmF2YWRvYywgIi8qKiBKYXZhRG9jIENvbW1lbnQqLyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgamF2YWRvYyBmb3IgTWV0aG9kRGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDEzMygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTMzIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgbm9kZSBpcyBub3QgYSBNZXRob2REZWNsYXJhdGlvbiIsIG5vZGUgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJSmF2YWRvYyBhY3R1YWxKYXZhZG9jID0gKChNZXRob2REZWNsYXJhdGlvbikgbm9kZSkuZ2V0SmF2YWRvYygpOwotCQlhc3NlcnRUcnVlKCJKYXZhZG9jIG11c3QgYmUgbnVsbCIsIGFjdHVhbEphdmFkb2MgPT0gbnVsbCk7Ly8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJ2b2lkIGZvbyhmaW5hbCBpbnQgaSkge30iLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ2hlY2sgamF2YWRvYyBmb3IgTWV0aG9kRGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDEzNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTM0IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgbm9kZSBpcyBub3QgYSBNZXRob2REZWNsYXJhdGlvbiIsIG5vZGUgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJSmF2YWRvYyBhY3R1YWxKYXZhZG9jID0gKChNZXRob2REZWNsYXJhdGlvbikgbm9kZSkuZ2V0SmF2YWRvYygpOwotCQlhc3NlcnRUcnVlKCJKYXZhZG9jIG11c3QgYmUgbnVsbCIsIGFjdHVhbEphdmFkb2MgPT0gbnVsbCk7Ly8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJ2b2lkIGZvbyhmaW5hbCBpbnQgaSkge30iLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ2hlY2sgamF2YWRvYyBmb3IgRmllbGREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTM1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxMzUiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBub2RlIGlzIG5vdCBhIEZpZWxkRGVjbGFyYXRpb24iLCBub2RlIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJSmF2YWRvYyBhY3R1YWxKYXZhZG9jID0gKChGaWVsZERlY2xhcmF0aW9uKSBub2RlKS5nZXRKYXZhZG9jKCk7Ci0JCUphdmFkb2MgamF2YWRvYyA9IHRoaXMuYXN0Lm5ld0phdmFkb2MoKTsKLQkJamF2YWRvYy5zZXRDb21tZW50KCIvKiogSmF2YURvYyBDb21tZW50Ki8iKTsvLyROT04tTkxTLTEkKi8KLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIGphdmFkb2Muc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIGFjdHVhbEphdmFkb2MpKTsvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgIi8qKiBKYXZhRG9jIENvbW1lbnQqL1xuICBpbnQgaTsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ2hlY2sgamF2YWRvYyBmb3IgRmllbGREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTM2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxMzYiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBub2RlIGlzIG5vdCBhIEZpZWxkRGVjbGFyYXRpb24iLCBub2RlIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJSmF2YWRvYyBhY3R1YWxKYXZhZG9jID0gKChGaWVsZERlY2xhcmF0aW9uKSBub2RlKS5nZXRKYXZhZG9jKCk7Ci0JCWFzc2VydFRydWUoIkphdmFkb2MgbXVzdCBiZSBudWxsIiwgYWN0dWFsSmF2YWRvYyA9PSBudWxsKTsvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImludCBpOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBqYXZhZG9jIGZvciBGaWVsZERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAxMzcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDEzNyIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIG5vZGUgaXMgbm90IGEgRmllbGREZWNsYXJhdGlvbiIsIG5vZGUgaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlKYXZhZG9jIGFjdHVhbEphdmFkb2MgPSAoKEZpZWxkRGVjbGFyYXRpb24pIG5vZGUpLmdldEphdmFkb2MoKTsKLQkJYXNzZXJ0VHJ1ZSgiSmF2YWRvYyBtdXN0IGJlIG51bGwiLCBhY3R1YWxKYXZhZG9jID09IG51bGwpOy8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiaW50IGk7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENoZWNrIGphdmFkb2MgZm9yIFR5cGVEZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTM4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxMzgiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBub2RlIGlzIG5vdCBhIFR5cGVEZWNsYXJhdGlvbiIsIG5vZGUgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCUphdmFkb2MgYWN0dWFsSmF2YWRvYyA9ICgoVHlwZURlY2xhcmF0aW9uKSBub2RlKS5nZXRKYXZhZG9jKCk7Ci0JCWFzc2VydFRydWUoIkphdmFkb2MgbXVzdCBiZSBudWxsIiwgYWN0dWFsSmF2YWRvYyA9PSBudWxsKTsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBleHBlY3RlZENvbnRlbnRzID0gInB1YmxpYyBjbGFzcyBUZXN0IHtcbiIgKy8vJE5PTi1OTFMtMSQKLQkJCSIgIGludCBpO1xuIiAgKy8vJE5PTi1OTFMtMSQKLQkJCSJ9IjsvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgZXhwZWN0ZWRDb250ZW50cywgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENoZWNrIGphdmFkb2MgZm9yIFR5cGVEZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTM5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxMzkiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBub2RlIGlzIG5vdCBhIFR5cGVEZWNsYXJhdGlvbiIsIG5vZGUgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCUphdmFkb2MgYWN0dWFsSmF2YWRvYyA9ICgoVHlwZURlY2xhcmF0aW9uKSBub2RlKS5nZXRKYXZhZG9jKCk7Ci0JCWFzc2VydFRydWUoIkphdmFkb2MgbXVzdCBiZSBudWxsIiwgYWN0dWFsSmF2YWRvYyA9PSBudWxsKTsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBleHBlY3RlZENvbnRlbnRzID0gInB1YmxpYyBjbGFzcyBUZXN0IHtcbiIgKy8vJE5PTi1OTFMtMSQKLQkJCSIgIGludCBpO1xuIiAgKy8vJE5PTi1OTFMtMSQKLQkJCSJ9IjsvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgZXhwZWN0ZWRDb250ZW50cywgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENoZWNrIGphdmFkb2MgZm9yIFR5cGVEZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTQwKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxNDAiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBub2RlIGlzIG5vdCBhIFR5cGVEZWNsYXJhdGlvbiIsIG5vZGUgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCUphdmFkb2MgYWN0dWFsSmF2YWRvYyA9ICgoVHlwZURlY2xhcmF0aW9uKSBub2RlKS5nZXRKYXZhZG9jKCk7Ci0JCUphdmFkb2MgamF2YWRvYyA9IHRoaXMuYXN0Lm5ld0phdmFkb2MoKTsKLQkJamF2YWRvYy5zZXRDb21tZW50KCIvKiogSmF2YURvYyBDb21tZW50Ki8iKTsvLyROT04tTkxTLTEkKi8KLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIGphdmFkb2Muc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIGFjdHVhbEphdmFkb2MpKTsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBleHBlY3RlZENvbnRlbnRzID0gCi0JCQkgIi8qKiBKYXZhRG9jIENvbW1lbnQqL1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgVGVzdCB7XG4iICsvLyROT04tTkxTLTEkCi0JCQkiICBpbnQgaTtcbiIgICsvLyROT04tTkxTLTEkCi0JCQkifSI7Ly8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsIGV4cGVjdGVkQ29udGVudHMsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShhY3R1YWxKYXZhZG9jLCAiLyoqIEphdmFEb2MgQ29tbWVudCovIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENoZWNrIGphdmFkb2MgZm9yIE1lbWJlclR5cGVEZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTQxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxNDEiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBub2RlIGlzIG5vdCBhIFR5cGVEZWNsYXJhdGlvbiIsIG5vZGUgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCUphdmFkb2MgYWN0dWFsSmF2YWRvYyA9ICgoVHlwZURlY2xhcmF0aW9uKSBub2RlKS5nZXRKYXZhZG9jKCk7Ci0JCUphdmFkb2MgamF2YWRvYyA9IHRoaXMuYXN0Lm5ld0phdmFkb2MoKTsKLQkJamF2YWRvYy5zZXRDb21tZW50KCIvKiogSmF2YURvYyBDb21tZW50Ki8iKTsvLyROT04tTkxTLTEkKi8KLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIGphdmFkb2Muc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIGFjdHVhbEphdmFkb2MpKTsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBleHBlY3RlZENvbnRlbnRzID0gCi0JCQkgIi8qKiBKYXZhRG9jIENvbW1lbnQqL1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSAiICBjbGFzcyBCIHt9IjsvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgZXhwZWN0ZWRDb250ZW50cywgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGFjdHVhbEphdmFkb2MsICIvKiogSmF2YURvYyBDb21tZW50Ki8iLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ2hlY2sgamF2YWRvYyBmb3IgTWVtYmVyVHlwZURlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAxNDIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDE0MiIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIG5vZGUgaXMgbm90IGEgVHlwZURlY2xhcmF0aW9uIiwgbm9kZSBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJSmF2YWRvYyBhY3R1YWxKYXZhZG9jID0gKChUeXBlRGVjbGFyYXRpb24pIG5vZGUpLmdldEphdmFkb2MoKTsKLQkJYXNzZXJ0VHJ1ZSgiSmF2YWRvYyBtdXN0IGJlIG51bGwiLCBhY3R1YWxKYXZhZG9jID09IG51bGwpOy8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiY2xhc3MgQiB7fSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBqYXZhZG9jIGZvciBNZW1iZXJUeXBlRGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDE0MygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTQzIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgbm9kZSBpcyBub3QgYSBUeXBlRGVjbGFyYXRpb24iLCBub2RlIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlKYXZhZG9jIGFjdHVhbEphdmFkb2MgPSAoKFR5cGVEZWNsYXJhdGlvbikgbm9kZSkuZ2V0SmF2YWRvYygpOwotCQlhc3NlcnRUcnVlKCJKYXZhZG9jIG11c3QgYmUgbnVsbCIsIGFjdHVhbEphdmFkb2MgPT0gbnVsbCk7Ly8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJwdWJsaWMgc3RhdGljIGNsYXNzIEIge30iLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ2hlY2sgamF2YWRvYyBmb3IgTWVtYmVyVHlwZURlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAxNDQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDE0NCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIG5vZGUgaXMgbm90IGEgVHlwZURlY2xhcmF0aW9uIiwgbm9kZSBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJSmF2YWRvYyBhY3R1YWxKYXZhZG9jID0gKChUeXBlRGVjbGFyYXRpb24pIG5vZGUpLmdldEphdmFkb2MoKTsKLQkJYXNzZXJ0VHJ1ZSgiSmF2YWRvYyBtdXN0IGJlIG51bGwiLCBhY3R1YWxKYXZhZG9jID09IG51bGwpOy8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAicHVibGljIHN0YXRpYyBjbGFzcyBCIHt9Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENoZWNraW5nIGluaXRpYWxpemVycwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTQ1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxNDUiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgInt9Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENoZWNraW5nIGluaXRpYWxpemVycwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTQ2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxNDYiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgInN0YXRpYyB7fSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDaGVja2luZyBpbml0aWFsaXplcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDE0NygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTQ3IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlKYXZhZG9jIGFjdHVhbEphdmFkb2MgPSAoKEluaXRpYWxpemVyKSBub2RlKS5nZXRKYXZhZG9jKCk7Ci0JCWFzc2VydE5vdE51bGwoIkphdmFkb2MgY29tbWVudCBzaG91bGQgbm8gYmUgbnVsbCIsIGFjdHVhbEphdmFkb2MpOyAvLyROT04tTkxTLTEkCi0JCUphdmFkb2MgamF2YWRvYyA9IHRoaXMuYXN0Lm5ld0phdmFkb2MoKTsKLQkJamF2YWRvYy5zZXRDb21tZW50KCIvKiogSmF2YURvYyBDb21tZW50Ki8iKTsvLyROT04tTkxTLTEkKi8KLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIGphdmFkb2Muc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIGFjdHVhbEphdmFkb2MpKTsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBleHBlY3RlZENvbnRlbnRzID0gCi0JCQkgIi8qKiBKYXZhRG9jIENvbW1lbnQqL1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSAiICBzdGF0aWMge30iOy8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCBleHBlY3RlZENvbnRlbnRzLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UoYWN0dWFsSmF2YWRvYywgIi8qKiBKYXZhRG9jIENvbW1lbnQqLyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JfQotCi0JLyoqCi0JICogQ2hlY2tpbmcgaW5pdGlhbGl6ZXJzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAxNDgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDE0OCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJSmF2YWRvYyBhY3R1YWxKYXZhZG9jID0gKChJbml0aWFsaXplcikgbm9kZSkuZ2V0SmF2YWRvYygpOwotCQlhc3NlcnROb3ROdWxsKCJKYXZhZG9jIGNvbW1lbnQgc2hvdWxkIG5vdCBiZSBudWxsIiwgYWN0dWFsSmF2YWRvYyk7IC8vJE5PTi1OTFMtMSQKLQkJSmF2YWRvYyBqYXZhZG9jID0gdGhpcy5hc3QubmV3SmF2YWRvYygpOwotCQlqYXZhZG9jLnNldENvbW1lbnQoIi8qKiBKYXZhRG9jIENvbW1lbnQqLyIpOy8vJE5PTi1OTFMtMSQqLwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgamF2YWRvYy5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgYWN0dWFsSmF2YWRvYykpOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGV4cGVjdGVkQ29udGVudHMgPSAKLQkJCSAiLyoqIEphdmFEb2MgQ29tbWVudCovXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJICIgIHt9IjsvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgZXhwZWN0ZWRDb250ZW50cywgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGFjdHVhbEphdmFkb2MsICIvKiogSmF2YURvYyBDb21tZW50Ki8iLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCQotCX0KLQotCS8qKgotCSAqIENoZWNraW5nIGluaXRpYWxpemVycwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTQ5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxNDkiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCUphdmFkb2MgYWN0dWFsSmF2YWRvYyA9ICgoSW5pdGlhbGl6ZXIpIG5vZGUpLmdldEphdmFkb2MoKTsKLQkJYXNzZXJ0TnVsbCgiSmF2YWRvYyBjb21tZW50IHNob3VsZCBiZSBudWxsIiwgYWN0dWFsSmF2YWRvYyk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAie30iLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ2hlY2tpbmcgc3ludGF4IGVycm9yCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAxNTAoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDE1MCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgdW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIGNvbXBpbGF0aW9uIHVuaXQgaXMgbWFsZm9ybWVkIiwgIWlzTWFsZm9ybWVkKHVuaXQpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgcGFja2FnZSBkZWNsYXJhdGlvbiBpcyBtYWxmb3JtZWQiLCAhaXNNYWxmb3JtZWQodW5pdC5nZXRQYWNrYWdlKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlMaXN0IGltcG9ydHMgPSB1bml0LmltcG9ydHMoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIGltcG9ydHMgbGlzdCBzaXplIGlzIG5vdCBvbmUiLCBpbXBvcnRzLnNpemUoKSA9PSAxKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgZmlyc3QgaW1wb3J0IGlzIG5vdCBtYWxmb3JtZWQiLCBpc01hbGZvcm1lZCgoQVNUTm9kZSkgaW1wb3J0cy5nZXQoMCkpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENoZWNraW5nIHN5bnRheCBlcnJvcgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTUxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxNTEiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBjb21waWxhdGlvbiB1bml0IGlzIG1hbGZvcm1lZCIsICFpc01hbGZvcm1lZChyZXN1bHQpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENoZWNraW5nIHN5bnRheCBlcnJvcgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTUyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxNTIiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBjb21waWxhdGlvbiB1bml0IGlzIG1hbGZvcm1lZCIsICFpc01hbGZvcm1lZChyZXN1bHQpKTsgLy8kTk9OLU5MUy0xJAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHR5cGUgaXMgbWFsZm9ybWVkIiwgIWlzTWFsZm9ybWVkKG5vZGUpKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBmaWVsZCBpcyBtYWxmb3JtZWQiLCAhaXNNYWxmb3JtZWQobm9kZSkpOyAvLyROT04tTkxTLTEkCi0JCW5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMSk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIG1ldGhvZCBpcyBub3QgbWFsZm9ybWVkIiwgaXNNYWxmb3JtZWQobm9kZSkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ2hlY2tpbmcgc3ludGF4IGVycm9yCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAxNTMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDE1MyIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIGNvbXBpbGF0aW9uIHVuaXQgaXMgbWFsZm9ybWVkIiwgIWlzTWFsZm9ybWVkKHJlc3VsdCkpOyAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgbWV0aG9kIGlzIG5vdCBtYWxmb3JtZWQiLCBpc01hbGZvcm1lZChub2RlKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDaGVja2luZyBiaW5kaW5nIG9mIHBhY2thZ2UgZGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDE1NCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTU0IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSByZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJSUJpbmRpbmcgYmluZGluZyA9IGNvbXBpbGF0aW9uVW5pdC5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIlRoZSBwYWNrYWdlIGJpbmRpbmcgaXMgbnVsbCIsIGJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBiaW5kaW5nIGlzIG5vdCBhIHBhY2thZ2UgYmluZGluZyIsIGJpbmRpbmcgaW5zdGFuY2VvZiBJUGFja2FnZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCUlQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZyA9IChJUGFja2FnZUJpbmRpbmcpIGJpbmRpbmc7Ci0JCWFzc2VydEVxdWFscygiVGhlIHBhY2thZ2UgbmFtZSBpcyBpbmNvcnJlY3QiLCAidGVzdDAxNTQiLCBwYWNrYWdlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJSUJpbmRpbmcgYmluZGluZzIgPSBjb21waWxhdGlvblVuaXQuZ2V0UGFja2FnZSgpLmdldE5hbWUoKS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnRUcnVlKCJUaGUgcGFja2FnZSBiaW5kaW5nIGlzIG5vdCBjYW5vbmljYWwiLCBiaW5kaW5nID09IGJpbmRpbmcyKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENoZWNraW5nIGFyZ3VtZW50cyBwb3NpdGlvbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDE1NSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTU1IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSByZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7ICAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHJlc3VsdCBpcyBub3QgYSBtZXRob2QgZGVjbGFyYXRpb24iLCBub2RlIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pOyAgLy8kTk9OLU5MUy0xJAotCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsID0gKE1ldGhvZERlY2xhcmF0aW9uKSBub2RlOwotCQlMaXN0IHBhcmFtZXRlcnMgPSBtZXRob2REZWNsLnBhcmFtZXRlcnMoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHBhcmFtZXRlcnMgc2l6ZSBpcyBkaWZmZXJlbnQgZnJvbSAyIiwgcGFyYW1ldGVycy5zaXplKCkgPT0gMik7ICAvLyROT04tTkxTLTEkCi0JCU9iamVjdCBwYXJhbWV0ZXIgPSBwYXJhbWV0ZXJzLmdldCgwKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHBhcmFtZXRlciBpcyBub3QgYSBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIiwgcGFyYW1ldGVyIGluc3RhbmNlb2YgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbik7ICAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UoKEFTVE5vZGUpIHBhcmFtZXRlciwgImludCBpIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlwYXJhbWV0ZXIgPSBwYXJhbWV0ZXJzLmdldCgxKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHBhcmFtZXRlciBpcyBub3QgYSBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIiwgcGFyYW1ldGVyIGluc3RhbmNlb2YgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbik7ICAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UoKEFTVE5vZGUpIHBhcmFtZXRlciwgImZpbmFsIGJvb2xlYW4gYiIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tpbmcgYXJndW1lbnRzIHBvc2l0aW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTU2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxNTYiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgIC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDApOwotCQlhc3NlcnRUcnVlKCJUaGUgcmVzdWx0IGlzIG5vdCBhIG1ldGhvZCBkZWNsYXJhdGlvbiIsIG5vZGUgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbik7ICAvLyROT04tTkxTLTEkCi0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2wgPSAoTWV0aG9kRGVjbGFyYXRpb24pIG5vZGU7Ci0JCUxpc3QgcGFyYW1ldGVycyA9IG1ldGhvZERlY2wucGFyYW1ldGVycygpOwotCQlhc3NlcnRUcnVlKCJUaGUgcGFyYW1ldGVycyBzaXplIGlzIGRpZmZlcmVudCBmcm9tIDEiLCBwYXJhbWV0ZXJzLnNpemUoKSA9PSAxKTsgIC8vJE5PTi1OTFMtMSQKLQkJT2JqZWN0IHBhcmFtZXRlciA9IHBhcmFtZXRlcnMuZ2V0KDApOwotCQlhc3NlcnRUcnVlKCJUaGUgcGFyYW1ldGVyIGlzIG5vdCBhIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24iLCBwYXJhbWV0ZXIgaW5zdGFuY2VvZiBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZSgoQVNUTm9kZSkgcGFyYW1ldGVyLCAiaW50IGkiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCUJsb2NrIGJsb2NrID0gbWV0aG9kRGVjbC5nZXRCb2R5KCk7Ci0JCUxpc3Qgc3RhdGVtZW50cyA9IGJsb2NrLnN0YXRlbWVudHMoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHN0YXRlbWVudHMgc2l6ZSBpcyBkaWZmZXJlbnQgZnJvbSAyIiwgc3RhdGVtZW50cy5zaXplKCkgPT0gMik7ICAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgc3RhdGVtZW50ID0gKEFTVE5vZGUpIHN0YXRlbWVudHMuZ2V0KDApOwotCQlhc3NlcnRUcnVlKCJUaGUgc3RhdGVtZW50c1swXSBpcyBhIHBvc3RmaXhFeHByZXNzaW9uIHN0YXRlbWVudCIsIHN0YXRlbWVudCBpbnN0YW5jZW9mIEV4cHJlc3Npb25TdGF0ZW1lbnQpOyAgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENoZWNrIGNhbm9uaWMgYmluZGluZyBmb3IgZmllbGRzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAxNTcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICIiLCAiVGVzdDAxNTcuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSByZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJTGlzdCB0eXBlcyA9IGNvbXBpbGF0aW9uVW5pdC50eXBlcygpOwotCQlhc3NlcnRUcnVlKCJUaGUgdHlwZXMgbGlzdCBpcyBlbXB0eSIsIHR5cGVzLnNpemUoKSAhPSAwKTsgLy8kTk9OLU5MUy0xJAotCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgdHlwZXMuZ2V0KDApOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0eXBlRGVjbGFyYXRpb24ucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiVHlwZSBiaW5kaW5nIGlzIG51bGwiLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHR5cGUgYmluZGluZyBpcyBjYW5vbmljYWwiLCB0eXBlQmluZGluZyA9PSB0eXBlRGVjbGFyYXRpb24ucmVzb2x2ZUJpbmRpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJTGlzdCBib2R5RGVjbGFyYXRpb25zID0gdHlwZURlY2xhcmF0aW9uLmJvZHlEZWNsYXJhdGlvbnMoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIGJvZHkgZGVjbGFyYXRpb24gbGlzdCBpcyBlbXB0eSIsIGJvZHlEZWNsYXJhdGlvbnMuc2l6ZSgpICE9IDApOyAvLyROT04tTkxTLTEkCi0JCUJvZHlEZWNsYXJhdGlvbiBib2R5RGVjbGFyYXRpb24gPSAoQm9keURlY2xhcmF0aW9uKSBib2R5RGVjbGFyYXRpb25zLmdldCgwKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhpcyBpcyBub3QgYSBmaWVsZCIsIGJvZHlEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IChGaWVsZERlY2xhcmF0aW9uKSBib2R5RGVjbGFyYXRpb247Ci0JCUxpc3QgdmFyaWFibGVGcmFnbWVudHMgPSBmaWVsZERlY2xhcmF0aW9uLmZyYWdtZW50cygpOwotCQlhc3NlcnRUcnVlKCJUaGUgZnJhZ21lbnQgbGlzdCBpcyBlbXB0eSIsIHZhcmlhYmxlRnJhZ21lbnRzLnNpemUoKSAhPSAwKTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgZnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSB2YXJpYWJsZUZyYWdtZW50cy5nZXQoMCk7Ci0JCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gZnJhZ21lbnQucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgidGhlIGZpZWxkIGJpbmRpbmcgaXMgbnVsbCIsIHZhcmlhYmxlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIGZpZWxkIGJpbmRpbmcgaXMgbm90IGNhbm9uaWNhbCIsIHZhcmlhYmxlQmluZGluZyA9PSBmcmFnbWVudC5yZXNvbHZlQmluZGluZygpKTsgLy8kTk9OLU5MUy0xJAotCQl0eXBlQmluZGluZyA9IHZhcmlhYmxlQmluZGluZy5nZXRUeXBlKCk7Ci0JCWFzc2VydFRydWUoIlRoZSB0eXBlIGlzIG5vdCBhbiBhcnJheSB0eXBlIiwgdHlwZUJpbmRpbmcuaXNBcnJheSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgdHlwZSBiaW5kaW5nIGZvciB0aGUgZmllbGQgaXMgbm90IGNhbm9uaWNhbCIsIHR5cGVCaW5kaW5nID09IHZhcmlhYmxlQmluZGluZy5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCVNpbXBsZU5hbWUgbmFtZSA9IGZyYWdtZW50LmdldE5hbWUoKTsKLQkJYXNzZXJ0VHJ1ZSgiaXMgYSBkZWNsYXJhdGlvbiIsIG5hbWUuaXNEZWNsYXJhdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQlJQmluZGluZyBiaW5kaW5nID0gbmFtZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgYmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyB0eXBlIiwgSUJpbmRpbmcuVkFSSUFCTEUsIGJpbmRpbmcuZ2V0S2luZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJub3QgYSBmaWVsZCIsICgoSVZhcmlhYmxlQmluZGluZykgYmluZGluZykuaXNGaWVsZCgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENoZWNrIGNhbm9uaWMgYmluZGluZ3MgZm9yIGZpZWxkcwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTU4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAiIiwgIlRlc3QwMTU4LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgcmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUxpc3QgdHlwZXMgPSBjb21waWxhdGlvblVuaXQudHlwZXMoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHR5cGVzIGxpc3QgaXMgZW1wdHkiLCB0eXBlcy5zaXplKCkgIT0gMCk7IC8vJE5PTi1OTFMtMSQKLQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pIHR5cGVzLmdldCgwKTsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdHlwZURlY2xhcmF0aW9uLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIlR5cGUgYmluZGluZyBpcyBudWxsIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSB0eXBlIGJpbmRpbmcgaXMgY2Fub25pY2FsIiwgdHlwZUJpbmRpbmcgPT0gdHlwZURlY2xhcmF0aW9uLnJlc29sdmVCaW5kaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCVNpbXBsZU5hbWUgc2ltcGxlTmFtZSA9IHR5cGVEZWNsYXJhdGlvbi5nZXROYW1lKCk7Ci0JCWFzc2VydFRydWUoImlzIGEgZGVjbGFyYXRpb24iLCBzaW1wbGVOYW1lLmlzRGVjbGFyYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJSUJpbmRpbmcgYmluZGluZyA9IHNpbXBsZU5hbWUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZyIsIGJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgdHlwZSIsIElCaW5kaW5nLlRZUEUsIGJpbmRpbmcuZ2V0S2luZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCBzaW1wbGVOYW1lLmdldElkZW50aWZpZXIoKSwgYmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCUxpc3QgYm9keURlY2xhcmF0aW9ucyA9IHR5cGVEZWNsYXJhdGlvbi5ib2R5RGVjbGFyYXRpb25zKCk7Ci0JCWFzc2VydFRydWUoIlRoZSBib2R5IGRlY2xhcmF0aW9uIGxpc3QgaXMgZW1wdHkiLCBib2R5RGVjbGFyYXRpb25zLnNpemUoKSAhPSAwKTsgLy8kTk9OLU5MUy0xJAotCQlCb2R5RGVjbGFyYXRpb24gYm9keURlY2xhcmF0aW9uID0gKEJvZHlEZWNsYXJhdGlvbikgYm9keURlY2xhcmF0aW9ucy5nZXQoMCk7Ci0JCWFzc2VydFRydWUoIlRoaXMgaXMgbm90IGEgZmllbGQiLCBib2R5RGVjbGFyYXRpb24gaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSAoRmllbGREZWNsYXJhdGlvbikgYm9keURlY2xhcmF0aW9uOwotCQlMaXN0IHZhcmlhYmxlRnJhZ21lbnRzID0gZmllbGREZWNsYXJhdGlvbi5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIGZyYWdtZW50IGxpc3QgaXMgZW1wdHkiLCB2YXJpYWJsZUZyYWdtZW50cy5zaXplKCkgIT0gMCk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IGZyYWdtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgdmFyaWFibGVGcmFnbWVudHMuZ2V0KDApOwotCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IGZyYWdtZW50LnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoInRoZSBmaWVsZCBiaW5kaW5nIGlzIG51bGwiLCB2YXJpYWJsZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBmaWVsZCBiaW5kaW5nIGlzIG5vdCBjYW5vbmljYWwiLCB2YXJpYWJsZUJpbmRpbmcgPT0gZnJhZ21lbnQucmVzb2x2ZUJpbmRpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nMiA9IHZhcmlhYmxlQmluZGluZy5nZXRUeXBlKCk7Ci0JCWFzc2VydFRydWUoIlRoZSB0eXBlIGlzIG5vdCBhbiBhcnJheSB0eXBlIiwgdHlwZUJpbmRpbmcyLmlzQXJyYXkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHR5cGUgYmluZGluZyBmb3IgdGhlIGZpZWxkIGlzIG5vdCBjYW5vbmljYWwiLCB0eXBlQmluZGluZzIgPT0gdmFyaWFibGVCaW5kaW5nLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHR5cGUgYmluZGluZyBmb3IgdGhlIGZpZWxkIGlzIG5vdCBjYW5vbmljYWwgd2l0aCB0aGUgZGVjbGFyYXRpb24gdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcgPT0gdHlwZUJpbmRpbmcyLmdldEVsZW1lbnRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIERlZmluZSBhbiBhbm9ueW1vdXMgdHlwZQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTU5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxNTkiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBDaGVjayBiaW5kaW5ncyBmb3IgbXVsdGlwbGUgZmllbGQgZGVjbGFyYXRpb25zCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAxNjAoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDE2MCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgcmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUxpc3QgdHlwZXMgPSBjb21waWxhdGlvblVuaXQudHlwZXMoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHR5cGVzIGxpc3QgaXMgZW1wdHkiLCB0eXBlcy5zaXplKCkgIT0gMCk7IC8vJE5PTi1OTFMtMSQKLQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pIHR5cGVzLmdldCgwKTsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdHlwZURlY2xhcmF0aW9uLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIlR5cGUgYmluZGluZyBpcyBudWxsIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSB0eXBlIGJpbmRpbmcgaXMgY2Fub25pY2FsIiwgdHlwZUJpbmRpbmcgPT0gdHlwZURlY2xhcmF0aW9uLnJlc29sdmVCaW5kaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCUxpc3QgYm9keURlY2xhcmF0aW9ucyA9IHR5cGVEZWNsYXJhdGlvbi5ib2R5RGVjbGFyYXRpb25zKCk7Ci0JCWFzc2VydFRydWUoIlRoZSBib2R5IGRlY2xhcmF0aW9uIGxpc3QgaXMgZW1wdHkiLCBib2R5RGVjbGFyYXRpb25zLnNpemUoKSAhPSAwKTsgLy8kTk9OLU5MUy0xJAotCQlCb2R5RGVjbGFyYXRpb24gYm9keURlY2xhcmF0aW9uID0gKEJvZHlEZWNsYXJhdGlvbikgYm9keURlY2xhcmF0aW9ucy5nZXQoMCk7Ci0JCWFzc2VydFRydWUoIlRoaXMgaXMgbm90IGEgZmllbGQiLCBib2R5RGVjbGFyYXRpb24gaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSAoRmllbGREZWNsYXJhdGlvbikgYm9keURlY2xhcmF0aW9uOwotCQlMaXN0IHZhcmlhYmxlRnJhZ21lbnRzID0gZmllbGREZWNsYXJhdGlvbi5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIGZyYWdtZW50IGxpc3Qgc2l6ZSBpcyBub3QgMiIsIHZhcmlhYmxlRnJhZ21lbnRzLnNpemUoKSA9PSAyKTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgZnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSB2YXJpYWJsZUZyYWdtZW50cy5nZXQoMCk7Ci0JCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nMSA9IGZyYWdtZW50LnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoInRoZSBmaWVsZCBiaW5kaW5nIGlzIG51bGwiLCB2YXJpYWJsZUJpbmRpbmcxKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgZmllbGQgYmluZGluZyBpcyBub3QgY2Fub25pY2FsIiwgdmFyaWFibGVCaW5kaW5nMSA9PSBmcmFnbWVudC5yZXNvbHZlQmluZGluZygpKTsgLy8kTk9OLU5MUy0xJAotCQlJVHlwZUJpbmRpbmcgdHlwZTEgPSB2YXJpYWJsZUJpbmRpbmcxLmdldFR5cGUoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiVGhlIHR5cGUgaXMgbnVsbCIsIHR5cGUxKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgZmllbGQgdHlwZSBpcyBjYW5vbmljYWwiLCB0eXBlMSA9PSB2YXJpYWJsZUJpbmRpbmcxLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHR5cGUgaXMgbm90IGFuIGFycmF5IHR5cGUiLHR5cGUxLmlzQXJyYXkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHR5cGUgZGltZW5zaW9uIGlzIDEiLCB0eXBlMS5nZXREaW1lbnNpb25zKCkgPT0gMSk7IC8vJE5PTi1OTFMtMSQKLQkJZnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSB2YXJpYWJsZUZyYWdtZW50cy5nZXQoMSk7Ci0JCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nMiA9IGZyYWdtZW50LnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoInRoZSBmaWVsZCBiaW5kaW5nIGlzIG51bGwiLCB2YXJpYWJsZUJpbmRpbmcyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgZmllbGQgYmluZGluZyBpcyBub3QgY2Fub25pY2FsIiwgdmFyaWFibGVCaW5kaW5nMiA9PSBmcmFnbWVudC5yZXNvbHZlQmluZGluZygpKTsgLy8kTk9OLU5MUy0xJAotCQlJVHlwZUJpbmRpbmcgdHlwZTIgPSB2YXJpYWJsZUJpbmRpbmcyLmdldFR5cGUoKTsKLQkJdHlwZTIgPSB2YXJpYWJsZUJpbmRpbmcyLmdldFR5cGUoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiVGhlIHR5cGUgaXMgbnVsbCIsIHR5cGUyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgZmllbGQgdHlwZSBpcyBjYW5vbmljYWwiLCB0eXBlMiA9PSB2YXJpYWJsZUJpbmRpbmcyLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHR5cGUgaXMgbm90IGFuIGFycmF5IHR5cGUiLHR5cGUyLmlzQXJyYXkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHR5cGUgZGltZW5zaW9uIGlzIDIiLCB0eXBlMi5nZXREaW1lbnNpb25zKCkgPT0gMik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiRWxlbWVudCB0eXBlIGlzIGNhbm9uaWNhbCIsIHR5cGUxLmdldEVsZW1lbnRUeXBlKCkgPT0gdHlwZTIuZ2V0RWxlbWVudFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgidHlwZTEuaWQgPCB0eXBlMi5pZCIsIHZhcmlhYmxlQmluZGluZzEuZ2V0VmFyaWFibGVJZCgpIDwgdmFyaWFibGVCaW5kaW5nMi5nZXRWYXJpYWJsZUlkKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCi0JfQotCQotCS8qKgotCSAqIENoZWNrIElUeXBlQmluZGluZyBBUElzOgotCSAqICAtIGdldE1vZGlmaWVycygpCi0JICogIC0gZ2V0RWxlbWVudFR5cGUoKSB3aGVuIGl0IGlzIG5vdCBhbiBhcnJheSB0eXBlCi0JICogIC0gZ2V0RGltZW5zaW9ucygpIHdoZW4gaXQgaXMgbm90IGFuIGFycmF5IHR5cGUKLQkgKiAgLSBnZXREZWNsYXJpbmdDbGFzcygpCi0JICogIC0gZ2V0RGVjbGFyaW5nTmFtZSgpCi0JICogIC0gZ2V0TmFtZSgpCi0JICogIC0gaXNOZXN0ZWQoKQotCSAqICAtIGlzQW5vbnltb3VzKCkKLQkgKiAgLSBpc0xvY2FsKCkKLQkgKiAgLSBpc01lbWJlcigpCi0JICogIC0gaXNBcnJheSgpCi0JICogIC0gZ2V0RGVjbGFyZWRNZXRob2RzKCkgPT4gcmV0dXJucyBiaW5kaW5nIGZvciBkZWZhdWx0IGNvbnN0cnVjdG9yCi0JICogIC0gaXNQcmltaXRpdmUoKQotCSAqICAtIGlzVG9wTGV2ZWwoKQotCSAqICAtIGdldFN1cGVyY2xhc3MoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTYxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxNjEiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlMaXN0IHR5cGVzID0gY29tcGlsYXRpb25Vbml0LnR5cGVzKCk7Ci0JCWFzc2VydFRydWUoIlRoZSB0eXBlcyBsaXN0IGlzIGVtcHR5IiwgdHlwZXMuc2l6ZSgpICE9IDApOyAvLyROT04tTkxTLTEkCi0JCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKSB0eXBlcy5nZXQoMCk7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHR5cGVEZWNsYXJhdGlvbi5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJUaGUgdHlwZSBiaW5kaW5nIHNob3VsZCBub3QgYmUgbnVsbCIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIlRoZSBtb2RpZmllciBpcyBQVUJMSUMiLCBNb2RpZmllci5QVUJMSUMsIHR5cGVCaW5kaW5nLmdldE1vZGlmaWVycygpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROdWxsKCJUaGVyZSBpcyBubyBlbGVtZW50IHR5cGUiLCB0eXBlQmluZGluZy5nZXRFbGVtZW50VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIlRoZXJlIGlzIG5vIGRpbWVuc2lvbiIsIDAsIHR5cGVCaW5kaW5nLmdldERpbWVuc2lvbnMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0TnVsbCgiVGhpcyBpcyBub3QgYSBtZW1iZXIgdHlwZSIsIHR5cGVCaW5kaW5nLmdldERlY2xhcmluZ0NsYXNzKCkpOyAvLyROT04tTkxTLTEkCi0JCUlNZXRob2RCaW5kaW5nW10gbWV0aG9kcyA9IHR5cGVCaW5kaW5nLmdldERlY2xhcmVkTWV0aG9kcygpOwotCQlhc3NlcnRFcXVhbHMoIkNvbnRhaW5zIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIiwgMSwgbWV0aG9kcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiVGhlIG5hbWUgaXMgbm90IFRlc3QiLCAiVGVzdCIsIHR5cGVCaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRUcnVlKCJBbiBhbm9ueW1vdXMgY2xhc3MiLCAhdHlwZUJpbmRpbmcuaXNBbm9ueW1vdXMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiQSBsb2NhbCBjbGFzcyIsICF0eXBlQmluZGluZy5pc0xvY2FsKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIkEgbmVzdGVkIGNsYXNzIiwgIXR5cGVCaW5kaW5nLmlzTmVzdGVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIkEgbWVtYmVyIGNsYXNzIiwgIXR5cGVCaW5kaW5nLmlzTWVtYmVyKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIkFuIGFycmF5IiwgIXR5cGVCaW5kaW5nLmlzQXJyYXkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgY2xhc3MiLCB0eXBlQmluZGluZy5pc0NsYXNzKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIkFuIGludGVyZmFjZSIsICF0eXBlQmluZGluZy5pc0ludGVyZmFjZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgZnJvbSBzb3VyY2UiLCB0eXBlQmluZGluZy5pc0Zyb21Tb3VyY2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiSXMgbmVzdGVkIiwgdHlwZUJpbmRpbmcuaXNUb3BMZXZlbCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJBIHByaW1pdGl2ZSB0eXBlIiwgIXR5cGVCaW5kaW5nLmlzUHJpbWl0aXZlKCkpOyAvLyROT04tTkxTLTEkCi0JCUlUeXBlQmluZGluZyBzdXBlcmNsYXNzID0gdHlwZUJpbmRpbmcuZ2V0U3VwZXJjbGFzcygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBzdXBlcmNsYXNzIiwgc3VwZXJjbGFzcyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiRnJvbSBzb3VyY2UiLCAhc3VwZXJjbGFzcy5pc0Zyb21Tb3VyY2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJSVR5cGVCaW5kaW5nIHN1cGVyc3VwZXJjbGFzcyA9IHN1cGVyY2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotCQlhc3NlcnROdWxsKCJObyBzdXBlcmNsYXNzIGZvciBqYXZhLmxhbmcuT2JqZWN0Iiwgc3VwZXJzdXBlcmNsYXNzKTsgLy8kTk9OLU5MUy0xJAotCQlJVHlwZUJpbmRpbmdbXSBpbnRlcmZhY2VzID0gdHlwZUJpbmRpbmcuZ2V0SW50ZXJmYWNlcygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBpbnRlcmZhY2VzIiwgaW50ZXJmYWNlcyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJNb3JlIHRoZW4gb25lIHN1cGVyIGludGVyZmFjZSIsIDEsIGludGVyZmFjZXMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJpcyBub3QgYW4gaW50ZXJmYWNlIiwgaW50ZXJmYWNlc1swXS5pc0ludGVyZmFjZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJGcm9tIHNvdXJjZSIsICFpbnRlcmZhY2VzWzBdLmlzRnJvbVNvdXJjZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIkhhcyBmaWVsZHMiLCAwLCB0eXBlQmluZGluZy5nZXREZWNsYXJlZEZpZWxkcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBJVHlwZUJpbmRpbmcgQVBJczoKLQkgKiAgLSBnZXRNb2RpZmllcnMoKQotCSAqICAtIGdldEVsZW1lbnRUeXBlKCkgd2hlbiBpdCBpcyBub3QgYW4gYXJyYXkgdHlwZQotCSAqICAtIGdldERpbWVuc2lvbnMoKSB3aGVuIGl0IGlzIG5vdCBhbiBhcnJheSB0eXBlCi0JICogIC0gZ2V0RGVjbGFyaW5nQ2xhc3MoKQotCSAqICAtIGdldERlY2xhcmluZ05hbWUoKQotCSAqICAtIGdldE5hbWUoKQotCSAqICAtIGlzTmVzdGVkKCkKLQkgKiAgLSBpc0Fub255bW91cygpCi0JICogIC0gaXNMb2NhbCgpCi0JICogIC0gaXNNZW1iZXIoKQotCSAqICAtIGlzQXJyYXkoKQotCSAqICAtIGdldERlY2xhcmVkTWV0aG9kcygpID0+IHJldHVybnMgYmluZGluZyBmb3IgZGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqICAtIGlzUHJpbWl0aXZlKCkKLQkgKiAgLSBpc1RvcExldmVsKCkKLQkgKiAgLSBnZXRTdXBlcmNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDE2MigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTYyIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSByZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJTGlzdCB0eXBlcyA9IGNvbXBpbGF0aW9uVW5pdC50eXBlcygpOwotCQlhc3NlcnRUcnVlKCJUaGUgdHlwZXMgbGlzdCBpcyBlbXB0eSIsIHR5cGVzLnNpemUoKSAhPSAwKTsgLy8kTk9OLU5MUy0xJAotCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgdHlwZXMuZ2V0KDApOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0eXBlRGVjbGFyYXRpb24ucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiVGhlIHR5cGUgYmluZGluZyBzaG91bGQgbm90IGJlIG51bGwiLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgbW9kaWZpZXIgaXMgUFVCTElDIiwgTW9kaWZpZXIuUFVCTElDLCB0eXBlQmluZGluZy5nZXRNb2RpZmllcnMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0TnVsbCgiVGhlcmUgaXMgbm8gZWxlbWVudCB0eXBlIiwgdHlwZUJpbmRpbmcuZ2V0RWxlbWVudFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJUaGVyZSBpcyBubyBkaW1lbnNpb24iLCAwLCB0eXBlQmluZGluZy5nZXREaW1lbnNpb25zKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE51bGwoIlRoaXMgaXMgbm90IGEgbWVtYmVyIHR5cGUiLCB0eXBlQmluZGluZy5nZXREZWNsYXJpbmdDbGFzcygpKTsgLy8kTk9OLU5MUy0xJAotCQlJTWV0aG9kQmluZGluZ1tdIG1ldGhvZHMgPSB0eXBlQmluZGluZy5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJDb250YWlucyBubyBtZXRob3MiLCAwLCBtZXRob2RzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgbmFtZSBpcyBub3QgVGVzdCIsICJUZXN0IiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydFRydWUoIkFuIGFub255bW91cyBjbGFzcyIsICF0eXBlQmluZGluZy5pc0Fub255bW91cygpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJBIGxvY2FsIGNsYXNzIiwgIXR5cGVCaW5kaW5nLmlzTG9jYWwoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiQSBuZXN0ZWQgY2xhc3MiLCAhdHlwZUJpbmRpbmcuaXNOZXN0ZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiQSBtZW1iZXIgY2xhc3MiLCAhdHlwZUJpbmRpbmcuaXNNZW1iZXIoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiQW4gYXJyYXkiLCAhdHlwZUJpbmRpbmcuaXNBcnJheSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJBIGNsYXNzIiwgIXR5cGVCaW5kaW5nLmlzQ2xhc3MoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGludGVyZmFjZSIsIHR5cGVCaW5kaW5nLmlzSW50ZXJmYWNlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBmcm9tIHNvdXJjZSIsIHR5cGVCaW5kaW5nLmlzRnJvbVNvdXJjZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJJcyBuZXN0ZWQiLCB0eXBlQmluZGluZy5pc1RvcExldmVsKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIkEgcHJpbWl0aXZlIHR5cGUiLCAhdHlwZUJpbmRpbmcuaXNQcmltaXRpdmUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJSVR5cGVCaW5kaW5nIHN1cGVyY2xhc3MgPSB0eXBlQmluZGluZy5nZXRTdXBlcmNsYXNzKCk7Ci0JCWFzc2VydE51bGwoIk5vIHN1cGVyY2xhc3MiLCBzdXBlcmNsYXNzKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIkhhcyBmaWVsZHMiLCAwLCB0eXBlQmluZGluZy5nZXREZWNsYXJlZEZpZWxkcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IGJpbmRpbmcgZm9yIGFub255bW91cyBkZWNsYXJhdGlvbjogbmV3IGphdmEubGFuZy5PYmplY3QoKSB7fQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTYzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxNjMiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlBU1ROb2RlIGV4cHJlc3Npb24gPSBnZXRBU1ROb2RlVG9Db21wYXJlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgZXhwcmVzc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGFub255bW91cyB0eXBlIGRlY2xhcmF0aW9uIiwgZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENsYXNzSW5zdGFuY2VDcmVhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIGFub255bW91c0NsYXNzID0gKENsYXNzSW5zdGFuY2VDcmVhdGlvbikgZXhwcmVzc2lvbjsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gYW5vbnltb3VzQ2xhc3MucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGFub255bW91cyBjbGFzcyIsIHR5cGVCaW5kaW5nLmlzQW5vbnltb3VzKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiVGhlIG1vZGlmaWVyIGlzIG5vdCBkZWZhdWx0IiwgTW9kaWZpZXIuTk9ORSwgdHlwZUJpbmRpbmcuZ2V0TW9kaWZpZXJzKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE51bGwoIlRoZXJlIGlzIG5vIGVsZW1lbnQgdHlwZSIsIHR5cGVCaW5kaW5nLmdldEVsZW1lbnRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiVGhlcmUgaXMgbm8gZGltZW5zaW9uIiwgMCwgdHlwZUJpbmRpbmcuZ2V0RGltZW5zaW9ucygpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJUaGlzIGlzIGEgbWVtYmVyIHR5cGUiLCB0eXBlQmluZGluZy5nZXREZWNsYXJpbmdDbGFzcygpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIlRoZSBuYW1lIGlzIG5vdCBlbXB0eSIsICIiLCB0eXBlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJSU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gdHlwZUJpbmRpbmcuZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0JCWFzc2VydEVxdWFscygiQ29udGFpbnMgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IiLCAxLCBtZXRob2RzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgbG9jYWwgY2xhc3MiLCB0eXBlQmluZGluZy5pc0xvY2FsKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhIG5lc3RlZCBjbGFzcyIsIHR5cGVCaW5kaW5nLmlzTmVzdGVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIkEgbWVtYmVyIGNsYXNzIiwgIXR5cGVCaW5kaW5nLmlzTWVtYmVyKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIkFuIGFycmF5IiwgIXR5cGVCaW5kaW5nLmlzQXJyYXkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgY2xhc3MiLCB0eXBlQmluZGluZy5pc0NsYXNzKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIkFuIGludGVyZmFjZSIsICF0eXBlQmluZGluZy5pc0ludGVyZmFjZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgZnJvbSBzb3VyY2UiLCB0eXBlQmluZGluZy5pc0Zyb21Tb3VyY2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiSXMgYSB0b3AgbGV2ZWwiLCAhdHlwZUJpbmRpbmcuaXNUb3BMZXZlbCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJBIHByaW1pdGl2ZSB0eXBlIiwgIXR5cGVCaW5kaW5nLmlzUHJpbWl0aXZlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgcXVhbGlmaWVkIG5hbWUiLCAiIiwgdHlwZUJpbmRpbmcuZ2V0UXVhbGlmaWVkTmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUlUeXBlQmluZGluZyBzdXBlcmNsYXNzID0gdHlwZUJpbmRpbmcuZ2V0U3VwZXJjbGFzcygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBzdXBlcmNsYXNzIiwgc3VwZXJjbGFzcyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJIYXMgZmllbGRzIiwgMCwgdHlwZUJpbmRpbmcuZ2V0RGVjbGFyZWRGaWVsZHMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIFRlc3QgYmluZGluZyBmb3IgbWVtYmVyIHR5cGUgZGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDE2NCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTY0IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhbiB0eXBlIGRlY2xhcmF0aW9uIiwgbm9kZSBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pIG5vZGU7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHR5cGVEZWNsYXJhdGlvbi5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIkFuIGFub255bW91cyBjbGFzcyIsICF0eXBlQmluZGluZy5pc0Fub255bW91cygpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIlRoZSBtb2RpZmllciBpcyBub3QgZGVmYXVsdCIsIE1vZGlmaWVyLlBSSVZBVEUsIHR5cGVCaW5kaW5nLmdldE1vZGlmaWVycygpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROdWxsKCJUaGVyZSBpcyBubyBlbGVtZW50IHR5cGUiLCB0eXBlQmluZGluZy5nZXRFbGVtZW50VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIlRoZXJlIGlzIG5vIGRpbWVuc2lvbiIsIDAsIHR5cGVCaW5kaW5nLmdldERpbWVuc2lvbnMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiVGhpcyBpcyBub3QgYSBtZW1iZXIgdHlwZSIsIHR5cGVCaW5kaW5nLmdldERlY2xhcmluZ0NsYXNzKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiVGhlIG5hbWUgaXMgbm90ICdCJyIsICJCIiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUlNZXRob2RCaW5kaW5nW10gbWV0aG9kcyA9IHR5cGVCaW5kaW5nLmdldERlY2xhcmVkTWV0aG9kcygpOwotCQlhc3NlcnRFcXVhbHMoIkNvbnRhaW5zIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIiwgMSwgbWV0aG9kcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIkEgbG9jYWwgY2xhc3MiLCAhdHlwZUJpbmRpbmcuaXNMb2NhbCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgYSBuZXN0ZWQgY2xhc3MiLCB0eXBlQmluZGluZy5pc05lc3RlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgYSBtZW1iZXIgY2xhc3MiLCB0eXBlQmluZGluZy5pc01lbWJlcigpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJBbiBhcnJheSIsICF0eXBlQmluZGluZy5pc0FycmF5KCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhIGNsYXNzIiwgdHlwZUJpbmRpbmcuaXNDbGFzcygpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJBbiBpbnRlcmZhY2UiLCAhdHlwZUJpbmRpbmcuaXNJbnRlcmZhY2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGZyb20gc291cmNlIiwgdHlwZUJpbmRpbmcuaXNGcm9tU291cmNlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIklzIGEgdG9wIGxldmVsIiwgIXR5cGVCaW5kaW5nLmlzVG9wTGV2ZWwoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiQSBwcmltaXRpdmUgdHlwZSIsICF0eXBlQmluZGluZy5pc1ByaW1pdGl2ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlJVHlwZUJpbmRpbmcgc3VwZXJjbGFzcyA9IHR5cGVCaW5kaW5nLmdldFN1cGVyY2xhc3MoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gc3VwZXJjbGFzcyIsIHN1cGVyY2xhc3MpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiSGFzIGZpZWxkcyIsIDAsIHR5cGVCaW5kaW5nLmdldERlY2xhcmVkRmllbGRzKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBUZXN0IGJpbmRpbmcgZm9yIGxvY2FsIHR5cGUgZGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDE2NSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTY1IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhbiB0eXBlIGRlY2xhcmF0aW9uIiwgbm9kZSBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvblN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IChUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIG5vZGU7Ci0JCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSBzdGF0ZW1lbnQuZ2V0VHlwZURlY2xhcmF0aW9uKCk7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHR5cGVEZWNsYXJhdGlvbi5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIkFuIGFub255bW91cyBjbGFzcyIsICF0eXBlQmluZGluZy5pc0Fub255bW91cygpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIlRoZSBtb2RpZmllciBpcyBub3QgZGVmYXVsdCIsIE1vZGlmaWVyLk5PTkUsIHR5cGVCaW5kaW5nLmdldE1vZGlmaWVycygpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROdWxsKCJUaGVyZSBpcyBubyBlbGVtZW50IHR5cGUiLCB0eXBlQmluZGluZy5nZXRFbGVtZW50VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIlRoZXJlIGlzIG5vIGRpbWVuc2lvbiIsIDAsIHR5cGVCaW5kaW5nLmdldERpbWVuc2lvbnMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiVGhpcyBpcyBub3QgYSBtZW1iZXIgdHlwZSIsIHR5cGVCaW5kaW5nLmdldERlY2xhcmluZ0NsYXNzKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiVGhlIG5hbWUgaXMgbm90ICdDJyIsICJDIiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUlNZXRob2RCaW5kaW5nW10gbWV0aG9kcyA9IHR5cGVCaW5kaW5nLmdldERlY2xhcmVkTWV0aG9kcygpOwotCQlhc3NlcnRFcXVhbHMoIkNvbnRhaW5zIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIiwgMSwgbWV0aG9kcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhIGxvY2FsIGNsYXNzIiwgdHlwZUJpbmRpbmcuaXNMb2NhbCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgYSBuZXN0ZWQgY2xhc3MiLCB0eXBlQmluZGluZy5pc05lc3RlZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJBIG1lbWJlciBjbGFzcyIsICF0eXBlQmluZGluZy5pc01lbWJlcigpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJBbiBhcnJheSIsICF0eXBlQmluZGluZy5pc0FycmF5KCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhIGNsYXNzIiwgdHlwZUJpbmRpbmcuaXNDbGFzcygpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJBbiBpbnRlcmZhY2UiLCAhdHlwZUJpbmRpbmcuaXNJbnRlcmZhY2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGZyb20gc291cmNlIiwgdHlwZUJpbmRpbmcuaXNGcm9tU291cmNlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIklzIGEgdG9wIGxldmVsIiwgIXR5cGVCaW5kaW5nLmlzVG9wTGV2ZWwoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiQSBwcmltaXRpdmUgdHlwZSIsICF0eXBlQmluZGluZy5pc1ByaW1pdGl2ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHF1YWxpZmllZCBuYW1lIiwgIiIsIHR5cGVCaW5kaW5nLmdldFF1YWxpZmllZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlJVHlwZUJpbmRpbmcgc3VwZXJjbGFzcyA9IHR5cGVCaW5kaW5nLmdldFN1cGVyY2xhc3MoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gc3VwZXJjbGFzcyIsIHN1cGVyY2xhc3MpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiSGFzIGZpZWxkcyIsIDAsIHR5cGVCaW5kaW5nLmdldERlY2xhcmVkRmllbGRzKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE11bHRpcGxlIGxvY2FsIGRlY2xhcmF0aW9uID0+IFZhcmlhYmxlZGVjbGFyYXRpb25TdGF0ZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDE2NigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTY2IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50Iiwgbm9kZSBpbnN0YW5jZW9mIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KSBub2RlOwotCQlMaXN0IGZyYWdtZW50cyA9IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuZnJhZ21lbnRzKCk7Ci0JCWFzc2VydFRydWUoIkZyYWdtZW50IGxpc3QgaXMgbm90IDQgIiwgZnJhZ21lbnRzLnNpemUoKSA9PSA0KTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgZnJhZ21lbnQxID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgZnJhZ21lbnRzLmdldCgwKTsKLQkJSVZhcmlhYmxlQmluZGluZyBiaW5kaW5nMSA9IGZyYWdtZW50MS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJCaW5kaW5nIGlzIG51bGwiLCBiaW5kaW5nMSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIGZvciBiaW5kaW5nMSIsICJ4IiwgYmluZGluZzEuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygid3JvbmcgbW9kaWZpZXIgZm9yIGJpbmRpbmcxIiwgMCwgYmluZGluZzEuZ2V0TW9kaWZpZXJzKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoImEgZmllbGQiLCAhYmluZGluZzEuaXNGaWVsZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROdWxsKCJkZWNsYXJpbmcgY2xhc3MgaXMgbm90IG51bGwiLCBiaW5kaW5nMS5nZXREZWNsYXJpbmdDbGFzcygpKTsgLy8kTk9OLU5MUy0xJAotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcxID0gYmluZGluZzEuZ2V0VHlwZSgpOwotCQlhc3NlcnROb3ROdWxsKCJ0eXBlQmluZGluZzEgaXMgbnVsbCIsIHR5cGVCaW5kaW5nMSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgidHlwZUJpbmRpbmcxIGlzIG5vdCBhIHByaW1pdGl2ZSB0eXBlIiwgdHlwZUJpbmRpbmcxLmlzUHJpbWl0aXZlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInR5cGVCaW5kaW5nMSBpcyBub3QgY2Fub25pY2FsIiwgdHlwZUJpbmRpbmcxID09IGJpbmRpbmcxLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IGZyYWdtZW50MiA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMSk7Ci0JCUlWYXJpYWJsZUJpbmRpbmcgYmluZGluZzIgPSBmcmFnbWVudDIucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiQmluZGluZyBpcyBudWxsIiwgYmluZGluZzIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSBmb3IgYmluZGluZzIiLCAieiIsIGJpbmRpbmcyLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIG1vZGlmaWVyIGZvciBiaW5kaW5nMiIsIDAsIGJpbmRpbmcyLmdldE1vZGlmaWVycygpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJhIGZpZWxkIiwgIWJpbmRpbmcyLmlzRmllbGQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0TnVsbCgiZGVjbGFyaW5nIGNsYXNzIGlzIG5vdCBudWxsIiwgYmluZGluZzIuZ2V0RGVjbGFyaW5nQ2xhc3MoKSk7IC8vJE5PTi1OTFMtMSQKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nMiA9IGJpbmRpbmcyLmdldFR5cGUoKTsKLQkJYXNzZXJ0Tm90TnVsbCgidHlwZUJpbmRpbmcyIGlzIG51bGwiLCB0eXBlQmluZGluZzIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInR5cGVCaW5kaW5nMiBpcyBub3QgYW4gYXJyYXkgdHlwZSIsIHR5cGVCaW5kaW5nMi5pc0FycmF5KCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInR5cGVCaW5kaW5nMiBpcyBub3QgY2Fub25pY2FsIiwgdHlwZUJpbmRpbmcyID09IGJpbmRpbmcyLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicHJpbWl0aXZlIHR5cGUgaXMgbm90IGNhbm9uaWNhbCIsIHR5cGVCaW5kaW5nMSA9PSB0eXBlQmluZGluZzIuZ2V0RWxlbWVudFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJkaW1lbnNpb24gaXMgMSIsIDEsIHR5cGVCaW5kaW5nMi5nZXREaW1lbnNpb25zKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiaXQgaXMgbm90IGludFtdIiwgImludFtdIiwgdHlwZUJpbmRpbmcyLmdldE5hbWUoKSk7CQkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBmcmFnbWVudDMgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcmFnbWVudHMuZ2V0KDIpOwotCQlJVmFyaWFibGVCaW5kaW5nIGJpbmRpbmczID0gZnJhZ21lbnQzLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIkJpbmRpbmcgaXMgbnVsbCIsIGJpbmRpbmczKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUgZm9yIGJpbmRpbmczIiwgImkiLCBiaW5kaW5nMy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBtb2RpZmllciBmb3IgYmluZGluZzMiLCAwLCBiaW5kaW5nMy5nZXRNb2RpZmllcnMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiYSBmaWVsZCIsICFiaW5kaW5nMy5pc0ZpZWxkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE51bGwoImRlY2xhcmluZyBjbGFzcyBpcyBub3QgbnVsbCIsIGJpbmRpbmczLmdldERlY2xhcmluZ0NsYXNzKCkpOyAvLyROT04tTkxTLTEkCi0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZzMgPSBiaW5kaW5nMy5nZXRUeXBlKCk7Ci0JCWFzc2VydE5vdE51bGwoInR5cGVCaW5kaW5nMyBpcyBudWxsIiwgdHlwZUJpbmRpbmczKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJ0eXBlQmluZGluZzMgaXMgbm90IGFuIHByaW1pdGl2ZSB0eXBlIiwgdHlwZUJpbmRpbmczLmlzUHJpbWl0aXZlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInR5cGVCaW5kaW5nMyBpcyBub3QgY2Fub25pY2FsIiwgdHlwZUJpbmRpbmczID09IGJpbmRpbmczLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicHJpbWl0aXZlIHR5cGUgaXMgbm90IGNhbm9uaWNhbCIsIHR5cGVCaW5kaW5nMSA9PSB0eXBlQmluZGluZzMpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiZGltZW5zaW9uIGlzIDAiLCAwLCB0eXBlQmluZGluZzMuZ2V0RGltZW5zaW9ucygpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIml0IGlzIG5vdCB0aGUgcHJpbWl0aXZlIHR5cGUgaW50IiwgImludCIsIHR5cGVCaW5kaW5nMy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IGZyYWdtZW50NCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMyk7Ci0JCUlWYXJpYWJsZUJpbmRpbmcgYmluZGluZzQgPSBmcmFnbWVudDQucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiQmluZGluZyBpcyBudWxsIiwgYmluZGluZzQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSBmb3IgYmluZGluZzQiLCAiaiIsIGJpbmRpbmc0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIG1vZGlmaWVyIGZvciBiaW5kaW5nNCIsIDAsIGJpbmRpbmc0LmdldE1vZGlmaWVycygpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJhIGZpZWxkIiwgIWJpbmRpbmc0LmlzRmllbGQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0TnVsbCgiZGVjbGFyaW5nIGNsYXNzIGlzIG5vdCBudWxsIiwgYmluZGluZzQuZ2V0RGVjbGFyaW5nQ2xhc3MoKSk7IC8vJE5PTi1OTFMtMSQKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nNCA9IGJpbmRpbmc0LmdldFR5cGUoKTsKLQkJYXNzZXJ0Tm90TnVsbCgidHlwZUJpbmRpbmc0IGlzIG51bGwiLCB0eXBlQmluZGluZzQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInR5cGVCaW5kaW5nNCBpcyBub3QgYW4gYXJyYXkgdHlwZSIsIHR5cGVCaW5kaW5nNC5pc0FycmF5KCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInR5cGVCaW5kaW5nNCBpcyBub3QgY2Fub25pY2FsIiwgdHlwZUJpbmRpbmc0ID09IGJpbmRpbmc0LmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicHJpbWl0aXZlIHR5cGUgaXMgbm90IGNhbm9uaWNhbCIsIHR5cGVCaW5kaW5nMSA9PSB0eXBlQmluZGluZzQuZ2V0RWxlbWVudFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJkaW1lbnNpb24gaXMgMiIsIDIsIHR5cGVCaW5kaW5nNC5nZXREaW1lbnNpb25zKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiaXQgaXMgbm90IGludFtdW10iLCAiaW50W11bXSIsIHR5cGVCaW5kaW5nNC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0VHJ1ZSgiaWRzIGluIHRoZSB3cm9uZyBvcmRlciIsIGJpbmRpbmcxLmdldFZhcmlhYmxlSWQoKSA8IGJpbmRpbmcyLmdldFZhcmlhYmxlSWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiaWRzIGluIHRoZSB3cm9uZyBvcmRlciIsIGJpbmRpbmcyLmdldFZhcmlhYmxlSWQoKSA8IGJpbmRpbmczLmdldFZhcmlhYmxlSWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiaWRzIGluIHRoZSB3cm9uZyBvcmRlciIsIGJpbmRpbmczLmdldFZhcmlhYmxlSWQoKSA8IGJpbmRpbmc0LmdldFZhcmlhYmxlSWQoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgc291cmNlIHBvc2l0aW9uIGZvciBuZXcgVGVzdFsxKzJdLmxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDE2NygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTY3IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJJbnN0YW5jZSBvZiBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50Iiwgbm9kZSBpbnN0YW5jZW9mIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KSBub2RlOwotCQlMaXN0IGZyYWdtZW50cyA9IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuZnJhZ21lbnRzKCk7Ci0JCWFzc2VydFRydWUoImZyYWdtZW50IGxpc3Qgc2l6ZSBpcyBub3QgMSIsIGZyYWdtZW50cy5zaXplKCkgPT0gMSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IGZyYWdtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgZnJhZ21lbnRzLmdldCgwKTsKLQkJRXhwcmVzc2lvbiBpbml0aWFsaXphdGlvbiA9IGZyYWdtZW50LmdldEluaXRpYWxpemVyKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGluaXRpYWxpemF0aW9uIiwgaW5pdGlhbGl6YXRpb24pOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhIEZpZWxkQWNjZXNzIiwgaW5pdGlhbGl6YXRpb24gaW5zdGFuY2VvZiBGaWVsZEFjY2Vzcyk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShpbml0aWFsaXphdGlvbiwgIm5ldyBUZXN0WzErMl0ubGVuZ3RoIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBDaGVjayBwYWNrYWdlIGJpbmRpbmc6IHRlc3QwMTY4LnRlc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDE2OCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTY4LnRlc3QxIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSByZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJTGlzdCB0eXBlcyA9IGNvbXBpbGF0aW9uVW5pdC50eXBlcygpOwotCQlhc3NlcnRUcnVlKCJUaGUgdHlwZXMgbGlzdCBpcyBlbXB0eSIsIHR5cGVzLnNpemUoKSAhPSAwKTsgLy8kTk9OLU5MUy0xJAotCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgdHlwZXMuZ2V0KDApOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0eXBlRGVjbGFyYXRpb24ucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiQmluZGluZyBub3QgbnVsbCIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcgPSB0eXBlQmluZGluZy5nZXRQYWNrYWdlKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHBhY2thZ2UgYmluZGluZyIsIHBhY2thZ2VCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAidGVzdDAxNjgudGVzdDEiLCBwYWNrYWdlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU3RyaW5nW10gY29tcG9uZW50cyA9IHBhY2thZ2VCaW5kaW5nLmdldE5hbWVDb21wb25lbnRzKCk7Ci0JCWFzc2VydE5vdE51bGwoIm5vIGNvbXBvbmVudHMiLCBjb21wb25lbnRzKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJjb21wb25lbnRzIHNpemUgIT0gMiIsIGNvbXBvbmVudHMubGVuZ3RoID09IDIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgY29tcG9uZW50IG5hbWUiLCAidGVzdDAxNjgiLCBjb21wb25lbnRzWzBdKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygid3JvbmcgY29tcG9uZW50IG5hbWUiLCAidGVzdDEiLCBjb21wb25lbnRzWzFdKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygid3JvbmcgdHlwZSIsIElQYWNrYWdlQmluZGluZy5QQUNLQUdFLCBwYWNrYWdlQmluZGluZy5nZXRLaW5kKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlVubmFtZWQgcGFja2FnZSIsICFwYWNrYWdlQmluZGluZy5pc1VubmFtZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiUGFja2FnZSBiaW5kaW5nIGlzIG5vdCBjYW5vbmljYWwiLCBwYWNrYWdlQmluZGluZyA9PSB0eXBlQmluZGluZy5nZXRQYWNrYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIENoZWNrIHBhY2thZ2UgYmluZGluZzogdGVzdDAxNjkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDE2OSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTY5IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSByZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJTGlzdCB0eXBlcyA9IGNvbXBpbGF0aW9uVW5pdC50eXBlcygpOwotCQlhc3NlcnRUcnVlKCJUaGUgdHlwZXMgbGlzdCBpcyBlbXB0eSIsIHR5cGVzLnNpemUoKSAhPSAwKTsgLy8kTk9OLU5MUy0xJAotCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgdHlwZXMuZ2V0KDApOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0eXBlRGVjbGFyYXRpb24ucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiQmluZGluZyBub3QgbnVsbCIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcgPSB0eXBlQmluZGluZy5nZXRQYWNrYWdlKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHBhY2thZ2UgYmluZGluZyIsIHBhY2thZ2VCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAidGVzdDAxNjkiLCBwYWNrYWdlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU3RyaW5nW10gY29tcG9uZW50cyA9IHBhY2thZ2VCaW5kaW5nLmdldE5hbWVDb21wb25lbnRzKCk7Ci0JCWFzc2VydE5vdE51bGwoIm5vIGNvbXBvbmVudHMiLCBjb21wb25lbnRzKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJjb21wb25lbnRzIHNpemUgIT0gMSIsIGNvbXBvbmVudHMubGVuZ3RoID09IDEpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgY29tcG9uZW50IG5hbWUiLCAidGVzdDAxNjkiLCBjb21wb25lbnRzWzBdKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygid3JvbmcgdHlwZSIsIElQYWNrYWdlQmluZGluZy5QQUNLQUdFLCBwYWNrYWdlQmluZGluZy5nZXRLaW5kKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlVubmFtZWQgcGFja2FnZSIsICFwYWNrYWdlQmluZGluZy5pc1VubmFtZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiUGFja2FnZSBiaW5kaW5nIGlzIG5vdCBjYW5vbmljYWwiLCBwYWNrYWdlQmluZGluZyA9PSB0eXBlQmluZGluZy5nZXRQYWNrYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIENoZWNrIHBhY2thZ2UgYmluZGluZzogdGVzdDAxNzAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDE3MCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgIiIsICJUZXN0MDE3MC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlMaXN0IHR5cGVzID0gY29tcGlsYXRpb25Vbml0LnR5cGVzKCk7Ci0JCWFzc2VydFRydWUoIlRoZSB0eXBlcyBsaXN0IGlzIGVtcHR5IiwgdHlwZXMuc2l6ZSgpICE9IDApOyAvLyROT04tTkxTLTEkCi0JCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKSB0eXBlcy5nZXQoMCk7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHR5cGVEZWNsYXJhdGlvbi5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJCaW5kaW5nIG5vdCBudWxsIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCUlQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZyA9IHR5cGVCaW5kaW5nLmdldFBhY2thZ2UoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gcGFja2FnZSBiaW5kaW5nIiwgcGFja2FnZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJVTk5BTUVEIiwgcGFja2FnZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN0cmluZ1tdIGNvbXBvbmVudHMgPSBwYWNrYWdlQmluZGluZy5nZXROYW1lQ29tcG9uZW50cygpOwotCQlhc3NlcnROb3ROdWxsKCJubyBjb21wb25lbnRzIiwgY29tcG9uZW50cyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiY29tcG9uZW50cyBzaXplICE9IDAiLCBjb21wb25lbnRzLmxlbmd0aCA9PSAwKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHR5cGUiLCBJUGFja2FnZUJpbmRpbmcuUEFDS0FHRSwgcGFja2FnZUJpbmRpbmcuZ2V0S2luZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgYW4gdW5uYW1lZCBwYWNrYWdlIiwgcGFja2FnZUJpbmRpbmcuaXNVbm5hbWVkKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlBhY2thZ2UgYmluZGluZyBpcyBub3QgY2Fub25pY2FsIiwgcGFja2FnZUJpbmRpbmcgPT0gdHlwZUJpbmRpbmcuZ2V0UGFja2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENoZWNrIHBhY2thZ2UgYmluZGluZzogdGVzdDAxNzEKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDE3MSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTcxIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSByZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJTGlzdCB0eXBlcyA9IGNvbXBpbGF0aW9uVW5pdC50eXBlcygpOwotCQlhc3NlcnRUcnVlKCJUaGUgdHlwZXMgbGlzdCBpcyBlbXB0eSIsIHR5cGVzLnNpemUoKSA9PSAyKTsgLy8kTk9OLU5MUy0xJAotCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgdHlwZXMuZ2V0KDApOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0eXBlRGVjbGFyYXRpb24ucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiQmluZGluZyBub3QgbnVsbCIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcgPSB0eXBlQmluZGluZy5nZXRQYWNrYWdlKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHBhY2thZ2UgYmluZGluZyIsIHBhY2thZ2VCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAidGVzdDAxNzEiLCBwYWNrYWdlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU3RyaW5nW10gY29tcG9uZW50cyA9IHBhY2thZ2VCaW5kaW5nLmdldE5hbWVDb21wb25lbnRzKCk7Ci0JCWFzc2VydE5vdE51bGwoIm5vIGNvbXBvbmVudHMiLCBjb21wb25lbnRzKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJjb21wb25lbnRzIHNpemUgIT0gMSIsIGNvbXBvbmVudHMubGVuZ3RoID09IDEpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgY29tcG9uZW50IG5hbWUiLCAidGVzdDAxNzEiLCBjb21wb25lbnRzWzBdKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygid3JvbmcgdHlwZSIsIElQYWNrYWdlQmluZGluZy5QQUNLQUdFLCBwYWNrYWdlQmluZGluZy5nZXRLaW5kKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlVubmFtZWQgcGFja2FnZSIsICFwYWNrYWdlQmluZGluZy5pc1VubmFtZWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiUGFja2FnZSBiaW5kaW5nIGlzIG5vdCBjYW5vbmljYWwiLCBwYWNrYWdlQmluZGluZyA9PSB0eXBlQmluZGluZy5nZXRQYWNrYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCQotCQl0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKSB0eXBlcy5nZXQoMSk7Ci0JCXR5cGVCaW5kaW5nID0gdHlwZURlY2xhcmF0aW9uLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIkJpbmRpbmcgbm90IG51bGwiLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJSVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nMiA9IHR5cGVCaW5kaW5nLmdldFBhY2thZ2UoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gcGFja2FnZSBiaW5kaW5nIiwgcGFja2FnZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlBhY2thZ2UgYmluZGluZyBpcyBub3QgY2Fub25pY2FsIiwgcGFja2FnZUJpbmRpbmcgPT0gcGFja2FnZUJpbmRpbmcyKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENoZWNrIG1ldGhvZCBiaW5kaW5nCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAxNzIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDE3MiIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgcmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUxpc3QgdHlwZXMgPSBjb21waWxhdGlvblVuaXQudHlwZXMoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHR5cGVzIGxpc3QgaXMgZW1wdHkiLCB0eXBlcy5zaXplKCkgIT0gMCk7IC8vJE5PTi1OTFMtMSQKLQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pIHR5cGVzLmdldCgwKTsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdHlwZURlY2xhcmF0aW9uLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIkJpbmRpbmcgbm90IG51bGwiLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJSU1ldGhvZEJpbmRpbmdbXSBtZXRob2RzID0gdHlwZUJpbmRpbmcuZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0JCWFzc2VydEVxdWFscygibWV0aG9kcy5sZW5ndGggIT0gNCIsIDQsIG1ldGhvZHMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlMaXN0IGJvZHlEZWNsYXJhdGlvbnMgPSB0eXBlRGVjbGFyYXRpb24uYm9keURlY2xhcmF0aW9ucygpOwotCQlhc3NlcnRFcXVhbHMoImJvZHkgZGVjbGFyYXRpb24gc2l6ZSAhPSAzIiwgMywgYm9keURlY2xhcmF0aW9ucy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZDEgPSAoTWV0aG9kRGVjbGFyYXRpb24pIGJvZHlEZWNsYXJhdGlvbnMuZ2V0KDApOwotCQlJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nMSA9IG1ldGhvZDEucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gbWV0aG9kIGJpbmRpbmcgZm9yIGZvbyIsIG1ldGhvZEJpbmRpbmcxKTsgLy8kTk9OLU5MUy0xJAotCQlTaW1wbGVOYW1lIHNpbXBsZU5hbWUgPSBtZXRob2QxLmdldE5hbWUoKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgZGVjbGFyYXRpb24iLCBzaW1wbGVOYW1lLmlzRGVjbGFyYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJSUJpbmRpbmcgYmluZGluZyA9IHNpbXBsZU5hbWUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZyIsIGJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsIGJpbmRpbmcuZ2V0TmFtZSgpLCBzaW1wbGVOYW1lLmdldElkZW50aWZpZXIoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiQ2Fub25pY2FsIG1ldGhvZCBiaW5kaW5nIiwgbWV0aG9kQmluZGluZzEgPT0gbWV0aG9kc1sxXSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiZGVjbGFyaW5nIGNsYXNzIGlzIGNhbm9uaWNhbCIsIHR5cGVCaW5kaW5nID09IG1ldGhvZEJpbmRpbmcxLmdldERlY2xhcmluZ0NsYXNzKCkpOyAvLyROT04tTkxTLTEkCi0JCUlUeXBlQmluZGluZ1tdIGV4Y2VwdGlvblR5cGVzID0gbWV0aG9kQmluZGluZzEuZ2V0RXhjZXB0aW9uVHlwZXMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gZXhjZXB0aW9uIHR5cGVzIiwgZXhjZXB0aW9uVHlwZXMpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiT25lIGV4Y2VwdGlvbiIsIDEsIGV4Y2VwdGlvblR5cGVzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIGZvciBleGNlcHRpb24iLCAiSU9FeGNlcHRpb24iLCBleGNlcHRpb25UeXBlc1swXS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBtb2RpZmllciIsIE1vZGlmaWVyLk5PTkUsIG1ldGhvZEJpbmRpbmcxLmdldE1vZGlmaWVycygpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUgZm9yIG1ldGhvZCIsICJmb28iLCBtZXRob2RCaW5kaW5nMS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJSVR5cGVCaW5kaW5nW10gcGFyYW1ldGVycyA9IG1ldGhvZEJpbmRpbmcxLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHBhcmFtZXRlcnMiLCBwYXJhbWV0ZXJzKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAxLCBwYXJhbWV0ZXJzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyB0eXBlIiwgImludFtdIiwgcGFyYW1ldGVyc1swXS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyByZXR1cm4gdHlwZSIsICJ2b2lkIiwgbWV0aG9kQmluZGluZzEuZ2V0UmV0dXJuVHlwZSgpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRUcnVlKCJBIGNvbnN0cnVjdG9yIiwgIW1ldGhvZEJpbmRpbmcxLmlzQ29uc3RydWN0b3IoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZDIgPSAoTWV0aG9kRGVjbGFyYXRpb24pIGJvZHlEZWNsYXJhdGlvbnMuZ2V0KDEpOwotCQlJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nMiA9IG1ldGhvZDIucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gbWV0aG9kIGJpbmRpbmcgZm9yIG1haW4iLCBtZXRob2RCaW5kaW5nMik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiQ2Fub25pY2FsIG1ldGhvZCBiaW5kaW5nIiwgbWV0aG9kQmluZGluZzIgPT0gbWV0aG9kc1syXSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiZGVjbGFyaW5nIGNsYXNzIGlzIGNhbm9uaWNhbCIsIHR5cGVCaW5kaW5nID09IG1ldGhvZEJpbmRpbmcyLmdldERlY2xhcmluZ0NsYXNzKCkpOyAvLyROT04tTkxTLTEkCi0JCUlUeXBlQmluZGluZ1tdIGV4Y2VwdGlvblR5cGVzMiA9IG1ldGhvZEJpbmRpbmcyLmdldEV4Y2VwdGlvblR5cGVzKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGV4Y2VwdGlvbiB0eXBlcyIsIGV4Y2VwdGlvblR5cGVzMik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJObyBleGNlcHRpb24iLCAwLCBleGNlcHRpb25UeXBlczIubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIG1vZGlmaWVyIiwgTW9kaWZpZXIuUFVCTElDIHwgTW9kaWZpZXIuU1RBVElDLCBtZXRob2RCaW5kaW5nMi5nZXRNb2RpZmllcnMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIGZvciBtZXRob2QiLCAibWFpbiIsIG1ldGhvZEJpbmRpbmcyLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlJVHlwZUJpbmRpbmdbXSBwYXJhbWV0ZXJzMiA9IG1ldGhvZEJpbmRpbmcyLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHBhcmFtZXRlcnMiLCBwYXJhbWV0ZXJzMik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMSwgcGFyYW1ldGVyczIubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHR5cGUgZm9yIHBhcmFtZXRlcjJbMF0iLCAiU3RyaW5nW10iLCBwYXJhbWV0ZXJzMlswXS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyByZXR1cm4gdHlwZSIsICJ2b2lkIiwgbWV0aG9kQmluZGluZzIuZ2V0UmV0dXJuVHlwZSgpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRUcnVlKCJBIGNvbnN0cnVjdG9yIiwgIW1ldGhvZEJpbmRpbmcyLmlzQ29uc3RydWN0b3IoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZDMgPSAoTWV0aG9kRGVjbGFyYXRpb24pIGJvZHlEZWNsYXJhdGlvbnMuZ2V0KDIpOwotCQlJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nMyA9IG1ldGhvZDMucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gbWV0aG9kIGJpbmRpbmcgZm9yIG1haW4iLCBtZXRob2RCaW5kaW5nMyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiQ2Fub25pY2FsIG1ldGhvZCBiaW5kaW5nIiwgbWV0aG9kQmluZGluZzMgPT0gbWV0aG9kc1szXSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiZGVjbGFyaW5nIGNsYXNzIGlzIGNhbm9uaWNhbCIsIHR5cGVCaW5kaW5nID09IG1ldGhvZEJpbmRpbmczLmdldERlY2xhcmluZ0NsYXNzKCkpOyAvLyROT04tTkxTLTEkCi0JCUlUeXBlQmluZGluZ1tdIGV4Y2VwdGlvblR5cGVzMyA9IG1ldGhvZEJpbmRpbmczLmdldEV4Y2VwdGlvblR5cGVzKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGV4Y2VwdGlvbiB0eXBlcyIsIGV4Y2VwdGlvblR5cGVzMyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJObyBleGNlcHRpb24iLCAxLCBleGNlcHRpb25UeXBlczMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIG1vZGlmaWVyIiwgTW9kaWZpZXIuUFJJVkFURSwgbWV0aG9kQmluZGluZzMuZ2V0TW9kaWZpZXJzKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSBmb3IgbWV0aG9kIiwgImJhciIsIG1ldGhvZEJpbmRpbmczLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlJVHlwZUJpbmRpbmdbXSBwYXJhbWV0ZXJzMyA9IG1ldGhvZEJpbmRpbmczLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHBhcmFtZXRlcnMiLCBwYXJhbWV0ZXJzMyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMSwgcGFyYW1ldGVyczMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHR5cGUiLCAiU3RyaW5nIiwgcGFyYW1ldGVyczNbMF0uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygid3JvbmcgcmV0dXJuIHR5cGUiLCAiU3RyaW5nIiwgbWV0aG9kQmluZGluZzMuZ2V0UmV0dXJuVHlwZSgpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRUcnVlKCJBIGNvbnN0cnVjdG9yIiwgIW1ldGhvZEJpbmRpbmczLmlzQ29uc3RydWN0b3IoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIGJpbmRpbmcgaXMgbm90IGNhbm9uaWNhbCIsIHBhcmFtZXRlcnMzWzBdID09IG1ldGhvZEJpbmRpbmczLmdldFJldHVyblR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogaSsrOyBJVmFyaWFibGVCaW5kaW5nCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAxNzMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDE3MyIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAxKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgYW4gZXhwcmVzc2lvblN0YXRlbWVudCIsIG5vZGUgaW5zdGFuY2VvZiBFeHByZXNzaW9uU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlFeHByZXNzaW9uU3RhdGVtZW50IGV4cHJlc3Npb25TdGF0ZW1lbnQgPSAoRXhwcmVzc2lvblN0YXRlbWVudCkgbm9kZTsKLQkJRXhwcmVzc2lvbiBleCA9IGV4cHJlc3Npb25TdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBwb3N0Zml4ZXhwcmVzc2lvbiIsIGV4IGluc3RhbmNlb2YgUG9zdGZpeEV4cHJlc3Npb24pOyAvLyROT04tTkxTLTEkCi0JCVBvc3RmaXhFeHByZXNzaW9uIHBvc3RmaXhFeHByZXNzaW9uID0gKFBvc3RmaXhFeHByZXNzaW9uKSBleDsKLQkJRXhwcmVzc2lvbiBleHByID0gcG9zdGZpeEV4cHJlc3Npb24uZ2V0T3BlcmFuZCgpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBzaW1wbGVOYW1lIiwgZXhwciBpbnN0YW5jZW9mIFNpbXBsZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCVNpbXBsZU5hbWUgbmFtZSA9IChTaW1wbGVOYW1lKSBleHByOwotCQlhc3NlcnRUcnVlKCJhIGRlY2xhcmF0aW9uIiwgIW5hbWUuaXNEZWNsYXJhdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQlJQmluZGluZyBiaW5kaW5nID0gbmFtZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgYmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQotCQlBU1ROb2RlIG5vZGUyID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnRUcnVlKCJWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50Iiwgbm9kZTIgaW5zdGFuY2VvZiBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCkgbm9kZTI7Ci0JCUxpc3QgZnJhZ21lbnRzID0gdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm8gZnJhZ21lbnQiLCBmcmFnbWVudHMuc2l6ZSgpID09IDEpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBmcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7Ci0JCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gZnJhZ21lbnQucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0VHJ1ZSh2YXJpYWJsZUJpbmRpbmcgPT0gYmluZGluZyk7Ci0JfQotCi0JLyoqCi0JICogaSsrOyBJVmFyaWFibGVCaW5kaW5nIChmaWVsZCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDE3NCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTc0IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDEsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhbiBleHByZXNzaW9uU3RhdGVtZW50Iiwgbm9kZSBpbnN0YW5jZW9mIEV4cHJlc3Npb25TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCUV4cHJlc3Npb25TdGF0ZW1lbnQgZXhwcmVzc2lvblN0YXRlbWVudCA9IChFeHByZXNzaW9uU3RhdGVtZW50KSBub2RlOwotCQlFeHByZXNzaW9uIGV4ID0gZXhwcmVzc2lvblN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHBvc3RmaXhleHByZXNzaW9uIiwgZXggaW5zdGFuY2VvZiBQb3N0Zml4RXhwcmVzc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJUG9zdGZpeEV4cHJlc3Npb24gcG9zdGZpeEV4cHJlc3Npb24gPSAoUG9zdGZpeEV4cHJlc3Npb24pIGV4OwotCQlFeHByZXNzaW9uIGV4cHIgPSBwb3N0Zml4RXhwcmVzc2lvbi5nZXRPcGVyYW5kKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHNpbXBsZU5hbWUiLCBleHByIGluc3RhbmNlb2YgU2ltcGxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJU2ltcGxlTmFtZSBuYW1lID0gKFNpbXBsZU5hbWUpIGV4cHI7Ci0JCUlCaW5kaW5nIGJpbmRpbmcgPSBuYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCBiaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCi0JCUFTVE5vZGUgbm9kZTIgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCk7Ci0JCWFzc2VydFRydWUoIkZpZWxkRGVjbGFyYXRpb24iLCBub2RlMiBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IChGaWVsZERlY2xhcmF0aW9uKSBub2RlMjsKLQkJTGlzdCBmcmFnbWVudHMgPSBmaWVsZERlY2xhcmF0aW9uLmZyYWdtZW50cygpOwotCQlhc3NlcnRUcnVlKCJObyBmcmFnbWVudCIsIGZyYWdtZW50cy5zaXplKCkgPT0gMSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IGZyYWdtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgZnJhZ21lbnRzLmdldCgwKTsKLQkJSVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcgPSBmcmFnbWVudC5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnRUcnVlKHZhcmlhYmxlQmluZGluZyA9PSBiaW5kaW5nKTsKLQl9Ci0JCi0JLyoqCi0JICogaW50IGkgPSAwOyBUZXN0IEludEJpbmRpbmcgZm9yIHRoZSBmaWVsZCBkZWNsYXJhdGlvbiBhbmQgdGhlIDAgbGl0ZXJhbAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTc1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxNzUiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlBU1ROb2RlIG5vZGUyID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDApOwotCQlhc3NlcnRUcnVlKCJWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50Iiwgbm9kZTIgaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSAoRmllbGREZWNsYXJhdGlvbikgbm9kZTI7Ci0JCUxpc3QgZnJhZ21lbnRzID0gZmllbGREZWNsYXJhdGlvbi5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm8gZnJhZ21lbnQiLCBmcmFnbWVudHMuc2l6ZSgpID09IDEpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBmcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7Ci0JCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gZnJhZ21lbnQucmVzb2x2ZUJpbmRpbmcoKTsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gZnJhZ21lbnQuZ2V0SW5pdGlhbGl6ZXIoKS5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhIHByaW1pdGl2ZSB0eXBlIiwgdHlwZUJpbmRpbmcuaXNQcmltaXRpdmUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgaW50IiwgImludCIsIHR5cGVCaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRUcnVlKHZhcmlhYmxlQmluZGluZy5nZXRUeXBlKCkgPT0gdHlwZUJpbmRpbmcpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzUmVmZXJlbmNlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAxNzYoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDE3NiIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCUFTVE5vZGUgbm9kZTIgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMSwgMCk7Ci0JCWFzc2VydFRydWUoIlJldHVybiBzdGF0ZW1lbnQiLCBub2RlMiBpbnN0YW5jZW9mIFJldHVyblN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJUmV0dXJuU3RhdGVtZW50IHJldHVyblN0YXRlbWVudCA9IChSZXR1cm5TdGF0ZW1lbnQpIG5vZGUyOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBmaWVsZCBhY2Nlc3MiLCByZXR1cm5TdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpIGluc3RhbmNlb2YgRmllbGRBY2Nlc3MpOyAvLyROT04tTkxTLTEkCi0JCUZpZWxkQWNjZXNzIGZpZWxkQWNjZXNzID0gKEZpZWxkQWNjZXNzKSByZXR1cm5TdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBmaWVsZEFjY2Vzcy5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhIHByaW1pdGl2ZSB0eXBlIiwgdHlwZUJpbmRpbmcuaXNQcmltaXRpdmUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgaW50IiwgImludCIsIHR5cGVCaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlFeHByZXNzaW9uIGV4cHIgPSBmaWVsZEFjY2Vzcy5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHRoaXMgZXhwcmVzc2lvbiIsIGV4cHIgaW5zdGFuY2VvZiBUaGlzRXhwcmVzc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJVGhpc0V4cHJlc3Npb24gdGhpc0V4cHJlc3Npb24gPSAoVGhpc0V4cHJlc3Npb24pIGV4cHI7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZzIgPSB0aGlzRXhwcmVzc2lvbi5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZSBiaW5kaW5nMiIsIHR5cGVCaW5kaW5nMik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgVGVzdCIsICJUZXN0IiwgdHlwZUJpbmRpbmcyLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0JCi0KLQkvKioKLQkgKiBpKys7IElWYXJpYWJsZUJpbmRpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDE3NygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTc3IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDEsIDEpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhbiBleHByZXNzaW9uU3RhdGVtZW50Iiwgbm9kZSBpbnN0YW5jZW9mIEV4cHJlc3Npb25TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCUV4cHJlc3Npb25TdGF0ZW1lbnQgZXhwcmVzc2lvblN0YXRlbWVudCA9IChFeHByZXNzaW9uU3RhdGVtZW50KSBub2RlOwotCQlFeHByZXNzaW9uIGV4ID0gZXhwcmVzc2lvblN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHBvc3RmaXhleHByZXNzaW9uIiwgZXggaW5zdGFuY2VvZiBQb3N0Zml4RXhwcmVzc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJUG9zdGZpeEV4cHJlc3Npb24gcG9zdGZpeEV4cHJlc3Npb24gPSAoUG9zdGZpeEV4cHJlc3Npb24pIGV4OwotCQlFeHByZXNzaW9uIGV4cHIgPSBwb3N0Zml4RXhwcmVzc2lvbi5nZXRPcGVyYW5kKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHNpbXBsZU5hbWUiLCBleHByIGluc3RhbmNlb2YgU2ltcGxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJU2ltcGxlTmFtZSBuYW1lID0gKFNpbXBsZU5hbWUpIGV4cHI7Ci0JCUlCaW5kaW5nIGJpbmRpbmcgPSBuYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCBiaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCi0JCUFTVE5vZGUgbm9kZTIgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMSwgMCk7Ci0JCWFzc2VydFRydWUoIlZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQiLCBub2RlMiBpbnN0YW5jZW9mIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KSBub2RlMjsKLQkJTGlzdCBmcmFnbWVudHMgPSB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LmZyYWdtZW50cygpOwotCQlhc3NlcnRUcnVlKCJObyBmcmFnbWVudCIsIGZyYWdtZW50cy5zaXplKCkgPT0gMSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IGZyYWdtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgZnJhZ21lbnRzLmdldCgwKTsKLQkJSVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcgPSBmcmFnbWVudC5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnRFcXVhbHMoInJldHVybiB0eXBlIGlzIG5vdCBpbnQiLCAiaW50IiwgdmFyaWFibGVCaW5kaW5nLmdldFR5cGUoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0VHJ1ZSh2YXJpYWJsZUJpbmRpbmcgPT0gYmluZGluZyk7Ci0JfQotCi0JLyoqCi0JICogU3VwZXJSZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDE3OCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTc4IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJQVNUTm9kZSBub2RlMiA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAxLCAwLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiUmV0dXJuIHN0YXRlbWVudCIsIG5vZGUyIGluc3RhbmNlb2YgUmV0dXJuU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlSZXR1cm5TdGF0ZW1lbnQgcmV0dXJuU3RhdGVtZW50ID0gKFJldHVyblN0YXRlbWVudCkgbm9kZTI7Ci0JCUV4cHJlc3Npb24gZXhwciA9IHJldHVyblN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIGZpZWxkIGFjY2VzcyIsIGV4cHIgaW5zdGFuY2VvZiBTdXBlckZpZWxkQWNjZXNzKTsgLy8kTk9OLU5MUy0xJAotCQlTdXBlckZpZWxkQWNjZXNzIGZpZWxkQWNjZXNzID0gKFN1cGVyRmllbGRBY2Nlc3MpIGV4cHI7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IGZpZWxkQWNjZXNzLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyB0eXBlIGJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgcHJpbWl0aXZlIHR5cGUiLCB0eXBlQmluZGluZy5pc1ByaW1pdGl2ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIk5vdCBpbnQiLCAiaW50IiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQkKLQkKLQkvKioKLQkgKiBBbGxvY2F0aW9uIGV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDE3OSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTc5IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJQVNUTm9kZSBub2RlMiA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCIsIG5vZGUyIGluc3RhbmNlb2YgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIG5vZGUyOwotCQlMaXN0IGZyYWdtZW50cyA9IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuZnJhZ21lbnRzKCk7Ci0JCWFzc2VydFRydWUoIk5vIGZyYWdtZW50IiwgZnJhZ21lbnRzLnNpemUoKSA9PSAxKTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgZnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcmFnbWVudHMuZ2V0KDApOwotCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IGZyYWdtZW50LnJlc29sdmVCaW5kaW5nKCk7Ci0JCUV4cHJlc3Npb24gaW5pdGlhbGl6YXRpb24gPSBmcmFnbWVudC5nZXRJbml0aWFsaXplcigpOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBpbml0aWFsaXphdGlvbi5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUodmFyaWFibGVCaW5kaW5nLmdldFR5cGUoKSA9PSB0eXBlQmluZGluZyk7Ci0JfQkKLQotCS8qKgotCSAqIEFsbG9jYXRpb24gZXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTgwKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxODAiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlBU1ROb2RlIG5vZGUyID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnRUcnVlKCJWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50Iiwgbm9kZTIgaW5zdGFuY2VvZiBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCkgbm9kZTI7Ci0JCUxpc3QgZnJhZ21lbnRzID0gdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm8gZnJhZ21lbnQiLCBmcmFnbWVudHMuc2l6ZSgpID09IDEpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBmcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7Ci0JCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gZnJhZ21lbnQucmVzb2x2ZUJpbmRpbmcoKTsKLQkJRXhwcmVzc2lvbiBpbml0aWFsaXphdGlvbiA9IGZyYWdtZW50LmdldEluaXRpYWxpemVyKCk7Ci0JCWFzc2VydFRydWUoIk5vIGFuIGFycmF5IGNyZWF0aW9uIiwgaW5pdGlhbGl6YXRpb24gaW5zdGFuY2VvZiBBcnJheUNyZWF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBpbml0aWFsaXphdGlvbi5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhbiBhcnJheSIsIHR5cGVCaW5kaW5nLmlzQXJyYXkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSh2YXJpYWJsZUJpbmRpbmcuZ2V0VHlwZSgpID09IHR5cGVCaW5kaW5nKTsKLQl9CQotCi0JLyoqCi0JICogQWxsb2NhdGlvbiBleHByZXNzaW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAxODEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDE4MSIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCUFTVE5vZGUgbm9kZTIgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMCk7Ci0JCWFzc2VydFRydWUoIlZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQiLCBub2RlMiBpbnN0YW5jZW9mIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KSBub2RlMjsKLQkJTGlzdCBmcmFnbWVudHMgPSB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LmZyYWdtZW50cygpOwotCQlhc3NlcnRUcnVlKCJObyBmcmFnbWVudCIsIGZyYWdtZW50cy5zaXplKCkgPT0gMSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IGZyYWdtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgZnJhZ21lbnRzLmdldCgwKTsKLQkJSVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcgPSBmcmFnbWVudC5yZXNvbHZlQmluZGluZygpOwotCQlFeHByZXNzaW9uIGluaXRpYWxpemF0aW9uID0gZnJhZ21lbnQuZ2V0SW5pdGlhbGl6ZXIoKTsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gaW5pdGlhbGl6YXRpb24ucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHR5cGUgYmluZGluZyIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgYW4gYXJyYXkiLCB0eXBlQmluZGluZy5pc0FycmF5KCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUodmFyaWFibGVCaW5kaW5nLmdldFR5cGUoKSA9PSB0eXBlQmluZGluZyk7Ci0JfQkKLQotCS8qKgotCSAqIEJpbmFyeUV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDE4MigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTgyIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJQVNUTm9kZSBub2RlMiA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAxKTsKLQkJYXNzZXJ0VHJ1ZSgiSWZTdGF0ZW1lbnQiLCBub2RlMiBpbnN0YW5jZW9mIElmU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlJZlN0YXRlbWVudCBpZlN0YXRlbWVudCA9IChJZlN0YXRlbWVudCkgbm9kZTI7Ci0JCUV4cHJlc3Npb24gZXhwciA9IGlmU3RhdGVtZW50LmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29uZGl0aW9uIiwgZXhwcik7IC8vJE5PTi1OTFMtMSQKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gZXhwci5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZyIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIk5vdCBhIGJvb2xlYW4iLCAiYm9vbGVhbiIsIHR5cGVCaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQljaGVja1NvdXJjZVJhbmdlKGV4cHIsICJpIDwgMTAiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQkKLQotCS8qKgotCSAqIEJpbmFyeUV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDE4MygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTgzIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJQVNUTm9kZSBub2RlMiA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAxKTsKLQkJYXNzZXJ0VHJ1ZSgiSWZTdGF0ZW1lbnQiLCBub2RlMiBpbnN0YW5jZW9mIElmU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlJZlN0YXRlbWVudCBpZlN0YXRlbWVudCA9IChJZlN0YXRlbWVudCkgbm9kZTI7Ci0JCUV4cHJlc3Npb24gZXhwciA9IGlmU3RhdGVtZW50LmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29uZGl0aW9uIiwgZXhwcik7IC8vJE5PTi1OTFMtMSQKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gZXhwci5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZyIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIk5vdCBhIGJvb2xlYW4iLCAiYm9vbGVhbiIsIHR5cGVCaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQljaGVja1NvdXJjZVJhbmdlKGV4cHIsICJpIDwgMTAgJiYgaSA8IDIwIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0JCi0JCi0JLyoqCi0JICogQmluYXJ5RXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTg0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxODQiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlBU1ROb2RlIG5vZGUyID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDEpOwotCQlhc3NlcnRUcnVlKCJJZlN0YXRlbWVudCIsIG5vZGUyIGluc3RhbmNlb2YgSWZTdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCUlmU3RhdGVtZW50IGlmU3RhdGVtZW50ID0gKElmU3RhdGVtZW50KSBub2RlMjsKLQkJRXhwcmVzc2lvbiBleHByID0gaWZTdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb25kaXRpb24iLCBleHByKTsgLy8kTk9OLU5MUy0xJAotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBleHByLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiTm90IGEgYm9vbGVhbiIsICJib29sZWFuIiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWNoZWNrU291cmNlUmFuZ2UoZXhwciwgImkgPCAxMCB8fCBpIDwgMjAiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQkKLQotCS8qKgotCSAqIEJpbmFyeUV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDE4NSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTg1IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJQVNUTm9kZSBub2RlMiA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAxKTsKLQkJYXNzZXJ0VHJ1ZSgiSWZTdGF0ZW1lbnQiLCBub2RlMiBpbnN0YW5jZW9mIElmU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlJZlN0YXRlbWVudCBpZlN0YXRlbWVudCA9IChJZlN0YXRlbWVudCkgbm9kZTI7Ci0JCUV4cHJlc3Npb24gZXhwciA9IGlmU3RhdGVtZW50LmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29uZGl0aW9uIiwgZXhwcik7IC8vJE5PTi1OTFMtMSQKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gZXhwci5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZyIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIk5vdCBhIGJvb2xlYW4iLCAiYm9vbGVhbiIsIHR5cGVCaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQljaGVja1NvdXJjZVJhbmdlKGV4cHIsICJpID09IDEwIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0JCi0KLQkvKioKLQkgKiBCaW5hcnlFeHByZXNzaW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAxODYoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDE4NiIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCUFTVE5vZGUgbm9kZTIgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMSk7Ci0JCWFzc2VydFRydWUoIklmU3RhdGVtZW50Iiwgbm9kZTIgaW5zdGFuY2VvZiBJZlN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJSWZTdGF0ZW1lbnQgaWZTdGF0ZW1lbnQgPSAoSWZTdGF0ZW1lbnQpIG5vZGUyOwotCQlFeHByZXNzaW9uIGV4cHIgPSBpZlN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbmRpdGlvbiIsIGV4cHIpOyAvLyROT04tTkxTLTEkCi0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IGV4cHIucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBib29sZWFuIiwgImJvb2xlYW4iLCB0eXBlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJY2hlY2tTb3VyY2VSYW5nZShleHByLCAibyA9PSBvIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0JCi0KLQkvKioKLQkgKiBCaW5hcnlFeHByZXNzaW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAxODcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDE4NyIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCUFTVE5vZGUgbm9kZTIgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMSk7Ci0JCWFzc2VydFRydWUoIklmU3RhdGVtZW50Iiwgbm9kZTIgaW5zdGFuY2VvZiBXaGlsZVN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJV2hpbGVTdGF0ZW1lbnQgd2hpbGVTdGF0ZW1lbnQgPSAoV2hpbGVTdGF0ZW1lbnQpIG5vZGUyOwotCQlFeHByZXNzaW9uIGV4cHIgPSB3aGlsZVN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbmRpdGlvbiIsIGV4cHIpOyAvLyROT04tTkxTLTEkCi0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IGV4cHIucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBib29sZWFuIiwgImJvb2xlYW4iLCB0eXBlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJY2hlY2tTb3VyY2VSYW5nZShleHByLCAiaSA8PSAxMCIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9CQotCi0JLyoqCi0JICogQmluYXJ5RXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTg4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxODgiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlBU1ROb2RlIG5vZGUyID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDIpOwotCQlhc3NlcnRUcnVlKCJEb1N0YXRlbWVudCIsIG5vZGUyIGluc3RhbmNlb2YgRG9TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCURvU3RhdGVtZW50IHN0YXRlbWVudCA9IChEb1N0YXRlbWVudCkgbm9kZTI7Ci0JCUV4cHJlc3Npb24gZXhwciA9IHN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbmRpdGlvbiIsIGV4cHIpOyAvLyROT04tTkxTLTEkCi0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IGV4cHIucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBib29sZWFuIiwgImJvb2xlYW4iLCB0eXBlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJY2hlY2tTb3VyY2VSYW5nZShleHByLCAiaSA8PSAxMCIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9CQotCi0JLyoqCi0JICogQmluYXJ5RXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTg5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxODkiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlBU1ROb2RlIG5vZGUyID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnRUcnVlKCJGb3JTdGF0ZW1lbnQiLCBub2RlMiBpbnN0YW5jZW9mIEZvclN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJRm9yU3RhdGVtZW50IHN0YXRlbWVudCA9IChGb3JTdGF0ZW1lbnQpIG5vZGUyOwotCQlFeHByZXNzaW9uIGV4cHIgPSBzdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb25kaXRpb24iLCBleHByKTsgLy8kTk9OLU5MUy0xJAotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBleHByLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiTm90IGEgYm9vbGVhbiIsICJib29sZWFuIiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWNoZWNrU291cmNlUmFuZ2UoZXhwciwgImkgPCAxMCIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9CQotCi0JLyoqCi0JICogQmluYXJ5RXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTkwKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxOTAiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlBU1ROb2RlIG5vZGUyID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDIsIDEpOwotCQlhc3NlcnRUcnVlKCJJZlN0YXRlbWVudCIsIG5vZGUyIGluc3RhbmNlb2YgSWZTdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCUlmU3RhdGVtZW50IHN0YXRlbWVudCA9IChJZlN0YXRlbWVudCkgbm9kZTI7Ci0JCUV4cHJlc3Npb24gZXhwciA9IHN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbmRpdGlvbiIsIGV4cHIpOyAvLyROT04tTkxTLTEkCi0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IGV4cHIucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBib29sZWFuIiwgImJvb2xlYW4iLCB0eXBlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJY2hlY2tTb3VyY2VSYW5nZShleHByLCAic2Nhbm5lci54IDwgc2VsZWN0aW9uLnN0YXJ0ICYmIHNlbGVjdGlvbi5zdGFydCA8IHNjYW5uZXIueSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9CQotCi0JLyoqCi0JICogQmluYXJ5RXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTkxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxOTEiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlBU1ROb2RlIG5vZGUyID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDEpOwotCQlhc3NlcnRUcnVlKCJFeHByZXNzaW9uU3RhdGVtZW50Iiwgbm9kZTIgaW5zdGFuY2VvZiBFeHByZXNzaW9uU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlFeHByZXNzaW9uU3RhdGVtZW50IGV4cHJlc3Npb25TdGF0ZW1lbnQgPSAoRXhwcmVzc2lvblN0YXRlbWVudCkgbm9kZTI7Ci0JCUV4cHJlc3Npb24gZXggPSBleHByZXNzaW9uU3RhdGVtZW50LmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgiQXNzaWdubWVudCIsIGV4IGluc3RhbmNlb2YgQXNzaWdubWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJQXNzaWdubWVudCBzdGF0ZW1lbnQgPSAoQXNzaWdubWVudCkgZXg7Ci0JCUV4cHJlc3Npb24gcmlnaHRFeHByID0gc3RhdGVtZW50LmdldFJpZ2h0SGFuZFNpZGUoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGluZml4IGV4cHJlc3Npb24iLCByaWdodEV4cHIgaW5zdGFuY2VvZiBJbmZpeEV4cHJlc3Npb24pOyAvLyROT04tTkxTLTEkCi0JCUluZml4RXhwcmVzc2lvbiBpbmZpeEV4cHJlc3Npb24gPSAoSW5maXhFeHByZXNzaW9uKSByaWdodEV4cHI7Ci0JCUV4cHJlc3Npb24gZXhwciA9IGluZml4RXhwcmVzc2lvbi5nZXRSaWdodE9wZXJhbmQoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gcmlnaHQgaGFuZCBzaWRlIGV4cHJlc3Npb24iLCBleHByKTsgLy8kTk9OLU5MUy0xJAotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBleHByLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiTm90IGEgYm9vbGVhbiIsICJib29sZWFuIiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWNoZWNrU291cmNlUmFuZ2UoZXhwciwgIjIgPCAyMCIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9CQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDE5MigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTkyIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJQVNUTm9kZSBub2RlMiA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCIsIG5vZGUyIGluc3RhbmNlb2YgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIG5vZGUyOwotCQlMaXN0IGZyYWdtZW50cyA9IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuZnJhZ21lbnRzKCk7Ci0JCWFzc2VydFRydWUoIk5vIGZyYWdtZW50IiwgZnJhZ21lbnRzLnNpemUoKSA9PSAxKTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgZnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcmFnbWVudHMuZ2V0KDApOwotCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IGZyYWdtZW50LnJlc29sdmVCaW5kaW5nKCk7Ci0JCUV4cHJlc3Npb24gaW5pdGlhbGl6YXRpb24gPSBmcmFnbWVudC5nZXRJbml0aWFsaXplcigpOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBpbml0aWFsaXphdGlvbi5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUodmFyaWFibGVCaW5kaW5nLmdldFR5cGUoKSA9PSB0eXBlQmluZGluZyk7Ci0JCWNoZWNrU291cmNlUmFuZ2UoaW5pdGlhbGl6YXRpb24sICIwIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0JCi0KLQkvKioKLQkgKiBJbml0aWFsaXplcgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTkzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxOTMiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlBU1ROb2RlIG5vZGUyID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDEsIDApOwotCQlhc3NlcnRUcnVlKCJWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50Iiwgbm9kZTIgaW5zdGFuY2VvZiBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCkgbm9kZTI7Ci0JCUxpc3QgZnJhZ21lbnRzID0gdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm8gZnJhZ21lbnQiLCBmcmFnbWVudHMuc2l6ZSgpID09IDEpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBmcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7Ci0JCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gZnJhZ21lbnQucmVzb2x2ZUJpbmRpbmcoKTsKLQkJRXhwcmVzc2lvbiBpbml0aWFsaXphdGlvbiA9IGZyYWdtZW50LmdldEluaXRpYWxpemVyKCk7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IGluaXRpYWxpemF0aW9uLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyB0eXBlIGJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSh2YXJpYWJsZUJpbmRpbmcuZ2V0VHlwZSgpID09IHR5cGVCaW5kaW5nKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShpbml0aWFsaXphdGlvbiwgIm5ldyBJbm5lcigpIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIHR5cGUiLCAiSW5uZXIiLCB0eXBlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9CQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDE5NCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTk0IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJQVNUTm9kZSBub2RlMiA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAxLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCIsIG5vZGUyIGluc3RhbmNlb2YgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIG5vZGUyOwotCQlMaXN0IGZyYWdtZW50cyA9IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuZnJhZ21lbnRzKCk7Ci0JCWFzc2VydFRydWUoIk5vIGZyYWdtZW50IiwgZnJhZ21lbnRzLnNpemUoKSA9PSAxKTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgZnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcmFnbWVudHMuZ2V0KDApOwotCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IGZyYWdtZW50LnJlc29sdmVCaW5kaW5nKCk7Ci0JCUV4cHJlc3Npb24gaW5pdGlhbGl6YXRpb24gPSBmcmFnbWVudC5nZXRJbml0aWFsaXplcigpOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBpbml0aWFsaXphdGlvbi5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUodmFyaWFibGVCaW5kaW5nLmdldFR5cGUoKSA9PSB0eXBlQmluZGluZyk7Ci0JCWNoZWNrU291cmNlUmFuZ2UoaW5pdGlhbGl6YXRpb24sICJuZXcgSW5uZXJbMTBdIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgYW4gYXJyYXkiLCB0eXBlQmluZGluZy5pc0FycmF5KCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgdHlwZSIsICJJbm5lcltdIiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQkKLQotCS8qKgotCSAqIEluaXRpYWxpemVyCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAxOTUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDE5NSIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCUFTVE5vZGUgbm9kZTIgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMSwgMCwgMSk7Ci0JCWFzc2VydFRydWUoIkV4cHJlc3Npb25TdGF0ZW1lbnQiLCBub2RlMiBpbnN0YW5jZW9mIEV4cHJlc3Npb25TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCUV4cHJlc3Npb25TdGF0ZW1lbnQgZXhwcmVzc2lvblN0YXRlbWVudCA9IChFeHByZXNzaW9uU3RhdGVtZW50KSBub2RlMjsKLQkJRXhwcmVzc2lvbiBleCA9IGV4cHJlc3Npb25TdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpOwotCQlhc3NlcnRUcnVlKCJNZXRob2RJbnZvY2F0aW9uIiwgZXggaW5zdGFuY2VvZiBNZXRob2RJbnZvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlNZXRob2RJbnZvY2F0aW9uIG1ldGhvZEludm9jYXRpb24gPSAoTWV0aG9kSW52b2NhdGlvbikgZXg7Ci0JCWNoZWNrU291cmNlUmFuZ2UobWV0aG9kSW52b2NhdGlvbiwgImEudXNlRmlsZSgvKl0qL2EuZ2V0RmlsZSgpLypbKi8pIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlMaXN0IGxpc3QgPSBtZXRob2RJbnZvY2F0aW9uLmFyZ3VtZW50cygpOwotCQlhc3NlcnRUcnVlKCJQYXJhbWV0ZXIgbGlzdCBub3QgZW1wdHkiLCBsaXN0LnNpemUoKSA9PSAxKTsgLy8kTk9OLU5MUy0xJAotCQlFeHByZXNzaW9uIHBhcmFtZXRlciA9IChFeHByZXNzaW9uKSBsaXN0LmdldCgwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgbWV0aG9kIGludm9jYXRpb24iLCBwYXJhbWV0ZXIgaW5zdGFuY2VvZiBNZXRob2RJbnZvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBwYXJhbWV0ZXIucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBib29sZWFuIiwgIkZpbGUiLCB0eXBlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJY2hlY2tTb3VyY2VSYW5nZShwYXJhbWV0ZXIsICJhLmdldEZpbGUoKSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9CQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDE5NigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTk2IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJQVNUTm9kZSBub2RlMiA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAxLCAyKTsKLQkJYXNzZXJ0VHJ1ZSgiRXhwcmVzc2lvblN0YXRlbWVudCIsIG5vZGUyIGluc3RhbmNlb2YgRXhwcmVzc2lvblN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJRXhwcmVzc2lvblN0YXRlbWVudCBleHByZXNzaW9uU3RhdGVtZW50ID0gKEV4cHJlc3Npb25TdGF0ZW1lbnQpIG5vZGUyOwotCQlFeHByZXNzaW9uIGV4ID0gZXhwcmVzc2lvblN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoIkFzc2lnbm1lbnQiLCBleCBpbnN0YW5jZW9mIEFzc2lnbm1lbnQpOyAvLyROT04tTkxTLTEkCi0JCUFzc2lnbm1lbnQgc3RhdGVtZW50ID0gKEFzc2lnbm1lbnQpIGV4OwotCQlFeHByZXNzaW9uIHJpZ2h0RXhwciA9IHN0YXRlbWVudC5nZXRSaWdodEhhbmRTaWRlKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhbiBpbnN0YW5jZW9mIGV4cHJlc3Npb24iLCByaWdodEV4cHIgaW5zdGFuY2VvZiBJbnN0YW5jZW9mRXhwcmVzc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gcmlnaHRFeHByLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgdHlwZSIsICJib29sZWFuIiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWNoZWNrU291cmNlUmFuZ2UocmlnaHRFeHByLCAiaW5uZXIgaW5zdGFuY2VvZiBJbm5lciIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9CQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDE5NygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTk3IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJQVNUTm9kZSBub2RlMiA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAxLCAwLCAxKTsKLQkJYXNzZXJ0VHJ1ZSgiRXhwcmVzc2lvblN0YXRlbWVudCIsIG5vZGUyIGluc3RhbmNlb2YgRXhwcmVzc2lvblN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJRXhwcmVzc2lvblN0YXRlbWVudCBleHByZXNzaW9uU3RhdGVtZW50ID0gKEV4cHJlc3Npb25TdGF0ZW1lbnQpIG5vZGUyOwotCQlFeHByZXNzaW9uIGV4ID0gZXhwcmVzc2lvblN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoIk1ldGhvZEludm9jYXRpb24iLCBleCBpbnN0YW5jZW9mIE1ldGhvZEludm9jYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCU1ldGhvZEludm9jYXRpb24gbWV0aG9kSW52b2NhdGlvbiA9IChNZXRob2RJbnZvY2F0aW9uKSBleDsKLQkJY2hlY2tTb3VyY2VSYW5nZShtZXRob2RJbnZvY2F0aW9uLCAiYS5nZXRGaWxlKCkvKlsqLy5nZXROYW1lKCkiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCUV4cHJlc3Npb24gcmVjZWl2ZXIgPSBtZXRob2RJbnZvY2F0aW9uLmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgbWV0aG9kIGludm9jYXRpb24iLCByZWNlaXZlciBpbnN0YW5jZW9mIE1ldGhvZEludm9jYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCU1ldGhvZEludm9jYXRpb24gbWV0aG9kSW52b2NhdGlvbjIgPSAoTWV0aG9kSW52b2NhdGlvbikgcmVjZWl2ZXI7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IG1ldGhvZEludm9jYXRpb24yLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJGaWxlIiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWNoZWNrU291cmNlUmFuZ2UobWV0aG9kSW52b2NhdGlvbjIsICJhLmdldEZpbGUoKSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9CQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDE5OCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMTk4IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJQVNUTm9kZSBub2RlMiA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiUmV0dXJuU3RhdGVtZW50Iiwgbm9kZTIgaW5zdGFuY2VvZiBSZXR1cm5TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCVJldHVyblN0YXRlbWVudCByZXR1cm5TdGF0ZW1lbnQgPSAoUmV0dXJuU3RhdGVtZW50KSBub2RlMjsKLQkJRXhwcmVzc2lvbiBleHByID0gcmV0dXJuU3RhdGVtZW50LmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGluZml4RXhwcmVzc2lvbiIsIGV4cHIgaW5zdGFuY2VvZiBJbmZpeEV4cHJlc3Npb24pOyAvLyROT04tTkxTLTEkCi0JCUluZml4RXhwcmVzc2lvbiBpbmZpeEV4cHJlc3Npb24gPSAoSW5maXhFeHByZXNzaW9uKSBleHByOwotCQlFeHByZXNzaW9uIGxlZnQgPSBpbmZpeEV4cHJlc3Npb24uZ2V0TGVmdE9wZXJhbmQoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIEluZml4RXhwcmVzc2lvbiIsIGxlZnQgaW5zdGFuY2VvZiBJbmZpeEV4cHJlc3Npb24pOyAvLyROT04tTkxTLTEkCi0JCUluZml4RXhwcmVzc2lvbiBpbmZpeEV4cHJlc3Npb24yID0gKEluZml4RXhwcmVzc2lvbikgbGVmdDsKLQkJRXhwcmVzc2lvbiByaWdodCA9IGluZml4RXhwcmVzc2lvbjIuZ2V0UmlnaHRPcGVyYW5kKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhbiBJbmZpeEV4cHJlc3Npb24iLCByaWdodCBpbnN0YW5jZW9mIEluZml4RXhwcmVzc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJSW5maXhFeHByZXNzaW9uIGluZml4RXhwcmVzc2lvbjMgPSAoSW5maXhFeHByZXNzaW9uKSByaWdodDsKLQkJYXNzZXJ0RXF1YWxzKCJBIG11bHRpcGxpY2F0aW9uIiwgSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLlRJTUVTLCBpbmZpeEV4cHJlc3Npb24zLmdldE9wZXJhdG9yKCkpOyAvLyROT04tTkxTLTEkCi0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IGluZml4RXhwcmVzc2lvbjMucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgaW50IiwgImludCIsIHR5cGVCaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQljaGVja1NvdXJjZVJhbmdlKGluZml4RXhwcmVzc2lvbjMsICIyMCAqIDMwIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0JCi0KLQkvKioKLQkgKiBJbml0aWFsaXplcgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMTk5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAxOTkiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlBU1ROb2RlIG5vZGUyID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnRUcnVlKCJWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50Iiwgbm9kZTIgaW5zdGFuY2VvZiBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCkgbm9kZTI7Ci0JCUxpc3QgZnJhZ21lbnRzID0gdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm8gZnJhZ21lbnQiLCBmcmFnbWVudHMuc2l6ZSgpID09IDEpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBmcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7Ci0JCUV4cHJlc3Npb24gaW5pdGlhbGl6YXRpb24gPSBmcmFnbWVudC5nZXRJbml0aWFsaXplcigpOwotCQlhc3NlcnRUcnVlKCJOb3QgYW4gaW5maXhFeHByZXNzaW9uIiwgaW5pdGlhbGl6YXRpb24gaW5zdGFuY2VvZiBJbmZpeEV4cHJlc3Npb24pOyAvLyROT04tTkxTLTEkCi0JCUluZml4RXhwcmVzc2lvbiBpbmZpeEV4cHJlc3Npb24gPSAoSW5maXhFeHByZXNzaW9uKSBpbml0aWFsaXphdGlvbjsKLQkJRXhwcmVzc2lvbiBsZWZ0ID0gaW5maXhFeHByZXNzaW9uLmdldExlZnRPcGVyYW5kKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhbiBJbmZpeEV4cHJlc3Npb24iLCBsZWZ0IGluc3RhbmNlb2YgSW5maXhFeHByZXNzaW9uKTsgLy8kTk9OLU5MUy0xJAotCQlJbmZpeEV4cHJlc3Npb24gaW5maXhFeHByZXNzaW9uMiA9IChJbmZpeEV4cHJlc3Npb24pIGxlZnQ7Ci0JCUV4cHJlc3Npb24gcmlnaHQgPSBpbmZpeEV4cHJlc3Npb24yLmdldFJpZ2h0T3BlcmFuZCgpOwotCQlhc3NlcnRUcnVlKCJOb3QgYW4gSW5maXhFeHByZXNzaW9uIiwgcmlnaHQgaW5zdGFuY2VvZiBJbmZpeEV4cHJlc3Npb24pOyAvLyROT04tTkxTLTEkCi0JCUluZml4RXhwcmVzc2lvbiBpbmZpeEV4cHJlc3Npb24zID0gKEluZml4RXhwcmVzc2lvbikgcmlnaHQ7Ci0JCWFzc2VydEVxdWFscygiQSBtdWx0aXBsaWNhdGlvbiIsIEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5USU1FUywgaW5maXhFeHByZXNzaW9uMy5nZXRPcGVyYXRvcigpKTsgLy8kTk9OLU5MUy0xJAotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBpbmZpeEV4cHJlc3Npb24zLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiTm90IGludCIsICJpbnQiLCB0eXBlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJY2hlY2tTb3VyY2VSYW5nZShpbmZpeEV4cHJlc3Npb24zLCAiMTAgKiAzMCIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9CQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDIwMCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjAwIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJQVNUTm9kZSBub2RlMiA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAxLCAwLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCIsIG5vZGUyIGluc3RhbmNlb2YgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIG5vZGUyOwotCQlMaXN0IGZyYWdtZW50cyA9IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuZnJhZ21lbnRzKCk7Ci0JCWFzc2VydFRydWUoIk5vIGZyYWdtZW50IiwgZnJhZ21lbnRzLnNpemUoKSA9PSAxKTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgZnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcmFnbWVudHMuZ2V0KDApOwotCQlFeHByZXNzaW9uIGluaXRpYWxpemF0aW9uID0gZnJhZ21lbnQuZ2V0SW5pdGlhbGl6ZXIoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGluZml4RXhwcmVzc2lvbiIsIGluaXRpYWxpemF0aW9uIGluc3RhbmNlb2YgRmllbGRBY2Nlc3MpOyAvLyROT04tTkxTLTEkCi0JCUZpZWxkQWNjZXNzIGZpZWxkQWNjZXNzID0gKEZpZWxkQWNjZXNzKSBpbml0aWFsaXphdGlvbjsKLQkJRXhwcmVzc2lvbiByZWNlaXZlciA9IGZpZWxkQWNjZXNzLmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgiQXJyYXlDcmVhdGlvbiIsIHJlY2VpdmVyIGluc3RhbmNlb2YgQXJyYXlDcmVhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJQXJyYXlDcmVhdGlvbiBhcnJheUNyZWF0aW9uID0gKEFycmF5Q3JlYXRpb24pIHJlY2VpdmVyOwotCQlMaXN0IGRpbWVuc2lvbnMgPSBhcnJheUNyZWF0aW9uLmRpbWVuc2lvbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBkaW1lbnNpb24iLCAxLCBkaW1lbnNpb25zLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJRXhwcmVzc2lvbiBkaW0gPSAoRXhwcmVzc2lvbikgZGltZW5zaW9ucy5nZXQoMCk7Ci0JCWFzc2VydFRydWUoIkluZml4RXhwcmVzc2lvbiIsIGRpbSBpbnN0YW5jZW9mIEluZml4RXhwcmVzc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJSW5maXhFeHByZXNzaW9uIGluZml4RXhwcmVzc2lvbiA9IChJbmZpeEV4cHJlc3Npb24pIGRpbTsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gaW5maXhFeHByZXNzaW9uLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiTm90IGludCIsICJpbnQiLCB0eXBlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJY2hlY2tTb3VyY2VSYW5nZShpbmZpeEV4cHJlc3Npb24sICIxICsgMiIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9CQotCi0JLyoqCi0JICogUG9zaXRpb24gaW5zaWRlIGZvciBzdGF0ZW1lbnQ6IFBSIDMzMDAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDIwMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjAxIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJQVNUTm9kZSBub2RlMiA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAxKTsKLQkJYXNzZXJ0VHJ1ZSgiRm9yU3RhdGVtZW50Iiwgbm9kZTIgaW5zdGFuY2VvZiBGb3JTdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCUZvclN0YXRlbWVudCBmb3JTdGF0ZW1lbnQgPSAoRm9yU3RhdGVtZW50KSBub2RlMjsKLQkJTGlzdCBpbml0aWFsaXplcnMgPSBmb3JTdGF0ZW1lbnQuaW5pdGlhbGl6ZXJzKCk7Ci0JCWFzc2VydFRydWUoIndyb25nIHNpemUiLCBpbml0aWFsaXplcnMuc2l6ZSgpID09IDEpOyAvLyROT04tTkxTLTEkCi0JCUV4cHJlc3Npb24gaW5pdCA9IChFeHByZXNzaW9uKSBpbml0aWFsaXplcnMuZ2V0KDApOwotCQljaGVja1NvdXJjZVJhbmdlKGluaXQsICJpbnQgaT0gMCIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogUFIgNzM4NgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjAyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyMDIiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlBU1ROb2RlIG5vZGUyID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDApOwotCQlhc3NlcnRUcnVlKCJGaWVsZERlY2xhcmF0aW9uIiwgbm9kZTIgaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSAoRmllbGREZWNsYXJhdGlvbikgbm9kZTI7Ci0JCWNoZWNrU291cmNlUmFuZ2UoZmllbGREZWNsYXJhdGlvbiwgImludCBmPSAoMik7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlMaXN0IGZyYWdtZW50cyA9IGZpZWxkRGVjbGFyYXRpb24uZnJhZ21lbnRzKCk7Ci0JCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDEsIGZyYWdtZW50cy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBmcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7Ci0JCUV4cHJlc3Npb24gaW5pdGlhbGl6YXRpb24gPSBmcmFnbWVudC5nZXRJbml0aWFsaXplcigpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24iLCBpbml0aWFsaXphdGlvbiBpbnN0YW5jZW9mIFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGluaXRpYWxpemF0aW9uLCAiKDIpIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBpbml0aWFsaXphdGlvbi5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgibm8gYmluZGluZyIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIm5vdCBpbnQiLCAiaW50IiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQkJCi0KLQkvKioKLQkgKiBQUiA3Mzg2Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyMDMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDIwMyIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCUFTVE5vZGUgbm9kZTIgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCk7Ci0JCWFzc2VydFRydWUoIkZpZWxkRGVjbGFyYXRpb24iLCBub2RlMiBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IChGaWVsZERlY2xhcmF0aW9uKSBub2RlMjsKLQkJY2hlY2tTb3VyY2VSYW5nZShmaWVsZERlY2xhcmF0aW9uLCAiaW50IGY9ICgyKTsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCUxpc3QgZnJhZ21lbnRzID0gZmllbGREZWNsYXJhdGlvbi5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMSwgZnJhZ21lbnRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IGZyYWdtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgZnJhZ21lbnRzLmdldCgwKTsKLQkJRXhwcmVzc2lvbiBpbml0aWFsaXphdGlvbiA9IGZyYWdtZW50LmdldEluaXRpYWxpemVyKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbiIsIGluaXRpYWxpemF0aW9uIGluc3RhbmNlb2YgUGFyZW50aGVzaXplZEV4cHJlc3Npb24pOyAvLyROT04tTkxTLTEkCi0JCVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHBhcmVudGhlc2l6ZWRFeHByZXNzaW9uID0gKFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKSBpbml0aWFsaXphdGlvbjsKLQkJY2hlY2tTb3VyY2VSYW5nZShwYXJlbnRoZXNpemVkRXhwcmVzc2lvbiwgIigyKSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJRXhwcmVzc2lvbiBleHByID0gcGFyZW50aGVzaXplZEV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvbigpOwotCQljaGVja1NvdXJjZVJhbmdlKGV4cHIsICIyIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBleHByLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJubyBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygibm90IGludCIsICJpbnQiLCB0eXBlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0VHJ1ZSgidHlwZSBiaW5kaW5nIGlzIGNhbm9uaWNhbCIsIHR5cGVCaW5kaW5nID09IHBhcmVudGhlc2l6ZWRFeHByZXNzaW9uLnJlc29sdmVUeXBlQmluZGluZygpKTsgLy8kTk9OLU5MUy0xJAotCX0JCQotCi0JLyoqCi0JICogUFIgNzM4NgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjA0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyMDQiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlBU1ROb2RlIG5vZGUyID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDApOwotCQlhc3NlcnRUcnVlKCJGaWVsZERlY2xhcmF0aW9uIiwgbm9kZTIgaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSAoRmllbGREZWNsYXJhdGlvbikgbm9kZTI7Ci0JCWNoZWNrU291cmNlUmFuZ2UoZmllbGREZWNsYXJhdGlvbiwgImludCBmPSAoKDIpKTsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCUxpc3QgZnJhZ21lbnRzID0gZmllbGREZWNsYXJhdGlvbi5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMSwgZnJhZ21lbnRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IGZyYWdtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgZnJhZ21lbnRzLmdldCgwKTsKLQkJRXhwcmVzc2lvbiBpbml0aWFsaXphdGlvbiA9IGZyYWdtZW50LmdldEluaXRpYWxpemVyKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbiIsIGluaXRpYWxpemF0aW9uIGluc3RhbmNlb2YgUGFyZW50aGVzaXplZEV4cHJlc3Npb24pOyAvLyROT04tTkxTLTEkCi0JCVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHBhcmVudGhlc2l6ZWRFeHByZXNzaW9uID0gKFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKSBpbml0aWFsaXphdGlvbjsKLQkJY2hlY2tTb3VyY2VSYW5nZShwYXJlbnRoZXNpemVkRXhwcmVzc2lvbiwgIigoMikpIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlFeHByZXNzaW9uIGV4cHIgPSBwYXJlbnRoZXNpemVkRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbiIsIGV4cHIgaW5zdGFuY2VvZiBQYXJlbnRoZXNpemVkRXhwcmVzc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJUGFyZW50aGVzaXplZEV4cHJlc3Npb24gcGFyZW50aGVzaXplZEV4cHJlc3Npb24yID0gKFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKSBleHByOwotCQljaGVja1NvdXJjZVJhbmdlKHBhcmVudGhlc2l6ZWRFeHByZXNzaW9uMiwgIigyKSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJZXhwciA9IHBhcmVudGhlc2l6ZWRFeHByZXNzaW9uMi5nZXRFeHByZXNzaW9uKCk7Ci0JCWNoZWNrU291cmNlUmFuZ2UoZXhwciwgIjIiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IGV4cHIucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIm5vIGJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJub3QgaW50IiwgImludCIsIHR5cGVCaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0eXBlQmluZGluZyA9IHBhcmVudGhlc2l6ZWRFeHByZXNzaW9uLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJubyBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygibm90IGludCIsICJpbnQiLCB0eXBlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0VHJ1ZSgidHlwZSBiaW5kaW5nIGlzIGNhbm9uaWNhbCIsIHR5cGVCaW5kaW5nID09IHBhcmVudGhlc2l6ZWRFeHByZXNzaW9uMi5yZXNvbHZlVHlwZUJpbmRpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9CQkKLQotCi0JLyoqCi0JICogTG9jYWwgY2xhc3MgZW5kIHBvc2l0aW9uIHdoZW4gdHJhaWxpbmcgY29tbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjA1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyMDUiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlBU1ROb2RlIG5vZGUyID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnRUcnVlKCJUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQiLCBub2RlMiBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvblN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50IHR5cGVEZWNsYXJhdGlvblN0YXRlbWVudCA9IChUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIG5vZGUyOwotCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gdHlwZURlY2xhcmF0aW9uU3RhdGVtZW50LmdldFR5cGVEZWNsYXJhdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAiQUEiLCB0eXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQljaGVja1NvdXJjZVJhbmdlKHR5cGVEZWNsYXJhdGlvbiwgImNsYXNzIEFBIGV4dGVuZHMgVGVzdCB7fSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9CQkKLQotCS8qKgotCSAqIFF1YWxpZmllZE5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDIwNigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjA2IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJQVNUTm9kZSBub2RlMiA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAyLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiUmV0dXJuU3RhdGVtZW50Iiwgbm9kZTIgaW5zdGFuY2VvZiBSZXR1cm5TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCVJldHVyblN0YXRlbWVudCByZXR1cm5TdGF0ZW1lbnQgPSAoUmV0dXJuU3RhdGVtZW50KSBub2RlMjsKLQkJRXhwcmVzc2lvbiBleHByID0gcmV0dXJuU3RhdGVtZW50LmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgcXVhbGlmaWVkTmFtZSIsIGV4cHIgaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlRdWFsaWZpZWROYW1lIHF1YWxpZmllZE5hbWUgPSAoUXVhbGlmaWVkTmFtZSkgZXhwcjsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gZXhwci5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiTm90IGFuIGludCAodHlwZUJpbmRpbmcpIiwgImludCIsIHR5cGVCaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQljaGVja1NvdXJjZVJhbmdlKHF1YWxpZmllZE5hbWUsICJmaWVsZC5maWVsZC5maWVsZC5maWVsZC5pIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgYSBzaW1wbGUgbmFtZSIsIHF1YWxpZmllZE5hbWUuZ2V0TmFtZSgpLmlzU2ltcGxlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlTaW1wbGVOYW1lIHNpbXBsZU5hbWUgPSBxdWFsaWZpZWROYW1lLmdldE5hbWUoKTsKLQkJYXNzZXJ0VHJ1ZSgiYSBkZWNsYXJhdGlvbiIsICFzaW1wbGVOYW1lLmlzRGVjbGFyYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShzaW1wbGVOYW1lLCAiaSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nMiA9IHNpbXBsZU5hbWUucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHR5cGViaW5kaW5nMiIsIHR5cGVCaW5kaW5nMik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYW4gaW50ICh0eXBlQmluZGluZzIpIiwgImludCIsIHR5cGVCaW5kaW5nMi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJSUJpbmRpbmcgYmluZGluZyA9IHNpbXBsZU5hbWUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZyIsIGJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlZhcmlhYmxlQmluZGluZyIsIGJpbmRpbmcgaW5zdGFuY2VvZiBJVmFyaWFibGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IChJVmFyaWFibGVCaW5kaW5nKSBiaW5kaW5nOwotCQlhc3NlcnRFcXVhbHMoIk5vdCBUZXN0IiwgIlRlc3QiLCB2YXJpYWJsZUJpbmRpbmcuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgZGVmYXVsdCIsIE1vZGlmaWVyLlBVQkxJQywgdmFyaWFibGVCaW5kaW5nLmdldE1vZGlmaWVycygpKTsgLy8kTk9OLU5MUy0xJAotCQlOYW1lIHF1YWxpZmllck5hbWUgPSBxdWFsaWZpZWROYW1lLmdldFF1YWxpZmllcigpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBxdWFsaWZpZWQgbmFtZSIsIHF1YWxpZmllck5hbWUuaXNRdWFsaWZpZWROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UocXVhbGlmaWVyTmFtZSwgImZpZWxkLmZpZWxkLmZpZWxkLmZpZWxkIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmc1ID0gcXVhbGlmaWVyTmFtZS5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZzUiLCB0eXBlQmluZGluZzUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiTm90IFRlc3QiLCAiVGVzdCIsIHR5cGVCaW5kaW5nNS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlxdWFsaWZpZWROYW1lID0gKFF1YWxpZmllZE5hbWUpIHF1YWxpZmllck5hbWU7Ci0JCXNpbXBsZU5hbWUgPSBxdWFsaWZpZWROYW1lLmdldE5hbWUoKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShzaW1wbGVOYW1lLCAiZmllbGQiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZzYgPSBzaW1wbGVOYW1lLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nNiIsIHR5cGVCaW5kaW5nNik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgVGVzdCIsICJUZXN0IiwgdHlwZUJpbmRpbmc2LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkKLQkJcXVhbGlmaWVyTmFtZSA9IHF1YWxpZmllZE5hbWUuZ2V0UXVhbGlmaWVyKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHF1YWxpZmllZCBuYW1lIiwgcXVhbGlmaWVyTmFtZS5pc1F1YWxpZmllZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShxdWFsaWZpZXJOYW1lLCAiZmllbGQuZmllbGQuZmllbGQiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZzcgPSBxdWFsaWZpZXJOYW1lLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nNyIsIHR5cGVCaW5kaW5nNyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgVGVzdCIsICJUZXN0IiwgdHlwZUJpbmRpbmc3LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkKLQkJcXVhbGlmaWVkTmFtZSA9IChRdWFsaWZpZWROYW1lKSBxdWFsaWZpZXJOYW1lOwotCQlzaW1wbGVOYW1lID0gcXVhbGlmaWVkTmFtZS5nZXROYW1lKCk7Ci0JCWNoZWNrU291cmNlUmFuZ2Uoc2ltcGxlTmFtZSwgImZpZWxkIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlxdWFsaWZpZXJOYW1lID0gcXVhbGlmaWVkTmFtZS5nZXRRdWFsaWZpZXIoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgcXVhbGlmaWVkIG5hbWUiLCBxdWFsaWZpZXJOYW1lLmlzUXVhbGlmaWVkTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKHF1YWxpZmllck5hbWUsICJmaWVsZC5maWVsZCIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nMyA9IHF1YWxpZmllck5hbWUucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmczIiwgdHlwZUJpbmRpbmczKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIk5vdCBUZXN0IiwgIlRlc3QiLCB0eXBlQmluZGluZzMuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXF1YWxpZmllZE5hbWUgPSAoUXVhbGlmaWVkTmFtZSkgcXVhbGlmaWVyTmFtZTsKLQkJc2ltcGxlTmFtZSA9IHF1YWxpZmllZE5hbWUuZ2V0TmFtZSgpOwotCQljaGVja1NvdXJjZVJhbmdlKHNpbXBsZU5hbWUsICJmaWVsZCIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJcXVhbGlmaWVyTmFtZSA9IHF1YWxpZmllZE5hbWUuZ2V0UXVhbGlmaWVyKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHNpbXBsZSBuYW1lIiwgcXVhbGlmaWVyTmFtZS5pc1NpbXBsZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiYSBkZWNsYXJhdGlvbiIsICEoKFNpbXBsZU5hbWUpcXVhbGlmaWVyTmFtZSkuaXNEZWNsYXJhdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKHF1YWxpZmllck5hbWUsICJmaWVsZCIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nNCA9IHF1YWxpZmllck5hbWUucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmc0IiwgdHlwZUJpbmRpbmc0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIk5vdCBUZXN0IiwgIlRlc3QiLCB0eXBlQmluZGluZzQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogQ2hlY2sgamF2YWRvYyBmb3IgTWV0aG9kRGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDIwNygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjA3IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgbm9kZSBpcyBub3QgYSBNZXRob2REZWNsYXJhdGlvbiIsIG5vZGUgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJSmF2YWRvYyBhY3R1YWxKYXZhZG9jID0gKChNZXRob2REZWNsYXJhdGlvbikgbm9kZSkuZ2V0SmF2YWRvYygpOwotCQlKYXZhZG9jIGphdmFkb2MgPSB0aGlzLmFzdC5uZXdKYXZhZG9jKCk7Ci0JCWphdmFkb2Muc2V0Q29tbWVudCgiLyoqIEphdmFEb2MgQ29tbWVudCovIik7Ly8kTk9OLU5MUy0xJCovCi0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBqYXZhZG9jLnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBhY3R1YWxKYXZhZG9jKSk7Ly8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICIvKiogSmF2YURvYyBDb21tZW50Ki9cbiAgdm9pZCBmb28oZmluYWwgaW50IGkpIHt9Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGFjdHVhbEphdmFkb2MsICIvKiogSmF2YURvYyBDb21tZW50Ki8iLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIENoZWNrIGphdmFkb2MgZm9yIE1ldGhvZERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyMDgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDIwOCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIG5vZGUgaXMgbm90IGEgTWV0aG9kRGVjbGFyYXRpb24iLCBub2RlIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCUphdmFkb2MgYWN0dWFsSmF2YWRvYyA9ICgoTWV0aG9kRGVjbGFyYXRpb24pIG5vZGUpLmdldEphdmFkb2MoKTsKLQkJYXNzZXJ0VHJ1ZSgiSmF2YWRvYyBtdXN0IGJlIG51bGwiLCBhY3R1YWxKYXZhZG9jID09IG51bGwpOy8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAidm9pZCBmb28oZmluYWwgaW50IGkpIHt9Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENoZWNrIGphdmFkb2MgZm9yIE1ldGhvZERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyMDkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDIwOSIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIG5vZGUgaXMgbm90IGEgTWV0aG9kRGVjbGFyYXRpb24iLCBub2RlIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCUphdmFkb2MgYWN0dWFsSmF2YWRvYyA9ICgoTWV0aG9kRGVjbGFyYXRpb24pIG5vZGUpLmdldEphdmFkb2MoKTsKLQkJYXNzZXJ0VHJ1ZSgiSmF2YWRvYyBtdXN0IGJlIG51bGwiLCBhY3R1YWxKYXZhZG9jID09IG51bGwpOy8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAidm9pZCBmb28oZmluYWwgaW50IGkpIHt9Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENoZWNrIGphdmFkb2MgZm9yIEZpZWxkRGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDIxMCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjEwIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgbm9kZSBpcyBub3QgYSBGaWVsZERlY2xhcmF0aW9uIiwgbm9kZSBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCUphdmFkb2MgYWN0dWFsSmF2YWRvYyA9ICgoRmllbGREZWNsYXJhdGlvbikgbm9kZSkuZ2V0SmF2YWRvYygpOwotCQlKYXZhZG9jIGphdmFkb2MgPSB0aGlzLmFzdC5uZXdKYXZhZG9jKCk7Ci0JCWphdmFkb2Muc2V0Q29tbWVudCgiLyoqIEphdmFEb2MgQ29tbWVudCovIik7Ly8kTk9OLU5MUy0xJCovCi0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBqYXZhZG9jLnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBhY3R1YWxKYXZhZG9jKSk7Ly8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICIvKiogSmF2YURvYyBDb21tZW50Ki9cbiAgaW50IGk7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENoZWNrIGphdmFkb2MgZm9yIEZpZWxkRGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDIxMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjExIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgbm9kZSBpcyBub3QgYSBGaWVsZERlY2xhcmF0aW9uIiwgbm9kZSBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCUphdmFkb2MgYWN0dWFsSmF2YWRvYyA9ICgoRmllbGREZWNsYXJhdGlvbikgbm9kZSkuZ2V0SmF2YWRvYygpOwotCQlhc3NlcnRUcnVlKCJKYXZhZG9jIG11c3QgYmUgbnVsbCIsIGFjdHVhbEphdmFkb2MgPT0gbnVsbCk7Ly8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJpbnQgaTsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ2hlY2sgamF2YWRvYyBmb3IgRmllbGREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjEyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyMTIiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBub2RlIGlzIG5vdCBhIEZpZWxkRGVjbGFyYXRpb24iLCBub2RlIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJSmF2YWRvYyBhY3R1YWxKYXZhZG9jID0gKChGaWVsZERlY2xhcmF0aW9uKSBub2RlKS5nZXRKYXZhZG9jKCk7Ci0JCWFzc2VydFRydWUoIkphdmFkb2MgbXVzdCBiZSBudWxsIiwgYWN0dWFsSmF2YWRvYyA9PSBudWxsKTsvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImludCBpOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBqYXZhZG9jIGZvciBUeXBlRGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDIxMygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjEzIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgbm9kZSBpcyBub3QgYSBUeXBlRGVjbGFyYXRpb24iLCBub2RlIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlKYXZhZG9jIGFjdHVhbEphdmFkb2MgPSAoKFR5cGVEZWNsYXJhdGlvbikgbm9kZSkuZ2V0SmF2YWRvYygpOwotCQlhc3NlcnRUcnVlKCJKYXZhZG9jIG11c3QgYmUgbnVsbCIsIGFjdHVhbEphdmFkb2MgPT0gbnVsbCk7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZXhwZWN0ZWRDb250ZW50cyA9ICJwdWJsaWMgY2xhc3MgVGVzdCB7XG4iICsvLyROT04tTkxTLTEkCi0JCQkiICBpbnQgaTtcbiIgICsvLyROT04tTkxTLTEkCi0JCQkifSI7Ly8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsIGV4cGVjdGVkQ29udGVudHMsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBqYXZhZG9jIGZvciBUeXBlRGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDIxNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjE0IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgbm9kZSBpcyBub3QgYSBUeXBlRGVjbGFyYXRpb24iLCBub2RlIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlKYXZhZG9jIGFjdHVhbEphdmFkb2MgPSAoKFR5cGVEZWNsYXJhdGlvbikgbm9kZSkuZ2V0SmF2YWRvYygpOwotCQlhc3NlcnRUcnVlKCJKYXZhZG9jIG11c3QgYmUgbnVsbCIsIGFjdHVhbEphdmFkb2MgPT0gbnVsbCk7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZXhwZWN0ZWRDb250ZW50cyA9ICJwdWJsaWMgY2xhc3MgVGVzdCB7XG4iICsvLyROT04tTkxTLTEkCi0JCQkiICBpbnQgaTtcbiIgICsvLyROT04tTkxTLTEkCi0JCQkifSI7Ly8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsIGV4cGVjdGVkQ29udGVudHMsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBqYXZhZG9jIGZvciBUeXBlRGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDIxNSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjE1IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgbm9kZSBpcyBub3QgYSBUeXBlRGVjbGFyYXRpb24iLCBub2RlIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlKYXZhZG9jIGFjdHVhbEphdmFkb2MgPSAoKFR5cGVEZWNsYXJhdGlvbikgbm9kZSkuZ2V0SmF2YWRvYygpOwotCQlKYXZhZG9jIGphdmFkb2MgPSB0aGlzLmFzdC5uZXdKYXZhZG9jKCk7Ci0JCWphdmFkb2Muc2V0Q29tbWVudCgiLyoqIEphdmFEb2MgQ29tbWVudCovIik7Ly8kTk9OLU5MUy0xJCovCi0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBqYXZhZG9jLnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBhY3R1YWxKYXZhZG9jKSk7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZXhwZWN0ZWRDb250ZW50cyA9IAotCQkJICIvKiogSmF2YURvYyBDb21tZW50Ki9cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIFRlc3Qge1xuIiArLy8kTk9OLU5MUy0xJAotCQkJIiAgaW50IGk7XG4iICArLy8kTk9OLU5MUy0xJAotCQkJIn0iOy8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCBleHBlY3RlZENvbnRlbnRzLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UoYWN0dWFsSmF2YWRvYywgIi8qKiBKYXZhRG9jIENvbW1lbnQqLyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBqYXZhZG9jIGZvciBNZW1iZXJUeXBlRGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDIxNigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjE2IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgbm9kZSBpcyBub3QgYSBUeXBlRGVjbGFyYXRpb24iLCBub2RlIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlKYXZhZG9jIGFjdHVhbEphdmFkb2MgPSAoKFR5cGVEZWNsYXJhdGlvbikgbm9kZSkuZ2V0SmF2YWRvYygpOwotCQlKYXZhZG9jIGphdmFkb2MgPSB0aGlzLmFzdC5uZXdKYXZhZG9jKCk7Ci0JCWphdmFkb2Muc2V0Q29tbWVudCgiLyoqIEphdmFEb2MgQ29tbWVudCovIik7Ly8kTk9OLU5MUy0xJCovCi0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBqYXZhZG9jLnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBhY3R1YWxKYXZhZG9jKSk7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZXhwZWN0ZWRDb250ZW50cyA9IAotCQkJICIvKiogSmF2YURvYyBDb21tZW50Ki9cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkgIiAgY2xhc3MgQiB7fSI7Ly8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsIGV4cGVjdGVkQ29udGVudHMsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShhY3R1YWxKYXZhZG9jLCAiLyoqIEphdmFEb2MgQ29tbWVudCovIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENoZWNrIGphdmFkb2MgZm9yIE1lbWJlclR5cGVEZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjE3KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyMTciLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBub2RlIGlzIG5vdCBhIFR5cGVEZWNsYXJhdGlvbiIsIG5vZGUgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCUphdmFkb2MgYWN0dWFsSmF2YWRvYyA9ICgoVHlwZURlY2xhcmF0aW9uKSBub2RlKS5nZXRKYXZhZG9jKCk7Ci0JCWFzc2VydFRydWUoIkphdmFkb2MgbXVzdCBiZSBudWxsIiwgYWN0dWFsSmF2YWRvYyA9PSBudWxsKTsvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImNsYXNzIEIge30iLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ2hlY2sgamF2YWRvYyBmb3IgTWVtYmVyVHlwZURlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyMTgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDIxOCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIG5vZGUgaXMgbm90IGEgVHlwZURlY2xhcmF0aW9uIiwgbm9kZSBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJSmF2YWRvYyBhY3R1YWxKYXZhZG9jID0gKChUeXBlRGVjbGFyYXRpb24pIG5vZGUpLmdldEphdmFkb2MoKTsKLQkJYXNzZXJ0VHJ1ZSgiSmF2YWRvYyBtdXN0IGJlIG51bGwiLCBhY3R1YWxKYXZhZG9jID09IG51bGwpOy8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAicHVibGljIHN0YXRpYyBjbGFzcyBCIHt9Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENoZWNrIGphdmFkb2MgZm9yIE1lbWJlclR5cGVEZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjE5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyMTkiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBub2RlIGlzIG5vdCBhIFR5cGVEZWNsYXJhdGlvbiIsIG5vZGUgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCUphdmFkb2MgYWN0dWFsSmF2YWRvYyA9ICgoVHlwZURlY2xhcmF0aW9uKSBub2RlKS5nZXRKYXZhZG9jKCk7Ci0JCWFzc2VydFRydWUoIkphdmFkb2MgbXVzdCBiZSBudWxsIiwgYWN0dWFsSmF2YWRvYyA9PSBudWxsKTsvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgInB1YmxpYyBzdGF0aWMgY2xhc3MgQiB7fSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDaGVja2luZyBpbml0aWFsaXplcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDIyMCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjIwIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJ7fSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDaGVja2luZyBpbml0aWFsaXplcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDIyMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjIxIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJzdGF0aWMge30iLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ2hlY2tpbmcgaW5pdGlhbGl6ZXJzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyMjIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDIyMiIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJSmF2YWRvYyBhY3R1YWxKYXZhZG9jID0gKChJbml0aWFsaXplcikgbm9kZSkuZ2V0SmF2YWRvYygpOwotCQlhc3NlcnROb3ROdWxsKCJKYXZhZG9jIGNvbW1lbnQgc2hvdWxkIG5vIGJlIG51bGwiLCBhY3R1YWxKYXZhZG9jKTsgLy8kTk9OLU5MUy0xJAotCQlKYXZhZG9jIGphdmFkb2MgPSB0aGlzLmFzdC5uZXdKYXZhZG9jKCk7Ci0JCWphdmFkb2Muc2V0Q29tbWVudCgiLyoqIEphdmFEb2MgQ29tbWVudCovIik7Ly8kTk9OLU5MUy0xJCovCi0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBqYXZhZG9jLnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBhY3R1YWxKYXZhZG9jKSk7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZXhwZWN0ZWRDb250ZW50cyA9IAotCQkJICIvKiogSmF2YURvYyBDb21tZW50Ki9cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkgIiAgc3RhdGljIHt9IjsvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgZXhwZWN0ZWRDb250ZW50cywgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGFjdHVhbEphdmFkb2MsICIvKiogSmF2YURvYyBDb21tZW50Ki8iLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCQotCX0KLQotCS8qKgotCSAqIENoZWNraW5nIGluaXRpYWxpemVycwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjIzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyMjMiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCUphdmFkb2MgYWN0dWFsSmF2YWRvYyA9ICgoSW5pdGlhbGl6ZXIpIG5vZGUpLmdldEphdmFkb2MoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiSmF2YWRvYyBjb21tZW50IHNob3VsZCBub3QgYmUgbnVsbCIsIGFjdHVhbEphdmFkb2MpOyAvLyROT04tTkxTLTEkCi0JCUphdmFkb2MgamF2YWRvYyA9IHRoaXMuYXN0Lm5ld0phdmFkb2MoKTsKLQkJamF2YWRvYy5zZXRDb21tZW50KCIvKiogSmF2YURvYyBDb21tZW50Ki8iKTsvLyROT04tTkxTLTEkKi8KLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIGphdmFkb2Muc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIGFjdHVhbEphdmFkb2MpKTsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBleHBlY3RlZENvbnRlbnRzID0gCi0JCQkgIi8qKiBKYXZhRG9jIENvbW1lbnQqL1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSAiICB7fSI7Ly8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsIGV4cGVjdGVkQ29udGVudHMsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShhY3R1YWxKYXZhZG9jLCAiLyoqIEphdmFEb2MgQ29tbWVudCovIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQkKLQl9Ci0KLQkvKioKLQkgKiBDaGVja2luZyBpbml0aWFsaXplcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDIyNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjI0IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlKYXZhZG9jIGFjdHVhbEphdmFkb2MgPSAoKEluaXRpYWxpemVyKSBub2RlKS5nZXRKYXZhZG9jKCk7Ci0JCWFzc2VydE51bGwoIkphdmFkb2MgY29tbWVudCBzaG91bGQgYmUgbnVsbCIsIGFjdHVhbEphdmFkb2MpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgInt9Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENvbnRpbnVlID09PiBDb250aW51ZVN0YXRlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjI1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyMjUiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlMYWJlbGVkU3RhdGVtZW50IGxhYmVsZWRTdGF0ZW1lbnQgPSAoTGFiZWxlZFN0YXRlbWVudCkgZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQljaGVja1NvdXJjZVJhbmdlKGxhYmVsZWRTdGF0ZW1lbnQuZ2V0TGFiZWwoKSwgImxhYmVsIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlGb3JTdGF0ZW1lbnQgZm9yU3RhdGVtZW50ID0gKEZvclN0YXRlbWVudCkgbGFiZWxlZFN0YXRlbWVudC5nZXRCb2R5KCk7Ci0JCUNvbnRpbnVlU3RhdGVtZW50IHN0YXRlbWVudCA9IChDb250aW51ZVN0YXRlbWVudCkgKChCbG9jaykgZm9yU3RhdGVtZW50LmdldEJvZHkoKSkuc3RhdGVtZW50cygpLmdldCgwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBzdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCUNvbnRpbnVlU3RhdGVtZW50IGNvbnRpbnVlU3RhdGVtZW50ID0gdGhpcy5hc3QubmV3Q29udGludWVTdGF0ZW1lbnQoKTsKLQkJY29udGludWVTdGF0ZW1lbnQuc2V0TGFiZWwodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgibGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIGNvbnRpbnVlU3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBzdGF0ZW1lbnQpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShzdGF0ZW1lbnQsICJjb250aW51ZSBsYWJlbDsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uoc3RhdGVtZW50LmdldExhYmVsKCksICJsYWJlbCIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCQotCS8qKgotCSAqIEJyZWFrICsgbGFiZWwgID09PiBCcmVha1N0YXRlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjI2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyMjYiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlMYWJlbGVkU3RhdGVtZW50IGxhYmVsZWRTdGF0ZW1lbnQgPSAoTGFiZWxlZFN0YXRlbWVudCkgZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQljaGVja1NvdXJjZVJhbmdlKGxhYmVsZWRTdGF0ZW1lbnQuZ2V0TGFiZWwoKSwgImxhYmVsIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlGb3JTdGF0ZW1lbnQgZm9yU3RhdGVtZW50ID0gKEZvclN0YXRlbWVudCkgbGFiZWxlZFN0YXRlbWVudC5nZXRCb2R5KCk7Ci0JCUJyZWFrU3RhdGVtZW50IHN0YXRlbWVudCA9IChCcmVha1N0YXRlbWVudCkgKChCbG9jaykgZm9yU3RhdGVtZW50LmdldEJvZHkoKSkuc3RhdGVtZW50cygpLmdldCgwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBzdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCUJyZWFrU3RhdGVtZW50IGJyZWFrU3RhdGVtZW50ID0gdGhpcy5hc3QubmV3QnJlYWtTdGF0ZW1lbnQoKTsKLQkJYnJlYWtTdGF0ZW1lbnQuc2V0TGFiZWwodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgibGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIGJyZWFrU3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBzdGF0ZW1lbnQpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShzdGF0ZW1lbnQsICJicmVhayBsYWJlbDsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uoc3RhdGVtZW50LmdldExhYmVsKCksICJsYWJlbCIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBRdWFsaWZpZWROYW1lCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyMjcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDIyNyIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCUFTVE5vZGUgbm9kZTIgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMywgMiwgMCk7Ci0JCWFzc2VydFRydWUoIlJldHVyblN0YXRlbWVudCIsIG5vZGUyIGluc3RhbmNlb2YgUmV0dXJuU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlSZXR1cm5TdGF0ZW1lbnQgcmV0dXJuU3RhdGVtZW50ID0gKFJldHVyblN0YXRlbWVudCkgbm9kZTI7Ci0JCUV4cHJlc3Npb24gZXhwciA9IHJldHVyblN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHF1YWxpZmllZE5hbWUiLCBleHByIGluc3RhbmNlb2YgUXVhbGlmaWVkTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJUXVhbGlmaWVkTmFtZSBxdWFsaWZpZWROYW1lID0gKFF1YWxpZmllZE5hbWUpIGV4cHI7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IGV4cHIucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHR5cGUgYmluZGluZyIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIk5vdCBhbiBsb25nICh0eXBlQmluZGluZykiLCAibG9uZyIsIHR5cGVCaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQljaGVja1NvdXJjZVJhbmdlKHF1YWxpZmllZE5hbWUsICJmaWVsZC5mQi5mQS5qIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCi0JCVNpbXBsZU5hbWUgc2ltcGxlTmFtZSA9IHF1YWxpZmllZE5hbWUuZ2V0TmFtZSgpOwotCQljaGVja1NvdXJjZVJhbmdlKHNpbXBsZU5hbWUsICJqIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcyID0gc2ltcGxlTmFtZS5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYW4gbG9uZyAodHlwZUJpbmRpbmcyKSIsICJsb25nIiwgdHlwZUJpbmRpbmcyLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlJQmluZGluZyBiaW5kaW5nID0gc2ltcGxlTmFtZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgYmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVmFyaWFibGVCaW5kaW5nIiwgYmluZGluZyBpbnN0YW5jZW9mIElWYXJpYWJsZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gKElWYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmc7Ci0JCWFzc2VydEVxdWFscygiTm90IEEiLCAiQSIsIHZhcmlhYmxlQmluZGluZy5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRFcXVhbHMoIk5vdCBkZWZhdWx0IiwgTW9kaWZpZXIuTk9ORSwgdmFyaWFibGVCaW5kaW5nLmdldE1vZGlmaWVycygpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAiaiIsIHZhcmlhYmxlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlOYW1lIHF1YWxpZmllck5hbWUgPSBxdWFsaWZpZWROYW1lLmdldFF1YWxpZmllcigpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBxdWFsaWZpZWQgbmFtZSIsIHF1YWxpZmllck5hbWUuaXNRdWFsaWZpZWROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UocXVhbGlmaWVyTmFtZSwgImZpZWxkLmZCLmZBIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlxdWFsaWZpZWROYW1lID0gKFF1YWxpZmllZE5hbWUpIHF1YWxpZmllck5hbWU7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZzMgPSBxdWFsaWZpZWROYW1lLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyB0eXBlIGJpbmRpbmczIiwgdHlwZUJpbmRpbmczKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIk5vdCBhbiBBIiwgIkEiLCB0eXBlQmluZGluZzMuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNpbXBsZU5hbWUgPSBxdWFsaWZpZWROYW1lLmdldE5hbWUoKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShzaW1wbGVOYW1lLCAiZkEiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZzQgPSBzaW1wbGVOYW1lLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyB0eXBlQmluZGluZzQiLCB0eXBlQmluZGluZzQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiTm90IGFuIEEiLCAiQSIsIHR5cGVCaW5kaW5nNC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJSUJpbmRpbmcgYmluZGluZzIgPSBxdWFsaWZpZWROYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmcyIiwgYmluZGluZzIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlZhcmlhYmxlQmluZGluZyIsIGJpbmRpbmcyIGluc3RhbmNlb2YgSVZhcmlhYmxlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJSVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcyID0gKElWYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmcyOwotCQlhc3NlcnRFcXVhbHMoIk5vdCBCIiwgIkIiLCB2YXJpYWJsZUJpbmRpbmcyLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygiTm90IGRlZmF1bHQiLCBNb2RpZmllci5OT05FLCB2YXJpYWJsZUJpbmRpbmcyLmdldE1vZGlmaWVycygpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAiZkEiLCB2YXJpYWJsZUJpbmRpbmcyLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkKLQkJcXVhbGlmaWVyTmFtZSA9IHF1YWxpZmllZE5hbWUuZ2V0UXVhbGlmaWVyKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHF1YWxpZmllZCBuYW1lIiwgcXVhbGlmaWVyTmFtZS5pc1F1YWxpZmllZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShxdWFsaWZpZXJOYW1lLCAiZmllbGQuZkIiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCXF1YWxpZmllZE5hbWUgPSAoUXVhbGlmaWVkTmFtZSkgcXVhbGlmaWVyTmFtZTsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nNSA9IHF1YWxpZmllZE5hbWUucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHR5cGVCaW5kaW5nNSIsIHR5cGVCaW5kaW5nNSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBCIiwgIkIiLCB0eXBlQmluZGluZzUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNpbXBsZU5hbWUgPSBxdWFsaWZpZWROYW1lLmdldE5hbWUoKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShzaW1wbGVOYW1lLCAiZkIiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZzYgPSBzaW1wbGVOYW1lLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyB0eXBlYmluZGluZzYiLCB0eXBlQmluZGluZzYpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygibm90IGEgQiIsICJCIiwgdHlwZUJpbmRpbmc2LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlJQmluZGluZyBiaW5kaW5nMyA9IHF1YWxpZmllZE5hbWUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZzIiLCBiaW5kaW5nMyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVmFyaWFibGVCaW5kaW5nIiwgYmluZGluZzMgaW5zdGFuY2VvZiBJVmFyaWFibGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZzMgPSAoSVZhcmlhYmxlQmluZGluZykgYmluZGluZzM7Ci0JCWFzc2VydEVxdWFscygiTm90IEMiLCAiQyIsIHZhcmlhYmxlQmluZGluZzMuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgZGVmYXVsdCIsIE1vZGlmaWVyLk5PTkUsIHZhcmlhYmxlQmluZGluZzMuZ2V0TW9kaWZpZXJzKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJmQiIsIHZhcmlhYmxlQmluZGluZzMuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQotCQlxdWFsaWZpZXJOYW1lID0gcXVhbGlmaWVkTmFtZS5nZXRRdWFsaWZpZXIoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgc2ltcGxlIG5hbWUiLCBxdWFsaWZpZXJOYW1lLmlzU2ltcGxlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKHF1YWxpZmllck5hbWUsICJmaWVsZCIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJc2ltcGxlTmFtZSA9IChTaW1wbGVOYW1lKSBxdWFsaWZpZXJOYW1lOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmc3ID0gc2ltcGxlTmFtZS5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZUJpbmRpbmc3IiwgdHlwZUJpbmRpbmc3KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIk5vdCBhIEMiLCAiQyIsIHR5cGVCaW5kaW5nNy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJSUJpbmRpbmcgYmluZGluZzQgPSBzaW1wbGVOYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmc0IiwgYmluZGluZzQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlZhcmlhYmxlQmluZGluZyIsIGJpbmRpbmc0IGluc3RhbmNlb2YgSVZhcmlhYmxlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJSVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmc0ID0gKElWYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmc0OwotCQlhc3NlcnRFcXVhbHMoIk5vdCBUZXN0IiwgIlRlc3QiLCB2YXJpYWJsZUJpbmRpbmc0LmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygiTm90IHB1YmxpYyIsIE1vZGlmaWVyLlBVQkxJQywgdmFyaWFibGVCaW5kaW5nNC5nZXRNb2RpZmllcnMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgImZpZWxkIiwgdmFyaWFibGVCaW5kaW5nNC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyByZXR1cm4gdHlwZSIsICJDIiwgdmFyaWFibGVCaW5kaW5nNC5nZXRUeXBlKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogUXVhbGlmaWVkTmFtZSBhcyBUeXBlUmVmZXJlbmNlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyMjgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDIyOCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCUFTVE5vZGUgbm9kZTIgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMSwgMCk7Ci0JCWFzc2VydFRydWUoIlJldHVyblN0YXRlbWVudCIsIG5vZGUyIGluc3RhbmNlb2YgUmV0dXJuU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlSZXR1cm5TdGF0ZW1lbnQgcmV0dXJuU3RhdGVtZW50ID0gKFJldHVyblN0YXRlbWVudCkgbm9kZTI7Ci0JCUV4cHJlc3Npb24gZXhwciA9IHJldHVyblN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7Ci0JCWNoZWNrU291cmNlUmFuZ2UoZXhwciwgInRlc3QwMjI4LlRlc3QuZm9vKCkiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk1ldGhvZEludm9jYXRpb24iLCBleHByIGluc3RhbmNlb2YgTWV0aG9kSW52b2NhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJTWV0aG9kSW52b2NhdGlvbiBtZXRob2RJbnZvY2F0aW9uID0gKE1ldGhvZEludm9jYXRpb24pIGV4cHI7Ci0JCUV4cHJlc3Npb24gcXVhbGlmaWVyID0gbWV0aG9kSW52b2NhdGlvbi5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydE5vdE51bGwoIm5vIHF1YWxpZmllciIsIHF1YWxpZmllcik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiUXVhbGlmaWVkTmFtZSIsIHF1YWxpZmllciBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCVF1YWxpZmllZE5hbWUgcXVhbGlmaWVkTmFtZSA9IChRdWFsaWZpZWROYW1lKSBxdWFsaWZpZXI7Ci0JCWNoZWNrU291cmNlUmFuZ2UocXVhbGlmaWVkTmFtZSwgInRlc3QwMjI4LlRlc3QiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHF1YWxpZmllZE5hbWUucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHR5cGVCaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgdHlwZSIsICJUZXN0IiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUlCaW5kaW5nIGJpbmRpbmcgPSBxdWFsaWZpZWROYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCBiaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIk5vdCBhIHR5cGUiLCBJQmluZGluZy5UWVBFLCBiaW5kaW5nLmdldEtpbmQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JfQotCi0JLyoqCi0JICogTWV0aG9kSW52b2NhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjI5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyMjkiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlBU1ROb2RlIG5vZGUyID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnRUcnVlKCJFeHByZXNzaW9uU3RhdGVtZW50Iiwgbm9kZTIgaW5zdGFuY2VvZiBFeHByZXNzaW9uU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlFeHByZXNzaW9uU3RhdGVtZW50IGV4cHJlc3Npb25TdGF0ZW1lbnQgPSAoRXhwcmVzc2lvblN0YXRlbWVudCkgbm9kZTI7Ci0JCUV4cHJlc3Npb24gZXhwciA9IGV4cHJlc3Npb25TdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpOwotCQlhc3NlcnRUcnVlKCJNZXRob2RJbnZvY2F0aW9uIiwgZXhwciBpbnN0YW5jZW9mIE1ldGhvZEludm9jYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UoZXhwciwgIlN5c3RlbS5lcnIucHJpbnRsbigpIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlNZXRob2RJbnZvY2F0aW9uIG1ldGhvZEludm9jYXRpb24gPSAoTWV0aG9kSW52b2NhdGlvbikgZXhwcjsKLQkJRXhwcmVzc2lvbiBxdWFsaWZpZXIgPSBtZXRob2RJbnZvY2F0aW9uLmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgiUXVhbGlmaWVkTmFtZSIsIHF1YWxpZmllciBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCVF1YWxpZmllZE5hbWUgcXVhbGlmaWVkTmFtZSA9IChRdWFsaWZpZWROYW1lKSBxdWFsaWZpZXI7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHF1YWxpZmllci5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJQcmludFN0cmVhbSIsIHR5cGVCaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlJQmluZGluZyBiaW5kaW5nID0gcXVhbGlmaWVkTmFtZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgYmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVmFyaWFibGVCaW5kaW5nIiwgYmluZGluZyBpbnN0YW5jZW9mIElWYXJpYWJsZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gKElWYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmc7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJlcnIiLCB2YXJpYWJsZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVNpbXBsZU5hbWUgbWV0aG9kTmFtZSA9IG1ldGhvZEludm9jYXRpb24uZ2V0TmFtZSgpOwotCQlJQmluZGluZyBiaW5kaW5nMiA9IG1ldGhvZE5hbWUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZzIiLCBiaW5kaW5nMik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogTWV0aG9kSW52b2NhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjMwKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyMzAiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlBU1ROb2RlIG5vZGUyID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDEsIDApOwotCQlhc3NlcnRUcnVlKCJFeHByZXNzaW9uU3RhdGVtZW50Iiwgbm9kZTIgaW5zdGFuY2VvZiBFeHByZXNzaW9uU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlFeHByZXNzaW9uU3RhdGVtZW50IGV4cHJlc3Npb25TdGF0ZW1lbnQgPSAoRXhwcmVzc2lvblN0YXRlbWVudCkgbm9kZTI7Ci0JCUV4cHJlc3Npb24gZXhwciA9IGV4cHJlc3Npb25TdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpOwotCQlhc3NlcnRUcnVlKCJNZXRob2RJbnZvY2F0aW9uIiwgZXhwciBpbnN0YW5jZW9mIE1ldGhvZEludm9jYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UoZXhwciwgImVyci5wcmludGxuKCkiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCU1ldGhvZEludm9jYXRpb24gbWV0aG9kSW52b2NhdGlvbiA9IChNZXRob2RJbnZvY2F0aW9uKSBleHByOwotCQlFeHByZXNzaW9uIHF1YWxpZmllciA9IG1ldGhvZEludm9jYXRpb24uZ2V0RXhwcmVzc2lvbigpOwotCQlhc3NlcnRUcnVlKCJTaW1wbGVOYW1lIiwgcXVhbGlmaWVyIGluc3RhbmNlb2YgU2ltcGxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJU2ltcGxlTmFtZSBuYW1lID0gKFNpbXBsZU5hbWUpIHF1YWxpZmllcjsKLQkJSUJpbmRpbmcgYmluZGluZyA9IG5hbWUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZyIsIGJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJlcnIiLCBiaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBuYW1lLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyB0eXBlQmluZGluZyIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb24gdHlwZSBuYW1lIiwgIlByaW50U3RyZWFtIiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCQotCS8qKgotCSAqIE1ldGhvZEludm9jYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDIzMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjMxIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJQVNUTm9kZSBub2RlMiA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiRXhwcmVzc2lvblN0YXRlbWVudCIsIG5vZGUyIGluc3RhbmNlb2YgRXhwcmVzc2lvblN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJRXhwcmVzc2lvblN0YXRlbWVudCBleHByZXNzaW9uU3RhdGVtZW50ID0gKEV4cHJlc3Npb25TdGF0ZW1lbnQpIG5vZGUyOwotCQlFeHByZXNzaW9uIGV4cHIgPSBleHByZXNzaW9uU3RhdGVtZW50LmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgiTWV0aG9kSW52b2NhdGlvbiIsIGV4cHIgaW5zdGFuY2VvZiBNZXRob2RJbnZvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGV4cHIsICJTeXN0ZW0uZXJyLnByaW50bG4oKSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJTWV0aG9kSW52b2NhdGlvbiBtZXRob2RJbnZvY2F0aW9uID0gKE1ldGhvZEludm9jYXRpb24pIGV4cHI7Ci0JCUV4cHJlc3Npb24gcXVhbGlmaWVyID0gbWV0aG9kSW52b2NhdGlvbi5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoIlF1YWxpZmllZE5hbWUiLCBxdWFsaWZpZXIgaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlRdWFsaWZpZWROYW1lIHF1YWxpZmllZE5hbWUgPSAoUXVhbGlmaWVkTmFtZSkgcXVhbGlmaWVyOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBxdWFsaWZpZXIucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHR5cGUgYmluZGluZyIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCAiUHJpbnRTdHJlYW0iLCB0eXBlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJSUJpbmRpbmcgYmluZGluZyA9IHF1YWxpZmllZE5hbWUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZyIsIGJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlZhcmlhYmxlQmluZGluZyIsIGJpbmRpbmcgaW5zdGFuY2VvZiBJVmFyaWFibGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IChJVmFyaWFibGVCaW5kaW5nKSBiaW5kaW5nOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAiZXJyIiwgdmFyaWFibGVCaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTaW1wbGVOYW1lIG1ldGhvZE5hbWUgPSBtZXRob2RJbnZvY2F0aW9uLmdldE5hbWUoKTsKLQkJSUJpbmRpbmcgYmluZGluZzIgPSBtZXRob2ROYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmcyIiwgYmluZGluZzIpOyAvLyROT04tTkxTLTEkCi0JCU5hbWUgbmFtZSA9IHF1YWxpZmllZE5hbWUuZ2V0UXVhbGlmaWVyKCk7Ci0JCWFzc2VydFRydWUoIlNpbXBsZU5hbWUiLCBuYW1lLmlzU2ltcGxlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlTaW1wbGVOYW1lIHNpbXBsZU5hbWUgPSAoU2ltcGxlTmFtZSkgbmFtZTsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nMiA9IHNpbXBsZU5hbWUucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHR5cGVCaW5kaW5nMiIsIHR5cGVCaW5kaW5nMik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyB0eXBlIG5hbWUiLCAiU3lzdGVtIiwgdHlwZUJpbmRpbmcyLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIE1ldGhvZEludm9jYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDIzMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjMyIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJQVNUTm9kZSBub2RlMiA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCIsIG5vZGUyIGluc3RhbmNlb2YgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIG5vZGUyOwotCQlMaXN0IGZyYWdtZW50cyA9IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuZnJhZ21lbnRzKCk7Ci0JCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDEsIGZyYWdtZW50cy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcmFnbWVudHMuZ2V0KDApOwotCQlFeHByZXNzaW9uIGluaXRpYWxpemF0aW9uID0gdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LmdldEluaXRpYWxpemVyKCk7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IGluaXRpYWxpemF0aW9uLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyB0eXBlIGJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgcHJpbWl0aXZlIHR5cGUiLCB0eXBlQmluZGluZy5pc1ByaW1pdGl2ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAiaW50IiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydFRydWUoIlF1YWxpZmllZE5hbWUiLCBpbml0aWFsaXphdGlvbiBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCVF1YWxpZmllZE5hbWUgcXVhbGlmaWVkTmFtZSA9IChRdWFsaWZpZWROYW1lKSBpbml0aWFsaXphdGlvbjsKLQkJU2ltcGxlTmFtZSBzaW1wbGVOYW1lID0gcXVhbGlmaWVkTmFtZS5nZXROYW1lKCk7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZzIgPSBzaW1wbGVOYW1lLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyB0eXBlIGJpbmRpbmciLCB0eXBlQmluZGluZzIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhIHByaW1pdGl2ZSB0eXBlIiwgdHlwZUJpbmRpbmcyLmlzUHJpbWl0aXZlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJpbnQiLCB0eXBlQmluZGluZzIuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUlCaW5kaW5nIGJpbmRpbmcgPSBzaW1wbGVOYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCBiaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJJVmFyaWFibGVCaW5kaW5nIiwgYmluZGluZyBpbnN0YW5jZW9mIElWYXJpYWJsZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gKElWYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmc7Ci0JCWFzc2VydE51bGwoIk5vIGRlY2xhcmluZyBjbGFzcyIsIHZhcmlhYmxlQmluZGluZy5nZXREZWNsYXJpbmdDbGFzcygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBDaGVja2luZyB0aGF0IG9ubHkgc3ludGF4IGVycm9ycyBhcmUgcmVwb3J0ZWQgZm9yIHRoZSBNQUxGT1JNRUQgdGFnCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyMzMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDIzMyIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgY29tcGlsYXRpb24gdW5pdCBpcyBtYWxmb3JtZWQiLCAhaXNNYWxmb3JtZWQocmVzdWx0KSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCk7Ci0JCWFzc2VydFRydWUoIlRoZSBmaWVscyBpcyBub3QgbWFsZm9ybWVkIiwgIWlzTWFsZm9ybWVkKG5vZGUpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIk5vIHByb2JsZW0gZm91bmQiLCAxLCB1bml0LmdldE1lc3NhZ2VzKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIk5vIHByb2JsZW0gZm91bmQiLCAxLCB1bml0LmdldFByb2JsZW1zKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENoZWNraW5nIHRoYXQgbnVsbCBpcyByZXR1cm5lZCBmb3IgYSByZXNvbHZlQmluZGluZyBpZiB0aGUgdHlwZSBpcyB1bmtub3duCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyMzQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDIzNCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCk7Ci0JCWFzc2VydFRydWUoIlRoZSBmaWVscyBpcyBub3QgbWFsZm9ybWVkIiwgIWlzTWFsZm9ybWVkKG5vZGUpKTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgdW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0RXF1YWxzKCJObyBwcm9ibGVtIGZvdW5kIiwgMSwgdW5pdC5nZXRNZXNzYWdlcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJObyBwcm9ibGVtIGZvdW5kIiwgMSwgdW5pdC5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiRmllbGREZWNsYXJhdGlvbiIsIG5vZGUgaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSAoRmllbGREZWNsYXJhdGlvbikgbm9kZTsKLQkJTGlzdCBmcmFnbWVudHMgPSBmaWVsZERlY2xhcmF0aW9uLmZyYWdtZW50cygpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAxLCBmcmFnbWVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgZnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcmFnbWVudHMuZ2V0KDApOwotCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IGZyYWdtZW50LnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE51bGwoImJpbmRpbmcgbm90IG51bGwiLCB2YXJpYWJsZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ2hlY2tpbmcgdGhhdCBudWxsIGlzIHJldHVybmVkIGZvciBhIHJlc29sdmVCaW5kaW5nIGlmIHRoZSB0eXBlIGlzIHVua25vd24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDIzNSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjM1IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIGZpZWxzIGlzIG5vdCBtYWxmb3JtZWQiLCAhaXNNYWxmb3JtZWQobm9kZSkpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoInByb2JsZW1zIGZvdW5kIiwgMCwgdW5pdC5nZXRNZXNzYWdlcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJwcm9ibGVtcyBmb3VuZCIsIDAsIHVuaXQuZ2V0UHJvYmxlbXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIkZpZWxkRGVjbGFyYXRpb24iLCBub2RlIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gKEZpZWxkRGVjbGFyYXRpb24pIG5vZGU7Ci0JCUxpc3QgZnJhZ21lbnRzID0gZmllbGREZWNsYXJhdGlvbi5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMSwgZnJhZ21lbnRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IGZyYWdtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgZnJhZ21lbnRzLmdldCgwKTsKLQkJSVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcgPSBmcmFnbWVudC5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgdmFyaWFibGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRlc3QgdGhlIHJlbW92YWwgb2YgYSBJRmllbGQgaW5zaWRlIGEgQ1UgdGhhdCBoYXMgYW4gaW5pdGlhbGl6ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDIzNigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjM2IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUlUeXBlIHR5cGUgPSBzb3VyY2VVbml0LmdldFR5cGUoIlRlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJObyB0eXBlIiwgdHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJSUZpZWxkIGZpZWxkID0gdHlwZS5nZXRGaWVsZCgiaSIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoIk5vIGZpZWxkIiwgZmllbGQpOyAvLyROT04tTkxTLTEkCi0JCWZpZWxkLmRlbGV0ZSh0cnVlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NDUyCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyMzcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJqdW5pdC5mcmFtZXdvcmsiLCAiVGVzdENhc2UuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JfQotCQkKLQkvKioKLQkgKiBDaGVjayBUaGlzRXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjM4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyMzgiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnRUcnVlKCJOb3QgYSB0eXBlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCIsIG5vZGUgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCVR5cGVEZWNsYXJhdGlvblN0YXRlbWVudCB0eXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQgPSAoVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50KSBub2RlOwotCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPSB0eXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQuZ2V0VHlwZURlY2xhcmF0aW9uKCk7Ci0JCU9iamVjdCBvID0gdHlwZURlY2wuYm9keURlY2xhcmF0aW9ucygpLmdldCgwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgbWV0aG9kIiwgbyBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsID0gKE1ldGhvZERlY2xhcmF0aW9uKSBvOwotCQlCbG9jayBibG9jayA9IG1ldGhvZERlY2wuZ2V0Qm9keSgpOwotCQlMaXN0IHN0YXRlbWVudHMgPSBibG9jay5zdGF0ZW1lbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiTm90IDEiLCAxLCBzdGF0ZW1lbnRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RhdGVtZW50IHN0bXQgPSAoU3RhdGVtZW50KSBzdGF0ZW1lbnRzLmdldCgwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgcmV0dXJuIHN0YXRlbWVudCIsIHN0bXQgaW5zdGFuY2VvZiBSZXR1cm5TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCVJldHVyblN0YXRlbWVudCByZXR1cm5TdGF0ZW1lbnQgPSAoUmV0dXJuU3RhdGVtZW50KSBzdG10OwotCQlFeHByZXNzaW9uIGV4cHIgPSByZXR1cm5TdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBtZXRob2QgaW52b2NhdGlvbiIsIGV4cHIgaW5zdGFuY2VvZiBNZXRob2RJbnZvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlNZXRob2RJbnZvY2F0aW9uIG1ldGhvZEludm9jYXRpb24gPSAoTWV0aG9kSW52b2NhdGlvbikgZXhwcjsKLQkJY2hlY2tTb3VyY2VSYW5nZShtZXRob2RJbnZvY2F0aW9uLCAiVGVzdC50aGlzLmJhcigpIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlFeHByZXNzaW9uIHF1YWxpZmllciA9IG1ldGhvZEludm9jYXRpb24uZ2V0RXhwcmVzc2lvbigpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBUaGlzRXhwcmVzc2lvbiIsIHF1YWxpZmllciBpbnN0YW5jZW9mIFRoaXNFeHByZXNzaW9uKTsgLy8kTk9OLU5MUy0xJAotCQlUaGlzRXhwcmVzc2lvbiB0aGlzRXhwcmVzc2lvbiA9IChUaGlzRXhwcmVzc2lvbikgcXVhbGlmaWVyOwotCQlOYW1lIG5hbWUgPSB0aGlzRXhwcmVzc2lvbi5nZXRRdWFsaWZpZXIoKTsKLQkJSUJpbmRpbmcgYmluZGluZyA9IG5hbWUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZyIsIGJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJUZXN0IiwgYmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBUaGlzRXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjM5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyMzkiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDEsIDAsIDApOwotCQlhc3NlcnRUcnVlKCJOb3QgYSB0eXBlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCIsIG5vZGUgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCVR5cGVEZWNsYXJhdGlvblN0YXRlbWVudCB0eXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQgPSAoVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50KSBub2RlOwotCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgPSB0eXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQuZ2V0VHlwZURlY2xhcmF0aW9uKCk7Ci0JCU9iamVjdCBvID0gdHlwZURlY2wuYm9keURlY2xhcmF0aW9ucygpLmdldCgwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgbWV0aG9kIiwgbyBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsID0gKE1ldGhvZERlY2xhcmF0aW9uKSBvOwotCQlCbG9jayBibG9jayA9IG1ldGhvZERlY2wuZ2V0Qm9keSgpOwotCQlMaXN0IHN0YXRlbWVudHMgPSBibG9jay5zdGF0ZW1lbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiTm90IDEiLCAxLCBzdGF0ZW1lbnRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RhdGVtZW50IHN0bXQgPSAoU3RhdGVtZW50KSBzdGF0ZW1lbnRzLmdldCgwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgcmV0dXJuIHN0YXRlbWVudCIsIHN0bXQgaW5zdGFuY2VvZiBSZXR1cm5TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCVJldHVyblN0YXRlbWVudCByZXR1cm5TdGF0ZW1lbnQgPSAoUmV0dXJuU3RhdGVtZW50KSBzdG10OwotCQlFeHByZXNzaW9uIGV4cHIgPSByZXR1cm5TdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBTdXBlck1ldGhvZEludm9jYXRpb24iLCBleHByIGluc3RhbmNlb2YgU3VwZXJNZXRob2RJbnZvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlTdXBlck1ldGhvZEludm9jYXRpb24gc3VwZXJNZXRob2RJbnZvY2F0aW9uID0gKFN1cGVyTWV0aG9kSW52b2NhdGlvbikgZXhwcjsKLQkJTmFtZSBuYW1lID0gc3VwZXJNZXRob2RJbnZvY2F0aW9uLmdldFF1YWxpZmllcigpOwotCQlJQmluZGluZyBiaW5kaW5nID0gbmFtZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgYmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiQSB0eXBlIGJpbmRpbmciLCBiaW5kaW5nIGluc3RhbmNlb2YgSVR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIk5vdCBUZXN0IiwgIlRlc3QiLCBiaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlOYW1lIG1ldGhvZE5hbWUgPSBzdXBlck1ldGhvZEludm9jYXRpb24uZ2V0TmFtZSgpOwotCQlJQmluZGluZyBiaW5kaW5nMiA9IG1ldGhvZE5hbWUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZzIiLCBiaW5kaW5nMik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm8gYW4gSU1ldGhvZEJpbmRpbmciLCBiaW5kaW5nMiBpbnN0YW5jZW9mIElNZXRob2RCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gKElNZXRob2RCaW5kaW5nKSBiaW5kaW5nMjsKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYmFyIiwgImJhciIsIG1ldGhvZEJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygiTm90IFQiLCAiVCIsIG1ldGhvZEJpbmRpbmcuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgRmllbGRBY2Nlc3MKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDI0MCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjQwIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgdHlwZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQiLCBub2RlIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQgdHlwZURlY2xhcmF0aW9uU3RhdGVtZW50ID0gKFR5cGVEZWNsYXJhdGlvblN0YXRlbWVudCkgbm9kZTsKLQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gdHlwZURlY2xhcmF0aW9uU3RhdGVtZW50LmdldFR5cGVEZWNsYXJhdGlvbigpOwotCQlPYmplY3QgbyA9IHR5cGVEZWNsLmJvZHlEZWNsYXJhdGlvbnMoKS5nZXQoMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIG1ldGhvZCIsIG8gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCA9IChNZXRob2REZWNsYXJhdGlvbikgbzsKLQkJQmxvY2sgYmxvY2sgPSBtZXRob2REZWNsLmdldEJvZHkoKTsKLQkJTGlzdCBzdGF0ZW1lbnRzID0gYmxvY2suc3RhdGVtZW50cygpOwotCQlhc3NlcnRFcXVhbHMoIk5vdCAxIiwgMSwgc3RhdGVtZW50cy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCVN0YXRlbWVudCBzdG10ID0gKFN0YXRlbWVudCkgc3RhdGVtZW50cy5nZXQoMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHJldHVybiBzdGF0ZW1lbnQiLCBzdG10IGluc3RhbmNlb2YgUmV0dXJuU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlSZXR1cm5TdGF0ZW1lbnQgcmV0dXJuU3RhdGVtZW50ID0gKFJldHVyblN0YXRlbWVudCkgc3RtdDsKLQkJRXhwcmVzc2lvbiBleHByID0gcmV0dXJuU3RhdGVtZW50LmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgZmllbGQgYWNjZXNzIiwgZXhwciBpbnN0YW5jZW9mIEZpZWxkQWNjZXNzKTsgLy8kTk9OLU5MUy0xJAotCQlGaWVsZEFjY2VzcyBmaWVsZEFjY2VzcyA9IChGaWVsZEFjY2VzcykgZXhwcjsKLQkJRXhwcmVzc2lvbiBxdWFsaWZpZXIgPSBmaWVsZEFjY2Vzcy5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIFRoaXNFeHByZXNzaW9uIiwgcXVhbGlmaWVyIGluc3RhbmNlb2YgVGhpc0V4cHJlc3Npb24pOyAvLyROT04tTkxTLTEkCi0JCVRoaXNFeHByZXNzaW9uIHRoaXNFeHByZXNzaW9uID0gKFRoaXNFeHByZXNzaW9uKSBxdWFsaWZpZXI7Ci0JCU5hbWUgbmFtZSA9IHRoaXNFeHByZXNzaW9uLmdldFF1YWxpZmllcigpOwotCQlJQmluZGluZyBiaW5kaW5nID0gbmFtZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgYmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgVGVzdCIsICJUZXN0IiwgYmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJTmFtZSBmaWVsZE5hbWUgPSBmaWVsZEFjY2Vzcy5nZXROYW1lKCk7Ci0JCUlCaW5kaW5nIGJpbmRpbmcyID0gZmllbGROYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmcyIiwgYmluZGluZzIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJmIiwgYmluZGluZzIuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbW9kaWZpZXIiLCBNb2RpZmllci5QVUJMSUMsIGJpbmRpbmcyLmdldE1vZGlmaWVycygpKTsgLy8kTk9OLU5MUy0xJAotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBmaWVsZE5hbWUucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHR5cGUgYmluZGluZyIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIk5vdCBpbnQiLCAiaW50IiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogQ2hlY2sgb3JkZXIgb2YgYm9keSBkZWNsYXJhdGlvbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDI0MSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjQxIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgdHlwZSBkZWNsYXJhdGlvbiIsIG5vZGUgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhIGRlY2xhcmF0aW9uIiwgKChUeXBlRGVjbGFyYXRpb24pIG5vZGUpLmdldE5hbWUoKS5pc0RlY2xhcmF0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgc2l6ZSIsIDExLCAoKFR5cGVEZWNsYXJhdGlvbilub2RlKS5ib2R5RGVjbGFyYXRpb25zKCkuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDApOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBmaWVsZCBkZWNsYXJhdGlvbiIsIG5vZGUgaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDEpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBNZXRob2REZWNsYXJhdGlvbiIsIG5vZGUgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAyKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgVHlwZSBkZWNsYXJhdGlvbiIsIG5vZGUgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCW5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMyk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIFR5cGUgZGVjbGFyYXRpb24iLCBub2RlIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDQpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBNZXRob2REZWNsYXJhdGlvbiIsIG5vZGUgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCA1KTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgZmllbGQgZGVjbGFyYXRpb24iLCBub2RlIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCA2KTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgTWV0aG9kRGVjbGFyYXRpb24iLCBub2RlIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCW5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgNyk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIGZpZWxkIGRlY2xhcmF0aW9uIiwgbm9kZSBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCW5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgOCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIGZpZWxkIGRlY2xhcmF0aW9uIiwgbm9kZSBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCW5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgOSk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIE1ldGhvZERlY2xhcmF0aW9uIiwgbm9kZSBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDEwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgVHlwZSBkZWNsYXJhdGlvbiIsIG5vZGUgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ2hlY2sgVGhpc0V4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDI0MigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjQyIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAxLCAwLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgdHlwZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQiLCBub2RlIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQgdHlwZURlY2xhcmF0aW9uU3RhdGVtZW50ID0gKFR5cGVEZWNsYXJhdGlvblN0YXRlbWVudCkgbm9kZTsKLQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsID0gdHlwZURlY2xhcmF0aW9uU3RhdGVtZW50LmdldFR5cGVEZWNsYXJhdGlvbigpOwotCQlPYmplY3QgbyA9IHR5cGVEZWNsLmJvZHlEZWNsYXJhdGlvbnMoKS5nZXQoMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIG1ldGhvZCIsIG8gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCA9IChNZXRob2REZWNsYXJhdGlvbikgbzsKLQkJQmxvY2sgYmxvY2sgPSBtZXRob2REZWNsLmdldEJvZHkoKTsKLQkJTGlzdCBzdGF0ZW1lbnRzID0gYmxvY2suc3RhdGVtZW50cygpOwotCQlhc3NlcnRFcXVhbHMoIk5vdCAxIiwgMSwgc3RhdGVtZW50cy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCVN0YXRlbWVudCBzdG10ID0gKFN0YXRlbWVudCkgc3RhdGVtZW50cy5nZXQoMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHJldHVybiBzdGF0ZW1lbnQiLCBzdG10IGluc3RhbmNlb2YgUmV0dXJuU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlSZXR1cm5TdGF0ZW1lbnQgcmV0dXJuU3RhdGVtZW50ID0gKFJldHVyblN0YXRlbWVudCkgc3RtdDsKLQkJRXhwcmVzc2lvbiBleHByID0gcmV0dXJuU3RhdGVtZW50LmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgU3VwZXJGaWVsZEFjY2VzcyIsIGV4cHIgaW5zdGFuY2VvZiBTdXBlckZpZWxkQWNjZXNzKTsgLy8kTk9OLU5MUy0xJAotCQlTdXBlckZpZWxkQWNjZXNzIHN1cGVyRmllbGRBY2Nlc3MgPSAoU3VwZXJGaWVsZEFjY2VzcykgZXhwcjsKLQkJTmFtZSBuYW1lID0gc3VwZXJGaWVsZEFjY2Vzcy5nZXRRdWFsaWZpZXIoKTsKLQkJSUJpbmRpbmcgYmluZGluZyA9IG5hbWUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZyIsIGJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIkEgdHlwZSBiaW5kaW5nIiwgYmluZGluZyBpbnN0YW5jZW9mIElUeXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgVGVzdCIsICJUZXN0IiwgYmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJTmFtZSBmaWVsZE5hbWUgPSBzdXBlckZpZWxkQWNjZXNzLmdldE5hbWUoKTsKLQkJSUJpbmRpbmcgYmluZGluZzIgPSBmaWVsZE5hbWUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZzIiLCBiaW5kaW5nMik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm8gYW4gSVZhcmlhYmxlQmluZGluZyIsIGJpbmRpbmcyIGluc3RhbmNlb2YgSVZhcmlhYmxlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJSVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcgPSAoSVZhcmlhYmxlQmluZGluZykgYmluZGluZzI7Ci0JCWFzc2VydEVxdWFscygiTm90IGYiLCAiZiIsIHZhcmlhYmxlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgVCIsICJUIiwgdmFyaWFibGVCaW5kaW5nLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZzIgPSBmaWVsZE5hbWUucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHR5cGUgYmluZGluZyIsIHR5cGVCaW5kaW5nMik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgaW50IiwgImludCIsIHR5cGVCaW5kaW5nMi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBjYXRjaCBjbGF1c2UgcG9zaXRpb25zOgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA1NzAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDI0MygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjQzIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgdHJ5IHN0YXRlbWVudCIsIG5vZGUgaW5zdGFuY2VvZiBUcnlTdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCVRyeVN0YXRlbWVudCB0cnlTdGF0ZW1lbnQgPSAoVHJ5U3RhdGVtZW50KSBub2RlOwotCQlMaXN0IGNhdGNoQ2xhdXNlcyA9IHRyeVN0YXRlbWVudC5jYXRjaENsYXVzZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMSwgY2F0Y2hDbGF1c2VzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJQ2F0Y2hDbGF1c2UgY2F0Y2hDbGF1c2UgPSAoQ2F0Y2hDbGF1c2UpIGNhdGNoQ2xhdXNlcy5nZXQoMCk7Ci0JCWNoZWNrU291cmNlUmFuZ2UoY2F0Y2hDbGF1c2UsICJjYXRjaCAoRXhjZXB0aW9uIGUpe20oKTt9Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENoZWNrIGNhdGNoIGNsYXVzZSBwb3NpdGlvbnM6Ci0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDU3MAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjQ0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyNDQiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnRUcnVlKCJOb3QgYSB0cnkgc3RhdGVtZW50Iiwgbm9kZSBpbnN0YW5jZW9mIFRyeVN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJVHJ5U3RhdGVtZW50IHRyeVN0YXRlbWVudCA9IChUcnlTdGF0ZW1lbnQpIG5vZGU7Ci0JCUxpc3QgY2F0Y2hDbGF1c2VzID0gdHJ5U3RhdGVtZW50LmNhdGNoQ2xhdXNlcygpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAyLCBjYXRjaENsYXVzZXMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlDYXRjaENsYXVzZSBjYXRjaENsYXVzZSA9IChDYXRjaENsYXVzZSkgY2F0Y2hDbGF1c2VzLmdldCgwKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShjYXRjaENsYXVzZSwgImNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpe20oKTt9Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQljYXRjaENsYXVzZSA9IChDYXRjaENsYXVzZSkgY2F0Y2hDbGF1c2VzLmdldCgxKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShjYXRjaENsYXVzZSwgImNhdGNoKEV4Y2VwdGlvbiBlKSB7fSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDU4NwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjQ1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyNDUiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAxKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgcmV0dXJuIHN0YXRlbWVudCIsIG5vZGUgaW5zdGFuY2VvZiBSZXR1cm5TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCVJldHVyblN0YXRlbWVudCByZXR1cm5TdGF0ZW1lbnQgPSAoUmV0dXJuU3RhdGVtZW50KSBub2RlOwotCQlFeHByZXNzaW9uIGV4cHIgPSByZXR1cm5TdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpOwotCQlhc3NlcnRUcnVlKCJub3QgYSBuYW1lIiwgZXhwciBpbnN0YW5jZW9mIE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCU5hbWUgbmFtZSA9IChOYW1lKSBleHByOwotCQlJQmluZGluZyBiaW5kaW5nID0gbmFtZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSB2YXJpYWJsZSBiaW5kaW5nIiwgYmluZGluZyBpbnN0YW5jZW9mIElWYXJpYWJsZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gKElWYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmc7Ci0JCWFzc2VydEVxdWFscygiTm90IGkiLCAiaSIsIHZhcmlhYmxlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgaW50IiwgImludCIsIHZhcmlhYmxlQmluZGluZy5nZXRUeXBlKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUFTVE5vZGUgZGVjbGFyaW5nTm9kZSA9IHVuaXQuZmluZERlY2xhcmluZ05vZGUodmFyaWFibGVCaW5kaW5nKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gZGVjbGFyaW5nIG5vZGUiLCBkZWNsYXJpbmdOb2RlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgYSBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQiLCBkZWNsYXJpbmdOb2RlIGluc3RhbmNlb2YgVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBUZXN0IGJpbmRpbmcgcmVzb2x1dGlvbiBmb3IgaW1wb3J0IGRlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyNDYoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDI0NiIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgdW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJTGlzdCBpbXBvcnRzID0gdW5pdC5pbXBvcnRzKCk7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW1wb3J0cyBzaXplIiwgMiwgaW1wb3J0cy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCUltcG9ydERlY2xhcmF0aW9uIGltcG9ydERlY2xhcmF0aW9uID0gKEltcG9ydERlY2xhcmF0aW9uKSBpbXBvcnRzLmdldCgwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IG9uIGRlbWFuZCIsIGltcG9ydERlY2xhcmF0aW9uLmlzT25EZW1hbmQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShpbXBvcnREZWNsYXJhdGlvbiwgImltcG9ydCBqYXZhLnV0aWwuKjsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCUlCaW5kaW5nIGJpbmRpbmcgPSBpbXBvcnREZWNsYXJhdGlvbi5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgYmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyB0eXBlIiwgSUJpbmRpbmcuUEFDS0FHRSwgYmluZGluZy5nZXRLaW5kKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJqYXZhLnV0aWwiLCBiaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbXBvcnREZWNsYXJhdGlvbiA9IChJbXBvcnREZWNsYXJhdGlvbikgaW1wb3J0cy5nZXQoMSk7Ci0JCWFzc2VydFRydWUoIk9uIGRlbWFuZCIsICFpbXBvcnREZWNsYXJhdGlvbi5pc09uRGVtYW5kKCkpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UoaW1wb3J0RGVjbGFyYXRpb24sICJpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCWJpbmRpbmcgPSBpbXBvcnREZWNsYXJhdGlvbi5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgYmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyB0eXBlIiwgSUJpbmRpbmcuVFlQRSwgYmluZGluZy5nZXRLaW5kKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJJT0V4Y2VwdGlvbiIsIGJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGVzdCBiaW5kaW5nIHJlc29sdXRpb24gZm9yIGltcG9ydCBkZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjQ3KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyNDciLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCVBhY2thZ2VEZWNsYXJhdGlvbiBwYWNrYWdlRGVjbGFyYXRpb24gPSB1bml0LmdldFBhY2thZ2UoKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShwYWNrYWdlRGVjbGFyYXRpb24sICJwYWNrYWdlIHRlc3QwMjQ3OyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJSVBhY2thZ2VCaW5kaW5nIGJpbmRpbmcgPSBwYWNrYWdlRGVjbGFyYXRpb24ucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZyIsIGJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgdHlwZSIsIElCaW5kaW5nLlBBQ0tBR0UsIGJpbmRpbmcuZ2V0S2luZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCAidGVzdDAyNDciLCBiaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA1OTIKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDI0OCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjQ4IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgbWV0aG9kIGRlY2xhcmF0aW9uIiwgbm9kZSBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKTsJCSAvLyROT04tTkxTLTEkCi0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBub2RlOwotCQlMaXN0IHBhcmFtZXRlcnMgPSBtZXRob2REZWNsYXJhdGlvbi5wYXJhbWV0ZXJzKCk7Ci0JCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDEsIHBhcmFtZXRlcnMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gPSAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgcGFyYW1ldGVycy5nZXQoMCk7Ci0JCU5hbWUgbmFtZSA9IHNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24uZ2V0TmFtZSgpOwotCQlJQmluZGluZyBiaW5kaW5nID0gbmFtZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgYmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgdmFyaWFibGUgYmluZGluZyIsIGJpbmRpbmcgaW5zdGFuY2VvZiBJVmFyaWFibGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IChJVmFyaWFibGVCaW5kaW5nKSBiaW5kaW5nOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCAiaSIsIHZhcmlhYmxlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyB0eXBlIiwgImludCIsIHZhcmlhYmxlQmluZGluZy5nZXRUeXBlKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDU5MgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjQ5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyNDkiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDIsIDEpOwotCQlhc3NlcnRUcnVlKCJOb3QgYW4gRXhwcmVzc2lvblN0YXRlbWVudCIsIG5vZGUgaW5zdGFuY2VvZiBFeHByZXNzaW9uU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlFeHByZXNzaW9uU3RhdGVtZW50IGV4cHJlc3Npb25TdGF0ZW1lbnQgPSAoRXhwcmVzc2lvblN0YXRlbWVudCkgbm9kZTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gZXhwcmVzc2lvblN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhbiBhc3NpZ25tZW50IiwgZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEFzc2lnbm1lbnQpOyAvLyROT04tTkxTLTEkCi0JCUFzc2lnbm1lbnQgYXNzaWdubWVudCA9IChBc3NpZ25tZW50KSBleHByZXNzaW9uOwotCQlFeHByZXNzaW9uIGxlZnRIYW5kU2lkZSA9IGFzc2lnbm1lbnQuZ2V0TGVmdEhhbmRTaWRlKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHF1YWxpZmllZCBuYW1lIiwgbGVmdEhhbmRTaWRlIGluc3RhbmNlb2YgUXVhbGlmaWVkTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJUXVhbGlmaWVkTmFtZSBxdWFsaWZpZWROYW1lID0gKFF1YWxpZmllZE5hbWUpIGxlZnRIYW5kU2lkZTsKLQkJTmFtZSBzaW1wbGVOYW1lID0gcXVhbGlmaWVkTmFtZS5nZXROYW1lKCk7Ci0JCUlCaW5kaW5nIGJpbmRpbmcgPSBzaW1wbGVOYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIm5vIGJpbmRpbmciLCBiaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgYSBJVmFyaWFibGVCaW5kaW5nIiwgYmluZGluZyBpbnN0YW5jZW9mIElWYXJpYWJsZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gKElWYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmc7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJrIiwgdmFyaWFibGVCaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIG1vZGlmaWVyIiwgTW9kaWZpZXIuU1RBVElDLCB2YXJpYWJsZUJpbmRpbmcuZ2V0TW9kaWZpZXJzKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgdHlwZSIsICJpbnQiLCB2YXJpYWJsZUJpbmRpbmcuZ2V0VHlwZSgpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIGRlY2xhcmluZyBjbGFzcyBuYW1lIiwgImoiLCB2YXJpYWJsZUJpbmRpbmcuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTkyCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyNTAoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDI1MCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIG1ldGhvZCBkZWNsYXJhdGlvbiIsIG5vZGUgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbik7CQkgLy8kTk9OLU5MUy0xJAotCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbikgbm9kZTsKLQkJTGlzdCBwYXJhbWV0ZXJzID0gbWV0aG9kRGVjbGFyYXRpb24ucGFyYW1ldGVycygpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAyLCBwYXJhbWV0ZXJzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uID0gKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIHBhcmFtZXRlcnMuZ2V0KDApOwotCQlOYW1lIG5hbWUgPSBzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLmdldE5hbWUoKTsKLQkJSUJpbmRpbmcgYmluZGluZyA9IG5hbWUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZyIsIGJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhIHZhcmlhYmxlIGJpbmRpbmciLCBiaW5kaW5nIGluc3RhbmNlb2YgSVZhcmlhYmxlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJSVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcgPSAoSVZhcmlhYmxlQmluZGluZykgYmluZGluZzsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgImkiLCB2YXJpYWJsZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgdHlwZSIsICJpbnQiLCB2YXJpYWJsZUJpbmRpbmcuZ2V0VHlwZSgpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQkJCi0JLyoqCi0JICogQ2hlY2sgcXVhbGlmaWVkIG5hbWUgcmVzb2x1dGlvbiBmb3Igc3RhdGljIGZpZWxkcwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjUxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyNTEiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBFeHByZXNzaW9uU3RhdGVtZW50Iiwgbm9kZSBpbnN0YW5jZW9mIEV4cHJlc3Npb25TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCUV4cHJlc3Npb25TdGF0ZW1lbnQgZXhwcmVzc2lvblN0YXRlbWVudCA9IChFeHByZXNzaW9uU3RhdGVtZW50KSBub2RlOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBleHByZXNzaW9uU3RhdGVtZW50LmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgbWV0aG9kIGludm9jYXRpb24iLCBleHByZXNzaW9uIGluc3RhbmNlb2YgTWV0aG9kSW52b2NhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJTWV0aG9kSW52b2NhdGlvbiBtZXRob2RJbnZvY2F0aW9uID0gKE1ldGhvZEludm9jYXRpb24pIGV4cHJlc3Npb247Ci0JCWNoZWNrU291cmNlUmFuZ2UobWV0aG9kSW52b2NhdGlvbiwgImphdmEubGFuZy5TeXN0ZW0ub3V0LnByaW50bG4oKSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJRXhwcmVzc2lvbiBxdWFsaWZpZXIgPSBtZXRob2RJbnZvY2F0aW9uLmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgcXVhbGlmaWVkIG5hbWUiLCBxdWFsaWZpZXIgaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKHF1YWxpZmllciwgImphdmEubGFuZy5TeXN0ZW0ub3V0Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlRdWFsaWZpZWROYW1lIHF1YWxpZmllZE5hbWUgPSAoUXVhbGlmaWVkTmFtZSkgcXVhbGlmaWVyOwotCQlOYW1lIHR5cGVOYW1lID0gcXVhbGlmaWVkTmFtZS5nZXRRdWFsaWZpZXIoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgUXVhbGlmaWVkTmFtZSIsIHR5cGVOYW1lIGluc3RhbmNlb2YgUXVhbGlmaWVkTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJUXVhbGlmaWVkTmFtZSBxdWFsaWZpZWRUeXBlTmFtZSA9IChRdWFsaWZpZWROYW1lKSB0eXBlTmFtZTsKLQkJSUJpbmRpbmcgYmluZGluZyA9IHF1YWxpZmllZFR5cGVOYW1lLmdldE5hbWUoKS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgYmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgIlN5c3RlbSIsIGJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWJpbmRpbmcgPSBxdWFsaWZpZWRUeXBlTmFtZS5nZXRRdWFsaWZpZXIoKS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nMiIsIGJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgdHlwZSBiaW5kaW5nIiwgSUJpbmRpbmcuUEFDS0FHRSwgYmluZGluZy5nZXRLaW5kKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCQkKLQkvKioKLQkgKiBDaGVjayBiaW5kaW5nIGZvciBhbm9ueW1vdXMgY2xhc3MKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDI1MigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjUyIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAxKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgcmV0dXJuIHN0YXRlbWVudCIsIG5vZGUgaW5zdGFuY2VvZiBSZXR1cm5TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCVJldHVyblN0YXRlbWVudCByZXR1cm5TdGF0ZW1lbnQgPSAoUmV0dXJuU3RhdGVtZW50KSBub2RlOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSByZXR1cm5TdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBjbGFzc2luc3RhbmNlY3JlYXRpb24iLCBleHByZXNzaW9uIGluc3RhbmNlb2YgQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlDbGFzc0luc3RhbmNlQ3JlYXRpb24gY2xhc3NJbnN0YW5jZUNyZWF0aW9uID0gKENsYXNzSW5zdGFuY2VDcmVhdGlvbikgZXhwcmVzc2lvbjsKLQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IGNsYXNzSW5zdGFuY2VDcmVhdGlvbi5yZXNvbHZlQ29uc3RydWN0b3JCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIG1ldGhvZEJpbmRpbmciLCBtZXRob2RCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgYSBjb25zdHJ1Y3RvciIsIG1ldGhvZEJpbmRpbmcuaXNDb25zdHJ1Y3RvcigpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgYW4gYW5vbnltb3VzIGNsYXNzIiwgbWV0aG9kQmluZGluZy5nZXREZWNsYXJpbmdDbGFzcygpLmlzQW5vbnltb3VzKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiTm90IGFuIGFub255bW91cyBjbGFzcyBvZiBqYXZhLmxhbmcuT2JqZWN0IiwgIk9iamVjdCIsIG1ldGhvZEJpbmRpbmcuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXRTdXBlcmNsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygiTm90IGFuIGFub255bW91cyBjbGFzcyBvZiBqYXZhLmxhbmcuT2JqZWN0IiwgImphdmEubGFuZyIsIG1ldGhvZEJpbmRpbmcuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXRTdXBlcmNsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIENoZWNrIGJpbmRpbmcgZm9yIGFsbG9jYXRpb24gZXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjUzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyNTMiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnRUcnVlKCJOb3QgYSByZXR1cm4gc3RhdGVtZW50Iiwgbm9kZSBpbnN0YW5jZW9mIFJldHVyblN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJUmV0dXJuU3RhdGVtZW50IHJldHVyblN0YXRlbWVudCA9IChSZXR1cm5TdGF0ZW1lbnQpIG5vZGU7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHJldHVyblN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIGNsYXNzaW5zdGFuY2VjcmVhdGlvbiIsIGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDbGFzc0luc3RhbmNlQ3JlYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCUNsYXNzSW5zdGFuY2VDcmVhdGlvbiBjbGFzc0luc3RhbmNlQ3JlYXRpb24gPSAoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKSBleHByZXNzaW9uOwotCQlJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gY2xhc3NJbnN0YW5jZUNyZWF0aW9uLnJlc29sdmVDb25zdHJ1Y3RvckJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gbWV0aG9kQmluZGluZyIsIG1ldGhvZEJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhIGNvbnN0cnVjdG9yIiwgbWV0aG9kQmluZGluZy5pc0NvbnN0cnVjdG9yKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgc2l6ZSIsIDEsIG1ldGhvZEJpbmRpbmcuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgdHlwZSIsICJTdHJpbmciLCBtZXRob2RCaW5kaW5nLmdldFBhcmFtZXRlclR5cGVzKClbMF0uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogQ2hlY2sgYmluZGluZyBmb3IgYWxsb2NhdGlvbiBleHByZXNzaW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyNTQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDI1NCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMSwgMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHJldHVybiBzdGF0ZW1lbnQiLCBub2RlIGluc3RhbmNlb2YgUmV0dXJuU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlSZXR1cm5TdGF0ZW1lbnQgcmV0dXJuU3RhdGVtZW50ID0gKFJldHVyblN0YXRlbWVudCkgbm9kZTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcmV0dXJuU3RhdGVtZW50LmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24iLCBleHByZXNzaW9uIGluc3RhbmNlb2YgQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlDbGFzc0luc3RhbmNlQ3JlYXRpb24gY2xhc3NJbnN0YW5jZUNyZWF0aW9uID0gKENsYXNzSW5zdGFuY2VDcmVhdGlvbikgZXhwcmVzc2lvbjsKLQkJSU1ldGhvZEJpbmRpbmcgYmluZGluZyA9IGNsYXNzSW5zdGFuY2VDcmVhdGlvbi5yZXNvbHZlQ29uc3RydWN0b3JCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCBiaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHR5cGUiLCAiQyIsIGJpbmRpbmcuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQotCS8qKgotCSAqIENoZWNrIGJpbmRpbmcgZm9yIGFsbG9jYXRpb24gZXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjU1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyNTUiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnRUcnVlKCJOb3QgYW4gRXhwcmVzc2lvblN0YXRlbWVudCIsIG5vZGUgaW5zdGFuY2VvZiBFeHByZXNzaW9uU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlFeHByZXNzaW9uU3RhdGVtZW50IGV4cHJlc3Npb25TdGF0ZW1lbnQgPSAoRXhwcmVzc2lvblN0YXRlbWVudCkgbm9kZTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gZXhwcmVzc2lvblN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIE1ldGhvZEludm9jYXRpb24iLCBleHByZXNzaW9uIGluc3RhbmNlb2YgTWV0aG9kSW52b2NhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJTWV0aG9kSW52b2NhdGlvbiBtZXRob2RJbnZvY2F0aW9uID0gKE1ldGhvZEludm9jYXRpb24pIGV4cHJlc3Npb247Ci0JCUxpc3QgYXJndW1lbnRzID0gbWV0aG9kSW52b2NhdGlvbi5hcmd1bWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMSwgYXJndW1lbnRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uMiA9IChFeHByZXNzaW9uKSBhcmd1bWVudHMuZ2V0KDApOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBDYXN0RXhwcmVzc2lvbiIsIGV4cHJlc3Npb24yIGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24pOyAvLyROT04tTkxTLTEkCi0JCUNhc3RFeHByZXNzaW9uIGNhc3RFeHByZXNzaW9uID0gKENhc3RFeHByZXNzaW9uKSBleHByZXNzaW9uMjsKLQkJVHlwZSB0eXBlID0gY2FzdEV4cHJlc3Npb24uZ2V0VHlwZSgpOwotCQlJVHlwZUJpbmRpbmcgYmluZGluZyA9IHR5cGUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZyIsIGJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhbiBhcnJheSB0eXBlIiwgYmluZGluZy5pc0FycmF5KCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ2hlY2sgYmluZGluZyBmb3IgYWxsb2NhdGlvbiBleHByZXNzaW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyNTYoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDI1NiIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhbiBFeHByZXNzaW9uU3RhdGVtZW50Iiwgbm9kZSBpbnN0YW5jZW9mIEV4cHJlc3Npb25TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCUV4cHJlc3Npb25TdGF0ZW1lbnQgZXhwcmVzc2lvblN0YXRlbWVudCA9IChFeHByZXNzaW9uU3RhdGVtZW50KSBub2RlOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBleHByZXNzaW9uU3RhdGVtZW50LmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgTWV0aG9kSW52b2NhdGlvbiIsIGV4cHJlc3Npb24gaW5zdGFuY2VvZiBNZXRob2RJbnZvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlNZXRob2RJbnZvY2F0aW9uIG1ldGhvZEludm9jYXRpb24gPSAoTWV0aG9kSW52b2NhdGlvbikgZXhwcmVzc2lvbjsKLQkJTGlzdCBhcmd1bWVudHMgPSBtZXRob2RJbnZvY2F0aW9uLmFyZ3VtZW50cygpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAxLCBhcmd1bWVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24yID0gKEV4cHJlc3Npb24pIGFyZ3VtZW50cy5nZXQoMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIENhc3RFeHByZXNzaW9uIiwgZXhwcmVzc2lvbjIgaW5zdGFuY2VvZiBDYXN0RXhwcmVzc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJQ2FzdEV4cHJlc3Npb24gY2FzdEV4cHJlc3Npb24gPSAoQ2FzdEV4cHJlc3Npb24pIGV4cHJlc3Npb24yOwotCQlUeXBlIHR5cGUgPSBjYXN0RXhwcmVzc2lvbi5nZXRUeXBlKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHNpbXBsZSB0eXBlIiwgdHlwZS5pc1NpbXBsZVR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJU2ltcGxlVHlwZSBzaW1wbGVUeXBlID0gKFNpbXBsZVR5cGUpIHR5cGU7Ci0JCUlUeXBlQmluZGluZyBiaW5kaW5nID0gdHlwZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgYmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgY2xhc3MiLCBiaW5kaW5nLmlzQ2xhc3MoKSk7IC8vJE5PTi1OTFMtMSQKLQkJTmFtZSBuYW1lID0gc2ltcGxlVHlwZS5nZXROYW1lKCk7Ci0JCUlCaW5kaW5nIGJpbmRpbmcyID0gbmFtZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nMiIsIGJpbmRpbmcyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIHR5cGUiLCAiT2JqZWN0IiwgYmluZGluZzIuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogQ2hlY2sgYmluZGluZyBmb3IgYWxsb2NhdGlvbiBleHByZXNzaW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyNTcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDI1NyIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhbiBFeHByZXNzaW9uU3RhdGVtZW50Iiwgbm9kZSBpbnN0YW5jZW9mIEV4cHJlc3Npb25TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCUV4cHJlc3Npb25TdGF0ZW1lbnQgZXhwcmVzc2lvblN0YXRlbWVudCA9IChFeHByZXNzaW9uU3RhdGVtZW50KSBub2RlOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBleHByZXNzaW9uU3RhdGVtZW50LmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgTWV0aG9kSW52b2NhdGlvbiIsIGV4cHJlc3Npb24gaW5zdGFuY2VvZiBNZXRob2RJbnZvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlNZXRob2RJbnZvY2F0aW9uIG1ldGhvZEludm9jYXRpb24gPSAoTWV0aG9kSW52b2NhdGlvbikgZXhwcmVzc2lvbjsKLQkJTGlzdCBhcmd1bWVudHMgPSBtZXRob2RJbnZvY2F0aW9uLmFyZ3VtZW50cygpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAxLCBhcmd1bWVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24yID0gKEV4cHJlc3Npb24pIGFyZ3VtZW50cy5nZXQoMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIENhc3RFeHByZXNzaW9uIiwgZXhwcmVzc2lvbjIgaW5zdGFuY2VvZiBDYXN0RXhwcmVzc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJQ2FzdEV4cHJlc3Npb24gY2FzdEV4cHJlc3Npb24gPSAoQ2FzdEV4cHJlc3Npb24pIGV4cHJlc3Npb24yOwotCQlUeXBlIHR5cGUgPSBjYXN0RXhwcmVzc2lvbi5nZXRUeXBlKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHByaW1pdGl2ZSB0eXBlIiwgdHlwZS5pc1ByaW1pdGl2ZVR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJUHJpbWl0aXZlVHlwZSBwcmltaXRpdmVUeXBlID0gKFByaW1pdGl2ZVR5cGUpIHR5cGU7Ci0JCWFzc2VydEVxdWFscygiTm90IGludCIsIFByaW1pdGl2ZVR5cGUuSU5ULCBwcmltaXRpdmVUeXBlLmdldFByaW1pdGl2ZVR5cGVDb2RlKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ2hlY2sgYmluZGluZyBmb3IgYWxsb2NhdGlvbiBleHByZXNzaW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyNTgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDI1OCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhbiBFeHByZXNzaW9uU3RhdGVtZW50Iiwgbm9kZSBpbnN0YW5jZW9mIEV4cHJlc3Npb25TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCUV4cHJlc3Npb25TdGF0ZW1lbnQgZXhwcmVzc2lvblN0YXRlbWVudCA9IChFeHByZXNzaW9uU3RhdGVtZW50KSBub2RlOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBleHByZXNzaW9uU3RhdGVtZW50LmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgTWV0aG9kSW52b2NhdGlvbiIsIGV4cHJlc3Npb24gaW5zdGFuY2VvZiBNZXRob2RJbnZvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlNZXRob2RJbnZvY2F0aW9uIG1ldGhvZEludm9jYXRpb24gPSAoTWV0aG9kSW52b2NhdGlvbikgZXhwcmVzc2lvbjsKLQkJTGlzdCBhcmd1bWVudHMgPSBtZXRob2RJbnZvY2F0aW9uLmFyZ3VtZW50cygpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAxLCBhcmd1bWVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24yID0gKEV4cHJlc3Npb24pIGFyZ3VtZW50cy5nZXQoMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIENhc3RFeHByZXNzaW9uIiwgZXhwcmVzc2lvbjIgaW5zdGFuY2VvZiBDYXN0RXhwcmVzc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJQ2FzdEV4cHJlc3Npb24gY2FzdEV4cHJlc3Npb24gPSAoQ2FzdEV4cHJlc3Npb24pIGV4cHJlc3Npb24yOwotCQlUeXBlIHR5cGUgPSBjYXN0RXhwcmVzc2lvbi5nZXRUeXBlKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHNpbXBsZSB0eXBlIiwgdHlwZS5pc1NpbXBsZVR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJU2ltcGxlVHlwZSBzaW1wbGVUeXBlID0gKFNpbXBsZVR5cGUpIHR5cGU7Ci0JCUlUeXBlQmluZGluZyBiaW5kaW5nID0gdHlwZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgYmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgY2xhc3MiLCBiaW5kaW5nLmlzQ2xhc3MoKSk7IC8vJE5PTi1OTFMtMSQKLQkJTmFtZSBuYW1lID0gc2ltcGxlVHlwZS5nZXROYW1lKCk7Ci0JCUlCaW5kaW5nIGJpbmRpbmcyID0gbmFtZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nMiIsIGJpbmRpbmcyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIHR5cGUiLCAiT2JqZWN0IiwgYmluZGluZzIuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDY2MwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjU5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyNTkiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTkyCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyNjAoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDI2MCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIG1ldGhvZCBkZWNsYXJhdGlvbiIsIG5vZGUgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbik7CQkgLy8kTk9OLU5MUy0xJAotCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbikgbm9kZTsKLQkJTGlzdCBwYXJhbWV0ZXJzID0gbWV0aG9kRGVjbGFyYXRpb24ucGFyYW1ldGVycygpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAyLCBwYXJhbWV0ZXJzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uID0gKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIHBhcmFtZXRlcnMuZ2V0KDApOwotCQlJQmluZGluZyBiaW5kaW5nID0gc2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbi5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgYmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJTmFtZSBuYW1lID0gc2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbi5nZXROYW1lKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHNpbXBsZSBuYW1lIiwgbmFtZSBpbnN0YW5jZW9mIFNpbXBsZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCVNpbXBsZU5hbWUgc2ltcGxlTmFtZSA9IChTaW1wbGVOYW1lKSBuYW1lOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCAiaSIsIHNpbXBsZU5hbWUuZ2V0SWRlbnRpZmllcigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUlCaW5kaW5nIGJpbmRpbmcyID0gbmFtZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgYmluZGluZzIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoImJpbmRpbmcgPT0gYmluZGluZzIiLCBiaW5kaW5nID09IGJpbmRpbmcyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgYSB2YXJpYWJsZSBiaW5kaW5nIiwgYmluZGluZzIgaW5zdGFuY2VvZiBJVmFyaWFibGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IChJVmFyaWFibGVCaW5kaW5nKSBiaW5kaW5nMjsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgImkiLCB2YXJpYWJsZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgdHlwZSIsICJpbnQiLCB2YXJpYWJsZUJpbmRpbmcuZ2V0VHlwZSgpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA2NzkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDI2MSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjYxIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbXNnIHNpemUiLCAyLCBjb21waWxhdGlvblVuaXQuZ2V0TWVzc2FnZXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgcGIgc2l6ZSIsIDIsIGNvbXBpbGF0aW9uVW5pdC5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDAsIDApOwotCQlhc3NlcnRUcnVlKCJOb3QgYSByZXR1cm4gc3RhdGVtZW50Iiwgbm9kZSBpbnN0YW5jZW9mIFJldHVyblN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJUmV0dXJuU3RhdGVtZW50IHJldHVyblN0YXRlbWVudCA9IChSZXR1cm5TdGF0ZW1lbnQpIG5vZGU7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHJldHVyblN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7Ci0JCUlUeXBlQmluZGluZyBiaW5kaW5nID0gZXhwcmVzc2lvbi5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJYXNzZXJ0TnVsbCgiZ290IGEgYmluZGluZyIsIGJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDY3NgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjYyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyNjIiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDAsIDApOwotCQlhc3NlcnRUcnVlKCJOb3QgYW4gRXhwcmVzc2lvblN0YXRlbWVudCIsIG5vZGUgaW5zdGFuY2VvZiBFeHByZXNzaW9uU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlFeHByZXNzaW9uU3RhdGVtZW50IGV4cHJlc3Npb25TdGF0ZW1lbnQgPSAoRXhwcmVzc2lvblN0YXRlbWVudCkgbm9kZTsKLQkJRXhwcmVzc2lvbiBleHByID0gZXhwcmVzc2lvblN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIE1ldGhvZEludm9jYXRpb24iLCBleHByIGluc3RhbmNlb2YgTWV0aG9kSW52b2NhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJTWV0aG9kSW52b2NhdGlvbiBtZXRob2RJbnZvY2F0aW9uID0gKE1ldGhvZEludm9jYXRpb24pIGV4cHI7Ci0JCUxpc3QgYXJndW1lbnRzID0gbWV0aG9kSW52b2NhdGlvbi5hcmd1bWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBhcmd1bWVudCBsaXN0IHNpemUiLCAxLCBhcmd1bWVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlFeHByZXNzaW9uIGV4cHIyID0gKEV4cHJlc3Npb24pIGFyZ3VtZW50cy5nZXQoMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIGNsYXNzIGluc3RhbmNlIGNyZWF0aW9uIiwgZXhwcjIgaW5zdGFuY2VvZiBDbGFzc0luc3RhbmNlQ3JlYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCUNsYXNzSW5zdGFuY2VDcmVhdGlvbiBjbGFzc0luc3RhbmNlQ3JlYXRpb24gPSAoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKSBleHByMjsKLQkJYXJndW1lbnRzID0gY2xhc3NJbnN0YW5jZUNyZWF0aW9uLmFyZ3VtZW50cygpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHNpemUiLCAxLCBhcmd1bWVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24yID0gKEV4cHJlc3Npb24pIGFyZ3VtZW50cy5nZXQoMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHN0cmluZyBsaXRlcmFsIiwgZXhwcmVzc2lvbjIgaW5zdGFuY2VvZiBTdHJpbmdMaXRlcmFsKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdMaXRlcmFsIHN0cmluZ0xpdGVyYWwgPSAoU3RyaW5nTGl0ZXJhbCkgZXhwcmVzc2lvbjI7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHN0cmluZ0xpdGVyYWwucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHR5cGUgYmluZGluZyIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCAiU3RyaW5nIiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDcwMAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjYzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyNjMiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDAsIDApOwotCQlhc3NlcnRUcnVlKCJOb3QgYW4gRXhwcmVzc2lvblN0YXRlbWVudCIsIG5vZGUgaW5zdGFuY2VvZiBFeHByZXNzaW9uU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlFeHByZXNzaW9uU3RhdGVtZW50IGV4cHJlc3Npb25TdGF0ZW1lbnQgPSAoRXhwcmVzc2lvblN0YXRlbWVudCkgbm9kZTsKLQkJRXhwcmVzc2lvbiBleHByID0gZXhwcmVzc2lvblN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIE1ldGhvZEludm9jYXRpb24iLCBleHByIGluc3RhbmNlb2YgTWV0aG9kSW52b2NhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJTWV0aG9kSW52b2NhdGlvbiBtZXRob2RJbnZvY2F0aW9uID0gKE1ldGhvZEludm9jYXRpb24pIGV4cHI7Ci0JCUxpc3QgYXJndW1lbnRzID0gbWV0aG9kSW52b2NhdGlvbi5hcmd1bWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBhcmd1bWVudCBsaXN0IHNpemUiLCAxLCBhcmd1bWVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlFeHByZXNzaW9uIGV4cHIyID0gKEV4cHJlc3Npb24pIGFyZ3VtZW50cy5nZXQoMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHNpbXBsZSBuYW1lIiwgZXhwcjIgaW5zdGFuY2VvZiBTaW1wbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlTaW1wbGVOYW1lIHNpbXBsZU5hbWUgPSAoU2ltcGxlTmFtZSkgZXhwcjI7Ci0JCUlCaW5kaW5nIGJpbmRpbmcgPSBzaW1wbGVOYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCBiaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA2OTkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDI2NCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjY0IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCIsIG5vZGUgaW5zdGFuY2VvZiBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCkgbm9kZTsKLQkJTGlzdCBmcmFnbWVudHMgPSB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LmZyYWdtZW50cygpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGZyYWdtZW50IHNpemUiLCAxLCBmcmFnbWVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgZnJhZ21lbnRzLmdldCgwKTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LmdldEluaXRpYWxpemVyKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIGNsYXNzaW5zdGFuY2VjcmVhdGlvbiIsIGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDbGFzc0luc3RhbmNlQ3JlYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCUNsYXNzSW5zdGFuY2VDcmVhdGlvbiBjbGFzc0luc3RhbmNlQ3JlYXRpb24gPSAoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKSBleHByZXNzaW9uOwotCQlBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIGFub255bW91c0NsYXNzRGVjbGFyYXRpb24gPSBjbGFzc0luc3RhbmNlQ3JlYXRpb24uZ2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpOwotCQlhc3NlcnROb3ROdWxsKCJObyBhbm9ueW1vdXNjbGFzc2RlY2xhcmF0aW9uIiwgYW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGV4cGVjdGVkU291cmNlUmFuZ2UgPSAKLQkJCSJ7XG4iKyAgLy8kTk9OLU5MUy0xJAotCQkJIgkJCXZvaWQgbShpbnQgayl7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJCWs9IGk7XG4iKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJfVxuIisgLy8kTk9OLU5MUy0xJAotCQkJIgkJfSI7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShhbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLCBleHBlY3RlZFNvdXJjZVJhbmdlLCBzb3VyY2UpOwotCQlMaXN0IGJvZHlEZWNsYXJhdGlvbnMgPSBhbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLmJvZHlEZWNsYXJhdGlvbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzaXplIiwgMSwgYm9keURlY2xhcmF0aW9ucy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCUJvZHlEZWNsYXJhdGlvbiBib2R5RGVjbGFyYXRpb24gPSAoQm9keURlY2xhcmF0aW9uKSBib2R5RGVjbGFyYXRpb25zLmdldCgwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgbWV0aG9kIGRlY2xhcmF0aW9uIiwgYm9keURlY2xhcmF0aW9uIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBib2R5RGVjbGFyYXRpb247Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJtIiwgbWV0aG9kRGVjbGFyYXRpb24uZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA2OTgKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDI2NSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjY1IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDc1OQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjY2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyNjYiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDEsIDApOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50Iiwgbm9kZSBpbnN0YW5jZW9mIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KSBub2RlOwotCQlUeXBlIHR5cGUgPSB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LmdldFR5cGUoKTsKLQkJY2hlY2tTb3VyY2VSYW5nZSh0eXBlLCAiSW5uZXJcXHUwMDViXSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGFycmF5IHR5cGUiLCB0eXBlLmlzQXJyYXlUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCUFycmF5VHlwZSBhcnJheVR5cGUgPSAoQXJyYXlUeXBlKSB0eXBlOwotCQlUeXBlIHR5cGUyID0gYXJyYXlUeXBlLmdldEVsZW1lbnRUeXBlKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHNpbXBsZSB0eXBlIiwgdHlwZTIuaXNTaW1wbGVUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCVNpbXBsZVR5cGUgc2ltcGxlVHlwZSA9IChTaW1wbGVUeXBlKSB0eXBlMjsKLQkJY2hlY2tTb3VyY2VSYW5nZShzaW1wbGVUeXBlLCAiSW5uZXIiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCU5hbWUgbmFtZSA9IHNpbXBsZVR5cGUuZ2V0TmFtZSgpOwotCQlhc3NlcnRUcnVlKCJub3QgYSBzaW1wbGUgbmFtZSIsIG5hbWUuaXNTaW1wbGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCVNpbXBsZU5hbWUgc2ltcGxlTmFtZSA9IChTaW1wbGVOYW1lKSBuYW1lOwotCQljaGVja1NvdXJjZVJhbmdlKHNpbXBsZU5hbWUsICJJbm5lciIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNzU5Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyNjcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDI2NyIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMSwgMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQiLCBub2RlIGluc3RhbmNlb2YgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIG5vZGU7Ci0JCVR5cGUgdHlwZSA9IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuZ2V0VHlwZSgpOwotCQljaGVja1NvdXJjZVJhbmdlKHR5cGUsICJJbm5lcltdIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgYW4gYXJyYXkgdHlwZSIsIHR5cGUuaXNBcnJheVR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJQXJyYXlUeXBlIGFycmF5VHlwZSA9IChBcnJheVR5cGUpIHR5cGU7Ci0JCVR5cGUgdHlwZTIgPSBhcnJheVR5cGUuZ2V0RWxlbWVudFR5cGUoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgc2ltcGxlIHR5cGUiLCB0eXBlMi5pc1NpbXBsZVR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJU2ltcGxlVHlwZSBzaW1wbGVUeXBlID0gKFNpbXBsZVR5cGUpIHR5cGUyOwotCQljaGVja1NvdXJjZVJhbmdlKHNpbXBsZVR5cGUsICJJbm5lciIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJTmFtZSBuYW1lID0gc2ltcGxlVHlwZS5nZXROYW1lKCk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIHNpbXBsZSBuYW1lIiwgbmFtZS5pc1NpbXBsZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJU2ltcGxlTmFtZSBzaW1wbGVOYW1lID0gKFNpbXBsZU5hbWUpIG5hbWU7Ci0JCWNoZWNrU291cmNlUmFuZ2Uoc2ltcGxlTmFtZSwgIklubmVyIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA3NTkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDI2OCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjY4IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAxLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCIsIG5vZGUgaW5zdGFuY2VvZiBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCkgbm9kZTsKLQkJVHlwZSB0eXBlID0gdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5nZXRUeXBlKCk7Ci0JCWNoZWNrU291cmNlUmFuZ2UodHlwZSwgInRlc3QwMjY4LlRlc3QuSW5uZXJbXSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGFycmF5IHR5cGUiLCB0eXBlLmlzQXJyYXlUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCUFycmF5VHlwZSBhcnJheVR5cGUgPSAoQXJyYXlUeXBlKSB0eXBlOwotCQlUeXBlIHR5cGUyID0gYXJyYXlUeXBlLmdldEVsZW1lbnRUeXBlKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHNpbXBsZSB0eXBlIiwgdHlwZTIuaXNTaW1wbGVUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCVNpbXBsZVR5cGUgc2ltcGxlVHlwZSA9IChTaW1wbGVUeXBlKSB0eXBlMjsKLQkJY2hlY2tTb3VyY2VSYW5nZShzaW1wbGVUeXBlLCAidGVzdDAyNjguVGVzdC5Jbm5lciIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJTmFtZSBuYW1lID0gc2ltcGxlVHlwZS5nZXROYW1lKCk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIHF1YWxpZmllZCBuYW1lIiwgbmFtZS5pc1F1YWxpZmllZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShuYW1lLCAidGVzdDAyNjguVGVzdC5Jbm5lciIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDc1OQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjY5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyNjkiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDEsIDApOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50Iiwgbm9kZSBpbnN0YW5jZW9mIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KSBub2RlOwotCQlUeXBlIHR5cGUgPSB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LmdldFR5cGUoKTsKLQkJY2hlY2tTb3VyY2VSYW5nZSh0eXBlLCAidGVzdDAyNjkuVGVzdC5Jbm5lclsvKiovXSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGFycmF5IHR5cGUiLCB0eXBlLmlzQXJyYXlUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCUFycmF5VHlwZSBhcnJheVR5cGUgPSAoQXJyYXlUeXBlKSB0eXBlOwotCQlUeXBlIHR5cGUyID0gYXJyYXlUeXBlLmdldEVsZW1lbnRUeXBlKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHNpbXBsZSB0eXBlIiwgdHlwZTIuaXNTaW1wbGVUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCVNpbXBsZVR5cGUgc2ltcGxlVHlwZSA9IChTaW1wbGVUeXBlKSB0eXBlMjsKLQkJY2hlY2tTb3VyY2VSYW5nZShzaW1wbGVUeXBlLCAidGVzdDAyNjkuVGVzdC5Jbm5lciIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJTmFtZSBuYW1lID0gc2ltcGxlVHlwZS5nZXROYW1lKCk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIHF1YWxpZmllZCBuYW1lIiwgbmFtZS5pc1F1YWxpZmllZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShuYW1lLCAidGVzdDAyNjkuVGVzdC5Jbm5lciIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNzU5Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyNzAoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDI3MCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMSwgMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQiLCBub2RlIGluc3RhbmNlb2YgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIG5vZGU7Ci0JCVR5cGUgdHlwZSA9IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuZ2V0VHlwZSgpOwotCQljaGVja1NvdXJjZVJhbmdlKHR5cGUsICJ0ZXN0MDI3MC5UZXN0LklubmVyIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgYSBzaW1wbGUgdHlwZSIsIHR5cGUuaXNTaW1wbGVUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCVNpbXBsZVR5cGUgc2ltcGxlVHlwZSA9IChTaW1wbGVUeXBlKSB0eXBlOwotCQlOYW1lIG5hbWUgPSBzaW1wbGVUeXBlLmdldE5hbWUoKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgcXVhbGlmaWVkIG5hbWUiLCBuYW1lLmlzUXVhbGlmaWVkTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5hbWUsICJ0ZXN0MDI3MC5UZXN0LklubmVyIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA3NTkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDI3MSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjcxIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAxLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCIsIG5vZGUgaW5zdGFuY2VvZiBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCkgbm9kZTsKLQkJVHlwZSB0eXBlID0gdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5nZXRUeXBlKCk7Ci0JCWNoZWNrU291cmNlUmFuZ2UodHlwZSwgInRlc3QwMjcxLlRlc3QuSW5uZXJbXSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGFycmF5IHR5cGUiLCB0eXBlLmlzQXJyYXlUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCUFycmF5VHlwZSBhcnJheVR5cGUgPSAoQXJyYXlUeXBlKSB0eXBlOwotCQlUeXBlIHR5cGUyID0gYXJyYXlUeXBlLmdldEVsZW1lbnRUeXBlKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHNpbXBsZSB0eXBlIiwgdHlwZTIuaXNTaW1wbGVUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCVNpbXBsZVR5cGUgc2ltcGxlVHlwZSA9IChTaW1wbGVUeXBlKSB0eXBlMjsKLQkJY2hlY2tTb3VyY2VSYW5nZShzaW1wbGVUeXBlLCAidGVzdDAyNzEuVGVzdC5Jbm5lciIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJTmFtZSBuYW1lID0gc2ltcGxlVHlwZS5nZXROYW1lKCk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIHF1YWxpZmllZCBuYW1lIiwgbmFtZS5pc1F1YWxpZmllZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShuYW1lLCAidGVzdDAyNzEuVGVzdC5Jbm5lciIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwODQzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyNzIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDI3MiIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCwgMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIEZvciBzdGF0ZW1lbnQiLCBub2RlIGluc3RhbmNlb2YgRm9yU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlGb3JTdGF0ZW1lbnQgZm9yU3RhdGVtZW50ID0gKEZvclN0YXRlbWVudCkgbm9kZTsKLQkJY2hlY2tTb3VyY2VSYW5nZShmb3JTdGF0ZW1lbnQsICJmb3IgKGludCBpPSAwOyBpIDwgMTA7IGkrKykgZm9vKCk7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlTdGF0ZW1lbnQgYWN0aW9uID0gZm9yU3RhdGVtZW50LmdldEJvZHkoKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShhY3Rpb24sICJmb28oKTsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDg0MwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjczKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyNzMiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDAsIDApOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBGb3Igc3RhdGVtZW50Iiwgbm9kZSBpbnN0YW5jZW9mIEZvclN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJRm9yU3RhdGVtZW50IGZvclN0YXRlbWVudCA9IChGb3JTdGF0ZW1lbnQpIG5vZGU7Ci0JCWNoZWNrU291cmNlUmFuZ2UoZm9yU3RhdGVtZW50LCAiZm9yIChpbnQgaT0gMDsgaSA8IDEwOyBpKyspIHsgZm9vKCk7IH0iLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCVN0YXRlbWVudCBhY3Rpb24gPSBmb3JTdGF0ZW1lbnQuZ2V0Qm9keSgpOwotCQljaGVja1NvdXJjZVJhbmdlKGFjdGlvbiwgInsgZm9vKCk7IH0iLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhIGJsb2NrIiwgYWN0aW9uIGluc3RhbmNlb2YgQmxvY2spOyAvLyROT04tTkxTLTEkCi0JCUJsb2NrIGJsb2NrID0gKEJsb2NrKSBhY3Rpb247Ci0JCUxpc3Qgc3RhdGVtZW50cyA9IGJsb2NrLnN0YXRlbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzaXplIiwgMSwgc3RhdGVtZW50cy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCVN0YXRlbWVudCBzdG10ID0gKFN0YXRlbWVudCkgc3RhdGVtZW50cy5nZXQoMCk7Ci0JCWNoZWNrU291cmNlUmFuZ2Uoc3RtdCwgImZvbygpOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwODQzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyNzQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDI3NCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCwgMSk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIFdoaWxlIHN0YXRlbWVudCIsIG5vZGUgaW5zdGFuY2VvZiBXaGlsZVN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJV2hpbGVTdGF0ZW1lbnQgd2hpbGVTdGF0ZW1lbnQgPSAoV2hpbGVTdGF0ZW1lbnQpIG5vZGU7Ci0JCWNoZWNrU291cmNlUmFuZ2Uod2hpbGVTdGF0ZW1lbnQsICJ3aGlsZSAoaSA8IDEwKSB7IGZvbyhpKyspOyB9Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlTdGF0ZW1lbnQgYWN0aW9uID0gd2hpbGVTdGF0ZW1lbnQuZ2V0Qm9keSgpOwotCQljaGVja1NvdXJjZVJhbmdlKGFjdGlvbiwgInsgZm9vKGkrKyk7IH0iLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhIGJsb2NrIiwgYWN0aW9uIGluc3RhbmNlb2YgQmxvY2spOyAvLyROT04tTkxTLTEkCi0JCUJsb2NrIGJsb2NrID0gKEJsb2NrKSBhY3Rpb247Ci0JCUxpc3Qgc3RhdGVtZW50cyA9IGJsb2NrLnN0YXRlbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzaXplIiwgMSwgc3RhdGVtZW50cy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCVN0YXRlbWVudCBzdG10ID0gKFN0YXRlbWVudCkgc3RhdGVtZW50cy5nZXQoMCk7Ci0JCWNoZWNrU291cmNlUmFuZ2Uoc3RtdCwgImZvbyhpKyspOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwODQzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyNzUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDI3NSIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCwgMSk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIFdoaWxlIHN0YXRlbWVudCIsIG5vZGUgaW5zdGFuY2VvZiBXaGlsZVN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJV2hpbGVTdGF0ZW1lbnQgd2hpbGVTdGF0ZW1lbnQgPSAoV2hpbGVTdGF0ZW1lbnQpIG5vZGU7Ci0JCWNoZWNrU291cmNlUmFuZ2Uod2hpbGVTdGF0ZW1lbnQsICJ3aGlsZSAoaSA8IDEwKSBmb28oaSsrKTsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCVN0YXRlbWVudCBhY3Rpb24gPSB3aGlsZVN0YXRlbWVudC5nZXRCb2R5KCk7Ci0JCWNoZWNrU291cmNlUmFuZ2UoYWN0aW9uLCAiZm9vKGkrKyk7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNzk4Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyNzYoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDI3NiIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIG1ldGhvZCBkZWNsYXJhdGlvbiIsIG5vZGUgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIG5vZGU7Ci0JCVN0cmluZyBleHBlY3RlZFNvdXJjZSA9IAotCQkJInB1YmxpYyB2b2lkIGZvbygpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlmb28oKTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCX0iOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UobWV0aG9kRGVjbGFyYXRpb24sIGV4cGVjdGVkU291cmNlLCBzb3VyY2UpOwotCQlleHBlY3RlZFNvdXJjZSA9IAotCQkJIntcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlmb28oKTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCX0iOwkJIC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShtZXRob2REZWNsYXJhdGlvbi5nZXRCb2R5KCksIGV4cGVjdGVkU291cmNlLCBzb3VyY2UpOwotCX0KLQkJCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDc5OAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjc3KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyNzciLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDApOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBtZXRob2QgZGVjbGFyYXRpb24iLCBub2RlIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBub2RlOwotCQlTdHJpbmcgZXhwZWN0ZWRTb3VyY2UgPSAKLQkJCSJwdWJsaWMgdm9pZCBmb28oKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl9IjsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG1ldGhvZERlY2xhcmF0aW9uLCBleHBlY3RlZFNvdXJjZSwgc291cmNlKTsKLQkJZXhwZWN0ZWRTb3VyY2UgPSAKLQkJCSJ7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl9IjsJCSAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UobWV0aG9kRGVjbGFyYXRpb24uZ2V0Qm9keSgpLCBleHBlY3RlZFNvdXJjZSwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwODYxCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyNzgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDI3OCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIEZpZWxkIGRlY2xhcmF0aW9uIiwgbm9kZSBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IChGaWVsZERlY2xhcmF0aW9uKSBub2RlOwotCQljaGVja1NvdXJjZVJhbmdlKGZpZWxkRGVjbGFyYXRpb24sICJDbGFzcyBjID0gamF2YS5sYW5nLlN0cmluZy5jbGFzczsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCUxpc3QgZnJhZ21lbnRzID0gZmllbGREZWNsYXJhdGlvbi5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzaXplIiwgMSwgZnJhZ21lbnRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5nZXRJbml0aWFsaXplcigpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSB0eXBlIGxpdGVyYWwiLCBleHByZXNzaW9uIGluc3RhbmNlb2YgVHlwZUxpdGVyYWwpOyAvLyROT04tTkxTLTEkCi0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IGV4cHJlc3Npb24ucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHR5cGUgYmluZGluZyIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCAiQ2xhc3MiLCB0eXBlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDg2MQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjc5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyNzkiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDAsMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQiLCBub2RlIGluc3RhbmNlb2YgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIG5vZGU7Ci0JCWNoZWNrU291cmNlUmFuZ2UodmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCwgIkNsYXNzIGMgPSBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJTGlzdCBmcmFnbWVudHMgPSB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LmZyYWdtZW50cygpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHNpemUiLCAxLCBmcmFnbWVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgZnJhZ21lbnRzLmdldCgwKTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LmdldEluaXRpYWxpemVyKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHR5cGUgbGl0ZXJhbCIsIGV4cHJlc3Npb24gaW5zdGFuY2VvZiBUeXBlTGl0ZXJhbCk7IC8vJE5PTi1OTFMtMSQKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gZXhwcmVzc2lvbi5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJDbGFzcyIsIHR5cGVCaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA4NjUKLQkgKiBDaGVjayB3ZWxsIGtub3duIHR5cGVzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyODAoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDI4MCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlBU1QgbmV3QXN0ID0gcmVzdWx0LmdldEFTVCgpOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBuZXdBc3QucmVzb2x2ZVdlbGxLbm93blR5cGUoImJvb2xlYW4iKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJObyB0eXBlQmluZGluZyIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCAiYm9vbGVhbiIsIHR5cGVCaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0eXBlQmluZGluZyA9IG5ld0FzdC5yZXNvbHZlV2VsbEtub3duVHlwZSgiY2hhciIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoIk5vIHR5cGVCaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJjaGFyIiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXR5cGVCaW5kaW5nID0gbmV3QXN0LnJlc29sdmVXZWxsS25vd25UeXBlKCJieXRlIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZUJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgImJ5dGUiLCB0eXBlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdHlwZUJpbmRpbmcgPSBuZXdBc3QucmVzb2x2ZVdlbGxLbm93blR5cGUoInNob3J0Iik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZUJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgInNob3J0IiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXR5cGVCaW5kaW5nID0gbmV3QXN0LnJlc29sdmVXZWxsS25vd25UeXBlKCJpbnQiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJObyB0eXBlQmluZGluZyIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCAiaW50IiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXR5cGVCaW5kaW5nID0gbmV3QXN0LnJlc29sdmVXZWxsS25vd25UeXBlKCJsb25nIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZUJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgImxvbmciLCB0eXBlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdHlwZUJpbmRpbmcgPSBuZXdBc3QucmVzb2x2ZVdlbGxLbm93blR5cGUoImZsb2F0Iik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZUJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgImZsb2F0IiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXR5cGVCaW5kaW5nID0gbmV3QXN0LnJlc29sdmVXZWxsS25vd25UeXBlKCJkb3VibGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJObyB0eXBlQmluZGluZyIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCAiZG91YmxlIiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXR5cGVCaW5kaW5nID0gbmV3QXN0LnJlc29sdmVXZWxsS25vd25UeXBlKCJ2b2lkIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZUJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgInZvaWQiLCB0eXBlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdHlwZUJpbmRpbmcgPSBuZXdBc3QucmVzb2x2ZVdlbGxLbm93blR5cGUoImphdmEubGFuZy5PYmplY3QiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJObyB0eXBlQmluZGluZyIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCAiT2JqZWN0IiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXR5cGVCaW5kaW5nID0gbmV3QXN0LnJlc29sdmVXZWxsS25vd25UeXBlKCJqYXZhLmxhbmcuU3RyaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZUJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgIlN0cmluZyIsIHR5cGVCaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0eXBlQmluZGluZyA9IG5ld0FzdC5yZXNvbHZlV2VsbEtub3duVHlwZSgiamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoIk5vIHR5cGVCaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJTdHJpbmdCdWZmZXIiLCB0eXBlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdHlwZUJpbmRpbmcgPSBuZXdBc3QucmVzb2x2ZVdlbGxLbm93blR5cGUoImphdmEubGFuZy5UaHJvd2FibGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJObyB0eXBlQmluZGluZyIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCAiVGhyb3dhYmxlIiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXR5cGVCaW5kaW5nID0gbmV3QXN0LnJlc29sdmVXZWxsS25vd25UeXBlKCJqYXZhLmxhbmcuRXhjZXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZUJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgIkV4Y2VwdGlvbiIsIHR5cGVCaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0eXBlQmluZGluZyA9IG5ld0FzdC5yZXNvbHZlV2VsbEtub3duVHlwZSgiamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJObyB0eXBlQmluZGluZyIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCAiUnVudGltZUV4Y2VwdGlvbiIsIHR5cGVCaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0eXBlQmluZGluZyA9IG5ld0FzdC5yZXNvbHZlV2VsbEtub3duVHlwZSgiamF2YS5sYW5nLkVycm9yIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZUJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgIkVycm9yIiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXR5cGVCaW5kaW5nID0gbmV3QXN0LnJlc29sdmVXZWxsS25vd25UeXBlKCJqYXZhLmxhbmcuQ2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJObyB0eXBlQmluZGluZyIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCAiQ2xhc3MiLCB0eXBlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdHlwZUJpbmRpbmcgPSBuZXdBc3QucmVzb2x2ZVdlbGxLbm93blR5cGUoImphdmEubGFuZy5SdW5uYWJsZSIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE51bGwoInR5cGVCaW5kaW5nIG5vdCBudWxsIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDg3NAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjgxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyODEiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDApOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBGaWVsZCBkZWNsYXJhdGlvbiIsIG5vZGUgaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSAoRmllbGREZWNsYXJhdGlvbikgbm9kZTsKLQkJY2hlY2tTb3VyY2VSYW5nZShmaWVsZERlY2xhcmF0aW9uLCAiT2JqZWN0IG89IC8qXSovbmV3IE9iamVjdCgpLypbKi87Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlMaXN0IGZyYWdtZW50cyA9IGZpZWxkRGVjbGFyYXRpb24uZnJhZ21lbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc2l6ZSIsIDEsIGZyYWdtZW50cy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcmFnbWVudHMuZ2V0KDApOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuZ2V0SW5pdGlhbGl6ZXIoKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShleHByZXNzaW9uLCAibmV3IE9iamVjdCgpIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwODc0Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyODIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDI4MiIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIEZpZWxkIGRlY2xhcmF0aW9uIiwgbm9kZSBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IChGaWVsZERlY2xhcmF0aW9uKSBub2RlOwotCQljaGVja1NvdXJjZVJhbmdlKGZpZWxkRGVjbGFyYXRpb24sICJib29sZWFuIGIgPSAvKl0qL3RydWUvKlsqLzsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCUxpc3QgZnJhZ21lbnRzID0gZmllbGREZWNsYXJhdGlvbi5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzaXplIiwgMSwgZnJhZ21lbnRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5nZXRJbml0aWFsaXplcigpOwotCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb24sICJ0cnVlIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA4NzQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDI4MygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjgzIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgRmllbGQgZGVjbGFyYXRpb24iLCBub2RlIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gKEZpZWxkRGVjbGFyYXRpb24pIG5vZGU7Ci0JCWNoZWNrU291cmNlUmFuZ2UoZmllbGREZWNsYXJhdGlvbiwgImNoYXIgYyA9IC8qXSovJ2MnLypbKi87Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlMaXN0IGZyYWdtZW50cyA9IGZpZWxkRGVjbGFyYXRpb24uZnJhZ21lbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc2l6ZSIsIDEsIGZyYWdtZW50cy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcmFnbWVudHMuZ2V0KDApOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuZ2V0SW5pdGlhbGl6ZXIoKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShleHByZXNzaW9uLCAiJ2MnIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA4NzQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDI4NCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjg0IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgRmllbGQgZGVjbGFyYXRpb24iLCBub2RlIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gKEZpZWxkRGVjbGFyYXRpb24pIG5vZGU7Ci0JCWNoZWNrU291cmNlUmFuZ2UoZmllbGREZWNsYXJhdGlvbiwgIk9iamVjdCBvID0gLypdKi9udWxsLypbKi87Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlMaXN0IGZyYWdtZW50cyA9IGZpZWxkRGVjbGFyYXRpb24uZnJhZ21lbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc2l6ZSIsIDEsIGZyYWdtZW50cy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcmFnbWVudHMuZ2V0KDApOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuZ2V0SW5pdGlhbGl6ZXIoKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShleHByZXNzaW9uLCAibnVsbCIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwODc0Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyODUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDI4NSIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIEZpZWxkIGRlY2xhcmF0aW9uIiwgbm9kZSBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IChGaWVsZERlY2xhcmF0aW9uKSBub2RlOwotCQljaGVja1NvdXJjZVJhbmdlKGZpZWxkRGVjbGFyYXRpb24sICJPYmplY3QgbyA9IC8qXSovT2JqZWN0LmNsYXNzLypbKi87Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlMaXN0IGZyYWdtZW50cyA9IGZpZWxkRGVjbGFyYXRpb24uZnJhZ21lbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc2l6ZSIsIDEsIGZyYWdtZW50cy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcmFnbWVudHMuZ2V0KDApOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuZ2V0SW5pdGlhbGl6ZXIoKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShleHByZXNzaW9uLCAiT2JqZWN0LmNsYXNzIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA4NzQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDI4NigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjg2IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgRmllbGQgZGVjbGFyYXRpb24iLCBub2RlIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gKEZpZWxkRGVjbGFyYXRpb24pIG5vZGU7Ci0JCWNoZWNrU291cmNlUmFuZ2UoZmllbGREZWNsYXJhdGlvbiwgImludCBpID0gLyoqLygyKS8qKi87Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlMaXN0IGZyYWdtZW50cyA9IGZpZWxkRGVjbGFyYXRpb24uZnJhZ21lbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc2l6ZSIsIDEsIGZyYWdtZW50cy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcmFnbWVudHMuZ2V0KDApOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuZ2V0SW5pdGlhbGl6ZXIoKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShleHByZXNzaW9uLCAiKDIpIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA4NzQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDI4NygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjg3IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgRmllbGQgZGVjbGFyYXRpb24iLCBub2RlIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gKEZpZWxkRGVjbGFyYXRpb24pIG5vZGU7Ci0JCWNoZWNrU291cmNlUmFuZ2UoZmllbGREZWNsYXJhdGlvbiwgIlN0cmluZ1tdIHRhYiA9IC8qKi9uZXcgU3RyaW5nWzNdLyoqLzsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCUxpc3QgZnJhZ21lbnRzID0gZmllbGREZWNsYXJhdGlvbi5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzaXplIiwgMSwgZnJhZ21lbnRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5nZXRJbml0aWFsaXplcigpOwotCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb24sICJuZXcgU3RyaW5nWzNdIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA4NzQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDI4OCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjg4IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgRmllbGQgZGVjbGFyYXRpb24iLCBub2RlIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gKEZpZWxkRGVjbGFyYXRpb24pIG5vZGU7Ci0JCWNoZWNrU291cmNlUmFuZ2UoZmllbGREZWNsYXJhdGlvbiwgIlN0cmluZ1tdIHRhYiA9IC8qKi97IH0vKiovOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJTGlzdCBmcmFnbWVudHMgPSBmaWVsZERlY2xhcmF0aW9uLmZyYWdtZW50cygpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHNpemUiLCAxLCBmcmFnbWVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgZnJhZ21lbnRzLmdldCgwKTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LmdldEluaXRpYWxpemVyKCk7Ci0JCWNoZWNrU291cmNlUmFuZ2UoZXhwcmVzc2lvbiwgInsgfSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwODc0Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyODkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDI4OSIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMSk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIEZpZWxkIGRlY2xhcmF0aW9uIiwgbm9kZSBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IChGaWVsZERlY2xhcmF0aW9uKSBub2RlOwotCQljaGVja1NvdXJjZVJhbmdlKGZpZWxkRGVjbGFyYXRpb24sICJTdHJpbmcgcyA9IC8qKi90YWIxWzBdLyoqLzsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCUxpc3QgZnJhZ21lbnRzID0gZmllbGREZWNsYXJhdGlvbi5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzaXplIiwgMSwgZnJhZ21lbnRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5nZXRJbml0aWFsaXplcigpOwotCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb24sICJ0YWIxWzBdIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA4NzQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDI5MCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjkwIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgRmllbGQgZGVjbGFyYXRpb24iLCBub2RlIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gKEZpZWxkRGVjbGFyYXRpb24pIG5vZGU7Ci0JCWNoZWNrU291cmNlUmFuZ2UoZmllbGREZWNsYXJhdGlvbiwgIk9iamVjdCBvID0gLypdKi9uZXcgamF2YS5sYW5nLk9iamVjdCgpLypbKi87Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlMaXN0IGZyYWdtZW50cyA9IGZpZWxkRGVjbGFyYXRpb24uZnJhZ21lbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc2l6ZSIsIDEsIGZyYWdtZW50cy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcmFnbWVudHMuZ2V0KDApOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuZ2V0SW5pdGlhbGl6ZXIoKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShleHByZXNzaW9uLCAibmV3IGphdmEubGFuZy5PYmplY3QoKSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwODk4Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyOTEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDI5MSIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgdW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0RXF1YWxzKCJubyBlcnJvcnMiLCAxLCB1bml0LmdldE1lc3NhZ2VzKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIm5vIGVycm9ycyIsIDEsIHVuaXQuZ2V0UHJvYmxlbXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDkxMwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjkyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyOTIiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDAsIDApOwotCQlhc3NlcnRUcnVlKCJOb3QgYSByZXR1cm4gc3RhdGVtZW50Iiwgbm9kZSBpbnN0YW5jZW9mIFJldHVyblN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJUmV0dXJuU3RhdGVtZW50IHJldHVyblN0YXRlbWVudCA9IChSZXR1cm5TdGF0ZW1lbnQpIG5vZGU7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHJldHVyblN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHF1YWxpZmllZE5hbWUiLCBleHByZXNzaW9uIGluc3RhbmNlb2YgUXVhbGlmaWVkTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJUXVhbGlmaWVkTmFtZSBxdWFsaWZpZWROYW1lID0gKFF1YWxpZmllZE5hbWUpIGV4cHJlc3Npb247Ci0JCVNpbXBsZU5hbWUgc2ltcGxlTmFtZSA9IHF1YWxpZmllZE5hbWUuZ2V0TmFtZSgpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCAieCIsIHNpbXBsZU5hbWUuZ2V0SWRlbnRpZmllcigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUlCaW5kaW5nIGJpbmRpbmcgPSBzaW1wbGVOYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5PIGJpbmRpbmciLCBiaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgYSB2YXJpYWJsZSBiaW5kaW5nIiwgYmluZGluZyBpbnN0YW5jZW9mIElWYXJpYWJsZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJ4IiwgYmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJTmFtZSBuYW1lID0gcXVhbGlmaWVkTmFtZS5nZXRRdWFsaWZpZXIoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgc2ltcGxlTmFtZSIsIG5hbWUgaW5zdGFuY2VvZiBTaW1wbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlTaW1wbGVOYW1lIHNpbXBsZU5hbWUyID0gKFNpbXBsZU5hbWUpIG5hbWU7Ci0JCUlCaW5kaW5nIGJpbmRpbmcyID0gc2ltcGxlTmFtZTIucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZzIiLCBiaW5kaW5nMik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgdHlwZSBiaW5kaW5nIiwgYmluZGluZzIgaW5zdGFuY2VvZiBJVHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJUZXN0IiwgYmluZGluZzIuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDkzMwotIAkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwOTM1Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAyOTMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDI5MyIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCwgMCk7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KSBub2RlOwotCQlMaXN0IGZyYWdtZW50cyA9IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuZnJhZ21lbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc2l6ZSIsIDEsIGZyYWdtZW50cy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcmFnbWVudHMuZ2V0KDApOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuZ2V0SW5pdGlhbGl6ZXIoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24iLCBleHByZXNzaW9uIGluc3RhbmNlb2YgQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlDbGFzc0luc3RhbmNlQ3JlYXRpb24gY2xhc3NJbnN0YW5jZUNyZWF0aW9uID0gKENsYXNzSW5zdGFuY2VDcmVhdGlvbikgZXhwcmVzc2lvbjsKLQkJQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBhbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uID0gY2xhc3NJbnN0YW5jZUNyZWF0aW9uLmdldEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYm9keSIsIGFub255bW91c0NsYXNzRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBleHBlY3RlZFNvdXJjZSA9IAotCQkJCSJ7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJCSIJCQlwdWJsaWMgdm9pZCBydW4oKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJCSIJCQkJLypdKi9mb28oKTsvKlsqL1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkiCQkJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkiCQl9IjsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGFub255bW91c0NsYXNzRGVjbGFyYXRpb24sIGV4cGVjdGVkU291cmNlLCBzb3VyY2UpOwotCQlleHBlY3RlZFNvdXJjZSA9Ci0JCQkJInJ1bj0gbmV3IFJ1bm5hYmxlKCkge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkiCQkJcHVibGljIHZvaWQgcnVuKCkge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkiCQkJCS8qXSovZm9vKCk7LypbKi9cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkJIgkJCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkJIgkJfSI7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZSh2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQsIGV4cGVjdGVkU291cmNlLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA5ODQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDI5NCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjk0IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgbWV0aG9kIGRlY2xhcmF0aW9uIiwgbm9kZSBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbikgbm9kZTsKLQkJU3RyaW5nIGV4cGVjdGVkU291cmNlID0gCi0JCQkJInB1YmxpYyB2b2lkIGZhaWxzKCkge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkiCQlmb28oKVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkiCX0iOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UobWV0aG9kRGVjbGFyYXRpb24sIGV4cGVjdGVkU291cmNlLCBzb3VyY2UpOwotCQlCbG9jayBibG9jayA9IG1ldGhvZERlY2xhcmF0aW9uLmdldEJvZHkoKTsKLQkJZXhwZWN0ZWRTb3VyY2UgPSAKLQkJCQkie1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkiCQlmb28oKVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkiCX0iOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UoYmxvY2ssIGV4cGVjdGVkU291cmNlLCBzb3VyY2UpOwkKLQkJbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAxKTsJCi0JCWFzc2VydFRydWUoIk5vdCBhIG1ldGhvZCBkZWNsYXJhdGlvbiIsIG5vZGUgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIG5vZGU7Ci0JCWJsb2NrID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0Qm9keSgpOwotCQlMaXN0IHN0YXRlbWVudHMgPSBibG9jay5zdGF0ZW1lbnRzKCk7Ci0JCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDEsIHN0YXRlbWVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA5ODYKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDI5NSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjk1IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc2l6ZSIsIDIsIGNvbXBpbGF0aW9uVW5pdC5nZXRNZXNzYWdlcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzaXplIiwgMiwgY29tcGlsYXRpb25Vbml0LmdldFByb2JsZW1zKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMSwgMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhbiBFeHByZXNzaW9uU3RhdGVtZW50Iiwgbm9kZSBpbnN0YW5jZW9mIEV4cHJlc3Npb25TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCUV4cHJlc3Npb25TdGF0ZW1lbnQgZXhwcmVzc2lvblN0YXRlbWVudCA9IChFeHByZXNzaW9uU3RhdGVtZW50KSBub2RlOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBleHByZXNzaW9uU3RhdGVtZW50LmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgbWV0aG9kIGludm9jYXRpb24iLCBleHByZXNzaW9uIGluc3RhbmNlb2YgTWV0aG9kSW52b2NhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJTWV0aG9kSW52b2NhdGlvbiBtZXRob2RJbnZvY2F0aW9uID0gKE1ldGhvZEludm9jYXRpb24pIGV4cHJlc3Npb247Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IG1ldGhvZEludm9jYXRpb24ucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE51bGwoInR5cGUgYmluZGluZyBpcyBub3QgbnVsbCIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDk4NAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMjk2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAyOTYiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgbWV0aG9kIGRlY2xhcmF0aW9uIiwgbm9kZSBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbikgbm9kZTsKLQkJU3RyaW5nIGV4cGVjdGVkU291cmNlID0gCi0JCQkJInB1YmxpYyB2b2lkIGZhaWxzKCkge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkiCQlmb28oKVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkiCX0iOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UobWV0aG9kRGVjbGFyYXRpb24sIGV4cGVjdGVkU291cmNlLCBzb3VyY2UpOwotCQlCbG9jayBibG9jayA9IG1ldGhvZERlY2xhcmF0aW9uLmdldEJvZHkoKTsKLQkJZXhwZWN0ZWRTb3VyY2UgPSAKLQkJCQkie1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkiCQlmb28oKVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkiCX0iOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UoYmxvY2ssIGV4cGVjdGVkU291cmNlLCBzb3VyY2UpOwkKLQkJbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAxKTsJCi0JCWFzc2VydFRydWUoIk5vdCBhIG1ldGhvZCBkZWNsYXJhdGlvbiIsIG5vZGUgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIG5vZGU7Ci0JCWJsb2NrID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0Qm9keSgpOwotCQlMaXN0IHN0YXRlbWVudHMgPSBibG9jay5zdGF0ZW1lbnRzKCk7Ci0JCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDEsIHN0YXRlbWVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEwMzcKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDI5NygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjk3IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCXJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA5ODQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDI5OCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjk4IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCwgMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIFJldHVyblN0YXRlbWVudCIsIG5vZGUgaW5zdGFuY2VvZiBSZXR1cm5TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCVJldHVyblN0YXRlbWVudCByZXR1cm5TdGF0ZW1lbnQgPSAoUmV0dXJuU3RhdGVtZW50KSBub2RlOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSByZXR1cm5TdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpOwotCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb24sICJhKCkubGVuZ3RoICE9IDMiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDg3NAotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTExMDQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDI5OSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMjk5IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgRmllbGQgZGVjbGFyYXRpb24iLCBub2RlIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gKEZpZWxkRGVjbGFyYXRpb24pIG5vZGU7Ci0JCWNoZWNrU291cmNlUmFuZ2UoZmllbGREZWNsYXJhdGlvbiwgImludCBpID0gKC8qKi8yLyoqLyk7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlMaXN0IGZyYWdtZW50cyA9IGZpZWxkRGVjbGFyYXRpb24uZnJhZ21lbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc2l6ZSIsIDEsIGZyYWdtZW50cy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcmFnbWVudHMuZ2V0KDApOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuZ2V0SW5pdGlhbGl6ZXIoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uIiwgZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKTsgLy8kTk9OLU5MUy0xJAotCQlQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBwYXJlbnRoZXNpemVkRXhwcmVzc2lvbiA9IChQYXJlbnRoZXNpemVkRXhwcmVzc2lvbikgZXhwcmVzc2lvbjsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uMiA9IHBhcmVudGhlc2l6ZWRFeHByZXNzaW9uLmdldEV4cHJlc3Npb24oKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShleHByZXNzaW9uMiwgIjIiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDg3NAotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTExMDQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDMwMCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzAwIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgRmllbGQgZGVjbGFyYXRpb24iLCBub2RlIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gKEZpZWxkRGVjbGFyYXRpb24pIG5vZGU7Ci0JCWNoZWNrU291cmNlUmFuZ2UoZmllbGREZWNsYXJhdGlvbiwgImJvb2xlYW4gYiA9IC8qKi90cnVlLyoqLzsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCUxpc3QgZnJhZ21lbnRzID0gZmllbGREZWNsYXJhdGlvbi5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzaXplIiwgMSwgZnJhZ21lbnRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5nZXRJbml0aWFsaXplcigpOwotCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb24sICJ0cnVlIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA4NzQKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMTA0Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzMDEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDMwMSIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIEZpZWxkIGRlY2xhcmF0aW9uIiwgbm9kZSBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IChGaWVsZERlY2xhcmF0aW9uKSBub2RlOwotCQljaGVja1NvdXJjZVJhbmdlKGZpZWxkRGVjbGFyYXRpb24sICJPYmplY3QgbyA9IC8qKi9udWxsLyoqLzsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCUxpc3QgZnJhZ21lbnRzID0gZmllbGREZWNsYXJhdGlvbi5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzaXplIiwgMSwgZnJhZ21lbnRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5nZXRJbml0aWFsaXplcigpOwotCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb24sICJudWxsIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTExMDYKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDMwMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzAyIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgRG9TdGF0ZW1lbnQiLCBub2RlIGluc3RhbmNlb2YgRG9TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCURvU3RhdGVtZW50IGRvU3RhdGVtZW50ID0gKERvU3RhdGVtZW50KSBub2RlOwotCQlTdHJpbmcgZXhwZWN0ZWRTb3VyY2UgPSAKLQkJCQkiZG9cbiIgKyAgIC8vJE5PTi1OTFMtMSQKLQkJCQkiCQkJZm9vKCk7XG4iICsgIC8vJE5PTi1OTFMtMSQKLQkJCQkiCQl3aGlsZSgxIDwgMTApOyI7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShkb1N0YXRlbWVudCwgZXhwZWN0ZWRTb3VyY2UsIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTEyOQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzAzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAzMDMiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDAsIDEpOwotCQlhc3NlcnRUcnVlKCJOb3QgYW4gRXhwcmVzc2lvblN0YXRlbWVudCIsIG5vZGUgaW5zdGFuY2VvZiBFeHByZXNzaW9uU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlFeHByZXNzaW9uU3RhdGVtZW50IGV4cHJlc3Npb25TdGF0ZW1lbnQgPSAoRXhwcmVzc2lvblN0YXRlbWVudCkgbm9kZTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uMiA9IGV4cHJlc3Npb25TdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpOwotCQlhc3NlcnRUcnVlKCJOb3QgYW4gQXNzaWduZW1lbnQiLCBleHByZXNzaW9uMiBpbnN0YW5jZW9mIEFzc2lnbm1lbnQpOyAvLyROT04tTkxTLTEkCi0JCUFzc2lnbm1lbnQgYXNzaWdubWVudCA9IChBc3NpZ25tZW50KSBleHByZXNzaW9uMjsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gYXNzaWdubWVudC5nZXRSaWdodEhhbmRTaWRlKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIENhc3RFeHByZXNzaW9uIiwgZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENhc3RFeHByZXNzaW9uKTsgLy8kTk9OLU5MUy0xJAotCQlDYXN0RXhwcmVzc2lvbiBjYXN0RXhwcmVzc2lvbiA9IChDYXN0RXhwcmVzc2lvbikgZXhwcmVzc2lvbjsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gY2FzdEV4cHJlc3Npb24ucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgImNoYXIiLCB0eXBlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJVHlwZSB0eXBlID0gY2FzdEV4cHJlc3Npb24uZ2V0VHlwZSgpOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcyID0gdHlwZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nMiIsIHR5cGVCaW5kaW5nMik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgImNoYXIiLCB0eXBlQmluZGluZzIuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTE1MQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzA0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAzMDQiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgbWV0aG9kIGRlY2xhcmF0aW9uIiwgbm9kZSBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJwdWJsaWMgdm9pZCBmb28oaW50IGFyZyk7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbikgbm9kZTsKLQkJQmxvY2sgYmxvY2sgPSBtZXRob2REZWNsYXJhdGlvbi5nZXRCb2R5KCk7Ci0JCWFzc2VydE51bGwoIkhhcyBhIGJvZHkiLCBibG9jayk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMTI1Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzMDUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJY2hhcltdIHNvdXJjZSA9IAotCQkJCSgicGFja2FnZSB0ZXN0MDMwNDtcbiIgKyAgLy8kTk9OLU5MUy0xJAotCQkJCSJcbiIgKyAgLy8kTk9OLU5MUy0xJAotCQkJCSJjbGFzcyBUZXN0IHtcbiIgKyAgLy8kTk9OLU5MUy0xJAotCQkJCSIJcHVibGljIHZvaWQgZm9vKGludCBhcmcpIHt9XG4iICsgIC8vJE5PTi1OTFMtMSQKLQkJCQkifSIpLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKLQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSBnZXRKYXZhUHJvamVjdCgiQ29udmVydGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZSwgIlRlc3QuamF2YSIsIHByb2plY3QpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIFR5cGVEZWNsYXJhdGlvbiIsIG5vZGUgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKSBub2RlOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0eXBlRGVjbGFyYXRpb24ucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJUZXN0IiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgcGFja2FnZSIsICJ0ZXN0MDMwNCIsIHR5cGVCaW5kaW5nLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGludGVyZmFjZSIsIHR5cGVCaW5kaW5nLmlzQ2xhc3MoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMTI1Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzMDYoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJY2hhcltdIHNvdXJjZSA9IAotCQkJCSgicGFja2FnZSBqYXZhLmxhbmc7XG4iICsgIC8vJE5PTi1OTFMtMSQKLQkJCQkiXG4iICsgIC8vJE5PTi1OTFMtMSQKLQkJCQkiY2xhc3MgT2JqZWN0IHtcbiIgKyAgLy8kTk9OLU5MUy0xJAotCQkJCSIJcHVibGljIHZvaWQgZm9vKGludCBhcmcpIHt9XG4iICsgIC8vJE5PTi1OTFMtMSQKLQkJCQkifSIpLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKLQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSBnZXRKYXZhUHJvamVjdCgiQ29udmVydGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZSwgIk9iamVjdC5qYXZhIiwgcHJvamVjdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgVHlwZURlY2xhcmF0aW9uIiwgbm9kZSBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pIG5vZGU7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHR5cGVEZWNsYXJhdGlvbi5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyB0eXBlIGJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgIk9iamVjdCIsIHR5cGVCaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIHBhY2thZ2UiLCAiamF2YS5sYW5nIiwgdHlwZUJpbmRpbmcuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRUcnVlKCJOb3QgYW4gaW50ZXJmYWNlIiwgdHlwZUJpbmRpbmcuaXNDbGFzcygpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIHNpemUiLCAyLCB0eXBlQmluZGluZy5nZXREZWNsYXJlZE1ldGhvZHMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTM3MQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzA3KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAzMDciLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDEsIDApOwotCQlhc3NlcnRUcnVlKCJub3QgYSBtZXRob2QgZGVjbGFyYXRpb24iLCBub2RlIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBub2RlOwotCQlCbG9jayBibG9jayA9IG1ldGhvZERlY2xhcmF0aW9uLmdldEJvZHkoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYm9keSIsIGJsb2NrKTsgLy8kTk9OLU5MUy0xJAotCQlMaXN0IHN0YXRlbWVudHMgPSBibG9jay5zdGF0ZW1lbnRzKCk7Ci0JCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDEsIHN0YXRlbWVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlTdGF0ZW1lbnQgc3RhdGVtZW50ID0gKFN0YXRlbWVudCkgc3RhdGVtZW50cy5nZXQoMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHN1cGVyIGNvbnN0cnVjdG9yIGludm9jYXRpb24iLCBzdGF0ZW1lbnQgaW5zdGFuY2VvZiBTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShzdGF0ZW1lbnQsICJzdXBlcigxMCk7Iiwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMzcxCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzMDgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDMwOCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMSwgMCk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIG1ldGhvZCBkZWNsYXJhdGlvbiIsIG5vZGUgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIG5vZGU7Ci0JCUJsb2NrIGJsb2NrID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0Qm9keSgpOwotCQlhc3NlcnROb3ROdWxsKCJObyBib2R5IiwgYmxvY2spOyAvLyROT04tTkxTLTEkCi0JCUxpc3Qgc3RhdGVtZW50cyA9IGJsb2NrLnN0YXRlbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMSwgc3RhdGVtZW50cy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCVN0YXRlbWVudCBzdGF0ZW1lbnQgPSAoU3RhdGVtZW50KSBzdGF0ZW1lbnRzLmdldCgwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgc3VwZXIgY29uc3RydWN0b3IgaW52b2NhdGlvbiIsIHN0YXRlbWVudCBpbnN0YW5jZW9mIFN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbiBzdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbiA9IChTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbikgc3RhdGVtZW50OwotCQlJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gc3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24ucmVzb2x2ZUNvbnN0cnVjdG9yQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBtZXRob2RCaW5kaW5nIiwgbWV0aG9kQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZzIgPSBtZXRob2REZWNsYXJhdGlvbi5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBtZXRob2RCaW5kaW5nMiIsIG1ldGhvZEJpbmRpbmcyKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMzgwCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzMDkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDMwOSIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCwgMCk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQiLCBub2RlIGluc3RhbmNlb2YgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIG5vZGU7Ci0JCUxpc3QgZnJhZ21lbnRzID0gdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMSwgZnJhZ21lbnRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5nZXRJbml0aWFsaXplcigpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBjb25kaXRpb25hbCBleHByZXNzaW9uIiwgZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENvbmRpdGlvbmFsRXhwcmVzc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJQ29uZGl0aW9uYWxFeHByZXNzaW9uIGNvbmRpdGlvbmFsRXhwcmVzc2lvbiA9IChDb25kaXRpb25hbEV4cHJlc3Npb24pIGV4cHJlc3Npb247Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IGNvbmRpdGlvbmFsRXhwcmVzc2lvbi5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJpbnQiLCB0eXBlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMzgwCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzMTAoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDMxMCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIEZpZWxkRGVjbGFyYXRpb24iLCBub2RlIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gKEZpZWxkRGVjbGFyYXRpb24pIG5vZGU7Ci0JCUxpc3QgZnJhZ21lbnRzID0gZmllbGREZWNsYXJhdGlvbi5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMSwgZnJhZ21lbnRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5nZXRJbml0aWFsaXplcigpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBxdWFsaWZpZWQgbmFtZSIsIGV4cHJlc3Npb24gaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlRdWFsaWZpZWROYW1lIHF1YWxpZmllZE5hbWUgPSAoUXVhbGlmaWVkTmFtZSkgZXhwcmVzc2lvbjsKLQkJTmFtZSBxdWFsaWZpZXIgPSBxdWFsaWZpZWROYW1lLmdldFF1YWxpZmllcigpOwotCQlJQmluZGluZyBiaW5kaW5nID0gcXVhbGlmaWVyLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCBiaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAiSSIsIGJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTYzOAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzExKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAzMTEiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDAsIDEpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50Iiwgbm9kZSBpbnN0YW5jZW9mIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KSBub2RlOwotCQlMaXN0IGZyYWdtZW50cyA9IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuZnJhZ21lbnRzKCk7Ci0JCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDEsIGZyYWdtZW50cy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcmFnbWVudHMuZ2V0KDApOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuZ2V0SW5pdGlhbGl6ZXIoKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24iLCBleHByZXNzaW9uIGluc3RhbmNlb2YgQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlDbGFzc0luc3RhbmNlQ3JlYXRpb24gY2xhc3NJbnN0YW5jZUNyZWF0aW9uID0gKENsYXNzSW5zdGFuY2VDcmVhdGlvbikgZXhwcmVzc2lvbjsKLQkJQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBhbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uID0gY2xhc3NJbnN0YW5jZUNyZWF0aW9uLmdldEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYm9keSIsIGFub255bW91c0NsYXNzRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCUxpc3QgYm9keURlY2xhcmF0aW9ucyA9IGFub255bW91c0NsYXNzRGVjbGFyYXRpb24uYm9keURlY2xhcmF0aW9ucygpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUgZm9yIGJvZHkgZGVjbGFyYXRpb25zIiwgMSwgYm9keURlY2xhcmF0aW9ucy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCUJvZHlEZWNsYXJhdGlvbiBib2R5RGVjbGFyYXRpb24gPSAoQm9keURlY2xhcmF0aW9uKSBib2R5RGVjbGFyYXRpb25zLmdldCgwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgbWV0aG9kIGRlY2xhcmF0aW9uIiwgYm9keURlY2xhcmF0aW9uIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBib2R5RGVjbGFyYXRpb247Ci0JCUJsb2NrIGJsb2NrID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0Qm9keSgpOwotCQlhc3NlcnROb3ROdWxsKCJubyBib2R5IiwgYmxvY2spOyAvLyROT04tTkxTLTEkCi0JCUxpc3Qgc3RhdGVtZW50cyA9IGJsb2NrLnN0YXRlbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzaXplIGZvciBzdGF0ZW1lbnRzIiwgMSwgc3RhdGVtZW50cy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCVN0YXRlbWVudCBzdGF0ZW1lbnQgPSAoU3RhdGVtZW50KSBzdGF0ZW1lbnRzLmdldCgwKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50Iiwgc3RhdGVtZW50IGluc3RhbmNlb2YgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50MiA9IChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KSBzdGF0ZW1lbnQ7Ci0JCUxpc3QgZnJhZ21lbnRzMiA9IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQyLmZyYWdtZW50cygpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUgZm9yIGZyYWdtZW50czIiLCAxLCBmcmFnbWVudHMyLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDIgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcmFnbWVudHMyLmdldCgwKTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uMiA9IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDIuZ2V0SW5pdGlhbGl6ZXIoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgbmFtZSIsIGV4cHJlc3Npb24yIGluc3RhbmNlb2YgTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJTmFtZSBuYW1lID0gKE5hbWUpIGV4cHJlc3Npb24yOwotCQljaGVja1NvdXJjZVJhbmdlKG5hbWUsICJqIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlJQmluZGluZyBiaW5kaW5nID0gbmFtZS5yZXNvbHZlQmluZGluZygpOwotCQlBU1ROb2RlIGRlY2xhcmluZ05vZGUgPSBjb21waWxhdGlvblVuaXQuZmluZERlY2xhcmluZ05vZGUoYmluZGluZyk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGRlY2xhcmluZyBub2RlIiwgZGVjbGFyaW5nTm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShkZWNsYXJpbmdOb2RlLCAiaW50IGoiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhIHNpbmdsZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiIsIGRlY2xhcmluZ05vZGUgaW5zdGFuY2VvZiBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE2MzgKLQkgKiBUaGVyZSBpcyBhIGVycm9yIGluIHRoaXMgc291cmNlLiBBIGlzIHVucmVzb2x2ZWQuIFRoZW4gdGhlcmUgaXMgbm8KLQkgKiBkZWNsYXJpbmcgbm9kZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDMxMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzEyIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwLCAxKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCIsIG5vZGUgaW5zdGFuY2VvZiBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCkgbm9kZTsKLQkJTGlzdCBmcmFnbWVudHMgPSB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LmZyYWdtZW50cygpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAxLCBmcmFnbWVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgZnJhZ21lbnRzLmdldCgwKTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LmdldEluaXRpYWxpemVyKCk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIGNsYXNzIGluc3RhbmNlIGNyZWF0aW9uIiwgZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENsYXNzSW5zdGFuY2VDcmVhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIGNsYXNzSW5zdGFuY2VDcmVhdGlvbiA9IChDbGFzc0luc3RhbmNlQ3JlYXRpb24pIGV4cHJlc3Npb247Ci0JCUFub255bW91c0NsYXNzRGVjbGFyYXRpb24gYW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiA9IGNsYXNzSW5zdGFuY2VDcmVhdGlvbi5nZXRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJvZHkiLCBhbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlMaXN0IGJvZHlEZWNsYXJhdGlvbnMgPSBhbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLmJvZHlEZWNsYXJhdGlvbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIGZvciBib2R5IGRlY2xhcmF0aW9ucyIsIDEsIGJvZHlEZWNsYXJhdGlvbnMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlCb2R5RGVjbGFyYXRpb24gYm9keURlY2xhcmF0aW9uID0gKEJvZHlEZWNsYXJhdGlvbikgYm9keURlY2xhcmF0aW9ucy5nZXQoMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIG1ldGhvZCBkZWNsYXJhdGlvbiIsIGJvZHlEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbikgYm9keURlY2xhcmF0aW9uOwotCQlCbG9jayBibG9jayA9IG1ldGhvZERlY2xhcmF0aW9uLmdldEJvZHkoKTsKLQkJYXNzZXJ0Tm90TnVsbCgibm8gYm9keSIsIGJsb2NrKTsgLy8kTk9OLU5MUy0xJAotCQlMaXN0IHN0YXRlbWVudHMgPSBibG9jay5zdGF0ZW1lbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc2l6ZSBmb3Igc3RhdGVtZW50cyIsIDEsIHN0YXRlbWVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlTdGF0ZW1lbnQgc3RhdGVtZW50ID0gKFN0YXRlbWVudCkgc3RhdGVtZW50cy5nZXQoMCk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCIsIHN0YXRlbWVudCBpbnN0YW5jZW9mIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudDIgPSAoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCkgc3RhdGVtZW50OwotCQlMaXN0IGZyYWdtZW50czIgPSB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50Mi5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIGZvciBmcmFnbWVudHMyIiwgMSwgZnJhZ21lbnRzMi5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQyID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgZnJhZ21lbnRzMi5nZXQoMCk7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbjIgPSB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQyLmdldEluaXRpYWxpemVyKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIG5hbWUiLCBleHByZXNzaW9uMiBpbnN0YW5jZW9mIE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCU5hbWUgbmFtZSA9IChOYW1lKSBleHByZXNzaW9uMjsKLQkJY2hlY2tTb3VyY2VSYW5nZShuYW1lLCAiaiIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJSUJpbmRpbmcgYmluZGluZyA9IG5hbWUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJQVNUTm9kZSBkZWNsYXJpbmdOb2RlID0gY29tcGlsYXRpb25Vbml0LmZpbmREZWNsYXJpbmdOb2RlKGJpbmRpbmcpOwotCQlhc3NlcnROdWxsKCJObyBkZWNsYXJpbmcgbm9kZSBpcyBhdmFpbGFibGUiLCBkZWNsYXJpbmdOb2RlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE2NTkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDMxMygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzEzIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCIsIG5vZGUgaW5zdGFuY2VvZiBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCkgbm9kZTsKLQkJTGlzdCBmcmFnbWVudHMgPSB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LmZyYWdtZW50cygpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAxLCBmcmFnbWVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgZnJhZ21lbnRzLmdldCgwKTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LmdldEluaXRpYWxpemVyKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhbiBJbmZpeEV4cHJlc3Npb24iLCBleHByZXNzaW9uIGluc3RhbmNlb2YgSW5maXhFeHByZXNzaW9uKTsgLy8kTk9OLU5MUy0xJAotCQlJbmZpeEV4cHJlc3Npb24gaW5maXhFeHByZXNzaW9uID0gKEluZml4RXhwcmVzc2lvbikgZXhwcmVzc2lvbjsKLQkJY2hlY2tTb3VyY2VSYW5nZShpbmZpeEV4cHJlc3Npb24sICJpK2oiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbjIgPSBpbmZpeEV4cHJlc3Npb24uZ2V0TGVmdE9wZXJhbmQoKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShleHByZXNzaW9uMiwgImkiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhIG5hbWUiLCBleHByZXNzaW9uMiBpbnN0YW5jZW9mIE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCU5hbWUgbmFtZSA9IChOYW1lKSBleHByZXNzaW9uMjsKLQkJSUJpbmRpbmcgYmluZGluZyA9IG5hbWUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZyIsIGJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgYXN0Tm9kZSA9IGNvbXBpbGF0aW9uVW5pdC5maW5kRGVjbGFyaW5nTm9kZShiaW5kaW5nKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gZGVjbGFyaW5nIG5vZGUiLCBhc3ROb2RlKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGFzdE5vZGUsICJpbnQgaSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMzI2Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzMTQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDMxNCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlhc3NlcnROb3ROdWxsKCJObyByZXN1bHQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbGluZSBudW1iZXIiLCAxLCBjb21waWxhdGlvblVuaXQubGluZU51bWJlcigwKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gZW5zdXJlIHRoYXQgbGFzdCBjaGFyYWN0ZXIgaXMgb24gdGhlIGxhc3QgbGluZQotCQlhc3NlcnRFcXVhbHMoIldyb25nIGxpbmUgbnVtYmVyIiwgMywgY29tcGlsYXRpb25Vbml0LmxpbmVOdW1iZXIoc291cmNlLmxlbmd0aCAtIDEpKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBzb3VyY2UubGVuZ3RoIGlzIGJleW9uZCB0aGUgc2l6ZSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCBzb3VyY2UKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBsaW5lIG51bWJlciIsIDEsIGNvbXBpbGF0aW9uVW5pdC5saW5lTnVtYmVyKHNvdXJjZS5sZW5ndGgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkJCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjMyNgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzE1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAzMTUiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDAsIDApOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBSZXR1cm4gc3RhdGVtZW50Iiwgbm9kZSBpbnN0YW5jZW9mIFJldHVyblN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJUmV0dXJuU3RhdGVtZW50IHJldHVyblN0YXRlbWVudCA9IChSZXR1cm5TdGF0ZW1lbnQpIG5vZGU7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHJldHVyblN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhbiBpbnN0YW5jZW9mIGV4cHJlc3Npb24iLCBleHByZXNzaW9uIGluc3RhbmNlb2YgSW5zdGFuY2VvZkV4cHJlc3Npb24pOyAvLyROT04tTkxTLTEkCi0JCUluc3RhbmNlb2ZFeHByZXNzaW9uIGluc3RhbmNlT2ZFeHByZXNzaW9uID0gKEluc3RhbmNlb2ZFeHByZXNzaW9uKSBleHByZXNzaW9uOwotCQlUeXBlIHJpZ2h0T3BlcmFuZCA9IGluc3RhbmNlT2ZFeHByZXNzaW9uLmdldFJpZ2h0T3BlcmFuZCgpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBzaW1wbGVUeXBlIiwgcmlnaHRPcGVyYW5kIGluc3RhbmNlb2YgU2ltcGxlVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJU2ltcGxlVHlwZSBzaW1wbGVUeXBlID0gKFNpbXBsZVR5cGUpIHJpZ2h0T3BlcmFuZDsKLQkJTmFtZSBuID0gc2ltcGxlVHlwZS5nZXROYW1lKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHF1YWxpZmllZCBuYW1lIiwgbiBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCVF1YWxpZmllZE5hbWUgbmFtZSA9IChRdWFsaWZpZWROYW1lKSBuOwotCQljaGVja1NvdXJjZVJhbmdlKG5hbWUsICJqYXZhLmlvLlNlcmlhbGl6YWJsZSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gbmFtZS5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJTZXJpYWxpemFibGUiLCB0eXBlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJTmFtZSBxdWFsaWZpZXIgPSBuYW1lLmdldFF1YWxpZmllcigpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBxdWFsaWZpZWQgbmFtZSIsIHF1YWxpZmllciBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZzIgPSBxdWFsaWZpZXIucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE51bGwoInR5cGViaW5kaW5nMiBpcyBub3QgbnVsbCIsIHR5cGVCaW5kaW5nMik7IC8vJE5PTi1OTFMtMSQKLQkJSUJpbmRpbmcgYmluZGluZyA9IHF1YWxpZmllci5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJubyBiaW5kaW5nIiwgYmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyB0eXBlIiwgSUJpbmRpbmcuUEFDS0FHRSwgYmluZGluZy5nZXRLaW5kKCkpOyAvLyROT04tTkxTLTEkCi0JCUlQYWNrYWdlQmluZGluZyBwQmluZGluZyA9IChJUGFja2FnZUJpbmRpbmcpIGJpbmRpbmc7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJqYXZhLmlvIiwgcEJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCQkKLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNDU0Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzMTYoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICIiLCAiSGVsbG8uamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gcmVzdWx0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHNpemUiLCAyLCBjb21waWxhdGlvblVuaXQuZ2V0TWVzc2FnZXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgc2l6ZSIsIDIsIGNvbXBpbGF0aW9uVW5pdC5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNzgxCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzMTcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDMxNyIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCwgMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHJldHVybiBzdGF0ZW1lbnQiLCBub2RlIGluc3RhbmNlb2YgUmV0dXJuU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlSZXR1cm5TdGF0ZW1lbnQgcmV0dXJuU3RhdGVtZW50ID0gKFJldHVyblN0YXRlbWVudCkgbm9kZTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcmV0dXJuU3RhdGVtZW50LmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGFuIGluc3RhbmNlb2YgZXhwcmVzc2lvbiIsIGV4cHJlc3Npb24gaW5zdGFuY2VvZiBJbnN0YW5jZW9mRXhwcmVzc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJSW5zdGFuY2VvZkV4cHJlc3Npb24gaW5zdGFuY2VPZkV4cHJlc3Npb24gPSAoSW5zdGFuY2VvZkV4cHJlc3Npb24pIGV4cHJlc3Npb247Ci0JCUV4cHJlc3Npb24gbGVmdCA9IGluc3RhbmNlT2ZFeHByZXNzaW9uLmdldExlZnRPcGVyYW5kKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIE5hbWUiLCBsZWZ0IGluc3RhbmNlb2YgTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJTmFtZSBuYW1lID0gKE5hbWUpIGxlZnQ7Ci0JCUlCaW5kaW5nIGJpbmRpbmcgPSBuYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCBiaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAieCIsIGJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IG5hbWUucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHR5cGViaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgdHlwZSIsICJPYmplY3QiLCB0eXBlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJVHlwZSByaWdodCA9IGluc3RhbmNlT2ZFeHByZXNzaW9uLmdldFJpZ2h0T3BlcmFuZCgpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBzaW1wbGVUeXBlIiwgcmlnaHQgaW5zdGFuY2VvZiBTaW1wbGVUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQlTaW1wbGVUeXBlIHNpbXBsZVR5cGUgPSAoU2ltcGxlVHlwZSkgcmlnaHQ7Ci0JCW5hbWUgPSBzaW1wbGVUeXBlLmdldE5hbWUoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgc2ltcGxlTmFtZSIsIG5hbWUgaW5zdGFuY2VvZiBTaW1wbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlTaW1wbGVOYW1lIHNpbXBsZU5hbWUgPSAoU2ltcGxlTmFtZSkgbmFtZTsKLQkJSUJpbmRpbmcgYmluZGluZzIgPSBzaW1wbGVOYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmcyIiwgYmluZGluZzIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJWZWN0b3IiLCBiaW5kaW5nMi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nMiA9IHNpbXBsZU5hbWUucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHR5cGVCaW5kaW5nMiIsIHR5cGVCaW5kaW5nMik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgIlZlY3RvciIsIHR5cGVCaW5kaW5nMi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JCQkJCQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMyMzMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDMxOCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzE4IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoIk5vIGVycm9yIiwgMSwgdW5pdC5nZXRNZXNzYWdlcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJObyBlcnJvciIsIDEsIHVuaXQuZ2V0UHJvYmxlbXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUodW5pdCwgMCwgMCwgMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCIsIG5vZGUgaW5zdGFuY2VvZiBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgbWFsZm9ybWVkIiwgaXNNYWxmb3JtZWQobm9kZSkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzgwNwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzE5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAzMTkiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDAsIDApOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50Iiwgbm9kZSBpbnN0YW5jZW9mIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KSBub2RlOwotCQlMaXN0IGZyYWdtZW50cyA9IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuZnJhZ21lbnRzKCk7Ci0JCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDEsIGZyYWdtZW50cy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcmFnbWVudHMuZ2V0KDApOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuZ2V0SW5pdGlhbGl6ZXIoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGFycmF5IGNyZWF0aW9uIiwgZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEFycmF5Q3JlYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCUFycmF5Q3JlYXRpb24gYXJyYXlDcmVhdGlvbiA9IChBcnJheUNyZWF0aW9uKSBleHByZXNzaW9uOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBhcnJheUNyZWF0aW9uLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJubyB0eXBlIGJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgIk9iamVjdFtdIiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUFycmF5VHlwZSBhcnJheVR5cGUgPSBhcnJheUNyZWF0aW9uLmdldFR5cGUoKTsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nMiA9IGFycmF5VHlwZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJubyB0eXBlIGJpbmRpbmcyIiwgdHlwZUJpbmRpbmcyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAiT2JqZWN0W10iLCB0eXBlQmluZGluZzIuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVR5cGUgdHlwZSA9IGFycmF5VHlwZS5nZXRFbGVtZW50VHlwZSgpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBzaW1wbGUgdHlwZSIsIHR5cGUgaW5zdGFuY2VvZiBTaW1wbGVUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQlTaW1wbGVUeXBlIHNpbXBsZVR5cGUgPSAoU2ltcGxlVHlwZSkgdHlwZTsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nMyA9IHNpbXBsZVR5cGUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgibm8gdHlwZSBiaW5kaW5nMyIsIHR5cGVCaW5kaW5nMyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgIk9iamVjdCIsIHR5cGVCaW5kaW5nMy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JCQkKLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzODA3Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzMjAoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDMyMCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCwgMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQiLCBub2RlIGluc3RhbmNlb2YgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIG5vZGU7Ci0JCVR5cGUgdHlwZSA9IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuZ2V0VHlwZSgpOwotCQljaGVja1NvdXJjZVJhbmdlKHR5cGUsICJpbnRbXSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGFycmF5IHR5cGUiLCB0eXBlLmlzQXJyYXlUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCUFycmF5VHlwZSBhcnJheVR5cGUgPSAoQXJyYXlUeXBlKSB0eXBlOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBhcnJheVR5cGUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCVR5cGUgZWxlbWVudFR5cGUgPSBhcnJheVR5cGUuZ2V0RWxlbWVudFR5cGUoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgc2ltcGxlIHR5cGUiLCBlbGVtZW50VHlwZS5pc1ByaW1pdGl2ZVR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nMiA9IGVsZW1lbnRUeXBlLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHR5cGUgYmluZGluZzIiLCB0eXBlQmluZGluZzIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzgwNwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzIxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAzMjEiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDAsIDApOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50Iiwgbm9kZSBpbnN0YW5jZW9mIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KSBub2RlOwotCQlUeXBlIHR5cGUgPSB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LmdldFR5cGUoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGFycmF5IHR5cGUiLCB0eXBlLmlzQXJyYXlUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCUFycmF5VHlwZSBhcnJheVR5cGUgPSAoQXJyYXlUeXBlKSB0eXBlOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBhcnJheVR5cGUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJY2hlY2tTb3VyY2VSYW5nZSh0eXBlLCAiamF2YS5sYW5nLk9iamVjdFtdW10iLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoIk5vIHR5cGUgYmluZGluZyIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlUeXBlIGVsZW1lbnRUeXBlID0gYXJyYXlUeXBlLmdldENvbXBvbmVudFR5cGUoKTsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nMiA9IGVsZW1lbnRUeXBlLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHR5cGUgYmluZGluZzIiLCB0eXBlQmluZGluZzIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgZGltZW5zaW9uIiwgMSwgdHlwZUJpbmRpbmcyLmdldERpbWVuc2lvbnMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgIk9iamVjdFtdIiwgdHlwZUJpbmRpbmcyLmdldE5hbWUoKSk7CQkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydFRydWUoIk5vdCBhbiBhcnJheSB0eXBlIiwgZWxlbWVudFR5cGUuaXNBcnJheVR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJVHlwZSBlbGVtZW50VHlwZTIgPSAoKEFycmF5VHlwZSkgZWxlbWVudFR5cGUpLmdldENvbXBvbmVudFR5cGUoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgc2ltcGxlIHR5cGUiLCBlbGVtZW50VHlwZTIuaXNTaW1wbGVUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZzMgPSBlbGVtZW50VHlwZTIucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZSBiaW5kaW5nMyIsIHR5cGVCaW5kaW5nMyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBkaW1lbnNpb24iLCAwLCB0eXBlQmluZGluZzMuZ2V0RGltZW5zaW9ucygpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAiT2JqZWN0IiwgdHlwZUJpbmRpbmczLmdldE5hbWUoKSk7CQkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzIzMQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzIyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAzMjIiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDApOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBGaWVsZERlY2xhcmF0aW9uIiwgbm9kZSBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IChGaWVsZERlY2xhcmF0aW9uKSBub2RlOwotCQlMaXN0IGZyYWdtZW50cyA9IGZpZWxkRGVjbGFyYXRpb24uZnJhZ21lbnRzKCk7Ci0JCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDEsIGZyYWdtZW50cy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcmFnbWVudHMuZ2V0KDApOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuZ2V0SW5pdGlhbGl6ZXIoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgbnVsbCBsaXRlcmFsIiwgZXhwcmVzc2lvbiBpbnN0YW5jZW9mIE51bGxMaXRlcmFsKTsgLy8kTk9OLU5MUy0xJAotCQlOdWxsTGl0ZXJhbCBudWxsTGl0ZXJhbCA9IChOdWxsTGl0ZXJhbCkgZXhwcmVzc2lvbjsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gbnVsbExpdGVyYWwucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIm5vIHR5cGUgYmluZGluZyIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgdGhlIG51bGwgdHlwZSIsIHR5cGVCaW5kaW5nLmlzTnVsbFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBxdWFsaWZpZWQgbmFtZSIsIHR5cGVCaW5kaW5nLmdldFF1YWxpZmllZE5hbWUoKSwgIm51bGwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDE5OAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzIzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAzMjMiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDAsIDEpOwotCQlhc3NlcnRUcnVlKCJOb3QgYW4gRXhwcmVzc2lvblN0YXRlbWVudCIsIG5vZGUgaW5zdGFuY2VvZiBFeHByZXNzaW9uU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlFeHByZXNzaW9uU3RhdGVtZW50IGV4cHJlc3Npb25TdGF0ZW1lbnQgPSAoRXhwcmVzc2lvblN0YXRlbWVudCkgbm9kZTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uMiA9IGV4cHJlc3Npb25TdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpOwotCQlhc3NlcnRUcnVlKCJOb3QgYW4gQXNzaWduZW1lbnQiLCBleHByZXNzaW9uMiBpbnN0YW5jZW9mIEFzc2lnbm1lbnQpOyAvLyROT04tTkxTLTEkCi0JCUFzc2lnbm1lbnQgYXNzaWdubWVudCA9IChBc3NpZ25tZW50KSBleHByZXNzaW9uMjsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gYXNzaWdubWVudC5nZXRSaWdodEhhbmRTaWRlKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIENhc3RFeHByZXNzaW9uIiwgZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENhc3RFeHByZXNzaW9uKTsgLy8kTk9OLU5MUy0xJAotCQlDYXN0RXhwcmVzc2lvbiBjYXN0RXhwcmVzc2lvbiA9IChDYXN0RXhwcmVzc2lvbikgZXhwcmVzc2lvbjsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gY2FzdEV4cHJlc3Npb24ucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgIk9iamVjdCIsIHR5cGVCaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlUeXBlIHR5cGUgPSBjYXN0RXhwcmVzc2lvbi5nZXRUeXBlKCk7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZzIgPSB0eXBlLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmcyIiwgdHlwZUJpbmRpbmcyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCAiT2JqZWN0IiwgdHlwZUJpbmRpbmcyLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0JCQkJCQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDE5OAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzI0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAzMjQiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDAsIDEpOwotCQlhc3NlcnRUcnVlKCJOb3QgYW4gRXhwcmVzc2lvblN0YXRlbWVudCIsIG5vZGUgaW5zdGFuY2VvZiBFeHByZXNzaW9uU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlFeHByZXNzaW9uU3RhdGVtZW50IGV4cHJlc3Npb25TdGF0ZW1lbnQgPSAoRXhwcmVzc2lvblN0YXRlbWVudCkgbm9kZTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uMiA9IGV4cHJlc3Npb25TdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpOwotCQlhc3NlcnRUcnVlKCJOb3QgYW4gQXNzaWduZW1lbnQiLCBleHByZXNzaW9uMiBpbnN0YW5jZW9mIEFzc2lnbm1lbnQpOyAvLyROT04tTkxTLTEkCi0JCUFzc2lnbm1lbnQgYXNzaWdubWVudCA9IChBc3NpZ25tZW50KSBleHByZXNzaW9uMjsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gYXNzaWdubWVudC5nZXRSaWdodEhhbmRTaWRlKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIENhc3RFeHByZXNzaW9uIiwgZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENhc3RFeHByZXNzaW9uKTsgLy8kTk9OLU5MUy0xJAotCQlDYXN0RXhwcmVzc2lvbiBjYXN0RXhwcmVzc2lvbiA9IChDYXN0RXhwcmVzc2lvbikgZXhwcmVzc2lvbjsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gY2FzdEV4cHJlc3Npb24ucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgIk9iamVjdFtdIiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVR5cGUgdHlwZSA9IGNhc3RFeHByZXNzaW9uLmdldFR5cGUoKTsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nMiA9IHR5cGUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZzIiLCB0eXBlQmluZGluZzIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJPYmplY3RbXSIsIHR5cGVCaW5kaW5nMi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9CQkJCQkKLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxOTgKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDMyNSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzI1IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwLCAxKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIEV4cHJlc3Npb25TdGF0ZW1lbnQiLCBub2RlIGluc3RhbmNlb2YgRXhwcmVzc2lvblN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJRXhwcmVzc2lvblN0YXRlbWVudCBleHByZXNzaW9uU3RhdGVtZW50ID0gKEV4cHJlc3Npb25TdGF0ZW1lbnQpIG5vZGU7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbjIgPSBleHByZXNzaW9uU3RhdGVtZW50LmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIEFzc2lnbmVtZW50IiwgZXhwcmVzc2lvbjIgaW5zdGFuY2VvZiBBc3NpZ25tZW50KTsgLy8kTk9OLU5MUy0xJAotCQlBc3NpZ25tZW50IGFzc2lnbm1lbnQgPSAoQXNzaWdubWVudCkgZXhwcmVzc2lvbjI7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGFzc2lnbm1lbnQuZ2V0UmlnaHRIYW5kU2lkZSgpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBDYXN0RXhwcmVzc2lvbiIsIGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDYXN0RXhwcmVzc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJQ2FzdEV4cHJlc3Npb24gY2FzdEV4cHJlc3Npb24gPSAoQ2FzdEV4cHJlc3Npb24pIGV4cHJlc3Npb247Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IGNhc3RFeHByZXNzaW9uLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJpbnRbXSIsIHR5cGVCaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlUeXBlIHR5cGUgPSBjYXN0RXhwcmVzc2lvbi5nZXRUeXBlKCk7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZzIgPSB0eXBlLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmcyIiwgdHlwZUJpbmRpbmcyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCAiaW50W10iLCB0eXBlQmluZGluZzIuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQkJCQkJCi0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MjE3Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzMjYoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDMyNiIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMSwgMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhbiBFeHByZXNzaW9uU3RhdGVtZW50Iiwgbm9kZSBpbnN0YW5jZW9mIEV4cHJlc3Npb25TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCUV4cHJlc3Npb25TdGF0ZW1lbnQgZXhwcmVzc2lvblN0YXRlbWVudCA9IChFeHByZXNzaW9uU3RhdGVtZW50KSBub2RlOwotCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb25TdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpLCAiYSgpLmY9IGEoKSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShleHByZXNzaW9uU3RhdGVtZW50LCAiYSgpLmY9IGEoKTsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQkJCQkJCi0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTk4Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzMjcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDMyNyIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBlcnJvcnMiLCAyLCBjb21waWxhdGlvblVuaXQuZ2V0UHJvYmxlbXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkPAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCwgMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhbiBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50Iiwgbm9kZSBpbnN0YW5jZW9mIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KSBub2RlOwotCQlMaXN0IGZyYWdtZW50cyA9IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuZnJhZ21lbnRzKCk7Ci0JCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDEsIGZyYWdtZW50cy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcmFnbWVudHMuZ2V0KDApOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuZ2V0SW5pdGlhbGl6ZXIoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgQ2FzdEV4cHJlc3Npb24iLCBleHByZXNzaW9uIGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24pOyAvLyROT04tTkxTLTEkCi0JCUNhc3RFeHByZXNzaW9uIGNhc3RFeHByZXNzaW9uID0gKENhc3RFeHByZXNzaW9uKSBleHByZXNzaW9uOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBjYXN0RXhwcmVzc2lvbi5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZWJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgIlN0cmluZyIsIHR5cGVCaW5kaW5nLmdldE5hbWUoKSk7Ci0JCVR5cGUgdHlwZSA9IGNhc3RFeHByZXNzaW9uLmdldFR5cGUoKTsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nMiA9IHR5cGUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZzIiLCB0eXBlQmluZGluZzIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJTdHJpbmciLCB0eXBlQmluZGluZzIuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQkJCQkJCi0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzODA3Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzMjgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDMyOCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCwgMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQiLCBub2RlIGluc3RhbmNlb2YgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIG5vZGU7Ci0JCVR5cGUgdHlwZSA9IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuZ2V0VHlwZSgpOwotCQljaGVja1NvdXJjZVJhbmdlKHR5cGUsICJqYXZhLmxhbmcuT2JqZWN0W10iLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhbiBhcnJheSB0eXBlIiwgdHlwZS5pc0FycmF5VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlBcnJheVR5cGUgYXJyYXlUeXBlID0gKEFycmF5VHlwZSkgdHlwZTsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gYXJyYXlUeXBlLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHR5cGUgYmluZGluZyIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAiT2JqZWN0W10iLCB0eXBlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJVHlwZSBlbGVtZW50VHlwZSA9IGFycmF5VHlwZS5nZXRFbGVtZW50VHlwZSgpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBzaW1wbGUgdHlwZSIsIGVsZW1lbnRUeXBlLmlzU2ltcGxlVHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcyID0gZWxlbWVudFR5cGUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZSBiaW5kaW5nMiIsIHR5cGVCaW5kaW5nMik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgIk9iamVjdCIsIHR5cGVCaW5kaW5nMi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJTGlzdCBmcmFnbWVudHMgPSB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LmZyYWdtZW50cygpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAxLCBmcmFnbWVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgZnJhZ21lbnRzLmdldCgwKTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LmdldEluaXRpYWxpemVyKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIGFycmF5IGNyZWF0aW9uIiwgZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEFycmF5Q3JlYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZzMgPSBleHByZXNzaW9uLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyB0eXBlQmluZGluZzMiLCB0eXBlQmluZGluZzMpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJPYmplY3RbXSIsIHR5cGVCaW5kaW5nMy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJQXJyYXlDcmVhdGlvbiBhcnJheUNyZWF0aW9uID0gKEFycmF5Q3JlYXRpb24pIGV4cHJlc3Npb247Ci0JCUFycmF5SW5pdGlhbGl6ZXIgYXJyYXlJbml0aWFsaXplciA9IGFycmF5Q3JlYXRpb24uZ2V0SW5pdGlhbGl6ZXIoKTsKLQkJYXNzZXJ0Tm90TnVsbCgibm90IGFycmF5IGluaXRpYWxpemVyIiwgYXJyYXlJbml0aWFsaXplcik7IC8vJE5PTi1OTFMtMSQKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nNCA9IGFycmF5SW5pdGlhbGl6ZXIucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHR5cGVCaW5kaW5nNCIsIHR5cGVCaW5kaW5nMyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgIk9iamVjdFtdIiwgdHlwZUJpbmRpbmc0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM4MDcKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDMyOSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzI5IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCIsIG5vZGUgaW5zdGFuY2VvZiBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCkgbm9kZTsKLQkJVHlwZSB0eXBlID0gdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5nZXRUeXBlKCk7Ci0JCWNoZWNrU291cmNlUmFuZ2UodHlwZSwgImphdmEubGFuZy5PYmplY3RbXSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGFycmF5IHR5cGUiLCB0eXBlLmlzQXJyYXlUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCUFycmF5VHlwZSBhcnJheVR5cGUgPSAoQXJyYXlUeXBlKSB0eXBlOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBhcnJheVR5cGUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJPYmplY3RbXSIsIHR5cGVCaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlUeXBlIGVsZW1lbnRUeXBlID0gYXJyYXlUeXBlLmdldEVsZW1lbnRUeXBlKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHNpbXBsZSB0eXBlIiwgZWxlbWVudFR5cGUuaXNTaW1wbGVUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZzIgPSBlbGVtZW50VHlwZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyB0eXBlIGJpbmRpbmcyIiwgdHlwZUJpbmRpbmcyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAiT2JqZWN0IiwgdHlwZUJpbmRpbmcyLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlMaXN0IGZyYWdtZW50cyA9IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuZnJhZ21lbnRzKCk7Ci0JCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDEsIGZyYWdtZW50cy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcmFnbWVudHMuZ2V0KDApOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuZ2V0SW5pdGlhbGl6ZXIoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgYXJyYXkgY3JlYXRpb24iLCBleHByZXNzaW9uIGluc3RhbmNlb2YgQXJyYXlDcmVhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nMyA9IGV4cHJlc3Npb24ucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHR5cGVCaW5kaW5nMyIsIHR5cGVCaW5kaW5nMyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgIk9iamVjdFtdIiwgdHlwZUJpbmRpbmczLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlBcnJheUNyZWF0aW9uIGFycmF5Q3JlYXRpb24gPSAoQXJyYXlDcmVhdGlvbikgZXhwcmVzc2lvbjsKLQkJQXJyYXlJbml0aWFsaXplciBhcnJheUluaXRpYWxpemVyID0gYXJyYXlDcmVhdGlvbi5nZXRJbml0aWFsaXplcigpOwotCQlhc3NlcnROb3ROdWxsKCJub3QgYXJyYXkgaW5pdGlhbGl6ZXIiLCBhcnJheUluaXRpYWxpemVyKTsgLy8kTk9OLU5MUy0xJAotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmc0ID0gYXJyYXlJbml0aWFsaXplci5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZUJpbmRpbmc0IiwgdHlwZUJpbmRpbmczKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAiT2JqZWN0W10iLCB0eXBlQmluZGluZzQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDMxMwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzMwKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAzMzAiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMiwgY29tcGlsYXRpb25Vbml0LmdldE1lc3NhZ2VzKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAyLCBjb21waWxhdGlvblVuaXQuZ2V0UHJvYmxlbXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgdHlwZSBkZWNsYXJhdGlvbiIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlRZUEVfREVDTEFSQVRJT04pOyAvLyROT04tTkxTLTEkCi0JCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKSBub2RlOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0eXBlRGVjbGFyYXRpb24ucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgibm8gdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCUlNZXRob2RCaW5kaW5nW10gbWV0aG9kcyA9IHR5cGVCaW5kaW5nLmdldERlY2xhcmVkTWV0aG9kcygpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAxLCBtZXRob2RzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgY29uc3RydWN0b3IiLCBtZXRob2RzWzBdLmlzQ29uc3RydWN0b3IoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgid3JvbmcgbmFtZSIsICFtZXRob2RzWzBdLmdldE5hbWUoKS5lcXVhbHMoImZvbyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCW5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIG1ldGhvZERlY2xhcmF0aW9uIiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuTUVUSE9EX0RFQ0xBUkFUSU9OKTsgLy8kTk9OLU5MUy0xJAotCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbikgbm9kZTsKLQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IG1ldGhvZERlY2xhcmF0aW9uLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE51bGwoIm1ldGhvZCBiaW5kaW5nIG5vdCBudWxsIiwgbWV0aG9kQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgcmV0dXJuIHN0YXRlbWVudCIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlJFVFVSTl9TVEFURU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCVJldHVyblN0YXRlbWVudCByZXR1cm5TdGF0ZW1lbnQgPSAoUmV0dXJuU3RhdGVtZW50KSBub2RlOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSByZXR1cm5TdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcyID0gZXhwcmVzc2lvbi5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgibm8gdHlwZSBiaW5kaW5nMiIsIHR5cGVCaW5kaW5nMik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MzIyCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzMzEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDMzMSIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCwgMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhbiBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50Iiwgbm9kZSBpbnN0YW5jZW9mIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KSBub2RlOwotCQlMaXN0IGZyYWdtZW50cyA9IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuZnJhZ21lbnRzKCk7Ci0JCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDEsIGZyYWdtZW50cy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcmFnbWVudHMuZ2V0KDApOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuZ2V0SW5pdGlhbGl6ZXIoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgUXVhbGlmaWVkTmFtZSIsIGV4cHJlc3Npb24gaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlRdWFsaWZpZWROYW1lIHF1YWxpZmllZE5hbWUgPSAoUXVhbGlmaWVkTmFtZSkgZXhwcmVzc2lvbjsKLQkJSUJpbmRpbmcgYmluZGluZyA9IHF1YWxpZmllZE5hbWUuZ2V0TmFtZSgpLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIm5vIGJpbmRpbmciLCBiaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIHR5cGUiLCBJQmluZGluZy5WQVJJQUJMRSwgYmluZGluZy5nZXRLaW5kKCkpOyAvLyROT04tTkxTLTEkCi0JCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gKElWYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmc7Ci0JCWFzc2VydFRydWUoIk5vdCBhIGZpZWxkIiwgdmFyaWFibGVCaW5kaW5nLmlzRmllbGQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0TnVsbCgiR290IGEgZGVjbGFyaW5nIGNsYXNzIiwgdmFyaWFibGVCaW5kaW5nLmdldERlY2xhcmluZ0NsYXNzKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJsZW5ndGgiLCB2YXJpYWJsZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQkJCQkJCi0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NDAzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzMzIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDMzMiIsICJMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM4MDcKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDMzMygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzMzIiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCIsIG5vZGUgaW5zdGFuY2VvZiBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCkgbm9kZTsKLQkJTGlzdCBmcmFnbWVudHMgPSB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LmZyYWdtZW50cygpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAxLCBmcmFnbWVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgZnJhZ21lbnRzLmdldCgwKTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LmdldEluaXRpYWxpemVyKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhbiBhcnJheSBjcmVhdGlvbiIsIGV4cHJlc3Npb24gaW5zdGFuY2VvZiBBcnJheUNyZWF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlBcnJheUNyZWF0aW9uIGFycmF5Q3JlYXRpb24gPSAoQXJyYXlDcmVhdGlvbikgZXhwcmVzc2lvbjsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gYXJyYXlDcmVhdGlvbi5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgibm8gdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJPYmplY3RbXVtdIiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUFycmF5VHlwZSBhcnJheVR5cGUgPSBhcnJheUNyZWF0aW9uLmdldFR5cGUoKTsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nMiA9IGFycmF5VHlwZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJubyB0eXBlIGJpbmRpbmcyIiwgdHlwZUJpbmRpbmcyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAiT2JqZWN0W11bXSIsIHR5cGVCaW5kaW5nMi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJVHlwZSB0eXBlID0gYXJyYXlUeXBlLmdldEVsZW1lbnRUeXBlKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHNpbXBsZSB0eXBlIiwgdHlwZSBpbnN0YW5jZW9mIFNpbXBsZVR5cGUpOyAvLyROT04tTkxTLTEkCi0JCVNpbXBsZVR5cGUgc2ltcGxlVHlwZSA9IChTaW1wbGVUeXBlKSB0eXBlOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmczID0gc2ltcGxlVHlwZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJubyB0eXBlIGJpbmRpbmczIiwgdHlwZUJpbmRpbmczKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAiT2JqZWN0IiwgdHlwZUJpbmRpbmczLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0eXBlID0gYXJyYXlUeXBlLmdldENvbXBvbmVudFR5cGUoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGFycmF5IHR5cGUiLCB0eXBlIGluc3RhbmNlb2YgQXJyYXlUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQlBcnJheVR5cGUgYXJyYXlUeXBlMiA9IChBcnJheVR5cGUpIHR5cGU7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZzQgPSBhcnJheVR5cGUyLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIm5vIHR5cGUgYmluZGluZzQiLCB0eXBlQmluZGluZzQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJPYmplY3RbXSIsIHR5cGVCaW5kaW5nNC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzODA3Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzMzQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDMzNCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCwgMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQiLCBub2RlIGluc3RhbmNlb2YgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIG5vZGU7Ci0JCUxpc3QgZnJhZ21lbnRzID0gdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMSwgZnJhZ21lbnRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5nZXRJbml0aWFsaXplcigpOwotCQlhc3NlcnRUcnVlKCJOb3QgYW4gYXJyYXkgY3JlYXRpb24iLCBleHByZXNzaW9uIGluc3RhbmNlb2YgQXJyYXlDcmVhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJQXJyYXlDcmVhdGlvbiBhcnJheUNyZWF0aW9uID0gKEFycmF5Q3JlYXRpb24pIGV4cHJlc3Npb247Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IGFycmF5Q3JlYXRpb24ucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIm5vIHR5cGUgYmluZGluZyIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAiT2JqZWN0W11bXVtdIiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUFycmF5VHlwZSBhcnJheVR5cGUgPSBhcnJheUNyZWF0aW9uLmdldFR5cGUoKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShhcnJheVR5cGUsICJPYmplY3RbMTBdW11bXSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nMiA9IGFycmF5VHlwZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJubyB0eXBlIGJpbmRpbmcyIiwgdHlwZUJpbmRpbmcyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAiT2JqZWN0W11bXVtdIiwgdHlwZUJpbmRpbmcyLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlUeXBlIHR5cGUgPSBhcnJheVR5cGUuZ2V0RWxlbWVudFR5cGUoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgc2ltcGxlIHR5cGUiLCB0eXBlIGluc3RhbmNlb2YgU2ltcGxlVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJU2ltcGxlVHlwZSBzaW1wbGVUeXBlID0gKFNpbXBsZVR5cGUpIHR5cGU7Ci0JCWNoZWNrU291cmNlUmFuZ2Uoc2ltcGxlVHlwZSwgIk9iamVjdCIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nMyA9IHNpbXBsZVR5cGUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgibm8gdHlwZSBiaW5kaW5nMyIsIHR5cGVCaW5kaW5nMyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgIk9iamVjdCIsIHR5cGVCaW5kaW5nMy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdHlwZSA9IGFycmF5VHlwZS5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhbiBhcnJheSB0eXBlIiwgdHlwZSBpbnN0YW5jZW9mIEFycmF5VHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJQXJyYXlUeXBlIGFycmF5VHlwZTIgPSAoQXJyYXlUeXBlKSB0eXBlOwotCQljaGVja1NvdXJjZVJhbmdlKGFycmF5VHlwZTIsICJPYmplY3RbMTBdW10iLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZzQgPSBhcnJheVR5cGUyLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIm5vIHR5cGUgYmluZGluZzQiLCB0eXBlQmluZGluZzQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJPYmplY3RbXVtdIiwgdHlwZUJpbmRpbmc0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0eXBlID0gYXJyYXlUeXBlMi5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhbiBhcnJheSB0eXBlIiwgdHlwZSBpbnN0YW5jZW9mIEFycmF5VHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJQXJyYXlUeXBlIGFycmF5VHlwZTMgPSAoQXJyYXlUeXBlKSB0eXBlOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmc1ID0gYXJyYXlUeXBlMy5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJubyB0eXBlIGJpbmRpbmc1IiwgdHlwZUJpbmRpbmc1KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAiT2JqZWN0W10iLCB0eXBlQmluZGluZzUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWNoZWNrU291cmNlUmFuZ2UoYXJyYXlUeXBlMywgIk9iamVjdFsxMF0iLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDUyNgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzM1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAzMzUiLCAiRXhjZXB0aW9uVGVzdENhc2VUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCk7Ci0JCWFzc2VydEVxdWFscygiZXJyb3JzIGZvdW5kIiwgMCwgY29tcGlsYXRpb25Vbml0LmdldE1lc3NhZ2VzKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImVycm9ycyBmb3VuZCIsIDAsIGNvbXBpbGF0aW9uVW5pdC5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgibm90IG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJub3QgYSB0eXBlIGRlY2xhcmF0aW9uIiwgbm9kZSBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pIG5vZGU7Ci0JCU5hbWUgbmFtZSA9IHR5cGVEZWNsYXJhdGlvbi5nZXRTdXBlcmNsYXNzKCk7Ci0JCWFzc2VydE5vdE51bGwoIm5vIHN1cGVyIGNsYXNzIiwgbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgcXVhbGlmaWVkIG5hbWUiLCBuYW1lLmlzUXVhbGlmaWVkTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlRdWFsaWZpZWROYW1lIHF1YWxpZmllZE5hbWUgPSAoUXVhbGlmaWVkTmFtZSkgbmFtZTsKLQkJbmFtZSA9IHF1YWxpZmllZE5hbWUuZ2V0UXVhbGlmaWVyKCk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIHF1YWxpZmllZCBuYW1lIiwgbmFtZS5pc1F1YWxpZmllZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJcXVhbGlmaWVkTmFtZSA9IChRdWFsaWZpZWROYW1lKSBuYW1lOwotCQluYW1lID0gcXVhbGlmaWVkTmFtZS5nZXRRdWFsaWZpZXIoKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgc2ltcGxlIG5hbWUiLCBuYW1lLmlzU2ltcGxlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlTaW1wbGVOYW1lIHNpbXBsZU5hbWUgPSAoU2ltcGxlTmFtZSkgbmFtZTsKLQkJSUJpbmRpbmcgYmluZGluZyA9IHNpbXBsZU5hbWUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgibm8gYmluZGluZyIsIGJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgdHlwZSIsIElCaW5kaW5nLlBBQ0tBR0UsIGJpbmRpbmcuZ2V0S2luZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAianVuaXQiLCBiaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0JCi0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NTI2Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzMzYoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDMzNiIsICJTb3J0ZXJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCk7Ci0JCWFzc2VydEVxdWFscygiZXJyb3JzIGZvdW5kIiwgMCwgY29tcGlsYXRpb25Vbml0LmdldE1lc3NhZ2VzKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoImVycm9ycyBmb3VuZCIsIDAsIGNvbXBpbGF0aW9uVW5pdC5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgibm90IG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJub3QgYSB0eXBlIGRlY2xhcmF0aW9uIiwgbm9kZSBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pIG5vZGU7Ci0JCUxpc3Qgc3VwZXJJbnRlcmZhY2VzID0gdHlwZURlY2xhcmF0aW9uLnN1cGVySW50ZXJmYWNlcygpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAxLCBzdXBlckludGVyZmFjZXMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlOYW1lIG5hbWUgPSAoTmFtZSkgc3VwZXJJbnRlcmZhY2VzLmdldCgwKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgcXVhbGlmaWVkIG5hbWUiLCBuYW1lLmlzUXVhbGlmaWVkTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlRdWFsaWZpZWROYW1lIHF1YWxpZmllZE5hbWUgPSAoUXVhbGlmaWVkTmFtZSkgbmFtZTsKLQkJbmFtZSA9IHF1YWxpZmllZE5hbWUuZ2V0UXVhbGlmaWVyKCk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIHNpbXBsZSBuYW1lIiwgbmFtZS5pc1NpbXBsZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJU2ltcGxlTmFtZSBzaW1wbGVOYW1lID0gKFNpbXBsZU5hbWUpIG5hbWU7Ci0JCUlCaW5kaW5nIGJpbmRpbmcgPSBzaW1wbGVOYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIm5vIGJpbmRpbmciLCBiaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIHR5cGUiLCBJQmluZGluZy5UWVBFLCBiaW5kaW5nLmdldEtpbmQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgIlNvcnRlciIsIGJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQkKLQkKLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NjAyCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzMzcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDMzNyIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCk7Ci0JCWFzc2VydEVxdWFscygiZXJyb3JzIGZvdW5kIiwgMCwgY29tcGlsYXRpb25Vbml0LmdldE1lc3NhZ2VzKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJub3QgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIm5vdCBhIGZpZWxkIGRlY2xhcmF0aW9uIiwgbm9kZSBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IChGaWVsZERlY2xhcmF0aW9uKSBub2RlOwotCQlMaXN0IGZyYWdtZW50cyA9IGZpZWxkRGVjbGFyYXRpb24uZnJhZ21lbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc2l6ZSIsIDEsIGZyYWdtZW50cy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcmFnbWVudHMuZ2V0KDApOwotCQljaGVja1NvdXJjZVJhbmdlKHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCwgIm1lc3NhZ2U9IFRlc3QubShcInNcIiwgbmV3IFN0cmluZ1tde1wiZ1wifSkiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UoZmllbGREZWNsYXJhdGlvbiwgIlN0cmluZyBtZXNzYWdlPSBUZXN0Lm0oXCJzXCIsIG5ldyBTdHJpbmdbXXtcImdcIn0pOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9CQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDg1MgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzM4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAzMzgiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDApOwotCQlhc3NlcnRFcXVhbHMoImVycm9ycyBmb3VuZCIsIDAsIGNvbXBpbGF0aW9uVW5pdC5nZXRNZXNzYWdlcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgibm90IG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJub3QgYSBNZXRob2REZWNsYXJhdGlvbiIsIG5vZGUgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIG5vZGU7Ci0JCUxpc3QgdGhyb3duRXhjZXB0aW9ucyA9IG1ldGhvZERlY2xhcmF0aW9uLnRocm93bkV4Y2VwdGlvbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzaXplIiwgMSwgdGhyb3duRXhjZXB0aW9ucy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCU5hbWUgbmFtZSA9IChOYW1lKSB0aHJvd25FeGNlcHRpb25zLmdldCgwKTsKLQkJSUJpbmRpbmcgYmluZGluZyA9IG5hbWUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyB0eXBlIiwgSUJpbmRpbmcuVFlQRSwgYmluZGluZy5nZXRLaW5kKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJJT0V4Y2VwdGlvbiIsIGJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQkKLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUwNjEKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDMzOSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzM5IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiTm8gZXJyb3JzIGZvdW5kIiwgMiwgY29tcGlsYXRpb25Vbml0LmdldE1lc3NhZ2VzKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIm5vdCBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgVHlwZSBkZWNsYXJhdGlvbiIsIG5vZGUgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKSBub2RlOwotCQlMaXN0IGJvZHlEZWNsYXJhdGlvbnMgPSB0eXBlRGVjbGFyYXRpb24uYm9keURlY2xhcmF0aW9ucygpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAxLCBib2R5RGVjbGFyYXRpb25zLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIGJvZHlEZWNsYXJhdGlvbnMuZ2V0KDApOwotCQljaGVja1NvdXJjZVJhbmdlKG1ldGhvZERlY2xhcmF0aW9uLCAiaW50IGRvUXVlcnkoYm9vbGVhbiB4KTsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCW5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMSk7Ci0JCWFzc2VydE5vdE51bGwoIm5vdCBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgTWV0aG9kRGVjbGFyYXRpb24iLCBub2RlIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBleHBlY3RlZFNvdXJjZSA9IAotCQkJInB1YmxpYyB2b2lkIHNldFgoYm9vbGVhbiB4KSB7XG4iICsgIC8vJE5PTi1OTFMtMSQKLQkJCSIgCQl7XG4iICsgIC8vJE5PTi1OTFMtMSQKLQkJCSIJCXpcbiIgKyAgLy8kTk9OLU5MUy0xJAotCQkJIgl9XG4iICsgIC8vJE5PTi1OTFMtMSQKLQkJCSJ9IjsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsIGV4cGVjdGVkU291cmNlLCBzb3VyY2UpOwotCQlpbnQgbWV0aG9kRW5kUG9zaXRpb24gPSBub2RlLmdldFN0YXJ0UG9zaXRpb24oKSArIG5vZGUuZ2V0TGVuZ3RoKCk7Ci0JCW5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIm5vdCBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgVHlwZURlY2xhcmF0aW9uIiwgbm9kZSBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IHR5cGVFbmRQb3NpdGlvbiA9IG5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpICsgbm9kZS5nZXRMZW5ndGgoKTsKLQkJYXNzZXJ0RXF1YWxzKCJkaWZmZXJlbnQgcG9zaXRpb25zIiwgbWV0aG9kRW5kUG9zaXRpb24sIHR5cGVFbmRQb3NpdGlvbik7IC8vJE5PTi1OTFMtMSQKLQl9CQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDg1MgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzQwKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAicDMiLCAiQi5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0RXF1YWxzKCJlcnJvcnMgZm91bmQiLCAwLCBjb21waWxhdGlvblVuaXQuZ2V0TWVzc2FnZXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgibm90IG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgYW4gZXhwcmVzc2lvbiBzdGF0ZW1lbnQiLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5FWFBSRVNTSU9OX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJRXhwcmVzc2lvblN0YXRlbWVudCBleHByZXNzaW9uU3RhdGVtZW50ID0gKEV4cHJlc3Npb25TdGF0ZW1lbnQpIG5vZGU7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGV4cHJlc3Npb25TdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpOwotCQlhc3NlcnRUcnVlKCJOb3QgYW4gbWV0aG9kIGludm9jYXRpb24iLCBleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5NRVRIT0RfSU5WT0NBVElPTik7IC8vJE5PTi1OTFMtMSQKLQkJTWV0aG9kSW52b2NhdGlvbiBtZXRob2RJbnZvY2F0aW9uID0gKE1ldGhvZEludm9jYXRpb24pIGV4cHJlc3Npb247Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbjIgPSBtZXRob2RJbnZvY2F0aW9uLmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gcmVjZWl2ZXIiLCBleHByZXNzaW9uMik7IC8vJE5PTi1OTFMtMSQKLQkJSVR5cGVCaW5kaW5nIGJpbmRpbmcgPSBleHByZXNzaW9uMi5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZSBiaW5kaW5nIiwgYmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgIkEiLCBiaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAicDIiLCBiaW5kaW5nLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgcXVhbGlmaWVkIG5hbWUiLCBleHByZXNzaW9uMi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuUVVBTElGSUVEX05BTUUpOyAvLyROT04tTkxTLTEkCi0JCVF1YWxpZmllZE5hbWUgcXVhbGlmaWVkTmFtZSA9IChRdWFsaWZpZWROYW1lKSBleHByZXNzaW9uMjsKLQkJU2ltcGxlTmFtZSBzaW1wbGVOYW1lID0gcXVhbGlmaWVkTmFtZS5nZXROYW1lKCk7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJBIiwgc2ltcGxlTmFtZS5nZXRJZGVudGlmaWVyKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gc2ltcGxlTmFtZS5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJBIiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJwMiIsIHR5cGVCaW5kaW5nLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJTmFtZSBuYW1lID0gcXVhbGlmaWVkTmFtZS5nZXRRdWFsaWZpZXIoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgc2ltcGxlIG5hbWUiLCBuYW1lLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5TSU1QTEVfTkFNRSk7IC8vJE5PTi1OTFMtMSQKLQkJU2ltcGxlTmFtZSBzaW1wbGVOYW1lMiA9IChTaW1wbGVOYW1lKSBuYW1lOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAicDIiLCBzaW1wbGVOYW1lMi5nZXRJZGVudGlmaWVyKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJSUJpbmRpbmcgYmluZGluZzIgPSBzaW1wbGVOYW1lMi5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgYmluZGluZzIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgdHlwZSIsIElCaW5kaW5nLlBBQ0tBR0UsIGJpbmRpbmcyLmdldEtpbmQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgInAyIiwgYmluZGluZzIuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCW5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMSwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIm5vdCBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGV4cHJlc3Npb24gc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuRVhQUkVTU0lPTl9TVEFURU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCUV4cHJlc3Npb25TdGF0ZW1lbnQgZXhwcmVzc2lvblN0YXRlbWVudDIgPSAoRXhwcmVzc2lvblN0YXRlbWVudCkgbm9kZTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uMyA9IGV4cHJlc3Npb25TdGF0ZW1lbnQyLmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIG1ldGhvZCBpbnZvY2F0aW9uIiwgZXhwcmVzc2lvbjMuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLk1FVEhPRF9JTlZPQ0FUSU9OKTsgLy8kTk9OLU5MUy0xJAotCQlNZXRob2RJbnZvY2F0aW9uIG1ldGhvZEludm9jYXRpb24yID0gKE1ldGhvZEludm9jYXRpb24pIGV4cHJlc3Npb24zOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb240ID0gbWV0aG9kSW52b2NhdGlvbjIuZ2V0RXhwcmVzc2lvbigpOwotCQlhc3NlcnROb3ROdWxsKCJObyByZWNlaXZlciIsIGV4cHJlc3Npb240KTsgLy8kTk9OLU5MUy0xJAotCQlJVHlwZUJpbmRpbmcgYmluZGluZzMgPSBleHByZXNzaW9uNC5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZSBiaW5kaW5nIiwgYmluZGluZzMpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJBIiwgYmluZGluZzMuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJwMSIsIGJpbmRpbmczLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9CQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTgwNAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzQxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAzNDEiLCAiQS5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0RXF1YWxzKCJlcnJvcnMgZm91bmQiLCAwLCBjb21waWxhdGlvblVuaXQuZ2V0TWVzc2FnZXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAxLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgibm90IG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgYW4gaWYgc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuSUZfU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZXhwZWN0ZWRTb3VyY2UgPSAKLQkJCQkiaWYgKGZpZWxkICE9IG51bGwpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkJIgkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigpO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkiCQl9IGVsc2UgaWYgKGZpZWxkID09IG51bGwpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkJIgkJCXRocm93IG5ldyBNYWxmb3JtZWRVUkxFeGNlcHRpb24oKTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkJIgkJfSBlbHNlIGlmIChmaWVsZCA9PSBudWxsKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJCSIJCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbigpO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkiCQl9IGVsc2Uge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkiCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24oKTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkJIgkJfSI7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCBleHBlY3RlZFNvdXJjZSwgc291cmNlKTsKLQkJSWZTdGF0ZW1lbnQgaWZTdGF0ZW1lbnQgPSAoSWZTdGF0ZW1lbnQpIG5vZGU7Ci0JCVN0YXRlbWVudCB0aGVuU3RhdGVtZW50ID0gaWZTdGF0ZW1lbnQuZ2V0VGhlblN0YXRlbWVudCgpOwotCQlleHBlY3RlZFNvdXJjZSA9IAotCQkJCSJ7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJCSIJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkJIgkJfSI7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZSh0aGVuU3RhdGVtZW50LCBleHBlY3RlZFNvdXJjZSwgc291cmNlKTsKLQkJU3RhdGVtZW50IGVsc2VTdGF0ZW1lbnQgPSBpZlN0YXRlbWVudC5nZXRFbHNlU3RhdGVtZW50KCk7Ci0JCWV4cGVjdGVkU291cmNlID0gCi0JCQkJImlmIChmaWVsZCA9PSBudWxsKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJCSIJCQl0aHJvdyBuZXcgTWFsZm9ybWVkVVJMRXhjZXB0aW9uKCk7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJCSIJCX0gZWxzZSBpZiAoZmllbGQgPT0gbnVsbCkge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkiCQkJdGhyb3cgbmV3IEludGVycnVwdGVkSU9FeGNlcHRpb24oKTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkJIgkJfSBlbHNlIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkJIgkJCXRocm93IG5ldyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uKCk7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJCSIJCX0iOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UoZWxzZVN0YXRlbWVudCwgZXhwZWN0ZWRTb3VyY2UsIHNvdXJjZSk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIGlmIHN0YXRlbWVudCIsIGVsc2VTdGF0ZW1lbnQuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLklGX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJaWZTdGF0ZW1lbnQgPSAoSWZTdGF0ZW1lbnQpIGVsc2VTdGF0ZW1lbnQ7Ci0JCXRoZW5TdGF0ZW1lbnQgPSBpZlN0YXRlbWVudC5nZXRUaGVuU3RhdGVtZW50KCk7Ci0JCWV4cGVjdGVkU291cmNlID0gCi0JCQkJIntcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkJIgkJCXRocm93IG5ldyBNYWxmb3JtZWRVUkxFeGNlcHRpb24oKTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkJIgkJfSI7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZSh0aGVuU3RhdGVtZW50LCBleHBlY3RlZFNvdXJjZSwgc291cmNlKTsKLQkJZWxzZVN0YXRlbWVudCA9IGlmU3RhdGVtZW50LmdldEVsc2VTdGF0ZW1lbnQoKTsKLQkJZXhwZWN0ZWRTb3VyY2UgPSAKLQkJCQkiaWYgKGZpZWxkID09IG51bGwpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkJIgkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZElPRXhjZXB0aW9uKCk7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJCSIJCX0gZWxzZSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJCSIJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbigpO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkiCQl9IjsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGVsc2VTdGF0ZW1lbnQsIGV4cGVjdGVkU291cmNlLCBzb3VyY2UpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBpZiBzdGF0ZW1lbnQiLCBlbHNlU3RhdGVtZW50LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5JRl9TVEFURU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCWlmU3RhdGVtZW50ID0gKElmU3RhdGVtZW50KSBlbHNlU3RhdGVtZW50OwotCQl0aGVuU3RhdGVtZW50ID0gaWZTdGF0ZW1lbnQuZ2V0VGhlblN0YXRlbWVudCgpOwotCQlleHBlY3RlZFNvdXJjZSA9IAotCQkJCSJ7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJCSIJCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbigpO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkiCQl9IjsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKHRoZW5TdGF0ZW1lbnQsIGV4cGVjdGVkU291cmNlLCBzb3VyY2UpOwotCQllbHNlU3RhdGVtZW50ID0gaWZTdGF0ZW1lbnQuZ2V0RWxzZVN0YXRlbWVudCgpOwotCQlleHBlY3RlZFNvdXJjZSA9IAotCQkJCSJ7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJCSIJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbigpO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkiCQl9IjsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGVsc2VTdGF0ZW1lbnQsIGV4cGVjdGVkU291cmNlLCBzb3VyY2UpOwotCX0JCi0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NjU3Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzNDIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDM0MiIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlJRE9NQ29tcGlsYXRpb25Vbml0IGRjb21wVW5pdCA9IG5ldyBET01GYWN0b3J5KCkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KHNvdXJjZVVuaXQuZ2V0U291cmNlKCksIHNvdXJjZVVuaXQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCWFzc2VydE5vdE51bGwoImRjb21wVW5pdCBpcyBudWxsIiwgZGNvbXBVbml0KTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHNlYXJjaGluZyBjbGFzcyAKLQkJSURPTVR5cGUgY2xhc3NOb2RlID0gbnVsbDsKLQkJRW51bWVyYXRpb24gY2hpbGRyZW4gPSBkY29tcFVuaXQuZ2V0Q2hpbGRyZW4oKTsKLQkJYXNzZXJ0Tm90TnVsbCgiZGNvbXBVbml0IGhhcyBubyBjaGlsZHJlbiIsIGNoaWxkcmVuKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJd2hpbGUgKGNoaWxkcmVuLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlJRE9NTm9kZSBjaGlsZCA9IChJRE9NTm9kZSkgY2hpbGRyZW4ubmV4dEVsZW1lbnQoKTsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IElET01Ob2RlLlRZUEUpIHsKLQkJCQljbGFzc05vZGUgPSAoSURPTVR5cGUpIGNoaWxkOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWFzc2VydE5vdE51bGwoImNsYXNzTm9kZSBpcyBudWxsIiwgY2xhc3NOb2RlKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHNlYXJjaGluZyBmb3IgbWV0aG9kcwotCQljaGlsZHJlbiA9IGNsYXNzTm9kZS5nZXRDaGlsZHJlbigpOwotCi0JCWFzc2VydE5vdE51bGwoImNsYXNzTm9kZSBoYXMgbm8gY2hpbGRyZW4iLCBjaGlsZHJlbik7IC8vJE5PTi1OTFMtMSQKLQotCQl3aGlsZSAoY2hpbGRyZW4uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCUlET01Ob2RlIGNoaWxkID0gKElET01Ob2RlKSBjaGlsZHJlbi5uZXh0RWxlbWVudCgpOwotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gSURPTU5vZGUuTUVUSE9EKSB7Ci0JCQkJSURPTU1ldGhvZCBjaGlsZE1ldGhvZCA9IChJRE9NTWV0aG9kKSBjaGlsZDsKLQotCQkJCS8vIHJldHVyblR5cGUgaXMgYWx3YXlzIG51bGw7Ci0JCQkJU3RyaW5nIHJldHVyblR5cGUgPSBjaGlsZE1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JCQkJaWYgKGNoaWxkTWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgewotCQkJCQlhc3NlcnROdWxsKHJldHVyblR5cGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWFzc2VydE5vdE51bGwoIm5vIHJldHVybiB0eXBlIiwgcmV0dXJuVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjA1MQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzQzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAzNDMiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0RXF1YWxzKCJlcnJvcnMgZm91bmQiLCAwLCBjb21waWxhdGlvblVuaXQuZ2V0TWVzc2FnZXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAxLCAxKTsKLQkJYXNzZXJ0Tm90TnVsbCgibm90IG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgYW4gaWYgc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuSUZfU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZXhwZWN0ZWRTb3VyY2UgPSAKLQkJCQkiaWYgKGZsYWcpXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJCSIJCQlpPSAxMDsiOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgZXhwZWN0ZWRTb3VyY2UsIHNvdXJjZSk7Ci0JfQotCQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTYxMzIKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDM0NCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IG51bGw7Ci0JCVN0cmluZyBwYl9hc3NlcnQgPSBudWxsOwotCQlTdHJpbmcgY29tcGlsZXJfc291cmNlID0gbnVsbDsKLQkJU3RyaW5nIGNvbXBpbGVyX2NvbXBsaWFuY2UgPSBudWxsOwotCQl0cnkgewotCQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDM0NCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJcHJlZmVyZW5jZXMgPSBKYXZhQ29yZS5nZXRQbHVnaW4oKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJcGJfYXNzZXJ0ID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKEphdmFDb3JlLkNPTVBJTEVSX1BCX0FTU0VSVF9JREVOVElGSUVSKTsKLQkJCWNvbXBpbGVyX3NvdXJjZSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhKYXZhQ29yZS5DT01QSUxFUl9TT1VSQ0UpOwotCQkJY29tcGlsZXJfY29tcGxpYW5jZSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFKTsKLQkJCQotCQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoSmF2YUNvcmUuQ09NUElMRVJfUEJfQVNTRVJUX0lERU5USUZJRVIsIEphdmFDb3JlLkVSUk9SKTsgCi0JCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShKYXZhQ29yZS5DT01QSUxFUl9TT1VSQ0UsIEphdmFDb3JlLlZFUlNJT05fMV80KTsKLQkJCXByZWZlcmVuY2VzLnNldFZhbHVlKEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UsIEphdmFDb3JlLlZFUlNJT05fMV80KTsgCi0JCQkKLQkJCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCQlhc3NlcnRFcXVhbHMoImVycm9ycyBmb3VuZCIsIDAsIGNvbXBpbGF0aW9uVW5pdC5nZXRNZXNzYWdlcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoSmF2YUNvcmUuQ09NUElMRVJfUEJfQVNTRVJUX0lERU5USUZJRVIsIHBiX2Fzc2VydCk7IAotCQkJCXByZWZlcmVuY2VzLnNldFZhbHVlKEphdmFDb3JlLkNPTVBJTEVSX1NPVVJDRSwgY29tcGlsZXJfc291cmNlKTsgCi0JCQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSwgY29tcGlsZXJfY29tcGxpYW5jZSk7IAotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc5MjIKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDM0NSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzQ1IiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiZXJyb3JzIGZvdW5kIiwgMCwgY29tcGlsYXRpb25Vbml0LmdldE1lc3NhZ2VzKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIm5vdCBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGZpZWxkIGRlY2xhcmF0aW9uIiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuRklFTERfREVDTEFSQVRJT04pOyAvLyROT04tTkxTLTEkCi0JCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IChGaWVsZERlY2xhcmF0aW9uKSBub2RlOwotCQlMaXN0IGZyYWdtZW50cyA9IGZpZWxkRGVjbGFyYXRpb24uZnJhZ21lbnRzKCk7Ci0JCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDEsIGZyYWdtZW50cy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcmFnbWVudHMuZ2V0KDApOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuZ2V0SW5pdGlhbGl6ZXIoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIEFycmF5Q3JlYXRpb24iLCBleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BUlJBWV9DUkVBVElPTik7IC8vJE5PTi1OTFMtMSQKLQkJQXJyYXlDcmVhdGlvbiBhcnJheUNyZWF0aW9uID0gKEFycmF5Q3JlYXRpb24pIGV4cHJlc3Npb247Ci0JCUFycmF5VHlwZSBhcnJheVR5cGUgPSBhcnJheUNyZWF0aW9uLmdldFR5cGUoKTsKLQkJSUJpbmRpbmcgYmluZGluZzIgPSBhcnJheVR5cGUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgibm8gYmluZGluZzIiLCBiaW5kaW5nMik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJub3QgYSB0eXBlIiwgYmluZGluZzIuZ2V0S2luZCgpLCBJQmluZGluZy5UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcyID0gKElUeXBlQmluZGluZykgYmluZGluZzI7Ci0JCWFzc2VydFRydWUoIk5vdCBhbiBhcnJheSB0eXBlIGJpbmRpbmcyIiwgdHlwZUJpbmRpbmcyLmlzQXJyYXkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJVHlwZSB0eXBlID0gYXJyYXlUeXBlLmdldEVsZW1lbnRUeXBlKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHNpbXBsZSB0eXBlIiwgdHlwZS5pc1NpbXBsZVR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJU2ltcGxlVHlwZSBzaW1wbGVUeXBlID0gKFNpbXBsZVR5cGUpIHR5cGU7Ci0JCU5hbWUgbmFtZSA9IHNpbXBsZVR5cGUuZ2V0TmFtZSgpOwotCQlhc3NlcnRUcnVlKCJRdWFsaWZpZWROYW1lIiwgbmFtZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuUVVBTElGSUVEX05BTUUpOyAvLyROT04tTkxTLTEkCi0JCVNpbXBsZU5hbWUgc2ltcGxlTmFtZSA9ICgoUXVhbGlmaWVkTmFtZSkgbmFtZSkuZ2V0TmFtZSgpOwotCQlJQmluZGluZyBiaW5kaW5nID0gc2ltcGxlTmFtZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJubyBiaW5kaW5nIiwgYmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJub3QgYSB0eXBlIiwgYmluZGluZy5nZXRLaW5kKCksIElCaW5kaW5nLlRZUEUpOyAvLyROT04tTkxTLTEkCi0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IChJVHlwZUJpbmRpbmcpIGJpbmRpbmc7Ci0JCWFzc2VydFRydWUoIkFuIGFycmF5IHR5cGUgYmluZGluZyIsICF0eXBlQmluZGluZy5pc0FycmF5KCkpOyAvLyROT04tTkxTLTEkCi0JCVR5cGUgdHlwZTIgPSBmaWVsZERlY2xhcmF0aW9uLmdldFR5cGUoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgYXJyYXkgdHlwZSIsIHR5cGUyLmlzQXJyYXlUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCUFycmF5VHlwZSBhcnJheVR5cGUyID0gKEFycmF5VHlwZSkgdHlwZTI7Ci0JCVR5cGUgdHlwZTMgPSBhcnJheVR5cGUyLmdldEVsZW1lbnRUeXBlKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHNpbXBsZSB0eXBlIiwgdHlwZTMuaXNTaW1wbGVUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCVNpbXBsZVR5cGUgc2ltcGxlVHlwZTIgPSAoU2ltcGxlVHlwZSkgdHlwZTM7Ci0JCU5hbWUgbmFtZTIgPSBzaW1wbGVUeXBlMi5nZXROYW1lKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHF1YWxpZmllZCBuYW1lIiwgbmFtZTIuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlFVQUxJRklFRF9OQU1FKTsgLy8kTk9OLU5MUy0xJAotCQlTaW1wbGVOYW1lIHNpbXBsZU5hbWUyID0gKChRdWFsaWZpZWROYW1lKSBuYW1lMikuZ2V0TmFtZSgpOwotCQlJQmluZGluZyBiaW5kaW5nMyA9IHNpbXBsZU5hbWUyLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIm5vIGJpbmRpbmciLCBiaW5kaW5nMyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJub3QgYSB0eXBlIiwgYmluZGluZzMuZ2V0S2luZCgpLCBJQmluZGluZy5UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmczID0gKElUeXBlQmluZGluZykgYmluZGluZzM7Ci0JCWFzc2VydFRydWUoIkFuIGFycmF5IHR5cGUgYmluZGluZyIsICF0eXBlQmluZGluZzMuaXNBcnJheSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgxMzgKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDM0NigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzQ2IiwgIlRlc3QyLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoImVycm9ycyBmb3VuZCIsIDAsIGNvbXBpbGF0aW9uVW5pdC5nZXRNZXNzYWdlcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJub3QgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhbiB2YXJpYWJsZSBkZWNsYXJhdGlvbiIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlZBUklBQkxFX0RFQ0xBUkFUSU9OX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIG5vZGU7Ci0JCVR5cGUgdHlwZSA9IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuZ2V0VHlwZSgpOwotCQljaGVja1NvdXJjZVJhbmdlKHR5cGUsICJWZWN0b3IiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIm5vdCBhbiBhcnJheSB0eXBlIiwgIXR5cGUuaXNBcnJheVR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgc2ltcGxlIHR5cGUiLCB0eXBlLmlzU2ltcGxlVHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlTaW1wbGVUeXBlIHNpbXBsZVR5cGUgPSAoU2ltcGxlVHlwZSkgdHlwZTsKLQkJTmFtZSBuYW1lID0gc2ltcGxlVHlwZS5nZXROYW1lKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHNpbXBsZU5hbWUiLCBuYW1lLmlzU2ltcGxlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlTaW1wbGVOYW1lIHNpbXBsZU5hbWUgPSAoU2ltcGxlTmFtZSkgbmFtZTsKLQkJSUJpbmRpbmcgYmluZGluZyA9IHNpbXBsZU5hbWUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZyIsIGJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgdHlwZSIsIElCaW5kaW5nLlRZUEUsIGJpbmRpbmcuZ2V0S2luZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSAoSVR5cGVCaW5kaW5nKSBiaW5kaW5nOwotCQlhc3NlcnRUcnVlKCJBbiBhcnJheSIsICF0eXBlQmluZGluZy5pc0FycmF5KCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJWZWN0b3IiLCBiaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcyID0gc2ltcGxlVHlwZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgdHlwZUJpbmRpbmcyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIHR5cGUiLCBJQmluZGluZy5UWVBFLCB0eXBlQmluZGluZzIuZ2V0S2luZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJBbiBhcnJheSIsICF0eXBlQmluZGluZzIuaXNBcnJheSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCAiVmVjdG9yIiwgdHlwZUJpbmRpbmcyLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgxMzgKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDM0NygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzQ3IiwgIlRlc3QyLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoImVycm9ycyBmb3VuZCIsIDAsIGNvbXBpbGF0aW9uVW5pdC5nZXRNZXNzYWdlcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJub3QgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhbiB2YXJpYWJsZSBkZWNsYXJhdGlvbiIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlZBUklBQkxFX0RFQ0xBUkFUSU9OX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIG5vZGU7Ci0JCVR5cGUgdHlwZSA9IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuZ2V0VHlwZSgpOwotCQljaGVja1NvdXJjZVJhbmdlKHR5cGUsICJWZWN0b3JbXSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgibm90IGFuIGFycmF5IHR5cGUiLCB0eXBlLmlzQXJyYXlUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCUFycmF5VHlwZSBhcnJheVR5cGUgPSAoQXJyYXlUeXBlKSB0eXBlOwotCQlJVHlwZUJpbmRpbmcgYmluZGluZyA9IGFycmF5VHlwZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgYmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyB0eXBlIiwgSUJpbmRpbmcuVFlQRSwgYmluZGluZy5nZXRLaW5kKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhbiBhcnJheSB0eXBlIiwgYmluZGluZy5pc0FycmF5KCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJWZWN0b3JbXSIsIGJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgxMzgKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDM0OCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzQ4IiwgIlRlc3QyLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoImVycm9ycyBmb3VuZCIsIDAsIGNvbXBpbGF0aW9uVW5pdC5nZXRNZXNzYWdlcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJub3QgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhbiB2YXJpYWJsZSBkZWNsYXJhdGlvbiIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlZBUklBQkxFX0RFQ0xBUkFUSU9OX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIG5vZGU7Ci0JCVR5cGUgdHlwZSA9IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuZ2V0VHlwZSgpOwotCQljaGVja1NvdXJjZVJhbmdlKHR5cGUsICJWZWN0b3JbXVtdIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJub3QgYW4gYXJyYXkgdHlwZSIsIHR5cGUuaXNBcnJheVR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJQXJyYXlUeXBlIGFycmF5VHlwZSA9IChBcnJheVR5cGUpIHR5cGU7Ci0JCUlUeXBlQmluZGluZyBiaW5kaW5nID0gYXJyYXlUeXBlLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCBiaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIHR5cGUiLCBJQmluZGluZy5UWVBFLCBiaW5kaW5nLmdldEtpbmQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGFycmF5IHR5cGUiLCBiaW5kaW5nLmlzQXJyYXkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgIlZlY3RvcltdW10iLCBiaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgxMzgKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDM0OSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzQ5IiwgIlRlc3QyLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoImVycm9ycyBmb3VuZCIsIDAsIGNvbXBpbGF0aW9uVW5pdC5nZXRNZXNzYWdlcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJub3QgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhbiBmaWVsZCBkZWNsYXJhdGlvbiIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkZJRUxEX0RFQ0xBUkFUSU9OKTsgLy8kTk9OLU5MUy0xJAotCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSAoRmllbGREZWNsYXJhdGlvbikgbm9kZTsKLQkJVHlwZSB0eXBlID0gZmllbGREZWNsYXJhdGlvbi5nZXRUeXBlKCk7Ci0JCWNoZWNrU291cmNlUmFuZ2UodHlwZSwgIlZlY3RvcltdW10iLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIm5vdCBhbiBhcnJheSB0eXBlIiwgdHlwZS5pc0FycmF5VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlBcnJheVR5cGUgYXJyYXlUeXBlID0gKEFycmF5VHlwZSkgdHlwZTsKLQkJSVR5cGVCaW5kaW5nIGJpbmRpbmcgPSBhcnJheVR5cGUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZyIsIGJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgdHlwZSIsIElCaW5kaW5nLlRZUEUsIGJpbmRpbmcuZ2V0S2luZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgYW4gYXJyYXkgdHlwZSIsIGJpbmRpbmcuaXNBcnJheSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCAiVmVjdG9yW11bXSIsIGJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgxMzgKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDM1MCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzUwIiwgIlRlc3QyLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoImVycm9ycyBmb3VuZCIsIDAsIGNvbXBpbGF0aW9uVW5pdC5nZXRNZXNzYWdlcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJub3QgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhbiBmaWVsZCBkZWNsYXJhdGlvbiIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkZJRUxEX0RFQ0xBUkFUSU9OKTsgLy8kTk9OLU5MUy0xJAotCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSAoRmllbGREZWNsYXJhdGlvbikgbm9kZTsKLQkJVHlwZSB0eXBlID0gZmllbGREZWNsYXJhdGlvbi5nZXRUeXBlKCk7Ci0JCWNoZWNrU291cmNlUmFuZ2UodHlwZSwgIlZlY3RvciIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgc2ltcGxlIHR5cGUiLCB0eXBlLmlzU2ltcGxlVHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlTaW1wbGVUeXBlIHNpbXBsZVR5cGUgPSAoU2ltcGxlVHlwZSkgdHlwZTsKLQkJSVR5cGVCaW5kaW5nIGJpbmRpbmcgPSBzaW1wbGVUeXBlLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCBiaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIHR5cGUiLCBJQmluZGluZy5UWVBFLCBiaW5kaW5nLmdldEtpbmQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiQW4gYXJyYXkgdHlwZSIsIGJpbmRpbmcuaXNDbGFzcygpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCAiVmVjdG9yIiwgYmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MTY5Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzNTEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDM1MSIsICJUZXN0Mi5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0RXF1YWxzKCJlcnJvcnMgZm91bmQiLCAwLCBjb21waWxhdGlvblVuaXQuZ2V0TWVzc2FnZXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgibm90IG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgYW4gbWV0aG9kIGRlY2xhcmF0aW9uIiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuTUVUSE9EX0RFQ0xBUkFUSU9OKTsgLy8kTk9OLU5MUy0xJAotCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbikgbm9kZTsKLQkJTGlzdCBwYXJhbWV0ZXJzID0gbWV0aG9kRGVjbGFyYXRpb24ucGFyYW1ldGVycygpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAyLCBwYXJhbWV0ZXJzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uID0gKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIHBhcmFtZXRlcnMuZ2V0KDApOwotCQljaGVja1NvdXJjZVJhbmdlKHNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24sICJpbnQgYSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJc2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiA9IChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSBwYXJhbWV0ZXJzLmdldCgxKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLCAiaW50W10gYiIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAxKTsKLQkJYXNzZXJ0Tm90TnVsbCgibm90IG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgYW4gbWV0aG9kIGRlY2xhcmF0aW9uIiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuTUVUSE9EX0RFQ0xBUkFUSU9OKTsgLy8kTk9OLU5MUy0xJAotCQltZXRob2REZWNsYXJhdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbikgbm9kZTsKLQkJcGFyYW1ldGVycyA9IG1ldGhvZERlY2xhcmF0aW9uLnBhcmFtZXRlcnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMiwgcGFyYW1ldGVycy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCXNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gPSAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgcGFyYW1ldGVycy5nZXQoMCk7Ci0JCWNoZWNrU291cmNlUmFuZ2Uoc2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiwgImludCBhIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uID0gKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIHBhcmFtZXRlcnMuZ2V0KDEpOwotCQljaGVja1NvdXJjZVJhbmdlKHNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24sICJpbnQgYltdIiwgc291cmNlKTsJCQkgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgxNjkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDM1MigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzUyIiwgIlRlc3QyLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoImVycm9ycyBmb3VuZCIsIDAsIGNvbXBpbGF0aW9uVW5pdC5nZXRNZXNzYWdlcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJub3QgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhbiBtZXRob2QgZGVjbGFyYXRpb24iLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5NRVRIT0RfREVDTEFSQVRJT04pOyAvLyROT04tTkxTLTEkCi0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBub2RlOwotCQlMaXN0IHBhcmFtZXRlcnMgPSBtZXRob2REZWNsYXJhdGlvbi5wYXJhbWV0ZXJzKCk7Ci0JCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDIsIHBhcmFtZXRlcnMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gPSAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgcGFyYW1ldGVycy5nZXQoMCk7Ci0JCWNoZWNrU291cmNlUmFuZ2Uoc2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiwgImZpbmFsIGludCBhIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uID0gKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIHBhcmFtZXRlcnMuZ2V0KDEpOwotCQljaGVja1NvdXJjZVJhbmdlKHNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24sICJmaW5hbCBpbnRbXSBiIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDEpOwotCQlhc3NlcnROb3ROdWxsKCJub3QgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhbiBtZXRob2QgZGVjbGFyYXRpb24iLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5NRVRIT0RfREVDTEFSQVRJT04pOyAvLyROT04tTkxTLTEkCi0JCW1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBub2RlOwotCQlwYXJhbWV0ZXJzID0gbWV0aG9kRGVjbGFyYXRpb24ucGFyYW1ldGVycygpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAyLCBwYXJhbWV0ZXJzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiA9IChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSBwYXJhbWV0ZXJzLmdldCgwKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLCAiZmluYWwgaW50IGEiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCXNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gPSAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgcGFyYW1ldGVycy5nZXQoMSk7Ci0JCWNoZWNrU291cmNlUmFuZ2Uoc2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiwgImZpbmFsIGludCBiW10iLCBzb3VyY2UpOwkJCSAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODA0MgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzUzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAzNTMiLCAiVGVzdC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0RXF1YWxzKCJlcnJvcnMgZm91bmQiLCAwLCBjb21waWxhdGlvblVuaXQuZ2V0TWVzc2FnZXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgibm90IG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgYW4gdmFyaWFibGUgZGVjbGFyYXRpb24iLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5WQVJJQUJMRV9ERUNMQVJBVElPTl9TVEFURU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KSBub2RlOwotCQlUeXBlIHR5cGUgPSB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LmdldFR5cGUoKTsKLQkJY2hlY2tTb3VyY2VSYW5nZSh0eXBlLCAiSW5wdXRTdHJlYW0iLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIm5vdCBhIHNpbXBsZSB0eXBlIiwgdHlwZS5pc1NpbXBsZVR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJSVR5cGVCaW5kaW5nIGJpbmRpbmcgPSB0eXBlLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCBiaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIHR5cGUiLCBJQmluZGluZy5UWVBFLCBiaW5kaW5nLmdldEtpbmQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgY2xhc3MiLCBiaW5kaW5nLmlzQ2xhc3MoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgIklucHV0U3RyZWFtIiwgYmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBwYWNrYWdlIiwgImphdmEuaW8iLCBiaW5kaW5nLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU2ltcGxlVHlwZSBzaW1wbGVUeXBlID0gKFNpbXBsZVR5cGUpIHR5cGU7Ci0JCU5hbWUgbmFtZSA9IHNpbXBsZVR5cGUuZ2V0TmFtZSgpOwotCQlJQmluZGluZyBiaW5kaW5nMiA9IG5hbWUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZyIsIGJpbmRpbmcyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIHR5cGUiLCBJQmluZGluZy5UWVBFLCBiaW5kaW5nMi5nZXRLaW5kKCkpOyAvLyROT04tTkxTLTEkCi0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IChJVHlwZUJpbmRpbmcpIGJpbmRpbmcyOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBjbGFzcyIsIHR5cGVCaW5kaW5nLmlzQ2xhc3MoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgIklucHV0U3RyZWFtIiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgcGFja2FnZSIsICJqYXZhLmlvIiwgdHlwZUJpbmRpbmcuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk4NTEKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDM1NCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzU0IiwgIlRlc3QuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiZXJyb3JzIGZvdW5kIiwgMSwgY29tcGlsYXRpb25Vbml0LmdldE1lc3NhZ2VzKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNTIwCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzNTUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDM1NSIsICJGb28uamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiZXJyb3JzIGZvdW5kIiwgMCwgY29tcGlsYXRpb25Vbml0LmdldE1lc3NhZ2VzKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwobm9kZSk7Ci0JCWFzc2VydFRydWUoIk5vdCBhbiBpZiBzdGF0ZW1lbnQiLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5JRl9TVEFURU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCUlmU3RhdGVtZW50IGlmU3RhdGVtZW50ID0gKElmU3RhdGVtZW50KSBub2RlOwotCQlFeHByZXNzaW9uIGNvbmRpdGlvbiA9IGlmU3RhdGVtZW50LmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGluZml4RXhwcmVzc2lvbiIsIGNvbmRpdGlvbi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuSU5GSVhfRVhQUkVTU0lPTik7IC8vJE5PTi1OTFMtMSQKLQkJSW5maXhFeHByZXNzaW9uIGluZml4RXhwcmVzc2lvbiA9IChJbmZpeEV4cHJlc3Npb24pIGNvbmRpdGlvbjsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gaW5maXhFeHByZXNzaW9uLmdldExlZnRPcGVyYW5kKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIG1ldGhvZCBpbnZvY2F0aW9uIGV4cHJlc3Npb24iLCBleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5NRVRIT0RfSU5WT0NBVElPTik7IC8vJE5PTi1OTFMtMSQKLQkJTWV0aG9kSW52b2NhdGlvbiBtZXRob2RJbnZvY2F0aW9uID0gKE1ldGhvZEludm9jYXRpb24pIGV4cHJlc3Npb247Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbjIgPSBtZXRob2RJbnZvY2F0aW9uLmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgcGFyZW50aGVzaXMgZXhwcmVzc2lvbiIsIGV4cHJlc3Npb24yLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT04pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDg2NQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzU2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAzNTYiLCAiWC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0RXF1YWxzKCJlcnJvcnMgZm91bmQiLCAyLCBjb21waWxhdGlvblVuaXQuZ2V0TWVzc2FnZXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbChub2RlKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuVkFSSUFCTEVfREVDTEFSQVRJT05fU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCkgbm9kZTsKLQkJVHlwZSB0eXBlID0gdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5nZXRUeXBlKCk7Ci0JCUlUeXBlQmluZGluZyBiaW5kaW5nID0gdHlwZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROdWxsKGJpbmRpbmcpOwotCX0KLQkKLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNzU3Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzNTcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDM1NyIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoImVycm9ycyBmb3VuZCIsIDAsIGNvbXBpbGF0aW9uVW5pdC5nZXRNZXNzYWdlcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDApOwotCQlhc3NlcnROb3ROdWxsKG5vZGUpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSB0eXBlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlRZUEVfREVDTEFSQVRJT04pOyAvLyROT04tTkxTLTEkCi0JCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKSBub2RlOwotCQlTaW1wbGVOYW1lIG5hbWUgPSB0eXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpOwotCQljaGVja1NvdXJjZVJhbmdlKG5hbWUsICJBIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNzY4Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzNTgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDM1OCIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoImVycm9ycyBmb3VuZCIsIDAsIGNvbXBpbGF0aW9uVW5pdC5nZXRNZXNzYWdlcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsMCk7Ci0JCWFzc2VydE5vdE51bGwobm9kZSk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIG1ldGhvZCBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQiLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5NRVRIT0RfREVDTEFSQVRJT04pOyAvLyROT04tTkxTLTEkCi0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBub2RlOwotCQlTaW1wbGVOYW1lIG5hbWUgPSBtZXRob2REZWNsYXJhdGlvbi5nZXROYW1lKCk7Ci0JCWNoZWNrU291cmNlUmFuZ2UobmFtZSwgIm1kZCIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNzY4Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzNTkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDM1OSIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoImVycm9ycyBmb3VuZCIsIDAsIGNvbXBpbGF0aW9uVW5pdC5nZXRNZXNzYWdlcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsMCk7Ci0JCWFzc2VydE5vdE51bGwobm9kZSk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIG1ldGhvZCBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQiLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5NRVRIT0RfREVDTEFSQVRJT04pOyAvLyROT04tTkxTLTEkCi0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBub2RlOwotCQlTaW1wbGVOYW1lIG5hbWUgPSBtZXRob2REZWNsYXJhdGlvbi5nZXROYW1lKCk7Ci0JCWNoZWNrU291cmNlUmFuZ2UobmFtZSwgIm1kZCIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxOTE2Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzNjAoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDM2MCIsICJYLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoImVycm9ycyBmb3VuZCIsIDAsIGNvbXBpbGF0aW9uVW5pdC5nZXRNZXNzYWdlcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwobm9kZSk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIGZvciBzdGF0ZW1lbnQiLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5GT1JfU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlGb3JTdGF0ZW1lbnQgZm9yU3RhdGVtZW50ID0gKEZvclN0YXRlbWVudCkgbm9kZTsKLQkJTGlzdCBpbml0aWFsaXplcnMgPSBmb3JTdGF0ZW1lbnQuaW5pdGlhbGl6ZXJzKCk7Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc2l6ZSIsIDEsIGluaXRpYWxpemVycy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTkxNgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzYxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAzNjEiLCAiWC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0RXF1YWxzKCJlcnJvcnMgZm91bmQiLCAwLCBjb21waWxhdGlvblVuaXQuZ2V0TWVzc2FnZXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLDAsIDApOwotCQlhc3NlcnROb3ROdWxsKG5vZGUpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBmb3Igc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuRk9SX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJRm9yU3RhdGVtZW50IGZvclN0YXRlbWVudCA9IChGb3JTdGF0ZW1lbnQpIG5vZGU7Ci0JCUxpc3QgaW5pdGlhbGl6ZXJzID0gZm9yU3RhdGVtZW50LmluaXRpYWxpemVycygpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHNpemUiLCAxLCBpbml0aWFsaXplcnMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxOTE2Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzNjIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDM2MiIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJRm9yU3RhdGVtZW50IGZvclN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld0ZvclN0YXRlbWVudCgpOwotCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBpRnJhZ21lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJaUZyYWdtZW50LnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiaSIpKTsgLy8kTk9OLU5MUy0xJAotCQlpRnJhZ21lbnQuc2V0SW5pdGlhbGl6ZXIodGhpcy5hc3QubmV3TnVtYmVyTGl0ZXJhbCgiMCIpKTsvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBqRnJhZ21lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJakZyYWdtZW50LnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiaiIpKTsgLy8kTk9OLU5MUy0xJAotCQlqRnJhZ21lbnQuc2V0SW5pdGlhbGl6ZXIodGhpcy5hc3QubmV3TnVtYmVyTGl0ZXJhbCgiMCIpKTsvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBrRnJhZ21lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJa0ZyYWdtZW50LnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiayIpKTsgLy8kTk9OLU5MUy0xJAotCQlrRnJhZ21lbnQuc2V0SW5pdGlhbGl6ZXIodGhpcy5hc3QubmV3TnVtYmVyTGl0ZXJhbCgiMCIpKTsvLyROT04tTkxTLTEkCi0KLQkJVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbihpRnJhZ21lbnQpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbi5zZXRNb2RpZmllcnMoTW9kaWZpZXIuTk9ORSk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uLnNldFR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLklOVCkpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbi5mcmFnbWVudHMoKS5hZGQoakZyYWdtZW50KTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24uZnJhZ21lbnRzKCkuYWRkKGtGcmFnbWVudCk7Ci0JCWZvclN0YXRlbWVudC5pbml0aWFsaXplcnMoKS5hZGQodmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24pOwotCi0JCVBvc3RmaXhFeHByZXNzaW9uIGlQb3N0Zml4RXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld1Bvc3RmaXhFeHByZXNzaW9uKCk7Ci0JCWlQb3N0Zml4RXhwcmVzc2lvbi5zZXRPcGVyYW5kKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImkiKSk7Ly8kTk9OLU5MUy0xJAotCQlpUG9zdGZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoUG9zdGZpeEV4cHJlc3Npb24uT3BlcmF0b3IuSU5DUkVNRU5UKTsKLQkJZm9yU3RhdGVtZW50LnVwZGF0ZXJzKCkuYWRkKGlQb3N0Zml4RXhwcmVzc2lvbik7Ci0JCQotCQlQb3N0Zml4RXhwcmVzc2lvbiBqUG9zdGZpeEV4cHJlc3Npb24gPSB0aGlzLmFzdC5uZXdQb3N0Zml4RXhwcmVzc2lvbigpOwotCQlqUG9zdGZpeEV4cHJlc3Npb24uc2V0T3BlcmFuZCh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJqIikpOy8vJE5PTi1OTFMtMSQKLQkJalBvc3RmaXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKFBvc3RmaXhFeHByZXNzaW9uLk9wZXJhdG9yLklOQ1JFTUVOVCk7Ci0JCWZvclN0YXRlbWVudC51cGRhdGVycygpLmFkZChqUG9zdGZpeEV4cHJlc3Npb24pOwotCi0JCVBvc3RmaXhFeHByZXNzaW9uIGtQb3N0Zml4RXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld1Bvc3RmaXhFeHByZXNzaW9uKCk7Ci0JCWtQb3N0Zml4RXhwcmVzc2lvbi5zZXRPcGVyYW5kKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImsiKSk7Ly8kTk9OLU5MUy0xJAotCQlrUG9zdGZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoUG9zdGZpeEV4cHJlc3Npb24uT3BlcmF0b3IuSU5DUkVNRU5UKTsKLQkJZm9yU3RhdGVtZW50LnVwZGF0ZXJzKCkuYWRkKGtQb3N0Zml4RXhwcmVzc2lvbik7Ci0KLQkJZm9yU3RhdGVtZW50LnNldEJvZHkodGhpcy5hc3QubmV3QmxvY2soKSk7Ci0JCQotCQlJbmZpeEV4cHJlc3Npb24gaW5maXhFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3SW5maXhFeHByZXNzaW9uKCk7Ci0JCWluZml4RXhwcmVzc2lvbi5zZXRMZWZ0T3BlcmFuZCh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJpIikpOyAvLyROT04tTkxTLTEkCi0JCWluZml4RXhwcmVzc2lvbi5zZXRPcGVyYXRvcihJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTEVTUyk7Ci0JCWluZml4RXhwcmVzc2lvbi5zZXRSaWdodE9wZXJhbmQodGhpcy5hc3QubmV3TnVtYmVyTGl0ZXJhbCgiMTAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZm9yU3RhdGVtZW50LnNldEV4cHJlc3Npb24oaW5maXhFeHByZXNzaW9uKTsKLQkJCi0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBmb3JTdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiZm9yIChpbnQgaT0wLCBqPTAsIGs9MDsgaTwxMCA7IGkrKywgaisrLCBrKyspIHt9Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI5MzkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDM2MygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzYzIiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiZXJyb3JzIGZvdW5kIiwgMCwgY29tcGlsYXRpb25Vbml0LmdldE1lc3NhZ2VzKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCwgMSk7Ci0JCWFzc2VydE5vdE51bGwobm9kZSk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlZBUklBQkxFX0RFQ0xBUkFUSU9OX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIG5vZGU7Ci0JCUxpc3QgZnJhZ21lbnRzID0gdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzaXplIiwgMSwgZnJhZ21lbnRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5nZXRJbml0aWFsaXplcigpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24iLCBleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT04pOyAvLyROT04tTkxTLTEkCi0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbjIgPSAoKFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKSBleHByZXNzaW9uKS5nZXRFeHByZXNzaW9uKCk7Ci0JCWNoZWNrU291cmNlUmFuZ2UoZXhwcmVzc2lvbjIsICJ4eHh4Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE1MjkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDM2NCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzY0IiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiZXJyb3JzIGZvdW5kIiwgMCwgY29tcGlsYXRpb25Vbml0LmdldE1lc3NhZ2VzKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwobm9kZSk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlZBUklBQkxFX0RFQ0xBUkFUSU9OX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIG5vZGU7Ci0JCUxpc3QgZnJhZ21lbnRzID0gdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzaXplIiwgMSwgZnJhZ21lbnRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7Ci0JCWNoZWNrU291cmNlUmFuZ2UodmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCwgImludCBsb2NhbDsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCVNpbXBsZU5hbWUgc2ltcGxlTmFtZSA9IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5nZXROYW1lKCk7Ci0JCUlCaW5kaW5nIGJpbmRpbmcgPSBzaW1wbGVOYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCBiaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNTI5Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzNjUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDM2NSIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoImVycm9ycyBmb3VuZCIsIDAsIGNvbXBpbGF0aW9uVW5pdC5nZXRNZXNzYWdlcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKG5vZGUpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBmb3Igc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuRk9SX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJRm9yU3RhdGVtZW50IGZvclN0YXRlbWVudCA9IChGb3JTdGF0ZW1lbnQpIG5vZGU7Ci0JCUxpc3QgaW5pdGlhbGl6ZXJzID0gZm9yU3RhdGVtZW50LmluaXRpYWxpemVycygpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHNpemUiLCAxLCBpbml0aWFsaXplcnMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiB2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiA9IChWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbikgaW5pdGlhbGl6ZXJzLmdldCgwKTsKLQkJTGlzdCBmcmFnbWVudHMgPSB2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbi5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzaXplIiwgMSwgZnJhZ21lbnRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7Ci0JCVNpbXBsZU5hbWUgc2ltcGxlTmFtZSA9IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5nZXROYW1lKCk7Ci0JCUlCaW5kaW5nIGJpbmRpbmcgPSBzaW1wbGVOYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCBiaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMwNDgKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDM2NigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzY2IiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiZXJyb3JzIGZvdW5kIiwgMCwgY29tcGlsYXRpb25Vbml0LmdldE1lc3NhZ2VzKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwobm9kZSk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIGZvciBzdGF0ZW1lbnQiLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5GT1JfU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlGb3JTdGF0ZW1lbnQgZm9yU3RhdGVtZW50ID0gKEZvclN0YXRlbWVudCkgbm9kZTsKLQkJY2hlY2tTb3VyY2VSYW5nZShmb3JTdGF0ZW1lbnQsICJmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSk7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlTdGF0ZW1lbnQgc3RhdGVtZW50ID0gZm9yU3RhdGVtZW50LmdldEJvZHkoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGVtcHR5IHN0YXRlbWVudCIsIHN0YXRlbWVudC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuRU1QVFlfU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKHN0YXRlbWVudCwgIjsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzA0OAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzY3KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAzNjciLCAiQS5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0RXF1YWxzKCJlcnJvcnMgZm91bmQiLCAwLCBjb21waWxhdGlvblVuaXQuZ2V0TWVzc2FnZXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbChub2RlKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgd2hpbGUgc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuV0hJTEVfU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlXaGlsZVN0YXRlbWVudCB3aGlsZVN0YXRlbWVudCA9IChXaGlsZVN0YXRlbWVudCkgbm9kZTsKLQkJY2hlY2tTb3VyY2VSYW5nZSh3aGlsZVN0YXRlbWVudCwgIndoaWxlKGkgPT0gMik7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlTdGF0ZW1lbnQgc3RhdGVtZW50ID0gd2hpbGVTdGF0ZW1lbnQuZ2V0Qm9keSgpOwotCQlhc3NlcnRUcnVlKCJOb3QgYW4gZW1wdHkgc3RhdGVtZW50Iiwgc3RhdGVtZW50LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5FTVBUWV9TVEFURU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uoc3RhdGVtZW50LCAiOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMDQ4Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzNjgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDM2OCIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoImVycm9ycyBmb3VuZCIsIDAsIGNvbXBpbGF0aW9uVW5pdC5nZXRNZXNzYWdlcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKG5vZGUpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBsYWJlbGVkIHN0YXRlbWVudCIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkxBQkVMRURfU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlMYWJlbGVkU3RhdGVtZW50IGxhYmVsZWRTdGF0ZW1lbnQgPSAoTGFiZWxlZFN0YXRlbWVudCkgbm9kZTsKLQkJY2hlY2tTb3VyY2VSYW5nZShsYWJlbGVkU3RhdGVtZW50LCAidGVzdDo7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbGFiZWxlZFN0YXRlbWVudC5nZXRCb2R5KCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhbiBlbXB0eSBzdGF0ZW1lbnQiLCBzdGF0ZW1lbnQuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkVNUFRZX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShzdGF0ZW1lbnQsICI7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMwNDgKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDM2OSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzY5IiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiZXJyb3JzIGZvdW5kIiwgMCwgY29tcGlsYXRpb25Vbml0LmdldE1lc3NhZ2VzKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwobm9kZSk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIGxhYmVsZWQgc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuTEFCRUxFRF9TVEFURU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCUxhYmVsZWRTdGF0ZW1lbnQgbGFiZWxlZFN0YXRlbWVudCA9IChMYWJlbGVkU3RhdGVtZW50KSBub2RlOwotCQljaGVja1NvdXJjZVJhbmdlKGxhYmVsZWRTdGF0ZW1lbnQsICJ0ZXN0OlxcdTAwM0IiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCVN0YXRlbWVudCBzdGF0ZW1lbnQgPSBsYWJlbGVkU3RhdGVtZW50LmdldEJvZHkoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGVtcHR5IHN0YXRlbWVudCIsIHN0YXRlbWVudC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuRU1QVFlfU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKHN0YXRlbWVudCwgIlxcdTAwM0IiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCQkJCi0JLyoqCi0JICogRG9TdGF0ZW1lbnQgPT0+IERvU3RhdGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzNzAoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDM3MCIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCQlEb1N0YXRlbWVudCBkb1N0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld0RvU3RhdGVtZW50KCk7Ci0JCWRvU3RhdGVtZW50LnNldEJvZHkodGhpcy5hc3QubmV3RW1wdHlTdGF0ZW1lbnQoKSk7Ci0JCWRvU3RhdGVtZW50LnNldEV4cHJlc3Npb24odGhpcy5hc3QubmV3Qm9vbGVhbkxpdGVyYWwodHJ1ZSkpOwotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgZG9TdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGV4cGVjdGVkU291cmNlID0gImRvIDsgd2hpbGUodHJ1ZSk7IjsvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgZXhwZWN0ZWRTb3VyY2UsIHNvdXJjZSk7Ci0JCURvU3RhdGVtZW50IGRvU3RhdGVtZW50MiA9IChEb1N0YXRlbWVudCkgbm9kZTsKLQkJU3RhdGVtZW50IHN0YXRlbWVudCA9IGRvU3RhdGVtZW50Mi5nZXRCb2R5KCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhbiBlbXB0eSBzdGF0ZW1lbnQiLCBzdGF0ZW1lbnQuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkVNUFRZX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShzdGF0ZW1lbnQsICI7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMwNDgKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDM3MSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzcxIiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiZXJyb3JzIGZvdW5kIiwgMCwgY29tcGlsYXRpb25Vbml0LmdldE1lc3NhZ2VzKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwobm9kZSk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIGxhYmVsZWQgc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuSUZfU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlJZlN0YXRlbWVudCBpZlN0YXRlbWVudCA9IChJZlN0YXRlbWVudCkgbm9kZTsKLQkJY2hlY2tTb3VyY2VSYW5nZShpZlN0YXRlbWVudCwgImlmIChpID09IDYpOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RhdGVtZW50IHN0YXRlbWVudCA9IGlmU3RhdGVtZW50LmdldFRoZW5TdGF0ZW1lbnQoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGVtcHR5IHN0YXRlbWVudCIsIHN0YXRlbWVudC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuRU1QVFlfU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKHN0YXRlbWVudCwgIjsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzA0OAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzcyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAzNzIiLCAiQS5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0RXF1YWxzKCJlcnJvcnMgZm91bmQiLCAwLCBjb21waWxhdGlvblVuaXQuZ2V0TWVzc2FnZXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbChub2RlKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgbGFiZWxlZCBzdGF0ZW1lbnQiLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5JRl9TVEFURU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCUlmU3RhdGVtZW50IGlmU3RhdGVtZW50ID0gKElmU3RhdGVtZW50KSBub2RlOwotCQljaGVja1NvdXJjZVJhbmdlKGlmU3RhdGVtZW50LCAiaWYgKGkgPT0gNikge30gZWxzZSA7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlTdGF0ZW1lbnQgc3RhdGVtZW50ID0gaWZTdGF0ZW1lbnQuZ2V0RWxzZVN0YXRlbWVudCgpOwotCQlhc3NlcnRUcnVlKCJOb3QgYW4gZW1wdHkgc3RhdGVtZW50Iiwgc3RhdGVtZW50LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5FTVBUWV9TVEFURU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uoc3RhdGVtZW50LCAiOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMTE4Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzNzMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDM3MyIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoImVycm9ycyBmb3VuZCIsIDAsIGNvbXBpbGF0aW9uVW5pdC5nZXRNZXNzYWdlcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKG5vZGUpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBmb3Igc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuRk9SX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJRm9yU3RhdGVtZW50IGZvclN0YXRlbWVudCA9IChGb3JTdGF0ZW1lbnQpIG5vZGU7Ci0JCVN0YXRlbWVudCBzdGF0ZW1lbnQgPSBmb3JTdGF0ZW1lbnQuZ2V0Qm9keSgpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBibG9jayBzdGF0ZW1lbnQiLCBzdGF0ZW1lbnQuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkJMT0NLKTsgLy8kTk9OLU5MUy0xJAotCQlCbG9jayBibG9jayA9IChCbG9jaykgc3RhdGVtZW50OwotCQlMaXN0IHN0YXRlbWVudHMgPSBibG9jay5zdGF0ZW1lbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc2l6ZSIsIDEsIHN0YXRlbWVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlTdGF0ZW1lbnQgc3RhdGVtZW50MiA9IChTdGF0ZW1lbnQpIHN0YXRlbWVudHMuZ2V0KDApOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBicmVhayBzdGF0ZW1lbnQiLCBzdGF0ZW1lbnQyLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5CUkVBS19TVEFURU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCUJyZWFrU3RhdGVtZW50IGJyZWFrU3RhdGVtZW50ID0gKEJyZWFrU3RhdGVtZW50KSBzdGF0ZW1lbnQyOwotCQljaGVja1NvdXJjZVJhbmdlKGJyZWFrU3RhdGVtZW50LCAiYnJlYWs7Iiwgc291cmNlKTsJCSAvLyROT04tTkxTLTEkCi0JfQotCQkJCQkJCQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMxMTgKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDM3NCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzc0IiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiZXJyb3JzIGZvdW5kIiwgMCwgY29tcGlsYXRpb25Vbml0LmdldE1lc3NhZ2VzKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwobm9kZSk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIGZvciBzdGF0ZW1lbnQiLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5GT1JfU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlGb3JTdGF0ZW1lbnQgZm9yU3RhdGVtZW50ID0gKEZvclN0YXRlbWVudCkgbm9kZTsKLQkJU3RhdGVtZW50IHN0YXRlbWVudCA9IGZvclN0YXRlbWVudC5nZXRCb2R5KCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIGJsb2NrIHN0YXRlbWVudCIsIHN0YXRlbWVudC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQkxPQ0spOyAvLyROT04tTkxTLTEkCi0JCUJsb2NrIGJsb2NrID0gKEJsb2NrKSBzdGF0ZW1lbnQ7Ci0JCUxpc3Qgc3RhdGVtZW50cyA9IGJsb2NrLnN0YXRlbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzaXplIiwgMSwgc3RhdGVtZW50cy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCVN0YXRlbWVudCBzdGF0ZW1lbnQyID0gKFN0YXRlbWVudCkgc3RhdGVtZW50cy5nZXQoMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIGJyZWFrIHN0YXRlbWVudCIsIHN0YXRlbWVudDIuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkNPTlRJTlVFX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29udGludWVTdGF0ZW1lbnQgY29udGludWVTdGF0ZW1lbnQgPSAoQ29udGludWVTdGF0ZW1lbnQpIHN0YXRlbWVudDI7Ci0JCWNoZWNrU291cmNlUmFuZ2UoY29udGludWVTdGF0ZW1lbnQsICJjb250aW51ZTsiLCBzb3VyY2UpOwkJIC8vJE5PTi1OTFMtMSQKLQl9CQkJCQkJCi0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMDUyCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzNzUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDM3NSIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoInByb2JsZW1zIGZvdW5kIiwgMSwgY29tcGlsYXRpb25Vbml0LmdldE1lc3NhZ2VzKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlMaXN0IGltcG9ydHMgPSBjb21waWxhdGlvblVuaXQuaW1wb3J0cygpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAxLCBpbXBvcnRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJSW1wb3J0RGVjbGFyYXRpb24gaW1wb3J0RGVjbGFyYXRpb24gPSAoSW1wb3J0RGVjbGFyYXRpb24pIGltcG9ydHMuZ2V0KDApOwotCQlJQmluZGluZyBiaW5kaW5nID0gaW1wb3J0RGVjbGFyYXRpb24ucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgibm8gYmluZGluZyIsIGJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiTm90IGEgdHlwZSBiaW5kaW5nIiwgSUJpbmRpbmcuVFlQRSwgYmluZGluZy5nZXRLaW5kKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjkzOQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzc2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAzNzYiLCAiQS5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0RXF1YWxzKCJlcnJvcnMgZm91bmQiLCAwLCBjb21waWxhdGlvblVuaXQuZ2V0TWVzc2FnZXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbChub2RlKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuVkFSSUFCTEVfREVDTEFSQVRJT05fU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCkgbm9kZTsKLQkJTGlzdCBmcmFnbWVudHMgPSB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LmZyYWdtZW50cygpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHNpemUiLCAxLCBmcmFnbWVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgZnJhZ21lbnRzLmdldCgwKTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LmdldEluaXRpYWxpemVyKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIGNhc3QgZXhwcmVzc2lvbiIsIGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkNBU1RfRVhQUkVTU0lPTik7IC8vJE5PTi1OTFMtMSQKLQkJVHlwZSB0eXBlID0gKChDYXN0RXhwcmVzc2lvbikgZXhwcmVzc2lvbikuZ2V0VHlwZSgpOwotCQljaGVja1NvdXJjZVJhbmdlKHR5cGUsICJBIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMwNTAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDM3NygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzc3IiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiZXJyb3JzIGZvdW5kIiwgMCwgY29tcGlsYXRpb25Vbml0LmdldE1lc3NhZ2VzKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwobm9kZSk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlZBUklBQkxFX0RFQ0xBUkFUSU9OX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIG5vZGU7Ci0JCUxpc3QgZnJhZ21lbnRzID0gdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzaXplIiwgMSwgZnJhZ21lbnRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7Ci0JCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHZhcmlhYmxlIGJpbmRpbmciLCB2YXJpYWJsZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbW9kaWZpZXIiLCBJTW9kaWZpZXJDb25zdGFudHMuQUNDX0ZJTkFMLCB2YXJpYWJsZUJpbmRpbmcuZ2V0TW9kaWZpZXJzKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjE2MQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzc4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAzNzgiLCAiQS5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0RXF1YWxzKCJlcnJvcnMgZm91bmQiLCAwLCBjb21waWxhdGlvblVuaXQuZ2V0TWVzc2FnZXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbChub2RlKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgdHlwZSBkZWNsYXJhdGlvbiIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlRZUEVfREVDTEFSQVRJT04pOyAvLyROT04tTkxTLTEkCi0JCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKSBub2RlOwotCQlTaW1wbGVOYW1lIG5hbWUgPSB0eXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpOwotCQljaGVja1NvdXJjZVJhbmdlKG5hbWUsICJCIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMTYxCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzNzkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDM3OSIsICJUZXN0LmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCUFTVE5vZGUgZXhwcmVzc2lvbiA9IGdldEFTVE5vZGVUb0NvbXBhcmUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0KTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBleHByZXNzaW9uKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgYSBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiIsIGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkNMQVNTX0lOU1RBTkNFX0NSRUFUSU9OKTsJCS8vJE5PTi1OTFMtMSQKLQkJQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIGNsYXNzSW5zdGFuY2VDcmVhdGlvbjIgPSAoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKSBleHByZXNzaW9uOwotCQlOYW1lIG5hbWUyID0gY2xhc3NJbnN0YW5jZUNyZWF0aW9uMi5nZXROYW1lKCk7Ci0JCWNoZWNrU291cmNlUmFuZ2UobmFtZTIsICJPYmplY3QiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjA1NAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzgwKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAzODAiLCAiQS5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0RXF1YWxzKCJlcnJvcnMgZm91bmQiLCAwLCBjb21waWxhdGlvblVuaXQuZ2V0TWVzc2FnZXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbChub2RlKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgcmV0dXJuIHN0YXRlbWVudCIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlJFVFVSTl9TVEFURU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCVJldHVyblN0YXRlbWVudCByZXR1cm5TdGF0ZW1lbnQgPSAoUmV0dXJuU3RhdGVtZW50KSBub2RlOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSByZXR1cm5TdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBzdXBlciBtZXRob2QgaW52b2NhdGlvbiIsIGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlNVUEVSX01FVEhPRF9JTlZPQ0FUSU9OKTsgLy8kTk9OLU5MUy0xJAotCQlTdXBlck1ldGhvZEludm9jYXRpb24gc3VwZXJNZXRob2RJbnZvY2F0aW9uID0gKFN1cGVyTWV0aG9kSW52b2NhdGlvbikgZXhwcmVzc2lvbjsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gc3VwZXJNZXRob2RJbnZvY2F0aW9uLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJubyB0eXBlIGJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBkZWNsYXJpbmcgY2xhc3MiLCB0eXBlQmluZGluZy5nZXRTdXBlcmNsYXNzKCkuZ2V0TmFtZSgpLCAiT2JqZWN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTaW1wbGVOYW1lIHNpbXBsZU5hbWUgPSBzdXBlck1ldGhvZEludm9jYXRpb24uZ2V0TmFtZSgpOwotCQlJQmluZGluZyBiaW5kaW5nID0gc2ltcGxlTmFtZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJubyBiaW5kaW5nIiwgYmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyB0eXBlIiwgSUJpbmRpbmcuTUVUSE9ELCBiaW5kaW5nLmdldEtpbmQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IChJTWV0aG9kQmluZGluZykgYmluZGluZzsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBkZWNsYXJpbmcgY2xhc3MiLCBtZXRob2RCaW5kaW5nLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0TmFtZSgpLCAiT2JqZWN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMwNTQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDM4MSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzgxIiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiZXJyb3JzIGZvdW5kIiwgMCwgY29tcGlsYXRpb25Vbml0LmdldE1lc3NhZ2VzKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCk7Ci0JCWFzc2VydE5vdE51bGwobm9kZSk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHR5cGUgZGVjbGFyYXRpb24iLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5UWVBFX0RFQ0xBUkFUSU9OKTsgLy8kTk9OLU5MUy0xJAotCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgbm9kZTsKLQkJSmF2YWRvYyBqYXZhZG9jID0gdHlwZURlY2xhcmF0aW9uLmdldEphdmFkb2MoKTsKLQkJYXNzZXJ0TnVsbCgiSmF2YWRvYyBub3QgbnVsbCIsIGphdmFkb2MpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjE1NAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzgyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAzODIiLCAiQS5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0RXF1YWxzKCJlcnJvcnMgZm91bmQiLCAwLCBjb21waWxhdGlvblVuaXQuZ2V0TWVzc2FnZXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwKTsKLQkJYXNzZXJ0Tm90TnVsbChub2RlKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgdHlwZSBkZWNsYXJhdGlvbiIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlRZUEVfREVDTEFSQVRJT04pOyAvLyROT04tTkxTLTEkCi0JCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKSBub2RlOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0eXBlRGVjbGFyYXRpb24ucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBmdWxseSBxdWFsaWZpZWQgbmFtZSIsIHR5cGVCaW5kaW5nLmdldFF1YWxpZmllZE5hbWUoKSwgInRlc3QwMzgyLkEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCQkKLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMTU0Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzODMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDM4MyIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoImVycm9ycyBmb3VuZCIsIDAsIGNvbXBpbGF0aW9uVW5pdC5nZXRNZXNzYWdlcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKG5vZGUpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSB0eXBlIGRlY2xhcmF0aW9uIiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuVFlQRV9ERUNMQVJBVElPTik7IC8vJE5PTi1OTFMtMSQKLQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pIG5vZGU7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHR5cGVEZWNsYXJhdGlvbi5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGZ1bGx5IHF1YWxpZmllZCBuYW1lIiwgdHlwZUJpbmRpbmcuZ2V0UXVhbGlmaWVkTmFtZSgpLCAidGVzdDAzODMuQS5CIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjIxNTQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDM4NCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzg0IiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiZXJyb3JzIGZvdW5kIiwgMCwgY29tcGlsYXRpb25Vbml0LmdldE1lc3NhZ2VzKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwobm9kZSk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHR5cGUgZGVjbGFyYXRpb24iLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5UWVBFX0RFQ0xBUkFUSU9OKTsgLy8kTk9OLU5MUy0xJAotCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgbm9kZTsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdHlwZURlY2xhcmF0aW9uLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgZnVsbHkgcXVhbGlmaWVkIG5hbWUiLCB0eXBlQmluZGluZy5nZXRRdWFsaWZpZWROYW1lKCksICJ0ZXN0MDM4NC5BLkIuRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMTE3Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzODUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDM4NSIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoImVycm9ycyBmb3VuZCIsIDEsIGNvbXBpbGF0aW9uVW5pdC5nZXRNZXNzYWdlcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMjU5Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzODYoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDM4NiIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoImVycm9ycyBmb3VuZCIsIDAsIGNvbXBpbGF0aW9uVW5pdC5nZXRNZXNzYWdlcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKG5vZGUpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBzd2l0Y2ggc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuU1dJVENIX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJU3dpdGNoU3RhdGVtZW50IHN3aXRjaFN0YXRlbWVudCA9IChTd2l0Y2hTdGF0ZW1lbnQpIG5vZGU7Ci0JCUxpc3Qgc3RhdGVtZW50cyA9IHN3aXRjaFN0YXRlbWVudC5zdGF0ZW1lbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc2l6ZSIsIDUsIHN0YXRlbWVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlTdGF0ZW1lbnQgc3RhdGVtZW50ID0gKFN0YXRlbWVudCkgc3RhdGVtZW50cy5nZXQoMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIGNhc2Ugc3RhdGVtZW50Iiwgc3RhdGVtZW50LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5TV0lUQ0hfQ0FTRSk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShzdGF0ZW1lbnQsICJjYXNlIDE6Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlzdGF0ZW1lbnQgPSAoU3RhdGVtZW50KSBzdGF0ZW1lbnRzLmdldCgzKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgZGVmYXVsdCBjYXNlIHN0YXRlbWVudCIsIHN0YXRlbWVudC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuU1dJVENIX0NBU0UpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uoc3RhdGVtZW50LCAiZGVmYXVsdCA6Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI5MzkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDM4NygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzg3IiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiZXJyb3JzIGZvdW5kIiwgMCwgY29tcGlsYXRpb25Vbml0LmdldE1lc3NhZ2VzKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwobm9kZSk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlZBUklBQkxFX0RFQ0xBUkFUSU9OX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIG5vZGU7Ci0JCUxpc3QgZnJhZ21lbnRzID0gdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzaXplIiwgMSwgZnJhZ21lbnRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5nZXRJbml0aWFsaXplcigpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBjYXN0IGV4cHJlc3Npb24iLCBleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5DQVNUX0VYUFJFU1NJT04pOyAvLyROT04tTkxTLTEkCi0JCVR5cGUgdHlwZSA9ICgoQ2FzdEV4cHJlc3Npb24pIGV4cHJlc3Npb24pLmdldFR5cGUoKTsKLQkJY2hlY2tTb3VyY2VSYW5nZSh0eXBlLCAiQSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjE1NAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzg4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAzODgiLCAiQS5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0RXF1YWxzKCJlcnJvcnMgZm91bmQiLCAwLCBjb21waWxhdGlvblVuaXQuZ2V0TWVzc2FnZXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwKTsKLQkJYXNzZXJ0Tm90TnVsbChub2RlKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgdHlwZSBkZWNsYXJhdGlvbiIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlRZUEVfREVDTEFSQVRJT04pOyAvLyROT04tTkxTLTEkCi0JCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKSBub2RlOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0eXBlRGVjbGFyYXRpb24ucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgcXVhbGlmaWVkIG5hbWUiLCAidGVzdDAzODguQSIsIHR5cGVCaW5kaW5nLmdldFF1YWxpZmllZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjIxNTQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDM4OSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzg5IiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiZXJyb3JzIGZvdW5kIiwgMCwgY29tcGlsYXRpb25Vbml0LmdldE1lc3NhZ2VzKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwobm9kZSk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHR5cGUgZGVjbGFyYXRpb24iLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5UWVBFX0RFQ0xBUkFUSU9OKTsgLy8kTk9OLU5MUy0xJAotCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgbm9kZTsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdHlwZURlY2xhcmF0aW9uLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHR5cGUgYmluZGluZyIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIHF1YWxpZmllZCBuYW1lIiwgInRlc3QwMzg5LkEuQiIsIHR5cGVCaW5kaW5nLmdldFF1YWxpZmllZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQkKLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMTU0Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzOTAoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDM5MCIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoImVycm9ycyBmb3VuZCIsIDAsIGNvbXBpbGF0aW9uVW5pdC5nZXRNZXNzYWdlcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKG5vZGUpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBtZXRob2QgZGVjbGFyYXRpb24iLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5NRVRIT0RfREVDTEFSQVRJT04pOyAvLyROT04tTkxTLTEkCi0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBub2RlOwotCQlUeXBlIHR5cGUgPSBtZXRob2REZWNsYXJhdGlvbi5nZXRSZXR1cm5UeXBlKCk7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHR5cGUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgcXVhbGlmaWVkIG5hbWUiLCAiaW50IiwgdHlwZUJpbmRpbmcuZ2V0UXVhbGlmaWVkTmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQkKLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjIxNTQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDM5MSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzkxIiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiZXJyb3JzIGZvdW5kIiwgMCwgY29tcGlsYXRpb25Vbml0LmdldE1lc3NhZ2VzKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwobm9kZSk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIG1ldGhvZCBkZWNsYXJhdGlvbiIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLk1FVEhPRF9ERUNMQVJBVElPTik7IC8vJE5PTi1OTFMtMSQKLQkJTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIG5vZGU7Ci0JCVR5cGUgdHlwZSA9IG1ldGhvZERlY2xhcmF0aW9uLmdldFJldHVyblR5cGUoKTsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdHlwZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyB0eXBlIGJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBxdWFsaWZpZWQgbmFtZSIsICJpbnRbXSIsIHR5cGVCaW5kaW5nLmdldFF1YWxpZmllZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0JCi0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMTU0Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzOTIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDM5MiIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoImVycm9ycyBmb3VuZCIsIDAsIGNvbXBpbGF0aW9uVW5pdC5nZXRNZXNzYWdlcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKG5vZGUpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBtZXRob2QgZGVjbGFyYXRpb24iLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5NRVRIT0RfREVDTEFSQVRJT04pOyAvLyROT04tTkxTLTEkCi0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBub2RlOwotCQlUeXBlIHR5cGUgPSBtZXRob2REZWNsYXJhdGlvbi5nZXRSZXR1cm5UeXBlKCk7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHR5cGUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgcXVhbGlmaWVkIG5hbWUiLCAiamF2YS5sYW5nLlN0cmluZ1tdIiwgdHlwZUJpbmRpbmcuZ2V0UXVhbGlmaWVkTmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQkKLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMyODQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDM5MygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzkzIiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgicmVzdWx0IGlzIG5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiZXJyb3JzIGZvdW5kIiwgMCwgY29tcGlsYXRpb25Vbml0LmdldE1lc3NhZ2VzKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwobm9kZSk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIG1ldGhvZCBkZWNsYXJhdGlvbiIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLk1FVEhPRF9ERUNMQVJBVElPTik7IC8vJE5PTi1OTFMtMSQKLQkJTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIG5vZGU7Ci0JCVR5cGUgdHlwZSA9IG1ldGhvZERlY2xhcmF0aW9uLmdldFJldHVyblR5cGUoKTsKLQkJY2hlY2tTb3VyY2VSYW5nZSh0eXBlLCAiU3RyaW5nIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0eXBlLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHR5cGUgYmluZGluZyIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIGRpbWVuc2lvbiIsIDAsIHR5cGVCaW5kaW5nLmdldERpbWVuc2lvbnMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBxdWFsaWZpZWQgbmFtZSIsICJqYXZhLmxhbmcuU3RyaW5nIiwgdHlwZUJpbmRpbmcuZ2V0UXVhbGlmaWVkTmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgZGltZW5zaW9uIiwgMSwgbWV0aG9kRGVjbGFyYXRpb24uZ2V0RXh0cmFEaW1lbnNpb25zKCkpOyAvLyROT04tTkxTLTEkCi0JCUlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSBtZXRob2REZWNsYXJhdGlvbi5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBtZXRob2QgYmluZGluZyIsIG1ldGhvZEJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZzIgPSBtZXRob2RCaW5kaW5nLmdldFJldHVyblR5cGUoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIHF1YWxpZmllZCBuYW1lIiwgImphdmEubGFuZy5TdHJpbmdbXSIsIHR5cGVCaW5kaW5nMi5nZXRRdWFsaWZpZWROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBkaW1lbnNpb24iLCAxLCB0eXBlQmluZGluZzIuZ2V0RGltZW5zaW9ucygpKTsgLy8kTk9OLU5MUy0xJAotCX0JCi0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMjg0Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzOTQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDM5NCIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoInJlc3VsdCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoImVycm9ycyBmb3VuZCIsIDAsIGNvbXBpbGF0aW9uVW5pdC5nZXRNZXNzYWdlcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKG5vZGUpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBtZXRob2QgZGVjbGFyYXRpb24iLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5NRVRIT0RfREVDTEFSQVRJT04pOyAvLyROT04tTkxTLTEkCi0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBub2RlOwotCQlUeXBlIHR5cGUgPSBtZXRob2REZWNsYXJhdGlvbi5nZXRSZXR1cm5UeXBlKCk7Ci0JCWNoZWNrU291cmNlUmFuZ2UodHlwZSwgIlN0cmluZyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdHlwZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyB0eXBlIGJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBxdWFsaWZpZWQgbmFtZSIsICJqYXZhLmxhbmcuU3RyaW5nIiwgdHlwZUJpbmRpbmcuZ2V0UXVhbGlmaWVkTmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgZGltZW5zaW9uIiwgMCwgbWV0aG9kRGVjbGFyYXRpb24uZ2V0RXh0cmFEaW1lbnNpb25zKCkpOyAvLyROT04tTkxTLTEkCi0JfQkKLQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzI4NAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzk1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAzOTUiLCAiQS5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJyZXN1bHQgaXMgbm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdCBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0RXF1YWxzKCJlcnJvcnMgZm91bmQiLCAwLCBjb21waWxhdGlvblVuaXQuZ2V0TWVzc2FnZXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbChub2RlKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgbWV0aG9kIGRlY2xhcmF0aW9uIiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuTUVUSE9EX0RFQ0xBUkFUSU9OKTsgLy8kTk9OLU5MUy0xJAotCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbikgbm9kZTsKLQkJVHlwZSB0eXBlID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0UmV0dXJuVHlwZSgpOwotCQljaGVja1NvdXJjZVJhbmdlKHR5cGUsICJTdHJpbmdbXSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdHlwZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyB0eXBlIGJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBkaW1lbnNpb24iLCAxLCB0eXBlQmluZGluZy5nZXREaW1lbnNpb25zKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgcXVhbGlmaWVkIG5hbWUiLCAiamF2YS5sYW5nLlN0cmluZ1tdIiwgdHlwZUJpbmRpbmcuZ2V0UXVhbGlmaWVkTmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgZGltZW5zaW9uIiwgMSwgbWV0aG9kRGVjbGFyYXRpb24uZ2V0RXh0cmFEaW1lbnNpb25zKCkpOyAvLyROT04tTkxTLTEkCi0JCUlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSBtZXRob2REZWNsYXJhdGlvbi5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBtZXRob2QgYmluZGluZyIsIG1ldGhvZEJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZzIgPSBtZXRob2RCaW5kaW5nLmdldFJldHVyblR5cGUoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIHF1YWxpZmllZCBuYW1lIiwgImphdmEubGFuZy5TdHJpbmdbXVtdIiwgdHlwZUJpbmRpbmcyLmdldFF1YWxpZmllZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIGRpbWVuc2lvbiIsIDIsIHR5cGVCaW5kaW5nMi5nZXREaW1lbnNpb25zKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzI4NAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMzk2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDAzOTYiLCAiQS5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwobm9kZSk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIG1ldGhvZCBkZWNsYXJhdGlvbiIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLk1FVEhPRF9ERUNMQVJBVElPTik7IC8vJE5PTi1OTFMtMSQKLQkJTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kID0gKE1ldGhvZERlY2xhcmF0aW9uKSBub2RlOwotCQlTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gPSAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgbWV0aG9kLnBhcmFtZXRlcnMoKS5nZXQoMCk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgc2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLCAiZmluYWwgU3RyaW5nIHNbXSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJVHlwZSB0eXBlID0gc2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbi5nZXRUeXBlKCk7Ci0JCWNoZWNrU291cmNlUmFuZ2UodHlwZSwgIlN0cmluZyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBkaW1lbnNpb24iLCAxLCBzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLmdldEV4dHJhRGltZW5zaW9ucygpKTsgLy8kTk9OLU5MUy0xJAotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0eXBlLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHR5cGUgYmluZGluZyIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJBbiBhcnJheSBiaW5kaW5nIiwgIXR5cGVCaW5kaW5nLmlzQXJyYXkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBkaW1lbnNpb24iLCAwLCB0eXBlQmluZGluZy5nZXREaW1lbnNpb25zKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgZnVsbHkgcXVhbGlmaWVkIG5hbWUiLCAiamF2YS5sYW5nLlN0cmluZyIsIHR5cGVCaW5kaW5nLmdldFF1YWxpZmllZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IHNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24ucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdmFyaWFibGUgYmluZGluZyIsIHZhcmlhYmxlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nMiA9IHZhcmlhYmxlQmluZGluZy5nZXRUeXBlKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHR5cGUgYmluZGluZyIsIHR5cGVCaW5kaW5nMik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGFycmF5IGJpbmRpbmciLCB0eXBlQmluZGluZzIuaXNBcnJheSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIGRpbWVuc2lvbiIsIDEsIHR5cGVCaW5kaW5nMi5nZXREaW1lbnNpb25zKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgZnVsbHkgcXVhbGlmaWVkIG5hbWUiLCAiamF2YS5sYW5nLlN0cmluZ1tdIiwgdHlwZUJpbmRpbmcyLmdldFF1YWxpZmllZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMyODQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDM5NygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwMzk3IiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKG5vZGUpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBtZXRob2QgZGVjbGFyYXRpb24iLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5NRVRIT0RfREVDTEFSQVRJT04pOyAvLyROT04tTkxTLTEkCi0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZCA9IChNZXRob2REZWNsYXJhdGlvbikgbm9kZTsKLQkJU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uID0gKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIG1ldGhvZC5wYXJhbWV0ZXJzKCkuZ2V0KDApOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIHNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uoc2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiwgImZpbmFsIFN0cmluZ1tdIFxcdTAwNzNcXHUwMDVCXVtdIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlUeXBlIHR5cGUgPSBzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLmdldFR5cGUoKTsKLQkJY2hlY2tTb3VyY2VSYW5nZSh0eXBlLCAiU3RyaW5nW10iLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgZGltZW5zaW9uIiwgMiwgc2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbi5nZXRFeHRyYURpbWVuc2lvbnMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdHlwZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyB0eXBlIGJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGFycmF5IGJpbmRpbmciLCB0eXBlQmluZGluZy5pc0FycmF5KCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgZGltZW5zaW9uIiwgMSwgdHlwZUJpbmRpbmcuZ2V0RGltZW5zaW9ucygpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIndyb25nIGZ1bGx5IHF1YWxpZmllZCBuYW1lIiwgImphdmEubGFuZy5TdHJpbmdbXSIsIHR5cGVCaW5kaW5nLmdldFF1YWxpZmllZE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IHNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24ucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdmFyaWFibGUgYmluZGluZyIsIHZhcmlhYmxlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nMiA9IHZhcmlhYmxlQmluZGluZy5nZXRUeXBlKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHR5cGUgYmluZGluZyIsIHR5cGVCaW5kaW5nMik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGFycmF5IGJpbmRpbmciLCB0eXBlQmluZGluZzIuaXNBcnJheSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIGRpbWVuc2lvbiIsIDMsIHR5cGVCaW5kaW5nMi5nZXREaW1lbnNpb25zKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgZnVsbHkgcXVhbGlmaWVkIG5hbWUiLCAiamF2YS5sYW5nLlN0cmluZ1tdW11bXSIsIHR5cGVCaW5kaW5nMi5nZXRRdWFsaWZpZWROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMzYyCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzOTgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDM5OCIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbChub2RlKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuVkFSSUFCTEVfREVDTEFSQVRJT05fU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCkgbm9kZTsKLQkJTGlzdCBmcmFnbWVudHMgPSB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LmZyYWdtZW50cygpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAxLCBmcmFnbWVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgZnJhZ21lbnRzLmdldCgwKTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LmdldEluaXRpYWxpemVyKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhbiBpbmZpeCBleHByZXNzaW9uIiwgZXhwcmVzc2lvbi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuSU5GSVhfRVhQUkVTU0lPTik7IC8vJE5PTi1OTFMtMSQKLQkJSW5maXhFeHByZXNzaW9uIGluZml4RXhwcmVzc2lvbiA9IChJbmZpeEV4cHJlc3Npb24pIGV4cHJlc3Npb247Ci0JCWNoZWNrU291cmNlUmFuZ2UoaW5maXhFeHByZXNzaW9uLCAiKDEgKyAyKSAqIDMiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbjIgPSBpbmZpeEV4cHJlc3Npb24uZ2V0TGVmdE9wZXJhbmQoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIHBhcmVudGhlc2lzIGV4cHJlc3Npb24iLCBleHByZXNzaW9uMi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OKTsgLy8kTk9OLU5MUy0xJAotCQlQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBwYXJlbnRoZXNpemVkRXhwcmVzc2lvbiA9IChQYXJlbnRoZXNpemVkRXhwcmVzc2lvbikgZXhwcmVzc2lvbjI7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbjMgPSBwYXJlbnRoZXNpemVkRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhbiBpbmZpeCBleHByZXNzaW9uIiwgZXhwcmVzc2lvbjMuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLklORklYX0VYUFJFU1NJT04pOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2UoZXhwcmVzc2lvbjMsICIxICsgMiIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMzA2Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDAzOTkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDM5OSIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbChub2RlKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgbWV0aG9kIGRlY2xhcmF0aW9uIiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuTUVUSE9EX0RFQ0xBUkFUSU9OKTsgLy8kTk9OLU5MUy0xJAotCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbikgbm9kZTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgY29uc3RydWN0b3IiLCBtZXRob2REZWNsYXJhdGlvbi5pc0NvbnN0cnVjdG9yKCkpOyAvLyROT04tTkxTLTEkCi0JCUJsb2NrIGJsb2NrID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0Qm9keSgpOwotCQlMaXN0IHN0YXRlbWVudHMgPSBibG9jay5zdGF0ZW1lbnRzKCk7Ci0JCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDIsIHN0YXRlbWVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0JCi0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMzA2Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDA0MDAoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDQwMCIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbChub2RlKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgbWV0aG9kIGRlY2xhcmF0aW9uIiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuTUVUSE9EX0RFQ0xBUkFUSU9OKTsgLy8kTk9OLU5MUy0xJAotCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbikgbm9kZTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgY29uc3RydWN0b3IiLCBtZXRob2REZWNsYXJhdGlvbi5pc0NvbnN0cnVjdG9yKCkpOyAvLyROT04tTkxTLTEkCi0JCUJsb2NrIGJsb2NrID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0Qm9keSgpOwotCQlMaXN0IHN0YXRlbWVudHMgPSBibG9jay5zdGF0ZW1lbnRzKCk7Ci0JCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDMsIHN0YXRlbWVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlTdGF0ZW1lbnQgc3RhdGVtZW50ID0gKFN0YXRlbWVudCkgc3RhdGVtZW50cy5nZXQoMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhbiBzdXBlcmNvbnN0cnVjdG9yaW52b2NhdGlvbiIsIHN0YXRlbWVudC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuU1VQRVJfQ09OU1RSVUNUT1JfSU5WT0NBVElPTik7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShzdGF0ZW1lbnQsICJzdXBlcigpOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9CQotfQotCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZG9tL0FTVENvbnZlcnRlclRlc3QyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZG9tL0FTVENvbnZlcnRlclRlc3QyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYjBjMWIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2RvbS9BU1RDb252ZXJ0ZXJUZXN0Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuZG9tOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLio7Ci0KLXB1YmxpYyBjbGFzcyBBU1RDb252ZXJ0ZXJUZXN0MiBleHRlbmRzIENvbnZlcnRlclRlc3RTZXR1cCB7Ci0JCi0JcHVibGljIEFTVENvbnZlcnRlclRlc3QyKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFN1aXRlKEFTVENvbnZlcnRlclRlc3QyLmNsYXNzLmdldE5hbWUoKSk7CQkKLQotCQlpZiAodHJ1ZSkgewotCQkJQ2xhc3MgYyA9IEFTVENvbnZlcnRlclRlc3QyLmNsYXNzOwotCQkJTWV0aG9kW10gbWV0aG9kcyA9IGMuZ2V0TWV0aG9kcygpOwotCQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG1ldGhvZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCQlpZiAobWV0aG9kc1tpXS5nZXROYW1lKCkuc3RhcnRzV2l0aCgidGVzdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc3VpdGUuYWRkVGVzdChuZXcgQVNUQ29udmVydGVyVGVzdDIobWV0aG9kc1tpXS5nZXROYW1lKCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc3VpdGU7Ci0JCX0KLQkJc3VpdGUuYWRkVGVzdChuZXcgQVNUQ29udmVydGVyVGVzdDIoInRlc3QwNDcwIikpOwkJCQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI1NjAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQwMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDAxIiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKG5vZGUpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBtZXRob2QgZGVjbGFyYXRpb24iLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5NRVRIT0RfREVDTEFSQVRJT04pOyAvLyROT04tTkxTLTEkCi0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBub2RlOwotCQlCbG9jayBibG9jayA9IG1ldGhvZERlY2xhcmF0aW9uLmdldEJvZHkoKTsKLQkJTGlzdCBzdGF0ZW1lbnRzID0gYmxvY2suc3RhdGVtZW50cygpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAxLCBzdGF0ZW1lbnRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RhdGVtZW50IHN0YXRlbWVudCA9IChTdGF0ZW1lbnQpIHN0YXRlbWVudHMuZ2V0KDApOwotCQlhc3NlcnRUcnVlKCJOb3QgYSByZXR1cm4gc3RhdGVtZW50Iiwgc3RhdGVtZW50LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5SRVRVUk5fU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlSZXR1cm5TdGF0ZW1lbnQgcmV0dXJuU3RhdGVtZW50ID0gKFJldHVyblN0YXRlbWVudCkgc3RhdGVtZW50OwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSByZXR1cm5TdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpOwotCQlhc3NlcnROb3ROdWxsKCJ0aGVyZSBpcyBubyBleHByZXNzaW9uIiwgZXhwcmVzc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gY2FsbCB0aGUgZGVmYXVsdCBpbml0aWFsaXphdGlvbgotCQltZXRob2REZWNsYXJhdGlvbi5nZXRSZXR1cm5UeXBlKCk7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IGV4cHJlc3Npb24ucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHR5cGViaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJpbnQiLCB0eXBlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9CQotCQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM0NjQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQwMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDAyIiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDEsIDAsIDApOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBwcm9ibGVtcyIsIDAsICgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQpLmdldFByb2JsZW1zKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKG5vZGUpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBzdXBlciBtZXRob2QgaW52b2NhdGlvbiIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlNVUEVSX0NPTlNUUlVDVE9SX0lOVk9DQVRJT04pOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgIm5ldyBBKCkuc3VwZXIoKTsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQkKLQkKLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNTk3Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDA0MDMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDQwMyIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAxLCAwLCAxKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgcHJvYmxlbXMiLCAxLCAoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0KS5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChub2RlKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGV4cHJlc3Npb24gc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuRVhQUkVTU0lPTl9TVEFURU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCUV4cHJlc3Npb25TdGF0ZW1lbnQgZXhwcmVzc2lvblN0YXRlbWVudCA9IChFeHByZXNzaW9uU3RhdGVtZW50KSBub2RlOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBleHByZXNzaW9uU3RhdGVtZW50LmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgbWV0aG9kIGludm9jYXRpb24iLCBleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5NRVRIT0RfSU5WT0NBVElPTik7IC8vJE5PTi1OTFMtMSQKLQkJTWV0aG9kSW52b2NhdGlvbiBtZXRob2RJbnZvY2F0aW9uID0gKE1ldGhvZEludm9jYXRpb24pIGV4cHJlc3Npb247Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbjIgPSBtZXRob2RJbnZvY2F0aW9uLmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgc2ltcGxlIG5hbWUiLCBleHByZXNzaW9uMi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuU0lNUExFX05BTUUpOyAvLyROT04tTkxTLTEkCi0JCVNpbXBsZU5hbWUgc2ltcGxlTmFtZSA9IChTaW1wbGVOYW1lKSBleHByZXNzaW9uMjsKLQkJSUJpbmRpbmcgYmluZGluZyAgPSBzaW1wbGVOYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCBiaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJ3cm9uZyB0eXBlIiwgYmluZGluZy5nZXRLaW5kKCkgPT0gSUJpbmRpbmcuVkFSSUFCTEUpOyAvLyROT04tTkxTLTEkCi0JCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gKElWYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmc7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJ0ZXN0IiwgdmFyaWFibGVCaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTaW1wbGVOYW1lIHNpbXBsZU5hbWUyID0gbWV0aG9kSW52b2NhdGlvbi5nZXROYW1lKCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJjbG9uZSIsIHNpbXBsZU5hbWUyLmdldElkZW50aWZpZXIoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlJQmluZGluZyBiaW5kaW5nMiA9IHNpbXBsZU5hbWUyLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIm5vIGJpbmRpbmcyIiwgYmluZGluZzIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIldyb25nIHR5cGUiLCBiaW5kaW5nMi5nZXRLaW5kKCkgPT0gSUJpbmRpbmcuTUVUSE9EKTsgLy8kTk9OLU5MUy0xJAotCQlJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gKElNZXRob2RCaW5kaW5nKSBiaW5kaW5nMjsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgImNsb25lIiwgbWV0aG9kQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZzIgPSBtZXRob2RJbnZvY2F0aW9uLnJlc29sdmVNZXRob2RCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIG1ldGhvZCBiaW5kaW5nMiIsIG1ldGhvZEJpbmRpbmcyKTsKLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgYmluZGluZyIsIG1ldGhvZEJpbmRpbmcgPT0gbWV0aG9kQmluZGluZzIpOwotCX0JCi0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNTk3Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDA0MDQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDQwNCIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAxKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgcHJvYmxlbXMiLCAxLCAoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0KS5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChub2RlKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGV4cHJlc3Npb24gc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuRVhQUkVTU0lPTl9TVEFURU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCUV4cHJlc3Npb25TdGF0ZW1lbnQgZXhwcmVzc2lvblN0YXRlbWVudCA9IChFeHByZXNzaW9uU3RhdGVtZW50KSBub2RlOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBleHByZXNzaW9uU3RhdGVtZW50LmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgbWV0aG9kIGludm9jYXRpb24iLCBleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5NRVRIT0RfSU5WT0NBVElPTik7IC8vJE5PTi1OTFMtMSQKLQkJTWV0aG9kSW52b2NhdGlvbiBtZXRob2RJbnZvY2F0aW9uID0gKE1ldGhvZEludm9jYXRpb24pIGV4cHJlc3Npb247Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbjIgPSBtZXRob2RJbnZvY2F0aW9uLmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgc2ltcGxlIG5hbWUiLCBleHByZXNzaW9uMi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuU0lNUExFX05BTUUpOyAvLyROT04tTkxTLTEkCi0JCVNpbXBsZU5hbWUgc2ltcGxlTmFtZSA9IChTaW1wbGVOYW1lKSBleHByZXNzaW9uMjsKLQkJSUJpbmRpbmcgYmluZGluZyAgPSBzaW1wbGVOYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCBiaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJ3cm9uZyB0eXBlIiwgYmluZGluZy5nZXRLaW5kKCkgPT0gSUJpbmRpbmcuVkFSSUFCTEUpOyAvLyROT04tTkxTLTEkCi0JCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gKElWYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmc7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJhIiwgdmFyaWFibGVCaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTaW1wbGVOYW1lIHNpbXBsZU5hbWUyID0gbWV0aG9kSW52b2NhdGlvbi5nZXROYW1lKCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJjbG9uZSIsIHNpbXBsZU5hbWUyLmdldElkZW50aWZpZXIoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlJQmluZGluZyBiaW5kaW5nMiA9IHNpbXBsZU5hbWUyLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIm5vIGJpbmRpbmcyIiwgYmluZGluZzIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIldyb25nIHR5cGUiLCBiaW5kaW5nMi5nZXRLaW5kKCkgPT0gSUJpbmRpbmcuTUVUSE9EKTsgLy8kTk9OLU5MUy0xJAotCQlJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gKElNZXRob2RCaW5kaW5nKSBiaW5kaW5nMjsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgImNsb25lIiwgbWV0aG9kQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9CQotCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzU5NwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwNDA1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDA0MDUiLCAiQS5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCwgMSwgMCwgMSk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHByb2JsZW1zIiwgMSwgKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCkuZ2V0UHJvYmxlbXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwobm9kZSk7Ci0JCWFzc2VydFRydWUoIk5vdCBhbiBleHByZXNzaW9uIHN0YXRlbWVudCIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkVYUFJFU1NJT05fU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlFeHByZXNzaW9uU3RhdGVtZW50IGV4cHJlc3Npb25TdGF0ZW1lbnQgPSAoRXhwcmVzc2lvblN0YXRlbWVudCkgbm9kZTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gZXhwcmVzc2lvblN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIG1ldGhvZCBpbnZvY2F0aW9uIiwgZXhwcmVzc2lvbi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuTUVUSE9EX0lOVk9DQVRJT04pOyAvLyROT04tTkxTLTEkCi0JCU1ldGhvZEludm9jYXRpb24gbWV0aG9kSW52b2NhdGlvbiA9IChNZXRob2RJbnZvY2F0aW9uKSBleHByZXNzaW9uOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24yID0gbWV0aG9kSW52b2NhdGlvbi5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHNpbXBsZSBuYW1lIiwgZXhwcmVzc2lvbjIuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlNJTVBMRV9OQU1FKTsgLy8kTk9OLU5MUy0xJAotCQlTaW1wbGVOYW1lIHNpbXBsZU5hbWUgPSAoU2ltcGxlTmFtZSkgZXhwcmVzc2lvbjI7Ci0JCUlCaW5kaW5nIGJpbmRpbmcgID0gc2ltcGxlTmFtZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgYmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgid3JvbmcgdHlwZSIsIGJpbmRpbmcuZ2V0S2luZCgpID09IElCaW5kaW5nLlZBUklBQkxFKTsgLy8kTk9OLU5MUy0xJAotCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IChJVmFyaWFibGVCaW5kaW5nKSBiaW5kaW5nOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCAiYSIsIHZhcmlhYmxlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU2ltcGxlTmFtZSBzaW1wbGVOYW1lMiA9IG1ldGhvZEludm9jYXRpb24uZ2V0TmFtZSgpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCAiY2xvbmUiLCBzaW1wbGVOYW1lMi5nZXRJZGVudGlmaWVyKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJSUJpbmRpbmcgYmluZGluZzIgPSBzaW1wbGVOYW1lMi5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJubyBiaW5kaW5nMiIsIGJpbmRpbmcyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJXcm9uZyB0eXBlIiwgYmluZGluZzIuZ2V0S2luZCgpID09IElCaW5kaW5nLk1FVEhPRCk7IC8vJE5PTi1OTFMtMSQKLQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IChJTWV0aG9kQmluZGluZykgYmluZGluZzI7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJjbG9uZSIsIG1ldGhvZEJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQkKLQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM1OTcKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQwNigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDA2IiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwLCAxKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgcHJvYmxlbXMiLCAxLCAoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0KS5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChub2RlKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGV4cHJlc3Npb24gc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuRVhQUkVTU0lPTl9TVEFURU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCUV4cHJlc3Npb25TdGF0ZW1lbnQgZXhwcmVzc2lvblN0YXRlbWVudCA9IChFeHByZXNzaW9uU3RhdGVtZW50KSBub2RlOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBleHByZXNzaW9uU3RhdGVtZW50LmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgbWV0aG9kIGludm9jYXRpb24iLCBleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5NRVRIT0RfSU5WT0NBVElPTik7IC8vJE5PTi1OTFMtMSQKLQkJTWV0aG9kSW52b2NhdGlvbiBtZXRob2RJbnZvY2F0aW9uID0gKE1ldGhvZEludm9jYXRpb24pIGV4cHJlc3Npb247Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbjIgPSBtZXRob2RJbnZvY2F0aW9uLmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgc2ltcGxlIG5hbWUiLCBleHByZXNzaW9uMi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuU0lNUExFX05BTUUpOyAvLyROT04tTkxTLTEkCi0JCVNpbXBsZU5hbWUgc2ltcGxlTmFtZSA9IChTaW1wbGVOYW1lKSBleHByZXNzaW9uMjsKLQkJSUJpbmRpbmcgYmluZGluZyAgPSBzaW1wbGVOYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCBiaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJ3cm9uZyB0eXBlIiwgYmluZGluZy5nZXRLaW5kKCkgPT0gSUJpbmRpbmcuVkFSSUFCTEUpOyAvLyROT04tTkxTLTEkCi0JCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gKElWYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmc7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJhIiwgdmFyaWFibGVCaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTaW1wbGVOYW1lIHNpbXBsZU5hbWUyID0gbWV0aG9kSW52b2NhdGlvbi5nZXROYW1lKCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJmb28iLCBzaW1wbGVOYW1lMi5nZXRJZGVudGlmaWVyKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJSUJpbmRpbmcgYmluZGluZzIgPSBzaW1wbGVOYW1lMi5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJubyBiaW5kaW5nMiIsIGJpbmRpbmcyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJXcm9uZyB0eXBlIiwgYmluZGluZzIuZ2V0S2luZCgpID09IElCaW5kaW5nLk1FVEhPRCk7IC8vJE5PTi1OTFMtMSQKLQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IChJTWV0aG9kQmluZGluZykgYmluZGluZzI7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJmb28iLCBtZXRob2RCaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnROdWxsKCJHb3QgYSBkZWNsYXJpbmcgbm9kZSBpbiB0aGUgdW5pdCIsIHVuaXQuZmluZERlY2xhcmluZ05vZGUobWV0aG9kQmluZGluZykpOwotCX0JCi0KLQkvKioKLQkgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMTYyCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDA0MDcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDQwNyIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHByb2JsZW1zIiwgMCwgKChDb21waWxhdGlvblVuaXQpIHJlc3VsdCkuZ2V0UHJvYmxlbXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0LCAwLCAwKTsKLQkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydE5vdE51bGwobm9kZSk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIG1ldGhvZCBkZWNsYXJhdGlvbiIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLk1FVEhPRF9ERUNMQVJBVElPTik7IC8vJE5PTi1OTFMtMSQKLQkJTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIG5vZGU7Ci0JCVNpbXBsZU5hbWUgc2ltcGxlTmFtZSA9IG1ldGhvZERlY2xhcmF0aW9uLmdldE5hbWUoKTsKLQkJSUJpbmRpbmcgYmluZGluZyA9IHNpbXBsZU5hbWUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZyIsIGJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhIG1ldGhvZCBiaW5kaW5nIiwgYmluZGluZy5nZXRLaW5kKCkgPT0gSUJpbmRpbmcuTUVUSE9EKTsgLy8kTk9OLU5MUy0xJAotCQlJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nID0gKElNZXRob2RCaW5kaW5nKSBiaW5kaW5nOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAiZm9vIiwgbWV0aG9kQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbWV0aG9kRGVjbGFyYXRpb24uc2V0TmFtZShtZXRob2REZWNsYXJhdGlvbi5nZXRBU1QoKS5uZXdTaW1wbGVOYW1lKCJmb28yIikpOyAvLyROT04tTkxTLTEkCi0JCUlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcyID0gbWV0aG9kRGVjbGFyYXRpb24ucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gbWV0aG9kYmluZGluZzIiLCBtZXRob2RCaW5kaW5nMik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgImZvbyIsIG1ldGhvZEJpbmRpbmcyLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzaW1wbGVOYW1lID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0TmFtZSgpOwotCQlJQmluZGluZyBiaW5kaW5nMiA9IHNpbXBsZU5hbWUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0TnVsbCgiR290IGEgYmluZGluZzIiLCBiaW5kaW5nMik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUFTVE5vZGUgYXN0Tm9kZSA9IHVuaXQuZmluZERlY2xhcmluZ05vZGUobWV0aG9kQmluZGluZyk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGRlY2xhcmluZyBub2RlIiwgYXN0Tm9kZSk7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgZGVjbGFyaW5nIG5vZGUiLCBtZXRob2REZWNsYXJhdGlvbiwgYXN0Tm9kZSk7Ci0JfQotCQotCS8qKgotCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMxNjIKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQwOCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDA4IiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgcHJvYmxlbXMiLCAwLCAoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0KS5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKG5vZGUpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBtZXRob2QgZGVjbGFyYXRpb24iLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5NRVRIT0RfREVDTEFSQVRJT04pOyAvLyROT04tTkxTLTEkCi0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBub2RlOwotCQlUeXBlIHR5cGUgPSBtZXRob2REZWNsYXJhdGlvbi5nZXRSZXR1cm5UeXBlKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHNpbXBsZSB0eXBlIiwgdHlwZS5pc1NpbXBsZVR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJU2ltcGxlVHlwZSBzaW1wbGVUeXBlID0gKFNpbXBsZVR5cGUpIHR5cGU7Ci0JCU5hbWUgbmFtZSA9IHNpbXBsZVR5cGUuZ2V0TmFtZSgpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBxdWFsaWZpZWQgbmFtZSIsIG5hbWUuaXNRdWFsaWZpZWROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCVF1YWxpZmllZE5hbWUgcXVhbGlmaWVkTmFtZSA9IChRdWFsaWZpZWROYW1lKSBuYW1lOwotCQluYW1lID0gcXVhbGlmaWVkTmFtZS5nZXRRdWFsaWZpZXIoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgcXVhbGlmaWVkIG5hbWUiLCBuYW1lLmlzUXVhbGlmaWVkTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlxdWFsaWZpZWROYW1lID0gKFF1YWxpZmllZE5hbWUpIG5hbWU7Ci0JCW5hbWUgPSBxdWFsaWZpZWROYW1lLmdldFF1YWxpZmllcigpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBzaW1wbGUgbmFtZSIsIG5hbWUuaXNTaW1wbGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCVNpbXBsZU5hbWUgc2ltcGxlTmFtZSA9IChTaW1wbGVOYW1lKSBuYW1lOwotCQlJQmluZGluZyBiaW5kaW5nID0gc2ltcGxlTmFtZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgYmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgcGFja2FnZSBiaW5kaW5nIiwgYmluZGluZy5nZXRLaW5kKCkgPT0gSUJpbmRpbmcuUEFDS0FHRSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgImphdmEiLCBiaW5kaW5nLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQkJCi0JLyoqCi0JICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzE2MgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwNDA5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUhhc2h0YWJsZSBvcHRpb25zID0gSmF2YUNvcmUuZ2V0T3B0aW9ucygpOwotCQlIYXNodGFibGUgbmV3T3B0aW9ucyA9IEphdmFDb3JlLmdldE9wdGlvbnMoKTsKLQkJdHJ5IHsKLQkJCW5ld09wdGlvbnMucHV0KEphdmFDb3JlLkNPTVBJTEVSX1NPVVJDRSwgSmF2YUNvcmUuVkVSU0lPTl8xXzQpOwotCQkJSmF2YUNvcmUuc2V0T3B0aW9ucyhuZXdPcHRpb25zKTsKLQkJCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDA0MDkiLCAiQS5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJCWFzc2VydFRydWUoIk5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkNPTVBJTEFUSU9OX1VOSVQpOyAvLyROT04tTkxTLTEkCi0JCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OyAKLQkJCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHByb2JsZW1zIiwgMSwgY29tcGlsYXRpb25Vbml0LmdldFByb2JsZW1zKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHByb2JsZW0iLCAiVGhlIGltcG9ydCBqYXZhLmxhbmcgaXMgbmV2ZXIgdXNlZCIsIGNvbXBpbGF0aW9uVW5pdC5nZXRQcm9ibGVtcygpWzBdLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJQmluZGluZ3NDb2xsZWN0b3JWaXNpdG9yIGJpbmRpbmdzQ29sbGVjdG9yVmlzaXRvciA9IG5ldyBCaW5kaW5nc0NvbGxlY3RvclZpc2l0b3IoKTsKLQkJCWNvbXBpbGF0aW9uVW5pdC5hY2NlcHQoYmluZGluZ3NDb2xsZWN0b3JWaXNpdG9yKTsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbnVtYmVyIiwgMywgYmluZGluZ3NDb2xsZWN0b3JWaXNpdG9yLmdldFVucmVzb2x2ZWROb2Rlc1NldCgpLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCU1hcCBiaW5kaW5nc01hcCA9IGJpbmRpbmdzQ29sbGVjdG9yVmlzaXRvci5nZXRCaW5kaW5nc01hcCgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIiLCAxODcsIGJpbmRpbmdzTWFwLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUFTVE5vZGVzQ29sbGVjdG9yVmlzaXRvciBub2Rlc0NvbGxlY3RvciA9IG5ldyBBU1ROb2Rlc0NvbGxlY3RvclZpc2l0b3IoKTsKLQkJCWNvbXBpbGF0aW9uVW5pdC5hY2NlcHQobm9kZXNDb2xsZWN0b3IpOwotCQkJU2V0IGRldGFjaGVkTm9kZXMgPSBub2Rlc0NvbGxlY3Rvci5nZXREZXRhY2hlZEFzdE5vZGVzKCk7Ci0JCQlpbnQgY291bnRlciA9IDA7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGV0YWNoZWROb2Rlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkgewotCQkJCUFTVE5vZGUgZGV0YWNoZWROb2RlID0gKEFTVE5vZGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQljb3VudGVyKys7Ci0JCQkJSUJpbmRpbmcgYmluZGluZyA9IChJQmluZGluZykgYmluZGluZ3NNYXAuZ2V0KGRldGFjaGVkTm9kZSk7Ci0JCQkJYXNzZXJ0Tm90TnVsbChiaW5kaW5nKTsKLQkJCQlzd2l0Y2goZGV0YWNoZWROb2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCQkJY2FzZSBBU1ROb2RlLkFSUkFZX0FDQ0VTUyA6Ci0JCQkJCWNhc2UgQVNUTm9kZS5BUlJBWV9DUkVBVElPTiA6Ci0JCQkJCWNhc2UgQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUiA6Ci0JCQkJCWNhc2UgQVNUTm9kZS5BU1NJR05NRU5UIDoKLQkJCQkJY2FzZSBBU1ROb2RlLkJPT0xFQU5fTElURVJBTCA6Ci0JCQkJCWNhc2UgQVNUTm9kZS5DQVNUX0VYUFJFU1NJT04gOgotCQkJCQljYXNlIEFTVE5vZGUuQ0hBUkFDVEVSX0xJVEVSQUwgOgotCQkJCQljYXNlIEFTVE5vZGUuQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT04gOgotCQkJCQljYXNlIEFTVE5vZGUuQ09ORElUSU9OQUxfRVhQUkVTU0lPTiA6Ci0JCQkJCWNhc2UgQVNUTm9kZS5GSUVMRF9BQ0NFU1MgOgotCQkJCQljYXNlIEFTVE5vZGUuSU5GSVhfRVhQUkVTU0lPTiA6Ci0JCQkJCWNhc2UgQVNUTm9kZS5JTlNUQU5DRU9GX0VYUFJFU1NJT04gOgotCQkJCQljYXNlIEFTVE5vZGUuTUVUSE9EX0lOVk9DQVRJT04gOgotCQkJCQljYXNlIEFTVE5vZGUuTlVMTF9MSVRFUkFMIDoKLQkJCQkJY2FzZSBBU1ROb2RlLk5VTUJFUl9MSVRFUkFMIDoKLQkJCQkJY2FzZSBBU1ROb2RlLlBPU1RGSVhfRVhQUkVTU0lPTiA6Ci0JCQkJCWNhc2UgQVNUTm9kZS5QUkVGSVhfRVhQUkVTU0lPTiA6Ci0JCQkJCWNhc2UgQVNUTm9kZS5USElTX0VYUFJFU1NJT04gOgotCQkJCQljYXNlIEFTVE5vZGUuVFlQRV9MSVRFUkFMIDoKLQkJCQkJY2FzZSBBU1ROb2RlLlZBUklBQkxFX0RFQ0xBUkFUSU9OX0VYUFJFU1NJT04gOgotCQkJCQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gKChFeHByZXNzaW9uKSBkZXRhY2hlZE5vZGUpLnJlc29sdmVUeXBlQmluZGluZygpOwotCQkJCQkJaWYgKCFiaW5kaW5nLmVxdWFscyh0eXBlQmluZGluZykpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZGV0YWNoZWROb2RlKTsKLQkJCQkJCX0KLQkJCQkJCWFzc2VydFRydWUoImJpbmRpbmcgbm90IGVxdWFscyIsIGJpbmRpbmcuZXF1YWxzKHR5cGVCaW5kaW5nKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJyZWFrOwkJCQkJCQotCQkJCQljYXNlIEFTVE5vZGUuVkFSSUFCTEVfREVDTEFSQVRJT05fRlJBR01FTlQgOgotCQkJCQkJYXNzZXJ0VHJ1ZSgiYmluZGluZyBub3QgZXF1YWxzIiwgYmluZGluZy5lcXVhbHMoKChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGRldGFjaGVkTm9kZSkucmVzb2x2ZUJpbmRpbmcoKSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlicmVhazsJCQkJCQkKLQkJCQkJY2FzZSBBU1ROb2RlLkFOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTiA6Ci0JCQkJCQlhc3NlcnRUcnVlKCJiaW5kaW5nIG5vdCBlcXVhbHMiLCBiaW5kaW5nLmVxdWFscygoKEFub255bW91c0NsYXNzRGVjbGFyYXRpb24pIGRldGFjaGVkTm9kZSkucmVzb2x2ZUJpbmRpbmcoKSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBBU1ROb2RlLlFVQUxJRklFRF9OQU1FIDoKLQkJCQkJY2FzZSBBU1ROb2RlLlNJTVBMRV9OQU1FIDoKLQkJCQkJCUlCaW5kaW5nIG5ld0JpbmRpbmcgPSAoKE5hbWUpIGRldGFjaGVkTm9kZSkucmVzb2x2ZUJpbmRpbmcoKTsKLQkJCQkJCWFzc2VydFRydWUoImJpbmRpbmcgbm90IGVxdWFscyIsIGJpbmRpbmcuZXF1YWxzKG5ld0JpbmRpbmcpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgQVNUTm9kZS5BUlJBWV9UWVBFIDoKLQkJCQkJY2FzZSBBU1ROb2RlLlNJTVBMRV9UWVBFIDoKLQkJCQkJY2FzZSBBU1ROb2RlLlBSSU1JVElWRV9UWVBFIDoKLQkJCQkJCWFzc2VydFRydWUoImJpbmRpbmcgbm90IGVxdWFscyIsIGJpbmRpbmcuZXF1YWxzKCgoVHlwZSkgZGV0YWNoZWROb2RlKS5yZXNvbHZlQmluZGluZygpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEFTVE5vZGUuQ09OU1RSVUNUT1JfSU5WT0NBVElPTiA6Ci0JCQkJCQlhc3NlcnRUcnVlKCJiaW5kaW5nIG5vdCBlcXVhbHMiLCBiaW5kaW5nLmVxdWFscygoKENvbnN0cnVjdG9ySW52b2NhdGlvbikgZGV0YWNoZWROb2RlKS5yZXNvbHZlQ29uc3RydWN0b3JCaW5kaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgQVNUTm9kZS5JTVBPUlRfREVDTEFSQVRJT04gOgotCQkJCQkJYXNzZXJ0VHJ1ZSgiYmluZGluZyBub3QgZXF1YWxzIiwgYmluZGluZy5lcXVhbHMoKChJbXBvcnREZWNsYXJhdGlvbikgZGV0YWNoZWROb2RlKS5yZXNvbHZlQmluZGluZygpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEFTVE5vZGUuTUVUSE9EX0RFQ0xBUkFUSU9OIDoKLQkJCQkJCWFzc2VydFRydWUoImJpbmRpbmcgbm90IGVxdWFscyIsIGJpbmRpbmcuZXF1YWxzKCgoTWV0aG9kRGVjbGFyYXRpb24pIGRldGFjaGVkTm9kZSkucmVzb2x2ZUJpbmRpbmcoKSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBBU1ROb2RlLlBBQ0tBR0VfREVDTEFSQVRJT04gOgotCQkJCQkJYXNzZXJ0VHJ1ZSgiYmluZGluZyBub3QgZXF1YWxzIiwgYmluZGluZy5lcXVhbHMoKChQYWNrYWdlRGVjbGFyYXRpb24pIGRldGFjaGVkTm9kZSkucmVzb2x2ZUJpbmRpbmcoKSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBBU1ROb2RlLlRZUEVfREVDTEFSQVRJT04gOgotCQkJCQkJYXNzZXJ0VHJ1ZSgiYmluZGluZyBub3QgZXF1YWxzIiwgYmluZGluZy5lcXVhbHMoKChUeXBlRGVjbGFyYXRpb24pIGRldGFjaGVkTm9kZSkucmVzb2x2ZUJpbmRpbmcoKSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlKYXZhQ29yZS5zZXRPcHRpb25zKG9wdGlvbnMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGVzdCBmb3IgbWVzc2FnZSBvbiBqZHQtY29yZS1kZXYKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQxMCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDEwIiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgcHJvYmxlbXMiLCAwLCAoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0KS5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKG5vZGUpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSByZXR1cm4gc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuUkVUVVJOX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gKChSZXR1cm5TdGF0ZW1lbnQpIG5vZGUpLmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGluZml4IGV4cHJlc3Npb24iLCBleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5JTkZJWF9FWFBSRVNTSU9OKTsgLy8kTk9OLU5MUy0xJAotCQlJbmZpeEV4cHJlc3Npb24gaW5maXhFeHByZXNzaW9uID0gKEluZml4RXhwcmVzc2lvbikgZXhwcmVzc2lvbjsKLQkJTGlzdCBleHRlbmRlZE9wZXJhbmRzID0gaW5maXhFeHByZXNzaW9uLmV4dGVuZGVkT3BlcmFuZHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMywgZXh0ZW5kZWRPcGVyYW5kcy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGVzdCBmb3IgbWVzc2FnZSBvbiBqZHQtY29yZS1kZXYKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQxMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDExIiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgcHJvYmxlbXMiLCAwLCAoKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0KS5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKG5vZGUpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSByZXR1cm4gc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuUkVUVVJOX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gKChSZXR1cm5TdGF0ZW1lbnQpIG5vZGUpLmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGluZml4IGV4cHJlc3Npb24iLCBleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5JTkZJWF9FWFBSRVNTSU9OKTsgLy8kTk9OLU5MUy0xJAotCQlJbmZpeEV4cHJlc3Npb24gaW5maXhFeHByZXNzaW9uID0gKEluZml4RXhwcmVzc2lvbikgZXhwcmVzc2lvbjsKLQkJTGlzdCBleHRlbmRlZE9wZXJhbmRzID0gaW5maXhFeHByZXNzaW9uLmV4dGVuZGVkT3BlcmFuZHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMCwgZXh0ZW5kZWRPcGVyYW5kcy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzOTAxCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDA0MTIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDQxMiIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkNPTVBJTEFUSU9OX1VOSVQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBwcm9ibGVtcyIsIDAsIHVuaXQuZ2V0UHJvYmxlbXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUodW5pdCwgMCk7Ci0JCWFzc2VydE5vdE51bGwobm9kZSk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHR5cGUgZGVjbGFyYXRpb24iLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5UWVBFX0RFQ0xBUkFUSU9OKTsgLy8kTk9OLU5MUy0xJAotCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgbm9kZTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGFuIGludGVyZmFjZSIsIHR5cGVEZWNsYXJhdGlvbi5pc0ludGVyZmFjZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0eXBlRGVjbGFyYXRpb24ucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoIk5vIGRlY2xhcmluZyBub2RlIiwgdW5pdC5maW5kRGVjbGFyaW5nTm9kZSh0eXBlQmluZGluZykpOyAvLyROT04tTkxTLTEkCi0JCU5hbWUgbmFtZSA9IHR5cGVEZWNsYXJhdGlvbi5nZXROYW1lKCk7Ci0JCUlCaW5kaW5nIGJpbmRpbmcgPSBuYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCBiaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlBU1ROb2RlIGRlY2xhcmluZ05vZGUgPSB1bml0LmZpbmREZWNsYXJpbmdOb2RlKGJpbmRpbmcpOwotCQlhc3NlcnROb3ROdWxsKCJObyBkZWNsYXJpbmcgbm9kZSIsIGRlY2xhcmluZ05vZGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgbm9kZSIsIHR5cGVEZWNsYXJhdGlvbiwgZGVjbGFyaW5nTm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJdHlwZUJpbmRpbmcgPSBuYW1lLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyB0eXBlIGJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJZGVjbGFyaW5nTm9kZSA9IHVuaXQuZmluZERlY2xhcmluZ05vZGUodHlwZUJpbmRpbmcpOwotCQlhc3NlcnROb3ROdWxsKCJObyBkZWNsYXJpbmcgbm9kZSIsIGRlY2xhcmluZ05vZGUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3Jvbmcgbm9kZSIsIHR5cGVEZWNsYXJhdGlvbiwgZGVjbGFyaW5nTm9kZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDg4MQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwNDEzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDA0MTMiLCAiQS5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnRUcnVlKCJub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5DT01QSUxBVElPTl9VTklUKTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgdW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgcHJvYmxlbXMiLCAxLCB1bml0LmdldFByb2JsZW1zKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKHVuaXQsIDEsIDApOwotCQlhc3NlcnROb3ROdWxsKG5vZGUpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBtZXRob2QgZGVjbGFyYXRpb24iLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5NRVRIT0RfREVDTEFSQVRJT04pOyAvLyROT04tTkxTLTEkCi0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBub2RlOwotCQlMaXN0IHRocm93c0V4Y2VwdGlvbiA9IG1ldGhvZERlY2xhcmF0aW9uLnRocm93bkV4Y2VwdGlvbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMiwgdGhyb3dzRXhjZXB0aW9uLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJTmFtZSBuYW1lID0gKE5hbWUpIHRocm93c0V4Y2VwdGlvbi5nZXQoMCk7Ci0JCUlCaW5kaW5nIGJpbmRpbmcgPSBuYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE51bGwoIkdvdCBhIGJpbmRpbmciLCBiaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNzM0Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDA0MTQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDQxNCIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkNPTVBJTEFUSU9OX1VOSVQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBwcm9ibGVtcyIsIDAsIHVuaXQuZ2V0UHJvYmxlbXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUodW5pdCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwobm9kZSk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIG1ldGhvZCBkZWNsYXJhdGlvbiIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLk1FVEhPRF9ERUNMQVJBVElPTik7IC8vJE5PTi1OTFMtMSQKLQkJTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIG5vZGU7Ci0JCVR5cGUgdHlwZSA9IG1ldGhvZERlY2xhcmF0aW9uLmdldFJldHVyblR5cGUoKTsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdHlwZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyB0eXBlIGJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBkZWNsYXJpbmdOb2RlID0gdW5pdC5maW5kRGVjbGFyaW5nTm9kZSh0eXBlQmluZGluZyk7Ci0JCWFzc2VydE51bGwoIkdvdCBhIGRlY2xhcmluZyBub2RlIiwgZGVjbGFyaW5nTm9kZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlub2RlID0gZ2V0QVNUTm9kZSh1bml0LCAwLCAxKTsKLQkJYXNzZXJ0Tm90TnVsbChub2RlKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgbWV0aG9kIGRlY2xhcmF0aW9uIiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuTUVUSE9EX0RFQ0xBUkFUSU9OKTsgLy8kTk9OLU5MUy0xJAotCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbjIgPSAoTWV0aG9kRGVjbGFyYXRpb24pIG5vZGU7Ci0JCVR5cGUgdHlwZTIgPSBtZXRob2REZWNsYXJhdGlvbjIuZ2V0UmV0dXJuVHlwZSgpOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcyID0gdHlwZTIucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcyKTsgLy8kTk9OLU5MUy0xJAotCQlBU1ROb2RlIGRlY2xhcmluZ05vZGUyID0gdW5pdC5maW5kRGVjbGFyaW5nTm9kZSh0eXBlQmluZGluZzIpOwotCQlhc3NlcnROb3ROdWxsKCJObyBkZWNsYXJpbmcgbm9kZSIsIGRlY2xhcmluZ05vZGUyKTsgLy8kTk9OLU5MUy0xJAotCi0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdDIgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDE0IiwgIkIuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQotCQlyZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQyLCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQ09NUElMQVRJT05fVU5JVCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IHVuaXQyID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBwcm9ibGVtcyIsIDAsIHVuaXQyLmdldFByb2JsZW1zKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlBU1ROb2RlIGRlY2xhcmluZ05vZGUzID0gdW5pdDIuZmluZERlY2xhcmluZ05vZGUodHlwZUJpbmRpbmcpOwotCQlhc3NlcnROdWxsKCJHb3QgYSBkZWNsYXJpbmcgbm9kZSIsIGRlY2xhcmluZ05vZGUzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJQVNUTm9kZSBkZWNsYXJpbmdOb2RlNCA9IHVuaXQyLmZpbmREZWNsYXJpbmdOb2RlKHR5cGVCaW5kaW5nLmdldEtleSgpKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gZGVjbGFyaW5nIG5vZGUiLCBkZWNsYXJpbmdOb2RlNCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQyNjgKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQxNSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDE1IiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQ09NUElMQVRJT05fVU5JVCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHByb2JsZW1zIiwgMCwgdW5pdC5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQ8Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUodW5pdCwgMCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIG5vZGUiLCBub2RlKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgc3dpdGNoIHN0YXRlbWVudCIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlNXSVRDSF9TVEFURU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCVN3aXRjaFN0YXRlbWVudCBzd2l0Y2hTdGF0ZW1lbnQgPSAoU3dpdGNoU3RhdGVtZW50KSBub2RlOwotCQlMaXN0IHN0YXRlbWVudHMgPSBzd2l0Y2hTdGF0ZW1lbnQuc3RhdGVtZW50cygpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCBzdGF0ZW1lbnRzLnNpemUoKSwgNSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RhdGVtZW50IHN0YXRlbWVudCA9IChTdGF0ZW1lbnQpIHN0YXRlbWVudHMuZ2V0KDMpOwotCQlhc3NlcnRUcnVlKCJub3QgYSBzd2l0Y2ggY2FzZSAoZGVmYXVsdCkiLCBzdGF0ZW1lbnQuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlNXSVRDSF9DQVNFKTsgLy8kTk9OLU5MUy0xJAotCQlTd2l0Y2hDYXNlIGRlZmF1bHRDYXNlID0gKFN3aXRjaENhc2UpIHN0YXRlbWVudDsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgZGVmYXVsdCBjYXNlIiwgZGVmYXVsdENhc2UuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIHRvU3RyaW5nKCkiLCAiZGVmYXVsdCA6ICIsIGRlZmF1bHRDYXNlLnRvU3RyaW5nKCkpOwotCX0KLQkKLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDMyNAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwNDE2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDA0MTYiLCAiQS5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnRUcnVlKCJub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5DT01QSUxBVElPTl9VTklUKTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgdW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgcHJvYmxlbXMiLCAwLCB1bml0LmdldFByb2JsZW1zKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJDwKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSh1bml0LCAxLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gbm9kZSIsIG5vZGUpOwotCQlhc3NlcnRUcnVlKCJub3QgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQiLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5WQVJJQUJMRV9ERUNMQVJBVElPTl9TVEFURU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgc3RhdGVtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIG5vZGU7Ci0JCUxpc3QgZnJhZ21lbnRzID0gc3RhdGVtZW50LmZyYWdtZW50cygpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHNpemUiLCBmcmFnbWVudHMuc2l6ZSgpLCAxKTsKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IGZyYWdtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgZnJhZ21lbnRzLmdldCgwKTsKLQkJRXhwcmVzc2lvbiBpbml0ID0gZnJhZ21lbnQuZ2V0SW5pdGlhbGl6ZXIoKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgcXVhbGlmaWVkIG5hbWUiLCBpbml0LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5RVUFMSUZJRURfTkFNRSk7IC8vJE5PTi1OTFMtMSQKLQkJUXVhbGlmaWVkTmFtZSBxdWFsaWZpZWROYW1lID0gKFF1YWxpZmllZE5hbWUpIGluaXQ7Ci0JCVNpbXBsZU5hbWUgc2ltcGxlTmFtZSA9IHF1YWxpZmllZE5hbWUuZ2V0TmFtZSgpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCAiQ09OU1QiLCBzaW1wbGVOYW1lLmdldElkZW50aWZpZXIoKSk7Ci0JCUlCaW5kaW5nIGJpbmRpbmcgPSBzaW1wbGVOYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgdHlwZSIsIElCaW5kaW5nLlZBUklBQkxFLCBiaW5kaW5nLmdldEtpbmQoKSk7Ci0JCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gKElWYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmc7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbW9kaWZpZXIiLCB2YXJpYWJsZUJpbmRpbmcuZ2V0TW9kaWZpZXJzKCksIE1vZGlmaWVyLlBVQkxJQyB8IE1vZGlmaWVyLlNUQVRJQyB8IE1vZGlmaWVyLkZJTkFMKTsKLQkJQVNUTm9kZSBkZWNsYXJpbmdOb2RlID0gdW5pdC5maW5kRGVjbGFyaW5nTm9kZSh2YXJpYWJsZUJpbmRpbmcpOwotCQlhc3NlcnROb3ROdWxsKCJObyBkZWNsYXJpbmcgbm9kZSIsIGRlY2xhcmluZ05vZGUpOwotCQlhc3NlcnRUcnVlKCJub3QgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmcmFnbWVudCIsIGRlY2xhcmluZ05vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlZBUklBQkxFX0RFQ0xBUkFUSU9OX0ZSQUdNRU5UKTsKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGRlY2xhcmluZ05vZGU7Ci0JCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IChGaWVsZERlY2xhcmF0aW9uKSB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuZ2V0UGFyZW50KCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbW9kaWZpZXIiLCBmaWVsZERlY2xhcmF0aW9uLmdldE1vZGlmaWVycygpLCBNb2RpZmllci5OT05FKTsKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDM0NwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwNDE3KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDA0MTciLCAiQS5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnRUcnVlKCJub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5DT01QSUxBVElPTl9VTklUKTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgdW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgcHJvYmxlbXMiLCAxLCB1bml0LmdldFByb2JsZW1zKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJDwKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSh1bml0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gbm9kZSIsIG5vZGUpOwotCQlhc3NlcnRUcnVlKCJub3QgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQiLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5WQVJJQUJMRV9ERUNMQVJBVElPTl9TVEFURU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgc3RhdGVtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIG5vZGU7Ci0JCVR5cGUgdHlwZSA9IHN0YXRlbWVudC5nZXRUeXBlKCk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIHNpbXBsZSB0eXBlIiwgdHlwZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuU0lNUExFX1RZUEUpOyAvLyROT04tTkxTLTEkCi0JCVNpbXBsZVR5cGUgc2ltcGxlVHlwZSA9IChTaW1wbGVUeXBlKSB0eXBlOwotCQlOYW1lIG5hbWUgPSBzaW1wbGVUeXBlLmdldE5hbWUoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgcXVhbGlmaWVkIG5hbWUiLCBuYW1lLmlzUXVhbGlmaWVkTmFtZSgpKTsKLQkJUXVhbGlmaWVkTmFtZSBxdWFsaWZpZWROYW1lID0gKFF1YWxpZmllZE5hbWUpIG5hbWU7Ci0JCU5hbWUgcXVhbGlmaWVyID0gcXVhbGlmaWVkTmFtZS5nZXRRdWFsaWZpZXIoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgc2ltcGxlIG5hbWUiLCBxdWFsaWZpZXIuaXNTaW1wbGVOYW1lKCkpOwotCQlJQmluZGluZyBiaW5kaW5nID0gcXVhbGlmaWVyLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCBiaW5kaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDQwNgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwNDE4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDA0MTgiLCAiQS5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnRUcnVlKCJub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5DT01QSUxBVElPTl9VTklUKTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgdW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgcHJvYmxlbXMiLCAxLCB1bml0LmdldFByb2JsZW1zKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJDwKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSh1bml0LCAwLCAxLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gbm9kZSIsIG5vZGUpOwotCQlhc3NlcnRUcnVlKCJub3QgYW4gZXhwcmVzc2lvbiBzdGF0ZW1lbnQgIiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuRVhQUkVTU0lPTl9TVEFURU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCUV4cHJlc3Npb25TdGF0ZW1lbnQgZXhwcmVzc2lvblN0YXRlbWVudCA9IChFeHByZXNzaW9uU3RhdGVtZW50KSBub2RlOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBleHByZXNzaW9uU3RhdGVtZW50LmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGFuIG1ldGhvZCBpbnZvY2F0aW9uIiwgZXhwcmVzc2lvbi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuTUVUSE9EX0lOVk9DQVRJT04pOyAvLyROT04tTkxTLTEkCi0JCU1ldGhvZEludm9jYXRpb24gbWV0aG9kSW52b2NhdGlvbiA9IChNZXRob2RJbnZvY2F0aW9uKSBleHByZXNzaW9uOwotCQlOYW1lIG5hbWUgPSBtZXRob2RJbnZvY2F0aW9uLmdldE5hbWUoKTsKLQkJSUJpbmRpbmcgYmluZGluZyA9IG5hbWUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZyIsIGJpbmRpbmcpOwotCX0KLQkKLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDQ0OQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwNDE5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDA0MTkiLCAiQS5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnRUcnVlKCJub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5DT01QSUxBVElPTl9VTklUKTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgdW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgcHJvYmxlbXMiLCAxLCB1bml0LmdldFByb2JsZW1zKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJDwKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSh1bml0LCAxLCAwLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYW4gZXhwcmVzc2lvbiBzdGF0ZW1lbnQiLCBub2RlLmdldE5vZGVUeXBlKCksIEFTVE5vZGUuRVhQUkVTU0lPTl9TVEFURU1FTlQpOwotCQlFeHByZXNzaW9uU3RhdGVtZW50IGV4cHJlc3Npb25TdGF0ZW1lbnQgPSAoRXhwcmVzc2lvblN0YXRlbWVudCkgbm9kZTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gZXhwcmVzc2lvblN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydEVxdWFscygiTm90IGFuIGFzc2lnbm1lbnQiLCBleHByZXNzaW9uLmdldE5vZGVUeXBlKCksIEFTVE5vZGUuQVNTSUdOTUVOVCk7Ci0JCUFzc2lnbm1lbnQgYXNzaWdubWVudCA9IChBc3NpZ25tZW50KSBleHByZXNzaW9uOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24yID0gYXNzaWdubWVudC5nZXRMZWZ0SGFuZFNpZGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBuYW1lIiwgZXhwcmVzc2lvbjIuZ2V0Tm9kZVR5cGUoKSwgQVNUTm9kZS5TSU1QTEVfTkFNRSk7Ci0JCVNpbXBsZU5hbWUgc2ltcGxlTmFtZSA9IChTaW1wbGVOYW1lKSBleHByZXNzaW9uMjsKLQkJSUJpbmRpbmcgYmluZGluZyA9IHNpbXBsZU5hbWUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0TnVsbChiaW5kaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDQ1MwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwNDIwKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDA0MjAiLCAiQS5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnRUcnVlKCJub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5DT01QSUxBVElPTl9VTklUKTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgdW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgcHJvYmxlbXMiLCAwLCB1bml0LmdldFByb2JsZW1zKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJDwKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSh1bml0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQiLCBub2RlLmdldE5vZGVUeXBlKCksIEFTVE5vZGUuVkFSSUFCTEVfREVDTEFSQVRJT05fU1RBVEVNRU5UKTsKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCkgbm9kZTsKLQkJTGlzdCBmcmFnbWVudHMgPSBzdGF0ZW1lbnQuZnJhZ21lbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc2l6ZSIsIDEsIGZyYWdtZW50cy5zaXplKCkpOwotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgZnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcmFnbWVudHMuZ2V0KDApOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBmcmFnbWVudC5nZXRJbml0aWFsaXplcigpOwotCQlhc3NlcnRFcXVhbHMoIk5vdCBhbiBpbmZpeCBleHByZXNzaW9uIiwgZXhwcmVzc2lvbi5nZXROb2RlVHlwZSgpLCBBU1ROb2RlLklORklYX0VYUFJFU1NJT04pOwotCQlJbmZpeEV4cHJlc3Npb24gaW5maXhFeHByZXNzaW9uID0gKEluZml4RXhwcmVzc2lvbikgZXhwcmVzc2lvbjsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uMiA9IGluZml4RXhwcmVzc2lvbi5nZXRSaWdodE9wZXJhbmQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24iLCBleHByZXNzaW9uMi5nZXROb2RlVHlwZSgpLCBBU1ROb2RlLlBBUkVOVEhFU0laRURfRVhQUkVTU0lPTik7Ci0JCWNoZWNrU291cmNlUmFuZ2UoZXhwcmVzc2lvbjIsICIoMiArIDMpIiwgc291cmNlKTsKLQkJUGFyZW50aGVzaXplZEV4cHJlc3Npb24gcGFyZW50aGVzaXplZEV4cHJlc3Npb24gPSAoUGFyZW50aGVzaXplZEV4cHJlc3Npb24pIGV4cHJlc3Npb24yOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24zID0gcGFyZW50aGVzaXplZEV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvbigpOwotCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb24zLCAiMiArIDMiLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NDUzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDA0MjEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDQyMSIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkNPTVBJTEFUSU9OX1VOSVQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBwcm9ibGVtcyIsIDAsIHVuaXQuZ2V0UHJvYmxlbXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkPAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKHVuaXQsIDAsIDAsIDApOwotCQlhc3NlcnRFcXVhbHMoIk5vdCBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSwgQVNUTm9kZS5WQVJJQUJMRV9ERUNMQVJBVElPTl9TVEFURU1FTlQpOwotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KSBub2RlOwotCQlMaXN0IGZyYWdtZW50cyA9IHN0YXRlbWVudC5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzaXplIiwgMSwgZnJhZ21lbnRzLnNpemUoKSk7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBmcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGZyYWdtZW50LmdldEluaXRpYWxpemVyKCk7Ci0JCWFzc2VydEVxdWFscygiTm90IGFuIGluZml4IGV4cHJlc3Npb24iLCBleHByZXNzaW9uLmdldE5vZGVUeXBlKCksIEFTVE5vZGUuSU5GSVhfRVhQUkVTU0lPTik7Ci0JCUluZml4RXhwcmVzc2lvbiBpbmZpeEV4cHJlc3Npb24gPSAoSW5maXhFeHByZXNzaW9uKSBleHByZXNzaW9uOwotCQljaGVja1NvdXJjZVJhbmdlKGluZml4RXhwcmVzc2lvbiwgIigxICsgMikgKyAzIiwgc291cmNlKTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uMiA9IGluZml4RXhwcmVzc2lvbi5nZXRMZWZ0T3BlcmFuZCgpOwotCQlhc3NlcnRFcXVhbHMoIk5vdCBhIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbiIsIGV4cHJlc3Npb24yLmdldE5vZGVUeXBlKCksIEFTVE5vZGUuUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShleHByZXNzaW9uMiwgIigxICsgMikiLCBzb3VyY2UpOwotCQlQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBwYXJlbnRoZXNpemVkRXhwcmVzc2lvbiA9IChQYXJlbnRoZXNpemVkRXhwcmVzc2lvbikgZXhwcmVzc2lvbjI7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbjMgPSBwYXJlbnRoZXNpemVkRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uKCk7Ci0JCWNoZWNrU291cmNlUmFuZ2UoZXhwcmVzc2lvbjMsICIxICsgMiIsIHNvdXJjZSk7Ci0JfQkKLQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NDUzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDA0MjIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDQyMiIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkNPTVBJTEFUSU9OX1VOSVQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBwcm9ibGVtcyIsIDAsIHVuaXQuZ2V0UHJvYmxlbXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkPAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKHVuaXQsIDAsIDAsIDApOwotCQlhc3NlcnRFcXVhbHMoIk5vdCBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSwgQVNUTm9kZS5WQVJJQUJMRV9ERUNMQVJBVElPTl9TVEFURU1FTlQpOwotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KSBub2RlOwotCQlMaXN0IGZyYWdtZW50cyA9IHN0YXRlbWVudC5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzaXplIiwgMSwgZnJhZ21lbnRzLnNpemUoKSk7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBmcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGZyYWdtZW50LmdldEluaXRpYWxpemVyKCk7Ci0JCWFzc2VydEVxdWFscygiTm90IGFuIGluZml4IGV4cHJlc3Npb24iLCBleHByZXNzaW9uLmdldE5vZGVUeXBlKCksIEFTVE5vZGUuSU5GSVhfRVhQUkVTU0lPTik7Ci0JCUluZml4RXhwcmVzc2lvbiBpbmZpeEV4cHJlc3Npb24gPSAoSW5maXhFeHByZXNzaW9uKSBleHByZXNzaW9uOwotCQljaGVja1NvdXJjZVJhbmdlKGluZml4RXhwcmVzc2lvbiwgIiggMSArIDIgKSArIDMiLCBzb3VyY2UpOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24yID0gaW5maXhFeHByZXNzaW9uLmdldExlZnRPcGVyYW5kKCk7Ci0JCWFzc2VydEVxdWFscygiTm90IGEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uIiwgZXhwcmVzc2lvbjIuZ2V0Tm9kZVR5cGUoKSwgQVNUTm9kZS5QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT04pOwotCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb24yLCAiKCAxICsgMiApIiwgc291cmNlKTsKLQkJUGFyZW50aGVzaXplZEV4cHJlc3Npb24gcGFyZW50aGVzaXplZEV4cHJlc3Npb24gPSAoUGFyZW50aGVzaXplZEV4cHJlc3Npb24pIGV4cHJlc3Npb24yOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24zID0gcGFyZW50aGVzaXplZEV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvbigpOwotCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb24zLCAiMSArIDIiLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NDUzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDA0MjMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDQyMyIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkNPTVBJTEFUSU9OX1VOSVQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBwcm9ibGVtcyIsIDAsIHVuaXQuZ2V0UHJvYmxlbXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkPAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKHVuaXQsIDAsIDAsIDApOwotCQlhc3NlcnRFcXVhbHMoIk5vdCBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSwgQVNUTm9kZS5WQVJJQUJMRV9ERUNMQVJBVElPTl9TVEFURU1FTlQpOwotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KSBub2RlOwotCQlMaXN0IGZyYWdtZW50cyA9IHN0YXRlbWVudC5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzaXplIiwgMSwgZnJhZ21lbnRzLnNpemUoKSk7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBmcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGZyYWdtZW50LmdldEluaXRpYWxpemVyKCk7Ci0JCWFzc2VydEVxdWFscygiTm90IGFuIGluZml4IGV4cHJlc3Npb24iLCBleHByZXNzaW9uLmdldE5vZGVUeXBlKCksIEFTVE5vZGUuSU5GSVhfRVhQUkVTU0lPTik7Ci0JCUluZml4RXhwcmVzc2lvbiBpbmZpeEV4cHJlc3Npb24gPSAoSW5maXhFeHByZXNzaW9uKSBleHByZXNzaW9uOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24yID0gaW5maXhFeHByZXNzaW9uLmdldFJpZ2h0T3BlcmFuZCgpOwotCQlhc3NlcnRFcXVhbHMoIk5vdCBhIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbiIsIGV4cHJlc3Npb24yLmdldE5vZGVUeXBlKCksIEFTVE5vZGUuUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShleHByZXNzaW9uMiwgIiggMiArIDMgKSIsIHNvdXJjZSk7Ci0JCVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHBhcmVudGhlc2l6ZWRFeHByZXNzaW9uID0gKFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKSBleHByZXNzaW9uMjsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uMyA9IHBhcmVudGhlc2l6ZWRFeHByZXNzaW9uLmdldEV4cHJlc3Npb24oKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShleHByZXNzaW9uMywgIjIgKyAzIiwgc291cmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ0NTMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQyNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDI0IiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQ09NUElMQVRJT05fVU5JVCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHByb2JsZW1zIiwgMCwgdW5pdC5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQ8Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUodW5pdCwgMCwgMCwgMCk7Ci0JCWFzc2VydEVxdWFscygiTm90IGEgdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpLCBBU1ROb2RlLlZBUklBQkxFX0RFQ0xBUkFUSU9OX1NUQVRFTUVOVCk7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgc3RhdGVtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIG5vZGU7Ci0JCUxpc3QgZnJhZ21lbnRzID0gc3RhdGVtZW50LmZyYWdtZW50cygpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHNpemUiLCAxLCBmcmFnbWVudHMuc2l6ZSgpKTsKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IGZyYWdtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgZnJhZ21lbnRzLmdldCgwKTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gZnJhZ21lbnQuZ2V0SW5pdGlhbGl6ZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYW4gaW5maXggZXhwcmVzc2lvbiIsIGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSwgQVNUTm9kZS5JTkZJWF9FWFBSRVNTSU9OKTsKLQkJSW5maXhFeHByZXNzaW9uIGluZml4RXhwcmVzc2lvbiA9IChJbmZpeEV4cHJlc3Npb24pIGV4cHJlc3Npb247Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc2l6ZSIsIDEsIGluZml4RXhwcmVzc2lvbi5leHRlbmRlZE9wZXJhbmRzKCkuc2l6ZSgpKTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uMiA9IChFeHByZXNzaW9uKSBpbmZpeEV4cHJlc3Npb24uZXh0ZW5kZWRPcGVyYW5kcygpLmdldCgwKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShleHByZXNzaW9uMiwgIiggMiArIDMgKSIsIHNvdXJjZSk7Ci0JfQkKLQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NDUzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDA0MjUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDQyNSIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkNPTVBJTEFUSU9OX1VOSVQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBwcm9ibGVtcyIsIDAsIHVuaXQuZ2V0UHJvYmxlbXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkPAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKHVuaXQsIDAsIDAsIDApOwotCQlhc3NlcnRFcXVhbHMoIk5vdCBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSwgQVNUTm9kZS5WQVJJQUJMRV9ERUNMQVJBVElPTl9TVEFURU1FTlQpOwotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KSBub2RlOwotCQlMaXN0IGZyYWdtZW50cyA9IHN0YXRlbWVudC5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzaXplIiwgMSwgZnJhZ21lbnRzLnNpemUoKSk7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBmcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGZyYWdtZW50LmdldEluaXRpYWxpemVyKCk7Ci0JCWFzc2VydEVxdWFscygiTm90IGFuIGluZml4IGV4cHJlc3Npb24iLCBleHByZXNzaW9uLmdldE5vZGVUeXBlKCksIEFTVE5vZGUuSU5GSVhfRVhQUkVTU0lPTik7Ci0JCUluZml4RXhwcmVzc2lvbiBpbmZpeEV4cHJlc3Npb24gPSAoSW5maXhFeHByZXNzaW9uKSBleHByZXNzaW9uOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHNpemUiLCAwLCBpbmZpeEV4cHJlc3Npb24uZXh0ZW5kZWRPcGVyYW5kcygpLnNpemUoKSk7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbjIgPSBpbmZpeEV4cHJlc3Npb24uZ2V0UmlnaHRPcGVyYW5kKCk7Ci0JCWFzc2VydFRydWUoIm5vdCBhbiBpbmZpeCBleHByZXNzaW9uIiwgZXhwcmVzc2lvbjIuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLklORklYX0VYUFJFU1NJT04pOyAvLyROT04tTkxTLTEkCi0JCUluZml4RXhwcmVzc2lvbiBpbmZpeEV4cHJlc3Npb24yID0gKEluZml4RXhwcmVzc2lvbikgZXhwcmVzc2lvbjI7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbjMgPSBpbmZpeEV4cHJlc3Npb24yLmdldFJpZ2h0T3BlcmFuZCgpOwotCQlhc3NlcnRUcnVlKCJub3QgYSBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24iLCBleHByZXNzaW9uMy5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb24zLCAiKCAyICsgMyApIiwgc291cmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ0NDkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQyNigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDI2IiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQ09NUElMQVRJT05fVU5JVCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHByb2JsZW1zIiwgMSwgdW5pdC5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQ8Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUodW5pdCwgMSwgMCwgMCk7Ci0JCWFzc2VydEVxdWFscygiTm90IGEgdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpLCBBU1ROb2RlLlZBUklBQkxFX0RFQ0xBUkFUSU9OX1NUQVRFTUVOVCk7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgc3RhdGVtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIG5vZGU7Ci0JCVR5cGUgdHlwZSA9IHN0YXRlbWVudC5nZXRUeXBlKCk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIHNpbXBsZSB0eXBlIiwgdHlwZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuU0lNUExFX1RZUEUpOwotCQlTaW1wbGVUeXBlIHNpbXBsZVR5cGUgPSAoU2ltcGxlVHlwZSkgdHlwZTsKLQkJTmFtZSBuYW1lID0gc2ltcGxlVHlwZS5nZXROYW1lKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIG5hbWUiLCBuYW1lKTsKLQkJSUJpbmRpbmcgYmluZGluZyA9IG5hbWUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZyIsIGJpbmRpbmcpOwotCX0JCi0JCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ0NDkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQyNygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDI3IiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQ09NUElMQVRJT05fVU5JVCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHByb2JsZW1zIiwgMSwgdW5pdC5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQ8Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUodW5pdCwgMSwgMCwgMCk7Ci0JCWFzc2VydEVxdWFscygiTm90IGFuIGV4cHJlc3Npb24gc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpLCBBU1ROb2RlLkVYUFJFU1NJT05fU1RBVEVNRU5UKTsKLQkJRXhwcmVzc2lvblN0YXRlbWVudCBleHByZXNzaW9uU3RhdGVtZW50ID0gKEV4cHJlc3Npb25TdGF0ZW1lbnQpIG5vZGU7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGV4cHJlc3Npb25TdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpOwotCQlhc3NlcnRFcXVhbHMoIk5vdCBhbiBhc3NpZ25tZW50IiwgZXhwcmVzc2lvbi5nZXROb2RlVHlwZSgpLCBBU1ROb2RlLkFTU0lHTk1FTlQpOwotCQlBc3NpZ25tZW50IGFzc2lnbm1lbnQgPSAoQXNzaWdubWVudCkgZXhwcmVzc2lvbjsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uMiA9IGFzc2lnbm1lbnQuZ2V0TGVmdEhhbmRTaWRlKCk7Ci0JCWFzc2VydEVxdWFscygiTm90IGEgc3VwZXIgZmllbGQgYWNjZXNzIiwgZXhwcmVzc2lvbjIuZ2V0Tm9kZVR5cGUoKSwgQVNUTm9kZS5TVVBFUl9GSUVMRF9BQ0NFU1MpOwotCQlTdXBlckZpZWxkQWNjZXNzIHN1cGVyRmllbGRBY2Nlc3MgPSAoU3VwZXJGaWVsZEFjY2VzcykgZXhwcmVzc2lvbjI7Ci0JCU5hbWUgbmFtZSA9IHN1cGVyRmllbGRBY2Nlc3MuZ2V0TmFtZSgpOwotCQlhc3NlcnROb3ROdWxsKCJObyBuYW1lIiwgbmFtZSk7Ci0JCUlCaW5kaW5nIGJpbmRpbmcgPSBuYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE51bGwoIkdvdCBhIGJpbmRpbmciLCBiaW5kaW5nKTsKLQkJYXNzZXJ0TnVsbCgiR290IGEgYmluZGluZyIsIHN1cGVyRmllbGRBY2Nlc3MucmVzb2x2ZUZpZWxkQmluZGluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDQ0OQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwNDI4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDA0MjgiLCAiQS5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnRUcnVlKCJub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5DT01QSUxBVElPTl9VTklUKTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgdW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgcHJvYmxlbXMiLCAxLCB1bml0LmdldFByb2JsZW1zKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJDwKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSh1bml0LCAxLCAwLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYW4gZXhwcmVzc2lvbiBzdGF0ZW1lbnQiLCBub2RlLmdldE5vZGVUeXBlKCksIEFTVE5vZGUuRVhQUkVTU0lPTl9TVEFURU1FTlQpOwotCQlFeHByZXNzaW9uU3RhdGVtZW50IGV4cHJlc3Npb25TdGF0ZW1lbnQgPSAoRXhwcmVzc2lvblN0YXRlbWVudCkgbm9kZTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gZXhwcmVzc2lvblN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydEVxdWFscygiTm90IGFuIGFzc2lnbm1lbnQiLCBleHByZXNzaW9uLmdldE5vZGVUeXBlKCksIEFTVE5vZGUuQVNTSUdOTUVOVCk7Ci0JCUFzc2lnbm1lbnQgYXNzaWdubWVudCA9IChBc3NpZ25tZW50KSBleHByZXNzaW9uOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24yID0gYXNzaWdubWVudC5nZXRMZWZ0SGFuZFNpZGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBxdWFsaWZpZWQgbmFtZSIsIGV4cHJlc3Npb24yLmdldE5vZGVUeXBlKCksIEFTVE5vZGUuUVVBTElGSUVEX05BTUUpOwotCQlRdWFsaWZpZWROYW1lIG5hbWUgPSAoUXVhbGlmaWVkTmFtZSkgZXhwcmVzc2lvbjI7Ci0JCVNpbXBsZU5hbWUgc2ltcGxlTmFtZSA9IG5hbWUuZ2V0TmFtZSgpOwotCQlJQmluZGluZyBiaW5kaW5nID0gc2ltcGxlTmFtZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgYmluZGluZyk7Ci0JCUlCaW5kaW5nIGJpbmRpbmcyID0gbmFtZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nMiIsIGJpbmRpbmcyKTsKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDQ0OQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwNDI5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDA0MjkiLCAiQS5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnRUcnVlKCJub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5DT01QSUxBVElPTl9VTklUKTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgdW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgcHJvYmxlbXMiLCAxLCB1bml0LmdldFByb2JsZW1zKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJDwKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSh1bml0LCAxLCAwLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYW4gZXhwcmVzc2lvbiBzdGF0ZW1lbnQiLCBub2RlLmdldE5vZGVUeXBlKCksIEFTVE5vZGUuRVhQUkVTU0lPTl9TVEFURU1FTlQpOwotCQlFeHByZXNzaW9uU3RhdGVtZW50IGV4cHJlc3Npb25TdGF0ZW1lbnQgPSAoRXhwcmVzc2lvblN0YXRlbWVudCkgbm9kZTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gZXhwcmVzc2lvblN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydEVxdWFscygiTm90IGFuIGFzc2lnbm1lbnQiLCBleHByZXNzaW9uLmdldE5vZGVUeXBlKCksIEFTVE5vZGUuQVNTSUdOTUVOVCk7Ci0JCUFzc2lnbm1lbnQgYXNzaWdubWVudCA9IChBc3NpZ25tZW50KSBleHByZXNzaW9uOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24yID0gYXNzaWdubWVudC5nZXRMZWZ0SGFuZFNpZGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBxdWFsaWZpZWQgbmFtZSIsIGV4cHJlc3Npb24yLmdldE5vZGVUeXBlKCksIEFTVE5vZGUuUVVBTElGSUVEX05BTUUpOwotCQlRdWFsaWZpZWROYW1lIG5hbWUgPSAoUXVhbGlmaWVkTmFtZSkgZXhwcmVzc2lvbjI7Ci0JCVNpbXBsZU5hbWUgc2ltcGxlTmFtZSA9IG5hbWUuZ2V0TmFtZSgpOwotCQlJQmluZGluZyBiaW5kaW5nID0gc2ltcGxlTmFtZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgYmluZGluZyk7Ci0JCUlCaW5kaW5nIGJpbmRpbmcyID0gbmFtZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nMiIsIGJpbmRpbmcyKTsKLQl9CQotCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ0OTkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQzMCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDMwIiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQ09NUElMQVRJT05fVU5JVCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHByb2JsZW1zIiwgMSwgdW5pdC5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQ8Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUodW5pdCwgMCwgMCwgMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIGNvbnN0cnVjdG9yIGludm9jYXRpb24iLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5DT05TVFJVQ1RPUl9JTlZPQ0FUSU9OKTsKLQkJQ29uc3RydWN0b3JJbnZvY2F0aW9uIGNvbnN0cnVjdG9ySW52b2NhdGlvbiA9IChDb25zdHJ1Y3Rvckludm9jYXRpb24pIG5vZGU7Ci0JCWNoZWNrU291cmNlUmFuZ2UoY29uc3RydWN0b3JJbnZvY2F0aW9uLCAidGhpcyhjb28yKCkpOyIsIHNvdXJjZSk7Ci0JCUxpc3QgYXJndW1lbnRzID0gY29uc3RydWN0b3JJbnZvY2F0aW9uLmFyZ3VtZW50cygpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHNpemUiLCAxLCBhcmd1bWVudHMuc2l6ZSgpKTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gKEV4cHJlc3Npb24pIGFyZ3VtZW50cy5nZXQoMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIG1ldGhvZCBpbnZvY2F0aW9uIiwgZXhwcmVzc2lvbi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuTUVUSE9EX0lOVk9DQVRJT04pOwotCQlNZXRob2RJbnZvY2F0aW9uIG1ldGhvZEludm9jYXRpb24gPSAoTWV0aG9kSW52b2NhdGlvbikgZXhwcmVzc2lvbjsKLQkJU2ltcGxlTmFtZSBzaW1wbGVOYW1lID0gbWV0aG9kSW52b2NhdGlvbi5nZXROYW1lKCk7Ci0JCUlCaW5kaW5nIGJpbmRpbmcgPSBzaW1wbGVOYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCBiaW5kaW5nKTsKLQl9CQotCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ1MDAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQzMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDMxIiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQ09NUElMQVRJT05fVU5JVCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHByb2JsZW1zIiwgMSwgdW5pdC5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQ8Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUodW5pdCwgMCwgMCwgMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIGNvbnN0cnVjdG9yIGludm9jYXRpb24iLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5DT05TVFJVQ1RPUl9JTlZPQ0FUSU9OKTsKLQkJQ29uc3RydWN0b3JJbnZvY2F0aW9uIGNvbnN0cnVjdG9ySW52b2NhdGlvbiA9IChDb25zdHJ1Y3Rvckludm9jYXRpb24pIG5vZGU7Ci0JCUxpc3QgYXJndW1lbnRzID0gY29uc3RydWN0b3JJbnZvY2F0aW9uLmFyZ3VtZW50cygpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHNpemUiLCAxLCBhcmd1bWVudHMuc2l6ZSgpKTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gKEV4cHJlc3Npb24pIGFyZ3VtZW50cy5nZXQoMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHNpbXBsZSBuYW1lIiwgZXhwcmVzc2lvbi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuU0lNUExFX05BTUUpOwotCQlTaW1wbGVOYW1lIHNpbXBsZU5hbWUgPSAoU2ltcGxlTmFtZSkgZXhwcmVzc2lvbjsKLQkJSUJpbmRpbmcgYmluZGluZyA9IHNpbXBsZU5hbWUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZyIsIGJpbmRpbmcpOwotCX0KLQkKLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDUwMQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwNDMyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDA0MzIiLCAiQS5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnRUcnVlKCJub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5DT01QSUxBVElPTl9VTklUKTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgdW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgcHJvYmxlbXMiLCAxLCB1bml0LmdldFByb2JsZW1zKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJDwKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSh1bml0LCAxLCAwLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYW4gZXhwcmVzc2lvbiBzdGF0ZW1lbnQiLCBBU1ROb2RlLkVYUFJFU1NJT05fU1RBVEVNRU5ULCBub2RlLmdldE5vZGVUeXBlKCkpOwotCQlFeHByZXNzaW9uU3RhdGVtZW50IGV4cHJlc3Npb25TdGF0ZW1lbnQgPSAoRXhwcmVzc2lvblN0YXRlbWVudCkgbm9kZTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gZXhwcmVzc2lvblN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydEVxdWFscygiTm90IGFuIGFzc2lnbm1lbnQiLCBBU1ROb2RlLkFTU0lHTk1FTlQsIGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSk7Ci0JCUFzc2lnbm1lbnQgYXNzaWdubWVudCA9IChBc3NpZ25tZW50KSBleHByZXNzaW9uOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24yID0gYXNzaWdubWVudC5nZXRMZWZ0SGFuZFNpZGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBzaW1wbGUgbmFtZSIsIEFTVE5vZGUuU0lNUExFX05BTUUsIGV4cHJlc3Npb24yLmdldE5vZGVUeXBlKCkpOwotCQlTaW1wbGVOYW1lIHNpbXBsZU5hbWUgPSAoU2ltcGxlTmFtZSkgZXhwcmVzc2lvbjI7Ci0JCUlCaW5kaW5nIGJpbmRpbmcgPSBzaW1wbGVOYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCBiaW5kaW5nKTsKLQl9CQotCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ1MDEKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQzMygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDMzIiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQ09NUElMQVRJT05fVU5JVCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHByb2JsZW1zIiwgMSwgdW5pdC5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQ8Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUodW5pdCwgMSwgMCwgMCk7Ci0JCWFzc2VydEVxdWFscygiTm90IGFuIGV4cHJlc3Npb24gc3RhdGVtZW50IiwgQVNUTm9kZS5FWFBSRVNTSU9OX1NUQVRFTUVOVCwgbm9kZS5nZXROb2RlVHlwZSgpKTsKLQkJRXhwcmVzc2lvblN0YXRlbWVudCBleHByZXNzaW9uU3RhdGVtZW50ID0gKEV4cHJlc3Npb25TdGF0ZW1lbnQpIG5vZGU7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGV4cHJlc3Npb25TdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpOwotCQlhc3NlcnRFcXVhbHMoIk5vdCBhbiBhc3NpZ25tZW50IiwgQVNUTm9kZS5BU1NJR05NRU5ULCBleHByZXNzaW9uLmdldE5vZGVUeXBlKCkpOwotCQlBc3NpZ25tZW50IGFzc2lnbm1lbnQgPSAoQXNzaWdubWVudCkgZXhwcmVzc2lvbjsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uMiA9IGFzc2lnbm1lbnQuZ2V0TGVmdEhhbmRTaWRlKCk7Ci0JCWFzc2VydEVxdWFscygiTm90IGEgc3VwZXIgZmllbGQgYWNjZXNzIiwgQVNUTm9kZS5TVVBFUl9GSUVMRF9BQ0NFU1MsIGV4cHJlc3Npb24yLmdldE5vZGVUeXBlKCkpOwotCQlTdXBlckZpZWxkQWNjZXNzIHN1cGVyRmllbGRBY2Nlc3MgPSAoU3VwZXJGaWVsZEFjY2VzcykgZXhwcmVzc2lvbjI7Ci0JCVNpbXBsZU5hbWUgc2ltcGxlTmFtZSA9IHN1cGVyRmllbGRBY2Nlc3MuZ2V0TmFtZSgpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIG5hbWUiLCAiZkNvbyIsIHNpbXBsZU5hbWUuZ2V0SWRlbnRpZmllcigpKTsKLQkJSUJpbmRpbmcgYmluZGluZyA9IHNpbXBsZU5hbWUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZyIsIGJpbmRpbmcpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGJpbmRpbmciLCBJQmluZGluZy5WQVJJQUJMRSwgYmluZGluZy5nZXRLaW5kKCkpOwotCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IHN1cGVyRmllbGRBY2Nlc3MucmVzb2x2ZUZpZWxkQmluZGluZygpOwotCQlhc3NlcnRUcnVlKCJEaWZmZXJlbnQgYmluZGluZyIsIGJpbmRpbmcgPT0gdmFyaWFibGVCaW5kaW5nKTsKLQkJQVNUTm9kZSBhc3ROb2RlID0gdW5pdC5maW5kRGVjbGFyaW5nTm9kZSh2YXJpYWJsZUJpbmRpbmcpOwotCQlhc3NlcnRUcnVlKCJXcm9uZyB0eXBlIiwgYXN0Tm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuU0lOR0xFX1ZBUklBQkxFX0RFQ0xBUkFUSU9OIHx8IGFzdE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlZBUklBQkxFX0RFQ0xBUkFUSU9OX0ZSQUdNRU5UIHx8IGFzdE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlZBUklBQkxFX0RFQ0xBUkFUSU9OX0VYUFJFU1NJT04pOwotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NTAxCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDA0MzQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDQzNCIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkNPTVBJTEFUSU9OX1VOSVQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBwcm9ibGVtcyIsIDEsIHVuaXQuZ2V0UHJvYmxlbXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkPAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKHVuaXQsIDEsIDAsIDApOwotCQlhc3NlcnRFcXVhbHMoIk5vdCBhbiBleHByZXNzaW9uIHN0YXRlbWVudCIsIEFTVE5vZGUuRVhQUkVTU0lPTl9TVEFURU1FTlQsIG5vZGUuZ2V0Tm9kZVR5cGUoKSk7Ci0JCUV4cHJlc3Npb25TdGF0ZW1lbnQgZXhwcmVzc2lvblN0YXRlbWVudCA9IChFeHByZXNzaW9uU3RhdGVtZW50KSBub2RlOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBleHByZXNzaW9uU3RhdGVtZW50LmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYW4gYXNzaWdubWVudCIsIEFTVE5vZGUuQVNTSUdOTUVOVCwgZXhwcmVzc2lvbi5nZXROb2RlVHlwZSgpKTsKLQkJQXNzaWdubWVudCBhc3NpZ25tZW50ID0gKEFzc2lnbm1lbnQpIGV4cHJlc3Npb247Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbjIgPSBhc3NpZ25tZW50LmdldExlZnRIYW5kU2lkZSgpOwotCQlhc3NlcnRFcXVhbHMoIk5vdCBhIHF1YWxpZmllZCBuYW1lIiwgQVNUTm9kZS5RVUFMSUZJRURfTkFNRSwgZXhwcmVzc2lvbjIuZ2V0Tm9kZVR5cGUoKSk7Ci0JCVF1YWxpZmllZE5hbWUgcXVhbGlmaWVkTmFtZSA9IChRdWFsaWZpZWROYW1lKSBleHByZXNzaW9uMjsKLQkJU2ltcGxlTmFtZSBzaW1wbGVOYW1lID0gcXVhbGlmaWVkTmFtZS5nZXROYW1lKCk7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgbmFtZSIsICJmQ29vIiwgc2ltcGxlTmFtZS5nZXRJZGVudGlmaWVyKCkpOwotCQlJQmluZGluZyBiaW5kaW5nID0gc2ltcGxlTmFtZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgYmluZGluZyk7Ci0JfQotCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ1MDEKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQzNSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDM1IiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQ09NUElMQVRJT05fVU5JVCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHByb2JsZW1zIiwgMSwgdW5pdC5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQ8Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUodW5pdCwgMSwgMCwgMCk7Ci0JCWFzc2VydEVxdWFscygiTm90IGFuIGV4cHJlc3Npb24gc3RhdGVtZW50IiwgQVNUTm9kZS5FWFBSRVNTSU9OX1NUQVRFTUVOVCwgbm9kZS5nZXROb2RlVHlwZSgpKTsKLQkJRXhwcmVzc2lvblN0YXRlbWVudCBleHByZXNzaW9uU3RhdGVtZW50ID0gKEV4cHJlc3Npb25TdGF0ZW1lbnQpIG5vZGU7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGV4cHJlc3Npb25TdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpOwotCQlhc3NlcnRFcXVhbHMoIk5vdCBhbiBhc3NpZ25tZW50IiwgQVNUTm9kZS5BU1NJR05NRU5ULCBleHByZXNzaW9uLmdldE5vZGVUeXBlKCkpOwotCQlBc3NpZ25tZW50IGFzc2lnbm1lbnQgPSAoQXNzaWdubWVudCkgZXhwcmVzc2lvbjsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uMiA9IGFzc2lnbm1lbnQuZ2V0TGVmdEhhbmRTaWRlKCk7Ci0JCWFzc2VydEVxdWFscygiTm90IGEgcXVhbGlmaWVkIG5hbWUiLCBBU1ROb2RlLlFVQUxJRklFRF9OQU1FLCBleHByZXNzaW9uMi5nZXROb2RlVHlwZSgpKTsKLQkJUXVhbGlmaWVkTmFtZSBxdWFsaWZpZWROYW1lID0gKFF1YWxpZmllZE5hbWUpIGV4cHJlc3Npb24yOwotCQlTaW1wbGVOYW1lIHNpbXBsZU5hbWUgPSBxdWFsaWZpZWROYW1lLmdldE5hbWUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgImZDb28iLCBzaW1wbGVOYW1lLmdldElkZW50aWZpZXIoKSk7Ci0JCUlCaW5kaW5nIGJpbmRpbmcgPSBzaW1wbGVOYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCBiaW5kaW5nKTsKLQl9CQotCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ1MDIKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQzNigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDM2IiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQ09NUElMQVRJT05fVU5JVCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHByb2JsZW1zIiwgMSwgdW5pdC5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQ8Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUodW5pdCwgMSwgMCwgMCk7Ci0JCWFzc2VydEVxdWFscygiTm90IGEgdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50IiwgQVNUTm9kZS5WQVJJQUJMRV9ERUNMQVJBVElPTl9TVEFURU1FTlQsIG5vZGUuZ2V0Tm9kZVR5cGUoKSk7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgc3RhdGVtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIG5vZGU7Ci0JCVR5cGUgdHlwZSA9IHN0YXRlbWVudC5nZXRUeXBlKCk7Ci0JCWFzc2VydEVxdWFscygiTm90IGEgc2ltcGxlIHR5cGUiLCBBU1ROb2RlLlNJTVBMRV9UWVBFLCB0eXBlLmdldE5vZGVUeXBlKCkpOwotCQlTaW1wbGVUeXBlIHNpbXBsZVR5cGUgPSAoU2ltcGxlVHlwZSkgdHlwZTsKLQkJTmFtZSBuYW1lID0gc2ltcGxlVHlwZS5nZXROYW1lKCk7Ci0JCUlCaW5kaW5nIGJpbmRpbmcgPSBuYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE51bGwoIkdvdCBhIGJpbmRpbmciLCBiaW5kaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBxdWFsaWZpZWQgbmFtZSIsIEFTVE5vZGUuUVVBTElGSUVEX05BTUUsIG5hbWUuZ2V0Tm9kZVR5cGUoKSk7Ci0JCVF1YWxpZmllZE5hbWUgcXVhbGlmaWVkTmFtZSA9IChRdWFsaWZpZWROYW1lKSBuYW1lOwotCQlTaW1wbGVOYW1lIHNpbXBsZU5hbWUgPSBxdWFsaWZpZWROYW1lLmdldE5hbWUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBuYW1lIiwgIkNJbm5lciIsIHNpbXBsZU5hbWUuZ2V0SWRlbnRpZmllcigpKTsKLQkJSUJpbmRpbmcgYmluZGluZzIgPSBzaW1wbGVOYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE51bGwoIkdvdCBhIGJpbmRpbmciLCBiaW5kaW5nMik7Ci0JfQkKLQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NTAyCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDA0MzcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDQzNyIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkNPTVBJTEFUSU9OX1VOSVQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBwcm9ibGVtcyIsIDEsIHVuaXQuZ2V0UHJvYmxlbXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkPAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKHVuaXQsIDEsIDAsIDApOwotCQlhc3NlcnRFcXVhbHMoIk5vdCBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCIsIEFTVE5vZGUuVkFSSUFCTEVfREVDTEFSQVRJT05fU1RBVEVNRU5ULCBub2RlLmdldE5vZGVUeXBlKCkpOwotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KSBub2RlOwotCQlUeXBlIHR5cGUgPSBzdGF0ZW1lbnQuZ2V0VHlwZSgpOwotCQlhc3NlcnRFcXVhbHMoIk5vdCBhIHNpbXBsZSB0eXBlIiwgQVNUTm9kZS5TSU1QTEVfVFlQRSwgdHlwZS5nZXROb2RlVHlwZSgpKTsKLQkJU2ltcGxlVHlwZSBzaW1wbGVUeXBlID0gKFNpbXBsZVR5cGUpIHR5cGU7Ci0JCU5hbWUgbmFtZSA9IHNpbXBsZVR5cGUuZ2V0TmFtZSgpOwotCQlhc3NlcnRFcXVhbHMoIk5vdCBhIHNpbXBsZSBuYW1lIiwgQVNUTm9kZS5TSU1QTEVfTkFNRSwgbmFtZS5nZXROb2RlVHlwZSgpKTsKLQkJU2ltcGxlTmFtZSBzaW1wbGVOYW1lID0gKFNpbXBsZU5hbWUpIG5hbWU7Ci0JCUlCaW5kaW5nIGJpbmRpbmcgPSBzaW1wbGVOYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE51bGwoIk5vIGJpbmRpbmciLCBiaW5kaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDUxMQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwNDM4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDA0MzgiLCAiRC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnRUcnVlKCJub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5DT01QSUxBVElPTl9VTklUKTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgdW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgcHJvYmxlbXMiLCAxLCB1bml0LmdldFByb2JsZW1zKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJDwKLQkJTGlzdCBpbXBvcnRzID0gdW5pdC5pbXBvcnRzKCk7Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc2l6ZSIsIDEsIGltcG9ydHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJDwKLQkJSW1wb3J0RGVjbGFyYXRpb24gaW1wb3J0RGVjbGFyYXRpb24gPSAoSW1wb3J0RGVjbGFyYXRpb24pIGltcG9ydHMuZ2V0KDApOwotCQlJQmluZGluZyBiaW5kaW5nID0gaW1wb3J0RGVjbGFyYXRpb24ucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZyIsIGJpbmRpbmcpOwotCX0KLQkKLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDUwMgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwNDM5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDA0MzkiLCAiRS5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnRUcnVlKCJub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5DT01QSUxBVElPTl9VTklUKTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgdW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgcHJvYmxlbXMiLCAxLCB1bml0LmdldFByb2JsZW1zKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJDwKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSh1bml0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQiLCBBU1ROb2RlLlZBUklBQkxFX0RFQ0xBUkFUSU9OX1NUQVRFTUVOVCwgbm9kZS5nZXROb2RlVHlwZSgpKTsKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCkgbm9kZTsKLQkJVHlwZSB0eXBlID0gc3RhdGVtZW50LmdldFR5cGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBzaW1wbGUgdHlwZSIsIEFTVE5vZGUuU0lNUExFX1RZUEUsIHR5cGUuZ2V0Tm9kZVR5cGUoKSk7Ci0JCVNpbXBsZVR5cGUgc2ltcGxlVHlwZSA9IChTaW1wbGVUeXBlKSB0eXBlOwotCQlOYW1lIG5hbWUgPSBzaW1wbGVUeXBlLmdldE5hbWUoKTsKLQkJSUJpbmRpbmcgYmluZGluZyA9IG5hbWUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZyIsIGJpbmRpbmcpOwotCX0KLQkKLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDYyMgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwNDQwKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDA0NDAiLCAiQS5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnRUcnVlKCJub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5DT01QSUxBVElPTl9VTklUKTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgdW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgcHJvYmxlbXMiLCAwLCB1bml0LmdldFByb2JsZW1zKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJDwKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSh1bml0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQiLCBBU1ROb2RlLlZBUklBQkxFX0RFQ0xBUkFUSU9OX1NUQVRFTUVOVCwgbm9kZS5nZXROb2RlVHlwZSgpKTsKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCkgbm9kZTsKLQkJTGlzdCBmcmFnbWVudHMgPSBzdGF0ZW1lbnQuZnJhZ21lbnRzKCk7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBmcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGZyYWdtZW50LmdldEluaXRpYWxpemVyKCk7Ci0JCWFzc2VydEVxdWFscygiTm90IGFuIGluZml4IGV4cHJlc3Npb24iLCBBU1ROb2RlLklORklYX0VYUFJFU1NJT04sIGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSk7Ci0JCS8vIDIgKiAzICsgIiIgKyAodHJ1ZSkKLQkJSW5maXhFeHByZXNzaW9uIGluZml4RXhwcmVzc2lvbiA9IChJbmZpeEV4cHJlc3Npb24pIGV4cHJlc3Npb247Ci0JCWNoZWNrU291cmNlUmFuZ2UoaW5maXhFeHByZXNzaW9uLCAiMiAqIDMgKyBcIlwiICsgKHRydWUpIiwgc291cmNlKTsKLQkJRXhwcmVzc2lvbiBsZWZ0T3BlcmFuZCA9IGluZml4RXhwcmVzc2lvbi5nZXRMZWZ0T3BlcmFuZCgpOwotCQljaGVja1NvdXJjZVJhbmdlKGxlZnRPcGVyYW5kLCAiMiAqIDMgKyBcIlwiIiwgc291cmNlKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShpbmZpeEV4cHJlc3Npb24uZ2V0UmlnaHRPcGVyYW5kKCksICIodHJ1ZSkiLCBzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIG9wZXJhdG9yIiwgaW5maXhFeHByZXNzaW9uLmdldE9wZXJhdG9yKCksIEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5QTFVTKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyB0eXBlIiwgQVNUTm9kZS5JTkZJWF9FWFBSRVNTSU9OLCBsZWZ0T3BlcmFuZC5nZXROb2RlVHlwZSgpKTsKLQkJaW5maXhFeHByZXNzaW9uID0gKEluZml4RXhwcmVzc2lvbikgbGVmdE9wZXJhbmQ7Ci0JCWNoZWNrU291cmNlUmFuZ2UoaW5maXhFeHByZXNzaW9uLCAiMiAqIDMgKyBcIlwiIiwgc291cmNlKTsKLQkJbGVmdE9wZXJhbmQgPSBpbmZpeEV4cHJlc3Npb24uZ2V0TGVmdE9wZXJhbmQoKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShsZWZ0T3BlcmFuZCwgIjIgKiAzIiwgc291cmNlKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShpbmZpeEV4cHJlc3Npb24uZ2V0UmlnaHRPcGVyYW5kKCksICJcIlwiIiwgc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBvcGVyYXRvciIsIGluZml4RXhwcmVzc2lvbi5nZXRPcGVyYXRvcigpLCBJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUExVUyk7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgdHlwZSIsIEFTVE5vZGUuSU5GSVhfRVhQUkVTU0lPTiwgbGVmdE9wZXJhbmQuZ2V0Tm9kZVR5cGUoKSk7Ci0JCWluZml4RXhwcmVzc2lvbiA9IChJbmZpeEV4cHJlc3Npb24pIGxlZnRPcGVyYW5kOwotCQljaGVja1NvdXJjZVJhbmdlKGluZml4RXhwcmVzc2lvbiwgIjIgKiAzIiwgc291cmNlKTsKLQkJbGVmdE9wZXJhbmQgPSBpbmZpeEV4cHJlc3Npb24uZ2V0TGVmdE9wZXJhbmQoKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShsZWZ0T3BlcmFuZCwgIjIiLCBzb3VyY2UpOwotCQljaGVja1NvdXJjZVJhbmdlKGluZml4RXhwcmVzc2lvbi5nZXRSaWdodE9wZXJhbmQoKSwgIjMiLCBzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIG9wZXJhdG9yIiwgaW5maXhFeHByZXNzaW9uLmdldE9wZXJhdG9yKCksIEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5USU1FUyk7Ci0JfQotCQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NjIyCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDA0NDEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDQ0MSIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkNPTVBJTEFUSU9OX1VOSVQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBwcm9ibGVtcyIsIDAsIHVuaXQuZ2V0UHJvYmxlbXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkPAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKHVuaXQsIDAsIDAsIDApOwotCQlhc3NlcnRFcXVhbHMoIk5vdCBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCIsIEFTVE5vZGUuVkFSSUFCTEVfREVDTEFSQVRJT05fU1RBVEVNRU5ULCBub2RlLmdldE5vZGVUeXBlKCkpOwotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KSBub2RlOwotCQlMaXN0IGZyYWdtZW50cyA9IHN0YXRlbWVudC5mcmFnbWVudHMoKTsKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IGZyYWdtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgZnJhZ21lbnRzLmdldCgwKTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gZnJhZ21lbnQuZ2V0SW5pdGlhbGl6ZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYW4gaW5maXggZXhwcmVzc2lvbiIsIEFTVE5vZGUuSU5GSVhfRVhQUkVTU0lPTiwgZXhwcmVzc2lvbi5nZXROb2RlVHlwZSgpKTsKLQkJSW5maXhFeHByZXNzaW9uIGluZml4RXhwcmVzc2lvbiA9IChJbmZpeEV4cHJlc3Npb24pIGV4cHJlc3Npb247Ci0JCWNoZWNrU291cmNlUmFuZ2UoaW5maXhFeHByZXNzaW9uLCAiKDIgKyAyKSAqIDMgKiAxIiwgc291cmNlKTsKLQkJRXhwcmVzc2lvbiBsZWZ0T3BlcmFuZCA9IGluZml4RXhwcmVzc2lvbi5nZXRMZWZ0T3BlcmFuZCgpOwotCQljaGVja1NvdXJjZVJhbmdlKGxlZnRPcGVyYW5kLCAiKDIgKyAyKSIsIHNvdXJjZSk7Ci0JCWNoZWNrU291cmNlUmFuZ2UoaW5maXhFeHByZXNzaW9uLmdldFJpZ2h0T3BlcmFuZCgpLCAiMyIsIHNvdXJjZSk7Ci0JCUxpc3QgZXh0ZW5kZWRPcGVyYW5kcyA9IGluZml4RXhwcmVzc2lvbi5leHRlbmRlZE9wZXJhbmRzKCk7Ci0JCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDEsIGV4dGVuZGVkT3BlcmFuZHMuc2l6ZSgpKTsKLQkJY2hlY2tTb3VyY2VSYW5nZSgoRXhwcmVzc2lvbikgZXh0ZW5kZWRPcGVyYW5kcy5nZXQoMCksICIxIiwgc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBvcGVyYXRvciIsIEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5USU1FUywgaW5maXhFeHByZXNzaW9uLmdldE9wZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NjIyCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDA0NDIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDQ0MiIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkNPTVBJTEFUSU9OX1VOSVQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBwcm9ibGVtcyIsIDAsIHVuaXQuZ2V0UHJvYmxlbXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkPAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKHVuaXQsIDAsIDAsIDApOwotCQlhc3NlcnRFcXVhbHMoIk5vdCBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCIsIEFTVE5vZGUuVkFSSUFCTEVfREVDTEFSQVRJT05fU1RBVEVNRU5ULCBub2RlLmdldE5vZGVUeXBlKCkpOwotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KSBub2RlOwotCQlMaXN0IGZyYWdtZW50cyA9IHN0YXRlbWVudC5mcmFnbWVudHMoKTsKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IGZyYWdtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgZnJhZ21lbnRzLmdldCgwKTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gZnJhZ21lbnQuZ2V0SW5pdGlhbGl6ZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYW4gaW5maXggZXhwcmVzc2lvbiIsIEFTVE5vZGUuSU5GSVhfRVhQUkVTU0lPTiwgZXhwcmVzc2lvbi5nZXROb2RlVHlwZSgpKTsKLQkJSW5maXhFeHByZXNzaW9uIGluZml4RXhwcmVzc2lvbiA9IChJbmZpeEV4cHJlc3Npb24pIGV4cHJlc3Npb247Ci0JCWNoZWNrU291cmNlUmFuZ2UoaW5maXhFeHByZXNzaW9uLCAiMiArICgyICogMykgKyAxIiwgc291cmNlKTsKLQkJRXhwcmVzc2lvbiBsZWZ0T3BlcmFuZCA9IGluZml4RXhwcmVzc2lvbi5nZXRMZWZ0T3BlcmFuZCgpOwotCQljaGVja1NvdXJjZVJhbmdlKGxlZnRPcGVyYW5kLCAiMiIsIHNvdXJjZSk7Ci0JCUV4cHJlc3Npb24gcmlnaHRPcGVyYW5kID0gaW5maXhFeHByZXNzaW9uLmdldFJpZ2h0T3BlcmFuZCgpOwotCQljaGVja1NvdXJjZVJhbmdlKHJpZ2h0T3BlcmFuZCwgIigyICogMykiLCBzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIHR5cGUiLCBBU1ROb2RlLlBBUkVOVEhFU0laRURfRVhQUkVTU0lPTiwgcmlnaHRPcGVyYW5kLmdldE5vZGVUeXBlKCkpOwotCQlMaXN0IGV4dGVuZGVkT3BlcmFuZHMgPSBpbmZpeEV4cHJlc3Npb24uZXh0ZW5kZWRPcGVyYW5kcygpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAxLCBleHRlbmRlZE9wZXJhbmRzLnNpemUoKSk7Ci0JCWNoZWNrU291cmNlUmFuZ2UoKEV4cHJlc3Npb24pIGV4dGVuZGVkT3BlcmFuZHMuZ2V0KDApLCAiMSIsIHNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscygid3Jvbmcgb3BlcmF0b3IiLCBJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUExVUywgaW5maXhFeHByZXNzaW9uLmdldE9wZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NjIzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDA0NDMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDQ0MyIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkNPTVBJTEFUSU9OX1VOSVQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBwcm9ibGVtcyIsIDIsIHVuaXQuZ2V0UHJvYmxlbXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkPAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKHVuaXQsIDAsIDApOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHR5cGUiLCBBU1ROb2RlLk1FVEhPRF9ERUNMQVJBVElPTiwgbm9kZS5nZXROb2RlVHlwZSgpKTsKLQkJTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIG5vZGU7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJvZHkiLCBtZXRob2REZWNsYXJhdGlvbi5nZXRCb2R5KCkpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgbWV0aG9kRGVjbGFyYXRpb24ucmVzb2x2ZUJpbmRpbmcoKSk7Ci0JCWFzc2VydFRydWUoIk5vdCBhbiBhYnN0cmFjdCBtZXRob2QiLCBNb2RpZmllci5pc0Fic3RyYWN0KG1ldGhvZERlY2xhcmF0aW9uLmdldE1vZGlmaWVycygpKSk7IAotCX0KLQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NjIzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDA0NDQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDQ0NCIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkNPTVBJTEFUSU9OX1VOSVQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBwcm9ibGVtcyIsIDIsIHVuaXQuZ2V0UHJvYmxlbXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkPAotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKHVuaXQsIDApOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHR5cGUiLCBBU1ROb2RlLlRZUEVfREVDTEFSQVRJT04sIG5vZGUuZ2V0Tm9kZVR5cGUoKSk7Ci0JCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKSBub2RlOwotCQlMaXN0IGJvZHlEZWNsYXJhdGlvbnMgPSB0eXBlRGVjbGFyYXRpb24uYm9keURlY2xhcmF0aW9ucygpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHNpemUiLCAyLCBib2R5RGVjbGFyYXRpb25zLnNpemUoKSk7Ci0JCUJvZHlEZWNsYXJhdGlvbiBib2R5RGVjbGFyYXRpb24gPSAoQm9keURlY2xhcmF0aW9uKWJvZHlEZWNsYXJhdGlvbnMuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHR5cGUiLCBBU1ROb2RlLk1FVEhPRF9ERUNMQVJBVElPTiwgYm9keURlY2xhcmF0aW9uLmdldE5vZGVUeXBlKCkpOwotCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbikgYm9keURlY2xhcmF0aW9uOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCAiZm9vIiwgbWV0aG9kRGVjbGFyYXRpb24uZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKSk7Ci0JCWFzc2VydE51bGwoIkdvdCBhIGJpbmRpbmciLCBtZXRob2REZWNsYXJhdGlvbi5yZXNvbHZlQmluZGluZygpKTsKLQkJYm9keURlY2xhcmF0aW9uID0gKEJvZHlEZWNsYXJhdGlvbilib2R5RGVjbGFyYXRpb25zLmdldCgxKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyB0eXBlIiwgQVNUTm9kZS5NRVRIT0RfREVDTEFSQVRJT04sIGJvZHlEZWNsYXJhdGlvbi5nZXROb2RlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgImZvbyIsICgoTWV0aG9kRGVjbGFyYXRpb24pIGJvZHlEZWNsYXJhdGlvbikuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ3NzMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQ0NSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDQ1IiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQ09NUElMQVRJT05fVU5JVCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHByb2JsZW1zIiwgMSwgdW5pdC5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQ8Ci0JfQotCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUwMTgKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQ0NigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDQ2IiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQ09NUElMQVRJT05fVU5JVCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHByb2JsZW1zIiwgMSwgdW5pdC5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQ8Ci0JfQotCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUxMjQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQ0NygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDQ3IiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQ09NUElMQVRJT05fVU5JVCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHByb2JsZW1zIiwgNCwgdW5pdC5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQ8Ci0JfQotCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUzMzAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQ0OCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDQ4IiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQ09NUElMQVRJT05fVU5JVCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHByb2JsZW1zIiwgMCwgdW5pdC5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQ8Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUodW5pdCwgMCwgMCk7Ci0JCWFzc2VydEVxdWFscygiTm90IGEgbWV0aG9kIGRlY2xhcmF0aW9uIiwgbm9kZS5nZXROb2RlVHlwZSgpLCBBU1ROb2RlLk1FVEhPRF9ERUNMQVJBVElPTik7Ci0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBub2RlOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBjb25zdHJ1Y3RvciIsIG1ldGhvZERlY2xhcmF0aW9uLmlzQ29uc3RydWN0b3IoKSk7Ci0JCUlUeXBlQmluZGluZyByZXR1cm5UeXBlQmluZGluZyA9IG1ldGhvZERlY2xhcmF0aW9uLmdldFJldHVyblR5cGUoKS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyByZXR1cm4gdHlwZSBiaW5kaW5nIiwgcmV0dXJuVHlwZUJpbmRpbmcpOwotCQlCbG9jayBibG9jayA9IG1ldGhvZERlY2xhcmF0aW9uLmdldEJvZHkoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gbWV0aG9kIGJvZHkiLCBibG9jayk7Ci0JCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDAsIGJsb2NrLnN0YXRlbWVudHMoKS5zaXplKCkpOyAKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgdGhhdCB0aGUgaW1wbGljaXQgc3VwZXIgY29uc3RydWN0b3IgY2FsbCBpcyBub3QgdGhlcmUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQ0OSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDQ5IiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQ09NUElMQVRJT05fVU5JVCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHByb2JsZW1zIiwgMCwgdW5pdC5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQ8Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUodW5pdCwgMCwgMCk7Ci0JCWFzc2VydEVxdWFscygiTm90IGEgbWV0aG9kIGRlY2xhcmF0aW9uIiwgbm9kZS5nZXROb2RlVHlwZSgpLCBBU1ROb2RlLk1FVEhPRF9ERUNMQVJBVElPTik7Ci0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBub2RlOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBjb25zdHJ1Y3RvciIsIG1ldGhvZERlY2xhcmF0aW9uLmlzQ29uc3RydWN0b3IoKSk7Ci0JCUJsb2NrIGJsb2NrID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0Qm9keSgpOwotCQlhc3NlcnROb3ROdWxsKCJObyBtZXRob2QgYm9keSIsIGJsb2NrKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMSwgYmxvY2suc3RhdGVtZW50cygpLnNpemUoKSk7IAotCX0JCi0JCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY0NTIKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQ1MCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDUwIiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQ09NUElMQVRJT05fVU5JVCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHByb2JsZW1zIiwgMCwgdW5pdC5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSh1bml0LCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSB0eXBlIGRlY2xhcmF0aW9uIiwgbm9kZS5nZXROb2RlVHlwZSgpLCBBU1ROb2RlLlRZUEVfREVDTEFSQVRJT04pOwotCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgbm9kZTsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdHlwZURlY2xhcmF0aW9uLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHR5cGUgYmluZGluZyIsIHR5cGVCaW5kaW5nKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgY2xhc3MiLCB0eXBlQmluZGluZy5pc0NsYXNzKCkpOwotCQlhc3NlcnRUcnVlKCJub3QgYSB0b3BsZXZlbCB0eXBlIiwgdHlwZUJpbmRpbmcuaXNUb3BMZXZlbCgpKTsKLQkJYXNzZXJ0VHJ1ZSgiYSBsb2NhbCB0eXBlIiwgIXR5cGVCaW5kaW5nLmlzTG9jYWwoKSk7Ci0JCWFzc2VydFRydWUoImFuIGFub255bW91cyB0eXBlIiwgIXR5cGVCaW5kaW5nLmlzQW5vbnltb3VzKCkpOwotCQlhc3NlcnRUcnVlKCJhIG1lbWJlciB0eXBlIiwgIXR5cGVCaW5kaW5nLmlzTWVtYmVyKCkpOwotCQlhc3NlcnRUcnVlKCJhIG5lc3RlZCB0eXBlIiwgIXR5cGVCaW5kaW5nLmlzTmVzdGVkKCkpOwotCQlub2RlID0gZ2V0QVNUTm9kZSh1bml0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYW4gZXhwcmVzc2lvbiBzdGF0ZW1lbnQiLCBub2RlLmdldE5vZGVUeXBlKCksIEFTVE5vZGUuRVhQUkVTU0lPTl9TVEFURU1FTlQpOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSAoKEV4cHJlc3Npb25TdGF0ZW1lbnQpIG5vZGUpLmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiIsIGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSwgQVNUTm9kZS5DTEFTU19JTlNUQU5DRV9DUkVBVElPTik7Ci0JCUNsYXNzSW5zdGFuY2VDcmVhdGlvbiBjbGFzc0luc3RhbmNlQ3JlYXRpb24gPSAoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKSBleHByZXNzaW9uOwotCQlBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIGFub255bW91c0NsYXNzRGVjbGFyYXRpb24gPSBjbGFzc0luc3RhbmNlQ3JlYXRpb24uZ2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpOwotCQl0eXBlQmluZGluZyA9IGFub255bW91c0NsYXNzRGVjbGFyYXRpb24ucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOwotCQlhc3NlcnRUcnVlKCJub3QgYSBjbGFzcyIsIHR5cGVCaW5kaW5nLmlzQ2xhc3MoKSk7Ci0JCWFzc2VydFRydWUoImEgdG9wbGV2ZWwgdHlwZSIsICF0eXBlQmluZGluZy5pc1RvcExldmVsKCkpOwotCQlhc3NlcnRUcnVlKCJub3QgYSBsb2NhbCB0eXBlIiwgdHlwZUJpbmRpbmcuaXNMb2NhbCgpKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGFuIGFub255bW91cyB0eXBlIiwgdHlwZUJpbmRpbmcuaXNBbm9ueW1vdXMoKSk7Ci0JCWFzc2VydFRydWUoImEgbWVtYmVyIHR5cGUiLCAhdHlwZUJpbmRpbmcuaXNNZW1iZXIoKSk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIG5lc3RlZCB0eXBlIiwgdHlwZUJpbmRpbmcuaXNOZXN0ZWQoKSk7Ci0JCUFTVE5vZGUgYXN0Tm9kZSA9IHVuaXQuZmluZERlY2xhcmluZ05vZGUodHlwZUJpbmRpbmcpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHR5cGUiLCBBU1ROb2RlLkFOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTiwgYXN0Tm9kZS5nZXROb2RlVHlwZSgpKTsKLQkJYXNzZXJ0TnVsbCgiR290IGEga2V5IiwgdHlwZUJpbmRpbmcuZ2V0S2V5KCkpOwotCQlhc3ROb2RlID0gdW5pdC5maW5kRGVjbGFyaW5nTm9kZSh0eXBlQmluZGluZy5nZXRLZXkoKSk7Ci0JCWFzc2VydE51bGwoIkdvdCBhIGRlY2xhcmluZyBub2RlIiwgYXN0Tm9kZSk7Ci0JCQotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmczID0gY2xhc3NJbnN0YW5jZUNyZWF0aW9uLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIGJpbmRpbmciLCB0eXBlQmluZGluZywgdHlwZUJpbmRpbmczKTsKLQkJCi0JCUxpc3QgYm9keURlY2xhcmF0aW9ucyA9IGFub255bW91c0NsYXNzRGVjbGFyYXRpb24uYm9keURlY2xhcmF0aW9ucygpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAyLCBib2R5RGVjbGFyYXRpb25zLnNpemUoKSk7Ci0JCUJvZHlEZWNsYXJhdGlvbiBib2R5RGVjbGFyYXRpb24gPSAoQm9keURlY2xhcmF0aW9uKSBib2R5RGVjbGFyYXRpb25zLmdldCgwKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgdHlwZSBkZWNsYXJhdGlvbiIsIGJvZHlEZWNsYXJhdGlvbi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuVFlQRV9ERUNMQVJBVElPTik7Ci0JCXR5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pIGJvZHlEZWNsYXJhdGlvbjsKLQkJCi0JCWJvZHlEZWNsYXJhdGlvbiA9IChCb2R5RGVjbGFyYXRpb24pIGJvZHlEZWNsYXJhdGlvbnMuZ2V0KDEpOwotCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbikgYm9keURlY2xhcmF0aW9uOwotCQlCbG9jayBibG9jayA9IG1ldGhvZERlY2xhcmF0aW9uLmdldEJvZHkoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYm9keSIsIGJsb2NrKTsKLQkJTGlzdCBzdGF0ZW1lbnRzID0gYmxvY2suc3RhdGVtZW50cygpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAyLCBzdGF0ZW1lbnRzLnNpemUoKSk7Ci0JCVN0YXRlbWVudCBzdGF0ZW1lbnQgPSAoU3RhdGVtZW50KSBzdGF0ZW1lbnRzLmdldCgxKTsKLQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQiLCBzdGF0ZW1lbnQuZ2V0Tm9kZVR5cGUoKSwgQVNUTm9kZS5WQVJJQUJMRV9ERUNMQVJBVElPTl9TVEFURU1FTlQpOwotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCkgc3RhdGVtZW50OwotCQlUeXBlIHR5cGUgPSB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50LmdldFR5cGUoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZSIsIHR5cGUpOwotCQkKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nMiA9IHR5cGUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJdHlwZUJpbmRpbmcgPSB0eXBlRGVjbGFyYXRpb24ucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGVxdWFscyIsIHR5cGVCaW5kaW5nID09IHR5cGVCaW5kaW5nMik7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHR5cGUgYmluZGluZyIsIHR5cGVCaW5kaW5nKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgY2xhc3MiLCB0eXBlQmluZGluZy5pc0NsYXNzKCkpOwotCQlhc3NlcnRUcnVlKCJhIHRvcGxldmVsIHR5cGUiLCAhdHlwZUJpbmRpbmcuaXNUb3BMZXZlbCgpKTsKLQkJYXNzZXJ0VHJ1ZSgiYW4gYW5vbnltb3VzIHR5cGUiLCAhdHlwZUJpbmRpbmcuaXNBbm9ueW1vdXMoKSk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIG1lbWJlciB0eXBlIiwgdHlwZUJpbmRpbmcuaXNNZW1iZXIoKSk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIG5lc3RlZCB0eXBlIiwgdHlwZUJpbmRpbmcuaXNOZXN0ZWQoKSk7CQkKLQkJYXNzZXJ0VHJ1ZSgiYSBsb2NhbCB0eXBlIiwgIXR5cGVCaW5kaW5nLmlzTG9jYWwoKSk7Ci0JCQotCQlib2R5RGVjbGFyYXRpb25zID0gdHlwZURlY2xhcmF0aW9uLmJvZHlEZWNsYXJhdGlvbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMSwgYm9keURlY2xhcmF0aW9ucy5zaXplKCkpOwotCQlib2R5RGVjbGFyYXRpb24gPSAoQm9keURlY2xhcmF0aW9uKSBib2R5RGVjbGFyYXRpb25zLmdldCgwKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgdHlwZSBkZWNsYXJhdGlvbiIsIGJvZHlEZWNsYXJhdGlvbi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuVFlQRV9ERUNMQVJBVElPTik7Ci0JCXR5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pIGJvZHlEZWNsYXJhdGlvbjsKLQkJdHlwZUJpbmRpbmcgPSB0eXBlRGVjbGFyYXRpb24ucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOwotCQlhc3NlcnRUcnVlKCJub3QgYSBjbGFzcyIsIHR5cGVCaW5kaW5nLmlzQ2xhc3MoKSk7Ci0JCWFzc2VydFRydWUoImEgdG9wbGV2ZWwgdHlwZSIsICF0eXBlQmluZGluZy5pc1RvcExldmVsKCkpOwotCQlhc3NlcnRUcnVlKCJhbiBhbm9ueW1vdXMgdHlwZSIsICF0eXBlQmluZGluZy5pc0Fub255bW91cygpKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgbWVtYmVyIHR5cGUiLCB0eXBlQmluZGluZy5pc01lbWJlcigpKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgbmVzdGVkIHR5cGUiLCB0eXBlQmluZGluZy5pc05lc3RlZCgpKTsJCQotCQlhc3NlcnRUcnVlKCJhIGxvY2FsIHR5cGUiLCAhdHlwZUJpbmRpbmcuaXNMb2NhbCgpKTsKLQl9Ci0JCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ5MTYKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQ1MSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDUxIiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQ09NUElMQVRJT05fVU5JVCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHByb2JsZW1zIiwgMiwgdW5pdC5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSh1bml0LCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gbm9kZSIsIG5vZGUpOwotCQlhc3NlcnRUcnVlKCJub3QgYSBtZXRob2QgZGVjbGFyYXRpb24iLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5NRVRIT0RfREVDTEFSQVRJT04pOyAvLyROT04tTkxTLTEkCi0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBub2RlOwotCQlUeXBlIHR5cGUgPSBtZXRob2REZWNsYXJhdGlvbi5nZXRSZXR1cm5UeXBlKCk7Ci0JCWNoZWNrU291cmNlUmFuZ2UodHlwZSwgImludCIsIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjcyMDQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQ1MigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgIiIsICJOT19XT1JLSU5HLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQlhc3NlcnRUcnVlKCJub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5DT01QSUxBVElPTl9VTklUKTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIG5vZGUiLCBub2RlKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgbWV0aG9kIGRlY2xhcmF0aW9uIiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuTUVUSE9EX0RFQ0xBUkFUSU9OKTsgLy8kTk9OLU5MUy0xJAotCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbikgbm9kZTsKLQkJU2ltcGxlTmFtZSBuYW1lID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0TmFtZSgpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIGxpbmUgbnVtYmVyIiwgMywgY29tcGlsYXRpb25Vbml0LmxpbmVOdW1iZXIobmFtZS5nZXRTdGFydFBvc2l0aW9uKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzE3MwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwNDUzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDA0NTMiLCAiQS5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnRUcnVlKCJub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5DT01QSUxBVElPTl9VTklUKTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCwwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gbm9kZSIsIG5vZGUpOwotCQlhc3NlcnRUcnVlKCJub3QgYSByZXR1cm4gc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuUkVUVVJOX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJUmV0dXJuU3RhdGVtZW50IHJldHVyblN0YXRlbWVudCA9IChSZXR1cm5TdGF0ZW1lbnQpIG5vZGU7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHJldHVyblN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIHN1cGVyIG1ldGhvZCBpbnZvY2F0aW9uIiwgZXhwcmVzc2lvbi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuU1VQRVJfTUVUSE9EX0lOVk9DQVRJT04pOyAvLyROT04tTkxTLTEkCi0JCVN1cGVyTWV0aG9kSW52b2NhdGlvbiBtZXRob2RJbnZvY2F0aW9uID0gKFN1cGVyTWV0aG9kSW52b2NhdGlvbikgZXhwcmVzc2lvbjsKLQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IG1ldGhvZEludm9jYXRpb24ucmVzb2x2ZU1ldGhvZEJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gbWV0aG9kIGJpbmRpbmciLCBtZXRob2RCaW5kaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBiaW5kaW5nIiwgInRvU3RyaW5nIiwgbWV0aG9kQmluZGluZy5nZXROYW1lKCkpOwotCX0JCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgyOTYKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQ1NCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDU0IiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQ09NUElMQVRJT05fVU5JVCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDAsMSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIG5vZGUiLCBub2RlKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuVkFSSUFCTEVfREVDTEFSQVRJT05fU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KSBub2RlOwotCQlMaXN0IGZyYWdtZW50cyA9IHN0YXRlbWVudC5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMSwgZnJhZ21lbnRzLnNpemUoKSk7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBmcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGZyYWdtZW50LmdldEluaXRpYWxpemVyKCk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIGNhc3QgZXhwcmVzc2lvbiIsIGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkNBU1RfRVhQUkVTU0lPTik7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShleHByZXNzaW9uLCAiKGludCkgKDMuMTRmICogYSkiLCBzb3VyY2UpOwotCQlDYXN0RXhwcmVzc2lvbiBjYXN0RXhwcmVzc2lvbiA9IChDYXN0RXhwcmVzc2lvbikgZXhwcmVzc2lvbjsKLQkJY2hlY2tTb3VyY2VSYW5nZShjYXN0RXhwcmVzc2lvbi5nZXRUeXBlKCksICJpbnQiLCBzb3VyY2UpOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24yID0gY2FzdEV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvbigpOwotCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb24yLCAiKDMuMTRmICogYSkiLCBzb3VyY2UpOwkKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uIiwgZXhwcmVzc2lvbjIuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlBBUkVOVEhFU0laRURfRVhQUkVTU0lPTik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg2ODIKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQ1NSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDU1IiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQ09NUElMQVRJT05fVU5JVCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJObyBub2RlIiwgbm9kZSk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIGZvciBzdGF0ZW1lbnQiLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5GT1JfU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlGb3JTdGF0ZW1lbnQgZm9yU3RhdGVtZW50ID0gKEZvclN0YXRlbWVudCkgbm9kZTsgLy8gZmlyc3QgZm9yIGxvb3AKLQkJU3RyaW5nIGV4cGVjdGVkU291cmNlID0gImZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgIC8vIGZvciAxXG4iICsKLQkJCSIJICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEwOyBqKyspICAvLyBmb3IgMlxuIiArCi0JCQkiCSAgICAgICAgICAgIGlmICh0cnVlKSB7IH0iOwotCQljaGVja1NvdXJjZVJhbmdlKGZvclN0YXRlbWVudCwgZXhwZWN0ZWRTb3VyY2UsIHNvdXJjZSk7Ci0JCVN0YXRlbWVudCBib2R5ID0gZm9yU3RhdGVtZW50LmdldEJvZHkoKTsKLQkJZXhwZWN0ZWRTb3VyY2UgPSAiZm9yIChpbnQgaiA9IDA7IGogPCAxMDsgaisrKSAgLy8gZm9yIDJcbiIgKwotCQkJIgkgICAgICAgICAgICBpZiAodHJ1ZSkgeyB9IjsKLQkJY2hlY2tTb3VyY2VSYW5nZShib2R5LCBleHBlY3RlZFNvdXJjZSwgc291cmNlKTsJCQotCQlhc3NlcnRUcnVlKCJub3QgYSBmb3Igc3RhdGVtZW50IiwgYm9keS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuRk9SX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJRm9yU3RhdGVtZW50IGZvclN0YXRlbWVudDIgPSAoRm9yU3RhdGVtZW50KSBib2R5OwotCQlib2R5ID0gZm9yU3RhdGVtZW50Mi5nZXRCb2R5KCk7Ci0JCWV4cGVjdGVkU291cmNlID0gImlmICh0cnVlKSB7IH0iOwotCQljaGVja1NvdXJjZVJhbmdlKGJvZHksIGV4cGVjdGVkU291cmNlLCBzb3VyY2UpOwkJCi0JfQkKLQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NjgyCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDA0NTYoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDQ1NiIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkNPTVBJTEFUSU9OX1VOSVQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gbm9kZSIsIG5vZGUpOwotCQlhc3NlcnRUcnVlKCJub3QgYSBmb3Igc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuRk9SX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJRm9yU3RhdGVtZW50IGZvclN0YXRlbWVudCA9IChGb3JTdGF0ZW1lbnQpIG5vZGU7IC8vIGZpcnN0IGZvciBsb29wCi0JCVN0cmluZyBleHBlY3RlZFNvdXJjZSA9ICJmb3IgKGludCB4PSAxMDsgeCA8IDIwOyB4KyspXG4iICsKLQkJCSIJCQltYWluKCk7IjsKLQkJY2hlY2tTb3VyY2VSYW5nZShmb3JTdGF0ZW1lbnQsIGV4cGVjdGVkU291cmNlLCBzb3VyY2UpOwotCQlTdGF0ZW1lbnQgYm9keSA9IGZvclN0YXRlbWVudC5nZXRCb2R5KCk7Ci0JCWV4cGVjdGVkU291cmNlID0gIm1haW4oKTsiOwotCQljaGVja1NvdXJjZVJhbmdlKGJvZHksIGV4cGVjdGVkU291cmNlLCBzb3VyY2UpOwkJCi0JfQotCQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NjgyCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDA0NTcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDQ1NyIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkNPTVBJTEFUSU9OX1VOSVQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gbm9kZSIsIG5vZGUpOwotCQlhc3NlcnRUcnVlKCJub3QgYSBmb3Igc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuRk9SX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJRm9yU3RhdGVtZW50IGZvclN0YXRlbWVudCA9IChGb3JTdGF0ZW1lbnQpIG5vZGU7IC8vIGZpcnN0IGZvciBsb29wCi0JCVN0cmluZyBleHBlY3RlZFNvdXJjZSA9ICJmb3IgKGludCBpPSAxMDsgaSA8IDEwOyBpKyspLypbKi9cbiIrCi0JCQkiCQkJZm9yIChpbnQgej0gMTA7IHogPCAxMDsgeisrKVxuIiArCi0JCQkiCQkJCWZvbygpOyI7Ci0JCWNoZWNrU291cmNlUmFuZ2UoZm9yU3RhdGVtZW50LCBleHBlY3RlZFNvdXJjZSwgc291cmNlKTsKLQkJU3RhdGVtZW50IGJvZHkgPSBmb3JTdGF0ZW1lbnQuZ2V0Qm9keSgpOwotCQlleHBlY3RlZFNvdXJjZSA9ICJmb3IgKGludCB6PSAxMDsgeiA8IDEwOyB6KyspXG4iICsKLQkJCSIJCQkJZm9vKCk7IjsKLQkJY2hlY2tTb3VyY2VSYW5nZShib2R5LCBleHBlY3RlZFNvdXJjZSwgc291cmNlKTsJCQotCQlhc3NlcnRUcnVlKCJub3QgYSBmb3Igc3RhdGVtZW50IiwgYm9keS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuRk9SX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJRm9yU3RhdGVtZW50IGZvclN0YXRlbWVudDIgPSAoRm9yU3RhdGVtZW50KSBib2R5OwotCQlib2R5ID0gZm9yU3RhdGVtZW50Mi5nZXRCb2R5KCk7Ci0JCWV4cGVjdGVkU291cmNlID0gImZvbygpOyI7Ci0JCWNoZWNrU291cmNlUmFuZ2UoYm9keSwgZXhwZWN0ZWRTb3VyY2UsIHNvdXJjZSk7CQkKLQl9CQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NjgyCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDA0NTgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDQ1OCIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIGNvbXBpbGF0aW9uIHVuaXQiLCByZXN1bHQuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkNPTVBJTEFUSU9OX1VOSVQpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gbm9kZSIsIG5vZGUpOwotCQlhc3NlcnRUcnVlKCJub3QgYSBmb3Igc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuRk9SX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJRm9yU3RhdGVtZW50IGZvclN0YXRlbWVudCA9IChGb3JTdGF0ZW1lbnQpIG5vZGU7IC8vIGZpcnN0IGZvciBsb29wCi0JCVN0cmluZyBleHBlY3RlZFNvdXJjZSA9ICJmb3IgKGludCBpPSAxMDsgaSA8IDEwOyBpKyspLypbKi9cbiIrCi0JCQkiCQkJZm9yIChpbnQgej0gMTA7IHogPCAxMDsgeisrKVxuIiArCi0JCQkiCQkJCTsiOwotCQljaGVja1NvdXJjZVJhbmdlKGZvclN0YXRlbWVudCwgZXhwZWN0ZWRTb3VyY2UsIHNvdXJjZSk7Ci0JCVN0YXRlbWVudCBib2R5ID0gZm9yU3RhdGVtZW50LmdldEJvZHkoKTsKLQkJZXhwZWN0ZWRTb3VyY2UgPSAiZm9yIChpbnQgej0gMTA7IHogPCAxMDsgeisrKVxuIiArCi0JCQkiCQkJCTsiOwotCQljaGVja1NvdXJjZVJhbmdlKGJvZHksIGV4cGVjdGVkU291cmNlLCBzb3VyY2UpOwkJCi0JCWFzc2VydFRydWUoIm5vdCBhIGZvciBzdGF0ZW1lbnQiLCBib2R5LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5GT1JfU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlGb3JTdGF0ZW1lbnQgZm9yU3RhdGVtZW50MiA9IChGb3JTdGF0ZW1lbnQpIGJvZHk7Ci0JCWJvZHkgPSBmb3JTdGF0ZW1lbnQyLmdldEJvZHkoKTsKLQkJZXhwZWN0ZWRTb3VyY2UgPSAiOyI7Ci0JCWNoZWNrU291cmNlUmFuZ2UoYm9keSwgZXhwZWN0ZWRTb3VyY2UsIHNvdXJjZSk7CQkKLQkJYXNzZXJ0VHJ1ZSgibm90IGFuIGVtcHR5IHN0YXRlbWVudCIsIGJvZHkuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkVNUFRZX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQl9CQotCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg2ODIKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQ1OSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDU5IiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQ09NUElMQVRJT05fVU5JVCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJObyBub2RlIiwgbm9kZSk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIGZvciBzdGF0ZW1lbnQiLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5GT1JfU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlGb3JTdGF0ZW1lbnQgZm9yU3RhdGVtZW50ID0gKEZvclN0YXRlbWVudCkgbm9kZTsgLy8gZmlyc3QgZm9yIGxvb3AKLQkJU3RyaW5nIGV4cGVjdGVkU291cmNlID0gImZvciAoaW50IGk9IDEwOyBpIDwgMTA7IGkrKykvKlsqL1xuIisKLQkJCSIJCQlmb3IgKGludCB6PSAxMDsgeiA8IDEwOyB6KyspXG4iICsKLQkJCSIJCQkJeyAgICB9IjsKLQkJY2hlY2tTb3VyY2VSYW5nZShmb3JTdGF0ZW1lbnQsIGV4cGVjdGVkU291cmNlLCBzb3VyY2UpOwotCQlTdGF0ZW1lbnQgYm9keSA9IGZvclN0YXRlbWVudC5nZXRCb2R5KCk7Ci0JCWV4cGVjdGVkU291cmNlID0gImZvciAoaW50IHo9IDEwOyB6IDwgMTA7IHorKylcbiIgKwotCQkJIgkJCQl7ICAgIH0iOwotCQljaGVja1NvdXJjZVJhbmdlKGJvZHksIGV4cGVjdGVkU291cmNlLCBzb3VyY2UpOwkJCi0JCWFzc2VydFRydWUoIm5vdCBhIGZvciBzdGF0ZW1lbnQiLCBib2R5LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5GT1JfU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlGb3JTdGF0ZW1lbnQgZm9yU3RhdGVtZW50MiA9IChGb3JTdGF0ZW1lbnQpIGJvZHk7Ci0JCWJvZHkgPSBmb3JTdGF0ZW1lbnQyLmdldEJvZHkoKTsKLQkJZXhwZWN0ZWRTb3VyY2UgPSAieyAgICB9IjsKLQkJY2hlY2tTb3VyY2VSYW5nZShib2R5LCBleHBlY3RlZFNvdXJjZSwgc291cmNlKTsJCQotCQlhc3NlcnRUcnVlKCJub3QgYSBibG9jayIsIGJvZHkuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkJMT0NLKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODg2OQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwNDYwKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAidGVzdDA0NjAiLCAiQS5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKHNvdXJjZVVuaXQsIHRydWUpOwotCQlhc3NlcnRUcnVlKCJub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5DT01QSUxBVElPTl9VTklUKTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRUcnVlKCJIYXMgZXJyb3IiLCBjb21waWxhdGlvblVuaXQuZ2V0UHJvYmxlbXMoKS5sZW5ndGggPT0gMCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJObyBub2RlIiwgbm9kZSk7Ci0JCWFzc2VydFRydWUoIk1hbGZvcm1lZCIsICFpc01hbGZvcm1lZChub2RlKSk7Ci0JfQkKLQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4ODI0Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDA0NjEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDQ2MSIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgZmFsc2UpOwotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlhc3NlcnRUcnVlKCJub3QgYSBjb21waWxhdGlvbiB1bml0IiwgcmVzdWx0LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5DT01QSUxBVElPTl9VTklUKTsgLy8kTk9OLU5MUy0xJAotCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcmVzdWx0OwotCQlhc3NlcnRUcnVlKCJIYXMgZXJyb3IiLCBjb21waWxhdGlvblVuaXQuZ2V0UHJvYmxlbXMoKS5sZW5ndGggPT0gMCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDAsIDApOwotCQlhc3NlcnROb3ROdWxsKCJObyBub2RlIiwgbm9kZSk7Ci0JCWFzc2VydFRydWUoIk1hbGZvcm1lZCIsICFpc01hbGZvcm1lZChub2RlKSk7Ci0JCWFzc2VydFRydWUoIm5vdCBhbiBleHByZXNzaW9uIHN0YXRlbWVudCIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkVYUFJFU1NJT05fU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlFeHByZXNzaW9uU3RhdGVtZW50IGV4cHJlc3Npb25TdGF0ZW1lbnQgPSAoRXhwcmVzc2lvblN0YXRlbWVudCkgbm9kZTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gZXhwcmVzc2lvblN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoIm5vdCBhbiBhc3NpZ25tZW50IiwgZXhwcmVzc2lvbi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQVNTSUdOTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJQXNzaWdubWVudCBhc3NpZ25tZW50ID0gKEFzc2lnbm1lbnQpIGV4cHJlc3Npb247Ci0JCWNoZWNrU291cmNlUmFuZ2UoYXNzaWdubWVudCwgIno9IGZvbygpLnkudG9MaXN0KCkiLCBzb3VyY2UpOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24yID0gYXNzaWdubWVudC5nZXRSaWdodEhhbmRTaWRlKCk7Ci0JCWNoZWNrU291cmNlUmFuZ2UoZXhwcmVzc2lvbjIsICJmb28oKS55LnRvTGlzdCgpIiwgc291cmNlKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgbWV0aG9kIGludm9jYXRpb24iLCBleHByZXNzaW9uMi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuTUVUSE9EX0lOVk9DQVRJT04pOwotCQlNZXRob2RJbnZvY2F0aW9uIG1ldGhvZEludm9jYXRpb24gPSAoTWV0aG9kSW52b2NhdGlvbikgZXhwcmVzc2lvbjI7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbjMgPSBtZXRob2RJbnZvY2F0aW9uLmdldEV4cHJlc3Npb24oKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShleHByZXNzaW9uMywgImZvbygpLnkiLCBzb3VyY2UpOwotCQljaGVja1NvdXJjZVJhbmdlKG1ldGhvZEludm9jYXRpb24uZ2V0TmFtZSgpLCAidG9MaXN0Iiwgc291cmNlKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgZmllbGQgYWNjZXNzIiwgZXhwcmVzc2lvbjMuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkZJRUxEX0FDQ0VTUyk7Ci0JCUZpZWxkQWNjZXNzIGZpZWxkQWNjZXNzID0gKEZpZWxkQWNjZXNzKSBleHByZXNzaW9uMzsKLQkJY2hlY2tTb3VyY2VSYW5nZShmaWVsZEFjY2Vzcy5nZXROYW1lKCksICJ5Iiwgc291cmNlKTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uNCA9IGZpZWxkQWNjZXNzLmdldEV4cHJlc3Npb24oKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShleHByZXNzaW9uNCwgImZvbygpIiwgc291cmNlKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgbWV0aG9kIGludm9jYXRpb24iLCBleHByZXNzaW9uNC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuTUVUSE9EX0lOVk9DQVRJT04pOwotCQlNZXRob2RJbnZvY2F0aW9uIG1ldGhvZEludm9jYXRpb24yID0gKE1ldGhvZEludm9jYXRpb24pIGV4cHJlc3Npb240OwotCQljaGVja1NvdXJjZVJhbmdlKG1ldGhvZEludm9jYXRpb24yLmdldE5hbWUoKSwgImZvbyIsIHNvdXJjZSk7Ci0JCWFzc2VydE51bGwoIm5vIG51bGwiLCBtZXRob2RJbnZvY2F0aW9uMi5nZXRFeHByZXNzaW9uKCkpOwotCX0JCi0KLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjMzOAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwNDYyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAiIiwgIlRlc3Q0NjIuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgY29tcGlsYXRpb24gdW5pdCIsIHJlc3VsdC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQ09NUElMQVRJT05fVU5JVCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJYXNzZXJ0VHJ1ZSgiSGFzIGVycm9yIiwgY29tcGlsYXRpb25Vbml0LmdldFByb2JsZW1zKCkubGVuZ3RoID09IDApOyAvLyROT04tTkxTLTEkCi0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gbm9kZSIsIG5vZGUpOwotCQlhc3NlcnRUcnVlKCJub3QgYSB0eXBlIGRlY2xhcmF0aW9uIiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuVFlQRV9ERUNMQVJBVElPTik7Ci0JCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKSBub2RlOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCAiVGVzdDQ2MiIsIHR5cGVEZWNsYXJhdGlvbi5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpKTsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdHlwZURlY2xhcmF0aW9uLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCB0eXBlQmluZGluZyk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJUZXN0NDYyIiwgdHlwZUJpbmRpbmcuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQl9CQotCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM0NTAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQ2MygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDYzIiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gbm9kZSIsIG5vZGUpOwotCQlhc3NlcnRUcnVlKCJub3QgYSByZXR1cm4gc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuUkVUVVJOX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJUmV0dXJuU3RhdGVtZW50IHJldHVyblN0YXRlbWVudCA9IChSZXR1cm5TdGF0ZW1lbnQpIG5vZGU7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHJldHVyblN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGV4cHJlc3Npb24iLCBleHByZXNzaW9uKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgc3RyaW5nIGxpdGVyYWwiLCBleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5TVFJJTkdfTElURVJBTCk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nTGl0ZXJhbCBzdHJpbmdMaXRlcmFsID0gKFN0cmluZ0xpdGVyYWwpIGV4cHJlc3Npb247Ci0JCWNoZWNrU291cmNlUmFuZ2Uoc3RyaW5nTGl0ZXJhbCwgIlwiXFwwMTJcXDAxNVxcdTAwNjFcIiIsIHNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgdmFsdWUiLCAiXDAxMlwwMTVhIiwgc3RyaW5nTGl0ZXJhbC5nZXRMaXRlcmFsVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgdmFsdWUiLCAiXCJcXDAxMlxcMDE1XFx1MDA2MVwiIiwgc3RyaW5nTGl0ZXJhbC5nZXRFc2NhcGVkVmFsdWUoKSk7Ci0JfQkKLQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMDM5Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDA0NjQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDQ2NCIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJObyBlcnJvciIsIDEsIGNvbXBpbGF0aW9uVW5pdC5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gbm9kZSIsIG5vZGUpOwotCQlhc3NlcnRUcnVlKCJub3QgYSByZXR1cm4gc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuUkVUVVJOX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJUmV0dXJuU3RhdGVtZW50IHJldHVyblN0YXRlbWVudCA9IChSZXR1cm5TdGF0ZW1lbnQpIG5vZGU7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHJldHVyblN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGV4cHJlc3Npb24iLCBleHByZXNzaW9uKTsKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgbnVsbCBsaXRlcmFsIiwgZXhwcmVzc2lvbi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuTlVMTF9MSVRFUkFMKTsgLy8kTk9OLU5MUy0xJAotCQlOdWxsTGl0ZXJhbCBudWxsTGl0ZXJhbCA9IChOdWxsTGl0ZXJhbCkgZXhwcmVzc2lvbjsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gbnVsbExpdGVyYWwucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIHR5cGUgYmluZGluZyIsIHR5cGVCaW5kaW5nKTsKLQkJYXNzZXJ0RmFsc2UoIkEgcHJpbWl0aXZlIHR5cGUiLCB0eXBlQmluZGluZy5pc1ByaW1pdGl2ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiTnVsbCB0eXBlIiwgdHlwZUJpbmRpbmcuaXNOdWxsVHlwZSgpKTsKLQl9CQotCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM4MzEKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQ2NSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDY1IiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDEsIDApOwotCQlhc3NlcnRFcXVhbHMoIk5vIGVycm9yIiwgMCwgY29tcGlsYXRpb25Vbml0LmdldFByb2JsZW1zKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJObyBub2RlIiwgbm9kZSk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIHJldHVybiBzdGF0ZW1lbnQiLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5SRVRVUk5fU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlSZXR1cm5TdGF0ZW1lbnQgcmV0dXJuU3RhdGVtZW50ID0gKFJldHVyblN0YXRlbWVudCkgbm9kZTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcmV0dXJuU3RhdGVtZW50LmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gZXhwcmVzc2lvbiIsIGV4cHJlc3Npb24pOwotCQlhc3NlcnRUcnVlKCJub3QgYSBmaWVsZCBhY2Nlc3MiLCBleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5GSUVMRF9BQ0NFU1MpOyAvLyROT04tTkxTLTEkCi0JCUZpZWxkQWNjZXNzIGZpZWxkQWNjZXNzID0gKEZpZWxkQWNjZXNzKSBleHByZXNzaW9uOwotCQlOYW1lIG5hbWUgPSBmaWVsZEFjY2Vzcy5nZXROYW1lKCk7Ci0JCUlCaW5kaW5nIGJpbmRpbmcgPSBuYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCBiaW5kaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyB0eXBlIiwgSUJpbmRpbmcuVkFSSUFCTEUsIGJpbmRpbmcuZ2V0S2luZCgpKTsKLQkJSVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcgPSAoSVZhcmlhYmxlQmluZGluZykgYmluZGluZzsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgImkiLCB2YXJpYWJsZUJpbmRpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyB0eXBlIiwgImludCIsIHZhcmlhYmxlQmluZGluZy5nZXRUeXBlKCkuZ2V0TmFtZSgpKTsKLQkJSVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcyID0gZmllbGRBY2Nlc3MucmVzb2x2ZUZpZWxkQmluZGluZygpOwotCQlhc3NlcnRUcnVlKCJkaWZmZXJlbnQgYmluZGluZyIsIHZhcmlhYmxlQmluZGluZyA9PSB2YXJpYWJsZUJpbmRpbmcyKTsKLQl9CQotCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM5NDkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQ2NigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlIYXNodGFibGUgb3B0aW9ucyA9IEphdmFDb3JlLmdldE9wdGlvbnMoKTsKLQkJSGFzaHRhYmxlIG5ld09wdGlvbnMgPSBKYXZhQ29yZS5nZXRPcHRpb25zKCk7Ci0JCXRyeSB7Ci0JCQluZXdPcHRpb25zLnB1dChKYXZhQ29yZS5DT01QSUxFUl9TT1VSQ0UsIEphdmFDb3JlLlZFUlNJT05fMV80KTsKLQkJCUphdmFDb3JlLnNldE9wdGlvbnMobmV3T3B0aW9ucyk7Ci0JCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDY2IiwgIkFzc2VydC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDAsIDApOwotCQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiYXNzZXJ0IHJlZiAhPSBudWxsIDogbWVzc2FnZTsiLCBzb3VyY2UpOwotCQkJYXNzZXJ0VHJ1ZSgibm90IGFuIGFzc2VydCBzdGF0ZW1lbnQiLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BU1NFUlRfU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQkJQXNzZXJ0U3RhdGVtZW50IHN0YXRlbWVudCA9IChBc3NlcnRTdGF0ZW1lbnQpIG5vZGU7Ci0JCQljaGVja1NvdXJjZVJhbmdlKHN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCksICJyZWYgIT0gbnVsbCIsIHNvdXJjZSk7Ci0JCQljaGVja1NvdXJjZVJhbmdlKHN0YXRlbWVudC5nZXRNZXNzYWdlKCksICJtZXNzYWdlIiwgc291cmNlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCUphdmFDb3JlLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM5NDkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQ2NygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlIYXNodGFibGUgb3B0aW9ucyA9IEphdmFDb3JlLmdldE9wdGlvbnMoKTsKLQkJSGFzaHRhYmxlIG5ld09wdGlvbnMgPSBKYXZhQ29yZS5nZXRPcHRpb25zKCk7Ci0JCXRyeSB7Ci0JCQluZXdPcHRpb25zLnB1dChKYXZhQ29yZS5DT01QSUxFUl9TT1VSQ0UsIEphdmFDb3JlLlZFUlNJT05fMV80KTsKLQkJCUphdmFDb3JlLnNldE9wdGlvbnMobmV3T3B0aW9ucyk7Ci0JCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDY3IiwgIkFzc2VydC5qYXZhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDAsIDApOwotCQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiYXNzZXJ0IHJlZiAhPSBudWxsIDogbWVzc2FnZVxcdTAwM0IiLCBzb3VyY2UpOwotCQkJYXNzZXJ0VHJ1ZSgibm90IGFuIGFzc2VydCBzdGF0ZW1lbnQiLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BU1NFUlRfU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQkJQXNzZXJ0U3RhdGVtZW50IHN0YXRlbWVudCA9IChBc3NlcnRTdGF0ZW1lbnQpIG5vZGU7Ci0JCQljaGVja1NvdXJjZVJhbmdlKHN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCksICJyZWYgIT0gbnVsbCIsIHNvdXJjZSk7Ci0JCQljaGVja1NvdXJjZVJhbmdlKHN0YXRlbWVudC5nZXRNZXNzYWdlKCksICJtZXNzYWdlIiwgc291cmNlKTsKLQkJCQotCQkJbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwLCAxKTsKLQkJCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImFzc2VydCByZWYgIT0gbnVsbFxcdTAwM0IiLCBzb3VyY2UpOwotCQkJYXNzZXJ0VHJ1ZSgibm90IGFuIGFzc2VydCBzdGF0ZW1lbnQiLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BU1NFUlRfU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQkJc3RhdGVtZW50ID0gKEFzc2VydFN0YXRlbWVudCkgbm9kZTsKLQkJCWNoZWNrU291cmNlUmFuZ2Uoc3RhdGVtZW50LmdldEV4cHJlc3Npb24oKSwgInJlZiAhPSBudWxsIiwgc291cmNlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCUphdmFDb3JlLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0JCX0KLQl9CQotCi0JLyoqCi0JICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzY3NzIKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDQ2OCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAiIiwgInRlc3QwNDY4IiwgIkEuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDEsIDApOwotCQlhc3NlcnRFcXVhbHMoIk5vIGVycm9yIiwgMCwgY29tcGlsYXRpb25Vbml0LmdldFByb2JsZW1zKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJObyBub2RlIiwgbm9kZSk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIHJldHVybiBzdGF0ZW1lbnQiLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5SRVRVUk5fU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlSZXR1cm5TdGF0ZW1lbnQgcmV0dXJuU3RhdGVtZW50ID0gKFJldHVyblN0YXRlbWVudCkgbm9kZTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcmV0dXJuU3RhdGVtZW50LmdldEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gZXhwcmVzc2lvbiIsIGV4cHJlc3Npb24pOwotCQlhc3NlcnRUcnVlKCJub3QgYSBmaWVsZCBhY2Nlc3MiLCBleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5GSUVMRF9BQ0NFU1MpOyAvLyROT04tTkxTLTEkCi0JCUZpZWxkQWNjZXNzIGZpZWxkQWNjZXNzID0gKEZpZWxkQWNjZXNzKSBleHByZXNzaW9uOwotCQlOYW1lIG5hbWUgPSBmaWVsZEFjY2Vzcy5nZXROYW1lKCk7Ci0JCUlCaW5kaW5nIGJpbmRpbmcgPSBuYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCBiaW5kaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyB0eXBlIiwgSUJpbmRpbmcuVkFSSUFCTEUsIGJpbmRpbmcuZ2V0S2luZCgpKTsKLQkJSVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcgPSAoSVZhcmlhYmxlQmluZGluZykgYmluZGluZzsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgImkiLCB2YXJpYWJsZUJpbmRpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyB0eXBlIiwgImludCIsIHZhcmlhYmxlQmluZGluZy5nZXRUeXBlKCkuZ2V0TmFtZSgpKTsKLQkJSVZhcmlhYmxlQmluZGluZyB2YXJpYWJsZUJpbmRpbmcyID0gZmllbGRBY2Nlc3MucmVzb2x2ZUZpZWxkQmluZGluZygpOwotCQlhc3NlcnRUcnVlKCJkaWZmZXJlbnQgYmluZGluZyIsIHZhcmlhYmxlQmluZGluZyA9PSB2YXJpYWJsZUJpbmRpbmcyKTsKLQkJCi0JCW5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIG5vZGUiLCBub2RlKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyB0eXBlIiwgQVNUTm9kZS5GSUVMRF9ERUNMQVJBVElPTiwgbm9kZS5nZXROb2RlVHlwZSgpKTsKLQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gKEZpZWxkRGVjbGFyYXRpb24pIG5vZGU7Ci0JCUxpc3QgZnJhZ21lbnRzID0gZmllbGREZWNsYXJhdGlvbi5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMSwgZnJhZ21lbnRzLnNpemUoKSk7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBmcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7Ci0JCQotCQlBU1ROb2RlIGZvdW5kTm9kZSA9IGNvbXBpbGF0aW9uVW5pdC5maW5kRGVjbGFyaW5nTm9kZSh2YXJpYWJsZUJpbmRpbmcpOwotCQlhc3NlcnROb3ROdWxsKCJObyBmb3VuZCBub2RlIiwgZm91bmROb2RlKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBub2RlIiwgZnJhZ21lbnQsIGZvdW5kTm9kZSk7Ci0JfQkJCi0KLQkvKioKLQkgKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNjg5NQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwNDY5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICIiLCAiY29kZU1hbmlwdWxhdGlvbiIsICJidWcuamF2YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihzb3VyY2VVbml0LCB0cnVlKTsKLQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIHJlc3VsdDsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDIsIDApOwotCQlhc3NlcnRFcXVhbHMoIk5vIGVycm9yIiwgMCwgY29tcGlsYXRpb25Vbml0LmdldFByb2JsZW1zKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKCJObyBub2RlIiwgbm9kZSk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudCIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlZBUklBQkxFX0RFQ0xBUkFUSU9OX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJQVNUTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudCgpOwotCQlhc3NlcnROb3ROdWxsKHBhcmVudCk7Ci0JCWFzc2VydFRydWUoIm5vdCBhIGJsb2NrIiwgcGFyZW50LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5CTE9DSyk7IC8vJE5PTi1OTFMtMSQKLQl9CQkKLQotCS8qKgotCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM3MzgxCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDA0NzAoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgIiIsICJ0ZXN0MDQ3MCIsICJBLmphdmEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oc291cmNlVW5pdCwgdHJ1ZSk7Ci0JCUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSByZXN1bHQ7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJObyBlcnJvciIsIDAsIGNvbXBpbGF0aW9uVW5pdC5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gbm9kZSIsIG5vZGUpOwotCQlhc3NlcnRUcnVlKCJub3QgYSBmb3Igc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuRk9SX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJRm9yU3RhdGVtZW50IGZvclN0YXRlbWVudCA9IChGb3JTdGF0ZW1lbnQpIG5vZGU7Ci0JCUxpc3QgaW5pdGlhbGl6ZXJzID0gZm9yU3RhdGVtZW50LmluaXRpYWxpemVycygpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAxLCBpbml0aWFsaXplcnMuc2l6ZSgpKTsKLQkJRXhwcmVzc2lvbiBpbml0aWFsaXplciA9IChFeHByZXNzaW9uKSBpbml0aWFsaXplcnMuZ2V0KDApOwotCQlhc3NlcnRUcnVlKCJub3QgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBleHByZXNzaW9uIiwgaW5pdGlhbGl6ZXIuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlZBUklBQkxFX0RFQ0xBUkFUSU9OX0VYUFJFU1NJT04pOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uIHZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uID0gKFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKSBpbml0aWFsaXplcjsKLQkJTGlzdCBmcmFnbWVudHMgPSB2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbi5mcmFnbWVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMiwgZnJhZ21lbnRzLnNpemUoKSk7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBmcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7Ci0JCWNoZWNrU291cmNlUmFuZ2UoZnJhZ21lbnQsICJpPSAwIiwgc291cmNlKTsKLQkJZnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcmFnbWVudHMuZ2V0KDEpOwotCQljaGVja1NvdXJjZVJhbmdlKGZyYWdtZW50LCAiaj0gZ29vKDMpIiwgc291cmNlKTsKLQkJY2hlY2tTb3VyY2VSYW5nZSh2YXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiwgImludCBpPSAwLCBqPSBnb28oMykiLCBzb3VyY2UpOwotCX0JCQotfQotCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZG9tL0FTVE1hdGNoZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZG9tL0FTVE1hdGNoZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0OGE3MGIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2RvbS9BU1RNYXRjaGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5kb207Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLQotLyoqCi0gKiBUZXN0IHN1aXRlIGZvciA8Y29kZT5BU1RNYXRjaGVyPC9jb2RlPiBhbmQgPGNvZGU+QVNUTm9kZS5zdWJ0cmVlTWF0Y2g8L2NvZGU+LgotICovCi1wdWJsaWMgY2xhc3MgQVNUTWF0Y2hlclRlc3QgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5qdW5pdC5leHRlbnNpb24uVGVzdENhc2UgeyAKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJanVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlKEFTVE1hdGNoZXJUZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0JCQotCQlDbGFzcyBjID0gQVNUTWF0Y2hlclRlc3QuY2xhc3M7Ci0JCU1ldGhvZFtdIG1ldGhvZHMgPSBjLmdldE1ldGhvZHMoKTsKLQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG1ldGhvZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCWlmIChtZXRob2RzW2ldLmdldE5hbWUoKS5zdGFydHNXaXRoKCJ0ZXN0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXN1aXRlLmFkZFRlc3QobmV3IEFTVE1hdGNoZXJUZXN0KG1ldGhvZHNbaV0uZ2V0TmFtZSgpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1aXRlOwotCX0JCi0JCi0JQVNUIGFzdDsKLQlTaW1wbGVOYW1lIE4xOwotCVN0cmluZyBOMVM7Ci0JU2ltcGxlTmFtZSBOMjsKLQlTdHJpbmcgTjJTOwotCVNpbXBsZU5hbWUgTjM7Ci0JU3RyaW5nIE4zUzsKLQlFeHByZXNzaW9uIEUxOwotCVN0cmluZyBFMVM7Ci0JRXhwcmVzc2lvbiBFMjsKLQlTdHJpbmcgRTJTOwotCVR5cGUgVDE7Ci0JU3RyaW5nIFQxUzsKLQlTdGF0ZW1lbnQgUzE7Ci0JU3RyaW5nIFMxUzsKLQlTdGF0ZW1lbnQgUzI7Ci0JQmxvY2sgQjE7Ci0JU3RyaW5nIEIxUzsKLQlTdHJpbmcgUzJTOwotCVNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gVjE7Ci0JU3RyaW5nIFYxUzsKLQlTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIFYyOwotCVN0cmluZyBWMlM7Ci0JVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IFcxOwotCVN0cmluZyBXMVM7Ci0JVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IFcyOwotCVN0cmluZyBXMlM7Ci0JRmllbGREZWNsYXJhdGlvbiBGRDE7Ci0JU3RyaW5nIEZEMVM7Ci0JRmllbGREZWNsYXJhdGlvbiBGRDI7Ci0JU3RyaW5nIEZEMlM7Ci0JUGFja2FnZURlY2xhcmF0aW9uIFBEMTsKLQlTdHJpbmcgUEQxUzsKLQlJbXBvcnREZWNsYXJhdGlvbiBJRDE7Ci0JU3RyaW5nIElEMVM7Ci0JSW1wb3J0RGVjbGFyYXRpb24gSUQyOwotCVN0cmluZyBJRDJTOwotCVR5cGVEZWNsYXJhdGlvbiBURDE7Ci0JU3RyaW5nIFREMVM7Ci0JVHlwZURlY2xhcmF0aW9uIFREMjsKLQlTdHJpbmcgVEQyUzsKLQlBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIEFDRDE7Ci0JU3RyaW5nIEFDRDFTOwotCUphdmFkb2MgSkQxOwotCVN0cmluZyBKRDFTOwotCUphdmFkb2MgSkQyOwotCVN0cmluZyBKRDJTOwotCQotCWZpbmFsIFN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQotCXB1YmxpYyBBU1RNYXRjaGVyVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JCWFzdCA9IG5ldyBBU1QoKTsKLQkJTjEgPSBhc3QubmV3U2ltcGxlTmFtZSgiTiIpOyAvLyROT04tTkxTLTEkCi0JCU4xUyA9ICIoblNOTm5TKSI7IC8vJE5PTi1OTFMtMSQKLQkJTjIgPSBhc3QubmV3U2ltcGxlTmFtZSgiTSIpOyAvLyROT04tTkxTLTEkCi0JCU4yUyA9ICIoblNNTW5TKSI7IC8vJE5PTi1OTFMtMSQKLQkJTjMgPSBhc3QubmV3U2ltcGxlTmFtZSgiTyIpOyAvLyROT04tTkxTLTEkCi0JCU4zUyA9ICIoblNPT25TKSI7IC8vJE5PTi1OTFMtMSQKLQkJRTEgPSBhc3QubmV3U2ltcGxlTmFtZSgiWCIpOyAvLyROT04tTkxTLTEkCi0JCUUxUyA9ICIoblNYWG5TKSI7IC8vJE5PTi1OTFMtMSQKLQkJRTIgPSBhc3QubmV3U2ltcGxlTmFtZSgiWSIpOyAvLyROT04tTkxTLTEkCi0JCUUyUyA9ICIoblNZWW5TKSI7IC8vJE5PTi1OTFMtMSQKLQkJVDEgPSBhc3QubmV3U2ltcGxlVHlwZShhc3QubmV3U2ltcGxlTmFtZSgiWiIpKTsgLy8kTk9OLU5MUy0xJAotCQlUMVMgPSAiKHRTKG5TWlpuUyl0UykiOyAvLyROT04tTkxTLTEkCi0JCVMxID0gYXN0Lm5ld0NvbnRpbnVlU3RhdGVtZW50KCk7Ci0JCVMxUyA9ICIoc0NOc0NOKSI7IC8vJE5PTi1OTFMtMSQKLQkJUzIgPSBhc3QubmV3QnJlYWtTdGF0ZW1lbnQoKTsKLQkJUzJTID0gIihzQlJzQlIpIjsgLy8kTk9OLU5MUy0xJAotCQlCMSA9IGFzdC5uZXdCbG9jaygpOwotCQlCMVMgPSAiKHNCc0IpIjsgLy8kTk9OLU5MUy0xJAotCQlWMSA9IGFzdC5uZXdTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKCk7Ci0JCVYxLnNldFR5cGUoYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5JTlQpKTsKLQkJVjEuc2V0TmFtZShhc3QubmV3U2ltcGxlTmFtZSgiYSIpKTsgLy8kTk9OLU5MUy0xJAotCQlWMVMgPSAiKFZEKHRQaW50aW50dFApKG5TYWFuUylWRCkiOyAvLyROT04tTkxTLTEkCi0JCVYyID0gYXN0Lm5ld1NpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24oKTsKLQkJVjIuc2V0VHlwZShhc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLkJZVEUpKTsKLQkJVjIuc2V0TmFtZShhc3QubmV3U2ltcGxlTmFtZSgiYiIpKTsgLy8kTk9OLU5MUy0xJAotCQlWMlMgPSAiKFZEKHRQYnl0ZWJ5dGV0UCkoblNiYm5TKVZEKSI7IC8vJE5PTi1OTFMtMSQKLQkJVzEgPSBhc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCVcxLnNldE5hbWUoYXN0Lm5ld1NpbXBsZU5hbWUoImEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJVzFTID0gIihWUyhuU2FhblMpVlMpIjsgLy8kTk9OLU5MUy0xJAotCQlXMiA9IGFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJVzIuc2V0TmFtZShhc3QubmV3U2ltcGxlTmFtZSgiYiIpKTsgLy8kTk9OLU5MUy0xJAotCQlXMlMgPSAiKFZTKG5TYmJuUylWUykiOyAvLyROT04tTkxTLTEkCi0JCXsKLQkJCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB0ZW1wID0gYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQkJdGVtcC5zZXROYW1lKGFzdC5uZXdTaW1wbGVOYW1lKCJmIikpOyAvLyROT04tTkxTLTEkCi0JCQlGRDEgPSBhc3QubmV3RmllbGREZWNsYXJhdGlvbih0ZW1wKTsKLQkJCUZEMS5zZXRUeXBlKGFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuSU5UKSk7Ci0JCQlGRDFTID0gIihGRCh0UGludGludHRQKShWUyhuU2ZmblMpVlMpRkQpIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXsKLQkJCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB0ZW1wID0gYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQkJdGVtcC5zZXROYW1lKGFzdC5uZXdTaW1wbGVOYW1lKCJnIikpOyAvLyROT04tTkxTLTEkCi0JCQlGRDIgPSBhc3QubmV3RmllbGREZWNsYXJhdGlvbih0ZW1wKTsKLQkJCUZEMi5zZXRUeXBlKGFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuQ0hBUikpOwotCQkJRkQyUyA9ICIoRkQodFBjaGFyY2hhcnRQKShWUyhuU2dnblMpVlMpRkQpIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVBEMSA9IGFzdC5uZXdQYWNrYWdlRGVjbGFyYXRpb24oKTsKLQkJUEQxLnNldE5hbWUoYXN0Lm5ld1NpbXBsZU5hbWUoInAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJUEQxUyA9ICIoUEQoblNwcG5TKVBEKSI7IC8vJE5PTi1OTFMtMSQKLQkJSUQxID0gYXN0Lm5ld0ltcG9ydERlY2xhcmF0aW9uKCk7Ci0JCUlEMS5zZXROYW1lKGFzdC5uZXdTaW1wbGVOYW1lKCJpIikpOyAvLyROT04tTkxTLTEkCi0JCUlEMVMgPSAiKElEKG5TaWluUylJRCkiOyAvLyROT04tTkxTLTEkCi0JCUlEMiA9IGFzdC5uZXdJbXBvcnREZWNsYXJhdGlvbigpOwotCQlJRDIuc2V0TmFtZShhc3QubmV3U2ltcGxlTmFtZSgiaiIpKTsgLy8kTk9OLU5MUy0xJAotCQlJRDJTID0gIihJRChuU2pqblMpSUQpIjsgLy8kTk9OLU5MUy0xJAotCQlURDEgPSBhc3QubmV3VHlwZURlY2xhcmF0aW9uKCk7Ci0JCVREMS5zZXROYW1lKGFzdC5uZXdTaW1wbGVOYW1lKCJjIikpOyAvLyROT04tTkxTLTEkCi0JCVREMVMgPSAiKFREKG5TY2NuUylURCkiOyAvLyROT04tTkxTLTEkCi0JCVREMiA9IGFzdC5uZXdUeXBlRGVjbGFyYXRpb24oKTsKLQkJVEQyLnNldE5hbWUoYXN0Lm5ld1NpbXBsZU5hbWUoImQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJVEQyUyA9ICIoVEQoblNkZG5TKVREKSI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUFDRDEgPSBhc3QubmV3QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpOwotCQlBQ0QxUyA9ICIoQUNEQUNEKSI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUpEMSA9IGFzdC5uZXdKYXZhZG9jKCk7Ci0JCUpEMS5zZXRDb21tZW50KCIvKipYKi8iKTsgLy8kTk9OLU5MUy0xJAotCQlKRDFTID0gIihKRC8qKlgqLy8qKlgqL0pEKSI7IC8vJE5PTi1OTFMtMSQKLQkJSkQyID0gYXN0Lm5ld0phdmFkb2MoKTsKLQkJSkQyLnNldENvbW1lbnQoIi8qKlkqLyIpOyAvLyROT04tTkxTLTEkCi0JCUpEMlMgPSAiKEpELyoqWSovLyoqWSovSkQpIjsgLy8kTk9OLU5MUy0xJAotCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCQlhc3QgPSBudWxsOwotCX0KLQkKLQkKLQkvKioKLQkgKiBBbiBBU1RNYXRjaGVyIHRoYXQgc2ltcGx5IHJlY29yZHMgdGhlIGFyZ3VtZW50cyBpdCBpcyBwYXNzZWQsCi0JICogaW1tZWRpYXRlbHkgcmV0dXJucyBhIHByZS1vcmRhaW5lZCBhbnN3ZXIsIGFuZCBjb3VudHMgaG93IG1hbnkKLQkgKiB0aW1lcyBpdCBpcyBjYWxsZWQuCi0JICovCi0JY2xhc3MgVGVzdE1hdGNoZXIgZXh0ZW5kcyBBU1RNYXRjaGVyIHsKLQotCQlwdWJsaWMgT2JqZWN0IHJlY2VpdmVyTm9kZTsKLQkJcHVibGljIE9iamVjdCBvdGhlck5vZGU7Ci0JCXB1YmxpYyBib29sZWFuIHJlc3VsdDsKLQkJcHVibGljIGJvb2xlYW4gc3VwZXJNYXRjaDsKLQkJcHVibGljIGJvb2xlYW4gc3VwZXJNYXRjaFJlc3VsdDsKLQkJcHVibGljIGludCBtYXRjaENhbGxzID0gMDsKLQotCQlUZXN0TWF0Y2hlcigpIHsKLQkJfQotCi0JCWJvb2xlYW4gc3RhbmRhcmRCb2R5KEFTVE5vZGUgcmVjZWl2ZXIsIE9iamVjdCBvdGhlciwgYm9vbGVhbiBtYXRjaFJlc3VsdCkgewotCQkJbWF0Y2hDYWxscysrOwotCQkJdGhpcy5yZWNlaXZlck5vZGUgPSByZWNlaXZlcjsKLQkJCXRoaXMub3RoZXJOb2RlID0gb3RoZXI7Ci0JCQl0aGlzLnN1cGVyTWF0Y2hSZXN1bHQgPSBtYXRjaFJlc3VsdDsKLQkJCWlmIChzdXBlck1hdGNoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3VwZXJNYXRjaFJlc3VsdDsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHRoaXMucmVzdWx0OwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCXJldHVybiBzdGFuZGFyZEJvZHkobm9kZSwgb3RoZXIsIHN1cGVyTWF0Y2ggPyBzdXBlci5tYXRjaChub2RlLCBvdGhlcikgOiBmYWxzZSk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goQXJyYXlBY2Nlc3Mgbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRCb2R5KG5vZGUsIG90aGVyLCBzdXBlck1hdGNoID8gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpIDogZmFsc2UpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoKEFycmF5Q3JlYXRpb24gbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRCb2R5KG5vZGUsIG90aGVyLCBzdXBlck1hdGNoID8gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpIDogZmFsc2UpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoKEFycmF5SW5pdGlhbGl6ZXIgbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRCb2R5KG5vZGUsIG90aGVyLCBzdXBlck1hdGNoID8gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpIDogZmFsc2UpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoKEFycmF5VHlwZSBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCXJldHVybiBzdGFuZGFyZEJvZHkobm9kZSwgb3RoZXIsIHN1cGVyTWF0Y2ggPyBzdXBlci5tYXRjaChub2RlLCBvdGhlcikgOiBmYWxzZSk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goQXNzZXJ0U3RhdGVtZW50IG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJcmV0dXJuIHN0YW5kYXJkQm9keShub2RlLCBvdGhlciwgc3VwZXJNYXRjaCA/IHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKSA6IGZhbHNlKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChBc3NpZ25tZW50IG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJcmV0dXJuIHN0YW5kYXJkQm9keShub2RlLCBvdGhlciwgc3VwZXJNYXRjaCA/IHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKSA6IGZhbHNlKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChCbG9jayBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCXJldHVybiBzdGFuZGFyZEJvZHkobm9kZSwgb3RoZXIsIHN1cGVyTWF0Y2ggPyBzdXBlci5tYXRjaChub2RlLCBvdGhlcikgOiBmYWxzZSk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goQm9vbGVhbkxpdGVyYWwgbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRCb2R5KG5vZGUsIG90aGVyLCBzdXBlck1hdGNoID8gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpIDogZmFsc2UpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoKEJyZWFrU3RhdGVtZW50IG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJcmV0dXJuIHN0YW5kYXJkQm9keShub2RlLCBvdGhlciwgc3VwZXJNYXRjaCA/IHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKSA6IGZhbHNlKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChDYXN0RXhwcmVzc2lvbiBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCXJldHVybiBzdGFuZGFyZEJvZHkobm9kZSwgb3RoZXIsIHN1cGVyTWF0Y2ggPyBzdXBlci5tYXRjaChub2RlLCBvdGhlcikgOiBmYWxzZSk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goQ2F0Y2hDbGF1c2Ugbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRCb2R5KG5vZGUsIG90aGVyLCBzdXBlck1hdGNoID8gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpIDogZmFsc2UpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoKENoYXJhY3RlckxpdGVyYWwgbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRCb2R5KG5vZGUsIG90aGVyLCBzdXBlck1hdGNoID8gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpIDogZmFsc2UpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoKENsYXNzSW5zdGFuY2VDcmVhdGlvbiBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCXJldHVybiBzdGFuZGFyZEJvZHkobm9kZSwgb3RoZXIsIHN1cGVyTWF0Y2ggPyBzdXBlci5tYXRjaChub2RlLCBvdGhlcikgOiBmYWxzZSk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goQ29tcGlsYXRpb25Vbml0IG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJcmV0dXJuIHN0YW5kYXJkQm9keShub2RlLCBvdGhlciwgc3VwZXJNYXRjaCA/IHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKSA6IGZhbHNlKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChDb25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRCb2R5KG5vZGUsIG90aGVyLCBzdXBlck1hdGNoID8gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpIDogZmFsc2UpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoKENvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCXJldHVybiBzdGFuZGFyZEJvZHkobm9kZSwgb3RoZXIsIHN1cGVyTWF0Y2ggPyBzdXBlci5tYXRjaChub2RlLCBvdGhlcikgOiBmYWxzZSk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goQ29udGludWVTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRCb2R5KG5vZGUsIG90aGVyLCBzdXBlck1hdGNoID8gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpIDogZmFsc2UpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoKERvU3RhdGVtZW50IG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJcmV0dXJuIHN0YW5kYXJkQm9keShub2RlLCBvdGhlciwgc3VwZXJNYXRjaCA/IHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKSA6IGZhbHNlKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChFbXB0eVN0YXRlbWVudCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCXJldHVybiBzdGFuZGFyZEJvZHkobm9kZSwgb3RoZXIsIHN1cGVyTWF0Y2ggPyBzdXBlci5tYXRjaChub2RlLCBvdGhlcikgOiBmYWxzZSk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goRXhwcmVzc2lvblN0YXRlbWVudCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCXJldHVybiBzdGFuZGFyZEJvZHkobm9kZSwgb3RoZXIsIHN1cGVyTWF0Y2ggPyBzdXBlci5tYXRjaChub2RlLCBvdGhlcikgOiBmYWxzZSk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goRmllbGRBY2Nlc3Mgbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRCb2R5KG5vZGUsIG90aGVyLCBzdXBlck1hdGNoID8gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpIDogZmFsc2UpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoKEZpZWxkRGVjbGFyYXRpb24gbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRCb2R5KG5vZGUsIG90aGVyLCBzdXBlck1hdGNoID8gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpIDogZmFsc2UpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoKEZvclN0YXRlbWVudCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCXJldHVybiBzdGFuZGFyZEJvZHkobm9kZSwgb3RoZXIsIHN1cGVyTWF0Y2ggPyBzdXBlci5tYXRjaChub2RlLCBvdGhlcikgOiBmYWxzZSk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goSWZTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRCb2R5KG5vZGUsIG90aGVyLCBzdXBlck1hdGNoID8gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpIDogZmFsc2UpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoKEltcG9ydERlY2xhcmF0aW9uIG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJcmV0dXJuIHN0YW5kYXJkQm9keShub2RlLCBvdGhlciwgc3VwZXJNYXRjaCA/IHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKSA6IGZhbHNlKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChJbmZpeEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRCb2R5KG5vZGUsIG90aGVyLCBzdXBlck1hdGNoID8gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpIDogZmFsc2UpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoKEluaXRpYWxpemVyIG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJcmV0dXJuIHN0YW5kYXJkQm9keShub2RlLCBvdGhlciwgc3VwZXJNYXRjaCA/IHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKSA6IGZhbHNlKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChKYXZhZG9jIG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJcmV0dXJuIHN0YW5kYXJkQm9keShub2RlLCBvdGhlciwgc3VwZXJNYXRjaCA/IHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKSA6IGZhbHNlKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChMYWJlbGVkU3RhdGVtZW50IG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJcmV0dXJuIHN0YW5kYXJkQm9keShub2RlLCBvdGhlciwgc3VwZXJNYXRjaCA/IHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKSA6IGZhbHNlKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChNZXRob2REZWNsYXJhdGlvbiBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCXJldHVybiBzdGFuZGFyZEJvZHkobm9kZSwgb3RoZXIsIHN1cGVyTWF0Y2ggPyBzdXBlci5tYXRjaChub2RlLCBvdGhlcikgOiBmYWxzZSk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goTWV0aG9kSW52b2NhdGlvbiBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCXJldHVybiBzdGFuZGFyZEJvZHkobm9kZSwgb3RoZXIsIHN1cGVyTWF0Y2ggPyBzdXBlci5tYXRjaChub2RlLCBvdGhlcikgOiBmYWxzZSk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goTnVsbExpdGVyYWwgbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRCb2R5KG5vZGUsIG90aGVyLCBzdXBlck1hdGNoID8gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpIDogZmFsc2UpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoKE51bWJlckxpdGVyYWwgbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRCb2R5KG5vZGUsIG90aGVyLCBzdXBlck1hdGNoID8gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpIDogZmFsc2UpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoKFBhY2thZ2VEZWNsYXJhdGlvbiBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCXJldHVybiBzdGFuZGFyZEJvZHkobm9kZSwgb3RoZXIsIHN1cGVyTWF0Y2ggPyBzdXBlci5tYXRjaChub2RlLCBvdGhlcikgOiBmYWxzZSk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goUGFyZW50aGVzaXplZEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRCb2R5KG5vZGUsIG90aGVyLCBzdXBlck1hdGNoID8gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpIDogZmFsc2UpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoKFBvc3RmaXhFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJcmV0dXJuIHN0YW5kYXJkQm9keShub2RlLCBvdGhlciwgc3VwZXJNYXRjaCA/IHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKSA6IGZhbHNlKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChQcmVmaXhFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJcmV0dXJuIHN0YW5kYXJkQm9keShub2RlLCBvdGhlciwgc3VwZXJNYXRjaCA/IHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKSA6IGZhbHNlKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChQcmltaXRpdmVUeXBlIG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJcmV0dXJuIHN0YW5kYXJkQm9keShub2RlLCBvdGhlciwgc3VwZXJNYXRjaCA/IHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKSA6IGZhbHNlKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChRdWFsaWZpZWROYW1lIG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJcmV0dXJuIHN0YW5kYXJkQm9keShub2RlLCBvdGhlciwgc3VwZXJNYXRjaCA/IHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKSA6IGZhbHNlKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChSZXR1cm5TdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRCb2R5KG5vZGUsIG90aGVyLCBzdXBlck1hdGNoID8gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpIDogZmFsc2UpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoKFNpbXBsZU5hbWUgbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRCb2R5KG5vZGUsIG90aGVyLCBzdXBlck1hdGNoID8gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpIDogZmFsc2UpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoKFNpbXBsZVR5cGUgbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRCb2R5KG5vZGUsIG90aGVyLCBzdXBlck1hdGNoID8gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpIDogZmFsc2UpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRCb2R5KG5vZGUsIG90aGVyLCBzdXBlck1hdGNoID8gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpIDogZmFsc2UpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoKFN0cmluZ0xpdGVyYWwgbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRCb2R5KG5vZGUsIG90aGVyLCBzdXBlck1hdGNoID8gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpIDogZmFsc2UpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoKFN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJcmV0dXJuIHN0YW5kYXJkQm9keShub2RlLCBvdGhlciwgc3VwZXJNYXRjaCA/IHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKSA6IGZhbHNlKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChTdXBlckZpZWxkQWNjZXNzIG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJcmV0dXJuIHN0YW5kYXJkQm9keShub2RlLCBvdGhlciwgc3VwZXJNYXRjaCA/IHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKSA6IGZhbHNlKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChTdXBlck1ldGhvZEludm9jYXRpb24gbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRCb2R5KG5vZGUsIG90aGVyLCBzdXBlck1hdGNoID8gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpIDogZmFsc2UpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoKFN3aXRjaENhc2Ugbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRCb2R5KG5vZGUsIG90aGVyLCBzdXBlck1hdGNoID8gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpIDogZmFsc2UpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoKFN3aXRjaFN0YXRlbWVudCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCXJldHVybiBzdGFuZGFyZEJvZHkobm9kZSwgb3RoZXIsIHN1cGVyTWF0Y2ggPyBzdXBlci5tYXRjaChub2RlLCBvdGhlcikgOiBmYWxzZSk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goU3luY2hyb25pemVkU3RhdGVtZW50IG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJcmV0dXJuIHN0YW5kYXJkQm9keShub2RlLCBvdGhlciwgc3VwZXJNYXRjaCA/IHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKSA6IGZhbHNlKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChUaGlzRXhwcmVzc2lvbiBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCXJldHVybiBzdGFuZGFyZEJvZHkobm9kZSwgb3RoZXIsIHN1cGVyTWF0Y2ggPyBzdXBlci5tYXRjaChub2RlLCBvdGhlcikgOiBmYWxzZSk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goVGhyb3dTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRCb2R5KG5vZGUsIG90aGVyLCBzdXBlck1hdGNoID8gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpIDogZmFsc2UpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoKFRyeVN0YXRlbWVudCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCXJldHVybiBzdGFuZGFyZEJvZHkobm9kZSwgb3RoZXIsIHN1cGVyTWF0Y2ggPyBzdXBlci5tYXRjaChub2RlLCBvdGhlcikgOiBmYWxzZSk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goVHlwZURlY2xhcmF0aW9uIG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJcmV0dXJuIHN0YW5kYXJkQm9keShub2RlLCBvdGhlciwgc3VwZXJNYXRjaCA/IHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKSA6IGZhbHNlKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRCb2R5KG5vZGUsIG90aGVyLCBzdXBlck1hdGNoID8gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpIDogZmFsc2UpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoKFR5cGVMaXRlcmFsIG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJcmV0dXJuIHN0YW5kYXJkQm9keShub2RlLCBvdGhlciwgc3VwZXJNYXRjaCA/IHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKSA6IGZhbHNlKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCXJldHVybiBzdGFuZGFyZEJvZHkobm9kZSwgb3RoZXIsIHN1cGVyTWF0Y2ggPyBzdXBlci5tYXRjaChub2RlLCBvdGhlcikgOiBmYWxzZSk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJcmV0dXJuIHN0YW5kYXJkQm9keShub2RlLCBvdGhlciwgc3VwZXJNYXRjaCA/IHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKSA6IGZhbHNlKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJcmV0dXJuIHN0YW5kYXJkQm9keShub2RlLCBvdGhlciwgc3VwZXJNYXRjaCA/IHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKSA6IGZhbHNlKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChXaGlsZVN0YXRlbWVudCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCXJldHVybiBzdGFuZGFyZEJvZHkobm9kZSwgb3RoZXIsIHN1cGVyTWF0Y2ggPyBzdXBlci5tYXRjaChub2RlLCBvdGhlcikgOiBmYWxzZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQVNUIG5vZGUgdmlzaXRvciB0aGF0IGNvdW50cyB0aGUgbm9kZXMgdmlzaXRlZC4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgTm9kZUNvdW50ZXIgZXh0ZW5kcyBBU1RWaXNpdG9yIHsKLQkJcHVibGljIGludCBjb3VudCA9IDA7Ci0KLQkJLyogKG5vIGphdmFkb2MgZm9yIHRoaXMgbWV0aG9kKQotCQkgKiBNZXRob2QgZGVjbGFyZWQgb24gQVNUVmlzaXRvci4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHByZVZpc2l0KEFTVE5vZGUgbm9kZSkgewotCQkJY291bnQrKzsKLQkJfQotCi0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBBU1Qgbm9kZXMgaW4gdGhlIGdpdmVuIHN1YnRyZWUuCi0JICogCi0JICogQHBhcmFtIG5vZGUgdGhlIHJvb3Qgb2YgdGhlIHN1YnRyZWUKLQkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2Ygbm9kZXMgKGFsd2F5cyBwb3NpdGl2ZSkKLQkgKi8KLQlzdGF0aWMgaW50IG5vZGVDb3VudChBU1ROb2RlIG5vZGUpIHsKLQkJTm9kZUNvdW50ZXIgYyA9IG5ldyBOb2RlQ291bnRlcigpOwotCQlub2RlLmFjY2VwdChjKTsKLQkJcmV0dXJuIGMuY291bnQ7Ci0JfQkJCi0JCi0JLyoqCi0JICogQ2hlY2tzIHRoYXQgdGhlIEFTVE5vZGUuc3VidHJlZU1hdGNoIG1lY2hhbmlzbSBpcyB3b3JraW5nCi0JICogZm9yIGEgbm9kZSBvZiBhIGdpdmVuIHR5cGUuIAotCSAqLwotCXZvaWQgYmFzaWNNYXRjaChBU1ROb2RlIG5vZGUpIHsKLQkJaW50IGNvdW50ID0gbm9kZUNvdW50KG5vZGUpOwotCQkKLQkJLy8gY2hlY2sgdGhhdCBtYXRjaGVyIHdhcyBjYWxsZWQgd2l0aCByaWdodCBhcmd1bWVudHMKLQkJLy8gYW5kIHRoYXQgbWF0Y2hlcyBzdWNjZWVkCi0JCVRlc3RNYXRjaGVyIG0xID0gbmV3IFRlc3RNYXRjaGVyKCk7Ci0JCU9iamVjdCBvMSA9IG5ldyBPYmplY3QoKTsKLQkJbTEucmVzdWx0ID0gdHJ1ZTsKLQkJYm9vbGVhbiByZXN1bHQgPSBub2RlLnN1YnRyZWVNYXRjaChtMSwgbzEpOwotCQlhc3NlcnRUcnVlKG0xLm1hdGNoQ2FsbHMgPT0gMSk7Ci0JCWFzc2VydFRydWUobTEucmVjZWl2ZXJOb2RlID09IG5vZGUpOwotCQlhc3NlcnRUcnVlKG0xLm90aGVyTm9kZSA9PSBvMSk7Ci0JCWFzc2VydFRydWUocmVzdWx0ID09IHRydWUpOwotCQkKLQkJLy8gY2hlY2sgdGhhdCBtYXRjaGVyIHdhcyBjYWxsZWQgd2l0aCByaWdodCBhcmd1bWVudHMKLQkJLy8gYW5kIHRoYXQgbm9uLW1hdGNoZXMgZmFpbAotCQltMSA9IG5ldyBUZXN0TWF0Y2hlcigpOwotCQlvMSA9IG5ldyBPYmplY3QoKTsKLQkJbTEucmVzdWx0ID0gZmFsc2U7Ci0JCXJlc3VsdCA9IG5vZGUuc3VidHJlZU1hdGNoKG0xLCBvMSk7Ci0JCWFzc2VydFRydWUobTEubWF0Y2hDYWxscyA9PSAxKTsKLQkJYXNzZXJ0VHJ1ZShtMS5yZWNlaXZlck5vZGUgPT0gbm9kZSk7Ci0JCWFzc2VydFRydWUobTEub3RoZXJOb2RlID09IG8xKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQgPT0gZmFsc2UpOwotCQkKLQkJLy8gY2hlY2sgdGhhdCBBU1RNYXRjaGVyIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGRlbGVnYXRlCi0JCW0xID0gbmV3IFRlc3RNYXRjaGVyKCk7Ci0JCW0xLnN1cGVyTWF0Y2ggPSB0cnVlOwotCQlyZXN1bHQgPSBub2RlLnN1YnRyZWVNYXRjaChtMSwgbm9kZSk7Ci0JCWFzc2VydFRydWUobTEubWF0Y2hDYWxscyA9PSBjb3VudCk7Ci0JCWFzc2VydFRydWUocmVzdWx0ID09IHRydWUpOwotCQkKLQl9Ci0KLQkvLyBOQU1FUwotCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVOYW1lKCkgewotCQlOYW1lIHgxID0gYXN0Lm5ld05hbWUobmV3IFN0cmluZ1tdeyJaIn0pOyAvLyROT04tTkxTLTEkCi0JCWJhc2ljTWF0Y2goeDEpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RRdWFsaWZpZWROYW1lKCkgewotCQlOYW1lIHgxID0gYXN0Lm5ld05hbWUobmV3IFN0cmluZ1tdeyJYIiwgIlkifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQliYXNpY01hdGNoKHgxKTsKLQl9Ci0KLQkKLQkvLyBUWVBFUwotCXB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVUeXBlKCkgewotCQlUeXBlIHgxID0gYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5DSEFSKTsKLQkJYmFzaWNNYXRjaCh4MSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbXBsZVR5cGUoKSB7Ci0JCVR5cGUgeDEgPSBhc3QubmV3U2ltcGxlVHlwZShhc3QubmV3TmFtZShuZXcgU3RyaW5nW117IloifSkpOyAvLyROT04tTkxTLTEkCi0JCWJhc2ljTWF0Y2goeDEpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheVR5cGUoKSB7Ci0JCVR5cGUgeDAgPSBhc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLkNIQVIpOwotCQlUeXBlIHgxID0gYXN0Lm5ld0FycmF5VHlwZSh4MCk7Ci0JCWJhc2ljTWF0Y2goeDEpOwotCX0KLQotCS8vIEVYUFJFU1NJT05TIGFuZCBTVEFURU1FTlRTCi0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpIHsKLQkJQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiB4MSA9IGFzdC5uZXdBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCk7Ci0JCXgxLmJvZHlEZWNsYXJhdGlvbnMoKS5hZGQoRkQxKTsKLQkJeDEuYm9keURlY2xhcmF0aW9ucygpLmFkZChGRDIpOwotCQliYXNpY01hdGNoKHgxKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEFycmF5QWNjZXNzKCkgewotCQlBcnJheUFjY2VzcyB4MSA9IGFzdC5uZXdBcnJheUFjY2VzcygpOwotCQl4MS5zZXRBcnJheShFMSk7Ci0JCXgxLnNldEluZGV4KEUyKTsKLQkJYmFzaWNNYXRjaCh4MSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUNyZWF0aW9uKCkgewotCQlBcnJheUNyZWF0aW9uIHgxID0gYXN0Lm5ld0FycmF5Q3JlYXRpb24oKTsKLQkJeDEuc2V0VHlwZShhc3QubmV3QXJyYXlUeXBlKFQxKSk7Ci0JCXgxLmRpbWVuc2lvbnMoKS5hZGQoRTEpOwotCQl4MS5kaW1lbnNpb25zKCkuYWRkKEUyKTsKLQkJeDEuc2V0SW5pdGlhbGl6ZXIoYXN0Lm5ld0FycmF5SW5pdGlhbGl6ZXIoKSk7Ci0JCWJhc2ljTWF0Y2goeDEpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJbml0aWFsaXplcigpIHsKLQkJQXJyYXlJbml0aWFsaXplciB4MSA9IGFzdC5uZXdBcnJheUluaXRpYWxpemVyKCk7Ci0JCXgxLmV4cHJlc3Npb25zKCkuYWRkKEUxKTsKLQkJeDEuZXhwcmVzc2lvbnMoKS5hZGQoRTIpOwotCQliYXNpY01hdGNoKHgxKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEFzc2VydFN0YXRlbWVudCgpIHsKLQkJQXNzZXJ0U3RhdGVtZW50IHgxID0gYXN0Lm5ld0Fzc2VydFN0YXRlbWVudCgpOwotCQl4MS5zZXRFeHByZXNzaW9uKEUxKTsKLQkJeDEuc2V0TWVzc2FnZShFMik7Ci0JCWJhc2ljTWF0Y2goeDEpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0QXNzaWdubWVudCgpIHsKLQkJQXNzaWdubWVudCB4MSA9IGFzdC5uZXdBc3NpZ25tZW50KCk7Ci0JCXgxLnNldExlZnRIYW5kU2lkZShFMSk7Ci0JCXgxLnNldFJpZ2h0SGFuZFNpZGUoRTIpOwotCQliYXNpY01hdGNoKHgxKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEJsb2NrKCkgewotCQlCbG9jayB4MSA9IGFzdC5uZXdCbG9jaygpOwotCQl4MS5zdGF0ZW1lbnRzKCkuYWRkKFMxKTsKLQkJeDEuc3RhdGVtZW50cygpLmFkZChTMik7Ci0JCWJhc2ljTWF0Y2goeDEpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9vbGVhbkxpdGVyYWwoKSB7Ci0JCUJvb2xlYW5MaXRlcmFsIHgxID0gYXN0Lm5ld0Jvb2xlYW5MaXRlcmFsKHRydWUpOwotCQliYXNpY01hdGNoKHgxKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEJyZWFrU3RhdGVtZW50KCkgewotCQlCcmVha1N0YXRlbWVudCB4MSA9IGFzdC5uZXdCcmVha1N0YXRlbWVudCgpOwotCQl4MS5zZXRMYWJlbChOMSk7Ci0JCWJhc2ljTWF0Y2goeDEpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FzdEV4cHJlc3Npb24oKSB7Ci0JCUNhc3RFeHByZXNzaW9uIHgxID0gYXN0Lm5ld0Nhc3RFeHByZXNzaW9uKCk7Ci0JCXgxLnNldFR5cGUoVDEpOwotCQl4MS5zZXRFeHByZXNzaW9uKEUxKTsKLQkJYmFzaWNNYXRjaCh4MSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RDYXRjaENsYXVzZSgpIHsKLQkJQ2F0Y2hDbGF1c2UgeDEgPSBhc3QubmV3Q2F0Y2hDbGF1c2UoKTsKLQkJeDEuc2V0RXhjZXB0aW9uKFYxKTsKLQkJeDEuc2V0Qm9keShCMSk7Ci0JCWJhc2ljTWF0Y2goeDEpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhcmFjdGVyTGl0ZXJhbCgpIHsKLQkJQ2hhcmFjdGVyTGl0ZXJhbCB4MSA9IGFzdC5uZXdDaGFyYWN0ZXJMaXRlcmFsKCk7Ci0JCXgxLnNldENoYXJWYWx1ZSgncScpOwotCQliYXNpY01hdGNoKHgxKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdENsYXNzSW5zdGFuY2VDcmVhdGlvbigpIHsKLQkJQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIHgxID0gYXN0Lm5ld0NsYXNzSW5zdGFuY2VDcmVhdGlvbigpOwotCQl4MS5zZXRFeHByZXNzaW9uKEUxKTsKLQkJeDEuc2V0TmFtZShOMSk7Ci0JCXgxLnNldEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oQUNEMSk7Ci0JCWJhc2ljTWF0Y2goeDEpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcGlsYXRpb25Vbml0KCkgewotCQlDb21waWxhdGlvblVuaXQgeDEgPSBhc3QubmV3Q29tcGlsYXRpb25Vbml0KCk7Ci0JCXgxLnNldFBhY2thZ2UoUEQxKTsKLQkJeDEuaW1wb3J0cygpLmFkZChJRDEpOwotCQl4MS5pbXBvcnRzKCkuYWRkKElEMik7Ci0JCXgxLnR5cGVzKCkuYWRkKFREMSk7Ci0JCXgxLnR5cGVzKCkuYWRkKFREMik7Ci0JCWJhc2ljTWF0Y2goeDEpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uZGl0aW9uYWxFeHByZXNzaW9uKCkgewotCQlDb25kaXRpb25hbEV4cHJlc3Npb24geDEgPSBhc3QubmV3Q29uZGl0aW9uYWxFeHByZXNzaW9uKCk7Ci0JCXgxLnNldEV4cHJlc3Npb24oRTEpOwotCQl4MS5zZXRUaGVuRXhwcmVzc2lvbihFMik7Ci0JCXgxLnNldEVsc2VFeHByZXNzaW9uKE4xKTsKLQkJYmFzaWNNYXRjaCh4MSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvckludm9jYXRpb24oKSB7Ci0JCUNvbnN0cnVjdG9ySW52b2NhdGlvbiB4MSA9IGFzdC5uZXdDb25zdHJ1Y3Rvckludm9jYXRpb24oKTsKLQkJeDEuYXJndW1lbnRzKCkuYWRkKEUxKTsKLQkJeDEuYXJndW1lbnRzKCkuYWRkKEUyKTsKLQkJYmFzaWNNYXRjaCh4MSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RDb250aW51ZVN0YXRlbWVudCgpIHsKLQkJQ29udGludWVTdGF0ZW1lbnQgeDEgPSBhc3QubmV3Q29udGludWVTdGF0ZW1lbnQoKTsKLQkJeDEuc2V0TGFiZWwoKFNpbXBsZU5hbWUpIE4xKTsKLQkJYmFzaWNNYXRjaCh4MSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3REb1N0YXRlbWVudCgpIHsKLQkJRG9TdGF0ZW1lbnQgeDEgPSBhc3QubmV3RG9TdGF0ZW1lbnQoKTsKLQkJeDEuc2V0RXhwcmVzc2lvbihFMSk7Ci0JCXgxLnNldEJvZHkoUzEpOwotCQliYXNpY01hdGNoKHgxKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEVtcHR5U3RhdGVtZW50KCkgewotCQlFbXB0eVN0YXRlbWVudCB4MSA9IGFzdC5uZXdFbXB0eVN0YXRlbWVudCgpOwotCQliYXNpY01hdGNoKHgxKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEV4cHJlc3Npb25TdGF0ZW1lbnQoKSB7Ci0JCUV4cHJlc3Npb25TdGF0ZW1lbnQgeDEgPSBhc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChFMSk7Ci0JCWJhc2ljTWF0Y2goeDEpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0RmllbGRBY2Nlc3MoKSB7Ci0JCUZpZWxkQWNjZXNzIHgxID0gYXN0Lm5ld0ZpZWxkQWNjZXNzKCk7Ci0JCXgxLnNldEV4cHJlc3Npb24oRTEpOwotCQl4MS5zZXROYW1lKE4xKTsKLQkJYmFzaWNNYXRjaCh4MSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RGaWVsZERlY2xhcmF0aW9uKCkgewotCQlGaWVsZERlY2xhcmF0aW9uIHgxID0gYXN0Lm5ld0ZpZWxkRGVjbGFyYXRpb24oVzEpOwotCQl4MS5zZXRKYXZhZG9jKEpEMSk7Ci0JCXgxLnNldFR5cGUoVDEpOwotCQl4MS5mcmFnbWVudHMoKS5hZGQoVzIpOwotCQliYXNpY01hdGNoKHgxKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEZvclN0YXRlbWVudCgpIHsKLQkJRm9yU3RhdGVtZW50IHgxID0gYXN0Lm5ld0ZvclN0YXRlbWVudCgpOwotCQl4MS5pbml0aWFsaXplcnMoKS5hZGQoRTEpOwotCQl4MS5pbml0aWFsaXplcnMoKS5hZGQoRTIpOwotCQl4MS5zZXRFeHByZXNzaW9uKE4xKTsKLQkJeDEudXBkYXRlcnMoKS5hZGQoTjIpOwotCQl4MS51cGRhdGVycygpLmFkZChOMyk7Ci0JCXgxLnNldEJvZHkoUzEpOwotCQliYXNpY01hdGNoKHgxKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdElmU3RhdGVtZW50KCkgewotCQlJZlN0YXRlbWVudCB4MSA9IGFzdC5uZXdJZlN0YXRlbWVudCgpOwotCQl4MS5zZXRFeHByZXNzaW9uKEUxKTsKLQkJeDEuc2V0VGhlblN0YXRlbWVudChTMSk7Ci0JCXgxLnNldEVsc2VTdGF0ZW1lbnQoUzIpOwotCQliYXNpY01hdGNoKHgxKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEltcG9ydERlY2xhcmF0aW9uKCkgewotCQlJbXBvcnREZWNsYXJhdGlvbiB4MSA9IGFzdC5uZXdJbXBvcnREZWNsYXJhdGlvbigpOwotCQl4MS5zZXROYW1lKE4xKTsKLQkJYmFzaWNNYXRjaCh4MSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RJbmZpeEV4cHJlc3Npb24oKSB7Ci0JCUluZml4RXhwcmVzc2lvbiB4MSA9IGFzdC5uZXdJbmZpeEV4cHJlc3Npb24oKTsKLQkJeDEuc2V0T3BlcmF0b3IoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLlBMVVMpOwotCQl4MS5zZXRMZWZ0T3BlcmFuZChFMSk7Ci0JCXgxLnNldFJpZ2h0T3BlcmFuZChFMik7Ci0JCXgxLmV4dGVuZGVkT3BlcmFuZHMoKS5hZGQoTjEpOwotCQl4MS5leHRlbmRlZE9wZXJhbmRzKCkuYWRkKE4yKTsKLQkJYmFzaWNNYXRjaCh4MSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXplcigpIHsKLQkJSW5pdGlhbGl6ZXIgeDEgPSBhc3QubmV3SW5pdGlhbGl6ZXIoKTsKLQkJeDEuc2V0SmF2YWRvYyhKRDEpOwotCQl4MS5zZXRCb2R5KEIxKTsKLQkJYmFzaWNNYXRjaCh4MSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhZG9jKCkgewotCQlKYXZhZG9jIHgxID0gYXN0Lm5ld0phdmFkb2MoKTsKLQkJeDEuc2V0Q29tbWVudCgiLyoqPyovIik7IC8vJE5PTi1OTFMtMSQKLQkJYmFzaWNNYXRjaCh4MSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhYmVsZWRTdGF0ZW1lbnQoKSB7Ci0JCUxhYmVsZWRTdGF0ZW1lbnQgeDEgPSBhc3QubmV3TGFiZWxlZFN0YXRlbWVudCgpOwotCQl4MS5zZXRMYWJlbChOMSk7Ci0JCXgxLnNldEJvZHkoUzEpOwotCQliYXNpY01hdGNoKHgxKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdE1ldGhvZERlY2xhcmF0aW9uKCkgewotCQlNZXRob2REZWNsYXJhdGlvbiB4MSA9IGFzdC5uZXdNZXRob2REZWNsYXJhdGlvbigpOwotCQl4MS5zZXRKYXZhZG9jKEpEMSk7Ci0JCXgxLnNldFJldHVyblR5cGUoVDEpOwotCQl4MS5zZXROYW1lKE4xKTsKLQkJeDEucGFyYW1ldGVycygpLmFkZChWMSk7Ci0JCXgxLnBhcmFtZXRlcnMoKS5hZGQoVjIpOwotCQl4MS50aHJvd25FeGNlcHRpb25zKCkuYWRkKE4yKTsKLQkJeDEudGhyb3duRXhjZXB0aW9ucygpLmFkZChOMyk7Ci0JCXgxLnNldEJvZHkoQjEpOwotCQliYXNpY01hdGNoKHgxKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdE1ldGhvZEludm9jYXRpb24oKSB7Ci0JCU1ldGhvZEludm9jYXRpb24geDEgPSBhc3QubmV3TWV0aG9kSW52b2NhdGlvbigpOwotCQl4MS5zZXRFeHByZXNzaW9uKE4xKTsKLQkJeDEuc2V0TmFtZShOMik7Ci0JCXgxLmFyZ3VtZW50cygpLmFkZChFMSk7Ci0JCXgxLmFyZ3VtZW50cygpLmFkZChFMik7Ci0JCWJhc2ljTWF0Y2goeDEpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbExpdGVyYWwoKSB7Ci0JCU51bGxMaXRlcmFsIHgxID0gYXN0Lm5ld051bGxMaXRlcmFsKCk7Ci0JCWJhc2ljTWF0Y2goeDEpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVtYmVyTGl0ZXJhbCgpIHsKLQkJTnVtYmVyTGl0ZXJhbCB4MSA9IGFzdC5uZXdOdW1iZXJMaXRlcmFsKCIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQliYXNpY01hdGNoKHgxKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFBhY2thZ2VEZWNsYXJhdGlvbigpIHsKLQkJUGFja2FnZURlY2xhcmF0aW9uIHgxID0gYXN0Lm5ld1BhY2thZ2VEZWNsYXJhdGlvbigpOwotCQliYXNpY01hdGNoKHgxKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCkgewotCQlQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiB4MSA9IGFzdC5uZXdQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpOwotCQliYXNpY01hdGNoKHgxKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFBvc3RmaXhFeHByZXNzaW9uKCkgewotCQlQb3N0Zml4RXhwcmVzc2lvbiB4MSA9IGFzdC5uZXdQb3N0Zml4RXhwcmVzc2lvbigpOwotCQl4MS5zZXRPcGVyYW5kKEUxKTsKLQkJeDEuc2V0T3BlcmF0b3IoUG9zdGZpeEV4cHJlc3Npb24uT3BlcmF0b3IuSU5DUkVNRU5UKTsKLQkJYmFzaWNNYXRjaCh4MSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RQcmVmaXhFeHByZXNzaW9uKCkgewotCQlQcmVmaXhFeHByZXNzaW9uIHgxID0gYXN0Lm5ld1ByZWZpeEV4cHJlc3Npb24oKTsKLQkJeDEuc2V0T3BlcmFuZChFMSk7Ci0JCXgxLnNldE9wZXJhdG9yKFByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3IuSU5DUkVNRU5UKTsKLQkJYmFzaWNNYXRjaCh4MSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RSZXR1cm5TdGF0ZW1lbnQoKSB7Ci0JCVJldHVyblN0YXRlbWVudCB4MSA9IGFzdC5uZXdSZXR1cm5TdGF0ZW1lbnQoKTsKLQkJeDEuc2V0RXhwcmVzc2lvbihFMSk7Ci0JCWJhc2ljTWF0Y2goeDEpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbigpIHsKLQkJU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiB4MSA9IGFzdC5uZXdTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKCk7Ci0JCXgxLnNldFR5cGUoVDEpOwotCQl4MS5zZXROYW1lKE4xKTsKLQkJeDEuc2V0SW5pdGlhbGl6ZXIoRTEpOwotCQliYXNpY01hdGNoKHgxKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0xpdGVyYWwoKSB7Ci0JCVN0cmluZ0xpdGVyYWwgeDEgPSBhc3QubmV3U3RyaW5nTGl0ZXJhbCgpOwotCQl4MS5zZXRMaXRlcmFsVmFsdWUoIkgiKTsgLy8kTk9OLU5MUy0xJAotCQliYXNpY01hdGNoKHgxKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uKCkgewotCQlTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbiB4MSA9IGFzdC5uZXdTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbigpOwotCQl4MS5zZXRFeHByZXNzaW9uKE4xKTsKLQkJeDEuYXJndW1lbnRzKCkuYWRkKEUxKTsKLQkJeDEuYXJndW1lbnRzKCkuYWRkKEUyKTsKLQkJYmFzaWNNYXRjaCh4MSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RTdXBlckZpZWxkQWNjZXNzKCkgewotCQlTdXBlckZpZWxkQWNjZXNzIHgxID0gYXN0Lm5ld1N1cGVyRmllbGRBY2Nlc3MoKTsKLQkJeDEuc2V0UXVhbGlmaWVyKE4xKTsKLQkJeDEuc2V0TmFtZShOMik7Ci0JCWJhc2ljTWF0Y2goeDEpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0U3VwZXJNZXRob2RJbnZvY2F0aW9uKCkgewotCQlTdXBlck1ldGhvZEludm9jYXRpb24geDEgPSBhc3QubmV3U3VwZXJNZXRob2RJbnZvY2F0aW9uKCk7Ci0JCXgxLnNldFF1YWxpZmllcihOMSk7Ci0JCXgxLnNldE5hbWUoTjIpOwotCQl4MS5hcmd1bWVudHMoKS5hZGQoRTEpOwotCQl4MS5hcmd1bWVudHMoKS5hZGQoRTIpOwotCQliYXNpY01hdGNoKHgxKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFN3aXRjaENhc2UoKSB7Ci0JCVN3aXRjaENhc2UgeDEgPSBhc3QubmV3U3dpdGNoQ2FzZSgpOwotCQl4MS5zZXRFeHByZXNzaW9uKEUxKTsKLQkJYmFzaWNNYXRjaCh4MSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RTd2l0Y2hTdGF0ZW1lbnQoKSB7Ci0JCVN3aXRjaFN0YXRlbWVudCB4MSA9IGFzdC5uZXdTd2l0Y2hTdGF0ZW1lbnQoKTsKLQkJeDEuc2V0RXhwcmVzc2lvbihFMSk7Ci0JCXgxLnN0YXRlbWVudHMoKS5hZGQoUzEpOwotCQl4MS5zdGF0ZW1lbnRzKCkuYWRkKFMyKTsKLQkJYmFzaWNNYXRjaCh4MSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jaHJvbml6ZWRTdGF0ZW1lbnQoKSB7Ci0JCVN5bmNocm9uaXplZFN0YXRlbWVudCB4MSA9IGFzdC5uZXdTeW5jaHJvbml6ZWRTdGF0ZW1lbnQoKTsKLQkJeDEuc2V0RXhwcmVzc2lvbihFMSk7Ci0JCXgxLnNldEJvZHkoQjEpOwotCQliYXNpY01hdGNoKHgxKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFRoaXNFeHByZXNzaW9uKCkgewotCQlUaGlzRXhwcmVzc2lvbiB4MSA9IGFzdC5uZXdUaGlzRXhwcmVzc2lvbigpOwotCQl4MS5zZXRRdWFsaWZpZXIoTjEpOwotCQliYXNpY01hdGNoKHgxKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFRocm93U3RhdGVtZW50KCkgewotCQlUaHJvd1N0YXRlbWVudCB4MSA9IGFzdC5uZXdUaHJvd1N0YXRlbWVudCgpOwotCQl4MS5zZXRFeHByZXNzaW9uKEUxKTsKLQkJYmFzaWNNYXRjaCh4MSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RUcnlTdGF0ZW1lbnQoKSB7Ci0JCVRyeVN0YXRlbWVudCB4MSA9IGFzdC5uZXdUcnlTdGF0ZW1lbnQoKTsKLQkJeDEuc2V0Qm9keShCMSk7Ci0JCUNhdGNoQ2xhdXNlIGMxID0gYXN0Lm5ld0NhdGNoQ2xhdXNlKCk7Ci0JCWMxLnNldEV4Y2VwdGlvbihWMSk7Ci0JCWMxLnNldEJvZHkoYXN0Lm5ld0Jsb2NrKCkpOwotCQl4MS5jYXRjaENsYXVzZXMoKS5hZGQoYzEpOwotCQlDYXRjaENsYXVzZSBjMiA9IGFzdC5uZXdDYXRjaENsYXVzZSgpOwotCQljMi5zZXRFeGNlcHRpb24oVjIpOwotCQljMi5zZXRCb2R5KGFzdC5uZXdCbG9jaygpKTsKLQkJeDEuY2F0Y2hDbGF1c2VzKCkuYWRkKGMyKTsKLQkJeDEuc2V0RmluYWxseShhc3QubmV3QmxvY2soKSk7Ci0JCWJhc2ljTWF0Y2goeDEpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VHlwZURlY2xhcmF0aW9uKCkgewotCQlUeXBlRGVjbGFyYXRpb24geDEgPSBhc3QubmV3VHlwZURlY2xhcmF0aW9uKCk7Ci0JCXgxLnNldEphdmFkb2MoSkQxKTsKLQkJeDEuc2V0TmFtZShOMSk7Ci0JCXgxLnNldFN1cGVyY2xhc3MoTjIpOwotCQl4MS5zdXBlckludGVyZmFjZXMoKS5hZGQoTjMpOwotCQl4MS5zdXBlckludGVyZmFjZXMoKS5hZGQoYXN0Lm5ld1NpbXBsZU5hbWUoIkoiKSk7IC8vJE5PTi1OTFMtMSQKLQkJeDEuYm9keURlY2xhcmF0aW9ucygpLmFkZChGRDEpOwotCQl4MS5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKEZEMik7Ci0JCWJhc2ljTWF0Y2goeDEpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VHlwZURlY2xhcmF0aW9uU3RhdGVtZW50KCkgewotCQlUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQgeDEgPSBhc3QubmV3VHlwZURlY2xhcmF0aW9uU3RhdGVtZW50KFREMSk7Ci0JCWJhc2ljTWF0Y2goeDEpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VHlwZUxpdGVyYWwoKSB7Ci0JCVR5cGVMaXRlcmFsIHgxID0gYXN0Lm5ld1R5cGVMaXRlcmFsKCk7Ci0JCXgxLnNldFR5cGUoVDEpOwotCQliYXNpY01hdGNoKHgxKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpIHsKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHgxID0gYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQl4MS5zZXROYW1lKE4xKTsKLQkJeDEuc2V0SW5pdGlhbGl6ZXIoRTEpOwotCQliYXNpY01hdGNoKHgxKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKCkgewotCQlWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiB4MSA9IGFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbihXMSk7Ci0JCXgxLnNldFR5cGUoVDEpOwotCQl4MS5mcmFnbWVudHMoKS5hZGQoVzIpOwotCQliYXNpY01hdGNoKHgxKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQoKSB7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgeDEgPSBhc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudChXMSk7Ci0JCXgxLnNldFR5cGUoVDEpOwotCQl4MS5mcmFnbWVudHMoKS5hZGQoVzIpOwotCQliYXNpY01hdGNoKHgxKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFdoaWxlU3RhdGVtZW50KCkgewotCQlXaGlsZVN0YXRlbWVudCB4MSA9IGFzdC5uZXdXaGlsZVN0YXRlbWVudCgpOwotCQl4MS5zZXRFeHByZXNzaW9uKEUxKTsKLQkJeDEuc2V0Qm9keShTMSk7Ci0JCWJhc2ljTWF0Y2goeDEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9kb20vQVNUTm9kZXNDb2xsZWN0b3JWaXNpdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZG9tL0FTVE5vZGVzQ29sbGVjdG9yVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjRjNjExLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9kb20vQVNUTm9kZXNDb2xsZWN0b3JWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5kb207Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3I7Ci0KLWNsYXNzIEFTVE5vZGVzQ29sbGVjdG9yVmlzaXRvciBleHRlbmRzIEFTVFZpc2l0b3IgewotCi0JcHJpdmF0ZSBTZXQgZGV0YWNoZWRBc3ROb2RlczsKLQkKLQkvKioKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjT2JqZWN0KCkKLQkgKi8KLQlBU1ROb2Rlc0NvbGxlY3RvclZpc2l0b3IoKSB7Ci0JCXRoaXMuZGV0YWNoZWRBc3ROb2RlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZChBU1ROb2RlIG5vZGUpIHsKLQkJdGhpcy5kZXRhY2hlZEFzdE5vZGVzLmFkZChub2RlKTsKLQl9Ci0JCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFub255bW91c0NsYXNzRGVjbGFyYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCWFkZChub2RlKTsKLQkJZGV0YWNoZWRMaXN0RWxlbWVudChub2RlLmJvZHlEZWNsYXJhdGlvbnMoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlBY2Nlc3MpCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQXJyYXlBY2Nlc3Mgbm9kZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFycmF5Q3JlYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQXJyYXlDcmVhdGlvbiBub2RlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlJbml0aWFsaXplcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChBcnJheUluaXRpYWxpemVyIG5vZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheVR5cGUpCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQXJyYXlUeXBlIG5vZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bc3NlcnRTdGF0ZW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQXNzZXJ0U3RhdGVtZW50IG5vZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bc3NpZ25tZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFzc2lnbm1lbnQgbm9kZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJsb2NrKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEJsb2NrIG5vZGUpIHsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGV0YWNoZWRMaXN0RWxlbWVudChMaXN0IGxpc3QpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlsaXN0LnJlbW92ZSgwKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvb2xlYW5MaXRlcmFsKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEJvb2xlYW5MaXRlcmFsIG5vZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5CcmVha1N0YXRlbWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChCcmVha1N0YXRlbWVudCBub2RlKSB7Ci0JCQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNhc3RFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENhc3RFeHByZXNzaW9uIG5vZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5DYXRjaENsYXVzZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChDYXRjaENsYXVzZSBub2RlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ2hhcmFjdGVyTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChDaGFyYWN0ZXJMaXRlcmFsIG5vZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5DbGFzc0luc3RhbmNlQ3JlYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIG5vZGUpIHsKLQkJbm9kZS5zZXROYW1lKG5vZGUuZ2V0QVNUKCkubmV3U2ltcGxlTmFtZSgiWFhYIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0KQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENvbXBpbGF0aW9uVW5pdCBub2RlKSB7Ci0JCWRldGFjaGVkTGlzdEVsZW1lbnQobm9kZS5pbXBvcnRzKCkpOwotCQlub2RlLnNldFBhY2thZ2Uobm9kZS5nZXRBU1QoKS5uZXdQYWNrYWdlRGVjbGFyYXRpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29uZGl0aW9uYWxFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29uc3RydWN0b3JJbnZvY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29udGludWVTdGF0ZW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQ29udGludWVTdGF0ZW1lbnQgbm9kZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkRvU3RhdGVtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KERvU3RhdGVtZW50IG5vZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FbXB0eVN0YXRlbWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChFbXB0eVN0YXRlbWVudCBub2RlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvblN0YXRlbWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5GaWVsZEFjY2VzcykKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChGaWVsZEFjY2VzcyBub2RlKSB7Ci0JCW5vZGUuc2V0TmFtZShub2RlLmdldEFTVCgpLm5ld1NpbXBsZU5hbWUoIlhYWCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkZpZWxkRGVjbGFyYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoRmllbGREZWNsYXJhdGlvbiBub2RlKSB7Ci0JCWRldGFjaGVkTGlzdEVsZW1lbnQobm9kZS5mcmFnbWVudHMoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRm9yU3RhdGVtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEZvclN0YXRlbWVudCBub2RlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSWZTdGF0ZW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoSWZTdGF0ZW1lbnQgbm9kZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkltcG9ydERlY2xhcmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEltcG9ydERlY2xhcmF0aW9uIG5vZGUpIHsKLQkJYWRkKG5vZGUpOwotCQlub2RlLnNldE5hbWUobm9kZS5nZXRBU1QoKS5uZXdTaW1wbGVOYW1lKCJYWFgiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JbmZpeEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoSW5maXhFeHByZXNzaW9uIG5vZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Jbml0aWFsaXplcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChJbml0aWFsaXplciBub2RlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSW5zdGFuY2VvZkV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoSW5zdGFuY2VvZkV4cHJlc3Npb24gbm9kZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkphdmFkb2MpCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoSmF2YWRvYyBub2RlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTGFiZWxlZFN0YXRlbWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChMYWJlbGVkU3RhdGVtZW50IG5vZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChNZXRob2REZWNsYXJhdGlvbiBub2RlKSB7Ci0JCW5vZGUuc2V0TmFtZShub2RlLmdldEFTVCgpLm5ld1NpbXBsZU5hbWUoIlhYWCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZEludm9jYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7Ci0JCWFkZChub2RlKTsKLQkJbm9kZS5zZXROYW1lKG5vZGUuZ2V0QVNUKCkubmV3U2ltcGxlTmFtZSgiWFhYIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTnVsbExpdGVyYWwpCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoTnVsbExpdGVyYWwgbm9kZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk51bWJlckxpdGVyYWwpCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoTnVtYmVyTGl0ZXJhbCBub2RlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUGFja2FnZURlY2xhcmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBhY2thZ2VEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCWFkZChub2RlKTsKLQkJbm9kZS5zZXROYW1lKG5vZGUuZ2V0QVNUKCkubmV3U2ltcGxlTmFtZSgiWFhYIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUGFyZW50aGVzaXplZEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoUGFyZW50aGVzaXplZEV4cHJlc3Npb24gbm9kZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlBvc3RmaXhFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBvc3RmaXhFeHByZXNzaW9uIG5vZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5QcmVmaXhFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFByZWZpeEV4cHJlc3Npb24gbm9kZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlByaW1pdGl2ZVR5cGUpCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoUHJpbWl0aXZlVHlwZSBub2RlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUXVhbGlmaWVkTmFtZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChRdWFsaWZpZWROYW1lIG5vZGUpIHsKLQkJYWRkKG5vZGUpOwotCQlub2RlLnNldFF1YWxpZmllcihub2RlLmdldEFTVCgpLm5ld1NpbXBsZU5hbWUoInNzcyIpKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlLnNldE5hbWUobm9kZS5nZXRBU1QoKS5uZXdTaW1wbGVOYW1lKCJzc3MiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5SZXR1cm5TdGF0ZW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoUmV0dXJuU3RhdGVtZW50IG5vZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW1wbGVOYW1lKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFNpbXBsZU5hbWUgbm9kZSkgewotCQlBU1ROb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50KCk7Ci0JCXN3aXRjaChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBBU1ROb2RlLkNPTlRJTlVFX1NUQVRFTUVOVCA6Ci0JCQljYXNlIEFTVE5vZGUuQlJFQUtfU1RBVEVNRU5UIDoKLQkJCWNhc2UgQVNUTm9kZS5MQUJFTEVEX1NUQVRFTUVOVCA6Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlhZGQobm9kZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW1wbGVUeXBlKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFNpbXBsZVR5cGUgbm9kZSkgewotCQlub2RlLnNldE5hbWUobm9kZS5nZXRBU1QoKS5uZXdTaW1wbGVOYW1lKCJYWFgiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewotCQlub2RlLnNldE5hbWUobm9kZS5nZXRBU1QoKS5uZXdTaW1wbGVOYW1lKCJYWFgiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdHJpbmdMaXRlcmFsKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFN0cmluZ0xpdGVyYWwgbm9kZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdXBlckZpZWxkQWNjZXNzKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFN1cGVyRmllbGRBY2Nlc3Mgbm9kZSkgewotCQlub2RlLnNldE5hbWUobm9kZS5nZXRBU1QoKS5uZXdTaW1wbGVOYW1lKCJYWFgiKSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZS5zZXRRdWFsaWZpZXIobm9kZS5nZXRBU1QoKS5uZXdTaW1wbGVOYW1lKCJYWFgiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdXBlck1ldGhvZEludm9jYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKLQkJbm9kZS5zZXROYW1lKG5vZGUuZ2V0QVNUKCkubmV3U2ltcGxlTmFtZSgiWFhYIikpOyAvLyROT04tTkxTLTEkCi0JCW5vZGUuc2V0UXVhbGlmaWVyKG5vZGUuZ2V0QVNUKCkubmV3U2ltcGxlTmFtZSgiWFhYIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3dpdGNoQ2FzZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChTd2l0Y2hDYXNlIG5vZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Td2l0Y2hTdGF0ZW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TeW5jaHJvbml6ZWRTdGF0ZW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoU3luY2hyb25pemVkU3RhdGVtZW50IG5vZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UaGlzRXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChUaGlzRXhwcmVzc2lvbiBub2RlKSB7Ci0JCW5vZGUuc2V0UXVhbGlmaWVyKG5vZGUuZ2V0QVNUKCkubmV3U2ltcGxlTmFtZSgiWFhYIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVGhyb3dTdGF0ZW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoVGhyb3dTdGF0ZW1lbnQgbm9kZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlRyeVN0YXRlbWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChUcnlTdGF0ZW1lbnQgbm9kZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChUeXBlRGVjbGFyYXRpb24gbm9kZSkgewotCQlhZGQobm9kZSk7Ci0JCW5vZGUuc2V0TmFtZShub2RlLmdldEFTVCgpLm5ld1NpbXBsZU5hbWUoIlhYWCIpKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlLnNldFN1cGVyY2xhc3Mobm9kZS5nZXRBU1QoKS5uZXdTaW1wbGVOYW1lKCJYWFgiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZGV0YWNoZWRMaXN0RWxlbWVudChub2RlLmJvZHlEZWNsYXJhdGlvbnMoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFR5cGVEZWNsYXJhdGlvblN0YXRlbWVudCBub2RlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZUxpdGVyYWwpCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoVHlwZUxpdGVyYWwgbm9kZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uIG5vZGUpIHsKLQkJZGV0YWNoZWRMaXN0RWxlbWVudChub2RlLmZyYWdtZW50cygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IG5vZGUpIHsKLQkJYWRkKG5vZGUpOwotCQlub2RlLnNldE5hbWUobm9kZS5nZXRBU1QoKS5uZXdTaW1wbGVOYW1lKCJYWFgiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgbm9kZSkgewotCQlkZXRhY2hlZExpc3RFbGVtZW50KG5vZGUuZnJhZ21lbnRzKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLldoaWxlU3RhdGVtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFdoaWxlU3RhdGVtZW50IG5vZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZXRhY2hlZEFzdE5vZGVzLgotCSAqIEByZXR1cm4gU2V0Ci0JICovCi0JcHVibGljIFNldCBnZXREZXRhY2hlZEFzdE5vZGVzKCkgewotCQlyZXR1cm4gZGV0YWNoZWRBc3ROb2RlczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9kb20vQVNUVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2RvbS9BU1RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMjZhMWEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2RvbS9BU1RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5kb207Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS4qOwotCi0vLyB0ZXN0aW5nCi0KLXB1YmxpYyBjbGFzcyBBU1RUZXN0IGV4dGVuZHMgb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuanVuaXQuZXh0ZW5zaW9uLlRlc3RDYXNlIHsgCi0JCi0JY2xhc3MgQ2hlY2tQb3NpdGlvbnNNYXRjaGVyIGV4dGVuZHMgQVNUTWF0Y2hlciB7Ci0JCi0JCXByaXZhdGUgdm9pZCBjaGVja1Bvc2l0aW9ucyhPYmplY3Qgc291cmNlLCBPYmplY3QgZGVzdGluYXRpb24pIHsKLQkJCWFzc2VydFRydWUoc291cmNlIGluc3RhbmNlb2YgQVNUTm9kZSk7Ci0JCQlhc3NlcnRUcnVlKGRlc3RpbmF0aW9uIGluc3RhbmNlb2YgQVNUTm9kZSk7Ci0JCQlpbnQgc3RhcnRQb3NpdGlvbiA9ICgoQVNUTm9kZSlzb3VyY2UpLmdldFN0YXJ0UG9zaXRpb24oKTsKLQkJCWlmIChzdGFydFBvc2l0aW9uICE9IC0xKSB7Ci0JCQkJYXNzZXJ0VHJ1ZShzdGFydFBvc2l0aW9uID09ICgoQVNUTm9kZSlkZXN0aW5hdGlvbikuZ2V0U3RhcnRQb3NpdGlvbigpKTsKLQkJCX0KLQkJCWludCBsZW5ndGggPSAoKEFTVE5vZGUpc291cmNlKS5nZXRMZW5ndGgoKTsKLQkJCWlmIChsZW5ndGggIT0gMCkgewotCQkJCWFzc2VydFRydWUobGVuZ3RoID09ICgoQVNUTm9kZSlkZXN0aW5hdGlvbikuZ2V0TGVuZ3RoKCkpOwotCQkJfQotCQl9Ci0JCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RNYXRjaGVyI21hdGNoKEFub255bW91c0NsYXNzRGVjbGFyYXRpb24sIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIG1hdGNoKEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQljaGVja1Bvc2l0aW9ucyhub2RlLCBvdGhlcik7Ci0JCQlyZXR1cm4gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RNYXRjaGVyI21hdGNoKEFycmF5QWNjZXNzLCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChBcnJheUFjY2VzcyBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCWNoZWNrUG9zaXRpb25zKG5vZGUsIG90aGVyKTsKLQkJCXJldHVybiBzdXBlci5tYXRjaChub2RlLCBvdGhlcik7Ci0JCX0KLQkKLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE1hdGNoZXIjbWF0Y2goQXJyYXlDcmVhdGlvbiwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goQXJyYXlDcmVhdGlvbiBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCWNoZWNrUG9zaXRpb25zKG5vZGUsIG90aGVyKTsKLQkJCXJldHVybiBzdXBlci5tYXRjaChub2RlLCBvdGhlcik7Ci0JCX0KLQkKLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE1hdGNoZXIjbWF0Y2goQXJyYXlJbml0aWFsaXplciwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goQXJyYXlJbml0aWFsaXplciBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCWNoZWNrUG9zaXRpb25zKG5vZGUsIG90aGVyKTsKLQkJCXJldHVybiBzdXBlci5tYXRjaChub2RlLCBvdGhlcik7Ci0JCX0KLQkKLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE1hdGNoZXIjbWF0Y2goQXJyYXlUeXBlLCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChBcnJheVR5cGUgbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQljaGVja1Bvc2l0aW9ucyhub2RlLCBvdGhlcik7Ci0JCQlyZXR1cm4gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RNYXRjaGVyI21hdGNoKEFzc2VydFN0YXRlbWVudCwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goQXNzZXJ0U3RhdGVtZW50IG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJY2hlY2tQb3NpdGlvbnMobm9kZSwgb3RoZXIpOwotCQkJcmV0dXJuIHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKTsKLQkJfQotCQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTWF0Y2hlciNtYXRjaChBc3NpZ25tZW50LCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChBc3NpZ25tZW50IG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJY2hlY2tQb3NpdGlvbnMobm9kZSwgb3RoZXIpOwotCQkJcmV0dXJuIHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKTsKLQkJfQotCQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTWF0Y2hlciNtYXRjaChCbG9jaywgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goQmxvY2sgbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQljaGVja1Bvc2l0aW9ucyhub2RlLCBvdGhlcik7Ci0JCQlyZXR1cm4gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RNYXRjaGVyI21hdGNoKEJvb2xlYW5MaXRlcmFsLCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChCb29sZWFuTGl0ZXJhbCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCWNoZWNrUG9zaXRpb25zKG5vZGUsIG90aGVyKTsKLQkJCXJldHVybiBzdXBlci5tYXRjaChub2RlLCBvdGhlcik7Ci0JCX0KLQkKLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE1hdGNoZXIjbWF0Y2goQnJlYWtTdGF0ZW1lbnQsIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIG1hdGNoKEJyZWFrU3RhdGVtZW50IG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJY2hlY2tQb3NpdGlvbnMobm9kZSwgb3RoZXIpOwotCQkJcmV0dXJuIHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKTsKLQkJfQotCQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTWF0Y2hlciNtYXRjaChDYXN0RXhwcmVzc2lvbiwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goQ2FzdEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQljaGVja1Bvc2l0aW9ucyhub2RlLCBvdGhlcik7Ci0JCQlyZXR1cm4gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RNYXRjaGVyI21hdGNoKENhdGNoQ2xhdXNlLCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChDYXRjaENsYXVzZSBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCWNoZWNrUG9zaXRpb25zKG5vZGUsIG90aGVyKTsKLQkJCXJldHVybiBzdXBlci5tYXRjaChub2RlLCBvdGhlcik7Ci0JCX0KLQkKLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE1hdGNoZXIjbWF0Y2goQ2hhcmFjdGVyTGl0ZXJhbCwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goQ2hhcmFjdGVyTGl0ZXJhbCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCWNoZWNrUG9zaXRpb25zKG5vZGUsIG90aGVyKTsKLQkJCXJldHVybiBzdXBlci5tYXRjaChub2RlLCBvdGhlcik7Ci0JCX0KLQkKLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE1hdGNoZXIjbWF0Y2goQ2xhc3NJbnN0YW5jZUNyZWF0aW9uLCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChDbGFzc0luc3RhbmNlQ3JlYXRpb24gbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQljaGVja1Bvc2l0aW9ucyhub2RlLCBvdGhlcik7Ci0JCQlyZXR1cm4gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RNYXRjaGVyI21hdGNoKENvbXBpbGF0aW9uVW5pdCwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goQ29tcGlsYXRpb25Vbml0IG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJY2hlY2tQb3NpdGlvbnMobm9kZSwgb3RoZXIpOwotCQkJcmV0dXJuIHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKTsKLQkJfQotCQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTWF0Y2hlciNtYXRjaChDb25kaXRpb25hbEV4cHJlc3Npb24sIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIG1hdGNoKENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCWNoZWNrUG9zaXRpb25zKG5vZGUsIG90aGVyKTsKLQkJCXJldHVybiBzdXBlci5tYXRjaChub2RlLCBvdGhlcik7Ci0JCX0KLQkKLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE1hdGNoZXIjbWF0Y2goQ29uc3RydWN0b3JJbnZvY2F0aW9uLCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQljaGVja1Bvc2l0aW9ucyhub2RlLCBvdGhlcik7Ci0JCQlyZXR1cm4gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RNYXRjaGVyI21hdGNoKENvbnRpbnVlU3RhdGVtZW50LCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChDb250aW51ZVN0YXRlbWVudCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCWNoZWNrUG9zaXRpb25zKG5vZGUsIG90aGVyKTsKLQkJCXJldHVybiBzdXBlci5tYXRjaChub2RlLCBvdGhlcik7Ci0JCX0KLQkKLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE1hdGNoZXIjbWF0Y2goRG9TdGF0ZW1lbnQsIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIG1hdGNoKERvU3RhdGVtZW50IG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJY2hlY2tQb3NpdGlvbnMobm9kZSwgb3RoZXIpOwotCQkJcmV0dXJuIHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKTsKLQkJfQotCQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTWF0Y2hlciNtYXRjaChFbXB0eVN0YXRlbWVudCwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goRW1wdHlTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQljaGVja1Bvc2l0aW9ucyhub2RlLCBvdGhlcik7Ci0JCQlyZXR1cm4gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RNYXRjaGVyI21hdGNoKEV4cHJlc3Npb25TdGF0ZW1lbnQsIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIG1hdGNoKEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQljaGVja1Bvc2l0aW9ucyhub2RlLCBvdGhlcik7Ci0JCQlyZXR1cm4gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RNYXRjaGVyI21hdGNoKEZpZWxkQWNjZXNzLCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChGaWVsZEFjY2VzcyBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCWNoZWNrUG9zaXRpb25zKG5vZGUsIG90aGVyKTsKLQkJCXJldHVybiBzdXBlci5tYXRjaChub2RlLCBvdGhlcik7Ci0JCX0KLQkKLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE1hdGNoZXIjbWF0Y2goRmllbGREZWNsYXJhdGlvbiwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goRmllbGREZWNsYXJhdGlvbiBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCWNoZWNrUG9zaXRpb25zKG5vZGUsIG90aGVyKTsKLQkJCXJldHVybiBzdXBlci5tYXRjaChub2RlLCBvdGhlcik7Ci0JCX0KLQkKLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE1hdGNoZXIjbWF0Y2goRm9yU3RhdGVtZW50LCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChGb3JTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQljaGVja1Bvc2l0aW9ucyhub2RlLCBvdGhlcik7Ci0JCQlyZXR1cm4gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RNYXRjaGVyI21hdGNoKElmU3RhdGVtZW50LCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChJZlN0YXRlbWVudCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCWNoZWNrUG9zaXRpb25zKG5vZGUsIG90aGVyKTsKLQkJCXJldHVybiBzdXBlci5tYXRjaChub2RlLCBvdGhlcik7Ci0JCX0KLQkKLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE1hdGNoZXIjbWF0Y2goSW1wb3J0RGVjbGFyYXRpb24sIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIG1hdGNoKEltcG9ydERlY2xhcmF0aW9uIG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJY2hlY2tQb3NpdGlvbnMobm9kZSwgb3RoZXIpOwotCQkJcmV0dXJuIHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKTsKLQkJfQotCQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTWF0Y2hlciNtYXRjaChJbmZpeEV4cHJlc3Npb24sIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIG1hdGNoKEluZml4RXhwcmVzc2lvbiBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCWNoZWNrUG9zaXRpb25zKG5vZGUsIG90aGVyKTsKLQkJCXJldHVybiBzdXBlci5tYXRjaChub2RlLCBvdGhlcik7Ci0JCX0KLQkKLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE1hdGNoZXIjbWF0Y2goSW5pdGlhbGl6ZXIsIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIG1hdGNoKEluaXRpYWxpemVyIG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJY2hlY2tQb3NpdGlvbnMobm9kZSwgb3RoZXIpOwotCQkJcmV0dXJuIHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKTsKLQkJfQotCQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTWF0Y2hlciNtYXRjaChJbnN0YW5jZW9mRXhwcmVzc2lvbiwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goSW5zdGFuY2VvZkV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQljaGVja1Bvc2l0aW9ucyhub2RlLCBvdGhlcik7Ci0JCQlyZXR1cm4gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RNYXRjaGVyI21hdGNoKEphdmFkb2MsIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIG1hdGNoKEphdmFkb2Mgbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQljaGVja1Bvc2l0aW9ucyhub2RlLCBvdGhlcik7Ci0JCQlyZXR1cm4gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RNYXRjaGVyI21hdGNoKExhYmVsZWRTdGF0ZW1lbnQsIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIG1hdGNoKExhYmVsZWRTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQljaGVja1Bvc2l0aW9ucyhub2RlLCBvdGhlcik7Ci0JCQlyZXR1cm4gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RNYXRjaGVyI21hdGNoKE1ldGhvZERlY2xhcmF0aW9uLCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChNZXRob2REZWNsYXJhdGlvbiBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCWNoZWNrUG9zaXRpb25zKG5vZGUsIG90aGVyKTsKLQkJCXJldHVybiBzdXBlci5tYXRjaChub2RlLCBvdGhlcik7Ci0JCX0KLQkKLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE1hdGNoZXIjbWF0Y2goTWV0aG9kSW52b2NhdGlvbiwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goTWV0aG9kSW52b2NhdGlvbiBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCWNoZWNrUG9zaXRpb25zKG5vZGUsIG90aGVyKTsKLQkJCXJldHVybiBzdXBlci5tYXRjaChub2RlLCBvdGhlcik7Ci0JCX0KLQkKLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE1hdGNoZXIjbWF0Y2goTnVsbExpdGVyYWwsIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIG1hdGNoKE51bGxMaXRlcmFsIG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJY2hlY2tQb3NpdGlvbnMobm9kZSwgb3RoZXIpOwotCQkJcmV0dXJuIHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKTsKLQkJfQotCQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTWF0Y2hlciNtYXRjaChOdW1iZXJMaXRlcmFsLCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChOdW1iZXJMaXRlcmFsIG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJY2hlY2tQb3NpdGlvbnMobm9kZSwgb3RoZXIpOwotCQkJcmV0dXJuIHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKTsKLQkJfQotCQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTWF0Y2hlciNtYXRjaChQYWNrYWdlRGVjbGFyYXRpb24sIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIG1hdGNoKFBhY2thZ2VEZWNsYXJhdGlvbiBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCWNoZWNrUG9zaXRpb25zKG5vZGUsIG90aGVyKTsKLQkJCXJldHVybiBzdXBlci5tYXRjaChub2RlLCBvdGhlcik7Ci0JCX0KLQkKLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE1hdGNoZXIjbWF0Y2goUGFyZW50aGVzaXplZEV4cHJlc3Npb24sIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIG1hdGNoKFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJY2hlY2tQb3NpdGlvbnMobm9kZSwgb3RoZXIpOwotCQkJcmV0dXJuIHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKTsKLQkJfQotCQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTWF0Y2hlciNtYXRjaChQb3N0Zml4RXhwcmVzc2lvbiwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goUG9zdGZpeEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQljaGVja1Bvc2l0aW9ucyhub2RlLCBvdGhlcik7Ci0JCQlyZXR1cm4gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RNYXRjaGVyI21hdGNoKFByZWZpeEV4cHJlc3Npb24sIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIG1hdGNoKFByZWZpeEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQljaGVja1Bvc2l0aW9ucyhub2RlLCBvdGhlcik7Ci0JCQlyZXR1cm4gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RNYXRjaGVyI21hdGNoKFByaW1pdGl2ZVR5cGUsIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIG1hdGNoKFByaW1pdGl2ZVR5cGUgbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQljaGVja1Bvc2l0aW9ucyhub2RlLCBvdGhlcik7Ci0JCQlyZXR1cm4gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RNYXRjaGVyI21hdGNoKFF1YWxpZmllZE5hbWUsIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIG1hdGNoKFF1YWxpZmllZE5hbWUgbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQljaGVja1Bvc2l0aW9ucyhub2RlLCBvdGhlcik7Ci0JCQlyZXR1cm4gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RNYXRjaGVyI21hdGNoKFJldHVyblN0YXRlbWVudCwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goUmV0dXJuU3RhdGVtZW50IG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJY2hlY2tQb3NpdGlvbnMobm9kZSwgb3RoZXIpOwotCQkJcmV0dXJuIHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKTsKLQkJfQotCQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTWF0Y2hlciNtYXRjaChTaW1wbGVOYW1lLCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChTaW1wbGVOYW1lIG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJY2hlY2tQb3NpdGlvbnMobm9kZSwgb3RoZXIpOwotCQkJcmV0dXJuIHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKTsKLQkJfQotCQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTWF0Y2hlciNtYXRjaChTaW1wbGVUeXBlLCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChTaW1wbGVUeXBlIG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJY2hlY2tQb3NpdGlvbnMobm9kZSwgb3RoZXIpOwotCQkJcmV0dXJuIHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKTsKLQkJfQotCQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTWF0Y2hlciNtYXRjaChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJY2hlY2tQb3NpdGlvbnMobm9kZSwgb3RoZXIpOwotCQkJcmV0dXJuIHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKTsKLQkJfQotCQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTWF0Y2hlciNtYXRjaChTdHJpbmdMaXRlcmFsLCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChTdHJpbmdMaXRlcmFsIG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJY2hlY2tQb3NpdGlvbnMobm9kZSwgb3RoZXIpOwotCQkJcmV0dXJuIHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKTsKLQkJfQotCQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTWF0Y2hlciNtYXRjaChTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbiwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQljaGVja1Bvc2l0aW9ucyhub2RlLCBvdGhlcik7Ci0JCQlyZXR1cm4gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RNYXRjaGVyI21hdGNoKFN1cGVyRmllbGRBY2Nlc3MsIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIG1hdGNoKFN1cGVyRmllbGRBY2Nlc3Mgbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQljaGVja1Bvc2l0aW9ucyhub2RlLCBvdGhlcik7Ci0JCQlyZXR1cm4gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RNYXRjaGVyI21hdGNoKFN1cGVyTWV0aG9kSW52b2NhdGlvbiwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJY2hlY2tQb3NpdGlvbnMobm9kZSwgb3RoZXIpOwotCQkJcmV0dXJuIHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKTsKLQkJfQotCQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTWF0Y2hlciNtYXRjaChTd2l0Y2hDYXNlLCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChTd2l0Y2hDYXNlIG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJY2hlY2tQb3NpdGlvbnMobm9kZSwgb3RoZXIpOwotCQkJcmV0dXJuIHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKTsKLQkJfQotCQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTWF0Y2hlciNtYXRjaChTd2l0Y2hTdGF0ZW1lbnQsIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIG1hdGNoKFN3aXRjaFN0YXRlbWVudCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCWNoZWNrUG9zaXRpb25zKG5vZGUsIG90aGVyKTsKLQkJCXJldHVybiBzdXBlci5tYXRjaChub2RlLCBvdGhlcik7Ci0JCX0KLQkKLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE1hdGNoZXIjbWF0Y2goU3luY2hyb25pemVkU3RhdGVtZW50LCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQljaGVja1Bvc2l0aW9ucyhub2RlLCBvdGhlcik7Ci0JCQlyZXR1cm4gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RNYXRjaGVyI21hdGNoKFRoaXNFeHByZXNzaW9uLCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChUaGlzRXhwcmVzc2lvbiBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCWNoZWNrUG9zaXRpb25zKG5vZGUsIG90aGVyKTsKLQkJCXJldHVybiBzdXBlci5tYXRjaChub2RlLCBvdGhlcik7Ci0JCX0KLQkKLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE1hdGNoZXIjbWF0Y2goVGhyb3dTdGF0ZW1lbnQsIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIG1hdGNoKFRocm93U3RhdGVtZW50IG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJY2hlY2tQb3NpdGlvbnMobm9kZSwgb3RoZXIpOwotCQkJcmV0dXJuIHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKTsKLQkJfQotCQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTWF0Y2hlciNtYXRjaChUcnlTdGF0ZW1lbnQsIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIG1hdGNoKFRyeVN0YXRlbWVudCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCWNoZWNrUG9zaXRpb25zKG5vZGUsIG90aGVyKTsKLQkJCXJldHVybiBzdXBlci5tYXRjaChub2RlLCBvdGhlcik7Ci0JCX0KLQkKLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE1hdGNoZXIjbWF0Y2goVHlwZURlY2xhcmF0aW9uLCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChUeXBlRGVjbGFyYXRpb24gbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQljaGVja1Bvc2l0aW9ucyhub2RlLCBvdGhlcik7Ci0JCQlyZXR1cm4gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RNYXRjaGVyI21hdGNoKFR5cGVEZWNsYXJhdGlvblN0YXRlbWVudCwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50IG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJY2hlY2tQb3NpdGlvbnMobm9kZSwgb3RoZXIpOwotCQkJcmV0dXJuIHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKTsKLQkJfQotCQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTWF0Y2hlciNtYXRjaChUeXBlTGl0ZXJhbCwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goVHlwZUxpdGVyYWwgbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQljaGVja1Bvc2l0aW9ucyhub2RlLCBvdGhlcik7Ci0JCQlyZXR1cm4gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RNYXRjaGVyI21hdGNoKFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uLCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCWNoZWNrUG9zaXRpb25zKG5vZGUsIG90aGVyKTsKLQkJCXJldHVybiBzdXBlci5tYXRjaChub2RlLCBvdGhlcik7Ci0JCX0KLQkKLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE1hdGNoZXIjbWF0Y2goVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQljaGVja1Bvc2l0aW9ucyhub2RlLCBvdGhlcik7Ci0JCQlyZXR1cm4gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RNYXRjaGVyI21hdGNoKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQsIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIG1hdGNoKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQljaGVja1Bvc2l0aW9ucyhub2RlLCBvdGhlcik7Ci0JCQlyZXR1cm4gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RNYXRjaGVyI21hdGNoKFdoaWxlU3RhdGVtZW50LCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChXaGlsZVN0YXRlbWVudCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCWNoZWNrUG9zaXRpb25zKG5vZGUsIG90aGVyKTsKLQkJCXJldHVybiBzdXBlci5tYXRjaChub2RlLCBvdGhlcik7Ci0JCX0KLQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlIHN1aXRlID0gbmV3IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGUoQVNUVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotCQkKLQkJQ2xhc3MgYyA9IEFTVFRlc3QuY2xhc3M7Ci0JCU1ldGhvZFtdIG1ldGhvZHMgPSBjLmdldE1ldGhvZHMoKTsKLQkJZm9yIChpbnQgaSA9IDAsIG1heCA9IG1ldGhvZHMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCWlmIChtZXRob2RzW2ldLmdldE5hbWUoKS5zdGFydHNXaXRoKCJ0ZXN0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXN1aXRlLmFkZFRlc3QobmV3IEFTVFRlc3QobWV0aG9kc1tpXS5nZXROYW1lKCkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VpdGU7Ci0JfQkKLQkKLQlBU1QgYXN0OwotCQotCXB1YmxpYyBBU1RUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQkJYXN0ID0gbmV3IEFTVCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQkJYXN0ID0gbnVsbDsKLQl9Ci0JCi0JCi0JLyoqCi0JICogU25pcHBldHMgdGhhdCBzaG93IGhvdyB0by4uLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RFeGFtcGxlU25pcHBldHMoKSB7Ci0JCXsKLQkJCUFTVCBsb2NhbEFzdCA9IG5ldyBBU1QoKTsKLQkJCUNvbXBpbGF0aW9uVW5pdCBjdSA9IGxvY2FsQXN0Lm5ld0NvbXBpbGF0aW9uVW5pdCgpOwotCi0JCQkvLyBwYWNrYWdlIGNvbS5leGFtcGxlOwotCQkJUGFja2FnZURlY2xhcmF0aW9uIHBkID0gbG9jYWxBc3QubmV3UGFja2FnZURlY2xhcmF0aW9uKCk7Ci0JCQlwZC5zZXROYW1lKGxvY2FsQXN0Lm5ld05hbWUobmV3IFN0cmluZ1tdeyJjb20iLCAiZXhhbXBsZSJ9KSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJY3Uuc2V0UGFja2FnZShwZCk7Ci0JCQlhc3NlcnRUcnVlKHBkLmdldFJvb3QoKSA9PSBjdSk7Ci0KLQkJCS8vIGltcG9ydCBqYXZhLmlvOyo7Ci0JCQlJbXBvcnREZWNsYXJhdGlvbiBpbTEgPSBsb2NhbEFzdC5uZXdJbXBvcnREZWNsYXJhdGlvbigpOwotCQkJaW0xLnNldE5hbWUobG9jYWxBc3QubmV3TmFtZShuZXcgU3RyaW5nW117ImphdmEiLCAiaW8ifSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWltMS5zZXRPbkRlbWFuZCh0cnVlKTsKLQkJCWN1LmltcG9ydHMoKS5hZGQoaW0xKTsKLQkJCWFzc2VydFRydWUoaW0xLmdldFJvb3QoKSA9PSBjdSk7Ci0JCQkKLQkJCS8vIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQkJCUltcG9ydERlY2xhcmF0aW9uIGltMiA9IGxvY2FsQXN0Lm5ld0ltcG9ydERlY2xhcmF0aW9uKCk7Ci0JCQlpbTIuc2V0TmFtZShsb2NhbEFzdC5uZXdOYW1lKG5ldyBTdHJpbmdbXXsiamF2YSIsICJ1dGlsIiwgIkxpc3QifSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJaW0yLnNldE9uRGVtYW5kKGZhbHNlKTsKLQkJCWN1LmltcG9ydHMoKS5hZGQoaW0yKTsKLQkJCWFzc2VydFRydWUoaW0yLmdldFJvb3QoKSA9PSBjdSk7Ci0JCQkKLQkJCS8vIHB1YmxpYyBjbGFzcyBNeUNsYXNzIHt9Ci0JCQlUeXBlRGVjbGFyYXRpb24gdGQgPSBsb2NhbEFzdC5uZXdUeXBlRGVjbGFyYXRpb24oKTsKLQkJCXRkLnNldE1vZGlmaWVycyhNb2RpZmllci5QVUJMSUMpOwotCQkJdGQuc2V0SW50ZXJmYWNlKGZhbHNlKTsgCi0JCQl0ZC5zZXROYW1lKGxvY2FsQXN0Lm5ld1NpbXBsZU5hbWUoIk15Q2xhc3MiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWN1LnR5cGVzKCkuYWRkKHRkKTsKLQkJCWFzc2VydFRydWUodGQuZ2V0Um9vdCgpID09IGN1KTsKLQkJCQotCQkJLy8gcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IHRydWU7Ci0JCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgZjEgPSBsb2NhbEFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJCWYxLnNldE5hbWUobG9jYWxBc3QubmV3U2ltcGxlTmFtZSgiREVCVUciKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWYxLnNldEluaXRpYWxpemVyKGxvY2FsQXN0Lm5ld0Jvb2xlYW5MaXRlcmFsKHRydWUpKTsKLQkJCUZpZWxkRGVjbGFyYXRpb24gZmQgPSBsb2NhbEFzdC5uZXdGaWVsZERlY2xhcmF0aW9uKGYxKTsKLQkJCWZkLnNldFR5cGUobG9jYWxBc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLkJPT0xFQU4pKTsKLQkJCWZkLnNldE1vZGlmaWVycyhNb2RpZmllci5QUklWQVRFIHwgTW9kaWZpZXIuU1RBVElDKTsKLQkJCXRkLmJvZHlEZWNsYXJhdGlvbnMoKS5hZGQoZmQpOwotCQkJYXNzZXJ0VHJ1ZShmZC5nZXRSb290KCkgPT0gY3UpOwotCQkJCi0JCQkvLyBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbigpOwotCQkJTWV0aG9kRGVjbGFyYXRpb24gbWQgPSBsb2NhbEFzdC5uZXdNZXRob2REZWNsYXJhdGlvbigpOwotCQkJbWQuc2V0TW9kaWZpZXJzKE1vZGlmaWVyLlBVQkxJQyB8IE1vZGlmaWVyLlNUQVRJQyk7Ci0JCQltZC5zZXRDb25zdHJ1Y3RvcihmYWxzZSk7Ci0JCQltZC5zZXROYW1lKGxvY2FsQXN0Lm5ld1NpbXBsZU5hbWUoIm1haW4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCW1kLnNldFJldHVyblR5cGUobG9jYWxBc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLlZPSUQpKTsKLQkJCXRkLmJvZHlEZWNsYXJhdGlvbnMoKS5hZGQobWQpOwotCQkJYXNzZXJ0VHJ1ZShtZC5nZXRSb290KCkgPT0gY3UpOwotCQkJCi0JCQkvLyBTdHJpbmdbXSBhcmdzCi0JCQlTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIGExID0gbG9jYWxBc3QubmV3U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbigpOwotCQkJYTEuc2V0VHlwZShsb2NhbEFzdC5uZXdBcnJheVR5cGUoCi0JCQkJbG9jYWxBc3QubmV3U2ltcGxlVHlwZShsb2NhbEFzdC5uZXdTaW1wbGVOYW1lKCJTdHJpbmciKSkpKTsgLy8kTk9OLU5MUy0xJAotCQkJYTEuc2V0TmFtZShsb2NhbEFzdC5uZXdTaW1wbGVOYW1lKCJhcmdzIikpOyAvLyROT04tTkxTLTEkCi0JCQltZC5wYXJhbWV0ZXJzKCkuYWRkKGExKTsKLQkJCWFzc2VydFRydWUoYTEuZ2V0Um9vdCgpID09IGN1KTsKLQkJCQotCQkJLy8ge30KLQkJCUJsb2NrIGIgPSBsb2NhbEFzdC5uZXdCbG9jaygpOwotCQkJbWQuc2V0Qm9keShiKTsKLQkJCWFzc2VydFRydWUoYi5nZXRSb290KCkgPT0gY3UpOwotCi0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImhlbGxvIHdvcmxkIik7CQkKLQkJCU1ldGhvZEludm9jYXRpb24gZSA9IGxvY2FsQXN0Lm5ld01ldGhvZEludm9jYXRpb24oKTsKLQkJCWUuc2V0RXhwcmVzc2lvbihsb2NhbEFzdC5uZXdOYW1lKG5ldyBTdHJpbmdbXSB7IlN5c3RlbSIsICJvdXQifSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWUuc2V0TmFtZShsb2NhbEFzdC5uZXdTaW1wbGVOYW1lKCJwcmludGxuIikpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdMaXRlcmFsIGggPSBsb2NhbEFzdC5uZXdTdHJpbmdMaXRlcmFsKCk7Ci0JCQloLnNldExpdGVyYWxWYWx1ZSgiaGVsbG8gd29ybGQiKTsgLy8kTk9OLU5MUy0xJAotCQkJZS5hcmd1bWVudHMoKS5hZGQoaCk7Ci0JCQkKLQkJCWIuc3RhdGVtZW50cygpLmFkZChsb2NhbEFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KGUpKTsKLQkJCWFzc2VydFRydWUoZS5nZXRSb290KCkgPT0gY3UpOwotCQkJYXNzZXJ0VHJ1ZShoLmdldFJvb3QoKSA9PSBjdSk7Ci0JCQkKLQkJCS8vIG5ldyBTdHJpbmdbbGVuXQotCQkJQXJyYXlDcmVhdGlvbiBhYzEgPSBsb2NhbEFzdC5uZXdBcnJheUNyZWF0aW9uKCk7Ci0JCQlhYzEuc2V0VHlwZSgKLQkJCQlsb2NhbEFzdC5uZXdBcnJheVR5cGUoCi0JCQkJCWxvY2FsQXN0Lm5ld1NpbXBsZVR5cGUobG9jYWxBc3QubmV3U2ltcGxlTmFtZSgiU3RyaW5nIikpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFjMS5kaW1lbnNpb25zKCkuYWRkKGxvY2FsQXN0Lm5ld1NpbXBsZU5hbWUoImxlbiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJYi5zdGF0ZW1lbnRzKCkuYWRkKGxvY2FsQXN0Lm5ld0V4cHJlc3Npb25TdGF0ZW1lbnQoYWMxKSk7Ci0JCQlhc3NlcnRUcnVlKGFjMS5nZXRSb290KCkgPT0gY3UpOwotCi0JCQkvLyBuZXcgZG91YmxlWzddWzI0XVtdCi0JCQlBcnJheUNyZWF0aW9uIGFjMiA9IGxvY2FsQXN0Lm5ld0FycmF5Q3JlYXRpb24oKTsKLQkJCWFjMi5zZXRUeXBlKAotCQkJCWxvY2FsQXN0Lm5ld0FycmF5VHlwZSgKLQkJCQkJbG9jYWxBc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLkRPVUJMRSksIDMpKTsKLQkJCWFjMi5kaW1lbnNpb25zKCkuYWRkKGxvY2FsQXN0Lm5ld051bWJlckxpdGVyYWwoIjciKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFjMi5kaW1lbnNpb25zKCkuYWRkKGxvY2FsQXN0Lm5ld051bWJlckxpdGVyYWwoIjI0IikpOyAvLyROT04tTkxTLTEkCi0JCQliLnN0YXRlbWVudHMoKS5hZGQobG9jYWxBc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChhYzIpKTsKLQkJCWFzc2VydFRydWUoYWMyLmdldFJvb3QoKSA9PSBjdSk7Ci0KLQkJCS8vIG5ldyBpbnRbXSB7MSwgMn0KLQkJCUFycmF5Q3JlYXRpb24gYWMzID0gbG9jYWxBc3QubmV3QXJyYXlDcmVhdGlvbigpOwotCQkJYWMzLnNldFR5cGUoCi0JCQkJbG9jYWxBc3QubmV3QXJyYXlUeXBlKAotCQkJCQlsb2NhbEFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuSU5UKSkpOwotCQkJQXJyYXlJbml0aWFsaXplciBhaSA9IGxvY2FsQXN0Lm5ld0FycmF5SW5pdGlhbGl6ZXIoKTsKLQkJCWFjMy5zZXRJbml0aWFsaXplcihhaSk7Ci0JCQlhaS5leHByZXNzaW9ucygpLmFkZChsb2NhbEFzdC5uZXdOdW1iZXJMaXRlcmFsKCIxIikpOyAvLyROT04tTkxTLTEkCi0JCQlhaS5leHByZXNzaW9ucygpLmFkZChsb2NhbEFzdC5uZXdOdW1iZXJMaXRlcmFsKCIyIikpOyAvLyROT04tTkxTLTEkCi0JCQliLnN0YXRlbWVudHMoKS5hZGQobG9jYWxBc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChhYzMpKTsKLQkJCWFzc2VydFRydWUoYWMzLmdldFJvb3QoKSA9PSBjdSk7Ci0JCQlhc3NlcnRUcnVlKGFpLmdldFJvb3QoKSA9PSBjdSk7Ci0JCQkKLQkJCS8vIG5ldyBTdHJpbmcoMTApCi0JCQlDbGFzc0luc3RhbmNlQ3JlYXRpb24gY3IxID0gbG9jYWxBc3QubmV3Q2xhc3NJbnN0YW5jZUNyZWF0aW9uKCk7Ci0JCQljcjEuc2V0TmFtZShsb2NhbEFzdC5uZXdTaW1wbGVOYW1lKCJTdHJpbmciKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNyMS5hcmd1bWVudHMoKS5hZGQobG9jYWxBc3QubmV3TnVtYmVyTGl0ZXJhbCgiMTAiKSk7CQkgLy8kTk9OLU5MUy0xJAotCQkJYi5zdGF0ZW1lbnRzKCkuYWRkKGxvY2FsQXN0Lm5ld0V4cHJlc3Npb25TdGF0ZW1lbnQoY3IxKSk7Ci0JCQlhc3NlcnRUcnVlKGNyMS5nZXRSb290KCkgPT0gY3UpOwotCi0JCQkvLyBuZXcgTGlzdGVuZXIoKSB7cHVibGljIHZvaWQgaGFuZGxlRXZlbnQoKSB7fSB9Ci0JCQlDbGFzc0luc3RhbmNlQ3JlYXRpb24gY3IyID0gbG9jYWxBc3QubmV3Q2xhc3NJbnN0YW5jZUNyZWF0aW9uKCk7Ci0JCQlBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIGFkMSA9IGxvY2FsQXN0Lm5ld0Fub255bW91c0NsYXNzRGVjbGFyYXRpb24oKTsKLQkJCWNyMi5zZXRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKGFkMSk7Ci0JCQljcjIuc2V0TmFtZShsb2NhbEFzdC5uZXdTaW1wbGVOYW1lKCJMaXN0ZW5lciIpKTsgLy8kTk9OLU5MUy0xJAotCQkJTWV0aG9kRGVjbGFyYXRpb24gbWQwID0gbG9jYWxBc3QubmV3TWV0aG9kRGVjbGFyYXRpb24oKTsKLQkJCW1kMC5zZXRNb2RpZmllcnMoTW9kaWZpZXIuUFVCTElDKTsKLQkJCW1kMC5zZXROYW1lKGxvY2FsQXN0Lm5ld1NpbXBsZU5hbWUoImhhbmRsZUV2ZW50IikpOyAvLyROT04tTkxTLTEkCi0JCQltZDAuc2V0Qm9keShsb2NhbEFzdC5uZXdCbG9jaygpKTsKLQkJCWFkMS5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKG1kMCk7Ci0JCQliLnN0YXRlbWVudHMoKS5hZGQobG9jYWxBc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChjcjIpKTsKLQkJCWFzc2VydFRydWUoY3IyLmdldFJvb3QoKSA9PSBjdSk7Ci0JCQlhc3NlcnRUcnVlKG1kMC5nZXRSb290KCkgPT0gY3UpOwotCQkJYXNzZXJ0VHJ1ZShhZDEuZ2V0Um9vdCgpID09IGN1KTsKLQotCQl9Ci0JfQotCQotCWFic3RyYWN0IGNsYXNzIFByb3BlcnR5IHsKLQkJCi0JCS8qKgotCQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHByb3BlcnR5IGlzIGNvbXB1bHNvcnksIGluIHRoYXQgZXZlcnkgbm9kZQotCQkgKiBtdXN0IGhhdmUgYSB2YWx1ZSBhdCBhbGwgdGltZXMuCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gY29tcHVsc29yeTsKLQkJCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JCSAqLwotCQlQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIGNvbXB1bHNvcnksIENsYXNzIG5vZGVUeXBlKSB7Ci0JCQl0aGlzLmNvbXB1bHNvcnkgPSBjb21wdWxzb3J5OwotCQl9Ci0JCQotCQkvKioKLQkJICogUmV0dXJucyBhIHNhbXBsZSBub2RlIG9mIGEgdHlwZSBzdWl0YWJsZSBmb3Igc3RvcmluZwotCQkgKiBpbiB0aGlzIHByb3BlcnR5LgotCQkgKiAKLQkJICogQHBhcmFtIGFzdCB0aGUgdGFyZ2V0IEFTVAotCQkgKiBAcGFyYW0gcGFyZW50ZWQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNhbXBsZSBzaG91bGQgYmUKLQkJICogICAgcGFyZW50ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdW5wYXJlbnRlZAotCQkgKiBAcmV0dXJuIGEgc2FtcGxlIG5vZGUKLQkJICovCi0JCXB1YmxpYyBhYnN0cmFjdCBBU1ROb2RlIHNhbXBsZShBU1QgbmV3VmFsdWUsIGJvb2xlYW4gcGFyZW50ZWQpOwotCi0JCS8qKgotCQkgKiBSZXR1cm5zIGEgc2FtcGxlIG5vZGUgb2YgYSB0eXBlIHN1aXRhYmxlIGZvciBzdG9yaW5nCi0JCSAqIGluIHRoaXMgcHJvcGVydHkuIFRoZSBzYW1wbGUgZW1iZWRzIHRoZSBub2RlIGl0c2VsZi4KLQkJICogPHA+Ci0JCSAqIEZvciBpbnN0YW5jZSwgZm9yIGFuIEV4cHJlc3Npb24tdmFsdWVkIHByb3BlcnR5IG9mIGEgZ2l2ZW4KLQkJICogU3RhdGVtZW50LCB0aGlzIG1ldGhvZCByZXR1cm5zIGFuIEV4cHJlc3Npb24gdGhhdCBlbWJlZHMKLQkJICogdGhpcyBTdGF0ZW1lbnQgbm9kZSAoYXMgYSBkZXNjZW5kZW50KS4KLQkJICogPC9wPgotCQkgKiA8cD4KLQkJICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiBzdWNoIGFuIGVtYmVkZGluZyBpcyBpbXBvc3NpYmxlLgotCQkgKiBGb3IgaW5zdGFuY2UsIGZvciBhbiBOYW1lLXZhbHVlZCBwcm9wZXJ0eSBvZiBhIGdpdmVuCi0JCSAqIFN0YXRlbWVudCwgdGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBiZWNhdXNlCi0JCSAqIGFuIEV4cHJlc3Npb24gY2Fubm90IGJlIGVtYmVkZGVkIGluIGEgTmFtZS4KLQkJICogPC9wPgotCQkgKiA8cD4KLQkJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LiBTdWJjbGFzc2VzCi0JCSAqIHNob3VsZCByZWltcGxlbWVudCB0byBzcGVjaWZ5IGFuIGVtYmVkZGluZy4KLQkJICogPC9wPgotCQkgKiAKLQkJICogQHBhcmFtIGFzdCB0aGUgdGFyZ2V0IEFTVAotCQkgKiBAcmV0dXJuIGEgc2FtcGxlIG5vZGUgdGhhdCBlbWJlZHMgdGhlIGdpdmVuIG5vZGUsCi0JCSAqICAgIGFuZCA8Y29kZT5udWxsPC9jb2RlPiBpZiBzdWNoIGFuIGVtYmVkZGluZyBpcyBpbXBvc3NpYmxlCi0JCSAqLwotCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBVbmRvZXMgdGhlIGVmZmVjdHMgb2YgYSBwcmV2aW91cyA8Y29kZT53cmFwPC9jb2RlPi4KLQkJICogPHA+Ci0JCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzCi0JCSAqIHNob3VsZCByZWltcGxlbWVudCBpZiB0aGV5IHJlaW1wbGVtZW50IDxjb2RlPndyYXA8L2NvZGU+LgotCQkgKiA8L3A+Ci0JCSAqIAotCQkgKiBAcGFyYW0gYXN0IHRoZSB0YXJnZXQgQVNUCi0JCSAqIEByZXR1cm4gYSBzYW1wbGUgbm9kZSB0aGF0IGVtYmVkcyB0aGUgZ2l2ZW4gbm9kZSwKLQkJICogICAgYW5kIDxjb2RlPm51bGw8L2NvZGU+IGlmIHN1Y2ggYW4gZW1iZWRkaW5nIGlzIGltcG9zc2libGUKLQkJICovCi0JCXB1YmxpYyB2b2lkIHVud3JhcCgpIHsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHByb3BlcnR5IGlzIGNvbXB1bHNvcnksIGluIHRoYXQgZXZlcnkgbm9kZQotCQkgKiBtdXN0IGhhdmUgYSB2YWx1ZSBhdCBhbGwgdGltZXMuCi0JCSAqIAotCQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9wZXJ0eSBpcyBjb21wdWxzb3J5LAotCQkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBwcm9wZXJ0eSBtYXkgYmUgbnVsbAotCQkgKi8KLQkJcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDb21wdWxzb3J5KCkgewotCQkJcmV0dXJuIGNvbXB1bHNvcnk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5LgotCQkgKiA8cD4KLQkJICogVGhpcyBpbXBsZW1lbnRhdGlvbiB0aHJvd3MgYW4gdW5jaGVja2VkIGV4Y2VwdGlvbi4gU3ViY2xhc3NlcyAKLQkJICogc2hvdWxkIHJlaW1wbGVtZW50LgotCQkgKiA8L3A+Ci0JCSAqIAotCQkgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gdmFsdWUKLQkJICovCi0JCXB1YmxpYyBBU1ROb2RlIGdldCgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJnZXQgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFNldHMgb3IgY2xlYXJzIHRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5LgotCQkgKiA8cD4KLQkJICogVGhpcyBpbXBsZW1lbnRhdGlvbiB0aHJvd3MgYW4gdW5jaGVja2VkIGV4Y2VwdGlvbi4gU3ViY2xhc3NlcyAKLQkJICogc2hvdWxkIHJlaW1wbGVtZW50LgotCQkgKiA8L3A+Ci0JCSAqIAotCQkgKiBAcGFyYW0gdmFsdWUgdGhlIHByb3BlcnR5IHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyB2YWx1ZQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJnZXQoIiArIHZhbHVlICsgIikgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogRXhlcmNpc2VzIHRoZSBnaXZlbiBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gbm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB0ZXN0Ci0JICogQHBhcmFtIHByb3AgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IKLQkgKi8KLQl2b2lkIGdlbmVyaWNQcm9wZXJ0eVRlc3QoQVNUTm9kZSBub2RlLCBQcm9wZXJ0eSBwcm9wKSB7Ci0JCQotCQlBU1ROb2RlIHgxID0gcHJvcC5zYW1wbGUobm9kZS5nZXRBU1QoKSwgZmFsc2UpOwotCQlwcm9wLnNldCh4MSk7Ci0JCWFzc2VydFRydWUocHJvcC5nZXQoKSA9PSB4MSk7Ci0JCWFzc2VydFRydWUoeDEuZ2V0UGFyZW50KCkgPT0gbm9kZSk7Ci0JCQotCQkvLyBjaGVjayBoYW5kbGluZyBvZiBudWxsCi0JCWlmIChwcm9wLmlzQ29tcHVsc29yeSgpKSB7Ci0JCQl0cnkgewotCQkJCXByb3Auc2V0KG51bGwpOwotCQkJCWFzc2VydFRydWUoZmFsc2UpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gcGFzcwotCQkJfQotCQl9IGVsc2UgewotCQkJbG9uZyBwcmV2aW91c0NvdW50ID0gbm9kZS5nZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpOwotCQkJcHJvcC5zZXQobnVsbCk7Ci0JCQlhc3NlcnRUcnVlKHByb3AuZ2V0KCkgPT0gbnVsbCk7Ci0JCQlhc3NlcnRUcnVlKG5vZGUuZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQl9CQkJCi0KLQkJLy8gY2hlY2sgdGhhdCBhIGNoaWxkIGZyb20gYSBkaWZmZXJlbnQgQVNUIGlzIGRldGVjdGVkCi0JCXRyeSB7Ci0JCQlwcm9wLnNldChwcm9wLnNhbXBsZShuZXcgQVNUKCksIGZhbHNlKSk7Ci0JCQlhc3NlcnRUcnVlKGZhbHNlKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBwYXNzCi0JCX0KLQotCQkvLyBjaGVjayB0aGF0IGEgY2hpbGQgd2l0aCBhIHBhcmVudCBpcyBkZXRlY3RlZAotCQl0cnkgewotCQkJQVNUTm9kZSBiMSA9IHByb3Auc2FtcGxlKG5vZGUuZ2V0QVNUKCksIHRydWUpOwotCQkJcHJvcC5zZXQoYjEpOyAvLyBib2d1czogYWxyZWFkeSBoYXMgcGFyZW50Ci0JCQlhc3NlcnRUcnVlKGZhbHNlKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBwYXNzCi0JCX0KLQotCQkvLyBjaGVjayB0aGF0IGEgY3ljbGUgaXMgZGV0ZWN0ZWQKLQkJYXNzZXJ0VHJ1ZShub2RlLmdldFBhcmVudCgpID09IG51bGwpOwotCQlBU1ROb2RlIHMxID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXMxID0gcHJvcC53cmFwKCk7Ci0JCQlpZiAoczEgIT0gbnVsbCkgewotCQkJCXByb3Auc2V0KHMxKTsgIC8vIGJvZ3VzOiBjcmVhdGVzIGEgY3ljbGUKLQkJCQlhc3NlcnRUcnVlKGZhbHNlKTsKLQkJCX0KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBwYXNzCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAoczEgIT0gbnVsbCkgewotCQkJCXByb3AudW53cmFwKCk7Ci0JCQkJYXNzZXJ0VHJ1ZShub2RlLmdldFBhcmVudCgpID09IG51bGwpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRXhlcmNpc2VzIHRoZSBnaXZlbiBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gbm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byB0ZXN0Ci0JICogQHBhcmFtIGNoaWxkcmVuIHRoZSBub2RlIHRvIHRlc3QKLQkgKiBAcGFyYW0gcHJvcCB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcgotCSAqLwotCXZvaWQgZ2VuZXJpY1Byb3BlcnR5TGlzdFRlc3QoQVNUTm9kZSBub2RlLCBMaXN0IGNoaWxkcmVuLCBQcm9wZXJ0eSBwcm9wKSB7Ci0JCQotCQkvLyB3aXBlIHRoZSBzbGF0ZSBjbGVhbgotCQljaGlsZHJlbi5jbGVhcigpOwotCQlhc3NlcnRUcnVlKGNoaWxkcmVuLnNpemUoKSA9PSAwKTsKLQkJCi0JCS8vIGFkZCBhIGNoaWxkCi0JCUFTVE5vZGUgeDEgPSBwcm9wLnNhbXBsZShub2RlLmdldEFTVCgpLCBmYWxzZSk7Ci0JCWxvbmcgcHJldmlvdXNDb3VudCA9IG5vZGUuZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJY2hpbGRyZW4uYWRkKHgxKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLmdldEFTVCgpLm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJYXNzZXJ0VHJ1ZShjaGlsZHJlbi5zaXplKCkgPT0gMSk7Ci0JCWFzc2VydFRydWUoY2hpbGRyZW4uZ2V0KDApID09IHgxKTsKLQkJYXNzZXJ0VHJ1ZSh4MS5nZXRQYXJlbnQoKSA9PSBub2RlKTsKLQkJCi0JCS8vIGFkZCBhIHNlY29uZCBjaGlsZAotCQlBU1ROb2RlIHgyID0gcHJvcC5zYW1wbGUobm9kZS5nZXRBU1QoKSwgZmFsc2UpOwotCQlwcmV2aW91c0NvdW50ID0gbm9kZS5nZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpOwotCQljaGlsZHJlbi5hZGQoeDIpOwotCQlhc3NlcnRUcnVlKG5vZGUuZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlhc3NlcnRUcnVlKGNoaWxkcmVuLnNpemUoKSA9PSAyKTsKLQkJYXNzZXJ0VHJ1ZShjaGlsZHJlbi5nZXQoMCkgPT0geDEpOwotCQlhc3NlcnRUcnVlKGNoaWxkcmVuLmdldCgxKSA9PSB4Mik7Ci0JCWFzc2VydFRydWUoeDEuZ2V0UGFyZW50KCkgPT0gbm9kZSk7Ci0JCWFzc2VydFRydWUoeDIuZ2V0UGFyZW50KCkgPT0gbm9kZSk7Ci0KLQkJLy8gcmVtb3ZlIHRoZSBmaXJzdCBjaGlsZAotCQlwcmV2aW91c0NvdW50ID0gbm9kZS5nZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpOwotCQljaGlsZHJlbi5yZW1vdmUoMCk7Ci0JCWFzc2VydFRydWUobm9kZS5nZXRBU1QoKS5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCWFzc2VydFRydWUoY2hpbGRyZW4uc2l6ZSgpID09IDEpOwotCQlhc3NlcnRUcnVlKGNoaWxkcmVuLmdldCgwKSA9PSB4Mik7Ci0JCWFzc2VydFRydWUoeDEuZ2V0UGFyZW50KCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeDIuZ2V0UGFyZW50KCkgPT0gbm9kZSk7Ci0KLQkJLy8gcmVtb3ZlIHRoZSByZW1haW5pbmcgY2hpbGQKLQkJcHJldmlvdXNDb3VudCA9IG5vZGUuZ2V0QVNUKCkubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJY2hpbGRyZW4ucmVtb3ZlKHgyKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLmdldEFTVCgpLm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJYXNzZXJ0VHJ1ZShjaGlsZHJlbi5zaXplKCkgPT0gMCk7Ci0JCWFzc2VydFRydWUoeDEuZ2V0UGFyZW50KCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeDIuZ2V0UGFyZW50KCkgPT0gbnVsbCk7Ci0KLQkJLy8gY2hlY2sgdGhhdCBudWxsIGlzIG5ldmVyIGFsbG93ZWQKLQkJdHJ5IHsKLQkJCWNoaWxkcmVuLmFkZChudWxsKTsKLQkJCWFzc2VydFRydWUoZmFsc2UpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHBhc3MKLQkJfQotCi0JCS8vIGNoZWNrIHRoYXQgYSBjaGlsZCBmcm9tIGEgZGlmZmVyZW50IEFTVCBpcyBkZXRlY3RlZAotCQl0cnkgewotCQkJY2hpbGRyZW4uYWRkKHByb3Auc2FtcGxlKG5ldyBBU1QoKSwgZmFsc2UpKTsKLQkJCWFzc2VydFRydWUoZmFsc2UpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHBhc3MKLQkJfQotCi0JCS8vIGNoZWNrIHRoYXQgYSBjaGlsZCB3aXRoIGEgcGFyZW50IGlzIGRldGVjdGVkCi0JCXRyeSB7Ci0JCQlBU1ROb2RlIGIxID0gcHJvcC5zYW1wbGUobm9kZS5nZXRBU1QoKSwgdHJ1ZSk7Ci0JCQljaGlsZHJlbi5hZGQoYjEpOyAvLyBib2d1czogYWxyZWFkeSBoYXMgcGFyZW50Ci0JCQlhc3NlcnRUcnVlKGZhbHNlKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBwYXNzCi0JCX0KLQotCQkvLyBjaGVjayB0aGF0IGEgY3ljbGUgaXMgZGV0ZWN0ZWQKLQkJYXNzZXJ0VHJ1ZShub2RlLmdldFBhcmVudCgpID09IG51bGwpOwotCQlBU1ROb2RlIHMxID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXMxID0gcHJvcC53cmFwKCk7Ci0JCQlpZiAoczEgIT0gbnVsbCkgewotCQkJCWNoaWxkcmVuLmFkZChzMSk7ICAvLyBib2d1czogY3JlYXRlcyBhIGN5Y2xlCi0JCQkJYXNzZXJ0VHJ1ZShmYWxzZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJLy8gcGFzcwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHMxICE9IG51bGwpIHsKLQkJCQlwcm9wLnVud3JhcCgpOwotCQkJCWFzc2VydFRydWUobm9kZS5nZXRQYXJlbnQoKSA9PSBudWxsKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QVNUKCkgewotCQkKLQkJLy8gbW9kaWZpY2F0aW9uIGNvdW50IGlzIGFsd2F5cyBub24tbmVnYXRpdmUKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+PSAwKTsKLQkJCi0JCS8vIG1vZGlmaWNhdGlvbiBjb3VudCBpbmNyZWFzZXMgZm9yIG5vZGUgY3JlYXRpb25zCi0JCWxvbmcgcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlTaW1wbGVOYW1lIHggPSBhc3QubmV3U2ltcGxlTmFtZSgiZmlyc3QiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0KLQkJLy8gbW9kaWZpY2F0aW9uIGNvdW50IGRvZXMgbm90IGluY3JlYXNlIGZvciByZWFkaW5nIG5vZGUgYXR0cmlidXRlcwotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCXguZ2V0SWRlbnRpZmllcigpOwotCQl4LmdldFBhcmVudCgpOwotCQl4LmdldFJvb3QoKTsKLQkJeC5nZXRBU1QoKTsKLQkJeC5nZXRGbGFncygpOwotCQl4LmdldFN0YXJ0UG9zaXRpb24oKTsKLQkJeC5nZXRMZW5ndGgoKTsKLQkJeC5lcXVhbHMoeCk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0KLQkJLy8gbW9kaWZpY2F0aW9uIGNvdW50IGRvZXMgbm90IGluY3JlYXNlIGZvciByZWFkaW5nIG9yIHdyaXRpbmcgcHJvcGVydGllcwotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCXguZ2V0UHJvcGVydHkoImFueSIpOyAvLyROT04tTkxTLTEkCi0JCXguc2V0UHJvcGVydHkoImFueSIsICJ2YWx1ZSIpOyAvLyBOLkIuIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl4LnByb3BlcnRpZXMoKTsKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA9PSBwcmV2aW91c0NvdW50KTsKLQotCQkvLyBtb2RpZmljYXRpb24gY291bnQgaW5jcmVhc2VzIGZvciBjaGFuZ2luZyBub2RlIGF0dHJpYnV0ZXMKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQl4LnNldElkZW50aWZpZXIoInNlY29uZCIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJCi0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJeC5zZXRGbGFncygwKTsKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQkKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQl4LnNldFNvdXJjZVJhbmdlKC0xLDApOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0V2VsbEtub3duQmluZGluZ3MoKSB7Ci0KLQkJLy8gd2VsbCBrbm93biBiaW5kaW5ncwotCQlTdHJpbmdbXSB3a2JzID0gewotCQkJImJ5dGUiLCAiY2hhciIsICJzaG9ydCIsICJpbnQiLCAibG9uZyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkJImJvb2xlYW4iLCAiZmxvYXQiLCAiZG91YmxlIiwgInZvaWQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkiamF2YS5sYW5nLk9iamVjdCIsIC8vJE5PTi1OTFMtMSQKLQkJCSJqYXZhLmxhbmcuU3RyaW5nIiwgLy8kTk9OLU5MUy0xJAotCQkJImphdmEubGFuZy5TdHJpbmdCdWZmZXIiLCAvLyROT04tTkxTLTEkCi0JCQkiamF2YS5sYW5nLlRocm93YWJsZSIsIC8vJE5PTi1OTFMtMSQKLQkJCSJqYXZhLmxhbmcuRXhjZXB0aW9uIiwgLy8kTk9OLU5MUy0xJAotCQkJImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIiwgLy8kTk9OLU5MUy0xJAotCQkJImphdmEubGFuZy5FcnJvciIsIC8vJE5PTi1OTFMtMSQKLQkJfTsKLQkJCi0JCS8vIG5vLXNvLXdlbGwta25vd24gYmluZGluZ3MKLQkJU3RyaW5nW10gbndrYnMgPSB7Ci0JCQkidmVyeWxvbmciLCAvLyROT04tTkxTLTEkCi0JCQkiamF2YS5sYW5nLk1hdGgiLCAvLyROT04tTkxTLTEkCi0JCQkiY29tLmV4YW1wbGUuTXlDb2RlIiwgLy8kTk9OLU5MUy0xJAotCQl9OwotCQotCQkvLyBub25lIG9mIHRoZSB3ZWxsIGtub3duIGJpbmRpbmdzIHJlc29sdmUgaW4gYSBwbGFpbiBBU1QJCQotCQlmb3IgKGludCBpID0gMDsgaTx3a2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhc3NlcnRUcnVlKGFzdC5yZXNvbHZlV2VsbEtub3duVHlwZSh3a2JzW2ldKSA9PSBudWxsKTsKLQkJfQotCQotCQkvLyBub25lIG9mIHRoZSBubyBzbyB3ZWxsIGtub3duIGJpbmRpbmdzIHJlc29sdmUgZWl0aGVyCQkKLQkJZm9yIChpbnQgaSA9IDA7IGk8bndrYnMubGVuZ3RoOyBpKyspIHsKLQkJCWFzc2VydFRydWUoYXN0LnJlc29sdmVXZWxsS25vd25UeXBlKG53a2JzW2ldKSA9PSBudWxsKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlTmFtZSgpIHsKLQkJbG9uZyBwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCVNpbXBsZU5hbWUgeCA9IGFzdC5uZXdTaW1wbGVOYW1lKCJmb28iKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJYXNzZXJ0VHJ1ZSh4IGluc3RhbmNlb2YgTmFtZSk7Ci0JCWFzc2VydFRydWUoeC5nZXRBU1QoKSA9PSBhc3QpOwotCQlhc3NlcnRUcnVlKHguZ2V0UGFyZW50KCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoImZvbyIuZXF1YWxzKHguZ2V0SWRlbnRpZmllcigpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSh4LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5TSU1QTEVfTkFNRSk7Ci0JCWFzc2VydFRydWUoeC5pc0RlY2xhcmF0aW9uKCkgPT0gZmFsc2UpOwotCQkvLyBtYWtlIHN1cmUgdGhhdCByZWFkaW5nIGRpZCBub3QgY2hhbmdlIG1vZGlmaWNhdGlvbiBjb3VudAotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID09IHByZXZpb3VzQ291bnQpOwotCi0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJeC5zZXRJZGVudGlmaWVyKCJiYXIiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCWFzc2VydFRydWUoImJhciIuZXF1YWxzKHguZ2V0SWRlbnRpZmllcigpKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBjaGVjayB0aGF0IHByb3BlcnR5IGNhbm5vdCBiZSBzZXQgdG8gbnVsbAotCQl0cnkgewotCQkJeC5zZXRJZGVudGlmaWVyKG51bGwpOwotCQkJYXNzZXJ0VHJ1ZShmYWxzZSk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJLy8gcGFzcwotCQl9Ci0JCQotCQkvLyBjaGVjayB0aGF0IHByb3BlcnR5IGNhbm5vdCBiZSBzZXQgdG8ga2V5d29yZCBvciByZXNlcnZlZCB3b3JrCi0JCVN0cmluZ1tdIHJlc2VydmVkICA9IAotCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCQkidHJ1ZSIsICJmYWxzZSIsICJudWxsIiwgLy8gbGl0ZXJhbHMgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCSJhYnN0cmFjdCIsICJkZWZhdWx0IiwgImlmIiwgInByaXZhdGUiLCAidGhpcyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkJCQkJImJvb2xlYW4iLCAiZG8iLCAiaW1wbGVtZW50cyIsICJwcm90ZWN0ZWQiLCAidGhyb3ciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJCQkJCSJicmVhayIsICJkb3VibGUiLCAiaW1wb3J0IiwgInB1YmxpYyIsICJ0aHJvd3MiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJCQkJCSJieXRlIiwgImVsc2UiLCAiaW5zdGFuY2VvZiIsICJyZXR1cm4iLCAidHJhbnNpZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCQkJCQkiY2FzZSIsICJleHRlbmRzIiwgImludCIsICJzaG9ydCIsICJ0cnkiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJCQkJCSJjYXRjaCIsICJmaW5hbCIsICJpbnRlcmZhY2UiLCAic3RhdGljIiwgInZvaWQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJCQkJCSJjaGFyIiwgImZpbmFsbHkiLCAibG9uZyIsICJzdHJpY3RmcCIsICJ2b2xhdGlsZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkJCQkJImNsYXNzIiwgImZsb2F0IiwgIm5hdGl2ZSIsICJzdXBlciIsICJ3aGlsZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkJCQkJImNvbnN0IiwgImZvciIsICJuZXciLCAic3dpdGNoIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCQkJImNvbnRpbnVlIiwgImdvdG8iLCAicGFja2FnZSIsICJzeW5jaHJvbml6ZWQifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlmb3IgKGludCBpPTA7IGk8cmVzZXJ2ZWQubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJeC5zZXRJZGVudGlmaWVyKHJlc2VydmVkW2ldKTsKLQkJCQlhc3NlcnRUcnVlKGZhbHNlKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCS8vIHBhc3MKLQkJCX0KLQkJfQotCQkKLQkJLy8gY2hlY2sgdGhhdCAiYXNzZXJ0IiBpcyBub3QgY29uc2lkZXJlZCBhIGtleXdvcmQKLQkJeC5zZXRJZGVudGlmaWVyKCJhc3NlcnQiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLy8gY2hlY2sgdGhhdCBpc0RlY2xhcmF0aW9uIHdvcmtzCi0JCVF1YWxpZmllZE5hbWUgeSA9IGFzdC5uZXdRdWFsaWZpZWROYW1lKGFzdC5uZXdTaW1wbGVOYW1lKCJhIiksIHgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoeC5pc0RlY2xhcmF0aW9uKCkgPT0gZmFsc2UpOwotCQl5LnNldE5hbWUoYXN0Lm5ld1NpbXBsZU5hbWUoImIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSh4LmlzRGVjbGFyYXRpb24oKSA9PSBmYWxzZSk7Ci0KLQkJVHlwZURlY2xhcmF0aW9uIHRkID0gYXN0Lm5ld1R5cGVEZWNsYXJhdGlvbigpOwotCQl0ZC5zZXROYW1lKHgpOwotCQlhc3NlcnRUcnVlKHguaXNEZWNsYXJhdGlvbigpID09IHRydWUpOwotCQl0ZC5zZXROYW1lKGFzdC5uZXdTaW1wbGVOYW1lKCJiIikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoeC5pc0RlY2xhcmF0aW9uKCkgPT0gZmFsc2UpOwotCQkKLQkJTWV0aG9kRGVjbGFyYXRpb24gbWQgPSBhc3QubmV3TWV0aG9kRGVjbGFyYXRpb24oKTsKLQkJbWQuc2V0TmFtZSh4KTsKLQkJYXNzZXJ0VHJ1ZSh4LmlzRGVjbGFyYXRpb24oKSA9PSB0cnVlKTsKLQkJbWQuc2V0TmFtZShhc3QubmV3U2ltcGxlTmFtZSgiYiIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKHguaXNEZWNsYXJhdGlvbigpID09IGZhbHNlKTsKLQkJCi0JCVNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gdmQgPSBhc3QubmV3U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbigpOwotCQl2ZC5zZXROYW1lKHgpOwotCQlhc3NlcnRUcnVlKHguaXNEZWNsYXJhdGlvbigpID09IHRydWUpOwotCQl2ZC5zZXROYW1lKGFzdC5uZXdTaW1wbGVOYW1lKCJiIikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoeC5pc0RlY2xhcmF0aW9uKCkgPT0gZmFsc2UpOwotCQkKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IGZkID0gYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQlmZC5zZXROYW1lKHgpOwotCQlhc3NlcnRUcnVlKHguaXNEZWNsYXJhdGlvbigpID09IHRydWUpOwotCQlmZC5zZXROYW1lKGFzdC5uZXdTaW1wbGVOYW1lKCJiIikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoeC5pc0RlY2xhcmF0aW9uKCkgPT0gZmFsc2UpOwotCQkKLQl9CQkKLQotCXB1YmxpYyB2b2lkIHRlc3RRdWFsaWZpZWROYW1lKCkgewotCQlsb25nIHByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJZmluYWwgUXVhbGlmaWVkTmFtZSB4ID0gYXN0Lm5ld1F1YWxpZmllZE5hbWUoCi0JCQlhc3QubmV3U2ltcGxlTmFtZSgicSIpLCAvLyROT04tTkxTLTEkCi0JCQlhc3QubmV3U2ltcGxlTmFtZSgiaSIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJYXNzZXJ0VHJ1ZSh4IGluc3RhbmNlb2YgTmFtZSk7Ci0JCWFzc2VydFRydWUoeC5nZXRBU1QoKSA9PSBhc3QpOwotCQlhc3NlcnRUcnVlKHguZ2V0UGFyZW50KCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5nZXRRdWFsaWZpZXIoKS5nZXRQYXJlbnQoKSA9PSB4KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE5hbWUoKS5nZXRQYXJlbnQoKSA9PSB4KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE5hbWUoKS5pc0RlY2xhcmF0aW9uKCkgPT0gZmFsc2UpOwotCQlhc3NlcnRUcnVlKHguZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlFVQUxJRklFRF9OQU1FKTsKLQkJLy8gbWFrZSBzdXJlIHRoYXQgcmVhZGluZyBkaWQgbm90IGNoYW5nZSBtb2RpZmljYXRpb24gY291bnQKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA9PSBwcmV2aW91c0NvdW50KTsKLQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiUXVhbGlmaWVyIiwgdHJ1ZSwgTmFtZS5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCVF1YWxpZmllZE5hbWUgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld1F1YWxpZmllZE5hbWUoCi0JCQkJCXRhcmdldEFzdC5uZXdTaW1wbGVOYW1lKCJhIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJdGFyZ2V0QXN0Lm5ld1NpbXBsZU5hbWUoImIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJdGFyZ2V0QXN0Lm5ld0V4cHJlc3Npb25TdGF0ZW1lbnQocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIHdyYXAoKSB7Ci0JCQkJUXVhbGlmaWVkTmFtZSBzMSA9IGFzdC5uZXdRdWFsaWZpZWROYW1lKHgsIGFzdC5uZXdTaW1wbGVOYW1lKCJ6IikpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIHMxOwotCQkJfQotCQkJcHVibGljIHZvaWQgdW53cmFwKCkgewotCQkJCVF1YWxpZmllZE5hbWUgczEgPSAoUXVhbGlmaWVkTmFtZSkgeC5nZXRQYXJlbnQoKTsKLQkJCQlzMS5zZXRRdWFsaWZpZXIoYXN0Lm5ld1NpbXBsZU5hbWUoInoiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIGdldCgpIHsKLQkJCQlyZXR1cm4geC5nZXRRdWFsaWZpZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXRRdWFsaWZpZXIoKE5hbWUpIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiTmFtZSIsIHRydWUsIFNpbXBsZU5hbWUuY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCB0YXJnZXRBc3QsIGJvb2xlYW4gcGFyZW50ZWQpIHsKLQkJCQlTaW1wbGVOYW1lIHJlc3VsdCA9IHRhcmdldEFzdC5uZXdTaW1wbGVOYW1lKCJmb28iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQl0YXJnZXRBc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldE5hbWUoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXROYW1lKChTaW1wbGVOYW1lKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQl9CQkKLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsTGl0ZXJhbCgpIHsKLQkJbG9uZyBwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCU51bGxMaXRlcmFsIHggPSBhc3QubmV3TnVsbExpdGVyYWwoKTsKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWFzc2VydFRydWUoeCBpbnN0YW5jZW9mIEV4cHJlc3Npb24pOwotCQlhc3NlcnRUcnVlKHguZ2V0QVNUKCkgPT0gYXN0KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFBhcmVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLk5VTExfTElURVJBTCk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHJlYWRpbmcgZGlkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGNvdW50Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0KLQl9CQkKLQotCXB1YmxpYyB2b2lkIHRlc3RCb29sZWFuTGl0ZXJhbCgpIHsKLQkJbG9uZyBwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCUJvb2xlYW5MaXRlcmFsIHggPSBhc3QubmV3Qm9vbGVhbkxpdGVyYWwodHJ1ZSk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlhc3NlcnRUcnVlKHggaW5zdGFuY2VvZiBFeHByZXNzaW9uKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEFTVCgpID09IGFzdCk7Ci0JCWFzc2VydFRydWUoeC5nZXRQYXJlbnQoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmJvb2xlYW5WYWx1ZSgpID09IHRydWUpOwotCQlhc3NlcnRUcnVlKHguZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkJPT0xFQU5fTElURVJBTCk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHJlYWRpbmcgZGlkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGNvdW50Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0JCQotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCXguc2V0Qm9vbGVhblZhbHVlKGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlhc3NlcnRUcnVlKHguYm9vbGVhblZhbHVlKCkgPT0gZmFsc2UpOwotCQkKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQl4LnNldEJvb2xlYW5WYWx1ZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlhc3NlcnRUcnVlKHguYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSk7Ci0JfQkJCi0JCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0xpdGVyYWwoKSB7Ci0JCWxvbmcgcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQkvLyBjaGVjayAwLWFyZyBmYWN0b3J5IGZpcnN0Ci0JCVN0cmluZ0xpdGVyYWwgeCA9IGFzdC5uZXdTdHJpbmdMaXRlcmFsKCk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlhc3NlcnRUcnVlKHggaW5zdGFuY2VvZiBFeHByZXNzaW9uKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEFTVCgpID09IGFzdCk7Ci0JCWFzc2VydFRydWUoeC5nZXRQYXJlbnQoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSgiXCJcIiIuZXF1YWxzKHguZ2V0RXNjYXBlZFZhbHVlKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCIiLmVxdWFscyh4LmdldExpdGVyYWxWYWx1ZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSh4LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5TVFJJTkdfTElURVJBTCk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHJlYWRpbmcgZGlkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGNvdW50Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0JCQotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCXguc2V0RXNjYXBlZFZhbHVlKCJcImJ5ZVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlhc3NlcnRUcnVlKCJcImJ5ZVwiIi5lcXVhbHMoeC5nZXRFc2NhcGVkVmFsdWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoImJ5ZSIuZXF1YWxzKHguZ2V0TGl0ZXJhbFZhbHVlKCkpKTsgLy8kTk9OLU5MUy0xJAotCi0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJeC5zZXRMaXRlcmFsVmFsdWUoImhpIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlhc3NlcnRUcnVlKCJcImhpXCIiLmVxdWFscyh4LmdldEVzY2FwZWRWYWx1ZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiaGkiLmVxdWFscyh4LmdldExpdGVyYWxWYWx1ZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCXguc2V0TGl0ZXJhbFZhbHVlKCJcXDAxMlxcMDE1Iik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlhc3NlcnRFcXVhbHMoImRpZmZlcmVudCIsICJcIlxcXFwwMTJcXFxcMDE1XCIiLCB4LmdldEVzY2FwZWRWYWx1ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJcXDAxMlxcMDE1Ii5lcXVhbHMoeC5nZXRMaXRlcmFsVmFsdWUoKSkpOyAvLyROT04tTkxTLTEkCi0KLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQl4LnNldExpdGVyYWxWYWx1ZSgiXDAxMlwwMTUiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCWFzc2VydFRydWUoIlxuXHIiLmVxdWFscyh4LmdldExpdGVyYWxWYWx1ZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJkaWZmZXJlbnQiLCAiXCJcXG5cXHJcIiIsIHguZ2V0RXNjYXBlZFZhbHVlKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gY2hlY2sgdGhhdCBwcm9wZXJ0eSBjYW5ub3QgYmUgc2V0IHRvIG51bGwKLQkJdHJ5IHsKLQkJCXguc2V0RXNjYXBlZFZhbHVlKG51bGwpOwotCQkJYXNzZXJ0VHJ1ZShmYWxzZSk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJLy8gcGFzcwotCQl9Ci0KLQkJLy8gY2hlY2sgdGhhdCBwcm9wZXJ0eSBjYW5ub3QgYmUgc2V0IHRvIG51bGwKLQkJdHJ5IHsKLQkJCXguc2V0TGl0ZXJhbFZhbHVlKG51bGwpOwotCQkJYXNzZXJ0VHJ1ZShmYWxzZSk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJLy8gcGFzcwotCQl9Ci0JfQkJCi0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nTGl0ZXJhbFVuaWNvZGUoKSB7Ci0JCUFTVCBsb2NhbEFzdCA9IG5ldyBBU1QoKTsKLQkJU3RyaW5nTGl0ZXJhbCBsaXRlcmFsID0gbG9jYWxBc3QubmV3U3RyaW5nTGl0ZXJhbCgpOwotCQlsaXRlcmFsLnNldEVzY2FwZWRWYWx1ZSgiXCJoZWxsb1xcdTAwMjZcXHUwMDUwd29ybFxcdTAwNjRcIiIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUobGl0ZXJhbC5nZXRMaXRlcmFsVmFsdWUoKS5lcXVhbHMoImhlbGxvJlB3b3JsZCIpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJbG9jYWxBc3QgPSBuZXcgQVNUKCk7Ci0JCWxpdGVyYWwgPSBsb2NhbEFzdC5uZXdTdHJpbmdMaXRlcmFsKCk7Ci0JCWxpdGVyYWwuc2V0RXNjYXBlZFZhbHVlKCJcImhlbGxvXFxud29ybGRcIiIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUobGl0ZXJhbC5nZXRMaXRlcmFsVmFsdWUoKS5lcXVhbHMoImhlbGxvXG53b3JsZCIpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJbG9jYWxBc3QgPSBuZXcgQVNUKCk7Ci0JCWxpdGVyYWwgPSBsb2NhbEFzdC5uZXdTdHJpbmdMaXRlcmFsKCk7Ci0JCWxpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKCJoZWxsb1xud29ybGQiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKGxpdGVyYWwuZ2V0TGl0ZXJhbFZhbHVlKCkuZXF1YWxzKCJoZWxsb1xud29ybGQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWxvY2FsQXN0ID0gbmV3IEFTVCgpOwotCQlsaXRlcmFsID0gbG9jYWxBc3QubmV3U3RyaW5nTGl0ZXJhbCgpOwotCQlsaXRlcmFsLnNldExpdGVyYWxWYWx1ZSgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKGxpdGVyYWwuZ2V0RXNjYXBlZFZhbHVlKCkuZXF1YWxzKCJcIlxcblwiIikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUobGl0ZXJhbC5nZXRMaXRlcmFsVmFsdWUoKS5lcXVhbHMoIlxuIikpOyAvLyROT04tTkxTLTEkCi0JCQotCQlsb2NhbEFzdCA9IG5ldyBBU1QoKTsKLQkJbGl0ZXJhbCA9IGxvY2FsQXN0Lm5ld1N0cmluZ0xpdGVyYWwoKTsKLQkJbGl0ZXJhbC5zZXRFc2NhcGVkVmFsdWUoIlwiaGVsbG9cXFwid29ybGRcIiIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUobGl0ZXJhbC5nZXRMaXRlcmFsVmFsdWUoKS5lcXVhbHMoImhlbGxvXCJ3b3JsZCIpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJbG9jYWxBc3QgPSBuZXcgQVNUKCk7Ci0JCWxpdGVyYWwgPSBsb2NhbEFzdC5uZXdTdHJpbmdMaXRlcmFsKCk7Ci0JCWxpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKCJoZWxsb1xcdTAwMjZ3b3JsZCIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUobGl0ZXJhbC5nZXRMaXRlcmFsVmFsdWUoKS5lcXVhbHMoImhlbGxvXFx1MDAyNndvcmxkIikpOyAvLyROT04tTkxTLTEkCi0JCQotCQlsb2NhbEFzdCA9IG5ldyBBU1QoKTsKLQkJbGl0ZXJhbCA9IGxvY2FsQXN0Lm5ld1N0cmluZ0xpdGVyYWwoKTsKLQkJbGl0ZXJhbC5zZXRMaXRlcmFsVmFsdWUoImhlbGxvXFx1MDAyNndvcmxkIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShsaXRlcmFsLmdldEVzY2FwZWRWYWx1ZSgpLmVxdWFscygiXCJoZWxsb1xcXFx1MDAyNndvcmxkXCIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWxvY2FsQXN0ID0gbmV3IEFTVCgpOwotCQlsaXRlcmFsID0gbG9jYWxBc3QubmV3U3RyaW5nTGl0ZXJhbCgpOwotCQlsaXRlcmFsLnNldExpdGVyYWxWYWx1ZSgiXFx1MDAwMSIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUobGl0ZXJhbC5nZXRFc2NhcGVkVmFsdWUoKS5lcXVhbHMoIlwiXFxcXHUwMDAxXCIiKSk7IC8vJE5PTi1OTFMtMSQKLQl9CQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhcmFjdGVyTGl0ZXJhbCgpIHsKLQkJbG9uZyBwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCUNoYXJhY3RlckxpdGVyYWwgeCA9IGFzdC5uZXdDaGFyYWN0ZXJMaXRlcmFsKCk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlhc3NlcnRUcnVlKHggaW5zdGFuY2VvZiBFeHByZXNzaW9uKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEFTVCgpID09IGFzdCk7Ci0JCWFzc2VydFRydWUoeC5nZXRQYXJlbnQoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEVzY2FwZWRWYWx1ZSgpLnN0YXJ0c1dpdGgoIlwnIikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoeC5nZXRFc2NhcGVkVmFsdWUoKS5lbmRzV2l0aCgiXCciKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSh4LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5DSEFSQUNURVJfTElURVJBTCk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHJlYWRpbmcgZGlkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGNvdW50Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0KLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQl4LnNldEVzY2FwZWRWYWx1ZSgiXCd6XCciKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCWFzc2VydFRydWUoIlwnelwnIi5lcXVhbHMoeC5nZXRFc2NhcGVkVmFsdWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoeC5jaGFyVmFsdWUoKSA9PSAneicpOwotCi0JCS8vIHRlc3Qgb3RoZXIgZmFjdG9yeSBtZXRob2QKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlDaGFyYWN0ZXJMaXRlcmFsIHkgPSBhc3QubmV3Q2hhcmFjdGVyTGl0ZXJhbCgpOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCWFzc2VydFRydWUoeSBpbnN0YW5jZW9mIEV4cHJlc3Npb24pOwotCQlhc3NlcnRUcnVlKHkuZ2V0QVNUKCkgPT0gYXN0KTsKLQkJYXNzZXJ0VHJ1ZSh5LmdldFBhcmVudCgpID09IG51bGwpOwotCQlTdHJpbmcgdiA9IHkuZ2V0RXNjYXBlZFZhbHVlKCk7Ci0JCWFzc2VydFRydWUodi5sZW5ndGgoKSA+PSAzICYmIHYuY2hhckF0KDApID09ICdcJycgJiB2LmNoYXJBdCh2Lmxlbmd0aCgpLTEgKSA9PSAnXCcnKTsKLQotCQkvLyBjaGVjayB0aGF0IHByb3BlcnR5IGNhbm5vdCBiZSBzZXQgdG8gbnVsbAotCQl0cnkgewotCQkJeC5zZXRFc2NhcGVkVmFsdWUobnVsbCk7Ci0JCQlhc3NlcnRUcnVlKGZhbHNlKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBwYXNzCi0JCX0KLQkJCi0JCS8vIHRlc3QgZXNjYXBlZCBjaGFyYWN0ZXJzCi0JCS8vIGIsIHQsIG4sIGYsIHIsICIsICcsIFwsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIG9yIDcKLQkJdHJ5IHsKLQkJCXguc2V0RXNjYXBlZFZhbHVlKCJcJ1xcYlwnIik7IC8vJE5PTi1OTFMtMSQKLQkJCXguc2V0RXNjYXBlZFZhbHVlKCJcJ1xcdFwnIik7IC8vJE5PTi1OTFMtMSQKLQkJCXguc2V0RXNjYXBlZFZhbHVlKCJcJ1xcblwnIik7IC8vJE5PTi1OTFMtMSQKLQkJCXguc2V0RXNjYXBlZFZhbHVlKCJcJ1xcZlwnIik7IC8vJE5PTi1OTFMtMSQKLQkJCXguc2V0RXNjYXBlZFZhbHVlKCJcJ1xcXCJcJyIpOyAvLyROT04tTkxTLTEkCi0JCQl4LnNldEVzY2FwZWRWYWx1ZSgiXCdcXCdcJyIpOyAvLyROT04tTkxTLTEkCi0JCQl4LnNldEVzY2FwZWRWYWx1ZSgiXCdcXFxcXCciKTsgLy8kTk9OLU5MUy0xJAotCQkJeC5zZXRFc2NhcGVkVmFsdWUoIlwnXFwwXCciKTsgLy8kTk9OLU5MUy0xJAotCQkJeC5zZXRFc2NhcGVkVmFsdWUoIlwnXFwxXCciKTsgLy8kTk9OLU5MUy0xJAotCQkJeC5zZXRFc2NhcGVkVmFsdWUoIlwnXFwyXCciKTsgLy8kTk9OLU5MUy0xJAotCQkJeC5zZXRFc2NhcGVkVmFsdWUoIlwnXFwzXCciKTsgLy8kTk9OLU5MUy0xJAotCQkJeC5zZXRFc2NhcGVkVmFsdWUoIlwnXFw0XCciKTsgLy8kTk9OLU5MUy0xJAotCQkJeC5zZXRFc2NhcGVkVmFsdWUoIlwnXFw1XCciKTsgLy8kTk9OLU5MUy0xJAotCQkJeC5zZXRFc2NhcGVkVmFsdWUoIlwnXFw2XCciKTsgLy8kTk9OLU5MUy0xJAotCQkJeC5zZXRFc2NhcGVkVmFsdWUoIlwnXFw3XCciKTsgLy8kTk9OLU5MUy0xJAotCQkJeC5zZXRFc2NhcGVkVmFsdWUoIlwnXFx1MDA0MVwnIik7IC8vJE5PTi1OTFMtMSQKLQkJCWFzc2VydFRydWUoeC5jaGFyVmFsdWUoKSA9PSAnQScpOwotCQl9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKGZhbHNlKTsKLQkJfQotCQkKLQkJeC5zZXRDaGFyVmFsdWUoJ1x1MDA0MScpOwotCQlhc3NlcnRUcnVlKHguZ2V0RXNjYXBlZFZhbHVlKCkuZXF1YWxzKCJcJ0FcJyIpKTsgLy8kTk9OLU5MUy0xJAotCQl4LnNldENoYXJWYWx1ZSgnXHQnKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEVzY2FwZWRWYWx1ZSgpLmVxdWFscygiXCdcXHRcJyIpKTsgLy8kTk9OLU5MUy0xJAotCQl4LnNldEVzY2FwZWRWYWx1ZSgiXCdcXFxcXCciKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKHguZ2V0RXNjYXBlZFZhbHVlKCkuZXF1YWxzKCJcJ1xcXFxcJyIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKHguY2hhclZhbHVlKCkgPT0gJ1xcJyk7Ci0JCXguc2V0RXNjYXBlZFZhbHVlKCJcJ1xcXCdcJyIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoeC5nZXRFc2NhcGVkVmFsdWUoKS5lcXVhbHMoIlwnXFxcJ1wnIikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoeC5jaGFyVmFsdWUoKSA9PSAnXCcnKTsJCQotCQl4LnNldENoYXJWYWx1ZSgnXCcnKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEVzY2FwZWRWYWx1ZSgpLmVxdWFscygiXCdcXFwnXCciKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSh4LmNoYXJWYWx1ZSgpID09ICdcJycpOwkJCi0JCXguc2V0Q2hhclZhbHVlKCdcXCcpOwotCQlhc3NlcnRUcnVlKHguZ2V0RXNjYXBlZFZhbHVlKCkuZXF1YWxzKCJcJ1xcXFxcJyIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKHguY2hhclZhbHVlKCkgPT0gJ1xcJyk7CQkKLQl9CQkKLQotCXB1YmxpYyB2b2lkIHRlc3ROdW1iZXJMaXRlcmFsKCkgewotCQlsb25nIHByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJTnVtYmVyTGl0ZXJhbCB4ID0gYXN0Lm5ld051bWJlckxpdGVyYWwoIjEyMzQiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJYXNzZXJ0VHJ1ZSh4IGluc3RhbmNlb2YgRXhwcmVzc2lvbik7Ci0JCWFzc2VydFRydWUoeC5nZXRBU1QoKSA9PSBhc3QpOwotCQlhc3NlcnRUcnVlKHguZ2V0UGFyZW50KCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoIjEyMzQiLmVxdWFscyh4LmdldFRva2VuKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKHguZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLk5VTUJFUl9MSVRFUkFMKTsKLQkJLy8gbWFrZSBzdXJlIHRoYXQgcmVhZGluZyBkaWQgbm90IGNoYW5nZSBtb2RpZmljYXRpb24gY291bnQKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA9PSBwcmV2aW91c0NvdW50KTsKLQotCQkvLyB0ZXN0IG90aGVyIGZhY3RvcnkgbWV0aG9kCi0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJTnVtYmVyTGl0ZXJhbCB5ID0gYXN0Lm5ld051bWJlckxpdGVyYWwoKTsKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlhc3NlcnRUcnVlKHkuZ2V0QVNUKCkgPT0gYXN0KTsKLQkJYXNzZXJ0VHJ1ZSh5LmdldFBhcmVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKCIwIi5lcXVhbHMoeS5nZXRUb2tlbigpKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlmaW5hbCBTdHJpbmdbXSBzYW1wbGVzID0KLQkJCXsgIjAiLCAiMSIsICIxMjM0NTY3ODkwIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCSAgIjBMIiwgIjFMIiwgIjEyMzQ1Njc4OTBMIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCSAgIjBsIiwgIjFsIiwgIjEyMzQ1Njc4OTBsIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCSAgIjA3NyIsICIwMTc3IiwgIjAxMjM0NTY3MCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkgICIwNzdMIiwgIjAxNzdMIiwgIjAxMjM0NTY3MEwiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJICAiMDc3bCIsICIwMTc3bCIsICIwMTIzNDU2NzBsIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCSAgIjB4MDAiLCAiMHgxIiwgIjB4MDEyMzQ1Njc4OUFCQ0RFRiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkgICIweDAwTCIsICIweDFMIiwgIjB4MDEyMzQ1Njc4OUFCQ0RFRkwiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJICAiMHgwMGwiLCAiMHgxbCIsICIweDAxMjM0NTY3ODlBQkNERUZsIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCSAgIjFlMWYiLCAiMi5mIiwgIi4zZiIsICIwZiIsICIzLjE0ZiIsICI2LjAyMjEzN2UrMjNmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQKLQkJCSAgIjFlMSIsICIyLiIsICIuMyIsICIwLjAiLCAiMy4xNCIsICIxZS05ZCIsICIxZTEzNyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQKLQkJCX07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2FtcGxlcy5sZW5ndGg7IGkrKykgewkJCQotCQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQkJeC5zZXRUb2tlbihzYW1wbGVzW2ldKTsKLQkJCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJCWFzc2VydFRydWUoc2FtcGxlc1tpXS5lcXVhbHMoeC5nZXRUb2tlbigpKSk7Ci0JCX0KLQotCQkvLyBjaGVjayB0aGF0IHByb3BlcnR5IGNhbm5vdCBiZSBzZXQgdG8gbnVsbAotCQl0cnkgewotCQkJeC5zZXRUb2tlbihudWxsKTsKLQkJCWFzc2VydFRydWUoZmFsc2UpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHBhc3MKLQkJfQotCi0JfQkJCi0KLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlVHlwZSgpIHsKLQkJbG9uZyBwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWZpbmFsIFNpbXBsZVR5cGUgeCA9IGFzdC5uZXdTaW1wbGVUeXBlKGFzdC5uZXdTaW1wbGVOYW1lKCJTdHJpbmciKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWFzc2VydFRydWUoeCBpbnN0YW5jZW9mIFR5cGUpOwotCQlhc3NlcnRUcnVlKHguZ2V0QVNUKCkgPT0gYXN0KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFBhcmVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0TmFtZSgpLmdldFBhcmVudCgpID09IHgpOwotCQlhc3NlcnRUcnVlKHguaXNTaW1wbGVUeXBlKCkpOwotCQlhc3NlcnRUcnVlKCF4LmlzQXJyYXlUeXBlKCkpOwotCQlhc3NlcnRUcnVlKCF4LmlzUHJpbWl0aXZlVHlwZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5TSU1QTEVfVFlQRSk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHJlYWRpbmcgZGlkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGNvdW50Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0KLQkJZ2VuZXJpY1Byb3BlcnR5VGVzdCh4LCBuZXcgUHJvcGVydHkoIk5hbWUiLCB0cnVlLCBOYW1lLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgdGFyZ2V0QXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJU2ltcGxlTmFtZSByZXN1bHQgPSB0YXJnZXRBc3QubmV3U2ltcGxlTmFtZSgiYSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCXRhcmdldEFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0TmFtZSgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldE5hbWUoKE5hbWUpIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0JfQkJCi0JCi0JcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZVR5cGUoKSB7Ci0JCWxvbmcgcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlQcmltaXRpdmVUeXBlIHggPSBhc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLklOVCk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlhc3NlcnRUcnVlKHggaW5zdGFuY2VvZiBUeXBlKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEFTVCgpID09IGFzdCk7Ci0JCWFzc2VydFRydWUoeC5nZXRQYXJlbnQoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFByaW1pdGl2ZVR5cGVDb2RlKCkuZXF1YWxzKFByaW1pdGl2ZVR5cGUuSU5UKSk7Ci0JCWFzc2VydFRydWUoIXguaXNTaW1wbGVUeXBlKCkpOwotCQlhc3NlcnRUcnVlKCF4LmlzQXJyYXlUeXBlKCkpOwotCQlhc3NlcnRUcnVlKHguaXNQcmltaXRpdmVUeXBlKCkpOwotCQlhc3NlcnRUcnVlKHguZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlBSSU1JVElWRV9UWVBFKTsKLQkJLy8gbWFrZSBzdXJlIHRoYXQgcmVhZGluZyBkaWQgbm90IGNoYW5nZSBtb2RpZmljYXRpb24gY291bnQKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA9PSBwcmV2aW91c0NvdW50KTsKLQkJCi0JCS8vIGNoZWNrIHRoZSBuYW1lcyBvZiB0aGUgcHJpbWl0aXZlIHR5cGUgY29kZXMKLQkJYXNzZXJ0VHJ1ZShQcmltaXRpdmVUeXBlLkJZVEUudG9TdHJpbmcoKS5lcXVhbHMoImJ5dGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShQcmltaXRpdmVUeXBlLklOVC50b1N0cmluZygpLmVxdWFscygiaW50IikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoUHJpbWl0aXZlVHlwZS5CT09MRUFOLnRvU3RyaW5nKCkuZXF1YWxzKCJib29sZWFuIikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoUHJpbWl0aXZlVHlwZS5DSEFSLnRvU3RyaW5nKCkuZXF1YWxzKCJjaGFyIikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoUHJpbWl0aXZlVHlwZS5TSE9SVC50b1N0cmluZygpLmVxdWFscygic2hvcnQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShQcmltaXRpdmVUeXBlLkxPTkcudG9TdHJpbmcoKS5lcXVhbHMoImxvbmciKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShQcmltaXRpdmVUeXBlLkZMT0FULnRvU3RyaW5nKCkuZXF1YWxzKCJmbG9hdCIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKFByaW1pdGl2ZVR5cGUuRE9VQkxFLnRvU3RyaW5nKCkuZXF1YWxzKCJkb3VibGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShQcmltaXRpdmVUeXBlLlZPSUQudG9TdHJpbmcoKS5lcXVhbHMoInZvaWQiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkKLQkJUHJpbWl0aXZlVHlwZS5Db2RlW10ga25vd24gPSB7Ci0JCQlQcmltaXRpdmVUeXBlLkJPT0xFQU4sCi0JCQlQcmltaXRpdmVUeXBlLkJZVEUsCi0JCQlQcmltaXRpdmVUeXBlLkNIQVIsCi0JCQlQcmltaXRpdmVUeXBlLklOVCwKLQkJCVByaW1pdGl2ZVR5cGUuU0hPUlQsCi0JCQlQcmltaXRpdmVUeXBlLkxPTkcsCi0JCQlQcmltaXRpdmVUeXBlLkZMT0FULAotCQkJUHJpbWl0aXZlVHlwZS5ET1VCTEUsCi0JCQlQcmltaXRpdmVUeXBlLlZPSUQsCi0JCX07Ci0JCQotCQkvLyBjaGVjayBhbGwgcHJpbWl0aXZlIHR5cGUgY29kZXMgYXJlIGRpc3RpbmN0Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwga25vd24ubGVuZ3RoOyBpKyspIHsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwga25vd24ubGVuZ3RoOyBqKyspIHsKLQkJCQlhc3NlcnRUcnVlKGkgPT0gaiB8fCAha25vd25baV0uZXF1YWxzKGtub3duW2pdKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjaGVjayBhbGwgcHJpbWl0aXZlIHR5cGUgY29kZXMgd29yawotCQlmb3IgKGludCBpID0gMDsgaSA8IGtub3duLmxlbmd0aDsgaSsrKSB7Ci0JCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCQl4LnNldFByaW1pdGl2ZVR5cGVDb2RlKGtub3duW2ldKTsKLQkJCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJCWFzc2VydFRydWUoeC5nZXRQcmltaXRpdmVUeXBlQ29kZSgpLmVxdWFscyhrbm93bltpXSkpOwotCQl9Ci0JCS8vIGVuc3VyZSBudWxsIGRvZXMgbm90IHdvcmsgYXMgYSBwcmltaXRpdmUgdHlwZSBjb2RlCi0JCXRyeSB7Ci0JCQl4LnNldFByaW1pdGl2ZVR5cGVDb2RlKG51bGwpOwotCQkJYXNzZXJ0VHJ1ZShmYWxzZSk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJLy8gcGFzcwotCQl9Ci0KLQkJLy8gY2hlY2sgdG9Db2RlIGxvb2t1cCBvZiBwcmltaXRpdmUgdHlwZSBjb2RlIGJ5IG5hbWUKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrbm93bi5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIG5hbWUgPSBrbm93bltpXS50b1N0cmluZygpOwotCQkJYXNzZXJ0VHJ1ZShQcmltaXRpdmVUeXBlLnRvQ29kZShuYW1lKS5lcXVhbHMoa25vd25baV0pKTsKLQkJfQotCQlhc3NlcnRUcnVlKFByaW1pdGl2ZVR5cGUudG9Db2RlKCJub3QtYS10eXBlIikgPT0gbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQl9CQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlUeXBlKCkgewotCQlTaW1wbGVOYW1lIHgxID0gYXN0Lm5ld1NpbXBsZU5hbWUoIlN0cmluZyIpOyAvLyROT04tTkxTLTEkCi0JCVNpbXBsZVR5cGUgeDIgPSBhc3QubmV3U2ltcGxlVHlwZSh4MSk7Ci0JCWxvbmcgcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlmaW5hbCBBcnJheVR5cGUgeCA9IGFzdC5uZXdBcnJheVR5cGUoeDIpOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJYXNzZXJ0VHJ1ZSh4IGluc3RhbmNlb2YgVHlwZSk7Ci0JCWFzc2VydFRydWUoeC5nZXRBU1QoKSA9PSBhc3QpOwotCQlhc3NlcnRUcnVlKHguZ2V0UGFyZW50KCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5nZXRDb21wb25lbnRUeXBlKCkuZ2V0UGFyZW50KCkgPT0geCk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHJlYWRpbmcgZGlkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGNvdW50Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0JCWFzc2VydFRydWUoIXguaXNTaW1wbGVUeXBlKCkpOwotCQlhc3NlcnRUcnVlKHguaXNBcnJheVR5cGUoKSk7Ci0JCWFzc2VydFRydWUoIXguaXNQcmltaXRpdmVUeXBlKCkpOwotCQlhc3NlcnRUcnVlKHguZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkFSUkFZX1RZUEUpOwotCi0JCWFzc2VydFRydWUoeC5nZXREaW1lbnNpb25zKCkgPT0gMSk7Ci0JCWFzc2VydFRydWUoeC5nZXRFbGVtZW50VHlwZSgpID09IHgyKTsKLQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiQ29tcG9uZW50VHlwZSIsIHRydWUsIFR5cGUuY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCB0YXJnZXRBc3QsIGJvb2xlYW4gcGFyZW50ZWQpIHsKLQkJCQlTaW1wbGVUeXBlIHJlc3VsdCA9IHRhcmdldEFzdC5uZXdTaW1wbGVUeXBlKAotCQkJCQl0YXJnZXRBc3QubmV3U2ltcGxlTmFtZSgiYSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQl0YXJnZXRBc3QubmV3QXJyYXlUeXBlKHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJCUFycmF5VHlwZSByZXN1bHQgPSBhc3QubmV3QXJyYXlUeXBlKHgpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB1bndyYXAoKSB7Ci0JCQkJQXJyYXlUeXBlIGEgPSAoQXJyYXlUeXBlKSB4LmdldFBhcmVudCgpOwotCQkJCWEuc2V0Q29tcG9uZW50VHlwZShhc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLklOVCkpOwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldENvbXBvbmVudFR5cGUoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXRDb21wb25lbnRUeXBlKChUeXBlKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJeC5zZXRDb21wb25lbnRUeXBlKAotCQkJYXN0Lm5ld0FycmF5VHlwZShhc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLklOVCksIDQpKTsKLQkJCQotCQlhc3NlcnRUcnVlKHguZ2V0RGltZW5zaW9ucygpID09IDUpOwotCQlhc3NlcnRUcnVlKHguZ2V0RWxlbWVudFR5cGUoKS5pc1ByaW1pdGl2ZVR5cGUoKSk7Ci0JfQkJCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFja2FnZURlY2xhcmF0aW9uKCkgewotCQlsb25nIHByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJZmluYWwgUGFja2FnZURlY2xhcmF0aW9uIHggPSBhc3QubmV3UGFja2FnZURlY2xhcmF0aW9uKCk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlhc3NlcnRUcnVlKHguZ2V0QVNUKCkgPT0gYXN0KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFBhcmVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0TmFtZSgpLmdldFBhcmVudCgpID09IHgpOwotCQlhc3NlcnRUcnVlKHguZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlBBQ0tBR0VfREVDTEFSQVRJT04pOwotCQkvLyBtYWtlIHN1cmUgdGhhdCByZWFkaW5nIGRpZCBub3QgY2hhbmdlIG1vZGlmaWNhdGlvbiBjb3VudAotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID09IHByZXZpb3VzQ291bnQpOwotCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJOYW1lIiwgdHJ1ZSwgTmFtZS5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCVNpbXBsZU5hbWUgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld1NpbXBsZU5hbWUoImEiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQl0YXJnZXRBc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldE5hbWUoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXROYW1lKChOYW1lKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCX0JCQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnREZWNsYXJhdGlvbigpIHsKLQkJbG9uZyBwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWZpbmFsIEltcG9ydERlY2xhcmF0aW9uIHggPSBhc3QubmV3SW1wb3J0RGVjbGFyYXRpb24oKTsKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWFzc2VydFRydWUoeC5nZXRBU1QoKSA9PSBhc3QpOwotCQlhc3NlcnRUcnVlKHguZ2V0UGFyZW50KCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5pc09uRGVtYW5kKCkgPT0gZmFsc2UpOwotCQlhc3NlcnRUcnVlKHguZ2V0TmFtZSgpLmdldFBhcmVudCgpID09IHgpOwotCQlhc3NlcnRUcnVlKHguZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLklNUE9SVF9ERUNMQVJBVElPTik7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHJlYWRpbmcgZGlkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGNvdW50Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0KLQkJZ2VuZXJpY1Byb3BlcnR5VGVzdCh4LCBuZXcgUHJvcGVydHkoIk5hbWUiLCB0cnVlLCBOYW1lLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgdGFyZ2V0QXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJU2ltcGxlTmFtZSByZXN1bHQgPSB0YXJnZXRBc3QubmV3U2ltcGxlTmFtZSgiYSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCXRhcmdldEFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0TmFtZSgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldE5hbWUoKE5hbWUpIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQl4LnNldE9uRGVtYW5kKGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlhc3NlcnRUcnVlKHguaXNPbkRlbWFuZCgpID09IGZhbHNlKTsKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQl4LnNldE9uRGVtYW5kKHRydWUpOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCWFzc2VydFRydWUoeC5pc09uRGVtYW5kKCkgPT0gdHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb21waWxhdGlvblVuaXQoKSB7Ci0JCWxvbmcgcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlmaW5hbCBDb21waWxhdGlvblVuaXQgeCA9IGFzdC5uZXdDb21waWxhdGlvblVuaXQoKTsKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWFzc2VydFRydWUoeC5nZXRBU1QoKSA9PSBhc3QpOwotCQlhc3NlcnRUcnVlKHguZ2V0UGFyZW50KCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5nZXRQYWNrYWdlKCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5pbXBvcnRzKCkuc2l6ZSgpID09IDApOwotCQlhc3NlcnRUcnVlKHgudHlwZXMoKS5zaXplKCkgPT0gMCk7Ci0JCWFzc2VydFRydWUoeC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQ09NUElMQVRJT05fVU5JVCk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHJlYWRpbmcgZGlkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGNvdW50Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0KLQkJdENsaWVudFByb3BlcnRpZXMoeCk7Ci0JCQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiUGFja2FnZSIsIGZhbHNlLCBQYWNrYWdlRGVjbGFyYXRpb24uY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCB0YXJnZXRBc3QsIGJvb2xlYW4gcGFyZW50ZWQpIHsKLQkJCQlQYWNrYWdlRGVjbGFyYXRpb24gcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld1BhY2thZ2VEZWNsYXJhdGlvbigpOwotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQlDb21waWxhdGlvblVuaXQgY3UgPSB0YXJnZXRBc3QubmV3Q29tcGlsYXRpb25Vbml0KCk7Ci0JCQkJCWN1LnNldFBhY2thZ2UocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIGdldCgpIHsKLQkJCQlyZXR1cm4geC5nZXRQYWNrYWdlKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzZXQoQVNUTm9kZSB2YWx1ZSkgewotCQkJCXguc2V0UGFja2FnZSgoUGFja2FnZURlY2xhcmF0aW9uKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWdlbmVyaWNQcm9wZXJ0eUxpc3RUZXN0KHgsIHguaW1wb3J0cygpLCBuZXcgUHJvcGVydHkoIkltcG9ydHMiLCB0cnVlLCBJbXBvcnREZWNsYXJhdGlvbi5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCUltcG9ydERlY2xhcmF0aW9uIHJlc3VsdCA9IHRhcmdldEFzdC5uZXdJbXBvcnREZWNsYXJhdGlvbigpOwotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQlDb21waWxhdGlvblVuaXQgY3UgPSB0YXJnZXRBc3QubmV3Q29tcGlsYXRpb25Vbml0KCk7Ci0JCQkJCWN1LmltcG9ydHMoKS5hZGQocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfSk7Ci0JCQotCQlnZW5lcmljUHJvcGVydHlMaXN0VGVzdCh4LCB4LnR5cGVzKCksIG5ldyBQcm9wZXJ0eSgiVHlwZXMiLCB0cnVlLCBUeXBlRGVjbGFyYXRpb24uY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCB0YXJnZXRBc3QsIGJvb2xlYW4gcGFyZW50ZWQpIHsKLQkJCQlUeXBlRGVjbGFyYXRpb24gcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld1R5cGVEZWNsYXJhdGlvbigpOwotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQlDb21waWxhdGlvblVuaXQgY3UgPSB0YXJnZXRBc3QubmV3Q29tcGlsYXRpb25Vbml0KCk7Ci0JCQkJCWN1LnR5cGVzKCkuYWRkKHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gY2hlY2sgdGhhdCBUeXBlRGVjbGFyYXRpb25zIGluIGJvZHkgYXJlIGNsYXNzaWZpZWQgY29ycmVjdGx5Ci0JCVR5cGVEZWNsYXJhdGlvbiB0MSA9IGFzdC5uZXdUeXBlRGVjbGFyYXRpb24oKTsKLQkJeC50eXBlcygpLmFkZCh0MSk7Ci0JCWFzc2VydFRydWUodDEuaXNMb2NhbFR5cGVEZWNsYXJhdGlvbigpID09IGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZSh0MS5pc01lbWJlclR5cGVEZWNsYXJhdGlvbigpID09IGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZSh0MS5pc1BhY2thZ2VNZW1iZXJUeXBlRGVjbGFyYXRpb24oKSA9PSB0cnVlKTsKLQotCX0JCQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb21waWxhdGlvblVuaXRMaW5lTnVtYmVyVGFibGUoKSB7Ci0vLwkJVE8gUlVOIFRISVMgVEVTVCBZT1UgTVVTVCBURU1QT1JBUklMWSBNQUtFIFBVQkxJQwotLy8JCVRIRSBNRVRIT0QgQ29tcGlsYXRpb25Vbml0LnNldExpbmVFbmRUYWJsZQotCQkKLS8vCQlmaW5hbCBDb21waWxhdGlvblVuaXQgeCA9IGFzdC5uZXdDb21waWxhdGlvblVuaXQoKTsKLS8vCQkKLS8vCQkvLyB0YWJsZSBzdGFydHMgb2ZmIGVtcHR5Ci0vLwkJZm9yIChpbnQgaT0gLTEwOyBpIDwgMTA7IGkrKykgewotLy8JCQlhc3NlcnRUcnVlKHgubGluZU51bWJlcihpKSA9PSAxKTsKLS8vCQl9Ci0vLwkJCi0vLwkJLy8gc3VwcGx5IGEgc2ltcGxlIGxpbmUgdGFibGUgdG8gdGVzdAotLy8JCVN0cmluZyBzID0gIkFBXG5CQkJcbkNDXG5EREREXG5FRUUiOwotLy8JCWFzc2VydFRydWUocy5sZW5ndGgoKSA9PSAxOCk7ICAvLyBjcm9zcyBjaGVjawotLy8JCWludCBsZVtdID0gbmV3IGludFs1XTsKLS8vCQlsZVswXSA9IHMuaW5kZXhPZignXG4nKTsKLS8vCQlsZVsxXSA9IHMuaW5kZXhPZignXG4nLCBsZVswXSArIDEpOwotLy8JCWxlWzJdID0gcy5pbmRleE9mKCdcbicsIGxlWzFdICsgMSk7Ci0vLwkJbGVbM10gPSBzLmluZGV4T2YoJ1xuJywgbGVbMl0gKyAxKTsKLS8vCQlsZVs0XSA9IHMubGVuZ3RoKCkgLSAxOwotLy8JCWxvbmcgcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotLy8JCXguc2V0TGluZUVuZFRhYmxlKGxlKTsKLS8vCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0vLwotLy8JCWFzc2VydFRydWUoeC5saW5lTnVtYmVyKDApID09IDEpOwotLy8JCWFzc2VydFRydWUoeC5saW5lTnVtYmVyKDEpID09IDEpOwotLy8JCWFzc2VydFRydWUoeC5saW5lTnVtYmVyKDIpID09IDEpOwotLy8JCWFzc2VydFRydWUoeC5saW5lTnVtYmVyKDMpID09IDIpOwotLy8JCWFzc2VydFRydWUoeC5saW5lTnVtYmVyKDQpID09IDIpOwotLy8JCWFzc2VydFRydWUoeC5saW5lTnVtYmVyKDUpID09IDIpOwotLy8JCWFzc2VydFRydWUoeC5saW5lTnVtYmVyKDYpID09IDIpOwotLy8JCWFzc2VydFRydWUoeC5saW5lTnVtYmVyKDcpID09IDMpOwotLy8JCWFzc2VydFRydWUoeC5saW5lTnVtYmVyKDgpID09IDMpOwotLy8JCWFzc2VydFRydWUoeC5saW5lTnVtYmVyKDkpID09IDMpOwotLy8JCWFzc2VydFRydWUoeC5saW5lTnVtYmVyKDEwKSA9PSA0KTsKLS8vCQlhc3NlcnRUcnVlKHgubGluZU51bWJlcigxMSkgPT0gNCk7Ci0vLwkJYXNzZXJ0VHJ1ZSh4LmxpbmVOdW1iZXIoMTIpID09IDQpOwotLy8JCWFzc2VydFRydWUoeC5saW5lTnVtYmVyKDEzKSA9PSA0KTsKLS8vCQlhc3NlcnRUcnVlKHgubGluZU51bWJlcigxNCkgPT0gNCk7Ci0vLwkJYXNzZXJ0VHJ1ZSh4LmxpbmVOdW1iZXIoMTUpID09IDUpOwotLy8JCWFzc2VydFRydWUoeC5saW5lTnVtYmVyKDE2KSA9PSA1KTsKLS8vCQlhc3NlcnRUcnVlKHgubGluZU51bWJlcigxNykgPT0gNSk7Ci0vLwotLy8JCWFzc2VydFRydWUoeC5saW5lTnVtYmVyKDE4KSA9PSAxKTsKLS8vCQlhc3NlcnRUcnVlKHgubGluZU51bWJlcigxMDApID09IDEpOwotLy8JCWFzc2VydFRydWUoeC5saW5lTnVtYmVyKDEwMDAwMDApID09IDEpOwotLy8JCWFzc2VydFRydWUoeC5saW5lTnVtYmVyKC0xKSA9PSAxKTsKLS8vCQlhc3NlcnRUcnVlKHgubGluZU51bWJlcigtMTAwKSA9PSAxKTsKLS8vCQlhc3NlcnRUcnVlKHgubGluZU51bWJlcigtMTAwMDAwMCkgPT0gMSk7Ci0vLwkJCQkKLS8vCQkvLyBzbGFtIHRhYmxlIGJhY2sgdG8gbm9uZQotLy8JCXguc2V0TGluZUVuZFRhYmxlKG5ldyBpbnRbMF0pOwotLy8JCWZvciAoaW50IGk9IC0xMDsgaSA8IDEwOyBpKyspIHsKLS8vCQkJYXNzZXJ0VHJ1ZSh4LmxpbmVOdW1iZXIoaSkgPT0gMSk7Ci0vLwkJfQotCX0JCQotCQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlRGVjbGFyYXRpb24oKSB7Ci0JCWxvbmcgcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlmaW5hbCBUeXBlRGVjbGFyYXRpb24geCA9IGFzdC5uZXdUeXBlRGVjbGFyYXRpb24oKTsKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWFzc2VydFRydWUoeCBpbnN0YW5jZW9mIEJvZHlEZWNsYXJhdGlvbik7Ci0JCWFzc2VydFRydWUoeC5nZXRBU1QoKSA9PSBhc3QpOwotCQlhc3NlcnRUcnVlKHguZ2V0UGFyZW50KCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5nZXRNb2RpZmllcnMoKSA9PSBNb2RpZmllci5OT05FKTsKLQkJYXNzZXJ0VHJ1ZSh4LmlzSW50ZXJmYWNlKCkgPT0gZmFsc2UpOwotCQlhc3NlcnRUcnVlKHguZ2V0TmFtZSgpLmdldFBhcmVudCgpID09IHgpOwotCQlhc3NlcnRUcnVlKHguZ2V0TmFtZSgpLmlzRGVjbGFyYXRpb24oKSA9PSB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFN1cGVyY2xhc3MoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEphdmFkb2MoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LnN1cGVySW50ZXJmYWNlcygpLnNpemUoKSA9PSAwKTsKLQkJYXNzZXJ0VHJ1ZSh4LmJvZHlEZWNsYXJhdGlvbnMoKS5zaXplKCk9PSAwKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5UWVBFX0RFQ0xBUkFUSU9OKTsKLQkJLy8gbWFrZSBzdXJlIHRoYXQgcmVhZGluZyBkaWQgbm90IGNoYW5nZSBtb2RpZmljYXRpb24gY291bnQKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA9PSBwcmV2aW91c0NvdW50KTsKLQkKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQl4LnNldEludGVyZmFjZSh0cnVlKTsJCi0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJYXNzZXJ0VHJ1ZSh4LmlzSW50ZXJmYWNlKCkgPT0gdHJ1ZSk7Ci0JCQotCQlpbnQgbGVnYWwgPSBNb2RpZmllci5QVUJMSUMgfCBNb2RpZmllci5QUk9URUNURUQKLQkJCXwgTW9kaWZpZXIuUFJJVkFURSB8IE1vZGlmaWVyLkFCU1RSQUNUIHwgTW9kaWZpZXIuU1RBVElDCi0JCQl8IE1vZGlmaWVyLkZJTkFMIHwgTW9kaWZpZXIuU1RSSUNURlA7Ci0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJeC5zZXRNb2RpZmllcnMobGVnYWwpOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCWFzc2VydFRydWUoeC5nZXRNb2RpZmllcnMoKSA9PSBsZWdhbCk7Ci0KLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQl4LnNldE1vZGlmaWVycyhNb2RpZmllci5OT05FKTsKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlhc3NlcnRUcnVlKHguZ2V0TW9kaWZpZXJzKCkgPT0gTW9kaWZpZXIuTk9ORSk7Ci0KLQkJdEphdmFkb2NDb21tZW50KHgpOwotCQkJCQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiTmFtZSIsIHRydWUsIFNpbXBsZU5hbWUuY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCB0YXJnZXRBc3QsIGJvb2xlYW4gcGFyZW50ZWQpIHsKLQkJCQlTaW1wbGVOYW1lIHJlc3VsdCA9IHRhcmdldEFzdC5uZXdTaW1wbGVOYW1lKCJmb28iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQl0YXJnZXRBc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldE5hbWUoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXROYW1lKChTaW1wbGVOYW1lKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZ2VuZXJpY1Byb3BlcnR5VGVzdCh4LCBuZXcgUHJvcGVydHkoIlN1cGVyY2xhc3MiLCBmYWxzZSwgTmFtZS5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCVNpbXBsZU5hbWUgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld1NpbXBsZU5hbWUoImZvbyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCXRhcmdldEFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0U3VwZXJjbGFzcygpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldFN1cGVyY2xhc3MoKE5hbWUpIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlnZW5lcmljUHJvcGVydHlMaXN0VGVzdCh4LCB4LnN1cGVySW50ZXJmYWNlcygpLAotCQkgIG5ldyBQcm9wZXJ0eSgiU3VwZXJJbnRlcmZhY2VzIiwgdHJ1ZSwgTmFtZS5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCVNpbXBsZU5hbWUgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld1NpbXBsZU5hbWUoImZvbyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCXRhcmdldEFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZ2VuZXJpY1Byb3BlcnR5TGlzdFRlc3QoeCwgeC5ib2R5RGVjbGFyYXRpb25zKCksCi0JCSAgbmV3IFByb3BlcnR5KCJCb2R5RGVjbGFyYXRpb25zIiwgdHJ1ZSwgQm9keURlY2xhcmF0aW9uLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgdGFyZ2V0QXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJVHlwZURlY2xhcmF0aW9uIHJlc3VsdCA9IHRhcmdldEFzdC5uZXdUeXBlRGVjbGFyYXRpb24oKTsKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGFyZ2V0QXN0Lm5ld0NvbXBpbGF0aW9uVW5pdCgpOwotCQkJCQljdS50eXBlcygpLmFkZChyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgd3JhcCgpIHsKLQkJCQlUeXBlRGVjbGFyYXRpb24gczEgPSB4LmdldEFTVCgpLm5ld1R5cGVEZWNsYXJhdGlvbigpOwotCQkJCXMxLmJvZHlEZWNsYXJhdGlvbnMoKS5hZGQoeCk7Ci0JCQkJcmV0dXJuIHMxOwotCQkJfQotCQkJcHVibGljIHZvaWQgdW53cmFwKCkgewotCQkJCVR5cGVEZWNsYXJhdGlvbiBzMSA9IChUeXBlRGVjbGFyYXRpb24pIHguZ2V0UGFyZW50KCk7Ci0JCQkJczEuYm9keURlY2xhcmF0aW9ucygpLnJlbW92ZSh4KTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBjaGVjayBzcGVjaWFsIGJvZHlEZWNsYXJhdGlvbiBtZXRob2RzCi0JCXguYm9keURlY2xhcmF0aW9ucygpLmNsZWFyKCk7Ci0JCUZpZWxkRGVjbGFyYXRpb24gZjEgPSBhc3QubmV3RmllbGREZWNsYXJhdGlvbihhc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCkpOwotCQlGaWVsZERlY2xhcmF0aW9uIGYyID0gYXN0Lm5ld0ZpZWxkRGVjbGFyYXRpb24oYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpKTsKLQkJTWV0aG9kRGVjbGFyYXRpb24gbTEgPSBhc3QubmV3TWV0aG9kRGVjbGFyYXRpb24oKTsKLQkJTWV0aG9kRGVjbGFyYXRpb24gbTIgPSBhc3QubmV3TWV0aG9kRGVjbGFyYXRpb24oKTsKLQkJVHlwZURlY2xhcmF0aW9uIHQxID0gYXN0Lm5ld1R5cGVEZWNsYXJhdGlvbigpOwotCQlUeXBlRGVjbGFyYXRpb24gdDIgPSBhc3QubmV3VHlwZURlY2xhcmF0aW9uKCk7Ci0KLQkJeC5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKGFzdC5uZXdJbml0aWFsaXplcigpKTsKLQkJeC5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKGYxKTsKLQkJeC5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKGFzdC5uZXdJbml0aWFsaXplcigpKTsKLQkJeC5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKGYyKTsKLQkJeC5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKGFzdC5uZXdJbml0aWFsaXplcigpKTsKLQkJeC5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKHQxKTsKLQkJeC5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKGFzdC5uZXdJbml0aWFsaXplcigpKTsKLQkJeC5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKG0xKTsKLQkJeC5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKGFzdC5uZXdJbml0aWFsaXplcigpKTsKLQkJeC5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKG0yKTsKLQkJeC5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKGFzdC5uZXdJbml0aWFsaXplcigpKTsKLQkJeC5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKHQyKTsKLQkJeC5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKGFzdC5uZXdJbml0aWFsaXplcigpKTsKLQotCQlMaXN0IGZzID0gQXJyYXlzLmFzTGlzdCh4LmdldEZpZWxkcygpKTsKLQkJYXNzZXJ0VHJ1ZShmcy5zaXplKCkgPT0gMik7Ci0JCWFzc2VydFRydWUoZnMuY29udGFpbnMoZjEpKTsKLQkJYXNzZXJ0VHJ1ZShmcy5jb250YWlucyhmMikpOwotCQkKLQkJTGlzdCBtcyA9IEFycmF5cy5hc0xpc3QoeC5nZXRNZXRob2RzKCkpOwotCQlhc3NlcnRUcnVlKG1zLnNpemUoKSA9PSAyKTsKLQkJYXNzZXJ0VHJ1ZShtcy5jb250YWlucyhtMSkpOwotCQlhc3NlcnRUcnVlKG1zLmNvbnRhaW5zKG0yKSk7Ci0KLQkJTGlzdCB0cyA9IEFycmF5cy5hc0xpc3QoeC5nZXRUeXBlcygpKTsKLQkJYXNzZXJ0VHJ1ZSh0cy5zaXplKCkgPT0gMik7Ci0JCWFzc2VydFRydWUodHMuY29udGFpbnModDEpKTsKLQkJYXNzZXJ0VHJ1ZSh0cy5jb250YWlucyh0MikpOwotCQkKLQkJLy8gY2hlY2sgdGhhdCBUeXBlRGVjbGFyYXRpb25zIGluIGJvZHkgYXJlIGNsYXNzaWZpZWQgY29ycmVjdGx5Ci0JCWFzc2VydFRydWUodDEuaXNMb2NhbFR5cGVEZWNsYXJhdGlvbigpID09IGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZSh0MS5pc01lbWJlclR5cGVEZWNsYXJhdGlvbigpID09IHRydWUpOwotCQlhc3NlcnRUcnVlKHQxLmlzUGFja2FnZU1lbWJlclR5cGVEZWNsYXJhdGlvbigpID09IGZhbHNlKTsKLQkKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKCkgewotCQlsb25nIHByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJZmluYWwgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiB4ID0gYXN0Lm5ld1NpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24oKTsKLQkJYXNzZXJ0VHJ1ZSh4IGluc3RhbmNlb2YgVmFyaWFibGVEZWNsYXJhdGlvbik7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlhc3NlcnRUcnVlKHguZ2V0QVNUKCkgPT0gYXN0KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFBhcmVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0TW9kaWZpZXJzKCkgPT0gTW9kaWZpZXIuTk9ORSk7Ci0JCWFzc2VydFRydWUoeC5nZXROYW1lKCkuZ2V0UGFyZW50KCkgPT0geCk7Ci0JCWFzc2VydFRydWUoeC5nZXROYW1lKCkuaXNEZWNsYXJhdGlvbigpID09IHRydWUpOwotCQlhc3NlcnRUcnVlKHguZ2V0VHlwZSgpLmdldFBhcmVudCgpID09IHgpOwotCQlhc3NlcnRUcnVlKHguZ2V0RXh0cmFEaW1lbnNpb25zKCkgPT0gMCk7Ci0JCWFzc2VydFRydWUoeC5nZXRJbml0aWFsaXplcigpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlNJTkdMRV9WQVJJQUJMRV9ERUNMQVJBVElPTik7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHJlYWRpbmcgZGlkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGNvdW50Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0KLQkJaW50IGxlZ2FsID0gTW9kaWZpZXIuUFVCTElDIHwgTW9kaWZpZXIuUFJPVEVDVEVECi0JCQl8IE1vZGlmaWVyLlBSSVZBVEUgfCBNb2RpZmllci5TVEFUSUMgfCBNb2RpZmllci5GSU5BTAotCQkJfCBNb2RpZmllci5UUkFOU0lFTlQgfCBNb2RpZmllci5WT0xBVElMRTsKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQl4LnNldE1vZGlmaWVycyhsZWdhbCk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE1vZGlmaWVycygpID09IGxlZ2FsKTsKLQotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCXguc2V0TW9kaWZpZXJzKE1vZGlmaWVyLk5PTkUpOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCWFzc2VydFRydWUoeC5nZXRNb2RpZmllcnMoKSA9PSBNb2RpZmllci5OT05FKTsKLQotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCXguc2V0RXh0cmFEaW1lbnNpb25zKDEpOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCWFzc2VydFRydWUoeC5nZXRFeHRyYURpbWVuc2lvbnMoKSA9PSAxKTsKLQotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCXguc2V0RXh0cmFEaW1lbnNpb25zKDApOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCWFzc2VydFRydWUoeC5nZXRFeHRyYURpbWVuc2lvbnMoKSA9PSAwKTsKLQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiTmFtZSIsIHRydWUsIFNpbXBsZU5hbWUuY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCB0YXJnZXRBc3QsIGJvb2xlYW4gcGFyZW50ZWQpIHsKLQkJCQlTaW1wbGVOYW1lIHJlc3VsdCA9IHRhcmdldEFzdC5uZXdTaW1wbGVOYW1lKCJmb28iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQl0YXJnZXRBc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldE5hbWUoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXROYW1lKChTaW1wbGVOYW1lKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZ2VuZXJpY1Byb3BlcnR5VGVzdCh4LCBuZXcgUHJvcGVydHkoIlR5cGUiLCB0cnVlLCBUeXBlLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgdGFyZ2V0QXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJU2ltcGxlVHlwZSByZXN1bHQgPSB0YXJnZXRBc3QubmV3U2ltcGxlVHlwZSgKLQkJCQkJdGFyZ2V0QXN0Lm5ld1NpbXBsZU5hbWUoImZvbyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQl0YXJnZXRBc3QubmV3QXJyYXlUeXBlKHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0VHlwZSgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldFR5cGUoKFR5cGUpIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiSW5pdGlhbGl6ZXIiLCBmYWxzZSwgRXhwcmVzc2lvbi5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCVNpbXBsZU5hbWUgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld1NpbXBsZU5hbWUoImZvbyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCXRhcmdldEFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJCS8vIHJldHVybiBhbiBFeHByZXNzaW9uIHRoYXQgZW1iZWRzIHgKLQkJCQlDYXRjaENsYXVzZSBzMSA9IGFzdC5uZXdDYXRjaENsYXVzZSgpOwotCQkJCXMxLnNldEV4Y2VwdGlvbih4KTsKLQkJCQlyZXR1cm4gczE7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB1bndyYXAoKSB7Ci0JCQkJQ2F0Y2hDbGF1c2UgczEgPSAoQ2F0Y2hDbGF1c2UpIHguZ2V0UGFyZW50KCk7Ci0JCQkJczEuc2V0RXhjZXB0aW9uKGFzdC5uZXdTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKCkpOwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldEluaXRpYWxpemVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzZXQoQVNUTm9kZSB2YWx1ZSkgewotCQkJCXguc2V0SW5pdGlhbGl6ZXIoKEV4cHJlc3Npb24pIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKSB7Ci0JCWxvbmcgcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgeCA9IGFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJYXNzZXJ0VHJ1ZSh4IGluc3RhbmNlb2YgVmFyaWFibGVEZWNsYXJhdGlvbik7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlhc3NlcnRUcnVlKHguZ2V0QVNUKCkgPT0gYXN0KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFBhcmVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0TmFtZSgpLmdldFBhcmVudCgpID09IHgpOwotCQlhc3NlcnRUcnVlKHguZ2V0TmFtZSgpLmlzRGVjbGFyYXRpb24oKSA9PSB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEV4dHJhRGltZW5zaW9ucygpID09IDApOwotCQlhc3NlcnRUcnVlKHguZ2V0SW5pdGlhbGl6ZXIoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5WQVJJQUJMRV9ERUNMQVJBVElPTl9GUkFHTUVOVCk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHJlYWRpbmcgZGlkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGNvdW50Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0KLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQl4LnNldEV4dHJhRGltZW5zaW9ucygxKTsKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlhc3NlcnRUcnVlKHguZ2V0RXh0cmFEaW1lbnNpb25zKCkgPT0gMSk7Ci0KLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQl4LnNldEV4dHJhRGltZW5zaW9ucygwKTsKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlhc3NlcnRUcnVlKHguZ2V0RXh0cmFEaW1lbnNpb25zKCkgPT0gMCk7Ci0JCQotCQkvLyBjaGVjayB0aGF0IHByb3BlcnR5IGNhbm5vdCBiZSBzZXQgbmVnYXRpdmUKLQkJdHJ5IHsKLQkJCXguc2V0RXh0cmFEaW1lbnNpb25zKC0xKTsKLQkJCWFzc2VydFRydWUoZmFsc2UpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHBhc3MKLQkJfQotCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJOYW1lIiwgdHJ1ZSwgU2ltcGxlTmFtZS5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCVNpbXBsZU5hbWUgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld1NpbXBsZU5hbWUoImZvbyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCXRhcmdldEFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0TmFtZSgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldE5hbWUoKFNpbXBsZU5hbWUpIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiSW5pdGlhbGl6ZXIiLCBmYWxzZSwgRXhwcmVzc2lvbi5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCVNpbXBsZU5hbWUgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld1NpbXBsZU5hbWUoImZvbyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCXRhcmdldEFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJCS8vIHJldHVybiBhbiBFeHByZXNzaW9uIHRoYXQgZW1iZWRzIHgKLQkJCQlWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiBzMSA9Ci0JCQkJCWFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbih4KTsKLQkJCQlyZXR1cm4gczE7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB1bndyYXAoKSB7Ci0JCQkJVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gczEgPSAKLQkJCQkJKFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKSB4LmdldFBhcmVudCgpOwotCQkJCXMxLmZyYWdtZW50cygpLnJlbW92ZSh4KTsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIGdldCgpIHsKLQkJCQlyZXR1cm4geC5nZXRJbml0aWFsaXplcigpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldEluaXRpYWxpemVyKChFeHByZXNzaW9uKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kRGVjbGFyYXRpb24oKSB7Ci0JCWxvbmcgcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlmaW5hbCBNZXRob2REZWNsYXJhdGlvbiB4ID0gYXN0Lm5ld01ldGhvZERlY2xhcmF0aW9uKCk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlhc3NlcnRUcnVlKHggaW5zdGFuY2VvZiBCb2R5RGVjbGFyYXRpb24pOwotCQlhc3NlcnRUcnVlKHguZ2V0QVNUKCkgPT0gYXN0KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFBhcmVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0TW9kaWZpZXJzKCkgPT0gTW9kaWZpZXIuTk9ORSk7Ci0JCWFzc2VydFRydWUoeC5pc0NvbnN0cnVjdG9yKCkgPT0gZmFsc2UpOwotCQlhc3NlcnRUcnVlKHguZ2V0TmFtZSgpLmdldFBhcmVudCgpID09IHgpOwotCQlhc3NlcnRUcnVlKHguZ2V0TmFtZSgpLmlzRGVjbGFyYXRpb24oKSA9PSB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFJldHVyblR5cGUoKS5nZXRQYXJlbnQoKSA9PSB4KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEV4dHJhRGltZW5zaW9ucygpID09IDApOwotCQlhc3NlcnRUcnVlKHguZ2V0SmF2YWRvYygpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHgucGFyYW1ldGVycygpLnNpemUoKSA9PSAwKTsKLQkJYXNzZXJ0VHJ1ZSh4LnRocm93bkV4Y2VwdGlvbnMoKS5zaXplKCkgPT0gMCk7Ci0JCWFzc2VydFRydWUoeC5nZXRCb2R5KCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuTUVUSE9EX0RFQ0xBUkFUSU9OKTsKLQkJLy8gbWFrZSBzdXJlIHRoYXQgcmVhZGluZyBkaWQgbm90IGNoYW5nZSBtb2RpZmljYXRpb24gY291bnQKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA9PSBwcmV2aW91c0NvdW50KTsKLQkKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQl4LnNldENvbnN0cnVjdG9yKHRydWUpOwkKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlhc3NlcnRUcnVlKHguaXNDb25zdHJ1Y3RvcigpID09IHRydWUpOwotCQlhc3NlcnRUcnVlKHguZ2V0TmFtZSgpLmlzRGVjbGFyYXRpb24oKSA9PSBmYWxzZSk7Ci0KLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQl4LnNldENvbnN0cnVjdG9yKGZhbHNlKTsJCi0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJYXNzZXJ0VHJ1ZSh4LmlzQ29uc3RydWN0b3IoKSA9PSBmYWxzZSk7Ci0JCQotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWludCBsZWdhbCA9IE1vZGlmaWVyLlBVQkxJQyB8IE1vZGlmaWVyLlBST1RFQ1RFRAotCQkJfCBNb2RpZmllci5QUklWQVRFIHwgTW9kaWZpZXIuQUJTVFJBQ1QgfCBNb2RpZmllci5TVEFUSUMgCi0JCQl8IE1vZGlmaWVyLkZJTkFMIHwgTW9kaWZpZXIuU1lOQ0hST05JWkVEfCBNb2RpZmllci5OQVRJVkUKLQkJCXwgTW9kaWZpZXIuU1RSSUNURlA7Ci0JCXguc2V0TW9kaWZpZXJzKGxlZ2FsKTsKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlhc3NlcnRUcnVlKHguZ2V0TW9kaWZpZXJzKCkgPT0gbGVnYWwpOwotCi0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJeC5zZXRNb2RpZmllcnMoTW9kaWZpZXIuTk9ORSk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE1vZGlmaWVycygpID09IE1vZGlmaWVyLk5PTkUpOwotCi0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJeC5zZXRFeHRyYURpbWVuc2lvbnMoMSk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEV4dHJhRGltZW5zaW9ucygpID09IDEpOwotCi0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJeC5zZXRFeHRyYURpbWVuc2lvbnMoMCk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEV4dHJhRGltZW5zaW9ucygpID09IDApOwotCi0JCXRKYXZhZG9jQ29tbWVudCh4KTsKLQkJCQkJCQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiTmFtZSIsIHRydWUsIFNpbXBsZU5hbWUuY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCB0YXJnZXRBc3QsIGJvb2xlYW4gcGFyZW50ZWQpIHsKLQkJCQlTaW1wbGVOYW1lIHJlc3VsdCA9IHRhcmdldEFzdC5uZXdTaW1wbGVOYW1lKCJmb28iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQl0YXJnZXRBc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldE5hbWUoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXROYW1lKChTaW1wbGVOYW1lKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZ2VuZXJpY1Byb3BlcnR5VGVzdCh4LCBuZXcgUHJvcGVydHkoIlJldHVyblR5cGUiLCB0cnVlLCBUeXBlLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgdGFyZ2V0QXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJU2ltcGxlVHlwZSByZXN1bHQgPSB0YXJnZXRBc3QubmV3U2ltcGxlVHlwZSgKLQkJCQkJdGFyZ2V0QXN0Lm5ld1NpbXBsZU5hbWUoImZvbyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQl0YXJnZXRBc3QubmV3QXJyYXlUeXBlKHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0UmV0dXJuVHlwZSgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldFJldHVyblR5cGUoKFR5cGUpIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlnZW5lcmljUHJvcGVydHlMaXN0VGVzdCh4LCB4LnBhcmFtZXRlcnMoKSwKLQkJICBuZXcgUHJvcGVydHkoIlBhcmFtZXRlcnMiLCB0cnVlLCBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgdGFyZ2V0QXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiByZXN1bHQgPSB0YXJnZXRBc3QubmV3U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbigpOwotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQl0YXJnZXRBc3QubmV3Q2F0Y2hDbGF1c2UoKS5zZXRFeGNlcHRpb24ocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIHdyYXAoKSB7Ci0JCQkJLy8gcmV0dXJuIGEgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiB0aGF0IGVtYmVkcyB4Ci0JCQkJU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBzMSA9IGFzdC5uZXdTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKCk7Ci0JCQkJQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIHMyID0gYXN0Lm5ld0NsYXNzSW5zdGFuY2VDcmVhdGlvbigpOwotCQkJCUFub255bW91c0NsYXNzRGVjbGFyYXRpb24gYTEgPSBhc3QubmV3QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpOwotCQkJCXMyLnNldEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oYTEpOwotCQkJCXMxLnNldEluaXRpYWxpemVyKHMyKTsKLQkJCQlhMS5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKHgpOwotCQkJCXJldHVybiBzMTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHVud3JhcCgpIHsKLQkJCQlBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIGExID0gKEFub255bW91c0NsYXNzRGVjbGFyYXRpb24pIHguZ2V0UGFyZW50KCk7Ci0JCQkJYTEuYm9keURlY2xhcmF0aW9ucygpLnJlbW92ZSh4KTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlnZW5lcmljUHJvcGVydHlMaXN0VGVzdCh4LCB4LnRocm93bkV4Y2VwdGlvbnMoKSwKLQkJICBuZXcgUHJvcGVydHkoIlRocm93bkV4Y2VwdGlvbnMiLCB0cnVlLCBOYW1lLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgdGFyZ2V0QXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJU2ltcGxlTmFtZSByZXN1bHQgPSB0YXJnZXRBc3QubmV3U2ltcGxlTmFtZSgiZm9vIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJdGFyZ2V0QXN0Lm5ld0V4cHJlc3Npb25TdGF0ZW1lbnQocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfSk7Ci0JCQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiQm9keSIsIGZhbHNlLCBCbG9jay5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCUJsb2NrIHJlc3VsdCA9IHRhcmdldEFzdC5uZXdCbG9jaygpOwotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQlCbG9jayBiMiA9IHRhcmdldEFzdC5uZXdCbG9jaygpOwotCQkJCQliMi5zdGF0ZW1lbnRzKCkuYWRkKHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJCS8vIHJldHVybiBhIEJsb2NrIHRoYXQgZW1iZWRzIHgKLQkJCQlCbG9jayBzMSA9IGFzdC5uZXdCbG9jaygpOwotCQkJCVR5cGVEZWNsYXJhdGlvbiBzMiA9IGFzdC5uZXdUeXBlRGVjbGFyYXRpb24oKTsKLQkJCQlzMS5zdGF0ZW1lbnRzKCkuYWRkKGFzdC5uZXdUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQoczIpKTsKLQkJCQlzMi5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKHgpOwotCQkJCXJldHVybiBzMTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHVud3JhcCgpIHsKLQkJCQlUeXBlRGVjbGFyYXRpb24gczIgPSAoVHlwZURlY2xhcmF0aW9uKSB4LmdldFBhcmVudCgpOwotCQkJCXMyLmJvZHlEZWNsYXJhdGlvbnMoKS5yZW1vdmUoeCk7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0Qm9keSgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldEJvZHkoKEJsb2NrKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemVyKCkgewotCQlsb25nIHByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJZmluYWwgSW5pdGlhbGl6ZXIgeCA9IGFzdC5uZXdJbml0aWFsaXplcigpOwotCQlhc3NlcnRUcnVlKHggaW5zdGFuY2VvZiBCb2R5RGVjbGFyYXRpb24pOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEFTVCgpID09IGFzdCk7Ci0JCWFzc2VydFRydWUoeC5nZXRQYXJlbnQoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEphdmFkb2MoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE1vZGlmaWVycygpID09IE1vZGlmaWVyLk5PTkUpOwotCQlhc3NlcnRUcnVlKHguZ2V0Qm9keSgpLmdldFBhcmVudCgpID09IHgpOwotCQlhc3NlcnRUcnVlKHguZ2V0Qm9keSgpLnN0YXRlbWVudHMoKS5zaXplKCkgPT0gMCk7Ci0JCWFzc2VydFRydWUoeC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuSU5JVElBTElaRVIpOwotCQkvLyBtYWtlIHN1cmUgdGhhdCByZWFkaW5nIGRpZCBub3QgY2hhbmdlIG1vZGlmaWNhdGlvbiBjb3VudAotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID09IHByZXZpb3VzQ291bnQpOwotCQkKLQkJdEphdmFkb2NDb21tZW50KHgpOwotCQkJCQotCQlpbnQgbGVnYWwgPSBNb2RpZmllci5TVEFUSUM7Ci0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJeC5zZXRNb2RpZmllcnMobGVnYWwpOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCWFzc2VydFRydWUoeC5nZXRNb2RpZmllcnMoKSA9PSBsZWdhbCk7Ci0JCQotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCXguc2V0TW9kaWZpZXJzKE1vZGlmaWVyLk5PTkUpOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCWFzc2VydFRydWUoeC5nZXRNb2RpZmllcnMoKSA9PSBNb2RpZmllci5OT05FKTsKLQkJCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJCb2R5IiwgdHJ1ZSwgQmxvY2suY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCB0YXJnZXRBc3QsIGJvb2xlYW4gcGFyZW50ZWQpIHsKLQkJCQlCbG9jayByZXN1bHQgPSB0YXJnZXRBc3QubmV3QmxvY2soKTsKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJQmxvY2sgYjIgPSB0YXJnZXRBc3QubmV3QmxvY2soKTsKLQkJCQkJYjIuc3RhdGVtZW50cygpLmFkZChyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgd3JhcCgpIHsKLQkJCQkvLyByZXR1cm4gQmxvY2sgdGhhdCBlbWJlZHMgeAotCQkJCUJsb2NrIHMxID0gYXN0Lm5ld0Jsb2NrKCk7Ci0JCQkJVHlwZURlY2xhcmF0aW9uIHMyID0gYXN0Lm5ld1R5cGVEZWNsYXJhdGlvbigpOwotCQkJCXMxLnN0YXRlbWVudHMoKS5hZGQoYXN0Lm5ld1R5cGVEZWNsYXJhdGlvblN0YXRlbWVudChzMikpOwotCQkJCXMyLmJvZHlEZWNsYXJhdGlvbnMoKS5hZGQoeCk7Ci0JCQkJcmV0dXJuIHMxOwotCQkJfQotCQkJcHVibGljIHZvaWQgdW53cmFwKCkgewotCQkJCVR5cGVEZWNsYXJhdGlvbiBzMiA9IChUeXBlRGVjbGFyYXRpb24pIHguZ2V0UGFyZW50KCk7Ci0JCQkJczIuYm9keURlY2xhcmF0aW9ucygpLnJlbW92ZSh4KTsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIGdldCgpIHsKLQkJCQlyZXR1cm4geC5nZXRCb2R5KCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzZXQoQVNUTm9kZSB2YWx1ZSkgewotCQkJCXguc2V0Qm9keSgoQmxvY2spIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YWRvYygpIHsKLQkJbG9uZyBwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCUphdmFkb2MgeCA9IGFzdC5uZXdKYXZhZG9jKCk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlhc3NlcnRUcnVlKHguZ2V0QVNUKCkgPT0gYXN0KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFBhcmVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0Q29tbWVudCgpLnN0YXJ0c1dpdGgoIi8qKiIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKHguZ2V0Q29tbWVudCgpLmVuZHNXaXRoKCIqLyIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKHguZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkpBVkFET0MpOwotCQkvLyBtYWtlIHN1cmUgdGhhdCByZWFkaW5nIGRpZCBub3QgY2hhbmdlIG1vZGlmaWNhdGlvbiBjb3VudAotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID09IHByZXZpb3VzQ291bnQpOwotCi0JCWZpbmFsIFN0cmluZ1tdIHNhbXBsZXMgPQotCQkJeyAKLQkJCSAgIi8qKiBIZWxsbyB0aGVyZSAqLyIsIC8vJE5PTi1OTFMtMSQKLQkJCSAgIi8qKlxuICogTGluZSAxXG4gKiBMaW5lIDJcbiAqLyIsIC8vJE5PTi1OTFMtMSQKLQkJCSAgIi8qKiovIiwgLy8kTk9OLU5MUy0xJAotCQkJfTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzYW1wbGVzLmxlbmd0aDsgaSsrKSB7CQkJCi0JCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCQl4LnNldENvbW1lbnQoc2FtcGxlc1tpXSk7Ci0JCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCQlhc3NlcnRUcnVlKHNhbXBsZXNbaV0uZXF1YWxzKHguZ2V0Q29tbWVudCgpKSk7Ci0JCX0KLQotCQlmaW5hbCBTdHJpbmdbXSBiYWRTYW1wbGVzID0KLQkJCXsgCi0JCQkgIG51bGwsCi0JCQkgICIiLCAvLyROT04tTkxTLTEkCi0JCQkgICIvKiAqLyIsIC8vJE5PTi1OTFMtMSQKLQkJCSAgIi8qKiIsIC8vJE5PTi1OTFMtMSQKLQkJCSAgIiovIiwgLy8kTk9OLU5MUy0xJAotCQkJfTsKLQotCQkvLyBjaGVjayB0aGF0IHByb3BlcnR5IGNhbm5vdCBiZSBzZXQgdG8gY2xlYXJseSBpbGxlZ2FsIHRoaW5ncwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJhZFNhbXBsZXMubGVuZ3RoOyBpKyspIHsJCQkKLQkJCXRyeSB7Ci0JCQkJeC5zZXRDb21tZW50KGJhZFNhbXBsZXNbaV0pOwotCQkJCWFzc2VydFRydWUoZmFsc2UpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gcGFzcwotCQkJfQotCQl9Ci0JfQkJCi0KLQlwdWJsaWMgdm9pZCB0ZXN0QmxvY2soKSB7Ci0JCWxvbmcgcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlmaW5hbCBCbG9jayB4ID0gYXN0Lm5ld0Jsb2NrKCk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlhc3NlcnRUcnVlKHggaW5zdGFuY2VvZiBTdGF0ZW1lbnQpOwotCQlhc3NlcnRUcnVlKHguZ2V0QVNUKCkgPT0gYXN0KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFBhcmVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguc3RhdGVtZW50cygpLnNpemUoKSA9PSAwKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5CTE9DSyk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHJlYWRpbmcgZGlkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGNvdW50Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0JCQotCQl0TGVhZGluZ0NvbW1lbnQoeCk7Ci0KLQkJZ2VuZXJpY1Byb3BlcnR5TGlzdFRlc3QoeCwgeC5zdGF0ZW1lbnRzKCksCi0JCSAgbmV3IFByb3BlcnR5KCJTdGF0ZW1lbnRzIiwgdHJ1ZSwgU3RhdGVtZW50LmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgdGFyZ2V0QXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJQmxvY2sgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld0Jsb2NrKCk7Ci0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCUJsb2NrIGIyID0gdGFyZ2V0QXN0Lm5ld0Jsb2NrKCk7Ci0JCQkJCWIyLnN0YXRlbWVudHMoKS5hZGQocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIHdyYXAoKSB7Ci0JCQkJLy8gcmV0dXJuIGEgU3RhdGVtZW50IHRoYXQgZW1iZWRzIHgKLQkJCQlCbG9jayBzMSA9IGFzdC5uZXdCbG9jaygpOwotCQkJCXMxLnN0YXRlbWVudHMoKS5hZGQoeCk7Ci0JCQkJcmV0dXJuIHMxOwotCQkJfQotCQkJcHVibGljIHZvaWQgdW53cmFwKCkgewotCQkJCUJsb2NrIHMyID0gKEJsb2NrKSB4LmdldFBhcmVudCgpOwotCQkJCXMyLnN0YXRlbWVudHMoKS5yZW1vdmUoeCk7Ci0JCQl9Ci0JCX0pOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZEludm9jYXRpb24oKSB7Ci0JCWxvbmcgcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlmaW5hbCBNZXRob2RJbnZvY2F0aW9uIHggPSBhc3QubmV3TWV0aG9kSW52b2NhdGlvbigpOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJYXNzZXJ0VHJ1ZSh4IGluc3RhbmNlb2YgRXhwcmVzc2lvbik7Ci0JCWFzc2VydFRydWUoeC5nZXRBU1QoKSA9PSBhc3QpOwotCQlhc3NlcnRUcnVlKHguZ2V0UGFyZW50KCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5nZXROYW1lKCkuZ2V0UGFyZW50KCkgPT0geCk7Ci0JCWFzc2VydFRydWUoeC5nZXRFeHByZXNzaW9uKCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5hcmd1bWVudHMoKS5zaXplKCkgPT0gMCk7Ci0JCWFzc2VydFRydWUoeC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuTUVUSE9EX0lOVk9DQVRJT04pOwotCQkvLyBtYWtlIHN1cmUgdGhhdCByZWFkaW5nIGRpZCBub3QgY2hhbmdlIG1vZGlmaWNhdGlvbiBjb3VudAotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID09IHByZXZpb3VzQ291bnQpOwotCQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiRXhwcmVzc2lvbiIsIGZhbHNlLCBFeHByZXNzaW9uLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgdGFyZ2V0QXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJU2ltcGxlTmFtZSByZXN1bHQgPSB0YXJnZXRBc3QubmV3U2ltcGxlTmFtZSgiZm9vIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJdGFyZ2V0QXN0Lm5ld0V4cHJlc3Npb25TdGF0ZW1lbnQocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIHdyYXAoKSB7Ci0JCQkJLy8gcmV0dXJuIEV4cHJlc3Npb24gdGhhdCBlbWJlZHMgeAotCQkJCVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHMxID0gYXN0Lm5ld1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCk7Ci0JCQkJczEuc2V0RXhwcmVzc2lvbih4KTsKLQkJCQlyZXR1cm4gczE7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB1bndyYXAoKSB7Ci0JCQkJUGFyZW50aGVzaXplZEV4cHJlc3Npb24gczEgPSAoUGFyZW50aGVzaXplZEV4cHJlc3Npb24pIHguZ2V0UGFyZW50KCk7Ci0JCQkJczEuc2V0RXhwcmVzc2lvbihhc3QubmV3U2ltcGxlTmFtZSgieCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldEV4cHJlc3Npb24oKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXRFeHByZXNzaW9uKChFeHByZXNzaW9uKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWdlbmVyaWNQcm9wZXJ0eUxpc3RUZXN0KHgsIHguYXJndW1lbnRzKCksCi0JCSAgbmV3IFByb3BlcnR5KCJBcmd1bWVudHMiLCB0cnVlLCBFeHByZXNzaW9uLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgdGFyZ2V0QXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJU2ltcGxlTmFtZSByZXN1bHQgPSB0YXJnZXRBc3QubmV3U2ltcGxlTmFtZSgiZm9vIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJdGFyZ2V0QXN0Lm5ld0V4cHJlc3Npb25TdGF0ZW1lbnQocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIHdyYXAoKSB7Ci0JCQkJLy8gcmV0dXJuIEV4cHJlc3Npb24gdGhhdCBlbWJlZHMgeAotCQkJCVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHMxID0gYXN0Lm5ld1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCk7Ci0JCQkJczEuc2V0RXhwcmVzc2lvbih4KTsKLQkJCQlyZXR1cm4gczE7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB1bndyYXAoKSB7Ci0JCQkJUGFyZW50aGVzaXplZEV4cHJlc3Npb24gczEgPSAoUGFyZW50aGVzaXplZEV4cHJlc3Npb24pIHguZ2V0UGFyZW50KCk7Ci0JCQkJczEuc2V0RXhwcmVzc2lvbihhc3QubmV3U2ltcGxlTmFtZSgieCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9KTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RFeHByZXNzaW9uU3RhdGVtZW50KCkgewotCQlsb25nIHByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJU2ltcGxlTmFtZSB4MSA9IGFzdC5uZXdTaW1wbGVOYW1lKCJmb28iKTsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBFeHByZXNzaW9uU3RhdGVtZW50IHggPSBhc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudCh4MSk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlhc3NlcnRUcnVlKHggaW5zdGFuY2VvZiBTdGF0ZW1lbnQpOwotCQlhc3NlcnRUcnVlKHguZ2V0QVNUKCkgPT0gYXN0KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFBhcmVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0RXhwcmVzc2lvbigpID09IHgxKTsKLQkJYXNzZXJ0VHJ1ZSh4MS5nZXRQYXJlbnQoKSA9PSB4KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5FWFBSRVNTSU9OX1NUQVRFTUVOVCk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHJlYWRpbmcgZGlkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGNvdW50Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0JCi0JCXRMZWFkaW5nQ29tbWVudCh4KTsKLQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiRXhwcmVzc2lvbiIsIHRydWUsIEV4cHJlc3Npb24uY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCB0YXJnZXRBc3QsIGJvb2xlYW4gcGFyZW50ZWQpIHsKLQkJCQlTaW1wbGVOYW1lIHJlc3VsdCA9IHRhcmdldEFzdC5uZXdTaW1wbGVOYW1lKCJmb28iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQl0YXJnZXRBc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgd3JhcCgpIHsKLQkJCQkvLyByZXR1cm4gRXhwcmVzc2lvbiB0aGF0IGVtYmVkcyB4Ci0JCQkJQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIHMxID0gYXN0Lm5ld0NsYXNzSW5zdGFuY2VDcmVhdGlvbigpOwotCQkJCUFub255bW91c0NsYXNzRGVjbGFyYXRpb24gYTEgPSBhc3QubmV3QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpOwotCQkJCXMxLnNldEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oYTEpOwotCQkJCU1ldGhvZERlY2xhcmF0aW9uIHMyID0gYXN0Lm5ld01ldGhvZERlY2xhcmF0aW9uKCk7Ci0JCQkJYTEuYm9keURlY2xhcmF0aW9ucygpLmFkZChzMik7Ci0JCQkJQmxvY2sgczMgPSBhc3QubmV3QmxvY2soKTsKLQkJCQlzMi5zZXRCb2R5KHMzKTsKLQkJCQlzMy5zdGF0ZW1lbnRzKCkuYWRkKHgpOwotCQkJCXJldHVybiBzMTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHVud3JhcCgpIHsKLQkJCQlCbG9jayBzMyA9IChCbG9jaykgeC5nZXRQYXJlbnQoKTsKLQkJCQlzMy5zdGF0ZW1lbnRzKCkucmVtb3ZlKHgpOwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldEV4cHJlc3Npb24oKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXRFeHByZXNzaW9uKChFeHByZXNzaW9uKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCi0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCgpIHsKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHgxID0gYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQlsb25nIHByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCB4ID0gCi0JCQlhc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCh4MSk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlhc3NlcnRUcnVlKHggaW5zdGFuY2VvZiBTdGF0ZW1lbnQpOwotCQlhc3NlcnRUcnVlKHguZ2V0QVNUKCkgPT0gYXN0KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFBhcmVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0TW9kaWZpZXJzKCkgPT0gTW9kaWZpZXIuTk9ORSk7Ci0JCWFzc2VydFRydWUoeC5nZXRUeXBlKCkgIT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5nZXRUeXBlKCkuZ2V0UGFyZW50KCkgPT0geCk7Ci0JCWFzc2VydFRydWUoeC5mcmFnbWVudHMoKS5zaXplKCkgPT0gMSk7Ci0JCWFzc2VydFRydWUoeC5mcmFnbWVudHMoKS5nZXQoMCkgPT0geDEpOwotCQlhc3NlcnRUcnVlKHgxLmdldFBhcmVudCgpID09IHgpOwotCQlhc3NlcnRUcnVlKHguZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlZBUklBQkxFX0RFQ0xBUkFUSU9OX1NUQVRFTUVOVCk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHJlYWRpbmcgZGlkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGNvdW50Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0JCi0JCXRMZWFkaW5nQ29tbWVudCh4KTsKLQotCQlpbnQgbGVnYWwgPSBNb2RpZmllci5GSU5BTDsKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQl4LnNldE1vZGlmaWVycyhsZWdhbCk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE1vZGlmaWVycygpID09IGxlZ2FsKTsKLQotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCXguc2V0TW9kaWZpZXJzKE1vZGlmaWVyLk5PTkUpOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCWFzc2VydFRydWUoeC5nZXRNb2RpZmllcnMoKSA9PSBNb2RpZmllci5OT05FKTsKLQkJCi0JCS8vIGNoZWNrIHRoYXQgcHJvcGVydHkgY2Fubm90IGJlIHNldCB0byBpbGxlZ2FsIHZhbHVlCi0JCXRyeSB7Ci0JCQl4LnNldE1vZGlmaWVycyhNb2RpZmllci5QVUJMSUMpOwotCQkJYXNzZXJ0VHJ1ZShmYWxzZSk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJLy8gcGFzcwotCQl9Ci0KLQkJZ2VuZXJpY1Byb3BlcnR5VGVzdCh4LCBuZXcgUHJvcGVydHkoIlR5cGUiLCB0cnVlLCBUeXBlLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgdGFyZ2V0QXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJU2ltcGxlVHlwZSByZXN1bHQgPSB0YXJnZXRBc3QubmV3U2ltcGxlVHlwZSgKLQkJCQkJdGFyZ2V0QXN0Lm5ld1NpbXBsZU5hbWUoImZvbyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQl0YXJnZXRBc3QubmV3QXJyYXlUeXBlKHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0VHlwZSgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldFR5cGUoKFR5cGUpIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZ2VuZXJpY1Byb3BlcnR5TGlzdFRlc3QoeCwgeC5mcmFnbWVudHMoKSwKLQkJICBuZXcgUHJvcGVydHkoIlZhcmlhYmxlU3BlY2lmaWVycyIsIHRydWUsIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCByZXN1bHQgPSB0YXJnZXRBc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCXRhcmdldEFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbihyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgd3JhcCgpIHsKLQkJCQkvLyByZXR1cm4gVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHRoYXQgZW1iZWRzIHgKLQkJCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgczEgPSBhc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCQkJQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIHMwID0gYXN0Lm5ld0NsYXNzSW5zdGFuY2VDcmVhdGlvbigpOwotCQkJCUFub255bW91c0NsYXNzRGVjbGFyYXRpb24gYTEgPSBhc3QubmV3QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpOwotCQkJCXMwLnNldEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oYTEpOwotCQkJCXMxLnNldEluaXRpYWxpemVyKHMwKTsKLQkJCQlJbml0aWFsaXplciBzMiA9IGFzdC5uZXdJbml0aWFsaXplcigpOwotCQkJCWExLmJvZHlEZWNsYXJhdGlvbnMoKS5hZGQoczIpOwotCQkJCXMyLmdldEJvZHkoKS5zdGF0ZW1lbnRzKCkuYWRkKHgpOwotCQkJCXJldHVybiBzMTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHVud3JhcCgpIHsKLQkJCQlCbG9jayBzMyA9IChCbG9jaykgeC5nZXRQYXJlbnQoKTsKLQkJCQlzMy5zdGF0ZW1lbnRzKCkucmVtb3ZlKHgpOwotCQkJfQotCQl9KTsKLQkKLQotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFR5cGVEZWNsYXJhdGlvblN0YXRlbWVudCgpIHsKLQkJVHlwZURlY2xhcmF0aW9uIHgxID0gYXN0Lm5ld1R5cGVEZWNsYXJhdGlvbigpOwotCQlsb25nIHByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJZmluYWwgVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50IHggPQotCQkJYXN0Lm5ld1R5cGVEZWNsYXJhdGlvblN0YXRlbWVudCh4MSk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlhc3NlcnRUcnVlKHggaW5zdGFuY2VvZiBTdGF0ZW1lbnQpOwotCQlhc3NlcnRUcnVlKHguZ2V0QVNUKCkgPT0gYXN0KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFBhcmVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0VHlwZURlY2xhcmF0aW9uKCkgPT0geDEpOwotCQlhc3NlcnRUcnVlKHgxLmdldFBhcmVudCgpID09IHgpOwotCQlhc3NlcnRUcnVlKHguZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlRZUEVfREVDTEFSQVRJT05fU1RBVEVNRU5UKTsKLQkJLy8gbWFrZSBzdXJlIHRoYXQgcmVhZGluZyBkaWQgbm90IGNoYW5nZSBtb2RpZmljYXRpb24gY291bnQKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA9PSBwcmV2aW91c0NvdW50KTsKLQotCQkvLyBjaGVjayB0aGF0IFR5cGVEZWNsYXJhdGlvbiBpbnNpZGUgaXMgY2xhc3NpZmllZCBjb3JyZWN0bHkKLQkJYXNzZXJ0VHJ1ZSh4MS5pc0xvY2FsVHlwZURlY2xhcmF0aW9uKCkgPT0gdHJ1ZSk7Ci0JCWFzc2VydFRydWUoeDEuaXNNZW1iZXJUeXBlRGVjbGFyYXRpb24oKSA9PSBmYWxzZSk7Ci0JCWFzc2VydFRydWUoeDEuaXNQYWNrYWdlTWVtYmVyVHlwZURlY2xhcmF0aW9uKCkgPT0gZmFsc2UpOwotCQotCQl0TGVhZGluZ0NvbW1lbnQoeCk7Ci0KLQkJZ2VuZXJpY1Byb3BlcnR5VGVzdCh4LCBuZXcgUHJvcGVydHkoIlR5cGVEZWNsYXJhdGlvbiIsIHRydWUsIFR5cGVEZWNsYXJhdGlvbi5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCVR5cGVEZWNsYXJhdGlvbiByZXN1bHQgPSB0YXJnZXRBc3QubmV3VHlwZURlY2xhcmF0aW9uKCk7Ci0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCXRhcmdldEFzdC5uZXdUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIHdyYXAoKSB7Ci0JCQkJLy8gcmV0dXJuIFR5cGVEZWNsYXJhdGlvbiB0aGF0IGVtYmVkcyB4Ci0JCQkJVHlwZURlY2xhcmF0aW9uIHMxID0gYXN0Lm5ld1R5cGVEZWNsYXJhdGlvbigpOwotCQkJCU1ldGhvZERlY2xhcmF0aW9uIHMyID0gYXN0Lm5ld01ldGhvZERlY2xhcmF0aW9uKCk7Ci0JCQkJczEuYm9keURlY2xhcmF0aW9ucygpLmFkZChzMik7Ci0JCQkJQmxvY2sgczMgPSBhc3QubmV3QmxvY2soKTsKLQkJCQlzMi5zZXRCb2R5KHMzKTsKLQkJCQlzMy5zdGF0ZW1lbnRzKCkuYWRkKHgpOwotCQkJCXJldHVybiBzMTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHVud3JhcCgpIHsKLQkJCQlCbG9jayBzMyA9IChCbG9jaykgeC5nZXRQYXJlbnQoKTsKLQkJCQlzMy5zdGF0ZW1lbnRzKCkucmVtb3ZlKHgpOwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldFR5cGVEZWNsYXJhdGlvbigpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldFR5cGVEZWNsYXJhdGlvbigoVHlwZURlY2xhcmF0aW9uKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCi0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24oKSB7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB4MSA9IGFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJbG9uZyBwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uIHggPSAKLQkJCWFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbih4MSk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlhc3NlcnRUcnVlKHggaW5zdGFuY2VvZiBFeHByZXNzaW9uKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEFTVCgpID09IGFzdCk7Ci0JCWFzc2VydFRydWUoeC5nZXRQYXJlbnQoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE1vZGlmaWVycygpID09IE1vZGlmaWVyLk5PTkUpOwotCQlhc3NlcnRUcnVlKHguZ2V0VHlwZSgpICE9IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0VHlwZSgpLmdldFBhcmVudCgpID09IHgpOwotCQlhc3NlcnRUcnVlKHguZnJhZ21lbnRzKCkuc2l6ZSgpID09IDEpOwotCQlhc3NlcnRUcnVlKHguZnJhZ21lbnRzKCkuZ2V0KDApID09IHgxKTsKLQkJYXNzZXJ0VHJ1ZSh4MS5nZXRQYXJlbnQoKSA9PSB4KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5WQVJJQUJMRV9ERUNMQVJBVElPTl9FWFBSRVNTSU9OKTsKLQkJLy8gbWFrZSBzdXJlIHRoYXQgcmVhZGluZyBkaWQgbm90IGNoYW5nZSBtb2RpZmljYXRpb24gY291bnQKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA9PSBwcmV2aW91c0NvdW50KTsKLQkKLQkJaW50IGxlZ2FsID0gTW9kaWZpZXIuRklOQUw7Ci0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJeC5zZXRNb2RpZmllcnMobGVnYWwpOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCWFzc2VydFRydWUoeC5nZXRNb2RpZmllcnMoKSA9PSBsZWdhbCk7Ci0KLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQl4LnNldE1vZGlmaWVycyhNb2RpZmllci5OT05FKTsKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlhc3NlcnRUcnVlKHguZ2V0TW9kaWZpZXJzKCkgPT0gTW9kaWZpZXIuTk9ORSk7Ci0JCQotCQkvLyBjaGVjayB0aGF0IHByb3BlcnR5IGNhbm5vdCBiZSBzZXQgdG8gaWxsZWdhbCB2YWx1ZQotCQl0cnkgewotCQkJeC5zZXRNb2RpZmllcnMoTW9kaWZpZXIuUFVCTElDKTsKLQkJCWFzc2VydFRydWUoZmFsc2UpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHBhc3MKLQkJfQotCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJUeXBlIiwgdHJ1ZSwgVHlwZS5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCVNpbXBsZVR5cGUgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld1NpbXBsZVR5cGUoCi0JCQkJCXRhcmdldEFzdC5uZXdTaW1wbGVOYW1lKCJmb28iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJdGFyZ2V0QXN0Lm5ld0FycmF5VHlwZShyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldFR5cGUoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXRUeXBlKChUeXBlKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWdlbmVyaWNQcm9wZXJ0eUxpc3RUZXN0KHgsIHguZnJhZ21lbnRzKCksCi0JCSAgbmV3IFByb3BlcnR5KCJWYXJpYWJsZVNwZWNpZmllcnMiLCB0cnVlLCBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCB0YXJnZXRBc3QsIGJvb2xlYW4gcGFyZW50ZWQpIHsKLQkJCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQl0YXJnZXRBc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24ocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIHdyYXAoKSB7Ci0JCQkJLy8gcmV0dXJuIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB0aGF0IGVtYmVkcyB4Ci0JCQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHMxID0gYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQkJCUNsYXNzSW5zdGFuY2VDcmVhdGlvbiBzMCA9IGFzdC5uZXdDbGFzc0luc3RhbmNlQ3JlYXRpb24oKTsKLQkJCQlBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIGExID0gYXN0Lm5ld0Fub255bW91c0NsYXNzRGVjbGFyYXRpb24oKTsKLQkJCQlzMC5zZXRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKGExKTsKLQkJCQlzMS5zZXRJbml0aWFsaXplcihzMCk7Ci0JCQkJRm9yU3RhdGVtZW50IHMyID0gYXN0Lm5ld0ZvclN0YXRlbWVudCgpOwotCQkJCXMyLmluaXRpYWxpemVycygpLmFkZCh4KTsKLQkJCQlJbml0aWFsaXplciBzMyA9IGFzdC5uZXdJbml0aWFsaXplcigpOwotCQkJCWExLmJvZHlEZWNsYXJhdGlvbnMoKS5hZGQoczMpOwotCQkJCXMzLmdldEJvZHkoKS5zdGF0ZW1lbnRzKCkuYWRkKHMyKTsKLQkJCQlyZXR1cm4gczE7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB1bndyYXAoKSB7Ci0JCQkJRm9yU3RhdGVtZW50IHMyID0gKEZvclN0YXRlbWVudCkgeC5nZXRQYXJlbnQoKTsKLQkJCQlzMi5pbml0aWFsaXplcnMoKS5yZW1vdmUoeCk7Ci0JCQl9Ci0JCX0pOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEZpZWxkRGVjbGFyYXRpb24oKSB7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB4MSA9IGFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJbG9uZyBwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWZpbmFsIEZpZWxkRGVjbGFyYXRpb24geCA9IGFzdC5uZXdGaWVsZERlY2xhcmF0aW9uKHgxKTsKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWFzc2VydFRydWUoeCBpbnN0YW5jZW9mIEJvZHlEZWNsYXJhdGlvbik7Ci0JCWFzc2VydFRydWUoeC5nZXRBU1QoKSA9PSBhc3QpOwotCQlhc3NlcnRUcnVlKHguZ2V0UGFyZW50KCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5nZXRKYXZhZG9jKCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5nZXRNb2RpZmllcnMoKSA9PSBNb2RpZmllci5OT05FKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFR5cGUoKSAhPSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFR5cGUoKS5nZXRQYXJlbnQoKSA9PSB4KTsKLQkJYXNzZXJ0VHJ1ZSh4LmZyYWdtZW50cygpLnNpemUoKSA9PSAxKTsKLQkJYXNzZXJ0VHJ1ZSh4LmZyYWdtZW50cygpLmdldCgwKSA9PSB4MSk7Ci0JCWFzc2VydFRydWUoeDEuZ2V0UGFyZW50KCkgPT0geCk7Ci0JCWFzc2VydFRydWUoeC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuRklFTERfREVDTEFSQVRJT04pOwotCQkvLyBtYWtlIHN1cmUgdGhhdCByZWFkaW5nIGRpZCBub3QgY2hhbmdlIG1vZGlmaWNhdGlvbiBjb3VudAotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID09IHByZXZpb3VzQ291bnQpOwotCQotCQlpbnQgbGVnYWwgPSBNb2RpZmllci5QVUJMSUMgfCBNb2RpZmllci5QUk9URUNURUQKLQkJCXwgTW9kaWZpZXIuUFJJVkFURSB8IE1vZGlmaWVyLlNUQVRJQyB8IE1vZGlmaWVyLkZJTkFMCi0JCQl8IE1vZGlmaWVyLlRSQU5TSUVOVCB8IE1vZGlmaWVyLlZPTEFUSUxFOwotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCXguc2V0TW9kaWZpZXJzKGxlZ2FsKTsKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlhc3NlcnRUcnVlKHguZ2V0TW9kaWZpZXJzKCkgPT0gbGVnYWwpOwotCi0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJeC5zZXRNb2RpZmllcnMoTW9kaWZpZXIuTk9ORSk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE1vZGlmaWVycygpID09IE1vZGlmaWVyLk5PTkUpOwotCi0JCS8vIGNoZWNrIHRoYXQgcHJvcGVydHkgY2Fubm90IGJlIHNldCB0byBpbGxlZ2FsIHZhbHVlCi0JCXRyeSB7Ci0JCQl4LnNldE1vZGlmaWVycyhNb2RpZmllci5TWU5DSFJPTklaRUQpOwotCQkJYXNzZXJ0VHJ1ZShmYWxzZSk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJLy8gcGFzcwotCQl9Ci0KLQkJdEphdmFkb2NDb21tZW50KHgpOwotCQkJCQkJCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJUeXBlIiwgdHJ1ZSwgVHlwZS5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCVNpbXBsZVR5cGUgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld1NpbXBsZVR5cGUoCi0JCQkJCXRhcmdldEFzdC5uZXdTaW1wbGVOYW1lKCJmb28iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJdGFyZ2V0QXN0Lm5ld0FycmF5VHlwZShyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldFR5cGUoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXRUeXBlKChUeXBlKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWdlbmVyaWNQcm9wZXJ0eUxpc3RUZXN0KHgsIHguZnJhZ21lbnRzKCksCi0JCSAgbmV3IFByb3BlcnR5KCJWYXJpYWJsZVNwZWNpZmllcnMiLCB0cnVlLCBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCB0YXJnZXRBc3QsIGJvb2xlYW4gcGFyZW50ZWQpIHsKLQkJCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQl0YXJnZXRBc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudChyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgd3JhcCgpIHsKLQkJCQkvLyByZXR1cm4gVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHRoYXQgZW1iZWRzIHgKLQkJCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgczEgPSBhc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCQkJQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIHMyID0gYXN0Lm5ld0NsYXNzSW5zdGFuY2VDcmVhdGlvbigpOwotCQkJCUFub255bW91c0NsYXNzRGVjbGFyYXRpb24gYTEgPSBhc3QubmV3QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpOwotCQkJCXMyLnNldEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oYTEpOwotCQkJCXMxLnNldEluaXRpYWxpemVyKHMyKTsKLQkJCQlhMS5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKHgpOwotCQkJCXJldHVybiBzMTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHVud3JhcCgpIHsKLQkJCQlBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIGExID0gKEFub255bW91c0NsYXNzRGVjbGFyYXRpb24pIHguZ2V0UGFyZW50KCk7Ci0JCQkJYTEuYm9keURlY2xhcmF0aW9ucygpLnJlbW92ZSh4KTsKLQkJCX0KLQkJfSk7Ci0JCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NpZ25tZW50KCkgewotCQlsb25nIHByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJZmluYWwgQXNzaWdubWVudCB4ID0gYXN0Lm5ld0Fzc2lnbm1lbnQoKTsKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWFzc2VydFRydWUoeCBpbnN0YW5jZW9mIEV4cHJlc3Npb24pOwotCQlhc3NlcnRUcnVlKHguZ2V0QVNUKCkgPT0gYXN0KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFBhcmVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0T3BlcmF0b3IoKSA9PSBBc3NpZ25tZW50Lk9wZXJhdG9yLkFTU0lHTik7Ci0JCWFzc2VydFRydWUoeC5nZXRMZWZ0SGFuZFNpZGUoKS5nZXRQYXJlbnQoKSA9PSB4KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFJpZ2h0SGFuZFNpZGUoKS5nZXRQYXJlbnQoKSA9PSB4KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BU1NJR05NRU5UKTsKLQkJLy8gbWFrZSBzdXJlIHRoYXQgcmVhZGluZyBkaWQgbm90IGNoYW5nZSBtb2RpZmljYXRpb24gY291bnQKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA9PSBwcmV2aW91c0NvdW50KTsKLQkKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQl4LnNldE9wZXJhdG9yKEFzc2lnbm1lbnQuT3BlcmF0b3IuUExVU19BU1NJR04pOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCWFzc2VydFRydWUoeC5nZXRPcGVyYXRvcigpID09IEFzc2lnbm1lbnQuT3BlcmF0b3IuUExVU19BU1NJR04pOwotCQlhc3NlcnRUcnVlKEFzc2lnbm1lbnQuT3BlcmF0b3IuUExVU19BU1NJR04gCi0JCQkhPSBBc3NpZ25tZW50Lk9wZXJhdG9yLkFTU0lHTik7Ci0KLQkJLy8gY2hlY2sgdGhlIG5hbWVzIG9mIHRoZSBwcmltaXRpdmUgdHlwZSBjb2RlcwotCQlhc3NlcnRUcnVlKEFzc2lnbm1lbnQuT3BlcmF0b3IuQVNTSUdOLnRvU3RyaW5nKCkuZXF1YWxzKCI9IikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoQXNzaWdubWVudC5PcGVyYXRvci5QTFVTX0FTU0lHTi50b1N0cmluZygpLmVxdWFscygiKz0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShBc3NpZ25tZW50Lk9wZXJhdG9yLk1JTlVTX0FTU0lHTi50b1N0cmluZygpLmVxdWFscygiLT0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShBc3NpZ25tZW50Lk9wZXJhdG9yLlRJTUVTX0FTU0lHTi50b1N0cmluZygpLmVxdWFscygiKj0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShBc3NpZ25tZW50Lk9wZXJhdG9yLkRJVklERV9BU1NJR04udG9TdHJpbmcoKS5lcXVhbHMoIi89IikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoQXNzaWdubWVudC5PcGVyYXRvci5SRU1BSU5ERVJfQVNTSUdOLnRvU3RyaW5nKCkuZXF1YWxzKCIlPSIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKEFzc2lnbm1lbnQuT3BlcmF0b3IuTEVGVF9TSElGVF9BU1NJR04udG9TdHJpbmcoKS5lcXVhbHMoIjw8PSIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKEFzc2lnbm1lbnQuT3BlcmF0b3IuUklHSFRfU0hJRlRfU0lHTkVEX0FTU0lHTi50b1N0cmluZygpLmVxdWFscygiPj49IikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoQXNzaWdubWVudC5PcGVyYXRvci5SSUdIVF9TSElGVF9VTlNJR05FRF9BU1NJR04udG9TdHJpbmcoKS5lcXVhbHMoIj4+Pj0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShBc3NpZ25tZW50Lk9wZXJhdG9yLkJJVF9BTkRfQVNTSUdOLnRvU3RyaW5nKCkuZXF1YWxzKCImPSIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKEFzc2lnbm1lbnQuT3BlcmF0b3IuQklUX09SX0FTU0lHTi50b1N0cmluZygpLmVxdWFscygifD0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShBc3NpZ25tZW50Lk9wZXJhdG9yLkJJVF9YT1JfQVNTSUdOLnRvU3RyaW5nKCkuZXF1YWxzKCJePSIpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJQXNzaWdubWVudC5PcGVyYXRvcltdIGtub3duID0gewotCQkJQXNzaWdubWVudC5PcGVyYXRvci5BU1NJR04sCi0JCQlBc3NpZ25tZW50Lk9wZXJhdG9yLlBMVVNfQVNTSUdOLAotCQkJQXNzaWdubWVudC5PcGVyYXRvci5NSU5VU19BU1NJR04sCi0JCQlBc3NpZ25tZW50Lk9wZXJhdG9yLlRJTUVTX0FTU0lHTiwKLQkJCUFzc2lnbm1lbnQuT3BlcmF0b3IuRElWSURFX0FTU0lHTiwKLQkJCUFzc2lnbm1lbnQuT3BlcmF0b3IuUkVNQUlOREVSX0FTU0lHTiwKLQkJCUFzc2lnbm1lbnQuT3BlcmF0b3IuTEVGVF9TSElGVF9BU1NJR04sCi0JCQlBc3NpZ25tZW50Lk9wZXJhdG9yLlJJR0hUX1NISUZUX1NJR05FRF9BU1NJR04sCi0JCQlBc3NpZ25tZW50Lk9wZXJhdG9yLlJJR0hUX1NISUZUX1VOU0lHTkVEX0FTU0lHTiwKLQkJCUFzc2lnbm1lbnQuT3BlcmF0b3IuQklUX0FORF9BU1NJR04sCi0JCQlBc3NpZ25tZW50Lk9wZXJhdG9yLkJJVF9PUl9BU1NJR04sCi0JCQlBc3NpZ25tZW50Lk9wZXJhdG9yLkJJVF9YT1JfQVNTSUdOLAotCQl9OwotCQkKLQkJLy8gY2hlY2sgYWxsIG9wZXJhdG9ycyBhcmUgZGlzdGluY3QKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrbm93bi5sZW5ndGg7IGkrKykgewotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBrbm93bi5sZW5ndGg7IGorKykgewotCQkJCWFzc2VydFRydWUoaSA9PSBqIHx8ICFrbm93bltpXS5lcXVhbHMoa25vd25bal0pKTsKLQkJCX0KLQkJfQotCi0JCS8vIGNoZWNrIGFsbCBvcGVyYXRvcnMgd29yawotCQlmb3IgKGludCBpID0gMDsgaSA8IGtub3duLmxlbmd0aDsgaSsrKSB7Ci0JCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCQl4LnNldE9wZXJhdG9yKGtub3duW2ldKTsKLQkJCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJCWFzc2VydFRydWUoeC5nZXRPcGVyYXRvcigpLmVxdWFscyhrbm93bltpXSkpOwotCQl9Ci0JCS8vIGVuc3VyZSBudWxsIGRvZXMgbm90IHdvcmsgYXMgYSBwcmltaXRpdmUgdHlwZSBjb2RlCi0JCXRyeSB7Ci0JCQl4LnNldE9wZXJhdG9yKG51bGwpOwotCQkJYXNzZXJ0VHJ1ZShmYWxzZSk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJLy8gcGFzcwotCQl9Ci0KLQkJLy8gY2hlY2sgdG9PcGVyYXRvciBsb29rdXAgb2Ygb3BlcmF0b3JzIGJ5IG5hbWUKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrbm93bi5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIG5hbWUgPSBrbm93bltpXS50b1N0cmluZygpOwotCQkJYXNzZXJ0VHJ1ZShBc3NpZ25tZW50Lk9wZXJhdG9yLnRvT3BlcmF0b3IobmFtZSkuZXF1YWxzKGtub3duW2ldKSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShBc3NpZ25tZW50Lk9wZXJhdG9yLnRvT3BlcmF0b3IoIm5vdC1hbi1vcCIpID09IG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkJZ2VuZXJpY1Byb3BlcnR5VGVzdCh4LCBuZXcgUHJvcGVydHkoIkxlZnRIYW5kU2lkZSIsIHRydWUsIEV4cHJlc3Npb24uY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCB0YXJnZXRBc3QsIGJvb2xlYW4gcGFyZW50ZWQpIHsKLQkJCQlTaW1wbGVOYW1lIHJlc3VsdCA9IHRhcmdldEFzdC5uZXdTaW1wbGVOYW1lKCJmb28iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQl0YXJnZXRBc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgd3JhcCgpIHsKLQkJCQkvLyByZXR1cm4gRXhwcmVzc2lvbiB0aGF0IGVtYmVkcyB4Ci0JCQkJUGFyZW50aGVzaXplZEV4cHJlc3Npb24gczEgPSBhc3QubmV3UGFyZW50aGVzaXplZEV4cHJlc3Npb24oKTsKLQkJCQlzMS5zZXRFeHByZXNzaW9uKHgpOwotCQkJCXJldHVybiBzMTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHVud3JhcCgpIHsKLQkJCQlQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBzMSA9IChQYXJlbnRoZXNpemVkRXhwcmVzc2lvbikgeC5nZXRQYXJlbnQoKTsKLQkJCQlzMS5zZXRFeHByZXNzaW9uKGFzdC5uZXdTaW1wbGVOYW1lKCJ4IikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0TGVmdEhhbmRTaWRlKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzZXQoQVNUTm9kZSB2YWx1ZSkgewotCQkJCXguc2V0TGVmdEhhbmRTaWRlKChFeHByZXNzaW9uKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJSaWdodEhhbmRTaWRlIiwgdHJ1ZSwgRXhwcmVzc2lvbi5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCVNpbXBsZU5hbWUgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld1NpbXBsZU5hbWUoImZvbyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCXRhcmdldEFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJCS8vIHJldHVybiBFeHByZXNzaW9uIHRoYXQgZW1iZWRzIHgKLQkJCQlQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBzMSA9IGFzdC5uZXdQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpOwotCQkJCXMxLnNldEV4cHJlc3Npb24oeCk7Ci0JCQkJcmV0dXJuIHMxOwotCQkJfQotCQkJcHVibGljIHZvaWQgdW53cmFwKCkgewotCQkJCVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHMxID0gKFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKSB4LmdldFBhcmVudCgpOwotCQkJCXMxLnNldEV4cHJlc3Npb24oYXN0Lm5ld1NpbXBsZU5hbWUoIngiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIGdldCgpIHsKLQkJCQlyZXR1cm4geC5nZXRSaWdodEhhbmRTaWRlKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzZXQoQVNUTm9kZSB2YWx1ZSkgewotCQkJCXguc2V0UmlnaHRIYW5kU2lkZSgoRXhwcmVzc2lvbikgdmFsdWUpOwotCQkJfQotCQl9KTsKLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdEJyZWFrU3RhdGVtZW50KCkgewotCQlsb25nIHByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJZmluYWwgQnJlYWtTdGF0ZW1lbnQgeCA9IGFzdC5uZXdCcmVha1N0YXRlbWVudCgpOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJYXNzZXJ0VHJ1ZSh4IGluc3RhbmNlb2YgU3RhdGVtZW50KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEFTVCgpID09IGFzdCk7Ci0JCWFzc2VydFRydWUoeC5nZXRQYXJlbnQoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldExhYmVsKCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5nZXRMZWFkaW5nQ29tbWVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkJSRUFLX1NUQVRFTUVOVCk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHJlYWRpbmcgZGlkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGNvdW50Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0KLQkJdExlYWRpbmdDb21tZW50KHgpOwotCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJMYWJlbCIsIGZhbHNlLCBTaW1wbGVOYW1lLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgdGFyZ2V0QXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJU2ltcGxlTmFtZSByZXN1bHQgPSB0YXJnZXRBc3QubmV3U2ltcGxlTmFtZSgiZm9vIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJdGFyZ2V0QXN0Lm5ld0V4cHJlc3Npb25TdGF0ZW1lbnQocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIGdldCgpIHsKLQkJCQlyZXR1cm4geC5nZXRMYWJlbCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldExhYmVsKChTaW1wbGVOYW1lKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdENvbnRpbnVlU3RhdGVtZW50KCkgewotCQlsb25nIHByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJZmluYWwgQ29udGludWVTdGF0ZW1lbnQgeCA9IGFzdC5uZXdDb250aW51ZVN0YXRlbWVudCgpOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJYXNzZXJ0VHJ1ZSh4IGluc3RhbmNlb2YgU3RhdGVtZW50KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEFTVCgpID09IGFzdCk7Ci0JCWFzc2VydFRydWUoeC5nZXRQYXJlbnQoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldExhYmVsKCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5nZXRMZWFkaW5nQ29tbWVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkNPTlRJTlVFX1NUQVRFTUVOVCk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHJlYWRpbmcgZGlkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGNvdW50Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0JCi0JCXRMZWFkaW5nQ29tbWVudCh4KTsKLQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiTGFiZWwiLCBmYWxzZSwgU2ltcGxlTmFtZS5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCVNpbXBsZU5hbWUgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld1NpbXBsZU5hbWUoImZvbyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCXRhcmdldEFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0TGFiZWwoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXRMYWJlbCgoU2ltcGxlTmFtZSkgdmFsdWUpOwotCQkJfQotCQl9KTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RJZlN0YXRlbWVudCgpIHsKLQkJbG9uZyBwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWZpbmFsIElmU3RhdGVtZW50IHggPSBhc3QubmV3SWZTdGF0ZW1lbnQoKTsKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWFzc2VydFRydWUoeCBpbnN0YW5jZW9mIFN0YXRlbWVudCk7Ci0JCWFzc2VydFRydWUoeC5nZXRBU1QoKSA9PSBhc3QpOwotCQlhc3NlcnRUcnVlKHguZ2V0UGFyZW50KCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5nZXRMZWFkaW5nQ29tbWVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0RXhwcmVzc2lvbigpLmdldFBhcmVudCgpID09IHgpOwotCQlhc3NlcnRUcnVlKHguZ2V0VGhlblN0YXRlbWVudCgpLmdldFBhcmVudCgpID09IHgpOwotCQlhc3NlcnRUcnVlKHguZ2V0VGhlblN0YXRlbWVudCgpIGluc3RhbmNlb2YgQmxvY2spOwotCQlhc3NlcnRUcnVlKCgoQmxvY2spIHguZ2V0VGhlblN0YXRlbWVudCgpKS5zdGF0ZW1lbnRzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEVsc2VTdGF0ZW1lbnQoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5JRl9TVEFURU1FTlQpOwotCQkvLyBtYWtlIHN1cmUgdGhhdCByZWFkaW5nIGRpZCBub3QgY2hhbmdlIG1vZGlmaWNhdGlvbiBjb3VudAotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID09IHByZXZpb3VzQ291bnQpOwotCQotCQl0TGVhZGluZ0NvbW1lbnQoeCk7Ci0KLQkJZ2VuZXJpY1Byb3BlcnR5VGVzdCh4LCBuZXcgUHJvcGVydHkoIkV4cHJlc3Npb24iLCB0cnVlLCBFeHByZXNzaW9uLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgbG9jYWxBc3QsIGJvb2xlYW4gcGFyZW50ZWQpIHsKLQkJCQlFeHByZXNzaW9uIHJlc3VsdCA9IGxvY2FsQXN0Lm5ld1NpbXBsZU5hbWUoImZvbyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCWxvY2FsQXN0Lm5ld0V4cHJlc3Npb25TdGF0ZW1lbnQocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIHdyYXAoKSB7Ci0JCQkJLy8gcmV0dXJuIEV4cHJlc3Npb24gdGhhdCBlbWJlZHMgeAotCQkJCUNsYXNzSW5zdGFuY2VDcmVhdGlvbiBzMSA9IGFzdC5uZXdDbGFzc0luc3RhbmNlQ3JlYXRpb24oKTsKLQkJCQlBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIGExID0gYXN0Lm5ld0Fub255bW91c0NsYXNzRGVjbGFyYXRpb24oKTsKLQkJCQlzMS5zZXRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKGExKTsKLQkJCQlNZXRob2REZWNsYXJhdGlvbiBzMiA9IGFzdC5uZXdNZXRob2REZWNsYXJhdGlvbigpOwotCQkJCWExLmJvZHlEZWNsYXJhdGlvbnMoKS5hZGQoczIpOwotCQkJCUJsb2NrIHMzID0gYXN0Lm5ld0Jsb2NrKCk7Ci0JCQkJczIuc2V0Qm9keShzMyk7Ci0JCQkJczMuc3RhdGVtZW50cygpLmFkZCh4KTsKLQkJCQlyZXR1cm4gczE7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB1bndyYXAoKSB7Ci0JCQkJQmxvY2sgczMgPSAoQmxvY2spIHguZ2V0UGFyZW50KCk7Ci0JCQkJczMuc3RhdGVtZW50cygpLnJlbW92ZSh4KTsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIGdldCgpIHsKLQkJCQlyZXR1cm4geC5nZXRFeHByZXNzaW9uKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzZXQoQVNUTm9kZSB2YWx1ZSkgewotCQkJCXguc2V0RXhwcmVzc2lvbigoRXhwcmVzc2lvbikgdmFsdWUpOwotCQkJfQotCQl9KTsKLQkJCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJUaGVuU3RhdGVtZW50IiwgdHJ1ZSwgU3RhdGVtZW50LmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgdGFyZ2V0QXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJQmxvY2sgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld0Jsb2NrKCk7Ci0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCUJsb2NrIGIyID0gdGFyZ2V0QXN0Lm5ld0Jsb2NrKCk7Ci0JCQkJCWIyLnN0YXRlbWVudHMoKS5hZGQocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIHdyYXAoKSB7Ci0JCQkJLy8gcmV0dXJuIGEgU3RhdGVtZW50IHRoYXQgZW1iZWRzIHgKLQkJCQlCbG9jayBzMSA9IGFzdC5uZXdCbG9jaygpOwotCQkJCXMxLnN0YXRlbWVudHMoKS5hZGQoeCk7Ci0JCQkJcmV0dXJuIHMxOwotCQkJfQotCQkJcHVibGljIHZvaWQgdW53cmFwKCkgewotCQkJCUJsb2NrIHMyID0gKEJsb2NrKSB4LmdldFBhcmVudCgpOwotCQkJCXMyLnN0YXRlbWVudHMoKS5yZW1vdmUoeCk7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0VGhlblN0YXRlbWVudCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldFRoZW5TdGF0ZW1lbnQoKFN0YXRlbWVudCkgdmFsdWUpOwotCQkJfQotCQl9KTsKLQkJCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJFbHNlU3RhdGVtZW50IiwgZmFsc2UsIFN0YXRlbWVudC5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCUJsb2NrIHJlc3VsdCA9IHRhcmdldEFzdC5uZXdCbG9jaygpOwotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQlCbG9jayBiMiA9IHRhcmdldEFzdC5uZXdCbG9jaygpOwotCQkJCQliMi5zdGF0ZW1lbnRzKCkuYWRkKHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJCS8vIHJldHVybiBhIFN0YXRlbWVudCB0aGF0IGVtYmVkcyB4Ci0JCQkJQmxvY2sgczEgPSBhc3QubmV3QmxvY2soKTsKLQkJCQlzMS5zdGF0ZW1lbnRzKCkuYWRkKHgpOwotCQkJCXJldHVybiBzMTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHVud3JhcCgpIHsKLQkJCQlCbG9jayBzMiA9IChCbG9jaykgeC5nZXRQYXJlbnQoKTsKLQkJCQlzMi5zdGF0ZW1lbnRzKCkucmVtb3ZlKHgpOwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldEVsc2VTdGF0ZW1lbnQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXRFbHNlU3RhdGVtZW50KChTdGF0ZW1lbnQpIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0V2hpbGVTdGF0ZW1lbnQoKSB7Ci0JCWxvbmcgcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlmaW5hbCBXaGlsZVN0YXRlbWVudCB4ID0gYXN0Lm5ld1doaWxlU3RhdGVtZW50KCk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlhc3NlcnRUcnVlKHggaW5zdGFuY2VvZiBTdGF0ZW1lbnQpOwotCQlhc3NlcnRUcnVlKHguZ2V0QVNUKCkgPT0gYXN0KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFBhcmVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0TGVhZGluZ0NvbW1lbnQoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEV4cHJlc3Npb24oKS5nZXRQYXJlbnQoKSA9PSB4KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEJvZHkoKS5nZXRQYXJlbnQoKSA9PSB4KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEJvZHkoKSBpbnN0YW5jZW9mIEJsb2NrKTsKLQkJYXNzZXJ0VHJ1ZSgoKEJsb2NrKSB4LmdldEJvZHkoKSkuc3RhdGVtZW50cygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoeC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuV0hJTEVfU1RBVEVNRU5UKTsKLQkJLy8gbWFrZSBzdXJlIHRoYXQgcmVhZGluZyBkaWQgbm90IGNoYW5nZSBtb2RpZmljYXRpb24gY291bnQKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA9PSBwcmV2aW91c0NvdW50KTsKLQkKLQkJdExlYWRpbmdDb21tZW50KHgpOwotCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJFeHByZXNzaW9uIiwgdHJ1ZSwgRXhwcmVzc2lvbi5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIGxvY2FsQXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJRXhwcmVzc2lvbiByZXN1bHQgPSBsb2NhbEFzdC5uZXdTaW1wbGVOYW1lKCJmb28iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQlsb2NhbEFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJCS8vIHJldHVybiBFeHByZXNzaW9uIHRoYXQgZW1iZWRzIHgKLQkJCQlDbGFzc0luc3RhbmNlQ3JlYXRpb24gczEgPSBhc3QubmV3Q2xhc3NJbnN0YW5jZUNyZWF0aW9uKCk7Ci0JCQkJQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBhMSA9IGFzdC5uZXdBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCk7Ci0JCQkJczEuc2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbihhMSk7Ci0JCQkJTWV0aG9kRGVjbGFyYXRpb24gczIgPSBhc3QubmV3TWV0aG9kRGVjbGFyYXRpb24oKTsKLQkJCQlhMS5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKHMyKTsKLQkJCQlCbG9jayBzMyA9IGFzdC5uZXdCbG9jaygpOwotCQkJCXMyLnNldEJvZHkoczMpOwotCQkJCXMzLnN0YXRlbWVudHMoKS5hZGQoeCk7Ci0JCQkJcmV0dXJuIHMxOwotCQkJfQotCQkJcHVibGljIHZvaWQgdW53cmFwKCkgewotCQkJCUJsb2NrIHMzID0gKEJsb2NrKSB4LmdldFBhcmVudCgpOwotCQkJCXMzLnN0YXRlbWVudHMoKS5yZW1vdmUoeCk7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0RXhwcmVzc2lvbigpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldEV4cHJlc3Npb24oKEV4cHJlc3Npb24pIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiQm9keSIsIHRydWUsIFN0YXRlbWVudC5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCUJsb2NrIHJlc3VsdCA9IHRhcmdldEFzdC5uZXdCbG9jaygpOwotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQlCbG9jayBiMiA9IHRhcmdldEFzdC5uZXdCbG9jaygpOwotCQkJCQliMi5zdGF0ZW1lbnRzKCkuYWRkKHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJCS8vIHJldHVybiBhIFN0YXRlbWVudCB0aGF0IGVtYmVkcyB4Ci0JCQkJQmxvY2sgczEgPSBhc3QubmV3QmxvY2soKTsKLQkJCQlzMS5zdGF0ZW1lbnRzKCkuYWRkKHgpOwotCQkJCXJldHVybiBzMTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHVud3JhcCgpIHsKLQkJCQlCbG9jayBzMiA9IChCbG9jaykgeC5nZXRQYXJlbnQoKTsKLQkJCQlzMi5zdGF0ZW1lbnRzKCkucmVtb3ZlKHgpOwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldEJvZHkoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXRCb2R5KChTdGF0ZW1lbnQpIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RG9TdGF0ZW1lbnQoKSB7Ci0JCWxvbmcgcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlmaW5hbCBEb1N0YXRlbWVudCB4ID0gYXN0Lm5ld0RvU3RhdGVtZW50KCk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlhc3NlcnRUcnVlKHggaW5zdGFuY2VvZiBTdGF0ZW1lbnQpOwotCQlhc3NlcnRUcnVlKHguZ2V0QVNUKCkgPT0gYXN0KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFBhcmVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0TGVhZGluZ0NvbW1lbnQoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEV4cHJlc3Npb24oKS5nZXRQYXJlbnQoKSA9PSB4KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEJvZHkoKS5nZXRQYXJlbnQoKSA9PSB4KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEJvZHkoKSBpbnN0YW5jZW9mIEJsb2NrKTsKLQkJYXNzZXJ0VHJ1ZSgoKEJsb2NrKSB4LmdldEJvZHkoKSkuc3RhdGVtZW50cygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoeC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuRE9fU1RBVEVNRU5UKTsKLQkJLy8gbWFrZSBzdXJlIHRoYXQgcmVhZGluZyBkaWQgbm90IGNoYW5nZSBtb2RpZmljYXRpb24gY291bnQKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA9PSBwcmV2aW91c0NvdW50KTsKLQkKLQkJdExlYWRpbmdDb21tZW50KHgpOwotCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJFeHByZXNzaW9uIiwgdHJ1ZSwgRXhwcmVzc2lvbi5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIGxvY2FsQXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJRXhwcmVzc2lvbiByZXN1bHQgPSBsb2NhbEFzdC5uZXdTaW1wbGVOYW1lKCJmb28iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQlsb2NhbEFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJCS8vIHJldHVybiBFeHByZXNzaW9uIHRoYXQgZW1iZWRzIHgKLQkJCQlDbGFzc0luc3RhbmNlQ3JlYXRpb24gczEgPSBhc3QubmV3Q2xhc3NJbnN0YW5jZUNyZWF0aW9uKCk7Ci0JCQkJQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBhMSA9IGFzdC5uZXdBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCk7Ci0JCQkJczEuc2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbihhMSk7Ci0JCQkJTWV0aG9kRGVjbGFyYXRpb24gczIgPSBhc3QubmV3TWV0aG9kRGVjbGFyYXRpb24oKTsKLQkJCQlhMS5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKHMyKTsKLQkJCQlCbG9jayBzMyA9IGFzdC5uZXdCbG9jaygpOwotCQkJCXMyLnNldEJvZHkoczMpOwotCQkJCXMzLnN0YXRlbWVudHMoKS5hZGQoeCk7Ci0JCQkJcmV0dXJuIHMxOwotCQkJfQotCQkJcHVibGljIHZvaWQgdW53cmFwKCkgewotCQkJCUJsb2NrIHMzID0gKEJsb2NrKSB4LmdldFBhcmVudCgpOwotCQkJCXMzLnN0YXRlbWVudHMoKS5yZW1vdmUoeCk7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0RXhwcmVzc2lvbigpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldEV4cHJlc3Npb24oKEV4cHJlc3Npb24pIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiQm9keSIsIHRydWUsIFN0YXRlbWVudC5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCUJsb2NrIHJlc3VsdCA9IHRhcmdldEFzdC5uZXdCbG9jaygpOwotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQlCbG9jayBiMiA9IHRhcmdldEFzdC5uZXdCbG9jaygpOwotCQkJCQliMi5zdGF0ZW1lbnRzKCkuYWRkKHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJCS8vIHJldHVybiBhIFN0YXRlbWVudCB0aGF0IGVtYmVkcyB4Ci0JCQkJQmxvY2sgczEgPSBhc3QubmV3QmxvY2soKTsKLQkJCQlzMS5zdGF0ZW1lbnRzKCkuYWRkKHgpOwotCQkJCXJldHVybiBzMTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHVud3JhcCgpIHsKLQkJCQlCbG9jayBzMiA9IChCbG9jaykgeC5nZXRQYXJlbnQoKTsKLQkJCQlzMi5zdGF0ZW1lbnRzKCkucmVtb3ZlKHgpOwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldEJvZHkoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXRCb2R5KChTdGF0ZW1lbnQpIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VHJ5U3RhdGVtZW50KCkgewotCQlsb25nIHByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJZmluYWwgVHJ5U3RhdGVtZW50IHggPSBhc3QubmV3VHJ5U3RhdGVtZW50KCk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlhc3NlcnRUcnVlKHggaW5zdGFuY2VvZiBTdGF0ZW1lbnQpOwotCQlhc3NlcnRUcnVlKHggaW5zdGFuY2VvZiBTdGF0ZW1lbnQpOwotCQlhc3NlcnRUcnVlKHguZ2V0QVNUKCkgPT0gYXN0KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFBhcmVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0TGVhZGluZ0NvbW1lbnQoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEJvZHkoKS5nZXRQYXJlbnQoKSA9PSB4KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEJvZHkoKSBpbnN0YW5jZW9mIEJsb2NrKTsKLQkJYXNzZXJ0VHJ1ZSgoKEJsb2NrKSB4LmdldEJvZHkoKSkuc3RhdGVtZW50cygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoeC5nZXRGaW5hbGx5KCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5jYXRjaENsYXVzZXMoKS5zaXplKCkgPT0gMCk7Ci0JCWFzc2VydFRydWUoeC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuVFJZX1NUQVRFTUVOVCk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHJlYWRpbmcgZGlkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGNvdW50Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0JCi0JCXRMZWFkaW5nQ29tbWVudCh4KTsKLQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiQm9keSIsIHRydWUsIEJsb2NrLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgdGFyZ2V0QXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJQmxvY2sgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld0Jsb2NrKCk7Ci0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCUJsb2NrIGIyID0gdGFyZ2V0QXN0Lm5ld0Jsb2NrKCk7Ci0JCQkJCWIyLnN0YXRlbWVudHMoKS5hZGQocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIHdyYXAoKSB7Ci0JCQkJLy8gcmV0dXJuIGEgQmxvY2sgdGhhdCBlbWJlZHMgeAotCQkJCUJsb2NrIHMxID0gYXN0Lm5ld0Jsb2NrKCk7Ci0JCQkJczEuc3RhdGVtZW50cygpLmFkZCh4KTsKLQkJCQlyZXR1cm4gczE7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB1bndyYXAoKSB7Ci0JCQkJQmxvY2sgczIgPSAoQmxvY2spIHguZ2V0UGFyZW50KCk7Ci0JCQkJczIuc3RhdGVtZW50cygpLnJlbW92ZSh4KTsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIGdldCgpIHsKLQkJCQlyZXR1cm4geC5nZXRCb2R5KCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzZXQoQVNUTm9kZSB2YWx1ZSkgewotCQkJCXguc2V0Qm9keSgoQmxvY2spIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZ2VuZXJpY1Byb3BlcnR5TGlzdFRlc3QoeCwgeC5jYXRjaENsYXVzZXMoKSwKLQkJICBuZXcgUHJvcGVydHkoIkNhdGNoQ2xhdXNlcyIsIHRydWUsIENhdGNoQ2xhdXNlLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgdGFyZ2V0QXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJQ2F0Y2hDbGF1c2UgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld0NhdGNoQ2xhdXNlKCk7Ci0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCVRyeVN0YXRlbWVudCBzMSA9IHRhcmdldEFzdC5uZXdUcnlTdGF0ZW1lbnQoKTsKLQkJCQkJczEuY2F0Y2hDbGF1c2VzKCkuYWRkKHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJCS8vIHJldHVybiBDYXRjaENsYXVzZSB0aGF0IGVtYmVkcyB4Ci0JCQkJQ2F0Y2hDbGF1c2UgczEgPSBhc3QubmV3Q2F0Y2hDbGF1c2UoKTsKLQkJCQlCbG9jayBzMiA9IGFzdC5uZXdCbG9jaygpOwotCQkJCXMxLnNldEJvZHkoczIpOwotCQkJCXMyLnN0YXRlbWVudHMoKS5hZGQoeCk7Ci0JCQkJcmV0dXJuIHMxOwotCQkJfQotCQkJcHVibGljIHZvaWQgdW53cmFwKCkgewotCQkJCUJsb2NrIHMyID0gKEJsb2NrKSB4LmdldFBhcmVudCgpOwotCQkJCXMyLnN0YXRlbWVudHMoKS5yZW1vdmUoeCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJGaW5hbGx5IiwgZmFsc2UsIEJsb2NrLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgdGFyZ2V0QXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJQmxvY2sgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld0Jsb2NrKCk7Ci0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCUJsb2NrIGIyID0gdGFyZ2V0QXN0Lm5ld0Jsb2NrKCk7Ci0JCQkJCWIyLnN0YXRlbWVudHMoKS5hZGQocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIHdyYXAoKSB7Ci0JCQkJLy8gcmV0dXJuIGEgQmxvY2sgdGhhdCBlbWJlZHMgeAotCQkJCUJsb2NrIHMxID0gYXN0Lm5ld0Jsb2NrKCk7Ci0JCQkJczEuc3RhdGVtZW50cygpLmFkZCh4KTsKLQkJCQlyZXR1cm4gczE7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB1bndyYXAoKSB7Ci0JCQkJQmxvY2sgczIgPSAoQmxvY2spIHguZ2V0UGFyZW50KCk7Ci0JCQkJczIuc3RhdGVtZW50cygpLnJlbW92ZSh4KTsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIGdldCgpIHsKLQkJCQlyZXR1cm4geC5nZXRGaW5hbGx5KCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzZXQoQVNUTm9kZSB2YWx1ZSkgewotCQkJCXguc2V0RmluYWxseSgoQmxvY2spIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0JfQkKLQotCXB1YmxpYyB2b2lkIHRlc3RDYXRjaENsYXVzZSgpIHsKLQkJbG9uZyBwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWZpbmFsIENhdGNoQ2xhdXNlIHggPSBhc3QubmV3Q2F0Y2hDbGF1c2UoKTsKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWFzc2VydFRydWUoeC5nZXRBU1QoKSA9PSBhc3QpOwotCQlhc3NlcnRUcnVlKHguZ2V0UGFyZW50KCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5nZXRCb2R5KCkuZ2V0UGFyZW50KCkgPT0geCk7Ci0JCWFzc2VydFRydWUoeC5nZXRCb2R5KCkuc3RhdGVtZW50cygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoeC5nZXRFeGNlcHRpb24oKS5nZXRQYXJlbnQoKSA9PSB4KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5DQVRDSF9DTEFVU0UpOwotCQkvLyBtYWtlIHN1cmUgdGhhdCByZWFkaW5nIGRpZCBub3QgY2hhbmdlIG1vZGlmaWNhdGlvbiBjb3VudAotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID09IHByZXZpb3VzQ291bnQpOwotCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJFeGNlcHRpb24iLCB0cnVlLCBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgdGFyZ2V0QXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiByZXN1bHQgPSB0YXJnZXRBc3QubmV3U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbigpOwotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQl0YXJnZXRBc3QubmV3Q2F0Y2hDbGF1c2UoKS5zZXRFeGNlcHRpb24ocmVzdWx0KTsKLQkJCQkJCi0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJCS8vIHJldHVybiBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHRoYXQgZW1iZWRzIHgKLQkJCQlTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHMxID0gYXN0Lm5ld1NpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24oKTsKLQkJCQlDbGFzc0luc3RhbmNlQ3JlYXRpb24gczIgPSBhc3QubmV3Q2xhc3NJbnN0YW5jZUNyZWF0aW9uKCk7Ci0JCQkJQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBhMSA9IGFzdC5uZXdBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCk7Ci0JCQkJczIuc2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbihhMSk7Ci0JCQkJczEuc2V0SW5pdGlhbGl6ZXIoczIpOwotCQkJCU1ldGhvZERlY2xhcmF0aW9uIHMzID0gYXN0Lm5ld01ldGhvZERlY2xhcmF0aW9uKCk7Ci0JCQkJYTEuYm9keURlY2xhcmF0aW9ucygpLmFkZChzMyk7Ci0JCQkJQmxvY2sgczQgPSBhc3QubmV3QmxvY2soKTsKLQkJCQlzMy5zZXRCb2R5KHM0KTsKLQkJCQlUcnlTdGF0ZW1lbnQgczUgPSBhc3QubmV3VHJ5U3RhdGVtZW50KCk7Ci0JCQkJczQuc3RhdGVtZW50cygpLmFkZChzNSk7Ci0JCQkJczUuY2F0Y2hDbGF1c2VzKCkuYWRkKHgpOwotCQkJCXJldHVybiBzMTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHVud3JhcCgpIHsKLQkJCQlUcnlTdGF0ZW1lbnQgczUgPSAoVHJ5U3RhdGVtZW50KSB4LmdldFBhcmVudCgpOwotCQkJCXM1LmNhdGNoQ2xhdXNlcygpLnJlbW92ZSh4KTsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIGdldCgpIHsKLQkJCQlyZXR1cm4geC5nZXRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXRFeGNlcHRpb24oKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZ2VuZXJpY1Byb3BlcnR5VGVzdCh4LCBuZXcgUHJvcGVydHkoIkJvZHkiLCB0cnVlLCBCbG9jay5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCUJsb2NrIHJlc3VsdCA9IHRhcmdldEFzdC5uZXdCbG9jaygpOwotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQlCbG9jayBiMiA9IHRhcmdldEFzdC5uZXdCbG9jaygpOwotCQkJCQliMi5zdGF0ZW1lbnRzKCkuYWRkKHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJCS8vIHJldHVybiBhIEJsb2NrIHRoYXQgZW1iZWRzIHgKLQkJCQlCbG9jayBzMSA9IGFzdC5uZXdCbG9jaygpOwotCQkJCVRyeVN0YXRlbWVudCBzMiA9IGFzdC5uZXdUcnlTdGF0ZW1lbnQoKTsKLQkJCQlzMS5zdGF0ZW1lbnRzKCkuYWRkKHMyKTsKLQkJCQlzMi5jYXRjaENsYXVzZXMoKS5hZGQoeCk7Ci0JCQkJcmV0dXJuIHMxOwotCQkJfQotCQkJcHVibGljIHZvaWQgdW53cmFwKCkgewotCQkJCVRyeVN0YXRlbWVudCBzMiA9IChUcnlTdGF0ZW1lbnQpIHguZ2V0UGFyZW50KCk7Ci0JCQkJczIuY2F0Y2hDbGF1c2VzKCkucmVtb3ZlKHgpOwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldEJvZHkoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXRCb2R5KChCbG9jaykgdmFsdWUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTdGF0ZW1lbnQoKSB7Ci0JCWxvbmcgcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlmaW5hbCBFbXB0eVN0YXRlbWVudCB4ID0gYXN0Lm5ld0VtcHR5U3RhdGVtZW50KCk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlhc3NlcnRUcnVlKHggaW5zdGFuY2VvZiBTdGF0ZW1lbnQpOwotCQlhc3NlcnRUcnVlKHguZ2V0QVNUKCkgPT0gYXN0KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFBhcmVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0TGVhZGluZ0NvbW1lbnQoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5FTVBUWV9TVEFURU1FTlQpOwotCQkvLyBtYWtlIHN1cmUgdGhhdCByZWFkaW5nIGRpZCBub3QgY2hhbmdlIG1vZGlmaWNhdGlvbiBjb3VudAotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID09IHByZXZpb3VzQ291bnQpOwotCQkKLQkJdExlYWRpbmdDb21tZW50KHgpOwotCX0KLQkKLQkvKioKLQkgKiBFeGVyY2lzZSB0aGUgbGVhZGluZ0NvbW1lbnQgcHJvcGVydHkuCi0JICogCi0JICogQHBhcmFtIHggdGhlIHN0YXRlbWVudCB0byB0ZXN0Ci0JICovCi0Jdm9pZCB0TGVhZGluZ0NvbW1lbnQoU3RhdGVtZW50IHgpIHsKLQkJCi0JCS8vIGNoZWNrIHRoYXQgbnVsbCBpcyBhbGxvd2VkCi0JCWxvbmcgcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQl4LnNldExlYWRpbmdDb21tZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCWFzc2VydFRydWUoeC5nZXRMZWFkaW5nQ29tbWVudCgpID09IG51bGwpOwotCQkKLQkJLy8gY2hlY2sgdGhhdCByZWd1bGFyIGNvbW1lbnQgaXMgYWxsb3dlZAotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCXguc2V0TGVhZGluZ0NvbW1lbnQoIi8qIFggKi8iKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCWFzc2VydFRydWUoeC5nZXRMZWFkaW5nQ29tbWVudCgpID09ICIvKiBYICovIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8vIGNoZWNrIHRoYXQgcmVndWxhciBjb21tZW50IHdpdGggbGluZSBicmVha3MgaXMgYWxsb3dlZAotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCXguc2V0TGVhZGluZ0NvbW1lbnQoIi8qIFhcbiAqWVxuICovIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlhc3NlcnRUcnVlKHguZ2V0TGVhZGluZ0NvbW1lbnQoKSA9PSAiLyogWFxuICpZXG4gKi8iKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLy8gY2hlY2sgdGhhdCBlbmQtb2YtbGluZSBjb21tZW50IGlzIGFsbG93ZWQKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQl4LnNldExlYWRpbmdDb21tZW50KCIvLyBYXG4iKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCWFzc2VydFRydWUoeC5nZXRMZWFkaW5nQ29tbWVudCgpID09ICIvLyBYXG4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGNoZWNrIHRoYXQgZW5kLW9mLWxpbmUgY29tbWVudCB3aXRob3V0IGEgbGluZSBicmVhayBhdCB0aGUgZW5kIGlzIGFsbG93ZWQKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQl4LnNldExlYWRpbmdDb21tZW50KCIvLyBYIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlhc3NlcnRUcnVlKHguZ2V0TGVhZGluZ0NvbW1lbnQoKSA9PSAiLy8gWCIpOyAvLyROT04tTkxTLTEkCi0JCQotCQkvLyBjaGVjayB0aGF0IGVuZC1vZi1saW5lIGNvbW1lbnQgd2l0aCBlbWJlZGRlZCBlbmQgb2YgbGluZSAKLQkJLy8gbm90IGFsbG93ZWQKLQkJdHJ5IHsKLQkJCXguc2V0TGVhZGluZ0NvbW1lbnQoIi8vIFhcbiBleHRyYSIpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRUcnVlKGZhbHNlKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBwYXNzCi0JCX0KLQkJCi0JfQotCQkKLQkvKioKLQkgKiBFeGVyY2lzZSB0aGUgamF2YWRvYyBwcm9wZXJ0eS4KLQkgKiAKLQkgKiBAcGFyYW0geCB0aGUgYm9keSBkZWNsYXJhdGlvbiB0byB0ZXN0Ci0JICovCi0Jdm9pZCB0SmF2YWRvY0NvbW1lbnQoZmluYWwgQm9keURlY2xhcmF0aW9uIHgpIHsKLQkJZ2VuZXJpY1Byb3BlcnR5VGVzdCh4LCBuZXcgUHJvcGVydHkoIkphdmFkb2MiLCBmYWxzZSwgSmF2YWRvYy5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCUphdmFkb2MgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld0phdmFkb2MoKTsKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJdGFyZ2V0QXN0Lm5ld0luaXRpYWxpemVyKCkuc2V0SmF2YWRvYyhyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldEphdmFkb2MoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXRKYXZhZG9jKChKYXZhZG9jKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEV4ZXJjaXNlIHRoZSBjbGllbnQgcHJvcGVydGllcyBvZiBhIG5vZGUuCi0JICogCi0JICogQHBhcmFtIHggdGhlIG5vZGUgdG8gdGVzdAotCSAqLwotCXZvaWQgdENsaWVudFByb3BlcnRpZXMoQVNUTm9kZSB4KSB7Ci0JCQotCQlsb25nIHByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJCi0JCS8vIGEgbm9kZSBpbml0aWFsbHkgaGFzIG5vIHByb3BlcnRpZXMKLQkJYXNzZXJ0VHJ1ZSh4LnByb3BlcnRpZXMoKS5zaXplKCkgPT0gMCk7Ci0JCWFzc2VydFRydWUoeC5nZXRQcm9wZXJ0eSgiMSIpID09IG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gY2xlYXJpbmcgYW4gdW5zZXQgcHJvcGVydHkgZG9lcyBub3QgYWRkIGl0IHRvIGxpc3Qgb2Yga25vd24gb25lcwotCQl4LnNldFByb3BlcnR5KCIxIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSh4LmdldFByb3BlcnR5KCIxIikgPT0gbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSh4LnByb3BlcnRpZXMoKS5zaXplKCkgPT0gMCk7Ci0KLQkJLy8gc2V0dGluZyBhbiB1bnNldCBwcm9wZXJ0eSBkb2VzIGFkZCBpdCB0byB0aGUgbGlzdCBvZiBrbm93biBvbmVzCi0JCXguc2V0UHJvcGVydHkoIjEiLCAiYTEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydFRydWUoeC5nZXRQcm9wZXJ0eSgiMSIpID09ICJhMSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0VHJ1ZSh4LnByb3BlcnRpZXMoKS5zaXplKCkgPT0gMSk7Ci0JCU1hcC5FbnRyeVtdIG0gPSAoTWFwLkVudHJ5W10pIHgucHJvcGVydGllcygpLmVudHJ5U2V0KCkudG9BcnJheShuZXcgTWFwLkVudHJ5WzFdKTsKLQkJYXNzZXJ0VHJ1ZShtWzBdLmdldEtleSgpID09ICIxIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShtWzBdLmdldFZhbHVlKCkgPT0gImExIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBzZXR0aW5nIGFuIGFscmVhZHkgc2V0IHByb3BlcnR5IGp1c3QgY2hhbmdlcyBpdHMgdmFsdWUKLQkJeC5zZXRQcm9wZXJ0eSgiMSIsICJhMiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0VHJ1ZSh4LmdldFByb3BlcnR5KCIxIikgPT0gImEyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRUcnVlKHgucHJvcGVydGllcygpLnNpemUoKSA9PSAxKTsKLQkJbSA9IChNYXAuRW50cnlbXSkgeC5wcm9wZXJ0aWVzKCkuZW50cnlTZXQoKS50b0FycmF5KG5ldyBNYXAuRW50cnlbMV0pOwotCQlhc3NlcnRUcnVlKG1bMF0uZ2V0S2V5KCkgPT0gIjEiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKG1bMF0uZ2V0VmFsdWUoKSA9PSAiYTIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGNsZWFyaW5nIGEgc2V0IHByb3BlcnR5IHJlbW92ZXMgaXQgZnJvbSBsaXN0IG9mIGtub3duIG9uZXMKLQkJeC5zZXRQcm9wZXJ0eSgiMSIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoeC5nZXRQcm9wZXJ0eSgiMSIpID09IG51bGwpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoeC5wcm9wZXJ0aWVzKCkuc2l6ZSgpID09IDApOwotCQkKLQkJCi0JCS8vID09PT09PT09PSB0ZXN0IDIgYW5kIDMgcHJvcGVydGllcwotCQl4LnNldFByb3BlcnR5KCIxIiwgImExIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl4LnNldFByb3BlcnR5KCIyIiwgImIxIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl4LnNldFByb3BlcnR5KCIzIiwgImMxIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRUcnVlKHguZ2V0UHJvcGVydHkoIjEiKSA9PSAiYTEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydFRydWUoeC5nZXRQcm9wZXJ0eSgiMiIpID09ICJiMSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0VHJ1ZSh4LmdldFByb3BlcnR5KCIzIikgPT0gImMxIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRUcnVlKHgucHJvcGVydGllcygpLnNpemUoKSA9PSAzKTsKLQkJYXNzZXJ0VHJ1ZSh4LnByb3BlcnRpZXMoKS5nZXQoIjEiKSA9PSAiYTEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydFRydWUoeC5wcm9wZXJ0aWVzKCkuZ2V0KCIyIikgPT0gImIxIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRUcnVlKHgucHJvcGVydGllcygpLmdldCgiMyIpID09ICJjMSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJeC5zZXRQcm9wZXJ0eSgiMSIsICJhMiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJeC5zZXRQcm9wZXJ0eSgiMiIsICJiMiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJeC5zZXRQcm9wZXJ0eSgiMyIsICJjMiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0VHJ1ZSh4LmdldFByb3BlcnR5KCIxIikgPT0gImEyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRUcnVlKHguZ2V0UHJvcGVydHkoIjIiKSA9PSAiYjIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydFRydWUoeC5nZXRQcm9wZXJ0eSgiMyIpID09ICJjMiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0VHJ1ZSh4LnByb3BlcnRpZXMoKS5zaXplKCkgPT0gMyk7Ci0JCWFzc2VydFRydWUoeC5wcm9wZXJ0aWVzKCkuZ2V0KCIxIikgPT0gImEyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRUcnVlKHgucHJvcGVydGllcygpLmdldCgiMiIpID09ICJiMiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0VHJ1ZSh4LnByb3BlcnRpZXMoKS5nZXQoIjMiKSA9PSAiYzIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXguc2V0UHJvcGVydHkoIjIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKHguZ2V0UHJvcGVydHkoIjEiKSA9PSAiYTIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFzc2VydFRydWUoeC5nZXRQcm9wZXJ0eSgiMiIpID09IG51bGwpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoeC5nZXRQcm9wZXJ0eSgiMyIpID09ICJjMiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0VHJ1ZSh4LnByb3BlcnRpZXMoKS5zaXplKCkgPT0gMik7Ci0JCWFzc2VydFRydWUoeC5wcm9wZXJ0aWVzKCkuZ2V0KCIxIikgPT0gImEyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRUcnVlKHgucHJvcGVydGllcygpLmdldCgiMiIpID09IG51bGwpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoeC5wcm9wZXJ0aWVzKCkuZ2V0KCIzIikgPT0gImMyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl4LnNldFByb3BlcnR5KCIxIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSh4LmdldFByb3BlcnR5KCIxIikgPT0gbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSh4LmdldFByb3BlcnR5KCIyIikgPT0gbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSh4LmdldFByb3BlcnR5KCIzIikgPT0gImMyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnRUcnVlKHgucHJvcGVydGllcygpLnNpemUoKSA9PSAxKTsKLQkJYXNzZXJ0VHJ1ZSh4LnByb3BlcnRpZXMoKS5nZXQoIjEiKSA9PSBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKHgucHJvcGVydGllcygpLmdldCgiMiIpID09IG51bGwpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoeC5wcm9wZXJ0aWVzKCkuZ2V0KCIzIikgPT0gImMyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkKLQkJLy8gbm9uZSBvZiB0aGlzIGlzIGNvbnNpZGVyZWQgdG8gaGF2ZSBhZmZlY3RlZCB0aGUgQVNUCi0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZXR1cm5TdGF0ZW1lbnQoKSB7Ci0JCWxvbmcgcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlmaW5hbCBSZXR1cm5TdGF0ZW1lbnQgeCA9IGFzdC5uZXdSZXR1cm5TdGF0ZW1lbnQoKTsKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWFzc2VydFRydWUoeCBpbnN0YW5jZW9mIFN0YXRlbWVudCk7Ci0JCWFzc2VydFRydWUoeC5nZXRBU1QoKSA9PSBhc3QpOwotCQlhc3NlcnRUcnVlKHguZ2V0UGFyZW50KCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5nZXRFeHByZXNzaW9uKCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuUkVUVVJOX1NUQVRFTUVOVCk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHJlYWRpbmcgZGlkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGNvdW50Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0KLQkJdExlYWRpbmdDb21tZW50KHgpOwotCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJFeHByZXNzaW9uIiwgZmFsc2UsIEV4cHJlc3Npb24uY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCBsb2NhbEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCUV4cHJlc3Npb24gcmVzdWx0ID0gbG9jYWxBc3QubmV3U2ltcGxlTmFtZSgiZm9vIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJbG9jYWxBc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgd3JhcCgpIHsKLQkJCQkvLyByZXR1cm4gRXhwcmVzc2lvbiB0aGF0IGVtYmVkcyB4Ci0JCQkJQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIHMxID0gYXN0Lm5ld0NsYXNzSW5zdGFuY2VDcmVhdGlvbigpOwotCQkJCUFub255bW91c0NsYXNzRGVjbGFyYXRpb24gYTEgPSBhc3QubmV3QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpOwotCQkJCXMxLnNldEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oYTEpOwotCQkJCU1ldGhvZERlY2xhcmF0aW9uIHMyID0gYXN0Lm5ld01ldGhvZERlY2xhcmF0aW9uKCk7Ci0JCQkJYTEuYm9keURlY2xhcmF0aW9ucygpLmFkZChzMik7Ci0JCQkJQmxvY2sgczMgPSBhc3QubmV3QmxvY2soKTsKLQkJCQlzMi5zZXRCb2R5KHMzKTsKLQkJCQlzMy5zdGF0ZW1lbnRzKCkuYWRkKHgpOwotCQkJCXJldHVybiBzMTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHVud3JhcCgpIHsKLQkJCQlCbG9jayBzMyA9IChCbG9jaykgeC5nZXRQYXJlbnQoKTsKLQkJCQlzMy5zdGF0ZW1lbnRzKCkucmVtb3ZlKHgpOwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldEV4cHJlc3Npb24oKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXRFeHByZXNzaW9uKChFeHByZXNzaW9uKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUaHJvd1N0YXRlbWVudCgpIHsKLQkJbG9uZyBwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWZpbmFsIFRocm93U3RhdGVtZW50IHggPSBhc3QubmV3VGhyb3dTdGF0ZW1lbnQoKTsKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWFzc2VydFRydWUoeCBpbnN0YW5jZW9mIFN0YXRlbWVudCk7Ci0JCWFzc2VydFRydWUoeC5nZXRBU1QoKSA9PSBhc3QpOwotCQlhc3NlcnRUcnVlKHguZ2V0UGFyZW50KCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5nZXRFeHByZXNzaW9uKCkuZ2V0UGFyZW50KCkgPT0geCk7Ci0JCWFzc2VydFRydWUoeC5nZXRMZWFkaW5nQ29tbWVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlRIUk9XX1NUQVRFTUVOVCk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHJlYWRpbmcgZGlkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGNvdW50Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0KLQkJdExlYWRpbmdDb21tZW50KHgpOwotCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJFeHByZXNzaW9uIiwgdHJ1ZSwgRXhwcmVzc2lvbi5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIGxvY2FsQXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJRXhwcmVzc2lvbiByZXN1bHQgPSBsb2NhbEFzdC5uZXdTaW1wbGVOYW1lKCJmb28iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQlsb2NhbEFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJCS8vIHJldHVybiBFeHByZXNzaW9uIHRoYXQgZW1iZWRzIHgKLQkJCQlDbGFzc0luc3RhbmNlQ3JlYXRpb24gczEgPSBhc3QubmV3Q2xhc3NJbnN0YW5jZUNyZWF0aW9uKCk7Ci0JCQkJQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBhMSA9IGFzdC5uZXdBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCk7Ci0JCQkJczEuc2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbihhMSk7Ci0JCQkJTWV0aG9kRGVjbGFyYXRpb24gczIgPSBhc3QubmV3TWV0aG9kRGVjbGFyYXRpb24oKTsKLQkJCQlhMS5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKHMyKTsKLQkJCQlCbG9jayBzMyA9IGFzdC5uZXdCbG9jaygpOwotCQkJCXMyLnNldEJvZHkoczMpOwotCQkJCXMzLnN0YXRlbWVudHMoKS5hZGQoeCk7Ci0JCQkJcmV0dXJuIHMxOwotCQkJfQotCQkJcHVibGljIHZvaWQgdW53cmFwKCkgewotCQkJCUJsb2NrIHMzID0gKEJsb2NrKSB4LmdldFBhcmVudCgpOwotCQkJCXMzLnN0YXRlbWVudHMoKS5yZW1vdmUoeCk7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0RXhwcmVzc2lvbigpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldEV4cHJlc3Npb24oKEV4cHJlc3Npb24pIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFzc2VydFN0YXRlbWVudCgpIHsKLQkJbG9uZyBwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWZpbmFsIEFzc2VydFN0YXRlbWVudCB4ID0gYXN0Lm5ld0Fzc2VydFN0YXRlbWVudCgpOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJYXNzZXJ0VHJ1ZSh4IGluc3RhbmNlb2YgU3RhdGVtZW50KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEFTVCgpID09IGFzdCk7Ci0JCWFzc2VydFRydWUoeC5nZXRQYXJlbnQoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEV4cHJlc3Npb24oKS5nZXRQYXJlbnQoKSA9PSB4KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE1lc3NhZ2UoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldExlYWRpbmdDb21tZW50KCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQVNTRVJUX1NUQVRFTUVOVCk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHJlYWRpbmcgZGlkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGNvdW50Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0KLQkJdExlYWRpbmdDb21tZW50KHgpOwotCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJFeHByZXNzaW9uIiwgdHJ1ZSwgRXhwcmVzc2lvbi5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIGxvY2FsQXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJRXhwcmVzc2lvbiByZXN1bHQgPSBsb2NhbEFzdC5uZXdTaW1wbGVOYW1lKCJmb28iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQlsb2NhbEFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJCS8vIHJldHVybiBFeHByZXNzaW9uIHRoYXQgZW1iZWRzIHgKLQkJCQlDbGFzc0luc3RhbmNlQ3JlYXRpb24gczEgPSBhc3QubmV3Q2xhc3NJbnN0YW5jZUNyZWF0aW9uKCk7Ci0JCQkJQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBhMSA9IGFzdC5uZXdBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCk7Ci0JCQkJczEuc2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbihhMSk7Ci0JCQkJTWV0aG9kRGVjbGFyYXRpb24gczIgPSBhc3QubmV3TWV0aG9kRGVjbGFyYXRpb24oKTsKLQkJCQlhMS5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKHMyKTsKLQkJCQlCbG9jayBzMyA9IGFzdC5uZXdCbG9jaygpOwotCQkJCXMyLnNldEJvZHkoczMpOwotCQkJCXMzLnN0YXRlbWVudHMoKS5hZGQoeCk7Ci0JCQkJcmV0dXJuIHMxOwotCQkJfQotCQkJcHVibGljIHZvaWQgdW53cmFwKCkgewotCQkJCUJsb2NrIHMzID0gKEJsb2NrKSB4LmdldFBhcmVudCgpOwotCQkJCXMzLnN0YXRlbWVudHMoKS5yZW1vdmUoeCk7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0RXhwcmVzc2lvbigpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldEV4cHJlc3Npb24oKEV4cHJlc3Npb24pIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZ2VuZXJpY1Byb3BlcnR5VGVzdCh4LCBuZXcgUHJvcGVydHkoIk1lc3NhZ2UiLCBmYWxzZSwgRXhwcmVzc2lvbi5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIGxvY2FsQXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJRXhwcmVzc2lvbiByZXN1bHQgPSBsb2NhbEFzdC5uZXdTaW1wbGVOYW1lKCJmb28iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQlsb2NhbEFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJCS8vIHJldHVybiBFeHByZXNzaW9uIHRoYXQgZW1iZWRzIHgKLQkJCQlDbGFzc0luc3RhbmNlQ3JlYXRpb24gczEgPSBhc3QubmV3Q2xhc3NJbnN0YW5jZUNyZWF0aW9uKCk7Ci0JCQkJQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBhMSA9IGFzdC5uZXdBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCk7Ci0JCQkJczEuc2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbihhMSk7Ci0JCQkJTWV0aG9kRGVjbGFyYXRpb24gczIgPSBhc3QubmV3TWV0aG9kRGVjbGFyYXRpb24oKTsKLQkJCQlhMS5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKHMyKTsKLQkJCQlCbG9jayBzMyA9IGFzdC5uZXdCbG9jaygpOwotCQkJCXMyLnNldEJvZHkoczMpOwotCQkJCXMzLnN0YXRlbWVudHMoKS5hZGQoeCk7Ci0JCQkJcmV0dXJuIHMxOwotCQkJfQotCQkJcHVibGljIHZvaWQgdW53cmFwKCkgewotCQkJCUJsb2NrIHMzID0gKEJsb2NrKSB4LmdldFBhcmVudCgpOwotCQkJCXMzLnN0YXRlbWVudHMoKS5yZW1vdmUoeCk7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0TWVzc2FnZSgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldE1lc3NhZ2UoKEV4cHJlc3Npb24pIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN3aXRjaFN0YXRlbWVudCgpIHsKLQkJbG9uZyBwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWZpbmFsIFN3aXRjaFN0YXRlbWVudCB4ID0gYXN0Lm5ld1N3aXRjaFN0YXRlbWVudCgpOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJYXNzZXJ0VHJ1ZSh4IGluc3RhbmNlb2YgU3RhdGVtZW50KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEFTVCgpID09IGFzdCk7Ci0JCWFzc2VydFRydWUoeC5nZXRQYXJlbnQoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEV4cHJlc3Npb24oKS5nZXRQYXJlbnQoKSA9PSB4KTsKLQkJYXNzZXJ0VHJ1ZSh4LnN0YXRlbWVudHMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHguZ2V0TGVhZGluZ0NvbW1lbnQoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5TV0lUQ0hfU1RBVEVNRU5UKTsKLQkJLy8gbWFrZSBzdXJlIHRoYXQgcmVhZGluZyBkaWQgbm90IGNoYW5nZSBtb2RpZmljYXRpb24gY291bnQKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA9PSBwcmV2aW91c0NvdW50KTsKLQotCQl0TGVhZGluZ0NvbW1lbnQoeCk7Ci0JCQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiRXhwcmVzc2lvbiIsIHRydWUsIEV4cHJlc3Npb24uY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCBsb2NhbEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCUV4cHJlc3Npb24gcmVzdWx0ID0gbG9jYWxBc3QubmV3U2ltcGxlTmFtZSgiZm9vIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJbG9jYWxBc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgd3JhcCgpIHsKLQkJCQkvLyByZXR1cm4gRXhwcmVzc2lvbiB0aGF0IGVtYmVkcyB4Ci0JCQkJQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIHMxID0gYXN0Lm5ld0NsYXNzSW5zdGFuY2VDcmVhdGlvbigpOwotCQkJCUFub255bW91c0NsYXNzRGVjbGFyYXRpb24gYTEgPSBhc3QubmV3QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpOwotCQkJCXMxLnNldEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oYTEpOwotCQkJCU1ldGhvZERlY2xhcmF0aW9uIHMyID0gYXN0Lm5ld01ldGhvZERlY2xhcmF0aW9uKCk7Ci0JCQkJYTEuYm9keURlY2xhcmF0aW9ucygpLmFkZChzMik7Ci0JCQkJQmxvY2sgczMgPSBhc3QubmV3QmxvY2soKTsKLQkJCQlzMi5zZXRCb2R5KHMzKTsKLQkJCQlzMy5zdGF0ZW1lbnRzKCkuYWRkKHgpOwotCQkJCXJldHVybiBzMTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHVud3JhcCgpIHsKLQkJCQlCbG9jayBzMyA9IChCbG9jaykgeC5nZXRQYXJlbnQoKTsKLQkJCQlzMy5zdGF0ZW1lbnRzKCkucmVtb3ZlKHgpOwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldEV4cHJlc3Npb24oKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXRFeHByZXNzaW9uKChFeHByZXNzaW9uKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWdlbmVyaWNQcm9wZXJ0eUxpc3RUZXN0KHgsIHguc3RhdGVtZW50cygpLAotCQkgIG5ldyBQcm9wZXJ0eSgiU3RhdGVtZW50cyIsIHRydWUsIFN0YXRlbWVudC5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCUJsb2NrIHJlc3VsdCA9IHRhcmdldEFzdC5uZXdCbG9jaygpOwotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQlCbG9jayBiMiA9IHRhcmdldEFzdC5uZXdCbG9jaygpOwotCQkJCQliMi5zdGF0ZW1lbnRzKCkuYWRkKHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJCS8vIHJldHVybiBhIFN0YXRlbWVudCB0aGF0IGVtYmVkcyB4Ci0JCQkJQmxvY2sgczEgPSBhc3QubmV3QmxvY2soKTsKLQkJCQlzMS5zdGF0ZW1lbnRzKCkuYWRkKHgpOwotCQkJCXJldHVybiBzMTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHVud3JhcCgpIHsKLQkJCQlCbG9jayBzMiA9IChCbG9jaykgeC5nZXRQYXJlbnQoKTsKLQkJCQlzMi5zdGF0ZW1lbnRzKCkucmVtb3ZlKHgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3dpdGNoQ2FzZSgpIHsKLQkJbG9uZyBwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWZpbmFsIFN3aXRjaENhc2UgeCA9IGFzdC5uZXdTd2l0Y2hDYXNlKCk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlhc3NlcnRUcnVlKHggaW5zdGFuY2VvZiBTdGF0ZW1lbnQpOwotCQlhc3NlcnRUcnVlKHguZ2V0QVNUKCkgPT0gYXN0KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFBhcmVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0RXhwcmVzc2lvbigpLmdldFBhcmVudCgpID09IHgpOwotCQlhc3NlcnRUcnVlKHguZ2V0TGVhZGluZ0NvbW1lbnQoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSgheC5pc0RlZmF1bHQoKSk7CQotCQlhc3NlcnRUcnVlKHguZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlNXSVRDSF9DQVNFKTsKLQkJLy8gbWFrZSBzdXJlIHRoYXQgcmVhZGluZyBkaWQgbm90IGNoYW5nZSBtb2RpZmljYXRpb24gY291bnQKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA9PSBwcmV2aW91c0NvdW50KTsKLQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiRXhwcmVzc2lvbiIsIGZhbHNlLCBFeHByZXNzaW9uLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgbG9jYWxBc3QsIGJvb2xlYW4gcGFyZW50ZWQpIHsKLQkJCQlFeHByZXNzaW9uIHJlc3VsdCA9IGxvY2FsQXN0Lm5ld1NpbXBsZU5hbWUoImZvbyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCWxvY2FsQXN0Lm5ld0V4cHJlc3Npb25TdGF0ZW1lbnQocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIHdyYXAoKSB7Ci0JCQkJLy8gcmV0dXJuIEV4cHJlc3Npb24gdGhhdCBlbWJlZHMgeAotCQkJCUNsYXNzSW5zdGFuY2VDcmVhdGlvbiBzMSA9IGFzdC5uZXdDbGFzc0luc3RhbmNlQ3JlYXRpb24oKTsKLQkJCQlBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIGExID0gYXN0Lm5ld0Fub255bW91c0NsYXNzRGVjbGFyYXRpb24oKTsKLQkJCQlzMS5zZXRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKGExKTsKLQkJCQlNZXRob2REZWNsYXJhdGlvbiBzMiA9IGFzdC5uZXdNZXRob2REZWNsYXJhdGlvbigpOwotCQkJCWExLmJvZHlEZWNsYXJhdGlvbnMoKS5hZGQoczIpOwotCQkJCUJsb2NrIHMzID0gYXN0Lm5ld0Jsb2NrKCk7Ci0JCQkJczIuc2V0Qm9keShzMyk7Ci0JCQkJU3dpdGNoU3RhdGVtZW50IHM0ID0gYXN0Lm5ld1N3aXRjaFN0YXRlbWVudCgpOwotCQkJCXMzLnN0YXRlbWVudHMoKS5hZGQoczQpOwotCQkJCXM0LnN0YXRlbWVudHMoKS5hZGQoeCk7Ci0JCQkJcmV0dXJuIHMxOwotCQkJfQotCQkJcHVibGljIHZvaWQgdW53cmFwKCkgewotCQkJCVN3aXRjaFN0YXRlbWVudCBzNCA9IChTd2l0Y2hTdGF0ZW1lbnQpIHguZ2V0UGFyZW50KCk7Ci0JCQkJczQuc3RhdGVtZW50cygpLnJlbW92ZSh4KTsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIGdldCgpIHsKLQkJCQlyZXR1cm4geC5nZXRFeHByZXNzaW9uKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzZXQoQVNUTm9kZSB2YWx1ZSkgewotCQkJCXguc2V0RXhwcmVzc2lvbigoRXhwcmVzc2lvbikgdmFsdWUpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplZFN0YXRlbWVudCgpIHsKLQkJbG9uZyBwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWZpbmFsIFN5bmNocm9uaXplZFN0YXRlbWVudCB4ID0gYXN0Lm5ld1N5bmNocm9uaXplZFN0YXRlbWVudCgpOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJYXNzZXJ0VHJ1ZSh4IGluc3RhbmNlb2YgU3RhdGVtZW50KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEFTVCgpID09IGFzdCk7Ci0JCWFzc2VydFRydWUoeC5nZXRQYXJlbnQoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEV4cHJlc3Npb24oKS5nZXRQYXJlbnQoKSA9PSB4KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEJvZHkoKS5zdGF0ZW1lbnRzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldExlYWRpbmdDb21tZW50KCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuU1lOQ0hST05JWkVEX1NUQVRFTUVOVCk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHJlYWRpbmcgZGlkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGNvdW50Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0KLQkJdExlYWRpbmdDb21tZW50KHgpOwotCQkKLQkJZ2VuZXJpY1Byb3BlcnR5VGVzdCh4LCBuZXcgUHJvcGVydHkoIkV4cHJlc3Npb24iLCB0cnVlLCBFeHByZXNzaW9uLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgbG9jYWxBc3QsIGJvb2xlYW4gcGFyZW50ZWQpIHsKLQkJCQlFeHByZXNzaW9uIHJlc3VsdCA9IGxvY2FsQXN0Lm5ld1NpbXBsZU5hbWUoImZvbyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCWxvY2FsQXN0Lm5ld0V4cHJlc3Npb25TdGF0ZW1lbnQocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIHdyYXAoKSB7Ci0JCQkJLy8gcmV0dXJuIEV4cHJlc3Npb24gdGhhdCBlbWJlZHMgeAotCQkJCUNsYXNzSW5zdGFuY2VDcmVhdGlvbiBzMSA9IGFzdC5uZXdDbGFzc0luc3RhbmNlQ3JlYXRpb24oKTsKLQkJCQlBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIGExID0gYXN0Lm5ld0Fub255bW91c0NsYXNzRGVjbGFyYXRpb24oKTsKLQkJCQlzMS5zZXRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKGExKTsKLQkJCQlNZXRob2REZWNsYXJhdGlvbiBzMiA9IGFzdC5uZXdNZXRob2REZWNsYXJhdGlvbigpOwotCQkJCWExLmJvZHlEZWNsYXJhdGlvbnMoKS5hZGQoczIpOwotCQkJCUJsb2NrIHMzID0gYXN0Lm5ld0Jsb2NrKCk7Ci0JCQkJczIuc2V0Qm9keShzMyk7Ci0JCQkJczMuc3RhdGVtZW50cygpLmFkZCh4KTsKLQkJCQlyZXR1cm4gczE7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB1bndyYXAoKSB7Ci0JCQkJQmxvY2sgczMgPSAoQmxvY2spIHguZ2V0UGFyZW50KCk7Ci0JCQkJczMuc3RhdGVtZW50cygpLnJlbW92ZSh4KTsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIGdldCgpIHsKLQkJCQlyZXR1cm4geC5nZXRFeHByZXNzaW9uKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzZXQoQVNUTm9kZSB2YWx1ZSkgewotCQkJCXguc2V0RXhwcmVzc2lvbigoRXhwcmVzc2lvbikgdmFsdWUpOwotCQkJfQotCQl9KTsKLQkJCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJCb2R5IiwgdHJ1ZSwgQmxvY2suY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCB0YXJnZXRBc3QsIGJvb2xlYW4gcGFyZW50ZWQpIHsKLQkJCQlCbG9jayByZXN1bHQgPSB0YXJnZXRBc3QubmV3QmxvY2soKTsKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJQmxvY2sgYjIgPSB0YXJnZXRBc3QubmV3QmxvY2soKTsKLQkJCQkJYjIuc3RhdGVtZW50cygpLmFkZChyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgd3JhcCgpIHsKLQkJCQkvLyByZXR1cm4gYSBCbG9jayB0aGF0IGVtYmVkcyB4Ci0JCQkJQmxvY2sgczEgPSBhc3QubmV3QmxvY2soKTsKLQkJCQlzMS5zdGF0ZW1lbnRzKCkuYWRkKHgpOwotCQkJCXJldHVybiBzMTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHVud3JhcCgpIHsKLQkJCQlCbG9jayBzMiA9IChCbG9jaykgeC5nZXRQYXJlbnQoKTsKLQkJCQlzMi5zdGF0ZW1lbnRzKCkucmVtb3ZlKHgpOwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldEJvZHkoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXRCb2R5KChCbG9jaykgdmFsdWUpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdExhYmVsZWRTdGF0ZW1lbnQoKSB7Ci0JCWxvbmcgcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlmaW5hbCBMYWJlbGVkU3RhdGVtZW50IHggPSBhc3QubmV3TGFiZWxlZFN0YXRlbWVudCgpOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJYXNzZXJ0VHJ1ZSh4IGluc3RhbmNlb2YgU3RhdGVtZW50KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEFTVCgpID09IGFzdCk7Ci0JCWFzc2VydFRydWUoeC5nZXRQYXJlbnQoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldExhYmVsKCkuZ2V0UGFyZW50KCkgPT0geCk7Ci0JCWFzc2VydFRydWUoeC5nZXRCb2R5KCkuZ2V0UGFyZW50KCkgPT0geCk7Ci0JCWFzc2VydFRydWUoeC5nZXRMZWFkaW5nQ29tbWVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkxBQkVMRURfU1RBVEVNRU5UKTsKLQkJLy8gbWFrZSBzdXJlIHRoYXQgcmVhZGluZyBkaWQgbm90IGNoYW5nZSBtb2RpZmljYXRpb24gY291bnQKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA9PSBwcmV2aW91c0NvdW50KTsKLQotCQl0TGVhZGluZ0NvbW1lbnQoeCk7Ci0JCQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiTGFiZWwiLCB0cnVlLCBTaW1wbGVOYW1lLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgdGFyZ2V0QXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJU2ltcGxlTmFtZSByZXN1bHQgPSB0YXJnZXRBc3QubmV3U2ltcGxlTmFtZSgiZm9vIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJdGFyZ2V0QXN0Lm5ld0V4cHJlc3Npb25TdGF0ZW1lbnQocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIGdldCgpIHsKLQkJCQlyZXR1cm4geC5nZXRMYWJlbCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldExhYmVsKChTaW1wbGVOYW1lKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZ2VuZXJpY1Byb3BlcnR5VGVzdCh4LCBuZXcgUHJvcGVydHkoIkJvZHkiLCB0cnVlLCBTdGF0ZW1lbnQuY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCB0YXJnZXRBc3QsIGJvb2xlYW4gcGFyZW50ZWQpIHsKLQkJCQlCbG9jayByZXN1bHQgPSB0YXJnZXRBc3QubmV3QmxvY2soKTsKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJQmxvY2sgYjIgPSB0YXJnZXRBc3QubmV3QmxvY2soKTsKLQkJCQkJYjIuc3RhdGVtZW50cygpLmFkZChyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgd3JhcCgpIHsKLQkJCQkvLyByZXR1cm4gYSBTdGF0ZW1lbnQgdGhhdCBlbWJlZHMgeAotCQkJCUJsb2NrIHMxID0gYXN0Lm5ld0Jsb2NrKCk7Ci0JCQkJczEuc3RhdGVtZW50cygpLmFkZCh4KTsKLQkJCQlyZXR1cm4gczE7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB1bndyYXAoKSB7Ci0JCQkJQmxvY2sgczIgPSAoQmxvY2spIHguZ2V0UGFyZW50KCk7Ci0JCQkJczIuc3RhdGVtZW50cygpLnJlbW92ZSh4KTsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIGdldCgpIHsKLQkJCQlyZXR1cm4geC5nZXRCb2R5KCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzZXQoQVNUTm9kZSB2YWx1ZSkgewotCQkJCXguc2V0Qm9keSgoU3RhdGVtZW50KSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQotCS8qKgotCSAqIFJldHVybnMgYSBzdWJ0cmVlIG9mIHNhbXBsZSBvZiBBU1Qgbm9kZXMuIFRoZSBzYW1wbGUgaW5jbHVkZXMKLQkgKiBvbmUgb2YgZWFjaCBraW5kLCBidXQgb3RoZXJ3aXNlIGRvZXMgbm90IG1ha2Ugc2Vuc2UuCi0JICovCi0JQVNUTm9kZSBvbmVPZkVhY2goQVNUIHRhcmdldCkgewotCQlDb21waWxhdGlvblVuaXQgY3UgPSB0YXJnZXQubmV3Q29tcGlsYXRpb25Vbml0KCk7Ci0JCWN1LnNldFNvdXJjZVJhbmdlKDAsIDEwMDApOwotCQlQYWNrYWdlRGVjbGFyYXRpb24gcGQgPSB0YXJnZXQubmV3UGFja2FnZURlY2xhcmF0aW9uKCk7Ci0JCXBkLnNldFNvdXJjZVJhbmdlKDAsIDUpOwotCQljdS5zZXRQYWNrYWdlKHBkKTsKLQkJCi0JCUltcG9ydERlY2xhcmF0aW9uIGltID0gdGFyZ2V0Lm5ld0ltcG9ydERlY2xhcmF0aW9uKCk7Ci0JCWltLnNldFNvdXJjZVJhbmdlKDYsIDUpOwotCQljdS5pbXBvcnRzKCkuYWRkKGltKTsKLQkJCi0JCVR5cGVEZWNsYXJhdGlvbiB0ZCA9IHRhcmdldC5uZXdUeXBlRGVjbGFyYXRpb24oKTsKLQkJaW0uc2V0U291cmNlUmFuZ2UoMTEsIDkwMCk7Ci0JCUphdmFkb2MgamF2YWRvYyA9IHRhcmdldC5uZXdKYXZhZG9jKCk7Ci0JCWphdmFkb2Muc2V0U291cmNlUmFuZ2UoMTEsIDUpOwotCQl0ZC5zZXRKYXZhZG9jKGphdmFkb2MpOwotCQljdS50eXBlcygpLmFkZCh0ZCk7Ci0JCQotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gdGFyZ2V0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0U291cmNlUmFuZ2UoMTYsIDUpOwotCQlGaWVsZERlY2xhcmF0aW9uIGZkID0gCi0JCQl0YXJnZXQubmV3RmllbGREZWNsYXJhdGlvbih2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpOwotCQlmZC5zZXRTb3VyY2VSYW5nZSgxNiwgNSk7Ci0JCXRkLmJvZHlEZWNsYXJhdGlvbnMoKS5hZGQoZmQpOwkKLQkJCi0JCUluaXRpYWxpemVyIGluID0gdGFyZ2V0Lm5ld0luaXRpYWxpemVyKCk7Ci0JCWluLnNldFNvdXJjZVJhbmdlKDIxLCA1KTsKLQkJdGQuYm9keURlY2xhcmF0aW9ucygpLmFkZChpbik7CQotCQkKLQkJTWV0aG9kRGVjbGFyYXRpb24gbWQgPSB0YXJnZXQubmV3TWV0aG9kRGVjbGFyYXRpb24oKTsKLQkJbWQuc2V0U291cmNlUmFuZ2UoMjYsIDgwMCk7Ci0JCVNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gc2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiA9IHRhcmdldC5uZXdTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKCk7Ci0JCXNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24uc2V0U291cmNlUmFuZ2UoMzAsIDUpOwotCQltZC5wYXJhbWV0ZXJzKCkuYWRkKHNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pOwotCQl0ZC5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKG1kKTsKLQkJCi0JCVNpbXBsZU5hbWUgc24xID0gdGFyZ2V0Lm5ld1NpbXBsZU5hbWUoIm9uZSIpOyAvLyROT04tTkxTLTEkCi0JCXNuMS5zZXRTb3VyY2VSYW5nZSgzNSwgNSk7Ci0JCVNpbXBsZU5hbWUgc24yID10YXJnZXQubmV3U2ltcGxlTmFtZSgidHdvIik7IC8vJE5PTi1OTFMtMSQKLQkJc24yLnNldFNvdXJjZVJhbmdlKDQxLCA1KTsKLQkJUXVhbGlmaWVkTmFtZSBxbiA9IHRhcmdldC5uZXdRdWFsaWZpZWROYW1lKHNuMSwgc24yKTsKLQkJcW4uc2V0U291cmNlUmFuZ2UoMzUsIDExKTsKLQotCQlTaW1wbGVUeXBlIHN0ID0gdGFyZ2V0Lm5ld1NpbXBsZVR5cGUocW4pOwotCQlzdC5zZXRTb3VyY2VSYW5nZSgzNSwgMTEpOwotCQlQcmltaXRpdmVUeXBlIHB0ID0gdGFyZ2V0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5JTlQpOwotCQlwdC5zZXRTb3VyY2VSYW5nZSg0MSwgNSk7Ci0JCUFycmF5VHlwZSBhdCA9IHRhcmdldC5uZXdBcnJheVR5cGUoc3QpOwotCQlhdC5zZXRTb3VyY2VSYW5nZSg0MSwgNyk7Ci0KLQkJbWQuc2V0UmV0dXJuVHlwZShhdCk7Ci0JCWZkLnNldFR5cGUocHQpOwotCQkKLQkJQmxvY2sgYiA9IHRhcmdldC5uZXdCbG9jaygpOwotCQliLnNldFNvdXJjZVJhbmdlKDQ2LCA3MDApOwotCQltZC5zZXRCb2R5KGIpOwotCQkKLQkJLy8gYWxsIHN0YXRlbWVudHMgKGluIGFscGhhYmV0aWMgb3JkZXIgb2Ygc3RhdGVtZW50IHR5cGUpCi0JCUFzc2VydFN0YXRlbWVudCBhc3NlcnRTdGF0ZW1lbnQgPSB0YXJnZXQubmV3QXNzZXJ0U3RhdGVtZW50KCk7Ci0JCWFzc2VydFN0YXRlbWVudC5zZXRTb3VyY2VSYW5nZSg0NiwgNSk7Ci0JCWIuc3RhdGVtZW50cygpLmFkZChhc3NlcnRTdGF0ZW1lbnQpOwotCQlCbG9jayBibG9jayA9IHRhcmdldC5uZXdCbG9jaygpOwotCQlibG9jay5zZXRTb3VyY2VSYW5nZSg1MSwgNSk7Ci0JCWIuc3RhdGVtZW50cygpLmFkZChibG9jayk7Ci0JCUJyZWFrU3RhdGVtZW50IGJyZWFrU3RhdGVtZW50ID0gdGFyZ2V0Lm5ld0JyZWFrU3RhdGVtZW50KCk7Ci0JCWJyZWFrU3RhdGVtZW50LnNldFNvdXJjZVJhbmdlKDU1LCA1KTsKLQkJYi5zdGF0ZW1lbnRzKCkuYWRkKGJyZWFrU3RhdGVtZW50KTsKLQkJQ29udGludWVTdGF0ZW1lbnQgY29udGludWVTdGF0ZW1lbnQgPSB0YXJnZXQubmV3Q29udGludWVTdGF0ZW1lbnQoKTsKLQkJY29udGludWVTdGF0ZW1lbnQuc2V0U291cmNlUmFuZ2UoNjEsIDUpOwotCQliLnN0YXRlbWVudHMoKS5hZGQoY29udGludWVTdGF0ZW1lbnQpOwotCQlDb25zdHJ1Y3Rvckludm9jYXRpb24gY29uc3RydWN0b3JJbnZvY2F0aW9uID0gdGFyZ2V0Lm5ld0NvbnN0cnVjdG9ySW52b2NhdGlvbigpOwotCQljb25zdHJ1Y3Rvckludm9jYXRpb24uc2V0U291cmNlUmFuZ2UoNjUsIDUpOwotCQliLnN0YXRlbWVudHMoKS5hZGQoY29uc3RydWN0b3JJbnZvY2F0aW9uKTsKLQkJRG9TdGF0ZW1lbnQgZG9TdGF0ZW1lbnQgPSB0YXJnZXQubmV3RG9TdGF0ZW1lbnQoKTsKLQkJZG9TdGF0ZW1lbnQuc2V0U291cmNlUmFuZ2UoNzAsIDUpOwotCQliLnN0YXRlbWVudHMoKS5hZGQoZG9TdGF0ZW1lbnQpOwotCQlFbXB0eVN0YXRlbWVudCBlbXB0eVN0YXRlbWVudCA9IHRhcmdldC5uZXdFbXB0eVN0YXRlbWVudCgpOwotCQllbXB0eVN0YXRlbWVudC5zZXRTb3VyY2VSYW5nZSg3NSwgNSk7Ci0JCWIuc3RhdGVtZW50cygpLmFkZChlbXB0eVN0YXRlbWVudCk7Ci0JCU51bGxMaXRlcmFsIG51bGxMaXRlcmFsID0gdGFyZ2V0Lm5ld051bGxMaXRlcmFsKCk7Ci0JCW51bGxMaXRlcmFsLnNldFNvdXJjZVJhbmdlKDgwLCA1KTsKLQkJRXhwcmVzc2lvblN0YXRlbWVudCBleHByZXNzaW9uU3RhdGVtZW50ID0gdGFyZ2V0Lm5ld0V4cHJlc3Npb25TdGF0ZW1lbnQobnVsbExpdGVyYWwpOwotCQlleHByZXNzaW9uU3RhdGVtZW50LnNldFNvdXJjZVJhbmdlKDgwLCA1KTsKLQkJYi5zdGF0ZW1lbnRzKCkuYWRkKGV4cHJlc3Npb25TdGF0ZW1lbnQpOwotCQlGb3JTdGF0ZW1lbnQgZm9yU3RhdGVtZW50ID0gdGFyZ2V0Lm5ld0ZvclN0YXRlbWVudCgpOwotCQlmb3JTdGF0ZW1lbnQuc2V0U291cmNlUmFuZ2UoODYsIDUpOwotCQliLnN0YXRlbWVudHMoKS5hZGQoZm9yU3RhdGVtZW50KTsKLQkJSWZTdGF0ZW1lbnQgaWZTdGF0ZW1lbnQgPSB0YXJnZXQubmV3SWZTdGF0ZW1lbnQoKTsKLQkJaWZTdGF0ZW1lbnQuc2V0U291cmNlUmFuZ2UoOTAsIDUpOwotCQliLnN0YXRlbWVudHMoKS5hZGQoaWZTdGF0ZW1lbnQpOwotCQlMYWJlbGVkU3RhdGVtZW50IGxhYmVsZWRTdGF0ZW1lbnQgPSB0YXJnZXQubmV3TGFiZWxlZFN0YXRlbWVudCgpOwotCQlsYWJlbGVkU3RhdGVtZW50LnNldFNvdXJjZVJhbmdlKDk1LCA1KTsKLQkJYi5zdGF0ZW1lbnRzKCkuYWRkKGxhYmVsZWRTdGF0ZW1lbnQpOwotCQlSZXR1cm5TdGF0ZW1lbnQgcmV0dXJuU3RhdGVtZW50ID0gdGFyZ2V0Lm5ld1JldHVyblN0YXRlbWVudCgpOwotCQlyZXR1cm5TdGF0ZW1lbnQuc2V0U291cmNlUmFuZ2UoMTAwLCA1KTsKLQkJYi5zdGF0ZW1lbnRzKCkuYWRkKHJldHVyblN0YXRlbWVudCk7Ci0JCVN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uIHN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uID0gdGFyZ2V0Lm5ld1N1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uKCk7Ci0JCXN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uLnNldFNvdXJjZVJhbmdlKDEwNSwgNSk7Ci0JCWIuc3RhdGVtZW50cygpLmFkZChzdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbik7Ci0JCVN3aXRjaFN0YXRlbWVudCBzcyA9IHRhcmdldC5uZXdTd2l0Y2hTdGF0ZW1lbnQoKTsKLQkJc3Muc2V0U291cmNlUmFuZ2UoMTEwLCA1KTsKLQkJU3dpdGNoQ2FzZSBzd2l0Y2hDYXNlID0gdGFyZ2V0Lm5ld1N3aXRjaENhc2UoKTsKLQkJc3dpdGNoQ2FzZS5zZXRTb3VyY2VSYW5nZSgxMTAsIDUpOwotCQlzcy5zdGF0ZW1lbnRzKCkuYWRkKHN3aXRjaENhc2UpOwotCQliLnN0YXRlbWVudHMoKS5hZGQoc3MpOwotCQlTd2l0Y2hTdGF0ZW1lbnQgc3dpdGNoU3RhdGVtZW50ID0gdGFyZ2V0Lm5ld1N3aXRjaFN0YXRlbWVudCgpOwotCQlzd2l0Y2hTdGF0ZW1lbnQuc2V0U291cmNlUmFuZ2UoMTE1LCA1KTsKLQkJYi5zdGF0ZW1lbnRzKCkuYWRkKHN3aXRjaFN0YXRlbWVudCk7Ci0JCVN3aXRjaENhc2Ugc3dpdGNoQ2FzZTIgPSB0YXJnZXQubmV3U3dpdGNoQ2FzZSgpOwotCQlzd2l0Y2hDYXNlMi5zZXRTb3VyY2VSYW5nZSgxMjAsIDUpOwotCQliLnN0YXRlbWVudHMoKS5hZGQoc3dpdGNoQ2FzZTIpOwotCQlTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgc3luY2hyb25pemVkU3RhdGVtZW50ID0gdGFyZ2V0Lm5ld1N5bmNocm9uaXplZFN0YXRlbWVudCgpOwotCQlzeW5jaHJvbml6ZWRTdGF0ZW1lbnQuc2V0U291cmNlUmFuZ2UoMTI1LCA1KTsKLQkJYi5zdGF0ZW1lbnRzKCkuYWRkKHN5bmNocm9uaXplZFN0YXRlbWVudCk7Ci0JCVRocm93U3RhdGVtZW50IHRocm93U3RhdGVtZW50ID0gdGFyZ2V0Lm5ld1Rocm93U3RhdGVtZW50KCk7Ci0JCXRocm93U3RhdGVtZW50LnNldFNvdXJjZVJhbmdlKDEzMCwgNSk7Ci0JCWIuc3RhdGVtZW50cygpLmFkZCh0aHJvd1N0YXRlbWVudCk7Ci0JCVRyeVN0YXRlbWVudCB0ciA9IHRhcmdldC5uZXdUcnlTdGF0ZW1lbnQoKTsKLQkJdHIuc2V0U291cmNlUmFuZ2UoMTM1LCA1KTsKLQkJQ2F0Y2hDbGF1c2UgY2F0Y2hDbGF1c2UgPSB0YXJnZXQubmV3Q2F0Y2hDbGF1c2UoKTsKLQkJY2F0Y2hDbGF1c2Uuc2V0U291cmNlUmFuZ2UoMTM1LCA1KTsKLQkJCXRyLmNhdGNoQ2xhdXNlcygpLmFkZChjYXRjaENsYXVzZSk7Ci0JCQliLnN0YXRlbWVudHMoKS5hZGQodHIpOwotCQkKLQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IHRhcmdldC5uZXdUeXBlRGVjbGFyYXRpb24oKTsKLQkJdHlwZURlY2xhcmF0aW9uLnNldFNvdXJjZVJhbmdlKDE0MCwgNSk7Ci0JCVR5cGVEZWNsYXJhdGlvblN0YXRlbWVudCB0eXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQgPSB0YXJnZXQubmV3VHlwZURlY2xhcmF0aW9uU3RhdGVtZW50KHR5cGVEZWNsYXJhdGlvbik7Ci0JCXR5cGVEZWNsYXJhdGlvblN0YXRlbWVudC5zZXRTb3VyY2VSYW5nZSgxNDAsIDYpOwotCQliLnN0YXRlbWVudHMoKS5hZGQodHlwZURlY2xhcmF0aW9uU3RhdGVtZW50KTsKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDIgPSB0YXJnZXQubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDIuc2V0U291cmNlUmFuZ2UoMTUwLCA1KTsKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50ID0gdGFyZ2V0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQodmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50Mik7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuc2V0U291cmNlUmFuZ2UoMTUwLCA2KTsKLQkJYi5zdGF0ZW1lbnRzKCkuYWRkKHZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpOwotCQlXaGlsZVN0YXRlbWVudCB3aGlsZVN0YXRlbWVudCA9IHRhcmdldC5uZXdXaGlsZVN0YXRlbWVudCgpOwotCQl3aGlsZVN0YXRlbWVudC5zZXRTb3VyY2VSYW5nZSgxNTUsIDUpOwotCQliLnN0YXRlbWVudHMoKS5hZGQod2hpbGVTdGF0ZW1lbnQpOwotCi0JCS8vIGFsbCBleHByZXNzaW9ucyAoaW4gYWxwaGFiZXRpYyBvcmRlciBvZiBleHByZXNzaW9ucyB0eXBlKQotCQlNZXRob2RJbnZvY2F0aW9uIGludiA9IHRhcmdldC5uZXdNZXRob2RJbnZvY2F0aW9uKCk7Ci0JCWludi5zZXRTb3VyY2VSYW5nZSgyMDAsIDMwMCk7Ci0JCUV4cHJlc3Npb25TdGF0ZW1lbnQgZXhwcmVzc2lvblN0YXRlbWVudDIgPSB0YXJnZXQubmV3RXhwcmVzc2lvblN0YXRlbWVudChpbnYpOwotCQlleHByZXNzaW9uU3RhdGVtZW50Mi5zZXRTb3VyY2VSYW5nZSg0MDAsIDUpOwotCQliLnN0YXRlbWVudHMoKS5hZGQoZXhwcmVzc2lvblN0YXRlbWVudDIpOwotCQlMaXN0IHogPSBpbnYuYXJndW1lbnRzKCk7Ci0JCUFycmF5QWNjZXNzIGFycmF5QWNjZXNzID0gdGFyZ2V0Lm5ld0FycmF5QWNjZXNzKCk7Ci0JCWFycmF5QWNjZXNzLnNldFNvdXJjZVJhbmdlKDIwMCwgNSk7Ci0JCXouYWRkKGFycmF5QWNjZXNzKTsKLQkJQXJyYXlDcmVhdGlvbiBhcnJheUNyZWF0aW9uID0gdGFyZ2V0Lm5ld0FycmF5Q3JlYXRpb24oKTsKLQkJYXJyYXlDcmVhdGlvbi5zZXRTb3VyY2VSYW5nZSgyMTAsIDUpOwotCQl6LmFkZChhcnJheUNyZWF0aW9uKTsKLQkJQXJyYXlJbml0aWFsaXplciBhcnJheUluaXRpYWxpemVyID0gdGFyZ2V0Lm5ld0FycmF5SW5pdGlhbGl6ZXIoKTsKLQkJYXJyYXlJbml0aWFsaXplci5zZXRTb3VyY2VSYW5nZSgyMjAsIDUpOwotCQl6LmFkZChhcnJheUluaXRpYWxpemVyKTsKLQkJQXNzaWdubWVudCBhc3NpZ25tZW50ID0gdGFyZ2V0Lm5ld0Fzc2lnbm1lbnQoKTsKLQkJYXNzaWdubWVudC5zZXRTb3VyY2VSYW5nZSgyMzAsIDUpOwotCQl6LmFkZChhc3NpZ25tZW50KTsKLQkJQm9vbGVhbkxpdGVyYWwgYm9vbGVhbkxpdGVyYWwgPSB0YXJnZXQubmV3Qm9vbGVhbkxpdGVyYWwodHJ1ZSk7Ci0JCWJvb2xlYW5MaXRlcmFsLnNldFNvdXJjZVJhbmdlKDI0MCwgNSk7Ci0JCXouYWRkKGJvb2xlYW5MaXRlcmFsKTsKLQkJQ2FzdEV4cHJlc3Npb24gY2FzdEV4cHJlc3Npb24gPSB0YXJnZXQubmV3Q2FzdEV4cHJlc3Npb24oKTsKLQkJY2FzdEV4cHJlc3Npb24uc2V0U291cmNlUmFuZ2UoMjUwLCA1KTsKLQkJei5hZGQoY2FzdEV4cHJlc3Npb24pOwotCQlDaGFyYWN0ZXJMaXRlcmFsIGNoYXJhY3RlckxpdGVyYWwgPSB0YXJnZXQubmV3Q2hhcmFjdGVyTGl0ZXJhbCgpOwotCQljaGFyYWN0ZXJMaXRlcmFsLnNldFNvdXJjZVJhbmdlKDI2MCwgNSk7Ci0JCXouYWRkKGNoYXJhY3RlckxpdGVyYWwpOwotCQlDbGFzc0luc3RhbmNlQ3JlYXRpb24gY2ljID0gdGFyZ2V0Lm5ld0NsYXNzSW5zdGFuY2VDcmVhdGlvbigpOwotCQljaWMuc2V0U291cmNlUmFuZ2UoMjcwLCA5KTsKLQkJQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBhbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uID0gdGFyZ2V0Lm5ld0Fub255bW91c0NsYXNzRGVjbGFyYXRpb24oKTsKLQkJYW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5zZXRTb3VyY2VSYW5nZSgyNzAsIDUpOwotCQljaWMuc2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbihhbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKTsKLQkJei5hZGQoY2ljKTsKLQkJQ29uZGl0aW9uYWxFeHByZXNzaW9uIGNvbmRpdGlvbmFsRXhwcmVzc2lvbiA9IHRhcmdldC5uZXdDb25kaXRpb25hbEV4cHJlc3Npb24oKTsKLQkJY29uZGl0aW9uYWxFeHByZXNzaW9uLnNldFNvdXJjZVJhbmdlKDI4MCwgNSk7Ci0JCXouYWRkKGNvbmRpdGlvbmFsRXhwcmVzc2lvbik7Ci0JCUZpZWxkQWNjZXNzIGZpZWxkQWNjZXNzID0gdGFyZ2V0Lm5ld0ZpZWxkQWNjZXNzKCk7Ci0JCWZpZWxkQWNjZXNzLnNldFNvdXJjZVJhbmdlKDI5MCwgNSk7Ci0JCXouYWRkKGZpZWxkQWNjZXNzKTsKLQkJSW5maXhFeHByZXNzaW9uIGluZml4RXhwcmVzc2lvbiA9IHRhcmdldC5uZXdJbmZpeEV4cHJlc3Npb24oKTsKLQkJaW5maXhFeHByZXNzaW9uLnNldFNvdXJjZVJhbmdlKDMwMCwgNSk7Ci0JCXouYWRkKGluZml4RXhwcmVzc2lvbik7Ci0JCUluc3RhbmNlb2ZFeHByZXNzaW9uIGluc3RhbmNlb2ZFeHByZXNzaW9uID0gdGFyZ2V0Lm5ld0luc3RhbmNlb2ZFeHByZXNzaW9uKCk7Ci0JCWluc3RhbmNlb2ZFeHByZXNzaW9uLnNldFNvdXJjZVJhbmdlKDMxMCwgNSk7Ci0JCXouYWRkKGluc3RhbmNlb2ZFeHByZXNzaW9uKTsKLQkJTWV0aG9kSW52b2NhdGlvbiBtZXRob2RJbnZvY2F0aW9uID0gdGFyZ2V0Lm5ld01ldGhvZEludm9jYXRpb24oKTsKLQkJbWV0aG9kSW52b2NhdGlvbi5zZXRTb3VyY2VSYW5nZSgzMjAsIDUpOwotCQl6LmFkZChtZXRob2RJbnZvY2F0aW9uKTsKLQkJTmFtZSBuYW1lID0gdGFyZ2V0Lm5ld05hbWUobmV3IFN0cmluZ1tdeyJhIiwgImIifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQluYW1lLnNldFNvdXJjZVJhbmdlKDMzMCwgNSk7Ci0JCXouYWRkKG5hbWUpOwotCQlOdWxsTGl0ZXJhbCBudWxsTGl0ZXJhbDIgPSB0YXJnZXQubmV3TnVsbExpdGVyYWwoKTsKLQkJbnVsbExpdGVyYWwyLnNldFNvdXJjZVJhbmdlKDMzNiwgMyk7Ci0JCXouYWRkKG51bGxMaXRlcmFsMik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IHRhcmdldC5uZXdOdW1iZXJMaXRlcmFsKCIxMDI0Iik7IC8vJE5PTi1OTFMtMSQKLQkJbnVtYmVyTGl0ZXJhbC5zZXRTb3VyY2VSYW5nZSgzNDAsIDUpOwotCQl6LmFkZChudW1iZXJMaXRlcmFsKTsKLQkJUGFyZW50aGVzaXplZEV4cHJlc3Npb24gcGFyZW50aGVzaXplZEV4cHJlc3Npb24gPSB0YXJnZXQubmV3UGFyZW50aGVzaXplZEV4cHJlc3Npb24oKTsKLQkJcGFyZW50aGVzaXplZEV4cHJlc3Npb24uc2V0U291cmNlUmFuZ2UoMzUwLCA1KTsKLQkJei5hZGQocGFyZW50aGVzaXplZEV4cHJlc3Npb24pOwotCQlQb3N0Zml4RXhwcmVzc2lvbiBwb3N0Zml4RXhwcmVzc2lvbiA9IHRhcmdldC5uZXdQb3N0Zml4RXhwcmVzc2lvbigpOwotCQlwb3N0Zml4RXhwcmVzc2lvbi5zZXRTb3VyY2VSYW5nZSgzNjAsIDUpOwotCQl6LmFkZChwb3N0Zml4RXhwcmVzc2lvbik7Ci0JCVByZWZpeEV4cHJlc3Npb24gcHJlZml4RXhwcmVzc2lvbiA9IHRhcmdldC5uZXdQcmVmaXhFeHByZXNzaW9uKCk7Ci0JCXByZWZpeEV4cHJlc3Npb24uc2V0U291cmNlUmFuZ2UoMzcwLCA1KTsKLQkJei5hZGQocHJlZml4RXhwcmVzc2lvbik7Ci0JCVN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCA9IHRhcmdldC5uZXdTdHJpbmdMaXRlcmFsKCk7Ci0JCXN0cmluZ0xpdGVyYWwuc2V0U291cmNlUmFuZ2UoMzgwLCA1KTsKLQkJei5hZGQoc3RyaW5nTGl0ZXJhbCk7Ci0JCVN1cGVyRmllbGRBY2Nlc3Mgc3VwZXJGaWVsZEFjY2VzcyA9IHRhcmdldC5uZXdTdXBlckZpZWxkQWNjZXNzKCk7Ci0JCXN1cGVyRmllbGRBY2Nlc3Muc2V0U291cmNlUmFuZ2UoMzkwLCA1KTsKLQkJei5hZGQoc3VwZXJGaWVsZEFjY2Vzcyk7Ci0JCVN1cGVyTWV0aG9kSW52b2NhdGlvbiBzdXBlck1ldGhvZEludm9jYXRpb24gPSB0YXJnZXQubmV3U3VwZXJNZXRob2RJbnZvY2F0aW9uKCk7Ci0JCXN1cGVyTWV0aG9kSW52b2NhdGlvbi5zZXRTb3VyY2VSYW5nZSg0MDAsIDUpOwotCQl6LmFkZChzdXBlck1ldGhvZEludm9jYXRpb24pOwotCQlUaGlzRXhwcmVzc2lvbiB0aGlzRXhwcmVzc2lvbiA9IHRhcmdldC5uZXdUaGlzRXhwcmVzc2lvbigpOwotCQl0aGlzRXhwcmVzc2lvbi5zZXRTb3VyY2VSYW5nZSg0MTAsIDYpOwotCQl6LmFkZCh0aGlzRXhwcmVzc2lvbik7Ci0JCVR5cGVMaXRlcmFsIHR5cGVMaXRlcmFsID0gdGFyZ2V0Lm5ld1R5cGVMaXRlcmFsKCk7Ci0JCXR5cGVMaXRlcmFsLnNldFNvdXJjZVJhbmdlKDQyMCwgNSk7Ci0JCXouYWRkKHR5cGVMaXRlcmFsKTsKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDMgPSB0YXJnZXQubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDMuc2V0U291cmNlUmFuZ2UoNDMwLCA1KTsKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gdmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gPSB0YXJnZXQubmV3VmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24odmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50Myk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uLnNldFNvdXJjZVJhbmdlKDQzMCwgNSk7Ci0JCXouYWRkKHZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKTsKLQotCQlBU1ROb2RlIGNsb25lID0gQVNUTm9kZS5jb3B5U3VidHJlZShhc3QsIGN1KTsKLQkJYXNzZXJ0VHJ1ZShjdS5zdWJ0cmVlTWF0Y2gobmV3IENoZWNrUG9zaXRpb25zTWF0Y2hlcigpLCBjbG9uZSkpOwotCQkKLQkJcmV0dXJuIGN1OwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdENsb25lKCkgewotCQlBU1ROb2RlIHggPSBvbmVPZkVhY2goYXN0KTsKLQkJYXNzZXJ0VHJ1ZSh4LnN1YnRyZWVNYXRjaChuZXcgQ2hlY2tQb3NpdGlvbnNNYXRjaGVyKCksIHgpKTsKLQkJCi0JCS8vIHNhbWUgQVNUIGNsb25lCi0JCUFTVE5vZGUgeSA9IEFTVE5vZGUuY29weVN1YnRyZWUoYXN0LCB4KTsKLQkJYXNzZXJ0VHJ1ZSh4LnN1YnRyZWVNYXRjaChuZXcgQ2hlY2tQb3NpdGlvbnNNYXRjaGVyKCksIHkpKTsKLQkJYXNzZXJ0VHJ1ZSh5LnN1YnRyZWVNYXRjaChuZXcgQ2hlY2tQb3NpdGlvbnNNYXRjaGVyKCksIHgpKTsKLQkJCi0JCS8vIGRpZmZlcmVudCBBU1QgY2xvbmUKLQkJQVNUTm9kZSB6ID0gQVNUTm9kZS5jb3B5U3VidHJlZShuZXcgQVNUKCksIHgpOwotCQlhc3NlcnRUcnVlKHguc3VidHJlZU1hdGNoKG5ldyBDaGVja1Bvc2l0aW9uc01hdGNoZXIoKSwgeikpOwotCQlhc3NlcnRUcnVlKHouc3VidHJlZU1hdGNoKG5ldyBDaGVja1Bvc2l0aW9uc01hdGNoZXIoKSwgeCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsUmVzb2x2ZSgpIHsKLQkJQVNUTm9kZSB4ID0gb25lT2ZFYWNoKGFzdCk7Ci0JCQotCQlBU1RWaXNpdG9yIHYgPSBuZXcgQVNUVmlzaXRvcigpIHsKLQkJCS8vIE5BTUVTCi0KLQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KFNpbXBsZU5hbWUgbm9kZSkgewotCQkJCWFzc2VydFRydWUobm9kZS5yZXNvbHZlQmluZGluZygpID09IG51bGwpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoUXVhbGlmaWVkTmFtZSBub2RlKSB7Ci0JCQkJYXNzZXJ0VHJ1ZShub2RlLnJlc29sdmVCaW5kaW5nKCkgPT0gbnVsbCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCS8vIFRZUEVTCi0JCi0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTaW1wbGVUeXBlIG5vZGUpIHsKLQkJCQlhc3NlcnRUcnVlKG5vZGUucmVzb2x2ZUJpbmRpbmcoKSA9PSBudWxsKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KEFycmF5VHlwZSBub2RlKSB7Ci0JCQkJYXNzZXJ0VHJ1ZShub2RlLnJlc29sdmVCaW5kaW5nKCkgPT0gbnVsbCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQcmltaXRpdmVUeXBlIG5vZGUpIHsKLQkJCQlhc3NlcnRUcnVlKG5vZGUucmVzb2x2ZUJpbmRpbmcoKSA9PSBudWxsKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkKLQkJCS8vIEVYUFJFU1NJT05TCi0JCi0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChBc3NpZ25tZW50IG5vZGUpIHsKLQkJCQlhc3NlcnRUcnVlKG5vZGUucmVzb2x2ZVR5cGVCaW5kaW5nKCkgPT0gbnVsbCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChDbGFzc0luc3RhbmNlQ3JlYXRpb24gbm9kZSkgewotCQkJCWFzc2VydFRydWUobm9kZS5yZXNvbHZlQ29uc3RydWN0b3JCaW5kaW5nKCkgPT0gbnVsbCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgewotCQkJCWFzc2VydFRydWUobm9kZS5yZXNvbHZlQ29uc3RydWN0b3JCaW5kaW5nKCkgPT0gbnVsbCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7Ci0JCQkJYXNzZXJ0VHJ1ZShub2RlLnJlc29sdmVDb25zdHJ1Y3RvckJpbmRpbmcoKSA9PSBudWxsKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkKLQkJCS8vIE1BSk9SIERFQ0xBUkFUSU9OUwotCQotCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoUGFja2FnZURlY2xhcmF0aW9uIG5vZGUpIHsKLQkJCQlhc3NlcnRUcnVlKG5vZGUucmVzb2x2ZUJpbmRpbmcoKSA9PSBudWxsKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KEltcG9ydERlY2xhcmF0aW9uIG5vZGUpIHsKLQkJCQlhc3NlcnRUcnVlKG5vZGUucmVzb2x2ZUJpbmRpbmcoKSA9PSBudWxsKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KE1ldGhvZERlY2xhcmF0aW9uIG5vZGUpIHsKLQkJCQlhc3NlcnRUcnVlKG5vZGUucmVzb2x2ZUJpbmRpbmcoKSA9PSBudWxsKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KFR5cGVEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCQkJYXNzZXJ0VHJ1ZShub2RlLnJlc29sdmVCaW5kaW5nKCkgPT0gbnVsbCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQgbm9kZSkgewotCQkJCWFzc2VydFRydWUobm9kZS5yZXNvbHZlQmluZGluZygpID09IG51bGwpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCQkJYXNzZXJ0VHJ1ZShub2RlLnJlc29sdmVCaW5kaW5nKCkgPT0gbnVsbCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgbm9kZSkgewotCQkJCWFzc2VydFRydWUobm9kZS5yZXNvbHZlQmluZGluZygpID09IG51bGwpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9OwotCQkKLQkJeC5hY2NlcHQodik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZvclN0YXRlbWVudCgpIHsKLQkJbG9uZyBwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWZpbmFsIEZvclN0YXRlbWVudCB4ID0gYXN0Lm5ld0ZvclN0YXRlbWVudCgpOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJYXNzZXJ0VHJ1ZSh4IGluc3RhbmNlb2YgU3RhdGVtZW50KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEFTVCgpID09IGFzdCk7Ci0JCWFzc2VydFRydWUoeC5nZXRQYXJlbnQoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmluaXRpYWxpemVycygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoeC5nZXRFeHByZXNzaW9uKCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC51cGRhdGVycygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoeC5nZXRCb2R5KCkuZ2V0UGFyZW50KCkgPT0geCk7Ci0JCWFzc2VydFRydWUoeC5nZXRCb2R5KCkgaW5zdGFuY2VvZiBCbG9jayk7Ci0JCWFzc2VydFRydWUoKChCbG9jaykgeC5nZXRCb2R5KCkpLnN0YXRlbWVudHMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHguZ2V0TGVhZGluZ0NvbW1lbnQoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5GT1JfU1RBVEVNRU5UKTsKLQkJLy8gbWFrZSBzdXJlIHRoYXQgcmVhZGluZyBkaWQgbm90IGNoYW5nZSBtb2RpZmljYXRpb24gY291bnQKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA9PSBwcmV2aW91c0NvdW50KTsKLQotCQl0TGVhZGluZ0NvbW1lbnQoeCk7Ci0JCQotCQlnZW5lcmljUHJvcGVydHlMaXN0VGVzdCh4LCB4LmluaXRpYWxpemVycygpLAotCQkgIG5ldyBQcm9wZXJ0eSgiSW5pdGlhbGl6ZXJzIiwgdHJ1ZSwgRXhwcmVzc2lvbi5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCVNpbXBsZU5hbWUgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld1NpbXBsZU5hbWUoImZvbyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCXRhcmdldEFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJCS8vIHJldHVybiBFeHByZXNzaW9uIHRoYXQgZW1iZWRzIHgKLQkJCQlDbGFzc0luc3RhbmNlQ3JlYXRpb24gczEgPSBhc3QubmV3Q2xhc3NJbnN0YW5jZUNyZWF0aW9uKCk7Ci0JCQkJQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBhMSA9IGFzdC5uZXdBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCk7Ci0JCQkJczEuc2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbihhMSk7Ci0JCQkJTWV0aG9kRGVjbGFyYXRpb24gczIgPSBhc3QubmV3TWV0aG9kRGVjbGFyYXRpb24oKTsKLQkJCQlhMS5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKHMyKTsKLQkJCQlCbG9jayBzMyA9IGFzdC5uZXdCbG9jaygpOwotCQkJCXMyLnNldEJvZHkoczMpOwotCQkJCXMzLnN0YXRlbWVudHMoKS5hZGQoeCk7Ci0JCQkJcmV0dXJuIHMxOwotCQkJfQotCQkJcHVibGljIHZvaWQgdW53cmFwKCkgewotCQkJCUJsb2NrIHMzID0gKEJsb2NrKSB4LmdldFBhcmVudCgpOwotCQkJCXMzLnN0YXRlbWVudHMoKS5yZW1vdmUoeCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJFeHByZXNzaW9uIiwgZmFsc2UsIEV4cHJlc3Npb24uY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCBsb2NhbEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCUV4cHJlc3Npb24gcmVzdWx0ID0gbG9jYWxBc3QubmV3U2ltcGxlTmFtZSgiZm9vIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJbG9jYWxBc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgd3JhcCgpIHsKLQkJCQkvLyByZXR1cm4gRXhwcmVzc2lvbiB0aGF0IGVtYmVkcyB4Ci0JCQkJQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIHMxID0gYXN0Lm5ld0NsYXNzSW5zdGFuY2VDcmVhdGlvbigpOwotCQkJCUFub255bW91c0NsYXNzRGVjbGFyYXRpb24gYTEgPSBhc3QubmV3QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpOwotCQkJCXMxLnNldEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oYTEpOwotCQkJCU1ldGhvZERlY2xhcmF0aW9uIHMyID0gYXN0Lm5ld01ldGhvZERlY2xhcmF0aW9uKCk7Ci0JCQkJYTEuYm9keURlY2xhcmF0aW9ucygpLmFkZChzMik7Ci0JCQkJQmxvY2sgczMgPSBhc3QubmV3QmxvY2soKTsKLQkJCQlzMi5zZXRCb2R5KHMzKTsKLQkJCQlzMy5zdGF0ZW1lbnRzKCkuYWRkKHgpOwotCQkJCXJldHVybiBzMTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHVud3JhcCgpIHsKLQkJCQlCbG9jayBzMyA9IChCbG9jaykgeC5nZXRQYXJlbnQoKTsKLQkJCQlzMy5zdGF0ZW1lbnRzKCkucmVtb3ZlKHgpOwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldEV4cHJlc3Npb24oKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXRFeHByZXNzaW9uKChFeHByZXNzaW9uKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWdlbmVyaWNQcm9wZXJ0eUxpc3RUZXN0KHgsIHgudXBkYXRlcnMoKSwKLQkJICBuZXcgUHJvcGVydHkoIlVwZGF0ZXJzIiwgdHJ1ZSwgRXhwcmVzc2lvbi5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCVNpbXBsZU5hbWUgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld1NpbXBsZU5hbWUoImZvbyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCXRhcmdldEFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJCS8vIHJldHVybiBFeHByZXNzaW9uIHRoYXQgZW1iZWRzIHgKLQkJCQlDbGFzc0luc3RhbmNlQ3JlYXRpb24gczEgPSBhc3QubmV3Q2xhc3NJbnN0YW5jZUNyZWF0aW9uKCk7Ci0JCQkJQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBhMSA9IGFzdC5uZXdBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCk7Ci0JCQkJczEuc2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbihhMSk7Ci0JCQkJTWV0aG9kRGVjbGFyYXRpb24gczIgPSBhc3QubmV3TWV0aG9kRGVjbGFyYXRpb24oKTsKLQkJCQlhMS5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKHMyKTsKLQkJCQlCbG9jayBzMyA9IGFzdC5uZXdCbG9jaygpOwotCQkJCXMyLnNldEJvZHkoczMpOwotCQkJCXMzLnN0YXRlbWVudHMoKS5hZGQoeCk7Ci0JCQkJcmV0dXJuIHMxOwotCQkJfQotCQkJcHVibGljIHZvaWQgdW53cmFwKCkgewotCQkJCUJsb2NrIHMzID0gKEJsb2NrKSB4LmdldFBhcmVudCgpOwotCQkJCXMzLnN0YXRlbWVudHMoKS5yZW1vdmUoeCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJCb2R5IiwgdHJ1ZSwgU3RhdGVtZW50LmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgdGFyZ2V0QXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJQmxvY2sgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld0Jsb2NrKCk7Ci0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCUJsb2NrIGIyID0gdGFyZ2V0QXN0Lm5ld0Jsb2NrKCk7Ci0JCQkJCWIyLnN0YXRlbWVudHMoKS5hZGQocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIHdyYXAoKSB7Ci0JCQkJLy8gcmV0dXJuIGEgU3RhdGVtZW50IHRoYXQgZW1iZWRzIHgKLQkJCQlCbG9jayBzMSA9IGFzdC5uZXdCbG9jaygpOwotCQkJCXMxLnN0YXRlbWVudHMoKS5hZGQoeCk7Ci0JCQkJcmV0dXJuIHMxOwotCQkJfQotCQkJcHVibGljIHZvaWQgdW53cmFwKCkgewotCQkJCUJsb2NrIHMyID0gKEJsb2NrKSB4LmdldFBhcmVudCgpOwotCQkJCXMyLnN0YXRlbWVudHMoKS5yZW1vdmUoeCk7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0Qm9keSgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldEJvZHkoKFN0YXRlbWVudCkgdmFsdWUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JJbnZvY2F0aW9uKCkgewotCQlsb25nIHByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJZmluYWwgQ29uc3RydWN0b3JJbnZvY2F0aW9uIHggPSBhc3QubmV3Q29uc3RydWN0b3JJbnZvY2F0aW9uKCk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlhc3NlcnRUcnVlKHggaW5zdGFuY2VvZiBTdGF0ZW1lbnQpOwotCQlhc3NlcnRUcnVlKHguZ2V0QVNUKCkgPT0gYXN0KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFBhcmVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguYXJndW1lbnRzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5DT05TVFJVQ1RPUl9JTlZPQ0FUSU9OKTsKLQkJLy8gbWFrZSBzdXJlIHRoYXQgcmVhZGluZyBkaWQgbm90IGNoYW5nZSBtb2RpZmljYXRpb24gY291bnQKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA9PSBwcmV2aW91c0NvdW50KTsKLQkJCi0JCWdlbmVyaWNQcm9wZXJ0eUxpc3RUZXN0KHgsIHguYXJndW1lbnRzKCksCi0JCSAgbmV3IFByb3BlcnR5KCJBcmd1bWVudHMiLCB0cnVlLCBFeHByZXNzaW9uLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgdGFyZ2V0QXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJU2ltcGxlTmFtZSByZXN1bHQgPSB0YXJnZXRBc3QubmV3U2ltcGxlTmFtZSgiZm9vIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJdGFyZ2V0QXN0Lm5ld0V4cHJlc3Npb25TdGF0ZW1lbnQocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIHdyYXAoKSB7Ci0JCQkJLy8gcmV0dXJuIEV4cHJlc3Npb24gdGhhdCBlbWJlZHMgeAotCQkJCUNsYXNzSW5zdGFuY2VDcmVhdGlvbiBzMSA9IGFzdC5uZXdDbGFzc0luc3RhbmNlQ3JlYXRpb24oKTsKLQkJCQlBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIGExID0gYXN0Lm5ld0Fub255bW91c0NsYXNzRGVjbGFyYXRpb24oKTsKLQkJCQlzMS5zZXRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKGExKTsKLQkJCQlNZXRob2REZWNsYXJhdGlvbiBzMiA9IGFzdC5uZXdNZXRob2REZWNsYXJhdGlvbigpOwotCQkJCWExLmJvZHlEZWNsYXJhdGlvbnMoKS5hZGQoczIpOwotCQkJCUJsb2NrIHMzID0gYXN0Lm5ld0Jsb2NrKCk7Ci0JCQkJczIuc2V0Qm9keShzMyk7Ci0JCQkJczMuc3RhdGVtZW50cygpLmFkZCh4KTsKLQkJCQlyZXR1cm4gczE7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB1bndyYXAoKSB7Ci0JCQkJQmxvY2sgczMgPSAoQmxvY2spIHguZ2V0UGFyZW50KCk7Ci0JCQkJczMuc3RhdGVtZW50cygpLnJlbW92ZSh4KTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uKCkgewotCQlsb25nIHByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJZmluYWwgU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24geCA9IGFzdC5uZXdTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbigpOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJYXNzZXJ0VHJ1ZSh4IGluc3RhbmNlb2YgU3RhdGVtZW50KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEFTVCgpID09IGFzdCk7Ci0JCWFzc2VydFRydWUoeC5nZXRQYXJlbnQoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEV4cHJlc3Npb24oKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmFyZ3VtZW50cygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoeC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuU1VQRVJfQ09OU1RSVUNUT1JfSU5WT0NBVElPTik7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHJlYWRpbmcgZGlkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGNvdW50Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0JCQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiRXhwcmVzc2lvbiIsIGZhbHNlLCBFeHByZXNzaW9uLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgdGFyZ2V0QXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJU2ltcGxlTmFtZSByZXN1bHQgPSB0YXJnZXRBc3QubmV3U2ltcGxlTmFtZSgiZm9vIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJdGFyZ2V0QXN0Lm5ld0V4cHJlc3Npb25TdGF0ZW1lbnQocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIHdyYXAoKSB7Ci0JCQkJLy8gcmV0dXJuIEV4cHJlc3Npb24gdGhhdCBlbWJlZHMgeAotCQkJCUNsYXNzSW5zdGFuY2VDcmVhdGlvbiBzMSA9IGFzdC5uZXdDbGFzc0luc3RhbmNlQ3JlYXRpb24oKTsKLQkJCQlBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIGExID0gYXN0Lm5ld0Fub255bW91c0NsYXNzRGVjbGFyYXRpb24oKTsKLQkJCQlzMS5zZXRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKGExKTsKLQkJCQlNZXRob2REZWNsYXJhdGlvbiBzMiA9IGFzdC5uZXdNZXRob2REZWNsYXJhdGlvbigpOwotCQkJCWExLmJvZHlEZWNsYXJhdGlvbnMoKS5hZGQoczIpOwotCQkJCUJsb2NrIHMzID0gYXN0Lm5ld0Jsb2NrKCk7Ci0JCQkJczIuc2V0Qm9keShzMyk7Ci0JCQkJczMuc3RhdGVtZW50cygpLmFkZCh4KTsKLQkJCQlyZXR1cm4gczE7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB1bndyYXAoKSB7Ci0JCQkJQmxvY2sgczMgPSAoQmxvY2spIHguZ2V0UGFyZW50KCk7Ci0JCQkJczMuc3RhdGVtZW50cygpLnJlbW92ZSh4KTsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIGdldCgpIHsKLQkJCQlyZXR1cm4geC5nZXRFeHByZXNzaW9uKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzZXQoQVNUTm9kZSB2YWx1ZSkgewotCQkJCXguc2V0RXhwcmVzc2lvbigoRXhwcmVzc2lvbikgdmFsdWUpOwotCQkJfQotCQl9KTsKLQotCQlnZW5lcmljUHJvcGVydHlMaXN0VGVzdCh4LCB4LmFyZ3VtZW50cygpLAotCQkgIG5ldyBQcm9wZXJ0eSgiQXJndW1lbnRzIiwgdHJ1ZSwgRXhwcmVzc2lvbi5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCVNpbXBsZU5hbWUgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld1NpbXBsZU5hbWUoImZvbyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCXRhcmdldEFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJCS8vIHJldHVybiBFeHByZXNzaW9uIHRoYXQgZW1iZWRzIHgKLQkJCQlDbGFzc0luc3RhbmNlQ3JlYXRpb24gczEgPSBhc3QubmV3Q2xhc3NJbnN0YW5jZUNyZWF0aW9uKCk7Ci0JCQkJQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBhMSA9IGFzdC5uZXdBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCk7Ci0JCQkJczEuc2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbihhMSk7Ci0JCQkJTWV0aG9kRGVjbGFyYXRpb24gczIgPSBhc3QubmV3TWV0aG9kRGVjbGFyYXRpb24oKTsKLQkJCQlhMS5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKHMyKTsKLQkJCQlCbG9jayBzMyA9IGFzdC5uZXdCbG9jaygpOwotCQkJCXMyLnNldEJvZHkoczMpOwotCQkJCXMzLnN0YXRlbWVudHMoKS5hZGQoeCk7Ci0JCQkJcmV0dXJuIHMxOwotCQkJfQotCQkJcHVibGljIHZvaWQgdW53cmFwKCkgewotCQkJCUJsb2NrIHMzID0gKEJsb2NrKSB4LmdldFBhcmVudCgpOwotCQkJCXMzLnN0YXRlbWVudHMoKS5yZW1vdmUoeCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUaGlzRXhwcmVzc2lvbigpIHsKLQkJbG9uZyBwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWZpbmFsIFRoaXNFeHByZXNzaW9uIHggPSBhc3QubmV3VGhpc0V4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWFzc2VydFRydWUoeCBpbnN0YW5jZW9mIEV4cHJlc3Npb24pOwotCQlhc3NlcnRUcnVlKHguZ2V0QVNUKCkgPT0gYXN0KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFBhcmVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0UXVhbGlmaWVyKCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuVEhJU19FWFBSRVNTSU9OKTsKLQkJLy8gbWFrZSBzdXJlIHRoYXQgcmVhZGluZyBkaWQgbm90IGNoYW5nZSBtb2RpZmljYXRpb24gY291bnQKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA9PSBwcmV2aW91c0NvdW50KTsKLQkJCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJRdWFsaWZpZXIiLCBmYWxzZSwgTmFtZS5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCVF1YWxpZmllZE5hbWUgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld1F1YWxpZmllZE5hbWUoCi0JCQkJCXRhcmdldEFzdC5uZXdTaW1wbGVOYW1lKCJhIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJdGFyZ2V0QXN0Lm5ld1NpbXBsZU5hbWUoImIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJdGFyZ2V0QXN0Lm5ld0V4cHJlc3Npb25TdGF0ZW1lbnQocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIGdldCgpIHsKLQkJCQlyZXR1cm4geC5nZXRRdWFsaWZpZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXRRdWFsaWZpZXIoKE5hbWUpIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpZWxkQWNjZXNzKCkgewotCQlsb25nIHByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJZmluYWwgRmllbGRBY2Nlc3MgeCA9IGFzdC5uZXdGaWVsZEFjY2VzcygpOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJYXNzZXJ0VHJ1ZSh4IGluc3RhbmNlb2YgRXhwcmVzc2lvbik7Ci0JCWFzc2VydFRydWUoeC5nZXRBU1QoKSA9PSBhc3QpOwotCQlhc3NlcnRUcnVlKHguZ2V0UGFyZW50KCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5nZXROYW1lKCkuZ2V0UGFyZW50KCkgPT0geCk7Ci0JCWFzc2VydFRydWUoeC5nZXRFeHByZXNzaW9uKCkuZ2V0UGFyZW50KCkgPT0geCk7Ci0JCWFzc2VydFRydWUoeC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuRklFTERfQUNDRVNTKTsKLQkJLy8gbWFrZSBzdXJlIHRoYXQgcmVhZGluZyBkaWQgbm90IGNoYW5nZSBtb2RpZmljYXRpb24gY291bnQKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA9PSBwcmV2aW91c0NvdW50KTsKLQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiRXhwcmVzc2lvbiIsIHRydWUsIEV4cHJlc3Npb24uY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCBsb2NhbEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCUV4cHJlc3Npb24gcmVzdWx0ID0gbG9jYWxBc3QubmV3U2ltcGxlTmFtZSgiZm9vIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJbG9jYWxBc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgd3JhcCgpIHsKLQkJCQlQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBzMSA9IGFzdC5uZXdQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpOwotCQkJCXMxLnNldEV4cHJlc3Npb24oeCk7Ci0JCQkJcmV0dXJuIHMxOwotCQkJfQotCQkJcHVibGljIHZvaWQgdW53cmFwKCkgewotCQkJCVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHMxID0gKFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKSB4LmdldFBhcmVudCgpOwotCQkJCXMxLnNldEV4cHJlc3Npb24oYXN0Lm5ld1NpbXBsZU5hbWUoImZpZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldEV4cHJlc3Npb24oKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXRFeHByZXNzaW9uKChFeHByZXNzaW9uKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJOYW1lIiwgdHJ1ZSwgU2ltcGxlTmFtZS5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCVNpbXBsZU5hbWUgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld1NpbXBsZU5hbWUoImZvbyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCXRhcmdldEFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0TmFtZSgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldE5hbWUoKFNpbXBsZU5hbWUpIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0U3VwZXJGaWVsZEFjY2VzcygpIHsKLQkJbG9uZyBwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWZpbmFsIFN1cGVyRmllbGRBY2Nlc3MgeCA9IGFzdC5uZXdTdXBlckZpZWxkQWNjZXNzKCk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlhc3NlcnRUcnVlKHggaW5zdGFuY2VvZiBFeHByZXNzaW9uKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEFTVCgpID09IGFzdCk7Ci0JCWFzc2VydFRydWUoeC5nZXRQYXJlbnQoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE5hbWUoKS5nZXRQYXJlbnQoKSA9PSB4KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFF1YWxpZmllcigpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlNVUEVSX0ZJRUxEX0FDQ0VTUyk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHJlYWRpbmcgZGlkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGNvdW50Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0JCQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiUXVhbGlmaWVyIiwgZmFsc2UsIE5hbWUuY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCB0YXJnZXRBc3QsIGJvb2xlYW4gcGFyZW50ZWQpIHsKLQkJCQlRdWFsaWZpZWROYW1lIHJlc3VsdCA9IHRhcmdldEFzdC5uZXdRdWFsaWZpZWROYW1lKAotCQkJCQl0YXJnZXRBc3QubmV3U2ltcGxlTmFtZSgiYSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCXRhcmdldEFzdC5uZXdTaW1wbGVOYW1lKCJiIikpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCXRhcmdldEFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0UXVhbGlmaWVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzZXQoQVNUTm9kZSB2YWx1ZSkgewotCQkJCXguc2V0UXVhbGlmaWVyKChOYW1lKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJOYW1lIiwgdHJ1ZSwgU2ltcGxlTmFtZS5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCVNpbXBsZU5hbWUgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld1NpbXBsZU5hbWUoImZvbyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCXRhcmdldEFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0TmFtZSgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldE5hbWUoKFNpbXBsZU5hbWUpIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1cGVyTWV0aG9kSW52b2NhdGlvbigpIHsKLQkJbG9uZyBwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWZpbmFsIFN1cGVyTWV0aG9kSW52b2NhdGlvbiB4ID0gYXN0Lm5ld1N1cGVyTWV0aG9kSW52b2NhdGlvbigpOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJYXNzZXJ0VHJ1ZSh4IGluc3RhbmNlb2YgRXhwcmVzc2lvbik7Ci0JCWFzc2VydFRydWUoeC5nZXRBU1QoKSA9PSBhc3QpOwotCQlhc3NlcnRUcnVlKHguZ2V0UGFyZW50KCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5nZXROYW1lKCkuZ2V0UGFyZW50KCkgPT0geCk7Ci0JCWFzc2VydFRydWUoeC5nZXRRdWFsaWZpZXIoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmFyZ3VtZW50cygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoeC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuU1VQRVJfTUVUSE9EX0lOVk9DQVRJT04pOwotCQkvLyBtYWtlIHN1cmUgdGhhdCByZWFkaW5nIGRpZCBub3QgY2hhbmdlIG1vZGlmaWNhdGlvbiBjb3VudAotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID09IHByZXZpb3VzQ291bnQpOwotCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJRdWFsaWZpZXIiLCBmYWxzZSwgTmFtZS5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCVF1YWxpZmllZE5hbWUgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld1F1YWxpZmllZE5hbWUoCi0JCQkJCXRhcmdldEFzdC5uZXdTaW1wbGVOYW1lKCJhIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJdGFyZ2V0QXN0Lm5ld1NpbXBsZU5hbWUoImIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJdGFyZ2V0QXN0Lm5ld0V4cHJlc3Npb25TdGF0ZW1lbnQocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIGdldCgpIHsKLQkJCQlyZXR1cm4geC5nZXRRdWFsaWZpZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXRRdWFsaWZpZXIoKE5hbWUpIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZ2VuZXJpY1Byb3BlcnR5VGVzdCh4LCBuZXcgUHJvcGVydHkoIk5hbWUiLCB0cnVlLCBTaW1wbGVOYW1lLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgdGFyZ2V0QXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJU2ltcGxlTmFtZSByZXN1bHQgPSB0YXJnZXRBc3QubmV3U2ltcGxlTmFtZSgiZm9vIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJdGFyZ2V0QXN0Lm5ld0V4cHJlc3Npb25TdGF0ZW1lbnQocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIGdldCgpIHsKLQkJCQlyZXR1cm4geC5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzZXQoQVNUTm9kZSB2YWx1ZSkgewotCQkJCXguc2V0TmFtZSgoU2ltcGxlTmFtZSkgdmFsdWUpOwotCQkJfQotCQl9KTsKLQotCQlnZW5lcmljUHJvcGVydHlMaXN0VGVzdCh4LCB4LmFyZ3VtZW50cygpLAotCQkgIG5ldyBQcm9wZXJ0eSgiQXJndW1lbnRzIiwgdHJ1ZSwgRXhwcmVzc2lvbi5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCVNpbXBsZU5hbWUgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld1NpbXBsZU5hbWUoImZvbyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCXRhcmdldEFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJCS8vIHJldHVybiBFeHByZXNzaW9uIHRoYXQgZW1iZWRzIHgKLQkJCQlQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBzMSA9IGFzdC5uZXdQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpOwotCQkJCXMxLnNldEV4cHJlc3Npb24oeCk7Ci0JCQkJcmV0dXJuIHMxOwotCQkJfQotCQkJcHVibGljIHZvaWQgdW53cmFwKCkgewotCQkJCVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHMxID0gKFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKSB4LmdldFBhcmVudCgpOwotCQkJCXMxLnNldEV4cHJlc3Npb24oYXN0Lm5ld1NpbXBsZU5hbWUoIngiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFR5cGVMaXRlcmFsKCkgewotCQlsb25nIHByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJZmluYWwgVHlwZUxpdGVyYWwgeCA9IGFzdC5uZXdUeXBlTGl0ZXJhbCgpOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJYXNzZXJ0VHJ1ZSh4IGluc3RhbmNlb2YgRXhwcmVzc2lvbik7Ci0JCWFzc2VydFRydWUoeC5nZXRBU1QoKSA9PSBhc3QpOwotCQlhc3NlcnRUcnVlKHguZ2V0UGFyZW50KCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5nZXRUeXBlKCkuZ2V0UGFyZW50KCkgPT0geCk7Ci0JCWFzc2VydFRydWUoeC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuVFlQRV9MSVRFUkFMKTsKLQkJLy8gbWFrZSBzdXJlIHRoYXQgcmVhZGluZyBkaWQgbm90IGNoYW5nZSBtb2RpZmljYXRpb24gY291bnQKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA9PSBwcmV2aW91c0NvdW50KTsKLQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiVHlwZSIsIHRydWUsIFR5cGUuY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCB0YXJnZXRBc3QsIGJvb2xlYW4gcGFyZW50ZWQpIHsKLQkJCQlTaW1wbGVUeXBlIHJlc3VsdCA9IHRhcmdldEFzdC5uZXdTaW1wbGVUeXBlKAotCQkJCQl0YXJnZXRBc3QubmV3U2ltcGxlTmFtZSgiYSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQl0YXJnZXRBc3QubmV3QXJyYXlUeXBlKHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0VHlwZSgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldFR5cGUoKFR5cGUpIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhc3RFeHByZXNzaW9uKCkgewotCQlsb25nIHByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJZmluYWwgQ2FzdEV4cHJlc3Npb24geCA9IGFzdC5uZXdDYXN0RXhwcmVzc2lvbigpOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJYXNzZXJ0VHJ1ZSh4IGluc3RhbmNlb2YgRXhwcmVzc2lvbik7Ci0JCWFzc2VydFRydWUoeC5nZXRBU1QoKSA9PSBhc3QpOwotCQlhc3NlcnRUcnVlKHguZ2V0UGFyZW50KCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5nZXRUeXBlKCkuZ2V0UGFyZW50KCkgPT0geCk7Ci0JCWFzc2VydFRydWUoeC5nZXRFeHByZXNzaW9uKCkuZ2V0UGFyZW50KCkgPT0geCk7Ci0JCWFzc2VydFRydWUoeC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQ0FTVF9FWFBSRVNTSU9OKTsKLQkJLy8gbWFrZSBzdXJlIHRoYXQgcmVhZGluZyBkaWQgbm90IGNoYW5nZSBtb2RpZmljYXRpb24gY291bnQKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA9PSBwcmV2aW91c0NvdW50KTsKLQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiVHlwZSIsIHRydWUsIFR5cGUuY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCB0YXJnZXRBc3QsIGJvb2xlYW4gcGFyZW50ZWQpIHsKLQkJCQlTaW1wbGVUeXBlIHJlc3VsdCA9IHRhcmdldEFzdC5uZXdTaW1wbGVUeXBlKAotCQkJCQl0YXJnZXRBc3QubmV3U2ltcGxlTmFtZSgiYSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQl0YXJnZXRBc3QubmV3QXJyYXlUeXBlKHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0VHlwZSgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldFR5cGUoKFR5cGUpIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiRXhwcmVzc2lvbiIsIHRydWUsIEV4cHJlc3Npb24uY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCBsb2NhbEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCUV4cHJlc3Npb24gcmVzdWx0ID0gbG9jYWxBc3QubmV3U2ltcGxlTmFtZSgiZm9vIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJbG9jYWxBc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgd3JhcCgpIHsKLQkJCQlQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBzMSA9IGFzdC5uZXdQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpOwotCQkJCXMxLnNldEV4cHJlc3Npb24oeCk7Ci0JCQkJcmV0dXJuIHMxOwotCQkJfQotCQkJcHVibGljIHZvaWQgdW53cmFwKCkgewotCQkJCVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHMxID0gKFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKSB4LmdldFBhcmVudCgpOwotCQkJCXMxLnNldEV4cHJlc3Npb24oYXN0Lm5ld1NpbXBsZU5hbWUoImZpZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldEV4cHJlc3Npb24oKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXRFeHByZXNzaW9uKChFeHByZXNzaW9uKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmVmaXhFeHByZXNzaW9uKCkgewotCQlsb25nIHByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJZmluYWwgUHJlZml4RXhwcmVzc2lvbiB4ID0gYXN0Lm5ld1ByZWZpeEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWFzc2VydFRydWUoeCBpbnN0YW5jZW9mIEV4cHJlc3Npb24pOwotCQlhc3NlcnRUcnVlKHguZ2V0QVNUKCkgPT0gYXN0KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFBhcmVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0T3BlcmFuZCgpLmdldFBhcmVudCgpID09IHgpOwotCQlhc3NlcnRUcnVlKHguZ2V0T3BlcmF0b3IoKSAhPSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5QUkVGSVhfRVhQUkVTU0lPTik7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHJlYWRpbmcgZGlkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGNvdW50Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0JCQotCQkvLyBPcGVyYXRvciBwcm9wZXJ0eSAtIG1hbmRhdG9yeSB0eXBlc2FmZSBlbnVtZXJhdGlvbgotCQkvLyBjaGVjayB0aGUgbmFtZXMgb2YgdGhlIG9wZXJhdG9ycwotCQlhc3NlcnRUcnVlKFByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3IuSU5DUkVNRU5ULnRvU3RyaW5nKCkuZXF1YWxzKCIrKyIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKFByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3IuREVDUkVNRU5ULnRvU3RyaW5nKCkuZXF1YWxzKCItLSIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKFByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUExVUy50b1N0cmluZygpLmVxdWFscygiKyIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKFByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTUlOVVMudG9TdHJpbmcoKS5lcXVhbHMoIi0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShQcmVmaXhFeHByZXNzaW9uLk9wZXJhdG9yLkNPTVBMRU1FTlQudG9TdHJpbmcoKS5lcXVhbHMoIn4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShQcmVmaXhFeHByZXNzaW9uLk9wZXJhdG9yLk5PVC50b1N0cmluZygpLmVxdWFscygiISIpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJUHJlZml4RXhwcmVzc2lvbi5PcGVyYXRvcltdIGtub3duID0gewotCQkJUHJlZml4RXhwcmVzc2lvbi5PcGVyYXRvci5JTkNSRU1FTlQsCi0JCQlQcmVmaXhFeHByZXNzaW9uLk9wZXJhdG9yLkRFQ1JFTUVOVCwKLQkJCVByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUExVUywKLQkJCVByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTUlOVVMsCi0JCQlQcmVmaXhFeHByZXNzaW9uLk9wZXJhdG9yLkNPTVBMRU1FTlQsCi0JCQlQcmVmaXhFeHByZXNzaW9uLk9wZXJhdG9yLk5PVCwKLQkJfTsKLQkJCi0JCS8vIGNoZWNrIGFsbCBvcGVyYXRvcnMgYXJlIGRpc3RpbmN0Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwga25vd24ubGVuZ3RoOyBpKyspIHsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwga25vd24ubGVuZ3RoOyBqKyspIHsKLQkJCQlhc3NlcnRUcnVlKGkgPT0gaiB8fCAha25vd25baV0uZXF1YWxzKGtub3duW2pdKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjaGVjayBhbGwgb3BlcmF0b3JzIHdvcmsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrbm93bi5sZW5ndGg7IGkrKykgewotCQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQkJeC5zZXRPcGVyYXRvcihrbm93bltpXSk7Ci0JCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCQlhc3NlcnRUcnVlKHguZ2V0T3BlcmF0b3IoKS5lcXVhbHMoa25vd25baV0pKTsKLQkJfQotCQkvLyBlbnN1cmUgbnVsbCBkb2VzIG5vdCB3b3JrIGFzIGFuIG9wZXJhdG9yCi0JCXRyeSB7Ci0JCQl4LnNldE9wZXJhdG9yKG51bGwpOwotCQkJYXNzZXJ0VHJ1ZShmYWxzZSk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJLy8gcGFzcwotCQl9Ci0KLQkJLy8gY2hlY2sgdG9PcGVyYXRvciBsb29rdXAgb2Ygb3BlcmF0b3IgYnkgbmFtZQotCQlmb3IgKGludCBpID0gMDsgaSA8IGtub3duLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGtub3duW2ldLnRvU3RyaW5nKCk7Ci0JCQlhc3NlcnRUcnVlKFByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3IudG9PcGVyYXRvcihuYW1lKS5lcXVhbHMoa25vd25baV0pKTsKLQkJfQotCQlhc3NlcnRUcnVlKFByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3IudG9PcGVyYXRvcigiaHVoIikgPT0gbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiT3BlcmFuZCIsIHRydWUsIEV4cHJlc3Npb24uY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCBsb2NhbEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCUV4cHJlc3Npb24gcmVzdWx0ID0gbG9jYWxBc3QubmV3U2ltcGxlTmFtZSgiZm9vIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJbG9jYWxBc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgd3JhcCgpIHsKLQkJCQlQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBzMSA9IGFzdC5uZXdQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpOwotCQkJCXMxLnNldEV4cHJlc3Npb24oeCk7Ci0JCQkJcmV0dXJuIHMxOwotCQkJfQotCQkJcHVibGljIHZvaWQgdW53cmFwKCkgewotCQkJCVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHMxID0gKFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKSB4LmdldFBhcmVudCgpOwotCQkJCXMxLnNldEV4cHJlc3Npb24oYXN0Lm5ld1NpbXBsZU5hbWUoImZpZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldE9wZXJhbmQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXRPcGVyYW5kKChFeHByZXNzaW9uKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQb3N0Zml4RXhwcmVzc2lvbigpIHsKLQkJbG9uZyBwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWZpbmFsIFBvc3RmaXhFeHByZXNzaW9uIHggPSBhc3QubmV3UG9zdGZpeEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWFzc2VydFRydWUoeCBpbnN0YW5jZW9mIEV4cHJlc3Npb24pOwotCQlhc3NlcnRUcnVlKHguZ2V0QVNUKCkgPT0gYXN0KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFBhcmVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0T3BlcmFuZCgpLmdldFBhcmVudCgpID09IHgpOwotCQlhc3NlcnRUcnVlKHguZ2V0T3BlcmF0b3IoKSAhPSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5QT1NURklYX0VYUFJFU1NJT04pOwotCQkvLyBtYWtlIHN1cmUgdGhhdCByZWFkaW5nIGRpZCBub3QgY2hhbmdlIG1vZGlmaWNhdGlvbiBjb3VudAotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID09IHByZXZpb3VzQ291bnQpOwotCQkKLQkJLy8gT3BlcmF0b3IgcHJvcGVydHkgLSBtYW5kYXRvcnkgdHlwZXNhZmUgZW51bWVyYXRpb24KLQkJLy8gY2hlY2sgdGhlIG5hbWVzIG9mIHRoZSBvcGVyYXRvcnMKLQkJYXNzZXJ0VHJ1ZShQb3N0Zml4RXhwcmVzc2lvbi5PcGVyYXRvci5JTkNSRU1FTlQudG9TdHJpbmcoKS5lcXVhbHMoIisrIikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoUG9zdGZpeEV4cHJlc3Npb24uT3BlcmF0b3IuREVDUkVNRU5ULnRvU3RyaW5nKCkuZXF1YWxzKCItLSIpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJUG9zdGZpeEV4cHJlc3Npb24uT3BlcmF0b3JbXSBrbm93biA9IHsKLQkJCVBvc3RmaXhFeHByZXNzaW9uLk9wZXJhdG9yLklOQ1JFTUVOVCwKLQkJCVBvc3RmaXhFeHByZXNzaW9uLk9wZXJhdG9yLkRFQ1JFTUVOVCwKLQkJfTsKLQkJCi0JCS8vIGNoZWNrIGFsbCBvcGVyYXRvcnMgYXJlIGRpc3RpbmN0Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwga25vd24ubGVuZ3RoOyBpKyspIHsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwga25vd24ubGVuZ3RoOyBqKyspIHsKLQkJCQlhc3NlcnRUcnVlKGkgPT0gaiB8fCAha25vd25baV0uZXF1YWxzKGtub3duW2pdKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjaGVjayBhbGwgb3BlcmF0b3JzIHdvcmsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrbm93bi5sZW5ndGg7IGkrKykgewotCQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQkJeC5zZXRPcGVyYXRvcihrbm93bltpXSk7Ci0JCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCQlhc3NlcnRUcnVlKHguZ2V0T3BlcmF0b3IoKS5lcXVhbHMoa25vd25baV0pKTsKLQkJfQotCQkvLyBlbnN1cmUgbnVsbCBkb2VzIG5vdCB3b3JrIGFzIGFuIG9wZXJhdG9yCi0JCXRyeSB7Ci0JCQl4LnNldE9wZXJhdG9yKG51bGwpOwotCQkJYXNzZXJ0VHJ1ZShmYWxzZSk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJLy8gcGFzcwotCQl9Ci0KLQkJLy8gY2hlY2sgdG9PcGVyYXRvciBsb29rdXAgb2Ygb3BlcmF0b3IgYnkgbmFtZQotCQlmb3IgKGludCBpID0gMDsgaSA8IGtub3duLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGtub3duW2ldLnRvU3RyaW5nKCk7Ci0JCQlhc3NlcnRUcnVlKFBvc3RmaXhFeHByZXNzaW9uLk9wZXJhdG9yLnRvT3BlcmF0b3IobmFtZSkuZXF1YWxzKGtub3duW2ldKSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShQb3N0Zml4RXhwcmVzc2lvbi5PcGVyYXRvci50b09wZXJhdG9yKCJodWgiKSA9PSBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJPcGVyYW5kIiwgdHJ1ZSwgRXhwcmVzc2lvbi5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIGxvY2FsQXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJRXhwcmVzc2lvbiByZXN1bHQgPSBsb2NhbEFzdC5uZXdTaW1wbGVOYW1lKCJmb28iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQlsb2NhbEFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJCVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHMxID0gYXN0Lm5ld1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCk7Ci0JCQkJczEuc2V0RXhwcmVzc2lvbih4KTsKLQkJCQlyZXR1cm4gczE7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB1bndyYXAoKSB7Ci0JCQkJUGFyZW50aGVzaXplZEV4cHJlc3Npb24gczEgPSAoUGFyZW50aGVzaXplZEV4cHJlc3Npb24pIHguZ2V0UGFyZW50KCk7Ci0JCQkJczEuc2V0RXhwcmVzc2lvbihhc3QubmV3U2ltcGxlTmFtZSgiZmllIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0T3BlcmFuZCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldE9wZXJhbmQoKEV4cHJlc3Npb24pIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZml4RXhwcmVzc2lvbigpIHsKLQkJbG9uZyBwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWZpbmFsIEluZml4RXhwcmVzc2lvbiB4ID0gYXN0Lm5ld0luZml4RXhwcmVzc2lvbigpOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJYXNzZXJ0VHJ1ZSh4IGluc3RhbmNlb2YgRXhwcmVzc2lvbik7Ci0JCWFzc2VydFRydWUoeC5nZXRBU1QoKSA9PSBhc3QpOwotCQlhc3NlcnRUcnVlKHguZ2V0UGFyZW50KCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5nZXRMZWZ0T3BlcmFuZCgpLmdldFBhcmVudCgpID09IHgpOwotCQlhc3NlcnRUcnVlKHguZ2V0T3BlcmF0b3IoKSAhPSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFJpZ2h0T3BlcmFuZCgpLmdldFBhcmVudCgpID09IHgpOwotCQlhc3NlcnRUcnVlKHguZXh0ZW5kZWRPcGVyYW5kcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoeC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuSU5GSVhfRVhQUkVTU0lPTik7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHJlYWRpbmcgZGlkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGNvdW50Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0JCQotCQkvLyBPcGVyYXRvciBwcm9wZXJ0eSAtIG1hbmRhdG9yeSB0eXBlc2FmZSBlbnVtZXJhdGlvbgotCQkvLyBjaGVjayB0aGUgbmFtZXMgb2YgdGhlIG9wZXJhdG9ycwotCQlhc3NlcnRUcnVlKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5USU1FUy50b1N0cmluZygpLmVxdWFscygiKiIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5ESVZJREUudG9TdHJpbmcoKS5lcXVhbHMoIi8iKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUkVNQUlOREVSLnRvU3RyaW5nKCkuZXF1YWxzKCIlIikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLlBMVVMudG9TdHJpbmcoKS5lcXVhbHMoIisiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTUlOVVMudG9TdHJpbmcoKS5lcXVhbHMoIi0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTEVGVF9TSElGVC50b1N0cmluZygpLmVxdWFscygiPDwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUklHSFRfU0hJRlRfU0lHTkVELnRvU3RyaW5nKCkuZXF1YWxzKCI+PiIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5SSUdIVF9TSElGVF9VTlNJR05FRC50b1N0cmluZygpLmVxdWFscygiPj4+IikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkxFU1MudG9TdHJpbmcoKS5lcXVhbHMoIjwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuR1JFQVRFUi50b1N0cmluZygpLmVxdWFscygiPiIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5MRVNTX0VRVUFMUy50b1N0cmluZygpLmVxdWFscygiPD0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuR1JFQVRFUl9FUVVBTFMudG9TdHJpbmcoKS5lcXVhbHMoIj49IikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkVRVUFMUy50b1N0cmluZygpLmVxdWFscygiPT0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTk9UX0VRVUFMUy50b1N0cmluZygpLmVxdWFscygiIT0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuWE9SLnRvU3RyaW5nKCkuZXF1YWxzKCJeIikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLk9SLnRvU3RyaW5nKCkuZXF1YWxzKCJ8IikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkFORC50b1N0cmluZygpLmVxdWFscygiJiIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5DT05ESVRJT05BTF9PUi50b1N0cmluZygpLmVxdWFscygifHwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZShJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuQ09ORElUSU9OQUxfQU5ELnRvU3RyaW5nKCkuZXF1YWxzKCImJiIpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yW10ga25vd24gPSB7Ci0JCQkJSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLlRJTUVTLAotCQkJCUluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5ESVZJREUsCi0JCQkJSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLlJFTUFJTkRFUiwKLQkJCQlJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUExVUywKLQkJCQlJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTUlOVVMsCi0JCQkJSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkxFRlRfU0hJRlQsCi0JCQkJSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLlJJR0hUX1NISUZUX1NJR05FRCwKLQkJCQlJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUklHSFRfU0hJRlRfVU5TSUdORUQsCi0JCQkJSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkxFU1MsCi0JCQkJSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkdSRUFURVIsCi0JCQkJSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkxFU1NfRVFVQUxTLAotCQkJCUluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5HUkVBVEVSX0VRVUFMUywKLQkJCQlJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuRVFVQUxTLAotCQkJCUluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5OT1RfRVFVQUxTLAotCQkJCUluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5YT1IsCi0JCQkJSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLk9SLAotCQkJCUluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5BTkQsCi0JCQkJSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkNPTkRJVElPTkFMX09SLAotCQkJCUluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5DT05ESVRJT05BTF9BTkQsCi0JCX07Ci0JCQotCQkvLyBjaGVjayBhbGwgb3BlcmF0b3JzIGFyZSBkaXN0aW5jdAotCQlmb3IgKGludCBpID0gMDsgaSA8IGtub3duLmxlbmd0aDsgaSsrKSB7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGtub3duLmxlbmd0aDsgaisrKSB7Ci0JCQkJYXNzZXJ0VHJ1ZShpID09IGogfHwgIWtub3duW2ldLmVxdWFscyhrbm93bltqXSkpOwotCQkJfQotCQl9Ci0KLQkJLy8gY2hlY2sgYWxsIG9wZXJhdG9ycyB3b3JrCi0JCWZvciAoaW50IGkgPSAwOyBpIDwga25vd24ubGVuZ3RoOyBpKyspIHsKLQkJCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJCXguc2V0T3BlcmF0b3Ioa25vd25baV0pOwotCQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQkJYXNzZXJ0VHJ1ZSh4LmdldE9wZXJhdG9yKCkuZXF1YWxzKGtub3duW2ldKSk7Ci0JCX0KLQkJLy8gZW5zdXJlIG51bGwgZG9lcyBub3Qgd29yayBhcyBhbiBvcGVyYXRvcgotCQl0cnkgewotCQkJeC5zZXRPcGVyYXRvcihudWxsKTsKLQkJCWFzc2VydFRydWUoZmFsc2UpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHBhc3MKLQkJfQotCi0JCS8vIGNoZWNrIHRvT3BlcmF0b3IgbG9va3VwIG9mIG9wZXJhdG9yIGJ5IG5hbWUKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrbm93bi5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIG5hbWUgPSBrbm93bltpXS50b1N0cmluZygpOwotCQkJYXNzZXJ0VHJ1ZShJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IudG9PcGVyYXRvcihuYW1lKS5lcXVhbHMoa25vd25baV0pKTsKLQkJfQotCQlhc3NlcnRUcnVlKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci50b09wZXJhdG9yKCJodWgiKSA9PSBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJMZWZ0T3BlcmFuZCIsIHRydWUsIEV4cHJlc3Npb24uY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCBsb2NhbEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCUV4cHJlc3Npb24gcmVzdWx0ID0gbG9jYWxBc3QubmV3U2ltcGxlTmFtZSgiZm9vIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJbG9jYWxBc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgd3JhcCgpIHsKLQkJCQlQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBzMSA9IGFzdC5uZXdQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpOwotCQkJCXMxLnNldEV4cHJlc3Npb24oeCk7Ci0JCQkJcmV0dXJuIHMxOwotCQkJfQotCQkJcHVibGljIHZvaWQgdW53cmFwKCkgewotCQkJCVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHMxID0gKFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKSB4LmdldFBhcmVudCgpOwotCQkJCXMxLnNldEV4cHJlc3Npb24oYXN0Lm5ld1NpbXBsZU5hbWUoImZpZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldExlZnRPcGVyYW5kKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzZXQoQVNUTm9kZSB2YWx1ZSkgewotCQkJCXguc2V0TGVmdE9wZXJhbmQoKEV4cHJlc3Npb24pIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZ2VuZXJpY1Byb3BlcnR5VGVzdCh4LCBuZXcgUHJvcGVydHkoIlJpZ2h0T3BlcmFuZCIsIHRydWUsIEV4cHJlc3Npb24uY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCBsb2NhbEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCUV4cHJlc3Npb24gcmVzdWx0ID0gbG9jYWxBc3QubmV3U2ltcGxlTmFtZSgiZm9vIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJbG9jYWxBc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgd3JhcCgpIHsKLQkJCQlQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBzMSA9IGFzdC5uZXdQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpOwotCQkJCXMxLnNldEV4cHJlc3Npb24oeCk7Ci0JCQkJcmV0dXJuIHMxOwotCQkJfQotCQkJcHVibGljIHZvaWQgdW53cmFwKCkgewotCQkJCVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHMxID0gKFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKSB4LmdldFBhcmVudCgpOwotCQkJCXMxLnNldEV4cHJlc3Npb24oYXN0Lm5ld1NpbXBsZU5hbWUoImZpZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldFJpZ2h0T3BlcmFuZCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldFJpZ2h0T3BlcmFuZCgoRXhwcmVzc2lvbikgdmFsdWUpOwotCQkJfQotCQl9KTsKLQotCQlnZW5lcmljUHJvcGVydHlMaXN0VGVzdCh4LCB4LmV4dGVuZGVkT3BlcmFuZHMoKSwKLQkJICBuZXcgUHJvcGVydHkoIkV4dGVuZGVkT3BlcmFuZHMiLCB0cnVlLCBFeHByZXNzaW9uLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgdGFyZ2V0QXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJU2ltcGxlTmFtZSByZXN1bHQgPSB0YXJnZXRBc3QubmV3U2ltcGxlTmFtZSgiZm9vIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJdGFyZ2V0QXN0Lm5ld0V4cHJlc3Npb25TdGF0ZW1lbnQocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIHdyYXAoKSB7Ci0JCQkJLy8gcmV0dXJuIEV4cHJlc3Npb24gdGhhdCBlbWJlZHMgeAotCQkJCVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHMxID0gYXN0Lm5ld1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCk7Ci0JCQkJczEuc2V0RXhwcmVzc2lvbih4KTsKLQkJCQlyZXR1cm4gczE7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB1bndyYXAoKSB7Ci0JCQkJUGFyZW50aGVzaXplZEV4cHJlc3Npb24gczEgPSAoUGFyZW50aGVzaXplZEV4cHJlc3Npb24pIHguZ2V0UGFyZW50KCk7Ci0JCQkJczEuc2V0RXhwcmVzc2lvbihhc3QubmV3U2ltcGxlTmFtZSgieCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFuY2VvZkV4cHJlc3Npb24oKSB7Ci0JCWxvbmcgcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlmaW5hbCBJbnN0YW5jZW9mRXhwcmVzc2lvbiB4ID0gYXN0Lm5ld0luc3RhbmNlb2ZFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlhc3NlcnRUcnVlKHggaW5zdGFuY2VvZiBFeHByZXNzaW9uKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEFTVCgpID09IGFzdCk7Ci0JCWFzc2VydFRydWUoeC5nZXRQYXJlbnQoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldExlZnRPcGVyYW5kKCkuZ2V0UGFyZW50KCkgPT0geCk7Ci0JCWFzc2VydFRydWUoeC5nZXRSaWdodE9wZXJhbmQoKS5nZXRQYXJlbnQoKSA9PSB4KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5JTlNUQU5DRU9GX0VYUFJFU1NJT04pOwotCQkvLyBtYWtlIHN1cmUgdGhhdCByZWFkaW5nIGRpZCBub3QgY2hhbmdlIG1vZGlmaWNhdGlvbiBjb3VudAotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID09IHByZXZpb3VzQ291bnQpOwotCQkJCQkJCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJMZWZ0T3BlcmFuZCIsIHRydWUsIEV4cHJlc3Npb24uY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCBsb2NhbEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCUV4cHJlc3Npb24gcmVzdWx0ID0gbG9jYWxBc3QubmV3U2ltcGxlTmFtZSgiZm9vIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJbG9jYWxBc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgd3JhcCgpIHsKLQkJCQlQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBzMSA9IGFzdC5uZXdQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpOwotCQkJCXMxLnNldEV4cHJlc3Npb24oeCk7Ci0JCQkJcmV0dXJuIHMxOwotCQkJfQotCQkJcHVibGljIHZvaWQgdW53cmFwKCkgewotCQkJCVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHMxID0gKFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKSB4LmdldFBhcmVudCgpOwotCQkJCXMxLnNldEV4cHJlc3Npb24oYXN0Lm5ld1NpbXBsZU5hbWUoImZpZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldExlZnRPcGVyYW5kKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzZXQoQVNUTm9kZSB2YWx1ZSkgewotCQkJCXguc2V0TGVmdE9wZXJhbmQoKEV4cHJlc3Npb24pIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZ2VuZXJpY1Byb3BlcnR5VGVzdCh4LCBuZXcgUHJvcGVydHkoIlJpZ2h0T3BlcmFuZCIsIHRydWUsIFR5cGUuY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCBsb2NhbEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCVR5cGUgcmVzdWx0ID0gbG9jYWxBc3QubmV3U2ltcGxlVHlwZShsb2NhbEFzdC5uZXdTaW1wbGVOYW1lKCJPYmplY3QiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJbG9jYWxBc3QubmV3QXJyYXlUeXBlKHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJCVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHMxID0gYXN0Lm5ld1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCk7Ci0JCQkJczEuc2V0RXhwcmVzc2lvbih4KTsKLQkJCQlyZXR1cm4gczE7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB1bndyYXAoKSB7Ci0JCQkJUGFyZW50aGVzaXplZEV4cHJlc3Npb24gczEgPSAoUGFyZW50aGVzaXplZEV4cHJlc3Npb24pIHguZ2V0UGFyZW50KCk7Ci0JCQkJczEuc2V0RXhwcmVzc2lvbihhc3QubmV3U2ltcGxlTmFtZSgiZmllIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0UmlnaHRPcGVyYW5kKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzZXQoQVNUTm9kZSB2YWx1ZSkgewotCQkJCXguc2V0UmlnaHRPcGVyYW5kKChUeXBlKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25kaXRpb25hbEV4cHJlc3Npb24oKSB7Ci0JCWxvbmcgcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlmaW5hbCBDb25kaXRpb25hbEV4cHJlc3Npb24geCA9IGFzdC5uZXdDb25kaXRpb25hbEV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWFzc2VydFRydWUoeCBpbnN0YW5jZW9mIEV4cHJlc3Npb24pOwotCQlhc3NlcnRUcnVlKHguZ2V0QVNUKCkgPT0gYXN0KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFBhcmVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0RXhwcmVzc2lvbigpLmdldFBhcmVudCgpID09IHgpOwotCQlhc3NlcnRUcnVlKHguZ2V0VGhlbkV4cHJlc3Npb24oKS5nZXRQYXJlbnQoKSA9PSB4KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEVsc2VFeHByZXNzaW9uKCkuZ2V0UGFyZW50KCkgPT0geCk7Ci0JCWFzc2VydFRydWUoeC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQ09ORElUSU9OQUxfRVhQUkVTU0lPTik7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHJlYWRpbmcgZGlkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGNvdW50Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0JCQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiRXhwcmVzc2lvbiIsIHRydWUsIEV4cHJlc3Npb24uY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCBsb2NhbEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCUV4cHJlc3Npb24gcmVzdWx0ID0gbG9jYWxBc3QubmV3U2ltcGxlTmFtZSgiZm9vIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJbG9jYWxBc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgd3JhcCgpIHsKLQkJCQlQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBzMSA9IGFzdC5uZXdQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpOwotCQkJCXMxLnNldEV4cHJlc3Npb24oeCk7Ci0JCQkJcmV0dXJuIHMxOwotCQkJfQotCQkJcHVibGljIHZvaWQgdW53cmFwKCkgewotCQkJCVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHMxID0gKFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKSB4LmdldFBhcmVudCgpOwotCQkJCXMxLnNldEV4cHJlc3Npb24oYXN0Lm5ld1NpbXBsZU5hbWUoImZpZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldEV4cHJlc3Npb24oKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXRFeHByZXNzaW9uKChFeHByZXNzaW9uKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZ2VuZXJpY1Byb3BlcnR5VGVzdCh4LCBuZXcgUHJvcGVydHkoIlRoZW5FeHByZXNzaW9uIiwgdHJ1ZSwgRXhwcmVzc2lvbi5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIGxvY2FsQXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJRXhwcmVzc2lvbiByZXN1bHQgPSBsb2NhbEFzdC5uZXdTaW1wbGVOYW1lKCJmb28iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQlsb2NhbEFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJCVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHMxID0gYXN0Lm5ld1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCk7Ci0JCQkJczEuc2V0RXhwcmVzc2lvbih4KTsKLQkJCQlyZXR1cm4gczE7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB1bndyYXAoKSB7Ci0JCQkJUGFyZW50aGVzaXplZEV4cHJlc3Npb24gczEgPSAoUGFyZW50aGVzaXplZEV4cHJlc3Npb24pIHguZ2V0UGFyZW50KCk7Ci0JCQkJczEuc2V0RXhwcmVzc2lvbihhc3QubmV3U2ltcGxlTmFtZSgiZmllIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0VGhlbkV4cHJlc3Npb24oKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXRUaGVuRXhwcmVzc2lvbigoRXhwcmVzc2lvbikgdmFsdWUpOwotCQkJfQotCQl9KTsKLQkJCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJFbHNlRXhwcmVzc2lvbiIsIHRydWUsIEV4cHJlc3Npb24uY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCBsb2NhbEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCUV4cHJlc3Npb24gcmVzdWx0ID0gbG9jYWxBc3QubmV3U2ltcGxlTmFtZSgiZm9vIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJbG9jYWxBc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgd3JhcCgpIHsKLQkJCQlQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBzMSA9IGFzdC5uZXdQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpOwotCQkJCXMxLnNldEV4cHJlc3Npb24oeCk7Ci0JCQkJcmV0dXJuIHMxOwotCQkJfQotCQkJcHVibGljIHZvaWQgdW53cmFwKCkgewotCQkJCVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHMxID0gKFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKSB4LmdldFBhcmVudCgpOwotCQkJCXMxLnNldEV4cHJlc3Npb24oYXN0Lm5ld1NpbXBsZU5hbWUoImZpZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldEVsc2VFeHByZXNzaW9uKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzZXQoQVNUTm9kZSB2YWx1ZSkgewotCQkJCXguc2V0RWxzZUV4cHJlc3Npb24oKEV4cHJlc3Npb24pIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5QWNjZXNzKCkgewotCQlsb25nIHByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJZmluYWwgQXJyYXlBY2Nlc3MgeCA9IGFzdC5uZXdBcnJheUFjY2VzcygpOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJYXNzZXJ0VHJ1ZSh4IGluc3RhbmNlb2YgRXhwcmVzc2lvbik7Ci0JCWFzc2VydFRydWUoeC5nZXRBU1QoKSA9PSBhc3QpOwotCQlhc3NlcnRUcnVlKHguZ2V0UGFyZW50KCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5nZXRBcnJheSgpLmdldFBhcmVudCgpID09IHgpOwotCQlhc3NlcnRUcnVlKHguZ2V0SW5kZXgoKS5nZXRQYXJlbnQoKSA9PSB4KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BUlJBWV9BQ0NFU1MpOwotCQkvLyBtYWtlIHN1cmUgdGhhdCByZWFkaW5nIGRpZCBub3QgY2hhbmdlIG1vZGlmaWNhdGlvbiBjb3VudAotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID09IHByZXZpb3VzQ291bnQpOwotCQkKLQkJZ2VuZXJpY1Byb3BlcnR5VGVzdCh4LCBuZXcgUHJvcGVydHkoIkFycmF5IiwgdHJ1ZSwgRXhwcmVzc2lvbi5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIGxvY2FsQXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJRXhwcmVzc2lvbiByZXN1bHQgPSBsb2NhbEFzdC5uZXdTaW1wbGVOYW1lKCJmb28iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQlsb2NhbEFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJCVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHMxID0gYXN0Lm5ld1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCk7Ci0JCQkJczEuc2V0RXhwcmVzc2lvbih4KTsKLQkJCQlyZXR1cm4gczE7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB1bndyYXAoKSB7Ci0JCQkJUGFyZW50aGVzaXplZEV4cHJlc3Npb24gczEgPSAoUGFyZW50aGVzaXplZEV4cHJlc3Npb24pIHguZ2V0UGFyZW50KCk7Ci0JCQkJczEuc2V0RXhwcmVzc2lvbihhc3QubmV3U2ltcGxlTmFtZSgiZmllIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0QXJyYXkoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXRBcnJheSgoRXhwcmVzc2lvbikgdmFsdWUpOwotCQkJfQotCQl9KTsKLQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiSW5kZXgiLCB0cnVlLCBFeHByZXNzaW9uLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgbG9jYWxBc3QsIGJvb2xlYW4gcGFyZW50ZWQpIHsKLQkJCQlFeHByZXNzaW9uIHJlc3VsdCA9IGxvY2FsQXN0Lm5ld1NpbXBsZU5hbWUoImZvbyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCWxvY2FsQXN0Lm5ld0V4cHJlc3Npb25TdGF0ZW1lbnQocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIHdyYXAoKSB7Ci0JCQkJUGFyZW50aGVzaXplZEV4cHJlc3Npb24gczEgPSBhc3QubmV3UGFyZW50aGVzaXplZEV4cHJlc3Npb24oKTsKLQkJCQlzMS5zZXRFeHByZXNzaW9uKHgpOwotCQkJCXJldHVybiBzMTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHVud3JhcCgpIHsKLQkJCQlQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBzMSA9IChQYXJlbnRoZXNpemVkRXhwcmVzc2lvbikgeC5nZXRQYXJlbnQoKTsKLQkJCQlzMS5zZXRFeHByZXNzaW9uKGFzdC5uZXdTaW1wbGVOYW1lKCJmaWUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIGdldCgpIHsKLQkJCQlyZXR1cm4geC5nZXRJbmRleCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldEluZGV4KChFeHByZXNzaW9uKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUluaXRpYWxpemVyKCkgewotCQlsb25nIHByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJZmluYWwgQXJyYXlJbml0aWFsaXplciB4ID0gYXN0Lm5ld0FycmF5SW5pdGlhbGl6ZXIoKTsKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWFzc2VydFRydWUoeCBpbnN0YW5jZW9mIEV4cHJlc3Npb24pOwotCQlhc3NlcnRUcnVlKHguZ2V0QVNUKCkgPT0gYXN0KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFBhcmVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZXhwcmVzc2lvbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHguZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkFSUkFZX0lOSVRJQUxJWkVSKTsKLQkJLy8gbWFrZSBzdXJlIHRoYXQgcmVhZGluZyBkaWQgbm90IGNoYW5nZSBtb2RpZmljYXRpb24gY291bnQKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA9PSBwcmV2aW91c0NvdW50KTsKLQkJCi0JCWdlbmVyaWNQcm9wZXJ0eUxpc3RUZXN0KHgsIHguZXhwcmVzc2lvbnMoKSwKLQkJICBuZXcgUHJvcGVydHkoIkV4cHJlc3Npb25zIiwgdHJ1ZSwgRXhwcmVzc2lvbi5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCVNpbXBsZU5hbWUgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld1NpbXBsZU5hbWUoImZvbyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCXRhcmdldEFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJCS8vIHJldHVybiBFeHByZXNzaW9uIHRoYXQgZW1iZWRzIHgKLQkJCQlQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBzMSA9IGFzdC5uZXdQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpOwotCQkJCXMxLnNldEV4cHJlc3Npb24oeCk7Ci0JCQkJcmV0dXJuIHMxOwotCQkJfQotCQkJcHVibGljIHZvaWQgdW53cmFwKCkgewotCQkJCVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHMxID0gKFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKSB4LmdldFBhcmVudCgpOwotCQkJCXMxLnNldEV4cHJlc3Npb24oYXN0Lm5ld1NpbXBsZU5hbWUoIngiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzSW5zdGFuY2VDcmVhdGlvbigpIHsKLQkJbG9uZyBwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWZpbmFsIENsYXNzSW5zdGFuY2VDcmVhdGlvbiB4ID0gYXN0Lm5ld0NsYXNzSW5zdGFuY2VDcmVhdGlvbigpOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJYXNzZXJ0VHJ1ZSh4IGluc3RhbmNlb2YgRXhwcmVzc2lvbik7Ci0JCWFzc2VydFRydWUoeC5nZXRBU1QoKSA9PSBhc3QpOwotCQlhc3NlcnRUcnVlKHguZ2V0UGFyZW50KCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5nZXRFeHByZXNzaW9uKCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5nZXROYW1lKCkuZ2V0UGFyZW50KCkgPT0geCk7Ci0JCWFzc2VydFRydWUoeC5hcmd1bWVudHMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHguZ2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkNMQVNTX0lOU1RBTkNFX0NSRUFUSU9OKTsKLQkJLy8gbWFrZSBzdXJlIHRoYXQgcmVhZGluZyBkaWQgbm90IGNoYW5nZSBtb2RpZmljYXRpb24gY291bnQKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA9PSBwcmV2aW91c0NvdW50KTsKLQkJCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJFeHByZXNzaW9uIiwgZmFsc2UsIEV4cHJlc3Npb24uY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCB0YXJnZXRBc3QsIGJvb2xlYW4gcGFyZW50ZWQpIHsKLQkJCQlTaW1wbGVOYW1lIHJlc3VsdCA9IHRhcmdldEFzdC5uZXdTaW1wbGVOYW1lKCJmb28iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQl0YXJnZXRBc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgd3JhcCgpIHsKLQkJCQkvLyByZXR1cm4gRXhwcmVzc2lvbiB0aGF0IGVtYmVkcyB4Ci0JCQkJUGFyZW50aGVzaXplZEV4cHJlc3Npb24gczEgPSBhc3QubmV3UGFyZW50aGVzaXplZEV4cHJlc3Npb24oKTsKLQkJCQlzMS5zZXRFeHByZXNzaW9uKHgpOwotCQkJCXJldHVybiBzMTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHVud3JhcCgpIHsKLQkJCQlQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBzMSA9IChQYXJlbnRoZXNpemVkRXhwcmVzc2lvbikgeC5nZXRQYXJlbnQoKTsKLQkJCQlzMS5zZXRFeHByZXNzaW9uKGFzdC5uZXdTaW1wbGVOYW1lKCJ4IikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0RXhwcmVzc2lvbigpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldEV4cHJlc3Npb24oKEV4cHJlc3Npb24pIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZ2VuZXJpY1Byb3BlcnR5VGVzdCh4LCBuZXcgUHJvcGVydHkoIk5hbWUiLCB0cnVlLCBOYW1lLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgdGFyZ2V0QXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJU2ltcGxlTmFtZSByZXN1bHQgPSB0YXJnZXRBc3QubmV3U2ltcGxlTmFtZSgiYSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCXRhcmdldEFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0TmFtZSgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldE5hbWUoKE5hbWUpIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZ2VuZXJpY1Byb3BlcnR5TGlzdFRlc3QoeCwgeC5hcmd1bWVudHMoKSwKLQkJICBuZXcgUHJvcGVydHkoIkFyZ3VtZW50cyIsIHRydWUsIEV4cHJlc3Npb24uY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCB0YXJnZXRBc3QsIGJvb2xlYW4gcGFyZW50ZWQpIHsKLQkJCQlTaW1wbGVOYW1lIHJlc3VsdCA9IHRhcmdldEFzdC5uZXdTaW1wbGVOYW1lKCJmb28iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQl0YXJnZXRBc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgd3JhcCgpIHsKLQkJCQkvLyByZXR1cm4gRXhwcmVzc2lvbiB0aGF0IGVtYmVkcyB4Ci0JCQkJUGFyZW50aGVzaXplZEV4cHJlc3Npb24gczEgPSBhc3QubmV3UGFyZW50aGVzaXplZEV4cHJlc3Npb24oKTsKLQkJCQlzMS5zZXRFeHByZXNzaW9uKHgpOwotCQkJCXJldHVybiBzMTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHVud3JhcCgpIHsKLQkJCQlQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBzMSA9IChQYXJlbnRoZXNpemVkRXhwcmVzc2lvbikgeC5nZXRQYXJlbnQoKTsKLQkJCQlzMS5zZXRFeHByZXNzaW9uKGFzdC5uZXdTaW1wbGVOYW1lKCJ4IikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0pOwotCQkKLQkJZ2VuZXJpY1Byb3BlcnR5VGVzdCh4LCBuZXcgUHJvcGVydHkoIkFub255bW91c0NsYXNzRGVjbGFyYXRpb24iLCBmYWxzZSwgQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCUFub255bW91c0NsYXNzRGVjbGFyYXRpb24gcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld0Fub255bW91c0NsYXNzRGVjbGFyYXRpb24oKTsKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJdGFyZ2V0QXN0Lm5ld0NsYXNzSW5zdGFuY2VDcmVhdGlvbigpLnNldEFub255bW91c0NsYXNzRGVjbGFyYXRpb24ocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIHdyYXAoKSB7Ci0JCQkJLy8gcmV0dXJuIEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gdGhhdCBlbWJlZHMgeAotCQkJCUFub255bW91c0NsYXNzRGVjbGFyYXRpb24gczAgPSB4LmdldEFTVCgpLm5ld0Fub255bW91c0NsYXNzRGVjbGFyYXRpb24oKTsKLQkJCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgczEgPSB4LmdldEFTVCgpLm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQkJCUZpZWxkRGVjbGFyYXRpb24gczIgPSB4LmdldEFTVCgpLm5ld0ZpZWxkRGVjbGFyYXRpb24oczEpOwotCQkJCXMwLmJvZHlEZWNsYXJhdGlvbnMoKS5hZGQoczIpOwotCQkJCXMxLnNldEluaXRpYWxpemVyKHgpOwotCQkJCXJldHVybiBzMDsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHVud3JhcCgpIHsKLQkJCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgczEgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSB4LmdldFBhcmVudCgpOwotCQkJCXMxLnNldEluaXRpYWxpemVyKG51bGwpOwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKChBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oKSB7Ci0JCWxvbmcgcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlmaW5hbCBBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIHggPSBhc3QubmV3QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJYXNzZXJ0VHJ1ZSh4IGluc3RhbmNlb2YgQVNUTm9kZSk7Ci0JCWFzc2VydFRydWUoeC5nZXRBU1QoKSA9PSBhc3QpOwotCQlhc3NlcnRUcnVlKHguZ2V0UGFyZW50KCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5ib2R5RGVjbGFyYXRpb25zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT04pOwotCQkvLyBtYWtlIHN1cmUgdGhhdCByZWFkaW5nIGRpZCBub3QgY2hhbmdlIG1vZGlmaWNhdGlvbiBjb3VudAotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID09IHByZXZpb3VzQ291bnQpOwotCQkKLQkJZ2VuZXJpY1Byb3BlcnR5TGlzdFRlc3QoeCwgeC5ib2R5RGVjbGFyYXRpb25zKCksCi0JCSAgbmV3IFByb3BlcnR5KCJCb2R5RGVjbGFyYXRpb25zIiwgdHJ1ZSwgQm9keURlY2xhcmF0aW9uLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgdGFyZ2V0QXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJVHlwZURlY2xhcmF0aW9uIHJlc3VsdCA9IHRhcmdldEFzdC5uZXdUeXBlRGVjbGFyYXRpb24oKTsKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IHRhcmdldEFzdC5uZXdDb21waWxhdGlvblVuaXQoKTsKLQkJCQkJY29tcGlsYXRpb25Vbml0LnR5cGVzKCkuYWRkKHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJCS8vIHJldHVybiBCb2R5RGVjbGFyYXRpb24gdGhhdCBlbWJlZHMgeAotCQkJCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBzMCA9IHguZ2V0QVNUKCkubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCQkJRmllbGREZWNsYXJhdGlvbiBzMSA9IHguZ2V0QVNUKCkubmV3RmllbGREZWNsYXJhdGlvbihzMCk7Ci0JCQkJQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIHMyPSB4LmdldEFTVCgpLm5ld0NsYXNzSW5zdGFuY2VDcmVhdGlvbigpOyAKLQkJCQlzMC5zZXRJbml0aWFsaXplcihzMik7Ci0JCQkJczIuc2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbih4KTsKLQkJCQlyZXR1cm4gczE7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB1bndyYXAoKSB7Ci0JCQkJQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIHMyID0gKENsYXNzSW5zdGFuY2VDcmVhdGlvbikgeC5nZXRQYXJlbnQoKTsKLQkJCQlzMi5zZXRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKG51bGwpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vIGNoZWNrIHRoYXQgVHlwZURlY2xhcmF0aW9ucyBpbiBib2R5IGFyZSBjbGFzc2lmaWVkIGNvcnJlY3RseQotCQlUeXBlRGVjbGFyYXRpb24gdDEgPSBhc3QubmV3VHlwZURlY2xhcmF0aW9uKCk7Ci0JCXguYm9keURlY2xhcmF0aW9ucygpLmFkZCh0MSk7Ci0JCWFzc2VydFRydWUodDEuaXNMb2NhbFR5cGVEZWNsYXJhdGlvbigpID09IGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZSh0MS5pc01lbWJlclR5cGVEZWNsYXJhdGlvbigpID09IHRydWUpOwotCQlhc3NlcnRUcnVlKHQxLmlzUGFja2FnZU1lbWJlclR5cGVEZWNsYXJhdGlvbigpID09IGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlDcmVhdGlvbigpIHsKLQkJbG9uZyBwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWZpbmFsIEFycmF5Q3JlYXRpb24geCA9IGFzdC5uZXdBcnJheUNyZWF0aW9uKCk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlhc3NlcnRUcnVlKHggaW5zdGFuY2VvZiBFeHByZXNzaW9uKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEFTVCgpID09IGFzdCk7Ci0JCWFzc2VydFRydWUoeC5nZXRQYXJlbnQoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFR5cGUoKS5nZXRQYXJlbnQoKSA9PSB4KTsKLQkJYXNzZXJ0VHJ1ZSh4LmRpbWVuc2lvbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHguZ2V0SW5pdGlhbGl6ZXIoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BUlJBWV9DUkVBVElPTik7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHJlYWRpbmcgZGlkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGNvdW50Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0JCQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiVHlwZSIsIHRydWUsIEFycmF5VHlwZS5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCUFycmF5VHlwZSByZXN1bHQgPSB0YXJnZXRBc3QubmV3QXJyYXlUeXBlKAotCQkJCQl0YXJnZXRBc3QubmV3U2ltcGxlVHlwZSh0YXJnZXRBc3QubmV3U2ltcGxlTmFtZSgiYSIpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJdGFyZ2V0QXN0Lm5ld0FycmF5VHlwZShyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldFR5cGUoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXRUeXBlKChBcnJheVR5cGUpIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlnZW5lcmljUHJvcGVydHlMaXN0VGVzdCh4LCB4LmRpbWVuc2lvbnMoKSwKLQkJICBuZXcgUHJvcGVydHkoIkRpbWVuc2lvbnMiLCB0cnVlLCBFeHByZXNzaW9uLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgdGFyZ2V0QXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJU2ltcGxlTmFtZSByZXN1bHQgPSB0YXJnZXRBc3QubmV3U2ltcGxlTmFtZSgiZm9vIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJdGFyZ2V0QXN0Lm5ld0V4cHJlc3Npb25TdGF0ZW1lbnQocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIHdyYXAoKSB7Ci0JCQkJLy8gcmV0dXJuIEV4cHJlc3Npb24gdGhhdCBlbWJlZHMgeAotCQkJCVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHMxID0gYXN0Lm5ld1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCk7Ci0JCQkJczEuc2V0RXhwcmVzc2lvbih4KTsKLQkJCQlyZXR1cm4gczE7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB1bndyYXAoKSB7Ci0JCQkJUGFyZW50aGVzaXplZEV4cHJlc3Npb24gczEgPSAoUGFyZW50aGVzaXplZEV4cHJlc3Npb24pIHguZ2V0UGFyZW50KCk7Ci0JCQkJczEuc2V0RXhwcmVzc2lvbihhc3QubmV3U2ltcGxlTmFtZSgieCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9KTsKLQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiSW5pdGlhbGl6ZXIiLCBmYWxzZSwgQXJyYXlJbml0aWFsaXplci5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCUFycmF5SW5pdGlhbGl6ZXIgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld0FycmF5SW5pdGlhbGl6ZXIoKTsKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJdGFyZ2V0QXN0Lm5ld0V4cHJlc3Npb25TdGF0ZW1lbnQocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIHdyYXAoKSB7Ci0JCQkJLy8gcmV0dXJuIEFycmF5SW5pdGlhbGl6ZXIgdGhhdCBlbWJlZHMgeAotCQkJCUFycmF5SW5pdGlhbGl6ZXIgczEgPSBhc3QubmV3QXJyYXlJbml0aWFsaXplcigpOwotCQkJCXMxLmV4cHJlc3Npb25zKCkuYWRkKHgpOwotCQkJCXJldHVybiBzMTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHVud3JhcCgpIHsKLQkJCQlBcnJheUluaXRpYWxpemVyIHMxID0gKEFycmF5SW5pdGlhbGl6ZXIpIHguZ2V0UGFyZW50KCk7Ci0JCQkJczEuZXhwcmVzc2lvbnMoKS5yZW1vdmUoeCk7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0SW5pdGlhbGl6ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXRJbml0aWFsaXplcigoQXJyYXlJbml0aWFsaXplcikgdmFsdWUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyZW50aGVzaXplZEV4cHJlc3Npb24oKSB7Ci0JCWxvbmcgcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlmaW5hbCBQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiB4ID0gYXN0Lm5ld1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlhc3NlcnRUcnVlKHggaW5zdGFuY2VvZiBFeHByZXNzaW9uKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEFTVCgpID09IGFzdCk7Ci0JCWFzc2VydFRydWUoeC5nZXRQYXJlbnQoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEV4cHJlc3Npb24oKS5nZXRQYXJlbnQoKSA9PSB4KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT04pOwotCQkvLyBtYWtlIHN1cmUgdGhhdCByZWFkaW5nIGRpZCBub3QgY2hhbmdlIG1vZGlmaWNhdGlvbiBjb3VudAotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID09IHByZXZpb3VzQ291bnQpOwotCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJFeHByZXNzaW9uIiwgdHJ1ZSwgRXhwcmVzc2lvbi5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIGxvY2FsQXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJRXhwcmVzc2lvbiByZXN1bHQgPSBsb2NhbEFzdC5uZXdTaW1wbGVOYW1lKCJmb28iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQlsb2NhbEFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJCVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHMxID0gYXN0Lm5ld1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCk7Ci0JCQkJczEuc2V0RXhwcmVzc2lvbih4KTsKLQkJCQlyZXR1cm4gczE7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB1bndyYXAoKSB7Ci0JCQkJUGFyZW50aGVzaXplZEV4cHJlc3Npb24gczEgPSAoUGFyZW50aGVzaXplZEV4cHJlc3Npb24pIHguZ2V0UGFyZW50KCk7Ci0JCQkJczEuc2V0RXhwcmVzc2lvbihhc3QubmV3U2ltcGxlTmFtZSgiZmllIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0RXhwcmVzc2lvbigpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldEV4cHJlc3Npb24oKEV4cHJlc3Npb24pIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmaWVycygpIHsKLQkJCi0JCS8vIGNoZWNrIGFsbCBtb2RpZmllcnMgbWF0Y2ggdGhlaXIgSlZNIHNwZWMgdmFsdWVzCi0JCWFzc2VydFRydWUoTW9kaWZpZXIuQUJTVFJBQ1QgPT0gMHgwNDAwKTsKLQkJYXNzZXJ0VHJ1ZShNb2RpZmllci5GSU5BTCA9PSAweDAwMTApOwotCQlhc3NlcnRUcnVlKE1vZGlmaWVyLk5BVElWRSA9PSAweDAxMDApOwotCQlhc3NlcnRUcnVlKE1vZGlmaWVyLk5PTkUgPT0gMHgwMDAwKTsKLQkJYXNzZXJ0VHJ1ZShNb2RpZmllci5QUklWQVRFID09IDB4MDAwMik7Ci0JCWFzc2VydFRydWUoTW9kaWZpZXIuUFJPVEVDVEVEID09IDB4MDAwNCk7Ci0JCWFzc2VydFRydWUoTW9kaWZpZXIuUFVCTElDID09IDB4MDAwMSk7Ci0JCWFzc2VydFRydWUoTW9kaWZpZXIuU1RBVElDID09IDB4MDAwOCk7Ci0JCWFzc2VydFRydWUoTW9kaWZpZXIuU1RSSUNURlAgPT0gMHgwODAwKTsKLQkJYXNzZXJ0VHJ1ZShNb2RpZmllci5TWU5DSFJPTklaRUQgPT0gMHgwMDIwKTsKLQkJYXNzZXJ0VHJ1ZShNb2RpZmllci5UUkFOU0lFTlQgPT0gMHgwMDgwKTsKLQkJYXNzZXJ0VHJ1ZShNb2RpZmllci5WT0xBVElMRSA9PSAweDAwNDApOwotCQkKLQkJLy8gY2hlY2sgdGhhdCBhbGwKLQkJaW50W10gbW9kcyA9Ci0JCQl7Ci0JCQkJTW9kaWZpZXIuQUJTVFJBQ1QsCi0JCQkJTW9kaWZpZXIuRklOQUwsCi0JCQkJTW9kaWZpZXIuTkFUSVZFLAotCQkJCU1vZGlmaWVyLlBSSVZBVEUsCi0JCQkJTW9kaWZpZXIuUFJPVEVDVEVELAotCQkJCU1vZGlmaWVyLlBVQkxJQywKLQkJCQlNb2RpZmllci5TVEFUSUMsCi0JCQkJTW9kaWZpZXIuU1RSSUNURlAsCi0JCQkJTW9kaWZpZXIuU1lOQ0hST05JWkVELAotCQkJCU1vZGlmaWVyLlRSQU5TSUVOVCwKLQkJCQlNb2RpZmllci5WT0xBVElMRSwKLQkJCQl9OwotCQkJCQotCQlmb3IgKGludCBpPTA7IGk8IG1vZHMubGVuZ3RoOyBpKyspIHsKLQkJCWludCBtID0gbW9kc1tpXTsKLQkJCWFzc2VydFRydWUoTW9kaWZpZXIuaXNBYnN0cmFjdChtKSA9PSAobSA9PSBNb2RpZmllci5BQlNUUkFDVCkpOwotCQkJYXNzZXJ0VHJ1ZShNb2RpZmllci5pc0ZpbmFsKG0pID09IChtID09IE1vZGlmaWVyLkZJTkFMKSk7Ci0JCQlhc3NlcnRUcnVlKE1vZGlmaWVyLmlzTmF0aXZlKG0pID09IChtID09IE1vZGlmaWVyLk5BVElWRSkpOwotCQkJYXNzZXJ0VHJ1ZShNb2RpZmllci5pc1ByaXZhdGUobSkgPT0gKG0gPT0gTW9kaWZpZXIuUFJJVkFURSkpOwotCQkJYXNzZXJ0VHJ1ZShNb2RpZmllci5pc1Byb3RlY3RlZChtKSA9PSAobSA9PSBNb2RpZmllci5QUk9URUNURUQpKTsKLQkJCWFzc2VydFRydWUoTW9kaWZpZXIuaXNQdWJsaWMobSkgPT0gKG0gPT0gTW9kaWZpZXIuUFVCTElDKSk7Ci0JCQlhc3NlcnRUcnVlKE1vZGlmaWVyLmlzU3RhdGljKG0pID09IChtID09IE1vZGlmaWVyLlNUQVRJQykpOwotCQkJYXNzZXJ0VHJ1ZShNb2RpZmllci5pc1N0cmljdGZwKG0pID09IChtID09IE1vZGlmaWVyLlNUUklDVEZQKSk7Ci0JCQlhc3NlcnRUcnVlKE1vZGlmaWVyLmlzU3luY2hyb25pemVkKG0pID09IChtID09IE1vZGlmaWVyLlNZTkNIUk9OSVpFRCkpOwotCQkJYXNzZXJ0VHJ1ZShNb2RpZmllci5pc1RyYW5zaWVudChtKSA9PSAobSA9PSBNb2RpZmllci5UUkFOU0lFTlQpKTsKLQkJCWFzc2VydFRydWUoTW9kaWZpZXIuaXNWb2xhdGlsZShtKSA9PSAobSA9PSBNb2RpZmllci5WT0xBVElMRSkpOwotCQl9Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3VidHJlZUJ5dGVzKCkgewotCQkKLQkJQVNUTm9kZSB4ID0gb25lT2ZFYWNoKGFzdCk7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKCJvbmVPZkVhY2goKS5zdWJ0cmVlQnl0ZXMoKTogIiArIHguc3VidHJlZUJ5dGVzKCkpOwotCQlhc3NlcnRUcnVlKHguc3VidHJlZUJ5dGVzKCkgPiAwKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5vZGVUeXBlQ29uc3RhbnRzKCkgewotCQkvLyBpdCB3b3VsZCBiZSBhIGJyZWFraW5nIEFQSSBjaGFuZ2UgdG8gY2hhbmdlIHRoZSBudW1lcmljIHZhbHVlcyBvZgotCQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIGludHMKLQkJYXNzZXJ0VHJ1ZShBU1ROb2RlLkFOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTiA9PSAxKTsKLQkJYXNzZXJ0VHJ1ZShBU1ROb2RlLkFSUkFZX0FDQ0VTUyA9PSAyKTsKLQkJYXNzZXJ0VHJ1ZShBU1ROb2RlLkFSUkFZX0NSRUFUSU9OID09IDMpOwotCQlhc3NlcnRUcnVlKEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVIgPT0gNCk7Ci0JCWFzc2VydFRydWUoQVNUTm9kZS5BUlJBWV9UWVBFID09IDUpOwotCQlhc3NlcnRUcnVlKEFTVE5vZGUuQVNTRVJUX1NUQVRFTUVOVCA9PSA2KTsKLQkJYXNzZXJ0VHJ1ZShBU1ROb2RlLkFTU0lHTk1FTlQgPT0gNyk7Ci0JCWFzc2VydFRydWUoQVNUTm9kZS5CTE9DSyA9PSA4KTsKLQkJYXNzZXJ0VHJ1ZShBU1ROb2RlLkJPT0xFQU5fTElURVJBTCA9PSA5KTsKLQkJYXNzZXJ0VHJ1ZShBU1ROb2RlLkJSRUFLX1NUQVRFTUVOVCA9PSAxMCk7Ci0JCWFzc2VydFRydWUoQVNUTm9kZS5DQVNUX0VYUFJFU1NJT04gPT0gMTEpOwotCQlhc3NlcnRUcnVlKEFTVE5vZGUuQ0FUQ0hfQ0xBVVNFID09IDEyKTsKLQkJYXNzZXJ0VHJ1ZShBU1ROb2RlLkNIQVJBQ1RFUl9MSVRFUkFMID09IDEzKTsKLQkJYXNzZXJ0VHJ1ZShBU1ROb2RlLkNMQVNTX0lOU1RBTkNFX0NSRUFUSU9OID09IDE0KTsKLQkJYXNzZXJ0VHJ1ZShBU1ROb2RlLkNPTVBJTEFUSU9OX1VOSVQgPT0gMTUpOwotCQlhc3NlcnRUcnVlKEFTVE5vZGUuQ09ORElUSU9OQUxfRVhQUkVTU0lPTiA9PSAxNik7Ci0JCWFzc2VydFRydWUoQVNUTm9kZS5DT05TVFJVQ1RPUl9JTlZPQ0FUSU9OID09IDE3KTsKLQkJYXNzZXJ0VHJ1ZShBU1ROb2RlLkNPTlRJTlVFX1NUQVRFTUVOVCA9PSAxOCk7Ci0JCWFzc2VydFRydWUoQVNUTm9kZS5ET19TVEFURU1FTlQgPT0gMTkpOwotCQlhc3NlcnRUcnVlKEFTVE5vZGUuRU1QVFlfU1RBVEVNRU5UID09IDIwKTsKLQkJYXNzZXJ0VHJ1ZShBU1ROb2RlLkVYUFJFU1NJT05fU1RBVEVNRU5UID09IDIxKTsKLQkJYXNzZXJ0VHJ1ZShBU1ROb2RlLkZJRUxEX0FDQ0VTUyA9PSAyMik7Ci0JCWFzc2VydFRydWUoQVNUTm9kZS5GSUVMRF9ERUNMQVJBVElPTiA9PSAyMyk7Ci0JCWFzc2VydFRydWUoQVNUTm9kZS5GT1JfU1RBVEVNRU5UID09IDI0KTsKLQkJYXNzZXJ0VHJ1ZShBU1ROb2RlLklGX1NUQVRFTUVOVCA9PSAyNSk7Ci0JCWFzc2VydFRydWUoQVNUTm9kZS5JTVBPUlRfREVDTEFSQVRJT04gPT0gMjYpOwotCQlhc3NlcnRUcnVlKEFTVE5vZGUuSU5GSVhfRVhQUkVTU0lPTiA9PSAyNyk7Ci0JCWFzc2VydFRydWUoQVNUTm9kZS5JTklUSUFMSVpFUiA9PSAyOCk7Ci0JCWFzc2VydFRydWUoQVNUTm9kZS5KQVZBRE9DID09IDI5KTsKLQkJYXNzZXJ0VHJ1ZShBU1ROb2RlLkxBQkVMRURfU1RBVEVNRU5UID09IDMwKTsKLQkJYXNzZXJ0VHJ1ZShBU1ROb2RlLk1FVEhPRF9ERUNMQVJBVElPTiA9PSAzMSk7Ci0JCWFzc2VydFRydWUoQVNUTm9kZS5NRVRIT0RfSU5WT0NBVElPTiA9PSAzMik7Ci0JCWFzc2VydFRydWUoQVNUTm9kZS5OVUxMX0xJVEVSQUwgPT0gMzMpOwotCQlhc3NlcnRUcnVlKEFTVE5vZGUuTlVNQkVSX0xJVEVSQUwgPT0gMzQpOwotCQlhc3NlcnRUcnVlKEFTVE5vZGUuUEFDS0FHRV9ERUNMQVJBVElPTiA9PSAzNSk7Ci0JCWFzc2VydFRydWUoQVNUTm9kZS5QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT04gPT0gMzYpOwotCQlhc3NlcnRUcnVlKEFTVE5vZGUuUE9TVEZJWF9FWFBSRVNTSU9OID09IDM3KTsKLQkJYXNzZXJ0VHJ1ZShBU1ROb2RlLlBSRUZJWF9FWFBSRVNTSU9OID09IDM4KTsKLQkJYXNzZXJ0VHJ1ZShBU1ROb2RlLlBSSU1JVElWRV9UWVBFID09IDM5KTsKLQkJYXNzZXJ0VHJ1ZShBU1ROb2RlLlFVQUxJRklFRF9OQU1FID09IDQwKTsKLQkJYXNzZXJ0VHJ1ZShBU1ROb2RlLlJFVFVSTl9TVEFURU1FTlQgPT0gNDEpOwotCQlhc3NlcnRUcnVlKEFTVE5vZGUuU0lNUExFX05BTUUgPT0gNDIpOwotCQlhc3NlcnRUcnVlKEFTVE5vZGUuU0lNUExFX1RZUEUgPT0gNDMpOwotCQlhc3NlcnRUcnVlKEFTVE5vZGUuU0lOR0xFX1ZBUklBQkxFX0RFQ0xBUkFUSU9OID09IDQ0KTsKLQkJYXNzZXJ0VHJ1ZShBU1ROb2RlLlNUUklOR19MSVRFUkFMID09IDQ1KTsKLQkJYXNzZXJ0VHJ1ZShBU1ROb2RlLlNVUEVSX0NPTlNUUlVDVE9SX0lOVk9DQVRJT04gPT0gNDYpOwotCQlhc3NlcnRUcnVlKEFTVE5vZGUuU1VQRVJfRklFTERfQUNDRVNTID09IDQ3KTsKLQkJYXNzZXJ0VHJ1ZShBU1ROb2RlLlNVUEVSX01FVEhPRF9JTlZPQ0FUSU9OID09IDQ4KTsKLQkJYXNzZXJ0VHJ1ZShBU1ROb2RlLlNXSVRDSF9DQVNFID09IDQ5KTsKLQkJYXNzZXJ0VHJ1ZShBU1ROb2RlLlNXSVRDSF9TVEFURU1FTlQgPT0gNTApOwotCQlhc3NlcnRUcnVlKEFTVE5vZGUuU1lOQ0hST05JWkVEX1NUQVRFTUVOVCA9PSA1MSk7Ci0JCWFzc2VydFRydWUoQVNUTm9kZS5USElTX0VYUFJFU1NJT04gPT0gNTIpOwotCQlhc3NlcnRUcnVlKEFTVE5vZGUuVEhST1dfU1RBVEVNRU5UID09IDUzKTsKLQkJYXNzZXJ0VHJ1ZShBU1ROb2RlLlRSWV9TVEFURU1FTlQgPT0gNTQpOwotCQlhc3NlcnRUcnVlKEFTVE5vZGUuVFlQRV9ERUNMQVJBVElPTiA9PSA1NSk7Ci0JCWFzc2VydFRydWUoQVNUTm9kZS5UWVBFX0RFQ0xBUkFUSU9OX1NUQVRFTUVOVCA9PSA1Nik7Ci0JCWFzc2VydFRydWUoQVNUTm9kZS5UWVBFX0xJVEVSQUwgPT0gNTcpOwotCQlhc3NlcnRUcnVlKEFTVE5vZGUuVkFSSUFCTEVfREVDTEFSQVRJT05fRVhQUkVTU0lPTiA9PSA1OCk7Ci0JCWFzc2VydFRydWUoQVNUTm9kZS5WQVJJQUJMRV9ERUNMQVJBVElPTl9GUkFHTUVOVCA9PSA1OSk7Ci0JCWFzc2VydFRydWUoQVNUTm9kZS5WQVJJQUJMRV9ERUNMQVJBVElPTl9TVEFURU1FTlQgPT0gNjApOwotCQlhc3NlcnRUcnVlKEFTVE5vZGUuV0hJTEVfU1RBVEVNRU5UID09IDYxKTsKLQkJYXNzZXJ0VHJ1ZShBU1ROb2RlLklOU1RBTkNFT0ZfRVhQUkVTU0lPTiA9PSA2Mik7Ci0JCQotCQkvLyBlbnN1cmUgdGhhdCBhbGwgY29uc3RhbnRzIGFyZSBkaXN0aW5jdCwgcG9zaXRpdmUsIGFuZCBzbWFsbAotCQkvLyAodGhpcyBtYXkgc2VlbSBwYXJhbm9pZCwgYnV0IHRoaXMgdGVzdCBkaWQgdW5jb3ZlciBhIHN0dXBpZCBidWchKQotCQlpbnRbXSBhbGw9IHsKLSAgICAgICAgICAgICAgQVNUTm9kZS5BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT04sCi0gICAgICAgICAgICAgIEFTVE5vZGUuQVJSQVlfQUNDRVNTLAotICAgICAgICAgICAgICBBU1ROb2RlLkFSUkFZX0NSRUFUSU9OLAotICAgICAgICAgICAgICBBU1ROb2RlLkFSUkFZX0lOSVRJQUxJWkVSLAotICAgICAgICAgICAgICBBU1ROb2RlLkFSUkFZX1RZUEUsCi0gICAgICAgICAgICAgIEFTVE5vZGUuQVNTRVJUX1NUQVRFTUVOVCwKLSAgICAgICAgICAgICAgQVNUTm9kZS5BU1NJR05NRU5ULAotICAgICAgICAgICAgICBBU1ROb2RlLkJMT0NLLAotICAgICAgICAgICAgICBBU1ROb2RlLkJPT0xFQU5fTElURVJBTCwKLSAgICAgICAgICAgICAgQVNUTm9kZS5CUkVBS19TVEFURU1FTlQsCi0gICAgICAgICAgICAgIEFTVE5vZGUuQ0FTVF9FWFBSRVNTSU9OLAotICAgICAgICAgICAgICBBU1ROb2RlLkNBVENIX0NMQVVTRSwKLSAgICAgICAgICAgICAgQVNUTm9kZS5DSEFSQUNURVJfTElURVJBTCwKLSAgICAgICAgICAgICAgQVNUTm9kZS5DTEFTU19JTlNUQU5DRV9DUkVBVElPTiwKLSAgICAgICAgICAgICAgQVNUTm9kZS5DT01QSUxBVElPTl9VTklULAotICAgICAgICAgICAgICBBU1ROb2RlLkNPTkRJVElPTkFMX0VYUFJFU1NJT04sCi0gICAgICAgICAgICAgIEFTVE5vZGUuQ09OU1RSVUNUT1JfSU5WT0NBVElPTiwKLSAgICAgICAgICAgICAgQVNUTm9kZS5DT05USU5VRV9TVEFURU1FTlQsCi0gICAgICAgICAgICAgIEFTVE5vZGUuRE9fU1RBVEVNRU5ULAotICAgICAgICAgICAgICBBU1ROb2RlLkVNUFRZX1NUQVRFTUVOVCwKLSAgICAgICAgICAgICAgQVNUTm9kZS5FWFBSRVNTSU9OX1NUQVRFTUVOVCwKLSAgICAgICAgICAgICAgQVNUTm9kZS5GSUVMRF9BQ0NFU1MsCi0gICAgICAgICAgICAgIEFTVE5vZGUuRklFTERfREVDTEFSQVRJT04sCi0gICAgICAgICAgICAgIEFTVE5vZGUuRk9SX1NUQVRFTUVOVCwKLSAgICAgICAgICAgICAgQVNUTm9kZS5JRl9TVEFURU1FTlQsCi0gICAgICAgICAgICAgIEFTVE5vZGUuSU1QT1JUX0RFQ0xBUkFUSU9OLAotICAgICAgICAgICAgICBBU1ROb2RlLklORklYX0VYUFJFU1NJT04sCi0gICAgICAgICAgICAgIEFTVE5vZGUuSU5TVEFOQ0VPRl9FWFBSRVNTSU9OLAotICAgICAgICAgICAgICBBU1ROb2RlLklOSVRJQUxJWkVSLAotICAgICAgICAgICAgICBBU1ROb2RlLkpBVkFET0MsCi0gICAgICAgICAgICAgIEFTVE5vZGUuTEFCRUxFRF9TVEFURU1FTlQsCi0gICAgICAgICAgICAgIEFTVE5vZGUuTUVUSE9EX0RFQ0xBUkFUSU9OLAotICAgICAgICAgICAgICBBU1ROb2RlLk1FVEhPRF9JTlZPQ0FUSU9OLAotICAgICAgICAgICAgICBBU1ROb2RlLk5VTExfTElURVJBTCwKLSAgICAgICAgICAgICAgQVNUTm9kZS5OVU1CRVJfTElURVJBTCwKLSAgICAgICAgICAgICAgQVNUTm9kZS5QQUNLQUdFX0RFQ0xBUkFUSU9OLAotICAgICAgICAgICAgICBBU1ROb2RlLlBBUkVOVEhFU0laRURfRVhQUkVTU0lPTiwKLSAgICAgICAgICAgICAgQVNUTm9kZS5QT1NURklYX0VYUFJFU1NJT04sCi0gICAgICAgICAgICAgIEFTVE5vZGUuUFJFRklYX0VYUFJFU1NJT04sCi0gICAgICAgICAgICAgIEFTVE5vZGUuUFJJTUlUSVZFX1RZUEUsCi0gICAgICAgICAgICAgIEFTVE5vZGUuUVVBTElGSUVEX05BTUUsCi0gICAgICAgICAgICAgIEFTVE5vZGUuUkVUVVJOX1NUQVRFTUVOVCwKLSAgICAgICAgICAgICAgQVNUTm9kZS5TSU1QTEVfTkFNRSwKLSAgICAgICAgICAgICAgQVNUTm9kZS5TSU1QTEVfVFlQRSwKLSAgICAgICAgICAgICAgQVNUTm9kZS5TSU5HTEVfVkFSSUFCTEVfREVDTEFSQVRJT04sCi0gICAgICAgICAgICAgIEFTVE5vZGUuU1RSSU5HX0xJVEVSQUwsCi0gICAgICAgICAgICAgIEFTVE5vZGUuU1VQRVJfQ09OU1RSVUNUT1JfSU5WT0NBVElPTiwKLSAgICAgICAgICAgICAgQVNUTm9kZS5TVVBFUl9GSUVMRF9BQ0NFU1MsCi0gICAgICAgICAgICAgIEFTVE5vZGUuU1VQRVJfTUVUSE9EX0lOVk9DQVRJT04sCi0gICAgICAgICAgICAgIEFTVE5vZGUuU1dJVENIX0NBU0UsCi0gICAgICAgICAgICAgIEFTVE5vZGUuU1dJVENIX1NUQVRFTUVOVCwKLSAgICAgICAgICAgICAgQVNUTm9kZS5TWU5DSFJPTklaRURfU1RBVEVNRU5ULAotICAgICAgICAgICAgICBBU1ROb2RlLlRISVNfRVhQUkVTU0lPTiwKLSAgICAgICAgICAgICAgQVNUTm9kZS5USFJPV19TVEFURU1FTlQsCi0gICAgICAgICAgICAgIEFTVE5vZGUuVFJZX1NUQVRFTUVOVCwKLSAgICAgICAgICAgICAgQVNUTm9kZS5UWVBFX0RFQ0xBUkFUSU9OLAotICAgICAgICAgICAgICBBU1ROb2RlLlRZUEVfREVDTEFSQVRJT05fU1RBVEVNRU5ULAotICAgICAgICAgICAgICBBU1ROb2RlLlRZUEVfTElURVJBTCwKLSAgICAgICAgICAgICAgQVNUTm9kZS5WQVJJQUJMRV9ERUNMQVJBVElPTl9FWFBSRVNTSU9OLAotICAgICAgICAgICAgICBBU1ROb2RlLlZBUklBQkxFX0RFQ0xBUkFUSU9OX0ZSQUdNRU5ULAotICAgICAgICAgICAgICBBU1ROb2RlLlZBUklBQkxFX0RFQ0xBUkFUSU9OX1NUQVRFTUVOVCwKLSAgICAgICAgICAgICAgQVNUTm9kZS5XSElMRV9TVEFURU1FTlQsCi0KLQkJfTsKLQkJaW50IE1JTiA9IDE7Ci0JCWludCBNQVggPSAxMDA7Ci0JCVNldCBzID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGFsbC5sZW5ndGg7IGkrKykgewotCQkJYXNzZXJ0VHJ1ZShNSU4gPD0gYWxsW2ldICYmIGFsbFtpXSA8PSBNQVgpOwotCQkJcy5hZGQobmV3IEludGVnZXIoYWxsW2ldKSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShzLnNpemUoKSA9PSBhbGwubGVuZ3RoKTsKLQkJLy8gZW5zdXJlIHRoYXQgSW50ZWdlcnMgcmVhbGx5IGRvIGNvbXBhcmUgcHJvcGVybHkgd2l0aCBlcXVhbHMKLQkJYXNzZXJ0VHJ1ZShuZXcgSW50ZWdlcigxKS5lcXVhbHMobmV3IEludGVnZXIoMSkpKTsKLQkJCQotCX19Ci0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9kb20vQVNUVmlzaXRvclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9kb20vQVNUVmlzaXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZlNTRkOS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZG9tL0FTVFZpc2l0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5kb207Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBBU1RWaXNpdG9yVGVzdCBleHRlbmRzIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmp1bml0LmV4dGVuc2lvbi5UZXN0Q2FzZSB7IAotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlIHN1aXRlID0gbmV3IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGUoQVNUVmlzaXRvclRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJCi0JCUNsYXNzIGMgPSBBU1RWaXNpdG9yVGVzdC5jbGFzczsKLQkJTWV0aG9kW10gbWV0aG9kcyA9IGMuZ2V0TWV0aG9kcygpOwotCQlmb3IgKGludCBpID0gMCwgbWF4ID0gbWV0aG9kcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewotCQkJaWYgKG1ldGhvZHNbaV0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInRlc3QiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJc3VpdGUuYWRkVGVzdChuZXcgQVNUVmlzaXRvclRlc3QobWV0aG9kc1tpXS5nZXROYW1lKCkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VpdGU7Ci0JfQkKLQkKLQlBU1QgYXN0OwotCVNpbXBsZU5hbWUgTjE7Ci0JU3RyaW5nIE4xUzsKLQlTaW1wbGVOYW1lIE4yOwotCVN0cmluZyBOMlM7Ci0JU2ltcGxlTmFtZSBOMzsKLQlTdHJpbmcgTjNTOwotCUV4cHJlc3Npb24gRTE7Ci0JU3RyaW5nIEUxUzsKLQlFeHByZXNzaW9uIEUyOwotCVN0cmluZyBFMlM7Ci0JVHlwZSBUMTsKLQlTdHJpbmcgVDFTOwotCVN0YXRlbWVudCBTMTsKLQlTdHJpbmcgUzFTOwotCVN0YXRlbWVudCBTMjsKLQlCbG9jayBCMTsKLQlTdHJpbmcgQjFTOwotCVN0cmluZyBTMlM7Ci0JU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBWMTsKLQlTdHJpbmcgVjFTOwotCVNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gVjI7Ci0JU3RyaW5nIFYyUzsKLQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgVzE7Ci0JU3RyaW5nIFcxUzsKLQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgVzI7Ci0JU3RyaW5nIFcyUzsKLQlGaWVsZERlY2xhcmF0aW9uIEZEMTsKLQlTdHJpbmcgRkQxUzsKLQlGaWVsZERlY2xhcmF0aW9uIEZEMjsKLQlTdHJpbmcgRkQyUzsKLQlQYWNrYWdlRGVjbGFyYXRpb24gUEQxOwotCVN0cmluZyBQRDFTOwotCUltcG9ydERlY2xhcmF0aW9uIElEMTsKLQlTdHJpbmcgSUQxUzsKLQlJbXBvcnREZWNsYXJhdGlvbiBJRDI7Ci0JU3RyaW5nIElEMlM7Ci0JVHlwZURlY2xhcmF0aW9uIFREMTsKLQlTdHJpbmcgVEQxUzsKLQlUeXBlRGVjbGFyYXRpb24gVEQyOwotCVN0cmluZyBURDJTOwotCUphdmFkb2MgSkQxOwotCVN0cmluZyBKRDFTOwotCUphdmFkb2MgSkQyOwotCVN0cmluZyBKRDJTOwotCUFub255bW91c0NsYXNzRGVjbGFyYXRpb24gQUNEMTsKLQlTdHJpbmcgQUNEMVM7Ci0JCi0JZmluYWwgU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCi0JcHVibGljIEFTVFZpc2l0b3JUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQkJYXN0ID0gbmV3IEFTVCgpOwotCQlOMSA9IGFzdC5uZXdTaW1wbGVOYW1lKCJOIik7IC8vJE5PTi1OTFMtMSQKLQkJTjFTID0gIlsoblNOTm5TKV0iOyAvLyROT04tTkxTLTEkCi0JCU4yID0gYXN0Lm5ld1NpbXBsZU5hbWUoIk0iKTsgLy8kTk9OLU5MUy0xJAotCQlOMlMgPSAiWyhuU01NblMpXSI7IC8vJE5PTi1OTFMtMSQKLQkJTjMgPSBhc3QubmV3U2ltcGxlTmFtZSgiTyIpOyAvLyROT04tTkxTLTEkCi0JCU4zUyA9ICJbKG5TT09uUyldIjsgLy8kTk9OLU5MUy0xJAotCQlFMSA9IGFzdC5uZXdTaW1wbGVOYW1lKCJYIik7IC8vJE5PTi1OTFMtMSQKLQkJRTFTID0gIlsoblNYWG5TKV0iOyAvLyROT04tTkxTLTEkCi0JCUUyID0gYXN0Lm5ld1NpbXBsZU5hbWUoIlkiKTsgLy8kTk9OLU5MUy0xJAotCQlFMlMgPSAiWyhuU1lZblMpXSI7IC8vJE5PTi1OTFMtMSQKLQkJVDEgPSBhc3QubmV3U2ltcGxlVHlwZShhc3QubmV3U2ltcGxlTmFtZSgiWiIpKTsgLy8kTk9OLU5MUy0xJAotCQlUMVMgPSAiWyh0U1soblNaWm5TKV10UyldIjsgLy8kTk9OLU5MUy0xJAotCQlTMSA9IGFzdC5uZXdDb250aW51ZVN0YXRlbWVudCgpOwotCQlTMVMgPSAiWyhzQ05zQ04pXSI7IC8vJE5PTi1OTFMtMSQKLQkJUzIgPSBhc3QubmV3QnJlYWtTdGF0ZW1lbnQoKTsKLQkJUzJTID0gIlsoc0JSc0JSKV0iOyAvLyROT04tTkxTLTEkCi0JCUIxID0gYXN0Lm5ld0Jsb2NrKCk7Ci0JCUIxUyA9ICJbKHNCc0IpXSI7IC8vJE5PTi1OTFMtMSQKLQkJVjEgPSBhc3QubmV3U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbigpOwotCQlWMS5zZXRUeXBlKGFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuSU5UKSk7Ci0JCVYxLnNldE5hbWUoYXN0Lm5ld1NpbXBsZU5hbWUoImEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJVjFTID0gIlsoVkRbKHRQaW50aW50dFApXVsoblNhYW5TKV1WRCldIjsgLy8kTk9OLU5MUy0xJAotCQlWMiA9IGFzdC5uZXdTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKCk7Ci0JCVYyLnNldFR5cGUoYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5CWVRFKSk7Ci0JCVYyLnNldE5hbWUoYXN0Lm5ld1NpbXBsZU5hbWUoImIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJVjJTID0gIlsoVkRbKHRQYnl0ZWJ5dGV0UCldWyhuU2JiblMpXVZEKV0iOyAvLyROT04tTkxTLTEkCi0JCVcxID0gYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQlXMS5zZXROYW1lKGFzdC5uZXdTaW1wbGVOYW1lKCJhIikpOyAvLyROT04tTkxTLTEkCi0JCVcxUyA9ICJbKFZTWyhuU2FhblMpXVZTKV0iOyAvLyROT04tTkxTLTEkCi0JCVcyID0gYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQlXMi5zZXROYW1lKGFzdC5uZXdTaW1wbGVOYW1lKCJiIikpOyAvLyROT04tTkxTLTEkCi0JCVcyUyA9ICJbKFZTWyhuU2JiblMpXVZTKV0iOyAvLyROT04tTkxTLTEkCi0JCXsKLQkJCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB0ZW1wID0gYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQkJdGVtcC5zZXROYW1lKGFzdC5uZXdTaW1wbGVOYW1lKCJmIikpOyAvLyROT04tTkxTLTEkCi0JCQlGRDEgPSBhc3QubmV3RmllbGREZWNsYXJhdGlvbih0ZW1wKTsKLQkJCUZEMS5zZXRUeXBlKGFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuSU5UKSk7Ci0JCQlGRDFTID0gIlsoRkRbKHRQaW50aW50dFApXVsoVlNbKG5TZmZuUyldVlMpXUZEKV0iOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJewotCQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHRlbXAgPSBhc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCQl0ZW1wLnNldE5hbWUoYXN0Lm5ld1NpbXBsZU5hbWUoImciKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUZEMiA9IGFzdC5uZXdGaWVsZERlY2xhcmF0aW9uKHRlbXApOwotCQkJRkQyLnNldFR5cGUoYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5DSEFSKSk7Ci0JCQlGRDJTID0gIlsoRkRbKHRQY2hhcmNoYXJ0UCldWyhWU1soblNnZ25TKV1WUyldRkQpXSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlQRDEgPSBhc3QubmV3UGFja2FnZURlY2xhcmF0aW9uKCk7Ci0JCVBEMS5zZXROYW1lKGFzdC5uZXdTaW1wbGVOYW1lKCJwIikpOyAvLyROT04tTkxTLTEkCi0JCVBEMVMgPSAiWyhQRFsoblNwcG5TKV1QRCldIjsgLy8kTk9OLU5MUy0xJAotCQlJRDEgPSBhc3QubmV3SW1wb3J0RGVjbGFyYXRpb24oKTsKLQkJSUQxLnNldE5hbWUoYXN0Lm5ld1NpbXBsZU5hbWUoImkiKSk7IC8vJE5PTi1OTFMtMSQKLQkJSUQxUyA9ICJbKElEWyhuU2lpblMpXUlEKV0iOyAvLyROT04tTkxTLTEkCi0JCUlEMiA9IGFzdC5uZXdJbXBvcnREZWNsYXJhdGlvbigpOwotCQlJRDIuc2V0TmFtZShhc3QubmV3U2ltcGxlTmFtZSgiaiIpKTsgLy8kTk9OLU5MUy0xJAotCQlJRDJTID0gIlsoSURbKG5TampuUyldSUQpXSI7IC8vJE5PTi1OTFMtMSQKLQkJVEQxID0gYXN0Lm5ld1R5cGVEZWNsYXJhdGlvbigpOwotCQlURDEuc2V0TmFtZShhc3QubmV3U2ltcGxlTmFtZSgiYyIpKTsgLy8kTk9OLU5MUy0xJAotCQlURDFTID0gIlsoVERbKG5TY2NuUyldVEQpXSI7IC8vJE5PTi1OTFMtMSQKLQkJVEQyID0gYXN0Lm5ld1R5cGVEZWNsYXJhdGlvbigpOwotCQlURDIuc2V0TmFtZShhc3QubmV3U2ltcGxlTmFtZSgiZCIpKTsgLy8kTk9OLU5MUy0xJAotCQlURDJTID0gIlsoVERbKG5TZGRuUyldVEQpXSI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUFDRDEgPSBhc3QubmV3QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpOwotCQlBQ0QxUyA9ICJbKEFDREFDRCldIjsgLy8kTk9OLU5MUy0xJAotCQkKLQkJSkQxID0gYXN0Lm5ld0phdmFkb2MoKTsKLQkJSkQxLnNldENvbW1lbnQoIi8qKlgqLyIpOyAvLyROT04tTkxTLTEkCi0JCUpEMVMgPSAiWyhKRC8qKlgqLy8qKlgqL0pEKV0iOyAvLyROT04tTkxTLTEkCi0JCUpEMiA9IGFzdC5uZXdKYXZhZG9jKCk7Ci0JCUpEMi5zZXRDb21tZW50KCIvKipZKi8iKTsgLy8kTk9OLU5MUy0xJAotCQlKRDJTID0gIlsoSkQvKipZKi8vKipZKi9KRCldIjsgLy8kTk9OLU5MUy0xJAotCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCQlhc3QgPSBudWxsOwotCX0KLQkKLQljbGFzcyBUZXN0VmlzaXRvciBleHRlbmRzIEFTVFZpc2l0b3IgewotCQkKLQkJYm9vbGVhbiB2aXNpdFRoZUtpZHMgPSB0cnVlOwotCQkKLQkJcHVibGljIGJvb2xlYW4gaXNWaXNpdGluZ0NoaWxkcmVuKCkgewotCQkJcmV0dXJuIHZpc2l0VGhlS2lkczsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFZpc2l0aW5nQ2hpbGRyZW4oYm9vbGVhbiB2aXNpdENoaWxkcmVuKSB7Ci0JCQl2aXNpdFRoZUtpZHMgPSB2aXNpdENoaWxkcmVuOwotCQl9Ci0KLQkJLy8gTkFNRVMKLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTaW1wbGVOYW1lIG5vZGUpIHsKLQkJCWIuYXBwZW5kKCIoblMiKTsgLy8kTk9OLU5MUy0xJAotCQkJYi5hcHBlbmQobm9kZS5nZXRJZGVudGlmaWVyKCkpOwotCQkJcmV0dXJuIGlzVmlzaXRpbmdDaGlsZHJlbigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFNpbXBsZU5hbWUgbm9kZSkgewotCQkJYi5hcHBlbmQobm9kZS5nZXRJZGVudGlmaWVyKCkpOwotCQkJYi5hcHBlbmQoIm5TKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoUXVhbGlmaWVkTmFtZSBub2RlKSB7Ci0JCQliLmFwcGVuZCgiKG5RIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBpc1Zpc2l0aW5nQ2hpbGRyZW4oKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlbmRWaXNpdChRdWFsaWZpZWROYW1lIG5vZGUpIHsKLQkJCWIuYXBwZW5kKCJuUSkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gVFlQRVMKLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTaW1wbGVUeXBlIG5vZGUpIHsKLQkJCWIuYXBwZW5kKCIodFMiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGlzVmlzaXRpbmdDaGlsZHJlbigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFNpbXBsZVR5cGUgbm9kZSkgewotCQkJYi5hcHBlbmQoInRTKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoQXJyYXlUeXBlIG5vZGUpIHsKLQkJCWIuYXBwZW5kKCIodEEiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGlzVmlzaXRpbmdDaGlsZHJlbigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFycmF5VHlwZSBub2RlKSB7Ci0JCQliLmFwcGVuZCgidEEpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQcmltaXRpdmVUeXBlIG5vZGUpIHsKLQkJCWIuYXBwZW5kKCIodFAiKTsgLy8kTk9OLU5MUy0xJAotCQkJYi5hcHBlbmQobm9kZS5nZXRQcmltaXRpdmVUeXBlQ29kZSgpLnRvU3RyaW5nKCkpOwotCQkJcmV0dXJuIGlzVmlzaXRpbmdDaGlsZHJlbigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFByaW1pdGl2ZVR5cGUgbm9kZSkgewotCQkJYi5hcHBlbmQobm9kZS5nZXRQcmltaXRpdmVUeXBlQ29kZSgpLnRvU3RyaW5nKCkpOwotCQkJYi5hcHBlbmQoInRQKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBFWFBSRVNTSU9OUyBhbmQgU1RBVEVNRU5UUwotCi0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoQXJyYXlBY2Nlc3Mgbm9kZSkgewotCQkJYi5hcHBlbmQoIihlQUEiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGlzVmlzaXRpbmdDaGlsZHJlbigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFycmF5QWNjZXNzIG5vZGUpIHsKLQkJCWIuYXBwZW5kKCJlQUEpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KEFycmF5Q3JlYXRpb24gbm9kZSkgewotCQkJYi5hcHBlbmQoIihlQUMiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGlzVmlzaXRpbmdDaGlsZHJlbigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFycmF5Q3JlYXRpb24gbm9kZSkgewotCQkJYi5hcHBlbmQoImVBQykiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoQXJyYXlJbml0aWFsaXplciBub2RlKSB7Ci0JCQliLmFwcGVuZCgiKGVBSSIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gaXNWaXNpdGluZ0NoaWxkcmVuKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZW5kVmlzaXQoQXJyYXlJbml0aWFsaXplciBub2RlKSB7Ci0JCQliLmFwcGVuZCgiZUFJKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChBc3NlcnRTdGF0ZW1lbnQgbm9kZSkgewotCQkJYi5hcHBlbmQoIihzQVMiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGlzVmlzaXRpbmdDaGlsZHJlbigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFzc2VydFN0YXRlbWVudCBub2RlKSB7Ci0JCQliLmFwcGVuZCgic0FTKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChBc3NpZ25tZW50IG5vZGUpIHsKLQkJCWIuYXBwZW5kKCIoIik7IC8vJE5PTi1OTFMtMSQKLQkJCWIuYXBwZW5kKG5vZGUuZ2V0T3BlcmF0b3IoKS50b1N0cmluZygpKTsKLQkJCXJldHVybiBpc1Zpc2l0aW5nQ2hpbGRyZW4oKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlbmRWaXNpdChBc3NpZ25tZW50IG5vZGUpIHsKLQkJCWIuYXBwZW5kKG5vZGUuZ2V0T3BlcmF0b3IoKS50b1N0cmluZygpKTsKLQkJCWIuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KEJsb2NrIG5vZGUpIHsKLQkJCWIuYXBwZW5kKCIoc0IiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGlzVmlzaXRpbmdDaGlsZHJlbigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEJsb2NrIG5vZGUpIHsKLQkJCWIuYXBwZW5kKCJzQikiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoQm9vbGVhbkxpdGVyYWwgbm9kZSkgewotCQkJYi5hcHBlbmQoIihlQkwiKTsgLy8kTk9OLU5MUy0xJAotCQkJYi5hcHBlbmQobm9kZS5ib29sZWFuVmFsdWUoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiBpc1Zpc2l0aW5nQ2hpbGRyZW4oKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlbmRWaXNpdChCb29sZWFuTGl0ZXJhbCBub2RlKSB7Ci0JCQliLmFwcGVuZChub2RlLmJvb2xlYW5WYWx1ZSgpID8gInRydWUiIDogImZhbHNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJYi5hcHBlbmQoImVCTCkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoQnJlYWtTdGF0ZW1lbnQgbm9kZSkgewotCQkJYi5hcHBlbmQoIihzQlIiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGlzVmlzaXRpbmdDaGlsZHJlbigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEJyZWFrU3RhdGVtZW50IG5vZGUpIHsKLQkJCWIuYXBwZW5kKCJzQlIpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KENhc3RFeHByZXNzaW9uIG5vZGUpIHsKLQkJCWIuYXBwZW5kKCIoZUNTIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBpc1Zpc2l0aW5nQ2hpbGRyZW4oKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlbmRWaXNpdChDYXN0RXhwcmVzc2lvbiBub2RlKSB7Ci0JCQliLmFwcGVuZCgiZUNTKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChDYXRjaENsYXVzZSBub2RlKSB7Ci0JCQliLmFwcGVuZCgiKGNjIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBpc1Zpc2l0aW5nQ2hpbGRyZW4oKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlbmRWaXNpdChDYXRjaENsYXVzZSBub2RlKSB7Ci0JCQliLmFwcGVuZCgiY2MpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KENoYXJhY3RlckxpdGVyYWwgbm9kZSkgewotCQkJYi5hcHBlbmQoIihlQ0wiKTsgLy8kTk9OLU5MUy0xJAotCQkJYi5hcHBlbmQobm9kZS5nZXRFc2NhcGVkVmFsdWUoKSk7Ci0JCQlyZXR1cm4gaXNWaXNpdGluZ0NoaWxkcmVuKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZW5kVmlzaXQoQ2hhcmFjdGVyTGl0ZXJhbCBub2RlKSB7Ci0JCQliLmFwcGVuZChub2RlLmdldEVzY2FwZWRWYWx1ZSgpKTsKLQkJCWIuYXBwZW5kKCJlQ0wpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KENsYXNzSW5zdGFuY2VDcmVhdGlvbiBub2RlKSB7Ci0JCQliLmFwcGVuZCgiKGVDSSIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gaXNWaXNpdGluZ0NoaWxkcmVuKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZW5kVmlzaXQoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIG5vZGUpIHsKLQkJCWIuYXBwZW5kKCJlQ0kpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gbm9kZSkgewotCQkJYi5hcHBlbmQoIihBQ0QiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGlzVmlzaXRpbmdDaGlsZHJlbigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gbm9kZSkgewotCQkJYi5hcHBlbmQoIkFDRCkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoQ29tcGlsYXRpb25Vbml0IG5vZGUpIHsKLQkJCWIuYXBwZW5kKCIoQ1UiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGlzVmlzaXRpbmdDaGlsZHJlbigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENvbXBpbGF0aW9uVW5pdCBub2RlKSB7Ci0JCQliLmFwcGVuZCgiQ1UpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSB7Ci0JCQliLmFwcGVuZCgiKGVDTyIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gaXNWaXNpdGluZ0NoaWxkcmVuKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZW5kVmlzaXQoQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUpIHsKLQkJCWIuYXBwZW5kKCJlQ08pIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KENvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7Ci0JCQliLmFwcGVuZCgiKHNDSSIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gaXNWaXNpdGluZ0NoaWxkcmVuKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZW5kVmlzaXQoQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUpIHsKLQkJCWIuYXBwZW5kKCJzQ0kpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KENvbnRpbnVlU3RhdGVtZW50IG5vZGUpIHsKLQkJCWIuYXBwZW5kKCIoc0NOIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBpc1Zpc2l0aW5nQ2hpbGRyZW4oKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlbmRWaXNpdChDb250aW51ZVN0YXRlbWVudCBub2RlKSB7Ci0JCQliLmFwcGVuZCgic0NOKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChEb1N0YXRlbWVudCBub2RlKSB7Ci0JCQliLmFwcGVuZCgiKHNETyIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gaXNWaXNpdGluZ0NoaWxkcmVuKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZW5kVmlzaXQoRG9TdGF0ZW1lbnQgbm9kZSkgewotCQkJYi5hcHBlbmQoInNETykiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoRW1wdHlTdGF0ZW1lbnQgbm9kZSkgewotCQkJYi5hcHBlbmQoIihzRU0iKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGlzVmlzaXRpbmdDaGlsZHJlbigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEVtcHR5U3RhdGVtZW50IG5vZGUpIHsKLQkJCWIuYXBwZW5kKCJzRU0pIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSkgewotCQkJYi5hcHBlbmQoIihzRVgiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGlzVmlzaXRpbmdDaGlsZHJlbigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSkgewotCQkJYi5hcHBlbmQoInNFWCkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoRmllbGRBY2Nlc3Mgbm9kZSkgewotCQkJYi5hcHBlbmQoIihlRkEiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGlzVmlzaXRpbmdDaGlsZHJlbigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEZpZWxkQWNjZXNzIG5vZGUpIHsKLQkJCWIuYXBwZW5kKCJlRkEpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KEZpZWxkRGVjbGFyYXRpb24gbm9kZSkgewotCQkJYi5hcHBlbmQoIihGRCIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gaXNWaXNpdGluZ0NoaWxkcmVuKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZW5kVmlzaXQoRmllbGREZWNsYXJhdGlvbiBub2RlKSB7Ci0JCQliLmFwcGVuZCgiRkQpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KEZvclN0YXRlbWVudCBub2RlKSB7Ci0JCQliLmFwcGVuZCgiKHNGUiIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gaXNWaXNpdGluZ0NoaWxkcmVuKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZW5kVmlzaXQoRm9yU3RhdGVtZW50IG5vZGUpIHsKLQkJCWIuYXBwZW5kKCJzRlIpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElmU3RhdGVtZW50IG5vZGUpIHsKLQkJCWIuYXBwZW5kKCIoc0lGIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBpc1Zpc2l0aW5nQ2hpbGRyZW4oKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlbmRWaXNpdChJZlN0YXRlbWVudCBub2RlKSB7Ci0JCQliLmFwcGVuZCgic0lGKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJbXBvcnREZWNsYXJhdGlvbiBub2RlKSB7Ci0JCQliLmFwcGVuZCgiKElEIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBpc1Zpc2l0aW5nQ2hpbGRyZW4oKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlbmRWaXNpdChJbXBvcnREZWNsYXJhdGlvbiBub2RlKSB7Ci0JCQliLmFwcGVuZCgiSUQpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KEluZml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCQliLmFwcGVuZCgiKGVJTiIpOyAvLyROT04tTkxTLTEkCi0JCQliLmFwcGVuZChub2RlLmdldE9wZXJhdG9yKCkudG9TdHJpbmcoKSk7Ci0JCQlyZXR1cm4gaXNWaXNpdGluZ0NoaWxkcmVuKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZW5kVmlzaXQoSW5maXhFeHByZXNzaW9uIG5vZGUpIHsKLQkJCWIuYXBwZW5kKG5vZGUuZ2V0T3BlcmF0b3IoKS50b1N0cmluZygpKTsKLQkJCWIuYXBwZW5kKCJlSU4pIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KEluc3RhbmNlb2ZFeHByZXNzaW9uIG5vZGUpIHsKLQkJCWIuYXBwZW5kKCIoZUlPIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBpc1Zpc2l0aW5nQ2hpbGRyZW4oKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlbmRWaXNpdChJbnN0YW5jZW9mRXhwcmVzc2lvbiBub2RlKSB7Ci0JCQliLmFwcGVuZCgiZUlPKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJbml0aWFsaXplciBub2RlKSB7Ci0JCQliLmFwcGVuZCgiKElOIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBpc1Zpc2l0aW5nQ2hpbGRyZW4oKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlbmRWaXNpdChJbml0aWFsaXplciBub2RlKSB7Ci0JCQliLmFwcGVuZCgiSU4pIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KEphdmFkb2Mgbm9kZSkgewotCQkJYi5hcHBlbmQoIihKRCIpOyAvLyROT04tTkxTLTEkCi0JCQliLmFwcGVuZChub2RlLmdldENvbW1lbnQoKSk7Ci0JCQlyZXR1cm4gaXNWaXNpdGluZ0NoaWxkcmVuKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZW5kVmlzaXQoSmF2YWRvYyBub2RlKSB7Ci0JCQliLmFwcGVuZChub2RlLmdldENvbW1lbnQoKSk7Ci0JCQliLmFwcGVuZCgiSkQpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KExhYmVsZWRTdGF0ZW1lbnQgbm9kZSkgewotCQkJYi5hcHBlbmQoIihzTEEiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGlzVmlzaXRpbmdDaGlsZHJlbigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVuZFZpc2l0KExhYmVsZWRTdGF0ZW1lbnQgbm9kZSkgewotCQkJYi5hcHBlbmQoInNMQSkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoTWV0aG9kRGVjbGFyYXRpb24gbm9kZSkgewotCQkJYi5hcHBlbmQoIihNRCIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gaXNWaXNpdGluZ0NoaWxkcmVuKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZW5kVmlzaXQoTWV0aG9kRGVjbGFyYXRpb24gbm9kZSkgewotCQkJYi5hcHBlbmQoIk1EKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKLQkJCWIuYXBwZW5kKCIoZU1JIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBpc1Zpc2l0aW5nQ2hpbGRyZW4oKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlbmRWaXNpdChNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKLQkJCWIuYXBwZW5kKCJlTUkpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KE51bGxMaXRlcmFsIG5vZGUpIHsKLQkJCWIuYXBwZW5kKCIoZU5MIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBpc1Zpc2l0aW5nQ2hpbGRyZW4oKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlbmRWaXNpdChOdWxsTGl0ZXJhbCBub2RlKSB7Ci0JCQliLmFwcGVuZCgiZU5MKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChOdW1iZXJMaXRlcmFsIG5vZGUpIHsKLQkJCWIuYXBwZW5kKCIoZU5VIik7IC8vJE5PTi1OTFMtMSQKLQkJCWIuYXBwZW5kKG5vZGUuZ2V0VG9rZW4oKSk7Ci0JCQlyZXR1cm4gaXNWaXNpdGluZ0NoaWxkcmVuKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZW5kVmlzaXQoTnVtYmVyTGl0ZXJhbCBub2RlKSB7Ci0JCQliLmFwcGVuZChub2RlLmdldFRva2VuKCkpOwotCQkJYi5hcHBlbmQoImVOVSkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoUGFja2FnZURlY2xhcmF0aW9uIG5vZGUpIHsKLQkJCWIuYXBwZW5kKCIoUEQiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGlzVmlzaXRpbmdDaGlsZHJlbigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBhY2thZ2VEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCQliLmFwcGVuZCgiUEQpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIG5vZGUpIHsKLQkJCWIuYXBwZW5kKCIoZVBBIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBpc1Zpc2l0aW5nQ2hpbGRyZW4oKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBub2RlKSB7Ci0JCQliLmFwcGVuZCgiZVBBKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQb3N0Zml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCQliLmFwcGVuZCgiKGVQTyIpOyAvLyROT04tTkxTLTEkCi0JCQliLmFwcGVuZChub2RlLmdldE9wZXJhdG9yKCkudG9TdHJpbmcoKSk7Ci0JCQlyZXR1cm4gaXNWaXNpdGluZ0NoaWxkcmVuKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZW5kVmlzaXQoUG9zdGZpeEV4cHJlc3Npb24gbm9kZSkgewotCQkJYi5hcHBlbmQobm9kZS5nZXRPcGVyYXRvcigpLnRvU3RyaW5nKCkpOwotCQkJYi5hcHBlbmQoImVQTykiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoUHJlZml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCQliLmFwcGVuZCgiKGVQUiIpOyAvLyROT04tTkxTLTEkCi0JCQliLmFwcGVuZChub2RlLmdldE9wZXJhdG9yKCkudG9TdHJpbmcoKSk7Ci0JCQlyZXR1cm4gaXNWaXNpdGluZ0NoaWxkcmVuKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZW5kVmlzaXQoUHJlZml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCQliLmFwcGVuZChub2RlLmdldE9wZXJhdG9yKCkudG9TdHJpbmcoKSk7Ci0JCQliLmFwcGVuZCgiZVBSKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChSZXR1cm5TdGF0ZW1lbnQgbm9kZSkgewotCQkJYi5hcHBlbmQoIihzUlQiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGlzVmlzaXRpbmdDaGlsZHJlbigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFJldHVyblN0YXRlbWVudCBub2RlKSB7Ci0JCQliLmFwcGVuZCgic1JUKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKLQkJCWIuYXBwZW5kKCIoVkQiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGlzVmlzaXRpbmdDaGlsZHJlbigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewotCQkJYi5hcHBlbmQoIlZEKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTdHJpbmdMaXRlcmFsIG5vZGUpIHsKLQkJCWIuYXBwZW5kKCIoZVNMIik7IC8vJE5PTi1OTFMtMSQKLQkJCWIuYXBwZW5kKG5vZGUuZ2V0TGl0ZXJhbFZhbHVlKCkpOwotCQkJcmV0dXJuIGlzVmlzaXRpbmdDaGlsZHJlbigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFN0cmluZ0xpdGVyYWwgbm9kZSkgewotCQkJYi5hcHBlbmQobm9kZS5nZXRMaXRlcmFsVmFsdWUoKSk7Ci0JCQliLmFwcGVuZCgiZVNMKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7Ci0JCQliLmFwcGVuZCgiKHNTQyIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gaXNWaXNpdGluZ0NoaWxkcmVuKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZW5kVmlzaXQoU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgewotCQkJYi5hcHBlbmQoInNTQykiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoU3VwZXJGaWVsZEFjY2VzcyBub2RlKSB7Ci0JCQliLmFwcGVuZCgiKGVTRiIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gaXNWaXNpdGluZ0NoaWxkcmVuKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZW5kVmlzaXQoU3VwZXJGaWVsZEFjY2VzcyBub2RlKSB7Ci0JCQliLmFwcGVuZCgiZVNGKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTdXBlck1ldGhvZEludm9jYXRpb24gbm9kZSkgewotCQkJYi5hcHBlbmQoIihlU00iKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGlzVmlzaXRpbmdDaGlsZHJlbigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFN1cGVyTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7Ci0JCQliLmFwcGVuZCgiZVNNKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTd2l0Y2hDYXNlIG5vZGUpIHsKLQkJCWIuYXBwZW5kKCIoc1NDIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBpc1Zpc2l0aW5nQ2hpbGRyZW4oKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlbmRWaXNpdChTd2l0Y2hDYXNlIG5vZGUpIHsKLQkJCWIuYXBwZW5kKCJzU0MpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KFN3aXRjaFN0YXRlbWVudCBub2RlKSB7Ci0JCQliLmFwcGVuZCgiKHNTVyIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gaXNWaXNpdGluZ0NoaWxkcmVuKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZW5kVmlzaXQoU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKLQkJCWIuYXBwZW5kKCJzU1cpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KFN5bmNocm9uaXplZFN0YXRlbWVudCBub2RlKSB7Ci0JCQliLmFwcGVuZCgiKHNTWSIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gaXNWaXNpdGluZ0NoaWxkcmVuKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZW5kVmlzaXQoU3luY2hyb25pemVkU3RhdGVtZW50IG5vZGUpIHsKLQkJCWIuYXBwZW5kKCJzU1kpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KFRoaXNFeHByZXNzaW9uIG5vZGUpIHsKLQkJCWIuYXBwZW5kKCIoZVRIIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBpc1Zpc2l0aW5nQ2hpbGRyZW4oKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlbmRWaXNpdChUaGlzRXhwcmVzc2lvbiBub2RlKSB7Ci0JCQliLmFwcGVuZCgiZVRIKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChUaHJvd1N0YXRlbWVudCBub2RlKSB7Ci0JCQliLmFwcGVuZCgiKHNUUiIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gaXNWaXNpdGluZ0NoaWxkcmVuKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZW5kVmlzaXQoVGhyb3dTdGF0ZW1lbnQgbm9kZSkgewotCQkJYi5hcHBlbmQoInNUUikiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoVHJ5U3RhdGVtZW50IG5vZGUpIHsKLQkJCWIuYXBwZW5kKCIoc1RZIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBpc1Zpc2l0aW5nQ2hpbGRyZW4oKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlbmRWaXNpdChUcnlTdGF0ZW1lbnQgbm9kZSkgewotCQkJYi5hcHBlbmQoInNUWSkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZURlY2xhcmF0aW9uIG5vZGUpIHsKLQkJCWIuYXBwZW5kKCIoVEQiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGlzVmlzaXRpbmdDaGlsZHJlbigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFR5cGVEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCQliLmFwcGVuZCgiVEQpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KFR5cGVEZWNsYXJhdGlvblN0YXRlbWVudCBub2RlKSB7Ci0JCQliLmFwcGVuZCgiKHNURCIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gaXNWaXNpdGluZ0NoaWxkcmVuKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZW5kVmlzaXQoVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50IG5vZGUpIHsKLQkJCWIuYXBwZW5kKCJzVEQpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KFR5cGVMaXRlcmFsIG5vZGUpIHsKLQkJCWIuYXBwZW5kKCIoZVRMIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBpc1Zpc2l0aW5nQ2hpbGRyZW4oKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlbmRWaXNpdChUeXBlTGl0ZXJhbCBub2RlKSB7Ci0JCQliLmFwcGVuZCgiZVRMKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiBub2RlKSB7Ci0JCQliLmFwcGVuZCgiKGVWRCIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gaXNWaXNpdGluZ0NoaWxkcmVuKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZW5kVmlzaXQoVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gbm9kZSkgewotCQkJYi5hcHBlbmQoImVWRCkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IG5vZGUpIHsKLQkJCWIuYXBwZW5kKCIoVlMiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGlzVmlzaXRpbmdDaGlsZHJlbigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBub2RlKSB7Ci0JCQliLmFwcGVuZCgiVlMpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgbm9kZSkgewotCQkJYi5hcHBlbmQoIihzVkQiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGlzVmlzaXRpbmdDaGlsZHJlbigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgbm9kZSkgewotCQkJYi5hcHBlbmQoInNWRCkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoV2hpbGVTdGF0ZW1lbnQgbm9kZSkgewotCQkJYi5hcHBlbmQoIihzV0giKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGlzVmlzaXRpbmdDaGlsZHJlbigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFdoaWxlU3RhdGVtZW50IG5vZGUpIHsKLQkJCWIuYXBwZW5kKCJzV0gpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcHJlVmlzaXQoQVNUTm9kZSBub2RlKSB7Ci0JCQliLmFwcGVuZCgiWyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBwb3N0VmlzaXQoQVNUTm9kZSBub2RlKSB7Ci0JCQliLmFwcGVuZCgiXSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCX0JCi0JLy8gTkFNRVMKLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlTmFtZSgpIHsKLQkJTmFtZSB4MSA9IGFzdC5uZXdOYW1lKG5ldyBTdHJpbmdbXXsiWiJ9KTsgLy8kTk9OLU5MUy0xJAotCQlUZXN0VmlzaXRvciB2MSA9IG5ldyBUZXN0VmlzaXRvcigpOwotCQliLnNldExlbmd0aCgwKTsKLQkJeDEuYWNjZXB0KHYxKTsKLQkJU3RyaW5nIHJlc3VsdCA9IGIudG9TdHJpbmcoKTsKLQkJYXNzZXJ0VHJ1ZSgiWyhuU1pablMpXSIuZXF1YWxzKHJlc3VsdCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFF1YWxpZmllZE5hbWUoKSB7Ci0JCU5hbWUgeDEgPSBhc3QubmV3TmFtZShuZXcgU3RyaW5nW117IlgiLCAiWSJ9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVRlc3RWaXNpdG9yIHYxID0gbmV3IFRlc3RWaXNpdG9yKCk7Ci0JCWIuc2V0TGVuZ3RoKDApOwotCQl4MS5hY2NlcHQodjEpOwotCQlTdHJpbmcgcmVzdWx0ID0gYi50b1N0cmluZygpOwotCQlhc3NlcnRUcnVlKCJbKG5RWyhuU1hYblMpXVsoblNZWW5TKV1uUSldIi5lcXVhbHMocmVzdWx0KSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkKLQkvLyBUWVBFUwotCXB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVUeXBlKCkgewotCQlUeXBlIHgxID0gYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5DSEFSKTsKLQkJVGVzdFZpc2l0b3IgdjEgPSBuZXcgVGVzdFZpc2l0b3IoKTsKLQkJYi5zZXRMZW5ndGgoMCk7Ci0JCXgxLmFjY2VwdCh2MSk7Ci0JCVN0cmluZyByZXN1bHQgPSBiLnRvU3RyaW5nKCk7Ci0JCWFzc2VydFRydWUoIlsodFBjaGFyY2hhcnRQKV0iLmVxdWFscyhyZXN1bHQpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVUeXBlKCkgewotCQlUeXBlIHgxID0gYXN0Lm5ld1NpbXBsZVR5cGUoYXN0Lm5ld05hbWUobmV3IFN0cmluZ1tdeyJaIn0pKTsgLy8kTk9OLU5MUy0xJAotCQlUZXN0VmlzaXRvciB2MSA9IG5ldyBUZXN0VmlzaXRvcigpOwotCQliLnNldExlbmd0aCgwKTsKLQkJeDEuYWNjZXB0KHYxKTsKLQkJU3RyaW5nIHJlc3VsdCA9IGIudG9TdHJpbmcoKTsKLQkJYXNzZXJ0VHJ1ZSgiWyh0U1soblNaWm5TKV10UyldIi5lcXVhbHMocmVzdWx0KSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlUeXBlKCkgewotCQlUeXBlIHgwID0gYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5DSEFSKTsKLQkJVHlwZSB4MSA9IGFzdC5uZXdBcnJheVR5cGUoeDApOwotCQlUZXN0VmlzaXRvciB2MSA9IG5ldyBUZXN0VmlzaXRvcigpOwotCQliLnNldExlbmd0aCgwKTsKLQkJeDEuYWNjZXB0KHYxKTsKLQkJU3RyaW5nIHJlc3VsdCA9IGIudG9TdHJpbmcoKTsKLQkJYXNzZXJ0VHJ1ZSgiWyh0QVsodFBjaGFyY2hhcnRQKV10QSldIi5lcXVhbHMocmVzdWx0KSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyBFWFBSRVNTSU9OUyBhbmQgU1RBVEVNRU5UUwotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5QWNjZXNzKCkgewotCQlBcnJheUFjY2VzcyB4MSA9IGFzdC5uZXdBcnJheUFjY2VzcygpOwotCQl4MS5zZXRBcnJheShFMSk7Ci0JCXgxLnNldEluZGV4KEUyKTsKLQkJVGVzdFZpc2l0b3IgdjEgPSBuZXcgVGVzdFZpc2l0b3IoKTsKLQkJYi5zZXRMZW5ndGgoMCk7Ci0JCXgxLmFjY2VwdCh2MSk7Ci0JCVN0cmluZyByZXN1bHQgPSBiLnRvU3RyaW5nKCk7Ci0JCWFzc2VydFRydWUocmVzdWx0LmVxdWFscygiWyhlQUEiK0UxUytFMlMrImVBQSldIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFycmF5Q3JlYXRpb24oKSB7Ci0JCUFycmF5Q3JlYXRpb24geDEgPSBhc3QubmV3QXJyYXlDcmVhdGlvbigpOwotCQl4MS5zZXRUeXBlKGFzdC5uZXdBcnJheVR5cGUoVDEpKTsKLQkJeDEuZGltZW5zaW9ucygpLmFkZChFMSk7Ci0JCXgxLmRpbWVuc2lvbnMoKS5hZGQoRTIpOwotCQl4MS5zZXRJbml0aWFsaXplcihhc3QubmV3QXJyYXlJbml0aWFsaXplcigpKTsKLQkJVGVzdFZpc2l0b3IgdjEgPSBuZXcgVGVzdFZpc2l0b3IoKTsKLQkJYi5zZXRMZW5ndGgoMCk7Ci0JCXgxLmFjY2VwdCh2MSk7Ci0JCVN0cmluZyByZXN1bHQgPSBiLnRvU3RyaW5nKCk7Ci0JCWFzc2VydFRydWUocmVzdWx0LmVxdWFscygiWyhlQUMiKyJbKHRBIitUMVMrInRBKV0iK0UxUytFMlMrIlsoZUFJZUFJKV1lQUMpXSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJbml0aWFsaXplcigpIHsKLQkJQXJyYXlJbml0aWFsaXplciB4MSA9IGFzdC5uZXdBcnJheUluaXRpYWxpemVyKCk7Ci0JCXgxLmV4cHJlc3Npb25zKCkuYWRkKEUxKTsKLQkJeDEuZXhwcmVzc2lvbnMoKS5hZGQoRTIpOwotCQlUZXN0VmlzaXRvciB2MSA9IG5ldyBUZXN0VmlzaXRvcigpOwotCQliLnNldExlbmd0aCgwKTsKLQkJeDEuYWNjZXB0KHYxKTsKLQkJU3RyaW5nIHJlc3VsdCA9IGIudG9TdHJpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQuZXF1YWxzKCJbKGVBSSIrRTFTK0UyUysiZUFJKV0iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0QXNzZXJ0U3RhdGVtZW50KCkgewotCQlBc3NlcnRTdGF0ZW1lbnQgeDEgPSBhc3QubmV3QXNzZXJ0U3RhdGVtZW50KCk7Ci0JCXgxLnNldEV4cHJlc3Npb24oRTEpOwotCQl4MS5zZXRNZXNzYWdlKEUyKTsKLQkJVGVzdFZpc2l0b3IgdjEgPSBuZXcgVGVzdFZpc2l0b3IoKTsKLQkJYi5zZXRMZW5ndGgoMCk7Ci0JCXgxLmFjY2VwdCh2MSk7Ci0JCVN0cmluZyByZXN1bHQgPSBiLnRvU3RyaW5nKCk7Ci0JCWFzc2VydFRydWUocmVzdWx0LmVxdWFscygiWyhzQVMiK0UxUytFMlMrInNBUyldIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEFzc2lnbm1lbnQoKSB7Ci0JCUFzc2lnbm1lbnQgeDEgPSBhc3QubmV3QXNzaWdubWVudCgpOwotCQl4MS5zZXRMZWZ0SGFuZFNpZGUoRTEpOwotCQl4MS5zZXRSaWdodEhhbmRTaWRlKEUyKTsKLQkJVGVzdFZpc2l0b3IgdjEgPSBuZXcgVGVzdFZpc2l0b3IoKTsKLQkJYi5zZXRMZW5ndGgoMCk7Ci0JCXgxLmFjY2VwdCh2MSk7Ci0JCVN0cmluZyByZXN1bHQgPSBiLnRvU3RyaW5nKCk7Ci0JCWFzc2VydFRydWUocmVzdWx0LmVxdWFscygiWyg9IitFMVMrRTJTKyI9KV0iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0QmxvY2soKSB7Ci0JCUJsb2NrIHgxID0gYXN0Lm5ld0Jsb2NrKCk7Ci0JCXgxLnN0YXRlbWVudHMoKS5hZGQoUzEpOwotCQl4MS5zdGF0ZW1lbnRzKCkuYWRkKFMyKTsKLQkJVGVzdFZpc2l0b3IgdjEgPSBuZXcgVGVzdFZpc2l0b3IoKTsKLQkJYi5zZXRMZW5ndGgoMCk7Ci0JCXgxLmFjY2VwdCh2MSk7Ci0JCVN0cmluZyByZXN1bHQgPSBiLnRvU3RyaW5nKCk7Ci0JCWFzc2VydFRydWUocmVzdWx0LmVxdWFscygiWyhzQiIrUzFTK1MyUysic0IpXSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJLy8gY2hlY2sgdGhhdCB2aXNpdGluZyBjaGlsZHJlbiBjYW4gYmUgY3V0IG9mZgotCQl2MS5zZXRWaXNpdGluZ0NoaWxkcmVuKGZhbHNlKTsKLQkJYi5zZXRMZW5ndGgoMCk7Ci0JCXgxLmFjY2VwdCh2MSk7Ci0JCXJlc3VsdCA9IGIudG9TdHJpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQuZXF1YWxzKCJbKHNCc0IpXSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9vbGVhbkxpdGVyYWwoKSB7Ci0JCUJvb2xlYW5MaXRlcmFsIHgxID0gYXN0Lm5ld0Jvb2xlYW5MaXRlcmFsKHRydWUpOwotCQlUZXN0VmlzaXRvciB2MSA9IG5ldyBUZXN0VmlzaXRvcigpOwotCQliLnNldExlbmd0aCgwKTsKLQkJeDEuYWNjZXB0KHYxKTsKLQkJU3RyaW5nIHJlc3VsdCA9IGIudG9TdHJpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQuZXF1YWxzKCJbKGVCTHRydWV0cnVlZUJMKV0iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEJyZWFrU3RhdGVtZW50KCkgewotCQlCcmVha1N0YXRlbWVudCB4MSA9IGFzdC5uZXdCcmVha1N0YXRlbWVudCgpOwotCQl4MS5zZXRMYWJlbChOMSk7Ci0JCVRlc3RWaXNpdG9yIHYxID0gbmV3IFRlc3RWaXNpdG9yKCk7Ci0JCWIuc2V0TGVuZ3RoKDApOwotCQl4MS5hY2NlcHQodjEpOwotCQlTdHJpbmcgcmVzdWx0ID0gYi50b1N0cmluZygpOwotCQlhc3NlcnRUcnVlKHJlc3VsdC5lcXVhbHMoIlsoc0JSIitOMVMrInNCUildIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JcHVibGljIHZvaWQgdGVzdENhc3RFeHByZXNzaW9uKCkgewotCQlDYXN0RXhwcmVzc2lvbiB4MSA9IGFzdC5uZXdDYXN0RXhwcmVzc2lvbigpOwotCQl4MS5zZXRUeXBlKFQxKTsKLQkJeDEuc2V0RXhwcmVzc2lvbihFMSk7Ci0JCVRlc3RWaXNpdG9yIHYxID0gbmV3IFRlc3RWaXNpdG9yKCk7Ci0JCWIuc2V0TGVuZ3RoKDApOwotCQl4MS5hY2NlcHQodjEpOwotCQlTdHJpbmcgcmVzdWx0ID0gYi50b1N0cmluZygpOwotCQlhc3NlcnRUcnVlKHJlc3VsdC5lcXVhbHMoIlsoZUNTIitUMVMrRTFTKyJlQ1MpXSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RDYXRjaENsYXVzZSgpIHsKLQkJQ2F0Y2hDbGF1c2UgeDEgPSBhc3QubmV3Q2F0Y2hDbGF1c2UoKTsKLQkJeDEuc2V0RXhjZXB0aW9uKFYxKTsKLQkJeDEuc2V0Qm9keShCMSk7Ci0JCVRlc3RWaXNpdG9yIHYxID0gbmV3IFRlc3RWaXNpdG9yKCk7Ci0JCWIuc2V0TGVuZ3RoKDApOwotCQl4MS5hY2NlcHQodjEpOwotCQlTdHJpbmcgcmVzdWx0ID0gYi50b1N0cmluZygpOwotCQlhc3NlcnRUcnVlKHJlc3VsdC5lcXVhbHMoIlsoY2MiK1YxUytCMVMrImNjKV0iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhcmFjdGVyTGl0ZXJhbCgpIHsKLQkJQ2hhcmFjdGVyTGl0ZXJhbCB4MSA9IGFzdC5uZXdDaGFyYWN0ZXJMaXRlcmFsKCk7Ci0JCXgxLnNldENoYXJWYWx1ZSgncScpOwotCQlUZXN0VmlzaXRvciB2MSA9IG5ldyBUZXN0VmlzaXRvcigpOwotCQliLnNldExlbmd0aCgwKTsKLQkJeDEuYWNjZXB0KHYxKTsKLQkJU3RyaW5nIHJlc3VsdCA9IGIudG9TdHJpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQuZXF1YWxzKCJbKGVDTCdxJydxJ2VDTCldIikpOyAvLyROT04tTkxTLTEkCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc0luc3RhbmNlQ3JlYXRpb24oKSB7Ci0JCUNsYXNzSW5zdGFuY2VDcmVhdGlvbiB4MSA9IGFzdC5uZXdDbGFzc0luc3RhbmNlQ3JlYXRpb24oKTsKLQkJeDEuc2V0RXhwcmVzc2lvbihFMSk7Ci0JCXgxLnNldE5hbWUoTjEpOwotCQl4MS5zZXRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKEFDRDEpOwotCQlUZXN0VmlzaXRvciB2MSA9IG5ldyBUZXN0VmlzaXRvcigpOwotCQliLnNldExlbmd0aCgwKTsKLQkJeDEuYWNjZXB0KHYxKTsKLQkJU3RyaW5nIHJlc3VsdCA9IGIudG9TdHJpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQuZXF1YWxzKCJbKGVDSSIrRTFTK04xUytBQ0QxUysiZUNJKV0iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpIHsKLQkJQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiB4MSA9IGFzdC5uZXdBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCk7Ci0JCXgxLmJvZHlEZWNsYXJhdGlvbnMoKS5hZGQoRkQxKTsKLQkJeDEuYm9keURlY2xhcmF0aW9ucygpLmFkZChGRDIpOwotCQlUZXN0VmlzaXRvciB2MSA9IG5ldyBUZXN0VmlzaXRvcigpOwotCQliLnNldExlbmd0aCgwKTsKLQkJeDEuYWNjZXB0KHYxKTsKLQkJU3RyaW5nIHJlc3VsdCA9IGIudG9TdHJpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQuZXF1YWxzKCJbKEFDRCIrRkQxUytGRDJTKyJBQ0QpXSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RDb21waWxhdGlvblVuaXQoKSB7Ci0JCUNvbXBpbGF0aW9uVW5pdCB4MSA9IGFzdC5uZXdDb21waWxhdGlvblVuaXQoKTsKLQkJeDEuc2V0UGFja2FnZShQRDEpOwotCQl4MS5pbXBvcnRzKCkuYWRkKElEMSk7Ci0JCXgxLmltcG9ydHMoKS5hZGQoSUQyKTsKLQkJeDEudHlwZXMoKS5hZGQoVEQxKTsKLQkJeDEudHlwZXMoKS5hZGQoVEQyKTsKLQkJVGVzdFZpc2l0b3IgdjEgPSBuZXcgVGVzdFZpc2l0b3IoKTsKLQkJYi5zZXRMZW5ndGgoMCk7Ci0JCXgxLmFjY2VwdCh2MSk7Ci0JCVN0cmluZyByZXN1bHQgPSBiLnRvU3RyaW5nKCk7Ci0JCWFzc2VydFRydWUocmVzdWx0LmVxdWFscygiWyhDVSIrUEQxUytJRDFTK0lEMlMrVEQxUytURDJTKyJDVSldIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkvLyBjaGVjayB0aGF0IHZpc2l0aW5nIGNoaWxkcmVuIGNhbiBiZSBjdXQgb2ZmCi0JCXYxLnNldFZpc2l0aW5nQ2hpbGRyZW4oZmFsc2UpOwotCQliLnNldExlbmd0aCgwKTsKLQkJeDEuYWNjZXB0KHYxKTsKLQkJcmVzdWx0ID0gYi50b1N0cmluZygpOwotCQlhc3NlcnRUcnVlKHJlc3VsdC5lcXVhbHMoIlsoQ1VDVSldIikpOyAvLyROT04tTkxTLTEkCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RDb25kaXRpb25hbEV4cHJlc3Npb24oKSB7Ci0JCUNvbmRpdGlvbmFsRXhwcmVzc2lvbiB4MSA9IGFzdC5uZXdDb25kaXRpb25hbEV4cHJlc3Npb24oKTsKLQkJeDEuc2V0RXhwcmVzc2lvbihFMSk7Ci0JCXgxLnNldFRoZW5FeHByZXNzaW9uKEUyKTsKLQkJeDEuc2V0RWxzZUV4cHJlc3Npb24oTjEpOwotCQlUZXN0VmlzaXRvciB2MSA9IG5ldyBUZXN0VmlzaXRvcigpOwotCQliLnNldExlbmd0aCgwKTsKLQkJeDEuYWNjZXB0KHYxKTsKLQkJU3RyaW5nIHJlc3VsdCA9IGIudG9TdHJpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQuZXF1YWxzKCJbKGVDTyIrRTFTK0UyUytOMVMrImVDTyldIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9ySW52b2NhdGlvbigpIHsKLQkJQ29uc3RydWN0b3JJbnZvY2F0aW9uIHgxID0gYXN0Lm5ld0NvbnN0cnVjdG9ySW52b2NhdGlvbigpOwotCQl4MS5hcmd1bWVudHMoKS5hZGQoRTEpOwotCQl4MS5hcmd1bWVudHMoKS5hZGQoRTIpOwotCQlUZXN0VmlzaXRvciB2MSA9IG5ldyBUZXN0VmlzaXRvcigpOwotCQliLnNldExlbmd0aCgwKTsKLQkJeDEuYWNjZXB0KHYxKTsKLQkJU3RyaW5nIHJlc3VsdCA9IGIudG9TdHJpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQuZXF1YWxzKCJbKHNDSSIrRTFTK0UyUysic0NJKV0iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGludWVTdGF0ZW1lbnQoKSB7Ci0JCUNvbnRpbnVlU3RhdGVtZW50IHgxID0gYXN0Lm5ld0NvbnRpbnVlU3RhdGVtZW50KCk7Ci0JCXgxLnNldExhYmVsKChTaW1wbGVOYW1lKSBOMSk7Ci0JCVRlc3RWaXNpdG9yIHYxID0gbmV3IFRlc3RWaXNpdG9yKCk7Ci0JCWIuc2V0TGVuZ3RoKDApOwotCQl4MS5hY2NlcHQodjEpOwotCQlTdHJpbmcgcmVzdWx0ID0gYi50b1N0cmluZygpOwotCQlhc3NlcnRUcnVlKHJlc3VsdC5lcXVhbHMoIlsoc0NOIitOMVMrInNDTildIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JcHVibGljIHZvaWQgdGVzdERvU3RhdGVtZW50KCkgewotCQlEb1N0YXRlbWVudCB4MSA9IGFzdC5uZXdEb1N0YXRlbWVudCgpOwotCQl4MS5zZXRFeHByZXNzaW9uKEUxKTsKLQkJeDEuc2V0Qm9keShTMSk7Ci0JCVRlc3RWaXNpdG9yIHYxID0gbmV3IFRlc3RWaXNpdG9yKCk7Ci0JCWIuc2V0TGVuZ3RoKDApOwotCQl4MS5hY2NlcHQodjEpOwotCQlTdHJpbmcgcmVzdWx0ID0gYi50b1N0cmluZygpOwotCQlhc3NlcnRUcnVlKHJlc3VsdC5lcXVhbHMoIlsoc0RPIitTMVMrRTFTKyJzRE8pXSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eVN0YXRlbWVudCgpIHsKLQkJRW1wdHlTdGF0ZW1lbnQgeDEgPSBhc3QubmV3RW1wdHlTdGF0ZW1lbnQoKTsKLQkJVGVzdFZpc2l0b3IgdjEgPSBuZXcgVGVzdFZpc2l0b3IoKTsKLQkJYi5zZXRMZW5ndGgoMCk7Ci0JCXgxLmFjY2VwdCh2MSk7Ci0JCVN0cmluZyByZXN1bHQgPSBiLnRvU3RyaW5nKCk7Ci0JCWFzc2VydFRydWUocmVzdWx0LmVxdWFscygiWyhzRU1zRU0pXSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhwcmVzc2lvblN0YXRlbWVudCgpIHsKLQkJRXhwcmVzc2lvblN0YXRlbWVudCB4MSA9IGFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KEUxKTsKLQkJVGVzdFZpc2l0b3IgdjEgPSBuZXcgVGVzdFZpc2l0b3IoKTsKLQkJYi5zZXRMZW5ndGgoMCk7Ci0JCXgxLmFjY2VwdCh2MSk7Ci0JCVN0cmluZyByZXN1bHQgPSBiLnRvU3RyaW5nKCk7Ci0JCWFzc2VydFRydWUocmVzdWx0LmVxdWFscygiWyhzRVgiK0UxUysic0VYKV0iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0RmllbGRBY2Nlc3MoKSB7Ci0JCUZpZWxkQWNjZXNzIHgxID0gYXN0Lm5ld0ZpZWxkQWNjZXNzKCk7Ci0JCXgxLnNldEV4cHJlc3Npb24oRTEpOwotCQl4MS5zZXROYW1lKE4xKTsKLQkJVGVzdFZpc2l0b3IgdjEgPSBuZXcgVGVzdFZpc2l0b3IoKTsKLQkJYi5zZXRMZW5ndGgoMCk7Ci0JCXgxLmFjY2VwdCh2MSk7Ci0JCVN0cmluZyByZXN1bHQgPSBiLnRvU3RyaW5nKCk7Ci0JCWFzc2VydFRydWUocmVzdWx0LmVxdWFscygiWyhlRkEiK0UxUytOMVMrImVGQSldIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEZpZWxkRGVjbGFyYXRpb24oKSB7Ci0JCUZpZWxkRGVjbGFyYXRpb24geDEgPSBhc3QubmV3RmllbGREZWNsYXJhdGlvbihXMSk7Ci0JCXgxLnNldEphdmFkb2MoSkQxKTsKLQkJeDEuc2V0VHlwZShUMSk7Ci0JCXgxLmZyYWdtZW50cygpLmFkZChXMik7Ci0JCVRlc3RWaXNpdG9yIHYxID0gbmV3IFRlc3RWaXNpdG9yKCk7Ci0JCWIuc2V0TGVuZ3RoKDApOwotCQl4MS5hY2NlcHQodjEpOwotCQlTdHJpbmcgcmVzdWx0ID0gYi50b1N0cmluZygpOwotCQlhc3NlcnRUcnVlKHJlc3VsdC5lcXVhbHMoIlsoRkQiK0pEMVMrVDFTK1cxUytXMlMrIkZEKV0iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0Rm9yU3RhdGVtZW50KCkgewotCQlGb3JTdGF0ZW1lbnQgeDEgPSBhc3QubmV3Rm9yU3RhdGVtZW50KCk7Ci0JCXgxLmluaXRpYWxpemVycygpLmFkZChFMSk7Ci0JCXgxLmluaXRpYWxpemVycygpLmFkZChFMik7Ci0JCXgxLnNldEV4cHJlc3Npb24oTjEpOwotCQl4MS51cGRhdGVycygpLmFkZChOMik7Ci0JCXgxLnVwZGF0ZXJzKCkuYWRkKE4zKTsKLQkJeDEuc2V0Qm9keShTMSk7Ci0JCVRlc3RWaXNpdG9yIHYxID0gbmV3IFRlc3RWaXNpdG9yKCk7Ci0JCWIuc2V0TGVuZ3RoKDApOwotCQl4MS5hY2NlcHQodjEpOwotCQlTdHJpbmcgcmVzdWx0ID0gYi50b1N0cmluZygpOwotCQlhc3NlcnRUcnVlKHJlc3VsdC5lcXVhbHMoIlsoc0ZSIitFMVMrRTJTK04xUytOMlMrTjNTK1MxUysic0ZSKV0iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0SWZTdGF0ZW1lbnQoKSB7Ci0JCUlmU3RhdGVtZW50IHgxID0gYXN0Lm5ld0lmU3RhdGVtZW50KCk7Ci0JCXgxLnNldEV4cHJlc3Npb24oRTEpOwotCQl4MS5zZXRUaGVuU3RhdGVtZW50KFMxKTsKLQkJeDEuc2V0RWxzZVN0YXRlbWVudChTMik7Ci0JCVRlc3RWaXNpdG9yIHYxID0gbmV3IFRlc3RWaXNpdG9yKCk7Ci0JCWIuc2V0TGVuZ3RoKDApOwotCQl4MS5hY2NlcHQodjEpOwotCQlTdHJpbmcgcmVzdWx0ID0gYi50b1N0cmluZygpOwotCQlhc3NlcnRUcnVlKHJlc3VsdC5lcXVhbHMoIlsoc0lGIitFMVMrUzFTK1MyUysic0lGKV0iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0RGVjbGFyYXRpb24oKSB7Ci0JCUltcG9ydERlY2xhcmF0aW9uIHgxID0gYXN0Lm5ld0ltcG9ydERlY2xhcmF0aW9uKCk7Ci0JCXgxLnNldE5hbWUoTjEpOwotCQlUZXN0VmlzaXRvciB2MSA9IG5ldyBUZXN0VmlzaXRvcigpOwotCQliLnNldExlbmd0aCgwKTsKLQkJeDEuYWNjZXB0KHYxKTsKLQkJU3RyaW5nIHJlc3VsdCA9IGIudG9TdHJpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQuZXF1YWxzKCJbKElEIitOMVMrIklEKV0iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5maXhFeHByZXNzaW9uKCkgewotCQlJbmZpeEV4cHJlc3Npb24geDEgPSBhc3QubmV3SW5maXhFeHByZXNzaW9uKCk7Ci0JCXgxLnNldE9wZXJhdG9yKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5QTFVTKTsKLQkJeDEuc2V0TGVmdE9wZXJhbmQoRTEpOwotCQl4MS5zZXRSaWdodE9wZXJhbmQoRTIpOwotCQl4MS5leHRlbmRlZE9wZXJhbmRzKCkuYWRkKE4xKTsKLQkJeDEuZXh0ZW5kZWRPcGVyYW5kcygpLmFkZChOMik7Ci0JCVRlc3RWaXNpdG9yIHYxID0gbmV3IFRlc3RWaXNpdG9yKCk7Ci0JCWIuc2V0TGVuZ3RoKDApOwotCQl4MS5hY2NlcHQodjEpOwotCQlTdHJpbmcgcmVzdWx0ID0gYi50b1N0cmluZygpOwotCQlhc3NlcnRUcnVlKHJlc3VsdC5lcXVhbHMoIlsoZUlOKyIrRTFTK0UyUytOMVMrTjJTKyIrZUlOKV0iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFuY2VvZkV4cHJlc3Npb24oKSB7Ci0JCUluc3RhbmNlb2ZFeHByZXNzaW9uIHgxID0gYXN0Lm5ld0luc3RhbmNlb2ZFeHByZXNzaW9uKCk7Ci0JCXgxLnNldExlZnRPcGVyYW5kKEUxKTsKLQkJeDEuc2V0UmlnaHRPcGVyYW5kKFQxKTsKLQkJVGVzdFZpc2l0b3IgdjEgPSBuZXcgVGVzdFZpc2l0b3IoKTsKLQkJYi5zZXRMZW5ndGgoMCk7Ci0JCXgxLmFjY2VwdCh2MSk7Ci0JCVN0cmluZyByZXN1bHQgPSBiLnRvU3RyaW5nKCk7Ci0JCWFzc2VydFRydWUocmVzdWx0LmVxdWFscygiWyhlSU8iK0UxUytUMVMrImVJTyldIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemVyKCkgewotCQlJbml0aWFsaXplciB4MSA9IGFzdC5uZXdJbml0aWFsaXplcigpOwotCQl4MS5zZXRKYXZhZG9jKEpEMSk7Ci0JCXgxLnNldEJvZHkoQjEpOwotCQlUZXN0VmlzaXRvciB2MSA9IG5ldyBUZXN0VmlzaXRvcigpOwotCQliLnNldExlbmd0aCgwKTsKLQkJeDEuYWNjZXB0KHYxKTsKLQkJU3RyaW5nIHJlc3VsdCA9IGIudG9TdHJpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQuZXF1YWxzKCJbKElOIitKRDFTK0IxUysiSU4pXSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhZG9jKCkgewotCQlKYXZhZG9jIHgxID0gYXN0Lm5ld0phdmFkb2MoKTsKLQkJeDEuc2V0Q29tbWVudCgiLyoqPyovIik7IC8vJE5PTi1OTFMtMSQKLQkJVGVzdFZpc2l0b3IgdjEgPSBuZXcgVGVzdFZpc2l0b3IoKTsKLQkJYi5zZXRMZW5ndGgoMCk7Ci0JCXgxLmFjY2VwdCh2MSk7Ci0JCVN0cmluZyByZXN1bHQgPSBiLnRvU3RyaW5nKCk7Ci0JCWFzc2VydFRydWUoIlsoSkQvKio/Ki8vKio/Ki9KRCldIi5lcXVhbHMocmVzdWx0KSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFiZWxlZFN0YXRlbWVudCgpIHsKLQkJTGFiZWxlZFN0YXRlbWVudCB4MSA9IGFzdC5uZXdMYWJlbGVkU3RhdGVtZW50KCk7Ci0JCXgxLnNldExhYmVsKE4xKTsKLQkJeDEuc2V0Qm9keShTMSk7Ci0JCVRlc3RWaXNpdG9yIHYxID0gbmV3IFRlc3RWaXNpdG9yKCk7Ci0JCWIuc2V0TGVuZ3RoKDApOwotCQl4MS5hY2NlcHQodjEpOwotCQlTdHJpbmcgcmVzdWx0ID0gYi50b1N0cmluZygpOwotCQlhc3NlcnRUcnVlKHJlc3VsdC5lcXVhbHMoIlsoc0xBIitOMVMrUzFTKyJzTEEpXSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2REZWNsYXJhdGlvbigpIHsKLQkJTWV0aG9kRGVjbGFyYXRpb24geDEgPSBhc3QubmV3TWV0aG9kRGVjbGFyYXRpb24oKTsKLQkJeDEuc2V0SmF2YWRvYyhKRDEpOwotCQl4MS5zZXRSZXR1cm5UeXBlKFQxKTsKLQkJeDEuc2V0TmFtZShOMSk7Ci0JCXgxLnBhcmFtZXRlcnMoKS5hZGQoVjEpOwotCQl4MS5wYXJhbWV0ZXJzKCkuYWRkKFYyKTsKLQkJeDEudGhyb3duRXhjZXB0aW9ucygpLmFkZChOMik7Ci0JCXgxLnRocm93bkV4Y2VwdGlvbnMoKS5hZGQoTjMpOwotCQl4MS5zZXRCb2R5KEIxKTsKLQkJVGVzdFZpc2l0b3IgdjEgPSBuZXcgVGVzdFZpc2l0b3IoKTsKLQkJYi5zZXRMZW5ndGgoMCk7Ci0JCXgxLmFjY2VwdCh2MSk7Ci0JCVN0cmluZyByZXN1bHQgPSBiLnRvU3RyaW5nKCk7Ci0JCWFzc2VydFRydWUocmVzdWx0LmVxdWFscygiWyhNRCIrSkQxUytUMVMrTjFTK1YxUytWMlMrTjJTK04zUytCMVMrIk1EKV0iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSW52b2NhdGlvbigpIHsKLQkJTWV0aG9kSW52b2NhdGlvbiB4MSA9IGFzdC5uZXdNZXRob2RJbnZvY2F0aW9uKCk7Ci0JCXgxLnNldEV4cHJlc3Npb24oTjEpOwotCQl4MS5zZXROYW1lKE4yKTsKLQkJeDEuYXJndW1lbnRzKCkuYWRkKEUxKTsKLQkJeDEuYXJndW1lbnRzKCkuYWRkKEUyKTsKLQkJVGVzdFZpc2l0b3IgdjEgPSBuZXcgVGVzdFZpc2l0b3IoKTsKLQkJYi5zZXRMZW5ndGgoMCk7Ci0JCXgxLmFjY2VwdCh2MSk7Ci0JCVN0cmluZyByZXN1bHQgPSBiLnRvU3RyaW5nKCk7Ci0JCWFzc2VydFRydWUocmVzdWx0LmVxdWFscygiWyhlTUkiK04xUytOMlMrRTFTK0UyUysiZU1JKV0iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbExpdGVyYWwoKSB7Ci0JCU51bGxMaXRlcmFsIHgxID0gYXN0Lm5ld051bGxMaXRlcmFsKCk7Ci0JCVRlc3RWaXNpdG9yIHYxID0gbmV3IFRlc3RWaXNpdG9yKCk7Ci0JCWIuc2V0TGVuZ3RoKDApOwotCQl4MS5hY2NlcHQodjEpOwotCQlTdHJpbmcgcmVzdWx0ID0gYi50b1N0cmluZygpOwotCQlhc3NlcnRUcnVlKHJlc3VsdC5lcXVhbHMoIlsoZU5MZU5MKV0iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHVibGljIHZvaWQgdGVzdE51bWJlckxpdGVyYWwoKSB7Ci0JCU51bWJlckxpdGVyYWwgeDEgPSBhc3QubmV3TnVtYmVyTGl0ZXJhbCgiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJVGVzdFZpc2l0b3IgdjEgPSBuZXcgVGVzdFZpc2l0b3IoKTsKLQkJYi5zZXRMZW5ndGgoMCk7Ci0JCXgxLmFjY2VwdCh2MSk7Ci0JCVN0cmluZyByZXN1bHQgPSBiLnRvU3RyaW5nKCk7Ci0JCWFzc2VydFRydWUocmVzdWx0LmVxdWFscygiWyhlTlUxLjAxLjBlTlUpXSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFja2FnZURlY2xhcmF0aW9uKCkgewotCQlQYWNrYWdlRGVjbGFyYXRpb24geDEgPSBhc3QubmV3UGFja2FnZURlY2xhcmF0aW9uKCk7Ci0JCXgxLnNldE5hbWUoTjEpOwotCQlUZXN0VmlzaXRvciB2MSA9IG5ldyBUZXN0VmlzaXRvcigpOwotCQliLnNldExlbmd0aCgwKTsKLQkJeDEuYWNjZXB0KHYxKTsKLQkJU3RyaW5nIHJlc3VsdCA9IGIudG9TdHJpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQuZXF1YWxzKCJbKFBEIitOMVMrIlBEKV0iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyZW50aGVzaXplZEV4cHJlc3Npb24oKSB7Ci0JCVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHgxID0gYXN0Lm5ld1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCk7Ci0JCXgxLnNldEV4cHJlc3Npb24oRTEpOwotCQlUZXN0VmlzaXRvciB2MSA9IG5ldyBUZXN0VmlzaXRvcigpOwotCQliLnNldExlbmd0aCgwKTsKLQkJeDEuYWNjZXB0KHYxKTsKLQkJU3RyaW5nIHJlc3VsdCA9IGIudG9TdHJpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQuZXF1YWxzKCJbKGVQQSIrRTFTKyJlUEEpXSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RQb3N0Zml4RXhwcmVzc2lvbigpIHsKLQkJUG9zdGZpeEV4cHJlc3Npb24geDEgPSBhc3QubmV3UG9zdGZpeEV4cHJlc3Npb24oKTsKLQkJeDEuc2V0T3BlcmFuZChFMSk7Ci0JCXgxLnNldE9wZXJhdG9yKFBvc3RmaXhFeHByZXNzaW9uLk9wZXJhdG9yLklOQ1JFTUVOVCk7Ci0JCVRlc3RWaXNpdG9yIHYxID0gbmV3IFRlc3RWaXNpdG9yKCk7Ci0JCWIuc2V0TGVuZ3RoKDApOwotCQl4MS5hY2NlcHQodjEpOwotCQlTdHJpbmcgcmVzdWx0ID0gYi50b1N0cmluZygpOwotCQlhc3NlcnRUcnVlKHJlc3VsdC5lcXVhbHMoIlsoZVBPKysiK0UxUysiKytlUE8pXSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RQcmVmaXhFeHByZXNzaW9uKCkgewotCQlQcmVmaXhFeHByZXNzaW9uIHgxID0gYXN0Lm5ld1ByZWZpeEV4cHJlc3Npb24oKTsKLQkJeDEuc2V0T3BlcmFuZChFMSk7Ci0JCXgxLnNldE9wZXJhdG9yKFByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3IuSU5DUkVNRU5UKTsKLQkJVGVzdFZpc2l0b3IgdjEgPSBuZXcgVGVzdFZpc2l0b3IoKTsKLQkJYi5zZXRMZW5ndGgoMCk7Ci0JCXgxLmFjY2VwdCh2MSk7Ci0JCVN0cmluZyByZXN1bHQgPSBiLnRvU3RyaW5nKCk7Ci0JCWFzc2VydFRydWUocmVzdWx0LmVxdWFscygiWyhlUFIrKyIrRTFTKyIrK2VQUildIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFJldHVyblN0YXRlbWVudCgpIHsKLQkJUmV0dXJuU3RhdGVtZW50IHgxID0gYXN0Lm5ld1JldHVyblN0YXRlbWVudCgpOwotCQl4MS5zZXRFeHByZXNzaW9uKEUxKTsKLQkJVGVzdFZpc2l0b3IgdjEgPSBuZXcgVGVzdFZpc2l0b3IoKTsKLQkJYi5zZXRMZW5ndGgoMCk7Ci0JCXgxLmFjY2VwdCh2MSk7Ci0JCVN0cmluZyByZXN1bHQgPSBiLnRvU3RyaW5nKCk7Ci0JCWFzc2VydFRydWUocmVzdWx0LmVxdWFscygiWyhzUlQiK0UxUysic1JUKV0iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nTGl0ZXJhbCgpIHsKLQkJU3RyaW5nTGl0ZXJhbCB4MSA9IGFzdC5uZXdTdHJpbmdMaXRlcmFsKCk7Ci0JCXgxLnNldExpdGVyYWxWYWx1ZSgiSCIpOyAvLyROT04tTkxTLTEkCi0JCVRlc3RWaXNpdG9yIHYxID0gbmV3IFRlc3RWaXNpdG9yKCk7Ci0JCWIuc2V0TGVuZ3RoKDApOwotCQl4MS5hY2NlcHQodjEpOwotCQlTdHJpbmcgcmVzdWx0ID0gYi50b1N0cmluZygpOwotCQlhc3NlcnRUcnVlKHJlc3VsdC5lcXVhbHMoIlsoZVNMSEhlU0wpXSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0U3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24oKSB7Ci0JCVN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uIHgxID0gYXN0Lm5ld1N1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uKCk7Ci0JCXgxLnNldEV4cHJlc3Npb24oTjEpOwotCQl4MS5hcmd1bWVudHMoKS5hZGQoRTEpOwotCQl4MS5hcmd1bWVudHMoKS5hZGQoRTIpOwotCQlUZXN0VmlzaXRvciB2MSA9IG5ldyBUZXN0VmlzaXRvcigpOwotCQliLnNldExlbmd0aCgwKTsKLQkJeDEuYWNjZXB0KHYxKTsKLQkJU3RyaW5nIHJlc3VsdCA9IGIudG9TdHJpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQuZXF1YWxzKCJbKHNTQyIrTjFTK0UxUytFMlMrInNTQyldIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFN1cGVyRmllbGRBY2Nlc3MoKSB7Ci0JCVN1cGVyRmllbGRBY2Nlc3MgeDEgPSBhc3QubmV3U3VwZXJGaWVsZEFjY2VzcygpOwotCQl4MS5zZXRRdWFsaWZpZXIoTjEpOwotCQl4MS5zZXROYW1lKE4yKTsKLQkJVGVzdFZpc2l0b3IgdjEgPSBuZXcgVGVzdFZpc2l0b3IoKTsKLQkJYi5zZXRMZW5ndGgoMCk7Ci0JCXgxLmFjY2VwdCh2MSk7Ci0JCVN0cmluZyByZXN1bHQgPSBiLnRvU3RyaW5nKCk7Ci0JCWFzc2VydFRydWUocmVzdWx0LmVxdWFscygiWyhlU0YiK04xUytOMlMrImVTRildIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFN1cGVyTWV0aG9kSW52b2NhdGlvbigpIHsKLQkJU3VwZXJNZXRob2RJbnZvY2F0aW9uIHgxID0gYXN0Lm5ld1N1cGVyTWV0aG9kSW52b2NhdGlvbigpOwotCQl4MS5zZXRRdWFsaWZpZXIoTjEpOwotCQl4MS5zZXROYW1lKE4yKTsKLQkJeDEuYXJndW1lbnRzKCkuYWRkKEUxKTsKLQkJeDEuYXJndW1lbnRzKCkuYWRkKEUyKTsKLQkJVGVzdFZpc2l0b3IgdjEgPSBuZXcgVGVzdFZpc2l0b3IoKTsKLQkJYi5zZXRMZW5ndGgoMCk7Ci0JCXgxLmFjY2VwdCh2MSk7Ci0JCVN0cmluZyByZXN1bHQgPSBiLnRvU3RyaW5nKCk7Ci0JCWFzc2VydFRydWUocmVzdWx0LmVxdWFscygiWyhlU00iK04xUytOMlMrRTFTK0UyUysiZVNNKV0iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0U3dpdGNoQ2FzZSgpIHsKLQkJU3dpdGNoQ2FzZSB4MSA9IGFzdC5uZXdTd2l0Y2hDYXNlKCk7Ci0JCXgxLnNldEV4cHJlc3Npb24oRTEpOwotCQlUZXN0VmlzaXRvciB2MSA9IG5ldyBUZXN0VmlzaXRvcigpOwotCQliLnNldExlbmd0aCgwKTsKLQkJeDEuYWNjZXB0KHYxKTsKLQkJU3RyaW5nIHJlc3VsdCA9IGIudG9TdHJpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQuZXF1YWxzKCJbKHNTQyIrRTFTKyJzU0MpXSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RTd2l0Y2hTdGF0ZW1lbnQoKSB7Ci0JCVN3aXRjaFN0YXRlbWVudCB4MSA9IGFzdC5uZXdTd2l0Y2hTdGF0ZW1lbnQoKTsKLQkJeDEuc2V0RXhwcmVzc2lvbihFMSk7Ci0JCXgxLnN0YXRlbWVudHMoKS5hZGQoUzEpOwotCQl4MS5zdGF0ZW1lbnRzKCkuYWRkKFMyKTsKLQkJVGVzdFZpc2l0b3IgdjEgPSBuZXcgVGVzdFZpc2l0b3IoKTsKLQkJYi5zZXRMZW5ndGgoMCk7Ci0JCXgxLmFjY2VwdCh2MSk7Ci0JCVN0cmluZyByZXN1bHQgPSBiLnRvU3RyaW5nKCk7Ci0JCWFzc2VydFRydWUocmVzdWx0LmVxdWFscygiWyhzU1ciK0UxUytTMVMrUzJTKyJzU1cpXSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jaHJvbml6ZWRTdGF0ZW1lbnQoKSB7Ci0JCVN5bmNocm9uaXplZFN0YXRlbWVudCB4MSA9IGFzdC5uZXdTeW5jaHJvbml6ZWRTdGF0ZW1lbnQoKTsKLQkJeDEuc2V0RXhwcmVzc2lvbihFMSk7Ci0JCXgxLnNldEJvZHkoQjEpOwotCQlUZXN0VmlzaXRvciB2MSA9IG5ldyBUZXN0VmlzaXRvcigpOwotCQliLnNldExlbmd0aCgwKTsKLQkJeDEuYWNjZXB0KHYxKTsKLQkJU3RyaW5nIHJlc3VsdCA9IGIudG9TdHJpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQuZXF1YWxzKCJbKHNTWSIrRTFTK0IxUysic1NZKV0iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VGhpc0V4cHJlc3Npb24oKSB7Ci0JCVRoaXNFeHByZXNzaW9uIHgxID0gYXN0Lm5ld1RoaXNFeHByZXNzaW9uKCk7Ci0JCXgxLnNldFF1YWxpZmllcihOMSk7Ci0JCVRlc3RWaXNpdG9yIHYxID0gbmV3IFRlc3RWaXNpdG9yKCk7Ci0JCWIuc2V0TGVuZ3RoKDApOwotCQl4MS5hY2NlcHQodjEpOwotCQlTdHJpbmcgcmVzdWx0ID0gYi50b1N0cmluZygpOwotCQlhc3NlcnRUcnVlKHJlc3VsdC5lcXVhbHMoIlsoZVRIIitOMVMrImVUSCldIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFRocm93U3RhdGVtZW50KCkgewotCQlUaHJvd1N0YXRlbWVudCB4MSA9IGFzdC5uZXdUaHJvd1N0YXRlbWVudCgpOwotCQl4MS5zZXRFeHByZXNzaW9uKEUxKTsKLQkJVGVzdFZpc2l0b3IgdjEgPSBuZXcgVGVzdFZpc2l0b3IoKTsKLQkJYi5zZXRMZW5ndGgoMCk7Ci0JCXgxLmFjY2VwdCh2MSk7Ci0JCVN0cmluZyByZXN1bHQgPSBiLnRvU3RyaW5nKCk7Ci0JCWFzc2VydFRydWUocmVzdWx0LmVxdWFscygiWyhzVFIiK0UxUysic1RSKV0iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJ5U3RhdGVtZW50KCkgewotCQlUcnlTdGF0ZW1lbnQgeDEgPSBhc3QubmV3VHJ5U3RhdGVtZW50KCk7Ci0JCXgxLnNldEJvZHkoQjEpOwotCQlDYXRjaENsYXVzZSBjMSA9IGFzdC5uZXdDYXRjaENsYXVzZSgpOwotCQljMS5zZXRFeGNlcHRpb24oVjEpOwotCQljMS5zZXRCb2R5KGFzdC5uZXdCbG9jaygpKTsKLQkJeDEuY2F0Y2hDbGF1c2VzKCkuYWRkKGMxKTsKLQkJQ2F0Y2hDbGF1c2UgYzIgPSBhc3QubmV3Q2F0Y2hDbGF1c2UoKTsKLQkJYzIuc2V0RXhjZXB0aW9uKFYyKTsKLQkJYzIuc2V0Qm9keShhc3QubmV3QmxvY2soKSk7Ci0JCXgxLmNhdGNoQ2xhdXNlcygpLmFkZChjMik7Ci0JCXgxLnNldEZpbmFsbHkoYXN0Lm5ld0Jsb2NrKCkpOwotCQlUZXN0VmlzaXRvciB2MSA9IG5ldyBUZXN0VmlzaXRvcigpOwotCQliLnNldExlbmd0aCgwKTsKLQkJeDEuYWNjZXB0KHYxKTsKLQkJU3RyaW5nIHJlc3VsdCA9IGIudG9TdHJpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQuZXF1YWxzKCJbKHNUWSIrQjFTKyJbKGNjIitWMVMrIlsoc0JzQildIisiY2MpXSIrIlsoY2MiK1YyUysiWyhzQnNCKV0iKyJjYyldIisiWyhzQnNCKV0iKyJzVFkpXSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkIC8vJE5PTi1OTFMtOSQKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFR5cGVEZWNsYXJhdGlvbigpIHsKLQkJVHlwZURlY2xhcmF0aW9uIHgxID0gYXN0Lm5ld1R5cGVEZWNsYXJhdGlvbigpOwotCQl4MS5zZXRKYXZhZG9jKEpEMSk7Ci0JCXgxLnNldE5hbWUoTjEpOwotCQl4MS5zZXRTdXBlcmNsYXNzKE4yKTsKLQkJeDEuc3VwZXJJbnRlcmZhY2VzKCkuYWRkKE4zKTsKLQkJeDEuc3VwZXJJbnRlcmZhY2VzKCkuYWRkKGFzdC5uZXdTaW1wbGVOYW1lKCJKIikpOyAvLyROT04tTkxTLTEkCi0JCXgxLmJvZHlEZWNsYXJhdGlvbnMoKS5hZGQoRkQxKTsKLQkJeDEuYm9keURlY2xhcmF0aW9ucygpLmFkZChGRDIpOwotCQlUZXN0VmlzaXRvciB2MSA9IG5ldyBUZXN0VmlzaXRvcigpOwotCQliLnNldExlbmd0aCgwKTsKLQkJeDEuYWNjZXB0KHYxKTsKLQkJU3RyaW5nIHJlc3VsdCA9IGIudG9TdHJpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQuZXF1YWxzKCJbKFREIitKRDFTK04xUytOMlMrTjNTKyJbKG5TSkpuUyldIitGRDFTK0ZEMlMrIlREKV0iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQoKSB7Ci0JCVR5cGVEZWNsYXJhdGlvblN0YXRlbWVudCB4MSA9IGFzdC5uZXdUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQoVEQxKTsKLQkJVGVzdFZpc2l0b3IgdjEgPSBuZXcgVGVzdFZpc2l0b3IoKTsKLQkJYi5zZXRMZW5ndGgoMCk7Ci0JCXgxLmFjY2VwdCh2MSk7Ci0JCVN0cmluZyByZXN1bHQgPSBiLnRvU3RyaW5nKCk7Ci0JCWFzc2VydFRydWUocmVzdWx0LmVxdWFscygiWyhzVEQiK1REMVMrInNURCldIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFR5cGVMaXRlcmFsKCkgewotCQlUeXBlTGl0ZXJhbCB4MSA9IGFzdC5uZXdUeXBlTGl0ZXJhbCgpOwotCQl4MS5zZXRUeXBlKFQxKTsKLQkJVGVzdFZpc2l0b3IgdjEgPSBuZXcgVGVzdFZpc2l0b3IoKTsKLQkJYi5zZXRMZW5ndGgoMCk7Ci0JCXgxLmFjY2VwdCh2MSk7Ci0JCVN0cmluZyByZXN1bHQgPSBiLnRvU3RyaW5nKCk7Ci0JCWFzc2VydFRydWUocmVzdWx0LmVxdWFscygiWyhlVEwiK1QxUysiZVRMKV0iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFyaWFibGVEZWNsYXJhdGlvbigpIHsKLQkJU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiB4MSA9IGFzdC5uZXdTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKCk7Ci0JCXgxLnNldFR5cGUoVDEpOwotCQl4MS5zZXROYW1lKE4xKTsKLQkJeDEuc2V0SW5pdGlhbGl6ZXIoRTEpOwotCQlUZXN0VmlzaXRvciB2MSA9IG5ldyBUZXN0VmlzaXRvcigpOwotCQliLnNldExlbmd0aCgwKTsKLQkJeDEuYWNjZXB0KHYxKTsKLQkJU3RyaW5nIHJlc3VsdCA9IGIudG9TdHJpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQuZXF1YWxzKCJbKFZEIitUMVMrTjFTK0UxUysiVkQpXSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RWYXJpYWJsZVNwZWNpZmllcigpIHsKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHgxID0gYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQl4MS5zZXROYW1lKE4xKTsKLQkJeDEuc2V0SW5pdGlhbGl6ZXIoRTEpOwotCQlUZXN0VmlzaXRvciB2MSA9IG5ldyBUZXN0VmlzaXRvcigpOwotCQliLnNldExlbmd0aCgwKTsKLQkJeDEuYWNjZXB0KHYxKTsKLQkJU3RyaW5nIHJlc3VsdCA9IGIudG9TdHJpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQuZXF1YWxzKCJbKFZTIitOMVMrRTFTKyJWUyldIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKCkgewotCQlWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiB4MSA9IGFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbihXMSk7Ci0JCXgxLnNldFR5cGUoVDEpOwotCQl4MS5mcmFnbWVudHMoKS5hZGQoVzIpOwotCQlUZXN0VmlzaXRvciB2MSA9IG5ldyBUZXN0VmlzaXRvcigpOwotCQliLnNldExlbmd0aCgwKTsKLQkJeDEuYWNjZXB0KHYxKTsKLQkJU3RyaW5nIHJlc3VsdCA9IGIudG9TdHJpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQuZXF1YWxzKCJbKGVWRCIrVDFTK1cxUytXMlMrImVWRCldIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQoKSB7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgeDEgPSBhc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudChXMSk7Ci0JCXgxLnNldFR5cGUoVDEpOwotCQl4MS5mcmFnbWVudHMoKS5hZGQoVzIpOwotCQlUZXN0VmlzaXRvciB2MSA9IG5ldyBUZXN0VmlzaXRvcigpOwotCQliLnNldExlbmd0aCgwKTsKLQkJeDEuYWNjZXB0KHYxKTsKLQkJU3RyaW5nIHJlc3VsdCA9IGIudG9TdHJpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQuZXF1YWxzKCJbKHNWRCIrVDFTK1cxUytXMlMrInNWRCldIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFdoaWxlU3RhdGVtZW50KCkgewotCQlXaGlsZVN0YXRlbWVudCB4MSA9IGFzdC5uZXdXaGlsZVN0YXRlbWVudCgpOwotCQl4MS5zZXRFeHByZXNzaW9uKEUxKTsKLQkJeDEuc2V0Qm9keShTMSk7Ci0JCVRlc3RWaXNpdG9yIHYxID0gbmV3IFRlc3RWaXNpdG9yKCk7Ci0JCWIuc2V0TGVuZ3RoKDApOwotCQl4MS5hY2NlcHQodjEpOwotCQlTdHJpbmcgcmVzdWx0ID0gYi50b1N0cmluZygpOwotCQlhc3NlcnRUcnVlKHJlc3VsdC5lcXVhbHMoIlsoc1dIIitFMVMrUzFTKyJzV0gpXSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByZVBvc3QoKSB7Ci0JCVNpbXBsZU5hbWUgbjEgPSBhc3QubmV3U2ltcGxlTmFtZSgiYSIpOyAvLyROT04tTkxTLTEkCi0JCVNpbXBsZU5hbWUgbjIgPSBhc3QubmV3U2ltcGxlTmFtZSgiYiIpOyAvLyROT04tTkxTLTEkCi0JCVF1YWxpZmllZE5hbWUgcSA9IGFzdC5uZXdRdWFsaWZpZWROYW1lKG4xLCBuMik7Ci0JCVRlc3RWaXNpdG9yIHYxID0gbmV3IFRlc3RWaXNpdG9yKCkgewotCQkJcHVibGljIHZvaWQgcHJlVmlzaXQoQVNUTm9kZSBub2RlKSB7Ci0JCQkJYi5hcHBlbmQoIlsiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQkJCWNhc2UgQVNUTm9kZS5RVUFMSUZJRURfTkFNRSA6Ci0JCQkJCQliLmFwcGVuZCgicSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBBU1ROb2RlLlNJTVBMRV9OQU1FIDoKLQkJCQkJCWIuYXBwZW5kKCgoU2ltcGxlTmFtZSkgbm9kZSkuZ2V0SWRlbnRpZmllcigpKTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcG9zdFZpc2l0KEFTVE5vZGUgbm9kZSkgewotCQkJCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQkJCWNhc2UgQVNUTm9kZS5RVUFMSUZJRURfTkFNRSA6Ci0JCQkJCQliLmFwcGVuZCgicSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBBU1ROb2RlLlNJTVBMRV9OQU1FIDoKLQkJCQkJCWIuYXBwZW5kKCgoU2ltcGxlTmFtZSkgbm9kZSkuZ2V0SWRlbnRpZmllcigpKTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQliLmFwcGVuZCgiXSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0KLQkJYi5zZXRMZW5ndGgoMCk7Ci0JCXEuYWNjZXB0KHYxKTsKLQkJU3RyaW5nIHJlc3VsdCA9IGIudG9TdHJpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQuZXF1YWxzKCJbcShuUSIgKyAiW2EoblNhYW5TKWFdIiArICJbYihuU2JiblMpYl0iICsgIm5RKXFdIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JfQkKLQlwdWJsaWMgdm9pZCB0ZXN0VHJhdmVyc2VBbmRNb2RpZnkoKSB7Ci0JCWZpbmFsIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSBhc3QubmV3VHlwZURlY2xhcmF0aW9uKCk7Ci0JCXR5cGVEZWNsYXJhdGlvbi5zZXROYW1lKE4xKTsKLQkJTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSBhc3QubmV3TWV0aG9kRGVjbGFyYXRpb24oKTsKLQkJbWV0aG9kRGVjbGFyYXRpb24uc2V0TmFtZShhc3QubmV3U2ltcGxlTmFtZSgiTTEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdHlwZURlY2xhcmF0aW9uLmJvZHlEZWNsYXJhdGlvbnMoKS5hZGQoMCwgbWV0aG9kRGVjbGFyYXRpb24pOwotCQlmaW5hbCBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbjIgPSBhc3QubmV3TWV0aG9kRGVjbGFyYXRpb24oKTsKLQkJbWV0aG9kRGVjbGFyYXRpb24yLnNldE5hbWUoYXN0Lm5ld1NpbXBsZU5hbWUoIk0yIikpOyAvLyROT04tTkxTLTEkCi0JCXR5cGVEZWNsYXJhdGlvbi5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKDEsIG1ldGhvZERlY2xhcmF0aW9uMik7Ci0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uMyA9IGFzdC5uZXdNZXRob2REZWNsYXJhdGlvbigpOwotCQltZXRob2REZWNsYXJhdGlvbjMuc2V0TmFtZShhc3QubmV3U2ltcGxlTmFtZSgiTTMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdHlwZURlY2xhcmF0aW9uLmJvZHlEZWNsYXJhdGlvbnMoKS5hZGQoMiwgbWV0aG9kRGVjbGFyYXRpb24zKTsKLQkJLy8gaW5zZXJ0IGEgbmV3IGJlZm9yZSB0aGUgY3VycmVudCBub2RlIGR1cmluZyBhIHRyYXZlcnNlCi0JCVRlc3RWaXNpdG9yIHYxID0gbmV3IFRlc3RWaXNpdG9yKCkgewotCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoTWV0aG9kRGVjbGFyYXRpb24gbm9kZSkgewotCQkJCWlmIChub2RlID09IG1ldGhvZERlY2xhcmF0aW9uMikgewotCQkJCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbjQgPSBhc3QubmV3TWV0aG9kRGVjbGFyYXRpb24oKTsKLQkJCQkJbWV0aG9kRGVjbGFyYXRpb240LnNldE5hbWUoYXN0Lm5ld1NpbXBsZU5hbWUoIk00IikpOyAvLyROT04tTkxTLTEkCi0JCQkJCXR5cGVEZWNsYXJhdGlvbi5ib2R5RGVjbGFyYXRpb25zKCkuYWRkKDAsIG1ldGhvZERlY2xhcmF0aW9uNCk7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci52aXNpdChub2RlKTsKLQkJCX0JCQkKLQkJfTsKLQkJYi5zZXRMZW5ndGgoMCk7Ci0JCXR5cGVEZWNsYXJhdGlvbi5hY2NlcHQodjEpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIG91dHB1dCIsICJbKFREWyhuU05OblMpXVsoTURbKHRQdm9pZHZvaWR0UCldWyhuU00xTTFuUyldTUQpXVsoTURbKHRQdm9pZHZvaWR0UCldWyhuU00yTTJuUyldTUQpXVsoTURbKHRQdm9pZHZvaWR0UCldWyhuU00zTTNuUyldTUQpXVREKV0iLCBiLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJhdmVyc2VBbmRNb2RpZnlfMigpIHsKLQkJZmluYWwgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IGFzdC5uZXdUeXBlRGVjbGFyYXRpb24oKTsKLQkJdHlwZURlY2xhcmF0aW9uLnNldE5hbWUoTjEpOwotCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IGFzdC5uZXdNZXRob2REZWNsYXJhdGlvbigpOwotCQltZXRob2REZWNsYXJhdGlvbi5zZXROYW1lKGFzdC5uZXdTaW1wbGVOYW1lKCJNMSIpKTsgLy8kTk9OLU5MUy0xJAotCQl0eXBlRGVjbGFyYXRpb24uYm9keURlY2xhcmF0aW9ucygpLmFkZCgwLCBtZXRob2REZWNsYXJhdGlvbik7Ci0JCWZpbmFsIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uMiA9IGFzdC5uZXdNZXRob2REZWNsYXJhdGlvbigpOwotCQltZXRob2REZWNsYXJhdGlvbjIuc2V0TmFtZShhc3QubmV3U2ltcGxlTmFtZSgiTTIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdHlwZURlY2xhcmF0aW9uLmJvZHlEZWNsYXJhdGlvbnMoKS5hZGQoMSwgbWV0aG9kRGVjbGFyYXRpb24yKTsKLQkJTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24zID0gYXN0Lm5ld01ldGhvZERlY2xhcmF0aW9uKCk7Ci0JCW1ldGhvZERlY2xhcmF0aW9uMy5zZXROYW1lKGFzdC5uZXdTaW1wbGVOYW1lKCJNMyIpKTsgLy8kTk9OLU5MUy0xJAotCQl0eXBlRGVjbGFyYXRpb24uYm9keURlY2xhcmF0aW9ucygpLmFkZCgyLCBtZXRob2REZWNsYXJhdGlvbjMpOwotCQkvLyBpbnNlcnQgYSBuZXcgYWZ0ZXIgdGhlIGN1cnJlbnQgbm9kZSBkdXJpbmcgYSB0cmF2ZXJzZQotCQlUZXN0VmlzaXRvciB2MSA9IG5ldyBUZXN0VmlzaXRvcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KE1ldGhvZERlY2xhcmF0aW9uIG5vZGUpIHsKLQkJCQlpZiAobm9kZSA9PSBtZXRob2REZWNsYXJhdGlvbjIpIHsKLQkJCQkJTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb240ID0gYXN0Lm5ld01ldGhvZERlY2xhcmF0aW9uKCk7Ci0JCQkJCW1ldGhvZERlY2xhcmF0aW9uNC5zZXROYW1lKGFzdC5uZXdTaW1wbGVOYW1lKCJNNCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl0eXBlRGVjbGFyYXRpb24uYm9keURlY2xhcmF0aW9ucygpLmFkZCgzLCBtZXRob2REZWNsYXJhdGlvbjQpOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIudmlzaXQobm9kZSk7Ci0JCQl9CQkJCi0JCX07Ci0JCWIuc2V0TGVuZ3RoKDApOwotCQl0eXBlRGVjbGFyYXRpb24uYWNjZXB0KHYxKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBvdXRwdXQiLCAiWyhURFsoblNOTm5TKV1bKE1EWyh0UHZvaWR2b2lkdFApXVsoblNNMU0xblMpXU1EKV1bKE1EWyh0UHZvaWR2b2lkdFApXVsoblNNMk0yblMpXU1EKV1bKE1EWyh0UHZvaWR2b2lkdFApXVsoblNNM00zblMpXU1EKV1bKE1EWyh0UHZvaWR2b2lkdFApXVsoblNNNE00blMpXU1EKV1URCldIiwgYi50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RUcmF2ZXJzZUFuZE1vZGlmeV8zKCkgewotCQlmaW5hbCBJbmZpeEV4cHJlc3Npb24gaW5maXhFeHByZXNzaW9uID0gYXN0Lm5ld0luZml4RXhwcmVzc2lvbigpOwotCQlpbmZpeEV4cHJlc3Npb24uc2V0TGVmdE9wZXJhbmQoYXN0Lm5ld1NpbXBsZU5hbWUoImkiKSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5maXhFeHByZXNzaW9uLnNldFJpZ2h0T3BlcmFuZChhc3QubmV3TnVtYmVyTGl0ZXJhbCgiMTAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5maXhFeHByZXNzaW9uLnNldE9wZXJhdG9yKEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5QTFVTKTsKLQkJLy8gaW5zZXJ0IGEgbmV3IGFmdGVyIHRoZSBjdXJyZW50IG5vZGUgZHVyaW5nIGEgdHJhdmVyc2UKLQkJVGVzdFZpc2l0b3IgdjEgPSBuZXcgVGVzdFZpc2l0b3IoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTaW1wbGVOYW1lIG5vZGUpIHsKLQkJCQlpbmZpeEV4cHJlc3Npb24uc2V0UmlnaHRPcGVyYW5kKGFzdC5uZXdOdW1iZXJMaXRlcmFsKCIyMiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBzdXBlci52aXNpdChub2RlKTsKLQkJCX0JCQkKLQkJfTsKLQkJYi5zZXRMZW5ndGgoMCk7Ci0JCWluZml4RXhwcmVzc2lvbi5hY2NlcHQodjEpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIG91dHB1dCIsICJbKGVJTitbKG5TaWluUyldWyhlTlUyMjIyZU5VKV0rZUlOKV0iLCBiLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFRyYXZlcnNlQW5kTW9kaWZ5XzQoKSB7Ci0JCWZpbmFsIEluZml4RXhwcmVzc2lvbiBpbmZpeEV4cHJlc3Npb24gPSBhc3QubmV3SW5maXhFeHByZXNzaW9uKCk7Ci0JCWluZml4RXhwcmVzc2lvbi5zZXRMZWZ0T3BlcmFuZChhc3QubmV3U2ltcGxlTmFtZSgiaSIpKTsgLy8kTk9OLU5MUy0xJAotCQlpbmZpeEV4cHJlc3Npb24uc2V0UmlnaHRPcGVyYW5kKGFzdC5uZXdOdW1iZXJMaXRlcmFsKCIxMCIpKTsgLy8kTk9OLU5MUy0xJAotCQlpbmZpeEV4cHJlc3Npb24uc2V0T3BlcmF0b3IoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLlBMVVMpOwotCQkvLyBpbnNlcnQgYSBuZXcgYmVmb3JlIHRoZSBjdXJyZW50IG5vZGUgZHVyaW5nIGEgdHJhdmVyc2UKLQkJVGVzdFZpc2l0b3IgdjEgPSBuZXcgVGVzdFZpc2l0b3IoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChOdW1iZXJMaXRlcmFsIG5vZGUpIHsKLQkJCQlpbmZpeEV4cHJlc3Npb24uc2V0TGVmdE9wZXJhbmQoYXN0Lm5ld1NpbXBsZU5hbWUoImoiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gc3VwZXIudmlzaXQobm9kZSk7Ci0JCQl9CQkJCi0JCX07Ci0JCWIuc2V0TGVuZ3RoKDApOwotCQlpbmZpeEV4cHJlc3Npb24uYWNjZXB0KHYxKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBvdXRwdXQiLCAiWyhlSU4rWyhuU2lpblMpXVsoZU5VMTAxMGVOVSldK2VJTildIiwgYi50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2RvbS9CaW5kaW5nc0NvbGxlY3RvclZpc2l0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9kb20vQmluZGluZ3NDb2xsZWN0b3JWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlM2RjZDIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2RvbS9CaW5kaW5nc0NvbGxlY3RvclZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmRvbTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3I7Ci0KLS8qKgotICogQGF1dGhvciBvbGl2aWVydAotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6Ci0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuCi0gKiBUbyBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIHR5cGUgY29tbWVudHMgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbi4KLSAqLwotY2xhc3MgQmluZGluZ3NDb2xsZWN0b3JWaXNpdG9yIGV4dGVuZHMgQVNUVmlzaXRvciB7Ci0KLQlwcml2YXRlIEhhc2hNYXAgaGFzaE1hcDsKLQlwcml2YXRlIEhhc2hTZXQgc2V0OwotCQotCUJpbmRpbmdzQ29sbGVjdG9yVmlzaXRvcigpIHsKLQkJdGhpcy5oYXNoTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJdGhpcy5zZXQgPSBuZXcgSGFzaFNldCgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY29sbGVjdEJpbmRpbmdzKAotCQlBU1ROb2RlIG5vZGUsCi0JCUlCaW5kaW5nIGJpbmRpbmcpIHsKLQkJaWYgKGJpbmRpbmcgIT0gbnVsbCkgewotCQkJaGFzaE1hcC5wdXQobm9kZSwgYmluZGluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXQuYWRkKG5vZGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gbm9kZSkgewotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBub2RlLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWNvbGxlY3RCaW5kaW5ncyhub2RlLCB0eXBlQmluZGluZyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChBcnJheUFjY2VzcykKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChBcnJheUFjY2VzcyBub2RlKSB7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IG5vZGUucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWNvbGxlY3RCaW5kaW5ncyhub2RlLCB0eXBlQmluZGluZyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChBcnJheUNyZWF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFycmF5Q3JlYXRpb24gbm9kZSkgewotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBub2RlLnJlc29sdmVUeXBlQmluZGluZygpOwotCQljb2xsZWN0QmluZGluZ3Mobm9kZSwgdHlwZUJpbmRpbmcpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQoQXJyYXlJbml0aWFsaXplcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChBcnJheUluaXRpYWxpemVyIG5vZGUpIHsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gbm9kZS5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJY29sbGVjdEJpbmRpbmdzKG5vZGUsIHR5cGVCaW5kaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KEFycmF5VHlwZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChBcnJheVR5cGUgbm9kZSkgewotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBub2RlLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWNvbGxlY3RCaW5kaW5ncyhub2RlLCB0eXBlQmluZGluZyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChBc3NlcnRTdGF0ZW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQXNzZXJ0U3RhdGVtZW50IG5vZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KEFzc2lnbm1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQXNzaWdubWVudCBub2RlKSB7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IG5vZGUucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWNvbGxlY3RCaW5kaW5ncyhub2RlLCB0eXBlQmluZGluZyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChCbG9jaykKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChCbG9jayBub2RlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChCb29sZWFuTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChCb29sZWFuTGl0ZXJhbCBub2RlKSB7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IG5vZGUucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWNvbGxlY3RCaW5kaW5ncyhub2RlLCB0eXBlQmluZGluZyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChCcmVha1N0YXRlbWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChCcmVha1N0YXRlbWVudCBub2RlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChDYXN0RXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChDYXN0RXhwcmVzc2lvbiBub2RlKSB7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IG5vZGUucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWNvbGxlY3RCaW5kaW5ncyhub2RlLCB0eXBlQmluZGluZyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChDYXRjaENsYXVzZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChDYXRjaENsYXVzZSBub2RlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChDaGFyYWN0ZXJMaXRlcmFsKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENoYXJhY3RlckxpdGVyYWwgbm9kZSkgewotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBub2RlLnJlc29sdmVUeXBlQmluZGluZygpOwotCQljb2xsZWN0QmluZGluZ3Mobm9kZSwgdHlwZUJpbmRpbmcpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENsYXNzSW5zdGFuY2VDcmVhdGlvbiBub2RlKSB7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IG5vZGUucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWNvbGxlY3RCaW5kaW5ncyhub2RlLCB0eXBlQmluZGluZyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChDb21waWxhdGlvblVuaXQpCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQ29tcGlsYXRpb25Vbml0IG5vZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KENvbmRpdGlvbmFsRXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChDb25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSkgewotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBub2RlLnJlc29sdmVUeXBlQmluZGluZygpOwotCQljb2xsZWN0QmluZGluZ3Mobm9kZSwgdHlwZUJpbmRpbmcpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQoQ29uc3RydWN0b3JJbnZvY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7Ci0JCUlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSBub2RlLnJlc29sdmVDb25zdHJ1Y3RvckJpbmRpbmcoKTsKLQkJY29sbGVjdEJpbmRpbmdzKG5vZGUsIG1ldGhvZEJpbmRpbmcpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQoQ29udGludWVTdGF0ZW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQ29udGludWVTdGF0ZW1lbnQgbm9kZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQoRG9TdGF0ZW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoRG9TdGF0ZW1lbnQgbm9kZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQoRW1wdHlTdGF0ZW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoRW1wdHlTdGF0ZW1lbnQgbm9kZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQoRXhwcmVzc2lvblN0YXRlbWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUpIHt9Ci0JCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KEZpZWxkQWNjZXNzKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEZpZWxkQWNjZXNzIG5vZGUpIHsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gbm9kZS5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJY29sbGVjdEJpbmRpbmdzKG5vZGUsIHR5cGVCaW5kaW5nKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChGaWVsZERlY2xhcmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEZpZWxkRGVjbGFyYXRpb24gbm9kZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQoRm9yU3RhdGVtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEZvclN0YXRlbWVudCBub2RlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChJZlN0YXRlbWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChJZlN0YXRlbWVudCBub2RlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChJbXBvcnREZWNsYXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChJbXBvcnREZWNsYXJhdGlvbiBub2RlKSB7Ci0JCUlCaW5kaW5nIGJpbmRpbmcgPSBub2RlLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWNvbGxlY3RCaW5kaW5ncyhub2RlLCBiaW5kaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KEluZml4RXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChJbmZpeEV4cHJlc3Npb24gbm9kZSkgewotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBub2RlLnJlc29sdmVUeXBlQmluZGluZygpOwotCQljb2xsZWN0QmluZGluZ3Mobm9kZSwgdHlwZUJpbmRpbmcpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQoSW5pdGlhbGl6ZXIpCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoSW5pdGlhbGl6ZXIgbm9kZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQoSW5zdGFuY2VvZkV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoSW5zdGFuY2VvZkV4cHJlc3Npb24gbm9kZSkgewotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBub2RlLnJlc29sdmVUeXBlQmluZGluZygpOwotCQljb2xsZWN0QmluZGluZ3Mobm9kZSwgdHlwZUJpbmRpbmcpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQoSmF2YWRvYykKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChKYXZhZG9jIG5vZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KExhYmVsZWRTdGF0ZW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoTGFiZWxlZFN0YXRlbWVudCBub2RlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChNZXRob2REZWNsYXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChNZXRob2REZWNsYXJhdGlvbiBub2RlKSB7Ci0JCUlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSBub2RlLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWNvbGxlY3RCaW5kaW5ncyhub2RlLCBtZXRob2RCaW5kaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KE1ldGhvZEludm9jYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IG5vZGUucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWNvbGxlY3RCaW5kaW5ncyhub2RlLCB0eXBlQmluZGluZyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChOdWxsTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChOdWxsTGl0ZXJhbCBub2RlKSB7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IG5vZGUucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWNvbGxlY3RCaW5kaW5ncyhub2RlLCB0eXBlQmluZGluZyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChOdW1iZXJMaXRlcmFsKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KE51bWJlckxpdGVyYWwgbm9kZSkgewotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBub2RlLnJlc29sdmVUeXBlQmluZGluZygpOwotCQljb2xsZWN0QmluZGluZ3Mobm9kZSwgdHlwZUJpbmRpbmcpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQoUGFja2FnZURlY2xhcmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBhY2thZ2VEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCUlQYWNrYWdlQmluZGluZyBwYWNrYWdlQmluZGluZyA9IG5vZGUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJY29sbGVjdEJpbmRpbmdzKG5vZGUsIHBhY2thZ2VCaW5kaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIG5vZGUpIHsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gbm9kZS5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJY29sbGVjdEJpbmRpbmdzKG5vZGUsIHR5cGVCaW5kaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KFBvc3RmaXhFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBvc3RmaXhFeHByZXNzaW9uIG5vZGUpIHsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gbm9kZS5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJY29sbGVjdEJpbmRpbmdzKG5vZGUsIHR5cGVCaW5kaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KFByZWZpeEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoUHJlZml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IG5vZGUucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWNvbGxlY3RCaW5kaW5ncyhub2RlLCB0eXBlQmluZGluZyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChQcmltaXRpdmVUeXBlKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFByaW1pdGl2ZVR5cGUgbm9kZSkgewotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBub2RlLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWNvbGxlY3RCaW5kaW5ncyhub2RlLCB0eXBlQmluZGluZyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChRdWFsaWZpZWROYW1lKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFF1YWxpZmllZE5hbWUgbm9kZSkgewotCQlJQmluZGluZyBiaW5kaW5nID0gbm9kZS5yZXNvbHZlQmluZGluZygpOwotCQljb2xsZWN0QmluZGluZ3Mobm9kZSwgYmluZGluZyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChSZXR1cm5TdGF0ZW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoUmV0dXJuU3RhdGVtZW50IG5vZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KFNpbXBsZU5hbWUpCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoU2ltcGxlTmFtZSBub2RlKSB7Ci0JCUlCaW5kaW5nIGJpbmRpbmcgPSBub2RlLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWNvbGxlY3RCaW5kaW5ncyhub2RlLCBiaW5kaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KFNpbXBsZVR5cGUpCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoU2ltcGxlVHlwZSBub2RlKSB7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IG5vZGUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJY29sbGVjdEJpbmRpbmdzKG5vZGUsIHR5cGVCaW5kaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gbm9kZS5yZXNvbHZlQmluZGluZygpOwotCQljb2xsZWN0QmluZGluZ3Mobm9kZSwgdmFyaWFibGVCaW5kaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KFN0cmluZ0xpdGVyYWwpCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoU3RyaW5nTGl0ZXJhbCBub2RlKSB7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IG5vZGUucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWNvbGxlY3RCaW5kaW5ncyhub2RlLCB0eXBlQmluZGluZyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7Ci0JCUlNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcgPSBub2RlLnJlc29sdmVDb25zdHJ1Y3RvckJpbmRpbmcoKTsKLQkJY29sbGVjdEJpbmRpbmdzKG5vZGUsIG1ldGhvZEJpbmRpbmcpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQoU3VwZXJGaWVsZEFjY2VzcykKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChTdXBlckZpZWxkQWNjZXNzIG5vZGUpIHsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gbm9kZS5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJY29sbGVjdEJpbmRpbmdzKG5vZGUsIHR5cGVCaW5kaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KFN1cGVyTWV0aG9kSW52b2NhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChTdXBlck1ldGhvZEludm9jYXRpb24gbm9kZSkgewotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBub2RlLnJlc29sdmVUeXBlQmluZGluZygpOwotCQljb2xsZWN0QmluZGluZ3Mobm9kZSwgdHlwZUJpbmRpbmcpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQoU3dpdGNoQ2FzZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChTd2l0Y2hDYXNlIG5vZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KFN3aXRjaFN0YXRlbWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChTd2l0Y2hTdGF0ZW1lbnQgbm9kZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQoU3luY2hyb25pemVkU3RhdGVtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFN5bmNocm9uaXplZFN0YXRlbWVudCBub2RlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChUaGlzRXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChUaGlzRXhwcmVzc2lvbiBub2RlKSB7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IG5vZGUucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWNvbGxlY3RCaW5kaW5ncyhub2RlLCB0eXBlQmluZGluZyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChUaHJvd1N0YXRlbWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChUaHJvd1N0YXRlbWVudCBub2RlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChUcnlTdGF0ZW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoVHJ5U3RhdGVtZW50IG5vZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KFR5cGVEZWNsYXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChUeXBlRGVjbGFyYXRpb24gbm9kZSkgewotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBub2RlLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWNvbGxlY3RCaW5kaW5ncyhub2RlLCB0eXBlQmluZGluZyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50IG5vZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KFR5cGVMaXRlcmFsKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFR5cGVMaXRlcmFsIG5vZGUpIHsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gbm9kZS5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJY29sbGVjdEJpbmRpbmdzKG5vZGUsIHR5cGVCaW5kaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uIG5vZGUpIHsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gbm9kZS5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJY29sbGVjdEJpbmRpbmdzKG5vZGUsIHR5cGVCaW5kaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgbm9kZSkgewotCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IG5vZGUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJY29sbGVjdEJpbmRpbmdzKG5vZGUsIHZhcmlhYmxlQmluZGluZyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgbm9kZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQoV2hpbGVTdGF0ZW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoV2hpbGVTdGF0ZW1lbnQgbm9kZSkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhhc2hNYXAuCi0JICogQHJldHVybiBIYXNoTWFwCi0JICovCi0JcHVibGljIEhhc2hNYXAgZ2V0QmluZGluZ3NNYXAoKSB7Ci0JCXJldHVybiBoYXNoTWFwOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNldC4KLQkgKiBAcmV0dXJuIEhhc2hTZXQKLQkgKi8KLQlwdWJsaWMgSGFzaFNldCBnZXRVbnJlc29sdmVkTm9kZXNTZXQoKSB7Ci0JCXJldHVybiBzZXQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZG9tL0NvbnZlcnRlclRlc3RTZXR1cC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2RvbS9Db252ZXJ0ZXJUZXN0U2V0dXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhlZmVmMC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZG9tL0NvbnZlcnRlclRlc3RTZXR1cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuZG9tOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwuQWJzdHJhY3RKYXZhTW9kZWxUZXN0czsKLQotYWJzdHJhY3QgY2xhc3MgQ29udmVydGVyVGVzdFNldHVwIGV4dGVuZHMgQWJzdHJhY3RKYXZhTW9kZWxUZXN0cyB7Ci0KLQlwcm90ZWN0ZWQgQVNUIGFzdDsKLQotCXByb3RlY3RlZCBDb252ZXJ0ZXJUZXN0U2V0dXAoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0Q29udmVydGVySkNMUGF0aCgpIHsKLQkJcmV0dXJuIEFic3RyYWN0SmF2YU1vZGVsVGVzdHMuRVhURVJOQUxfSkFSX0RJUl9QQVRIICsgRmlsZS5zZXBhcmF0b3IgKyAiY29udmVydGVySmNsTWluLmphciI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRDb252ZXJ0ZXJKQ0xTb3VyY2VQYXRoKCkgewotCQlyZXR1cm4gQWJzdHJhY3RKYXZhTW9kZWxUZXN0cy5FWFRFUk5BTF9KQVJfRElSX1BBVEggKyBGaWxlLnNlcGFyYXRvciArICJjb252ZXJ0ZXJKY2xNaW5zcmMuemlwIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldENvbnZlcnRlckpDTFJvb3RTb3VyY2VQYXRoKCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBsb2NhbGx5IGZvciB0aGUgcmVxdWlyZWQgSkNMIGZpbGVzLCBqY2xNaW4uamFyIGFuZCBqY2xNaW5zcmMuemlwLgotCSAqIElmIG5vdCBhdmFpbGFibGUsIGNvcHkgZnJvbSB0aGUgcHJvamVjdCByZXNvdXJjZXMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0dXBDb252ZXJ0ZXJKQ0woKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgc2VwYXJhdG9yID0gamF2YS5pby5GaWxlLnNlcGFyYXRvcjsKLQkJU3RyaW5nIHJlc291cmNlSkNMRGlyID0gZ2V0UGx1Z2luRGlyZWN0b3J5UGF0aCgpICsgc2VwYXJhdG9yICsgIkpDTCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGxvY2FsSkNMUGF0aCA9Z2V0V29ya3NwYWNlUm9vdCgpLmdldExvY2F0aW9uKCkudG9GaWxlKCkuZ2V0UGFyZW50RmlsZSgpLmdldENhbm9uaWNhbFBhdGgoKTsKLQkJRVhURVJOQUxfSkFSX0RJUl9QQVRIID0gbG9jYWxKQ0xQYXRoOwotCQlqYXZhLmlvLkZpbGUgamNsRGlyID0gbmV3IGphdmEuaW8uRmlsZShsb2NhbEpDTFBhdGgpOwotCQlqYXZhLmlvLkZpbGUgamNsTWluID0KLQkJCW5ldyBqYXZhLmlvLkZpbGUobG9jYWxKQ0xQYXRoICsgc2VwYXJhdG9yICsgImNvbnZlcnRlckpjbE1pbi5qYXIiKTsgLy8kTk9OLU5MUy0xJAotCQlqYXZhLmlvLkZpbGUgamNsTWluc3JjID0gbmV3IGphdmEuaW8uRmlsZShsb2NhbEpDTFBhdGggKyBzZXBhcmF0b3IgKyAiY29udmVydGVySmNsTWluc3JjLnppcCIpOyAvLyROT04tTkxTLTEkCi0JCWlmICghamNsRGlyLmV4aXN0cygpKSB7Ci0JCQlpZiAoIWpjbERpci5ta2RpcigpKSB7Ci0JCQkJLy9ta2RpciBmYWlsZWQKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgdGhlIGRpcmVjdG9yeSAiICsgamNsRGlyKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQkvL2NvcHkgdGhlIHR3byBmaWxlcyB0byB0aGUgSkNMIGRpcmVjdG9yeQotCQkJCWphdmEuaW8uRmlsZSByZXNvdXJjZUpDTE1pbiA9Ci0JCQkJCW5ldyBqYXZhLmlvLkZpbGUocmVzb3VyY2VKQ0xEaXIgKyBzZXBhcmF0b3IgKyAiY29udmVydGVySmNsTWluLmphciIpOyAvLyROT04tTkxTLTEkCi0JCQkJY29weShyZXNvdXJjZUpDTE1pbiwgamNsTWluKTsKLQkJCQlqYXZhLmlvLkZpbGUgcmVzb3VyY2VKQ0xNaW5zcmMgPQotCQkJCQluZXcgamF2YS5pby5GaWxlKHJlc291cmNlSkNMRGlyICsgc2VwYXJhdG9yICsgImNvbnZlcnRlckpjbE1pbnNyYy56aXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNvcHkocmVzb3VyY2VKQ0xNaW5zcmMsIGpjbE1pbnNyYyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvL2NoZWNrIHRoYXQgdGhlIHR3byBmaWxlcywgamNsTWluLmphciBhbmQgamNsTWluc3JjLnppcCBhcmUgcHJlc2VudAotCQkJLy9jb3B5IGVpdGhlciBmaWxlIHRoYXQgaXMgbWlzc2luZwotCQkJaWYgKCFqY2xNaW4uZXhpc3RzKCkpIHsKLQkJCQlqYXZhLmlvLkZpbGUgcmVzb3VyY2VKQ0xNaW4gPQotCQkJCQluZXcgamF2YS5pby5GaWxlKHJlc291cmNlSkNMRGlyICsgc2VwYXJhdG9yICsgImNvbnZlcnRlckpjbE1pbi5qYXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNvcHkocmVzb3VyY2VKQ0xNaW4sIGpjbE1pbik7Ci0JCQl9Ci0JCQlpZiAoIWpjbE1pbnNyYy5leGlzdHMoKSkgewotCQkJCWphdmEuaW8uRmlsZSByZXNvdXJjZUpDTE1pbnNyYyA9Ci0JCQkJCW5ldyBqYXZhLmlvLkZpbGUocmVzb3VyY2VKQ0xEaXIgKyBzZXBhcmF0b3IgKyAiY29udmVydGVySmNsTWluc3JjLnppcCIpOyAvLyROT04tTkxTLTEkCi0JCQkJY29weShyZXNvdXJjZUpDTE1pbnNyYywgamNsTWluc3JjKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlc2V0IHRoZSBqYXIgcGxhY2Vob2xkZXIgYW5kIGRlbGV0ZSBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHRlYXJEb3duU3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXN0ID0gbnVsbDsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJDb252ZXJ0ZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9CQotCi0JLyoqCi0JICogQ3JlYXRlIHByb2plY3QgYW5kIHNldCB0aGUgamFyIHBsYWNlaG9sZGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVwU3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXBTdWl0ZSgpOwotCQlzZXR1cENvbnZlcnRlckpDTCgpOwotCQlhc3QgPSBuZXcgQVNUKCk7Ci0JCXNldFVwSmF2YVByb2plY3QoIkNvbnZlcnRlciIpOyAvLyROT04tTkxTLTEkCi0JCS8vIGVuc3VyZSB2YXJpYWJsZXMgYXJlIHNldAotCQlpZiAoSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoVmFyaWFibGUoIkNvbnZlcnRlckpDTF9MSUIiKSA9PSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUphdmFDb3JlLnNldENsYXNzcGF0aFZhcmlhYmxlcygKLQkJCQluZXcgU3RyaW5nW10geyJDT05WRVJURVJfSkNMX0xJQiIsICJDT05WRVJURVJfSkNMX1NSQyIsICJDT05WRVJURVJfSkNMX1NSQ1JPT1QifSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQluZXcgUGF0aFtdIHtuZXcgUGF0aChDb252ZXJ0ZXJUZXN0U2V0dXAuZ2V0Q29udmVydGVySkNMUGF0aCgpKSwgbmV3IFBhdGgoQ29udmVydGVyVGVzdFNldHVwLmdldENvbnZlcnRlckpDTFNvdXJjZVBhdGgoKSksIG5ldyBQYXRoKENvbnZlcnRlclRlc3RTZXR1cC5nZXRDb252ZXJ0ZXJKQ0xSb290U291cmNlUGF0aCgpKX0sCi0JCQkJbnVsbCk7Ci0JCX0JCQotCX0JCi0KLQlwdWJsaWMgQVNUTm9kZSBydW5Db252ZXJzaW9uKElDb21waWxhdGlvblVuaXQgdW5pdCwgYm9vbGVhbiByZXNvbHZlQmluZGluZ3MpIHsKLQkJcmV0dXJuIEFTVC5wYXJzZUNvbXBpbGF0aW9uVW5pdCh1bml0LCByZXNvbHZlQmluZGluZ3MpOwotCX0KLQotCXB1YmxpYyBBU1ROb2RlIHJ1bkNvbnZlcnNpb24oY2hhcltdIHNvdXJjZSwgU3RyaW5nIHVuaXROYW1lLCBJSmF2YVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gQVNULnBhcnNlQ29tcGlsYXRpb25Vbml0KHNvdXJjZSwgdW5pdE5hbWUsIHByb2plY3QpOwotCX0KLQkKLQotCXByb3RlY3RlZCBBU1ROb2RlIGdldEFTVE5vZGVUb0NvbXBhcmUob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdCB1bml0KSB7Ci0JCUV4cHJlc3Npb25TdGF0ZW1lbnQgc3RhdGVtZW50ID0gKEV4cHJlc3Npb25TdGF0ZW1lbnQpIGdldEFTVE5vZGUodW5pdCwgMCwgMCwgMCk7Ci0JCXJldHVybiAoQVNUTm9kZSkgKChNZXRob2RJbnZvY2F0aW9uKSBzdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpKS5hcmd1bWVudHMoKS5nZXQoMCk7Ci0JfQotCi0JcHJvdGVjdGVkIEFTVE5vZGUgZ2V0QVNUTm9kZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0IHVuaXQsIGludCB0eXBlSW5kZXgsIGludCBib2R5SW5kZXgsIGludCBzdGF0ZW1lbnRJbmRleCkgewotCQlCb2R5RGVjbGFyYXRpb24gYm9keURlY2xhcmF0aW9uID0gKEJvZHlEZWNsYXJhdGlvbikoKFR5cGVEZWNsYXJhdGlvbil1bml0LnR5cGVzKCkuZ2V0KHR5cGVJbmRleCkpLmJvZHlEZWNsYXJhdGlvbnMoKS5nZXQoYm9keUluZGV4KTsKLQkJaWYgKGJvZHlEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7Ci0JCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbikgYm9keURlY2xhcmF0aW9uOwotCQkJQmxvY2sgYmxvY2sgPSBtZXRob2REZWNsYXJhdGlvbi5nZXRCb2R5KCk7Ci0JCQlyZXR1cm4gKEFTVE5vZGUpIGJsb2NrLnN0YXRlbWVudHMoKS5nZXQoc3RhdGVtZW50SW5kZXgpOwotCQl9IGVsc2UgaWYgKGJvZHlEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikgewotCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pIGJvZHlEZWNsYXJhdGlvbjsKLQkJCXJldHVybiAoQVNUTm9kZSkgdHlwZURlY2xhcmF0aW9uLmJvZHlEZWNsYXJhdGlvbnMoKS5nZXQoc3RhdGVtZW50SW5kZXgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBBU1ROb2RlIGdldEFTVE5vZGUob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdCB1bml0LCBpbnQgdHlwZUluZGV4LCBpbnQgYm9keUluZGV4KSB7Ci0JCXJldHVybiAoQVNUTm9kZSkgKChUeXBlRGVjbGFyYXRpb24pdW5pdC50eXBlcygpLmdldCh0eXBlSW5kZXgpKS5ib2R5RGVjbGFyYXRpb25zKCkuZ2V0KGJvZHlJbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIEFTVE5vZGUgZ2V0QVNUTm9kZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0IHVuaXQsIGludCB0eXBlSW5kZXgpIHsKLQkJcmV0dXJuIChBU1ROb2RlKSAoVHlwZURlY2xhcmF0aW9uKXVuaXQudHlwZXMoKS5nZXQodHlwZUluZGV4KTsKLQl9Ci0JCQotCXByb3RlY3RlZCB2b2lkIGNoZWNrU291cmNlUmFuZ2UoQVNUTm9kZSBub2RlLCBTdHJpbmcgZXhwZWN0ZWRDb250ZW50cywgY2hhcltdIHNvdXJjZSkgewotCQlhc3NlcnROb3ROdWxsKCJUaGUgbm9kZSBpcyBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIG5vZGUoIiArIG5vZGUuZ2V0Q2xhc3MoKSArICIpLmdldExlbmd0aCgpID09IDAiLCBub2RlLmdldExlbmd0aCgpICE9IDApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIG5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpID09IC0xIiwgbm9kZS5nZXRTdGFydFBvc2l0aW9uKCkgIT0gLTEpOyAvLyROT04tTkxTLTEkCi0JCWludCBsZW5ndGggPSBub2RlLmdldExlbmd0aCgpOwotCQlpbnQgc3RhcnQgPSBub2RlLmdldFN0YXJ0UG9zaXRpb24oKTsKLQkJY2hhcltdIGFjdHVhbENvbnRlbnRzID0gbmV3IGNoYXJbbGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShzb3VyY2UsIHN0YXJ0LCBhY3R1YWxDb250ZW50cywgMCwgbGVuZ3RoKTsKLQkJU3RyaW5nIGFjdHVhbENvbnRlbnRzU3RyaW5nID0gbmV3IFN0cmluZyhhY3R1YWxDb250ZW50cyk7Ci0JCWlmIChjb250YWluc0xpbmVTZXBhcmF0b3IoYWN0dWFsQ29udGVudHNTdHJpbmcpKSB7Ci0JCQlhc3NlcnRBcnJheXNFcXVhbHMoYWN0dWFsQ29udGVudHNTdHJpbmcsIGV4cGVjdGVkQ29udGVudHMpOwotCQl9IGVsc2UgewkJCi0JCQlhc3NlcnRUcnVlKCJUaGUgdHdvIHN0cmluZ3MgYXJlIG5vdCBlcXVhbHNcbi0tLVxuYWN0dWFsQ29udGVudHMgPSA+IiArIGFjdHVhbENvbnRlbnRzU3RyaW5nICsgIjxcbmV4cGVjdGVkQ29udGVudHMgPSA+IiArIGV4cGVjdGVkQ29udGVudHMgKyAiPFxuLS0tLSIsIGV4cGVjdGVkQ29udGVudHMuZXF1YWxzKGFjdHVhbENvbnRlbnRzU3RyaW5nKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zTGluZVNlcGFyYXRvcihTdHJpbmcgcykgewotCQlyZXR1cm4gcy5pbmRleE9mKCJcbiIpICE9IC0xIHx8ICBzLmluZGV4T2YoIlxyIikgIT0gLTE7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQkKLQlwcml2YXRlIHZvaWQgYXNzZXJ0QXJyYXlzRXF1YWxzKFN0cmluZyBhY3R1YWxDb250ZW50cywgU3RyaW5nIGV4cGVjdGVkQ29udGVudHMpIHsKLQkJU3RyaW5nW10gYWN0dWFsQ29udGVudHNBcnJheSA9IGNyZWF0ZUFycmF5T2ZTdHJpbmcoYWN0dWFsQ29udGVudHMpOwotCQlTdHJpbmdbXSBleHBlY3RlZENvbnRlbnRzQXJyYXkgPSBjcmVhdGVBcnJheU9mU3RyaW5nKGV4cGVjdGVkQ29udGVudHMpOwotCQlhc3NlcnRUcnVlKCJEaWZmZXJlbnQgc2l6ZSIsIGFjdHVhbENvbnRlbnRzQXJyYXkubGVuZ3RoID09IGV4cGVjdGVkQ29udGVudHNBcnJheS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwLCBtYXggPSBleHBlY3RlZENvbnRlbnRzQXJyYXkubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCWFzc2VydEVxdWFscygiRGlmZmVyZW50IGFycmF5IHBhcnRzIiwgZXhwZWN0ZWRDb250ZW50c0FycmF5W2ldLCBhY3R1YWxDb250ZW50c0FycmF5W2ldKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nW10gY3JlYXRlQXJyYXlPZlN0cmluZyhTdHJpbmcgcykgewotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzLCAiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCUFycmF5TGlzdCBhcnJheUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCVN0cmluZyBuZXh0VG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlpZiAobmV4dFRva2VuLmxlbmd0aCgpICE9IDApIHsKLQkJCQlhcnJheUxpc3QuYWRkKG5leHRUb2tlbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChTdHJpbmdbXSkgYXJyYXlMaXN0LnRvQXJyYXkobmV3IFN0cmluZ1thcnJheUxpc3Quc2l6ZSgpXSk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzTWFsZm9ybWVkKEFTVE5vZGUgbm9kZSkgewotCQlyZXR1cm4gKG5vZGUuZ2V0RmxhZ3MoKSAmIEFTVE5vZGUuTUFMRk9STUVEKSAhPSAwOwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9kb20vUnVuQWxsVGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9kb20vUnVuQWxsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjViNDgxYS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZG9tL1J1bkFsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmRvbTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBSdW5BbGxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLXB1YmxpYyBSdW5BbGxUZXN0cyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIHN0YXRpYyBDbGFzc1tdIGdldEFsbFRlc3RDbGFzc2VzKCkgewotCXJldHVybiBuZXcgQ2xhc3NbXSB7Ci0JCW9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmRvbS5BU1RDb252ZXJ0ZXJUZXN0LmNsYXNzLAkJCi0JCW9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmRvbS5BU1RDb252ZXJ0ZXJUZXN0Mi5jbGFzcywKLQkJb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuZG9tLkFTVFRlc3QuY2xhc3MsCi0JCW9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLmRvbS5BU1RWaXNpdG9yVGVzdC5jbGFzcywKLQkJb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuZG9tLkFTVE1hdGNoZXJUZXN0LmNsYXNzCi0JfTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgdHMgPSBuZXcgVGVzdFN1aXRlKFJ1bkFsbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0KLQlDbGFzc1tdIHRlc3RDbGFzc2VzID0gZ2V0QWxsVGVzdENsYXNzZXMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RDbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCUNsYXNzIHRlc3RDbGFzcyA9IHRlc3RDbGFzc2VzW2ldOwotCi0JCS8vIGNhbGwgdGhlIHN1aXRlKCkgbWV0aG9kIGFuZCBhZGQgdGhlIHJlc3VsdGluZyBzdWl0ZSB0byB0aGUgc3VpdGUKLQkJdHJ5IHsKLQkJCU1ldGhvZCBzdWl0ZU1ldGhvZCA9IHRlc3RDbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgic3VpdGUiLCBuZXcgQ2xhc3NbMF0pOyAvLyROT04tTkxTLTEkCi0JCQlUZXN0IHN1aXRlID0gKFRlc3Qpc3VpdGVNZXRob2QuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbMF0pOwotCQkJdHMuYWRkVGVzdChzdWl0ZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQllLmdldFRhcmdldEV4Y2VwdGlvbigpLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQlyZXR1cm4gdHM7Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZG9tL1J1bkNvbnZlcnRlclRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvZG9tL1J1bkNvbnZlcnRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZDc0MDYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL2RvbS9SdW5Db252ZXJ0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5kb207Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgUnVuQ29udmVydGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci1wdWJsaWMgUnVuQ29udmVydGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXB1YmxpYyBzdGF0aWMgQ2xhc3NbXSBnZXRBbGxUZXN0Q2xhc3NlcygpIHsKLQlyZXR1cm4gbmV3IENsYXNzW10gewotCQlvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5kb20uQVNUQ29udmVydGVyVGVzdC5jbGFzcywJCQotCQlvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5kb20uQVNUQ29udmVydGVyVGVzdDIuY2xhc3MKLQl9OwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSB0cyA9IG5ldyBUZXN0U3VpdGUoUnVuQ29udmVydGVyVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQotCUNsYXNzW10gdGVzdENsYXNzZXMgPSBnZXRBbGxUZXN0Q2xhc3NlcygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdENsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJQ2xhc3MgdGVzdENsYXNzID0gdGVzdENsYXNzZXNbaV07Ci0KLQkJLy8gY2FsbCB0aGUgc3VpdGUoKSBtZXRob2QgYW5kIGFkZCB0aGUgcmVzdWx0aW5nIHN1aXRlIHRvIHRoZSBzdWl0ZQotCQl0cnkgewotCQkJTWV0aG9kIHN1aXRlTWV0aG9kID0gdGVzdENsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJzdWl0ZSIsIG5ldyBDbGFzc1swXSk7IC8vJE5PTi1OTFMtMSQKLQkJCVRlc3Qgc3VpdGUgPSAoVGVzdClzdWl0ZU1ldGhvZC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFswXSk7Ci0JCQl0cy5hZGRUZXN0KHN1aXRlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCWUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCXJldHVybiB0czsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9BYnN0cmFjdEphdmFNb2RlbFRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvQWJzdHJhY3RKYXZhTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjYwYzM2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9BYnN0cmFjdEphdmFNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Db2RlU291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuVXRpbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YU1vZGVsVGVzdHMgZXh0ZW5kcyBTdWl0ZU9mVGVzdENhc2VzIHsKLQkKLQkvKioKLQkgKiBUaGUgamF2YS5pby5GaWxlIHBhdGggdG8gdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZSBleHRlcm5hbCBqYXJzLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIEVYVEVSTkFMX0pBUl9ESVJfUEFUSDsKLQkKLQkvKioKLQkgKiBEZWx0YSBsaXN0ZW5lcgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBEZWx0YUxpc3RlbmVyIGltcGxlbWVudHMgSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIgewotCQkvKioKLQkJICogRGVsdGFzIHJlY2VpdmVkIGZyb20gdGhlIGphdmEgbW9kZWwuIFNlZSAKLQkJICogPGNvZGU+I3N0YXJ0RGVsdGFzPC9jb2RlPiBhbmQKLQkJICogPGNvZGU+I3N0b3BEZWx0YXM8L2NvZGU+LgotCQkgKi8KLQkJcHVibGljIElKYXZhRWxlbWVudERlbHRhW10gZGVsdGFzOwotCQotCQlwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2KSB7Ci0JCQlJSmF2YUVsZW1lbnREZWx0YVtdIGNvcHk9IG5ldyBJSmF2YUVsZW1lbnREZWx0YVtkZWx0YXMubGVuZ3RoICsgMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGRlbHRhcywgMCwgY29weSwgMCwgZGVsdGFzLmxlbmd0aCk7Ci0JCQljb3B5W2RlbHRhcy5sZW5ndGhdPSBldi5nZXREZWx0YSgpOwotCQkJZGVsdGFzPSBjb3B5OwotCQl9Ci0JfQotCXByb3RlY3RlZCBEZWx0YUxpc3RlbmVyIGRlbHRhTGlzdGVuZXIgPSBuZXcgRGVsdGFMaXN0ZW5lcigpOwotCSAKLQkKLXB1YmxpYyBBYnN0cmFjdEphdmFNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBhZGRKYXZhTmF0dXJlKFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUlQcm9qZWN0IHByb2plY3QgPSBnZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3IFN0cmluZ1tdIHtKYXZhQ29yZS5OQVRVUkVfSUR9KTsKLQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLX0KLXByb3RlY3RlZCB2b2lkIGFzc2VydFNvcnRlZEVsZW1lbnRzRXF1YWwoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBleHBlY3RlZCwgSUphdmFFbGVtZW50W10gZWxlbWVudHMpIHsKLQl0aGlzLnNvcnRFbGVtZW50cyhlbGVtZW50cyk7Ci0JYXNzZXJ0RWxlbWVudHNFcXVhbChtZXNzYWdlLCBleHBlY3RlZCwgZWxlbWVudHMpOwotfQotCi0KLXByb3RlY3RlZCB2b2lkIGFzc2VydFJlc291cmNlc0VxdWFsKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZXhwZWN0ZWQsIE9iamVjdFtdIHJlc291cmNlcykgewotCXRoaXMuc29ydFJlc291cmNlcyhyZXNvdXJjZXMpOwotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHJlc291cmNlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKyl7Ci0JCWJ1ZmZlci5hcHBlbmQoKChJUmVzb3VyY2UpcmVzb3VyY2VzW2ldKS5nZXROYW1lKCkpOwotCQlpZiAoaSAhPSBsZW5ndGgtMSlidWZmZXIuYXBwZW5kKCJcbiIpOwotCX0KLQlpZiAoIWV4cGVjdGVkLmVxdWFscyhidWZmZXIudG9TdHJpbmcoKSkpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLnV0aWwuVXRpbC5kaXNwbGF5U3RyaW5nKGJ1ZmZlci50b1N0cmluZygpLCAyKSk7Ci0JfQotCWFzc2VydEVxdWFscygKLQkJbWVzc2FnZSwKLQkJZXhwZWN0ZWQsCi0JCWJ1ZmZlci50b1N0cmluZygpCi0JKTsKLX0KLXByb3RlY3RlZCB2b2lkIGFzc2VydEVsZW1lbnRzRXF1YWwoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBleHBlY3RlZCwgSUphdmFFbGVtZW50W10gZWxlbWVudHMpIHsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCWlmIChlbGVtZW50cyAhPSBudWxsKSB7Ci0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKyl7Ci0JCQlidWZmZXIuYXBwZW5kKGVsZW1lbnRzW2ldLmdldEVsZW1lbnROYW1lKCkpOwotCQkJaWYgKGkgIT0gbGVuZ3RoLTEpIGJ1ZmZlci5hcHBlbmQoIlxuIik7Ci0JCX0KLQl9IGVsc2UgewotCQlidWZmZXIuYXBwZW5kKCI8bnVsbD4iKTsKLQl9Ci0JaWYgKCFleHBlY3RlZC5lcXVhbHMoYnVmZmVyLnRvU3RyaW5nKCkpKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy51dGlsLlV0aWwuZGlzcGxheVN0cmluZyhidWZmZXIudG9TdHJpbmcoKSwgMikpOwotCX0KLQlhc3NlcnRFcXVhbHMoCi0JCW1lc3NhZ2UsCi0JCWV4cGVjdGVkLAotCQlidWZmZXIudG9TdHJpbmcoKQotCSk7Ci19Ci0vKgotICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBhY3R1YWwgc291cmNlICh1c3VhbGx5IGNvbWluZyBmcm9tIGEgZmlsZSBjb250ZW50KSBpcyBlcXVhbCB0byB0aGUgZXhwZWN0ZWQgb25lLgotICogTm90ZSB0aGF0ICdleHBlY3RlZCcgaXMgYXNzdW1lZCB0byBoYXZlIHRoZSAnXG4nIGxpbmUgc2VwYXJhdG9yLiAKLSAqIFRoZSBsaW5lIHNlcGFyYXRvcnMgaW4gJ2FjdHVhbCcgYXJlIGNvbnZlcnRlZCB0byAnXG4nIGJlZm9yZSB0aGUgY29tcGFyaXNvbi4KLSAqLwotcHJvdGVjdGVkIHZvaWQgYXNzZXJ0U291cmNlRXF1YWxzKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBhY3R1YWwpIHsKLQlpZiAoYWN0dWFsID09IG51bGwpIHsKLQkJYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkLCBudWxsKTsKLQkJcmV0dXJuOwotCX0KLQlhc3NlcnRFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLnV0aWwuVXRpbC5jb252ZXJ0VG9JbmRlcGVuZGFudExpbmVEZWxpbWl0ZXIoYWN0dWFsKSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhlIGVsZW1lbnRzIGFyZSBwcmVzZW50IGFmdGVyIGNyZWF0aW9uLgotICovCi1wdWJsaWMgdm9pZCBhc3NlcnRDcmVhdGlvbihJSmF2YUVsZW1lbnRbXSBuZXdFbGVtZW50cykgewotCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3RWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJSUphdmFFbGVtZW50IG5ld0VsZW1lbnQgPSBuZXdFbGVtZW50c1tpXTsKLQkJYXNzZXJ0VHJ1ZSgiRWxlbWVudCBzaG91bGQgYmUgcHJlc2VudCBhZnRlciBjcmVhdGlvbiIsIG5ld0VsZW1lbnQuZXhpc3RzKCkpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGUgZWxlbWVudCBpcyBwcmVzZW50IGFmdGVyIGNyZWF0aW9uLgotICovCi1wdWJsaWMgdm9pZCBhc3NlcnRDcmVhdGlvbihJSmF2YUVsZW1lbnQgbmV3RWxlbWVudCkgewotCWFzc2VydENyZWF0aW9uKG5ldyBJSmF2YUVsZW1lbnRbXSB7bmV3RWxlbWVudH0pOwotfQotLyoqCi0gKiBDcmVhdGVzIGFuIG9wZXJhdGlvbiB0byBkZWxldGUgdGhlIGdpdmVuIGVsZW1lbnRzLCBhc3NlcnRzCi0gKiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwsIGFuZCBlbnN1cmVzIHRoZSBlbGVtZW50cyBhcmUgbm8KLSAqIGxvbmdlciBwcmVzZW50IGluIHRoZSBtb2RlbC4KLSAqLwotcHVibGljIHZvaWQgYXNzZXJ0RGVsZXRpb24oSUphdmFFbGVtZW50W10gZWxlbWVudHNUb0RlbGV0ZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUphdmFFbGVtZW50IGVsZW1lbnRUb0RlbGV0ZSA9IG51bGw7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50c1RvRGVsZXRlLmxlbmd0aDsgaSsrKSB7Ci0JCWVsZW1lbnRUb0RlbGV0ZSA9IGVsZW1lbnRzVG9EZWxldGVbaV07Ci0JCWFzc2VydFRydWUoIkVsZW1lbnQgbXVzdCBiZSBwcmVzZW50IHRvIGJlIGRlbGV0ZWQiLCBlbGVtZW50VG9EZWxldGUuZXhpc3RzKCkpOwotCX0KLQotCWdldEphdmFNb2RlbCgpLmRlbGV0ZShlbGVtZW50c1RvRGVsZXRlLCBmYWxzZSwgbnVsbCk7Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50c1RvRGVsZXRlLmxlbmd0aDsgaSsrKSB7Ci0JCWVsZW1lbnRUb0RlbGV0ZSA9IGVsZW1lbnRzVG9EZWxldGVbaV07Ci0JCWFzc2VydFRydWUoIkVsZW1lbnQgc2hvdWxkIG5vdCBiZSBwcmVzZW50IGFmdGVyIGRlbGV0aW9uOiAiICsgZWxlbWVudFRvRGVsZXRlLCAhZWxlbWVudFRvRGVsZXRlLmV4aXN0cygpKTsKLQl9Ci19Ci1wcm90ZWN0ZWQgdm9pZCBhc3NlcnRUeXBlc0VxdWFsKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZXhwZWN0ZWQsIElUeXBlW10gdHlwZXMpIHsKLQl0aGlzLnNvcnRUeXBlcyh0eXBlcyk7Ci0JU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKXsKLQkJYnVmZmVyLmFwcGVuZCh0eXBlc1tpXS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIlxuIik7Ci0JfQotCWlmICghZXhwZWN0ZWQuZXF1YWxzKGJ1ZmZlci50b1N0cmluZygpKSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4ob3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMudXRpbC5VdGlsLmRpc3BsYXlTdHJpbmcoYnVmZmVyLnRvU3RyaW5nKCksIDIpKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKAotCQltZXNzYWdlLAotCQlleHBlY3RlZCwKLQkJYnVmZmVyLnRvU3RyaW5nKCkKLQkpOwotfQotLyoqCi0gKiBBdHRhY2hlcyBhIHNvdXJjZSB6aXAgdG8gdGhlIGdpdmVuIGphciBwYWNrYWdlIGZyYWdtZW50IHJvb3QuCi0gKi8KLXByb3RlY3RlZCB2b2lkIGF0dGFjaFNvdXJjZShJUGFja2FnZUZyYWdtZW50Um9vdCByb290LCBTdHJpbmcgc291cmNlUGF0aCwgU3RyaW5nIHNvdXJjZVJvb3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IHJvb3QuZ2V0SmF2YVByb2plY3QoKTsKLQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gKElDbGFzc3BhdGhFbnRyeVtdKWphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpLmNsb25lKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKXsKLQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKLQkJaWYgKGVudHJ5LmdldFBhdGgoKS50b09TU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5lcXVhbHMocm9vdC5nZXRQYXRoKCkudG9PU1N0cmluZygpLnRvTG93ZXJDYXNlKCkpKSB7Ci0JCQllbnRyaWVzW2ldID0gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KAotCQkJCXJvb3QuZ2V0UGF0aCgpLAotCQkJCXNvdXJjZVBhdGggPT0gbnVsbCA/IG51bGwgOiBuZXcgUGF0aChzb3VyY2VQYXRoKSwKLQkJCQlzb3VyY2VSb290ID09IG51bGwgPyBudWxsIDogbmV3IFBhdGgoc291cmNlUm9vdCksCi0JCQkJZmFsc2UpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKGVudHJpZXMsIG51bGwpOwotfQotLyoqCi0gKiBDcmVhdGVzIGFuIG9wZXJhdGlvbiB0byBkZWxldGUgdGhlIGdpdmVuIGVsZW1lbnQsIGFzc2VydHMKLSAqIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bGwsIGFuZCBlbnN1cmVzIHRoZSBlbGVtZW50IGlzIG5vCi0gKiBsb25nZXIgcHJlc2VudCBpbiB0aGUgbW9kZWwuCi0gKi8KLXB1YmxpYyB2b2lkIGFzc2VydERlbGV0aW9uKElKYXZhRWxlbWVudCBlbGVtZW50VG9EZWxldGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCWFzc2VydERlbGV0aW9uKG5ldyBJSmF2YUVsZW1lbnRbXSB7ZWxlbWVudFRvRGVsZXRlfSk7Ci19Ci0vKioKLSAqIEVtcHRpZXMgdGhlIGN1cnJlbnQgZGVsdGFzLgotICovCi1wdWJsaWMgdm9pZCBjbGVhckRlbHRhcygpIHsKLQl0aGlzLmRlbHRhTGlzdGVuZXIuZGVsdGFzID0gbmV3IElKYXZhRWxlbWVudERlbHRhWzBdOwotfQotLyoqCi0gKiBDb3B5IGZpbGUgZnJvbSBzcmMgKHBhdGggdG8gdGhlIG9yaWdpbmFsIGZpbGUpIHRvIGRlc3QgKHBhdGggdG8gdGhlIGRlc3RpbmF0aW9uIGZpbGUpLgotICovCi1wdWJsaWMgdm9pZCBjb3B5KEZpbGUgc3JjLCBGaWxlIGRlc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JLy8gcmVhZCBzb3VyY2UgYnl0ZXMKLQlieXRlW10gc3JjQnl0ZXMgPSB0aGlzLnJlYWQoc3JjKTsKLQotCS8vIHdyaXRlIGJ5dGVzIHRvIGRlc3QKLQlGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3QpOwotCW91dC53cml0ZShzcmNCeXRlcyk7Ci0Jb3V0LmNsb3NlKCk7Ci19Ci0KLS8qKgotICogQ29weSB0aGUgZ2l2ZW4gc291cmNlIGRpcmVjdG9yeSAoYW5kIGFsbCBpdHMgY29udGVudHMpIHRvIHRoZSBnaXZlbiB0YXJnZXQgZGlyZWN0b3J5LgotICovCi1wcm90ZWN0ZWQgdm9pZCBjb3B5RGlyZWN0b3J5KEZpbGUgc291cmNlLCBGaWxlIHRhcmdldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpZiAoIXRhcmdldC5leGlzdHMoKSkgewotCQl0YXJnZXQubWtkaXJzKCk7Ci0JfQotCUZpbGVbXSBmaWxlcyA9IHNvdXJjZS5saXN0RmlsZXMoKTsKLQlpZiAoZmlsZXMgPT0gbnVsbCkgcmV0dXJuOwotCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJRmlsZSBzb3VyY2VDaGlsZCA9IGZpbGVzW2ldOwotCQlTdHJpbmcgbmFtZSA9ICBzb3VyY2VDaGlsZC5nZXROYW1lKCk7Ci0JCWlmIChuYW1lLmVxdWFscygiQ1ZTIikpIGNvbnRpbnVlOwotCQlGaWxlIHRhcmdldENoaWxkID0gbmV3IEZpbGUodGFyZ2V0LCBuYW1lKTsKLQkJaWYgKHNvdXJjZUNoaWxkLmlzRGlyZWN0b3J5KCkpIHsKLQkJCWNvcHlEaXJlY3Rvcnkoc291cmNlQ2hpbGQsIHRhcmdldENoaWxkKTsKLQkJfSBlbHNlIHsKLQkJCWNvcHkoc291cmNlQ2hpbGQsIHRhcmdldENoaWxkKTsKLQkJfQotCX0KLX0KLQotLyoKLSAqIENyZWF0ZXMgYSBKYXZhIHByb2plY3Qgd2hlcmUgcHJqPXNyYz1iaW4gYW5kIHdpdGggSkNMX0xJQiBvbiBpdHMgY2xhc3NwYXRoLgotICovCi1wcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGNyZWF0ZUphdmFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXJldHVybiB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KHByb2plY3ROYW1lLCBuZXcgU3RyaW5nW10geyIifSwgbmV3IFN0cmluZ1tdIHsiSkNMX0xJQiJ9LCAiIik7Ci19Ci0vKgotICogQ3JlYXRlcyBhIEphdmEgcHJvamVjdCB3aXRoIHRoZSBnaXZlbiBzb3VyY2UgZm9sZGVycyBhbiBvdXRwdXQgbG9jYXRpb24uIAotICogQWRkIHRob3NlIG9uIHRoZSBwcm9qZWN0J3MgY2xhc3NwYXRoLgotICovCi1wcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGNyZWF0ZUphdmFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nW10gc291cmNlRm9sZGVycywgU3RyaW5nIG91dHB1dCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXJldHVybiAKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgKLQkJCXByb2plY3ROYW1lLCAKLQkJCXNvdXJjZUZvbGRlcnMsIAotCQkJbnVsbC8qbm8gbGliKi8sIAotCQkJbnVsbC8qbm8gcHJvamVjdCovLCAKLQkJCW51bGwvKm5vIGV4cG9ydGVkIHByb2plY3QqLywgCi0JCQlvdXRwdXQsIAotCQkJbnVsbC8qbm8gc291cmNlIG91dHB1dHMqLyk7Ci19Ci0vKgotICogQ3JlYXRlcyBhIEphdmEgcHJvamVjdCB3aXRoIHRoZSBnaXZlbiBzb3VyY2UgZm9sZGVycyBhbiBvdXRwdXQgbG9jYXRpb24uIAotICogQWRkIHRob3NlIG9uIHRoZSBwcm9qZWN0J3MgY2xhc3NwYXRoLgotICovCi1wcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGNyZWF0ZUphdmFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nW10gc291cmNlRm9sZGVycywgU3RyaW5nIG91dHB1dCwgU3RyaW5nW10gc291cmNlT3V0cHV0cykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXJldHVybiAKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgKLQkJCXByb2plY3ROYW1lLCAKLQkJCXNvdXJjZUZvbGRlcnMsIAotCQkJbnVsbC8qbm8gbGliKi8sIAotCQkJbnVsbC8qbm8gcHJvamVjdCovLCAKLQkJCW51bGwvKm5vIGV4cG9ydGVkIHByb2plY3QqLywgCi0JCQlvdXRwdXQsIAotCQkJc291cmNlT3V0cHV0cyk7Ci19Ci1wcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGNyZWF0ZUphdmFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nW10gc291cmNlRm9sZGVycywgU3RyaW5nW10gbGlicmFyaWVzLCBTdHJpbmcgb3V0cHV0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JcmV0dXJuIAotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KAotCQkJcHJvamVjdE5hbWUsIAotCQkJc291cmNlRm9sZGVycywgCi0JCQlsaWJyYXJpZXMsIAotCQkJbnVsbC8qbm8gcHJvamVjdCovLCAKLQkJCW51bGwvKm5vIGV4cG9ydGVkIHByb2plY3QqLywgCi0JCQlvdXRwdXQsIAotCQkJbnVsbC8qbm8gc291cmNlIG91dHB1dHMqLyk7Ci19Ci1wcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGNyZWF0ZUphdmFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nW10gc291cmNlRm9sZGVycywgU3RyaW5nW10gbGlicmFyaWVzLCBTdHJpbmdbXSBwcm9qZWN0cywgU3RyaW5nIHByb2plY3RPdXRwdXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlyZXR1cm4KLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgKLQkJCXByb2plY3ROYW1lLAotCQkJc291cmNlRm9sZGVycywKLQkJCWxpYnJhcmllcywKLQkJCXByb2plY3RzLAotCQkJbnVsbC8qbm8gZXhwb3J0ZWQgcHJvamVjdCovLCAKLQkJCXByb2plY3RPdXRwdXQsCi0JCQludWxsLypubyBzb3VyY2Ugb3V0cHV0cyovCi0JCSk7Ci19Ci1wcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGNyZWF0ZUphdmFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nW10gc291cmNlRm9sZGVycywgU3RyaW5nW10gbGlicmFyaWVzLCBTdHJpbmdbXSBwcm9qZWN0cywgYm9vbGVhbltdIGV4cG9ydGVkUHJvamVjdCwgU3RyaW5nIHByb2plY3RPdXRwdXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlyZXR1cm4KLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgKLQkJCXByb2plY3ROYW1lLAotCQkJc291cmNlRm9sZGVycywKLQkJCWxpYnJhcmllcywKLQkJCXByb2plY3RzLAotCQkJZXhwb3J0ZWRQcm9qZWN0LCAKLQkJCXByb2plY3RPdXRwdXQsCi0JCQludWxsLypubyBzb3VyY2Ugb3V0cHV0cyovCi0JCSk7Ci19Ci1wcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGNyZWF0ZUphdmFQcm9qZWN0KGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZSwgZmluYWwgU3RyaW5nW10gc291cmNlRm9sZGVycywgZmluYWwgU3RyaW5nW10gbGlicmFyaWVzLCBmaW5hbCBTdHJpbmdbXSBwcm9qZWN0cywgZmluYWwgYm9vbGVhbltdIGV4cG9ydGVkUHJvamVjdHMsIGZpbmFsIFN0cmluZyBwcm9qZWN0T3V0cHV0LCBmaW5hbCBTdHJpbmdbXSBzb3VyY2VPdXRwdXRzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JZmluYWwgSUphdmFQcm9qZWN0W10gcmVzdWx0ID0gbmV3IElKYXZhUHJvamVjdFsxXTsKLQlJV29ya3NwYWNlUnVubmFibGUgY3JlYXRlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJLy8gY3JlYXRlIHByb2plY3QKLQkJCWNyZWF0ZVByb2plY3QocHJvamVjdE5hbWUpOwotCQkJCi0JCQkvLyBzZXQgamF2YSBuYXR1cmUKLQkJCWFkZEphdmFOYXR1cmUocHJvamVjdE5hbWUpOwotCQkJCi0JCQkvLyBjcmVhdGUgY2xhc3NwYXRoIGVudHJpZXMgCi0JCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQkJSVBhdGggcHJvamVjdFBhdGggPSBwcm9qZWN0LmdldEZ1bGxQYXRoKCk7Ci0JCQlpbnQgc291cmNlTGVuZ3RoID0gc291cmNlRm9sZGVycyA9PSBudWxsID8gMCA6IHNvdXJjZUZvbGRlcnMubGVuZ3RoOwotCQkJaW50IGxpYkxlbmd0aCA9IGxpYnJhcmllcyA9PSBudWxsID8gMCA6IGxpYnJhcmllcy5sZW5ndGg7Ci0JCQlpbnQgcHJvamVjdExlbmd0aCA9IHByb2plY3RzID09IG51bGwgPyAwIDogcHJvamVjdHMubGVuZ3RoOwotCQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbc291cmNlTGVuZ3RoK2xpYkxlbmd0aCtwcm9qZWN0TGVuZ3RoXTsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBzb3VyY2VMZW5ndGg7IGkrKykgewotCQkJCUlQYXRoIHNvdXJjZVBhdGggPSBuZXcgUGF0aChzb3VyY2VGb2xkZXJzW2ldKTsKLQkJCQlpbnQgc2VnbWVudENvdW50ID0gc291cmNlUGF0aC5zZWdtZW50Q291bnQoKTsKLQkJCQlpZiAoc2VnbWVudENvdW50ID4gMCkgewotCQkJCQkvLyBjcmVhdGUgZm9sZGVyIGFuZCBpdHMgcGFyZW50cwotCQkJCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IHByb2plY3Q7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2VnbWVudENvdW50OyBqKyspIHsKLQkJCQkJCUlGb2xkZXIgZm9sZGVyID0gY29udGFpbmVyLmdldEZvbGRlcihuZXcgUGF0aChzb3VyY2VQYXRoLnNlZ21lbnQoaikpKTsKLQkJCQkJCWlmICghZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJCQkJCX0KLQkJCQkJCWNvbnRhaW5lciA9IGZvbGRlcjsKLQkJCQkJfQotCQkJCX0KLQkJCQlJUGF0aCBvdXRwdXRQYXRoID0gbnVsbDsKLQkJCQlpZiAoc291cmNlT3V0cHV0cyAhPSBudWxsKSB7Ci0JCQkJCS8vIGNyZWF0ZSBvdXQgZm9sZGVyIGZvciBzb3VyY2UgZW50cnkKLQkJCQkJb3V0cHV0UGF0aCA9IHNvdXJjZU91dHB1dHNbaV0gPT0gbnVsbCA/IG51bGwgOiBuZXcgUGF0aChzb3VyY2VPdXRwdXRzW2ldKTsKLQkJCQkJaWYgKG91dHB1dFBhdGggIT0gbnVsbCAmJiBvdXRwdXRQYXRoLnNlZ21lbnRDb3VudCgpID4gMCkgewotCQkJCQkJSUZvbGRlciBvdXRwdXQgPSBwcm9qZWN0LmdldEZvbGRlcihvdXRwdXRQYXRoKTsKLQkJCQkJCWlmICghb3V0cHV0LmV4aXN0cygpKSB7Ci0JCQkJCQkJb3V0cHV0LmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBjcmVhdGUgc291cmNlIGVudHJ5Ci0JCQkJZW50cmllc1tpXSA9IAotCQkJCQlKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeSgKLQkJCQkJCXByb2plY3RQYXRoLmFwcGVuZChzb3VyY2VQYXRoKSwgCi0JCQkJCQluZXcgSVBhdGhbMF0sIAotCQkJCQkJb3V0cHV0UGF0aCA9PSBudWxsID8gbnVsbCA6IHByb2plY3RQYXRoLmFwcGVuZChvdXRwdXRQYXRoKQotCQkJCQkpOwotCQkJfQotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGxpYkxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIGxpYiA9IGxpYnJhcmllc1tpXTsKLQkJCQlpZiAobGliLmVxdWFscygiSkNMX0xJQiIpKSB7Ci0JCQkJCS8vIGVuc3VyZSBKQ0wgdmFyaWFibGVzIGFyZSBzZXQKLQkJCQkJaWYgKEphdmFDb3JlLmdldENsYXNzcGF0aFZhcmlhYmxlKCJKQ0xfTElCIikgPT0gbnVsbCkgewotCQkJCQkJSmF2YUNvcmUuc2V0Q2xhc3NwYXRoVmFyaWFibGVzKAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7IkpDTF9MSUIiLCAiSkNMX1NSQyIsICJKQ0xfU1JDUk9PVCJ9LAotCQkJCQkJCW5ldyBJUGF0aFtdIHtnZXRFeHRlcm5hbEpDTFBhdGgoKSwgZ2V0RXh0ZXJuYWxKQ0xTb3VyY2VQYXRoKCksIGdldEV4dGVybmFsSkNMUm9vdFNvdXJjZVBhdGgoKX0sCi0JCQkJCQkJbnVsbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGxpYi5lcXVhbHMobGliLnRvVXBwZXJDYXNlKCkpKSB7IC8vIGFsbCB1cHBlciBjYXNlIGlzIGEgdmFyIAotCQkJCQljaGFyW11bXSB2YXJzID0gQ2hhck9wZXJhdGlvbi5zcGxpdE9uKCcsJywgbGliLnRvQ2hhckFycmF5KCkpOwotCQkJCQllbnRyaWVzW3NvdXJjZUxlbmd0aCtpXSA9IEphdmFDb3JlLm5ld1ZhcmlhYmxlRW50cnkoCi0JCQkJCQluZXcgUGF0aChuZXcgU3RyaW5nKHZhcnNbMF0pKSwgCi0JCQkJCQl2YXJzLmxlbmd0aCA+IDEgPyBuZXcgUGF0aChuZXcgU3RyaW5nKHZhcnNbMV0pKSA6IG51bGwsIAotCQkJCQkJdmFycy5sZW5ndGggPiAyID8gbmV3IFBhdGgobmV3IFN0cmluZyh2YXJzWzJdKSkgOiBudWxsKTsKLQkJCQl9IGVsc2UgaWYgKGxpYi5zdGFydHNXaXRoKCJvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC4iKSkgeyAvLyBjb250YWluZXIKLQkJCQkJZW50cmllc1tzb3VyY2VMZW5ndGgraV0gPSBKYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeShuZXcgUGF0aChsaWIpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlJUGF0aCBsaWJQYXRoID0gbmV3IFBhdGgobGliKTsKLQkJCQkJaWYgKCFsaWJQYXRoLmlzQWJzb2x1dGUoKSAmJiBsaWJQYXRoLnNlZ21lbnRDb3VudCgpID4gMCAmJiBsaWJQYXRoLmdldEZpbGVFeHRlbnNpb24oKSA9PSBudWxsKSB7Ci0JCQkJCQlwcm9qZWN0LmdldEZvbGRlcihsaWJQYXRoKS5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCQkJCQlsaWJQYXRoID0gcHJvamVjdFBhdGguYXBwZW5kKGxpYlBhdGgpOwotCQkJCQl9Ci0JCQkJCWVudHJpZXNbc291cmNlTGVuZ3RoK2ldID0gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KGxpYlBhdGgsIG51bGwsIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJCWZvciAgKGludCBpPSAwOyBpIDwgcHJvamVjdExlbmd0aDsgaSsrKSB7Ci0JCQkJYm9vbGVhbiBpc0V4cG9ydGVkID0gZXhwb3J0ZWRQcm9qZWN0cyAhPSBudWxsICYmIGV4cG9ydGVkUHJvamVjdHMubGVuZ3RoID4gaSAmJiBleHBvcnRlZFByb2plY3RzW2ldOwotCQkJCWVudHJpZXNbc291cmNlTGVuZ3RoK2xpYkxlbmd0aCtpXSA9IEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShuZXcgUGF0aChwcm9qZWN0c1tpXSksIGlzRXhwb3J0ZWQpOwotCQkJfQotCQkJCi0JCQkvLyBjcmVhdGUgcHJvamVjdCdzIG91dHB1dCBmb2xkZXIKLQkJCUlQYXRoIG91dHB1dFBhdGggPSBuZXcgUGF0aChwcm9qZWN0T3V0cHV0KTsKLQkJCWlmIChvdXRwdXRQYXRoLnNlZ21lbnRDb3VudCgpID4gMCkgewotCQkJCUlGb2xkZXIgb3V0cHV0ID0gcHJvamVjdC5nZXRGb2xkZXIob3V0cHV0UGF0aCk7Ci0JCQkJaWYgKCFvdXRwdXQuZXhpc3RzKCkpIHsKLQkJCQkJb3V0cHV0LmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIHNldCBjbGFzc3BhdGggYW5kIG91dHB1dCBsb2NhdGlvbgotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKGVudHJpZXMsIHByb2plY3RQYXRoLmFwcGVuZChvdXRwdXRQYXRoKSwgbnVsbCk7Ci0JCQlyZXN1bHRbMF0gPSBqYXZhUHJvamVjdDsKLQkJfQotCX07Ci0JZ2V0V29ya3NwYWNlKCkucnVuKGNyZWF0ZSwgbnVsbCk7CQotCXJldHVybiByZXN1bHRbMF07Ci19Ci0vKgotICogQ3JlYXRlIHNpbXBsZSBwcm9qZWN0LgotICovCi1wcm90ZWN0ZWQgSVByb2plY3QgY3JlYXRlUHJvamVjdChmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JSVdvcmtzcGFjZVJ1bm5hYmxlIGNyZWF0ZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCXByb2plY3QuY3JlYXRlKG51bGwpOwotCQkJcHJvamVjdC5vcGVuKG51bGwpOwotCQl9Ci0JfTsKLQlnZXRXb3Jrc3BhY2UoKS5ydW4oY3JlYXRlLCBudWxsKTsJCi0JcmV0dXJuIHByb2plY3Q7Ci19Ci1wdWJsaWMgdm9pZCBkZWxldGVGaWxlKEZpbGUgZmlsZSkgewotCWZpbGUgPSBmaWxlLmdldEFic29sdXRlRmlsZSgpOwotCWlmICghZmlsZS5leGlzdHMoKSkKLQkJcmV0dXJuOwotCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJU3RyaW5nW10gZmlsZXMgPSBmaWxlLmxpc3QoKTsKLQkJLy9maWxlLmxpc3QoKSBjYW4gcmV0dXJuIG51bGwKLQkJaWYgKGZpbGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyArK2kpIHsKLQkJCQlkZWxldGVGaWxlKG5ldyBGaWxlKGZpbGUsIGZpbGVzW2ldKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JYm9vbGVhbiBzdWNjZXNzID0gZmlsZS5kZWxldGUoKTsKLQlpbnQgcmV0cnlDb3VudCA9IDYwOyAvLyB3YWl0IDEgbWludXRlIGF0IG1vc3QKLQl3aGlsZSAoIXN1Y2Nlc3MgJiYgLS1yZXRyeUNvdW50ID49IDApIHsKLQkJdHJ5IHsKLQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQl9Ci0JCXN1Y2Nlc3MgPSBmaWxlLmRlbGV0ZSgpOwotCX0KLQlpZiAoc3VjY2VzcykgcmV0dXJuOwotCVN5c3RlbS5lcnIucHJpbnRsbigiRmFpbGVkIHRvIGRlbGV0ZSAiICsgZmlsZS5nZXRQYXRoKCkpOwotfQotcHJvdGVjdGVkIHZvaWQgZGVsZXRlUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlJUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQlpZiAocHJvamVjdC5leGlzdHMoKSAmJiAhcHJvamVjdC5pc09wZW4oKSkgeyAvLyBmb3JjZSBvcGVuaW5nIHNvIHRoYXQgcHJvamVjdCBjYW4gYmUgZGVsZXRlZCB3aXRob3V0IGxvZ2dpbmcgKHNlZSBidWcgMjM2MjkpCi0JCXByb2plY3Qub3BlbihudWxsKTsKLQl9Ci0JZGVsZXRlUmVzb3VyY2UocHJvamVjdCk7Ci19Ci0KLS8qKgotICogQmF0Y2ggZGVsZXRpb24gb2YgcHJvamVjdHMKLSAqLwotcHJvdGVjdGVkIHZvaWQgZGVsZXRlUHJvamVjdHMoZmluYWwgU3RyaW5nW10gcHJvamVjdE5hbWVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlpZiAocHJvamVjdE5hbWVzICE9IG51bGwpewotCQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSBwcm9qZWN0TmFtZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspewotCQkJCQlpZiAocHJvamVjdE5hbWVzW2ldICE9IG51bGwpCi0JCQkJCQlkZWxldGVQcm9qZWN0KHByb2plY3ROYW1lc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSwKLQludWxsKTsKLX0KLS8qKgotICogRGVsZXRlIHRoaXMgcmVzb3VyY2UuCi0gKi8KLXB1YmxpYyB2b2lkIGRlbGV0ZVJlc291cmNlKElSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUNvcmVFeGNlcHRpb24gbGFzdEV4Y2VwdGlvbiA9IG51bGw7Ci0JdHJ5IHsKLQkJcmVzb3VyY2UuZGVsZXRlKHRydWUsIG51bGwpOwotCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQlsYXN0RXhjZXB0aW9uID0gZTsKLQl9Ci0JaW50IHJldHJ5Q291bnQgPSA2MDsgLy8gd2FpdCAxIG1pbnV0ZSBhdCBtb3N0Ci0Jd2hpbGUgKHJlc291cmNlLmlzQWNjZXNzaWJsZSgpICYmIC0tcmV0cnlDb3VudCA+PSAwKSB7Ci0JCXRyeSB7Ci0JCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJfQotCQl0cnkgewotCQkJcmVzb3VyY2UuZGVsZXRlKHRydWUsIG51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWxhc3RFeGNlcHRpb24gPSBlOwotCQl9Ci0JfQotCWlmICghcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpIHJldHVybjsKLQlTeXN0ZW0uZXJyLnByaW50bG4oIkZhaWxlZCB0byBkZWxldGUgIiArIHJlc291cmNlLmdldEZ1bGxQYXRoKCkpOwotCWlmIChsYXN0RXhjZXB0aW9uICE9IG51bGwpIHsKLQkJdGhyb3cgbGFzdEV4Y2VwdGlvbjsKLQl9Ci19Ci0vKioKLSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGRlbHRhIGlzIGZsYWdnZWQgYXMgaGF2aW5nIGNoYW5nZWQgY2hpbGRyZW4uCi0gKi8KLXByb3RlY3RlZCBib29sZWFuIGRlbHRhQ2hpbGRyZW5DaGFuZ2VkKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JcmV0dXJuIGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5DSEFOR0VEICYmCi0JCShkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9DSElMRFJFTikgIT0gMDsKLX0KLS8qKgotICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZGVsdGEgaXMgZmxhZ2dlZCBhcyBoYXZpbmcgaGFkIGEgY29udGVudCBjaGFuZ2UKLSAqLwotcHJvdGVjdGVkIGJvb2xlYW4gZGVsdGFDb250ZW50Q2hhbmdlZChJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCXJldHVybiBkZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQ0hBTkdFRCAmJgotCQkoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfQ09OVEVOVCkgIT0gMDsKLX0KLS8qKgotICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZGVsdGEgaXMgZmxhZ2dlZCBhcyBoYXZpbmcgbW92ZWQgZnJvbSBhIGxvY2F0aW9uCi0gKi8KLXByb3RlY3RlZCBib29sZWFuIGRlbHRhTW92ZWRGcm9tKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JcmV0dXJuIGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRCAmJgotCQkoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfTU9WRURfRlJPTSkgIT0gMDsKLX0KLS8qKgotICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZGVsdGEgaXMgZmxhZ2dlZCBhcyBoYXZpbmcgbW92ZWQgdG8gYSBsb2NhdGlvbgotICovCi1wcm90ZWN0ZWQgYm9vbGVhbiBkZWx0YU1vdmVkVG8oSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQlyZXR1cm4gZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQgJiYKLQkJKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX01PVkVEX1RPKSAhPSAwOwotfQotLyoqCi0gKiBFbnN1cmUgdGhhdCB0aGUgcG9zaXRpb25lZCBlbGVtZW50IGlzIGluIHRoZSBjb3JyZWN0IHBvc2l0aW9uIHdpdGhpbiB0aGUgcGFyZW50LgotICovCi1wdWJsaWMgdm9pZCBlbnN1cmVDb3JyZWN0UG9zaXRpb25pbmcoSVBhcmVudCBjb250YWluZXIsIElKYXZhRWxlbWVudCBzaWJsaW5nLCBJSmF2YUVsZW1lbnQgcG9zaXRpb25lZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSAoKElQYXJlbnQpIGNvbnRhaW5lcikuZ2V0Q2hpbGRyZW4oKTsKLQlpZiAoc2libGluZyAhPSBudWxsKSB7Ci0JCS8vIGZpbmQgdGhlIHNpYmxpbmcKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY2hpbGRyZW5baV0uZXF1YWxzKHNpYmxpbmcpKSB7Ci0JCQkJYXNzZXJ0VHJ1ZSgiZWxlbWVudCBzaG91bGQgYmUgYmVmb3JlIHNpYmxpbmciLCBpID4gMCAmJiBjaGlsZHJlbltpIC0gMV0uZXF1YWxzKHBvc2l0aW9uZWQpKTsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiRGlkIG5vdCBmaW5kIHNpYmxpbmciLCBmb3VuZCk7Ci0JfQotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgY29tcGlsYXRpb24gdW5pdCBpbiB0aGUgZ2l2ZW4gcHJvamVjdCwgcm9vdCwgYW5kCi0gKiBwYWNrYWdlIGZyYWdtZW50IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGRvZXMgbm90IGV4aXN0LgotICovCi1wdWJsaWMgSUNsYXNzRmlsZSBnZXRDbGFzc0ZpbGUoU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgcm9vdFBhdGgsIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSVBhY2thZ2VGcmFnbWVudCBwa2c9IGdldFBhY2thZ2VGcmFnbWVudChwcm9qZWN0TmFtZSwgcm9vdFBhdGgsIHBhY2thZ2VOYW1lKTsKLQlpZiAocGtnID09IG51bGwpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIHBrZy5nZXRDbGFzc0ZpbGUoY2xhc3NOYW1lKTsKLQl9Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIHNwZWNpZmllZCBjb21waWxhdGlvbiB1bml0IGluIHRoZSBnaXZlbiBwcm9qZWN0LCByb290LCBhbmQKLSAqIHBhY2thZ2UgZnJhZ21lbnQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0gKi8KLXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdChTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyByb290UGF0aCwgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgY3VOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJUGFja2FnZUZyYWdtZW50IHBrZz0gZ2V0UGFja2FnZUZyYWdtZW50KHByb2plY3ROYW1lLCByb290UGF0aCwgcGFja2FnZU5hbWUpOwotCWlmIChwa2cgPT0gbnVsbCkgewotCQlyZXR1cm4gbnVsbDsKLQl9IGVsc2UgewotCQlyZXR1cm4gcGtnLmdldENvbXBpbGF0aW9uVW5pdChjdU5hbWUpOwotCX0KLX0KLXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdEZvcihJSmF2YUVsZW1lbnQgZWxlbWVudCkgewotCi0JaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0JCXJldHVybiAoSUNvbXBpbGF0aW9uVW5pdCllbGVtZW50OwotCX0KLQotCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1lbWJlcikgewotCQlyZXR1cm4gKChJTWVtYmVyKWVsZW1lbnQpLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCX0KLQotCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VEZWNsYXJhdGlvbiB8fAotCQllbGVtZW50IGluc3RhbmNlb2YgSUltcG9ydERlY2xhcmF0aW9uKSB7Ci0JCQlyZXR1cm4gKElDb21waWxhdGlvblVuaXQpZWxlbWVudC5nZXRQYXJlbnQoKTsKLQkJfQotCi0JcmV0dXJuIG51bGw7Ci0KLX0KLS8qKgotICogUmV0dXJucyB0aGUgbGFzdCBkZWx0YSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgZnJvbSB0aGUgY2FjaGVkIGRlbHRhLgotICovCi1wcm90ZWN0ZWQgSUphdmFFbGVtZW50RGVsdGEgZ2V0RGVsdGFGb3IoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKLQlyZXR1cm4gZ2V0RGVsdGFGb3IoZWxlbWVudCwgZmFsc2UpOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBkZWx0YSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgZnJvbSB0aGUgY2FjaGVkIGRlbHRhLgotICogSWYgdGhlIGJvb2xlYW4gaXMgdHJ1ZSByZXR1cm5zIHRoZSBmaXJzdCBkZWx0YSBmb3VuZC4KLSAqLwotcHJvdGVjdGVkIElKYXZhRWxlbWVudERlbHRhIGdldERlbHRhRm9yKElKYXZhRWxlbWVudCBlbGVtZW50LCBib29sZWFuIHJldHVybkZpcnN0KSB7Ci0JSUphdmFFbGVtZW50RGVsdGFbXSBkZWx0YXMgPSB0aGlzLmRlbHRhTGlzdGVuZXIuZGVsdGFzOwotCWlmIChkZWx0YXMgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JSUphdmFFbGVtZW50RGVsdGEgcmVzdWx0ID0gbnVsbDsKLQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgewotCQlJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSA9IHNlYXJjaEZvckRlbHRhKGVsZW1lbnQsIChJSmF2YUVsZW1lbnREZWx0YSkgdGhpcy5kZWx0YUxpc3RlbmVyLmRlbHRhc1tpXSk7Ci0JCWlmIChkZWx0YSAhPSBudWxsKSB7Ci0JCQlpZiAocmV0dXJuRmlyc3QpIHsKLQkJCQlyZXR1cm4gZGVsdGE7Ci0JCQl9IGVsc2UgewotCQkJCXJlc3VsdCA9IGRlbHRhOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIElQYXRoIHRvIHRoZSBleHRlcm5hbCBqYXZhIGNsYXNzIGxpYnJhcnkgKGUuZy4gamNsTWluLmphcikKLSAqLwotcHJvdGVjdGVkIElQYXRoIGdldEV4dGVybmFsSkNMUGF0aCgpIHsKLQlyZXR1cm4gbmV3IFBhdGgoZ2V0RXh0ZXJuYWxKQ0xQYXRoU3RyaW5nKCkpOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBqYXZhLmlvIHBhdGggdG8gdGhlIGV4dGVybmFsIGphdmEgY2xhc3MgbGlicmFyeSAoZS5nLiBqY2xNaW4uamFyKQotICovCi1wcm90ZWN0ZWQgU3RyaW5nIGdldEV4dGVybmFsSkNMUGF0aFN0cmluZygpIHsKLQlyZXR1cm4gRVhURVJOQUxfSkFSX0RJUl9QQVRIICsgRmlsZS5zZXBhcmF0b3IgKyAiamNsTWluLmphciI7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIElQYXRoIHRvIHRoZSByb290IHNvdXJjZSBvZiB0aGUgZXh0ZXJuYWwgamF2YSBjbGFzcyBsaWJyYXJ5IChlLmcuICJzcmMiKQotICovCi1wcm90ZWN0ZWQgSVBhdGggZ2V0RXh0ZXJuYWxKQ0xSb290U291cmNlUGF0aCgpIHsKLQlyZXR1cm4gUGF0aC5FTVBUWTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgSVBhdGggdG8gdGhlIHNvdXJjZSBvZiB0aGUgZXh0ZXJuYWwgamF2YSBjbGFzcyBsaWJyYXJ5IChlLmcuIGpjbE1pbnNyYy56aXApCi0gKi8KLXByb3RlY3RlZCBJUGF0aCBnZXRFeHRlcm5hbEpDTFNvdXJjZVBhdGgoKSB7Ci0JcmV0dXJuIG5ldyBQYXRoKEVYVEVSTkFMX0pBUl9ESVJfUEFUSCArIEZpbGUuc2VwYXJhdG9yICsgImpjbE1pbnNyYy56aXAiKTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgSmF2YSBNb2RlbCB0aGlzIHRlc3Qgc3VpdGUgaXMgcnVubmluZyBvbi4KLSAqLwotcHVibGljIElKYXZhTW9kZWwgZ2V0SmF2YU1vZGVsKCkgewotCXJldHVybiBKYXZhQ29yZS5jcmVhdGUoZ2V0V29ya3NwYWNlUm9vdCgpKTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgSmF2YSBQcm9qZWN0IHdpdGggdGhlIGdpdmVuIG5hbWUgaW4gdGhpcyB0ZXN0Ci0gKiBzdWl0ZSdzIG1vZGVsLiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kLgotICovCi1wdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KFN0cmluZyBuYW1lKSB7Ci0JSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QobmFtZSk7Ci0JcmV0dXJuIEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIHBhY2thZ2UgZnJhZ21lbnQgaW4gdGhlIGdpdmVuIHByb2plY3QgYW5kIHJvb3QsIG9yCi0gKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAqIFRoZSByb290UGF0aCBtdXN0IGJlIHNwZWNpZmllZCBhcyBhIHByb2plY3QgcmVsYXRpdmUgcGF0aC4gVGhlIGVtcHR5Ci0gKiBwYXRoIHJlZmVycyB0byB0aGUgZGVmYXVsdCBwYWNrYWdlIGZyYWdtZW50LgotICovCi1wdWJsaWMgSVBhY2thZ2VGcmFnbWVudCBnZXRQYWNrYWdlRnJhZ21lbnQoU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgcm9vdFBhdGgsIFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdD0gZ2V0UGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0TmFtZSwgcm9vdFBhdGgpOwotCWlmIChyb290ID09IG51bGwpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KHBhY2thZ2VOYW1lKTsKLQl9Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIHNwZWNpZmllZCBwYWNrYWdlIGZyYWdtZW50IHJvb3QgaW4gdGhlIGdpdmVuIHByb2plY3QsIG9yCi0gKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAqIElmIHJlbGF0aXZlLCB0aGUgcm9vdFBhdGggbXVzdCBiZSBzcGVjaWZpZWQgYXMgYSBwcm9qZWN0IHJlbGF0aXZlIHBhdGguIAotICogVGhlIGVtcHR5IHBhdGggcmVmZXJzIHRvIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3QgdGhhdCBpcyB0aGUgcHJvamVjdAotICogZm9sZGVyIGl0ZXNsZi4KLSAqIElmIGFic29sdXRlLCB0aGUgcm9vdFBhdGggcmVmZXJzIHRvIGVpdGhlciBhbiBleHRlcm5hbCBqYXIsIG9yIGEgcmVzb3VyY2UgCi0gKiBpbnRlcm5hbCB0byB0aGUgd29ya3NwYWNlCi0gKi8KLXB1YmxpYyBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRQYWNrYWdlRnJhZ21lbnRSb290KAotCVN0cmluZyBwcm9qZWN0TmFtZSwgCi0JU3RyaW5nIHJvb3RQYXRoKQotCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkKLQlJSmF2YVByb2plY3QgcHJvamVjdCA9IGdldEphdmFQcm9qZWN0KHByb2plY3ROYW1lKTsKLQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlJUGF0aCBwYXRoID0gbmV3IFBhdGgocm9vdFBhdGgpOwotCWlmIChwYXRoLmlzQWJzb2x1dGUoKSkgewotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSVJlc291cmNlIHJlc291cmNlID0gd29ya3NwYWNlUm9vdC5maW5kTWVtYmVyKHBhdGgpOwotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290OwotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJLy8gZXh0ZXJuYWwgamFyCi0JCQlyb290ID0gcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KHJvb3RQYXRoKTsKLQkJfSBlbHNlIHsKLQkJCS8vIHJlc291cmNlIGluIHRoZSB3b3Jrc3BhY2UKLQkJCXJvb3QgPSBwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QocmVzb3VyY2UpOwotCQl9Ci0JCWlmIChyb290LmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gcm9vdDsKLQkJfQotCX0gZWxzZSB7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMgPSBwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0JCWlmIChyb290cyA9PSBudWxsIHx8IHJvb3RzLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gcm9vdHNbaV07Ci0JCQlpZiAoIXJvb3QuaXNFeHRlcm5hbCgpCi0JCQkJJiYgcm9vdC5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkuZXF1YWxzKHBhdGgpKSB7Ci0JCQkJcmV0dXJuIHJvb3Q7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci1wcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdChTdHJpbmcgcHJvamVjdCkgewotCXJldHVybiBnZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0KTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgT1MgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBwbHVnaW4uCi0gKi8KLXByb3RlY3RlZCBTdHJpbmcgZ2V0UGx1Z2luRGlyZWN0b3J5UGF0aCgpIHsKLQlDb2RlU291cmNlIGphdmFDb3JlQ29kZVNvdXJjZSA9IEphdmFDb3JlLmNsYXNzLmdldFByb3RlY3Rpb25Eb21haW4oKS5nZXRDb2RlU291cmNlKCk7Ci0JaWYgKGphdmFDb3JlQ29kZVNvdXJjZSAhPSBudWxsKSB7Ci0JCVVSTCBqYXZhQ29yZVVybCA9IGphdmFDb3JlQ29kZVNvdXJjZS5nZXRMb2NhdGlvbigpOwotCQlTdHJpbmcgamF2YUNvcmVQYXRoID0gamF2YUNvcmVVcmwuZ2V0RmlsZSgpOwotCQlpbnQgaW5kZXggPSBqYXZhQ29yZVBhdGguaW5kZXhPZihKYXZhQ29yZS5QTFVHSU5fSUQpOwotCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCVN0cmluZyBwbHVnaW5zUGF0aCA9IGphdmFDb3JlUGF0aC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJRmlsZSBwbHVnaW5zRmlsZSA9IG5ldyBGaWxlKHBsdWdpbnNQYXRoKTsKLQkJCVN0cmluZ1tdIGxpc3QgPSBwbHVnaW5zRmlsZS5saXN0KG5ldyBGaWxlbmFtZUZpbHRlcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7Ci0JCQkJCXJldHVybiBuYW1lLnN0YXJ0c1dpdGgoICJvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbCIpOwotCQkJCX0KLQkJCX0pOwotCQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0Lmxlbmd0aCA+IDApIHsKLQkJCQlyZXR1cm4gcGx1Z2luc1BhdGggKyBsaXN0WzBdOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBudWxsOwotfQotcHVibGljIFN0cmluZyBnZXRTb3VyY2VXb3Jrc3BhY2VQYXRoKCkgewotCXJldHVybiBnZXRQbHVnaW5EaXJlY3RvcnlQYXRoKCkgKyAgamF2YS5pby5GaWxlLnNlcGFyYXRvciArICJ3b3Jrc3BhY2UiOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBJV29ya3NwYWNlIHRoaXMgdGVzdCBzdWl0ZSBpcyBydW5uaW5nIG9uLgotICovCi1wdWJsaWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLX0KLXB1YmxpYyBJV29ya3NwYWNlUm9vdCBnZXRXb3Jrc3BhY2VSb290KCkgewotCXJldHVybiBnZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci19Ci0KLXB1YmxpYyBieXRlW10gcmVhZChqYXZhLmlvLkZpbGUgZmlsZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCWludCBmaWxlTGVuZ3RoOwotCWJ5dGVbXSBmaWxlQnl0ZXMgPSBuZXcgYnl0ZVtmaWxlTGVuZ3RoID0gKGludCkgZmlsZS5sZW5ndGgoKV07Ci0JamF2YS5pby5GaWxlSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotCWludCBieXRlc1JlYWQgPSAwOwotCWludCBsYXN0UmVhZFNpemUgPSAwOwotCXdoaWxlICgobGFzdFJlYWRTaXplICE9IC0xKSAmJiAoYnl0ZXNSZWFkICE9IGZpbGVMZW5ndGgpKSB7Ci0JCWxhc3RSZWFkU2l6ZSA9IHN0cmVhbS5yZWFkKGZpbGVCeXRlcywgYnl0ZXNSZWFkLCBmaWxlTGVuZ3RoIC0gYnl0ZXNSZWFkKTsKLQkJYnl0ZXNSZWFkICs9IGxhc3RSZWFkU2l6ZTsKLQl9Ci0Jc3RyZWFtLmNsb3NlKCk7Ci0JcmV0dXJuIGZpbGVCeXRlczsKLX0KLXByb3RlY3RlZCB2b2lkIHJlbW92ZUphdmFOYXR1cmUoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSVByb2plY3QgcHJvamVjdCA9IHRoaXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3IFN0cmluZ1tdIHt9KTsKLQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLX0KLS8qKgotICogUmV0dXJucyBhIGRlbHRhIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCBpbiB0aGUgZGVsdGEgdHJlZQotICovCi1wcm90ZWN0ZWQgSUphdmFFbGVtZW50RGVsdGEgc2VhcmNoRm9yRGVsdGEoSUphdmFFbGVtZW50IGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0KLQlpZiAoZGVsdGEgPT0gbnVsbCkgewotCQlyZXR1cm4gbnVsbDsKLQl9IGVsc2UgewotCQlpZiAoZGVsdGEuZ2V0RWxlbWVudCgpLmVxdWFscyhlbGVtZW50KSkgewotCQkJcmV0dXJuIGRlbHRhOwotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKS5sZW5ndGg7IGkrKykgewotCQkJCUlKYXZhRWxlbWVudERlbHRhIGNoaWxkPSBzZWFyY2hGb3JEZWx0YShlbGVtZW50LCBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKClbaV0pOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBjaGlsZDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLX0KLS8qKgotICogU2V0cyB0aGUgY2xhc3MgcGF0aCBvZiB0aGUgSmF2YSBwcm9qZWN0LgotICovCi1wdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGgoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGgpIHsKLQl0cnkgewotCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgoY2xhc3NwYXRoLCBudWxsKTsKLQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQlhc3NlcnRUcnVlKCJmYWlsZWQgdG8gc2V0IGNsYXNzcGF0aCIsIGZhbHNlKTsKLQl9Ci19Ci0vKioKLSAqIENoZWNrIGxvY2FsbHkgZm9yIHRoZSByZXF1aXJlZCBKQ0wgZmlsZXMsIGpjbE1pbi5qYXIgYW5kIGpjbE1pbnNyYy56aXAuCi0gKiBJZiBub3QgYXZhaWxhYmxlLCBjb3B5IGZyb20gdGhlIHByb2plY3QgcmVzb3VyY2VzLgotICovCi1wdWJsaWMgdm9pZCBzZXR1cEV4dGVybmFsSkNMKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpZiAoRVhURVJOQUxfSkFSX0RJUl9QQVRIICE9IG51bGwpIHJldHVybjsKLQkKLQlTdHJpbmcgc2VwYXJhdG9yID0gamF2YS5pby5GaWxlLnNlcGFyYXRvcjsKLQlTdHJpbmcgcmVzb3VyY2VKQ0xEaXIgPSBnZXRQbHVnaW5EaXJlY3RvcnlQYXRoKCkgKyBzZXBhcmF0b3IgKyAiSkNMIjsKLQlTdHJpbmcgbG9jYWxKQ0xQYXRoID0gZ2V0V29ya3NwYWNlUm9vdCgpLmdldExvY2F0aW9uKCkudG9GaWxlKCkuZ2V0UGFyZW50RmlsZSgpLmdldENhbm9uaWNhbFBhdGgoKTsKLQlFWFRFUk5BTF9KQVJfRElSX1BBVEggPSBsb2NhbEpDTFBhdGg7Ci0JamF2YS5pby5GaWxlIGpjbERpciA9IG5ldyBqYXZhLmlvLkZpbGUobG9jYWxKQ0xQYXRoKTsKLQlqYXZhLmlvLkZpbGUgamNsTWluID0KLQkJbmV3IGphdmEuaW8uRmlsZShsb2NhbEpDTFBhdGggKyBzZXBhcmF0b3IgKyAiamNsTWluLmphciIpOwotCWphdmEuaW8uRmlsZSBqY2xNaW5zcmMgPSBuZXcgamF2YS5pby5GaWxlKGxvY2FsSkNMUGF0aCArIHNlcGFyYXRvciArICJqY2xNaW5zcmMuemlwIik7Ci0JaWYgKCFqY2xEaXIuZXhpc3RzKCkpIHsKLQkJaWYgKCFqY2xEaXIubWtkaXIoKSkgewotCQkJLy9ta2RpciBmYWlsZWQKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSB0aGUgZGlyZWN0b3J5ICIgKyBqY2xEaXIpOwotCQl9IGVsc2UgewotCQkJLy9jb3B5IHRoZSB0d28gZmlsZXMgdG8gdGhlIEpDTCBkaXJlY3RvcnkKLQkJCWphdmEuaW8uRmlsZSByZXNvdXJjZUpDTE1pbiA9Ci0JCQkJbmV3IGphdmEuaW8uRmlsZShyZXNvdXJjZUpDTERpciArIHNlcGFyYXRvciArICJqY2xNaW4uamFyIik7Ci0JCQljb3B5KHJlc291cmNlSkNMTWluLCBqY2xNaW4pOwotCQkJamF2YS5pby5GaWxlIHJlc291cmNlSkNMTWluc3JjID0KLQkJCQluZXcgamF2YS5pby5GaWxlKHJlc291cmNlSkNMRGlyICsgc2VwYXJhdG9yICsgImpjbE1pbnNyYy56aXAiKTsKLQkJCWNvcHkocmVzb3VyY2VKQ0xNaW5zcmMsIGpjbE1pbnNyYyk7Ci0JCX0KLQl9IGVsc2UgewotCQkvL2NoZWNrIHRoYXQgdGhlIHR3byBmaWxlcywgamNsTWluLmphciBhbmQgamNsTWluc3JjLnppcCBhcmUgcHJlc2VudAotCQkvL2NvcHkgZWl0aGVyIGZpbGUgdGhhdCBpcyBtaXNzaW5nCi0JCWlmICghamNsTWluLmV4aXN0cygpKSB7Ci0JCQlqYXZhLmlvLkZpbGUgcmVzb3VyY2VKQ0xNaW4gPQotCQkJCW5ldyBqYXZhLmlvLkZpbGUocmVzb3VyY2VKQ0xEaXIgKyBzZXBhcmF0b3IgKyAiamNsTWluLmphciIpOwotCQkJY29weShyZXNvdXJjZUpDTE1pbiwgamNsTWluKTsKLQkJfQotCQlpZiAoIWpjbE1pbnNyYy5leGlzdHMoKSkgewotCQkJamF2YS5pby5GaWxlIHJlc291cmNlSkNMTWluc3JjID0KLQkJCQluZXcgamF2YS5pby5GaWxlKHJlc291cmNlSkNMRGlyICsgc2VwYXJhdG9yICsgImpjbE1pbnNyYy56aXAiKTsKLQkJCWNvcHkocmVzb3VyY2VKQ0xNaW5zcmMsIGpjbE1pbnNyYyk7Ci0JCX0KLQl9Ci19Ci1wcm90ZWN0ZWQgSUphdmFQcm9qZWN0IHNldFVwSmF2YVByb2plY3QoZmluYWwgU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCS8vIGNvcHkgZmlsZXMgaW4gcHJvamVjdCBmcm9tIHNvdXJjZSB3b3Jrc3BhY2UgdG8gdGFyZ2V0IHdvcmtzcGFjZQotCVN0cmluZyBzb3VyY2VXb3Jrc3BhY2VQYXRoID0gZ2V0U291cmNlV29ya3NwYWNlUGF0aCgpOwotCVN0cmluZyB0YXJnZXRXb3Jrc3BhY2VQYXRoID0gZ2V0V29ya3NwYWNlUm9vdCgpLmdldExvY2F0aW9uKCkudG9GaWxlKCkuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCWNvcHlEaXJlY3RvcnkobmV3IEZpbGUoc291cmNlV29ya3NwYWNlUGF0aCwgcHJvamVjdE5hbWUpLCBuZXcgRmlsZSh0YXJnZXRXb3Jrc3BhY2VQYXRoLCBwcm9qZWN0TmFtZSkpOwotCQotCS8vIGVuc3VyZSB2YXJpYWJsZXMgYXJlIHNldAotCWlmIChKYXZhQ29yZS5nZXRDbGFzc3BhdGhWYXJpYWJsZSgiSkNMX0xJQiIpID09IG51bGwpIHsKLQkJSmF2YUNvcmUuc2V0Q2xhc3NwYXRoVmFyaWFibGVzKAotCQkJbmV3IFN0cmluZ1tdIHsiSkNMX0xJQiIsICJKQ0xfU1JDIiwgIkpDTF9TUkNST09UIn0sCi0JCQluZXcgSVBhdGhbXSB7Z2V0RXh0ZXJuYWxKQ0xQYXRoKCksIGdldEV4dGVybmFsSkNMU291cmNlUGF0aCgpLCBnZXRFeHRlcm5hbEpDTFJvb3RTb3VyY2VQYXRoKCl9LAotCQkJbnVsbCk7Ci0JfQotCi0JLy8gY3JlYXRlIHByb2plY3QKLQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCUlXb3Jrc3BhY2VSdW5uYWJsZSBwb3B1bGF0ZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCXByb2plY3QuY3JlYXRlKG51bGwpOwotCQkJcHJvamVjdC5vcGVuKG51bGwpOwotCQl9Ci0JfTsKLQlnZXRXb3Jrc3BhY2UoKS5ydW4ocG9wdWxhdGUsIG51bGwpOwotCXJldHVybiBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRVcFN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0Jc3VwZXIuc2V0VXBTdWl0ZSgpOwotCXNldHVwRXh0ZXJuYWxKQ0woKTsKLQkKLQkvLyBlbnN1cmUgYXV0b2J1aWxkaW5nIGlzIHR1cm5lZCBvZmYKLQlJV29ya3NwYWNlRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBnZXRXb3Jrc3BhY2UoKS5nZXREZXNjcmlwdGlvbigpOwotCWlmIChkZXNjcmlwdGlvbi5pc0F1dG9CdWlsZGluZygpKSB7Ci0JCWRlc2NyaXB0aW9uLnNldEF1dG9CdWlsZGluZyhmYWxzZSk7Ci0JCWdldFdvcmtzcGFjZSgpLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQl9Ci19Ci1wcm90ZWN0ZWQgdm9pZCBzb3J0RWxlbWVudHMoSUphdmFFbGVtZW50W10gZWxlbWVudHMpIHsKLQlVdGlsLkNvbXBhcmVyIGNvbXBhcmVyID0gbmV3IFV0aWwuQ29tcGFyZXIoKSB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkJCUlKYXZhRWxlbWVudCBlbGVtZW50QSA9IChJSmF2YUVsZW1lbnQpYTsKLQkJCUlKYXZhRWxlbWVudCBlbGVtZW50QiA9IChJSmF2YUVsZW1lbnQpYjsKLQkJCXJldHVybiBlbGVtZW50QS5nZXRFbGVtZW50TmFtZSgpLmNvbXBhcmVUbyhlbGVtZW50Qi5nZXRFbGVtZW50TmFtZSgpKTsKLQkJfQotCX07Ci0JVXRpbC5zb3J0KGVsZW1lbnRzLCBjb21wYXJlcik7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBzb3J0UmVzb3VyY2VzKE9iamVjdFtdIHJlc291cmNlcykgewotCVV0aWwuQ29tcGFyZXIgY29tcGFyZXIgPSBuZXcgVXRpbC5Db21wYXJlcigpIHsKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotCQkJSVJlc291cmNlIHJlc291cmNlQSA9IChJUmVzb3VyY2UpYTsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZUIgPSAoSVJlc291cmNlKWI7Ci0JCQlyZXR1cm4gcmVzb3VyY2VBLmdldE5hbWUoKS5jb21wYXJlVG8ocmVzb3VyY2VCLmdldE5hbWUoKSk7Ci0JCX0KLQl9OwotCVV0aWwuc29ydChyZXNvdXJjZXMsIGNvbXBhcmVyKTsKLX0KLXByb3RlY3RlZCB2b2lkIHNvcnRUeXBlcyhJVHlwZVtdIHR5cGVzKSB7Ci0JVXRpbC5Db21wYXJlciBjb21wYXJlciA9IG5ldyBVdGlsLkNvbXBhcmVyKCkgewotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCQlJVHlwZSB0eXBlQSA9IChJVHlwZSlhOwotCQkJSVR5cGUgdHlwZUIgPSAoSVR5cGUpYjsKLQkJCXJldHVybiB0eXBlQS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5jb21wYXJlVG8odHlwZUIuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JfTsKLQlVdGlsLnNvcnQodHlwZXMsIGNvbXBhcmVyKTsKLX0KLS8qKgotICogU3RhcnRzIGxpc3RlbmluZyB0byBlbGVtZW50IGRlbHRhcywgYW5kIHF1ZXVlcyB0aGVtIGluIGZnRGVsdGFzLgotICovCi1wdWJsaWMgdm9pZCBzdGFydERlbHRhcygpIHsKLQljbGVhckRlbHRhcygpOwotCUphdmFDb3JlLmFkZEVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIodGhpcy5kZWx0YUxpc3RlbmVyKTsKLX0KLS8qKgotICogU3RvcHMgbGlzdGVuaW5nIHRvIGVsZW1lbnQgZGVsdGFzLCBhbmQgY2xlYXJzIHRoZSBjdXJyZW50IGRlbHRhcy4KLSAqLwotcHVibGljIHZvaWQgc3RvcERlbHRhcygpIHsKLQlKYXZhQ29yZS5yZW1vdmVFbGVtZW50Q2hhbmdlZExpc3RlbmVyKHRoaXMuZGVsdGFMaXN0ZW5lcik7Ci0JY2xlYXJEZWx0YXMoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0FsbEphdmFNb2RlbFRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvQWxsSmF2YU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJkYzdiOC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvQWxsSmF2YU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogUnVuIGFsbCBqYXZhIG1vZGVsIHRlc3RzLgotICovCi1wdWJsaWMgY2xhc3MgQWxsSmF2YU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci1wdWJsaWMgQWxsSmF2YU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEFsbEphdmFNb2RlbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JLy8gRW50ZXIgZWFjaCB0ZXN0IGhlcmUsIGdyb3VwaW5nIHRoZSB0ZXN0cyB0aGF0IGFyZSByZWxhdGVkCi0KLQkvLyBjcmVhdGlvbiBvZiBtZXRob2QKLQlzdWl0ZS5hZGRUZXN0KENyZWF0ZU1lbWJlcnNUZXN0cy5zdWl0ZSgpKTsKLQkKLQkvLyBKYXZhIE5hbWluZyBjb252ZW50aW9uIHRlc3RzCi0Jc3VpdGUuYWRkVGVzdChKYXZhQ29udmVudGlvblRlc3RzLnN1aXRlKCkpOwotCi0JLy8gUHJvamVjdCAmIFJvb3QgQVBJIHVuaXQgdGVzdHMKLQlzdWl0ZS5hZGRUZXN0KEphdmFQcm9qZWN0VGVzdHMuc3VpdGUoKSk7Ci0KLQkvLyBDb21waWxhdGlvbiB1bml0IHRlc3RzCi0Jc3VpdGUuYWRkVGVzdChDb21waWxhdGlvblVuaXRUZXN0cy5zdWl0ZSgpKTsKLQotCS8vIFNvdXJjZSBhdHRhY2htZW50IHRlc3RzCi0Jc3VpdGUuYWRkVGVzdChBdHRhY2hTb3VyY2VUZXN0cy5zdWl0ZSgpKTsKLQkKLQkvL0NyZWF0ZSB0eXBlIHNvdXJjZSB0ZXN0cwotCXN1aXRlLmFkZFRlc3QoQ3JlYXRlVHlwZVNvdXJjZUV4YW1wbGVzVGVzdHMuc3VpdGUoKSk7Ci0KLQkvL0NyZWF0ZSBtZXRob2Qgc291cmNlIHRlc3RzCi0Jc3VpdGUuYWRkVGVzdChDcmVhdGVNZXRob2RTb3VyY2VFeGFtcGxlc1Rlc3RzLnN1aXRlKCkpOwotCQkKLQkvLyBKYXZhIHNlYXJjaCB0ZXN0cwotCXN1aXRlLmFkZFRlc3QoSmF2YVNlYXJjaFRlc3RzLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoSmF2YVNlYXJjaE11bHRpcGxlUHJvamVjdHNUZXN0cy5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFdvcmtpbmdDb3B5U2VhcmNoVGVzdHMuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChTZWFyY2hUZXN0cy5zdWl0ZSgpKTsKLQkJCi0JLy8gV29ya2luZyBjb3B5IHRlc3RzCi0Jc3VpdGUuYWRkVGVzdChXb3JraW5nQ29weVRlc3RzLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoV29ya2luZ0NvcHlOb3RJbkNsYXNzcGF0aFRlc3RzLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoSGllcmFyY2h5T25Xb3JraW5nQ29waWVzVGVzdHMuc3VpdGUoKSk7Ci0JCi0JLy8gdGVzdCBJSmF2YU1vZGVsCi0Jc3VpdGUuYWRkVGVzdChKYXZhTW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQotCS8vIHRlc3RzIHRvIGNoZWNrIHRoZSBlbmNvZGluZwotCXN1aXRlLmFkZFRlc3QoRW5jb2RpbmdUZXN0cy5zdWl0ZSgpKTsKLQkKLQkvLyB0ZXN0IGNsYXNzIG5hbWUgd2l0aCBzcGVjaWFsIG5hbWVzIGxpa2UgbmFtZXMgY29udGFpbmluZyAnJCcKLQlzdWl0ZS5hZGRUZXN0KENsYXNzTmFtZVRlc3RzLnN1aXRlKCkpOwotCQotCS8vIElCdWZmZXIgdGVzdHMKLQlzdWl0ZS5hZGRUZXN0KEJ1ZmZlclRlc3RzLnN1aXRlKCkpOwotCi0JLy8gTmFtZSBsb29rdXAgdGVzdHMKLQlzdWl0ZS5hZGRUZXN0KE5hbWVMb29rdXBUZXN0czIuc3VpdGUoKSk7Ci0KLQkvLyBDbGFzc3BhdGggYW5kIG91dHB1dCBsb2NhdGlvbiB0ZXN0cwotCXN1aXRlLmFkZFRlc3QoQ2xhc3NwYXRoVGVzdHMuc3VpdGUoKSk7Ci0KLQkvLyBEZWx0YSB0ZXN0cwotCXN1aXRlLmFkZFRlc3QoSmF2YUVsZW1lbnREZWx0YVRlc3RzLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoRXh0ZXJuYWxKYXJEZWx0YVRlc3RzLnN1aXRlKCkpOwotCi0JLy8gSmF2YSBlbGVtZW50IGV4aXN0ZW5jZSB0ZXN0cwotCXN1aXRlLmFkZFRlc3QoRXhpc3RlbmNlVGVzdHMuc3VpdGUoKSk7Ci0JCi0JLy8gU3VwcG9ydCBmb3IgIm9wZW4gb24iIGZlYXR1cmUgdGVzdHMKLQlzdWl0ZS5hZGRUZXN0KFJlc29sdmVUZXN0cy5zdWl0ZSgpKTsKLQkKLQkvLyBTdXBwb3J0IGZvciBjb21wbGV0aW9uIHRlc3RzCi0Jc3VpdGUuYWRkVGVzdChDb21wbGV0aW9uVGVzdHMuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChDb21wbGV0aW9uVGVzdHMyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoU25pcHBldENvbXBsZXRpb25UZXN0cy5zdWl0ZSgpKTsKLQkKLQkvLyBQcmVmaXggYW5kIHN1ZmZpeCB0ZXN0cwotCXN1aXRlLmFkZFRlc3QoTmFtaW5nQ29udmVudGlvblRlc3RzLnN1aXRlKCkpOwotCQotCS8vIENvZGUgY29ycmVjdGlvbiB0ZXN0cwotCXN1aXRlLmFkZFRlc3QoQ29kZUNvcnJlY3Rpb25UZXN0cy5zdWl0ZSgpKTsKLQkKLQkvLyBPcHRpb25zIHRlc3RzCi0Jc3VpdGUuYWRkVGVzdChPcHRpb25UZXN0cy5zdWl0ZSgpKTsKLQkKLQkvLyBUeXBlIGhpZXJhcmNoeSB0ZXN0cwotCXN1aXRlLmFkZFRlc3QoVHlwZUhpZXJhcmNoeVRlc3RzLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvblRlc3RzLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVHlwZUhpZXJhcmNoeVNlcmlhbGl6YXRpb25UZXN0cy5zdWl0ZSgpKTsKLQkKLQkvLyBSZXNvbHZlIHR5cGUgdGVzdHMKLQlzdWl0ZS5hZGRUZXN0KFR5cGVSZXNvbHZlVGVzdHMuc3VpdGUoKSk7Ci0KLQkvLyBSZWNvbmNpbGVyIHRlc3RzCi0Jc3VpdGUuYWRkVGVzdChSZWNvbmNpbGVyVGVzdHMuc3VpdGUoKSk7Ci0KLQkvLyBDb3B5IGFuZCBtb3ZlIG9wZXJhdGlvbiB0ZXN0cwotCXN1aXRlLmFkZFRlc3QoQ29weU1vdmVFbGVtZW50c1Rlc3RzLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoQ29weU1vdmVSZXNvdXJjZXNUZXN0cy5zdWl0ZSgpKTsKLQotCS8vIFJlbmFtZSB0ZXN0cwotCXN1aXRlLmFkZFRlc3QoUmVuYW1lVGVzdHMuc3VpdGUoKSk7Ci0JCi0JLy8gRXhjbHVzaW9uIHBhdHRlcm5zIHRlc3RzCi0Jc3VpdGUuYWRkVGVzdChFeGNsdXNpb25QYXR0ZXJuc1Rlc3RzLnN1aXRlKCkpOwotCQotCS8vIFNpZ25hdHVyZSB0ZXN0cwotCXN1aXRlLmFkZFRlc3QoU2lnbmF0dXJlVGVzdHMuc3VpdGUoKSk7Ci0JCi0JLy8gVmFyaWFibGUgaW5pdGlhbGl6ZXJzIGFuZCBjb250YWluZXIgaW5pdGlhbGl6ZXJzIHRlc3RzCi0Jc3VpdGUuYWRkVGVzdChDbGFzc3BhdGhJbml0aWFsaXplclRlc3RzLnN1aXRlKCkpOwotCi0JLy8gSmF2YSBNb2RlbCBGYWN0b3J5IHRlc3RzCi0Jc3VpdGUuYWRkVGVzdChGYWN0b3J5VGVzdHMuc3VpdGUoKSk7Ci0JCQkKLQkvLyBKYXZhIEVsZW1lbnQgcGVyc2lzdGVuY2UgdGVzdHMKLQlzdWl0ZS5hZGRUZXN0KE1lbWVudG9UZXN0cy5zdWl0ZSgpKTsKLQkKLQkvLyBKYXZhIEVsZW1lbnQgc29ydGluZyB0ZXN0cwotCXN1aXRlLmFkZFRlc3QoU29ydENvbXBpbGF0aW9uVW5pdEVsZW1lbnRzVGVzdHMuc3VpdGUoKSk7Ci0KLQkvLyBQYWNrYWdlIGZyYWdtZW50IHJvb3QgbWFuaXB1bGF0aW9uIHRlc3RzCi0Jc3VpdGUuYWRkVGVzdChSb290TWFuaXB1bGF0aW9uc1Rlc3RzLnN1aXRlKCkpOwotCi0JcmV0dXJuIHN1aXRlOwotfQotCi19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvQXR0YWNoU291cmNlVGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9BdHRhY2hTb3VyY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjJhNWI0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9BdHRhY2hTb3VyY2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5jbGFzc2ZtdC5DbGFzc0ZpbGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmFyUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5VdGlsOwotCi0vKioKLSAqIFRPIERPOgotICogLSBzb3VyY2UgYXR0YWNobWVudCBvbiBleHRlcm5hbCBqYXIuCi0gKiAtIGRvbid0IHVzZSBhc3NlcnRUcnVlIHdoZXJlIGFzc2VydEVxdWFscyBzaG91bGQgYmUgdXNlZAotICogLSBkb24ndCBoYXJkY29kZSBwb3NpdGlvbnMKLSovCi1wdWJsaWMgY2xhc3MgQXR0YWNoU291cmNlVGVzdHMgZXh0ZW5kcyBNb2RpZnlpbmdSZXNvdXJjZVRlc3RzIHsKLQotCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudFJvb3QgcGtnRnJhZ21lbnRSb290OwotCQotcHVibGljIEF0dGFjaFNvdXJjZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JcmV0dXJuIG5ldyBTdWl0ZShBdHRhY2hTb3VyY2VUZXN0cy5jbGFzcyk7Ci19Ci1wdWJsaWMgQVNUTm9kZSBydW5Db252ZXJzaW9uKElDbGFzc0ZpbGUgY2xhc3NGaWxlLCBib29sZWFuIHJlc29sdmVCaW5kaW5ncykgewotCXJldHVybiBBU1QucGFyc2VDb21waWxhdGlvblVuaXQoY2xhc3NGaWxlLCByZXNvbHZlQmluZGluZ3MpOwotfQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQlzdXBlci5zZXRVcCgpOwotCXRoaXMuYXR0YWNoU291cmNlKHRoaXMucGtnRnJhZ21lbnRSb290LCAiL0F0dGFjaFNvdXJjZVRlc3RzL2F0dGFjaHNyYy56aXAiLCAiIik7Ci19Ci0vKioKLSAqIENyZWF0ZSBwcm9qZWN0IGFuZCBzZXQgdGhlIGphciBwbGFjZWhvbGRlci4KLSAqLwotcHVibGljIHZvaWQgc2V0VXBTdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCXN1cGVyLnNldFVwU3VpdGUoKTsKLQkKLQlJSmF2YVByb2plY3QgcHJvamVjdCA9IHNldFVwSmF2YVByb2plY3QoIkF0dGFjaFNvdXJjZVRlc3RzIik7Ci0JdGhpcy5wa2dGcmFnbWVudFJvb3QgPSBwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QodGhpcy5nZXRGaWxlKCIvQXR0YWNoU291cmNlVGVzdHMvYXR0YWNoLmphciIpKTsKLX0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JSUphdmFQcm9qZWN0IHByb2plY3QgPSB0aGlzLmdldEphdmFQcm9qZWN0KCIvQXR0YWNoU291cmNlVGVzdHMiKTsKLQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzID0gcHJvamVjdC5nZXRBbGxQYWNrYWdlRnJhZ21lbnRSb290cygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcm9vdHMubGVuZ3RoOyBpKyspIHsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHJvb3RzW2ldOwotCQlpZiAocm9vdC5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19CSU5BUlkpIHsKLQkJCXRoaXMuYXR0YWNoU291cmNlKHJvb3QsIG51bGwsIG51bGwpOyAvLyBkZXRhY2ggc291cmNlCi0JCX0KLQl9Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotLyoqCi0gKiBSZXNldCB0aGUgamFyIHBsYWNlaG9sZGVyIGFuZCBkZWxldGUgcHJvamVjdC4KLSAqLwotcHVibGljIHZvaWQgdGVhckRvd25TdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCXRoaXMuZGVsZXRlUHJvamVjdCgiQXR0YWNoU291cmNlVGVzdHMiKTsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi0vKioKLSAqIFRlc3QgQVNULnBhcnNlQ29tcGlsYXRpb25Vbml0KElDbGFzc0ZpbGUsIGJvb2xlYW4pLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0QVNUUGFyc2luZygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCXRoaXMuYXR0YWNoU291cmNlKHRoaXMucGtnRnJhZ21lbnRSb290LCAiL0F0dGFjaFNvdXJjZVRlc3RzL2F0dGFjaHNyYy56aXAiLCAiIik7CQotCUlDbGFzc0ZpbGUgY2xhc3NGaWxlID0gdGhpcy5wa2dGcmFnbWVudFJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KCJ4LnkiKS5nZXRDbGFzc0ZpbGUoIkEuY2xhc3MiKTsKLQlBU1ROb2RlIG5vZGUgPSBydW5Db252ZXJzaW9uKGNsYXNzRmlsZSwgdHJ1ZSk7Ci0JYXNzZXJ0Tm90TnVsbCgiTm8gbm9kZSIsIG5vZGUpOwotCXRoaXMuYXR0YWNoU291cmNlKHRoaXMucGtnRnJhZ21lbnRSb290LCBudWxsLCBudWxsKTsKLQlJQ2xhc3NGaWxlIGNmID0gdGhpcy5wa2dGcmFnbWVudFJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KCJ4LnkiKS5nZXRDbGFzc0ZpbGUoIkEuY2xhc3MiKTsKLQlhc3NlcnRUcnVlKCJzb3VyY2UgY29kZSBzaG91bGQgbm8gbG9uZ2VyIGV4aXN0IGZvciBBIiwgY2YuZ2V0U291cmNlKCkgPT0gbnVsbCk7Ci0JdHJ5IHsKLQkJbm9kZSA9IHJ1bkNvbnZlcnNpb24oY2xhc3NGaWxlLCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIG5vdCBiZSBoZXJlIiwgZmFsc2UpOwotCX0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLQl9Ci19Ci0vKioKLSAqIFRlc3QgQVNULnBhcnNlQ29tcGlsYXRpb25Vbml0KElDbGFzc0ZpbGUsIGJvb2xlYW4pLgotICogVGVzdCBmb3IgaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA0NzEKLSAqLwotcHVibGljIHZvaWQgdGVzdEFTVFBhcnNpbmcyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JdGhpcy5hdHRhY2hTb3VyY2UodGhpcy5wa2dGcmFnbWVudFJvb3QsICIvQXR0YWNoU291cmNlVGVzdHMvYXR0YWNoc3JjLnppcCIsICIiKTsJCi0JSUNsYXNzRmlsZSBjbGFzc0ZpbGUgPSB0aGlzLnBrZ0ZyYWdtZW50Um9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoIngueSIpLmdldENsYXNzRmlsZSgiQS5jbGFzcyIpOwotCUFTVE5vZGUgbm9kZSA9IHJ1bkNvbnZlcnNpb24oY2xhc3NGaWxlLCBmYWxzZSk7Ci0JYXNzZXJ0Tm90TnVsbCgiTm8gbm9kZSIsIG5vZGUpOwotCXRoaXMuYXR0YWNoU291cmNlKHRoaXMucGtnRnJhZ21lbnRSb290LCBudWxsLCBudWxsKTsKLQlJQ2xhc3NGaWxlIGNmID0gdGhpcy5wa2dGcmFnbWVudFJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KCJ4LnkiKS5nZXRDbGFzc0ZpbGUoIkEuY2xhc3MiKTsKLQlhc3NlcnRUcnVlKCJzb3VyY2UgY29kZSBzaG91bGQgbm8gbG9uZ2VyIGV4aXN0IGZvciBBIiwgY2YuZ2V0U291cmNlKCkgPT0gbnVsbCk7Ci0JdHJ5IHsKLQkJbm9kZSA9IHJ1bkNvbnZlcnNpb24oY2xhc3NGaWxlLCBmYWxzZSk7Ci0JCWFzc2VydFRydWUoIlNob3VsZCBub3QgYmUgaGVyZSIsIGZhbHNlKTsKLQl9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydFRydWUodHJ1ZSk7Ci0JfQotfQotLyoqCi0gKiBDaGFuZ2luZyB0aGUgc291cmNlIGF0dGFjaG1lbnQgZmlsZSBzaG91bGQgdXBkYXRlIHRoZSBqYXZhIG1vZGVsLgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDIzMjkyIE11c3QgcmVzdGFydCBFY2xpcHNlIGFmdGVyIGRlYnVnIG9mIHNvdXJjZSBpbiAuemlwIGlzIHVwZGF0ZWQpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VTb3VyY2VBdHRhY2htZW50RmlsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlJQ2xhc3NGaWxlIGNmID0gdGhpcy5wa2dGcmFnbWVudFJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KCJ4LnkiKS5nZXRDbGFzc0ZpbGUoIkEuY2xhc3MiKTsKLQlJTWV0aG9kIG1ldGhvZCA9IGNmLmdldFR5cGUoKS5nZXRNZXRob2QoImZvbyIsIG5ldyBTdHJpbmdbXSB7fSk7Ci0JCi0JLy8gY2hlY2sgaW5pdGlhbCBzb3VyY2UKLQlhc3NlcnRTb3VyY2VFcXVhbHMoCi0JCSJ1bmV4cGVjdGVkIGluaXRpYWwgc291cmNlIGZvciBmb28oKSIsCi0JCSJwdWJsaWMgdm9pZCBmb28oKSB7XG4iICsKLQkJIgl9IiwKLQkJbWV0aG9kLmdldFNvdXJjZSgpKTsKLQotCS8vIHJlcGxhY2Ugc291cmNlIGF0dGFjaG1lbnQgZmlsZQotCXRoaXMuc3dhcEZpbGVzKCJBdHRhY2hTb3VyY2VUZXN0cy9hdHRhY2hzcmMuemlwIiwgIkF0dGFjaFNvdXJjZVRlc3RzL2F0dGFjaHNyYy5uZXcuemlwIik7Ci0JYXNzZXJ0U291cmNlRXF1YWxzKAotCQkidW5leHBlY3RlZCBzb3VyY2UgZm9yIGZvbygpIGFmdGVyIHJlcGxhY2VtZW50IiwKLQkJInB1YmxpYyB2b2lkIGZvbygpIHtcbiIgKwotCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJmb29cIik7XG4iICsKLQkJIgl9IiwKLQkJbWV0aG9kLmdldFNvdXJjZSgpKTsKLQkJCi0JLy8gZGVsZXRlIHNvdXJjZSBhdHRhY2htZW50IGZpbGUKLQl0aGlzLmRlbGV0ZUZpbGUoIkF0dGFjaFNvdXJjZVRlc3RzL2F0dGFjaHNyYy56aXAiKTsKLQlhc3NlcnRTb3VyY2VFcXVhbHMoCi0JCSJ1bmV4cGVjdGVkIHNvdXJjZSBmb3IgZm9vKCkgYWZ0ZXIgZGVsZXRpb24iLAotCQludWxsLAotCQltZXRob2QuZ2V0U291cmNlKCkpOwotCQkKLQkvLyBhZGQgc291cmNlIGF0dGFjaG1lbnQgZmlsZSBiYWNrCi0JdGhpcy5tb3ZlRmlsZSgiQXR0YWNoU291cmNlVGVzdHMvYXR0YWNoc3JjLm5ldy56aXAiLCAiQXR0YWNoU291cmNlVGVzdHMvYXR0YWNoc3JjLnppcCIpOwotCWFzc2VydFNvdXJjZUVxdWFscygKLQkJInVuZXhwZWN0ZWQgc291cmNlIGZvciBmb28oKSBhZnRlciBhZGRpdGlvbiIsCi0JCSJwdWJsaWMgdm9pZCBmb28oKSB7XG4iICsKLQkJIgl9IiwKLQkJbWV0aG9kLmdldFNvdXJjZSgpKTsKLX0KLS8qKgotICogRW5zdXJlIHRoYXQgYSBjbGFzcyBmaWxlIHdpdGggYW4gYXR0YWNoZWQgc291cmNlIGNhbiByZXRyaWV2ZSBpdHMgY2hpbGRyZW4gZ2l2ZW4gYSBzb3VyY2UgaW5kZXguCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDbGFzc0ZpbGVHZXRFbGVtZW50QXQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJQ2xhc3NGaWxlIGNmID0gdGhpcy5wa2dGcmFnbWVudFJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KCJ4LnkiKS5nZXRDbGFzc0ZpbGUoIkEuY2xhc3MiKTsKLQlJSmF2YUVsZW1lbnQgZWx0ID0gbnVsbDsKLQkKLQllbHQgPSBjZi5nZXRFbGVtZW50QXQoMTUpOwotCWFzc2VydFRydWUoInNob3VsZCBoYXZlIGZvdW5kIFwiQVwiIiwKLQkJZWx0ICE9IG51bGwgJiYKLQkJZWx0LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlRZUEUgJiYKLQkJZWx0LmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKCJBIikpOwotCQotCWVsdCA9IGNmLmdldEVsZW1lbnRBdCg1Myk7Ci0JYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgZm91bmQgXCJwdWJsaWMgQSgpXCIiLAotCQllbHQgIT0gbnVsbCAmJgotCQllbHQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9EICYmCi0JCWVsdC5nZXRFbGVtZW50TmFtZSgpLmVxdWFscygiQSIpKTsKLQotCWVsdCA9IGNmLmdldEVsZW1lbnRBdCg3Mik7Ci0JYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgZm91bmQgXCJwdWJsaWMgdm9pZCBmb28oKVwiIiwKLQkJZWx0ICE9IG51bGwgJiYKLQkJZWx0LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50Lk1FVEhPRCAmJgotCQllbHQuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoImZvbyIpKTsKLX0KLS8qKgotICogUmV0cmlldmVzIHRoZSBzb3VyY2UgY29kZSBmb3IgIkEuY2xhc3MiLCB3aGljaCBpcwotICogdGhlIGVudGlyZSBDVSBmb3IgIkEuamF2YSIuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDbGFzc1JldHJpZXZhbCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlDbGFzc0ZpbGUgb2JqZWN0Q0YgPSB0aGlzLnBrZ0ZyYWdtZW50Um9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoIngueSIpLmdldENsYXNzRmlsZSgiQS5jbGFzcyIpOwotCWFzc2VydFRydWUoInNvdXJjZSBjb2RlIGRvZXMgbm90IGV4aXN0IGZvciB0aGUgZW50aXJlIGF0dGFjaGVkIGNvbXBpbGF0aW9uIHVuaXQiLCBvYmplY3RDRi5nZXRTb3VyY2UoKSAhPSBudWxsKTsKLX0KLS8qKgotICogUmVtb3ZlcyB0aGUgc291cmNlIGF0dGFjaG1lbnQgZnJvbSB0aGUgamFyLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0RGV0YWNoU291cmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JdGhpcy5hdHRhY2hTb3VyY2UodGhpcy5wa2dGcmFnbWVudFJvb3QsIG51bGwsIG51bGwpOwotCUlDbGFzc0ZpbGUgY2YgPSB0aGlzLnBrZ0ZyYWdtZW50Um9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoIngueSIpLmdldENsYXNzRmlsZSgiQS5jbGFzcyIpOwotCWFzc2VydFRydWUoInNvdXJjZSBjb2RlIHNob3VsZCBubyBsb25nZXIgZXhpc3QgZm9yIEEiLCBjZi5nZXRTb3VyY2UoKSA9PSBudWxsKTsKLQlhc3NlcnRUcnVlKCJuYW1lIHJhbmdlIHNob3VsZCBubyBsb25nZXIgZXhpc3QgZm9yIEEiLCBjZi5nZXRUeXBlKCkuZ2V0TmFtZVJhbmdlKCkuZ2V0T2Zmc2V0KCkgPT0gLTEpOwotCWFzc2VydFRydWUoInNvdXJjZSByYW5nZSBzaG91bGQgbm8gbG9uZ2VyIGV4aXN0IGZvciBBIiwgY2YuZ2V0VHlwZSgpLmdldFNvdXJjZVJhbmdlKCkuZ2V0T2Zmc2V0KCkgPT0gLTEpOwotCWFzc2VydFRydWUoIlNvdXJjZSBhdHRhY2htZW50IHBhdGggc2hvdWxkIGJlIG51bGwiLCBudWxsID09IHRoaXMucGtnRnJhZ21lbnRSb290LmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCkpOwotCWFzc2VydFRydWUoIlNvdXJjZSBhdHRhY2htZW50IHJvb3QgcGF0aCBzaG91bGQgYmUgbnVsbCIsIG51bGwgPT10aGlzLnBrZ0ZyYWdtZW50Um9vdC5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBuYW1lIHJhbmdlcyBleGlzdHMgZm9yIEJpbmFyeU1lbWJlcnMgdGhhdCBoYXZlCi0gKiBtYXBwZWQgc291cmNlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZVJhbmdlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNsYXNzRmlsZSBjZiA9IHRoaXMucGtnRnJhZ21lbnRSb290LmdldFBhY2thZ2VGcmFnbWVudCgieC55IikuZ2V0Q2xhc3NGaWxlKCJBLmNsYXNzIik7Ci0JSU1ldGhvZCBtZXRob2QgPSBjZi5nZXRUeXBlKCkuZ2V0TWV0aG9kKCJmb28iLCBudWxsKTsKLQlhc3NlcnRUcnVlKCJtZXRob2QgbmFtZSByYW5nZSBub3QgY29ycmVjdCIsIG1ldGhvZC5nZXROYW1lUmFuZ2UoKS5nZXRPZmZzZXQoKSAhPSAtMSAmJiBtZXRob2QuZ2V0TmFtZVJhbmdlKCkuZ2V0TGVuZ3RoKCkgIT0gMCk7Ci0KLQlJQ2xhc3NGaWxlIG9iamVjdENGID0gdGhpcy5wa2dGcmFnbWVudFJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KCJ4LnkiKS5nZXRDbGFzc0ZpbGUoIkEuY2xhc3MiKTsKLQlJU291cmNlUmFuZ2UgcmFuZ2U9IG9iamVjdENGLmdldFR5cGUoKS5nZXROYW1lUmFuZ2UoKTsKLQlpbnQgc3RhcnQsIGVuZDsKLQlzdGFydD0gcmFuZ2UuZ2V0T2Zmc2V0KCk7Ci0JZW5kPSBzdGFydCArIHJhbmdlLmdldExlbmd0aCgpIC0gMTsKLQotCWFzc2VydFRydWUoInNvdXJjZSBjb2RlIGRvZXMgbm90IGV4aXN0IGZvciB0aGUgZW50aXJlIGF0dGFjaGVkIGNvbXBpbGF0aW9uIHVuaXQiLCBzdGFydCAhPSAtMSAmJiBlbmQgIT0gLTEpOwotCVN0cmluZyBzb3VyY2U9IG9iamVjdENGLmdldFNvdXJjZSgpLnN1YnN0cmluZyhzdGFydCwgZW5kICsgMSk7Ci0JYXNzZXJ0U291cmNlRXF1YWxzKCJuYW1lIHNob3VsZCBiZSAnQSciLCAiQSIsIHNvdXJjZSk7Ci19Ci0vKioKLSAqIFJldHJpZXZlcyB0aGUgc291cmNlIGF0dGFjaG1lbnQgcGF0aHMgZm9yIGphciByb290LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0R2V0U291cmNlQXR0YWNobWVudFBhdGgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJUGF0aCBzYVBhdGg9IHRoaXMucGtnRnJhZ21lbnRSb290LmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCk7Ci0JYXNzZXJ0RXF1YWxzKCJTb3VyY2UgYXR0YWNobWVudCBwYXRoIG5vdCBjb3JyZWN0IGZvciByb290ICIgKyB0aGlzLnBrZ0ZyYWdtZW50Um9vdCwgIi9BdHRhY2hTb3VyY2VUZXN0cy9hdHRhY2hzcmMuemlwIiwgc2FQYXRoLnRvU3RyaW5nKCkpOwotCWFzc2VydEVxdWFscygiU291cmNlIGF0dGFjaG1lbnQgcm9vdCBwYXRoIHNob3VsZCBiZSBlbXB0eSIsIG5ldyBQYXRoKCIiKSwgdGhpcy5wa2dGcmFnbWVudFJvb3QuZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCkpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBzb3VyY2UgcmFuZ2UgZXhpc3RzIGZvciB0aGUgY2xhc3MgZmlsZSB0aGF0IGhhcwotICogbWFwcGVkIHNvdXJjZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdEdldFNvdXJjZVJhbmdlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNsYXNzRmlsZSBjZiA9IHRoaXMucGtnRnJhZ21lbnRSb290LmdldFBhY2thZ2VGcmFnbWVudCgieC55IikuZ2V0Q2xhc3NGaWxlKCJBLmNsYXNzIik7Ci0JYXNzZXJ0VHJ1ZSgiQ2xhc3MgZmlsZSBzb3VyY2UgcmFuZ2Ugbm90IGNvcnJlY3QiLCBjZi5nZXRTb3VyY2VSYW5nZSgpLmdldE9mZnNldCgpID09IDAgJiYgY2YuZ2V0U291cmNlUmFuZ2UoKS5nZXRMZW5ndGgoKSAhPSAwKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgc291cmNlIHJhbmdlIGV4aXN0cyBmb3IgdGhlIChpbm5lcikgY2xhc3MgZmlsZSB0aGF0IGhhcwotICogbWFwcGVkIHNvdXJjZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdEdldFNvdXJjZVJhbmdlSW5uZXJDbGFzcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlDbGFzc0ZpbGUgY2YgPSB0aGlzLnBrZ0ZyYWdtZW50Um9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoIngueSIpLmdldENsYXNzRmlsZSgiQSRJbm5lci5jbGFzcyIpOwotCWFzc2VydFRydWUoIklubmVyIENsYXNzIGZpbGUgc291cmNlIHJhbmdlIG5vdCBjb3JyZWN0IiwgY2YuZ2V0U291cmNlUmFuZ2UoKS5nZXRPZmZzZXQoKSA9PSAwICYmIGNmLmdldFNvdXJjZVJhbmdlKCkuZ2V0TGVuZ3RoKCkgIT0gMCk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIHNvdXJjZSBmb2xkZXIgY2FuIGJlIGF0dGFjaGVkIHRvIGEgbGliIGZvbGRlci4KLSAqLwotcHVibGljIHZvaWQgdGVzdExpYkZvbGRlcigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSB0aGlzLmdldFBhY2thZ2VGcmFnbWVudFJvb3QoIi9BdHRhY2hTb3VyY2VUZXN0cy9saWIiKTsKLQl0aGlzLmF0dGFjaFNvdXJjZShyb290LCAiL0F0dGFjaFNvdXJjZVRlc3RzL3NyY0xpYiIsICIiKTsKLQkKLQlJQ2xhc3NGaWxlIGNmID0gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoInAiKS5nZXRDbGFzc0ZpbGUoIlguY2xhc3MiKTsKLQlhc3NlcnRTb3VyY2VFcXVhbHMoCi0JCSJVbmV4cGVjdGVkIHNvdXJjZSBmb3IgY2xhc3MgZmlsZSIsCi0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiCXB1YmxpYyB2b2lkIGZvbygpIHtcbiIgKwotCQkiCX1cbiIgKwotCQkifSIsCi0JCWNmLmdldFNvdXJjZSgpKTsKLX0KLS8qKgotICogUmV0cmlldmVzIHRoZSBzb3VyY2UgY29kZSBmb3IgbWV0aG9kcyBvZiBjbGFzcyBBLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TWV0aG9kUmV0cmlldmFsKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNsYXNzRmlsZSBjZiA9IHRoaXMucGtnRnJhZ21lbnRSb290LmdldFBhY2thZ2VGcmFnbWVudCgieC55IikuZ2V0Q2xhc3NGaWxlKCJBLmNsYXNzIik7Ci0JSU1ldGhvZFtdIG1ldGhvZHMgPSBjZi5nZXRUeXBlKCkuZ2V0TWV0aG9kcygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQlJTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbaV07Ci0JCWFzc2VydFRydWUoInNvdXJjZSBjb2RlIGRvZXMgbm90IGV4aXN0IGZvciB0aGUgbWV0aG9kICIgKyBtZXRob2QsIG1ldGhvZC5nZXRTb3VyY2UoKSAhPSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSgibWV0aG9kIG5hbWUgcmFuZ2Ugbm90IGNvcnJlY3QiLCBtZXRob2QuZ2V0TmFtZVJhbmdlKCkuZ2V0T2Zmc2V0KCkgIT0gLTEgJiYgbWV0aG9kLmdldE5hbWVSYW5nZSgpLmdldExlbmd0aCgpICE9IDApOwotCX0KLX0KLS8qKgotICogQ2xvc2VzIHRoZSBqYXIsIHRvIGVuc3VyZSB3aGVuIGl0IGlzIHJlLW9wZW5lZCB0aGUgc291cmNlCi0gKiBhdHRhY2htZW50IHN0aWxsIGV4aXN0cy4KLSAqLwotcHVibGljIHZvaWQgdGVzdFBlcnNpc3RlbmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JdGhpcy5wa2dGcmFnbWVudFJvb3QuY2xvc2UoKTsKLQl0ZXN0Q2xhc3NSZXRyaWV2YWwoKTsKLQl0ZXN0TWV0aG9kUmV0cmlldmFsKCk7Ci19Ci0vKioKLSAqIEF0dGFjaGVzIGEgc291cmNlIHppcCB0byBhIGphci4gIFRoZSBzb3VyY2UgemlwIGhhcwotICogYSBuZXN0ZWQgcm9vdCBzdHJ1Y3R1cmUgYW5kIGV4aXN0cyBhcyBhIHJlc291cmNlLiAgVGVzdHMgdGhhdAotICogdGhlIGF0dGFjaG1lbnQgaXMgcGVyc2lzdGVkIGFzIGEgc2VydmVyIHByb3BlcnR5IGZvciB0aGUgamFyLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Um9vdFBhdGgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJSmF2YVByb2plY3QgcHJvamVjdCA9IGdldEphdmFQcm9qZWN0KCJBdHRhY2hTb3VyY2VUZXN0cyIpOwotCUlGaWxlIGphciA9IChJRmlsZSkgcHJvamVjdC5nZXRQcm9qZWN0KCkuZmluZE1lbWJlcigiYXR0YWNoMi5qYXIiKTsKLQlJRmlsZSBzcmNaaXA9KElGaWxlKSBwcm9qZWN0LmdldFByb2plY3QoKS5maW5kTWVtYmVyKCJhdHRhY2gyc3JjLnppcCIpOwotCUphclBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChKYXJQYWNrYWdlRnJhZ21lbnRSb290KSBwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoamFyKTsKLQlyb290LmF0dGFjaFNvdXJjZShzcmNaaXAuZ2V0RnVsbFBhdGgoKSwgbmV3IFBhdGgoInNyYy9uZXN0ZWQiKSwgbnVsbCk7Ci0KLQlJQ2xhc3NGaWxlIGNmID0gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoIngueSIpLmdldENsYXNzRmlsZSgiQi5jbGFzcyIpOwotCWFzc2VydFRydWUoInNvdXJjZSBjb2RlIGRvZXMgbm90IGV4aXN0IGZvciB0aGUgZW50aXJlIGF0dGFjaGVkIGNvbXBpbGF0aW9uIHVuaXQiLCBjZi5nZXRTb3VyY2UoKSAhPSBudWxsKTsKLQlyb290LmNsb3NlKCk7Ci0JY2YgPSByb290LmdldFBhY2thZ2VGcmFnbWVudCgieC55IikuZ2V0Q2xhc3NGaWxlKCJCLmNsYXNzIik7Ci0JYXNzZXJ0VHJ1ZSgic291cmNlIGNvZGUgZG9lcyBub3QgZXhpc3QgZm9yIHRoZSBlbnRpcmUgYXR0YWNoZWQgY29tcGlsYXRpb24gdW5pdCIsIGNmLmdldFNvdXJjZSgpICE9IG51bGwpOwotCi0JSVBhdGggcm9vdFNBUGF0aD0gcm9vdC5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKTsKLQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgc291cmNlIGF0dGFjaG1lbnQgcm9vdCBwYXRoIGZvciAiICsgcm9vdC5nZXRQYXRoKCksICJzcmMvbmVzdGVkIiwgcm9vdFNBUGF0aC50b1N0cmluZygpKTsKLQotCUlQYXRoIHNhUGF0aD0gcm9vdC5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpOwotCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBzb3VyY2UgYXR0YWNobWVudCBwYXRoIGZvciAiICsgcm9vdC5nZXRQYXRoKCksICIvQXR0YWNoU291cmNlVGVzdHMvYXR0YWNoMnNyYy56aXAiLCBzYVBhdGgudG9TdHJpbmcoKSk7Ci0JCi0Jcm9vdC5jbG9zZSgpOwotfQotLyoqCi0gKiBBdHRhY2hlcyBhIHNvdXJjZSB6aXAgdG8gYSBqYXIgc3BlY2lmeWluZyBhbiBpbnZhbGlkIHJvb3QgcGF0aC4gIAotICogRW5zdXJlcyB0aGF0IHRoZSByb290IHBhdGggaXMganVzdCB1c2VkIGFzIGEgaGludCwgYW5kIHRoYXQgdGhlIHNvdXJjZSBpcyBzdGlsbCByZXRyaWV2ZWQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSb290UGF0aDIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJSmF2YVByb2plY3QgcHJvamVjdCA9IGdldEphdmFQcm9qZWN0KCJBdHRhY2hTb3VyY2VUZXN0cyIpOwotCUlGaWxlIGphciA9IChJRmlsZSkgcHJvamVjdC5nZXRQcm9qZWN0KCkuZmluZE1lbWJlcigiYXR0YWNoMi5qYXIiKTsKLQlJRmlsZSBzcmNaaXA9KElGaWxlKSBwcm9qZWN0LmdldFByb2plY3QoKS5maW5kTWVtYmVyKCJhdHRhY2gyc3JjLnppcCIpOwotCUphclBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChKYXJQYWNrYWdlRnJhZ21lbnRSb290KSBwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoamFyKTsKLQlyb290LmF0dGFjaFNvdXJjZShzcmNaaXAuZ2V0RnVsbFBhdGgoKSwgbmV3IFBhdGgoIiIpLCBudWxsKTsKLQotCUlDbGFzc0ZpbGUgY2YgPSByb290LmdldFBhY2thZ2VGcmFnbWVudCgieC55IikuZ2V0Q2xhc3NGaWxlKCJCLmNsYXNzIik7Ci0JYXNzZXJ0VHJ1ZSgic291cmNlIGNvZGUgZG9lcyBub3QgZXhpc3QgZm9yIHRoZSBlbnRpcmUgYXR0YWNoZWQgY29tcGlsYXRpb24gdW5pdCIsIGNmLmdldFNvdXJjZSgpICE9IG51bGwpOwotCXJvb3QuY2xvc2UoKTsKLX0KLS8qKgotICogQXR0YWNoZXMgYSBzYSBzb3VyY2UgZm9sZGVyIGNhbiBiZSBhdHRhY2hlZCB0byBhIGxpYiBmb2xkZXIgc3BlY2lmeWluZyBhbiBpbnZhbGlkIHJvb3QgcGF0aC4gIAotICogRW5zdXJlcyB0aGF0IHRoZSByb290IHBhdGggaXMganVzdCB1c2VkIGFzIGEgaGludCwgYW5kIHRoYXQgdGhlIHNvdXJjZSBpcyBzdGlsbCByZXRyaWV2ZWQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSb290UGF0aDMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gdGhpcy5nZXRQYWNrYWdlRnJhZ21lbnRSb290KCIvQXR0YWNoU291cmNlVGVzdHMvbGliIik7Ci0JdGhpcy5hdHRhY2hTb3VyY2Uocm9vdCwgIi9BdHRhY2hTb3VyY2VUZXN0cy9zcmNMaWIiLCAiaW52YWxpZCIpOwotCQotCUlDbGFzc0ZpbGUgY2YgPSByb290LmdldFBhY2thZ2VGcmFnbWVudCgicCIpLmdldENsYXNzRmlsZSgiWC5jbGFzcyIpOwotCWFzc2VydFNvdXJjZUVxdWFscygKLQkJIlVuZXhwZWN0ZWQgc291cmNlIGZvciBjbGFzcyBmaWxlIiwKLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIJcHVibGljIHZvaWQgZm9vKCkge1xuIiArCi0JCSIJfVxuIiArCi0JCSJ9IiwKLQkJY2YuZ2V0U291cmNlKCkpOwotCXJvb3QuY2xvc2UoKTsKLX0KLS8qKgotICogQXR0YWNoIGEgamFyIHdpdGggYSBzb3VyY2UgYXR0YWNoZW1lbnQgdGhhdCBkb2Vzbid0IGNvbnRhaW4gdGhlIHNvdXJjZSBmb2xkZXJzCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSb290UGF0aDQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJSmF2YVByb2plY3QgcHJvamVjdCA9IHRoaXMuZ2V0SmF2YVByb2plY3QoIi9BdHRhY2hTb3VyY2VUZXN0cyIpOwotCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QodGhpcy5nZXRGaWxlKCIvQXR0YWNoU291cmNlVGVzdHMvdGVzdC5qYXIiKSk7Ci0JdGhpcy5hdHRhY2hTb3VyY2Uocm9vdCwgIi9BdHRhY2hTb3VyY2VUZXN0cy9zcmMuemlwIiwgImludmFsaWQiKTsKLQkKLQlJQ2xhc3NGaWxlIGNmID0gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoInRlc3QxIikuZ2V0Q2xhc3NGaWxlKCJUZXN0LmNsYXNzIik7Ci0JYXNzZXJ0U291cmNlRXF1YWxzKAotCQkiVW5leHBlY3RlZCBzb3VyY2UgZm9yIGNsYXNzIGZpbGUiLAotCQkicGFja2FnZSB0ZXN0MTtcbiIgKwotCQkiXG4iICsKLQkJInB1YmxpYyBjbGFzcyBUZXN0IHt9IiwKLQkJY2YuZ2V0U291cmNlKCkpOwotCXJvb3QuY2xvc2UoKTsKLX0KLS8qKgotICogQXR0YWNoIGEgamFyIHdpdGggYSBzb3VyY2UgYXR0YWNoZW1lbnQgdGhhdCBkb2Vzbid0IGNvbnRhaW4gdGhlIHNvdXJjZSBmb2xkZXJzCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSb290UGF0aDUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJSmF2YVByb2plY3QgcHJvamVjdCA9IHRoaXMuZ2V0SmF2YVByb2plY3QoIi9BdHRhY2hTb3VyY2VUZXN0cyIpOwotCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QodGhpcy5nZXRGaWxlKCIvQXR0YWNoU291cmNlVGVzdHMvdXBkYXRlLmphciIpKTsKLQl0aGlzLmF0dGFjaFNvdXJjZShyb290LCAiL0F0dGFjaFNvdXJjZVRlc3RzL3NyYy56aXAiLCAiaW52YWxpZCIpOwotCQotCUlDbGFzc0ZpbGUgY2YgPSByb290LmdldFBhY2thZ2VGcmFnbWVudCgicDEucDIiKS5nZXRDbGFzc0ZpbGUoIkEuY2xhc3MiKTsKLQlhc3NlcnRTb3VyY2VFcXVhbHMoCi0JCSJVbmV4cGVjdGVkIHNvdXJjZSBmb3IgY2xhc3MgZmlsZSIsCi0JCSJwYWNrYWdlIHAxLnAyO1xuIiArCi0JCSJcbiIgKwotCQkicHVibGljIGNsYXNzIEEge30iLAotCQljZi5nZXRTb3VyY2UoKSk7Ci0JCQotCWNmID0gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoIiIpLmdldENsYXNzRmlsZSgiQi5jbGFzcyIpOwotCWFzc2VydFNvdXJjZUVxdWFscygKLQkJIlVuZXhwZWN0ZWQgc291cmNlIGZvciBjbGFzcyBmaWxlIiwKLQkJInB1YmxpYyBjbGFzcyBCIHt9IiwKLQkJY2YuZ2V0U291cmNlKCkpOwkJCi0JCi0JdGhpcy5hdHRhY2hTb3VyY2Uocm9vdCwgbnVsbCwgbnVsbCk7IC8vIGRldGFjaCBzb3VyY2UKLQlyb290LmNsb3NlKCk7Ci19Ci0vKioKLSAqIEF0dGFjaCBhIGphciB3aXRoIGEgc291cmNlIGF0dGFjaGVtZW50IHRoYXQgZG9lc24ndCBjb250YWluIHRoZSBzb3VyY2UgZm9sZGVycwotICovCi1wdWJsaWMgdm9pZCB0ZXN0Um9vdFBhdGg2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUphdmFQcm9qZWN0IHByb2plY3QgPSB0aGlzLmdldEphdmFQcm9qZWN0KCIvQXR0YWNoU291cmNlVGVzdHMiKTsKLQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KHRoaXMuZ2V0RmlsZSgiL0F0dGFjaFNvdXJjZVRlc3RzL3VwZGF0ZS5qYXIiKSk7Ci0JdGhpcy5hdHRhY2hTb3VyY2Uocm9vdCwgIi9BdHRhY2hTb3VyY2VUZXN0cy9zcmMuemlwIiwgbnVsbCk7Ci0JCi0JSUNsYXNzRmlsZSBjZiA9IHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KCJwMS5wMiIpLmdldENsYXNzRmlsZSgiQS5jbGFzcyIpOwotCWFzc2VydFNvdXJjZUVxdWFscygKLQkJIlVuZXhwZWN0ZWQgc291cmNlIGZvciBjbGFzcyBmaWxlIiwKLQkJInBhY2thZ2UgcDEucDI7XG4iICsKLQkJIlxuIiArCi0JCSJwdWJsaWMgY2xhc3MgQSB7fSIsCi0JCWNmLmdldFNvdXJjZSgpKTsKLQkJCi0JY2YgPSByb290LmdldFBhY2thZ2VGcmFnbWVudCgiIikuZ2V0Q2xhc3NGaWxlKCJCLmNsYXNzIik7Ci0JYXNzZXJ0U291cmNlRXF1YWxzKAotCQkiVW5leHBlY3RlZCBzb3VyY2UgZm9yIGNsYXNzIGZpbGUiLAotCQkicHVibGljIGNsYXNzIEIge30iLAotCQljZi5nZXRTb3VyY2UoKSk7CQkKLQotCXRoaXMuYXR0YWNoU291cmNlKHJvb3QsIG51bGwsIG51bGwpOyAvLyBkZXRhY2ggc291cmNlCi0Jcm9vdC5jbG9zZSgpOwotfQotLyoqCi0gKiBBdHRhY2ggYSBqYXIgd2l0aCBhIHNvdXJjZSBhdHRhY2hlbWVudCB0aGF0IGRvZXNuJ3QgY29udGFpbiB0aGUgc291cmNlIGZvbGRlcnMKLSAqLwotcHVibGljIHZvaWQgdGVzdFJvb3RQYXRoNygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5nZXRKYXZhUHJvamVjdCgiL0F0dGFjaFNvdXJjZVRlc3RzIik7Ci0JSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCh0aGlzLmdldEZpbGUoIi9BdHRhY2hTb3VyY2VUZXN0cy9mdWxsLmphciIpKTsKLQl0aGlzLmF0dGFjaFNvdXJjZShyb290LCAiL0F0dGFjaFNvdXJjZVRlc3RzL3NyYy56aXAiLCBudWxsKTsKLQkKLQlJQ2xhc3NGaWxlIGNmID0gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoInAxLnAyIikuZ2V0Q2xhc3NGaWxlKCJBLmNsYXNzIik7Ci0JYXNzZXJ0U291cmNlRXF1YWxzKAotCQkiVW5leHBlY3RlZCBzb3VyY2UgZm9yIGNsYXNzIGZpbGUiLAotCQkicGFja2FnZSBwMS5wMjtcbiIgKwotCQkiXG4iICsKLQkJInB1YmxpYyBjbGFzcyBBIHt9IiwKLQkJY2YuZ2V0U291cmNlKCkpOwotCQkKLQljZiA9IHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KCIiKS5nZXRDbGFzc0ZpbGUoIkIuY2xhc3MiKTsKLQlhc3NlcnRTb3VyY2VFcXVhbHMoCi0JCSJVbmV4cGVjdGVkIHNvdXJjZSBmb3IgY2xhc3MgZmlsZSIsCi0JCSJwdWJsaWMgY2xhc3MgQiB7fSIsCi0JCWNmLmdldFNvdXJjZSgpKTsKLQkJCi0JY2YgPSByb290LmdldFBhY2thZ2VGcmFnbWVudCgidGVzdDEiKS5nZXRDbGFzc0ZpbGUoIlRlc3QuY2xhc3MiKTsKLQlhc3NlcnRTb3VyY2VFcXVhbHMoCi0JCSJVbmV4cGVjdGVkIHNvdXJjZSBmb3IgY2xhc3MgZmlsZSIsCi0JCSJwYWNrYWdlIHRlc3QxO1xuIiArCi0JCSJcbiIgKwotCQkicHVibGljIGNsYXNzIFRlc3Qge30iLAotCQljZi5nZXRTb3VyY2UoKSk7CQkJCQotCQotCXRoaXMuYXR0YWNoU291cmNlKHJvb3QsIG51bGwsIG51bGwpOyAvLyBkZXRhY2ggc291cmNlCi0Jcm9vdC5jbG9zZSgpOwotfQotLyoqCi0gKiBBdHRhY2ggYSBqYXIgd2l0aCBhIHNvdXJjZSBhdHRhY2hlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBzb3VyY2UgZm9sZGVycwotICovCi1wdWJsaWMgdm9pZCB0ZXN0Um9vdFBhdGg4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUphdmFQcm9qZWN0IHByb2plY3QgPSB0aGlzLmdldEphdmFQcm9qZWN0KCIvQXR0YWNoU291cmNlVGVzdHMiKTsKLQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KHRoaXMuZ2V0RmlsZSgiL0F0dGFjaFNvdXJjZVRlc3RzL2Z1bGwuamFyIikpOwotCXRoaXMuYXR0YWNoU291cmNlKHJvb3QsICIvQXR0YWNoU291cmNlVGVzdHMvZnVsbHNyYy56aXAiLCBudWxsKTsKLQkKLQlJQ2xhc3NGaWxlIGNmID0gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoInAxLnAyIikuZ2V0Q2xhc3NGaWxlKCJBLmNsYXNzIik7Ci0JYXNzZXJ0U291cmNlRXF1YWxzKAotCQkiVW5leHBlY3RlZCBzb3VyY2UgZm9yIGNsYXNzIGZpbGUiLAotCQkicGFja2FnZSBwMS5wMjtcbiIgKwotCQkiXG4iICsKLQkJInB1YmxpYyBjbGFzcyBBIHt9IiwKLQkJY2YuZ2V0U291cmNlKCkpOwotCQkKLQljZiA9IHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KCIiKS5nZXRDbGFzc0ZpbGUoIkIuY2xhc3MiKTsKLQlhc3NlcnRTb3VyY2VFcXVhbHMoCi0JCSJVbmV4cGVjdGVkIHNvdXJjZSBmb3IgY2xhc3MgZmlsZSIsCi0JCSJwdWJsaWMgY2xhc3MgQiB7fSIsCi0JCWNmLmdldFNvdXJjZSgpKTsKLQkJCi0JY2YgPSByb290LmdldFBhY2thZ2VGcmFnbWVudCgidGVzdDEiKS5nZXRDbGFzc0ZpbGUoIlRlc3QuY2xhc3MiKTsKLQlhc3NlcnRTb3VyY2VFcXVhbHMoCi0JCSJVbmV4cGVjdGVkIHNvdXJjZSBmb3IgY2xhc3MgZmlsZSIsCi0JCSJwYWNrYWdlIHRlc3QxO1xuIiArCi0JCSJcbiIgKwotCQkicHVibGljIGNsYXNzIFRlc3Qge30iLAotCQljZi5nZXRTb3VyY2UoKSk7CQkJCQotCQotCXRoaXMuYXR0YWNoU291cmNlKHJvb3QsIG51bGwsIG51bGwpOyAvLyBkZXRhY2ggc291cmNlCi0Jcm9vdC5jbG9zZSgpOwotfQotLyoqCi0gKiBBdHRhY2ggYSBqYXIgd2l0aCBhIHNvdXJjZSBhdHRhY2hlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBzb3VyY2UgZm9sZGVycwotICovCi1wdWJsaWMgdm9pZCB0ZXN0Um9vdFBhdGg5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUphdmFQcm9qZWN0IHByb2plY3QgPSB0aGlzLmdldEphdmFQcm9qZWN0KCIvQXR0YWNoU291cmNlVGVzdHMiKTsKLQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KHRoaXMuZ2V0RmlsZSgiL0F0dGFjaFNvdXJjZVRlc3RzL2Z1bGwuamFyIikpOwotCXRoaXMuYXR0YWNoU291cmNlKHJvb3QsICIvQXR0YWNoU291cmNlVGVzdHMvZnVsbHNyYy56aXAiLCAiaW52YWxpZCIpOwotCQotCUlDbGFzc0ZpbGUgY2YgPSByb290LmdldFBhY2thZ2VGcmFnbWVudCgicDEucDIiKS5nZXRDbGFzc0ZpbGUoIkEuY2xhc3MiKTsKLQlhc3NlcnRTb3VyY2VFcXVhbHMoCi0JCSJVbmV4cGVjdGVkIHNvdXJjZSBmb3IgY2xhc3MgZmlsZSIsCi0JCSJwYWNrYWdlIHAxLnAyO1xuIiArCi0JCSJcbiIgKwotCQkicHVibGljIGNsYXNzIEEge30iLAotCQljZi5nZXRTb3VyY2UoKSk7Ci0JCQotCWNmID0gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoIiIpLmdldENsYXNzRmlsZSgiQi5jbGFzcyIpOwotCWFzc2VydFNvdXJjZUVxdWFscygKLQkJIlVuZXhwZWN0ZWQgc291cmNlIGZvciBjbGFzcyBmaWxlIiwKLQkJInB1YmxpYyBjbGFzcyBCIHt9IiwKLQkJY2YuZ2V0U291cmNlKCkpOwotCQkKLQljZiA9IHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KCJ0ZXN0MSIpLmdldENsYXNzRmlsZSgiVGVzdC5jbGFzcyIpOwotCWFzc2VydFNvdXJjZUVxdWFscygKLQkJIlVuZXhwZWN0ZWQgc291cmNlIGZvciBjbGFzcyBmaWxlIiwKLQkJInBhY2thZ2UgdGVzdDE7XG4iICsKLQkJIlxuIiArCi0JCSJwdWJsaWMgY2xhc3MgVGVzdCB7fSIsCi0JCWNmLmdldFNvdXJjZSgpKTsJCQkJCi0JCi0JdGhpcy5hdHRhY2hTb3VyY2Uocm9vdCwgbnVsbCwgbnVsbCk7IC8vIGRldGFjaCBzb3VyY2UKLQlyb290LmNsb3NlKCk7Ci19Ci0vKioKLSAqIEF0dGFjaCBhIGphciB3aXRoIGEgc291cmNlIGF0dGFjaGVtZW50IHRoYXQgaXMgaXRzZWxmCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSb290UGF0aDEwKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUphdmFQcm9qZWN0IHByb2plY3QgPSB0aGlzLmdldEphdmFQcm9qZWN0KCIvQXR0YWNoU291cmNlVGVzdHMiKTsKLQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KHRoaXMuZ2V0RmlsZSgiL0F0dGFjaFNvdXJjZVRlc3RzL3Rlc3QyLmphciIpKTsKLQl0aGlzLmF0dGFjaFNvdXJjZShyb290LCAiL0F0dGFjaFNvdXJjZVRlc3RzL3Rlc3QyLmphciIsIG51bGwpOwotCQotCUlDbGFzc0ZpbGUgY2YgPSByb290LmdldFBhY2thZ2VGcmFnbWVudCgicCIpLmdldENsYXNzRmlsZSgiWC5jbGFzcyIpOwotCWFzc2VydFNvdXJjZUVxdWFscygKLQkJIlVuZXhwZWN0ZWQgc291cmNlIGZvciBjbGFzcyBmaWxlIiwKLQkJInBhY2thZ2UgcDtcbiIgKwotCQkiXG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiXG4iICsKLQkJIglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XG4iICsKLQkJIgl9XG4iICsKLQkJIn0iLAotCQljZi5nZXRTb3VyY2UoKSk7Ci0JdGhpcy5hdHRhY2hTb3VyY2Uocm9vdCwgbnVsbCwgbnVsbCk7IC8vIGRldGFjaCBzb3VyY2UKLQlyb290LmNsb3NlKCk7Ci19Ci0vKioKLSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM1OTY1Ci0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSb290UGF0aDExKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUphdmFQcm9qZWN0IHByb2plY3QgPSB0aGlzLmdldEphdmFQcm9qZWN0KCIvQXR0YWNoU291cmNlVGVzdHMiKTsKLQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KHRoaXMuZ2V0RmlsZSgiL0F0dGFjaFNvdXJjZVRlc3RzL3Rlc3Q0LmphciIpKTsKLQl0aGlzLmF0dGFjaFNvdXJjZShyb290LCAiL0F0dGFjaFNvdXJjZVRlc3RzL3Rlc3Q0X3NyYy56aXAiLCBudWxsKTsKLQkKLQlJQ2xhc3NGaWxlIGNmID0gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoIlAxIikuZ2V0Q2xhc3NGaWxlKCJELmNsYXNzIik7Ci0JYXNzZXJ0U291cmNlRXF1YWxzKAotCQkiVW5leHBlY3RlZCBzb3VyY2UgZm9yIGNsYXNzIGZpbGUgUDEuRCIsCi0JCSJwYWNrYWdlIFAxO1xuIiArCi0JCSJcbiIgKwotCQkicHVibGljIGNsYXNzIEQge30iLAotCQljZi5nZXRTb3VyY2UoKSk7Ci0KLQljZiA9IHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KCJQMS5wMiIpLmdldENsYXNzRmlsZSgiQS5jbGFzcyIpOwotCWFzc2VydFNvdXJjZUVxdWFscygKLQkJIlVuZXhwZWN0ZWQgc291cmNlIGZvciBjbGFzcyBmaWxlIFAxLnAyLkEiLAotCQkicGFja2FnZSBQMS5wMjtcbiIgKwotCQkiXG4iICsKLQkJInB1YmxpYyBjbGFzcyBBIHt9IiwKLQkJY2YuZ2V0U291cmNlKCkpOwkKLQotCWFzc2VydFRydWUoIk5vdCBhIGJpbmFyeSByb290Iiwgcm9vdC5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19CSU5BUlkpOwotCWFzc2VydEVxdWFscygid3JvbmcgamRrIGxldmVsIiwgQ2xhc3NGaWxlQ29uc3RhbnRzLkpESzFfMiwgVXRpbC5nZXRKZGtMZXZlbChyb290LmdldFJlc291cmNlKCkpKTsKLQl0aGlzLmF0dGFjaFNvdXJjZShyb290LCBudWxsLCBudWxsKTsgLy8gZGV0YWNoIHNvdXJjZQotCXJvb3QuY2xvc2UoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0J1ZmZlclRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvQnVmZmVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU2ZGQ5ZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvQnVmZmVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgQnVmZmVyVGVzdHMgZXh0ZW5kcyBNb2RpZnlpbmdSZXNvdXJjZVRlc3RzIGltcGxlbWVudHMgSUJ1ZmZlckNoYW5nZWRMaXN0ZW5lciB7Ci0JcHJvdGVjdGVkIEJ1ZmZlckNoYW5nZWRFdmVudCBldmVudD0gbnVsbDsKLXB1YmxpYyBCdWZmZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotLyoqCi0gKiBDYWNoZSB0aGUgZXZlbnQKLSAqLwotcHVibGljIHZvaWQgYnVmZmVyQ2hhbmdlZChCdWZmZXJDaGFuZ2VkRXZlbnQgYnVmZmVyQ2hhbmdlZEV2ZW50KSB7Ci0JdGhpcy5ldmVudD0gYnVmZmVyQ2hhbmdlZEV2ZW50OwotfQotcHJvdGVjdGVkIElCdWZmZXIgY3JlYXRlQnVmZmVyKFN0cmluZyBwYXRoLCBTdHJpbmcgY29udGVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuY3JlYXRlRmlsZShwYXRoLCBjb250ZW50KTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5nZXRDb21waWxhdGlvblVuaXQocGF0aCk7Ci0JSUJ1ZmZlciBidWZmZXIgPSBjdS5nZXRCdWZmZXIoKTsKLQlidWZmZXIuYWRkQnVmZmVyQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCXRoaXMuZXZlbnQgPSBudWxsOwotCXJldHVybiBidWZmZXI7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBkZWxldGVCdWZmZXIoSUJ1ZmZlciBidWZmZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlidWZmZXIucmVtb3ZlQnVmZmVyQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCUlSZXNvdXJjZSByZXNvdXJjZSA9IGJ1ZmZlci5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQlkZWxldGVSZXNvdXJjZShyZXNvdXJjZSk7Ci0JfQotfQotLyoqCi0gKiBAc2VlIFJlZ3Jlc3Npb25UZXN0U3VpdGUjc2V0VXBTdWl0ZSgpCi0gKi8KLXB1YmxpYyB2b2lkIHNldFVwU3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQlzdXBlci5zZXRVcFN1aXRlKCk7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7IiJ9LCAiIik7Ci0JCXRoaXMuY3JlYXRlRm9sZGVyKCJQL3gveSIpOwotCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCX0KLX0KLQotLyoqCi0gKiBAc2VlIFRlc3RDYXNlI3RlYXJEb3duU3VpdGUoKQotICovCi1wdWJsaWMgdm9pZCB0ZWFyRG93blN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0Jc3VwZXIudGVhckRvd25TdWl0ZSgpOwotCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgU3VpdGUoQnVmZmVyVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQotCXN1aXRlLmFkZFRlc3QobmV3IEJ1ZmZlclRlc3RzKCJ0ZXN0QXBwZW5kIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEJ1ZmZlclRlc3RzKCJ0ZXN0QXBwZW5kUmVhZE9ubHkiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQnVmZmVyVGVzdHMoInRlc3RDbG9zZSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBCdWZmZXJUZXN0cygidGVzdEdldENoYXIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQnVmZmVyVGVzdHMoInRlc3RHZXRMZW5ndGgiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQnVmZmVyVGVzdHMoInRlc3RHZXRUZXh0IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEJ1ZmZlclRlc3RzKCJ0ZXN0R2V0VW5kZXJseWluZ1Jlc291cmNlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEJ1ZmZlclRlc3RzKCJ0ZXN0SW5zZXJ0QmVnaW5uaW5nIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEJ1ZmZlclRlc3RzKCJ0ZXN0SW5zZXJ0TWlkZGxlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEJ1ZmZlclRlc3RzKCJ0ZXN0SW5zZXJ0RW5kIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEJ1ZmZlclRlc3RzKCJ0ZXN0UmVwbGFjZUJlZ2lubmluZyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBCdWZmZXJUZXN0cygidGVzdFJlcGxhY2VNaWRkbGUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQnVmZmVyVGVzdHMoInRlc3RSZXBsYWNlRW5kIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEJ1ZmZlclRlc3RzKCJ0ZXN0RGVsZXRlQmVnaW5uaW5nIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEJ1ZmZlclRlc3RzKCJ0ZXN0RGVsZXRlTWlkZGxlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEJ1ZmZlclRlc3RzKCJ0ZXN0RGVsZXRlRW5kIikpOwotCi0Jc3VpdGUuYWRkVGVzdChuZXcgQnVmZmVyVGVzdHMoInRlc3RDcmVhdGVJbXBvcnQiKSk7Ci0JCi0JcmV0dXJuIHN1aXRlOwotfQotLyoqCi0gKiBUZXN0cyBhcHBlbmRpbmcgdG8gYSBidWZmZXIuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RBcHBlbmQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUJ1ZmZlciBidWZmZXIgPSB0aGlzLmNyZWF0ZUJ1ZmZlcigKLQkJIlAveC95L0EuamF2YSIsCi0JCSJwYWNrYWdlIHgueTtcbiIgKwotCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCSJ9IgotCSk7Ci0JdHJ5IHsKLQkJaW50IG9sZExlbmd0aD0gYnVmZmVyLmdldExlbmd0aCgpOwotCQlidWZmZXIuYXBwZW5kKCJcbmNsYXNzIEIge30iKTsKLQkJYXNzZXJ0QnVmZmVyRXZlbnQob2xkTGVuZ3RoLCAwLCAiXG5jbGFzcyBCIHt9Iik7Ci0JCWFzc2VydFNvdXJjZUVxdWFscygKLQkJCSJ1bmV4cGVjdGVkIGJ1ZmZlciBjb250ZW50cyIsCi0JCQkicGFja2FnZSB4Lnk7XG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJCSJ9XG4iICsKLQkJCSJjbGFzcyBCIHt9IiwKLQkJCWJ1ZmZlci5nZXRDb250ZW50cygpCi0JCSk7Ci0JCWFzc2VydFRydWUoInNob3VsZCBoYXZlIHVuc2F2ZWQgY2hhbmdlcyIsIGJ1ZmZlci5oYXNVbnNhdmVkQ2hhbmdlcygpKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZUJ1ZmZlcihidWZmZXIpOwotCX0KLX0KLS8qKgotICogVGVzdHMgYXBwZW5kaW5nIHRvIGEgcmVhZC1vbmx5IGJ1ZmZlci4KLSAqLwotcHVibGljIHZvaWQgdGVzdEFwcGVuZFJlYWRPbmx5KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUlCdWZmZXIgYnVmZmVyID0gdGhpcy5jcmVhdGVCdWZmZXIoCi0JCSJQL3gveS9BLmphdmEiLAotCQkicGFja2FnZSB4Lnk7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkifSIKLQkpOwotCXRyeSB7Ci0JCWJ1ZmZlci5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKS5zZXRSZWFkT25seSh0cnVlKTsKLQkJYnVmZmVyLmFwcGVuZCgiXG5jbGFzcyBCIHt9Iik7Ci0JCWFzc2VydFRydWUoInVuZXhwZWN0ZWQgZXZlbnQiLCB0aGlzLmV2ZW50ID09IG51bGwpOwotCQlhc3NlcnRTb3VyY2VFcXVhbHMoCi0JCQkidW5leHBlY3RlZCBidWZmZXIgY29udGVudHMiLAotCQkJInBhY2thZ2UgeC55O1xuIiArCi0JCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCQkifSIsCi0JCQlidWZmZXIuZ2V0Q29udGVudHMoKQotCQkpOwotCQlhc3NlcnRUcnVlKCJzaG91bGQgbm90IGhhdmUgdW5zYXZlZCBjaGFuZ2VzIiwgIWJ1ZmZlci5oYXNVbnNhdmVkQ2hhbmdlcygpKTsKLQl9IGZpbmFsbHkgewotCQlidWZmZXIuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkuc2V0UmVhZE9ubHkoZmFsc2UpOwotCQl0aGlzLmRlbGV0ZUJ1ZmZlcihidWZmZXIpOwotCX0KLX0KLXB1YmxpYyB2b2lkIHRlc3RDbG9zZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlJQnVmZmVyIGJ1ZmZlciA9IHRoaXMuY3JlYXRlQnVmZmVyKAotCQkiUC94L3kvQS5qYXZhIiwKLQkJInBhY2thZ2UgeC55O1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJIn0iCi0JKTsKLQl0cnkgewotCQlidWZmZXIuY2xvc2UoKTsKLQkJYXNzZXJ0QnVmZmVyRXZlbnQoMCwgMCwgbnVsbCk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVCdWZmZXIoYnVmZmVyKTsKLQl9Ci19Ci0KLQotLyoqCi0gKiBUZXN0cyBnZXR0aW5nIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIG9mIGEgYnVmZmVyLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0R2V0VW5kZXJseWluZ1Jlc291cmNlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUlCdWZmZXIgYnVmZmVyID0gdGhpcy5jcmVhdGVCdWZmZXIoCi0JCSJQL3gveS9BLmphdmEiLAotCQkicGFja2FnZSB4Lnk7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkifSIKLQkpOwotCUlDb21waWxhdGlvblVuaXQgY29weSA9IG51bGw7Ci0JdHJ5IHsKLQkJSUZpbGUgZmlsZSA9IHRoaXMuZ2V0RmlsZSgiUC94L3kvQS5qYXZhIik7Ci0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCB1bmRlcmx5aW5nIHJlc291cmNlIiwgZmlsZSwgYnVmZmVyLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpKTsKLQkJCi0JCWNvcHkgPSAoSUNvbXBpbGF0aW9uVW5pdCl0aGlzLmdldENvbXBpbGF0aW9uVW5pdCgiUC94L3kvQS5qYXZhIikuZ2V0V29ya2luZ0NvcHkoKTsKLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHVuZGVybHlpbmcgcmVzb3VyY2UgMiIsIG51bGwsIGNvcHkuZ2V0QnVmZmVyKCkuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlQnVmZmVyKGJ1ZmZlcik7Ci0JCWlmIChjb3B5ICE9IG51bGwpIHsKLQkJCWNvcHkuZGVzdHJveSgpOwotCQl9Ci0JfQotfQotLyoqCi0gKiBUZXN0cyBkZWxldGluZyB0ZXh0IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBidWZmZXIuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3REZWxldGVCZWdpbm5pbmcoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUJ1ZmZlciBidWZmZXIgPSB0aGlzLmNyZWF0ZUJ1ZmZlcigKLQkJIlAveC95L0EuamF2YSIsCi0JCSJwYWNrYWdlIHgueTtcbiIgKwotCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCSJ9IgotCSk7Ci0JdHJ5IHsKLQkJYnVmZmVyLnJlcGxhY2UoMCwgMTMsICIiKTsKLQkJYXNzZXJ0QnVmZmVyRXZlbnQoMCwgMTMsIG51bGwpOwotCQlhc3NlcnRTb3VyY2VFcXVhbHMoCi0JCQkidW5leHBlY3RlZCBidWZmZXIgY29udGVudHMiLAotCQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkJIn0iLAotCQkJYnVmZmVyLmdldENvbnRlbnRzKCkKLQkJKTsKLQkJYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgdW5zYXZlZCBjaGFuZ2VzIiwgYnVmZmVyLmhhc1Vuc2F2ZWRDaGFuZ2VzKCkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlQnVmZmVyKGJ1ZmZlcik7Ci0JfQotfQotLyoqCi0gKiBUZXN0cyBkZWxldGluZyB0ZXh0IGluIHRoZSBtaWRkbGUgb2YgYSBidWZmZXIuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3REZWxldGVNaWRkbGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUJ1ZmZlciBidWZmZXIgPSB0aGlzLmNyZWF0ZUJ1ZmZlcigKLQkJIlAveC95L0EuamF2YSIsCi0JCSJwYWNrYWdlIHgueTtcbiIgKwotCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCSJ9IgotCSk7Ci0JdHJ5IHsKLQkJLy8gZGVsZXRlICJwdWJsaWMgIgotCQlidWZmZXIucmVwbGFjZSgxMywgNywgIiIpOwotCQlhc3NlcnRCdWZmZXJFdmVudCgxMywgNywgbnVsbCk7Ci0JCWFzc2VydFNvdXJjZUVxdWFscygKLQkJCSJ1bmV4cGVjdGVkIGJ1ZmZlciBjb250ZW50cyIsCi0JCQkicGFja2FnZSB4Lnk7XG4iICsKLQkJCSJjbGFzcyBBIHtcbiIgKwotCQkJIn0iLAotCQkJYnVmZmVyLmdldENvbnRlbnRzKCkKLQkJKTsKLQkJYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgdW5zYXZlZCBjaGFuZ2VzIiwgYnVmZmVyLmhhc1Vuc2F2ZWRDaGFuZ2VzKCkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlQnVmZmVyKGJ1ZmZlcik7Ci0JfQotfQotLyoqCi0gKiBUZXN0cyBkZWxldGluZyB0ZXh0IGF0IHRoZSBlbmQgb2YgYSBidWZmZXIuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3REZWxldGVFbmQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUJ1ZmZlciBidWZmZXIgPSB0aGlzLmNyZWF0ZUJ1ZmZlcigKLQkJIlAveC95L0EuamF2YSIsCi0JCSJwYWNrYWdlIHgueTtcbiIgKwotCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCSJ9IgotCSk7Ci0JdHJ5IHsKLQkJLy8gZGVsZXRlICJwdWJsaWMgY2xhc3MgQSB7XG59IgotCQlidWZmZXIucmVwbGFjZSgxMywgMTgsICIiKTsKLQkJYXNzZXJ0QnVmZmVyRXZlbnQoMTMsIDE4LCBudWxsKTsKLQkJYXNzZXJ0U291cmNlRXF1YWxzKAotCQkJInVuZXhwZWN0ZWQgYnVmZmVyIGNvbnRlbnRzIiwKLQkJCSJwYWNrYWdlIHgueTtcbiIsCi0JCQlidWZmZXIuZ2V0Q29udGVudHMoKQotCQkpOwotCQlhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSB1bnNhdmVkIGNoYW5nZXMiLCBidWZmZXIuaGFzVW5zYXZlZENoYW5nZXMoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVCdWZmZXIoYnVmZmVyKTsKLQl9Ci19Ci0vKioKLSAqIFRlc3RzIHRoZSBidWZmZXIgY2hhciByZXRyaWV2YWwgdmlhIHNvdXJjZSBwb3NpdGlvbiAKLSAqLwotcHVibGljIHZvaWQgdGVzdEdldENoYXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUJ1ZmZlciBidWZmZXIgPSB0aGlzLmNyZWF0ZUJ1ZmZlcigKLQkJIlAveC95L0EuamF2YSIsCi0JCSJwYWNrYWdlIHgueTtcbiIgKwotCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCSJ9IgotCSk7Ci0JdHJ5IHsKLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGNoYXIgYXQgcG9zaXRpb24gMTciLCAnaScsIGJ1ZmZlci5nZXRDaGFyKDE3KSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVCdWZmZXIoYnVmZmVyKTsKLQl9Ci19Ci0vKioKLSAqIFRlc3RzIHRoZSBidWZmZXIgZ2V0TGVuZ3RoKCkgCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXRMZW5ndGgoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUJ1ZmZlciBidWZmZXIgPSB0aGlzLmNyZWF0ZUJ1ZmZlcigKLQkJIlAveC95L0EuamF2YSIsCi0JCSJwYWNrYWdlIHgueTtcbiIgKwotCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCSJ9IgotCSk7Ci0JdHJ5IHsKLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGxlbmd0aCIsIDMxLCBidWZmZXIuZ2V0TGVuZ3RoKCkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlQnVmZmVyKGJ1ZmZlcik7Ci0JfQotfQotLyoqCi0gKiBUZXN0cyB0aGUgYnVmZmVyIHRleHQgcmV0cmlldmFsIHZpYSBzb3VyY2UgcG9zaXRpb24gCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXRUZXh0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUlCdWZmZXIgYnVmZmVyID0gdGhpcy5jcmVhdGVCdWZmZXIoCi0JCSJQL3gveS9BLmphdmEiLAotCQkicGFja2FnZSB4Lnk7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkifSIKLQkpOwotCXRyeSB7Ci0JCWFzc2VydFNvdXJjZUVxdWFscygiVW5leHBlY3RlZCB0ZXh0ICgxKSIsICJwIiwgYnVmZmVyLmdldFRleHQoMCwgMSkpOwotCQlhc3NlcnRTb3VyY2VFcXVhbHMoIlVuZXhwZWN0ZWQgdGV4dCAoMikiLCAicHVibGljIiwgYnVmZmVyLmdldFRleHQoMTMsIDYpKTsKLQkJYXNzZXJ0U291cmNlRXF1YWxzKCJVbmV4cGVjdGVkIHRleHQgKDMpIiwgIiIsIGJ1ZmZlci5nZXRUZXh0KDEwLCAwKSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVCdWZmZXIoYnVmZmVyKTsKLQl9Ci19Ci0vKioKLSAqIFRlc3RzIGluc2VydGluZyB0ZXh0IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBidWZmZXIuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RJbnNlcnRCZWdpbm5pbmcoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUJ1ZmZlciBidWZmZXIgPSB0aGlzLmNyZWF0ZUJ1ZmZlcigKLQkJIlAveC95L0EuamF2YSIsCi0JCSJwYWNrYWdlIHgueTtcbiIgKwotCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCSJ9IgotCSk7Ci0JdHJ5IHsKLQkJYnVmZmVyLnJlcGxhY2UoMCwgMCwgIi8qIGNvcHlyaWdodCBteWNvbXBhbnkgKi9cbiIpOwotCQlhc3NlcnRCdWZmZXJFdmVudCgwLCAwLCAiLyogY29weXJpZ2h0IG15Y29tcGFueSAqL1xuIik7Ci0JCWFzc2VydFNvdXJjZUVxdWFscygKLQkJCSJ1bmV4cGVjdGVkIGJ1ZmZlciBjb250ZW50cyIsCi0JCQkiLyogY29weXJpZ2h0IG15Y29tcGFueSAqL1xuIiArCi0JCQkicGFja2FnZSB4Lnk7XG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJCSJ9IiwKLQkJCWJ1ZmZlci5nZXRDb250ZW50cygpCi0JCSk7Ci0JCWFzc2VydFRydWUoInNob3VsZCBoYXZlIHVuc2F2ZWQgY2hhbmdlcyIsIGJ1ZmZlci5oYXNVbnNhdmVkQ2hhbmdlcygpKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZUJ1ZmZlcihidWZmZXIpOwotCX0KLX0KLS8qKgotICogVGVzdHMgcmVwbGFjaW5nIHRleHQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGJ1ZmZlci4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJlcGxhY2VCZWdpbm5pbmcoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUJ1ZmZlciBidWZmZXIgPSB0aGlzLmNyZWF0ZUJ1ZmZlcigKLQkJIlAveC95L0EuamF2YSIsCi0JCSJwYWNrYWdlIHgueTtcbiIgKwotCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCSJ9IgotCSk7Ci0JdHJ5IHsKLQkJYnVmZmVyLnJlcGxhY2UoMCwgMTMsICJwYWNrYWdlIG90aGVyO1xuIik7Ci0JCWFzc2VydEJ1ZmZlckV2ZW50KDAsIDEzLCAicGFja2FnZSBvdGhlcjtcbiIpOwotCQlhc3NlcnRTb3VyY2VFcXVhbHMoCi0JCQkidW5leHBlY3RlZCBidWZmZXIgY29udGVudHMiLAotCQkJInBhY2thZ2Ugb3RoZXI7XG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJCSJ9IiwKLQkJCWJ1ZmZlci5nZXRDb250ZW50cygpCi0JCSk7Ci0JCWFzc2VydFRydWUoInNob3VsZCBoYXZlIHVuc2F2ZWQgY2hhbmdlcyIsIGJ1ZmZlci5oYXNVbnNhdmVkQ2hhbmdlcygpKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZUJ1ZmZlcihidWZmZXIpOwotCX0KLX0KLS8qKgotICogVGVzdHMgcmVwbGFjaW5nIHRleHQgaW4gdGhlIG1pZGRsZSBvZiBhIGJ1ZmZlci4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJlcGxhY2VNaWRkbGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUJ1ZmZlciBidWZmZXIgPSB0aGlzLmNyZWF0ZUJ1ZmZlcigKLQkJIlAveC95L0EuamF2YSIsCi0JCSJwYWNrYWdlIHgueTtcbiIgKwotCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCSJ9IgotCSk7Ci0JdHJ5IHsKLQkJLy8gcmVwbGFjZSAicHVibGljIGNsYXNzIEEiIGFmdGVyIHRoZSBcbiBvZiBwYWNrYWdlIHN0YXRlbWVudAotCQlidWZmZXIucmVwbGFjZSgxMywgMTQsICJwdWJsaWMgY2xhc3MgQiIpOwotCQlhc3NlcnRCdWZmZXJFdmVudCgxMywgMTQsICJwdWJsaWMgY2xhc3MgQiIpOwotCQlhc3NlcnRTb3VyY2VFcXVhbHMoCi0JCQkidW5leHBlY3RlZCBidWZmZXIgY29udGVudHMiLAotCQkJInBhY2thZ2UgeC55O1xuIiArCi0JCQkicHVibGljIGNsYXNzIEIge1xuIiArCi0JCQkifSIsCi0JCQlidWZmZXIuZ2V0Q29udGVudHMoKQotCQkpOwotCQlhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSB1bnNhdmVkIGNoYW5nZXMiLCBidWZmZXIuaGFzVW5zYXZlZENoYW5nZXMoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVCdWZmZXIoYnVmZmVyKTsKLQl9Ci19Ci0vKioKLSAqIFRlc3RzIHJlcGxhY2luZyB0ZXh0IGF0IHRoZSBlbmQgb2YgYSBidWZmZXIuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlRW5kKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUlCdWZmZXIgYnVmZmVyID0gdGhpcy5jcmVhdGVCdWZmZXIoCi0JCSJQL3gveS9BLmphdmEiLAotCQkicGFja2FnZSB4Lnk7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkifSIKLQkpOwotCXRyeSB7Ci0JCS8vIHJlcGxhY2UgIn0iIGF0IHRoZSBlbmQgb2YgY3Ugd2l0aCAifVxuIgotCQlpbnQgZW5kID0gYnVmZmVyLmdldExlbmd0aCgpOwotCQlidWZmZXIucmVwbGFjZShlbmQtMSwgMSwgIn1cbiIpOwotCQlhc3NlcnRCdWZmZXJFdmVudChlbmQtMSwgMSwgIn1cbiIpOwotCQlhc3NlcnRTb3VyY2VFcXVhbHMoCi0JCQkidW5leHBlY3RlZCBidWZmZXIgY29udGVudHMiLAotCQkJInBhY2thZ2UgeC55O1xuIiArCi0JCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCQkifVxuIiwKLQkJCWJ1ZmZlci5nZXRDb250ZW50cygpCi0JCSk7Ci0JCWFzc2VydFRydWUoInNob3VsZCBoYXZlIHVuc2F2ZWQgY2hhbmdlcyIsIGJ1ZmZlci5oYXNVbnNhdmVkQ2hhbmdlcygpKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZUJ1ZmZlcihidWZmZXIpOwotCX0KLX0KLS8qKgotICogVGVzdHMgaW5zZXJ0aW5nIHRleHQgaW4gdGhlIG1pZGRsZSBvZiBhIGJ1ZmZlci4KLSAqLwotcHVibGljIHZvaWQgdGVzdEluc2VydE1pZGRsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlJQnVmZmVyIGJ1ZmZlciA9IHRoaXMuY3JlYXRlQnVmZmVyKAotCQkiUC94L3kvQS5qYXZhIiwKLQkJInBhY2thZ2UgeC55O1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJIn0iCi0JKTsKLQl0cnkgewotCQkvLyBpbnNlcnQgYWZ0ZXIgdGhlIFxuIG9mIHBhY2thZ2Ugc3RhdGVtZW50Ci0JCWJ1ZmZlci5yZXBsYWNlKDEzLCAwLCAiLyogY2xhc3MgY29tbWVudCAqL1xuIik7Ci0JCWFzc2VydEJ1ZmZlckV2ZW50KDEzLCAwLCAiLyogY2xhc3MgY29tbWVudCAqL1xuIik7Ci0JCWFzc2VydFNvdXJjZUVxdWFscygKLQkJCSJ1bmV4cGVjdGVkIGJ1ZmZlciBjb250ZW50cyIsCi0JCQkicGFja2FnZSB4Lnk7XG4iICsKLQkJCSIvKiBjbGFzcyBjb21tZW50ICovXG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJCSJ9IiwKLQkJCWJ1ZmZlci5nZXRDb250ZW50cygpCi0JCSk7Ci0JCWFzc2VydFRydWUoInNob3VsZCBoYXZlIHVuc2F2ZWQgY2hhbmdlcyIsIGJ1ZmZlci5oYXNVbnNhdmVkQ2hhbmdlcygpKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZUJ1ZmZlcihidWZmZXIpOwotCX0KLX0KLS8qKgotICogVGVzdHMgaW5zZXJ0aW5nIHRleHQgYXQgdGhlIGVuZCBvZiBhIGJ1ZmZlci4KLSAqLwotcHVibGljIHZvaWQgdGVzdEluc2VydEVuZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlJQnVmZmVyIGJ1ZmZlciA9IHRoaXMuY3JlYXRlQnVmZmVyKAotCQkiUC94L3kvQS5qYXZhIiwKLQkJInBhY2thZ2UgeC55O1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJIn0iCi0JKTsKLQl0cnkgewotCQkvLyBpbnNlcnQgYWZ0ZXIgdGhlIFxuIG9mIHBhY2thZ2Ugc3RhdGVtZW50Ci0JCWludCBlbmQgPSBidWZmZXIuZ2V0TGVuZ3RoKCk7Ci0JCWJ1ZmZlci5yZXBsYWNlKGVuZCwgMCwgIlxuY2xhc3MgQiB7fSIpOwotCQlhc3NlcnRCdWZmZXJFdmVudChlbmQsIDAsICJcbmNsYXNzIEIge30iKTsKLQkJYXNzZXJ0U291cmNlRXF1YWxzKAotCQkJInVuZXhwZWN0ZWQgYnVmZmVyIGNvbnRlbnRzIiwKLQkJCSJwYWNrYWdlIHgueTtcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkJIn1cbiIgKwotCQkJImNsYXNzIEIge30iLAotCQkJYnVmZmVyLmdldENvbnRlbnRzKCkKLQkJKTsKLQkJYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgdW5zYXZlZCBjaGFuZ2VzIiwgYnVmZmVyLmhhc1Vuc2F2ZWRDaGFuZ2VzKCkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlQnVmZmVyKGJ1ZmZlcik7Ci0JfQotfQotCi0vKioKLSAqIFRlc3RzIHJlcGxhY2luZyB0ZXh0IHdpdGhpbiBhIGJ1ZmZlciB1c2luZyBhIGNyZWF0ZSBpbXBvcnQKLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIFBSICMxRzdBMFdJKS4KLSAqLwotcHVibGljIHZvaWQgdGVzdENyZWF0ZUltcG9ydCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlJRmlsZSBmaWxlID0gdGhpcy5jcmVhdGVGaWxlKAotCQkiUC94L3kvQS5qYXZhIiwKLQkJInBhY2thZ2UgeC55O1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJIn0iCi0JKTsKLQlJQ29tcGlsYXRpb25Vbml0IGNvcHkgPSBudWxsOwotCUlCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQl0cnkgewotCQljb3B5ID0gKElDb21waWxhdGlvblVuaXQpdGhpcy5nZXRDb21waWxhdGlvblVuaXQoIlAveC95L0EuamF2YSIpLmdldFdvcmtpbmdDb3B5KCk7Ci0JCWJ1ZmZlciA9IGNvcHkuZ2V0QnVmZmVyKCk7Ci0JCWJ1ZmZlci5hZGRCdWZmZXJDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCWNvcHkuY3JlYXRlSW1wb3J0KCJqYXZhLmlvLklPRXhjZXB0aW9uIiwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydEJ1ZmZlckV2ZW50KDEzLCAwLCAiaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247IiArICJcbiIpOyAvLyBBLmphdmEgaGFzIGEgXG4gbGluZSBkZWxpbWl0ZXIKLQl9IGZpbmFsbHkgewotCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCWJ1ZmZlci5yZW1vdmVCdWZmZXJDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJaWYgKGNvcHkgIT0gbnVsbCkgewotCQkJY29weS5kZXN0cm95KCk7Ci0JCX0KLQkJZGVsZXRlUmVzb3VyY2UoZmlsZSk7Ci0JfQotfQotLyoqCi0gKiBWZXJpZnkgdGhlIGJ1ZmZlciBjaGFuZ2VkIGV2ZW50LgotICogVGhlIGdpdmVuIHRleHQgbXVzdCBjb250YWluICdcbicgbGluZSBzZXBhcmF0b3JzLgotICovCi1wcm90ZWN0ZWQgdm9pZCBhc3NlcnRCdWZmZXJFdmVudChpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdGV4dCkgewotCWFzc2VydFRydWUoImV2ZW50IHNob3VsZCBub3QgYmUgbnVsbCIsIHRoaXMuZXZlbnQgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIG9mZnNldCIsIG9mZnNldCwgdGhpcy5ldmVudC5nZXRPZmZzZXQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIGxlbmd0aCIsIGxlbmd0aCwgdGhpcy5ldmVudC5nZXRMZW5ndGgoKSk7Ci0JaWYgKHRleHQgPT0gbnVsbCkgewotCQlhc3NlcnRUcnVlKCJ0ZXh0IHNob3VsZCBiZSBudWxsIiwgdGhpcy5ldmVudC5nZXRUZXh0KCkgPT0gbnVsbCk7Ci0JfSBlbHNlIHsKLQkJYXNzZXJ0U291cmNlRXF1YWxzKCJ1bmV4cGVjdGVkIHRleHQiLCB0ZXh0LCB0aGlzLmV2ZW50LmdldFRleHQoKSk7Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0NsYXNzTmFtZVRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvQ2xhc3NOYW1lVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY2MDFhNC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvQ2xhc3NOYW1lVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotLyoqCi0gKiBUZXN0IHJldHJpZXZpbmcgdHlwZXMgYnkgdGhlaXIgbmFtZS4KLSAqLwotcHVibGljIGNsYXNzIENsYXNzTmFtZVRlc3RzIGV4dGVuZHMgTW9kaWZ5aW5nUmVzb3VyY2VUZXN0cyB7Ci0KLQotCXB1YmxpYyBDbGFzc05hbWVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgdGhhdCBhIHR5cGUgaW4gYSBqYXIgd2l0aCBhIG5hbWUgZW5kaW5nIHdpdGggJCBjYW4gYmUgcmV0cmlldmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc05hbWVXaXRoRG9sbGFyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlieXRlW10gdGFiID0gbmV3IGJ5dGVbMzcyXTsKLQkJCXRhYlswXT04MDsKLQkJCXRhYlsxXT03NTsKLQkJCXRhYlsyXT0zOwotCQkJdGFiWzNdPTQ7Ci0JCQl0YWJbNF09MjA7Ci0JCQl0YWJbNV09MDsKLQkJCXRhYls2XT04OwotCQkJdGFiWzddPTA7Ci0JCQl0YWJbOF09ODsKLQkJCXRhYls5XT0wOwotCQkJdGFiWzEwXT0tNjM7Ci0JCQl0YWJbMTFdPTg4OwotCQkJdGFiWzEyXT0tMTAyOwotCQkJdGFiWzEzXT00NDsKLQkJCXRhYlsxNF09MDsKLQkJCXRhYlsxNV09MDsKLQkJCXRhYlsxNl09MDsKLQkJCXRhYlsxN109MDsKLQkJCXRhYlsxOF09MDsKLQkJCXRhYlsxOV09MDsKLQkJCXRhYlsyMF09MDsKLQkJCXRhYlsyMV09MDsKLQkJCXRhYlsyMl09MDsKLQkJCXRhYlsyM109MDsKLQkJCXRhYlsyNF09MDsKLQkJCXRhYlsyNV09MDsKLQkJCXRhYlsyNl09MTE7Ci0JCQl0YWJbMjddPTA7Ci0JCQl0YWJbMjhdPTA7Ci0JCQl0YWJbMjldPTA7Ci0JCQl0YWJbMzBdPTExMjsKLQkJCXRhYlszMV09NDk7Ci0JCQl0YWJbMzJdPTQ3OwotCQkJdGFiWzMzXT02NTsKLQkJCXRhYlszNF09MzY7Ci0JCQl0YWJbMzVdPTQ2OwotCQkJdGFiWzM2XT05OTsKLQkJCXRhYlszN109MTA4OwotCQkJdGFiWzM4XT05NzsKLQkJCXRhYlszOV09MTE1OwotCQkJdGFiWzQwXT0xMTU7Ci0JCQl0YWJbNDFdPTkzOwotCQkJdGFiWzQyXT03ODsKLQkJCXRhYls0M109LTYzOwotCQkJdGFiWzQ0XT03NDsKLQkJCXRhYls0NV09LTYxOwotCQkJdGFiWzQ2XT02NDsKLQkJCXRhYls0N109MTY7Ci0JCQl0YWJbNDhdPTEyNTsKLQkJCXRhYls0OV09LTQ1OwotCQkJdGFiWzUwXT03NzsKLQkJCXRhYls1MV09LTc4OwotCQkJdGFiWzUyXT01MzsKLQkJCXRhYls1M109ODY7Ci0JCQl0YWJbNTRdPTkxOwotCQkJdGFiWzU1XT05OTsKLQkJCXRhYls1Nl09MTI3OwotCQkJdGFiWzU3XT02NDsKLQkJCXRhYls1OF09LTI0OwotCQkJdGFiWzU5XT0tOTU7Ci0JCQl0YWJbNjBdPTIxOwotCQkJdGFiWzYxXT0xMDY7Ci0JCQl0YWJbNjJdPS0xNjsKLQkJCXRhYls2M109LTg0OwotCQkJdGFiWzY0XT04OwotCQkJdGFiWzY1XT0tOTE7Ci0JCQl0YWJbNjZdPS00ODsKLQkJCXRhYls2N109ODM7Ci0JCQl0YWJbNjhdPTQ4OwotCQkJdGFiWzY5XT0tMTIxOwotCQkJdGFiWzcwXT03NDsKLQkJCXRhYls3MV09LTE3OwotCQkJdGFiWzcyXT0tMTAxOwotCQkJdGFiWzczXT0tNzI7Ci0JCQl0YWJbNzRdPS00MjsKLQkJCXRhYls3NV09NDU7Ci0JCQl0YWJbNzZdPTQ5OwotCQkJdGFiWzc3XT00MzsKLQkJCXRhYls3OF09NDk7Ci0JCQl0YWJbNzldPS0xMTsKLQkJCXRhYls4MF09LTY5OwotCQkJdGFiWzgxXT0tMTI7Ci0JCQl0YWJbODJdPTg0OwotCQkJdGFiWzgzXT0tMTY7Ci0JCQl0YWJbODRdPS0zMjsKLQkJCXRhYls4NV09NzsKLQkJCXRhYls4Nl09LTg7Ci0JCQl0YWJbODddPTgxOwotCQkJdGFiWzg4XT0tMzA7Ci0JCQl0YWJbODldPTEwODsKLQkJCXRhYls5MF09MTI7Ci0JCQl0YWJbOTFdPTQyOwotCQkJdGFiWzkyXT0tNTA7Ci0JCQl0YWJbOTNdPS0zMTsKLQkJCXRhYls5NF09NjE7Ci0JCQl0YWJbOTVdPTEwMjsKLQkJCXRhYls5Nl09LTI2OwotCQkJdGFiWzk3XT0tNjc7Ci0JCQl0YWJbOThdPTEyMTsKLQkJCXRhYls5OV09LTEzOwotCQkJdGFiWzEwMF09LTE1OwotCQkJdGFiWzEwMV09LTc7Ci0JCQl0YWJbMTAyXT0tMTA7Ci0JCQl0YWJbMTAzXT0xNDsKLQkJCXRhYlsxMDRdPS0xMjc7Ci0JCQl0YWJbMTA1XT00MTsKLQkJCXRhYlsxMDZdPS0xMjI7Ci0JCQl0YWJbMTA3XT00OwotCQkJdGFiWzEwOF09LTE7Ci0JCQl0YWJbMTA5XT0tMTU7Ci0JCQl0YWJbMTEwXT02MDsKLQkJCXRhYlsxMTFdPS05ODsKLQkJCXRhYlsxMTJdPS0xMTU7Ci0JCQl0YWJbMTEzXT0zNjsKLQkJCXRhYlsxMTRdPS0xMjA7Ci0JCQl0YWJbMTE1XT00ODsKLQkJCXRhYlsxMTZdPS00MDsKLQkJCXRhYlsxMTddPS04ODsKLQkJCXRhYlsxMThdPTEwMzsKLQkJCXRhYlsxMTldPTIxOwotCQkJdGFiWzEyMF09MjM7Ci0JCQl0YWJbMTIxXT0tODY7Ci0JCQl0YWJbMTIyXT05MjsKLQkJCXRhYlsxMjNdPS01NzsKLQkJCXRhYlsxMjRdPTEwNTsKLQkJCXRhYlsxMjVdPS03NDsKLQkJCXRhYlsxMjZdPS00NzsKLQkJCXRhYlsxMjddPTEyMTsKLQkJCXRhYlsxMjhdPTQ1OwotCQkJdGFiWzEyOV09MzM7Ci0JCQl0YWJbMTMwXT04OwotCQkJdGFiWzEzMV09LTYzOwotCQkJdGFiWzEzMl09LTkxOwotCQkJdGFiWzEzM109NDE7Ci0JCQl0YWJbMTM0XT03NzsKLQkJCXRhYlsxMzVdPTEyNTsKLQkJCXRhYlsxMzZdPTY5OwotCQkJdGFiWzEzN109MTY7Ci0JCQl0YWJbMTM4XT0tMjk7Ci0JCQl0YWJbMTM5XT0tNTU7Ci0JCQl0YWJbMTQwXT0tMTE4OwotCQkJdGFiWzE0MV09LTMyOwotCQkJdGFiWzE0Ml09LTUxOwotCQkJdGFiWzE0M109LTE5OwotCQkJdGFiWzE0NF09LTgzOwotCQkJdGFiWzE0NV09LTE4OwotCQkJdGFiWzE0Nl09LTYzOwotCQkJdGFiWzE0N109NzE7Ci0JCQl0YWJbMTQ4XT0xNjsKLQkJCXRhYlsxNDldPS02MjsKLQkJCXRhYlsxNTBdPTY3OwotCQkJdGFiWzE1MV09LTEwNTsKLQkJCXRhYlsxNTJdPS00ODsKLQkJCXRhYlsxNTNdPTc5OwotCQkJdGFiWzE1NF09NzY7Ci0JCQl0YWJbMTU1XT0tODc7Ci0JCQl0YWJbMTU2XT0tODE7Ci0JCQl0YWJbMTU3XT0tNzM7Ci0JCQl0YWJbMTU4XT0xNTsKLQkJCXRhYlsxNTldPS0xMDM7Ci0JCQl0YWJbMTYwXT0tODI7Ci0JCQl0YWJbMTYxXT0xMTA7Ci0JCQl0YWJbMTYyXT04NDsKLQkJCXRhYlsxNjNdPTg2OwotCQkJdGFiWzE2NF09MTA0OwotCQkJdGFiWzE2NV09NjY7Ci0JCQl0YWJbMTY2XT0tMTA4OwotCQkJdGFiWzE2N109LTQwOwotCQkJdGFiWzE2OF09OTI7Ci0JCQl0YWJbMTY5XT0yMTsKLQkJCXRhYlsxNzBdPTQzOwotCQkJdGFiWzE3MV09ODU7Ci0JCQl0YWJbMTcyXT0yNTsKLQkJCXRhYlsxNzNdPS00MTsKLQkJCXRhYlsxNzRdPS03MzsKLQkJCXRhYlsxNzVdPTY3OwotCQkJdGFiWzE3Nl09LTgxOwotCQkJdGFiWzE3N109LTY2OwotCQkJdGFiWzE3OF09NTU7Ci0JCQl0YWJbMTc5XT03OTsKLQkJCXRhYlsxODBdPTQ7Ci0JCQl0YWJbMTgxXT0tMTAzOwotCQkJdGFiWzE4Ml09NTI7Ci0JCQl0YWJbMTgzXT0xMjE7Ci0JCQl0YWJbMTg0XT0yMzsKLQkJCXRhYlsxODVdPTEyNDsKLQkJCXRhYlsxODZdPS0xODsKLQkJCXRhYlsxODddPS01MDsKLQkJCXRhYlsxODhdPTkwOwotCQkJdGFiWzE4OV09LTYyOwotCQkJdGFiWzE5MF09MTEyOwotCQkJdGFiWzE5MV09NjA7Ci0JCQl0YWJbMTkyXT03MzsKLQkJCXRhYlsxOTNdPTEyNjsKLQkJCXRhYlsxOTRdPTk5OwotCQkJdGFiWzE5NV09LTEwNTsKLQkJCXRhYlsxOTZdPTExNzsKLQkJCXRhYlsxOTddPTEwMTsKLQkJCXRhYlsxOThdPS01NDsKLQkJCXRhYlsxOTldPS03NTsKLQkJCXRhYlsyMDBdPTkxOwotCQkJdGFiWzIwMV09NDY7Ci0JCQl0YWJbMjAyXT0tNDY7Ci0JCQl0YWJbMjAzXT0tNzY7Ci0JCQl0YWJbMjA0XT0tMTE3OwotCQkJdGFiWzIwNV09MTsKLQkJCXRhYlsyMDZdPTMzOwotCQkJdGFiWzIwN109OTI7Ci0JCQl0YWJbMjA4XT0tMzg7Ci0JCQl0YWJbMjA5XT0xMDk7Ci0JCQl0YWJbMjEwXT0tMTA3OwotCQkJdGFiWzIxMV09LTIxOwotCQkJdGFiWzIxMl09LTEyMzsKLQkJCXRhYlsyMTNdPTExMzsKLQkJCXRhYlsyMTRdPTU1OwotCQkJdGFiWzIxNV09LTI4OwotCQkJdGFiWzIxNl09MTA4OwotCQkJdGFiWzIxN109MTE2OwotCQkJdGFiWzIxOF09LTI2OwotCQkJdGFiWzIxOV09LTYwOwotCQkJdGFiWzIyMF09NTY7Ci0JCQl0YWJbMjIxXT02NTsKLQkJCXRhYlsyMjJdPS0xMjE7Ci0JCQl0YWJbMjIzXT0tNjE7Ci0JCQl0YWJbMjI0XT05MzsKLQkJCXRhYlsyMjVdPTExNzsKLQkJCXRhYlsyMjZdPTY0OwotCQkJdGFiWzIyN109LTE4OwotCQkJdGFiWzIyOF09MjM7Ci0JCQl0YWJbMjI5XT03MDsKLQkJCXRhYlsyMzBdPS01NTsKLQkJCXRhYlsyMzFdPTkzOwotCQkJdGFiWzIzMl09LTUyOwotCQkJdGFiWzIzM109NzY7Ci0JCQl0YWJbMjM0XT0tNTI7Ci0JCQl0YWJbMjM1XT0tMjsKLQkJCXRhYlsyMzZdPS0yMzsKLQkJCXRhYlsyMzddPTE0OwotCQkJdGFiWzIzOF09MTIzOwotCQkJdGFiWzIzOV09LTgxOwotCQkJdGFiWzI0MF09LTUxOwotCQkJdGFiWzI0MV09NTg7Ci0JCQl0YWJbMjQyXT0xMDA7Ci0JCQl0YWJbMjQzXT0xMjsKLQkJCXRhYlsyNDRdPS0xMDI7Ci0JCQl0YWJbMjQ1XT0tOTU7Ci0JCQl0YWJbMjQ2XT0tNjQ7Ci0JCQl0YWJbMjQ3XT02MjsKLQkJCXRhYlsyNDhdPTk5OwotCQkJdGFiWzI0OV09LTE3OwotCQkJdGFiWzI1MF09OTE7Ci0JCQl0YWJbMjUxXT0tNjQ7Ci0JCQl0YWJbMjUyXT0xMjQ7Ci0JCQl0YWJbMjUzXT0tNjQ7Ci0JCQl0YWJbMjU0XT03NjsKLQkJCXRhYlsyNTVdPTU2OwotCQkJdGFiWzI1Nl09Njg7Ci0JCQl0YWJbMjU3XT0tNjU7Ci0JCQl0YWJbMjU4XT01MzsKLQkJCXRhYlsyNTldPTc5OwotCQkJdGFiWzI2MF09OTE7Ci0JCQl0YWJbMjYxXT0tNzc7Ci0JCQl0YWJbMjYyXT0tMTIwOwotCQkJdGFiWzI2M109LTExNDsKLQkJCXRhYlsyNjRdPTk0OwotCQkJdGFiWzI2NV09LTI7Ci0JCQl0YWJbMjY2XT04OTsKLQkJCXRhYlsyNjddPS0xMjU7Ci0JCQl0YWJbMjY4XT02MzsKLQkJCXRhYlsyNjldPTg2OwotCQkJdGFiWzI3MF09LTE1OwotCQkJdGFiWzI3MV09OTk7Ci0JCQl0YWJbMjcyXT0tMTE1OwotCQkJdGFiWzI3M109MjY7Ci0JCQl0YWJbMjc0XT0tNDM7Ci0JCQl0YWJbMjc1XT0tMTU7Ci0JCQl0YWJbMjc2XT0yMzsKLQkJCXRhYlsyNzddPTgwOwotCQkJdGFiWzI3OF09NzU7Ci0JCQl0YWJbMjc5XT03OwotCQkJdGFiWzI4MF09ODsKLQkJCXRhYlsyODFdPTEyMjsKLQkJCXRhYlsyODJdPS05MjsKLQkJCXRhYlsyODNdPTEwMzsKLQkJCXRhYlsyODRdPTE1OwotCQkJdGFiWzI4NV09LTIwOwotCQkJdGFiWzI4Nl09MDsKLQkJCXRhYlsyODddPTA7Ci0JCQl0YWJbMjg4XT0wOwotCQkJdGFiWzI4OV09Nzg7Ci0JCQl0YWJbMjkwXT0xOwotCQkJdGFiWzI5MV09MDsKLQkJCXRhYlsyOTJdPTA7Ci0JCQl0YWJbMjkzXT04MDsKLQkJCXRhYlsyOTRdPTc1OwotCQkJdGFiWzI5NV09MTsKLQkJCXRhYlsyOTZdPTI7Ci0JCQl0YWJbMjk3XT0yMDsKLQkJCXRhYlsyOThdPTA7Ci0JCQl0YWJbMjk5XT0yMDsKLQkJCXRhYlszMDBdPTA7Ci0JCQl0YWJbMzAxXT04OwotCQkJdGFiWzMwMl09MDsKLQkJCXRhYlszMDNdPTg7Ci0JCQl0YWJbMzA0XT0wOwotCQkJdGFiWzMwNV09LTYzOwotCQkJdGFiWzMwNl09ODg7Ci0JCQl0YWJbMzA3XT0tMTAyOwotCQkJdGFiWzMwOF09NDQ7Ci0JCQl0YWJbMzA5XT0xMjI7Ci0JCQl0YWJbMzEwXT0tOTI7Ci0JCQl0YWJbMzExXT0xMDM7Ci0JCQl0YWJbMzEyXT0xNTsKLQkJCXRhYlszMTNdPS0yMDsKLQkJCXRhYlszMTRdPTA7Ci0JCQl0YWJbMzE1XT0wOwotCQkJdGFiWzMxNl09MDsKLQkJCXRhYlszMTddPTc4OwotCQkJdGFiWzMxOF09MTsKLQkJCXRhYlszMTldPTA7Ci0JCQl0YWJbMzIwXT0wOwotCQkJdGFiWzMyMV09MTE7Ci0JCQl0YWJbMzIyXT0wOwotCQkJdGFiWzMyM109MDsKLQkJCXRhYlszMjRdPTA7Ci0JCQl0YWJbMzI1XT0wOwotCQkJdGFiWzMyNl09MDsKLQkJCXRhYlszMjddPTA7Ci0JCQl0YWJbMzI4XT0wOwotCQkJdGFiWzMyOV09MDsKLQkJCXRhYlszMzBdPTA7Ci0JCQl0YWJbMzMxXT0wOwotCQkJdGFiWzMzMl09MDsKLQkJCXRhYlszMzNdPTA7Ci0JCQl0YWJbMzM0XT0wOwotCQkJdGFiWzMzNV09MDsKLQkJCXRhYlszMzZdPTA7Ci0JCQl0YWJbMzM3XT0wOwotCQkJdGFiWzMzOF09MDsKLQkJCXRhYlszMzldPTExMjsKLQkJCXRhYlszNDBdPTQ5OwotCQkJdGFiWzM0MV09NDc7Ci0JCQl0YWJbMzQyXT02NTsKLQkJCXRhYlszNDNdPTM2OwotCQkJdGFiWzM0NF09NDY7Ci0JCQl0YWJbMzQ1XT05OTsKLQkJCXRhYlszNDZdPTEwODsKLQkJCXRhYlszNDddPTk3OwotCQkJdGFiWzM0OF09MTE1OwotCQkJdGFiWzM0OV09MTE1OwotCQkJdGFiWzM1MF09ODA7Ci0JCQl0YWJbMzUxXT03NTsKLQkJCXRhYlszNTJdPTU7Ci0JCQl0YWJbMzUzXT02OwotCQkJdGFiWzM1NF09MDsKLQkJCXRhYlszNTVdPTA7Ci0JCQl0YWJbMzU2XT0wOwotCQkJdGFiWzM1N109MDsKLQkJCXRhYlszNThdPTE7Ci0JCQl0YWJbMzU5XT0wOwotCQkJdGFiWzM2MF09MTsKLQkJCXRhYlszNjFdPTA7Ci0JCQl0YWJbMzYyXT01NzsKLQkJCXRhYlszNjNdPTA7Ci0JCQl0YWJbMzY0XT0wOwotCQkJdGFiWzM2NV09MDsKLQkJCXRhYlszNjZdPTM3OwotCQkJdGFiWzM2N109MTsKLQkJCXRhYlszNjhdPTA7Ci0JCQl0YWJbMzY5XT0wOwotCQkJdGFiWzM3MF09MDsKLQkJCXRhYlszNzFdPTA7Ci0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBjcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCQlJRmlsZSBqYXJGaWxlID0gY3JlYXRlRmlsZSgiUC9saWIuamFyIiwgdGFiKTsKLQkJCWphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXcgSUNsYXNzcGF0aEVudHJ5W10ge0phdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShqYXJGaWxlLmdldEZ1bGxQYXRoKCksIG51bGwsIG51bGwsIGZhbHNlKX0sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJamF2YVByb2plY3QuZmluZFR5cGUoInAxLkEkIik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCWFzc2VydFRydWUoZmFsc2UpOwotCQl9IGZpbmFsbHkgewotCQkJZGVsZXRlUHJvamVjdCgiUCIpOwotCQl9Ci0JfQotCS8qKgotCSAqIFRlc3RzIHRoYXQgYSBtZW1iZXIgdHlwZSBjYW4gYmUgcmV0cml2ZWQgdXNpbmcgYSBkb3QgcXVhbGlmaWVkIG5hbWUuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEZpbmRUeXBlV2l0aERvdCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyIifSwgIiIpOwotCQkJdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3AiKTsKLQkJCXRoaXMuY3JlYXRlRmlsZSgKLQkJCQkiL1AvcC9YLmphdmEiLCAKLQkJCQkicGFja2FnZSBwO1xuIiArCi0JCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJCSIgIHB1YmxpYyBjbGFzcyBZIHtcbiIgKwotCQkJCSIgIH1cbiIgKwotCQkJCSJ9IgotCQkJKTsKLQkJCUlUeXBlIHR5cGUgPSBqYXZhUHJvamVjdC5maW5kVHlwZSgicC5YLlkiKTsKLQkJCWFzc2VydEVxdWFscygKLQkJCQkiVW5leHBlY3RlZCB0eXBlIGZvdW5kIiwKLQkJCQkiY2xhc3MgWSBbaW4gWCBbaW4gWC5qYXZhIFtpbiBwIFtpbiBbcHJvamVjdCByb290XSBbaW4gUF1dXV1dIiwKLQkJCQl0eXBlID09IG51bGwgPyAibnVsbCIgOiB0eXBlLnRvU3RyaW5nKCkKLQkJCSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlkZWxldGVQcm9qZWN0KCJQIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyB0aGF0IGEgdHlwZSBpbiBhIGphciB3aXRoIGEgbmFtZSBlbmRpbmcgd2l0aCAkIGNhbiBiZSByZXRyaWV2ZWQuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNlYXJjaFR5cGVOYW1lSW5KYXJzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlieXRlW10gdGFiID0gbmV3IGJ5dGVbNDc4XTsKLQkJCXRhYlswXT04MDsKLQkJCXRhYlsxXT03NTsKLQkJCXRhYlsyXT0zOwotCQkJdGFiWzNdPTQ7Ci0JCQl0YWJbNF09MjA7Ci0JCQl0YWJbNV09MDsKLQkJCXRhYls2XT04OwotCQkJdGFiWzddPTA7Ci0JCQl0YWJbOF09ODsKLQkJCXRhYls5XT0wOwotCQkJdGFiWzEwXT0xOTsKLQkJCXRhYlsxMV09ODc7Ci0JCQl0YWJbMTJdPS05NTsKLQkJCXRhYlsxM109NDQ7Ci0JCQl0YWJbMTRdPTA7Ci0JCQl0YWJbMTVdPTA7Ci0JCQl0YWJbMTZdPTA7Ci0JCQl0YWJbMTddPTA7Ci0JCQl0YWJbMThdPTA7Ci0JCQl0YWJbMTldPTA7Ci0JCQl0YWJbMjBdPTA7Ci0JCQl0YWJbMjFdPTA7Ci0JCQl0YWJbMjJdPTA7Ci0JCQl0YWJbMjNdPTA7Ci0JCQl0YWJbMjRdPTA7Ci0JCQl0YWJbMjVdPTA7Ci0JCQl0YWJbMjZdPTk7Ci0JCQl0YWJbMjddPTA7Ci0JCQl0YWJbMjhdPTA7Ci0JCQl0YWJbMjldPTA7Ci0JCQl0YWJbMzBdPTExMjsKLQkJCXRhYlszMV09NDk7Ci0JCQl0YWJbMzJdPTQ3OwotCQkJdGFiWzMzXT0xMTI7Ci0JCQl0YWJbMzRdPTUwOwotCQkJdGFiWzM1XT00NzsKLQkJCXRhYlszNl09MTEyOwotCQkJdGFiWzM3XT01MTsKLQkJCXRhYlszOF09NDc7Ci0JCQl0YWJbMzldPTM7Ci0JCQl0YWJbNDBdPTA7Ci0JCQl0YWJbNDFdPTgwOwotCQkJdGFiWzQyXT03NTsKLQkJCXRhYls0M109NzsKLQkJCXRhYls0NF09ODsKLQkJCXRhYls0NV09MDsKLQkJCXRhYls0Nl09MDsKLQkJCXRhYls0N109MDsKLQkJCXRhYls0OF09MDsKLQkJCXRhYls0OV09MjsKLQkJCXRhYls1MF09MDsKLQkJCXRhYls1MV09MDsKLQkJCXRhYls1Ml09MDsKLQkJCXRhYls1M109MDsKLQkJCXRhYls1NF09MDsKLQkJCXRhYls1NV09MDsKLQkJCXRhYls1Nl09MDsKLQkJCXRhYls1N109ODA7Ci0JCQl0YWJbNThdPTc1OwotCQkJdGFiWzU5XT0zOwotCQkJdGFiWzYwXT00OwotCQkJdGFiWzYxXT0yMDsKLQkJCXRhYls2Ml09MDsKLQkJCXRhYls2M109ODsKLQkJCXRhYls2NF09MDsKLQkJCXRhYls2NV09ODsKLQkJCXRhYls2Nl09MDsKLQkJCXRhYls2N109MTk7Ci0JCQl0YWJbNjhdPTg3OwotCQkJdGFiWzY5XT0tOTU7Ci0JCQl0YWJbNzBdPTQ0OwotCQkJdGFiWzcxXT0wOwotCQkJdGFiWzcyXT0wOwotCQkJdGFiWzczXT0wOwotCQkJdGFiWzc0XT0wOwotCQkJdGFiWzc1XT0wOwotCQkJdGFiWzc2XT0wOwotCQkJdGFiWzc3XT0wOwotCQkJdGFiWzc4XT0wOwotCQkJdGFiWzc5XT0wOwotCQkJdGFiWzgwXT0wOwotCQkJdGFiWzgxXT0wOwotCQkJdGFiWzgyXT0wOwotCQkJdGFiWzgzXT0xNjsKLQkJCXRhYls4NF09MDsKLQkJCXRhYls4NV09MDsKLQkJCXRhYls4Nl09MDsKLQkJCXRhYls4N109MTEyOwotCQkJdGFiWzg4XT00OTsKLQkJCXRhYls4OV09NDc7Ci0JCQl0YWJbOTBdPTExMjsKLQkJCXRhYls5MV09NTA7Ci0JCQl0YWJbOTJdPTQ3OwotCQkJdGFiWzkzXT0xMTI7Ci0JCQl0YWJbOTRdPTUxOwotCQkJdGFiWzk1XT00NzsKLQkJCXRhYls5Nl09ODg7Ci0JCQl0YWJbOTddPTQ2OwotCQkJdGFiWzk4XT05OTsKLQkJCXRhYls5OV09MTA4OwotCQkJdGFiWzEwMF09OTc7Ci0JCQl0YWJbMTAxXT0xMTU7Ci0JCQl0YWJbMTAyXT0xMTU7Ci0JCQl0YWJbMTAzXT05MzsKLQkJCXRhYlsxMDRdPTc5OwotCQkJdGFiWzEwNV09LTUzOwotCQkJdGFiWzEwNl09Nzg7Ci0JCQl0YWJbMTA3XT0tNjE7Ci0JCQl0YWJbMTA4XT02NDsKLQkJCXRhYlsxMDldPTEyOwotCQkJdGFiWzExMF09Mjg7Ci0JCQl0YWJbMTExXT01NTsKLQkJCXRhYlsxMTJdPS04MTsKLQkJCXRhYlsxMTNdPS0xMTA7Ci0JCQl0YWJbMTE0XT02OwotCQkJdGFiWzExNV09ODsKLQkJCXRhYlsxMTZdPS0zOwotCQkJdGFiWzExN109MzsKLQkJCXRhYlsxMThdPTExMDsKLQkJCXRhYlsxMTldPTYwOwotCQkJdGFiWzEyMF09LTQ0OwotCQkJdGFiWzEyMV09LTgyOwotCQkJdGFiWzEyMl09MTA7Ci0JCQl0YWJbMTIzXT03MTsKLQkJCXRhYlsxMjRdPTE2OwotCQkJdGFiWzEyNV09MjM7Ci0JCQl0YWJbMTI2XT0zNjsKLQkJCXRhYlsxMjddPTc4OwotCQkJdGFiWzEyOF09ODE7Ci0JCQl0YWJbMTI5XT01NzsKLQkJCXRhYlsxMzBdPTIwOwotCQkJdGFiWzEzMV09Njk7Ci0JCQl0YWJbMTMyXT0tNjc7Ci0JCQl0YWJbMTMzXT0xMTA7Ci0JCQl0YWJbMTM0XT0tNjI7Ci0JCQl0YWJbMTM1XT0tNzQ7Ci0JCQl0YWJbMTM2XT0xMDg7Ci0JCQl0YWJbMTM3XT0tMTA3OwotCQkJdGFiWzEzOF09MTAyOwotCQkJdGFiWzEzOV09LTkzOwotCQkJdGFiWzE0MF09NTI7Ci0JCQl0YWJbMTQxXT0tMjc7Ci0JCQl0YWJbMTQyXT0tNjU7Ci0JCQl0YWJbMTQzXT01NjsKLQkJCXRhYlsxNDRdPTMzOwotCQkJdGFiWzE0NV09MTEzOwotCQkJdGFiWzE0Nl09LTMyOwotCQkJdGFiWzE0N109MzsKLQkJCXRhYlsxNDhdPS04OwotCQkJdGFiWzE0OV09NDA7Ci0JCQl0YWJbMTUwXT0tMTI0OwotCQkJdGFiWzE1MV09NTU7Ci0JCQl0YWJbMTUyXT0tMTE1OwotCQkJdGFiWzE1M109MDsKLQkJCXRhYlsxNTRdPTExNzsKLQkJCXRhYlsxNTVdPTM3OwotCQkJdGFiWzE1Nl09LTQ5OwotCQkJdGFiWzE1N109LTU2OwotCQkJdGFiWzE1OF09LTEwOwotCQkJdGFiWzE1OV09LTExNjsKLQkJCXRhYlsxNjBdPS0xOTsKLQkJCXRhYlsxNjFdPS0zOwotCQkJdGFiWzE2Ml09LTY7Ci0JCQl0YWJbMTYzXT0tMjsKLQkJCXRhYlsxNjRdPS04OwotCQkJdGFiWzE2NV09LTEyNDsKLQkJCXRhYlsxNjZdPS0xMjU7Ci0JCQl0YWJbMTY3XT0xNzsKLQkJCXRhYlsxNjhdPTc4OwotCQkJdGFiWzE2OV09ODsKLQkJCXRhYlsxNzBdPTk3OwotCQkJdGFiWzE3MV09NTM7Ci0JCQl0YWJbMTcyXT0xNzsKLQkJCXRhYlsxNzNdPS00MzsKLQkJCXRhYlsxNzRdPS0xMDc7Ci0JCQl0YWJbMTc1XT0tODg7Ci0JCQl0YWJbMTc2XT0tODI7Ci0JCQl0YWJbMTc3XT0tNTk7Ci0JCQl0YWJbMTc4XT02MDsKLQkJCXRhYlsxNzldPTA7Ci0JCQl0YWJbMTgwXT0xNzsKLQkJCXRhYlsxODFdPS0zMDsKLQkJCXRhYlsxODJdPS0xMDc7Ci0JCQl0YWJbMTgzXT0xMjQ7Ci0JCQl0YWJbMTg0XT0tMTA3OwotCQkJdGFiWzE4NV09LTk0OwotCQkJdGFiWzE4Nl09LTExMjsKLQkJCXRhYlsxODddPS0yNzsKLQkJCXRhYlsxODhdPTgyOwotCQkJdGFiWzE4OV09NjA7Ci0JCQl0YWJbMTkwXT0xMDI7Ci0JCQl0YWJbMTkxXT00MzsKLQkJCXRhYlsxOTJdPS0xMDc7Ci0JCQl0YWJbMTkzXT01NTsKLQkJCXRhYlsxOTRdPTE7Ci0JCQl0YWJbMTk1XT0yODsKLQkJCXRhYlsxOTZdPS0xMjY7Ci0JCQl0YWJbMTk3XT0xMjc7Ci0JCQl0YWJbMTk4XT0tODU7Ci0JCQl0YWJbMTk5XT03NTsKLQkJCXRhYlsyMDBdPS0zNTsKLQkJCXRhYlsyMDFdPS0zNjsKLQkJCXRhYlsyMDJdPTE3OwotCQkJdGFiWzIwM109LTEwMDsKLQkJCXRhYlsyMDRdPS03NzsKLQkJCXRhYlsyMDVdPS0xMzsKLQkJCXRhYlsyMDZdPS0xMDg7Ci0JCQl0YWJbMjA3XT0tMzI7Ci0JCQl0YWJbMjA4XT0tMzQ7Ci0JCQl0YWJbMjA5XT0tMTAxOwotCQkJdGFiWzIxMF09MTAzOwotCQkJdGFiWzIxMV09MjE7Ci0JCQl0YWJbMjEyXT0tNjM7Ci0JCQl0YWJbMjEzXT0tMTI1OwotCQkJdGFiWzIxNF09MzE7Ci0JCQl0YWJbMjE1XT0tNjI7Ci0JCQl0YWJbMjE2XT02OTsKLQkJCXRhYlsyMTddPS05NzsKLQkJCXRhYlsyMThdPTExMjsKLQkJCXRhYlsyMTldPS0xMDA7Ci0JCQl0YWJbMjIwXT0tMjQ7Ci0JCQl0YWJbMjIxXT04MjsKLQkJCXRhYlsyMjJdPTc3OwotCQkJdGFiWzIyM109LTczOwotCQkJdGFiWzIyNF09LTIxOwotCQkJdGFiWzIyNV09NzY7Ci0JCQl0YWJbMjI2XT0tNDM7Ci0JCQl0YWJbMjI3XT03OTsKLQkJCXRhYlsyMjhdPTUwOwotCQkJdGFiWzIyOV09NDM7Ci0JCQl0YWJbMjMwXT0yMDsKLQkJCXRhYlsyMzFdPTk3OwotCQkJdGFiWzIzMl09LTEwNDsKLQkJCXRhYlsyMzNdPS0xMDQ7Ci0JCQl0YWJbMjM0XT05MjsKLQkJCXRhYlsyMzVdPTIyOwotCQkJdGFiWzIzNl09LTg3OwotCQkJdGFiWzIzN109LTg0OwotCQkJdGFiWzIzOF09LTc1OwotCQkJdGFiWzIzOV09LTUxOwotCQkJdGFiWzI0MF09LTY5OwotCQkJdGFiWzI0MV09LTk0OwotCQkJdGFiWzI0Ml09LTM3OwotCQkJdGFiWzI0M109LTY4OwotCQkJdGFiWzI0NF09LTI0OwotCQkJdGFiWzI0NV09MTM7Ci0JCQl0YWJbMjQ2XT0zMzsKLQkJCXRhYlsyNDddPTc0OwotCQkJdGFiWzI0OF09LTI7Ci0JCQl0YWJbMjQ5XT0tMTA2OwotCQkJdGFiWzI1MF09LTM0OwotCQkJdGFiWzI1MV09LTE2OwotCQkJdGFiWzI1Ml09LTUyOwotCQkJdGFiWzI1M109LTEyMzsKLQkJCXRhYlsyNTRdPTQ5OwotCQkJdGFiWzI1NV09MTI0OwotCQkJdGFiWzI1Nl09LTU2OwotCQkJdGFiWzI1N109LTUyOwotCQkJdGFiWzI1OF09MTA4OwotCQkJdGFiWzI1OV09LTIxOwotCQkJdGFiWzI2MF09OTI7Ci0JCQl0YWJbMjYxXT02MTsKLQkJCXRhYlsyNjJdPTEwNDsKLQkJCXRhYlsyNjNdPTQzOwotCQkJdGFiWzI2NF09LTEyOwotCQkJdGFiWzI2NV09LTI1OwotCQkJdGFiWzI2Nl09OTk7Ci0JCQl0YWJbMjY3XT0xMjM7Ci0JCQl0YWJbMjY4XT03OwotCQkJdGFiWzI2OV09Nzg7Ci0JCQl0YWJbMjcwXT0tNDc7Ci0JCQl0YWJbMjcxXT0tMjk7Ci0JCQl0YWJbMjcyXT01OwotCQkJdGFiWzI3M109LTEwOwotCQkJdGFiWzI3NF09LTExOwotCQkJdGFiWzI3NV09NjQ7Ci0JCQl0YWJbMjc2XT0xMTg7Ci0JCQl0YWJbMjc3XT0zMTsKLQkJCXRhYlsyNzhdPTk5OwotCQkJdGFiWzI3OV09LTY0OwotCQkJdGFiWzI4MF09LTEwMzsKLQkJCXRhYlsyODFdPTk2OwotCQkJdGFiWzI4Ml09Mzg7Ci0JCQl0YWJbMjgzXT0xMDI7Ci0JCQl0YWJbMjg0XT0tMTc7Ci0JCQl0YWJbMjg1XT0tMzA7Ci0JCQl0YWJbMjg2XT0yOTsKLQkJCXRhYlsyODddPTc7Ci0JCQl0YWJbMjg4XT0xMTE7Ci0JCQl0YWJbMjg5XT0xMDk7Ci0JCQl0YWJbMjkwXT01OTsKLQkJCXRhYlsyOTFdPTEwMDsKLQkJCXRhYlsyOTJdPS0xMjsKLQkJCXRhYlsyOTNdPS0zNzsKLQkJCXRhYlsyOTRdPS05NDsKLQkJCXRhYlsyOTVdPS0xMjU7Ci0JCQl0YWJbMjk2XT0xOwotCQkJdGFiWzI5N109OTk7Ci0JCQl0YWJbMjk4XT0tNzY7Ci0JCQl0YWJbMjk5XT0xOTsKLQkJCXRhYlszMDBdPTQ4OwotCQkJdGFiWzMwMV09MzE7Ci0JCQl0YWJbMzAyXT0tNzQ7Ci0JCQl0YWJbMzAzXT0zOwotCQkJdGFiWzMwNF09LTExNDsKLQkJCXRhYlszMDVdPTEyNjsKLQkJCXRhYlszMDZdPS01MTsKLQkJCXRhYlszMDddPS0xMDU7Ci0JCQl0YWJbMzA4XT0yODsKLQkJCXRhYlszMDldPS03NDsKLQkJCXRhYlszMTBdPTcxOwotCQkJdGFiWzMxMV09LTU7Ci0JCQl0YWJbMzEyXT03MDsKLQkJCXRhYlszMTNdPS05OwotCQkJdGFiWzMxNF09LTk3OwotCQkJdGFiWzMxNV09LTExMTsKLQkJCXRhYlszMTZdPTU4OwotCQkJdGFiWzMxN109MzU7Ci0JCQl0YWJbMzE4XT0tMTsKLQkJCXRhYlszMTldPS04MzsKLQkJCXRhYlszMjBdPTg1OwotCQkJdGFiWzMyMV09LTU5OwotCQkJdGFiWzMyMl09NjM7Ci0JCQl0YWJbMzIzXT04MDsKLQkJCXRhYlszMjRdPTc1OwotCQkJdGFiWzMyNV09NzsKLQkJCXRhYlszMjZdPTg7Ci0JCQl0YWJbMzI3XT0tOTk7Ci0JCQl0YWJbMzI4XT0xMDU7Ci0JCQl0YWJbMzI5XT03NzsKLQkJCXRhYlszMzBdPS0zODsKLQkJCXRhYlszMzFdPS0zNjsKLQkJCXRhYlszMzJdPTA7Ci0JCQl0YWJbMzMzXT0wOwotCQkJdGFiWzMzNF09MDsKLQkJCXRhYlszMzVdPTUzOwotCQkJdGFiWzMzNl09MTsKLQkJCXRhYlszMzddPTA7Ci0JCQl0YWJbMzM4XT0wOwotCQkJdGFiWzMzOV09ODA7Ci0JCQl0YWJbMzQwXT03NTsKLQkJCXRhYlszNDFdPTE7Ci0JCQl0YWJbMzQyXT0yOwotCQkJdGFiWzM0M109MjA7Ci0JCQl0YWJbMzQ0XT0wOwotCQkJdGFiWzM0NV09MjA7Ci0JCQl0YWJbMzQ2XT0wOwotCQkJdGFiWzM0N109ODsKLQkJCXRhYlszNDhdPTA7Ci0JCQl0YWJbMzQ5XT04OwotCQkJdGFiWzM1MF09MDsKLQkJCXRhYlszNTFdPTE5OwotCQkJdGFiWzM1Ml09ODc7Ci0JCQl0YWJbMzUzXT0tOTU7Ci0JCQl0YWJbMzU0XT00NDsKLQkJCXRhYlszNTVdPTA7Ci0JCQl0YWJbMzU2XT0wOwotCQkJdGFiWzM1N109MDsKLQkJCXRhYlszNThdPTA7Ci0JCQl0YWJbMzU5XT0yOwotCQkJdGFiWzM2MF09MDsKLQkJCXRhYlszNjFdPTA7Ci0JCQl0YWJbMzYyXT0wOwotCQkJdGFiWzM2M109MDsKLQkJCXRhYlszNjRdPTA7Ci0JCQl0YWJbMzY1XT0wOwotCQkJdGFiWzM2Nl09MDsKLQkJCXRhYlszNjddPTk7Ci0JCQl0YWJbMzY4XT0wOwotCQkJdGFiWzM2OV09MDsKLQkJCXRhYlszNzBdPTA7Ci0JCQl0YWJbMzcxXT0wOwotCQkJdGFiWzM3Ml09MDsKLQkJCXRhYlszNzNdPTA7Ci0JCQl0YWJbMzc0XT0wOwotCQkJdGFiWzM3NV09MDsKLQkJCXRhYlszNzZdPTA7Ci0JCQl0YWJbMzc3XT0wOwotCQkJdGFiWzM3OF09MDsKLQkJCXRhYlszNzldPTA7Ci0JCQl0YWJbMzgwXT0wOwotCQkJdGFiWzM4MV09MDsKLQkJCXRhYlszODJdPTA7Ci0JCQl0YWJbMzgzXT0wOwotCQkJdGFiWzM4NF09MDsKLQkJCXRhYlszODVdPTExMjsKLQkJCXRhYlszODZdPTQ5OwotCQkJdGFiWzM4N109NDc7Ci0JCQl0YWJbMzg4XT0xMTI7Ci0JCQl0YWJbMzg5XT01MDsKLQkJCXRhYlszOTBdPTQ3OwotCQkJdGFiWzM5MV09MTEyOwotCQkJdGFiWzM5Ml09NTE7Ci0JCQl0YWJbMzkzXT00NzsKLQkJCXRhYlszOTRdPTgwOwotCQkJdGFiWzM5NV09NzU7Ci0JCQl0YWJbMzk2XT0xOwotCQkJdGFiWzM5N109MjsKLQkJCXRhYlszOThdPTIwOwotCQkJdGFiWzM5OV09MDsKLQkJCXRhYls0MDBdPTIwOwotCQkJdGFiWzQwMV09MDsKLQkJCXRhYls0MDJdPTg7Ci0JCQl0YWJbNDAzXT0wOwotCQkJdGFiWzQwNF09ODsKLQkJCXRhYls0MDVdPTA7Ci0JCQl0YWJbNDA2XT0xOTsKLQkJCXRhYls0MDddPTg3OwotCQkJdGFiWzQwOF09LTk1OwotCQkJdGFiWzQwOV09NDQ7Ci0JCQl0YWJbNDEwXT0tOTk7Ci0JCQl0YWJbNDExXT0xMDU7Ci0JCQl0YWJbNDEyXT03NzsKLQkJCXRhYls0MTNdPS0zODsKLQkJCXRhYls0MTRdPS0zNjsKLQkJCXRhYls0MTVdPTA7Ci0JCQl0YWJbNDE2XT0wOwotCQkJdGFiWzQxN109MDsKLQkJCXRhYls0MThdPTUzOwotCQkJdGFiWzQxOV09MTsKLQkJCXRhYls0MjBdPTA7Ci0JCQl0YWJbNDIxXT0wOwotCQkJdGFiWzQyMl09MTY7Ci0JCQl0YWJbNDIzXT0wOwotCQkJdGFiWzQyNF09MDsKLQkJCXRhYls0MjVdPTA7Ci0JCQl0YWJbNDI2XT0wOwotCQkJdGFiWzQyN109MDsKLQkJCXRhYls0MjhdPTA7Ci0JCQl0YWJbNDI5XT0wOwotCQkJdGFiWzQzMF09MDsKLQkJCXRhYls0MzFdPTA7Ci0JCQl0YWJbNDMyXT0wOwotCQkJdGFiWzQzM109MDsKLQkJCXRhYls0MzRdPTA7Ci0JCQl0YWJbNDM1XT0wOwotCQkJdGFiWzQzNl09NTc7Ci0JCQl0YWJbNDM3XT0wOwotCQkJdGFiWzQzOF09MDsKLQkJCXRhYls0MzldPTA7Ci0JCQl0YWJbNDQwXT0xMTI7Ci0JCQl0YWJbNDQxXT00OTsKLQkJCXRhYls0NDJdPTQ3OwotCQkJdGFiWzQ0M109MTEyOwotCQkJdGFiWzQ0NF09NTA7Ci0JCQl0YWJbNDQ1XT00NzsKLQkJCXRhYls0NDZdPTExMjsKLQkJCXRhYls0NDddPTUxOwotCQkJdGFiWzQ0OF09NDc7Ci0JCQl0YWJbNDQ5XT04ODsKLQkJCXRhYls0NTBdPTQ2OwotCQkJdGFiWzQ1MV09OTk7Ci0JCQl0YWJbNDUyXT0xMDg7Ci0JCQl0YWJbNDUzXT05NzsKLQkJCXRhYls0NTRdPTExNTsKLQkJCXRhYls0NTVdPTExNTsKLQkJCXRhYls0NTZdPTgwOwotCQkJdGFiWzQ1N109NzU7Ci0JCQl0YWJbNDU4XT01OwotCQkJdGFiWzQ1OV09NjsKLQkJCXRhYls0NjBdPTA7Ci0JCQl0YWJbNDYxXT0wOwotCQkJdGFiWzQ2Ml09MDsKLQkJCXRhYls0NjNdPTA7Ci0JCQl0YWJbNDY0XT0yOwotCQkJdGFiWzQ2NV09MDsKLQkJCXRhYls0NjZdPTI7Ci0JCQl0YWJbNDY3XT0wOwotCQkJdGFiWzQ2OF09MTE3OwotCQkJdGFiWzQ2OV09MDsKLQkJCXRhYls0NzBdPTA7Ci0JCQl0YWJbNDcxXT0wOwotCQkJdGFiWzQ3Ml09ODM7Ci0JCQl0YWJbNDczXT0xOwotCQkJdGFiWzQ3NF09MDsKLQkJCXRhYls0NzVdPTA7Ci0JCQl0YWJbNDc2XT0wOwotCQkJdGFiWzQ3N109MDsKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IGNyZWF0ZUphdmFQcm9qZWN0KCJQMSIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCQlJRmlsZSBqYXJGaWxlID0gY3JlYXRlRmlsZSgiUDEvbGliLmphciIsIHRhYik7Ci0JCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3IElDbGFzc3BhdGhFbnRyeVtdIHtKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkoamFyRmlsZS5nZXRGdWxsUGF0aCgpLCBudWxsLCBudWxsLCBmYWxzZSl9LCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCWFzc2VydE5vdE51bGwoamF2YVByb2plY3QuZmluZFR5cGUoInAxLnAyLnAzLlgiKSk7Ci0JCX0gY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlhc3NlcnRUcnVlKGZhbHNlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJYXNzZXJ0VHJ1ZShmYWxzZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlkZWxldGVQcm9qZWN0KCJQMSIpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgU3VpdGUoQ2xhc3NOYW1lVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQ2xhc3NOYW1lVGVzdHMoInRlc3RDbGFzc05hbWVXaXRoRG9sbGFyIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBDbGFzc05hbWVUZXN0cygidGVzdEZpbmRUeXBlV2l0aERvdCIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQ2xhc3NOYW1lVGVzdHMoInRlc3RTZWFyY2hUeXBlTmFtZUluSmFycyIpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvQ2xhc3NwYXRoSW5pdGlhbGl6ZXJUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0NsYXNzcGF0aEluaXRpYWxpemVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVlMzY4YS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvQ2xhc3NwYXRoSW5pdGlhbGl6ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLkNoYXJPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhUHJvamVjdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotCi0vKgotICogVGVzdCB2YXJpYWJsZSBpbml0aWFsaXplcnMgYW5kIGNvbnRhaW5lciBpbml0aWFsaXplcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc3BhdGhJbml0aWFsaXplclRlc3RzIGV4dGVuZHMgTW9kaWZ5aW5nUmVzb3VyY2VUZXN0cyB7Ci0JCi1wdWJsaWMgc3RhdGljIGNsYXNzIERlZmF1bHRWYXJpYWJsZUluaXRpYWxpemVyIGltcGxlbWVudHMgVmFyaWFibGVzSW5pdGlhbGl6ZXIuSVRlc3RJbml0aWFsaXplciB7Ci0JTWFwIHZhcmlhYmxlVmFsdWVzOwotCQotCS8qCi0JICogdmFsdWVzIGlzIFs8dmFyIG5hbWU+LCA8dmFyIHZhbHVlPl0qCi0JICovCi0JcHVibGljIERlZmF1bHRWYXJpYWJsZUluaXRpYWxpemVyKFN0cmluZ1tdIHZhbHVlcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXZhcmlhYmxlVmFsdWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKz0yKSB7Ci0JCQl2YXJpYWJsZVZhbHVlcy5wdXQodmFsdWVzW2ldLCBuZXcgUGF0aCh2YWx1ZXNbaSsxXSkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoU3RyaW5nIHZhcmlhYmxlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJaWYgKHZhcmlhYmxlVmFsdWVzID09IG51bGwpIHJldHVybjsKLQkJSmF2YUNvcmUuc2V0Q2xhc3NwYXRoVmFyaWFibGUoCi0JCQl2YXJpYWJsZSwgCi0JCQkoSVBhdGgpdmFyaWFibGVWYWx1ZXMuZ2V0KHZhcmlhYmxlKSwgCi0JCQludWxsKTsKLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgY2xhc3MgRGVmYXVsdENvbnRhaW5lckluaXRpYWxpemVyIGltcGxlbWVudHMgQ29udGFpbmVySW5pdGlhbGl6ZXIuSVRlc3RJbml0aWFsaXplciB7Ci0JCi0JTWFwIGNvbnRhaW5lclZhbHVlczsKLQlDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbjsKLQkKLQkvKgotCSAqIHZhbHVlcyBpcyBbPHByb2plY3QgbmFtZT4sIDxsaWIgcGF0aD5bLDxsaWIgcGF0aD5dKiBdKgotCSAqLwotCXB1YmxpYyBEZWZhdWx0Q29udGFpbmVySW5pdGlhbGl6ZXIoU3RyaW5nW10gdmFsdWVzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJY29udGFpbmVyVmFsdWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKz0yKSB7Ci0JCQlmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUgPSB2YWx1ZXNbaV07Ci0JCQlmaW5hbCBjaGFyW11bXSBsaWJQYXRocyA9IENoYXJPcGVyYXRpb24uc3BsaXRPbignLCcsIHZhbHVlc1tpKzFdLnRvQ2hhckFycmF5KCkpOwotCQkJY29udGFpbmVyVmFsdWVzLnB1dCgKLQkJCQlwcm9qZWN0TmFtZSwgCi0JCQkJbmV3IElDbGFzc3BhdGhDb250YWluZXIoKSB7Ci0JCQkJCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSBnZXRDbGFzc3BhdGhFbnRyaWVzKCkgewotCQkJCQkJaW50IGxlbmd0aCA9IGxpYlBhdGhzLmxlbmd0aDsKLQkJCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W2xlbmd0aF07Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJZW50cmllc1tqXSA9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShuZXcgUGF0aChuZXcgU3RyaW5nKGxpYlBhdGhzW2pdKSksIG51bGwsIG51bGwpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIGVudHJpZXM7Ci0JCQkJCX0KLQkJCQkJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJCQkJCXJldHVybiAiVGVzdCBjb250YWluZXIiOwotCQkJCQl9Ci0JCQkJCXB1YmxpYyBpbnQgZ2V0S2luZCgpIHsKLQkJCQkJCXJldHVybiBJQ2xhc3NwYXRoQ29udGFpbmVyLktfQVBQTElDQVRJT047Ci0JCQkJCX0KLQkJCQkJcHVibGljIElQYXRoIGdldFBhdGgoKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IFBhdGgoIm9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsLlRFU1RfQ09OVEFJTkVSIik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCQl9Ci0JfQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGNvbnRhaW5lclZhbHVlcyA9PSBudWxsKSByZXR1cm47Ci0JCXRyeSB7Ci0JCQlKYXZhQ29yZS5zZXRDbGFzc3BhdGhDb250YWluZXIoCi0JCQkJY29udGFpbmVyUGF0aCwgCi0JCQkJbmV3IElKYXZhUHJvamVjdFtdIHtwcm9qZWN0fSwKLQkJCQluZXcgSUNsYXNzcGF0aENvbnRhaW5lcltdIHsoSUNsYXNzcGF0aENvbnRhaW5lciljb250YWluZXJWYWx1ZXMuZ2V0KHByb2plY3QuZ2V0RWxlbWVudE5hbWUoKSl9LCAKLQkJCQludWxsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aGlzLmV4Y2VwdGlvbiA9IGU7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotfQotLy8gU2ltcGxlIGNvbnRhaW5lciBpbml0aWFsaXplciwgd2hpY2gga2VlcHMgc2V0dGluZyBjb250YWluZXIgdG8gbnVsbAotLy8gKDMwOTIwIC0gc3RhY2tvdmVyZmxvdyB3aGVuIHNldHRpbmcgY29udGFpbmVyIHRvIG51bGwpCi1wdWJsaWMgY2xhc3MgTnVsbENvbnRhaW5lckluaXRpYWxpemVyIGltcGxlbWVudHMgQ29udGFpbmVySW5pdGlhbGl6ZXIuSVRlc3RJbml0aWFsaXplciB7Ci0JcHVibGljIGJvb2xlYW4gaGFzUnVuID0gZmFsc2U7Ci0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQloYXNSdW4gPSB0cnVlOwotCQlKYXZhQ29yZS5zZXRDbGFzc3BhdGhDb250YWluZXIoCi0JCQljb250YWluZXJQYXRoLCAKLQkJCW5ldyBJSmF2YVByb2plY3RbXSB7cHJvamVjdH0sIAotCQkJbmV3IElDbGFzc3BhdGhDb250YWluZXJbXSB7IG51bGwgfSwgCi0JCQludWxsKTsKLQl9Ci19Ci0KLXB1YmxpYyBDbGFzc3BhdGhJbml0aWFsaXplclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RDb250YWluZXJJbml0aWFsaXplcjEoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVQcm9qZWN0KCJQMSIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoIi9QMS9saWIuamFyIiwgIiIpOwotCQlDb250YWluZXJJbml0aWFsaXplci5zZXRJbml0aWFsaXplcihuZXcgRGVmYXVsdENvbnRhaW5lckluaXRpYWxpemVyKG5ldyBTdHJpbmdbXSB7IlAyIiwgIi9QMS9saWIuamFyIn0pKTsKLQkJSUphdmFQcm9qZWN0IHAyID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgKLQkJCQkiUDIiLCAKLQkJCQluZXcgU3RyaW5nW10ge30sIAotCQkJCW5ldyBTdHJpbmdbXSB7Im9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsLlRFU1RfQ09OVEFJTkVSIn0sIAotCQkJCSIiKTsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHAyLmdldFBhY2thZ2VGcmFnbWVudFJvb3QodGhpcy5nZXRGaWxlKCIvUDEvbGliLmphciIpKTsKLQkJYXNzZXJ0VHJ1ZSgiL1AxL2xpYi5qYXIgc2hvdWxkIGV4aXN0Iiwgcm9vdC5leGlzdHMoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAxIik7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29udGFpbmVySW5pdGlhbGl6ZXIyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlUHJvamVjdCgiUDEiKTsKLQkJdGhpcy5jcmVhdGVGaWxlKCIvUDEvbGliLmphciIsICIiKTsKLQkJQ29udGFpbmVySW5pdGlhbGl6ZXIuc2V0SW5pdGlhbGl6ZXIobmV3IERlZmF1bHRDb250YWluZXJJbml0aWFsaXplcihuZXcgU3RyaW5nW10geyJQMiIsICIvUDEvbGliLmphciJ9KSk7Ci0JCUlKYXZhUHJvamVjdCBwMiA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoCi0JCQkJIlAyIiwgCi0JCQkJbmV3IFN0cmluZ1tdIHt9LCAKLQkJCQluZXcgU3RyaW5nW10geyJvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC5URVNUX0NPTlRBSU5FUiJ9LCAKLQkJCQkiIik7Ci0JCQkJCi0JCS8vIHNpbXVsYXRlIHN0YXRlIG9uIHN0YXJ0dXAgKGZsdXNoIGNvbnRhaW5lcnMsIGFuZCBwcmVzZXJ2ZSB0aGVpciBwcmV2aW91cyB2YWx1ZXMpCi0JCUphdmFNb2RlbE1hbmFnZXIuUHJldmlvdXNTZXNzaW9uQ29udGFpbmVycyA9IEphdmFNb2RlbE1hbmFnZXIuQ29udGFpbmVyczsKLQkJSmF2YU1vZGVsTWFuYWdlci5Db250YWluZXJzID0gbmV3IEhhc2hNYXAoNSk7Ci0JCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLnJlbW92ZVBlclByb2plY3RJbmZvKChKYXZhUHJvamVjdClwMik7Ci0JCXAyLmNsb3NlKCk7Ci0JCQotCQlzdGFydERlbHRhcygpOwotCQlwMi5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKTsKLQkJCi0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIG9uIHN0YXJ0dXAiLCAKLQkJCSIiCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAxIik7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29udGFpbmVySW5pdGlhbGl6ZXIzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlUHJvamVjdCgiUDEiKTsKLQkJdGhpcy5jcmVhdGVGaWxlKCIvUDEvbGliLmphciIsICIiKTsKLQkJQ29udGFpbmVySW5pdGlhbGl6ZXIuc2V0SW5pdGlhbGl6ZXIobmV3IERlZmF1bHRDb250YWluZXJJbml0aWFsaXplcihuZXcgU3RyaW5nW10geyJQMiIsICIvUDEvbGliLmphciJ9KSk7Ci0JCUlKYXZhUHJvamVjdCBwMiA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoCi0JCQkJIlAyIiwgCi0JCQkJbmV3IFN0cmluZ1tdIHt9LCAKLQkJCQluZXcgU3RyaW5nW10geyJvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC5URVNUX0NPTlRBSU5FUiJ9LCAKLQkJCQkiIik7Ci0JCQkJCi0JCS8vIGNoYW5nZSB2YWx1ZSBvZiBURVNUX0NPTlRBSU5FUgotCQl0aGlzLmNyZWF0ZUZpbGUoIi9QMS9saWIyLmphciIsICIiKTsKLQkJQ29udGFpbmVySW5pdGlhbGl6ZXIuc2V0SW5pdGlhbGl6ZXIobmV3IERlZmF1bHRDb250YWluZXJJbml0aWFsaXplcihuZXcgU3RyaW5nW10geyJQMiIsICIvUDEvbGliMi5qYXIifSkpOwotCi0JCS8vIHNpbXVsYXRlIHN0YXRlIG9uIHN0YXJ0dXAgKGZsdXNoIGNvbnRhaW5lcnMsIGFuZCBwcmVzZXJ2ZSB0aGVpciBwcmV2aW91cyB2YWx1ZXMpCi0JCUphdmFNb2RlbE1hbmFnZXIuUHJldmlvdXNTZXNzaW9uQ29udGFpbmVycyA9IEphdmFNb2RlbE1hbmFnZXIuQ29udGFpbmVyczsKLQkJSmF2YU1vZGVsTWFuYWdlci5Db250YWluZXJzID0gbmV3IEhhc2hNYXAoNSk7Ci0JCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLnJlbW92ZVBlclByb2plY3RJbmZvKChKYXZhUHJvamVjdClwMik7Ci0JCXAyLmNsb3NlKCk7Ci0JCQotCQlzdGFydERlbHRhcygpOwotCQlwMi5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKTsKLQkJCi0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIG9uIHN0YXJ0dXAiLCAKLQkJCSJQMlsqXToge0NISUxEUkVOfVxuIiArIAotCQkJIgkvUDEvbGliLmphclsqXToge1JFTU9WRUQgRlJPTSBDTEFTU1BBVEh9XG4iICsgCi0JCQkiCS9QMS9saWIyLmphclsqXToge0FEREVEIFRPIENMQVNTUEFUSH0iCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAxIik7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0vKiBFbnN1cmUgdGhhdCBpbml0aWFsaXplciBpcyBub3QgY2FsbGxlZCB3aGVuIHJlc291cmNlIHRyZWUgaXMgbG9ja2VkLgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDI5NTg1IENvcmUgRXhjZXB0aW9uIGFzIHJlc291cmNlIHRyZWUgaXMgbG9ja2VkIGluaXRpYWxpemluZyBjbGFzc3BhdGggY29udGFpbmVyKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29udGFpbmVySW5pdGlhbGl6ZXI0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlUHJvamVjdCgiUDEiKTsKLQkJdGhpcy5jcmVhdGVGaWxlKCIvUDEvbGliLmphciIsICIiKTsKLQkJRGVmYXVsdENvbnRhaW5lckluaXRpYWxpemVyIGluaXRpYWxpemVyID0gbmV3IERlZmF1bHRDb250YWluZXJJbml0aWFsaXplcihuZXcgU3RyaW5nW10geyJQMiIsICIvUDEvbGliLmphciJ9KTsKLQkJQ29udGFpbmVySW5pdGlhbGl6ZXIuc2V0SW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXIpOwotCQlJSmF2YVByb2plY3QgcDIgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KAotCQkJCSJQMiIsIAotCQkJCW5ldyBTdHJpbmdbXSB7IiJ9LCAKLQkJCQluZXcgU3RyaW5nW10geyJvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC5URVNUX0NPTlRBSU5FUiJ9LCAKLQkJCQkiIik7Ci0JCQkJCi0JCS8vIHNpbXVsYXRlIHN0YXRlIG9uIHN0YXJ0dXAgKGZsdXNoIGNvbnRhaW5lcnMsIGFuZCBwcmVzZXJ2ZSB0aGVpciBwcmV2aW91cyB2YWx1ZXMpCi0JCUphdmFNb2RlbE1hbmFnZXIuUHJldmlvdXNTZXNzaW9uQ29udGFpbmVycyA9IEphdmFNb2RlbE1hbmFnZXIuQ29udGFpbmVyczsKLQkJSmF2YU1vZGVsTWFuYWdlci5Db250YWluZXJzID0gbmV3IEhhc2hNYXAoNSk7Ci0JCUphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLnJlbW92ZVBlclByb2plY3RJbmZvKChKYXZhUHJvamVjdClwMik7Ci0JCXAyLmNsb3NlKCk7Ci0JCQotCQlzdGFydERlbHRhcygpOwotCQl0aGlzLmNyZWF0ZUZpbGUoIi9QMi9YLmphdmEiLCAicHVibGljIGNsYXNzIFgge30iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiU2hvdWxkIG5vdCBnZXQgZXhjZXB0aW9uIiwgbnVsbCwgaW5pdGlhbGl6ZXIuZXhjZXB0aW9uKTsKLQkJCi0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIG9uIHN0YXJ0dXAiLCAKLQkJCSJQMlsqXToge0NISUxEUkVOfVxuIiArIAotCQkJIglbcHJvamVjdCByb290XVsqXToge0NISUxEUkVOfVxuIiArIAotCQkJIgkJW2RlZmF1bHRdWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCQkJWC5qYXZhWytdOiB7fSIKLQkJKTsKLQl9IGZpbmFsbHkgewotCQlzdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDEiKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMiIpOwotCX0KLX0KLS8qIAotICogMzA5MjAgLSBTdGFjayBvdmVyZmxvdyB3aGVuIGNvbnRhaW5lciByZXNvbHZlZCB0byBudWxsCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb250YWluZXJJbml0aWFsaXplcjUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJTnVsbENvbnRhaW5lckluaXRpYWxpemVyIG51bGxJbml0aWFsaXplciA9IG5ldyBOdWxsQ29udGFpbmVySW5pdGlhbGl6ZXIoKTsKLQkJQ29udGFpbmVySW5pdGlhbGl6ZXIuc2V0SW5pdGlhbGl6ZXIobnVsbEluaXRpYWxpemVyKTsKLQkJSUphdmFQcm9qZWN0IHAxID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgKLQkJCQkiUDEiLCAKLQkJCQluZXcgU3RyaW5nW10geyIifSwgCi0JCQkJbmV3IFN0cmluZ1tdIHsib3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwuVEVTVF9DT05UQUlORVIifSwgCi0JCQkJIiIpOwotCQkJCQotCQkvLyBzaW11bGF0ZSBzdGF0ZSBvbiBzdGFydHVwIChmbHVzaCBjb250YWluZXJzLCBhbmQgcHJlc2VydmUgdGhlaXIgcHJldmlvdXMgdmFsdWVzKQotCQlKYXZhTW9kZWxNYW5hZ2VyLlByZXZpb3VzU2Vzc2lvbkNvbnRhaW5lcnMgPSBKYXZhTW9kZWxNYW5hZ2VyLkNvbnRhaW5lcnM7Ci0JCUphdmFNb2RlbE1hbmFnZXIuQ29udGFpbmVycyA9IG5ldyBIYXNoTWFwKDUpOwotCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5yZW1vdmVQZXJQcm9qZWN0SW5mbygoSmF2YVByb2plY3QpcDEpOwotCQlwMS5jbG9zZSgpOwotCQkKLQkJc3RhcnREZWx0YXMoKTsKLQotCQkvLyB3aWxsIHRyaWdnZXIgY2xhc3NwYXRoIHJlc29sdXRpb24gKHdpdGggbnVsbCBjb250YWluZXIgdmFsdWUpCi0JCXRoaXMuY3JlYXRlRmlsZSgiL1AxL1guamF2YSIsICJwdWJsaWMgY2xhc3MgWCB7fSIpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSBvbiBzdGFydHVwIiwgCi0JCQkiUDFbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJCSIJW3Byb2plY3Qgcm9vdF1bKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJCSIJCVtkZWZhdWx0XVsqXToge0NISUxEUkVOfVxuIiArIAotCQkJIgkJCVguamF2YVsrXToge30iCi0JCSk7Ci0JCWFzc2VydFRydWUoImluaXRpYWxpemVyIGRpZCBub3QgcnVuIiwgbnVsbEluaXRpYWxpemVyLmhhc1J1bik7Ci0JCQotCQkvLyBuZXh0IGNwIHJlc29sdXRpb24gcmVxdWVzdCB3aWxsIHJlcnVuIHRoZSBpbml0aWFsaXplcgotCQludWxsSW5pdGlhbGl6ZXIuaGFzUnVuID0gZmFsc2U7IC8vIHJlc2V0CQkKLQkJcDEuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7Ci0JCWFzc2VydFRydWUoImluaXRpYWxpemVyIGRpZCBub3QgcnVuIiwgbnVsbEluaXRpYWxpemVyLmhhc1J1bik7IC8vIGluaXRpYWxpemVyIHNob3VsZCBoYXZlIHJ1biBhZ2FpbiAoc2luY2Uga2VlcCBzZXR0aW5nIHRvIG51bGwpCi0KLQkJLy8gYXNzaWduaW5nIG5ldyAobm9uLW51bGwpIHZhbHVlIHRvIGNvbnRhaW5lcgotCQl0aGlzLmNyZWF0ZUZpbGUoIi9QMS9saWIuamFyIiwgIiIpOwotCQlDb250YWluZXJJbml0aWFsaXplci5zZXRJbml0aWFsaXplcihuZXcgRGVmYXVsdENvbnRhaW5lckluaXRpYWxpemVyKG5ldyBTdHJpbmdbXSB7IlAxIiwgIi9QMS9saWIuamFyIn0pKTsKLQkJcDEuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIGFmdGVyIHNldHRpbmcgY29udGFpbmVyIiwgCi0JCQkiUDFbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJCSIJW3Byb2plY3Qgcm9vdF1bKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJCSIJCVtkZWZhdWx0XVsqXToge0NISUxEUkVOfVxuIiArIAotCQkJIgkJCVguamF2YVsrXToge31cbiIgKyAKLQkJCSJcbiIgKyAKLQkJCSJQMVsqXToge0NPTlRFTlR9XG4iICsgCi0JCQkiCVJlc291cmNlRGVsdGEoL1AxL2xpYi5qYXIpWytdIgotCQkpOwotCi0JfSBjYXRjaCAoU3RhY2tPdmVyZmxvd0Vycm9yIGUpIHsKLQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJYXNzZXJ0VHJ1ZSgic3RhY2sgb3ZlcmZsb3cgYXNzaWduaW5nIGNvbnRhaW5lciIsIGZhbHNlKTsKLQl9IGZpbmFsbHkgewotCQlzdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDEiKTsKLQl9Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JcmV0dXJuIG5ldyBTdWl0ZShDbGFzc3BhdGhJbml0aWFsaXplclRlc3RzLmNsYXNzKTsKLX0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JLy8gQ2xlYW51cCBjYWNoZXMKLQlKYXZhTW9kZWxNYW5hZ2VyLkNvbnRhaW5lcnMgPSBuZXcgSGFzaE1hcCg1KTsKLQlKYXZhTW9kZWxNYW5hZ2VyLlZhcmlhYmxlcyA9IG5ldyBIYXNoTWFwKDUpOwotCi0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdFZhcmlhYmxlSW5pdGlhbGl6ZXIxKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlUHJvamVjdCgiUDEiKTsKLQkJdGhpcy5jcmVhdGVGaWxlKCIvUDEvbGliLmphciIsICIiKTsKLQkJVmFyaWFibGVzSW5pdGlhbGl6ZXIuc2V0SW5pdGlhbGl6ZXIobmV3IERlZmF1bHRWYXJpYWJsZUluaXRpYWxpemVyKG5ldyBTdHJpbmdbXSB7IlRFU1RfTElCIiwgIi9QMS9saWIuamFyIn0pKTsKLQkJSUphdmFQcm9qZWN0IHAyID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDIiLCBuZXcgU3RyaW5nW10ge30sIG5ldyBTdHJpbmdbXSB7IlRFU1RfTElCIn0sICIiKTsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHAyLmdldFBhY2thZ2VGcmFnbWVudFJvb3QodGhpcy5nZXRGaWxlKCIvUDEvbGliLmphciIpKTsKLQkJYXNzZXJ0VHJ1ZSgiL1AxL2xpYi5qYXIgc2hvdWxkIGV4aXN0Iiwgcm9vdC5leGlzdHMoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMSIpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAyIik7Ci0JCVZhcmlhYmxlc0luaXRpYWxpemVyLnJlc2V0KCk7Ci0JfQotfQotcHVibGljIHZvaWQgdGVzdFZhcmlhYmxlSW5pdGlhbGl6ZXIyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlUHJvamVjdCgiUDEiKTsKLQkJdGhpcy5jcmVhdGVGaWxlKCIvUDEvbGliLmphciIsICIiKTsKLQkJdGhpcy5jcmVhdGVGaWxlKCIvUDEvc3JjLnppcCIsICIiKTsKLQkJVmFyaWFibGVzSW5pdGlhbGl6ZXIuc2V0SW5pdGlhbGl6ZXIobmV3IERlZmF1bHRWYXJpYWJsZUluaXRpYWxpemVyKG5ldyBTdHJpbmdbXSB7Ci0JCQkiVEVTVF9MSUIiLCAiL1AxL2xpYi5qYXIiLAotCQkJIlRFU1RfU1JDIiwgIi9QMS9zcmMuemlwIiwKLQkJCSJURVNUX1JPT1QiLCAic3JjIiwKLQkJfSkpOwotCQlJSmF2YVByb2plY3QgcDIgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMiIsIG5ldyBTdHJpbmdbXSB7fSwgbmV3IFN0cmluZ1tdIHsiVEVTVF9MSUIsVEVTVF9TUkMsVEVTVF9ST09UIn0sICIiKTsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHAyLmdldFBhY2thZ2VGcmFnbWVudFJvb3QodGhpcy5nZXRGaWxlKCIvUDEvbGliLmphciIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHNvdXJjZSBhdHRhY2htZW50IHBhdGgiLCAiL1AxL3NyYy56aXAiLCByb290LmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBzb3VyY2UgYXR0YWNobWVudCByb290IHBhdGgiLCAic3JjIiwgcm9vdC5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKS50b1N0cmluZygpKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAxIik7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQkJVmFyaWFibGVzSW5pdGlhbGl6ZXIucmVzZXQoKTsKLQl9Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0VmFyaWFibGVJbml0aWFsaXplcjMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVQcm9qZWN0KCJQMSIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoIi9QMS9saWIuamFyIiwgIiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoIi9QMS9zcmMuemlwIiwgIiIpOwotCQlWYXJpYWJsZXNJbml0aWFsaXplci5zZXRJbml0aWFsaXplcihuZXcgRGVmYXVsdFZhcmlhYmxlSW5pdGlhbGl6ZXIobmV3IFN0cmluZ1tdIHsKLQkJCSJURVNUX0xJQiIsICIvUDEvbGliLmphciIsCi0JCQkiVEVTVF9TUkMiLCAiL1AxL3NyYy56aXAiLAotCQkJIlRFU1RfUk9PVCIsICJzcmMiLAotCQl9KSk7Ci0JCUlKYXZhUHJvamVjdCBwMiA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHt9LCBuZXcgU3RyaW5nW10geyJURVNUX0xJQixURVNUX1NSQyxURVNUX1JPT1QifSwgIiIpOwotCi0JCS8vIHNpbXVsYXRlIHN0YXRlIG9uIHN0YXJ0dXAgKGZsdXNoIHZhcmlhYmxlcywgYW5kIHByZXNlcnZlIHRoZWlyIHByZXZpb3VzIHZhbHVlcykKLQkJSmF2YU1vZGVsTWFuYWdlci5QcmV2aW91c1Nlc3Npb25WYXJpYWJsZXMgPSBKYXZhTW9kZWxNYW5hZ2VyLlZhcmlhYmxlczsKLQkJSmF2YU1vZGVsTWFuYWdlci5WYXJpYWJsZXMgPSBuZXcgSGFzaE1hcCg1KTsKLQkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkucmVtb3ZlUGVyUHJvamVjdEluZm8oKEphdmFQcm9qZWN0KXAyKTsKLQkJcDIuY2xvc2UoKTsKLQkJCi0JCXN0YXJ0RGVsdGFzKCk7Ci0JCS8vSmF2YU1vZGVsTWFuYWdlci5DUF9SRVNPTFZFX1ZFUkJPU0U9dHJ1ZTsJCQotCQlwMi5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKTsKLQkJCi0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIG9uIHN0YXJ0dXAiLCAKLQkJCSIiCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJLy9KYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRT1mYWxzZTsJCQotCQlzdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDEiKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMiIpOwotCQlWYXJpYWJsZXNJbml0aWFsaXplci5yZXNldCgpOwotCX0KLX0KLXB1YmxpYyB2b2lkIHRlc3RWYXJpYWJsZUluaXRpYWxpemVyNCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlmaW5hbCBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlWYXJpYWJsZXNJbml0aWFsaXplci5zZXRJbml0aWFsaXplcihuZXcgVmFyaWFibGVzSW5pdGlhbGl6ZXIuSVRlc3RJbml0aWFsaXplcigpIHsKLQkJCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoU3RyaW5nIHZhcmlhYmxlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJCQlidWZmZXIuYXBwZW5kKCJJbml0aWFsaXppbmcgIiArIHZhcmlhYmxlICsgIlxuIik7Ci0JCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHZhcmlhYmxlLnRvTG93ZXJDYXNlKCkpOwotCQkJCWJ1ZmZlci5hcHBlbmQoIlNldHRpbmcgdmFyaWFibGUgIiArIHZhcmlhYmxlICsgIiB0byAiICsgcGF0aCArICJcbiIpOwotCQkJCUphdmFDb3JlLnNldENsYXNzcGF0aFZhcmlhYmxlKHZhcmlhYmxlLCBwYXRoLCBudWxsKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10ge30sIG5ldyBTdHJpbmdbXSB7IlRFU1RfTElCLFRFU1RfU1JDLFRFU1RfUk9PVCJ9LCAiIik7Ci0JCWFzc2VydEVxdWFscygKLQkJCSJJbml0aWFsaXppbmcgVEVTVF9MSUJcbiIgKwotCQkJIlNldHRpbmcgdmFyaWFibGUgVEVTVF9MSUIgdG8gdGVzdF9saWJcbiIsCi0JCQlidWZmZXIudG9TdHJpbmcoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JCVZhcmlhYmxlc0luaXRpYWxpemVyLnJlc2V0KCk7Ci0JfQotfQotcHVibGljIHZvaWQgdGVzdFZhcmlhYmxlSW5pdGlhbGl6ZXI1KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCWZpbmFsIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVZhcmlhYmxlc0luaXRpYWxpemVyLnNldEluaXRpYWxpemVyKG5ldyBWYXJpYWJsZXNJbml0aWFsaXplci5JVGVzdEluaXRpYWxpemVyKCkgewotCQkJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShTdHJpbmcgdmFyaWFibGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkJCWJ1ZmZlci5hcHBlbmQoIkluaXRpYWxpemluZyAiICsgdmFyaWFibGUgKyAiXG4iKTsKLQkJCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgodmFyaWFibGUudG9Mb3dlckNhc2UoKSk7Ci0JCQkJSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoVmFyaWFibGUoIlRFU1RfU1JDIik7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiU2V0dGluZyB2YXJpYWJsZSAiICsgdmFyaWFibGUgKyAiIHRvICIgKyBwYXRoICsgIlxuIik7Ci0JCQkJSmF2YUNvcmUuc2V0Q2xhc3NwYXRoVmFyaWFibGUodmFyaWFibGUsIHBhdGgsIG51bGwpOwotCQkJfQotCQl9KTsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7fSwgbmV3IFN0cmluZ1tdIHsiVEVTVF9MSUIsVEVTVF9TUkMsVEVTVF9ST09UIn0sICIiKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJIkluaXRpYWxpemluZyBURVNUX0xJQlxuIiArCi0JCQkiSW5pdGlhbGl6aW5nIFRFU1RfU1JDXG4iICsKLQkJCSJTZXR0aW5nIHZhcmlhYmxlIFRFU1RfU1JDIHRvIHRlc3Rfc3JjXG4iICsKLQkJCSJTZXR0aW5nIHZhcmlhYmxlIFRFU1RfTElCIHRvIHRlc3RfbGliXG4iLAotCQkJYnVmZmVyLnRvU3RyaW5nKCkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCQlWYXJpYWJsZXNJbml0aWFsaXplci5yZXNldCgpOwotCX0KLX0KLS8qCi0gKiBFbnN1cmVzIHRoYXQgaWYgdGhlIGluaXRpYWxpemVyIGRvZXNuJ3QgaW5pdGlhbGl6ZSBhIHZhcmlhYmxlLCBpdCBjYW4gYmUKLSAqIGluaXRpYWxpemVkIGxhdGVyIG9uLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0VmFyaWFibGVJbml0aWFsaXplcjYoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJVmFyaWFibGVzSW5pdGlhbGl6ZXIuc2V0SW5pdGlhbGl6ZXIobmV3IFZhcmlhYmxlc0luaXRpYWxpemVyLklUZXN0SW5pdGlhbGl6ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFN0cmluZyB2YXJpYWJsZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJCWJ1ZmZlci5hcHBlbmQoIklnbm9yaW5nIHJlcXVlc3QgdG8gaW5pdGlhbGl6ZSIpOwotCQkJfQotCQl9KTsKLQkJSVBhdGggcGF0aCA9IEphdmFDb3JlLmdldENsYXNzcGF0aFZhcmlhYmxlKCJURVNUX1NSQyIpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVW5leHBlY3RlZCB2YWx1ZSBvZiBURVNUX1NSQyBhZnRlciBpbml0aWFsaXplciB3YXMgY2FsbGVkIiwKLQkJCW51bGwsCi0JCQlwYXRoKTsKLQkJSVBhdGggdmFyVmFsdWUgPSBuZXcgUGF0aCgic3JjLnppcCIpOwotCQlKYXZhQ29yZS5zZXRDbGFzc3BhdGhWYXJpYWJsZSgiVEVTVF9TUkMiLCB2YXJWYWx1ZSwgbnVsbCk7Ci0JCXBhdGggPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhWYXJpYWJsZSgiVEVTVF9TUkMiKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlVuZXhwZWN0ZWQgdmFsdWUgb2YgVEVTVF9TUkMgYWZ0ZXIgc2V0dGluZyBpdCIsCi0JCQl2YXJWYWx1ZSwKLQkJCXBhdGgpOwotCX0gZmluYWxseSB7Ci0JCVZhcmlhYmxlc0luaXRpYWxpemVyLnJlc2V0KCk7Ci0JfQotfQotcHVibGljIHZvaWQgdGVzdFZhcmlhYmxlSW5pdGlhbGl6ZXI3KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlUHJvamVjdCgiUDEiKTsKLQkJdGhpcy5jcmVhdGVGaWxlKCIvUDEvbGliLmphciIsICIiKTsKLQkJdGhpcy5jcmVhdGVGaWxlKCIvUDEvc3JjLnppcCIsICIiKTsKLQkJVmFyaWFibGVzSW5pdGlhbGl6ZXIuc2V0SW5pdGlhbGl6ZXIobmV3IERlZmF1bHRWYXJpYWJsZUluaXRpYWxpemVyKG5ldyBTdHJpbmdbXSB7Ci0JCQkiVEVTVF9MSUIiLCAiL1AxL2xpYi5qYXIiLAotCQkJIlRFU1RfU1JDIiwgIi9QMS9zcmMuemlwIiwKLQkJCSJURVNUX1JPT1QiLCAic3JjIiwKLQkJfSkpOwotCQlJSmF2YVByb2plY3QgcDIgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMiIsIG5ldyBTdHJpbmdbXSB7fSwgbmV3IFN0cmluZ1tdIHsiVEVTVF9MSUIsVEVTVF9TUkMsVEVTVF9ST09UIn0sICIiKTsKLQotCQkvLyBjaGFuZ2UgdmFsdWUgb2YgVEVTVF9MSUIKLQkJdGhpcy5jcmVhdGVGaWxlKCIvUDEvbGliMi5qYXIiLCAiIik7Ci0JCVZhcmlhYmxlc0luaXRpYWxpemVyLnNldEluaXRpYWxpemVyKG5ldyBEZWZhdWx0VmFyaWFibGVJbml0aWFsaXplcihuZXcgU3RyaW5nW10gewotCQkJIlRFU1RfTElCIiwgIi9QMS9saWIyLmphciIsCi0JCQkiVEVTVF9TUkMiLCAiL1AxL3NyYy56aXAiLAotCQkJIlRFU1RfUk9PVCIsICJzcmMiLAotCQl9KSk7Ci0KLQkJLy8gc2ltdWxhdGUgc3RhdGUgb24gc3RhcnR1cCAoZmx1c2ggdmFyaWFibGVzLCBhbmQgcHJlc2VydmUgdGhlaXIgcHJldmlvdXMgdmFsdWVzKQotCQlKYXZhTW9kZWxNYW5hZ2VyLlByZXZpb3VzU2Vzc2lvblZhcmlhYmxlcyA9IEphdmFNb2RlbE1hbmFnZXIuVmFyaWFibGVzOwotCQlKYXZhTW9kZWxNYW5hZ2VyLlZhcmlhYmxlcyA9IG5ldyBIYXNoTWFwKDUpOwotCQlKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5yZW1vdmVQZXJQcm9qZWN0SW5mbygoSmF2YVByb2plY3QpcDIpOwotCQlwMi5jbG9zZSgpOwotCQkKLQkJc3RhcnREZWx0YXMoKTsKLQkJLy9KYXZhTW9kZWxNYW5hZ2VyLkNQX1JFU09MVkVfVkVSQk9TRT10cnVlOwkJCi0JCXAyLmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOwotCQkKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEgb24gc3RhcnR1cCIsIAotCQkJIlAyWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCS9QMS9saWIuamFyWypdOiB7UkVNT1ZFRCBGUk9NIENMQVNTUEFUSH1cbiIgKyAKLQkJCSIJL1AxL2xpYjIuamFyWypdOiB7QURERUQgVE8gQ0xBU1NQQVRIfSIKLQkJKTsKLQl9IGZpbmFsbHkgewotCQkvL0phdmFNb2RlbE1hbmFnZXIuQ1BfUkVTT0xWRV9WRVJCT1NFPWZhbHNlOwkJCi0JCXN0b3BEZWx0YXMoKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMSIpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAyIik7Ci0JCVZhcmlhYmxlc0luaXRpYWxpemVyLnJlc2V0KCk7Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0NsYXNzcGF0aFRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvQ2xhc3NwYXRoVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg2MzQzMS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvQ2xhc3NwYXRoVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMudXRpbC5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YVByb2plY3Q7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgQ2xhc3NwYXRoVGVzdHMgZXh0ZW5kcyBNb2RpZnlpbmdSZXNvdXJjZVRlc3RzIHsKLQotCXB1YmxpYyBjbGFzcyBUZXN0Q29udGFpbmVyIGltcGxlbWVudHMgSUNsYXNzcGF0aENvbnRhaW5lciB7Ci0JCUlQYXRoIHBhdGg7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXM7Ci0JCVRlc3RDb250YWluZXIoSVBhdGggcGF0aCwgSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyl7Ci0JCQl0aGlzLnBhdGggPSBwYXRoOwotCQkJdGhpcy5lbnRyaWVzID0gZW50cmllczsKLQkJfQotCQlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsgcmV0dXJuIHRoaXMucGF0aDsgfQotCQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gZ2V0Q2xhc3NwYXRoRW50cmllcygpIHsgcmV0dXJuIHRoaXMuZW50cmllczsJfQotCQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeyByZXR1cm4gdGhpcy5wYXRoLnRvU3RyaW5nKCk7IAl9Ci0JCXB1YmxpYyBpbnQgZ2V0S2luZCgpIHsgcmV0dXJuIDA7IH0KLQl9OwotCi1wdWJsaWMgQ2xhc3NwYXRoVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXByb3RlY3RlZCB2b2lkIGFzc2VydEN5Y2xlTWFya2VycyhJSmF2YVByb2plY3QgcHJvamVjdCwgSUphdmFQcm9qZWN0W10gcCwgaW50W10gZXhwZWN0ZWRDeWNsZVBhcnRpY2lwYW50cykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCVN0cmluZ0J1ZmZlciBleHBlY3RlZCA9IG5ldyBTdHJpbmdCdWZmZXIoInsiKTsKLQlpbnQgZXhwZWN0ZWRDb3VudCA9IDA7Ci0JU3RyaW5nQnVmZmVyIGNvbXB1dGVkID0gbmV3IFN0cmluZ0J1ZmZlcigieyIpOwkJCQotCWludCBjb21wdXRlZENvdW50ID0gMDsKLQlmb3IgKGludCBqID0gMDsgaiA8IHAubGVuZ3RoOyBqKyspewotCQlpbnQgbWFya2VyQ291bnQgPSB0aGlzLm51bWJlck9mQ3ljbGVNYXJrZXJzKHBbal0pOwotCQlpZiAobWFya2VyQ291bnQgPiAwKXsKLQkJCWlmIChjb21wdXRlZENvdW50KysgPiAwKSBjb21wdXRlZC5hcHBlbmQoIiwgIik7Ci0JCQljb21wdXRlZC5hcHBlbmQocFtqXS5nZXRFbGVtZW50TmFtZSgpKTsKLQkJCS8vY29tcHV0ZWQuYXBwZW5kKCIgKCIgKyBtYXJrZXJDb3VudCArICIpIik7Ci0JCX0KLQkJbWFya2VyQ291bnQgPSBleHBlY3RlZEN5Y2xlUGFydGljaXBhbnRzW2pdOwotCQlpZiAobWFya2VyQ291bnQgPiAwKXsKLQkJCWlmIChleHBlY3RlZENvdW50KysgPiAwKSBleHBlY3RlZC5hcHBlbmQoIiwgIik7Ci0JCQlleHBlY3RlZC5hcHBlbmQocFtqXS5nZXRFbGVtZW50TmFtZSgpKTsKLQkJCS8vZXhwZWN0ZWQuYXBwZW5kKCIgKCIgKyBtYXJrZXJDb3VudCArICIpIik7Ci0JCX0KLQl9Ci0JZXhwZWN0ZWQuYXBwZW5kKCJ9Iik7Ci0JY29tcHV0ZWQuYXBwZW5kKCJ9Iik7Ci0JYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGN5Y2xlIGRldGVjdGlvbiBhZnRlciBzZXR0aW5nIGNsYXNzcGF0aCBmb3I6ICIrcHJvamVjdC5nZXRFbGVtZW50TmFtZSgpLCBleHBlY3RlZC50b1N0cmluZygpLCBjb21wdXRlZC50b1N0cmluZygpKTsKLX0KLXByb3RlY3RlZCB2b2lkIGFzc2VydE1hcmtlcnMoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBleHBlY3RlZE1hcmtlcnMsIElKYXZhUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSU1hcmtlcltdIG1hcmtlcnMgPSBwcm9qZWN0LmdldFByb2plY3QoKS5maW5kTWFya2VycyhJSmF2YU1vZGVsTWFya2VyLkJVSUxEUEFUSF9QUk9CTEVNX01BUktFUiwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQl0aGlzLnNvcnRNYXJrZXJzKG1hcmtlcnMpOwotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG1hcmtlcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCQlidWZmZXIuYXBwZW5kKG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0JCWlmIChpICE9IGxlbmd0aC0xKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCJcbiIpOwotCQl9Ci0JfQotCVN0cmluZyBhY3R1YWwgPSBidWZmZXIudG9TdHJpbmcoKTsKLQlpZiAoIWV4cGVjdGVkTWFya2Vycy5lcXVhbHMoYWN0dWFsKSkgewotCSAJU3lzdGVtLm91dC5wcmludGxuKFV0aWwuZGlzcGxheVN0cmluZyhhY3R1YWwsIDIpKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkTWFya2VycywgYWN0dWFsKTsKLX0KLXByb3RlY3RlZCBGaWxlIGNyZWF0ZUZpbGUoRmlsZSBwYXJlbnQsIFN0cmluZyBuYW1lLCBTdHJpbmcgY29udGVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXJlbnQsIG5hbWUpOwotCUZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0Jb3V0LndyaXRlKGNvbnRlbnQuZ2V0Qnl0ZXMoKSk7Ci0Jb3V0LmNsb3NlKCk7Ci0JLyoKLQkgKiBOZWVkIHRvIGNoYW5nZSB0aGUgdGltZSBzdGFtcCB0byByZWFsaXplIHRoYXQgdGhlIGZpbGUgaGFzIGJlZW4gbW9kaWZpZWQKLQkgKi8KLQlmaWxlLnNldExhc3RNb2RpZmllZChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIDIwMDApOwotCXJldHVybiBmaWxlOwotfQotcHJvdGVjdGVkIEZpbGUgY3JlYXRlRm9sZGVyKEZpbGUgcGFyZW50LCBTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXJlbnQsIG5hbWUpOwotCWZpbGUubWtkaXJzKCk7Ci0JcmV0dXJuIGZpbGU7Ci19Ci1wcm90ZWN0ZWQgaW50IG51bWJlck9mQ3ljbGVNYXJrZXJzKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUlNYXJrZXJbXSBtYXJrZXJzID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmZpbmRNYXJrZXJzKElKYXZhTW9kZWxNYXJrZXIuQlVJTERQQVRIX1BST0JMRU1fTUFSS0VSLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCWludCByZXN1bHQgPSAwOwotCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBtYXJrZXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJU3RyaW5nIGN5Y2xlQXR0ciA9IChTdHJpbmcpbWFya2VyLmdldEF0dHJpYnV0ZShJSmF2YU1vZGVsTWFya2VyLkNZQ0xFX0RFVEVDVEVEKTsKLQkJaWYgKGN5Y2xlQXR0ciAhPSBudWxsICYmIGN5Y2xlQXR0ci5lcXVhbHMoInRydWUiKSl7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc3VsdCsrOwotCQl9Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNvcnRNYXJrZXJzKElNYXJrZXJbXSBtYXJrZXJzKSB7Ci0Jb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuVXRpbC5Db21wYXJlciBjb21wYXJlciA9IG5ldyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5VdGlsLkNvbXBhcmVyKCkgewotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCQlJTWFya2VyIG1hcmtlckEgPSAoSU1hcmtlcilhOwotCQkJSU1hcmtlciBtYXJrZXJCID0gKElNYXJrZXIpYjsKLQkJCXJldHVybiBtYXJrZXJBLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UsICIiKS5jb21wYXJlVG8obWFya2VyQi5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX07Ci0Jb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuVXRpbC5zb3J0KG1hcmtlcnMsIGNvbXBhcmVyKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQotCWlmIChmYWxzZSl7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBTdWl0ZShDbGFzc3BhdGhUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBDbGFzc3BhdGhUZXN0cygidGVzdE5vQ3ljbGVEZXRlY3Rpb24yIikpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCXJldHVybiBuZXcgU3VpdGUoQ2xhc3NwYXRoVGVzdHMuY2xhc3MpOwkKLX0KLS8qKgotICogQWRkIGFuIGVudHJ5IHRvIHRoZSBjbGFzc3BhdGggZm9yIGEgbm9uLWV4aXN0ZW50IHJvb3QuIFRoZW4gY3JlYXRlCi0gKiB0aGUgcm9vdCBhbmQgZW5zdXJlIHRoYXQgaXQgY29tZXMgYWxpdmUuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDbGFzc3BhdGhBZGRSb290KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JSUNsYXNzcGF0aEVudHJ5W10gb3JpZ2luYWxDUD0gcHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQotCXRyeSB7Ci0JCUlDbGFzc3BhdGhFbnRyeSBuZXdFbnRyeT0gSmF2YUNvcmUubmV3U291cmNlRW50cnkocHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKS5hcHBlbmQoImV4dHJhIikpOwotCi0JCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0NQPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29yaWdpbmFsQ1AubGVuZ3RoICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkob3JpZ2luYWxDUCwgMCAsIG5ld0NQLCAwLCBvcmlnaW5hbENQLmxlbmd0aCk7Ci0JCW5ld0NQW29yaWdpbmFsQ1AubGVuZ3RoXT0gbmV3RW50cnk7Ci0KLQkJcHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q1AsIG51bGwpOwotCi0KLQkJLy8gbm93IGNyZWF0ZSB0aGUgYWN0dWFsIHJlc291cmNlIGZvciB0aGUgcm9vdCBhbmQgcG9wdWxhdGUgaXQKLQkJcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJleHRyYSIpLmNyZWF0ZShmYWxzZSwgdHJ1ZSwgbnVsbCk7Ci0KLQkJSVBhY2thZ2VGcmFnbWVudFJvb3QgbmV3Um9vdD0gZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgiUCIsICJleHRyYSIpOwotCQlhc3NlcnRUcnVlKCJOZXcgcm9vdCBzaG91bGQgbm93IGJlIHZpc2libGUiLCBuZXdSb290ICE9IG51bGwpOwotCX0gZmluYWxseSB7Ci0JCS8vIGNsZWFudXAgIAotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCB0aGUgcmVvcmRlcmluZyBleHRlcm5hbCByZXNvdXJjZXMgaW4gdGhlIGNsYXNzcGF0aAotICogZ2VuZXJhdGVzIHRoZSBjb3JyZWN0IGRlbHRhcy4KLSAqLwotcHVibGljIHZvaWQgdGVzdENsYXNzcGF0aENoYW5nZUV4dGVybmFsUmVzb3VyY2VzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0KLQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3RW50cmllcyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbMl07Ci0JCW5ld0VudHJpZXNbMF0gPSBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkoZ2V0RXh0ZXJuYWxKQ0xQYXRoKCksIG51bGwsIG51bGwsIGZhbHNlKTsKLQkJbmV3RW50cmllc1sxXSA9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShnZXRFeHRlcm5hbEpDTFNvdXJjZVBhdGgoKSwgbnVsbCwgbnVsbCwgZmFsc2UpOwotCQlzZXRDbGFzc3BhdGgocHJvaiwgbmV3RW50cmllcyk7Ci0JCXN0YXJ0RGVsdGFzKCk7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIHN3YXBwZWRFbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVsyXTsKLQkJc3dhcHBlZEVudHJpZXNbMF0gPSBuZXdFbnRyaWVzWzFdOwotCQlzd2FwcGVkRW50cmllc1sxXSA9IG5ld0VudHJpZXNbMF07Ci0JCXNldENsYXNzcGF0aChwcm9qLCBzd2FwcGVkRW50cmllcyk7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIiwKLQkJCSJQWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCSIgKyBnZXRFeHRlcm5hbEpDTFBhdGgoKS50b1N0cmluZygpICsgIlsqXToge1JFT1JERVJFRH1cbiIgKyAKLQkJCSIJIiArIGdldEV4dGVybmFsSkNMU291cmNlUGF0aCgpLnRvU3RyaW5nKCkgKyAiWypdOiB7UkVPUkRFUkVEfVxuIiArIAotCQkJIglSZXNvdXJjZURlbHRhKC9QLy5jbGFzc3BhdGgpWypdIgotCQkpOwotCX0gZmluYWxseSB7Ci0JCXN0b3BEZWx0YXMoKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotCi0vKgotICogVGVzdCBjbGFzc3BhdGggY29ycnVwdGlvbiAoMjM5NzcpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDbGFzc3BhdGhDb3JydXB0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCUphdmFQcm9qZWN0IHAxID0gKEphdmFQcm9qZWN0KXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAxIiwgbmV3IFN0cmluZ1tdeyIifSwgbmV3IFN0cmluZ1tde30sIG5ldyBTdHJpbmdbXXt9LCAiIik7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdeyIifSwgbmV3IFN0cmluZ1tde30sIG5ldyBTdHJpbmdbXXt9LCAiIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgiUDIvZm9vLnR4dCIsICJub3QgYSBwcm9qZWN0Iik7Ci0JCVN0cmluZyBuZXdDUENvbnRlbnQgPSAKLQkJCSI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4gXG4iCi0JCQkrIjxjbGFzc3BhdGg+CVxuIgotCQkJKyIJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9XCJzcmNcIiBwYXRoPVwiXCIvPglcbiIKLQkJCSsiCTxjbGFzc3BhdGhlbnRyeSBraW5kPVwic3JjXCIgcGF0aD1cIi9QMi9mb28udHh0XCIvPglcbiIgLy8gY29ycnVwdGlvbiBoZXJlOiB0YXJnZXQgaXNuJ3QgYSBwcm9qZWN0Ci0JCQkrIgk8Y2xhc3NwYXRoZW50cnkga2luZD1cIm91dHB1dFwiIHBhdGg9XCJcIi8+CVxuIgotCQkJKyI8L2NsYXNzcGF0aD4JXG4iOwotCi0JCUlGaWxlIGZpbGVSc2MgPSBwMS5nZXRQcm9qZWN0KCkuZ2V0RmlsZShKYXZhUHJvamVjdC5DTEFTU1BBVEhfRklMRU5BTUUpOwotCQlmaWxlUnNjLnNldENvbnRlbnRzKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXdDUENvbnRlbnQuZ2V0Qnl0ZXMoKSksIHRydWUsIGZhbHNlLCBudWxsKTsKLS8qCi0JCUZpbGUgZmlsZSA9IHAxLmdldFByb2plY3QoKS5nZXRGaWxlKEphdmFQcm9qZWN0LkNMQVNTUEFUSF9GSUxFTkFNRSkuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKTsKLQkJaWYgKGZpbGUuZXhpc3RzKCkpewotCQkJY2hhcltdIGNsYXNzcGF0aCA9IFV0aWwuZ2V0RmlsZUNoYXJDb250ZW50KGZpbGUsICJVVEYtOCIpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKG5ldyBTdHJpbmcoY2xhc3NwYXRoKSk7Ci0JCX0KLSovCi0JCXAxLmNsb3NlKCk7Ci0JCUphdmFNb2RlbE1hbmFnZXIuUGVyUHJvamVjdEluZm8gcGVyUHJvamVjdEluZm8gPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRQZXJQcm9qZWN0SW5mbyhwMS5nZXRQcm9qZWN0KCksIHRydWUvKmNyZWF0ZSBpZiBtaXNzaW5nKi8pOwotCQlwZXJQcm9qZWN0SW5mby5jbGFzc3BhdGggPSBudWxsOwotCQlwZXJQcm9qZWN0SW5mby5sYXN0UmVzb2x2ZWRDbGFzc3BhdGggPSBudWxsOwotCi0JCS8vIHNob3VsZG4ndCBmYWlsCi0JCXAxLmdldEV4cGFuZGVkQ2xhc3NwYXRoKHRydWUsIHRydWUpOwotCi0JCS8vIGlmIGNvdWxkIHJlYWNoIHRoYXQgZmFyLCB0aGVuIGFsbCBpcyBmaW5lCi0JCQotCX0gY2F0Y2goQ2xhc3NDYXN0RXhjZXB0aW9uIGUpewotCQlhc3NlcnRUcnVlKCJpbnRlcm5hbCBDbGFzc0Nhc3RFeGNlcHRpb24gb24gY29ycnVwdGVkIGNsYXNzcGF0aCBmaWxlIiwgZmFsc2UpOwotCX0gZmluYWxseSB7Ci0JCS8vIGNsZWFudXAgIAotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAxIik7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0KLS8qKgotICogRW5zdXJlcyB0aGF0IHRoZSBzZXR0aW5nIHRoZSBjbGFzc3BhdGggd2l0aCBhIGxpYnJhcnkgZW50cnkKLSAqIGNoYW5nZXMgdGhlIGtpbmQgb2YgdGhlIHJvb3QgZnJvbSBLX1NPVVJDRSB0byBLX0JJTkFSWS4KLSAqLwotcHVibGljIHZvaWQgdGVzdENsYXNzcGF0aENyZWF0ZUxpYnJhcnlFbnRyeSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvaiA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoIlAvc3JjL1guamF2YSIsICJwdWJsaWMgY2xhc3MgWCB7fSIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoIlAvc3JjL1guY2xhc3MiLCAiIik7Ci0JCi0JCUlGb2xkZXIgcm9vdEZvbGRlciA9IHByb2ouZ2V0UHJvamVjdCgpLmdldEZvbGRlcihuZXcgUGF0aCgic3JjIikpOwotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gcHJvai5nZXRQYWNrYWdlRnJhZ21lbnRSb290KHJvb3RGb2xkZXIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlVuZXhwZWN0ZWQgcm9vdCBraW5kIDEiLCAKLQkJCUlQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFLAotCQkJcm9vdC5nZXRLaW5kKCkpOwotCQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KCIiKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlVuZXhwZWN0ZWQgbnVtYmVycyBvZiBjb21waWxhdGlvbiB1bml0cyIsCi0JCQkxLAotCQkJcGtnLmdldENvbXBpbGF0aW9uVW5pdHMoKS5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVW5leHBlY3RlZCBudW1iZXJzIG9mIC5jbGFzcyBmaWxlcyIsCi0JCQkwLAotCQkJcGtnLmdldENsYXNzRmlsZXMoKS5sZW5ndGgpOwotCQkJCi0JCXRoaXMuc2V0Q2xhc3NwYXRoKAotCQkJcHJvaiwgCi0JCQluZXcgSUNsYXNzcGF0aEVudHJ5W10gewotCQkJCUphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShyb290Rm9sZGVyLmdldEZ1bGxQYXRoKCksIG51bGwsIG51bGwsIGZhbHNlKQotCQkJfSk7Ci0JCWFzc2VydEVxdWFscygKLQkJCSJVbmV4cGVjdGVkIHJvb3Qga2luZCAyIiwgCi0JCQlJUGFja2FnZUZyYWdtZW50Um9vdC5LX0JJTkFSWSwKLQkJCXJvb3QuZ2V0S2luZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlVuZXhwZWN0ZWQgbnVtYmVycyBvZiBjb21waWxhdGlvbiB1bml0cyIsCi0JCQkwLAotCQkJcGtnLmdldENvbXBpbGF0aW9uVW5pdHMoKS5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVW5leHBlY3RlZCBudW1iZXJzIG9mIC5jbGFzcyBmaWxlcyIsCi0JCQkxLAotCQkJcGtnLmdldENsYXNzRmlsZXMoKS5sZW5ndGgpOwotCi0JCS8vZW5zdXJlIHRoYXQgdGhlIG5ldyBraW5kIGhhcyBiZWVuIHBlcnNpc3RlZCBpbiB0aGUgY2xhc3NwYXRoIGZpbGUKLQkJcHJvai5jbG9zZSgpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVW5leHBlY3RlZCByb290IGtpbmQgMyIsIAotCQkJSVBhY2thZ2VGcmFnbWVudFJvb3QuS19CSU5BUlksCi0JCQlyb290LmdldEtpbmQoKSk7Ci0KLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCB0aGUgc2V0dGluZyB0aGUgY2xhc3NwYXRoIHdpdGggYSBuZXcgbGlicmFyeSBlbnRyeSBmb3IgYSAKLSAqIGxvY2FsIGphciB3b3JrcyBhbmQgZ2VuZXJhdGVzIHRoZSBjb3JyZWN0IGRlbHRhcy4KLSAqLwotcHVibGljIHZvaWQgdGVzdENsYXNzcGF0aENyZWF0ZUxvY2FsSmFyTGlicmFyeUVudHJ5KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUlKYXZhUHJvamVjdCBwcm9qID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7IiJ9LCAiIik7Ci0JSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoIlAiLCAiIik7Ci0JSUNsYXNzcGF0aEVudHJ5IG5ld0VudHJ5PSBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkoZ2V0RXh0ZXJuYWxKQ0xQYXRoKCksIG51bGwsIG51bGwsIGZhbHNlKTsKLQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdFbnRyaWVzPSBuZXcgSUNsYXNzcGF0aEVudHJ5W117bmV3RW50cnl9OwotCUlQYWNrYWdlRnJhZ21lbnRSb290IG5ld1Jvb3Q9IHByb2ouZ2V0UGFja2FnZUZyYWdtZW50Um9vdChnZXRFeHRlcm5hbEpDTFBhdGhTdHJpbmcoKSk7Ci0KLQlzdGFydERlbHRhcygpOwotCQotCXNldENsYXNzcGF0aChwcm9qLG5ld0VudHJpZXMpOwotCi0JdHJ5IHsKLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJzaG91bGQgYmUgb25lIGRlbHRhIHdpdGggMiBncmFuZC1jaGlsZHJlbiAtIHJlbW92ZWQgJiBhZGRlZCIsIAotCQkJdGhpcy5kZWx0YUxpc3RlbmVyLmRlbHRhcy5sZW5ndGggPT0gMSAmJiAKLQkJCXRoaXMuZGVsdGFMaXN0ZW5lci5kZWx0YXNbMF0uZ2V0QWZmZWN0ZWRDaGlsZHJlbigpLmxlbmd0aCA9PSAxICYmCi0JCQl0aGlzLmRlbHRhTGlzdGVuZXIuZGVsdGFzWzBdLmdldEFmZmVjdGVkQ2hpbGRyZW4oKVswXS5nZXRBZmZlY3RlZENoaWxkcmVuKCkubGVuZ3RoID09IDIpOwotCQlJSmF2YUVsZW1lbnREZWx0YSBkPSBudWxsOwotCQlhc3NlcnRUcnVlKCJyb290IHNob3VsZCBiZSByZW1vdmVkIGZyb20gY2xhc3NwYXRoIiwoZD0gZ2V0RGVsdGFGb3Iocm9vdCwgdHJ1ZSkpICE9IG51bGwgJiYKLQkJCQkoZC5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9SRU1PVkVEX0ZST01fQ0xBU1NQQVRIKSA+IDApOwotCi0JCQotCQlhc3NlcnRUcnVlKCJyb290IHNob3VsZCBiZSBhZGRlZCB0byBjbGFzc3BhdGgiLCAoZD0gZ2V0RGVsdGFGb3IobmV3Um9vdCwgdHJ1ZSkpICE9IG51bGwgJiYKLQkJCQkoZC5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9BRERFRF9UT19DTEFTU1BBVEgpID4gMCk7Ci0JfSBmaW5hbGx5IHsKLQkJc3RvcERlbHRhcygpOwotCQotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0KLS8qKgotICogVGVzdHMgdGhlIGNyb3NzIHByb2plY3QgY2xhc3NwYXRoIHNldHRpbmcKLSAqLwotcHVibGljIHZvaWQgdGVzdENsYXNzcGF0aENyb3NzUHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlJSmF2YVByb2plY3QgcHJvamVjdCA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAxIiwgbmV3IFN0cmluZ1tdIHsiIn0sICIiKTsKLQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMiIsIG5ldyBTdHJpbmdbXSB7fSwgIiIpOwotCXRyeSB7Ci0JCXN0YXJ0RGVsdGFzKCk7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290IG9sZFJvb3Q9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoIlAxIiwgIiIpOwotIAkJSUNsYXNzcGF0aEVudHJ5IHByb2plY3RFbnRyeT0gSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KG5ldyBQYXRoKCIvUDIiKSwgZmFsc2UpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdDbGFzc3BhdGg9IG5ldyBJQ2xhc3NwYXRoRW50cnlbXXtwcm9qZWN0RW50cnl9OwotCQlwcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXdDbGFzc3BhdGgsIG51bGwpOwotCQlwcm9qZWN0LmdldEFsbFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0JCUlKYXZhRWxlbWVudERlbHRhIHJlbW92ZWREZWx0YT0gZ2V0RGVsdGFGb3Iob2xkUm9vdCwgdHJ1ZSk7Ci0JCWFzc2VydFRydWUoIkRlbHRhcyBub3QgY29ycmVjdCBmb3IgY3Jvc3Nwcm9qZWN0IGNsYXNzcGF0aCBzZXR0aW5nIiwgCi0JCQl0aGlzLmRlbHRhTGlzdGVuZXIuZGVsdGFzLmxlbmd0aCA9PSAxICYmCi0JCQl0aGlzLmRlbHRhTGlzdGVuZXIuZGVsdGFzWzBdLmdldEFmZmVjdGVkQ2hpbGRyZW4oKS5sZW5ndGggPT0gMSAmJgotCQkJcmVtb3ZlZERlbHRhLmdldEVsZW1lbnQoKS5lcXVhbHMob2xkUm9vdCkgJiYKLQkJCXJlbW92ZWREZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQ0hBTkdFRCAmJgotCQkJKHJlbW92ZWREZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9SRU1PVkVEX0ZST01fQ0xBU1NQQVRIKSA+IDAKLQkJKTsKLQl9IGZpbmFsbHkgewotCQlzdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdHMobmV3IFN0cmluZ1tdIHsiUDEiLCAiUDIifSk7Ci0JfQotfQotLyoqCi0gKiBEZWxldGUgYSByb290IGFuZCBlbnN1cmUgdGhlIGNsYXNzcGF0aCBpcyBub3QgdXBkYXRlZCAoaS5lLiBlbnRyeSBpc24ndCByZW1vdmVkKS4KLSAqLwotcHVibGljIHZvaWQgdGVzdENsYXNzcGF0aERlbGV0ZU5lc3RlZFJvb3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUphdmFQcm9qZWN0IHByb2plY3QgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsibmVzdGVkL3NyYyJ9LCBuZXcgU3RyaW5nW10ge2dldEV4dGVybmFsSkNMUGF0aFN0cmluZygpfSwgImJpbiIpOwotCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3Q9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoIlAiLCAibmVzdGVkL3NyYyIpOwotCUlDbGFzc3BhdGhFbnRyeVtdIG9yaWdpbmFsQ1A9IHByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0KLQkvLyBkZWxldGUgdGhlIHJvb3QKLQlkZWxldGVSZXNvdXJjZShyb290LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpKTsKLQotCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0NQPSBwcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCi0JdHJ5IHsKLQkJLy8gc2hvdWxkIHN0aWxsIGJlIGFuIGVudHJ5IGZvciB0aGUgInNyYyIgZm9sZGVyCi0JCWFzc2VydFRydWUoImNsYXNzcGF0aCBzaG91bGQgbm90IGhhdmUgYmVlbiB1cGRhdGVkIiwgCi0JCQluZXdDUC5sZW5ndGggPT0gMiAmJgotCQkJbmV3Q1BbMF0uZXF1YWxzKG9yaWdpbmFsQ1BbMF0pICYmCi0JCQluZXdDUFsxXS5lcXVhbHMob3JpZ2luYWxDUFsxXSkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qCi0gKiBUZXN0IGNsYXNzcGF0aCBkaWFtb25kICgyMzk3OSkKLSAqLwotcHVibGljIHZvaWQgdGVzdENsYXNzcGF0aERpYW1vbmQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDEiLCBuZXcgU3RyaW5nW117IiJ9LCAiIik7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdeyIifSwgbmV3IFN0cmluZ1tde30sIG5ldyBTdHJpbmdbXXsiL1AxIn0sICIiKTsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDMiLCBuZXcgU3RyaW5nW117IiJ9LCBuZXcgU3RyaW5nW117fSwgbmV3IFN0cmluZ1tdeyIvUDEiLCAiL1AyIn0sICIiKTsKLQkJSUphdmFQcm9qZWN0IHA0ID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDQiLCBuZXcgU3RyaW5nW117IiJ9LCBuZXcgU3RyaW5nW117fSwgbmV3IFN0cmluZ1tdeyIvUDIiLCAiL1AzIn0sICIiKTsKLQkKLQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIG5vdCBkZXRlY3QgY3ljbGUiLCAhcDQuaGFzQ2xhc3NwYXRoQ3ljbGUobnVsbCkpOwotCQkKLQl9IGZpbmFsbHkgewotCQkvLyBjbGVhbnVwICAKLQkJdGhpcy5kZWxldGVQcm9qZWN0cyhuZXcgU3RyaW5nW10geyJQMSIsICJQMiIsICJQMyIsICJQNCJ9KTsKLQl9Ci19Ci0gCi0vKioKLSAqIERlbGV0ZSBhIG5lc3RlZCByb290J3MgcGFyZW50IGZvbGRlciBhbmQgZW5zdXJlIHRoZSBjbGFzc3BhdGggaXMKLSAqIG5vdCB1cGRhdGVkIChpLmUuIGVudHJ5IGlzbid0IHJlbW92ZWQpLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q2xhc3NwYXRoRGVsZXRlTmVzdGVkUm9vdFBhcmVudCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlJSmF2YVByb2plY3QgcHJvamVjdCA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyJuZXN0ZWQvc3JjIn0sIG5ldyBTdHJpbmdbXSB7Z2V0RXh0ZXJuYWxKQ0xQYXRoU3RyaW5nKCl9LCAiYmluIik7Ci0JSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdD0gZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgiUCIsICJuZXN0ZWQvc3JjIik7Ci0JSUNsYXNzcGF0aEVudHJ5W10gb3JpZ2luYWxDUD0gcHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQotCS8vIGRlbGV0ZSB0aGUgcm9vdCdzIHBhcmVudCBmb2xkZXIKLQlJRm9sZGVyIGZvbGRlcj0gKElGb2xkZXIpcm9vdC5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKS5nZXRQYXJlbnQoKTsKLQlkZWxldGVSZXNvdXJjZShmb2xkZXIpOwotCi0JSUNsYXNzcGF0aEVudHJ5W10gbmV3Q1A9IHByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0KLQl0cnkgewotCQkKLQkJLy8gc2hvdWxkIHN0aWxsIGJlIGFuIGVudHJ5IGZvciB0aGUgInNyYyIgZm9sZGVyCi0JCWFzc2VydFRydWUoImNsYXNzcGF0aCBzaG91bGQgbm90IGhhdmUgYmVlbiB1cGRhdGVkIiwgCi0JCQluZXdDUC5sZW5ndGggPT0gMiAmJgotCQkJbmV3Q1BbMF0uZXF1YWxzKG9yaWdpbmFsQ1BbMF0pICYmCi0JCQluZXdDUFsxXS5lcXVhbHMob3JpZ2luYWxDUFsxXSkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qKgotICogVGVzdCB0aGF0IGEgY2xhc3NwYXRoIGVudHJ5IGZvciBhbiBleHRlcm5hbCBqYXIgaXMgZXh0ZXJuYWxpemVkCi0gKiBwcm9wZXJseS4KLSAqLwotcHVibGljIHZvaWQgdGVzdENsYXNzcGF0aEV4dGVybmFsaXplKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qZWN0PSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHt9LCBuZXcgU3RyaW5nW10ge2dldEV4dGVybmFsSkNMUGF0aFN0cmluZygpfSwgIiIpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGg9IHByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCUlDbGFzc3BhdGhFbnRyeSBqYXI9IG51bGw7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBjbGFzc3BhdGgubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjbGFzc3BhdGhbaV0uZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZKSB7Ci0JCQkJamFyPSBjbGFzc3BhdGhbaV07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcHJvamVjdC5jbG9zZSgpOwotCQlwcm9qZWN0Lm9wZW4obnVsbCk7Ci0JCi0JCWNsYXNzcGF0aD0gcHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGNsYXNzcGF0aC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGNsYXNzcGF0aFtpXS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkpIHsKLQkJCQlhc3NlcnRUcnVlKCJQYXRocyBtdXN0IGJlIHRoZSBzYW1lIiwgY2xhc3NwYXRoW2ldLmdldFBhdGgoKS5lcXVhbHMoamFyLmdldFBhdGgoKSkpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9ICAgCi0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoqCi0gKiBNb3ZlIGEgcm9vdCBhbmQgZW5zdXJlIHRoZSBjbGFzc3BhdGggaXMgbm90IHVwZGF0ZWQgKGkuZS4gZW50cnkgbm90IHJlbmFtZWQpLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q2xhc3NwYXRoTW92ZU5lc3RlZFJvb3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUphdmFQcm9qZWN0IHByb2plY3QgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsibmVzdGVkL3NyYyJ9LCBuZXcgU3RyaW5nW10ge2dldEV4dGVybmFsSkNMUGF0aFN0cmluZygpfSwgImJpbiIpOwotCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3Q9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoIlAiLCAibmVzdGVkL3NyYyIpOwotCUlDbGFzc3BhdGhFbnRyeVtdIG9yaWdpbmFsQ1A9IHByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0KLQkvLyBkZWxldGUgdGhlIHJvb3QKLQlJRm9sZGVyIGZvbGRlcj0gKElGb2xkZXIpcm9vdC5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQlJUGF0aCBvcmlnaW5hbFBhdGg9IGZvbGRlci5nZXRGdWxsUGF0aCgpOwotCUlQYXRoIG5ld1BhdGg9IG9yaWdpbmFsUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JbmV3UGF0aD0gbmV3UGF0aC5hcHBlbmQobmV3IFBhdGgoIm5ld3NyYyIpKTsKLQotCXN0YXJ0RGVsdGFzKCk7IAotCQotCWZvbGRlci5tb3ZlKG5ld1BhdGgsIHRydWUsIG51bGwpOwotCi0JSUNsYXNzcGF0aEVudHJ5W10gbmV3Q1A9IHByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0KLQlJUGFja2FnZUZyYWdtZW50Um9vdCBuZXdSb290PSBwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJuZXN0ZWQiKS5nZXRGb2xkZXIoIm5ld3NyYyIpKTsgCi0KLQl0cnkgewotCQkvLyBlbnRyeSBmb3IgdGhlICJzcmMiIGZvbGRlciB3YXNuJ3QgcmVwbGFjZWQKLQkJYXNzZXJ0VHJ1ZSgiY2xhc3NwYXRoIG5vdCBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQiLCBuZXdDUC5sZW5ndGggPT0gMiAmJgotCQkJbmV3Q1BbMV0uZXF1YWxzKG9yaWdpbmFsQ1BbMV0pICYmCi0JCQluZXdDUFswXS5lcXVhbHMob3JpZ2luYWxDUFswXSkpOwotCi0JCUlKYXZhRWxlbWVudERlbHRhIHJvb3REZWx0YSA9IGdldERlbHRhRm9yKHJvb3QsIHRydWUpOwotCQlJSmF2YUVsZW1lbnREZWx0YSBwcm9qZWN0RGVsdGEgPSBnZXREZWx0YUZvcihuZXdSb290LmdldFBhcmVudCgpLCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgic2hvdWxkIGdldCBkZWx0YSBmb3IgbW92ZWQgcm9vdCIsIHJvb3REZWx0YSAhPSBudWxsICYmCi0JCQkJcm9vdERlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEICYmCi0JCQkJcm9vdERlbHRhLmdldEZsYWdzKCkgPT0gMCk7Ci0JCWFzc2VydFRydWUoInNob3VsZCBnZXQgZGVsdGEgaW5kaWNhdGluZyBjb250ZW50IGNoYW5nZWQgZm9yIHByb2plY3QiLCB0aGlzLmRlbHRhQ29udGVudENoYW5nZWQocHJvamVjdERlbHRhKSk7Ci0JCi0JfSBmaW5hbGx5IHsKLQkJc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0KLS8qKgotICogTW92ZSBhIHBhcmVudCBvZiBhIG5lc3RlZCByb290IGFuZCBlbnN1cmUgdGhlIGNsYXNzcGF0aCBpcyBub3QgdXBkYXRlZCAoaS5lLiBlbnRyeSBub3QgcmVuYW1lZCkuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDbGFzc3BhdGhNb3ZlTmVzdGVkUm9vdFBhcmVudCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvamVjdCA9dGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7Im5lc3RlZC9zcmMifSwgbmV3IFN0cmluZ1tdIHtnZXRFeHRlcm5hbEpDTFBhdGhTdHJpbmcoKX0sICJiaW4iKTsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdD0gZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgiUCIsICJuZXN0ZWQvc3JjIik7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIG9yaWdpbmFsQ1A9IHByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCi0JCS8vIGRlbGV0ZSB0aGUgcm9vdAotCQlJRm9sZGVyIGZvbGRlcj0gKElGb2xkZXIpcm9vdC5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKS5nZXRQYXJlbnQoKTsKLQkJSVBhdGggb3JpZ2luYWxQYXRoPSBmb2xkZXIuZ2V0RnVsbFBhdGgoKTsKLQkJSVBhdGggbmV3UGF0aD0gb3JpZ2luYWxQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLQkJbmV3UGF0aD0gbmV3UGF0aC5hcHBlbmQobmV3IFBhdGgoIm5ld3NyYyIpKTsKLQkJZm9sZGVyLm1vdmUobmV3UGF0aCwgdHJ1ZSwgbnVsbCk7Ci0JCi0JCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0NQPSBwcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCi0JCS8vIGVudHJ5IGZvciB0aGUgInNyYyIgZm9sZGVyIHdhc24ndCByZXBsYWNlZAotCQkvLyBlbnRyeSBmb3IgdGhlICJzcmMiIGZvbGRlciBzaG91bGQgbm90IGJlIHJlcGxhY2VkCi0JCWFzc2VydFRydWUoImNsYXNzcGF0aCBzaG91bGQgbm90IGF1dG9tYXRpY2FsbHkgYmUgdXBkYXRlZCIsIG5ld0NQLmxlbmd0aCA9PSAyICYmCi0JCQluZXdDUFsxXS5lcXVhbHMob3JpZ2luYWxDUFsxXSkgJiYKLQkJCW5ld0NQWzBdLmVxdWFscyhvcmlnaW5hbENQWzBdKSk7Ci0KLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0vKioKLSAqIFRlc3RzIHRoYXQgbm90aGluZyBvY2N1cnMgd2hlbiBzZXR0aW5nIHRvIHRoZSBzYW1lIGNsYXNzcGF0aAotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q2xhc3NwYXRoTm9DaGFuZ2VzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7IiJ9LCAiIik7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIG9sZENsYXNzcGF0aD0gcC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJc3RhcnREZWx0YXMoKTsKLQkJcC5zZXRSYXdDbGFzc3BhdGgob2xkQ2xhc3NwYXRoLCBudWxsKTsKLQotCi0vLwkJdHJ5IHsKLS8vCQkJamF2YS5pby5GaWxlIGZpbGUgPSBwLmdldFByb2plY3QoKS5nZXRGaWxlKEphdmFQcm9qZWN0LkNMQVNTUEFUSF9GSUxFTkFNRSkuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKTsKLS8vCQkJaWYgKGZpbGUuZXhpc3RzKCkpewotLy8JCQkJY2hhcltdIGNsYXNzcGF0aCA9IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci51dGlsLlV0aWwuZ2V0RmlsZUNoYXJDb250ZW50KGZpbGUsICJVVEYtOCIpOwotLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKG5ldyBTdHJpbmcoY2xhc3NwYXRoKSk7Ci0vLwkJCX0KLS8vCQl9IGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSl7Ci0vLwkJfQotCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDEwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmRlbHRhTGlzdGVuZXIuZGVsdGFzLmxlbmd0aDsgaSsrKXsKLQkJCWJ1ZmZlci5hcHBlbmQodGhpcy5kZWx0YUxpc3RlbmVyLmRlbHRhc1tpXS50b1N0cmluZygpKS5hcHBlbmQoJ1xuJyk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJObyBkZWx0YXMgc2hvdWxkIGJlIGdlbmVyYXRlZCBmb3IgdGhlIHNhbWUgY2xhc3NwYXRoIiwgIiIsIGJ1ZmZlci50b1N0cmluZygpKTsKLQl9IGZpbmFsbHkgewotCQlzdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IHRoZSBzZXR0aW5nIHRoZSBjbGFzc3BhdGggd2l0aCBhIHJlb3JkZXJlZCBjbGFzc3BhdGggZ2VuZXJhdGVzCi0gKiB0aGUgY29ycmVjdCBkZWx0YXMuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDbGFzc3BhdGhSZW9yZGVyaW5nKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUlKYXZhUHJvamVjdCBwcm9qID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCBuZXcgU3RyaW5nW10ge2dldEV4dGVybmFsSkNMUGF0aFN0cmluZygpfSwgImJpbiIpOwotCUlDbGFzc3BhdGhFbnRyeVtdIG9yaWdpbmFsQ1AgPSBwcm9qLmdldFJhd0NsYXNzcGF0aCgpOwotCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCJQIiwgInNyYyIpOwotCXRyeSB7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0VudHJpZXMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29yaWdpbmFsQ1AubGVuZ3RoXTsKLQkJaW50IGluZGV4ID0gb3JpZ2luYWxDUC5sZW5ndGggLSAxOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG9yaWdpbmFsQ1AubGVuZ3RoOyBpKyspIHsKLQkJCW5ld0VudHJpZXNbaW5kZXhdID0gb3JpZ2luYWxDUFtpXTsKLQkJCWluZGV4LS07Ci0JCX0KLQkJc3RhcnREZWx0YXMoKTsKLQkJc2V0Q2xhc3NwYXRoKHByb2osIG5ld0VudHJpZXMpOwotCQlhc3NlcnRUcnVlKCJzaG91bGQgYmUgb25lIGRlbHRhIC0gdHdvIHJvb3RzIHJlb3JkZXJlZCIsIHRoaXMuZGVsdGFMaXN0ZW5lci5kZWx0YXMubGVuZ3RoID09IDEpOwotCQlJSmF2YUVsZW1lbnREZWx0YSBkID0gbnVsbDsKLQkJYXNzZXJ0VHJ1ZSgicm9vdCBzaG91bGQgYmUgcmVvcmRlcmVkIGluIHRoZSBjbGFzc3BhdGgiLCAoZCA9IGdldERlbHRhRm9yKHJvb3QsIHRydWUpKSAhPSBudWxsCi0JCQkmJiAoZC5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9SRU9SREVSKSA+IDApOwotCX0gZmluYWxseSB7Ci0JCXN0b3BEZWx0YXMoKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotCi0vKioKLSAqIFNob3VsZCBkZXRlY3QgZHVwbGljYXRlIGVudHJpZXMgb24gdGhlIGNsYXNzcGF0aAotICovIAotcHVibGljIHZvaWQgdGVzdENsYXNzcGF0aFZhbGlkYXRpb24wMSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvaiA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBvcmlnaW5hbENQID0gcHJvai5nZXRSYXdDbGFzc3BhdGgoKTsKLQkKLQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q1AgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29yaWdpbmFsQ1AubGVuZ3RoKzFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KG9yaWdpbmFsQ1AsIDAsIG5ld0NQLCAwLCBvcmlnaW5hbENQLmxlbmd0aCk7Ci0JCW5ld0NQW29yaWdpbmFsQ1AubGVuZ3RoXSA9IG5ld0NQWzBdOwotCQkKLQkJSUphdmFNb2RlbFN0YXR1cyBzdGF0dXMgPSBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVDbGFzc3BhdGgocHJvaiwgbmV3Q1AsIHByb2ouZ2V0T3V0cHV0TG9jYXRpb24oKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoCi0JCQkic2hvdWxkIGhhdmUgZGV0ZWN0ZWQgZHVwbGljYXRlIGVudHJpZXMgb24gdGhlIGNsYXNzcGF0aCIsIAotCQkJIkJ1aWxkIHBhdGggY29udGFpbnMgZHVwbGljYXRlIGVudHJ5OiBQL3NyYyIsCi0JCQlzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0KLS8qKgotICogU2hvdWxkIGRldGVjdCBuZXN0ZWQgc291cmNlIGZvbGRlcnMgb24gdGhlIGNsYXNzcGF0aAotICovIAotcHVibGljIHZvaWQgdGVzdENsYXNzcGF0aFZhbGlkYXRpb24wMigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvaiA9ICB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gb3JpZ2luYWxDUCA9IHByb2ouZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCi0JCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0NQID0gbmV3IElDbGFzc3BhdGhFbnRyeVtvcmlnaW5hbENQLmxlbmd0aCsxXTsKLQkJU3lzdGVtLmFycmF5Y29weShvcmlnaW5hbENQLCAwLCBuZXdDUCwgMCwgb3JpZ2luYWxDUC5sZW5ndGgpOwotCQluZXdDUFtvcmlnaW5hbENQLmxlbmd0aF0gPSBKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShuZXcgUGF0aCgiL1AiKSk7Ci0JCQotCQlJSmF2YU1vZGVsU3RhdHVzIHN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNsYXNzcGF0aChwcm9qLCBuZXdDUCwgcHJvai5nZXRPdXRwdXRMb2NhdGlvbigpKTsKLQkJCi0JCWFzc2VydEVxdWFscygKLQkJCSJzaG91bGQgaGF2ZSBkZXRlY3RlZCBuZXN0ZWQgc291cmNlIGZvbGRlcnMgb24gdGhlIGNsYXNzcGF0aCIsIAotCQkJIkNhbm5vdCBuZXN0ICdQL3NyYycgaW5zaWRlICdQJy4gVG8gZW5hYmxlIHRoZSBuZXN0aW5nIGV4Y2x1ZGUgJ3NyYy8nIGZyb20gJ1AnLiIsCi0JCQlzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0KLS8qKgotICogU2hvdWxkIGRldGVjdCBsaWJyYXJ5IGZvbGRlciBuZXN0ZWQgaW5zaWRlIHNvdXJjZSBmb2xkZXIgb24gdGhlIGNsYXNzcGF0aAotICovIAotcHVibGljIHZvaWQgdGVzdENsYXNzcGF0aFZhbGlkYXRpb24wMygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvaiA9ICB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gb3JpZ2luYWxDUCA9IHByb2ouZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCi0JCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0NQID0gbmV3IElDbGFzc3BhdGhFbnRyeVtvcmlnaW5hbENQLmxlbmd0aCsxXTsKLQkJU3lzdGVtLmFycmF5Y29weShvcmlnaW5hbENQLCAwLCBuZXdDUCwgMCwgb3JpZ2luYWxDUC5sZW5ndGgpOwotCQluZXdDUFtvcmlnaW5hbENQLmxlbmd0aF0gPSBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkobmV3IFBhdGgoIi9QL3NyYy9saWIiKSwgbnVsbCwgbnVsbCk7Ci0JCQotCQlJSmF2YU1vZGVsU3RhdHVzIHN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNsYXNzcGF0aChwcm9qLCBuZXdDUCwgcHJvai5nZXRPdXRwdXRMb2NhdGlvbigpKTsKLQkJCi0JCWFzc2VydEVxdWFscygKLQkJCSJzaG91bGQgaGF2ZSBkZXRlY3RlZCBsaWJyYXJ5IGZvbGRlciBuZXN0ZWQgaW5zaWRlIHNvdXJjZSBmb2xkZXIgb24gdGhlIGNsYXNzcGF0aCIsIAotCQkJIkNhbm5vdCBuZXN0ICdQL3NyYy9saWInIGluc2lkZSAnUC9zcmMnLiBUbyBlbmFibGUgdGhlIG5lc3RpbmcgZXhjbHVkZSAnbGliLycgZnJvbSAnUC9zcmMnLiIsCi0JCQlzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RDbGFzc3BhdGhWYWxpZGF0aW9uMDQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCi0JSUphdmFQcm9qZWN0W10gcCA9IG51bGw7Ci0JdHJ5IHsKLQotCQlwID0gbmV3IElKYXZhUHJvamVjdFtdewotCQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDAiLCBuZXcgU3RyaW5nW10geyJzcmMwIn0sICJiaW4wIiksCi0JCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMSIsIG5ldyBTdHJpbmdbXSB7InNyYzEifSwgImJpbjEiKSwKLQkJfTsKLQotCQlKYXZhQ29yZS5zZXRDbGFzc3BhdGhWYXJpYWJsZSgidmFyIiwgbmV3IFBhdGgoIi9QMSIpLCBudWxsKTsKLQkJCi0JCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0NsYXNzcGF0aCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbXXsKLQkJCUphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KG5ldyBQYXRoKCIvUDAvc3JjMCIpKSwKLQkJCUphdmFDb3JlLm5ld1ZhcmlhYmxlRW50cnkobmV3IFBhdGgoInZhci9zcmMxIiksIG51bGwsIG51bGwpLAotCQl9OwotCQkJCQotCQkvLyB2YWxpZGF0ZSBjbGFzc3BhdGgKLQkJSUphdmFNb2RlbFN0YXR1cyBzdGF0dXMgPSBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVDbGFzc3BhdGgocFswXSwgbmV3Q2xhc3NwYXRoLCBwWzBdLmdldE91dHB1dExvY2F0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkic2hvdWxkIG5vdCBkZXRlY3QgZXh0ZXJuYWwgc291cmNlIGZvbGRlciB0aHJvdWdoIGEgdmFyaWFibGUgb24gdGhlIGNsYXNzcGF0aCIsIAotCQkJIk9LIiwKLQkJCXN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCi0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0cyhuZXcgU3RyaW5nW10geyJQMCIsICJQMSJ9KTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RDbGFzc3BhdGhWYWxpZGF0aW9uMDUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCi0JSUphdmFQcm9qZWN0W10gcCA9IG51bGw7Ci0JdHJ5IHsKLQotCQlwID0gbmV3IElKYXZhUHJvamVjdFtdewotCQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDAiLCBuZXcgU3RyaW5nW10geyJzcmMwIiwgInNyYzEifSwgImJpbjAiKSwKLQkJCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAxIiwgbmV3IFN0cmluZ1tdIHsic3JjMSJ9LCAiYmluMSIpLAotCQl9OwotCi0JCUphdmFDb3JlLnNldENsYXNzcGF0aENvbnRhaW5lcigKLQkJbmV3IFBhdGgoImNvbnRhaW5lci9kZWZhdWx0IiksIAotCQkJbmV3IElKYXZhUHJvamVjdFtdeyBwWzBdIH0sCi0JCQluZXcgSUNsYXNzcGF0aENvbnRhaW5lcltdIHsKLQkJCQluZXcgVGVzdENvbnRhaW5lcihuZXcgUGF0aCgiY29udGFpbmVyL2RlZmF1bHQiKSwKLQkJCQkJbmV3IElDbGFzc3BhdGhFbnRyeVtdewotCQkJCQkJSmF2YUNvcmUubmV3U291cmNlRW50cnkobmV3IFBhdGgoIi9QMC9zcmMwIikpLAotCQkJCQkJSmF2YUNvcmUubmV3VmFyaWFibGVFbnRyeShuZXcgUGF0aCgidmFyL3NyYzEiKSwgbnVsbCwgbnVsbCkgfSkgCi0JCQl9LCAKLQkJCW51bGwpOwotCQkKLQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NwYXRoID0gbmV3IElDbGFzc3BhdGhFbnRyeVtdewotCQkJSmF2YUNvcmUubmV3U291cmNlRW50cnkobmV3IFBhdGgoIi9QMC9zcmMxIikpLAotCQkJSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkobmV3IFBhdGgoImNvbnRhaW5lci9kZWZhdWx0IikpLAotCQl9OwotCQkJCQotCQkvLyB2YWxpZGF0ZSBjbGFzc3BhdGgKLQkJSUphdmFNb2RlbFN0YXR1cyBzdGF0dXMgPSBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVDbGFzc3BhdGgocFswXSwgbmV3Q2xhc3NwYXRoLCBwWzBdLmdldE91dHB1dExvY2F0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkic2hvdWxkIG5vdCBoYXZlIGRldGVjdGVkIGV4dGVybmFsIHNvdXJjZSBmb2xkZXIgdGhyb3VnaCBhIGNvbnRhaW5lciBvbiB0aGUgY2xhc3NwYXRoIiwgCi0JCQkiT0siLAotCQkJc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0KLQkJLy8gdmFsaWRhdGUgY2xhc3NwYXRoIGVudHJ5Ci0JCXN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNsYXNzcGF0aEVudHJ5KHBbMF0sIG5ld0NsYXNzcGF0aFsxXSwgdHJ1ZSk7Ci0JCWFzc2VydEVxdWFscygKLQkJCSJzaG91bGQgaGF2ZSBkZXRlY3RlZCBleHRlcm5hbCBzb3VyY2UgZm9sZGVyIHRocm91Z2ggYSBjb250YWluZXIgb24gdGhlIGNsYXNzcGF0aCIsIAotCQkJIkludmFsaWQgY2xhc3NwYXRoIGNvbnRhaW5lcjogY29udGFpbmVyL2RlZmF1bHQiLAotCQkJc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0KLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3RzKG5ldyBTdHJpbmdbXSB7IlAwIiwgIlAxIn0pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdENsYXNzcGF0aFZhbGlkYXRpb24wNigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkKLQlJSmF2YVByb2plY3RbXSBwID0gbnVsbDsKLQl0cnkgewotCi0JCXAgPSBuZXcgSUphdmFQcm9qZWN0W117Ci0JCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMCIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAic3JjIiksCi0JCX07Ci0KLQkJLy8gdmFsaWRhdGUgY2xhc3NwYXRoIGVudHJ5Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0NsYXNzcGF0aCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbXXsKLQkJCUphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KG5ldyBQYXRoKCIvUDAiKSksCi0JCQlKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShuZXcgUGF0aCgiL1AwL3NyYyIpKSwKLQkJfTsKLQkJCQkKLQkJSUphdmFNb2RlbFN0YXR1cyBzdGF0dXMgPSBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVDbGFzc3BhdGgocFswXSwgbmV3Q2xhc3NwYXRoLCBwWzBdLmdldE91dHB1dExvY2F0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkic2hvdWxkIGhhdmUgZGV0ZWN0ZWQgbmVzdGVkIHNvdXJjZSBmb2xkZXIiLCAKLQkJCSJDYW5ub3QgbmVzdCAnUDAvc3JjJyBpbnNpZGUgJ1AwJy4gVG8gZW5hYmxlIHRoZSBuZXN0aW5nIGV4Y2x1ZGUgJ3NyYy8nIGZyb20gJ1AwJy4iLAotCQkJc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMCIpOwotCX0KLX0KLS8qKgotICogU2hvdWxkIGFsbG93IG5lc3RlZCBzb3VyY2UgZm9sZGVycyBvbiB0aGUgY2xhc3NwYXRoIGFzIGxvbmcgYXMgdGhlIG91dGVyCi0gKiBmb2xkZXIgZXhjbHVkZXMgdGhlIGlubmVyIG9uZS4KLSAqLyAKLXB1YmxpYyB2b2lkIHRlc3RDbGFzc3BhdGhWYWxpZGF0aW9uMDcoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IHByb2ogPSAgdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIG9yaWdpbmFsQ1AgPSBwcm9qLmdldFJhd0NsYXNzcGF0aCgpOwotCQotCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdDUCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbb3JpZ2luYWxDUC5sZW5ndGgrMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkob3JpZ2luYWxDUCwgMCwgbmV3Q1AsIDAsIG9yaWdpbmFsQ1AubGVuZ3RoKTsKLQkJbmV3Q1Bbb3JpZ2luYWxDUC5sZW5ndGhdID0gSmF2YUNvcmUubmV3U291cmNlRW50cnkobmV3IFBhdGgoIi9QIiksIG5ldyBJUGF0aFtdIHtuZXcgUGF0aCgic3JjLyIpfSk7Ci0JCQotCQlJSmF2YU1vZGVsU3RhdHVzIHN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNsYXNzcGF0aChwcm9qLCBuZXdDUCwgcHJvai5nZXRPdXRwdXRMb2NhdGlvbigpKTsKLQkJCi0JCWFzc2VydEVxdWFscygKLQkJCSJzaG91bGQgaGF2ZSBhbGxvd2VkIG5lc3RlZCBzb3VyY2UgZm9sZGVycyB3aXRoIGV4Y2x1c2lvbiBvbiB0aGUgY2xhc3NwYXRoIiwgCi0JCQkiT0siLAotCQkJc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoqCi0gKiBTaG91bGQgYWxsb3cgYSBuZXN0ZWQgYmluYXJ5IGZvbGRlciBpbiBhIHNvdXJjZSBmb2xkZXIgb24gdGhlIGNsYXNzcGF0aCBhcwotICogbG9uZyBhcyB0aGUgb3V0ZXIgZm9sZGVyIGV4Y2x1ZGVzIHRoZSBpbm5lciBvbmUuCi0gKi8gCi1wdWJsaWMgdm9pZCB0ZXN0Q2xhc3NwYXRoVmFsaWRhdGlvbjA4KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qID0gIHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10ge30sIG5ldyBTdHJpbmdbXSB7ImxpYiJ9LCAiYmluIik7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIG9yaWdpbmFsQ1AgPSBwcm9qLmdldFJhd0NsYXNzcGF0aCgpOwotCQotCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdDUCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbb3JpZ2luYWxDUC5sZW5ndGgrMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkob3JpZ2luYWxDUCwgMCwgbmV3Q1AsIDAsIG9yaWdpbmFsQ1AubGVuZ3RoKTsKLQkJbmV3Q1Bbb3JpZ2luYWxDUC5sZW5ndGhdID0gSmF2YUNvcmUubmV3U291cmNlRW50cnkobmV3IFBhdGgoIi9QIiksIG5ldyBJUGF0aFtdIHtuZXcgUGF0aCgibGliLyIpfSk7Ci0JCQotCQlJSmF2YU1vZGVsU3RhdHVzIHN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNsYXNzcGF0aChwcm9qLCBuZXdDUCwgcHJvai5nZXRPdXRwdXRMb2NhdGlvbigpKTsKLQkJCi0JCWFzc2VydEVxdWFscygKLQkJCSJzaG91bGQgaGF2ZSBhbGxvd2VkIG5lc3RlZCBsaWIgZm9sZGVycyB3aXRoIGV4Y2x1c2lvbiBvbiB0aGUgY2xhc3NwYXRoIiwgCi0JCQkiT0siLAotCQkJc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoqCi0gKiBTaG91bGQgbm90IGFsbG93IGEgbmVzdGVkIHNvdXJjZSBmb2xkZXIgaW4gdGhlIHByb2plY3QncyBvdXRwdXQgZm9sZGVyLgotICovIAotcHVibGljIHZvaWQgdGVzdENsYXNzcGF0aFZhbGlkYXRpb24wOSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvaiA9ICB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHt9LCAiYmluIik7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIG9yaWdpbmFsQ1AgPSBwcm9qLmdldFJhd0NsYXNzcGF0aCgpOwotCQotCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdDUCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbb3JpZ2luYWxDUC5sZW5ndGgrMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkob3JpZ2luYWxDUCwgMCwgbmV3Q1AsIDAsIG9yaWdpbmFsQ1AubGVuZ3RoKTsKLQkJbmV3Q1Bbb3JpZ2luYWxDUC5sZW5ndGhdID0gSmF2YUNvcmUubmV3U291cmNlRW50cnkobmV3IFBhdGgoIi9QL2Jpbi9zcmMiKSk7Ci0JCQotCQlJSmF2YU1vZGVsU3RhdHVzIHN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNsYXNzcGF0aChwcm9qLCBuZXdDUCwgcHJvai5nZXRPdXRwdXRMb2NhdGlvbigpKTsKLQkJCi0JCWFzc2VydEVxdWFscygKLQkJCSJzaG91bGQgbm90IGFsbG93IG5lc3RlZCBzb3VyY2UgZm9sZGVyIGluIHB1dHB1dCBmb2xkZXIiLCAKLQkJCSJDYW5ub3QgbmVzdCAnUC9iaW4vc3JjJyBpbnNpZGUgb3V0cHV0IGZvbGRlciAnUC9iaW4nLiIsCi0JCQlzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0vKioKLSAqIFNob3VsZCBub3QgYWxsb3cgYSBuZXN0ZWQgb3V0cHV0IGZvbGRlciBpbiBhIHNvdXJjZSBmb2xkZXIgb24gdGhlIGNsYXNzcGF0aC4KLSAqLyAKLXB1YmxpYyB2b2lkIHRlc3RDbGFzc3BhdGhWYWxpZGF0aW9uMTAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IHByb2ogPSAgdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIG9yaWdpbmFsQ1AgPSBwcm9qLmdldFJhd0NsYXNzcGF0aCgpOwotCQotCQlJSmF2YU1vZGVsU3RhdHVzIHN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNsYXNzcGF0aChwcm9qLCBvcmlnaW5hbENQLCBuZXcgUGF0aCgiL1Avc3JjL2JpbiIpKTsKLQkJCi0JCWFzc2VydEVxdWFscygKLQkJCSJzaG91bGQgbm90IGFsbG93IG5lc3RlZCBvdXRwdXQgZm9sZGVyIGluIHNvdXJjZSBmb2xkZXIiLCAKLQkJCSJDYW5ub3QgbmVzdCBvdXRwdXQgZm9sZGVyICdQL3NyYy9iaW4nIGluc2lkZSAnUC9zcmMnLiIsCi0JCQlzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0vKioKLSAqIFNob3VsZCBhbGxvdyBhIG5lc3RlZCBsaWJyYXJ5IGZvbGRlciBpbiB0aGUgcHJvamVjdCdzIG91dHB1dCBmb2xkZXIgaWYgdGhlIHByb2plY3QncyBvdXRwdXQgaXMgbm90IHVzZWQuCi0qLyAKLXB1YmxpYyB2b2lkIHRlc3RDbGFzc3BhdGhWYWxpZGF0aW9uMTEoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IHByb2ogPSAgdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7fSwgIiIpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBvcmlnaW5hbENQID0gcHJvai5nZXRSYXdDbGFzc3BhdGgoKTsKLQkKLQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q1AgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29yaWdpbmFsQ1AubGVuZ3RoKzFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KG9yaWdpbmFsQ1AsIDAsIG5ld0NQLCAwLCBvcmlnaW5hbENQLmxlbmd0aCk7Ci0JCW5ld0NQW29yaWdpbmFsQ1AubGVuZ3RoXSA9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShuZXcgUGF0aCgiL1AvbGliIiksIG51bGwsIG51bGwpOwotCQkKLQkJSUphdmFNb2RlbFN0YXR1cyBzdGF0dXMgPSBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVDbGFzc3BhdGgocHJvaiwgbmV3Q1AsIHByb2ouZ2V0T3V0cHV0TG9jYXRpb24oKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoCi0JCQkic2hvdWxkIGFsbG93IG5lc3RlZCBsaWJyYXJ5IGZvbGRlciBpbiBvdXRwdXQgZm9sZGVyIiwgCi0JCQkiT0siLAotCQkJc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoqCi0gKiBTaG91bGQgbm90IGFsbG93IGEgbmVzdGVkIHNvdXJjZSBmb2xkZXIgaW4gYW4gb3V0cHV0IGZvbGRlci4KLSAqLyAKLXB1YmxpYyB2b2lkIHRlc3RDbGFzc3BhdGhWYWxpZGF0aW9uMTIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IHByb2ogPSAgdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7fSwgImJpbjEiKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gb3JpZ2luYWxDUCA9IHByb2ouZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCi0JCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0NQID0gbmV3IElDbGFzc3BhdGhFbnRyeVtvcmlnaW5hbENQLmxlbmd0aCsxXTsKLQkJU3lzdGVtLmFycmF5Y29weShvcmlnaW5hbENQLCAwLCBuZXdDUCwgMCwgb3JpZ2luYWxDUC5sZW5ndGgpOwotCQluZXdDUFtvcmlnaW5hbENQLmxlbmd0aF0gPSAKLQkJCUphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KAotCQkJCW5ldyBQYXRoKCIvUC9iaW4yL3NyYyIpLCAKLQkJCQluZXcgSVBhdGhbXSB7fSwgCi0JCQkJbmV3IFBhdGgoIi9QL2JpbjIiKSk7Ci0JCQotCQlJSmF2YU1vZGVsU3RhdHVzIHN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNsYXNzcGF0aChwcm9qLCBuZXdDUCwgcHJvai5nZXRPdXRwdXRMb2NhdGlvbigpKTsKLQkJCi0JCWFzc2VydEVxdWFscygKLQkJCSJzaG91bGQgbm90IGFsbG93IG5lc3RlZCBzb3VyY2UgZm9sZGVyIGluIG91dHB1dCBmb2xkZXIiLCAKLQkJCSJDYW5ub3QgbmVzdCAnUC9iaW4yL3NyYycgaW5zaWRlIG91dHB1dCBmb2xkZXIgJ1AvYmluMicuIiwKLQkJCXN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qKgotICogU2hvdWxkIG5vdCBhbGxvdyBhIG5lc3RlZCBvdXRwdXQgZm9sZGVyIGluIGEgc291cmNlIGZvbGRlciBvbiB0aGUgY2xhc3NwYXRoLgotICovIAotcHVibGljIHZvaWQgdGVzdENsYXNzcGF0aFZhbGlkYXRpb24xMygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvaiA9ICB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHt9LCAiYmluMSIpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBvcmlnaW5hbENQID0gcHJvai5nZXRSYXdDbGFzc3BhdGgoKTsKLQkKLQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q1AgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29yaWdpbmFsQ1AubGVuZ3RoKzFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KG9yaWdpbmFsQ1AsIDAsIG5ld0NQLCAwLCBvcmlnaW5hbENQLmxlbmd0aCk7Ci0JCW5ld0NQW29yaWdpbmFsQ1AubGVuZ3RoXSA9IAotCQkJSmF2YUNvcmUubmV3U291cmNlRW50cnkoCi0JCQkJbmV3IFBhdGgoIi9QL3NyYyIpLCAKLQkJCQluZXcgSVBhdGhbXSB7fSwgCi0JCQkJbmV3IFBhdGgoIi9QL3NyYy9iaW4yIikpOwotCQkKLQkJSUphdmFNb2RlbFN0YXR1cyBzdGF0dXMgPSBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVDbGFzc3BhdGgocHJvaiwgbmV3Q1AsIHByb2ouZ2V0T3V0cHV0TG9jYXRpb24oKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoCi0JCQkic2hvdWxkIG5vdCBhbGxvdyBuZXN0ZWQgb3V0cHV0IGZvbGRlciBpbiBzb3VyY2UgZm9sZGVyIiwgCi0JCQkiQ2Fubm90IG5lc3Qgb3V0cHV0IGZvbGRlciAnUC9zcmMvYmluMicgaW5zaWRlICdQL3NyYycuIiwKLQkJCXN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qKgotICogU2hvdWxkIGFsbG93IGEgbmVzdGVkIG91dHB1dCBmb2xkZXIgaW4gYSBzb3VyY2UgZm9sZGVyIHRoYXQgY29pbmNpZGF0ZSB3aXRoIHRoZSBwcm9qZWN0LgotICovIAotcHVibGljIHZvaWQgdGVzdENsYXNzcGF0aFZhbGlkYXRpb24xNCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvaiA9ICB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHt9LCAiYmluIik7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIG9yaWdpbmFsQ1AgPSBwcm9qLmdldFJhd0NsYXNzcGF0aCgpOwotCQotCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdDUCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbb3JpZ2luYWxDUC5sZW5ndGgrMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkob3JpZ2luYWxDUCwgMCwgbmV3Q1AsIDAsIG9yaWdpbmFsQ1AubGVuZ3RoKTsKLQkJbmV3Q1Bbb3JpZ2luYWxDUC5sZW5ndGhdID0gCi0JCQlKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeSgKLQkJCQluZXcgUGF0aCgiL1AiKSwgCi0JCQkJbmV3IElQYXRoW10ge30sIAotCQkJCW5ldyBQYXRoKCIvUC9iaW4iKSk7Ci0JCQotCQlJSmF2YU1vZGVsU3RhdHVzIHN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNsYXNzcGF0aChwcm9qLCBuZXdDUCwgcHJvai5nZXRPdXRwdXRMb2NhdGlvbigpKTsKLQkJCi0JCWFzc2VydEVxdWFscygKLQkJCSJzaG91bGQgYWxsb3cgbmVzdGVkIG91dHB1dCBmb2xkZXIgaW4gc291cmNlIGZvbGRlciB3aGljaCBpcyBwcm9qZWN0IiwgCi0JCQkiT0siLAotCQkJc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoqCi0gKiBTaG91bGQgbm90IGFsbG93IG5lc3RlZCBzb3VyY2UgZm9sZGVycyBvbiB0aGUgY2xhc3NwYXRoIGlmIGV4Y2x1c2lvbiBmaWx0ZXIgaGFzIG5vIHRyYWlsaW5nIHNsYXNoLgotICovIAotcHVibGljIHZvaWQgdGVzdENsYXNzcGF0aFZhbGlkYXRpb24xNSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvaiA9ICB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gb3JpZ2luYWxDUCA9IHByb2ouZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCi0JCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0NQID0gbmV3IElDbGFzc3BhdGhFbnRyeVtvcmlnaW5hbENQLmxlbmd0aCsxXTsKLQkJU3lzdGVtLmFycmF5Y29weShvcmlnaW5hbENQLCAwLCBuZXdDUCwgMCwgb3JpZ2luYWxDUC5sZW5ndGgpOwotCQluZXdDUFtvcmlnaW5hbENQLmxlbmd0aF0gPSBKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShuZXcgUGF0aCgiL1AiKSwgbmV3IElQYXRoW10ge25ldyBQYXRoKCIqKi9zcmMiKX0pOwotCQkKLQkJSUphdmFNb2RlbFN0YXR1cyBzdGF0dXMgPSBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVDbGFzc3BhdGgocHJvaiwgbmV3Q1AsIHByb2ouZ2V0T3V0cHV0TG9jYXRpb24oKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiRW5kIGV4Y2x1c2lvbiBmaWx0ZXIgJ3NyYycgd2l0aCAvIHRvIGZ1bGx5IGV4Y2x1ZGUgJ1Avc3JjJy4iLAotCQkJc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoqCi0gKiBTaG91bGQgYWxsb3cgY3VzdG9tIG91dHB1dCBmb2xkZXIgdG8gYmUgbmVzdGVkIGluIGRlZmF1bHQgb3V0cHV0IGZvbGRlciBpZiBkZWZhdWx0IG91dHB1dCBpcyBub3QgdXNlZC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAyODU5NiBEZWZhdWx0IG91dHB1dCBmb2xkZXIgY2F1c2Ugb2YgdmFsaWRhdGlvbiBlcnJvciBldmVuIGlmIG5vdCB1c2VkKQotICovIAotcHVibGljIHZvaWQgdGVzdENsYXNzcGF0aFZhbGlkYXRpb24xNigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvaiA9ICB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHt9LCAiIik7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIG9yaWdpbmFsQ1AgPSBwcm9qLmdldFJhd0NsYXNzcGF0aCgpOwotCQotCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdDUCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbb3JpZ2luYWxDUC5sZW5ndGgrMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkob3JpZ2luYWxDUCwgMCwgbmV3Q1AsIDAsIG9yaWdpbmFsQ1AubGVuZ3RoKTsKLQkJbmV3Q1Bbb3JpZ2luYWxDUC5sZW5ndGhdID0gSmF2YUNvcmUubmV3U291cmNlRW50cnkobmV3IFBhdGgoIi9QIiksIG5ldyBJUGF0aFswXSwgbmV3IFBhdGgoIi9QL2JpbiIpKTsKLQkJCi0JCUlKYXZhTW9kZWxTdGF0dXMgc3RhdHVzID0gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlQ2xhc3NwYXRoKHByb2osIG5ld0NQLCBwcm9qLmdldE91dHB1dExvY2F0aW9uKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKAotCQkJIk9LIiwKLQkJCXN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qKgotICogU2hvdWxkIG5vdCBhbGxvdyBzb3VyY2UgZm9sZGVyIHRvIGJlIG5lc3RlZCBpbiBkZWZhdWx0IG91dHB1dCBmb2xkZXIgaWYgZGVmYXVsdCBvdXRwdXQgaXMgdXNlZC4KLSAqLyAKLXB1YmxpYyB2b2lkIHRlc3RDbGFzc3BhdGhWYWxpZGF0aW9uMTcoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IHByb2ogPSAgdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7InNyYzEifSwgImJpbiIpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBvcmlnaW5hbENQID0gcHJvai5nZXRSYXdDbGFzc3BhdGgoKTsKLQkKLQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q1AgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29yaWdpbmFsQ1AubGVuZ3RoKzFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KG9yaWdpbmFsQ1AsIDAsIG5ld0NQLCAwLCBvcmlnaW5hbENQLmxlbmd0aCk7Ci0JCW5ld0NQW29yaWdpbmFsQ1AubGVuZ3RoXSA9IEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KG5ldyBQYXRoKCIvUC9iaW4vc3JjMiIpKTsKLQkJCi0JCUlKYXZhTW9kZWxTdGF0dXMgc3RhdHVzID0gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlQ2xhc3NwYXRoKHByb2osIG5ld0NQLCBwcm9qLmdldE91dHB1dExvY2F0aW9uKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKAotCQkJIkNhbm5vdCBuZXN0ICdQL2Jpbi9zcmMyJyBpbnNpZGUgb3V0cHV0IGZvbGRlciAnUC9iaW4nLiIsCi0JCQlzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0vKioKLSAqIFNob3VsZCBub3QgYWxsb3cgY3VzdG9tIG91dHB1dCBmb2xkZXIgdG8gYmUgZXh0ZXJuYWwgdG8gcHJvamVjdC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAyOTA3OSBCdWlsZHBhdGggdmFsaWRhdGlvbjogTm8gY2hlY2sgdGhhdCBvdXRwdXQgZm9sZGVyIGlzIGluc2lkZSBwcm9qZWN0KQotICovIAotcHVibGljIHZvaWQgdGVzdENsYXNzcGF0aFZhbGlkYXRpb24xOCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvaiA9ICB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHt9LCAiIik7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIG9yaWdpbmFsQ1AgPSBwcm9qLmdldFJhd0NsYXNzcGF0aCgpOwotCQotCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdDUCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbb3JpZ2luYWxDUC5sZW5ndGgrMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkob3JpZ2luYWxDUCwgMCwgbmV3Q1AsIDAsIG9yaWdpbmFsQ1AubGVuZ3RoKTsKLQkJbmV3Q1Bbb3JpZ2luYWxDUC5sZW5ndGhdID0gSmF2YUNvcmUubmV3U291cmNlRW50cnkobmV3IFBhdGgoIi9QL3NyYyIpLCBuZXcgSVBhdGhbMF0sIG5ldyBQYXRoKCIvUy9iaW4iKSk7Ci0JCQotCQlJSmF2YU1vZGVsU3RhdHVzIHN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNsYXNzcGF0aChwcm9qLCBuZXdDUCwgcHJvai5nZXRPdXRwdXRMb2NhdGlvbigpKTsKLQkJCi0JCWFzc2VydEVxdWFscygKLQkJCSJQYXRoICcvUy9iaW4nIG11c3QgZGVub3RlIGxvY2F0aW9uIGluc2lkZSBwcm9qZWN0IFAiLAotCQkJc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoqCi0gKiBTaG91bGQgZGV0ZWN0IHNvdXJjZSBmb2xkZXIgbmVzdGVkIGluc2lkZSBsaWJyYXJ5IGZvbGRlciBvbiB0aGUgY2xhc3NwYXRoCi0gKi8gCi1wdWJsaWMgdm9pZCB0ZXN0Q2xhc3NwYXRoVmFsaWRhdGlvbjE5KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qID0gIHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10ge30sIG5ldyBTdHJpbmdbXSB7ImxpYiJ9LCAiYmluIik7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIG9yaWdpbmFsQ1AgPSBwcm9qLmdldFJhd0NsYXNzcGF0aCgpOwotCQotCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdDUCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbb3JpZ2luYWxDUC5sZW5ndGgrMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkob3JpZ2luYWxDUCwgMCwgbmV3Q1AsIDAsIG9yaWdpbmFsQ1AubGVuZ3RoKTsKLQkJbmV3Q1Bbb3JpZ2luYWxDUC5sZW5ndGhdID0gSmF2YUNvcmUubmV3U291cmNlRW50cnkobmV3IFBhdGgoIi9QL2xpYi9zcmMiKSk7Ci0JCQotCQlJSmF2YU1vZGVsU3RhdHVzIHN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNsYXNzcGF0aChwcm9qLCBuZXdDUCwgcHJvai5nZXRPdXRwdXRMb2NhdGlvbigpKTsKLQkJCi0JCWFzc2VydEVxdWFscygKLQkJCSJzaG91bGQgaGF2ZSBkZXRlY3RlZCBsaWJyYXJ5IGZvbGRlciBuZXN0ZWQgaW5zaWRlIHNvdXJjZSBmb2xkZXIgb24gdGhlIGNsYXNzcGF0aCIsIAotCQkJIkNhbm5vdCBuZXN0ICdQL2xpYi9zcmMnIGluc2lkZSBsaWJyYXJ5ICdQL2xpYicuIiwKLQkJCXN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLQotLyoqCi0gKiBTaG91bGQgbm90IGFsbG93IGN1c3RvbSBvdXRwdXQgZm9sZGVyIGlmIHByb2plY3QgcHJlZmVyZW5jZSBkaXNhbGxvdyB0aGVtCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDbGFzc3BhdGhWYWxpZGF0aW9uMjAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IHByb2ogPSAgdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7fSwgIiIpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBvcmlnaW5hbENQID0gcHJvai5nZXRSYXdDbGFzc3BhdGgoKTsKLQkKLQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q1AgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29yaWdpbmFsQ1AubGVuZ3RoKzFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KG9yaWdpbmFsQ1AsIDAsIG5ld0NQLCAwLCBvcmlnaW5hbENQLmxlbmd0aCk7Ci0JCW5ld0NQW29yaWdpbmFsQ1AubGVuZ3RoXSA9IEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KG5ldyBQYXRoKCIvUC9zcmMiKSwgbmV3IElQYXRoWzBdLCBuZXcgUGF0aCgiL1MvYmluIikpOwotCQkKLQkJTWFwIG9wdGlvbnMgPSBuZXcgSGFzaHRhYmxlKDUpOwotCQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT1JFX0VOQUJMRV9DTEFTU1BBVEhfTVVMVElQTEVfT1VUUFVUX0xPQ0FUSU9OUywgSmF2YUNvcmUuRElTQUJMRUQpOwotCQlwcm9qLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0JCUlKYXZhTW9kZWxTdGF0dXMgc3RhdHVzID0gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlQ2xhc3NwYXRoKHByb2osIG5ld0NQLCBwcm9qLmdldE91dHB1dExvY2F0aW9uKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKAotCQkJIk11bHRpcGxlIG91dHB1dCBsb2NhdGlvbnMgYXJlIGRpc2FibGVkLCBjYW5ub3QgYXNzb2NpYXRlIGVudHJ5OiAnUC9zcmMnIHdpdGggYSBzcGVjaWZpYyBvdXRwdXQuIiwKLQkJCXN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLQotLyoqCi0gKiBTaG91bGQgbm90IGFsbG93IGV4Y2x1c2lvbiBwYXR0ZXJucyBpZiBwcm9qZWN0IHByZWZlcmVuY2UgZGlzYWxsb3cgdGhlbQotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q2xhc3NwYXRoVmFsaWRhdGlvbjIxKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qID0gIHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10ge30sICIiKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gb3JpZ2luYWxDUCA9IHByb2ouZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCi0JCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0NQID0gbmV3IElDbGFzc3BhdGhFbnRyeVtvcmlnaW5hbENQLmxlbmd0aCsxXTsKLQkJU3lzdGVtLmFycmF5Y29weShvcmlnaW5hbENQLCAwLCBuZXdDUCwgMCwgb3JpZ2luYWxDUC5sZW5ndGgpOwotCQluZXdDUFtvcmlnaW5hbENQLmxlbmd0aF0gPSBKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShuZXcgUGF0aCgiL1Avc3JjIiksIG5ldyBJUGF0aFtde25ldyBQYXRoKCIqKi9zcmMiKX0sIG51bGwpOwotCQkKLQkJTWFwIG9wdGlvbnMgPSBuZXcgSGFzaHRhYmxlKDUpOwotCQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT1JFX0VOQUJMRV9DTEFTU1BBVEhfRVhDTFVTSU9OX1BBVFRFUk5TLCBKYXZhQ29yZS5ESVNBQkxFRCk7Ci0JCXByb2ouc2V0T3B0aW9ucyhvcHRpb25zKTsKLQkJSUphdmFNb2RlbFN0YXR1cyBzdGF0dXMgPSBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVDbGFzc3BhdGgocHJvaiwgbmV3Q1AsIHByb2ouZ2V0T3V0cHV0TG9jYXRpb24oKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiRXhjbHVzaW9uIHBhdHRlcm5zIGFyZSBkaXNhYmxlZCwgY2Fubm90IGV4Y2x1ZGUgZnJvbSBlbnRyeTogJ1Avc3JjJy4iLAotCQkJc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotCi0vKioKLSAqIDMzMjA3IC0gUmVqZWN0IG91dHB1dCBmb2xkZXIgdGhhdCBjb2luY2lkYXRlIHdpdGggZGlzdGluY3Qgc291cmNlIGZvbGRlcgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q2xhc3NwYXRoVmFsaWRhdGlvbjIyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qID0gIHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10ge30sICIiKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gb3JpZ2luYWxDUCA9IHByb2ouZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCi0JCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0NQID0gbmV3IElDbGFzc3BhdGhFbnRyeVtvcmlnaW5hbENQLmxlbmd0aCsyXTsKLQkJU3lzdGVtLmFycmF5Y29weShvcmlnaW5hbENQLCAwLCBuZXdDUCwgMCwgb3JpZ2luYWxDUC5sZW5ndGgpOwotCQluZXdDUFtvcmlnaW5hbENQLmxlbmd0aF0gPSBKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShuZXcgUGF0aCgiL1Avc3JjIiksIG5ldyBJUGF0aFswXSwgbmV3IFBhdGgoIi9QL3NyYzIiKSk7Ci0JCW5ld0NQW29yaWdpbmFsQ1AubGVuZ3RoKzFdID0gSmF2YUNvcmUubmV3U291cmNlRW50cnkobmV3IFBhdGgoIi9QL3NyYzIiKSwgbmV3IElQYXRoWzBdLCBuZXcgUGF0aCgiL1Avc3JjIikpOwotCQkKLQkJSUphdmFNb2RlbFN0YXR1cyBzdGF0dXMgPSBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVDbGFzc3BhdGgocHJvaiwgbmV3Q1AsIHByb2ouZ2V0T3V0cHV0TG9jYXRpb24oKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiU291cmNlIGZvbGRlciAnUC9zcmMnIGNhbm5vdCBvdXRwdXQgdG8gZGlzdGluY3Qgc291cmNlIGZvbGRlciAnUC9zcmMyJy4iLAotCQkJc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotCi0vKioKLSAqIDMzMjA3IC0gUmVqZWN0IG91dHB1dCBmb2xkZXIgdGhhdCBjb2luY2lkYXRlIHdpdGggZGlzdGluY3Qgc291cmNlIGZvbGRlcgotICogYnV0IDM2NDY1IC0gVW5hYmxlIHRvIGNyZWF0ZSBtdWx0aXBsZSBzb3VyY2UgZm9sZGVycyB3aGVuIG5vdCB1c2luZyBiaW4gZm9yIG91dHB1dAotICogZGVmYXVsdCBvdXRwdXQgc2NlbmFyaWkgaXMgc3RpbGwgdG9sZXJhdGVkCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDbGFzc3BhdGhWYWxpZGF0aW9uMjMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IHByb2ogPSAgdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7fSwgIiIpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBvcmlnaW5hbENQID0gcHJvai5nZXRSYXdDbGFzc3BhdGgoKTsKLQkKLQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q1AgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29yaWdpbmFsQ1AubGVuZ3RoKzJdOwotCQlTeXN0ZW0uYXJyYXljb3B5KG9yaWdpbmFsQ1AsIDAsIG5ld0NQLCAwLCBvcmlnaW5hbENQLmxlbmd0aCk7Ci0JCW5ld0NQW29yaWdpbmFsQ1AubGVuZ3RoXSA9IEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KG5ldyBQYXRoKCIvUC8iKSwgbmV3IElQYXRoW117bmV3IFBhdGgoInNyYy8iKX0sIG51bGwpOwotCQluZXdDUFtvcmlnaW5hbENQLmxlbmd0aCsxXSA9IEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KG5ldyBQYXRoKCIvUC9zcmMiKSwgbmV3IElQYXRoWzBdLCBudWxsKTsKLQkJCi0JCUlKYXZhTW9kZWxTdGF0dXMgc3RhdHVzID0gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlQ2xhc3NwYXRoKHByb2osIG5ld0NQLCBwcm9qLmdldE91dHB1dExvY2F0aW9uKCkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJPSyIsCi0JCQlzdGF0dXMuZ2V0TWVzc2FnZSgpKTsJCQotLy8JCWFzc2VydEVxdWFscygKLS8vCQkJIlNvdXJjZSBmb2xkZXIgJ1Avc3JjJyBjYW5ub3Qgb3V0cHV0IHRvIGRpc3RpbmN0IHNvdXJjZSBmb2xkZXIgJ1AvJy4iLAotLy8JCQlzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0KLS8qKgotICogRW5zdXJlIG9uZSBjYW5ub3QgbmVzdCBzb3VyY2UgZW50cnkgaW5zaWRlIGRlZmF1bHQgb3V0cHV0IGZvbGRlcgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q2xhc3NwYXRoVmFsaWRhdGlvbjI0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qID0gIHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10ge30sICIiKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gb3JpZ2luYWxDUCA9IHByb2ouZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCi0JCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0NQID0gbmV3IElDbGFzc3BhdGhFbnRyeVtvcmlnaW5hbENQLmxlbmd0aCsxXTsKLQkJU3lzdGVtLmFycmF5Y29weShvcmlnaW5hbENQLCAwLCBuZXdDUCwgMCwgb3JpZ2luYWxDUC5sZW5ndGgpOwotCQluZXdDUFtvcmlnaW5hbENQLmxlbmd0aF0gPSBKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShuZXcgUGF0aCgiL1Avc3JjIiksIG5ldyBJUGF0aFswXSwgbnVsbCk7Ci0JCQotCQlJSmF2YU1vZGVsU3RhdHVzIHN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNsYXNzcGF0aChwcm9qLCBuZXdDUCwgcHJvai5nZXRPdXRwdXRMb2NhdGlvbigpKTsKLQkJCi0JCWFzc2VydEVxdWFscygKLQkJCSJDYW5ub3QgbmVzdCAnUC9zcmMnIGluc2lkZSBvdXRwdXQgZm9sZGVyICdQJy4iLAotCQkJc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotCi0vKioKLSAqIFJlamVjdCBvdXRwdXQgZm9sZGVyIHRoYXQgY29pbmNpZGF0ZSB3aXRoIGxpYnJhcnkgZm9sZGVyCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDbGFzc3BhdGhWYWxpZGF0aW9uMjUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IHByb2ogPSAgdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7fSwgIiIpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBvcmlnaW5hbENQID0gcHJvai5nZXRSYXdDbGFzc3BhdGgoKTsKLQkKLQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q1AgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29yaWdpbmFsQ1AubGVuZ3RoKzJdOwotCQlTeXN0ZW0uYXJyYXljb3B5KG9yaWdpbmFsQ1AsIDAsIG5ld0NQLCAwLCBvcmlnaW5hbENQLmxlbmd0aCk7Ci0JCW5ld0NQW29yaWdpbmFsQ1AubGVuZ3RoXSA9IEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KG5ldyBQYXRoKCIvUC9zcmMiKSwgbmV3IElQYXRoWzBdLCBuZXcgUGF0aCgiL1AvbGliMiIpKTsKLQkJbmV3Q1Bbb3JpZ2luYWxDUC5sZW5ndGgrMV0gPSBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkobmV3IFBhdGgoIi9QL2xpYjIiKSwgbnVsbCwgbnVsbCk7Ci0JCQotCQlJSmF2YU1vZGVsU3RhdHVzIHN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNsYXNzcGF0aChwcm9qLCBuZXdDUCwgcHJvai5nZXRPdXRwdXRMb2NhdGlvbigpKTsKLQkJCi0JCWFzc2VydEVxdWFscygKLQkJCSJTb3VyY2UgZm9sZGVyICdQL3NyYycgY2Fubm90IG91dHB1dCB0byBsaWJyYXJ5ICdQL2xpYjInLiIsCi0JCQlzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0KLS8qKgotICogUmVqZWN0IG91dHB1dCBmb2xkZXIgdGhhdCBjb2luY2lkYXRlIHdpdGggbGlicmFyeSBmb2xkZXIKLSAqIGRlZmF1bHQgb3V0cHV0IHNjZW5hcmlpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDbGFzc3BhdGhWYWxpZGF0aW9uMjYoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IHByb2ogPSAgdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7fSwgIiIpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBvcmlnaW5hbENQID0gcHJvai5nZXRSYXdDbGFzc3BhdGgoKTsKLQkKLQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q1AgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29yaWdpbmFsQ1AubGVuZ3RoKzJdOwotCQlTeXN0ZW0uYXJyYXljb3B5KG9yaWdpbmFsQ1AsIDAsIG5ld0NQLCAwLCBvcmlnaW5hbENQLmxlbmd0aCk7Ci0JCW5ld0NQW29yaWdpbmFsQ1AubGVuZ3RoXSA9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShuZXcgUGF0aCgiL1AvIiksIG51bGwsIG51bGwpOwotCQluZXdDUFtvcmlnaW5hbENQLmxlbmd0aCsxXSA9IEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KG5ldyBQYXRoKCIvUC9zcmMiKSwgbmV3IElQYXRoWzBdLCBudWxsKTsKLQkJCi0JCUlKYXZhTW9kZWxTdGF0dXMgc3RhdHVzID0gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlQ2xhc3NwYXRoKHByb2osIG5ld0NQLCBwcm9qLmdldE91dHB1dExvY2F0aW9uKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKAotCQkJIkNhbm5vdCBuZXN0ICdQL3NyYycgaW5zaWRlIGxpYnJhcnkgJ1AvJy4iLAotCQkJc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotCi0vKioKLSAqIENoZWNrcyBkaWFnbm9zaXMgZm9yIGluY29tcGF0aWJsZSBiaW5hcnkgdmVyc2lvbnMKLSAqLwotcHVibGljIHZvaWQgdGVzdENsYXNzcGF0aFZhbGlkYXRpb24yNygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvajEgPSAgdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDEiLCBuZXcgU3RyaW5nW10ge30sICIiKTsKLQkJcHJvajEuc2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX0NPREVHRU5fVEFSR0VUX1BMQVRGT1JNLCBKYXZhQ29yZS5WRVJTSU9OXzFfNCk7Ci0KLQkJSUphdmFQcm9qZWN0IHByb2oyID0gIHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHt9LCAiIik7Ci0JCXByb2oyLnNldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9DT0RFR0VOX1RBUkdFVF9QTEFURk9STSwgSmF2YUNvcmUuVkVSU0lPTl8xXzEpOwotCQlwcm9qMi5zZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9JTkNPTVBBVElCTEVfSkRLX0xFVkVMLCBKYXZhQ29yZS5XQVJOSU5HKTsKLQotCQlJSmF2YU1vZGVsU3RhdHVzIHN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNsYXNzcGF0aEVudHJ5KHByb2oyLCBKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkobmV3IFBhdGgoIi9QMSIpKSwgZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkiSW5jb21wYXRpYmxlIC5jbGFzcyBmaWxlcyB2ZXJzaW9uIGluIHJlcXVpcmVkIGJpbmFyaWVzLiBQcm9qZWN0ICdQMicgaXMgdGFyZ2V0aW5nIGEgMS4xIHJ1bnRpbWUsIGJ1dCBpcyBjb21waWxlZCBhZ2FpbnN0ICdQMScgd2hpY2ggcmVxdWlyZXMgYSAxLjQgcnVudGltZS4iLAotCQkJc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0cyhuZXcgU3RyaW5nW117IlAxIiwgIlAyIn0pOwotCX0KLX0KLQotLyoqCi0gKiBTZXR0aW5nIHRoZSBjbGFzc3BhdGggd2l0aCB0d28gZW50cmllcyBzcGVjaWZ5aW5nIHRoZSBzYW1lIHBhdGgKLSAqIHNob3VsZCBmYWlsLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q2xhc3NwYXRoV2l0aER1cGxpY2F0ZUVudHJpZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSAgdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGNwPSBwcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdDcD0gbmV3IElDbGFzc3BhdGhFbnRyeVtjcC5sZW5ndGggKjJdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGNwLCAwLCBuZXdDcCwgMCwgY3AubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShjcCwgMCwgbmV3Q3AsIGNwLmxlbmd0aCwgY3AubGVuZ3RoKTsKLQkJdHJ5IHsKLQkJCXByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0NwLCBudWxsKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWFzc2VydFRydWUoIlNldHRpbmcgdGhlIGNsYXNzcGF0aCB3aXRoIHR3byBlbnRyaWVzIHNwZWNpZnlpbmcgdGhlIHNhbWUgcGF0aCBzaG91bGQgZmFpbCIsIGZhbHNlKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0vKioKLSAqIEFkZGluZyBhbiBlbnRyeSB0byB0aGUgY2xhc3NwYXRoIGZvciBhIGxpYnJhcnkgdGhhdCBkb2VzIG5vdCBleGlzdAotICogc2hvdWxkIG5vdCBicmVhayB0aGUgbW9kZWwuIFRoZSBjbGFzc3BhdGggc2hvdWxkIGNvbnRhaW4gdGhlCi0gKiBlbnRyeSwgYnV0IHRoZSByb290IHNob3VsZCBub3QgYXBwZWFyIGluIHRoZSBjaGlsZHJlbi4KLSAqLwotcHVibGljIHZvaWQgdGVzdENsYXNzcGF0aFdpdGhOb25FeGlzdGVudExpYnJhcnlFbnRyeSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvamVjdD0gIHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBvcmlnaW5hbFBhdGg9IHByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gb3JpZ2luYWxSb290cz0gcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOwotCQotCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdQYXRoPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29yaWdpbmFsUGF0aC5sZW5ndGggKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShvcmlnaW5hbFBhdGgsIDAsIG5ld1BhdGgsIDAsIG9yaWdpbmFsUGF0aC5sZW5ndGgpOwotCQotCQlJQ2xhc3NwYXRoRW50cnkgbmV3RW50cnk9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShuZXcgUGF0aCgiYzovbm90aGluZy9ub3ppcC5qYXIiKSwgbnVsbCwgbnVsbCwgZmFsc2UpOwotCQluZXdQYXRoW29yaWdpbmFsUGF0aC5sZW5ndGhdPSBuZXdFbnRyeTsKLQkKLQkJcHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3UGF0aCwgbnVsbCk7Ci0KLQkJSUNsYXNzcGF0aEVudHJ5W10gZ2V0UGF0aD0gcHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJYXNzZXJ0VHJ1ZSgic2hvdWxkIGJlIHRoZSBzYW1lIGxlbmd0aCIsIGdldFBhdGgubGVuZ3RoID09IG5ld1BhdGgubGVuZ3RoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGdldFBhdGgubGVuZ3RoOyBpKyspIHsKLQkJCWFzc2VydFRydWUoImVudHJpZXMgc2hvdWxkIGJlIHRoZSBzYW1lIiwgZ2V0UGF0aFtpXS5lcXVhbHMobmV3UGF0aFtpXSkpOwotCQl9Ci0KLQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBuZXdSb290cz0gcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOwotCQlhc3NlcnRUcnVlKCJTaG91bGQgYmUgdGhlIHNhbWUgbnVtYmVyIG9mIHJvb3RzIiwgb3JpZ2luYWxSb290cy5sZW5ndGggPT0gbmV3Um9vdHMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IG5ld1Jvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhc3NlcnRUcnVlKCJyb290cyBzaG91bGQgYmUgdGhlIHNhbWUiLCBvcmlnaW5hbFJvb3RzW2ldLmVxdWFscyhuZXdSb290c1tpXSkpOwotCQl9Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoqCi0gKiBBZGRpbmcgYW4gZW50cnkgdG8gdGhlIGNsYXNzcGF0aCBmb3IgYSBwcm9qZWN0IHRoYXQgZG9lcyBub3QgZXhpc3QKLSAqIHNob3VsZCBub3QgYnJlYWsgdGhlIG1vZGVsLiBUaGUgY2xhc3NwYXRoIHNob3VsZCBjb250YWluIHRoZQotICogZW50cnksIGJ1dCB0aGUgcm9vdCBzaG91bGQgbm90IGFwcGVhciBpbiB0aGUgY2hpbGRyZW4uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDbGFzc3BhdGhXaXRoTm9uRXhpc3RlbnRQcm9qZWN0RW50cnkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IHByb2plY3Q9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBvcmlnaW5hbFBhdGg9IHByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gb3JpZ2luYWxSb290cz0gcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOwotCQotCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdQYXRoPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29yaWdpbmFsUGF0aC5sZW5ndGggKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShvcmlnaW5hbFBhdGgsIDAsIG5ld1BhdGgsIDAsIG9yaWdpbmFsUGF0aC5sZW5ndGgpOwotCQotCQlJQ2xhc3NwYXRoRW50cnkgbmV3RW50cnk9IEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShuZXcgUGF0aCgiL05vUHJvamVjdCIpLCBmYWxzZSk7Ci0JCW5ld1BhdGhbb3JpZ2luYWxQYXRoLmxlbmd0aF09IG5ld0VudHJ5OwotCQotCQlwcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXdQYXRoLCBudWxsKTsKLQkKLQkJSUNsYXNzcGF0aEVudHJ5W10gZ2V0UGF0aD0gcHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJYXNzZXJ0VHJ1ZSgic2hvdWxkIGJlIHRoZSBzYW1lIGxlbmd0aCIsIGdldFBhdGgubGVuZ3RoID09IG5ld1BhdGgubGVuZ3RoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGdldFBhdGgubGVuZ3RoOyBpKyspIHsKLQkJCWFzc2VydFRydWUoImVudHJpZXMgc2hvdWxkIGJlIHRoZSBzYW1lIiwgZ2V0UGF0aFtpXS5lcXVhbHMobmV3UGF0aFtpXSkpOwotCQl9Ci0JCi0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gbmV3Um9vdHM9IHByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTsKLQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIGJlIHRoZSBzYW1lIG51bWJlciBvZiByb290cyIsIG9yaWdpbmFsUm9vdHMubGVuZ3RoID09IG5ld1Jvb3RzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBuZXdSb290cy5sZW5ndGg7IGkrKykgewotCQkJYXNzZXJ0VHJ1ZSgicm9vdHMgc2hvdWxkIGJlIHRoZSBzYW1lIiwgb3JpZ2luYWxSb290c1tpXS5lcXVhbHMobmV3Um9vdHNbaV0pKTsKLQkJfQotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qKgotICogQWRkaW5nIGFuIGVudHJ5IHRvIHRoZSBjbGFzc3BhdGggZm9yIGEgZm9sZGVyIHRoYXQgZG9lcyBub3QgZXhpc3QKLSAqIHNob3VsZCBub3QgYnJlYWsgdGhlIG1vZGVsLiBUaGUgY2xhc3NwYXRoIHNob3VsZCBjb250YWluIHRoZQotICogZW50cnksIGJ1dCB0aGUgcm9vdCBzaG91bGQgbm90IGFwcGVhciBpbiB0aGUgY2hpbGRyZW4uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDbGFzc3BhdGhXaXRoTm9uRXhpc3RlbnRTb3VyY2VFbnRyeSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvamVjdD0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIG9yaWdpbmFsUGF0aD0gcHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBvcmlnaW5hbFJvb3RzPSBwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0KLQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3UGF0aD0gbmV3IElDbGFzc3BhdGhFbnRyeVtvcmlnaW5hbFBhdGgubGVuZ3RoICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkob3JpZ2luYWxQYXRoLCAwLCBuZXdQYXRoLCAwLCBvcmlnaW5hbFBhdGgubGVuZ3RoKTsKLQotCQlJQ2xhc3NwYXRoRW50cnkgbmV3RW50cnk9IEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KG5ldyBQYXRoKCIvUC9tb3JlU291cmNlIikpOwotCQluZXdQYXRoW29yaWdpbmFsUGF0aC5sZW5ndGhdPSBuZXdFbnRyeTsKLQotCQlwcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXdQYXRoLCBudWxsKTsKLQotCQlJQ2xhc3NwYXRoRW50cnlbXSBnZXRQYXRoPSBwcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQlhc3NlcnRUcnVlKCJzaG91bGQgYmUgdGhlIHNhbWUgbGVuZ3RoIiwgZ2V0UGF0aC5sZW5ndGggPT0gbmV3UGF0aC5sZW5ndGgpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgZ2V0UGF0aC5sZW5ndGg7IGkrKykgewotCQkJYXNzZXJ0VHJ1ZSgiZW50cmllcyBzaG91bGQgYmUgdGhlIHNhbWUiLCBnZXRQYXRoW2ldLmVxdWFscyhuZXdQYXRoW2ldKSk7Ci0JCX0KLQotCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIG5ld1Jvb3RzPSBwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0JCWFzc2VydFRydWUoIlNob3VsZCBiZSB0aGUgc2FtZSBudW1iZXIgb2Ygcm9vdHMiLCBvcmlnaW5hbFJvb3RzLmxlbmd0aCA9PSBuZXdSb290cy5sZW5ndGgpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgbmV3Um9vdHMubGVuZ3RoOyBpKyspIHsKLQkJCWFzc2VydFRydWUoInJvb3RzIHNob3VsZCBiZSB0aGUgc2FtZSIsIG9yaWdpbmFsUm9vdHNbaV0uZXF1YWxzKG5ld1Jvb3RzW2ldKSk7Ci0JCX0KLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0KLS8qKgotICogRW5zdXJlIHRoYXQgY3ljbGUgYXJlIHByb3Blcmx5IHJlcG9ydGVkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q3ljbGVSZXBvcnQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQl0cnkgewotCQlJSmF2YVByb2plY3QgcDEgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMSIsIG5ldyBTdHJpbmdbXSB7IiJ9LCAiIik7Ci0JCUlKYXZhUHJvamVjdCBwMiA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHsiIn0sICIiKTsKLQkJSUphdmFQcm9qZWN0IHAzID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDMiLCBuZXcgU3RyaW5nW10geyIifSwgbmV3IFN0cmluZ1tdIHt9LCBuZXcgU3RyaW5nW10geyIvUDIifSwgIiIpOwotCQotCQkvLyBFbnN1cmUgbm8gY3ljbGUgcmVwb3J0ZWQKLQkJSUphdmFQcm9qZWN0W10gcHJvamVjdHMgPSB7IHAxLCBwMiwgcDMgfTsKLQkJaW50IGN5Y2xlTWFya2VyQ291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKXsKLQkJCWN5Y2xlTWFya2VyQ291bnQgKz0gdGhpcy5udW1iZXJPZkN5Y2xlTWFya2Vycyhwcm9qZWN0c1tpXSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIGhhdmUgbm8gY3ljbGUgbWFya2VycyIsIGN5Y2xlTWFya2VyQ291bnQgPT0gMCk7Ci0JCi0JCS8vIEFkZCBjeWNsZQotCQlJQ2xhc3NwYXRoRW50cnlbXSBvcmlnaW5hbFAxQ1A9IHAxLmdldFJhd0NsYXNzcGF0aCgpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBvcmlnaW5hbFAyQ1A9IHAyLmdldFJhd0NsYXNzcGF0aCgpOwotCi0JCS8vIEFkZCBQMSBhcyBhIHByZXJlcXVlc2l0ZSBvZiBQMgotCQlpbnQgbGVuZ3RoID0gb3JpZ2luYWxQMkNQLmxlbmd0aDsKLQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q1A9IG5ldyBJQ2xhc3NwYXRoRW50cnlbbGVuZ3RoICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkob3JpZ2luYWxQMkNQLCAwICwgbmV3Q1AsIDAsIGxlbmd0aCk7Ci0JCW5ld0NQW2xlbmd0aF09IEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShwMS5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKSwgZmFsc2UpOwotCQlwMi5zZXRSYXdDbGFzc3BhdGgobmV3Q1AsIG51bGwpOwotCi0JCS8vIEFkZCBQMyBhcyBhIHByZXJlcXVlc2l0ZSBvZiBQMQotCQlsZW5ndGggPSBvcmlnaW5hbFAxQ1AubGVuZ3RoOwotCQluZXdDUD0gbmV3IElDbGFzc3BhdGhFbnRyeVtsZW5ndGggKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShvcmlnaW5hbFAxQ1AsIDAgLCBuZXdDUCwgMCwgbGVuZ3RoKTsKLQkJbmV3Q1BbbGVuZ3RoXT0gSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KHAzLmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpLCBmYWxzZSk7Ci0JCXAxLnNldFJhd0NsYXNzcGF0aChuZXdDUCwgbnVsbCk7Ci0KLQkJLy8gRW5zdXJlIGEgY3ljbGUgaXMgcmVwb3J0ZWQgb24gb25lIG9mIHRoZSBwcm9qZWN0cwotCQkvLyBFbnN1cmUgbm8gY3ljbGUgcmVwb3J0ZWQKLQkJY3ljbGVNYXJrZXJDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspewotCQkJY3ljbGVNYXJrZXJDb3VudCArPSB0aGlzLm51bWJlck9mQ3ljbGVNYXJrZXJzKHByb2plY3RzW2ldKTsKLQkJfQotCQlhc3NlcnRUcnVlKCJTaG91bGQgaGF2ZSAzIHByb2plY3RzIGludm9sdmVkIGluIGEgY2xhc3NwYXRoIGN5Y2xlIiwgY3ljbGVNYXJrZXJDb3VudCA9PSAzKTsKLQkJCi0JfSBmaW5hbGx5IHsKLQkJLy8gY2xlYW51cCAgCi0JCXRoaXMuZGVsZXRlUHJvamVjdHMobmV3IFN0cmluZ1tdIHsiUDEiLCAiUDIiLCAiUDMifSk7Ci0JfQotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgdGhlIGRlZmF1bHQgY2xhc3NwYXRoIGFuZCBvdXRwdXQgbG9jYXRpb25zIGFyZSBjb3JyZWN0LgotICogVGhlIGRlZmF1bHQgY2xhc3NwYXRoIHNob3VsZCBiZSB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdC4KLSAqIFRoZSBkZWZhdWx0IG91dHB1dCBsb2NhdGlvbiBzaG91bGQgYmUgdGhlIHJvb3Qgb2YgdGhlIHByb2plY3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0Q2xhc3NwYXRoQW5kT3V0cHV0TG9jYXRpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsiIn0sICJiaW4iKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gcHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGRlZmF1bHQgY2xhc3NwYXRoOyB0byBtYW55IGVudHJpZXMiLCBjbGFzc3BhdGgubGVuZ3RoID09IDEpOwotCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgZGVmYXVsdCBjbGFzc3BhdGg6ICIgKyBjbGFzc3BhdGhbMF0sIGNsYXNzcGF0aFswXS5nZXRQYXRoKCkuZXF1YWxzKHByb2plY3QuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkuZ2V0RnVsbFBhdGgoKSkpOwotCQlJUGF0aCBvdXRwdXQgPSBwcm9qZWN0LmdldE91dHB1dExvY2F0aW9uKCk7Ci0JCWFzc2VydFRydWUoIkluY29ycmVjdCBkZWZhdWx0IG91dHB1dCBsb2NhdGlvbjogIiArIG91dHB1dC50b09TU3RyaW5nKCksIG91dHB1dC5lcXVhbHMocHJvamVjdC5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpLmFwcGVuZCgiYmluIikpKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0KLS8qKgotICogU2V0dGluZyB0aGUgY2xhc3NwYXRoIHRvIGVtcHR5IHNob3VsZCByZXN1bHQgaW4gbm8gZW50cmllcywKLSAqIGFuZCBhIGRlbHRhIHdpdGggcmVtb3ZlZCByb290cy4KLSAqLwotcHVibGljIHZvaWQgdGVzdEVtcHR5Q2xhc3NwYXRoKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7IiJ9LCAiIik7Ci0JdHJ5IHsKLQkJc3RhcnREZWx0YXMoKTsKLQkJc2V0Q2xhc3NwYXRoKHByb2plY3QsIG5ldyBJQ2xhc3NwYXRoRW50cnlbXSB7fSk7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGNwPSBwcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQlhc3NlcnRUcnVlKCJjbGFzc3BhdGggc2hvdWxkIGhhdmUgbm8gZW50cmllcyIsIGNwLmxlbmd0aCA9PSAwKTsKLQotCQkvLyBlbnN1cmUgdGhlIGRlbHRhcyBhcmUgY29ycmVjdAotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSIsCi0JCQkiUFsqXToge0NISUxEUkVOfVxuIiArIAotCQkJIglbcHJvamVjdCByb290XVsqXToge1JFTU9WRUQgRlJPTSBDTEFTU1BBVEh9XG4iICsgCi0JCQkiCVJlc291cmNlRGVsdGEoL1AvLmNsYXNzcGF0aClbKl0iCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0vKioKLSAqIEV4cG9ydGluZyBhIGNvbnRhaW5lciBzaG91bGQgbWFrZSBpdCB2aXNpYmxlIHRvIGl0cyBkZXBlbmRlbnQgcHJvamVjdC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAyMTc0OSBFeHBvcnRlZCBsaWJyYXJpZXMgYW5kIHNvdXJjZSBmb2xkZXJzKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0RXhwb3J0Q29udGFpbmVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwMSA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAxIiwgbmV3IFN0cmluZ1tdIHsiIn0sICIiKTsKLQotCQkvLyBjcmVhdGUgY29udGFpbmVyCi0JCUphdmFDb3JlLnNldENsYXNzcGF0aENvbnRhaW5lcigKLQkJCW5ldyBQYXRoKCJjb250YWluZXIvZGVmYXVsdCIpLCAKLQkJCW5ldyBJSmF2YVByb2plY3RbXXsgcDEgfSwKLQkJCW5ldyBJQ2xhc3NwYXRoQ29udGFpbmVyW10gewotCQkJCW5ldyBUZXN0Q29udGFpbmVyKAotCQkJCQluZXcgUGF0aCgiY29udGFpbmVyL2RlZmF1bHQiKSwKLQkJCQkJbmV3IElDbGFzc3BhdGhFbnRyeVtdIHsKLQkJCQkJCUphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShnZXRFeHRlcm5hbEpDTFBhdGgoKSwgbnVsbCwgbnVsbCkKLQkJCQkJfSkgCi0JCQl9LCAKLQkJCW51bGwpOwotCi0JCS8vIHNldCBQMSdzIGNsYXNzcGF0aCB3aXRoIHRoaXMgY29udGFpbmVyCi0JCUlDbGFzc3BhdGhFbnRyeSBjb250YWluZXIgPSBKYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeShuZXcgUGF0aCgiY29udGFpbmVyL2RlZmF1bHQiKSwgdHJ1ZSk7Ci0JCXAxLnNldFJhd0NsYXNzcGF0aChuZXcgSUNsYXNzcGF0aEVudHJ5W10ge2NvbnRhaW5lcn0sIG5ldyBQYXRoKCIvUDEiKSwgbnVsbCk7Ci0JCQotCQkvLyBjcmVhdGUgZGVwZW5kZW50IHByb2plY3QgUDIKLQkJSUphdmFQcm9qZWN0ICBwMiA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHt9LCBuZXcgU3RyaW5nW10ge30sIG5ldyBTdHJpbmdbXSB7Ii9QMSJ9LCAiIik7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCA9ICgoSmF2YVByb2plY3QpcDIpLmdldEV4cGFuZGVkQ2xhc3NwYXRoKHRydWUpOwotCQkKLQkJLy8gZW5zdXJlIGNvbnRhaW5lciBpcyBleHBvcnRlZCB0byBQMgotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIGNsYXNzcGF0aCBlbnRyaWVzIiwgMiwgY2xhc3NwYXRoLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBmaXJzdCBlbnRyeSIsICIvUDEiLCBjbGFzc3BhdGhbMF0uZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgc2Vjb25kIGVudHJ5IiwgZ2V0RXh0ZXJuYWxKQ0xQYXRoU3RyaW5nKCksIGNsYXNzcGF0aFsxXS5nZXRQYXRoKCkudG9PU1N0cmluZygpKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3RzKG5ldyBTdHJpbmdbXSB7IlAxIiwgIlAyIn0pOwotCX0KLX0KLS8qKgotICogVGVzdCBJSmF2YVByb2plY3QuaGFzQ2xhc3NwYXRoQ3ljbGUoSUNsYXNzcGF0aEVudHJ5W10pLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0SGFzQ2xhc3NwYXRoQ3ljbGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IHAxID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDEiLCBuZXcgU3RyaW5nW10geyIifSwgIiIpOwotCQlJSmF2YVByb2plY3QgcDIgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMiIsIG5ldyBTdHJpbmdbXSB7IiJ9LCAiIik7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAzIiwgbmV3IFN0cmluZ1tdIHsiIn0sIG5ldyBTdHJpbmdbXSB7fSwgbmV3IFN0cmluZ1tdIHsiL1AxIn0sICIiKTsKLQkKLQkJSUNsYXNzcGF0aEVudHJ5W10gb3JpZ2luYWxQMUNQPSBwMS5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gb3JpZ2luYWxQMkNQPSBwMi5nZXRSYXdDbGFzc3BhdGgoKTsKLQkKLQkJLy8gRW5zdXJlIG5vIGN5Y2xlIHJlcG9ydGVkCi0JCWFzc2VydFRydWUoIlAxIHNob3VsZCBub3QgaGF2ZSBhIGN5Y2xlIiwgIXAxLmhhc0NsYXNzcGF0aEN5Y2xlKG9yaWdpbmFsUDFDUCkpOwotCi0JCS8vIEVuc3VyZSB0aGF0IGFkZGluZyBOZXJ2b3VzVGVzdCBhcyBhIHByZXJlcXVlc2l0ZSBvZiBQMiBkb2Vzbid0IHJlcG9ydCBhIGN5Y2xlCi0JCWludCBsZW5ndGggPSBvcmlnaW5hbFAyQ1AubGVuZ3RoOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdDUD0gbmV3IElDbGFzc3BhdGhFbnRyeVtsZW5ndGggKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShvcmlnaW5hbFAyQ1AsIDAgLCBuZXdDUCwgMCwgbGVuZ3RoKTsKLQkJbmV3Q1BbbGVuZ3RoXT0gSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KHAxLmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpLCBmYWxzZSk7Ci0JCWFzc2VydFRydWUoIlAyIHNob3VsZCBub3QgaGF2ZSBhIGN5Y2xlIiwgIXAyLmhhc0NsYXNzcGF0aEN5Y2xlKG5ld0NQKSk7Ci0JCXAyLnNldFJhd0NsYXNzcGF0aChuZXdDUCwgbnVsbCk7Ci0KLQkJLy8gRW5zdXJlIHRoYXQgYWRkaW5nIFAzIGFzIGEgcHJlcmVxdWVzaXRlIG9mIFAxIHJlcG9ydHMgYSBjeWNsZQotCQlsZW5ndGggPSBvcmlnaW5hbFAxQ1AubGVuZ3RoOwotCQluZXdDUD0gbmV3IElDbGFzc3BhdGhFbnRyeVtsZW5ndGggKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShvcmlnaW5hbFAxQ1AsIDAgLCBuZXdDUCwgMCwgbGVuZ3RoKTsKLQkJbmV3Q1BbbGVuZ3RoXT0gSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KHAyLmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpLCBmYWxzZSk7Ci0JCWFzc2VydFRydWUoIlAzIHNob3VsZCBoYXZlIGEgY3ljbGUiLCBwMi5oYXNDbGFzc3BhdGhDeWNsZShuZXdDUCkpOwotCi0JCS8vIEVuc3VyZSBhIGN5Y2xlIGlzIG5vdCByZXBvcnRlZCB0aHJvdWdoIG1hcmtlcnMKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBnZXRKYXZhTW9kZWwoKS5nZXRXb3Jrc3BhY2UoKTsKLQkJSU1hcmtlcltdIG1hcmtlcnMgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmZpbmRNYXJrZXJzKElKYXZhTW9kZWxNYXJrZXIuVFJBTlNJRU5UX1BST0JMRU0sIHRydWUsIDEpOwotCQlib29sZWFuIGhhc0N5Y2xlTWFya2VyID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKyl7Ci0JCQlpZiAobWFya2Vyc1tpXS5nZXRBdHRyaWJ1dGUoSUphdmFNb2RlbE1hcmtlci5DWUNMRV9ERVRFQ1RFRCkgIT0gbnVsbCkgewotCQkJCWhhc0N5Y2xlTWFya2VyID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCWFzc2VydFRydWUoIlNob3VsZCBoYXZlIG5vIGN5Y2xlIG1hcmtlcnMiLCAhaGFzQ3ljbGVNYXJrZXIpOwotCQkKLQl9IGZpbmFsbHkgewotCQkvLyBjbGVhbnVwICAKLQkJdGhpcy5kZWxldGVQcm9qZWN0cyhuZXcgU3RyaW5nW10geyJQMSIsICJQMiIsICJQMyJ9KTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIG1hcmtlciBpcyBjcmVhdGVkIGlmIGVkaXRpbmcgdGhlIC5jbGFzc3BhdGggcmVzdWx0cyBpbiBhbiBpbnZhbGlkIGNsYXNzcGF0aC4KLSAqLwotcHVibGljIHZvaWQgdGVzdEludmFsaWRDbGFzc3BhdGgxKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCXRoaXMuZWRpdEZpbGUoCi0JCQkiL1AvLmNsYXNzcGF0aCIsCi0JCQkiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iICsKLQkJCSI8Y2xhc3NwYXRoPlxuIiArCi0JCQkiICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPVwic3JjXCIgcGF0aD1cInNyY1wiL1xuIiArIC8vIG1pc3NpbmcgPgotCQkJIiAgICA8Y2xhc3NwYXRoZW50cnkga2luZD1cIm91dHB1dFwiIHBhdGg9XCJiaW5cIi8+XG4iICsKLQkJCSI8L2NsYXNzcGF0aD4iCi0JCSk7Ci0JCWFzc2VydE1hcmtlcnMoCi0JCQkiVW5leHBlY3RlZCBtYXJrZXJzIiwKLQkJCSJYTUwgZm9ybWF0IGVycm9yIGluICdQLy5jbGFzc3BhdGgnIGZpbGU6IEJhZCBmb3JtYXQuIiwKLQkJCXByb2plY3QpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgbWFya2VyIGlzIGNyZWF0ZWQgaWYgZWRpdGluZyB0aGUgLmNsYXNzcGF0aCByZXN1bHRzIGluIGFuIGludmFsaWQgY2xhc3NwYXRoLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENsYXNzcGF0aDIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJdGhpcy5lZGl0RmlsZSgKLQkJCSIvUC8uY2xhc3NwYXRoIiwKLQkJCSI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIgKwotCQkJIjxjbGFzc3BhdGg+XG4iICsKLQkJCSIgICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9XCJzcmMxXCIgcGF0aD1cInNyY1wiLz5cbiIgKyAvLyBpbnZhbGlkIGtpbmQ6IHNyYzEKLQkJCSIgICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9XCJvdXRwdXRcIiBwYXRoPVwiYmluXCIvPlxuIiArCi0JCQkiPC9jbGFzc3BhdGg+IgotCQkpOwotCQlhc3NlcnRNYXJrZXJzKAotCQkJIlVuZXhwZWN0ZWQgbWFya2VycyIsCi0JCQkiSWxsZWdhbCBlbnRyeSBpbiAnUC8uY2xhc3NwYXRoJyBmaWxlOiBVbmtub3duIGtpbmQ6IHNyYzEiLAotCQkJcHJvamVjdCk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoqCi0gKiBUZXN0IHRoYXQgYSBtYXJrZXIgaXMgYWRkZWQgd2hlbiBhIHByb2plY3QgYXMgYSBtaXNzaW5nIHByb2plY3QgaW4gaXRzIGNsYXNzcGF0aC4KLSAqLwotcHVibGljIHZvaWQgdGVzdE1pc3NpbmdQcmVyZXExKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIkEiLCBuZXcgU3RyaW5nW10ge30sICIiKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gCi0JCQluZXcgSUNsYXNzcGF0aEVudHJ5W10gewotCQkJCUphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShuZXcgUGF0aCgiL0IiKSkKLQkJCX07Ci0JCWphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChjbGFzc3BhdGgsIG51bGwpOwotCQl0aGlzLmFzc2VydE1hcmtlcnMoCi0JCQkiVW5leHBlY3RlZCBtYXJrZXJzIiwKLQkJCSJNaXNzaW5nIHJlcXVpcmVkIEphdmEgcHJvamVjdDogQi4iLAotCQkJamF2YVByb2plY3QpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiQSIpOwotCX0KLX0KLS8qKgotICogVGVzdCB0aGF0IGEgbWFya2VyIGlzIGFkZGVkIHdoZW4gYSBwcm9qZWN0IGFzIGEgbWlzc2luZyBwcm9qZWN0IGluIGl0cyBjbGFzc3BhdGguCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nUHJlcmVxMigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSAKLQkJCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoCi0JCQkJIkEiLCAKLQkJCQluZXcgU3RyaW5nW10ge30sIC8vIHNvdXJjZSBmb2xkZXJzCi0JCQkJbmV3IFN0cmluZ1tdIHt9LCAvLyBsaWIgZm9sZGVycwotCQkJCW5ldyBTdHJpbmdbXSB7Ii9CIn0sIC8vIHByb2plY3RzCi0JCQkJIiIpOwotCQl0aGlzLmFzc2VydE1hcmtlcnMoCi0JCQkiVW5leHBlY3RlZCBtYXJrZXJzIiwKLQkJCSJNaXNzaW5nIHJlcXVpcmVkIEphdmEgcHJvamVjdDogQi4iLAotCQkJamF2YVByb2plY3QpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiQSIpOwotCX0KLX0KLS8qKgotICogVGVzdCB0aGF0IGEgbWFya2VyIGluZGljYXRpbmcgYSBtaXNzaW5nIHByb2plY3QgaXMgcmVtb3ZlZCB3aGVuIHRoZSBwcm9qZWN0IGlzIGFkZGVkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ1ByZXJlcTMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gCi0JCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KAotCQkJCSJBIiwgCi0JCQkJbmV3IFN0cmluZ1tdIHt9LCAvLyBzb3VyY2UgZm9sZGVycwotCQkJCW5ldyBTdHJpbmdbXSB7fSwgLy8gbGliIGZvbGRlcnMKLQkJCQluZXcgU3RyaW5nW10geyIvQiJ9LCAvLyBwcm9qZWN0cwotCQkJCSIiKTsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiQiIsIG5ldyBTdHJpbmdbXSB7fSwgIiIpOwotCQl0aGlzLmFzc2VydE1hcmtlcnMoIlVuZXhwZWN0ZWQgbWFya2VycyIsICIiLCBqYXZhUHJvamVjdCk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0cyhuZXcgU3RyaW5nW10geyJBIiwgIkIifSk7Ci0JfQotfQotLyoqCi0gKiBUZXN0IHRoYXQgYSBtYXJrZXIgaW5kaWNhdGluZyBhIGN5Y2xlIGlzIHJlbW92ZWQgd2hlbiBhIHByb2plY3QgaW4gdGhlIGN5Y2xlIGlzIGRlbGV0ZWQKLSAqIGFuZCByZXBsYWNlZCB3aXRoIGEgbWlzc2luZyBwcmVyZXEgbWFya2VyLgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDE1MTY4IGNpcmN1bGFyIGVycm9ycyBub3QgcmVwb3J0ZWQpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nUHJlcmVxNCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvamVjdEEgPQotCQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgKLQkJCQkiQSIsIAotCQkJCW5ldyBTdHJpbmdbXSB7fSwgLy8gc291cmNlIGZvbGRlcnMKLQkJCQluZXcgU3RyaW5nW10ge30sIC8vIGxpYiBmb2xkZXJzCi0JCQkJbmV3IFN0cmluZ1tdIHsiL0IifSwgLy8gcHJvamVjdHMKLQkJCQkiIik7Ci0JCUlKYXZhUHJvamVjdCBwcm9qZWN0QiA9Ci0JCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KAotCQkJCSJCIiwgCi0JCQkJbmV3IFN0cmluZ1tdIHt9LCAvLyBzb3VyY2UgZm9sZGVycwotCQkJCW5ldyBTdHJpbmdbXSB7fSwgLy8gbGliIGZvbGRlcnMKLQkJCQluZXcgU3RyaW5nW10geyIvQSJ9LCAvLyBwcm9qZWN0cwotCQkJCSIiKTsKLQkJdGhpcy5hc3NlcnRNYXJrZXJzKAotCQkJIlVuZXhwZWN0ZWQgbWFya2VycyBmb3IgcHJvamVjdCBBIiwKLQkJCSJBIGN5Y2xlIHdhcyBkZXRlY3RlZCBpbiB0aGUgYnVpbGQgcGF0aCBvZiBwcm9qZWN0OiBBIiwKLQkJCXByb2plY3RBKTsKLQkJdGhpcy5hc3NlcnRNYXJrZXJzKAotCQkJIlVuZXhwZWN0ZWQgbWFya2VycyBmb3IgcHJvamVjdCBCIiwKLQkJCSJBIGN5Y2xlIHdhcyBkZXRlY3RlZCBpbiB0aGUgYnVpbGQgcGF0aCBvZiBwcm9qZWN0OiBCIiwKLQkJCXByb2plY3RCKTsKLQkJCi0JCS8vIGRlbGV0ZSBwcm9qZWN0IEIJCi0JCXRoaXMuZGVsZXRlUHJvamVjdCgiQiIpOwotCQl0aGlzLmFzc2VydE1hcmtlcnMoCi0JCQkiVW5leHBlY3RlZCBtYXJrZXJzIGZvciBwcm9qZWN0IEEgYWZ0ZXIgZGVsZXRpbmcgb2YgcHJvamVjdCBCIiwKLQkJCSJNaXNzaW5nIHJlcXVpcmVkIEphdmEgcHJvamVjdDogQi4iLAotCQkJcHJvamVjdEEpOwotCQkJCi0JCS8vIGFkZCBwcm9qZWN0IEIgYmFjawotCQlwcm9qZWN0QiA9Ci0JCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KAotCQkJCSJCIiwgCi0JCQkJbmV3IFN0cmluZ1tdIHt9LCAvLyBzb3VyY2UgZm9sZGVycwotCQkJCW5ldyBTdHJpbmdbXSB7fSwgLy8gbGliIGZvbGRlcnMKLQkJCQluZXcgU3RyaW5nW10geyIvQSJ9LCAvLyBwcm9qZWN0cwotCQkJCSIiKTsKLQkJdGhpcy5hc3NlcnRNYXJrZXJzKAotCQkJIlVuZXhwZWN0ZWQgbWFya2VycyBmb3IgcHJvamVjdCBBIGFmdGVyIGFkZGluZyBwcm9qZWN0IEIgYmFjayIsCi0JCQkiQSBjeWNsZSB3YXMgZGV0ZWN0ZWQgaW4gdGhlIGJ1aWxkIHBhdGggb2YgcHJvamVjdDogQSIsCi0JCQlwcm9qZWN0QSk7Ci0JCXRoaXMuYXNzZXJ0TWFya2VycygKLQkJCSJVbmV4cGVjdGVkIG1hcmtlcnMgZm9yIHByb2plY3QgQiBhZnRlciBhZGRpbmcgcHJvamVjdCBCIGJhY2siLAotCQkJIkEgY3ljbGUgd2FzIGRldGVjdGVkIGluIHRoZSBidWlsZCBwYXRoIG9mIHByb2plY3Q6IEIiLAotCQkJcHJvamVjdEIpOwotCi0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0cyhuZXcgU3RyaW5nW10geyJBIiwgIkIifSk7Ci0JfQotfQotLyoqCi0gKiBTZXR0aW5nIHRoZSBjbGFzc3BhdGggdG8gbnVsbCBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdXNpbmcgdGhlCi0gKiBkZWZhdWx0IGNsYXNzcGF0aC4KLSAqLwotcHVibGljIHZvaWQgdGVzdE51bGxDbGFzc3BhdGgoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsiIn0sICIiKTsKLQkJc2V0Q2xhc3NwYXRoKHByb2plY3QsIG51bGwpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBjcD0gcHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJYXNzZXJ0VHJ1ZSgiY2xhc3NwYXRoIHNob3VsZCBoYXZlIG9uZSByb290IGVudHJ5IiwgY3AubGVuZ3RoID09IDEgJiYgY3BbMF0uZ2V0UGF0aCgpLmVxdWFscyhwcm9qZWN0LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkpKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZSB0aGF0IHJlYWRpbmcgYW4gZW1wdHkgY3VzdG9tIHB1dHB1dCBmcm9tIHRoZSAuY2xhc3NwYXRoIHJldHVybnMgYSBub24tbnVsbCBvdXRwdXQgbG9jYXRpb24uCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciAyODUzMSBDbGFzc3BhdGggRW50cnk6IE91dHB1dCBmb2xkZXIgY2FuIG5vdCBiZSBzZXQgdG8gcHJvamVjdCkKLSAqLwotcHVibGljIHZvaWQgdGVzdFJlYWRFbXB0eUN1c3RvbU91dHB1dCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10ge30sICIiKTsKLQkJdGhpcy5lZGl0RmlsZSgKLQkJCSIvUC8uY2xhc3NwYXRoIiwKLQkJCSI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIgKwotCQkJIjxjbGFzc3BhdGg+XG4iICsKLQkJCSIgICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9XCJzcmNcIiBvdXRwdXQ9XCJcIiBwYXRoPVwiXCIvPlxuIiArCi0JCQkiICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPVwib3V0cHV0XCIgcGF0aD1cImJpblwiLz5cbiIgKwotCQkJIjwvY2xhc3NwYXRoPiIKLQkJKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gcHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGNsYXNzcGF0aCBsZW5ndGgiLCAxLCBjbGFzc3BhdGgubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGN1c3RvbSBvdXRwdXQgbG9jYXRpb24iLCBuZXcgUGF0aCgiL1AiKSwgY2xhc3NwYXRoWzBdLmdldE91dHB1dExvY2F0aW9uKCkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLQotCi1wdWJsaWMgdm9pZCB0ZXN0Q3ljbGVEZXRlY3Rpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCi0JaW50IG1heCA9IDU7Ci0JSUphdmFQcm9qZWN0W10gcCA9IG5ldyBJSmF2YVByb2plY3RbbWF4XTsKLQlTdHJpbmdbXSBwcm9qZWN0TmFtZXMgPSBuZXcgU3RyaW5nW21heF07Ci0JdHJ5IHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgewotCQkJcHJvamVjdE5hbWVzW2ldID0gIlAiK2k7Ci0JCQlwW2ldID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdChwcm9qZWN0TmFtZXNbaV0sIG5ldyBTdHJpbmdbXSB7IiJ9LCAiIik7Ci0JCX0KLQotCQlJQ2xhc3NwYXRoRW50cnlbXVtdIGV4dHJhRW50cmllcyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbXVtdeyAKLQkJCXsgSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KHBbMV0uZ2V0UGF0aCgpKSwgSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KHBbM10uZ2V0UGF0aCgpKSB9LAotCQkJeyBKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkocFsyXS5nZXRQYXRoKCkpLCBKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkocFszXS5nZXRQYXRoKCkpIH0sCi0JCQl7IEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShwWzFdLmdldFBhdGgoKSkgfSwgCi0JCQl7IEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShwWzRdLmdldFBhdGgoKSl9LCAKLQkJCXsgSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KHBbM10uZ2V0UGF0aCgpKSwgSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KHBbMF0uZ2V0UGF0aCgpKSB9IAotCQl9OyAKLQotCQlpbnRbXVtdIGV4cGVjdGVkQ3ljbGVQYXJ0aWNpcGFudHMgPSBuZXcgaW50W11bXSB7Ci0JCQl7IDAsIDAsIDAsIDAsIDAgfSwgLy8gYWZ0ZXIgc2V0dGluZyBDUCBwWzBdCi0JCQl7IDAsIDAsIDAsIDAsIDAgfSwgLy8gYWZ0ZXIgc2V0dGluZyBDUCBwWzFdCi0JCQl7IDAsIDEsIDEsIDAsIDAgfSwgLy8gYWZ0ZXIgc2V0dGluZyBDUCBwWzJdCi0JCQl7IDAsIDEsIDEsIDAsIDAgfSwgLy8gYWZ0ZXIgc2V0dGluZyBDUCBwWzNdCi0JCQl7IDEsIDEsIDEsIDEsIDEgfSwgLy8gYWZ0ZXIgc2V0dGluZyBDUCBwWzRdCi0JCX07Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHAubGVuZ3RoOyBpKyspewotCi0JCQkvLyBhcHBlbmQgcHJvamVjdCByZWZlcmVuY2VzCQkJCi0JCQlJQ2xhc3NwYXRoRW50cnlbXSBvbGRDbGFzc3BhdGggPSBwW2ldLmdldFJhd0NsYXNzcGF0aCgpOwotCQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NwYXRoID0gbmV3IElDbGFzc3BhdGhFbnRyeVtvbGRDbGFzc3BhdGgubGVuZ3RoK2V4dHJhRW50cmllc1tpXS5sZW5ndGhdOwotCQkJU3lzdGVtLmFycmF5Y29weShvbGRDbGFzc3BhdGgsIDAgLCBuZXdDbGFzc3BhdGgsIDAsIG9sZENsYXNzcGF0aC5sZW5ndGgpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleHRyYUVudHJpZXNbaV0ubGVuZ3RoOyBqKyspewotCQkJCW5ld0NsYXNzcGF0aFtvbGRDbGFzc3BhdGgubGVuZ3RoK2pdID0gZXh0cmFFbnRyaWVzW2ldW2pdOwotCQkJfQkJCQotCQkJLy8gc2V0IGNsYXNzcGF0aAotCQkJcFtpXS5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoLCBudWxsKTsKLQotCQkJLy8gY2hlY2sgY3ljbGUgbWFya2VycwotCQkJdGhpcy5hc3NlcnRDeWNsZU1hcmtlcnMocFtpXSwgcCwgZXhwZWN0ZWRDeWNsZVBhcnRpY2lwYW50c1tpXSk7Ci0JCX0KLQkJLy90aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCQotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdHMocHJvamVjdE5hbWVzKTsKLQl9Ci19Ci0KLQotcHVibGljIHZvaWQgdGVzdEN5Y2xlRGV0ZWN0aW9uVGhyb3VnaFZhcmlhYmxlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkKLQlpbnQgbWF4ID0gNTsKLQlJSmF2YVByb2plY3RbXSBwID0gbmV3IElKYXZhUHJvamVjdFttYXhdOwotCVN0cmluZ1tdIHByb2plY3ROYW1lcyA9IG5ldyBTdHJpbmdbbWF4XTsKLQl0cnkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0JCQlwcm9qZWN0TmFtZXNbaV0gPSAiUCIraTsKLQkJCXBbaV0gPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KHByb2plY3ROYW1lc1tpXSwgbmV3IFN0cmluZ1tdIHsiIn0sICIiKTsKLQkJfQotCi0JCVN0cmluZ1tdIHZhciA9IG5ldyBTdHJpbmdbXXsgInYwIiwgInYxIiwgInYyIn07Ci0JCUlDbGFzc3BhdGhFbnRyeVtdW10gZXh0cmFFbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVtdW117IAotCQkJeyBKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkocFsxXS5nZXRQYXRoKCkpLCBKYXZhQ29yZS5uZXdWYXJpYWJsZUVudHJ5KG5ldyBQYXRoKHZhclswXSksIG51bGwsIG51bGwpIH0sCi0JCQl7IEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShwWzJdLmdldFBhdGgoKSksIEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShwWzNdLmdldFBhdGgoKSkgfSwKLQkJCXsgSmF2YUNvcmUubmV3VmFyaWFibGVFbnRyeShuZXcgUGF0aCh2YXJbMV0pLCBudWxsLCBudWxsKSB9LCAKLQkJCXsgSmF2YUNvcmUubmV3VmFyaWFibGVFbnRyeShuZXcgUGF0aCh2YXJbMl0pLCBudWxsLCBudWxsKX0sIAotCQkJeyBKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkocFszXS5nZXRQYXRoKCkpLCBKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkocFswXS5nZXRQYXRoKCkpIH0gCi0JCX07IAotCi0JCWludFtdW10gZXhwZWN0ZWRDeWNsZVBhcnRpY2lwYW50cyA9IG5ldyBpbnRbXVtdIHsKLQkJCXsgMCwgMCwgMCwgMCwgMCB9LCAvLyBhZnRlciBzZXR0aW5nIENQIHBbMF0KLQkJCXsgMCwgMCwgMCwgMCwgMCB9LCAvLyBhZnRlciBzZXR0aW5nIENQIHBbMV0KLQkJCXsgMCwgMCwgMCwgMCwgMCB9LCAvLyBhZnRlciBzZXR0aW5nIENQIHBbMl0KLQkJCXsgMCwgMCwgMCwgMCwgMCB9LCAvLyBhZnRlciBzZXR0aW5nIENQIHBbM10KLQkJCXsgMSwgMSwgMSwgMSwgMSB9LCAvLyBhZnRlciBzZXR0aW5nIENQIHBbNF0KLQkJfTsKLQkJCi0JCUlQYXRoW11bXSB2YXJpYWJsZVZhbHVlcyA9IG5ldyBJUGF0aFtdW117Ci0JCQl7IG51bGwsIG51bGwsIG51bGwgfSwKLQkJCXsgbnVsbCwgbnVsbCwgbnVsbCB9LAotCQkJeyBudWxsLCBudWxsLCBudWxsIH0sCi0JCQl7IG51bGwsIG51bGwsIG51bGwgfSwKLQkJCXsgcFszXS5nZXRQYXRoKCksIHBbMV0uZ2V0UGF0aCgpLCBwWzRdLmdldFBhdGgoKSB9LAotCQl9OwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwLmxlbmd0aDsgaSsrKXsKLQotCQkJLy8gYXBwZW5kIHByb2plY3QgcmVmZXJlbmNlcwkJCQotCQkJSUNsYXNzcGF0aEVudHJ5W10gb2xkQ2xhc3NwYXRoID0gcFtpXS5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0NsYXNzcGF0aCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbb2xkQ2xhc3NwYXRoLmxlbmd0aCtleHRyYUVudHJpZXNbaV0ubGVuZ3RoXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkob2xkQ2xhc3NwYXRoLCAwICwgbmV3Q2xhc3NwYXRoLCAwLCBvbGRDbGFzc3BhdGgubGVuZ3RoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZXh0cmFFbnRyaWVzW2ldLmxlbmd0aDsgaisrKXsKLQkJCQluZXdDbGFzc3BhdGhbb2xkQ2xhc3NwYXRoLmxlbmd0aCtqXSA9IGV4dHJhRW50cmllc1tpXVtqXTsKLQkJCX0JCQkKLQkJCS8vIHNldCBjbGFzc3BhdGgKLQkJCXBbaV0uc2V0UmF3Q2xhc3NwYXRoKG5ld0NsYXNzcGF0aCwgbnVsbCk7Ci0KLQkJCS8vIHVwZGF0ZSB2YXJpYWJsZSB2YWx1ZXMKLQkJCUphdmFDb3JlLnNldENsYXNzcGF0aFZhcmlhYmxlcyh2YXIsIHZhcmlhYmxlVmFsdWVzW2ldLCBudWxsKTsKLQkJCQotCQkJLy8gY2hlY2sgY3ljbGUgbWFya2VycwotCQkJdGhpcy5hc3NlcnRDeWNsZU1hcmtlcnMocFtpXSwgcCwgZXhwZWN0ZWRDeWNsZVBhcnRpY2lwYW50c1tpXSk7Ci0JCX0KLQkJLy90aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCQotCX0gZmluYWxseSB7Ci0JCS8vdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdHMocHJvamVjdE5hbWVzKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RDeWNsZURldGVjdGlvblRocm91Z2hDb250YWluZXJzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQotCWludCBtYXggPSA1OwotCUlKYXZhUHJvamVjdFtdIHAgPSBuZXcgSUphdmFQcm9qZWN0W21heF07Ci0JU3RyaW5nW10gcHJvamVjdE5hbWVzID0gbmV3IFN0cmluZ1ttYXhdOwotCXRyeSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCXByb2plY3ROYW1lc1tpXSA9ICJQIitpOwotCQkJcFtpXSA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QocHJvamVjdE5hbWVzW2ldLCBuZXcgU3RyaW5nW10geyIifSwgIiIpOwotCQl9Ci0KLQkJSUNsYXNzcGF0aENvbnRhaW5lcltdIGNvbnRhaW5lcnMgPSBuZXcgSUNsYXNzcGF0aENvbnRhaW5lcltdeyAKLQkJCW5ldyBUZXN0Q29udGFpbmVyKAotCQkJCW5ldyBQYXRoKCJjb250YWluZXIwL2RlZmF1bHQiKSwgCi0JCQkJbmV3IElDbGFzc3BhdGhFbnRyeVtdeyBKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkocFszXS5nZXRQYXRoKCkpIH0pLAotCQkJbmV3IFRlc3RDb250YWluZXIoCi0JCQkJbmV3IFBhdGgoImNvbnRhaW5lcjEvZGVmYXVsdCIpLCAKLQkJCQluZXcgSUNsYXNzcGF0aEVudHJ5W117IEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShwWzFdLmdldFBhdGgoKSkgfSksCi0JCQluZXcgVGVzdENvbnRhaW5lcigKLQkJCQluZXcgUGF0aCgiY29udGFpbmVyMi9kZWZhdWx0IiksIAotCQkJCW5ldyBJQ2xhc3NwYXRoRW50cnlbXXsgSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KHBbNF0uZ2V0UGF0aCgpKSB9KSwKLQkJfTsKLQotCQlJQ2xhc3NwYXRoRW50cnlbXVtdIGV4dHJhRW50cmllcyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbXVtdeyAKLQkJCXsgSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KHBbMV0uZ2V0UGF0aCgpKSwgSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkoY29udGFpbmVyc1swXS5nZXRQYXRoKCkpIH0sCi0JCQl7IEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShwWzJdLmdldFBhdGgoKSksIEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShwWzNdLmdldFBhdGgoKSkgfSwKLQkJCXsgSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkoY29udGFpbmVyc1sxXS5nZXRQYXRoKCkpIH0sIAotCQkJeyBKYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeShjb250YWluZXJzWzJdLmdldFBhdGgoKSl9LCAKLQkJCXsgSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KHBbM10uZ2V0UGF0aCgpKSwgSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KHBbMF0uZ2V0UGF0aCgpKSB9IAotCQl9OyAKLQotCQlpbnRbXVtdIGV4cGVjdGVkQ3ljbGVQYXJ0aWNpcGFudHMgPSBuZXcgaW50W11bXSB7Ci0JCQl7IDAsIDAsIDAsIDAsIDAgfSwgLy8gYWZ0ZXIgc2V0dGluZyBDUCBwWzBdCi0JCQl7IDAsIDAsIDAsIDAsIDAgfSwgLy8gYWZ0ZXIgc2V0dGluZyBDUCBwWzFdCi0JCQl7IDAsIDAsIDAsIDAsIDAgfSwgLy8gYWZ0ZXIgc2V0dGluZyBDUCBwWzJdCi0JCQl7IDAsIDAsIDAsIDAsIDAgfSwgLy8gYWZ0ZXIgc2V0dGluZyBDUCBwWzNdCi0JCQl7IDEsIDEsIDEsIDEsIDEgfSwgLy8gYWZ0ZXIgc2V0dGluZyBDUCBwWzRdCi0JCX07Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHAubGVuZ3RoOyBpKyspewotCi0JCQkvLyBhcHBlbmQgcHJvamVjdCByZWZlcmVuY2VzCQkJCi0JCQlJQ2xhc3NwYXRoRW50cnlbXSBvbGRDbGFzc3BhdGggPSBwW2ldLmdldFJhd0NsYXNzcGF0aCgpOwotCQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NwYXRoID0gbmV3IElDbGFzc3BhdGhFbnRyeVtvbGRDbGFzc3BhdGgubGVuZ3RoK2V4dHJhRW50cmllc1tpXS5sZW5ndGhdOwotCQkJU3lzdGVtLmFycmF5Y29weShvbGRDbGFzc3BhdGgsIDAgLCBuZXdDbGFzc3BhdGgsIDAsIG9sZENsYXNzcGF0aC5sZW5ndGgpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleHRyYUVudHJpZXNbaV0ubGVuZ3RoOyBqKyspewotCQkJCW5ld0NsYXNzcGF0aFtvbGRDbGFzc3BhdGgubGVuZ3RoK2pdID0gZXh0cmFFbnRyaWVzW2ldW2pdOwotCQkJfQkJCQotCQkJLy8gc2V0IGNsYXNzcGF0aAotCQkJcFtpXS5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoLCBudWxsKTsKLQotCQkJLy8gdXBkYXRlIGNvbnRhaW5lciBwYXRocwotCQkJaWYgKGkgPT0gcC5sZW5ndGggLSAxKXsKLQkJCQlKYXZhQ29yZS5zZXRDbGFzc3BhdGhDb250YWluZXIoCi0JCQkJCWNvbnRhaW5lcnNbMF0uZ2V0UGF0aCgpLAotCQkJCQluZXcgSUphdmFQcm9qZWN0W117IHBbMF0gfSwKLQkJCQkJbmV3IElDbGFzc3BhdGhDb250YWluZXJbXSB7IGNvbnRhaW5lcnNbMF0gfSwKLQkJCQkJbnVsbCk7Ci0KLQkJCQlKYXZhQ29yZS5zZXRDbGFzc3BhdGhDb250YWluZXIoCi0JCQkJCWNvbnRhaW5lcnNbMV0uZ2V0UGF0aCgpLAotCQkJCQluZXcgSUphdmFQcm9qZWN0W117IHBbMl0gfSwKLQkJCQkJbmV3IElDbGFzc3BhdGhDb250YWluZXJbXSB7IGNvbnRhaW5lcnNbMV0gfSwKLQkJCQkJbnVsbCk7Ci0KLQkJCQlKYXZhQ29yZS5zZXRDbGFzc3BhdGhDb250YWluZXIoCi0JCQkJCWNvbnRhaW5lcnNbMl0uZ2V0UGF0aCgpLAotCQkJCQluZXcgSUphdmFQcm9qZWN0W117IHBbM10gfSwKLQkJCQkJbmV3IElDbGFzc3BhdGhDb250YWluZXJbXSB7IGNvbnRhaW5lcnNbMl0gfSwKLQkJCQkJbnVsbCk7Ci0JCQl9Ci0JCQkKLQkJCS8vIGNoZWNrIGN5Y2xlIG1hcmtlcnMKLQkJCXRoaXMuYXNzZXJ0Q3ljbGVNYXJrZXJzKHBbaV0sIHAsIGV4cGVjdGVkQ3ljbGVQYXJ0aWNpcGFudHNbaV0pOwotCQl9Ci0JCS8vdGhpcy5zdGFydERlbHRhcygpOwotCQkKLQl9IGZpbmFsbHkgewotCQkvL3RoaXMuc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3RzKHByb2plY3ROYW1lcyk7Ci0JfQotfQotcHVibGljIHZvaWQgdGVzdEN5Y2xlRGV0ZWN0aW9uVGhyb3VnaENvbnRhaW5lclZhcmlhbnRzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQotCWludCBtYXggPSA1OwotCUlKYXZhUHJvamVjdFtdIHAgPSBuZXcgSUphdmFQcm9qZWN0W21heF07Ci0JU3RyaW5nW10gcHJvamVjdE5hbWVzID0gbmV3IFN0cmluZ1ttYXhdOwotCXRyeSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCXByb2plY3ROYW1lc1tpXSA9ICJQIitpOwotCQkJcFtpXSA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QocHJvamVjdE5hbWVzW2ldLCBuZXcgU3RyaW5nW10geyIifSwgIiIpOwotCQl9Ci0KLQkJY2xhc3MgVGVzdENvbnRhaW5lciBpbXBsZW1lbnRzIElDbGFzc3BhdGhDb250YWluZXIgewotCQkJSVBhdGggcGF0aDsKLQkJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXM7Ci0JCQlUZXN0Q29udGFpbmVyKElQYXRoIHBhdGgsIElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMpewotCQkJCXRoaXMucGF0aCA9IHBhdGg7Ci0JCQkJdGhpcy5lbnRyaWVzID0gZW50cmllczsKLQkJCX0KLQkJCXB1YmxpYyBJUGF0aCBnZXRQYXRoKCkgeyByZXR1cm4gdGhpcy5wYXRoOyB9Ci0JCQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gZ2V0Q2xhc3NwYXRoRW50cmllcygpIHsgcmV0dXJuIHRoaXMuZW50cmllczsJfQotCQkJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsgcmV0dXJuIG51bGw7IAl9Ci0JCQlwdWJsaWMgaW50IGdldEtpbmQoKSB7IHJldHVybiAwOyB9Ci0JCX07Ci0KLQkJSUNsYXNzcGF0aENvbnRhaW5lcltdIGNvbnRhaW5lcnMgPSBuZXcgSUNsYXNzcGF0aENvbnRhaW5lcltdeyAKLQkJCW5ldyBUZXN0Q29udGFpbmVyKAotCQkJCW5ldyBQYXRoKCJjb250YWluZXIwL2RlZmF1bHQiKSwgCi0JCQkJbmV3IElDbGFzc3BhdGhFbnRyeVtdeyBKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkocFszXS5nZXRQYXRoKCkpIH0pLAotCQkJbmV3IFRlc3RDb250YWluZXIoCi0JCQkJbmV3IFBhdGgoImNvbnRhaW5lcjAvZGVmYXVsdCIpLCAKLQkJCQluZXcgSUNsYXNzcGF0aEVudHJ5W117IEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShwWzFdLmdldFBhdGgoKSkgfSksCi0JCQluZXcgVGVzdENvbnRhaW5lcigKLQkJCQluZXcgUGF0aCgiY29udGFpbmVyMC9kZWZhdWx0IiksIAotCQkJCW5ldyBJQ2xhc3NwYXRoRW50cnlbXXsgSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KHBbNF0uZ2V0UGF0aCgpKSB9KSwKLQkJfTsKLQotCQlJQ2xhc3NwYXRoRW50cnlbXVtdIGV4dHJhRW50cmllcyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbXVtdeyAKLQkJCXsgSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KHBbMV0uZ2V0UGF0aCgpKSwgSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkoY29udGFpbmVyc1swXS5nZXRQYXRoKCkpIH0sCi0JCQl7IEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShwWzJdLmdldFBhdGgoKSksIEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShwWzNdLmdldFBhdGgoKSkgfSwKLQkJCXsgSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkoY29udGFpbmVyc1sxXS5nZXRQYXRoKCkpIH0sIAotCQkJeyBKYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeShjb250YWluZXJzWzJdLmdldFBhdGgoKSl9LCAKLQkJCXsgSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KHBbM10uZ2V0UGF0aCgpKSwgSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KHBbMF0uZ2V0UGF0aCgpKSB9IAotCQl9OyAKLQotCQlpbnRbXVtdIGV4cGVjdGVkQ3ljbGVQYXJ0aWNpcGFudHMgPSBuZXcgaW50W11bXSB7Ci0JCQl7IDAsIDAsIDAsIDAsIDAgfSwgLy8gYWZ0ZXIgc2V0dGluZyBDUCBwWzBdCi0JCQl7IDAsIDAsIDAsIDAsIDAgfSwgLy8gYWZ0ZXIgc2V0dGluZyBDUCBwWzFdCi0JCQl7IDAsIDAsIDAsIDAsIDAgfSwgLy8gYWZ0ZXIgc2V0dGluZyBDUCBwWzJdCi0JCQl7IDAsIDAsIDAsIDAsIDAgfSwgLy8gYWZ0ZXIgc2V0dGluZyBDUCBwWzNdCi0JCQl7IDEsIDEsIDEsIDEsIDEgfSwgLy8gYWZ0ZXIgc2V0dGluZyBDUCBwWzRdCi0JCX07Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHAubGVuZ3RoOyBpKyspewotCi0JCQkvLyBhcHBlbmQgcHJvamVjdCByZWZlcmVuY2VzCQkJCi0JCQlJQ2xhc3NwYXRoRW50cnlbXSBvbGRDbGFzc3BhdGggPSBwW2ldLmdldFJhd0NsYXNzcGF0aCgpOwotCQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NwYXRoID0gbmV3IElDbGFzc3BhdGhFbnRyeVtvbGRDbGFzc3BhdGgubGVuZ3RoK2V4dHJhRW50cmllc1tpXS5sZW5ndGhdOwotCQkJU3lzdGVtLmFycmF5Y29weShvbGRDbGFzc3BhdGgsIDAgLCBuZXdDbGFzc3BhdGgsIDAsIG9sZENsYXNzcGF0aC5sZW5ndGgpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleHRyYUVudHJpZXNbaV0ubGVuZ3RoOyBqKyspewotCQkJCW5ld0NsYXNzcGF0aFtvbGRDbGFzc3BhdGgubGVuZ3RoK2pdID0gZXh0cmFFbnRyaWVzW2ldW2pdOwotCQkJfQkJCQotCQkJLy8gc2V0IGNsYXNzcGF0aAotCQkJcFtpXS5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoLCBudWxsKTsKLQotCQkJLy8gdXBkYXRlIHNhbWUgY29udGFpbmVyIHBhdGggZm9yIG11bHRpcGxlIHByb2plY3RzCi0JCQlpZiAoaSA9PSBwLmxlbmd0aCAtIDEpewotCQkJCUphdmFDb3JlLnNldENsYXNzcGF0aENvbnRhaW5lcigKLQkJCQkJY29udGFpbmVyc1swXS5nZXRQYXRoKCksCi0JCQkJCW5ldyBJSmF2YVByb2plY3RbXXsgcFswXSwgcFsyXSwgcFszXSB9LAotCQkJCQluZXcgSUNsYXNzcGF0aENvbnRhaW5lcltdIHsgY29udGFpbmVyc1swXSwgY29udGFpbmVyc1sxXSwgY29udGFpbmVyc1syXSB9LAotCQkJCQludWxsKTsKLQkJCX0KLQkJCQotCQkJLy8gY2hlY2sgY3ljbGUgbWFya2VycwotCQkJdGhpcy5hc3NlcnRDeWNsZU1hcmtlcnMocFtpXSwgcCwgZXhwZWN0ZWRDeWNsZVBhcnRpY2lwYW50c1tpXSk7Ci0JCX0KLQkJLy90aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCQotCX0gZmluYWxseSB7Ci0JCS8vdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdHMocHJvamVjdE5hbWVzKTsKLQl9Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q3ljbGVEZXRlY3Rpb24yKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQotCWludCBtYXggPSA1OwotCUlKYXZhUHJvamVjdFtdIHAgPSBuZXcgSUphdmFQcm9qZWN0W21heF07Ci0JU3RyaW5nW10gcHJvamVjdE5hbWVzID0gbmV3IFN0cmluZ1ttYXhdOwotCXRyeSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCXByb2plY3ROYW1lc1tpXSA9ICJQIitpOwotCQkJcFtpXSA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QocHJvamVjdE5hbWVzW2ldLCBuZXcgU3RyaW5nW10geyIifSwgIiIpOwotCQl9Ci0KLQkJSUNsYXNzcGF0aEVudHJ5W11bXSBleHRyYUVudHJpZXMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W11bXXsgCi0JCQl7IEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShwWzFdLmdldFBhdGgoKSksIEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShwWzNdLmdldFBhdGgoKSkgfSwKLQkJCXsgSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KHBbMl0uZ2V0UGF0aCgpKSB9LAotCQkJeyBKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkocFswXS5nZXRQYXRoKCkpIH0sIAotCQkJeyBKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkocFs0XS5nZXRQYXRoKCkpfSwgCi0JCQl7IEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShwWzBdLmdldFBhdGgoKSkgfSAKLQkJfTsgCi0KLQkJaW50W11bXSBleHBlY3RlZEN5Y2xlUGFydGljaXBhbnRzID0gbmV3IGludFtdW10gewotCQkJeyAwLCAwLCAwLCAwLCAwIH0sIC8vIGFmdGVyIHNldHRpbmcgQ1AgcFswXQotCQkJeyAwLCAwLCAwLCAwLCAwIH0sIC8vIGFmdGVyIHNldHRpbmcgQ1AgcFsxXQotCQkJeyAxLCAxLCAxLCAwLCAwIH0sIC8vIGFmdGVyIHNldHRpbmcgQ1AgcFsyXQotCQkJeyAxLCAxLCAxLCAwLCAwIH0sIC8vIGFmdGVyIHNldHRpbmcgQ1AgcFszXQotCQkJeyAxLCAxLCAxLCAxLCAxIH0sIC8vIGFmdGVyIHNldHRpbmcgQ1AgcFs0XQotCQl9OwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwLmxlbmd0aDsgaSsrKXsKLQotCQkJLy8gYXBwZW5kIHByb2plY3QgcmVmZXJlbmNlcwkJCQotCQkJSUNsYXNzcGF0aEVudHJ5W10gb2xkQ2xhc3NwYXRoID0gcFtpXS5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0NsYXNzcGF0aCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbb2xkQ2xhc3NwYXRoLmxlbmd0aCtleHRyYUVudHJpZXNbaV0ubGVuZ3RoXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkob2xkQ2xhc3NwYXRoLCAwICwgbmV3Q2xhc3NwYXRoLCAwLCBvbGRDbGFzc3BhdGgubGVuZ3RoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZXh0cmFFbnRyaWVzW2ldLmxlbmd0aDsgaisrKXsKLQkJCQluZXdDbGFzc3BhdGhbb2xkQ2xhc3NwYXRoLmxlbmd0aCtqXSA9IGV4dHJhRW50cmllc1tpXVtqXTsKLQkJCX0JCQkKLQkJCS8vIHNldCBjbGFzc3BhdGgKLQkJCXBbaV0uc2V0UmF3Q2xhc3NwYXRoKG5ld0NsYXNzcGF0aCwgbnVsbCk7Ci0KLQkJCS8vIGNoZWNrIGN5Y2xlIG1hcmtlcnMKLQkJCXRoaXMuYXNzZXJ0Q3ljbGVNYXJrZXJzKHBbaV0sIHAsIGV4cGVjdGVkQ3ljbGVQYXJ0aWNpcGFudHNbaV0pOwotCQl9Ci0JCS8vdGhpcy5zdGFydERlbHRhcygpOwotCQkKLQl9IGZpbmFsbHkgewotCQkvL3RoaXMuc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3RzKHByb2plY3ROYW1lcyk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0Q3ljbGVEZXRlY3Rpb24zKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQotCWludCBtYXggPSA2OwotCUlKYXZhUHJvamVjdFtdIHAgPSBuZXcgSUphdmFQcm9qZWN0W21heF07Ci0JU3RyaW5nW10gcHJvamVjdE5hbWVzID0gbmV3IFN0cmluZ1ttYXhdOwotCXRyeSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCXByb2plY3ROYW1lc1tpXSA9ICJQIitpOwotCQkJcFtpXSA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QocHJvamVjdE5hbWVzW2ldLCBuZXcgU3RyaW5nW10geyIifSwgIiIpOwotCQl9Ci0KLQkJSUNsYXNzcGF0aEVudHJ5W11bXSBleHRyYUVudHJpZXMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W11bXXsgCi0JCQl7IEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShwWzJdLmdldFBhdGgoKSksIEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShwWzRdLmdldFBhdGgoKSkgfSwKLQkJCXsgSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KHBbMF0uZ2V0UGF0aCgpKSB9LAotCQkJeyBKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkocFszXS5nZXRQYXRoKCkpIH0sIAotCQkJeyBKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkocFsxXS5nZXRQYXRoKCkpfSwgCi0JCQl7IEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShwWzVdLmdldFBhdGgoKSkgfSwgCi0JCQl7IEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShwWzFdLmdldFBhdGgoKSkgfSAKLQkJfTsgCi0KLQkJaW50W11bXSBleHBlY3RlZEN5Y2xlUGFydGljaXBhbnRzID0gbmV3IGludFtdW10gewotCQkJeyAwLCAwLCAwLCAwLCAwLCAwIH0sIC8vIGFmdGVyIHNldHRpbmcgQ1AgcFswXQotCQkJeyAwLCAwLCAwLCAwLCAwLCAwIH0sIC8vIGFmdGVyIHNldHRpbmcgQ1AgcFsxXQotCQkJeyAwLCAwLCAwLCAwLCAwLCAwIH0sIC8vIGFmdGVyIHNldHRpbmcgQ1AgcFsyXQotCQkJeyAxLCAxLCAxLCAxLCAwLCAwIH0sIC8vIGFmdGVyIHNldHRpbmcgQ1AgcFszXQotCQkJeyAxLCAxLCAxLCAxLCAwLCAwIH0sIC8vIGFmdGVyIHNldHRpbmcgQ1AgcFs0XQotCQkJeyAxLCAxLCAxLCAxLCAxICwgMX0sIC8vIGFmdGVyIHNldHRpbmcgQ1AgcFs1XQotCQl9OwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwLmxlbmd0aDsgaSsrKXsKLQotCQkJLy8gYXBwZW5kIHByb2plY3QgcmVmZXJlbmNlcwkJCQotCQkJSUNsYXNzcGF0aEVudHJ5W10gb2xkQ2xhc3NwYXRoID0gcFtpXS5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0NsYXNzcGF0aCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbb2xkQ2xhc3NwYXRoLmxlbmd0aCtleHRyYUVudHJpZXNbaV0ubGVuZ3RoXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkob2xkQ2xhc3NwYXRoLCAwICwgbmV3Q2xhc3NwYXRoLCAwLCBvbGRDbGFzc3BhdGgubGVuZ3RoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZXh0cmFFbnRyaWVzW2ldLmxlbmd0aDsgaisrKXsKLQkJCQluZXdDbGFzc3BhdGhbb2xkQ2xhc3NwYXRoLmxlbmd0aCtqXSA9IGV4dHJhRW50cmllc1tpXVtqXTsKLQkJCX0JCQkKLQkJCS8vIHNldCBjbGFzc3BhdGgKLQkJCXBbaV0uc2V0UmF3Q2xhc3NwYXRoKG5ld0NsYXNzcGF0aCwgbnVsbCk7Ci0KLQkJCS8vIGNoZWNrIGN5Y2xlIG1hcmtlcnMKLQkJCXRoaXMuYXNzZXJ0Q3ljbGVNYXJrZXJzKHBbaV0sIHAsIGV4cGVjdGVkQ3ljbGVQYXJ0aWNpcGFudHNbaV0pOwotCQl9Ci0JCS8vdGhpcy5zdGFydERlbHRhcygpOwotCQkKLQl9IGZpbmFsbHkgewotCQkvL3RoaXMuc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3RzKHByb2plY3ROYW1lcyk7Ci0JfQotfQotcHVibGljIHZvaWQgdGVzdERlbnNlQ3ljbGVEZXRlY3Rpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkvLyBlYWNoIHByb2plY3QgcHJlcmVxcyBhbGwgb3RoZXIgcHJvamVjdHMKLQlkZW5zZUN5Y2xlRGV0ZWN0aW9uKDUpOwotCWRlbnNlQ3ljbGVEZXRlY3Rpb24oMTApOwotCWRlbnNlQ3ljbGVEZXRlY3Rpb24oMjApOwotCS8vZGVuc2VDeWNsZURldGVjdGlvbigxMDApOwotfQotLyoKLSAqIENyZWF0ZSBwcm9qZWN0cyBhbmQgc2V0IGNsYXNzcGF0aHMgaW4gb25lIGJhdGNoCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3ROb0N5Y2xlRGV0ZWN0aW9uMSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCS8vIGVhY2ggcHJvamVjdCBwcmVyZXFzIGFsbCB0aGUgcHJldmlvdXMgb25lcwotCW5vQ3ljbGVEZXRlY3Rpb24oNSwgZmFsc2UsIGZhbHNlKTsKLQlub0N5Y2xlRGV0ZWN0aW9uKDEwLCBmYWxzZSwgZmFsc2UpOwotCW5vQ3ljbGVEZXRlY3Rpb24oMjAsIGZhbHNlLCBmYWxzZSk7Ci0KLQkvLyBlYWNoIHByb2plY3QgcHJlcmVxcyBhbGwgdGhlIG5leHQgb25lcwotCW5vQ3ljbGVEZXRlY3Rpb24oNSwgdHJ1ZSwgZmFsc2UpOwotCW5vQ3ljbGVEZXRlY3Rpb24oMTAsIHRydWUsIGZhbHNlKTsKLQlub0N5Y2xlRGV0ZWN0aW9uKDIwLCB0cnVlLCBmYWxzZSk7Ci19Ci0vKgotICogQ3JlYXRlIHByb2plY3RzIGZpcnN0LCB0aGVuIHNldCBjbGFzc3BhdGhzCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3ROb0N5Y2xlRGV0ZWN0aW9uMigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCS8vIGVhY2ggcHJvamVjdCBwcmVyZXFzIGFsbCB0aGUgcHJldmlvdXMgb25lcwotCW5vQ3ljbGVEZXRlY3Rpb24oNSwgZmFsc2UsIHRydWUpOwotCW5vQ3ljbGVEZXRlY3Rpb24oMTAsIGZhbHNlLCB0cnVlKTsKLQlub0N5Y2xlRGV0ZWN0aW9uKDIwLCBmYWxzZSwgdHJ1ZSk7Ci0KLQkvLyBlYWNoIHByb2plY3QgcHJlcmVxcyBhbGwgdGhlIG5leHQgb25lcwotCW5vQ3ljbGVEZXRlY3Rpb24oNSwgdHJ1ZSwgdHJ1ZSk7Ci0Jbm9DeWNsZURldGVjdGlvbigxMCwgdHJ1ZSwgdHJ1ZSk7Ci0Jbm9DeWNsZURldGVjdGlvbigyMCwgdHJ1ZSwgdHJ1ZSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIGR1cGxpY2F0ZSBlbnRyeSBjcmVhdGVkIGJ5IGVkaXRpbmcgdGhlIC5jbGFzc3BhdGggaXMgZGV0ZWN0ZWQuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMjQ0OTggRHVwbGljYXRlIGVudHJpZXMgb24gY2xhc3NwYXRoIGNhdXNlIENQIG1hcmtlciB0byBubyBsb25nZXIgcmVmcmVzaCkKLSAqLwotcHVibGljIHZvaWQgdGVzdER1cGxpY2F0ZUVudHJpZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJdGhpcy5lZGl0RmlsZSgKLQkJCSIvUC8uY2xhc3NwYXRoIiwKLQkJCSI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIgKwotCQkJIjxjbGFzc3BhdGg+XG4iICsKLQkJCSIgICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9XCJzcmNcIiBwYXRoPVwic3JjXCIvPlxuIiArCi0JCQkiICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPVwic3JjXCIgcGF0aD1cInNyY1wiLz5cbiIgKwotCQkJIiAgICA8Y2xhc3NwYXRoZW50cnkga2luZD1cIm91dHB1dFwiIHBhdGg9XCJiaW5cIi8+XG4iICsKLQkJCSI8L2NsYXNzcGF0aD4iCi0JCSk7Ci0JCWFzc2VydE1hcmtlcnMoCi0JCQkiVW5leHBlY3RlZCBtYXJrZXJzIiwKLQkJCSJJbnZhbGlkIGJ1aWxkIHBhdGggaW4gXCdQLy5jbGFzc3BhdGhcJyBmaWxlOiBCdWlsZCBwYXRoIGNvbnRhaW5zIGR1cGxpY2F0ZSBlbnRyeTogUC9zcmMiLAotCQkJcHJvamVjdCk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotCi1wcml2YXRlIHZvaWQgZGVuc2VDeWNsZURldGVjdGlvbihmaW5hbCBpbnQgbnVtYmVyT2ZQYXJ0aWNpcGFudHMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkKLQlmaW5hbCBJSmF2YVByb2plY3RbXSBwcm9qZWN0cyA9IG5ldyBJSmF2YVByb2plY3RbbnVtYmVyT2ZQYXJ0aWNpcGFudHNdOwotCWZpbmFsIFN0cmluZ1tdIHByb2plY3ROYW1lcyAgPSBuZXcgU3RyaW5nW251bWJlck9mUGFydGljaXBhbnRzXTsKLQlmaW5hbCBpbnRbXSBhbGxQcm9qZWN0c0luQ3ljbGUgPSBuZXcgaW50W251bWJlck9mUGFydGljaXBhbnRzXTsKLQotCWZpbmFsIGxvbmdbXSBzdGFydCA9IG5ldyBsb25nWzFdOwotCWZpbmFsIGxvbmdbXSB0aW1lID0gbmV3IGxvbmdbMV07Ci0JCi0KLQl0cnkgewotCQlKYXZhQ29yZS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mUGFydGljaXBhbnRzOyBpKyspewotCQkJCQlwcm9qZWN0TmFtZXNbaV0gPSAiUCIraTsKLQkJCQkJcHJvamVjdHNbaV0gPSBjcmVhdGVKYXZhUHJvamVjdChwcm9qZWN0TmFtZXNbaV0sIG5ldyBTdHJpbmdbXXsiIn0sICIiKTsKLQkJCQkJYWxsUHJvamVjdHNJbkN5Y2xlW2ldID0gMTsKLQkJCQl9CQkKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mUGFydGljaXBhbnRzOyBpKyspewotCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBleHRyYUVudHJpZXMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W251bWJlck9mUGFydGljaXBhbnRzLTFdOwotCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG51bWJlck9mUGFydGljaXBhbnRzOyBqKyspewotCQkJCQkJaWYgKGkgPT0gaikgY29udGludWU7Ci0JCQkJCQlleHRyYUVudHJpZXNbaW5kZXgrK10gPSBKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkocHJvamVjdHNbal0uZ2V0UGF0aCgpKTsKLQkJCQkJfQotCQkJCQkvLyBhcHBlbmQgcHJvamVjdCByZWZlcmVuY2VzCQkJCi0JCQkJCUlDbGFzc3BhdGhFbnRyeVtdIG9sZENsYXNzcGF0aCA9IHByb2plY3RzW2ldLmdldFJhd0NsYXNzcGF0aCgpOwotCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdDbGFzc3BhdGggPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29sZENsYXNzcGF0aC5sZW5ndGgrZXh0cmFFbnRyaWVzLmxlbmd0aF07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkob2xkQ2xhc3NwYXRoLCAwICwgbmV3Q2xhc3NwYXRoLCAwLCBvbGRDbGFzc3BhdGgubGVuZ3RoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleHRyYUVudHJpZXMubGVuZ3RoOyBqKyspewotCQkJCQkJbmV3Q2xhc3NwYXRoW29sZENsYXNzcGF0aC5sZW5ndGgral0gPSBleHRyYUVudHJpZXNbal07Ci0JCQkJCX0JCQkKLQkJCQkJLy8gc2V0IGNsYXNzcGF0aAotCQkJCQlsb25nIGlubmVyU3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsgLy8gdGltZSBzcGVudCBpbiBpbmRpdmlkdWFsIENQIHNldHRpbmcKLQkJCQkJcHJvamVjdHNbaV0uc2V0UmF3Q2xhc3NwYXRoKG5ld0NsYXNzcGF0aCwgbnVsbCk7Ci0JCQkJCXRpbWVbMF0gKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBpbm5lclN0YXJ0OwotCQkJCX07Ci0JCQkJc3RhcnRbMF0gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsgLy8gdGltZSBzcGVudCBpbiBkZWx0YSByZWZyZXNoCi0JCQl9Ci0JCX0sIAotCQludWxsKTsKLQkJdGltZVswXSArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKS1zdGFydFswXTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJEZW5zZSBjeWNsZSBjaGVjayAoIitudW1iZXJPZlBhcnRpY2lwYW50cysiIHBhcnRpY2lwYW50cykgOiAiKyB0aW1lWzBdKyIgbXMiKTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZQYXJ0aWNpcGFudHM7IGkrKyl7Ci0JCQkvLyBjaGVjayBjeWNsZSBtYXJrZXJzCi0JCQl0aGlzLmFzc2VydEN5Y2xlTWFya2Vycyhwcm9qZWN0c1tpXSwgcHJvamVjdHMsIGFsbFByb2plY3RzSW5DeWNsZSk7Ci0JCX0KLQkJCi0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0cyhwcm9qZWN0TmFtZXMpOwotCX0KLX0KLS8qCi0gKiBXaGVuIHVzaW5nIGZvcndhcmQgcmVmZXJlbmNlcywgYWxsIHByb2plY3RzIHByZXJlcSBhbGwgb2YgdGhlIG9uZXMgd2hpY2ggaGF2ZSBhIGdyZWF0ZXIgaW5kZXgsIAotICogZS5nLiBQMCwgUDEsIFAyOiAgUDAgcHJlcmVxcyB7UDEsIFAyfSwgUDEgcHJlcmVxcyB7UDJ9LCBQMiBwcmVyZXFzIHt9Ci0gKiBXaGVuIG5vIHVzaW5nIGZvcndhcmQgcmVmZXJlbmNlcyAoaS5lLiBiYWNrd2FyZCByZWZzKSwgYWxsIHByb2plY3RzIHByZXJlcSBwcm9qZWN0cyB3aXRoIHNtYWxsZXIgaW5kZXgKLSAqIGUuZy4gUDAsIFAxLCBQMjogIFAwIHByZXJlcXMge30sIFAxIHByZXJlcXMge1AwfSwgUDIgcHJlcmVxcyB7UDAsIFAxfQotICovCi1wcml2YXRlIHZvaWQgbm9DeWNsZURldGVjdGlvbihmaW5hbCBpbnQgbnVtYmVyT2ZQYXJ0aWNpcGFudHMsIGZpbmFsIGJvb2xlYW4gdXNlRm9yd2FyZFJlZmVyZW5jZXMsIGZpbmFsIGJvb2xlYW4gY3JlYXRlUHJvamVjdHNGaXJzdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQotCWZpbmFsIElKYXZhUHJvamVjdFtdIHByb2plY3RzID0gbmV3IElKYXZhUHJvamVjdFtudW1iZXJPZlBhcnRpY2lwYW50c107Ci0JZmluYWwgU3RyaW5nW10gcHJvamVjdE5hbWVzICA9IG5ldyBTdHJpbmdbbnVtYmVyT2ZQYXJ0aWNpcGFudHNdOwotCWZpbmFsIGludFtdIGFsbFByb2plY3RzSW5DeWNsZSA9IG5ldyBpbnRbbnVtYmVyT2ZQYXJ0aWNpcGFudHNdOwotCQotCWZpbmFsIGxvbmdbXSBzdGFydCA9IG5ldyBsb25nWzFdOwotCWZpbmFsIGxvbmdbXSB0aW1lID0gbmV3IGxvbmdbMV07Ci0JCi0JdHJ5IHsKLQkJaWYgKGNyZWF0ZVByb2plY3RzRmlyc3QpIHsKLQkJCUphdmFDb3JlLnJ1bihuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZlBhcnRpY2lwYW50czsgaSsrKXsKLQkJCQkJCXByb2plY3ROYW1lc1tpXSA9ICJQIitpOwotCQkJCQkJcHJvamVjdHNbaV0gPSBjcmVhdGVKYXZhUHJvamVjdChwcm9qZWN0TmFtZXNbaV0sIG5ldyBTdHJpbmdbXXsiIn0sICIiKTsKLQkJCQkJCWFsbFByb2plY3RzSW5DeWNsZVtpXSA9IDA7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9LAotCQkJbnVsbCk7Ci0JCX0KLQkJSmF2YUNvcmUucnVuKG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJaWYgKCFjcmVhdGVQcm9qZWN0c0ZpcnN0KSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZQYXJ0aWNpcGFudHM7IGkrKyl7Ci0JCQkJCQlwcm9qZWN0TmFtZXNbaV0gPSAiUCIraTsKLQkJCQkJCXByb2plY3RzW2ldID0gY3JlYXRlSmF2YVByb2plY3QocHJvamVjdE5hbWVzW2ldLCBuZXcgU3RyaW5nW117IiJ9LCAiIik7Ci0JCQkJCQlhbGxQcm9qZWN0c0luQ3ljbGVbaV0gPSAwOwotCQkJCQl9CQkKLQkJCQl9Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZlBhcnRpY2lwYW50czsgaSsrKXsKLQkJCQkJSUNsYXNzcGF0aEVudHJ5W10gZXh0cmFFbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVt1c2VGb3J3YXJkUmVmZXJlbmNlcyA/IG51bWJlck9mUGFydGljaXBhbnRzIC0gaSAtMSA6IGldOwotCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQlmb3IgKGludCBqID0gdXNlRm9yd2FyZFJlZmVyZW5jZXMgPyBpKzEgOiAwOyAKLQkJCQkJCXVzZUZvcndhcmRSZWZlcmVuY2VzID8gKGogPCBudW1iZXJPZlBhcnRpY2lwYW50cykgOiAoaiA8IGkpOyAKLQkJCQkJCWorKyl7Ci0JCQkJCQlleHRyYUVudHJpZXNbaW5kZXgrK10gPSBKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkocHJvamVjdHNbal0uZ2V0UGF0aCgpKTsKLQkJCQkJfQotCQkJCQkvLyBhcHBlbmQgcHJvamVjdCByZWZlcmVuY2VzCQkJCi0JCQkJCUlDbGFzc3BhdGhFbnRyeVtdIG9sZENsYXNzcGF0aCA9IHByb2plY3RzW2ldLmdldFJhd0NsYXNzcGF0aCgpOwotCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdDbGFzc3BhdGggPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29sZENsYXNzcGF0aC5sZW5ndGgrZXh0cmFFbnRyaWVzLmxlbmd0aF07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkob2xkQ2xhc3NwYXRoLCAwICwgbmV3Q2xhc3NwYXRoLCAwLCBvbGRDbGFzc3BhdGgubGVuZ3RoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleHRyYUVudHJpZXMubGVuZ3RoOyBqKyspewotCQkJCQkJbmV3Q2xhc3NwYXRoW29sZENsYXNzcGF0aC5sZW5ndGgral0gPSBleHRyYUVudHJpZXNbal07Ci0JCQkJCX0JCQkKLQkJCQkJLy8gc2V0IGNsYXNzcGF0aAotCQkJCQlsb25nIGlubmVyU3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsgLy8gdGltZSBzcGVudCBpbiBpbmRpdmlkdWFsIENQIHNldHRpbmcKLQkJCQkJcHJvamVjdHNbaV0uc2V0UmF3Q2xhc3NwYXRoKG5ld0NsYXNzcGF0aCwgbnVsbCk7Ci0JCQkJCXRpbWVbMF0gKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBpbm5lclN0YXJ0OwotCQkJCX0KLQkJCQlzdGFydFswXSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOyAvLyB0aW1lIHNwZW50IGluIGRlbHRhIHJlZnJlc2gKLQkJCX0KLQkJfSwgCi0JCW51bGwpOwotCQl0aW1lWzBdICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLXN0YXJ0WzBdOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIGN5Y2xlIGNoZWNrICgiK251bWJlck9mUGFydGljaXBhbnRzKyIgcGFydGljaXBhbnRzKSA6ICIrIHRpbWVbMF0rIiBtcywgIisgKHVzZUZvcndhcmRSZWZlcmVuY2VzID8gImZvcndhcmQgcmVmZXJlbmNlcyIgOiAiYmFja3dhcmQgcmVmZXJlbmNlcyIpICsgIiwgIiArIChjcmVhdGVQcm9qZWN0c0ZpcnN0ID8gInR3byBzdGVwcyAocHJvamVjdHMgY3JlYXRlZCBmaXJzdCwgdGhlbiBjbGFzc3BhdGhzIGFyZSBzZXQpIiA6ICJvbmUgc3RlcCAocHJvamVjdHMgY3JlYXRlZCBhbmQgY2xhc3NwYXRocyBzZXQgaW4gb25lIGJhdGNoKSIpKTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZQYXJ0aWNpcGFudHM7IGkrKyl7Ci0JCQkvLyBjaGVjayBjeWNsZSBtYXJrZXJzCi0JCQl0aGlzLmFzc2VydEN5Y2xlTWFya2Vycyhwcm9qZWN0c1tpXSwgcHJvamVjdHMsIGFsbFByb2plY3RzSW5DeWNsZSk7Ci0JCX0KLQkJCi0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0cyhwcm9qZWN0TmFtZXMpOwotCX0KLX0KLQotLyoKLSAqIHRlc3QgZm9yIGJ1ZyAzMjY5MAotICovCi1wdWJsaWMgdm9pZCB0ZXN0TmVzdGVkU291cmNlRm9sZGVycygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgiUCIpOwotCQkKLQkJcHJvamVjdC5jcmVhdGUobnVsbCk7Ci0JCXByb2plY3Qub3BlbihudWxsKTsKLQkJCi0JCXRyeSB7Ci0JCQlGaWxlIHBybyA9IHByb2plY3QuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKTsKLQkJCUZpbGUgc3JjID0gQ2xhc3NwYXRoVGVzdHMudGhpcy5jcmVhdGVGb2xkZXIocHJvLCAic3JjIik7Ci0JCQlDbGFzc3BhdGhUZXN0cy50aGlzLmNyZWF0ZUZvbGRlcihzcmMsICJzcmMyIik7Ci0JCQkKLQkJCUNsYXNzcGF0aFRlc3RzLnRoaXMuY3JlYXRlRmlsZShwcm8sICIucHJvamVjdCIsIAotCQkJCSI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIgKwotCQkJCSI8cHJvamVjdERlc2NyaXB0aW9uPlxuIiArCi0JCQkJIgk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZTwvbmFtZT5cbiIgKwotCQkJCSIJPGNvbW1lbnQ+PC9jb21tZW50PlxuIiArCi0JCQkJIgk8cHJvamVjdHM+XG4iICsKLQkJCQkiCTwvcHJvamVjdHM+XG4iICsKLQkJCQkiCTxidWlsZFNwZWM+XG4iICsKLQkJCQkiCQk8YnVpbGRDb21tYW5kPlxuIiArCi0JCQkJIgkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPlxuIiArCi0JCQkJIgkJCTxhcmd1bWVudHM+XG4iICsKLQkJCQkiCQkJPC9hcmd1bWVudHM+XG4iICsKLQkJCQkiCQk8L2J1aWxkQ29tbWFuZD5cbiIgKwotCQkJCSIJPC9idWlsZFNwZWM+XG4iICsKLQkJCQkiCTxuYXR1cmVzPlxuIiArCi0JCQkJIgkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+XG4iICsKLQkJCQkiCTwvbmF0dXJlcz5cbiIgKwotCQkJCSI8L3Byb2plY3REZXNjcmlwdGlvbj4iKTsKLQotCi0JCQlDbGFzc3BhdGhUZXN0cy50aGlzLmNyZWF0ZUZpbGUocHJvLCAiLmNsYXNzcGF0aCIsCi0JCQkJIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIiArCi0JCQkJIjxjbGFzc3BhdGg+XG4iICsKLQkJCQkiICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPVwic3JjXCIgcGF0aD1cInNyY1wiLz5cbiIgKwotCQkJCSIgICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9XCJzcmNcIiBwYXRoPVwic3JjL3NyYzJcIi8+XG4iICsKLQkJCQkiICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPVwib3V0cHV0XCIgcGF0aD1cImJpblwiLz5cbiIgKwotCQkJCSI8L2NsYXNzcGF0aD4iCi0JCQkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0JCX0KLQkJcHJvamVjdC5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLG51bGwpOwotCQl0aGlzLmFzc2VydE1hcmtlcnMoCi0JCSJVbmV4cGVjdGVkIG1hcmtlcnMiLAotCQkiQ2Fubm90IG5lc3QgXCdQL3NyYy9zcmMyXCcgaW5zaWRlIFwnUC9zcmNcJy4gVG8gZW5hYmxlIHRoZSBuZXN0aW5nIGV4Y2x1ZGUgXCdzcmMyL1wnIGZyb20gXCdQL3NyY1wnLiIsCi0JCUphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoKLSAqIHRlc3QgZm9yIGJ1ZyAzMjk3NAotICovCi1wdWJsaWMgdm9pZCB0ZXN0T3V0cHV0Rm9sZGVyMSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgiUCIpOwotCQkKLQkJcHJvamVjdC5jcmVhdGUobnVsbCk7Ci0JCXByb2plY3Qub3BlbihudWxsKTsKLQkJCi0JCXRyeSB7Ci0JCQlGaWxlIHBybyA9IHByb2plY3QuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKTsKLQkJCUZpbGUgc3JjID0gQ2xhc3NwYXRoVGVzdHMudGhpcy5jcmVhdGVGb2xkZXIocHJvLCAic3JjIik7Ci0JCQlDbGFzc3BhdGhUZXN0cy50aGlzLmNyZWF0ZUZvbGRlcihzcmMsICJzcmMyIik7Ci0JCQkKLQkJCUNsYXNzcGF0aFRlc3RzLnRoaXMuY3JlYXRlRmlsZShwcm8sICIucHJvamVjdCIsIAotCQkJCSI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIgKwotCQkJCSI8cHJvamVjdERlc2NyaXB0aW9uPlxuIiArCi0JCQkJIgk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZTwvbmFtZT5cbiIgKwotCQkJCSIJPGNvbW1lbnQ+PC9jb21tZW50PlxuIiArCi0JCQkJIgk8cHJvamVjdHM+XG4iICsKLQkJCQkiCTwvcHJvamVjdHM+XG4iICsKLQkJCQkiCTxidWlsZFNwZWM+XG4iICsKLQkJCQkiCQk8YnVpbGRDb21tYW5kPlxuIiArCi0JCQkJIgkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPlxuIiArCi0JCQkJIgkJCTxhcmd1bWVudHM+XG4iICsKLQkJCQkiCQkJPC9hcmd1bWVudHM+XG4iICsKLQkJCQkiCQk8L2J1aWxkQ29tbWFuZD5cbiIgKwotCQkJCSIJPC9idWlsZFNwZWM+XG4iICsKLQkJCQkiCTxuYXR1cmVzPlxuIiArCi0JCQkJIgkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+XG4iICsKLQkJCQkiCTwvbmF0dXJlcz5cbiIgKwotCQkJCSI8L3Byb2plY3REZXNjcmlwdGlvbj4iKTsKLQotCi0JCQlDbGFzc3BhdGhUZXN0cy50aGlzLmNyZWF0ZUZpbGUocHJvLCAiLmNsYXNzcGF0aCIsCi0JCQkJIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIiArCi0JCQkJIjxjbGFzc3BhdGg+XG4iICsKLQkJCQkiICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPVwic3JjXCIgb3V0cHV0PVwiYmluMlwiIHBhdGg9XCJzcmMxXCIvPlxuIiArCi0JCQkJIiAgICA8Y2xhc3NwYXRoZW50cnkga2luZD1cInNyY1wiIHBhdGg9XCJzcmMyXCIvPlxuIiArCi0JCQkJIiAgICA8Y2xhc3NwYXRoZW50cnkga2luZD1cIm91dHB1dFwiIHBhdGg9XCJiaW5cIi8+XG4iICsKLQkJCQkiPC9jbGFzc3BhdGg+IgotCQkJKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOwotCQl9Ci0JCXByb2plY3QucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSxudWxsKTsKLQkJdGhpcy5hc3NlcnRNYXJrZXJzKAotCQkiVW5leHBlY3RlZCBtYXJrZXJzIiwKLQkJIk1pc3NpbmcgcmVxdWlyZWQgc291cmNlIGZvbGRlcjogXCdQL3NyYzFcJy5cbiIgKyAKLQkJIk1pc3NpbmcgcmVxdWlyZWQgc291cmNlIGZvbGRlcjogXCdQL3NyYzJcJy4iLAotCQlKYXZhQ29yZS5jcmVhdGUocHJvamVjdCkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9Db2RlQ29ycmVjdGlvblRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvQ29kZUNvcnJlY3Rpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDU1NzU5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9Db2RlQ29ycmVjdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC4qOwotCi0KLXB1YmxpYyBjbGFzcyBDb2RlQ29ycmVjdGlvblRlc3RzIGV4dGVuZHMgQWJzdHJhY3RKYXZhTW9kZWxUZXN0cyB7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIGZnRGVidWcgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmdTcGVjaWZpYyA9IGZhbHNlOwotCQotcHVibGljIENvZGVDb3JyZWN0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXByaXZhdGUgSU1hcmtlcltdIGdldE1hcmtlcnMoSUNvbXBpbGF0aW9uVW5pdCB1bml0KXsKLQl0cnkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSB1bml0LmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOwotCQlyZXR1cm4gcmVzb3VyY2UuZmluZE1hcmtlcnMoSUphdmFNb2RlbE1hcmtlci5KQVZBX01PREVMX1BST0JMRU1fTUFSS0VSLCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCX0KLQlyZXR1cm4gbmV3IElNYXJrZXJbMF07Ci19Ci1wcml2YXRlIElNYXJrZXIgZ2V0TWFya2VyKElDb21waWxhdGlvblVuaXQgdW5pdCwgU3RyaW5nIG1lc3NhZ2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlJTWFya2VyW10gbWFya2VycyA9IGdldE1hcmtlcnModW5pdCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJaWYgKG1lc3NhZ2UuZXF1YWxzKG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSkpIHsKLQkJCXJldHVybiBtYXJrZXI7Ci0JCX0KLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgcHJvamVjdCBuYW1lcyB0byBsb2FkIGluIHRoZSBzb2x1dGlvbgotICogd2hlbiBhbiBpbmRlcGVuZGVudCB0ZXN0IHN1aXRlIGlzIGJlaW5nIHJ1bi4KLSAqLwotcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRQcm9qZWN0TmFtZXMoKSB7Ci0JcmV0dXJuIG5ldyBTdHJpbmdbXSB7IkNvbXBpbGVyIiwgIkNvZGVDb3JyZWN0aW9uIn07Ci19Ci1wdWJsaWMgdm9pZCBzZXRVcFN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0Jc3VwZXIuc2V0VXBTdWl0ZSgpOwotCQotCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gc2V0VXBKYXZhUHJvamVjdCgiQ29kZUNvcnJlY3Rpb24iKTsKLQkKLQkvLyBkdW1teSBxdWVyeSBmb3Igd2FpdGluZyB1bnRpbCB0aGUgaW5kZXhlcyBhcmUgcmVhZHkKLQlTZWFyY2hFbmdpbmUgZW5naW5lID0gbmV3IFNlYXJjaEVuZ2luZSgpOwotCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKG5ldyBJSmF2YUVsZW1lbnRbXSB7cHJvamVjdH0pOwotCXRyeSB7Ci0JCWVuZ2luZS5zZWFyY2hBbGxUeXBlTmFtZXMoCi0JCQlwcm9qZWN0LmdldFByb2plY3QoKS5nZXRXb3Jrc3BhY2UoKSwKLQkJCW51bGwsCi0JCQkiIUAkIyFAIi50b0NoYXJBcnJheSgpLAotCQkJSUphdmFTZWFyY2hDb25zdGFudHMuUEFUVEVSTl9NQVRDSCwKLQkJCUlKYXZhU2VhcmNoQ29uc3RhbnRzLkNBU0VfU0VOU0lUSVZFLAotCQkJSUphdmFTZWFyY2hDb25zdGFudHMuQ0xBU1MsCi0JCQlzY29wZSwgCi0JCQluZXcgSVR5cGVOYW1lUmVxdWVzdG9yKCkgewotCQkJCXB1YmxpYyB2b2lkIGFjY2VwdENsYXNzKAotCQkJCQljaGFyW10gcGFja2FnZU5hbWUsCi0JCQkJCWNoYXJbXSBzaW1wbGVUeXBlTmFtZSwKLQkJCQkJY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzLAotCQkJCQlTdHJpbmcgcGF0aCkge30KLQkJCQlwdWJsaWMgdm9pZCBhY2NlcHRJbnRlcmZhY2UoCi0JCQkJCWNoYXJbXSBwYWNrYWdlTmFtZSwKLQkJCQkJY2hhcltdIHNpbXBsZVR5cGVOYW1lLAotCQkJCQljaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMsCi0JCQkJCVN0cmluZyBwYXRoKSB7fQotCQkJfSwKLQkJCUlKYXZhU2VhcmNoQ29uc3RhbnRzLldBSVRfVU5USUxfUkVBRFlfVE9fU0VBUkNILAotCQkJbnVsbCk7Ci0JfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JfQotCS8vCWRvIGEgZnVsbCBidWlsZCB0byBjcmVhdGUgbWFya2VycwotCUphdmFDb3JlLnNldE9wdGlvbnMoSmF2YUNvcmUuZ2V0RGVmYXVsdE9wdGlvbnMoKSk7Ci0JdHJ5IHsKLQkJZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoIkNvZGVDb3JyZWN0aW9uIikuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxELG51bGwpOwotCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQlhc3NlcnRUcnVlKCJidWlsZGluZyBmYWlsZWQiLCBmYWxzZSk7Ci0JfQotfQotcHVibGljIHZvaWQgdGVhckRvd25TdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCWRlbGV0ZVByb2plY3QoIkNvZGVDb3JyZWN0aW9uIik7Ci0JCi0Jc3VwZXIudGVhckRvd25TdWl0ZSgpOwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVN1aXRlIHN1aXRlID0gbmV3IFN1aXRlKENvZGVDb3JyZWN0aW9uVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQlpZiAoZmdTcGVjaWZpYykgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzKCJ0ZXN0Q29ycmVjdE1ldGhvZDEiKSk7Ci0JCQotCQlyZXR1cm4gc3VpdGU7Ci0JfSBlbHNlIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQ29kZUNvcnJlY3Rpb25UZXN0cygidGVzdENvcnJlY3RGaWVsZFR5cGUxIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzKCJ0ZXN0Q29ycmVjdEZpZWxkVHlwZTIiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IENvZGVDb3JyZWN0aW9uVGVzdHMoInRlc3RDb3JyZWN0RmllbGRUeXBlMyIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQ29kZUNvcnJlY3Rpb25UZXN0cygidGVzdENvcnJlY3RMb2NhbFZhcmlhYmxlVHlwZTEiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IENvZGVDb3JyZWN0aW9uVGVzdHMoInRlc3RDb3JyZWN0TG9jYWxWYXJpYWJsZVR5cGUyIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzKCJ0ZXN0Q29ycmVjdEltcG9ydDEiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IENvZGVDb3JyZWN0aW9uVGVzdHMoInRlc3RDb3JyZWN0SW1wb3J0MiIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQ29kZUNvcnJlY3Rpb25UZXN0cygidGVzdENvcnJlY3RJbXBvcnQzIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzKCJ0ZXN0Q29ycmVjdFN1cGVyQ2xhc3MxIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzKCJ0ZXN0Q29ycmVjdFN1cGVyQ2xhc3MyIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzKCJ0ZXN0Q29ycmVjdFN1cGVySW50ZXJmYWNlMSIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQ29kZUNvcnJlY3Rpb25UZXN0cygidGVzdENvcnJlY3RTdXBlckludGVyZmFjZTIiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IENvZGVDb3JyZWN0aW9uVGVzdHMoInRlc3RDb3JyZWN0RXhjZXB0aW9uMSIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQ29kZUNvcnJlY3Rpb25UZXN0cygidGVzdENvcnJlY3RFeGNlcHRpb24yIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzKCJ0ZXN0Q29ycmVjdE1ldGhvZDEiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IENvZGVDb3JyZWN0aW9uVGVzdHMoInRlc3RDb3JyZWN0TWV0aG9kMiIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQ29kZUNvcnJlY3Rpb25UZXN0cygidGVzdENvcnJlY3RGaWVsZDEiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IENvZGVDb3JyZWN0aW9uVGVzdHMoInRlc3RDb3JyZWN0RmllbGQyIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzKCJ0ZXN0Q29ycmVjdExvY2FsVmFyaWFibGUxIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzKCJ0ZXN0Q29ycmVjdEFyZ3VtZW50MSIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQ29kZUNvcnJlY3Rpb25UZXN0cygidGVzdENvcnJlY3RSZXR1cm5UeXBlMSIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQ29kZUNvcnJlY3Rpb25UZXN0cygidGVzdENvcnJlY3RSZXR1cm5UeXBlMiIpKTsKLQkJCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29ycmVjdEZpZWxkVHlwZTEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb3JyZWN0aW9uRW5naW5lIGVuZ2luZSA9IG5ldyBDb3JyZWN0aW9uRW5naW5lKEphdmFDb3JlLmdldE9wdGlvbnMoKSk7Ci0JQ29kZUNvcnJlY3Rpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29kZUNvcnJlY3Rpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29kZUNvcnJlY3Rpb24iLCAic3JjIiwgIiIsICJDb3JyZWN0RmllbGRUeXBlMS5qYXZhIik7Ci0JSU1hcmtlcltdIG1hcmtlcnMgPSBnZXRNYXJrZXJzKGN1KTsKLQlhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBvbmUgcHJvYmxlbSIsbWFya2Vycy5sZW5ndGggPT0gMSk7Ci0JZW5naW5lLmNvbXB1dGVDb3JyZWN0aW9ucyhtYXJrZXJzWzBdLCBudWxsLCAwLCByZXF1ZXN0b3IpOwotCQotCVN0cmluZyBzcmMgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgZXJyb3IgPSAiZGRkeiI7Ci0JaW50IHN0YXJ0ID0gc3JjLmluZGV4T2YoZXJyb3IpOwotCWludCBlbmQgPSBzdGFydCArIGVycm9yLmxlbmd0aCgpOwotCQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSB0d28gc3VnZ2VzdGlvbnMiLCAKLQkJImRkZFxuIisKLQkJImRkZC5lZWUiLAotCQlyZXF1ZXN0b3IuZ2V0U3VnZ2VzdGlvbnMoKSk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiYSBzdGFydCBvZiBhIHN1Z2dlc3Rpb24gaXMgbm90IGNvcnJlY3QiLCAKLQkJc3RhcnQrIlxuIisKLQkJc3RhcnQsCi0JCXJlcXVlc3Rvci5nZXRTdGFydHMoKSk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiYSBlbmQgb2YgYSBzdWdnZXN0aW9uIGlzIG5vdCBjb3JyZWN0IiwgCi0JCWVuZCsiXG4iKwotCQllbmQsCi0JCXJlcXVlc3Rvci5nZXRFbmRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvcnJlY3RGaWVsZFR5cGUyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29ycmVjdGlvbkVuZ2luZSBlbmdpbmUgPSBuZXcgQ29ycmVjdGlvbkVuZ2luZShKYXZhQ29yZS5nZXRPcHRpb25zKCkpOwotCUNvZGVDb3JyZWN0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvZGVDb3JyZWN0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvZGVDb3JyZWN0aW9uIiwgInNyYyIsICIiLCAiQ29ycmVjdEZpZWxkVHlwZTIuamF2YSIpOwotCUlNYXJrZXJbXSBtYXJrZXJzID0gZ2V0TWFya2VycyhjdSk7Ci0JYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgb25lIHByb2JsZW0iLG1hcmtlcnMubGVuZ3RoID09IDEpOwotCWVuZ2luZS5jb21wdXRlQ29ycmVjdGlvbnMobWFya2Vyc1swXSwgbnVsbCwgMCwgcmVxdWVzdG9yKTsKLQotCVN0cmluZyBzcmMgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgZXJyb3IgPSAiQUNsYXNzeiI7Ci0JaW50IHN0YXJ0ID0gc3JjLmluZGV4T2YoZXJyb3IpOwotCWludCBlbmQgPSBzdGFydCArIGVycm9yLmxlbmd0aCgpOwotCQotCWFzc2VydEVxdWFscygKLQkJInNob3VsZCBoYXZlIHR3byBzdWdnZXN0aW9ucyIsIAotCQkiQUNsYXNzXG4iKwotCQkiQUNsYXNzMiIsCi0JCXJlcXVlc3Rvci5nZXRTdWdnZXN0aW9ucygpKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJhIHN0YXJ0IG9mIGEgc3VnZ2VzdGlvbiBpcyBub3QgY29ycmVjdCIsIAotCQlzdGFydCsiXG4iKwotCQlzdGFydCwKLQkJcmVxdWVzdG9yLmdldFN0YXJ0cygpKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJhIGVuZCBvZiBhIHN1Z2dlc3Rpb24gaXMgbm90IGNvcnJlY3QiLCAKLQkJZW5kKyJcbiIrCi0JCWVuZCwKLQkJcmVxdWVzdG9yLmdldEVuZHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29ycmVjdEZpZWxkVHlwZTMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JQ29ycmVjdGlvbkVuZ2luZSBlbmdpbmUgPSBuZXcgQ29ycmVjdGlvbkVuZ2luZShKYXZhQ29yZS5nZXRPcHRpb25zKCkpOwotCUNvZGVDb3JyZWN0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvZGVDb3JyZWN0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvZGVDb3JyZWN0aW9uIiwgInNyYyIsICIiLCAiQ29ycmVjdEZpZWxkVHlwZTMuamF2YSIpOwotCUlNYXJrZXIgbWFya2VyID0gZ2V0TWFya2VyKGN1LCAiQUNsYXNzeiBjYW5ub3QgYmUgcmVzb2x2ZWQgKG9yIGlzIG5vdCBhIHZhbGlkIHR5cGUpIGZvciB0aGUgZmllbGQgQ29ycmVjdEZpZWxkVHlwZTMuZmllbGQiKTsKLQlhc3NlcnRUcnVlKCJNYXJrZXIgbm90IGZvdW5kIiwgbWFya2VyICE9IG51bGwpOwotCXRyeSB7Ci0JCWVuZ2luZS5jb21wdXRlQ29ycmVjdGlvbnMobWFya2VyLCBudWxsLCAwLCByZXF1ZXN0b3IpOwotCX0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCVN0cmluZyBzcmMgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgZXJyb3IgPSAiQUNsYXNzeiI7Ci0JaW50IHN0YXJ0ID0gc3JjLmluZGV4T2YoZXJyb3IpOwotCWludCBlbmQgPSBzdGFydCArIGVycm9yLmxlbmd0aCgpOwotCQotCWFzc2VydEVxdWFscygKLQkJInNob3VsZCBoYXZlIHR3byBzdWdnZXN0aW9ucyIsIAotCQkiQUNsYXNzXG4iKwotCQkiQUNsYXNzMiIsCi0JCXJlcXVlc3Rvci5nZXRTdWdnZXN0aW9ucygpKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJhIHN0YXJ0IG9mIGEgc3VnZ2VzdGlvbiBpcyBub3QgY29ycmVjdCIsIAotCQlzdGFydCsiXG4iKwotCQlzdGFydCwKLQkJcmVxdWVzdG9yLmdldFN0YXJ0cygpKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJhIGVuZCBvZiBhIHN1Z2dlc3Rpb24gaXMgbm90IGNvcnJlY3QiLCAKLQkJZW5kKyJcbiIrCi0JCWVuZCwKLQkJcmVxdWVzdG9yLmdldEVuZHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29ycmVjdExvY2FsVmFyaWFibGVUeXBlMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvcnJlY3Rpb25FbmdpbmUgZW5naW5lID0gbmV3IENvcnJlY3Rpb25FbmdpbmUoSmF2YUNvcmUuZ2V0T3B0aW9ucygpKTsKLQlDb2RlQ29ycmVjdGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb2RlQ29ycmVjdGlvbiIsICJzcmMiLCAiIiwgIkNvcnJlY3RMb2NhbFZhcmlhYmxlVHlwZTEuamF2YSIpOwotCUlNYXJrZXJbXSBtYXJrZXJzID0gZ2V0TWFya2VycyhjdSk7Ci0JYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgb25lIHByb2JsZW0iLG1hcmtlcnMubGVuZ3RoID09IDEpOwotCWVuZ2luZS5jb21wdXRlQ29ycmVjdGlvbnMobWFya2Vyc1swXSwgbnVsbCwgMCwgcmVxdWVzdG9yKTsKLQkKLQlTdHJpbmcgc3JjID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGVycm9yID0gImRkZHoiOwotCWludCBzdGFydCA9IHNyYy5pbmRleE9mKGVycm9yKTsKLQlpbnQgZW5kID0gc3RhcnQgKyBlcnJvci5sZW5ndGgoKTsKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSB0d28gc3VnZ2VzdGlvbnMiLCAKLQkJImRkZFxuIisKLQkJImRkZC5lZWUiLAotCQlyZXF1ZXN0b3IuZ2V0U3VnZ2VzdGlvbnMoKSk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiYSBzdGFydCBvZiBhIHN1Z2dlc3Rpb24gaXMgbm90IGNvcnJlY3QiLCAKLQkJc3RhcnQrIlxuIisKLQkJc3RhcnQsCi0JCXJlcXVlc3Rvci5nZXRTdGFydHMoKSk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiYSBlbmQgb2YgYSBzdWdnZXN0aW9uIGlzIG5vdCBjb3JyZWN0IiwgCi0JCWVuZCsiXG4iKwotCQllbmQsCi0JCXJlcXVlc3Rvci5nZXRFbmRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvcnJlY3RMb2NhbFZhcmlhYmxlVHlwZTIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb3JyZWN0aW9uRW5naW5lIGVuZ2luZSA9IG5ldyBDb3JyZWN0aW9uRW5naW5lKEphdmFDb3JlLmdldE9wdGlvbnMoKSk7Ci0JQ29kZUNvcnJlY3Rpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29kZUNvcnJlY3Rpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29kZUNvcnJlY3Rpb24iLCAic3JjIiwgIiIsICJDb3JyZWN0TG9jYWxWYXJpYWJsZVR5cGUyLmphdmEiKTsKLQlJTWFya2VyW10gbWFya2VycyA9IGdldE1hcmtlcnMoY3UpOwotCWFzc2VydFRydWUoInNob3VsZCBoYXZlIG9uZSBwcm9ibGVtIixtYXJrZXJzLmxlbmd0aCA9PSAxKTsKLQllbmdpbmUuY29tcHV0ZUNvcnJlY3Rpb25zKG1hcmtlcnNbMF0sIG51bGwsIDAsIHJlcXVlc3Rvcik7Ci0KLQlTdHJpbmcgc3JjID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGVycm9yID0gIkFDbGFzc3oiOwotCWludCBzdGFydCA9IHNyYy5pbmRleE9mKGVycm9yKTsKLQlpbnQgZW5kID0gc3RhcnQgKyBlcnJvci5sZW5ndGgoKTsKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSB0d28gc3VnZ2VzdGlvbnMiLCAKLQkJIkFDbGFzc1xuIisKLQkJIkFDbGFzczIiLAotCQlyZXF1ZXN0b3IuZ2V0U3VnZ2VzdGlvbnMoKSk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiYSBzdGFydCBvZiBhIHN1Z2dlc3Rpb24gaXMgbm90IGNvcnJlY3QiLCAKLQkJc3RhcnQrIlxuIisKLQkJc3RhcnQsCi0JCXJlcXVlc3Rvci5nZXRTdGFydHMoKSk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiYSBlbmQgb2YgYSBzdWdnZXN0aW9uIGlzIG5vdCBjb3JyZWN0IiwgCi0JCWVuZCsiXG4iKwotCQllbmQsCi0JCXJlcXVlc3Rvci5nZXRFbmRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvcnJlY3RJbXBvcnQxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29ycmVjdGlvbkVuZ2luZSBlbmdpbmUgPSBuZXcgQ29ycmVjdGlvbkVuZ2luZShKYXZhQ29yZS5nZXRPcHRpb25zKCkpOwotCUNvZGVDb3JyZWN0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvZGVDb3JyZWN0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvZGVDb3JyZWN0aW9uIiwgInNyYyIsICIiLCAiQ29ycmVjdEltcG9ydDEuamF2YSIpOwotCUlNYXJrZXJbXSBtYXJrZXJzID0gZ2V0TWFya2VycyhjdSk7Ci0JYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgb25lIHByb2JsZW0iLG1hcmtlcnMubGVuZ3RoID09IDEpOwotCWVuZ2luZS5jb21wdXRlQ29ycmVjdGlvbnMobWFya2Vyc1swXSwgbnVsbCwgMCwgcmVxdWVzdG9yKTsKLQotCVN0cmluZyBzcmMgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgZXJyb3IgPSAiZGRkeiI7Ci0JaW50IHN0YXJ0ID0gc3JjLmluZGV4T2YoZXJyb3IpOwotCWludCBlbmQgPSBzdGFydCArIGVycm9yLmxlbmd0aCgpOwotCQotCWFzc2VydEVxdWFscygKLQkJInNob3VsZCBoYXZlIHR3byBzdWdnZXN0aW9ucyIsIAotCQkiZGRkXG4iKwotCQkiZGRkLmVlZSIsCi0JCXJlcXVlc3Rvci5nZXRTdWdnZXN0aW9ucygpKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJhIHN0YXJ0IG9mIGEgc3VnZ2VzdGlvbiBpcyBub3QgY29ycmVjdCIsIAotCQlzdGFydCsiXG4iKwotCQlzdGFydCwKLQkJcmVxdWVzdG9yLmdldFN0YXJ0cygpKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJhIGVuZCBvZiBhIHN1Z2dlc3Rpb24gaXMgbm90IGNvcnJlY3QiLCAKLQkJZW5kKyJcbiIrCi0JCWVuZCwKLQkJcmVxdWVzdG9yLmdldEVuZHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29ycmVjdEltcG9ydDIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb3JyZWN0aW9uRW5naW5lIGVuZ2luZSA9IG5ldyBDb3JyZWN0aW9uRW5naW5lKEphdmFDb3JlLmdldE9wdGlvbnMoKSk7Ci0JQ29kZUNvcnJlY3Rpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29kZUNvcnJlY3Rpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29kZUNvcnJlY3Rpb24iLCAic3JjIiwgIiIsICJDb3JyZWN0SW1wb3J0Mi5qYXZhIik7Ci0JSU1hcmtlcltdIG1hcmtlcnMgPSBnZXRNYXJrZXJzKGN1KTsKLQlhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBvbmUgcHJvYmxlbSIsbWFya2Vycy5sZW5ndGggPT0gMSk7Ci0JZW5naW5lLmNvbXB1dGVDb3JyZWN0aW9ucyhtYXJrZXJzWzBdLCBudWxsLCAwLCByZXF1ZXN0b3IpOwotCi0JU3RyaW5nIHNyYyA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBlcnJvciA9ICJkZGR6IjsKLQlpbnQgc3RhcnQgPSBzcmMuaW5kZXhPZihlcnJvcik7Ci0JaW50IGVuZCA9IHN0YXJ0ICsgZXJyb3IubGVuZ3RoKCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKAotCQkic2hvdWxkIGhhdmUgdHdvIHN1Z2dlc3Rpb25zIiwgCi0JCSJkZGRcbiIrCi0JCSJkZGQuZWVlIiwKLQkJcmVxdWVzdG9yLmdldFN1Z2dlc3Rpb25zKCkpOwotCWFzc2VydEVxdWFscygKLQkJImEgc3RhcnQgb2YgYSBzdWdnZXN0aW9uIGlzIG5vdCBjb3JyZWN0IiwgCi0JCXN0YXJ0KyJcbiIrCi0JCXN0YXJ0LAotCQlyZXF1ZXN0b3IuZ2V0U3RhcnRzKCkpOwotCWFzc2VydEVxdWFscygKLQkJImEgZW5kIG9mIGEgc3VnZ2VzdGlvbiBpcyBub3QgY29ycmVjdCIsIAotCQllbmQrIlxuIisKLQkJZW5kLAotCQlyZXF1ZXN0b3IuZ2V0RW5kcygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb3JyZWN0SW1wb3J0MygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvcnJlY3Rpb25FbmdpbmUgZW5naW5lID0gbmV3IENvcnJlY3Rpb25FbmdpbmUoSmF2YUNvcmUuZ2V0T3B0aW9ucygpKTsKLQlDb2RlQ29ycmVjdGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb2RlQ29ycmVjdGlvbiIsICJzcmMiLCAiIiwgIkNvcnJlY3RJbXBvcnQzLmphdmEiKTsKLQlJTWFya2VyW10gbWFya2VycyA9IGdldE1hcmtlcnMoY3UpOwotCWFzc2VydFRydWUoInNob3VsZCBoYXZlIG9uZSBwcm9ibGVtIixtYXJrZXJzLmxlbmd0aCA9PSAxKTsKLQllbmdpbmUuY29tcHV0ZUNvcnJlY3Rpb25zKG1hcmtlcnNbMF0sIG51bGwsIDAsIHJlcXVlc3Rvcik7Ci0KLQlTdHJpbmcgc3JjID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGVycm9yID0gIkFDbGFzc3oiOwotCWludCBzdGFydCA9IHNyYy5pbmRleE9mKGVycm9yKTsKLQlpbnQgZW5kID0gc3RhcnQgKyBlcnJvci5sZW5ndGgoKTsKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSB0d28gc3VnZ2VzdGlvbnMiLCAKLQkJIkFDbGFzc1xuIisKLQkJIkFDbGFzczIiLAotCQlyZXF1ZXN0b3IuZ2V0U3VnZ2VzdGlvbnMoKSk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiYSBzdGFydCBvZiBhIHN1Z2dlc3Rpb24gaXMgbm90IGNvcnJlY3QiLCAKLQkJc3RhcnQrIlxuIisKLQkJc3RhcnQsCi0JCXJlcXVlc3Rvci5nZXRTdGFydHMoKSk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiYSBlbmQgb2YgYSBzdWdnZXN0aW9uIGlzIG5vdCBjb3JyZWN0IiwgCi0JCWVuZCsiXG4iKwotCQllbmQsCi0JCXJlcXVlc3Rvci5nZXRFbmRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvcnJlY3RTdXBlckNsYXNzMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvcnJlY3Rpb25FbmdpbmUgZW5naW5lID0gbmV3IENvcnJlY3Rpb25FbmdpbmUoSmF2YUNvcmUuZ2V0T3B0aW9ucygpKTsKLQlDb2RlQ29ycmVjdGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb2RlQ29ycmVjdGlvbiIsICJzcmMiLCAiIiwgIkNvcnJlY3RTdXBlckNsYXNzMS5qYXZhIik7Ci0JSU1hcmtlcltdIG1hcmtlcnMgPSBnZXRNYXJrZXJzKGN1KTsKLQlhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBvbmUgcHJvYmxlbSIsbWFya2Vycy5sZW5ndGggPT0gMSk7Ci0JZW5naW5lLmNvbXB1dGVDb3JyZWN0aW9ucyhtYXJrZXJzWzBdLCBudWxsLCAwLCByZXF1ZXN0b3IpOwotCi0JU3RyaW5nIHNyYyA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBlcnJvciA9ICJkZGR6IjsKLQlpbnQgc3RhcnQgPSBzcmMuaW5kZXhPZihlcnJvcik7Ci0JaW50IGVuZCA9IHN0YXJ0ICsgZXJyb3IubGVuZ3RoKCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKAotCQkic2hvdWxkIGhhdmUgdHdvIHN1Z2dlc3Rpb25zIiwgCi0JCSJkZGRcbiIrCi0JCSJkZGQuZWVlIiwKLQkJcmVxdWVzdG9yLmdldFN1Z2dlc3Rpb25zKCkpOwotCWFzc2VydEVxdWFscygKLQkJImEgc3RhcnQgb2YgYSBzdWdnZXN0aW9uIGlzIG5vdCBjb3JyZWN0IiwgCi0JCXN0YXJ0KyJcbiIrCi0JCXN0YXJ0LAotCQlyZXF1ZXN0b3IuZ2V0U3RhcnRzKCkpOwotCWFzc2VydEVxdWFscygKLQkJImEgZW5kIG9mIGEgc3VnZ2VzdGlvbiBpcyBub3QgY29ycmVjdCIsIAotCQllbmQrIlxuIisKLQkJZW5kLAotCQlyZXF1ZXN0b3IuZ2V0RW5kcygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb3JyZWN0U3VwZXJDbGFzczIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb3JyZWN0aW9uRW5naW5lIGVuZ2luZSA9IG5ldyBDb3JyZWN0aW9uRW5naW5lKEphdmFDb3JlLmdldE9wdGlvbnMoKSk7Ci0JQ29kZUNvcnJlY3Rpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29kZUNvcnJlY3Rpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29kZUNvcnJlY3Rpb24iLCAic3JjIiwgIiIsICJDb3JyZWN0U3VwZXJDbGFzczIuamF2YSIpOwotCUlNYXJrZXJbXSBtYXJrZXJzID0gZ2V0TWFya2VycyhjdSk7Ci0JYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgb25lIHByb2JsZW0iLG1hcmtlcnMubGVuZ3RoID09IDEpOwotCWVuZ2luZS5jb21wdXRlQ29ycmVjdGlvbnMobWFya2Vyc1swXSwgbnVsbCwgMCwgcmVxdWVzdG9yKTsKLQotCVN0cmluZyBzcmMgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgZXJyb3IgPSAiQUNsYXNzeiI7Ci0JaW50IHN0YXJ0ID0gc3JjLmluZGV4T2YoZXJyb3IpOwotCWludCBlbmQgPSBzdGFydCArIGVycm9yLmxlbmd0aCgpOwotCQotCWFzc2VydEVxdWFscygKLQkJInNob3VsZCBoYXZlIHR3byBzdWdnZXN0aW9ucyIsIAotCQkiQUNsYXNzXG4iKwotCQkiQUNsYXNzMiIsCi0JCXJlcXVlc3Rvci5nZXRTdWdnZXN0aW9ucygpKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJhIHN0YXJ0IG9mIGEgc3VnZ2VzdGlvbiBpcyBub3QgY29ycmVjdCIsIAotCQlzdGFydCsiXG4iKwotCQlzdGFydCwKLQkJcmVxdWVzdG9yLmdldFN0YXJ0cygpKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJhIGVuZCBvZiBhIHN1Z2dlc3Rpb24gaXMgbm90IGNvcnJlY3QiLCAKLQkJZW5kKyJcbiIrCi0JCWVuZCwKLQkJcmVxdWVzdG9yLmdldEVuZHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29ycmVjdFN1cGVySW50ZXJmYWNlMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvcnJlY3Rpb25FbmdpbmUgZW5naW5lID0gbmV3IENvcnJlY3Rpb25FbmdpbmUoSmF2YUNvcmUuZ2V0T3B0aW9ucygpKTsKLQlDb2RlQ29ycmVjdGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb2RlQ29ycmVjdGlvbiIsICJzcmMiLCAiIiwgIkNvcnJlY3RTdXBlckludGVyZmFjZTEuamF2YSIpOwotCUlNYXJrZXJbXSBtYXJrZXJzID0gZ2V0TWFya2VycyhjdSk7Ci0JYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgb25lIHByb2JsZW0iLG1hcmtlcnMubGVuZ3RoID09IDEpOwotCWVuZ2luZS5jb21wdXRlQ29ycmVjdGlvbnMobWFya2Vyc1swXSwgbnVsbCwgMCwgcmVxdWVzdG9yKTsKLQotCVN0cmluZyBzcmMgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgZXJyb3IgPSAiY2NjeiI7Ci0JaW50IHN0YXJ0ID0gc3JjLmluZGV4T2YoZXJyb3IpOwotCWludCBlbmQgPSBzdGFydCArIGVycm9yLmxlbmd0aCgpOwotCQotCWFzc2VydEVxdWFscygKLQkJInNob3VsZCBoYXZlIHR3byBzdWdnZXN0aW9ucyIsCi0JCSJjY2NcbiIrCi0JCSJjY2NJbnRlcmZhY2UiLAotCQlyZXF1ZXN0b3IuZ2V0U3VnZ2VzdGlvbnMoKSk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiYSBzdGFydCBvZiBhIHN1Z2dlc3Rpb24gaXMgbm90IGNvcnJlY3QiLCAKLQkJc3RhcnQrIlxuIisKLQkJc3RhcnQsCi0JCXJlcXVlc3Rvci5nZXRTdGFydHMoKSk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiYSBlbmQgb2YgYSBzdWdnZXN0aW9uIGlzIG5vdCBjb3JyZWN0IiwgCi0JCWVuZCsiXG4iKwotCQllbmQsCi0JCXJlcXVlc3Rvci5nZXRFbmRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvcnJlY3RTdXBlckludGVyZmFjZTIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb3JyZWN0aW9uRW5naW5lIGVuZ2luZSA9IG5ldyBDb3JyZWN0aW9uRW5naW5lKEphdmFDb3JlLmdldE9wdGlvbnMoKSk7Ci0JQ29kZUNvcnJlY3Rpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29kZUNvcnJlY3Rpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29kZUNvcnJlY3Rpb24iLCAic3JjIiwgIiIsICJDb3JyZWN0U3VwZXJJbnRlcmZhY2UyLmphdmEiKTsKLQlJTWFya2VyW10gbWFya2VycyA9IGdldE1hcmtlcnMoY3UpOwotCWFzc2VydFRydWUoInNob3VsZCBoYXZlIG9uZSBwcm9ibGVtIixtYXJrZXJzLmxlbmd0aCA9PSAxKTsKLQllbmdpbmUuY29tcHV0ZUNvcnJlY3Rpb25zKG1hcmtlcnNbMF0sIG51bGwsIDAsIHJlcXVlc3Rvcik7Ci0KLQlTdHJpbmcgc3JjID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGVycm9yID0gIkFMaXN0ZW5lcnoiOwotCWludCBzdGFydCA9IHNyYy5pbmRleE9mKGVycm9yKTsKLQlpbnQgZW5kID0gc3RhcnQgKyBlcnJvci5sZW5ndGgoKTsKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSB0d28gc3VnZ2VzdGlvbnMiLCAKLQkJIkFMaXN0ZW5lclxuIisKLQkJIkFMaXN0ZW5lckV2ZW50IiwKLQkJcmVxdWVzdG9yLmdldFN1Z2dlc3Rpb25zKCkpOwotCWFzc2VydEVxdWFscygKLQkJImEgc3RhcnQgb2YgYSBzdWdnZXN0aW9uIGlzIG5vdCBjb3JyZWN0IiwgCi0JCXN0YXJ0KyJcbiIrCi0JCXN0YXJ0LAotCQlyZXF1ZXN0b3IuZ2V0U3RhcnRzKCkpOwotCWFzc2VydEVxdWFscygKLQkJImEgZW5kIG9mIGEgc3VnZ2VzdGlvbiBpcyBub3QgY29ycmVjdCIsIAotCQllbmQrIlxuIisKLQkJZW5kLAotCQlyZXF1ZXN0b3IuZ2V0RW5kcygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb3JyZWN0RXhjZXB0aW9uMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvcnJlY3Rpb25FbmdpbmUgZW5naW5lID0gbmV3IENvcnJlY3Rpb25FbmdpbmUoSmF2YUNvcmUuZ2V0T3B0aW9ucygpKTsKLQlDb2RlQ29ycmVjdGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb2RlQ29ycmVjdGlvbiIsICJzcmMiLCAiIiwgIkNvcnJlY3RFeGNlcHRpb24xLmphdmEiKTsKLQlJTWFya2VyW10gbWFya2VycyA9IGdldE1hcmtlcnMoY3UpOwotCWFzc2VydFRydWUoInNob3VsZCBoYXZlIG9uZSBwcm9ibGVtIixtYXJrZXJzLmxlbmd0aCA9PSAxKTsKLQllbmdpbmUuY29tcHV0ZUNvcnJlY3Rpb25zKG1hcmtlcnNbMF0sIG51bGwsIDAsIHJlcXVlc3Rvcik7Ci0KLQlTdHJpbmcgc3JjID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGVycm9yID0gImJiYnoiOwotCWludCBzdGFydCA9IHNyYy5pbmRleE9mKGVycm9yKTsKLQlpbnQgZW5kID0gc3RhcnQgKyBlcnJvci5sZW5ndGgoKTsKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSB0d28gc3VnZ2VzdGlvbnMiLAotCQkiYmJiXG4iKwotCQkiYmJiLmNjYyIsCi0JCXJlcXVlc3Rvci5nZXRTdWdnZXN0aW9ucygpKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJhIHN0YXJ0IG9mIGEgc3VnZ2VzdGlvbiBpcyBub3QgY29ycmVjdCIsIAotCQlzdGFydCsiXG4iKwotCQlzdGFydCwKLQkJcmVxdWVzdG9yLmdldFN0YXJ0cygpKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJhIGVuZCBvZiBhIHN1Z2dlc3Rpb24gaXMgbm90IGNvcnJlY3QiLCAKLQkJZW5kKyJcbiIrCi0JCWVuZCwKLQkJcmVxdWVzdG9yLmdldEVuZHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29ycmVjdEV4Y2VwdGlvbjIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb3JyZWN0aW9uRW5naW5lIGVuZ2luZSA9IG5ldyBDb3JyZWN0aW9uRW5naW5lKEphdmFDb3JlLmdldE9wdGlvbnMoKSk7Ci0JQ29kZUNvcnJlY3Rpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29kZUNvcnJlY3Rpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29kZUNvcnJlY3Rpb24iLCAic3JjIiwgIiIsICJDb3JyZWN0RXhjZXB0aW9uMi5qYXZhIik7Ci0JSU1hcmtlcltdIG1hcmtlcnMgPSBnZXRNYXJrZXJzKGN1KTsKLQlhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBvbmUgcHJvYmxlbSIsbWFya2Vycy5sZW5ndGggPT0gMSk7Ci0JZW5naW5lLmNvbXB1dGVDb3JyZWN0aW9ucyhtYXJrZXJzWzBdLCBudWxsLCAwLCByZXF1ZXN0b3IpOwotCi0JU3RyaW5nIHNyYyA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBlcnJvciA9ICJBbkV4Y2VwdGlvbnoiOwotCWludCBzdGFydCA9IHNyYy5pbmRleE9mKGVycm9yKTsKLQlpbnQgZW5kID0gc3RhcnQgKyBlcnJvci5sZW5ndGgoKTsKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSB0d28gc3VnZ2VzdGlvbnMiLAotCQkiQW5FeGNlcHRpb24iLAotCQlyZXF1ZXN0b3IuZ2V0U3VnZ2VzdGlvbnMoKSk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiYSBzdGFydCBvZiBhIHN1Z2dlc3Rpb24gaXMgbm90IGNvcnJlY3QiLCAKLQkJIiIrc3RhcnQsCi0JCXJlcXVlc3Rvci5nZXRTdGFydHMoKSk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiYSBlbmQgb2YgYSBzdWdnZXN0aW9uIGlzIG5vdCBjb3JyZWN0IiwgCi0JCSIiK2VuZCwKLQkJcmVxdWVzdG9yLmdldEVuZHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29ycmVjdE1ldGhvZDEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb3JyZWN0aW9uRW5naW5lIGVuZ2luZSA9IG5ldyBDb3JyZWN0aW9uRW5naW5lKEphdmFDb3JlLmdldE9wdGlvbnMoKSk7Ci0JQ29kZUNvcnJlY3Rpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29kZUNvcnJlY3Rpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29kZUNvcnJlY3Rpb24iLCAic3JjIiwgIiIsICJDb3JyZWN0TWV0aG9kMS5qYXZhIik7Ci0JSU1hcmtlcltdIG1hcmtlcnMgPSBnZXRNYXJrZXJzKGN1KTsKLQlhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBvbmUgcHJvYmxlbSIsbWFya2Vycy5sZW5ndGggPT0gMSk7Ci0JZW5naW5lLmNvbXB1dGVDb3JyZWN0aW9ucyhtYXJrZXJzWzBdLCBudWxsLCAwLCByZXF1ZXN0b3IpOwotCi0JU3RyaW5nIHNyYyA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBlcnJvciA9ICJiYXIiOwotCWludCBzdGFydCA9IHNyYy5sYXN0SW5kZXhPZihlcnJvcik7Ci0JaW50IGVuZCA9IHN0YXJ0ICsgZXJyb3IubGVuZ3RoKCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKAotCQkic2hvdWxkIGhhdmUgb25lIHN1Z2dlc3Rpb24iLAotCQkiYmFyMCIsCi0JCXJlcXVlc3Rvci5nZXRTdWdnZXN0aW9ucygpKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJhIHN0YXJ0IG9mIGEgc3VnZ2VzdGlvbiBpcyBub3QgY29ycmVjdCIsIAotCQkiIitzdGFydCwKLQkJcmVxdWVzdG9yLmdldFN0YXJ0cygpKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJhIGVuZCBvZiBhIHN1Z2dlc3Rpb24gaXMgbm90IGNvcnJlY3QiLCAKLQkJIiIrZW5kLAotCQlyZXF1ZXN0b3IuZ2V0RW5kcygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb3JyZWN0TWV0aG9kMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvcnJlY3Rpb25FbmdpbmUgZW5naW5lID0gbmV3IENvcnJlY3Rpb25FbmdpbmUoSmF2YUNvcmUuZ2V0T3B0aW9ucygpKTsKLQlDb2RlQ29ycmVjdGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb2RlQ29ycmVjdGlvbiIsICJzcmMiLCAiIiwgIkNvcnJlY3RNZXRob2QyLmphdmEiKTsKLQlJTWFya2VyW10gbWFya2VycyA9IGdldE1hcmtlcnMoY3UpOwotCWFzc2VydFRydWUoInNob3VsZCBoYXZlIG9uZSBwcm9ibGVtIixtYXJrZXJzLmxlbmd0aCA9PSAxKTsKLQllbmdpbmUuY29tcHV0ZUNvcnJlY3Rpb25zKG1hcmtlcnNbMF0sIG51bGwsIDAsIHJlcXVlc3Rvcik7Ci0KLQlTdHJpbmcgc3JjID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGVycm9yID0gImJhciI7Ci0JaW50IHN0YXJ0ID0gc3JjLmxhc3RJbmRleE9mKGVycm9yKTsKLQlpbnQgZW5kID0gc3RhcnQgKyBlcnJvci5sZW5ndGgoKTsKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSBvbmUgc3VnZ2VzdGlvbiIsCi0JCSJiYXIwIiwKLQkJcmVxdWVzdG9yLmdldFN1Z2dlc3Rpb25zKCkpOwotCWFzc2VydEVxdWFscygKLQkJImEgc3RhcnQgb2YgYSBzdWdnZXN0aW9uIGlzIG5vdCBjb3JyZWN0IiwgCi0JCSIiK3N0YXJ0LAotCQlyZXF1ZXN0b3IuZ2V0U3RhcnRzKCkpOwotCWFzc2VydEVxdWFscygKLQkJImEgZW5kIG9mIGEgc3VnZ2VzdGlvbiBpcyBub3QgY29ycmVjdCIsIAotCQkiIitlbmQsCi0JCXJlcXVlc3Rvci5nZXRFbmRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvcnJlY3RGaWVsZDEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb3JyZWN0aW9uRW5naW5lIGVuZ2luZSA9IG5ldyBDb3JyZWN0aW9uRW5naW5lKEphdmFDb3JlLmdldE9wdGlvbnMoKSk7Ci0JQ29kZUNvcnJlY3Rpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29kZUNvcnJlY3Rpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29kZUNvcnJlY3Rpb24iLCAic3JjIiwgIiIsICJDb3JyZWN0RmllbGQxLmphdmEiKTsKLQlJTWFya2VyW10gbWFya2VycyA9IGdldE1hcmtlcnMoY3UpOwotCWFzc2VydFRydWUoInNob3VsZCBoYXZlIG9uZSBwcm9ibGVtIixtYXJrZXJzLmxlbmd0aCA9PSAxKTsKLQllbmdpbmUuY29tcHV0ZUNvcnJlY3Rpb25zKG1hcmtlcnNbMF0sIG51bGwsIDAsIHJlcXVlc3Rvcik7Ci0KLQlTdHJpbmcgc3JjID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGVycm9yID0gImJhciI7Ci0JaW50IHN0YXJ0ID0gc3JjLmxhc3RJbmRleE9mKGVycm9yKTsKLQlpbnQgZW5kID0gc3RhcnQgKyBlcnJvci5sZW5ndGgoKTsKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSBvbmUgc3VnZ2VzdGlvbiIsCi0JCSJiYXIwIiwKLQkJcmVxdWVzdG9yLmdldFN1Z2dlc3Rpb25zKCkpOwotCWFzc2VydEVxdWFscygKLQkJImEgc3RhcnQgb2YgYSBzdWdnZXN0aW9uIGlzIG5vdCBjb3JyZWN0IiwgCi0JCSIiK3N0YXJ0LAotCQlyZXF1ZXN0b3IuZ2V0U3RhcnRzKCkpOwotCWFzc2VydEVxdWFscygKLQkJImEgZW5kIG9mIGEgc3VnZ2VzdGlvbiBpcyBub3QgY29ycmVjdCIsIAotCQkiIitlbmQsCi0JCXJlcXVlc3Rvci5nZXRFbmRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvcnJlY3RGaWVsZDIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb3JyZWN0aW9uRW5naW5lIGVuZ2luZSA9IG5ldyBDb3JyZWN0aW9uRW5naW5lKEphdmFDb3JlLmdldE9wdGlvbnMoKSk7Ci0JQ29kZUNvcnJlY3Rpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29kZUNvcnJlY3Rpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29kZUNvcnJlY3Rpb24iLCAic3JjIiwgIiIsICJDb3JyZWN0RmllbGQyLmphdmEiKTsKLQlJTWFya2VyW10gbWFya2VycyA9IGdldE1hcmtlcnMoY3UpOwotCWFzc2VydFRydWUoInNob3VsZCBoYXZlIG9uZSBwcm9ibGVtIixtYXJrZXJzLmxlbmd0aCA9PSAxKTsKLQllbmdpbmUuY29tcHV0ZUNvcnJlY3Rpb25zKG1hcmtlcnNbMF0sIG51bGwsIDAsIHJlcXVlc3Rvcik7Ci0KLQlTdHJpbmcgc3JjID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGVycm9yID0gImJhciI7Ci0JaW50IHN0YXJ0ID0gc3JjLmxhc3RJbmRleE9mKGVycm9yKTsKLQlpbnQgZW5kID0gc3RhcnQgKyBlcnJvci5sZW5ndGgoKTsKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSBvbmUgc3VnZ2VzdGlvbiIsCi0JCSJiYXIwIiwKLQkJcmVxdWVzdG9yLmdldFN1Z2dlc3Rpb25zKCkpOwotCWFzc2VydEVxdWFscygKLQkJImEgc3RhcnQgb2YgYSBzdWdnZXN0aW9uIGlzIG5vdCBjb3JyZWN0IiwgCi0JCSIiK3N0YXJ0LAotCQlyZXF1ZXN0b3IuZ2V0U3RhcnRzKCkpOwotCWFzc2VydEVxdWFscygKLQkJImEgZW5kIG9mIGEgc3VnZ2VzdGlvbiBpcyBub3QgY29ycmVjdCIsIAotCQkiIitlbmQsCi0JCXJlcXVlc3Rvci5nZXRFbmRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvcnJlY3RMb2NhbFZhcmlhYmxlMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvcnJlY3Rpb25FbmdpbmUgZW5naW5lID0gbmV3IENvcnJlY3Rpb25FbmdpbmUoSmF2YUNvcmUuZ2V0T3B0aW9ucygpKTsKLQlDb2RlQ29ycmVjdGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb2RlQ29ycmVjdGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb2RlQ29ycmVjdGlvbiIsICJzcmMiLCAiIiwgIkNvcnJlY3RMb2NhbFZhcmlhYmxlMS5qYXZhIik7Ci0JSU1hcmtlcltdIG1hcmtlcnMgPSBnZXRNYXJrZXJzKGN1KTsKLQlhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBvbmUgcHJvYmxlbSIsbWFya2Vycy5sZW5ndGggPT0gMSk7Ci0JZW5naW5lLmNvbXB1dGVDb3JyZWN0aW9ucyhtYXJrZXJzWzBdLCBudWxsLCAwLCByZXF1ZXN0b3IpOwotCi0JU3RyaW5nIHNyYyA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBlcnJvciA9ICJiYXIiOwotCWludCBzdGFydCA9IHNyYy5sYXN0SW5kZXhPZihlcnJvcik7Ci0JaW50IGVuZCA9IHN0YXJ0ICsgZXJyb3IubGVuZ3RoKCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKAotCQkic2hvdWxkIGhhdmUgb25lIHN1Z2dlc3Rpb24iLAotCQkiYmFyMCIsCi0JCXJlcXVlc3Rvci5nZXRTdWdnZXN0aW9ucygpKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJhIHN0YXJ0IG9mIGEgc3VnZ2VzdGlvbiBpcyBub3QgY29ycmVjdCIsIAotCQkiIitzdGFydCwKLQkJcmVxdWVzdG9yLmdldFN0YXJ0cygpKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJhIGVuZCBvZiBhIHN1Z2dlc3Rpb24gaXMgbm90IGNvcnJlY3QiLCAKLQkJIiIrZW5kLAotCQlyZXF1ZXN0b3IuZ2V0RW5kcygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb3JyZWN0QXJndW1lbnQxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29ycmVjdGlvbkVuZ2luZSBlbmdpbmUgPSBuZXcgQ29ycmVjdGlvbkVuZ2luZShKYXZhQ29yZS5nZXRPcHRpb25zKCkpOwotCUNvZGVDb3JyZWN0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvZGVDb3JyZWN0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvZGVDb3JyZWN0aW9uIiwgInNyYyIsICIiLCAiQ29ycmVjdEFyZ3VtZW50MS5qYXZhIik7Ci0JSU1hcmtlcltdIG1hcmtlcnMgPSBnZXRNYXJrZXJzKGN1KTsKLQlhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBvbmUgcHJvYmxlbSIsbWFya2Vycy5sZW5ndGggPT0gMSk7Ci0JZW5naW5lLmNvbXB1dGVDb3JyZWN0aW9ucyhtYXJrZXJzWzBdLCBudWxsLCAwLCByZXF1ZXN0b3IpOwotCi0JU3RyaW5nIHNyYyA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBlcnJvciA9ICJiYXIiOwotCWludCBzdGFydCA9IHNyYy5sYXN0SW5kZXhPZihlcnJvcik7Ci0JaW50IGVuZCA9IHN0YXJ0ICsgZXJyb3IubGVuZ3RoKCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKAotCQkic2hvdWxkIGhhdmUgb25lIHN1Z2dlc3Rpb24iLAotCQkiYmFyMCIsCi0JCXJlcXVlc3Rvci5nZXRTdWdnZXN0aW9ucygpKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJhIHN0YXJ0IG9mIGEgc3VnZ2VzdGlvbiBpcyBub3QgY29ycmVjdCIsIAotCQkiIitzdGFydCwKLQkJcmVxdWVzdG9yLmdldFN0YXJ0cygpKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJhIGVuZCBvZiBhIHN1Z2dlc3Rpb24gaXMgbm90IGNvcnJlY3QiLCAKLQkJIiIrZW5kLAotCQlyZXF1ZXN0b3IuZ2V0RW5kcygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb3JyZWN0UmV0dXJuVHlwZTEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb3JyZWN0aW9uRW5naW5lIGVuZ2luZSA9IG5ldyBDb3JyZWN0aW9uRW5naW5lKEphdmFDb3JlLmdldE9wdGlvbnMoKSk7Ci0JQ29kZUNvcnJlY3Rpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29kZUNvcnJlY3Rpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29kZUNvcnJlY3Rpb24iLCAic3JjIiwgIiIsICJDb3JyZWN0UmV0dXJuVHlwZTEuamF2YSIpOwotCUlNYXJrZXJbXSBtYXJrZXJzID0gZ2V0TWFya2VycyhjdSk7Ci0JYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgb25lIHByb2JsZW0iLG1hcmtlcnMubGVuZ3RoID09IDEpOwotCWVuZ2luZS5jb21wdXRlQ29ycmVjdGlvbnMobWFya2Vyc1swXSwgbnVsbCwgMCwgcmVxdWVzdG9yKTsKLQotCVN0cmluZyBzcmMgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgZXJyb3IgPSAiZGRkeiI7Ci0JaW50IHN0YXJ0ID0gc3JjLmluZGV4T2YoZXJyb3IpOwotCWludCBlbmQgPSBzdGFydCArIGVycm9yLmxlbmd0aCgpOwotCQotCWFzc2VydEVxdWFscygKLQkJInNob3VsZCBoYXZlIHR3byBzdWdnZXN0aW9ucyIsIAotCQkiZGRkXG4iKwotCQkiZGRkLmVlZSIsCi0JCXJlcXVlc3Rvci5nZXRTdWdnZXN0aW9ucygpKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJhIHN0YXJ0IG9mIGEgc3VnZ2VzdGlvbiBpcyBub3QgY29ycmVjdCIsIAotCQlzdGFydCsiXG4iKwotCQlzdGFydCwKLQkJcmVxdWVzdG9yLmdldFN0YXJ0cygpKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJhIGVuZCBvZiBhIHN1Z2dlc3Rpb24gaXMgbm90IGNvcnJlY3QiLCAKLQkJZW5kKyJcbiIrCi0JCWVuZCwKLQkJcmVxdWVzdG9yLmdldEVuZHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29ycmVjdFJldHVyblR5cGUyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29ycmVjdGlvbkVuZ2luZSBlbmdpbmUgPSBuZXcgQ29ycmVjdGlvbkVuZ2luZShKYXZhQ29yZS5nZXRPcHRpb25zKCkpOwotCUNvZGVDb3JyZWN0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvZGVDb3JyZWN0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvZGVDb3JyZWN0aW9uIiwgInNyYyIsICIiLCAiQ29ycmVjdFJldHVyblR5cGUyLmphdmEiKTsKLQlJTWFya2VyW10gbWFya2VycyA9IGdldE1hcmtlcnMoY3UpOwotCWFzc2VydFRydWUoInNob3VsZCBoYXZlIG9uZSBwcm9ibGVtIixtYXJrZXJzLmxlbmd0aCA9PSAxKTsKLQllbmdpbmUuY29tcHV0ZUNvcnJlY3Rpb25zKG1hcmtlcnNbMF0sIG51bGwsIDAsIHJlcXVlc3Rvcik7Ci0KLQlTdHJpbmcgc3JjID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGVycm9yID0gIkFDbGFzc3oiOwotCWludCBzdGFydCA9IHNyYy5pbmRleE9mKGVycm9yKTsKLQlpbnQgZW5kID0gc3RhcnQgKyBlcnJvci5sZW5ndGgoKTsKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSB0d28gc3VnZ2VzdGlvbnMiLCAKLQkJIkFDbGFzc1xuIisKLQkJIkFDbGFzczIiLAotCQlyZXF1ZXN0b3IuZ2V0U3VnZ2VzdGlvbnMoKSk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiYSBzdGFydCBvZiBhIHN1Z2dlc3Rpb24gaXMgbm90IGNvcnJlY3QiLCAKLQkJc3RhcnQrIlxuIisKLQkJc3RhcnQsCi0JCXJlcXVlc3Rvci5nZXRTdGFydHMoKSk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiYSBlbmQgb2YgYSBzdWdnZXN0aW9uIGlzIG5vdCBjb3JyZWN0IiwgCi0JCWVuZCsiXG4iKwotCQllbmQsCi0JCXJlcXVlc3Rvci5nZXRFbmRzKCkpOwotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0NvZGVDb3JyZWN0aW9uVGVzdHNSZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9Db2RlQ29ycmVjdGlvblRlc3RzUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNTM0YWIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0NvZGVDb3JyZWN0aW9uVGVzdHNSZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29ycmVjdGlvblJlcXVlc3RvcjsKLQotcHVibGljIGNsYXNzIENvZGVDb3JyZWN0aW9uVGVzdHNSZXF1ZXN0b3IgaW1wbGVtZW50cyBJQ29ycmVjdGlvblJlcXVlc3RvciB7Ci0JcHJpdmF0ZSBjbGFzcyBTdWdnZXN0aW9uIHsKLQkJcHVibGljIFN0cmluZyB0ZXh0OwotCQlwdWJsaWMgaW50IHN0YXJ0OwotCQlwdWJsaWMgaW50IGVuZDsKLQkJcHVibGljIFN1Z2dlc3Rpb24oY2hhcltdIHRleHQsIGludCBzdGFydCwgaW50IGVuZCl7Ci0JCQl0aGlzLnRleHQgPSBuZXcgU3RyaW5nKHRleHQpOwotCQkJdGhpcy5zdGFydCA9IHN0YXJ0OwotCQkJdGhpcy5lbmQgPSBlbmQ7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBTdWdnZXN0aW9uQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLE9iamVjdCBvMikgewotCQkJU3VnZ2VzdGlvbiBzMSA9IChTdWdnZXN0aW9uKW8xOwotCQkJU3VnZ2VzdGlvbiBzMiA9IChTdWdnZXN0aW9uKW8yOwotCQkJCi0JCQlpbnQgcmVzdWx0ID0gczEudGV4dC5jb21wYXJlVG8oczIudGV4dCk7Ci0JCQlpZihyZXN1bHQgPT0gMCkgewotCQkJCXJlc3VsdCA9IHMxLnN0YXJ0IC0gczIuc3RhcnQ7Ci0JCQkJaWYocmVzdWx0ID09IDApIHsKLQkJCQkJcmVzdWx0ID0gczEuZW5kIC0gczIuZW5kOwkKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgVmVjdG9yIGZTdWdnZXN0aW9ucyA9IG5ldyBWZWN0b3IoNSk7Ci0JCi0JcHVibGljIHZvaWQgYWNjZXB0Q2xhc3MoY2hhcltdIHBhY2thZ2VOYW1lLGNoYXJbXSBjbGFzc05hbWUsY2hhcltdIGNvcnJlY3Rpb25OYW1lLGludCBtb2RpZmllcnMsaW50IGNvcnJlY3Rpb25TdGFydCxpbnQgY29ycmVjdGlvbkVuZCl7Ci0JCWZTdWdnZXN0aW9ucy5hZGRFbGVtZW50KG5ldyBTdWdnZXN0aW9uKGNvcnJlY3Rpb25OYW1lLCBjb3JyZWN0aW9uU3RhcnQsIGNvcnJlY3Rpb25FbmQpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWNjZXB0RmllbGQoY2hhcltdIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSxjaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUsY2hhcltdIG5hbWUsY2hhcltdIHR5cGVQYWNrYWdlTmFtZSxjaGFyW10gdHlwZU5hbWUsY2hhcltdIGNvcnJlY3Rpb25OYW1lLGludCBtb2RpZmllcnMsaW50IGNvcnJlY3Rpb25TdGFydCxpbnQgY29ycmVjdGlvbkVuZCl7Ci0JCWZTdWdnZXN0aW9ucy5hZGRFbGVtZW50KG5ldyBTdWdnZXN0aW9uKGNvcnJlY3Rpb25OYW1lLCBjb3JyZWN0aW9uU3RhcnQsIGNvcnJlY3Rpb25FbmQpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWNjZXB0SW50ZXJmYWNlKGNoYXJbXSBwYWNrYWdlTmFtZSxjaGFyW10gaW50ZXJmYWNlTmFtZSxjaGFyW10gY29ycmVjdGlvbk5hbWUsaW50IG1vZGlmaWVycyxpbnQgY29ycmVjdGlvblN0YXJ0LGludCBjb3JyZWN0aW9uRW5kKXsKLQkJZlN1Z2dlc3Rpb25zLmFkZEVsZW1lbnQobmV3IFN1Z2dlc3Rpb24oY29ycmVjdGlvbk5hbWUsIGNvcnJlY3Rpb25TdGFydCwgY29ycmVjdGlvbkVuZCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhY2NlcHRMb2NhbFZhcmlhYmxlKGNoYXJbXSBuYW1lLGNoYXJbXSB0eXBlUGFja2FnZU5hbWUsY2hhcltdIHR5cGVOYW1lLGludCBtb2RpZmllcnMsaW50IGNvcnJlY3Rpb25TdGFydCxpbnQgY29ycmVjdGlvbkVuZCl7Ci0JCWZTdWdnZXN0aW9ucy5hZGRFbGVtZW50KG5ldyBTdWdnZXN0aW9uKG5hbWUsIGNvcnJlY3Rpb25TdGFydCwgY29ycmVjdGlvbkVuZCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhY2NlcHRNZXRob2QoY2hhcltdIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSxjaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUsY2hhcltdIHNlbGVjdG9yLGNoYXJbXVtdIHBhcmFtZXRlclBhY2thZ2VOYW1lcyxjaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMsY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsY2hhcltdIHJldHVyblR5cGVQYWNrYWdlTmFtZSxjaGFyW10gcmV0dXJuVHlwZU5hbWUsY2hhcltdIGNvcnJlY3Rpb25OYW1lLGludCBtb2RpZmllcnMsaW50IGNvcnJlY3Rpb25TdGFydCxpbnQgY29ycmVjdGlvbkVuZCl7Ci0JCWZTdWdnZXN0aW9ucy5hZGRFbGVtZW50KG5ldyBTdWdnZXN0aW9uKGNvcnJlY3Rpb25OYW1lLCBjb3JyZWN0aW9uU3RhcnQsIGNvcnJlY3Rpb25FbmQpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWNjZXB0UGFja2FnZShjaGFyW10gcGFja2FnZU5hbWUsY2hhcltdIGNvcnJlY3Rpb25OYW1lLGludCBjb3JyZWN0aW9uU3RhcnQsaW50IGNvcnJlY3Rpb25FbmQpewotCQlmU3VnZ2VzdGlvbnMuYWRkRWxlbWVudChuZXcgU3VnZ2VzdGlvbihjb3JyZWN0aW9uTmFtZSwgY29ycmVjdGlvblN0YXJ0LCBjb3JyZWN0aW9uRW5kKSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U3VnZ2VzdGlvbnMoKXsKLQkJU3VnZ2VzdGlvbltdIHN1Z2dlc3Rpb25zID0gZ2V0U29ydGVkU3VnZ2VzdGlvbnMoKTsKLQkJCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3VnZ2VzdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmKGkgIT0gMCkKLQkJCQlyZXN1bHQuYXBwZW5kKCdcbicpOwotCQkJCQotCQkJcmVzdWx0LmFwcGVuZChzdWdnZXN0aW9uc1tpXS50ZXh0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U3RhcnRzKCl7Ci0JCVN1Z2dlc3Rpb25bXSBzdWdnZXN0aW9ucyA9IGdldFNvcnRlZFN1Z2dlc3Rpb25zKCk7Ci0JCQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN1Z2dlc3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZihpICE9IDApCi0JCQkJcmVzdWx0LmFwcGVuZCgnXG4nKTsKLQkJCQkKLQkJCXJlc3VsdC5hcHBlbmQoc3VnZ2VzdGlvbnNbaV0uc3RhcnQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRFbmRzKCl7Ci0JCVN1Z2dlc3Rpb25bXSBzdWdnZXN0aW9ucyA9IGdldFNvcnRlZFN1Z2dlc3Rpb25zKCk7Ci0JCQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN1Z2dlc3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZihpICE9IDApCi0JCQkJcmVzdWx0LmFwcGVuZCgnXG4nKTsKLQkJCQkKLQkJCXJlc3VsdC5hcHBlbmQoc3VnZ2VzdGlvbnNbaV0uZW5kKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCXByaXZhdGUgU3VnZ2VzdGlvbltdIGdldFNvcnRlZFN1Z2dlc3Rpb25zKCl7Ci0JCU9iamVjdFtdIHVuc29ydGVkID0gZlN1Z2dlc3Rpb25zLnRvQXJyYXkoKTsKLQkJU3VnZ2VzdGlvbltdIHNvcnRlZCA9IG5ldyBTdWdnZXN0aW9uW3Vuc29ydGVkLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkodW5zb3J0ZWQsIDAsIHNvcnRlZCwgMCwgdW5zb3J0ZWQubGVuZ3RoKTsKLQkJQXJyYXlzLnNvcnQoc29ydGVkLCBuZXcgU3VnZ2VzdGlvbkNvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiBzb3J0ZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0NvbXBpbGF0aW9uVW5pdFRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvQ29tcGlsYXRpb25Vbml0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZmNGFhZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvQ29tcGlsYXRpb25Vbml0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBDb21waWxhdGlvblVuaXRUZXN0cyBleHRlbmRzIE1vZGlmeWluZ1Jlc291cmNlVGVzdHMgewotCUlDb21waWxhdGlvblVuaXQgY3U7Ci0JCi1wdWJsaWMgQ29tcGlsYXRpb25Vbml0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXB1YmxpYyB2b2lkIHNldFVwU3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQlzdXBlci5zZXRVcFN1aXRlKCk7Ci0JCi0JdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCBuZXcgU3RyaW5nW10ge2dldEV4dGVybmFsSkNMUGF0aFN0cmluZygpfSwgImJpbiIpOwotCXRoaXMuY3JlYXRlRm9sZGVyKCIvUC9zcmMvcCIpOwotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9wL1guamF2YSIsCi0JCSIvKiBzb21lIGNvbW1lbnQgKi8iICsKLQkJInBhY2thZ2UgcDtcbiIgKwotCQkiaW1wb3J0IHAyLio7XG4iICsKLQkJImltcG9ydCBwMy5aO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHtcbiIgKwotCQkiICBwdWJsaWMgaW50IGYxO1xuIiArCi0JCSIgIC8qKiBAZGVwcmVjYXRlZFxuICovIiArCi0JCSIgIHByb3RlY3RlZCBPYmplY3QgZjI7XG4iICsKLQkJIiAgcHJpdmF0ZSBYIGYzO1xuIiArCi0JCSIgIGphdmEubGFuZy5TdHJpbmcgZjQ7XG4iICsKLQkJIiAgcHVibGljIGNsYXNzIElubmVyIHtcbiIgKwotCQkiICAgIGNsYXNzIElubmVySW5uZXIge1xuIiArCi0JCSIgICAgfVxuIiArCi0JCSIgIH1cbiIgKwotCQkiICBwdWJsaWMgdm9pZCBmb28oWSB5KSB0aHJvd3MgSU9FeGNlcHRpb24ge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICBwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBiYXIoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIC8qKiBAZGVwcmVjYXRlZFxuICovIiArCi0JCSIgIHByaXZhdGUgaW50IGZyZWQoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9XG4iICsKLQkJIi8qKiBAZGVwcmVjYXRlZFxuICovIiArCi0JCSJpbnRlcmZhY2UgSSB7XG4iICsKLQkJIiAgaW50IHJ1bigpO1xuIiArCi0JCSJ9Iik7Ci0JdGhpcy5jdSA9IHRoaXMuZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvcC9YLmphdmEiKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlyZXR1cm4gbmV3IFN1aXRlKENvbXBpbGF0aW9uVW5pdFRlc3RzLmNsYXNzKTsKLX0KLXB1YmxpYyB2b2lkIHRlYXJEb3duU3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQlzdXBlci50ZWFyRG93blN1aXRlKCk7Ci19Ci0vKioKLSAqIENhbGxzIG1ldGhvZHMgdGhhdCBkbyBub3RoaW5nIHRvIGVuc3VyZSBjb2RlIGNvdmVyYWdlCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb2RlQ292ZXJhZ2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQl0aGlzLmN1LmRlc3Ryb3koKTsKLQl0aGlzLmN1LnJlc3RvcmUoKTsKLX0KLS8qKgotICogRW5zdXJlcyA8Y29kZT5jb21taXQoYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcik8L2NvZGU+IHRocm93cyB0aGUgY29ycmVjdCAKLSAqIDxjb2RlPkphdmFNb2RlbEV4Y2VwdGlvbjwvY29kZT4gZm9yIGEgPGNvZGU+Q29tcGlsYXRpb25Vbml0PC9jb2RlPi4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvbW1pdCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3UuY29tbWl0KGZhbHNlLCBudWxsKTsKLQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCWFzc2VydFRydWUoIkluY29ycmVjdCBzdGF0dXMgZm9yIGNvbW1pdHRpbmcgYSBDb21waWxhdGlvblVuaXQiLCBqbWUuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpID09IEphdmFNb2RlbFN0YXR1cy5JTlZBTElEX0VMRU1FTlRfVFlQRVMpOwotCQlyZXR1cm47Ci0JfQotCWFzc2VydFRydWUoIkEgY29tcGlsYXRpb24gdW5pdCBzaG91bGQgdGhyb3cgYW4gZXhjZXB0aW9uIGlzIGEgY29tbWl0IGlzIGF0dGVtcHRlZCIsIGZhbHNlKTsKLX0KLS8qCi0gKiBFbnN1cmUgdGhhdCB0aGUgZGVwcmVjYXRlZCBmbGFncyBpcyBjb3JyZWN0bHkgcmVwb3J0ZWQKLSAqIChyZWdyZXNzaW9uIHRlc3QgZm8gYnVnIDIzMjA3IEZsYWdzLmlzRGVwcmVjYXRlZChJTWV0aG9kLmdldEZsYWdzKCkpIGRvZXNuJ3Qgd29yaykKLSAqLwotcHVibGljIHZvaWQgdGVzdERlcHJlY2F0ZWRGbGFnKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IHRoaXMuY3UuZ2V0VHlwZSgiWCIpOwotCWFzc2VydFRydWUoIlR5cGUgWCBzaG91bGQgbm90IGJlIGRlcHJlY2F0ZWQiLCAhRmxhZ3MuaXNEZXByZWNhdGVkKHR5cGUuZ2V0RmxhZ3MoKSkpOwotCWFzc2VydFRydWUoIlR5cGUgSSBzaG91bGQgYmUgZGVwcmVjYXRlZCIsIEZsYWdzLmlzRGVwcmVjYXRlZCh0aGlzLmN1LmdldFR5cGUoIkkiKS5nZXRGbGFncygpKSk7Ci0JCi0JYXNzZXJ0VHJ1ZSgiRmllbGQgZjEgc2hvdWxkIG5vdCBiZSBkZXByZWNhdGVkIiwgIUZsYWdzLmlzRGVwcmVjYXRlZCh0eXBlLmdldEZpZWxkKCJmMSIpLmdldEZsYWdzKCkpKTsKLQlhc3NlcnRUcnVlKCJGaWVsZCBmMiBzaG91bGQgYmUgZGVwcmVjYXRlZCIsIEZsYWdzLmlzRGVwcmVjYXRlZCh0eXBlLmdldEZpZWxkKCJmMiIpLmdldEZsYWdzKCkpKTsKLQkKLQlhc3NlcnRUcnVlKCJNZXRob2QgYmFyIHNob3VsZCBub3QgYmUgZGVwcmVjYXRlZCIsICFGbGFncy5pc0RlcHJlY2F0ZWQodHlwZS5nZXRNZXRob2QoImJhciIsIG5ldyBTdHJpbmdbXXt9KS5nZXRGbGFncygpKSk7Ci0JYXNzZXJ0VHJ1ZSgiTWV0aG9kIGZyZWQgc2hvdWxkIGJlIGRlcHJlY2F0ZWQiLCBGbGFncy5pc0RlcHJlY2F0ZWQodHlwZS5nZXRNZXRob2QoImZyZWQiLCBuZXcgU3RyaW5nW117fSkuZ2V0RmxhZ3MoKSkpOwotfQotLyoqCi0gKiBFbnN1cmVzIDxjb2RlPmdldENvbnRlbnRzKCk8L2NvZGU+IHJldHVybnMgdGhlIGNvcnJlY3QgdmFsdWUKLSAqIGZvciBhIDxjb2RlPkNvbXBpbGF0aW9uVW5pdDwvY29kZT4gdGhhdCBpcyBub3QgcHJlc2VudAotICovCi1wdWJsaWMgdm9pZCB0ZXN0R2V0Q29udGVudHNGb3JOb3RQcmVzZW50KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvcC9BYnNlbnQuamF2YSIpOwotCQotCWFzc2VydFNvdXJjZUVxdWFscygiVW5leHBlY3RlZCBjb250ZW50cyBmb3Igbm9uIHByZXNlbnQgY3UiLCAiIiwgbmV3IFN0cmluZyhjb21waWxhdGlvblVuaXQuZ2V0Q29udGVudHMoKSkpOwotfQotLyoqCi0gKiBUZXN0cyBKYXZhIGVsZW1lbnQgcmV0cmlldmFsIHZpYSBzb3VyY2UgcG9zaXRpb24gCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXRFbGVtZW50QXQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gdGhpcy5jdS5nZXRUeXBlKCJYIik7Ci0JSVNvdXJjZVJhbmdlIHNvdXJjZVJhbmdlPSB0eXBlLmdldFNvdXJjZVJhbmdlKCk7Ci0JLy9lbnN1cmUgdGhhdCB3ZSBhcmUgaW50byB0aGUgYm9keSBvZiB0aGUgdHlwZQotCUlKYXZhRWxlbWVudCBlbGVtZW50PSAKLQkJdGhpcy5jdS5nZXRFbGVtZW50QXQoc291cmNlUmFuZ2UuZ2V0T2Zmc2V0KCkgKyB0eXBlLmdldEVsZW1lbnROYW1lKCkubGVuZ3RoKCkgKyAxKTsKLQlhc3NlcnRUcnVlKCJTaG91bGQgaGF2ZSBmb3VuZCBhIHR5cGUiLCBlbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpOwotCWFzc2VydEVxdWFscygKLQkJIlNob3VsZCBoYXZlIGZvdW5kIFgiLAotCQkiWCIsCi0JCWVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JLy9lbnN1cmUgdGhhdCBudWxsIGlzIHJldHVybmVkIGlmIHRoZXJlIGlzIG5vIGVsZW1lbnQgb3RoZXIgdGhhbiB0aGUgY29tcGlsYXRpb24KLSAJLy91bml0IGl0c2VsZiBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24KLSAJZWxlbWVudD0gdGhpcy5jdS5nZXRFbGVtZW50QXQodGhpcy5jdS5nZXRTb3VyY2VSYW5nZSgpLmdldE9mZnNldCgpICsgMSk7Ci0gCWFzc2VydEVxdWFscygiU2hvdWxkIGhhdmUgbm90IGZvdW5kIGFueSBlbGVtZW50IiwgbnVsbCwgZWxlbWVudCk7Ci19Ci0vKioKLSAqIFRlc3RzIGltcG9ydCBkZWNsYXJhcmlvbiByZXRyaWV2YWwgdmlhIHNvdXJjZSBwb3NpdGlvbi4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAxNDMzMSBJQ29tcGlsYXRpb25Vbml0LmdldEVsZW1lbnRBdCBkb3Mgbm90IGZpbmQgaW1wb3J0IGRlY2wpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXRFbGVtZW50QXQyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUltcG9ydENvbnRhaW5lciBjb250YWluZXIgPSB0aGlzLmN1LmdldEltcG9ydENvbnRhaW5lcigpOwotCUlTb3VyY2VSYW5nZSBzb3VyY2VSYW5nZT0gY29udGFpbmVyLmdldFNvdXJjZVJhbmdlKCk7Ci0JLy9lbnN1cmUgdGhhdCB3ZSBhcmUgaW5zaWRlIHRoZSBpbXBvcnQgY29udGFpbmVyCi0JSUphdmFFbGVtZW50IGVsZW1lbnQ9IHRoaXMuY3UuZ2V0RWxlbWVudEF0KHNvdXJjZVJhbmdlLmdldE9mZnNldCgpICsgMSk7Ci0JYXNzZXJ0VHJ1ZSgiU2hvdWxkIGhhdmUgZm91bmQgYW4gaW1wb3J0IiwgZWxlbWVudCBpbnN0YW5jZW9mIElJbXBvcnREZWNsYXJhdGlvbik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiSW1wb3J0IG5vdCBmb3VuZCIsCi0JCSJwMi4qIiwKLQkJIGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBjb3JyZWN0IG51bWJlciBvZiBmaWVsZHMgd2l0aCB0aGUgY29ycmVjdCBuYW1lcywgbW9kaWZpZXJzLCBzaWduYXR1cmVzCi0gKiBhbmQgZGVjbGFyaW5nIHR5cGVzIGV4aXN0IGluIGEgdHlwZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdEdldEZpZWxkcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSB0aGlzLmN1LmdldFR5cGUoIlgiKTsKLQlJRmllbGRbXSBmaWVsZHM9IHR5cGUuZ2V0RmllbGRzKCk7Ci0JU3RyaW5nW10gZmllbGROYW1lcyA9IG5ldyBTdHJpbmdbXSB7ImYxIiwgImYyIiwgImYzIiwgImY0In07Ci0JU3RyaW5nW10gZmxhZ3MgPSBuZXcgU3RyaW5nW10geyJwdWJsaWMiLCAicHJvdGVjdGVkIiwgInByaXZhdGUiLCAiIn07Ci0JU3RyaW5nW10gc2lnbmF0dXJlcyA9IG5ldyBTdHJpbmdbXSB7IkkiLCAiUU9iamVjdDsiLCAiUVg7IiwgIlFqYXZhLmxhbmcuU3RyaW5nOyJ9OwotCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIGZpZWxkcyByZXR1cm5lZCIsICBmaWVsZE5hbWVzLmxlbmd0aCwgZmllbGRzLmxlbmd0aCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgbmFtZSBmb3IgdGhlICIgKyBpICsgIiBmaWVsZCIsIGZpZWxkTmFtZXNbaV0sIGZpZWxkc1tpXS5nZXRFbGVtZW50TmFtZSgpKTsKLQkJU3RyaW5nIG1vZD0gRmxhZ3MudG9TdHJpbmcoZmllbGRzW2ldLmdldEZsYWdzKCkpOwotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbW9kaWZpZXIgZm9yICIgKyBmaWVsZHNbaV0uZ2V0RWxlbWVudE5hbWUoKSwgZmxhZ3NbaV0sIG1vZCk7Ci0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCB0eXBlIHNpZ25hdHVyZSBmb3IgIiArIGZpZWxkc1tpXS5nZXRFbGVtZW50TmFtZSgpLCBzaWduYXR1cmVzW2ldLCBmaWVsZHNbaV0uZ2V0VHlwZVNpZ25hdHVyZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGRlY2xhcmluZyB0eXBlIGZvciAiICsgZmllbGRzW2ldLmdldEVsZW1lbnROYW1lKCksIHR5cGUsIGZpZWxkc1tpXS5nZXREZWNsYXJpbmdUeXBlKCkpOwotCQlhc3NlcnRUcnVlKCJGaWVsZCBzaG91bGQgZXhpc3QgIiArIGZpZWxkc1tpXSwgZmllbGRzW2ldLmV4aXN0cygpKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZSB0aGF0IGltcG9ydCBkZWNsYXJhdGlvbiBoYW5kbGVzIGFyZSByZXR1cm5lZCBmcm9tIHRoZQotICogY29tcGlsYXRpb24gdW5pdC4KLSAqIENoZWNrcyBub24tZXhpc3RhbnQgaGFuZGxlLCBvbiBkZW1hbmQgYW5kIG5vdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdEdldEltcG9ydCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlJbXBvcnREZWNsYXJhdGlvbiBpbXBydCA9IHRoaXMuY3UuZ2V0SW1wb3J0KCJqYXZhLmxhbmciKTsKLQlhc3NlcnRUcnVlKCJJbXBvcnQgc2hvdWxkIG5vdCBleGlzdCAiICsgaW1wcnQsICFpbXBydC5leGlzdHMoKSk7Ci0JCi0JaW1wcnQgPSB0aGlzLmN1LmdldEltcG9ydCgicDIuKiIpOwotCWFzc2VydFRydWUoIkltcG9ydCBzaG91bGQgZXhpc3QgIiArIGltcHJ0LCBpbXBydC5leGlzdHMoKSk7Ci0JCi0JaW1wcnQgPSB0aGlzLmN1LmdldEltcG9ydCgicDMuWiIpOwotCWFzc2VydFRydWUoIkltcG9ydCBzaG91bGQgZXhpc3QgIiArIGltcHJ0LCBpbXBydC5leGlzdHMoKSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBjb3JyZWN0IG51bWJlciBvZiBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgbmFtZXMKLSAqIGV4aXN0IGluICJHcmFwaGljc1Rlc3QiIGNvbXBpbGF0aW9uIHVuaXQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXRJbXBvcnRzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUltcG9ydERlY2xhcmF0aW9uW10gaW1wcnRzID0gdGhpcy5jdS5nZXRJbXBvcnRzKCk7Ci0JSUltcG9ydENvbnRhaW5lciBjb250YWluZXI9IHRoaXMuY3UuZ2V0SW1wb3J0Q29udGFpbmVyKCk7Ci0JU3RyaW5nW10gaW1wb3J0TmFtZXMgPSBuZXcgU3RyaW5nW10geyJwMi4qIiwgInAzLloifTsKLQotCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIGltcG9ydHMgcmV0dXJuZWQiLCBpbXBvcnROYW1lcy5sZW5ndGgsIGltcHJ0cy5sZW5ndGgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCWFzc2VydFRydWUoIkluY29ycmVjdCBuYW1lIGZvciB0aGUgdHlwZSBpbiB0aGlzIHBvc2l0aW9uOiAiICsgaW1wcnRzW2ldLmdldEVsZW1lbnROYW1lKCksIGltcHJ0c1tpXS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhpbXBvcnROYW1lc1tpXSkpOwotCQlhc3NlcnRUcnVlKCJJbXBvcnQgZG9lcyBub3QgZXhpc3QgIiArIGltcHJ0c1tpXSwgaW1wcnRzW2ldLmV4aXN0cygpKTsKLQkJaWYgKGkgPT0gMCkgewotCQkJYXNzZXJ0VHJ1ZSgiSW1wb3J0IGlzIG5vdCBvbiBkZW1hbmQgIiArIGltcHJ0c1tpXSwgaW1wcnRzW2ldLmlzT25EZW1hbmQoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3NlcnRUcnVlKCJJbXBvcnQgaXMgb24gZGVtYW5kICIgKyBpbXBydHNbaV0sICFpbXBydHNbaV0uaXNPbkRlbWFuZCgpKTsKLQkJfQotCQlhc3NlcnRUcnVlKCJDb250YWluZXIgaW1wb3J0IGRvZXMgbm90IGVxdWFsIGltcG9ydCIsIGNvbnRhaW5lci5nZXRJbXBvcnQoaW1wcnRzW2ldLmdldEVsZW1lbnROYW1lKCkpLmVxdWFscyhpbXBydHNbaV0pKTsKLQl9Ci0KLQlhc3NlcnRUcnVlKCJJbXBvcnQgY29udGFpbmVyIG11c3QgZXhpc3QgYW5kIGhhdmUgY2hpbGRyZW4iLCBjb250YWluZXIuZXhpc3RzKCkgJiYgY29udGFpbmVyLmhhc0NoaWxkcmVuKCkpOwotCUlTb3VyY2VSYW5nZSBjb250YWluZXJSYW5nZT0gY29udGFpbmVyLmdldFNvdXJjZVJhbmdlKCk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiT2Zmc2V0IGNvbnRhaW5lciByYW5nZSBub3QgY29ycmVjdCIsIAotCQlpbXBydHNbMF0uZ2V0U291cmNlUmFuZ2UoKS5nZXRPZmZzZXQoKSwKLQkJY29udGFpbmVyUmFuZ2UuZ2V0T2Zmc2V0KCkpOwotCWFzc2VydEVxdWFscygKLQkJIkxlbmd0aCBjb250YWluZXIgcmFuZ2Ugbm90IGNvcnJlY3QiLAotCQlpbXBydHNbaW1wcnRzLmxlbmd0aC0xXS5nZXRTb3VyY2VSYW5nZSgpLmdldE9mZnNldCgpICsgaW1wcnRzW2ltcHJ0cy5sZW5ndGgtMV0uZ2V0U291cmNlUmFuZ2UoKS5nZXRMZW5ndGgoKSwKLQkJY29udGFpbmVyUmFuZ2UuZ2V0T2Zmc2V0KCkgKyBjb250YWluZXJSYW5nZS5nZXRMZW5ndGgoKSk7Ci0JYXNzZXJ0U291cmNlRXF1YWxzKCJTb3VyY2Ugbm90IGNvcnJlY3QiLCAKLQkJImltcG9ydCBwMi4qO1xuIiArCi0JCSJpbXBvcnQgcDMuWjsiLAotCQljb250YWluZXIuZ2V0U291cmNlKCkpOwotCQotfQotLyoqCi0gKiBFbnN1cmUgdGhhdCB0eXBlIGhhbmRsZXMgYXJlIHJldHVybmVkIGZyb20gdGhlCi0gKiBjb21waWxhdGlvbiB1bml0IGZvciBhbiBpbm5lciB0eXBlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0R2V0SW5uZXJUeXBlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlUeXBlIHR5cGUxID0gY3UuZ2V0VHlwZSgiWCIpOwotCWFzc2VydFRydWUoIlggdHlwZSBzaG91bGQgaGF2ZSBjaGlsZHJlbiIsIHR5cGUxLmhhc0NoaWxkcmVuKCkpOwotCWFzc2VydFRydWUoIlggdHlwZSBzdXBlcmNsYXNzIG5hbWUgc2hvdWxkIGJlIG51bGwiLCB0eXBlMS5nZXRTdXBlcmNsYXNzTmFtZSgpID09IG51bGwpOwotCVN0cmluZ1tdIHN1cGVyaW50ZXJmYWNlTmFtZXM9IHR5cGUxLmdldFN1cGVySW50ZXJmYWNlTmFtZXMoKTsKLQlhc3NlcnRFcXVhbHMoIlggdHlwZSBzaG91bGQgaGF2ZSBvbmUgc3VwZXJpbnRlcmZhY2UiLCAxLCBzdXBlcmludGVyZmFjZU5hbWVzLmxlbmd0aCk7Ci0JYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHN1cGVyIGludGVyZmFjZSBuYW1lIiwgIlJ1bm5hYmxlIiwgc3VwZXJpbnRlcmZhY2VOYW1lc1swXSk7Ci0JYXNzZXJ0RXF1YWxzKCJGdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgdHlwZSBpcyBpbmNvcnJlY3QiLCAicC5YIiwgdHlwZTEuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCUlUeXBlIHR5cGUyID0gdHlwZTEuZ2V0VHlwZSgiSW5uZXIiKTsKLQlzdXBlcmludGVyZmFjZU5hbWVzID0gdHlwZTIuZ2V0U3VwZXJJbnRlcmZhY2VOYW1lcygpOwotCWFzc2VydEVxdWFscygiWCRJbm5lciB0eXBlIHNob3VsZCBub3QgaGF2ZSBhIHN1cGVyaW50ZXJmYWNlIiwgMCwgc3VwZXJpbnRlcmZhY2VOYW1lcy5sZW5ndGgpOwotCWFzc2VydEVxdWFscygiRnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGlubmVyIHR5cGUgaXMgaW5jb3JyZWN0IiwgInAuWCRJbm5lciIsIHR5cGUyLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQlhc3NlcnRFcXVhbHMoIkRlY2xhcmluZyB0eXBlIG9mIHRoZSBpbm5lciB0eXBlIGlzIGluY29ycmVjdCIsIHR5cGUxLCB0eXBlMi5nZXREZWNsYXJpbmdUeXBlKCkpOwotCUlUeXBlIHR5cGUzID0gdHlwZTIuZ2V0VHlwZSgiSW5uZXJJbm5lciIpOwotCWFzc2VydFRydWUoIklubmVySW5uZXIgdHlwZSBzaG91bGQgbm90IGhhdmUgY2hpbGRyZW4iLCAhdHlwZTMuaGFzQ2hpbGRyZW4oKSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIG1ldGhvZCBoYXMgdGhlIGNvcnJlY3QgcmV0dXJuIHR5cGUsIHBhcmFtZXRlcnMgYW5kIGV4Y2VwdGlvbnMuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXRNZXRob2QoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gdGhpcy5jdS5nZXRUeXBlKCJYIik7Ci0JSU1ldGhvZCBmb28gPSB0eXBlLmdldE1ldGhvZCgiZm9vIiwgbmV3IFN0cmluZ1tdeyJRWTsifSk7Ci0JU3RyaW5nW10gZXhjZXB0aW9uVHlwZXM9IGZvby5nZXRFeGNlcHRpb25UeXBlcygpOwotCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIGV4Y2VwdGlvbiB0eXBlcyIsIDEsIGV4Y2VwdGlvblR5cGVzLmxlbmd0aCk7Ci0JYXNzZXJ0RXF1YWxzKCJVbnhlcGVjdGVkIGV4Y2VwdGlvbiB0eXBlIiwgIlFJT0V4Y2VwdGlvbjsiLCBleGNlcHRpb25UeXBlc1swXSk7Ci0JYXNzZXJ0RXF1YWxzKCJXcm9uZyByZXR1cm4gdHlwZSIsICJWIiwgZm9vLmdldFJldHVyblR5cGUoKSk7Ci0JU3RyaW5nW10gcGFyYW1ldGVyTmFtZXMgPSBmb28uZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBwYXJhbWV0ZXIgbmFtZXMiLCAxLCBwYXJhbWV0ZXJOYW1lcy5sZW5ndGgpOwotCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBwYXJhbWV0ZXIgbmFtZSIsICJ5IiwgcGFyYW1ldGVyTmFtZXNbMF0pOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgY29ycmVjdCBudW1iZXIgb2YgbWV0aG9kcyB3aXRoIHRoZSBjb3JyZWN0IG5hbWVzIGFuZCBtb2RpZmllcnMKLSAqIGV4aXN0IGluIGEgdHlwZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdEdldE1ldGhvZHMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gdGhpcy5jdS5nZXRUeXBlKCJYIik7Ci0JSU1ldGhvZFtdIG1ldGhvZHM9IHR5cGUuZ2V0TWV0aG9kcygpOwotCVN0cmluZ1tdIG1ldGhvZE5hbWVzID0gbmV3IFN0cmluZ1tdIHsiZm9vIiwgImJhciIsICJmcmVkIn07Ci0JU3RyaW5nW10gZmxhZ3MgPSBuZXcgU3RyaW5nW10geyJwdWJsaWMiLCAicHJvdGVjdGVkIHN0YXRpYyIsICJwcml2YXRlIn07Ci0JYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgbWV0aG9kcyByZXR1cm5lZCIsIG1ldGhvZE5hbWVzLmxlbmd0aCwgbWV0aG9kcy5sZW5ndGgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBuYW1lIGZvciB0aGUgIiArIGkgKyAiIG1ldGhvZCIsIG1ldGhvZE5hbWVzW2ldLCBtZXRob2RzW2ldLmdldEVsZW1lbnROYW1lKCkpOwotCQlTdHJpbmcgbW9kPSBGbGFncy50b1N0cmluZyhtZXRob2RzW2ldLmdldEZsYWdzKCkpOwotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbW9kaWZpZXIgZm9yICIgKyBtZXRob2RzW2ldLmdldEVsZW1lbnROYW1lKCksIGZsYWdzW2ldLCBtb2QpOwotCQlhc3NlcnRUcnVlKCJNZXRob2QgZG9lcyBub3QgZXhpc3QgIiArIG1ldGhvZHNbaV0sIG1ldGhvZHNbaV0uZXhpc3RzKCkpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGNvcnJlY3QgbW9kaWZpZXJzIGFyZSByZXBvcnRlZCBmb3IgYSBtZXRob2QgaW4gYW4gaW50ZXJmYWNlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q2hlY2tJbnRlcmZhY2VNZXRob2RNb2RpZmllcnMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gdGhpcy5jdS5nZXRUeXBlKCJJIik7Ci0JSU1ldGhvZCBtZXRob2QgPSB0eXBlLmdldE1ldGhvZCgicnVuIiwgbmV3IFN0cmluZ1swXSk7Ci0JU3RyaW5nIGV4cGVjdGVkTW9kaWZpZXJzID0gIiI7Ci0JU3RyaW5nIG1vZGlmaWVycyA9IEZsYWdzLnRvU3RyaW5nKG1ldGhvZC5nZXRGbGFncygpKTsKLQlhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIG1vZGlmaWVyIGZvciAiICsgbWV0aG9kLmdldEVsZW1lbnROYW1lKCksIGV4cGVjdGVkTW9kaWZpZXJzLCBtb2RpZmllcnMpOwotfQotLyoqCi0gKiBFbnN1cmUgdGhhdCA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZCBmb3IgdGhlIG9yaWdpbmFsIGFuZCBvcmlnaW5hbCBlbGVtZW50IG9mIGEKLSAqIGNvbXBpbGF0aW9uIHVuaXQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXRPcmlnaW5hbCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlKYXZhRWxlbWVudCBvcmlnaW5hbCA9IHRoaXMuY3UuZ2V0T3JpZ2luYWxFbGVtZW50KCk7Ci0JYXNzZXJ0VHJ1ZSgiT3JpZ2luYWwgZm9yIGEgY29tcGlsYXRpb24gdW5pdCBzaG91bGQgYmUgbnVsbCIsIG9yaWdpbmFsID09IG51bGwpOwotCW9yaWdpbmFsID0gdGhpcy5jdS5nZXRPcmlnaW5hbCh0aGlzLmN1KTsKLQlhc3NlcnRUcnVlKCJPcmlnaW5hbCBmb3IgYSBjb21waWxhdGlvbiB1bml0IHNob3VsZCBiZSBudWxsIiwgb3JpZ2luYWwgPT0gbnVsbCk7Ci0JCi19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBjb3JyZWN0IG51bWJlciBvZiBwYWNrYWdlIGRlY2xhcmF0aW9ucyB3aXRoIHRoZSBjb3JyZWN0IG5hbWVzCi0gKiBleGlzdCBhIGNvbXBpbGF0aW9uIHVuaXQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXRQYWNrYWdlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlQYWNrYWdlRGVjbGFyYXRpb25bXSBwYWNrYWdlcyA9IHRoaXMuY3UuZ2V0UGFja2FnZURlY2xhcmF0aW9ucygpOwotCVN0cmluZyBwYWNrYWdlTmFtZSA9ICJwIjsKLQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBwYWNrYWdlcyByZXR1cm5lZCIsIDEsIHBhY2thZ2VzLmxlbmd0aCk7Ci0JYXNzZXJ0RXF1YWxzKCJXcm9uZyBwYWNrYWdlIGRlY2xhcmF0aW9uIHJldHVybmVkOiAiLCBwYWNrYWdlTmFtZSwgcGFja2FnZXNbMF0uZ2V0RWxlbWVudE5hbWUoKSk7Ci19Ci0vKioKLSAqIEVuc3VyZSB0aGF0IHR5cGUgaGFuZGxlcyBhcmUgcmV0dXJuZWQgZnJvbSB0aGUKLSAqIGNvbXBpbGF0aW9uIHVuaXQuCi0gKiBDaGVja3Mgbm9uLWV4aXN0YW50IGhhbmRsZSBhbmQgZXhpc3RpbmcgaGFuZGxlcy4KLSAqLwotcHVibGljIHZvaWQgdGVzdEdldFR5cGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gdGhpcy5jdS5nZXRUeXBlKCJzb21lVHlwZSIpOwotCWFzc2VydFRydWUoIlR5cGUgc2hvdWxkIG5vdCBleGlzdCAiICsgdHlwZSwgIXR5cGUuZXhpc3RzKCkpOwotCQotCXR5cGUgPSB0aGlzLmN1LmdldFR5cGUoIlgiKTsKLQlhc3NlcnRUcnVlKCJUeXBlIHNob3VsZCBleGlzdCAiICsgdHlwZSwgdHlwZS5leGlzdHMoKSk7Ci0JCi0JdHlwZSA9IHRoaXMuY3UuZ2V0VHlwZSgiSSIpOyAvLyBzZWNvbmRhcnkgdHlwZQotCWFzc2VydFRydWUoIlR5cGUgc2hvdWxkIGV4aXN0ICIgKyB0eXBlLCB0eXBlLmV4aXN0cygpKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGNvcnJlY3QgbnVtYmVyIG9mIHR5cGVzIHdpdGggdGhlIGNvcnJlY3QgbmFtZXMgYW5kIG1vZGlmaWVycwotICogZXhpc3QgaW4gYSBjb21waWxhdGlvbiB1bml0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJVHlwZVtdIHR5cGVzID0gdGhpcy5jdS5nZXRUeXBlcygpOwotCVN0cmluZ1tdIHR5cGVOYW1lcyA9IG5ldyBTdHJpbmdbXSB7IlgiLCAiSSJ9OwotCVN0cmluZ1tdIGZsYWdzID0gbmV3IFN0cmluZ1tdIHsicHVibGljIiwgIiJ9OwotCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHR5cGVzIHJldHVybmVkIiwgdHlwZU5hbWVzLmxlbmd0aCwgdHlwZXMubGVuZ3RoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IG5hbWUgZm9yIHRoZSAiICsgaSArICIgdHlwZSIsIHR5cGVOYW1lc1tpXSwgdHlwZXNbaV0uZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCVN0cmluZyBtb2Q9IEZsYWdzLnRvU3RyaW5nKHR5cGVzW2ldLmdldEZsYWdzKCkpOwotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbW9kaWZpZXIgZm9yICIgKyB0eXBlc1tpXS5nZXRFbGVtZW50TmFtZSgpLCBmbGFnc1tpXSwgbW9kKTsKLQkJYXNzZXJ0VHJ1ZSgiVHlwZSBkb2VzIG5vdCBleGlzdCAiICsgdHlwZXNbaV0sIHR5cGVzW2ldLmV4aXN0cygpKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIGNvbXBpbGF0aW9uIHVuaXQgaGFzIGNoaWxkcmVuLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0SGFzQ2hpbGRyZW4oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQl0aGlzLmN1LmNsb3NlKCk7Ci0JYXNzZXJ0VHJ1ZSgiQSBjbG9zZWQgY29tcGlsYXRpb24gdW5pdCBzaG91bGQgaGF2ZSBjaGlsZHJlbiIsIHRoaXMuY3UuaGFzQ2hpbGRyZW4oKSk7Ci0JdGhpcy5jdS5nZXRDaGlsZHJlbigpOwotCWFzc2VydFRydWUoIlRoZSBjb21waWxhdGlvbiB1bml0IHNob3VsZCBoYXZlIGNoaWxkcmVuIiwgdGhpcy5jdS5oYXNDaGlsZHJlbigpKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgY29tcGlsYXRpb24gdW5pdCBpcyBub3QgYmFzZWQgb24gaXRzIHVuZGVybHlpbmcgcmVzb3VyY2UuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RJc0Jhc2VkT24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlhc3NlcnRUcnVlKAotCQkiQSBjb21waWxhdGlvbiB1bml0IHNob3VsZCBub3QgYmUgYmFzZWQgb24gYW55IHJlc291cmNlIiwgCi0JCSF0aGlzLmN1LmlzQmFzZWRPbih0aGlzLmN1LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpKSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIGNvbXBpbGF0aW9uIHVuaXQgdGhhdCBkb2VzIG5vdCBleGlzdCByZXNwb25kcwotICogZmFsc2UgdG8gI2V4aXN0cygpIGFuZCAjaXNPcGVuKCkKLSAqLwotcHVibGljIHZvaWQgdGVzdE5vdFByZXNlbnQxKCkgewotCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKChJUGFja2FnZUZyYWdtZW50KXRoaXMuY3UuZ2V0UGFyZW50KCkpLmdldENvbXBpbGF0aW9uVW5pdCgiRG9lc05vdEV4aXN0LmphdmEiKTsKLQlhc3NlcnRUcnVlKCJDVSBzaG91bGQgbm90IGJlIG9wZW4iLCAhY29tcGlsYXRpb25Vbml0LmlzT3BlbigpKTsKLQlhc3NlcnRUcnVlKCJDVSBzaG91bGQgbm90IGV4aXN0IiwgIWNvbXBpbGF0aW9uVW5pdC5leGlzdHMoKSk7Ci0JYXNzZXJ0VHJ1ZSgiQ1Ugc2hvdWxkIHN0aWxsIG5vdCBiZSBvcGVuIiwgIWNvbXBpbGF0aW9uVW5pdC5pc09wZW4oKSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIGNvbXBpbGF0aW9uIHVuaXQgdGhhdCBkb2VzIG5vdCBleGlzdAotICogKGJlY2F1c2UgaXQgaXMgYSBjaGlsZCBvZiBhIGphciBwYWNrYWdlIGZyYWdtZW50KQotICogcmVzcG9uZHMgZmFsc2UgdG8gI2V4aXN0cygpIGFuZCAjaXNPcGVuKCkKLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIFBSICMxRzJSS0QyKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0Tm90UHJlc2VudDIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBnZXRQYWNrYWdlRnJhZ21lbnQoIlAiLCBnZXRFeHRlcm5hbEpDTFBhdGhTdHJpbmcoKSwgImphdmEubGFuZyIpLmdldENvbXBpbGF0aW9uVW5pdCgiRG9lc05vdEV4aXN0LmphdmEiKTsKLQlhc3NlcnRUcnVlKCJDVSBzaG91bGQgbm90IGJlIG9wZW4iLCAhY29tcGlsYXRpb25Vbml0LmlzT3BlbigpKTsKLQlhc3NlcnRUcnVlKCJDVSBzaG91bGQgbm90IGV4aXN0IiwgIWNvbXBpbGF0aW9uVW5pdC5leGlzdHMoKSk7Ci0JYXNzZXJ0VHJ1ZSgiQ1Ugc2hvdWxkIHN0aWxsIG5vdCBiZSBvcGVuIiwgIWNvbXBpbGF0aW9uVW5pdC5pc09wZW4oKSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCB0aGUgInN0cnVjdHVyZSBpcyBrbm93biIgZmxhZyBpcyBzZXQgZm9yIGEgdmFsaWQgY29tcGlsYXRpb24gdW5pdC4gCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVLbm93bkZvckNVKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JYXNzZXJ0VHJ1ZSgiU3RydWN0dXJlIGlzIHVua25vd24gZm9yIHZhbGlkIENVIiwgdGhpcy5jdS5pc1N0cnVjdHVyZUtub3duKCkpOwotfQotLyoqCi0gKiAgRW5zdXJlcyB0aGF0IHRoZSAic3RydWN0dXJlIGlzIHVua25vd24iIGZsYWcgaXMgc2V0IGZvciBhIG5vbiB2YWxpZCBjb21waWxhdGlvbiB1bml0LiAKLSAqLwotcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZVVua25vd25Gb3JDVSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1Avc3JjL3AvSW52YWxpZC5qYXZhIiwKLQkJCSJAI0QoMDMiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBiYWRDVSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL3AvSW52YWxpZC5qYXZhIik7Ci0JCWFzc2VydFRydWUoIlN0cnVjdHVyZSBpcyBrbm93biBmb3IgYW4gaW52YWxpZCBDVSIsICFiYWRDVS5pc1N0cnVjdHVyZUtub3duKCkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlRmlsZSgiL1Avc3JjL3AvSW52YWxpZC5qYXZhIik7Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0NvbXBsZXRpb25UZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0NvbXBsZXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjBmMDdkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9Db21wbGV0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JVHlwZU5hbWVSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5SZWxldmFuY2VDb25zdGFudHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotcHVibGljIGNsYXNzIENvbXBsZXRpb25UZXN0cyBleHRlbmRzIEFic3RyYWN0SmF2YU1vZGVsVGVzdHMgaW1wbGVtZW50cyBSZWxldmFuY2VDb25zdGFudHMgewotCi1wdWJsaWMgQ29tcGxldGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRVcFN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0Jc3VwZXIuc2V0VXBTdWl0ZSgpOwotCQotCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gc2V0VXBKYXZhUHJvamVjdCgiQ29tcGxldGlvbiIpOwotCQotCS8vIGR1bW15IHF1ZXJ5IGZvciB3YWl0aW5nIHVudGlsIHRoZSBpbmRleGVzIGFyZSByZWFkeQotCVNlYXJjaEVuZ2luZSBlbmdpbmUgPSBuZXcgU2VhcmNoRW5naW5lKCk7Ci0JSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUobmV3IElKYXZhRWxlbWVudFtdIHtwcm9qZWN0fSk7Ci0JdHJ5IHsKLQkJZW5naW5lLnNlYXJjaEFsbFR5cGVOYW1lcygKLQkJCXByb2plY3QuZ2V0UHJvamVjdCgpLmdldFdvcmtzcGFjZSgpLAotCQkJbnVsbCwKLQkJCSIhQCQjIUAiLnRvQ2hhckFycmF5KCksCi0JCQlJSmF2YVNlYXJjaENvbnN0YW50cy5QQVRURVJOX01BVENILAotCQkJSUphdmFTZWFyY2hDb25zdGFudHMuQ0FTRV9TRU5TSVRJVkUsCi0JCQlJSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTUywKLQkJCXNjb3BlLCAKLQkJCW5ldyBJVHlwZU5hbWVSZXF1ZXN0b3IoKSB7Ci0JCQkJcHVibGljIHZvaWQgYWNjZXB0Q2xhc3MoCi0JCQkJCWNoYXJbXSBwYWNrYWdlTmFtZSwKLQkJCQkJY2hhcltdIHNpbXBsZVR5cGVOYW1lLAotCQkJCQljaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMsCi0JCQkJCVN0cmluZyBwYXRoKSB7fQotCQkJCXB1YmxpYyB2b2lkIGFjY2VwdEludGVyZmFjZSgKLQkJCQkJY2hhcltdIHBhY2thZ2VOYW1lLAotCQkJCQljaGFyW10gc2ltcGxlVHlwZU5hbWUsCi0JCQkJCWNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcywKLQkJCQkJU3RyaW5nIHBhdGgpIHt9Ci0JCQl9LAotCQkJSUphdmFTZWFyY2hDb25zdGFudHMuV0FJVF9VTlRJTF9SRUFEWV9UT19TRUFSQ0gsCi0JCQludWxsKTsKLQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci1wdWJsaWMgdm9pZCB0ZWFyRG93blN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JZGVsZXRlUHJvamVjdCgiQ29tcGxldGlvbiIpOwotCQotCXN1cGVyLnRlYXJEb3duU3VpdGUoKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFN1aXRlKENvbXBsZXRpb25UZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQotCS8vIGNvbXBsZXRpb24gdGVzdHMKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uQ2FzZUluc2Vuc2l0aXZlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25OdWxsUmVxdWVzdG9yIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25GaW5kRXhjZXB0aW9uczEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbkZpbmRFeGNlcHRpb25zMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uRmluZENsYXNzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25GaW5kQ2xhc3MyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25GaW5kQ2xhc3NEZWZhdWx0UGFja2FnZSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uRmluZENvbnN0cnVjdG9yIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25GaW5kRmllbGQxIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25GaW5kRmllbGQyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25GaW5kRmllbGQzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25GaW5kSW1wb3J0MSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uRmluZEltcG9ydDIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbkZpbmRMb2NhbFZhcmlhYmxlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25GaW5kTWVtYmVyVHlwZTEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbkZpbmRNZW1iZXJUeXBlMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uRmluZE1ldGhvZDEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbkZpbmRNZXRob2QyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25GaW5kTWV0aG9kSW5UaGlzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25GaW5kTWV0aG9kV2hlbkluUHJvY2VzcyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uRmluZFRoaXNEb3RGaWVsZCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uRW5kT2ZDb21waWxhdGlvblVuaXQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbk91dE9mQm91bmRzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25SZXBlYXRlZFR5cGUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbk9uQ2xhc3NGaWxlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25DYXNlSW5zZW5zaXRpdmVQYWNrYWdlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25GaW5kU3VwZXJJbnRlcmZhY2UiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvblZpc2liaWxpdHlDaGVja0VuYWJsZWQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvblZpc2liaWxpdHlDaGVja0Rpc2FibGVkIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25BbWJpZ3VvdXNGaWVsZE5hbWUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbkFtYmlndW91c0ZpZWxkTmFtZTIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbkFtYmlndW91c0ZpZWxkTmFtZTMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbkFtYmlndW91c0ZpZWxkTmFtZTQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvblByZWZpeEZpZWxkTmFtZTEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvblByZWZpeEZpZWxkTmFtZTIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvblByZWZpeE1ldGhvZE5hbWUxIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25QcmVmaXhNZXRob2ROYW1lMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uUHJlZml4TWV0aG9kTmFtZTMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbk1ldGhvZERlY2xhcmF0aW9uIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25NZXRob2REZWNsYXJhdGlvbjIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbk1ldGhvZERlY2xhcmF0aW9uMyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uTWV0aG9kRGVjbGFyYXRpb240IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25NZXRob2REZWNsYXJhdGlvbjUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbk1ldGhvZERlY2xhcmF0aW9uNiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uTWV0aG9kRGVjbGFyYXRpb243IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25NZXRob2REZWNsYXJhdGlvbjgiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbk1ldGhvZERlY2xhcmF0aW9uOSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uTWV0aG9kRGVjbGFyYXRpb24xMCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uRmllbGROYW1lIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25Mb2NhbE5hbWUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbkFyZ3VtZW50TmFtZSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uQ2F0Y2hBcmd1bWVudE5hbWUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbkNhdGNoQXJndW1lbnROYW1lMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uQW1iaWd1b3VzVHlwZSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uQW1iaWd1b3VzVHlwZTIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbldpdGhCaW5hcnlGb2xkZXIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvblZhcmlhYmxlTmFtZU9mQXJyYXkxIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25WYXJpYWJsZU5hbWVPZkFycmF5MiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uVmFyaWFibGVOYW1lT2ZBcnJheTMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvblZhcmlhYmxlTmFtZU9mQXJyYXk0IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25WYXJpYWJsZU5hbWVVbnJlc29sdmVkVHlwZSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uU2FtZVN1cGVyQ2xhc3MiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvblN1cGVyVHlwZSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uU3VwZXJUeXBlMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uU3VwZXJUeXBlMyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uU3VwZXJUeXBlNCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uU3VwZXJUeXBlNSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uU3VwZXJUeXBlNiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uU3VwZXJUeXBlNyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uU3VwZXJUeXBlOCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uTWV0aG9kVGhyb3dzQ2xhdXNlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25NZXRob2RUaHJvd3NDbGF1c2UyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25UaHJvd1N0YXRlbWVudCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uVW5yZXNvbHZlZFJldHVyblR5cGUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvblVucmVzb2x2ZWRQYXJhbWV0ZXJUeXBlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25VbnJlc29sdmVkRmllbGRUeXBlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25VbnJlc29sdmVkRW5jbG9zaW5nVHlwZSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uT2JqZWN0c01ldGhvZFdpdGhJbnRlcmZhY2VSZWNlaXZlciIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uQ29uc3RydWN0b3JGb3JBbm9ueW1vdXNUeXBlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25BYnN0cmFjdE1ldGhvZFJlbGV2YW5jZTEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbkFic3RyYWN0TWV0aG9kUmVsZXZhbmNlMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uUmV0dXJuSW5Jbml0aWFsaXplciIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uVmFyaWFibGVOYW1lMSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uVmFyaWFibGVOYW1lMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uVmFyaWFibGVOYW1lMyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uT25TdGF0aWNNZW1iZXIxIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25PblN0YXRpY01lbWJlcjIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbk1lbWJlclR5cGUyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25BZnRlckNhc2UxIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25BZnRlckNhc2UyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25Ub3BsZXZlbFR5cGUxIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25Mb2NhbFR5cGUxIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25UeXBlMSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uUXVhbGlmaWVkQWxsb2NhdGlvblR5cGUxIikpOwotCQotCS8vIGNvbXBsZXRpb24gZXhwZWN0ZWRUeXBlcyB0ZXN0cwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25SZXR1cm5TdGF0ZW1lbnRJc1BhcmVudDEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvblJldHVyblN0YXRlbWVudElzUGFyZW50MiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uQ2FzdElzUGFyZW50MSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uQ2FzdElzUGFyZW50MiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uTWVzc2FnZVNlbmRJc1BhcmVudDEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbk1lc3NhZ2VTZW5kSXNQYXJlbnQyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25NZXNzYWdlU2VuZElzUGFyZW50MyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uTWVzc2FnZVNlbmRJc1BhcmVudDQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbk1lc3NhZ2VTZW5kSXNQYXJlbnQ1IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25NZXNzYWdlU2VuZElzUGFyZW50NiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uQWxsb2NhdGlvbkV4cHJlc3Npb25Jc1BhcmVudDEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbkFsbG9jYXRpb25FeHByZXNzaW9uSXNQYXJlbnQyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25BbGxvY2F0aW9uRXhwcmVzc2lvbklzUGFyZW50MyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uQWxsb2NhdGlvbkV4cHJlc3Npb25Jc1BhcmVudDQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbkFsbG9jYXRpb25FeHByZXNzaW9uSXNQYXJlbnQ1IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25BbGxvY2F0aW9uRXhwcmVzc2lvbklzUGFyZW50NiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uRmllbGRJbml0aWFsaXplcjEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbkZpZWxkSW5pdGlhbGl6ZXIyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25GaWVsZEluaXRpYWxpemVyMyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uRmllbGRJbml0aWFsaXplcjQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvblZhcmlhYmxlSW5pdGlhbGl6ZXJJbkluaXRpYWxpemVyMSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uVmFyaWFibGVJbml0aWFsaXplckluSW5pdGlhbGl6ZXIyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25WYXJpYWJsZUluaXRpYWxpemVySW5Jbml0aWFsaXplcjMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvblZhcmlhYmxlSW5pdGlhbGl6ZXJJbkluaXRpYWxpemVyNCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uVmFyaWFibGVJbml0aWFsaXplckluTWV0aG9kMSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uVmFyaWFibGVJbml0aWFsaXplckluTWV0aG9kMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uVmFyaWFibGVJbml0aWFsaXplckluTWV0aG9kMyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uVmFyaWFibGVJbml0aWFsaXplckluTWV0aG9kNCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uQXNzaWdubWVudEluTWV0aG9kMSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uQXNzaWdubWVudEluTWV0aG9kMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uQXNzaWdubWVudEluTWV0aG9kMyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uQXNzaWdubWVudEluTWV0aG9kNCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uRW1wdHlUeXBlTmFtZTEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbkVtcHR5VHlwZU5hbWUyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25FeHBlY3RlZFR5cGVJc05vdFZhbGlkIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25NZW1iZXJUeXBlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25Wb2lkTWV0aG9kIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25RdWFsaWZpZWRFeHBlY3RlZFR5cGUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvblVuYXJ5T3BlcmF0b3IxIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25VbmFyeU9wZXJhdG9yMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uQmluYXJ5T3BlcmF0b3IxIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25CaW5hcnlPcGVyYXRvcjIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbkJpbmFyeU9wZXJhdG9yMyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uSW5zdGFuY2VvZk9wZXJhdG9yMSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uQ29uZGl0aW9uYWxFeHByZXNzaW9uMSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uQ29uZGl0aW9uYWxFeHByZXNzaW9uMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uQ29uZGl0aW9uYWxFeHByZXNzaW9uMyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uQXJyYXlBY2Nlc3MxIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25GaW5kU2Vjb25kYXJ5VHlwZTEiKSk7Ci0JCi0JLy8gY29tcGxldGlvbiBrZXl3b3JkcyB0ZXN0cwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkVGhpczEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRUaGlzMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFRoaXMzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkVGhpczQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRUaGlzNSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFRoaXM2IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkVGhpczciKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRUaGlzOCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFRoaXM5IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkVGhpczEwIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkVGhpczExIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkVGhpczEyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkVGhpczEzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkVGhpczE0IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkU3VwZXIxIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkU3VwZXIyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkU3VwZXIzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkU3VwZXI0IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkU3VwZXI1IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkU3VwZXI2IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkU3VwZXI3IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkU3VwZXI4IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkU3VwZXI5IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkU3VwZXIxMCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFN1cGVyMTEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRTdXBlcjEyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkVHJ5MSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFRyeTIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRUcnkzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkVHJ5NCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFRyeTUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRUcnk2IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkRG8xIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkRG8yIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkRG8zIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkRG80IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkRG81IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkRG82IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkRm9yMSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEZvcjIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRGb3IzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkRm9yNCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEZvcjUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRGb3I2IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkSWYxIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkSWYyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkSWYzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkSWY0IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkSWY1IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkSWY2IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkUmV0dXJuMSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFJldHVybjIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRSZXR1cm4zIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkUmV0dXJuNCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFJldHVybjUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRSZXR1cm42IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkU3dpdGNoMSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFN3aXRjaDIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRTd2l0Y2gzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkU3dpdGNoNCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFN3aXRjaDUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRTd2l0Y2g2IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkVGhyb3cxIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkVGhyb3cyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkVGhyb3czIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkVGhyb3c0IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkVGhyb3c1IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkVGhyb3c2IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkQXNzZXJ0MSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEFzc2VydDIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRBc3NlcnQzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkQXNzZXJ0NCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEFzc2VydDUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRBc3NlcnQ2IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkRWxzZTEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRFbHNlMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEVsc2UzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkRWxzZTQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRFbHNlNSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEVsc2U2IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkRWxzZTciKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRFbHNlOCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZENhdGNoMSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZENhdGNoMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZENhdGNoMyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZENhdGNoNCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZENhdGNoNSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZENhdGNoNiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZENhdGNoNyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZENhdGNoOCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZENhdGNoOCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZENhdGNoMTAiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRGaW5hbGx5MSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEZpbmFsbHkyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkRmluYWxseTMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRGaW5hbGx5NCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEZpbmFsbHk1IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkRmluYWxseTYiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRGaW5hbGx5NyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEZpbmFsbHk4IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkRmluYWxseTkiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRGaW5hbGx5MTAiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRGaW5hbGx5MTEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRGaW5hbGx5MTIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRGaW5hbGx5MTMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRGaW5hbGx5MTQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRDb250aW51ZTEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRDb250aW51ZTIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRDb250aW51ZTMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRDb250aW51ZTQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRCcmVhazEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRCcmVhazIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRCcmVhazMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRCcmVhazQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRCcmVhazUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRCcmVhazYiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRXaGlsZTEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRXaGlsZTIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRXaGlsZTMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRXaGlsZTQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRXaGlsZTUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRXaGlsZTYiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRXaGlsZTciKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRXaGlsZTgiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRXaGlsZTkiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRXaGlsZTEwIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkRXh0ZW5kczEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRFeHRlbmRzMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEV4dGVuZHMzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkRXh0ZW5kczQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRFeHRlbmRzNSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEV4dGVuZHM2IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkRXh0ZW5kczciKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRFeHRlbmRzOCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEV4dGVuZHM5IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkRXh0ZW5kczEwIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkSW1wbGVtZW50czEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRJbXBsZW1lbnRzMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEltcGxlbWVudHMzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkSW1wbGVtZW50czQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRJbXBsZW1lbnRzNSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEltcGxlbWVudHM2IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkUGFja2FnZTEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRQYWNrYWdlMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFBhY2thZ2UzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkUGFja2FnZTQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRQYWNrYWdlNSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFBhY2thZ2U2IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkUGFja2FnZTciKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRQYWNrYWdlOCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEltcG9ydDEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRJbXBvcnQyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkSW1wb3J0MyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEltcG9ydDQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRJbXBvcnQ1IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkSW1wb3J0NiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEltcG9ydDciKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRJbXBvcnQ4IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkQ2FzZTEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRDYXNlMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZENhc2UzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkQ2FzZTQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRDYXNlNSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZENhc2U2IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkQ2FzZTciKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRDYXNlOCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZENhc2U5IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkQ2FzZTEwIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkRGVmYXVsdDEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmREZWZhdWx0MiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZERlZmF1bHQzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkRGVmYXVsdDQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmREZWZhdWx0NSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZERlZmF1bHQ2IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkRGVmYXVsdDciKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmREZWZhdWx0OCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZERlZmF1bHQ5IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkRGVmYXVsdDEwIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkQ2xhc3MxIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkQ2xhc3MyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkQ2xhc3MzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkQ2xhc3M0IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkQ2xhc3M1IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkQ2xhc3M2IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkQ2xhc3M3IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkQ2xhc3M4IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkQ2xhc3M5IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkQ2xhc3MxMCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZENsYXNzMTEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRDbGFzczEyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkQ2xhc3MxMyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZENsYXNzMTQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRDbGFzczE1IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkQ2xhc3MxNiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZENsYXNzMTciKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRDbGFzczE4IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkQ2xhc3MxOSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZENsYXNzMjAiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRDbGFzczIxIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkQ2xhc3MyMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZENsYXNzMjMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRDbGFzczI0IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlMSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEludGVyZmFjZTIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlNCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEludGVyZmFjZTUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRJbnRlcmZhY2U2IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlNyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEludGVyZmFjZTgiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRJbnRlcmZhY2U5IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlMTAiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UxMSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEludGVyZmFjZTEyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlMTMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UxNCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEludGVyZmFjZTE1IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlMTYiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UxNyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEludGVyZmFjZTE4IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkVGhyb3dzMSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFRocm93czIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRUaHJvd3MzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkVGhyb3dzNCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFRocm93czUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRUaHJvd3M2IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkVGhyb3dzNyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFRocm93czgiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRTeW5jaHJvbml6ZWQxIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkU3luY2hyb25pemVkMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFN5bmNocm9uaXplZDMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRTeW5jaHJvbml6ZWQ0IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkU3luY2hyb25pemVkNSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFN5bmNocm9uaXplZDYiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRTeW5jaHJvbml6ZWQ3IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkU3luY2hyb25pemVkOCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFN5bmNocm9uaXplZDkiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRTeW5jaHJvbml6ZWQxMCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFN5bmNocm9uaXplZDExIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkU3luY2hyb25pemVkMTIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmROYXRpdmUxIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkTmF0aXZlMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZE5hdGl2ZTMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmROYXRpdmU0IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkTmF0aXZlNSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZE5hdGl2ZTYiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmROYXRpdmU3IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkTmF0aXZlOCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFN0cmljdGZwMSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFN0cmljdGZwMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFN0cmljdGZwMyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFN0cmljdGZwNCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFN0cmljdGZwNSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFN0cmljdGZwNiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFN0cmljdGZwNyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFN0cmljdGZwOCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFZvbGF0aWxlMSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFZvbGF0aWxlMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFZvbGF0aWxlMyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFZvbGF0aWxlNCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFZvbGF0aWxlNSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFZvbGF0aWxlNiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFZvbGF0aWxlNyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFZvbGF0aWxlOCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFRyYW5zaWVudDEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRUcmFuc2llbnQyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkVHJhbnNpZW50MyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFRyYW5zaWVudDQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRUcmFuc2llbnQ1IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkVHJhbnNpZW50NiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFRyYW5zaWVudDciKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRUcmFuc2llbnQ4IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkTmV3MSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZE5ldzIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmROZXczIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkTmV3NCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZE5ldzUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmROZXc2IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkTmV3NyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZE5ldzgiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmROZXc5IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkTmV3MTAiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmROZXcxMSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZE5ldzEyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkTmV3MTMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmROZXcxNCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZE5ldzE1IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkTmV3MTYiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRTdGF0aWMxIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkU3RhdGljMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFN0YXRpYzMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRTdGF0aWM0IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkU3RhdGljNSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFN0YXRpYzYiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRTdGF0aWM3IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkU3RhdGljOCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFN0YXRpYzkiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRTdGF0aWMxMCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFB1YmxpYzEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRQdWJsaWMyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkUHVibGljMyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFB1YmxpYzQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRQdWJsaWM1IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkUHVibGljNiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFB1YmxpYzciKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRQdWJsaWM4IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkUHVibGljOSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFB1YmxpYzEwIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkUHVibGljMTEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRQdWJsaWMxMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFB1YmxpYzEzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkUHVibGljMTQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRQdWJsaWMxNSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFB1YmxpYzE2IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkUHVibGljMTciKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRQdWJsaWMxOCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFB1YmxpYzE5IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkUHVibGljMjAiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRQcml2YXRlMSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFByaXZhdGUyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkUHJpdmF0ZTMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRQcml2YXRlNCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFByaXZhdGU1IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkUHJpdmF0ZTYiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRQcml2YXRlNyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFByaXZhdGU4IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkUHJpdmF0ZTkiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRQcml2YXRlMTAiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRQcm90ZWN0ZWQxIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkUHJvdGVjdGVkMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFByb3RlY3RlZDMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRQcm90ZWN0ZWQ0IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkUHJvdGVjdGVkNSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFByb3RlY3RlZDYiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRQcm90ZWN0ZWQ3IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkUHJvdGVjdGVkOCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFByb3RlY3RlZDkiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRQcm90ZWN0ZWQxMCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEZpbmFsMSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEZpbmFsMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEZpbmFsMyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEZpbmFsNCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEZpbmFsNSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEZpbmFsNiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEZpbmFsNyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEZpbmFsOCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEZpbmFsOSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEZpbmFsMTAiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRGaW5hbDExIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkRmluYWwxMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEZpbmFsMTMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRGaW5hbDE0IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkRmluYWwxNSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEZpbmFsMTYiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRGaW5hbDE3IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkRmluYWwxOCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEFic3RyYWN0MSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEFic3RyYWN0MiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEFic3RyYWN0MyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEFic3RyYWN0NCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEFic3RyYWN0NSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEFic3RyYWN0NiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEFic3RyYWN0NyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEFic3RyYWN0OCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEFic3RyYWN0OSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEFic3RyYWN0MTAiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRBYnN0cmFjdDExIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3QxMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEFic3RyYWN0MTMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRBYnN0cmFjdDE0IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3QxNSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEFic3RyYWN0MTYiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRUcnVlMSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZFRydWUyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkVHJ1ZTMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRUcnVlNCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEZhbHNlMSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEZhbHNlMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEZhbHNlMyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEZhbHNlNCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZE51bGwxIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkTnVsbDIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmROdWxsMyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZE51bGw0IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkSW5zdGFuY2VvZjEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRJbnN0YW5jZW9mMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEluc3RhbmNlb2YzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25LZXl3b3JkSW5zdGFuY2VvZjQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgQ29tcGxldGlvblRlc3RzKCJ0ZXN0Q29tcGxldGlvbktleXdvcmRJbnN0YW5jZW9mNSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uS2V5d29yZEluc3RhbmNlb2Y2IikpOwotCQotCS8vIGNvbXBsZXRpb24gdGVzdHMgd2l0aCBwb3NpdGlvbgotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0cygidGVzdENvbXBsZXRpb25Ob25FbXB0eVRva2VuMSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMoInRlc3RDb21wbGV0aW9uRW1wdHlUb2tlbjEiKSk7Ci0JCi0JcmV0dXJuIHN1aXRlOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgY29tcGxldGlvbiBpcyBub3QgY2FzZSBzZW5zaXRpdmUKLSAqLwotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25DYXNlSW5zZW5zaXRpdmUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uQ2FzZUluc2Vuc2l0aXZlLmphdmEiKTsKLQkKLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIkZpZWxkIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCQotCWFzc2VydEVxdWFscygic2hvdWxkIGhhdmUgb25lIGNsYXNzIiwKLQkJImVsZW1lbnQ6ZmllbGQgICAgY29tcGxldGlvbjpmaWVsZCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfTk9OX1NUQVRJQyArIFJfVU5RVUFMSUZJRUQpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLS8qKgotICogQ29tcGxldGUgYSBwYWNrYWdlIGluIGEgY2FzZSBpbnNlbnNpdGl2ZSB3YXkKLSAqLwotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25DYXNlSW5zZW5zaXRpdmVQYWNrYWdlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uQ2FzZUluc2Vuc2l0aXZlUGFja2FnZS5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIkphIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic2hvdWxkIGhhdmUgcGFja2FnZSBjb21wbGV0aW9ucyIsCi0JCSJlbGVtZW50OmphcnBhY2sxICAgIGNvbXBsZXRpb246amFycGFjazEgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcpKyJcbiIgKwotCQkiZWxlbWVudDpqYXJwYWNrMiAgICBjb21wbGV0aW9uOmphcnBhY2syICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HKSsiXG4iICsKLQkJImVsZW1lbnQ6amF2YSAgICBjb21wbGV0aW9uOmphdmEgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcpKyJcbiIgKwotCQkiZWxlbWVudDpqYXZhLmxhbmcgICAgY29tcGxldGlvbjpqYXZhLmxhbmcgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLQotLyoqCi0gKiBDb21wbGV0ZSBhdCBlbmQgb2YgZmlsZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25FbmRPZkNvbXBpbGF0aW9uVW5pdCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25FbmRPZkNvbXBpbGF0aW9uVW5pdC5qYXZhIik7Ci0JY3UuY29kZUNvbXBsZXRlKGN1LmdldFNvdXJjZVJhbmdlKCkuZ2V0T2Zmc2V0KCkgKyBjdS5nZXRTb3VyY2VSYW5nZSgpLmdldExlbmd0aCgpLCByZXF1ZXN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJInNob3VsZCBoYXZlIHR3byBtZXRob2RzIG9mICdmb28nIiwgCi0JCSJlbGVtZW50OmZvbyAgICBjb21wbGV0aW9uOmZvbygpICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWEFDVF9OQU1FICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50OmZvbyAgICBjb21wbGV0aW9uOmZvbygpICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWEFDVF9OQU1FICsgUl9VTlFVQUxJRklFRCksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwkKLX0KLQotLyoqCi0gKiBDb21wbGV0ZSB0aGUgdHlwZSAiQSIgZnJvbSAibmV3IEEiLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbkZpbmRDbGFzcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvbkZpbmRDbGFzcy5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIkEiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic2hvdWxkIGhhdmUgb25lIGNsYXNzIiwKLQkJImVsZW1lbnQ6QSAgICBjb21wbGV0aW9uOkEgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0VYQUNUX05BTUUgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6QTEgICAgY29tcGxldGlvbjpBMSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDpBMiAgICBjb21wbGV0aW9uOkEyICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50OkEzICAgIGNvbXBsZXRpb246QTMgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6QUJDICAgIGNvbXBsZXRpb246cDEuQUJDICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSsiXG4iICsKLQkJImVsZW1lbnQ6QUJDICAgIGNvbXBsZXRpb246cDIuQUJDICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7CQotfQotCi0vKioKLSAqIFRoZSBzYW1lIHR5cGUgbXVzdCBiZSBmaW5kIG9ubHkgb25jZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbkZpbmRDbGFzczIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25GaW5kQ2xhc3MyLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiUFgiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCWFzc2VydEVxdWFscygKLQkJInNob3VsZCBoYXZlIG9uZSBjbGFzc2UiLCAKLQkJImVsZW1lbnQ6UFggICAgY29tcGxldGlvbjpwYWNrMS5QWCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhBQ1RfTkFNRSksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi0KLS8qKgotICogQ29tcGxldGUgdGhlIHR5cGUgIkRlZmF1bHQiIGluIHRoZSBkZWZhdWx0IHBhY2thZ2UgZXhhbXBsZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25GaW5kQ2xhc3NEZWZhdWx0UGFja2FnZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvbkRlZmF1bHRQYWNrYWdlLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiRGVmIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkic2hvdWxkIGhhdmUgb25lIGNsYXNzIiwgCi0JCSJlbGVtZW50OkRlZmF1bHQgICAgY29tcGxldGlvbjpEZWZhdWx0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwkKLX0KLQotLyoqCi0gKiBDb21wbGV0ZSB0aGUgY29uc3RydWN0b3IgIkNvbXBsZXRpb25GaW5kQ29uc3RydWN0b3IiIGZyb20gIm5ldyBDb21wbGV0aW9uRmluZENvbnN0cnVjdG9yKCIuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uRmluZENvbnN0cnVjdG9yKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uRmluZENvbnN0cnVjdG9yLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiQ29tcGxldGlvbkZpbmRDb25zdHJ1Y3RvcigiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic2hvdWxkIGhhdmUgdHdvIGNvbnN0cnVjdG9yIChhIGNvbnN0cnVjdG9yIGFuZCBhbiBhbm9ueW1vdXMgdHlwZSkiLCAKLQkJImVsZW1lbnQ6Q29tcGxldGlvbkZpbmRDb25zdHJ1Y3RvciAgICBjb21wbGV0aW9uOikgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcpKyJcbiIgKwotCQkiZWxlbWVudDpDb21wbGV0aW9uRmluZENvbnN0cnVjdG9yICAgIGNvbXBsZXRpb246KSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi0vKioKLSAqIENvbXBsZXRlIHRoZSBleGNlcHRpb24gIkV4Y2VwdGlvbiIgaW4gYSBjYXRjaCBjbGF1c2UuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uRmluZEV4Y2VwdGlvbnMxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uRmluZEV4Y2VwdGlvbjEuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJFeCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSBvbmUgY2xhc3MiLCAKLQkJImVsZW1lbnQ6RXhjZXB0aW9uICAgIGNvbXBsZXRpb246RXhjZXB0aW9uICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWENFUFRJT04gKyBSX1VOUVVBTElGSUVEKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLS8qKgotICogQ29tcGxldGUgdGhlIGV4Y2VwdGlvbiAiRXhjZXB0aW9uIiBpbiBhIHRocm93cyBjbGF1c2UuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uRmluZEV4Y2VwdGlvbnMyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uRmluZEV4Y2VwdGlvbjIuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJFeCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCWFzc2VydEVxdWFscygKLQkJInNob3VsZCBoYXZlIG9uZSBjbGFzcyIsCi0JCSJlbGVtZW50OkV4Y2VwdGlvbiAgICBjb21wbGV0aW9uOkV4Y2VwdGlvbiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhDRVBUSU9OICsgUl9VTlFVQUxJRklFRCksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi0vKioKLSAqIENvbXBsZXRlIHRoZSBmaWVsZCAidmFyIiBmcm9tICJ2YSI7Ci0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uRmluZEZpZWxkMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvbkZpbmRGaWVsZDEuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ2YSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSBvbmUgZmllbGQ6ICd2YXInIGFuZCBvbmUgdmFyaWFibGU6ICd2YXInIiwgCi0JCSJlbGVtZW50OnZhciAgICBjb21wbGV0aW9uOnRoaXMudmFyICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWEFDVF9FWFBFQ1RFRF9UWVBFKSsiXG4iKwotCQkiZWxlbWVudDp2YXIgICAgY29tcGxldGlvbjp2YXIgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0VYQUNUX0VYUEVDVEVEX1RZUEUgKyBSX1VOUVVBTElGSUVEKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7CQotfQotCi0vKioKLSAqIENvbXBsZXRlIHRoZSBmaWVsZCAidmFyIiBmcm9tICJ0aGlzLnZhIjsKLSAqLwotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25GaW5kRmllbGQyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uRmluZEZpZWxkMi5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInZhIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCQotCWFzc2VydEVxdWFscygKLQkJInNob3VsZCBoYXZlIDEgZmllbGQgb2Ygc3RhcnRpbmcgd2l0aCAndmEnIiwKLQkJImVsZW1lbnQ6dmFyICAgIGNvbXBsZXRpb246dmFyICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9OT05fU1RBVElDICsgUl9VTlFVQUxJRklFRCksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbkZpbmRGaWVsZDMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25GaW5kRmllbGQzLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYi5iYSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCWFzc2VydEVxdWFscygKLQkJImVsZW1lbnQ6YmFyICAgIGNvbXBsZXRpb246YmFyICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi0vKioKLSAqIENvbXBsZXRlIHRoZSBpbXBvcnQsICJpbXBvcnQgcGFjIgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbkZpbmRJbXBvcnQxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uRmluZEltcG9ydDEuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJwYWMiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSB0aHJlZSBpbXBvcnRzIFwicGFjazFcIiAmIFwicGFjazFcIiAmIFwicGFjazEucGFjazNcIiAmIFwicGFjazJcIiIsIAotCQkiZWxlbWVudDpwYWNrICAgIGNvbXBsZXRpb246cGFjay4qOyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSkrIlxuIisKLQkJImVsZW1lbnQ6cGFjazEgICAgY29tcGxldGlvbjpwYWNrMS4qOyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSkrIlxuIisKLQkJImVsZW1lbnQ6cGFjazEucGFjazMgICAgY29tcGxldGlvbjpwYWNrMS5wYWNrMy4qOyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSkrIlxuIisKLQkJImVsZW1lbnQ6cGFjazIgICAgY29tcGxldGlvbjpwYWNrMi4qOyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbkZpbmRJbXBvcnQyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uRmluZEltcG9ydDIuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJwYWNrMS5QIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkic2hvdWxkIGhhdmUgc2l4IGNvbXBsZXRpb25zIiwKLQkJImVsZW1lbnQ6UFggICAgY29tcGxldGlvbjpwYWNrMS5QWDsgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpKyJcbiIrCi0JCSJlbGVtZW50OnBhY2sxLnBhY2szICAgIGNvbXBsZXRpb246cGFjazEucGFjazMuKjsgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLQotLyoqCi0gKiBDb21wbGV0ZSB0aGUgbG9jYWwgdmFyaWFibGUgInZhciI7Ci0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uRmluZExvY2FsVmFyaWFibGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25GaW5kTG9jYWxWYXJpYWJsZS5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInZhIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJInNob3VsZCBoYXZlIG9uZSBsb2NhbCB2YXJpYWJsZSBvZiAndmFyJyIsIAotCQkiZWxlbWVudDp2YXIgICAgY29tcGxldGlvbjp2YXIgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0VYQUNUX0VYUEVDVEVEX1RZUEUgKyBSX1VOUVVBTElGSUVEKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7CQotfQotCi0vKioKLSAqIENvbXBsZXRlIHRoZSBtZXRob2QgY2FsbCAiYS5mb29iYXIiIGZyb20gImEuZm9vYmEiOwotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbkZpbmRNZXRob2QxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uRmluZE1ldGhvZDEuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmb29iYSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSB0d28gbWV0aG9kcyBvZiAnZm9vYmFyJyIsIAotCQkiZWxlbWVudDpmb29iYXIgICAgY29tcGxldGlvbjpmb29iYXIoKSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfTk9OX1NUQVRJQyArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDpmb29iYXIgICAgY29tcGxldGlvbjpmb29iYXIoKSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfTk9OX1NUQVRJQyArIFJfVU5RVUFMSUZJRUQpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsJCQotfQotCi0KLS8qKgotICogVG9vIG11Y2ggQ29tcGxldGlvbiBtYXRjaCBvbiBpbnRlcmZhY2UKLSAqLwotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25GaW5kTWV0aG9kMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvbkZpbmRNZXRob2QyLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZm9vYmEiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5pbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCWFzc2VydEVxdWFscygKLQkJInNob3VsZCBoYXZlIHR3byBjb21wbGV0aW9ucyIsIAotCQkiZWxlbWVudDpmb29iYXIgICAgY29tcGxldGlvbjpmb29iYXIoKSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfTk9OX1NUQVRJQyArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDpmb29iYXIgICAgY29tcGxldGlvbjpmb29iYXIoKSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfTk9OX1NUQVRJQyArIFJfVU5RVUFMSUZJRUQpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsJCi19Ci0KLQotLyoqCi0gKiBDb21wbGV0ZSB0aGUgbWV0aG9kIGNhbGwgImZvb2JhciIgZnJvbSAiZm9vYmEiOwotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbkZpbmRNZXRob2RJblRoaXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25GaW5kTWV0aG9kSW5UaGlzLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZm9vYmEiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic2hvdWxkIGhhdmUgb25lIG1ldGhvZCBvZiAnZm9vYmFyJyIsIAotCQkiZWxlbWVudDpmb29iYXIgICAgY29tcGxldGlvbjpmb29iYXIgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7CQkKLX0KLQotLyoqCi0gKiBDb21wbGV0ZSB0aGUgbWV0aG9kIGNhbGwgImZvb2JhciIgZnJvbSAiZm9vYmEiLiAgVGhlIGNvbXBpbGF0aW9uCi0gKiB1bml0IHNpbXVsYXRlcyB0eXBpbmcgaW4gcHJvY2VzczsgaWUgaXQgaGFzIGluY29tcGxldGUgc3RydWN0dXJlL3N5bnRheCBlcnJvcnMuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uRmluZE1ldGhvZFdoZW5JblByb2Nlc3MoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25GaW5kTWV0aG9kSW5Qcm9jZXNzLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZm9vYmEiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic2hvdWxkIGhhdmUgYSBtZXRob2Qgb2YgJ2Zvb2JhciciLCAKLQkJImVsZW1lbnQ6Zm9vYmFyICAgIGNvbXBsZXRpb246Zm9vYmFyKCkgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci0JY3UuY2xvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25GaW5kU3VwZXJJbnRlcmZhY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25GaW5kU3VwZXJJbnRlcmZhY2UuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJTdXBlciI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQkJCi0JYXNzZXJ0RXF1YWxzKAotCQkiZWxlbWVudDpTdXBlckNsYXNzICAgIGNvbXBsZXRpb246U3VwZXJDbGFzcyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIrCi0JCSJlbGVtZW50OlN1cGVySW50ZXJmYWNlICAgIGNvbXBsZXRpb246U3VwZXJJbnRlcmZhY2UgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0lOVEVSRkFDRSArIFJfVU5RVUFMSUZJRUQpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLQotLyoqCi0gKiBDb21wbGV0ZSB0aGUgZmllbGQgImJhciIgZnJvbSAidGhpcy5iYSIKLSAqLwotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25GaW5kVGhpc0RvdEZpZWxkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uRmluZFRoaXNEb3RGaWVsZC5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRoaXMuYmEiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic2hvdWxkIGhhdmUgb25lIHJlc3VsdCBvZiAnYmFyJyIsIAotCQkiZWxlbWVudDpiYXIgICAgY29tcGxldGlvbjpiYXIgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX05PTl9TVEFUSUMgKyBSX1VOUVVBTElGSUVEKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLS8qKgotICogQXR0ZW1wdCB0byBkbyBjb21wbGV0aW9uIHdpdGggYSBudWxsIHJlcXVlc3RvcgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbk51bGxSZXF1ZXN0b3IoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uRmluZFRoaXNEb3RGaWVsZC5qYXZhIik7Ci0JCWN1LmNvZGVDb21wbGV0ZSg1LCAoSUNvbXBsZXRpb25SZXF1ZXN0b3IpbnVsbCk7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgewotCQlyZXR1cm47Ci0JfQotCWFzc2VydFRydWUoIlNob3VsZCBub3QgYmUgYWJsZSB0byBkbyBjb21wbGV0aW9uIHdpdGggYSBudWxsIHJlcXVlc3RvciIsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgdGhlIGNvZGUgYXNzaXN0IGZlYXR1cmVzIHdvcmtzIG9uIGNsYXNzIGZpbGVzIHdpdGggYXNzb2NpYXRlZCBzb3VyY2UuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uT25DbGFzc0ZpbGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDbGFzc0ZpbGUgY3UgPSBnZXRDbGFzc0ZpbGUoIkNvbXBsZXRpb24iLCAienp6LmphciIsICJqYXJwYWNrMSIsICJYLmNsYXNzIik7Ci0JCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJPYmoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic2hvdWxkIGhhdmUgb25lIGNsYXNzIiwgCi0JCSJlbGVtZW50Ok9iamVjdCAgICBjb21wbGV0aW9uOk9iamVjdCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLQotLyoqCi0gKiBUZXN0IHRoYXQgYW4gb3V0IG9mIGJvdW5kcyBpbmRleCBjYXVzZXMgYW4gZXhjZXB0aW9uLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbk91dE9mQm91bmRzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uT3V0T2ZCb3VuZHMuamF2YSIpOwotCXRyeSB7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdS5nZXRTb3VyY2UoKS5sZW5ndGgoKSArIDEsIHJlcXVlc3Rvcik7Ci0JfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIGJlIG91dCBvZiBib3VuZHMiLCBlLmdldFN0YXR1cygpLmdldENvZGUoKSA9PSBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOREVYX09VVF9PRl9CT1VORFMpOwotCQlyZXR1cm47Ci0JfQotCWFzc2VydFRydWUoInNob3VsZCBoYXZlIGZhaWxlZCIsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBDb21wbGV0ZSB0aGUgdHlwZSAiUmVwZWF0ZWQiLCAiUmVwZWF0ZWRPdGhlclR5cGUgZnJvbSAiUmVwZWF0ZWQiLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvblJlcGVhdGVkVHlwZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvblJlcGVhdGVkVHlwZS5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIi8qKi9Db21wbGV0aW9uUmVwZWF0ZWQiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic2hvdWxkIGhhdmUgdHdvIHR5cGVzIiwKLQkJImVsZW1lbnQ6Q29tcGxldGlvblJlcGVhdGVkT3RoZXJUeXBlICAgIGNvbXBsZXRpb246Q29tcGxldGlvblJlcGVhdGVkT3RoZXJUeXBlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50OkNvbXBsZXRpb25SZXBlYXRlZFR5cGUgICAgY29tcGxldGlvbjpDb21wbGV0aW9uUmVwZWF0ZWRUeXBlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwkKLX0KLQotCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvblZpc2liaWxpdHlDaGVja0VuYWJsZWQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlTdHJpbmcgdmlzaWJpbGl0eUNoZWNrSUQgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnZpc2liaWxpdHlDaGVjayI7Ci0JSGFzaHRhYmxlIG9wdGlvbnMgPSBKYXZhQ29yZS5nZXRPcHRpb25zKCk7Ci0JT2JqZWN0IHZpc2liaWxpdHlDaGVja1ByZXZpb3VzVmFsdWUgPSBvcHRpb25zLmdldCh2aXNpYmlsaXR5Q2hlY2tJRCk7Ci0Jb3B0aW9ucy5wdXQodmlzaWJpbGl0eUNoZWNrSUQsImVuYWJsZWQiKTsKLQlKYXZhQ29yZS5zZXRPcHRpb25zKG9wdGlvbnMpOwotCQotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvblZpc2liaWxpdHlDaGVjay5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIngucCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCQotCW9wdGlvbnMucHV0KHZpc2liaWxpdHlDaGVja0lELHZpc2liaWxpdHlDaGVja1ByZXZpb3VzVmFsdWUpOwotCUphdmFDb3JlLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic2hvdWxkIGhhdmUgdHdvIG1ldGhvZHMiLCAKLQkJImVsZW1lbnQ6cHJvdGVjdGVkRm9vICAgIGNvbXBsZXRpb246cHJvdGVjdGVkRm9vKCkgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX05PTl9TVEFUSUMgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6cHVibGljRm9vICAgIGNvbXBsZXRpb246cHVibGljRm9vKCkgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX05PTl9TVEFUSUMgKyBSX1VOUVVBTElGSUVEKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25WaXNpYmlsaXR5Q2hlY2tEaXNhYmxlZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCVN0cmluZyB2aXNpYmlsaXR5Q2hlY2tJRCA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUudmlzaWJpbGl0eUNoZWNrIjsKLQlIYXNodGFibGUgb3B0aW9ucyA9IEphdmFDb3JlLmdldE9wdGlvbnMoKTsKLQlPYmplY3QgdmlzaWJpbGl0eUNoZWNrUHJldmlvdXNWYWx1ZSA9IG9wdGlvbnMuZ2V0KHZpc2liaWxpdHlDaGVja0lEKTsKLQlvcHRpb25zLnB1dCh2aXNpYmlsaXR5Q2hlY2tJRCwiZGlzYWJsZWQiKTsKLQlKYXZhQ29yZS5zZXRPcHRpb25zKG9wdGlvbnMpOwotCQotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvblZpc2liaWxpdHlDaGVjay5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIngucCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCQotCW9wdGlvbnMucHV0KHZpc2liaWxpdHlDaGVja0lELHZpc2liaWxpdHlDaGVja1ByZXZpb3VzVmFsdWUpOwotCUphdmFDb3JlLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic2hvdWxkIGhhdmUgdGhyZWUgbWV0aG9kcyIsIAotCQkiZWxlbWVudDpwcml2YXRlRm9vICAgIGNvbXBsZXRpb246cHJpdmF0ZUZvbygpICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9OT05fU1RBVElDICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50OnByb3RlY3RlZEZvbyAgICBjb21wbGV0aW9uOnByb3RlY3RlZEZvbygpICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9OT05fU1RBVElDICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50OnB1YmxpY0ZvbyAgICBjb21wbGV0aW9uOnB1YmxpY0ZvbygpICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9OT05fU1RBVElDICsgUl9VTlFVQUxJRklFRCksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbkFtYmlndW91c0ZpZWxkTmFtZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCi0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uQW1iaWd1b3VzRmllbGROYW1lLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAieEJhIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkic2hvdWxkIGhhdmUgdHdvIGNvbXBsZXRpb25zIiwgCi0JCSJlbGVtZW50OnhCYXIgICAgY29tcGxldGlvbjp0aGlzLnhCYXIgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpKyJcbiIgKwotCQkiZWxlbWVudDp4QmFyICAgIGNvbXBsZXRpb246eEJhciAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25BbWJpZ3VvdXNGaWVsZE5hbWUyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0KLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25BbWJpZ3VvdXNGaWVsZE5hbWUyLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAieEJhIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkic2hvdWxkIGhhdmUgdHdvIGNvbXBsZXRpb25zIiwgCi0JCSJlbGVtZW50OnhCYXIgICAgY29tcGxldGlvbjpDb21wbGV0aW9uQW1iaWd1b3VzRmllbGROYW1lMi50aGlzLnhCYXIgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpKyJcbiIrCi0JCSJlbGVtZW50OnhCYXIgICAgY29tcGxldGlvbjp4QmFyICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbkFtYmlndW91c0ZpZWxkTmFtZTMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvbkFtYmlndW91c0ZpZWxkTmFtZTMuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ4QmEiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSB0d28gY29tcGxldGlvbnMiLCAKLQkJImVsZW1lbnQ6eEJhciAgICBjb21wbGV0aW9uOkNsYXNzRm9vLnRoaXMueEJhciAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSkrIlxuIiArCi0JCSJlbGVtZW50OnhCYXIgICAgY29tcGxldGlvbjp4QmFyICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uQW1iaWd1b3VzRmllbGROYW1lNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCi0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uQW1iaWd1b3VzRmllbGROYW1lNC5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInhCYSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCWFzc2VydEVxdWFscygKLQkJInNob3VsZCBoYXZlIG9uZSBjb21wbGV0aW9uIiwgCi0JCSJlbGVtZW50OnhCYXIgICAgY29tcGxldGlvbjp4QmFyICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uUHJlZml4RmllbGROYW1lMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCi0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uUHJlZml4RmllbGROYW1lMS5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInhCYSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCWFzc2VydEVxdWFscygKLQkJInNob3VsZCBoYXZlIHR3byBjb21wbGV0aW9ucyIsIAotCQkiZWxlbWVudDp4QmFyICAgIGNvbXBsZXRpb246Q29tcGxldGlvblByZWZpeEZpZWxkTmFtZTEudGhpcy54QmFyICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSsiXG4iICsKLQkJImVsZW1lbnQ6eEJhciAgICBjb21wbGV0aW9uOnhCYXIgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25QcmVmaXhGaWVsZE5hbWUyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0KLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25QcmVmaXhGaWVsZE5hbWUyLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAieEJhIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkic2hvdWxkIGhhdmUgb25lIGNvbXBsZXRpb24iLCAKLQkJImVsZW1lbnQ6eEJhciAgICBjb21wbGV0aW9uOnhCYXIgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX05PTl9TVEFUSUMgKyBSX1VOUVVBTElGSUVEKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25QcmVmaXhNZXRob2ROYW1lMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCi0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uUHJlZml4TWV0aG9kTmFtZTEuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ4QmEiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSB0d28gY29tcGxldGlvbnMiLCAKLQkJImVsZW1lbnQ6eEJhciAgICBjb21wbGV0aW9uOkNvbXBsZXRpb25QcmVmaXhNZXRob2ROYW1lMS50aGlzLnhCYXIoKSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSkrIlxuIiArCi0JCSJlbGVtZW50OnhCYXIgICAgY29tcGxldGlvbjp4QmFyKCkgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25QcmVmaXhNZXRob2ROYW1lMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCi0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uUHJlZml4TWV0aG9kTmFtZTIuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ4QmEiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSBvbmUgY29tcGxldGlvbiIsIAotCQkiZWxlbWVudDp4QmFyICAgIGNvbXBsZXRpb246eEJhcigpICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9OT05fU1RBVElDICsgUl9VTlFVQUxJRklFRCksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvblByZWZpeE1ldGhvZE5hbWUzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0KLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25QcmVmaXhNZXRob2ROYW1lMy5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInhCYXIoMSwiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSBvbmUgY29tcGxldGlvbiIsIAotCQkiZWxlbWVudDp4QmFyICAgIGNvbXBsZXRpb246ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWEFDVF9OQU1FICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50OnhCYXIgICAgY29tcGxldGlvbjpDb21wbGV0aW9uUHJlZml4TWV0aG9kTmFtZTMudGhpcy54QmFyKDEsICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWEFDVF9OQU1FKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uRmluZE1lbWJlclR5cGUxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uRmluZE1lbWJlclR5cGUxLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiSW5uZXIiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJlbGVtZW50OkIxLklubmVyMSAgICBjb21wbGV0aW9uOklubmVyMSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbkZpbmRNZW1iZXJUeXBlMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvbkZpbmRNZW1iZXJUeXBlMi5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIklubmVyIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiZWxlbWVudDpCMi5Jbm5lcjIgICAgY29tcGxldGlvbjpJbm5lcjIgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25NZXRob2REZWNsYXJhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCi0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uTWV0aG9kRGVjbGFyYXRpb24uamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJlcSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkic2hvdWxkIGhhdmUgdHdvIGNvbXBsZXRpb25zIiwgCi0JCSJlbGVtZW50OmVxRm9vICAgIGNvbXBsZXRpb246cHVibGljIGludCBlcUZvbyhpbnQgYSxPYmplY3QgYikgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpKyJcbiIgKwotCQkiZWxlbWVudDplcXVhbHMgICAgY29tcGxldGlvbjpwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25NZXRob2REZWNsYXJhdGlvbjIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvbk1ldGhvZERlY2xhcmF0aW9uMi5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImVxIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSB0d28gY29tcGxldGlvbnMiLCAKLQkJImVsZW1lbnQ6ZXFGb28gICAgY29tcGxldGlvbjpwdWJsaWMgaW50IGVxRm9vKGludCBhLE9iamVjdCBiKSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSkrIlxuIiArCi0JCSJlbGVtZW50OmVxdWFscyAgICBjb21wbGV0aW9uOnB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi0vKioKLSAqIENvbXBsZXRpb24gc2hvdWxkIG5vdCBwcm9wb3NlIGRlY2xhcmF0aW9ucyBvZiBtZXRob2QgYWxyZWFkeSBsb2NhbGx5IGltcGxlbWVudGVkCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uTWV0aG9kRGVjbGFyYXRpb24zKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0KLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25NZXRob2REZWNsYXJhdGlvbjMuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJlcSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkic2hvdWxkIGhhdmUgb25lIGNvbXBsZXRpb24iLCAKLQkJImVsZW1lbnQ6ZXF1YWxzICAgIGNvbXBsZXRpb246cHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25NZXRob2REZWNsYXJhdGlvbjQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvbk1ldGhvZERlY2xhcmF0aW9uNC5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImVxIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIuaW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSBvbmUgY29tcGxldGlvbiIsIAotCQkiZWxlbWVudDplcUZvbyAgICBjb21wbGV0aW9uOnB1YmxpYyBpbnQgZXFGb28oaW50IGEsT2JqZWN0IGIpICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9BQlNUUkFDVF9NRVRIT0QpKyJcbiIrCi0JCSJlbGVtZW50OmVxdWFscyAgICBjb21wbGV0aW9uOnB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbk1ldGhvZERlY2xhcmF0aW9uNSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCi0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uTWV0aG9kRGVjbGFyYXRpb241LmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibmV3IENvbXBsZXRpb25TdXBlckNsYXNzKCkgeyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkic2hvdWxkIGhhdmUgb25lIGNvbXBsZXRpb24iLCAKLQkJImVsZW1lbnQ6Q29tcGxldGlvbk1ldGhvZERlY2xhcmF0aW9uNSAgICBjb21wbGV0aW9uOkNvbXBsZXRpb25NZXRob2REZWNsYXJhdGlvbjUgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iKwotCQkiZWxlbWVudDpjbG9uZSAgICBjb21wbGV0aW9uOnByb3RlY3RlZCBPYmplY3QgY2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpKyJcbiIrCi0JCSJlbGVtZW50OmVxRm9vICAgIGNvbXBsZXRpb246cHVibGljIGludCBlcUZvbyhpbnQgYSxPYmplY3QgYikgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpKyJcbiIrCi0JCSJlbGVtZW50OmVxdWFscyAgICBjb21wbGV0aW9uOnB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSkrIlxuIisKLQkJImVsZW1lbnQ6ZmluYWxpemUgICAgY29tcGxldGlvbjpwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpKyJcbiIrCi0JCSJlbGVtZW50Omhhc2hDb2RlICAgIGNvbXBsZXRpb246cHVibGljIGludCBoYXNoQ29kZSgpICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSsiXG4iKwotCQkiZWxlbWVudDp0b1N0cmluZyAgICBjb21wbGV0aW9uOnB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbk1ldGhvZERlY2xhcmF0aW9uNigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCi0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uTWV0aG9kRGVjbGFyYXRpb242LmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2xvbiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCWFzc2VydEVxdWFscygKLQkJInNob3VsZCBoYXZlIG9uZSBjb21wbGV0aW9uIiwgCi0JCSJlbGVtZW50OkNsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uICAgIGNvbXBsZXRpb246Q2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX1VOUVVBTElGSUVEKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uTWV0aG9kRGVjbGFyYXRpb243KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0KLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25NZXRob2REZWNsYXJhdGlvbjcuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJjbG9uIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkic2hvdWxkIGhhdmUgb25lIGNvbXBsZXRpb24iLCAKLQkJImVsZW1lbnQ6Q2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gICAgY29tcGxldGlvbjpDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpKyJcbiIrCi0JCSJlbGVtZW50OmNsb25lICAgIGNvbXBsZXRpb246cHJvdGVjdGVkIE9iamVjdCBjbG9uZSgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbk1ldGhvZERlY2xhcmF0aW9uOCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCi0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uTWV0aG9kRGVjbGFyYXRpb244LmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2xvbiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCWFzc2VydEVxdWFscygKLQkJInNob3VsZCBoYXZlIG9uZSBjb21wbGV0aW9uIiwgCi0JCSJlbGVtZW50OkNsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uICAgIGNvbXBsZXRpb246Q2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX1VOUVVBTElGSUVEKSsiXG4iKwotCQkiZWxlbWVudDpjbG9uZSAgICBjb21wbGV0aW9uOnByb3RlY3RlZCBPYmplY3QgY2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25NZXRob2REZWNsYXJhdGlvbjkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvbk1ldGhvZERlY2xhcmF0aW9uOS5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNsb24iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSBvbmUgY29tcGxldGlvbiIsIAotCQkiZWxlbWVudDpDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiAgICBjb21wbGV0aW9uOkNsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJImVsZW1lbnQ6Y2xvbmUgICAgY29tcGxldGlvbjpwcm90ZWN0ZWQgT2JqZWN0IGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uTWV0aG9kRGVjbGFyYXRpb24xMCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCi0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uTWV0aG9kRGVjbGFyYXRpb24xMC5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNsb24iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSBvbmUgY29tcGxldGlvbiIsIAotCQkiZWxlbWVudDpDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiAgICBjb21wbGV0aW9uOkNsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJImVsZW1lbnQ6Y2xvbmUgICAgY29tcGxldGlvbjpwcm90ZWN0ZWQgT2JqZWN0IGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uRmllbGROYW1lKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uRmllbGROYW1lLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiQ2xhc3NXaXRoQ29tcGxleE5hbWUgIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkic2hvdWxkIGhhdmUgdHdvIGNvbXBsZXRpb25zIiwKLQkJImVsZW1lbnQ6Y2xhc3NXaXRoQ29tcGxleE5hbWUgICAgY29tcGxldGlvbjpjbGFzc1dpdGhDb21wbGV4TmFtZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSkrIlxuIiArCi0JCSJlbGVtZW50OmNvbXBsZXhOYW1lMiAgICBjb21wbGV0aW9uOmNvbXBsZXhOYW1lMiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSkrIlxuIiArCi0JCSJlbGVtZW50Om5hbWUgICAgY29tcGxldGlvbjpuYW1lICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSsiXG4iICsKLQkJImVsZW1lbnQ6d2l0aENvbXBsZXhOYW1lICAgIGNvbXBsZXRpb246d2l0aENvbXBsZXhOYW1lICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25Mb2NhbE5hbWUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25Mb2NhbE5hbWUuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJDbGFzc1dpdGhDb21wbGV4TmFtZSAiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSB0d28gY29tcGxldGlvbnMiLCAKLQkJImVsZW1lbnQ6Y2xhc3NXaXRoQ29tcGxleE5hbWUgICAgY29tcGxldGlvbjpjbGFzc1dpdGhDb21wbGV4TmFtZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSkrIlxuIiArCi0JCSJlbGVtZW50OmNvbXBsZXhOYW1lMiAgICBjb21wbGV0aW9uOmNvbXBsZXhOYW1lMiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSkrIlxuIiArCi0JCSJlbGVtZW50Om5hbWUgICAgY29tcGxldGlvbjpuYW1lICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSsiXG4iICsKLQkJImVsZW1lbnQ6d2l0aENvbXBsZXhOYW1lICAgIGNvbXBsZXRpb246d2l0aENvbXBsZXhOYW1lICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25Bcmd1bWVudE5hbWUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25Bcmd1bWVudE5hbWUuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJDbGFzc1dpdGhDb21wbGV4TmFtZSAiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSB0d28gY29tcGxldGlvbnMiLCAKLQkJImVsZW1lbnQ6Y2xhc3NXaXRoQ29tcGxleE5hbWUgICAgY29tcGxldGlvbjpjbGFzc1dpdGhDb21wbGV4TmFtZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSkrIlxuIiArCi0JCSJlbGVtZW50OmNvbXBsZXhOYW1lMiAgICBjb21wbGV0aW9uOmNvbXBsZXhOYW1lMiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSkrIlxuIiArCi0JCSJlbGVtZW50Om5hbWUgICAgY29tcGxldGlvbjpuYW1lICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSsiXG4iICsKLQkJImVsZW1lbnQ6d2l0aENvbXBsZXhOYW1lICAgIGNvbXBsZXRpb246d2l0aENvbXBsZXhOYW1lICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25DYXRjaEFyZ3VtZW50TmFtZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvbkNhdGNoQXJndW1lbnROYW1lLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZXgiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSBvbmUgY29tcGxldGlvbiIsIAotCQkiZWxlbWVudDpleGNlcHRpb24gICAgY29tcGxldGlvbjpleGNlcHRpb24gICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLQotCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbkFtYmlndW91c1R5cGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25BbWJpZ3VvdXNUeXBlLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiQUJDIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkic2hvdWxkIGhhdmUgdHdvIGNvbXBsZXRpb25zIiwgCi0JCSJlbGVtZW50OkFCQyAgICBjb21wbGV0aW9uOnAxLkFCQyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhBQ1RfTkFNRSkrIlxuIiArCi0JCSJlbGVtZW50OkFCQyAgICBjb21wbGV0aW9uOnAyLkFCQyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhBQ1RfTkFNRSksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uQW1iaWd1b3VzVHlwZTIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25BbWJpZ3VvdXNUeXBlMi5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIkFCQyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCWFzc2VydEVxdWFscygKLQkJInNob3VsZCBoYXZlIHR3byBjb21wbGV0aW9ucyIsIAotCQkiZWxlbWVudDpBQkMgICAgY29tcGxldGlvbjpBQkMgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0VYQUNUX05BTUUgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6QUJDICAgIGNvbXBsZXRpb246cDIuQUJDICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWEFDVF9OQU1FKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25XaXRoQmluYXJ5Rm9sZGVyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uV2l0aEJpbmFyeUZvbGRlci5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIk15IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkic2hvdWxkIGhhdmUgdHdvIGNvbXBsZXRpb25zIiwKLQkJImVsZW1lbnQ6TXlDbGFzcyAgICBjb21wbGV0aW9uOk15Q2xhc3MgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6bXlwYWNrYWdlICAgIGNvbXBsZXRpb246bXlwYWNrYWdlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25WYXJpYWJsZU5hbWVPZkFycmF5MSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvblZhcmlhYmxlTmFtZU9mQXJyYXkxLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAib2IiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSBvbmUgY29tcGxldGlvbiIsCi0JCSJlbGVtZW50Om9iamVjdHMgICAgY29tcGxldGlvbjpvYmplY3RzICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25WYXJpYWJsZU5hbWVPZkFycmF5MigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvblZhcmlhYmxlTmFtZU9mQXJyYXkyLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2wiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSBvbmUgY29tcGxldGlvbiIsCi0JCSJlbGVtZW50OmNsYXNzZXMgICAgY29tcGxldGlvbjpjbGFzc2VzICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25WYXJpYWJsZU5hbWVPZkFycmF5MygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvblZhcmlhYmxlTmFtZU9mQXJyYXkzLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAib2IiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSBvbmUgY29tcGxldGlvbiIsCi0JCSJlbGVtZW50Om9iamVjdHMgICAgY29tcGxldGlvbjpvYmplY3RzICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25WYXJpYWJsZU5hbWVPZkFycmF5NCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvblZhcmlhYmxlTmFtZU9mQXJyYXk0LmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAib2IiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSBubyBjb21wbGV0aW9uIiwKLQkJIiIsCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uVmFyaWFibGVOYW1lVW5yZXNvbHZlZFR5cGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25WYXJpYWJsZU5hbWVVbnJlc29sdmVkVHlwZS5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIm9iIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkic2hvdWxkIGhhdmUgbm8gY29tcGxldGlvbiIsCi0JCSIiLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLQotCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvblNhbWVTdXBlckNsYXNzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uU2FtZVN1cGVyQ2xhc3MuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJiYXIiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSBmaXZlIGNvbXBsZXRpb25zIiwKLQkJImVsZW1lbnQ6YmFyICAgIGNvbXBsZXRpb246Q29tcGxldGlvblNhbWVTdXBlckNsYXNzLnRoaXMuYmFyICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWEFDVF9OQU1FKSsiXG4iKwotCQkiZWxlbWVudDpiYXIgICAgY29tcGxldGlvbjpDb21wbGV0aW9uU2FtZVN1cGVyQ2xhc3MudGhpcy5iYXIoKSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhBQ1RfTkFNRSkrIlxuIisKLQkJImVsZW1lbnQ6YmFyICAgIGNvbXBsZXRpb246YmFyICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWEFDVF9OQU1FICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJImVsZW1lbnQ6YmFyICAgIGNvbXBsZXRpb246YmFyKCkgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0VYQUNUX05BTUUgKyBSX1VOUVVBTElGSUVEKSsiXG4iKwotCQkiZWxlbWVudDpiYXIgICAgY29tcGxldGlvbjp0aGlzLmJhciAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhBQ1RfTkFNRSksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvblN1cGVyVHlwZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvblN1cGVyVHlwZS5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIkNvbXBsZXRpb25TdXBlckNsYXNzLiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCWFzc2VydEVxdWFscygKLQkJImVsZW1lbnQ6Q29tcGxldGlvblN1cGVyQ2xhc3MuSW5uZXIgICAgY29tcGxldGlvbjpJbm5lciAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfQ0xBU1MpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25TdXBlclR5cGUyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uU3VwZXJUeXBlMi5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIkNvbXBsZXRpb25TdXBlciI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCWFzc2VydEVxdWFscygKLQkJImVsZW1lbnQ6Q29tcGxldGlvblN1cGVyQ2xhc3MgICAgY29tcGxldGlvbjpDb21wbGV0aW9uU3VwZXJDbGFzcyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfQ0xBU1MgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6Q29tcGxldGlvblN1cGVyQ2xhc3MyICAgIGNvbXBsZXRpb246Q29tcGxldGlvblN1cGVyQ2xhc3MyICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9DTEFTUyArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDpDb21wbGV0aW9uU3VwZXJJbnRlcmZhY2UgICAgY29tcGxldGlvbjpDb21wbGV0aW9uU3VwZXJJbnRlcmZhY2UgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6Q29tcGxldGlvblN1cGVySW50ZXJmYWNlMiAgICBjb21wbGV0aW9uOkNvbXBsZXRpb25TdXBlckludGVyZmFjZTIgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6Q29tcGxldGlvblN1cGVyVHlwZSAgICBjb21wbGV0aW9uOkNvbXBsZXRpb25TdXBlclR5cGUgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0NMQVNTICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50OkNvbXBsZXRpb25TdXBlclR5cGUyICAgIGNvbXBsZXRpb246Q29tcGxldGlvblN1cGVyVHlwZTIgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0NMQVNTICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50OkNvbXBsZXRpb25TdXBlclR5cGUzICAgIGNvbXBsZXRpb246Q29tcGxldGlvblN1cGVyVHlwZTMgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0NMQVNTICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50OkNvbXBsZXRpb25TdXBlclR5cGU0ICAgIGNvbXBsZXRpb246Q29tcGxldGlvblN1cGVyVHlwZTQgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0NMQVNTICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50OkNvbXBsZXRpb25TdXBlclR5cGU1ICAgIGNvbXBsZXRpb246Q29tcGxldGlvblN1cGVyVHlwZTUgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0NMQVNTICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50OkNvbXBsZXRpb25TdXBlclR5cGU2ICAgIGNvbXBsZXRpb246Q29tcGxldGlvblN1cGVyVHlwZTYgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6Q29tcGxldGlvblN1cGVyVHlwZTcgICAgY29tcGxldGlvbjpDb21wbGV0aW9uU3VwZXJUeXBlNyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDpDb21wbGV0aW9uU3VwZXJUeXBlOCAgICBjb21wbGV0aW9uOkNvbXBsZXRpb25TdXBlclR5cGU4ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvblN1cGVyVHlwZTMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25TdXBlclR5cGUzLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiQ29tcGxldGlvblN1cGVyIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiZWxlbWVudDpDb21wbGV0aW9uU3VwZXJDbGFzcyAgICBjb21wbGV0aW9uOkNvbXBsZXRpb25TdXBlckNsYXNzICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50OkNvbXBsZXRpb25TdXBlckNsYXNzMiAgICBjb21wbGV0aW9uOkNvbXBsZXRpb25TdXBlckNsYXNzMiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDpDb21wbGV0aW9uU3VwZXJJbnRlcmZhY2UgICAgY29tcGxldGlvbjpDb21wbGV0aW9uU3VwZXJJbnRlcmZhY2UgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0lOVEVSRkFDRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDpDb21wbGV0aW9uU3VwZXJJbnRlcmZhY2UyICAgIGNvbXBsZXRpb246Q29tcGxldGlvblN1cGVySW50ZXJmYWNlMiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfSU5URVJGQUNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50OkNvbXBsZXRpb25TdXBlclR5cGUgICAgY29tcGxldGlvbjpDb21wbGV0aW9uU3VwZXJUeXBlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50OkNvbXBsZXRpb25TdXBlclR5cGUyICAgIGNvbXBsZXRpb246Q29tcGxldGlvblN1cGVyVHlwZTIgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6Q29tcGxldGlvblN1cGVyVHlwZTMgICAgY29tcGxldGlvbjpDb21wbGV0aW9uU3VwZXJUeXBlMyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDpDb21wbGV0aW9uU3VwZXJUeXBlNCAgICBjb21wbGV0aW9uOkNvbXBsZXRpb25TdXBlclR5cGU0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50OkNvbXBsZXRpb25TdXBlclR5cGU1ICAgIGNvbXBsZXRpb246Q29tcGxldGlvblN1cGVyVHlwZTUgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6Q29tcGxldGlvblN1cGVyVHlwZTYgICAgY29tcGxldGlvbjpDb21wbGV0aW9uU3VwZXJUeXBlNiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfSU5URVJGQUNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50OkNvbXBsZXRpb25TdXBlclR5cGU3ICAgIGNvbXBsZXRpb246Q29tcGxldGlvblN1cGVyVHlwZTcgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0lOVEVSRkFDRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDpDb21wbGV0aW9uU3VwZXJUeXBlOCAgICBjb21wbGV0aW9uOkNvbXBsZXRpb25TdXBlclR5cGU4ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9JTlRFUkZBQ0UgKyBSX1VOUVVBTElGSUVEKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uU3VwZXJUeXBlNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvblN1cGVyVHlwZTQuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJDb21wbGV0aW9uU3VwZXJDbGFzczIuSW5uZXIiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJlbGVtZW50OkNvbXBsZXRpb25TdXBlckNsYXNzMi5Jbm5lckNsYXNzICAgIGNvbXBsZXRpb246SW5uZXJDbGFzcyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfQ0xBU1MpKyJcbiIgKwotCQkiZWxlbWVudDpDb21wbGV0aW9uU3VwZXJDbGFzczIuSW5uZXJJbnRlcmZhY2UgICAgY29tcGxldGlvbjpJbm5lckludGVyZmFjZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvblN1cGVyVHlwZTUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25TdXBlclR5cGU1LmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiQ29tcGxldGlvblN1cGVySW50ZXJmYWNlMi5Jbm5lciI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCWFzc2VydEVxdWFscygKLQkJImVsZW1lbnQ6Q29tcGxldGlvblN1cGVySW50ZXJmYWNlMi5Jbm5lckNsYXNzICAgIGNvbXBsZXRpb246SW5uZXJDbGFzcyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSkrIlxuIiArCi0JCSJlbGVtZW50OkNvbXBsZXRpb25TdXBlckludGVyZmFjZTIuSW5uZXJJbnRlcmZhY2UgICAgY29tcGxldGlvbjpJbm5lckludGVyZmFjZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfSU5URVJGQUNFKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uU3VwZXJUeXBlNigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvblN1cGVyVHlwZTYuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJDb21wbGV0aW9uU3VwZXIiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJlbGVtZW50OkNvbXBsZXRpb25TdXBlckNsYXNzICAgIGNvbXBsZXRpb246Q29tcGxldGlvblN1cGVyQ2xhc3MgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6Q29tcGxldGlvblN1cGVyQ2xhc3MyICAgIGNvbXBsZXRpb246Q29tcGxldGlvblN1cGVyQ2xhc3MyICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50OkNvbXBsZXRpb25TdXBlckludGVyZmFjZSAgICBjb21wbGV0aW9uOkNvbXBsZXRpb25TdXBlckludGVyZmFjZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfSU5URVJGQUNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50OkNvbXBsZXRpb25TdXBlckludGVyZmFjZTIgICAgY29tcGxldGlvbjpDb21wbGV0aW9uU3VwZXJJbnRlcmZhY2UyICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9JTlRFUkZBQ0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6Q29tcGxldGlvblN1cGVyVHlwZSAgICBjb21wbGV0aW9uOkNvbXBsZXRpb25TdXBlclR5cGUgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6Q29tcGxldGlvblN1cGVyVHlwZTIgICAgY29tcGxldGlvbjpDb21wbGV0aW9uU3VwZXJUeXBlMiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDpDb21wbGV0aW9uU3VwZXJUeXBlMyAgICBjb21wbGV0aW9uOkNvbXBsZXRpb25TdXBlclR5cGUzICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50OkNvbXBsZXRpb25TdXBlclR5cGU0ICAgIGNvbXBsZXRpb246Q29tcGxldGlvblN1cGVyVHlwZTQgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6Q29tcGxldGlvblN1cGVyVHlwZTUgICAgY29tcGxldGlvbjpDb21wbGV0aW9uU3VwZXJUeXBlNSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDpDb21wbGV0aW9uU3VwZXJUeXBlNiAgICBjb21wbGV0aW9uOkNvbXBsZXRpb25TdXBlclR5cGU2ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9JTlRFUkZBQ0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6Q29tcGxldGlvblN1cGVyVHlwZTcgICAgY29tcGxldGlvbjpDb21wbGV0aW9uU3VwZXJUeXBlNyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfSU5URVJGQUNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50OkNvbXBsZXRpb25TdXBlclR5cGU4ICAgIGNvbXBsZXRpb246Q29tcGxldGlvblN1cGVyVHlwZTggICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0lOVEVSRkFDRSArIFJfVU5RVUFMSUZJRUQpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25TdXBlclR5cGU3KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uU3VwZXJUeXBlNy5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIkNvbXBsZXRpb25TdXBlckNsYXNzMi5Jbm5lciI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCWFzc2VydEVxdWFscygKLQkJImVsZW1lbnQ6Q29tcGxldGlvblN1cGVyQ2xhc3MyLklubmVyQ2xhc3MgICAgY29tcGxldGlvbjpJbm5lckNsYXNzICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSsiXG4iICsKLQkJImVsZW1lbnQ6Q29tcGxldGlvblN1cGVyQ2xhc3MyLklubmVySW50ZXJmYWNlICAgIGNvbXBsZXRpb246SW5uZXJJbnRlcmZhY2UgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0lOVEVSRkFDRSksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvblN1cGVyVHlwZTgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25TdXBlclR5cGU4LmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiQ29tcGxldGlvblN1cGVySW50ZXJmYWNlMi5Jbm5lciI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCWFzc2VydEVxdWFscygKLQkJImVsZW1lbnQ6Q29tcGxldGlvblN1cGVySW50ZXJmYWNlMi5Jbm5lckNsYXNzICAgIGNvbXBsZXRpb246SW5uZXJDbGFzcyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSkrIlxuIiArCi0JCSJlbGVtZW50OkNvbXBsZXRpb25TdXBlckludGVyZmFjZTIuSW5uZXJJbnRlcmZhY2UgICAgY29tcGxldGlvbjpJbm5lckludGVyZmFjZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfSU5URVJGQUNFKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uTWV0aG9kVGhyb3dzQ2xhdXNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uTWV0aG9kVGhyb3dzQ2xhdXNlLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiRXgiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJlbGVtZW50OkV4Y2VwdGlvbiAgICBjb21wbGV0aW9uOkV4Y2VwdGlvbiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhDRVBUSU9OICsgUl9VTlFVQUxJRklFRCksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbk1ldGhvZFRocm93c0NsYXVzZTIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25NZXRob2RUaHJvd3NDbGF1c2UyLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiRXgiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJlbGVtZW50OkV4Y2VwdGlvbiAgICBjb21wbGV0aW9uOmphdmEubGFuZy5FeGNlcHRpb24gICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0VYQ0VQVElPTiksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvblRocm93U3RhdGVtZW50KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uVGhyb3dTdGF0ZW1lbnQuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJFeCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCWFzc2VydEVxdWFscygKLQkJImVsZW1lbnQ6RXhjZXB0aW9uICAgIGNvbXBsZXRpb246RXhjZXB0aW9uICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWENFUFRJT04gKyBSX1VOUVVBTElGSUVEKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uVW5yZXNvbHZlZFJldHVyblR5cGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25VbnJlc29sdmVkUmV0dXJuVHlwZS5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImJhciI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCWFzc2VydEVxdWFscygKLQkJImVsZW1lbnQ6YmFyUGx1cyAgICBjb21wbGV0aW9uOmJhclBsdXMoKSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfTk9OX1NUQVRJQyArIFJfVU5RVUFMSUZJRUQpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25VbnJlc29sdmVkUGFyYW1ldGVyVHlwZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvblVucmVzb2x2ZWRQYXJhbWV0ZXJUeXBlLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYmFyIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiZWxlbWVudDpiYXJQbHVzICAgIGNvbXBsZXRpb246YmFyUGx1cygpICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9OT05fU1RBVElDICsgUl9VTlFVQUxJRklFRCksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvblVucmVzb2x2ZWRGaWVsZFR5cGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25VbnJlc29sdmVkRmllbGRUeXBlLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYmFyIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiZWxlbWVudDpiYXJQbHVzICAgIGNvbXBsZXRpb246YmFyUGx1cygpICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9OT05fU1RBVElDICsgUl9VTlFVQUxJRklFRCksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotLyoKLSAqIGJ1ZyA6IGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ0NDAKLSAqLwotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25VbnJlc29sdmVkRW5jbG9zaW5nVHlwZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvblVucmVzb2x2ZWRFbmNsb3NpbmdUeXBlLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibmV3IFpaWigiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRUcnVlKAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpLmxlbmd0aCgpID09IDApOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25SZXR1cm5TdGF0ZW1lbnRJc1BhcmVudDEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25SZXR1cm5TdGF0ZW1lbnRJc1BhcmVudDEuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCWFzc2VydEVxdWFscygKLQkJImVsZW1lbnQ6enowMCAgICBjb21wbGV0aW9uOnp6MDAgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enowME0gICAgY29tcGxldGlvbjp6ejAwTSgpICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6MDEgICAgY29tcGxldGlvbjp6ejAxICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6MDFNICAgIGNvbXBsZXRpb246enowMU0oKSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6ejAyICAgIGNvbXBsZXRpb246enowMiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6ejAyTSAgICBjb21wbGV0aW9uOnp6MDJNKCkgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enoxMCAgICBjb21wbGV0aW9uOnp6MTAgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enoxME0gICAgY29tcGxldGlvbjp6ejEwTSgpICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6MTEgICAgY29tcGxldGlvbjp6ejExICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWEFDVF9FWFBFQ1RFRF9UWVBFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6MTFNICAgIGNvbXBsZXRpb246enoxMU0oKSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhBQ1RfRVhQRUNURURfVFlQRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6ejEyICAgIGNvbXBsZXRpb246enoxMiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6ejEyTSAgICBjb21wbGV0aW9uOnp6MTJNKCkgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enoyMCAgICBjb21wbGV0aW9uOnp6MjAgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enoyME0gICAgY29tcGxldGlvbjp6ejIwTSgpICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6MjEgICAgY29tcGxldGlvbjp6ejIxICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWFBFQ1RFRF9UWVBFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6MjFNICAgIGNvbXBsZXRpb246enoyMU0oKSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhQRUNURURfVFlQRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6ejIyICAgIGNvbXBsZXRpb246enoyMiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6ejIyTSAgICBjb21wbGV0aW9uOnp6MjJNKCkgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enpPYiAgICBjb21wbGV0aW9uOnp6T2IgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enpPYk0gICAgY29tcGxldGlvbjp6ek9iTSgpICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvblJldHVyblN0YXRlbWVudElzUGFyZW50MigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvblJldHVyblN0YXRlbWVudElzUGFyZW50Mi5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInh4IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiZWxlbWVudDpYWDAwICAgIGNvbXBsZXRpb246WFgwMCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDpYWDAxICAgIGNvbXBsZXRpb246WFgwMSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDpYWDAyICAgIGNvbXBsZXRpb246WFgwMiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDpYWDEwICAgIGNvbXBsZXRpb246WFgxMCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDpYWDExICAgIGNvbXBsZXRpb246WFgxMSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfRVhBQ1RfRVhQRUNURURfVFlQRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDpYWDEyICAgIGNvbXBsZXRpb246WFgxMiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDpYWDIwICAgIGNvbXBsZXRpb246WFgyMCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDpYWDIxICAgIGNvbXBsZXRpb246WFgyMSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDpYWDIyICAgIGNvbXBsZXRpb246WFgyMiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25DYXN0SXNQYXJlbnQxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uQ2FzdElzUGFyZW50MS5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiZWxlbWVudDp6ejAwICAgIGNvbXBsZXRpb246enowMCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6ejAwTSAgICBjb21wbGV0aW9uOnp6MDBNKCkgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enowMSAgICBjb21wbGV0aW9uOnp6MDEgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0VYUEVDVEVEX1RZUEUgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enowMU0gICAgY29tcGxldGlvbjp6ejAxTSgpICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWFBFQ1RFRF9UWVBFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6MDIgICAgY29tcGxldGlvbjp6ejAyICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6MDJNICAgIGNvbXBsZXRpb246enowMk0oKSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6ejEwICAgIGNvbXBsZXRpb246enoxMCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6ejEwTSAgICBjb21wbGV0aW9uOnp6MTBNKCkgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enoxMSAgICBjb21wbGV0aW9uOnp6MTEgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0VYQUNUX0VYUEVDVEVEX1RZUEUgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enoxMU0gICAgY29tcGxldGlvbjp6ejExTSgpICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWEFDVF9FWFBFQ1RFRF9UWVBFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6MTIgICAgY29tcGxldGlvbjp6ejEyICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6MTJNICAgIGNvbXBsZXRpb246enoxMk0oKSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6ejIwICAgIGNvbXBsZXRpb246enoyMCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6ejIwTSAgICBjb21wbGV0aW9uOnp6MjBNKCkgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enoyMSAgICBjb21wbGV0aW9uOnp6MjEgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0VYUEVDVEVEX1RZUEUgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enoyMU0gICAgY29tcGxldGlvbjp6ejIxTSgpICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWFBFQ1RFRF9UWVBFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6MjIgICAgY29tcGxldGlvbjp6ejIyICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6MjJNICAgIGNvbXBsZXRpb246enoyMk0oKSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6ek9iICAgIGNvbXBsZXRpb246enpPYiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhQRUNURURfVFlQRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6ek9iTSAgICBjb21wbGV0aW9uOnp6T2JNKCkgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0VYUEVDVEVEX1RZUEUgKyBSX1VOUVVBTElGSUVEKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uQ2FzdElzUGFyZW50MigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvbkNhc3RJc1BhcmVudDIuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ4eCI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCWFzc2VydEVxdWFscygKLQkJImVsZW1lbnQ6WFgwMCAgICBjb21wbGV0aW9uOlhYMDAgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6WFgwMSAgICBjb21wbGV0aW9uOlhYMDEgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6WFgwMiAgICBjb21wbGV0aW9uOlhYMDIgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6WFgxMCAgICBjb21wbGV0aW9uOlhYMTAgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6WFgxMSAgICBjb21wbGV0aW9uOlhYMTEgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0VYQUNUX0VYUEVDVEVEX1RZUEUgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6WFgxMiAgICBjb21wbGV0aW9uOlhYMTIgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6WFgyMCAgICBjb21wbGV0aW9uOlhYMjAgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6WFgyMSAgICBjb21wbGV0aW9uOlhYMjEgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6WFgyMiAgICBjb21wbGV0aW9uOlhYMjIgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX1VOUVVBTElGSUVEKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uTWVzc2FnZVNlbmRJc1BhcmVudDEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25NZXNzYWdlU2VuZElzUGFyZW50MS5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiZWxlbWVudDp6ek9iamVjdCAgICBjb21wbGV0aW9uOnp6T2JqZWN0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWEFDVF9FWFBFQ1RFRF9UWVBFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6Ym9vbGVhbiAgICBjb21wbGV0aW9uOnp6Ym9vbGVhbiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6emRvdWJsZSAgICBjb21wbGV0aW9uOnp6ZG91YmxlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6aW50ICAgIGNvbXBsZXRpb246enppbnQgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0VYUEVDVEVEX1RZUEUgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enpsb25nICAgIGNvbXBsZXRpb246enpsb25nICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWEFDVF9FWFBFQ1RFRF9UWVBFICsgUl9VTlFVQUxJRklFRCksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbk1lc3NhZ2VTZW5kSXNQYXJlbnQyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uTWVzc2FnZVNlbmRJc1BhcmVudDIuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCWFzc2VydEVxdWFscygKLQkJImVsZW1lbnQ6enpPYmplY3QgICAgY29tcGxldGlvbjp6ek9iamVjdCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhBQ1RfRVhQRUNURURfVFlQRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6emJvb2xlYW4gICAgY29tcGxldGlvbjp6emJvb2xlYW4gICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enpkb3VibGUgICAgY29tcGxldGlvbjp6emRvdWJsZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6emludCAgICBjb21wbGV0aW9uOnp6aW50ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWFBFQ1RFRF9UWVBFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6bG9uZyAgICBjb21wbGV0aW9uOnp6bG9uZyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhBQ1RfRVhQRUNURURfVFlQRSArIFJfVU5RVUFMSUZJRUQpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25NZXNzYWdlU2VuZElzUGFyZW50MygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvbk1lc3NhZ2VTZW5kSXNQYXJlbnQzLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJlbGVtZW50Onp6T2JqZWN0ICAgIGNvbXBsZXRpb246enpPYmplY3QgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0VYQUNUX0VYUEVDVEVEX1RZUEUgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enpib29sZWFuICAgIGNvbXBsZXRpb246enpib29sZWFuICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6ZG91YmxlICAgIGNvbXBsZXRpb246enpkb3VibGUgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enppbnQgICAgY29tcGxldGlvbjp6emludCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhQRUNURURfVFlQRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6emxvbmcgICAgY29tcGxldGlvbjp6emxvbmcgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0VYQUNUX0VYUEVDVEVEX1RZUEUgKyBSX1VOUVVBTElGSUVEKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uTWVzc2FnZVNlbmRJc1BhcmVudDQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25NZXNzYWdlU2VuZElzUGFyZW50NC5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiZWxlbWVudDp6ek9iamVjdCAgICBjb21wbGV0aW9uOnp6T2JqZWN0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6Ym9vbGVhbiAgICBjb21wbGV0aW9uOnp6Ym9vbGVhbiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6emRvdWJsZSAgICBjb21wbGV0aW9uOnp6ZG91YmxlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6aW50ICAgIGNvbXBsZXRpb246enppbnQgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0VYUEVDVEVEX1RZUEUgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enpsb25nICAgIGNvbXBsZXRpb246enpsb25nICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWEFDVF9FWFBFQ1RFRF9UWVBFICsgUl9VTlFVQUxJRklFRCksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbk1lc3NhZ2VTZW5kSXNQYXJlbnQ1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uTWVzc2FnZVNlbmRJc1BhcmVudDUuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCWFzc2VydEVxdWFscygKLQkJImVsZW1lbnQ6enpPYmplY3QgICAgY29tcGxldGlvbjp6ek9iamVjdCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6emJvb2xlYW4gICAgY29tcGxldGlvbjp6emJvb2xlYW4gICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enpkb3VibGUgICAgY29tcGxldGlvbjp6emRvdWJsZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6emludCAgICBjb21wbGV0aW9uOnp6aW50ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6bG9uZyAgICBjb21wbGV0aW9uOnp6bG9uZyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25NZXNzYWdlU2VuZElzUGFyZW50NigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvbk1lc3NhZ2VTZW5kSXNQYXJlbnQ2LmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJlbGVtZW50Onp6T2JqZWN0ICAgIGNvbXBsZXRpb246enpPYmplY3QgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enpib29sZWFuICAgIGNvbXBsZXRpb246enpib29sZWFuICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6ZG91YmxlICAgIGNvbXBsZXRpb246enpkb3VibGUgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enppbnQgICAgY29tcGxldGlvbjp6emludCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhBQ1RfRVhQRUNURURfVFlQRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6emxvbmcgICAgY29tcGxldGlvbjp6emxvbmcgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uQWxsb2NhdGlvbkV4cHJlc3Npb25Jc1BhcmVudDEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25BbGxvY2F0aW9uRXhwcmVzc2lvbklzUGFyZW50MS5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiZWxlbWVudDp6ek9iamVjdCAgICBjb21wbGV0aW9uOnp6T2JqZWN0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWEFDVF9FWFBFQ1RFRF9UWVBFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6Ym9vbGVhbiAgICBjb21wbGV0aW9uOnp6Ym9vbGVhbiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6emRvdWJsZSAgICBjb21wbGV0aW9uOnp6ZG91YmxlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6aW50ICAgIGNvbXBsZXRpb246enppbnQgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0VYUEVDVEVEX1RZUEUgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enpsb25nICAgIGNvbXBsZXRpb246enpsb25nICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWEFDVF9FWFBFQ1RFRF9UWVBFICsgUl9VTlFVQUxJRklFRCksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbkFsbG9jYXRpb25FeHByZXNzaW9uSXNQYXJlbnQyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uQWxsb2NhdGlvbkV4cHJlc3Npb25Jc1BhcmVudDIuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCWFzc2VydEVxdWFscygKLQkJImVsZW1lbnQ6enpPYmplY3QgICAgY29tcGxldGlvbjp6ek9iamVjdCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6emJvb2xlYW4gICAgY29tcGxldGlvbjp6emJvb2xlYW4gICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enpkb3VibGUgICAgY29tcGxldGlvbjp6emRvdWJsZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6emludCAgICBjb21wbGV0aW9uOnp6aW50ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWFBFQ1RFRF9UWVBFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6bG9uZyAgICBjb21wbGV0aW9uOnp6bG9uZyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhBQ1RfRVhQRUNURURfVFlQRSArIFJfVU5RVUFMSUZJRUQpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25BbGxvY2F0aW9uRXhwcmVzc2lvbklzUGFyZW50MygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvbkFsbG9jYXRpb25FeHByZXNzaW9uSXNQYXJlbnQzLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJlbGVtZW50Onp6T2JqZWN0ICAgIGNvbXBsZXRpb246enpPYmplY3QgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enpib29sZWFuICAgIGNvbXBsZXRpb246enpib29sZWFuICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6ZG91YmxlICAgIGNvbXBsZXRpb246enpkb3VibGUgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enppbnQgICAgY29tcGxldGlvbjp6emludCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhQRUNURURfVFlQRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6emxvbmcgICAgY29tcGxldGlvbjp6emxvbmcgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0VYQUNUX0VYUEVDVEVEX1RZUEUgKyBSX1VOUVVBTElGSUVEKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uQWxsb2NhdGlvbkV4cHJlc3Npb25Jc1BhcmVudDQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25BbGxvY2F0aW9uRXhwcmVzc2lvbklzUGFyZW50NC5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiZWxlbWVudDp6ek9iamVjdCAgICBjb21wbGV0aW9uOnp6T2JqZWN0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6Ym9vbGVhbiAgICBjb21wbGV0aW9uOnp6Ym9vbGVhbiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6emRvdWJsZSAgICBjb21wbGV0aW9uOnp6ZG91YmxlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6aW50ICAgIGNvbXBsZXRpb246enppbnQgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0VYUEVDVEVEX1RZUEUgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enpsb25nICAgIGNvbXBsZXRpb246enpsb25nICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWEFDVF9FWFBFQ1RFRF9UWVBFICsgUl9VTlFVQUxJRklFRCksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbkFsbG9jYXRpb25FeHByZXNzaW9uSXNQYXJlbnQ1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uQWxsb2NhdGlvbkV4cHJlc3Npb25Jc1BhcmVudDUuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCWFzc2VydEVxdWFscygKLQkJImVsZW1lbnQ6enpPYmplY3QgICAgY29tcGxldGlvbjp6ek9iamVjdCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6emJvb2xlYW4gICAgY29tcGxldGlvbjp6emJvb2xlYW4gICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enpkb3VibGUgICAgY29tcGxldGlvbjp6emRvdWJsZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6emludCAgICBjb21wbGV0aW9uOnp6aW50ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6bG9uZyAgICBjb21wbGV0aW9uOnp6bG9uZyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25BbGxvY2F0aW9uRXhwcmVzc2lvbklzUGFyZW50NigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvbkFsbG9jYXRpb25FeHByZXNzaW9uSXNQYXJlbnQ2LmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJlbGVtZW50Onp6T2JqZWN0ICAgIGNvbXBsZXRpb246enpPYmplY3QgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enpib29sZWFuICAgIGNvbXBsZXRpb246enpib29sZWFuICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6ZG91YmxlICAgIGNvbXBsZXRpb246enpkb3VibGUgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enppbnQgICAgY29tcGxldGlvbjp6emludCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6emxvbmcgICAgY29tcGxldGlvbjp6emxvbmcgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uRmllbGRJbml0aWFsaXplcjEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25GaWVsZEluaXRpYWxpemVyMS5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiZWxlbWVudDp6ek9iamVjdCAgICBjb21wbGV0aW9uOnp6T2JqZWN0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6Ym9vbGVhbiAgICBjb21wbGV0aW9uOnp6Ym9vbGVhbiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6emRvdWJsZSAgICBjb21wbGV0aW9uOnp6ZG91YmxlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6aW50ICAgIGNvbXBsZXRpb246enppbnQgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0VYUEVDVEVEX1RZUEUgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enpsb25nICAgIGNvbXBsZXRpb246enpsb25nICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWEFDVF9FWFBFQ1RFRF9UWVBFICsgUl9VTlFVQUxJRklFRCksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbkZpZWxkSW5pdGlhbGl6ZXIyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uRmllbGRJbml0aWFsaXplcjIuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCWFzc2VydEVxdWFscygKLQkJImVsZW1lbnQ6enpPYmplY3QgICAgY29tcGxldGlvbjp6ek9iamVjdCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhBQ1RfRVhQRUNURURfVFlQRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6emJvb2xlYW4gICAgY29tcGxldGlvbjp6emJvb2xlYW4gICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enpkb3VibGUgICAgY29tcGxldGlvbjp6emRvdWJsZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6emludCAgICBjb21wbGV0aW9uOnp6aW50ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6bG9uZyAgICBjb21wbGV0aW9uOnp6bG9uZyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25GaWVsZEluaXRpYWxpemVyMygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvbkZpZWxkSW5pdGlhbGl6ZXIzLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiT2JqZWMiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJlbGVtZW50Ok9iamVjdCAgICBjb21wbGV0aW9uOk9iamVjdCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhBQ1RfRVhQRUNURURfVFlQRSArIFJfVU5RVUFMSUZJRUQpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25GaWVsZEluaXRpYWxpemVyNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvbkZpZWxkSW5pdGlhbGl6ZXI0LmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiT2JqZWMiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJlbGVtZW50Ok9iamVjdCAgICBjb21wbGV0aW9uOk9iamVjdCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhBQ1RfRVhQRUNURURfVFlQRSArIFJfVU5RVUFMSUZJRUQpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uVmFyaWFibGVJbml0aWFsaXplckluSW5pdGlhbGl6ZXIxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uVmFyaWFibGVJbml0aWFsaXplckluSW5pdGlhbGl6ZXIxLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJlbGVtZW50Onp6T2JqZWN0ICAgIGNvbXBsZXRpb246enpPYmplY3QgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enpib29sZWFuICAgIGNvbXBsZXRpb246enpib29sZWFuICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6ZG91YmxlICAgIGNvbXBsZXRpb246enpkb3VibGUgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enppbnQgICAgY29tcGxldGlvbjp6emludCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhQRUNURURfVFlQRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6emxvbmcgICAgY29tcGxldGlvbjp6emxvbmcgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0VYQUNUX0VYUEVDVEVEX1RZUEUgKyBSX1VOUVVBTElGSUVEKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uVmFyaWFibGVJbml0aWFsaXplckluSW5pdGlhbGl6ZXIyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uVmFyaWFibGVJbml0aWFsaXplckluSW5pdGlhbGl6ZXIyLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJlbGVtZW50Onp6T2JqZWN0ICAgIGNvbXBsZXRpb246enpPYmplY3QgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0VYQUNUX0VYUEVDVEVEX1RZUEUgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enpib29sZWFuICAgIGNvbXBsZXRpb246enpib29sZWFuICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6ZG91YmxlICAgIGNvbXBsZXRpb246enpkb3VibGUgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enppbnQgICAgY29tcGxldGlvbjp6emludCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6emxvbmcgICAgY29tcGxldGlvbjp6emxvbmcgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uVmFyaWFibGVJbml0aWFsaXplckluSW5pdGlhbGl6ZXIzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uVmFyaWFibGVJbml0aWFsaXplckluSW5pdGlhbGl6ZXIzLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiT2JqZWMiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJlbGVtZW50Ok9iamVjdCAgICBjb21wbGV0aW9uOk9iamVjdCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhBQ1RfRVhQRUNURURfVFlQRSArIFJfVU5RVUFMSUZJRUQpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25WYXJpYWJsZUluaXRpYWxpemVySW5Jbml0aWFsaXplcjQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25WYXJpYWJsZUluaXRpYWxpemVySW5Jbml0aWFsaXplcjQuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJPYmplYyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCWFzc2VydEVxdWFscygKLQkJImVsZW1lbnQ6T2JqZWN0ICAgIGNvbXBsZXRpb246T2JqZWN0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWEFDVF9FWFBFQ1RFRF9UWVBFICsgUl9VTlFVQUxJRklFRCksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25WYXJpYWJsZUluaXRpYWxpemVySW5NZXRob2QxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uVmFyaWFibGVJbml0aWFsaXplckluTWV0aG9kMS5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiZWxlbWVudDp6ek9iamVjdCAgICBjb21wbGV0aW9uOnp6T2JqZWN0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6Ym9vbGVhbiAgICBjb21wbGV0aW9uOnp6Ym9vbGVhbiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6emRvdWJsZSAgICBjb21wbGV0aW9uOnp6ZG91YmxlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6aW50ICAgIGNvbXBsZXRpb246enppbnQgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0VYUEVDVEVEX1RZUEUgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enpsb25nICAgIGNvbXBsZXRpb246enpsb25nICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWEFDVF9FWFBFQ1RFRF9UWVBFICsgUl9VTlFVQUxJRklFRCksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvblZhcmlhYmxlSW5pdGlhbGl6ZXJJbk1ldGhvZDIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25WYXJpYWJsZUluaXRpYWxpemVySW5NZXRob2QyLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJlbGVtZW50Onp6T2JqZWN0ICAgIGNvbXBsZXRpb246enpPYmplY3QgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0VYQUNUX0VYUEVDVEVEX1RZUEUgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enpib29sZWFuICAgIGNvbXBsZXRpb246enpib29sZWFuICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6ZG91YmxlICAgIGNvbXBsZXRpb246enpkb3VibGUgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enppbnQgICAgY29tcGxldGlvbjp6emludCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6emxvbmcgICAgY29tcGxldGlvbjp6emxvbmcgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uVmFyaWFibGVJbml0aWFsaXplckluTWV0aG9kMygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvblZhcmlhYmxlSW5pdGlhbGl6ZXJJbk1ldGhvZDMuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJPYmplYyI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCWFzc2VydEVxdWFscygKLQkJImVsZW1lbnQ6T2JqZWN0ICAgIGNvbXBsZXRpb246T2JqZWN0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWEFDVF9FWFBFQ1RFRF9UWVBFICsgUl9VTlFVQUxJRklFRCksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvblZhcmlhYmxlSW5pdGlhbGl6ZXJJbk1ldGhvZDQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25WYXJpYWJsZUluaXRpYWxpemVySW5NZXRob2Q0LmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiT2JqZWMiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJlbGVtZW50Ok9iamVjdCAgICBjb21wbGV0aW9uOk9iamVjdCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhBQ1RfRVhQRUNURURfVFlQRSArIFJfVU5RVUFMSUZJRUQpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uQXNzaWdubWVudEluTWV0aG9kMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvbkFzc2lnbm1lbnRJbk1ldGhvZDEuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6eiI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCWFzc2VydEVxdWFscygKLQkJImVsZW1lbnQ6enpPYmplY3QgICAgY29tcGxldGlvbjp6ek9iamVjdCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6emJvb2xlYW4gICAgY29tcGxldGlvbjp6emJvb2xlYW4gICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enpkb3VibGUgICAgY29tcGxldGlvbjp6emRvdWJsZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6emludCAgICBjb21wbGV0aW9uOnp6aW50ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWFBFQ1RFRF9UWVBFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6bG9uZyAgICBjb21wbGV0aW9uOnp6bG9uZyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhBQ1RfRVhQRUNURURfVFlQRSArIFJfVU5RVUFMSUZJRUQpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25Bc3NpZ25tZW50SW5NZXRob2QyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uQXNzaWdubWVudEluTWV0aG9kMi5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiZWxlbWVudDp6ek9iamVjdCAgICBjb21wbGV0aW9uOnp6T2JqZWN0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWEFDVF9FWFBFQ1RFRF9UWVBFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6Ym9vbGVhbiAgICBjb21wbGV0aW9uOnp6Ym9vbGVhbiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp6emRvdWJsZSAgICBjb21wbGV0aW9uOnp6ZG91YmxlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Onp6aW50ICAgIGNvbXBsZXRpb246enppbnQgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6enpsb25nICAgIGNvbXBsZXRpb246enpsb25nICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbkFzc2lnbm1lbnRJbk1ldGhvZDMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25Bc3NpZ25tZW50SW5NZXRob2QzLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiT2JqZWMiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJlbGVtZW50Ok9iamVjdCAgICBjb21wbGV0aW9uOk9iamVjdCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhBQ1RfRVhQRUNURURfVFlQRSArIFJfVU5RVUFMSUZJRUQpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25Bc3NpZ25tZW50SW5NZXRob2Q0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uQXNzaWdubWVudEluTWV0aG9kNC5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIk9iamVjIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiZWxlbWVudDpPYmplY3QgICAgY29tcGxldGlvbjpPYmplY3QgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0VYQUNUX0VYUEVDVEVEX1RZUEUgKyBSX1VOUVVBTElGSUVEKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0vKgotKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NTY1Ci0qLwotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25PYmplY3RzTWV0aG9kV2l0aEludGVyZmFjZVJlY2VpdmVyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uT2JqZWN0c01ldGhvZFdpdGhJbnRlcmZhY2VSZWNlaXZlci5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImhhc2giOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJlbGVtZW50Omhhc2hDb2RlICAgIGNvbXBsZXRpb246aGFzaENvZGUoKSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfTk9OX1NUQVRJQyArIFJfVU5RVUFMSUZJRUQgKyBSX0VYQUNUX0VYUEVDVEVEX1RZUEUpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLS8qCi0qIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ5MzkKLSovCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbkNvbnN0cnVjdG9yRm9yQW5vbnltb3VzVHlwZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvbkNvbnN0cnVjdG9yRm9yQW5vbnltb3VzVHlwZS5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIlR5cGVXaXRoQ29uc3RydWN0b3IoIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiZWxlbWVudDpUeXBlV2l0aENvbnN0cnVjdG9yICAgIGNvbXBsZXRpb246KSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotLyoKLSogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTIyMQotKi8KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uRW1wdHlUeXBlTmFtZTEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25FbXB0eVR5cGVOYW1lMS5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIm5ldyAiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJlbGVtZW50OkEgICAgY29tcGxldGlvbjpBICAgIHJlbGV2YW5jZToiICsoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhBQ1RfRVhQRUNURURfVFlQRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDpDb21wbGV0aW9uRW1wdHlUeXBlTmFtZTEgICAgY29tcGxldGlvbjpDb21wbGV0aW9uRW1wdHlUeXBlTmFtZTEgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0vKgotKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MjIxCi0qLwotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25FbXB0eVR5cGVOYW1lMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvbkVtcHR5VHlwZU5hbWUyLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiID0gIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiZWxlbWVudDpBICAgIGNvbXBsZXRpb246QSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhBQ1RfRVhQRUNURURfVFlQRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDpDb21wbGV0aW9uRW1wdHlUeXBlTmFtZTIgICAgY29tcGxldGlvbjpDb21wbGV0aW9uRW1wdHlUeXBlTmFtZTIgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6YSAgICBjb21wbGV0aW9uOmEgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfQ0FTRSArIFJfRVhBQ1RfRVhQRUNURURfVFlQRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDpjbG9uZSAgICBjb21wbGV0aW9uOmNsb25lKCkgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6ZXF1YWxzICAgIGNvbXBsZXRpb246ZXF1YWxzKCkgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6Z2V0Q2xhc3MgICAgY29tcGxldGlvbjpnZXRDbGFzcygpICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50Omhhc2hDb2RlICAgIGNvbXBsZXRpb246aGFzaENvZGUoKSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkiZWxlbWVudDp0b1N0cmluZyAgICBjb21wbGV0aW9uOnRvU3RyaW5nKCkgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0vKgotKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1NTc4Ci0qLwotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25BYnN0cmFjdE1ldGhvZFJlbGV2YW5jZTEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25BYnN0cmFjdE1ldGhvZFJlbGV2YW5jZTEuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmb28iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJlbGVtZW50OmZvbzEgICAgY29tcGxldGlvbjpwdWJsaWMgdm9pZCBmb28xKCkgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpKyJcbiIgKwotCQkiZWxlbWVudDpmb28yICAgIGNvbXBsZXRpb246cHVibGljIHZvaWQgZm9vMigpICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9BQlNUUkFDVF9NRVRIT0QpKyJcbiIgKwotCQkiZWxlbWVudDpmb28zICAgIGNvbXBsZXRpb246cHVibGljIHZvaWQgZm9vMygpICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0vKgotKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1NTc4Ci0qLwotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25BYnN0cmFjdE1ldGhvZFJlbGV2YW5jZTIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25BYnN0cmFjdE1ldGhvZFJlbGV2YW5jZTIuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJlcSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCWFzc2VydEVxdWFscygKLQkJImVsZW1lbnQ6ZXFGb28gICAgY29tcGxldGlvbjpwdWJsaWMgaW50IGVxRm9vKGludCBhLE9iamVjdCBiKSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfQUJTVFJBQ1RfTUVUSE9EKSsiXG4iICsKLQkJImVsZW1lbnQ6ZXF1YWxzICAgIGNvbXBsZXRpb246cHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0vKgotKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1NTkxCi0qLwotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25SZXR1cm5JbkluaXRpYWxpemVyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uUmV0dXJuSW5Jbml0aWFsaXplci5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImVxIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiZWxlbWVudDplcXVhbHMgICAgY29tcGxldGlvbjplcXVhbHMoKSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLS8qCi0qIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU4MTEKLSovCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvblZhcmlhYmxlTmFtZTEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25WYXJpYWJsZU5hbWUxLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiVEVTVF9GT09fTXlDbGFzcyAiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJlbGVtZW50OmNsYXNzMSAgICBjb21wbGV0aW9uOmNsYXNzMSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSkrIlxuIiArCi0JCSJlbGVtZW50Om15Q2xhc3MgICAgY29tcGxldGlvbjpteUNsYXNzICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0vKgotKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1ODExCi0qLwotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25WYXJpYWJsZU5hbWUyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uVmFyaWFibGVOYW1lMi5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIlRlc3RfQmFyX015Q2xhc3MgIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiZWxlbWVudDpiYXJfTXlDbGFzcyAgICBjb21wbGV0aW9uOmJhcl9NeUNsYXNzICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSsiXG4iICsKLQkJImVsZW1lbnQ6Y2xhc3MxICAgIGNvbXBsZXRpb246Y2xhc3MxICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSsiXG4iICsKLQkJImVsZW1lbnQ6bXlDbGFzcyAgICBjb21wbGV0aW9uOm15Q2xhc3MgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpKyJcbiIgKwotCQkiZWxlbWVudDp0ZXN0X0Jhcl9NeUNsYXNzICAgIGNvbXBsZXRpb246dGVzdF9CYXJfTXlDbGFzcyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotLyoKLSogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTgyMAotKi8KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uRXhwZWN0ZWRUeXBlSXNOb3RWYWxpZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvbkV4cGVjdGVkVHlwZUlzTm90VmFsaWQuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuZXcgIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiZWxlbWVudDpDb21wbGV0aW9uRXhwZWN0ZWRUeXBlSXNOb3RWYWxpZCAgICBjb21wbGV0aW9uOkNvbXBsZXRpb25FeHBlY3RlZFR5cGVJc05vdFZhbGlkICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotLyoKLSogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTgxNQotKi8KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uTWVtYmVyVHlwZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvbk1lbWJlclR5cGUuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuZXcgIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiZWxlbWVudDpDb21wbGV0aW9uTWVtYmVyVHlwZSAgICBjb21wbGV0aW9uOkNvbXBsZXRpb25NZW1iZXJUeXBlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCSJlbGVtZW50OlkgICAgY29tcGxldGlvbjpZICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWEFDVF9FWFBFQ1RFRF9UWVBFICsgUl9VTlFVQUxJRklFRCksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotLyoKLSogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTgxNQotKi8KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uVm9pZE1ldGhvZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvblZvaWRNZXRob2QuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmb28iOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJlbGVtZW50OmZvbzEgICAgY29tcGxldGlvbjpmb28xKCkgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0VYQUNUX0VYUEVDVEVEX1RZUEUgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJImVsZW1lbnQ6Zm9vMyAgICBjb21wbGV0aW9uOmZvbzMoKSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLS8qCi0qIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU4OTAKLSovCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbk9uU3RhdGljTWVtYmVyMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uT25TdGF0aWNNZW1iZXIxLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ2YXIiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDp2YXIxICAgIGNvbXBsZXRpb246dmFyMSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkJImVsZW1lbnQ6dmFyMiAgICBjb21wbGV0aW9uOnZhcjIgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX05PTl9TVEFUSUMgKyBSX1VOUVVBTElGSUVEKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotLyoKLSogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTg5MAotKi8KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uT25TdGF0aWNNZW1iZXIyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25PblN0YXRpY01lbWJlcjIuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIm1ldGhvZCI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50Om1ldGhvZDEgICAgY29tcGxldGlvbjptZXRob2QxKCkgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJCSJlbGVtZW50Om1ldGhvZDIgICAgY29tcGxldGlvbjptZXRob2QyKCkgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX05PTl9TVEFUSUMgKyBSX1VOUVVBTElGSUVEKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotLyoKLSogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjY3NwotKi8KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uUXVhbGlmaWVkRXhwZWN0ZWRUeXBlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25RdWFsaWZpZWRFeHBlY3RlZFR5cGUuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIm5ldyAiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpDb21wbGV0aW9uUXVhbGlmaWVkRXhwZWN0ZWRUeXBlICAgIGNvbXBsZXRpb246Q29tcGxldGlvblF1YWxpZmllZEV4cGVjdGVkVHlwZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkJImVsZW1lbnQ6UFggICAgY29tcGxldGlvbjpwYWNrMi5QWCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhBQ1RfRVhQRUNURURfVFlQRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uVW5hcnlPcGVyYXRvcjEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvblVuYXJ5T3BlcmF0b3IxLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ2YXIiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDp2YXIxICAgIGNvbXBsZXRpb246dmFyMSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQgKyBSX0VYQUNUX0VYUEVDVEVEX1RZUEUpKyJcbiIgKwotCQkJImVsZW1lbnQ6dmFyMiAgICBjb21wbGV0aW9uOnZhcjIgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJCSJlbGVtZW50OnZhcjMgICAgY29tcGxldGlvbjp2YXIzICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uVW5hcnlPcGVyYXRvcjIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvblVuYXJ5T3BlcmF0b3IyLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ2YXIiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDp2YXIxICAgIGNvbXBsZXRpb246dmFyMSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkJImVsZW1lbnQ6dmFyMiAgICBjb21wbGV0aW9uOnZhcjIgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEICsgUl9FWEFDVF9FWFBFQ1RFRF9UWVBFKSsiXG4iICsKLQkJCSJlbGVtZW50OnZhcjMgICAgY29tcGxldGlvbjp2YXIzICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uQmluYXJ5T3BlcmF0b3IxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25CaW5hcnlPcGVyYXRvcjEuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInZhciI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OnZhcjEgICAgY29tcGxldGlvbjp2YXIxICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCArIFJfRVhBQ1RfRVhQRUNURURfVFlQRSkrIlxuIiArCi0JCQkiZWxlbWVudDp2YXIyICAgIGNvbXBsZXRpb246dmFyMiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkJImVsZW1lbnQ6dmFyMyAgICBjb21wbGV0aW9uOnZhcjMgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJCSJlbGVtZW50OnZhcjQgICAgY29tcGxldGlvbjp2YXI0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCArIFJfRVhBQ1RfRVhQRUNURURfVFlQRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uQmluYXJ5T3BlcmF0b3IyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25CaW5hcnlPcGVyYXRvcjIuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInZhciI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OnZhcjEgICAgY29tcGxldGlvbjp2YXIxICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCQkiZWxlbWVudDp2YXIyICAgIGNvbXBsZXRpb246dmFyMiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQgKyBSX0VYQUNUX0VYUEVDVEVEX1RZUEUpKyJcbiIgKwotCQkJImVsZW1lbnQ6dmFyMyAgICBjb21wbGV0aW9uOnZhcjMgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25CaW5hcnlPcGVyYXRvcjMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvbkJpbmFyeU9wZXJhdG9yMy5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidmFyIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6dmFyMSAgICBjb21wbGV0aW9uOnZhcjEgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEICsgUl9FWEFDVF9FWFBFQ1RFRF9UWVBFKSsiXG4iICsKLQkJCSJlbGVtZW50OnZhcjIgICAgY29tcGxldGlvbjp2YXIyICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCQkiZWxlbWVudDp2YXIzICAgIGNvbXBsZXRpb246dmFyMyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbkluc3RhbmNlb2ZPcGVyYXRvcjEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvbkluc3RhbmNlb2ZPcGVyYXRvcjEuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInggaW5zdGFuY2VvZiBXV1dDb21wbGV0aW9uSW5zdGFuY2VvZiI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OldXV0NvbXBsZXRpb25JbnN0YW5jZW9mMSAgICBjb21wbGV0aW9uOldXV0NvbXBsZXRpb25JbnN0YW5jZW9mMSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQgKyBSX0VYUEVDVEVEX1RZUEUpKyJcbiIgKwotCQkJImVsZW1lbnQ6V1dXQ29tcGxldGlvbkluc3RhbmNlb2YyICAgIGNvbXBsZXRpb246V1dXQ29tcGxldGlvbkluc3RhbmNlb2YyICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCArIFJfRVhBQ1RfRVhQRUNURURfVFlQRSkrIlxuIiArCi0JCQkiZWxlbWVudDpXV1dDb21wbGV0aW9uSW5zdGFuY2VvZjMgICAgY29tcGxldGlvbjpXV1dDb21wbGV0aW9uSW5zdGFuY2VvZjMgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEICsgUl9FWFBFQ1RFRF9UWVBFKSsiXG4iICsKLQkJCSJlbGVtZW50OldXV0NvbXBsZXRpb25JbnN0YW5jZW9mNCAgICBjb21wbGV0aW9uOldXV0NvbXBsZXRpb25JbnN0YW5jZW9mNCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbkNvbmRpdGlvbmFsRXhwcmVzc2lvbjEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvbkNvbmRpdGlvbmFsRXhwcmVzc2lvbjEuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInZhciI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OnZhcjEgICAgY29tcGxldGlvbjp2YXIxICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCArIFJfRVhBQ1RfRVhQRUNURURfVFlQRSkrIlxuIiArCi0JCQkiZWxlbWVudDp2YXIyICAgIGNvbXBsZXRpb246dmFyMiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkJImVsZW1lbnQ6dmFyMyAgICBjb21wbGV0aW9uOnZhcjMgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJCSJlbGVtZW50OnZhcjQgICAgY29tcGxldGlvbjp2YXI0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uQ29uZGl0aW9uYWxFeHByZXNzaW9uMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uQ29uZGl0aW9uYWxFeHByZXNzaW9uMi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidmFyIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6dmFyMSAgICBjb21wbGV0aW9uOnZhcjEgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEICsgUl9FWEFDVF9FWFBFQ1RFRF9UWVBFKSsiXG4iICsKLQkJCSJlbGVtZW50OnZhcjIgICAgY29tcGxldGlvbjp2YXIyICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCQkiZWxlbWVudDp2YXIzICAgIGNvbXBsZXRpb246dmFyMyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIgKwotCQkJImVsZW1lbnQ6dmFyNCAgICBjb21wbGV0aW9uOnZhcjQgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25Db25kaXRpb25hbEV4cHJlc3Npb24zKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25Db25kaXRpb25hbEV4cHJlc3Npb24zLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ2YXIiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDp2YXIxICAgIGNvbXBsZXRpb246dmFyMSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQgKyBSX0VYQUNUX0VYUEVDVEVEX1RZUEUpKyJcbiIgKwotCQkJImVsZW1lbnQ6dmFyMiAgICBjb21wbGV0aW9uOnZhcjIgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iICsKLQkJCSJlbGVtZW50OnZhcjMgICAgY29tcGxldGlvbjp2YXIzICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIiArCi0JCQkiZWxlbWVudDp2YXI0ICAgIGNvbXBsZXRpb246dmFyNCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRUaGlzMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRUaGlzMS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidGhpIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6dGhpcyAgICBjb21wbGV0aW9uOnRoaXMgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRUaGlzMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRUaGlzMi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidGhpIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6dGhpcyAgICBjb21wbGV0aW9uOnRoaXMgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRUaGlzMygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRUaGlzMy5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidGhpIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFRoaXM0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFRoaXM0LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ0aGkiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDp0aGlzICAgIGNvbXBsZXRpb246dGhpcyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFRoaXM1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFRoaXM1LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ0aGkiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkVGhpczYoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkVGhpczYuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRoaSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OnRoaXMgICAgY29tcGxldGlvbjp0aGlzICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkVGhpczcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkVGhpczcuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRoaSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRTdXBlcjEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkU3VwZXIxLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJzdXAiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpTdXBlckNsYXNzICAgIGNvbXBsZXRpb246U3VwZXJDbGFzcyAgICByZWxldmFuY2U6IiArIChSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9VTlFVQUxJRklFRCkgKyAiXG4iICsKLQkJCSJlbGVtZW50OlN1cGVySW50ZXJmYWNlICAgIGNvbXBsZXRpb246U3VwZXJJbnRlcmZhY2UgICAgcmVsZXZhbmNlOiIgKyAoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpICsgIlxuIiArCi0JCQkiZWxlbWVudDpzdXBlciAgICBjb21wbGV0aW9uOnN1cGVyICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkU3VwZXIyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFN1cGVyMi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3VwIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6U3VwZXJDbGFzcyAgICBjb21wbGV0aW9uOlN1cGVyQ2xhc3MgICAgcmVsZXZhbmNlOiIgKyAoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpICsgIlxuIiArCi0JCQkiZWxlbWVudDpTdXBlckludGVyZmFjZSAgICBjb21wbGV0aW9uOlN1cGVySW50ZXJmYWNlICAgIHJlbGV2YW5jZToiICsgKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX1VOUVVBTElGSUVEKSArICJcbiIgKwotCQkJImVsZW1lbnQ6c3VwZXIgICAgY29tcGxldGlvbjpzdXBlciAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFN1cGVyMygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRTdXBlcjMuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInN1cCI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OlN1cGVyQ2xhc3MgICAgY29tcGxldGlvbjpTdXBlckNsYXNzICAgIHJlbGV2YW5jZToiICsgKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX1VOUVVBTElGSUVEKSArICJcbiIgKwotCQkJImVsZW1lbnQ6U3VwZXJJbnRlcmZhY2UgICAgY29tcGxldGlvbjpTdXBlckludGVyZmFjZSAgICByZWxldmFuY2U6IiArIChSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9VTlFVQUxJRklFRCksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFN1cGVyNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRTdXBlcjQuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInN1cCI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OlN1cGVyQ2xhc3MgICAgY29tcGxldGlvbjpTdXBlckNsYXNzICAgIHJlbGV2YW5jZToiICsgKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX1VOUVVBTElGSUVEKSArICJcbiIgKwotCQkJImVsZW1lbnQ6U3VwZXJJbnRlcmZhY2UgICAgY29tcGxldGlvbjpTdXBlckludGVyZmFjZSAgICByZWxldmFuY2U6IiArIChSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9VTlFVQUxJRklFRCkgKyAiXG4iICsKLQkJCSJlbGVtZW50OnN1cGVyICAgIGNvbXBsZXRpb246c3VwZXIgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRTdXBlcjUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkU3VwZXI1LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJzdXAiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpTdXBlckNsYXNzICAgIGNvbXBsZXRpb246U3VwZXJDbGFzcyAgICByZWxldmFuY2U6IiArIChSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9VTlFVQUxJRklFRCkgKyAiXG4iICsKLQkJCSJlbGVtZW50OlN1cGVySW50ZXJmYWNlICAgIGNvbXBsZXRpb246U3VwZXJJbnRlcmZhY2UgICAgcmVsZXZhbmNlOiIgKyAoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRTdXBlcjYoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkU3VwZXI2LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJzdXAiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpTdXBlckNsYXNzICAgIGNvbXBsZXRpb246U3VwZXJDbGFzcyAgICByZWxldmFuY2U6IiArIChSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9VTlFVQUxJRklFRCkgKyAiXG4iICsKLQkJCSJlbGVtZW50OlN1cGVySW50ZXJmYWNlICAgIGNvbXBsZXRpb246U3VwZXJJbnRlcmZhY2UgICAgcmVsZXZhbmNlOiIgKyAoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpICsgIlxuIiArCi0JCQkiZWxlbWVudDpzdXBlciAgICBjb21wbGV0aW9uOnN1cGVyICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSArICJcbiIgKwotCQkJImVsZW1lbnQ6c3VwZXIgICAgY29tcGxldGlvbjpzdXBlcigpICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkVHJ5MSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRUcnkxLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ0ciI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OnRyeSAgICBjb21wbGV0aW9uOnRyeSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFRyeTIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkVHJ5Mi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidHIiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDp0cnVlICAgIGNvbXBsZXRpb246dHJ1ZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFRyeTMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkVHJ5My5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidHJ5IjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZERvMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmREbzEuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImRvIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6ZG8gICAgY29tcGxldGlvbjpkbyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhBQ1RfTkFNRSkrIlxuIisKLQkJCSJlbGVtZW50OmRvdWJsZSAgICBjb21wbGV0aW9uOmRvdWJsZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZERvMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmREbzIuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImRvIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6ZG91YmxlICAgIGNvbXBsZXRpb246ZG91YmxlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkRG8zKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZERvMy5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZG8iOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpkb3VibGUgICAgY29tcGxldGlvbjpkb3VibGUgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRGb3IxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEZvcjEuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZvIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6Zm9vICAgIGNvbXBsZXRpb246Zm9vKCkgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iKwotCQkJImVsZW1lbnQ6Zm9yICAgIGNvbXBsZXRpb246Zm9yICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkRm9yMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRGb3IyLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmbyI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OmZvbyAgICBjb21wbGV0aW9uOmZvbygpICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEZvcjMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkRm9yMy5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZm8iOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkSWYxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZElmMS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaWYiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDppZiAgICBjb21wbGV0aW9uOmlmICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWEFDVF9OQU1FKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkSWYyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZElmMi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaWYiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkSWYzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZElmMy5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaWYiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkUmV0dXJuMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRSZXR1cm4xLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJyZSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OnJldHVybiAgICBjb21wbGV0aW9uOnJldHVybiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFJldHVybjIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkUmV0dXJuMi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicmUiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkUmV0dXJuMygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRSZXR1cm4zLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJyZSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRTd2l0Y2gxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFN3aXRjaDEuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInN3IjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6c3dpdGNoICAgIGNvbXBsZXRpb246c3dpdGNoICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkU3dpdGNoMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRTd2l0Y2gyLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJzdyI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRTd2l0Y2gzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFN3aXRjaDMuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInN3IjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFRocm93MSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRUaHJvdzEuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRociI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OlRocm93YWJsZSAgICBjb21wbGV0aW9uOlRocm93YWJsZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpKyJcbiIrCi0JCQkiZWxlbWVudDp0aHJvdyAgICBjb21wbGV0aW9uOnRocm93ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkVGhyb3cyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFRocm93Mi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidGhyIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6VGhyb3dhYmxlICAgIGNvbXBsZXRpb246VGhyb3dhYmxlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9VTlFVQUxJRklFRCksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFRocm93MygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRUaHJvdzMuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRociI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OlRocm93YWJsZSAgICBjb21wbGV0aW9uOlRocm93YWJsZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRBc3NlcnQxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEFzc2VydDEuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImFzIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6YXNzZXJ0ICAgIGNvbXBsZXRpb246YXNzZXJ0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkQXNzZXJ0MigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRBc3NlcnQyLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJhcyI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRBc3NlcnQzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEFzc2VydDMuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImFzIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEVsc2UxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEVsc2UxLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJlbHMiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDplbHNlICAgIGNvbXBsZXRpb246ZWxzZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEVsc2UyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEVsc2UyLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJlbHMiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkRWxzZTMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkRWxzZTMuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImVscyI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRFbHNlNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRFbHNlNC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZWxzIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZENhdGNoMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRDYXRjaDEuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNhdCI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OmNhdGNoICAgIGNvbXBsZXRpb246Y2F0Y2ggICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRDYXRjaDIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkQ2F0Y2gyLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJjYXQiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkQ2F0Y2gzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZENhdGNoMy5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2F0IjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZENhdGNoNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRDYXRjaDQuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNhdCI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRDYXRjaDUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkQ2F0Y2g1LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJjYXQiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpjYXRjaCAgICBjb21wbGV0aW9uOmNhdGNoICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSsiXG4iKwotCQkJImVsZW1lbnQ6Y2F0Y2h6ICAgIGNvbXBsZXRpb246Y2F0Y2h6ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEZpbmFsbHkxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEZpbmFsbHkxLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmaW5hbGwiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpmaW5hbGx5ICAgIGNvbXBsZXRpb246ZmluYWxseSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEZpbmFsbHkyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEZpbmFsbHkyLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmaW5hbGwiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkRmluYWxseTMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkRmluYWxseTMuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZpbmFsbCI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRGaW5hbGx5NCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRGaW5hbGx5NC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZmluYWxsIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEZpbmFsbHk1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEZpbmFsbHk1LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmaW5hbGwiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpmaW5hbGx5ICAgIGNvbXBsZXRpb246ZmluYWxseSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEZpbmFsbHk2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEZpbmFsbHk2LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmaW5hbGwiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpmaW5hbGx5ICAgIGNvbXBsZXRpb246ZmluYWxseSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSkrIlxuIisKLQkJCSJlbGVtZW50OmZpbmFsbHl6ICAgIGNvbXBsZXRpb246ZmluYWxseXogICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkRmluYWxseTcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkRmluYWxseTcuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZpbmFsbCI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OmZpbmFsbHl6ICAgIGNvbXBsZXRpb246ZmluYWxseXogICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkQ29udGludWUxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZENvbnRpbnVlMS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY29udCI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OmNvbnRpbnVlICAgIGNvbXBsZXRpb246Y29udGludWUgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRDb250aW51ZTIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkQ29udGludWUyLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJjb250IjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEJyZWFrMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRCcmVhazEuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImJyZSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OmJyZWFrICAgIGNvbXBsZXRpb246YnJlYWsgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRCcmVhazIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkQnJlYWsyLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJicmUiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkQnJlYWszKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEJyZWFrMy5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYnJlIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6YnJlYWsgICAgY29tcGxldGlvbjpicmVhayAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFdoaWxlMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRXaGlsZTEuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIndoIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6d2hpbGUgICAgY29tcGxldGlvbjp3aGlsZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFdoaWxlMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRXaGlsZTIuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIndoIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFdoaWxlMygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRXaGlsZTMuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIndoIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFdoaWxlNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRXaGlsZTQuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIndoIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6d2hpbGUgICAgY29tcGxldGlvbjp3aGlsZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFdoaWxlNSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRXaGlsZTUuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIndoIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6d2hpbGUgICAgY29tcGxldGlvbjp3aGlsZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEV4dGVuZHMxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEV4dGVuZHMxLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJleHQiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpleHRlbmRzICAgIGNvbXBsZXRpb246ZXh0ZW5kcyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEV4dGVuZHMyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEV4dGVuZHMyLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJleHQiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkRXh0ZW5kczMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkRXh0ZW5kczMuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImV4dCI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRFeHRlbmRzNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRFeHRlbmRzNC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZXh0IjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6ZXh0ZW5kcyAgICBjb21wbGV0aW9uOmV4dGVuZHMgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRFeHRlbmRzNSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRFeHRlbmRzNS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZXh0IjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEltcGxlbWVudHMxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEltcGxlbWVudHMxLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbXAiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDppbXBsZW1lbnRzICAgIGNvbXBsZXRpb246aW1wbGVtZW50cyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEltcGxlbWVudHMyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEltcGxlbWVudHMyLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbXAiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDppbXBsZW1lbnRzICAgIGNvbXBsZXRpb246aW1wbGVtZW50cyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEltcGxlbWVudHMzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEltcGxlbWVudHMzLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbXAiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkUGFja2FnZTEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkUGFja2FnZTEuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInBhYyI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OnBhY2thZ2UgICAgY29tcGxldGlvbjpwYWNrYWdlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkUGFja2FnZTIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAicCIsICJDb21wbGV0aW9uS2V5d29yZFBhY2thZ2UyLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJwYWMiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkUGFja2FnZTMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkUGFja2FnZTMuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInBhYyI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRQYWNrYWdlNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRQYWNrYWdlNC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicGFjIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEltcG9ydDEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkSW1wb3J0MS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW1wIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6aW1wb3J0ICAgIGNvbXBsZXRpb246aW1wb3J0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkSW1wb3J0MigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICJwIiwgIkNvbXBsZXRpb25LZXl3b3JkSW1wb3J0Mi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW1wIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6aW1wb3J0ICAgIGNvbXBsZXRpb246aW1wb3J0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkSW1wb3J0MygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRJbXBvcnQzLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbXAiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDppbXBvcnQgICAgY29tcGxldGlvbjppbXBvcnQgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRJbXBvcnQ0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEltcG9ydDQuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImltcCI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRDYXNlMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRDYXNlMS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2FzIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6Y2FzZSAgICBjb21wbGV0aW9uOmNhc2UgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRDYXNlMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRDYXNlMi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2FzIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6Y2FzZSAgICBjb21wbGV0aW9uOmNhc2UgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRDYXNlMygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRDYXNlMy5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2FzIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6Y2FzZSAgICBjb21wbGV0aW9uOmNhc2UgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRDYXNlNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRDYXNlNC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2FzIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6Y2FzZSAgICBjb21wbGV0aW9uOmNhc2UgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRDYXNlNSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRDYXNlNS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2FzIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZERlZmF1bHQxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZERlZmF1bHQxLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJkZWYiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpkZWZhdWx0ICAgIGNvbXBsZXRpb246ZGVmYXVsdCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZERlZmF1bHQyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZERlZmF1bHQyLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJkZWYiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpEZWZhdWx0ICAgIGNvbXBsZXRpb246RGVmYXVsdCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpKyJcbiIrCi0JCQkiZWxlbWVudDpkZWZhdWx0ICAgIGNvbXBsZXRpb246ZGVmYXVsdCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZERlZmF1bHQzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZERlZmF1bHQzLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJkZWYiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpEZWZhdWx0ICAgIGNvbXBsZXRpb246RGVmYXVsdCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpKyJcbiIrCi0JCQkiZWxlbWVudDpkZWZhdWx0ICAgIGNvbXBsZXRpb246ZGVmYXVsdCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZERlZmF1bHQ0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZERlZmF1bHQ0LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJkZWYiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpEZWZhdWx0ICAgIGNvbXBsZXRpb246RGVmYXVsdCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmREZWZhdWx0NSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmREZWZhdWx0NS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZGVmIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6RGVmYXVsdCAgICBjb21wbGV0aW9uOkRlZmF1bHQgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX1VOUVVBTElGSUVEKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkQ2xhc3MxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZENsYXNzMS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2xhIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6Y2xhc3MgICAgY29tcGxldGlvbjpjbGFzcyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZENsYXNzMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRDbGFzczIuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNsYSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OmNsYXNzICAgIGNvbXBsZXRpb246Y2xhc3MgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRDbGFzczMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkQ2xhc3MzLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJjbGEiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpjbGFzcyAgICBjb21wbGV0aW9uOmNsYXNzICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkQ2xhc3M0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZENsYXNzNC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2xhIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6Y2xhc3MgICAgY29tcGxldGlvbjpjbGFzcyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZENsYXNzNSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRDbGFzczUuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNsYSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OmNsYXNzICAgIGNvbXBsZXRpb246Y2xhc3MgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRDbGFzczYoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkQ2xhc3M2LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJjbGEiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpDbGFzcyAgICBjb21wbGV0aW9uOkNsYXNzICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJCSJlbGVtZW50OkNsYXNzV2l0aENvbXBsZXhOYW1lICAgIGNvbXBsZXRpb246Q2xhc3NXaXRoQ29tcGxleE5hbWUgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX1VOUVVBTElGSUVEKSsiXG4iKwotCQkJImVsZW1lbnQ6Y2xhc3MgICAgY29tcGxldGlvbjpjbGFzcyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZENsYXNzNygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRDbGFzczcuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNsYSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OkNsYXNzICAgIGNvbXBsZXRpb246Q2xhc3MgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX1VOUVVBTElGSUVEKSsiXG4iKwotCQkJImVsZW1lbnQ6Q2xhc3NXaXRoQ29tcGxleE5hbWUgICAgY29tcGxldGlvbjpDbGFzc1dpdGhDb21wbGV4TmFtZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpKyJcbiIrCi0JCQkiZWxlbWVudDpjbGFzcyAgICBjb21wbGV0aW9uOmNsYXNzICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkQ2xhc3M4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZENsYXNzOC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2xhIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6Q2xhc3MgICAgY29tcGxldGlvbjpDbGFzcyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpKyJcbiIrCi0JCQkiZWxlbWVudDpDbGFzc1dpdGhDb21wbGV4TmFtZSAgICBjb21wbGV0aW9uOkNsYXNzV2l0aENvbXBsZXhOYW1lICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJCSJlbGVtZW50OmNsYXNzICAgIGNvbXBsZXRpb246Y2xhc3MgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRDbGFzczkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkQ2xhc3M5LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJjbGEiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpDbGFzcyAgICBjb21wbGV0aW9uOkNsYXNzICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJCSJlbGVtZW50OkNsYXNzV2l0aENvbXBsZXhOYW1lICAgIGNvbXBsZXRpb246Q2xhc3NXaXRoQ29tcGxleE5hbWUgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX1VOUVVBTElGSUVEKSsiXG4iKwotCQkJImVsZW1lbnQ6Y2xhc3MgICAgY29tcGxldGlvbjpjbGFzcyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZENsYXNzMTAoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkQ2xhc3MxMC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2xhIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6Q2xhc3MgICAgY29tcGxldGlvbjpDbGFzcyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpKyJcbiIrCi0JCQkiZWxlbWVudDpDbGFzc1dpdGhDb21wbGV4TmFtZSAgICBjb21wbGV0aW9uOkNsYXNzV2l0aENvbXBsZXhOYW1lICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJCSJlbGVtZW50OmNsYXNzICAgIGNvbXBsZXRpb246Y2xhc3MgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRDbGFzczExKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZENsYXNzMTEuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNsYSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OkNsYXNzICAgIGNvbXBsZXRpb246Q2xhc3MgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX1VOUVVBTElGSUVEKSsiXG4iKwotCQkJImVsZW1lbnQ6Q2xhc3NXaXRoQ29tcGxleE5hbWUgICAgY29tcGxldGlvbjpDbGFzc1dpdGhDb21wbGV4TmFtZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpKyJcbiIrCi0JCQkiZWxlbWVudDpjbGFzcyAgICBjb21wbGV0aW9uOmNsYXNzICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkQ2xhc3MxMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRDbGFzczEyLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJjbGEiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpDbGFzcyAgICBjb21wbGV0aW9uOkNsYXNzICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJCSJlbGVtZW50OkNsYXNzV2l0aENvbXBsZXhOYW1lICAgIGNvbXBsZXRpb246Q2xhc3NXaXRoQ29tcGxleE5hbWUgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX1VOUVVBTElGSUVEKSsiXG4iKwotCQkJImVsZW1lbnQ6Y2xhc3MgICAgY29tcGxldGlvbjpjbGFzcyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEludGVyZmFjZTEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlMS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW50ZXJmIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6aW50ZXJmYWNlICAgIGNvbXBsZXRpb246aW50ZXJmYWNlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UyLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbnRlcmYiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDppbnRlcmZhY2UgICAgY29tcGxldGlvbjppbnRlcmZhY2UgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEludGVyZmFjZTMuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImludGVyZiI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OmludGVyZmFjZSAgICBjb21wbGV0aW9uOmludGVyZmFjZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEludGVyZmFjZTQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlNC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW50ZXJmIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6aW50ZXJmYWNlICAgIGNvbXBsZXRpb246aW50ZXJmYWNlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlNSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2U1LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbnRlcmYiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDppbnRlcmZhY2UgICAgY29tcGxldGlvbjppbnRlcmZhY2UgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRJbnRlcmZhY2U2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEludGVyZmFjZTYuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImludGVyZiI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OmludGVyZmFjZSAgICBjb21wbGV0aW9uOmludGVyZmFjZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEludGVyZmFjZTcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlNy5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW50ZXJmIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6aW50ZXJmYWNlICAgIGNvbXBsZXRpb246aW50ZXJmYWNlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlOCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2U4LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbnRlcmYiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDppbnRlcmZhY2UgICAgY29tcGxldGlvbjppbnRlcmZhY2UgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRJbnRlcmZhY2U5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEludGVyZmFjZTkuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImludGVyZiI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OmludGVyZmFjZSAgICBjb21wbGV0aW9uOmludGVyZmFjZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFRocm93czEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkVGhyb3dzMS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidGhybyI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OnRocm93cyAgICBjb21wbGV0aW9uOnRocm93cyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFRocm93czIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkVGhyb3dzMi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidGhybyI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRUaHJvd3MzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFRocm93czMuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRocm8iOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDp0aHJvd3MgICAgY29tcGxldGlvbjp0aHJvd3MgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRUaHJvd3M0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFRocm93czQuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRocm8iOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDp0aHJvd3MgICAgY29tcGxldGlvbjp0aHJvd3MgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRTeW5jaHJvbml6ZWQxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFN5bmNocm9uaXplZDEuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInN5biI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OnN5bmNocm9uaXplZCAgICBjb21wbGV0aW9uOnN5bmNocm9uaXplZCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFN5bmNocm9uaXplZDIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkU3luY2hyb25pemVkMi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3luIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFN5bmNocm9uaXplZDMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkU3luY2hyb25pemVkMy5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3luIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6c3luY2hyb25pemVkICAgIGNvbXBsZXRpb246c3luY2hyb25pemVkICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkU3luY2hyb25pemVkNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRTeW5jaHJvbml6ZWQ0LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJzeW4iOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkU3luY2hyb25pemVkNSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRTeW5jaHJvbml6ZWQ1LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJzeW4iOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpzeW5jaHJvbml6ZWQgICAgY29tcGxldGlvbjpzeW5jaHJvbml6ZWQgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRTeW5jaHJvbml6ZWQ2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFN5bmNocm9uaXplZDYuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInN5biI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmROYXRpdmUxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZE5hdGl2ZTEuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIm5hdCI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50Om5hdGl2ZSAgICBjb21wbGV0aW9uOm5hdGl2ZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZE5hdGl2ZTIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkTmF0aXZlMi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibmF0IjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZE5hdGl2ZTMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkTmF0aXZlMy5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibmF0IjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6bmF0aXZlICAgIGNvbXBsZXRpb246bmF0aXZlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkTmF0aXZlNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmROYXRpdmU0LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuYXQiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkU3RyaWN0ZnAxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFN0cmljdGZwMS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3RyaWMiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpzdHJpY3RmcCAgICBjb21wbGV0aW9uOnN0cmljdGZwICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkU3RyaWN0ZnAyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFN0cmljdGZwMi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3RyaWMiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkU3RyaWN0ZnAzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFN0cmljdGZwMy5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3RyaWMiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpzdHJpY3RmcCAgICBjb21wbGV0aW9uOnN0cmljdGZwICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkU3RyaWN0ZnA0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFN0cmljdGZwNC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3RyaWMiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkVm9sYXRpbGUxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFZvbGF0aWxlMS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidm9sIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6dm9sYXRpbGUgICAgY29tcGxldGlvbjp2b2xhdGlsZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFZvbGF0aWxlMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRWb2xhdGlsZTIuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInZvbCI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRWb2xhdGlsZTMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkVm9sYXRpbGUzLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ2b2wiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDp2b2xhdGlsZSAgICBjb21wbGV0aW9uOnZvbGF0aWxlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkVm9sYXRpbGU0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFZvbGF0aWxlNC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidm9sIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFRyYW5zaWVudDEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkVHJhbnNpZW50MS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidHJhbiI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OnRyYW5zaWVudCAgICBjb21wbGV0aW9uOnRyYW5zaWVudCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFRyYW5zaWVudDIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkVHJhbnNpZW50Mi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidHJhbiI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRUcmFuc2llbnQzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFRyYW5zaWVudDMuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRyYW4iOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDp0cmFuc2llbnQgICAgY29tcGxldGlvbjp0cmFuc2llbnQgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRUcmFuc2llbnQ0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFRyYW5zaWVudDQuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRyYW4iOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkTmV3MSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmROZXcxLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuZSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50Om5ldyAgICBjb21wbGV0aW9uOm5ldyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZE5ldzIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkTmV3Mi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibmUiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpuZXcgICAgY29tcGxldGlvbjpuZXcgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmROZXczKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZE5ldzMuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIm5lIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6bmV3ICAgIGNvbXBsZXRpb246bmV3ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkTmV3NCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmROZXc0LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuZSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50Om5ldyAgICBjb21wbGV0aW9uOm5ldyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZE5ldzUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkTmV3NS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibmUiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpuZXcgICAgY29tcGxldGlvbjpuZXcgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmROZXc2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZE5ldzYuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIm5lIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6bmV3ICAgIGNvbXBsZXRpb246bmV3ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkTmV3NygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmROZXc3LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuZSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50Om5ldyAgICBjb21wbGV0aW9uOm5ldyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZE5ldzgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkTmV3OC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibmUiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpuZXcgICAgY29tcGxldGlvbjpuZXcgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRTdGF0aWMxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFN0YXRpYzEuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInN0YSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OnN0YXRpYyAgICBjb21wbGV0aW9uOnN0YXRpYyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFN0YXRpYzIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkU3RhdGljMi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3RhIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6c3RhdGljICAgIGNvbXBsZXRpb246c3RhdGljICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkU3RhdGljMygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRTdGF0aWMzLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJzdGEiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpzdGF0aWMgICAgY29tcGxldGlvbjpzdGF0aWMgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRTdGF0aWM0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFN0YXRpYzQuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInN0YSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRTdGF0aWM1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFN0YXRpYzUuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInN0YSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OnN0YXRpYyAgICBjb21wbGV0aW9uOnN0YXRpYyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFB1YmxpYzEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkUHVibGljMS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHViIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6cHVibGljICAgIGNvbXBsZXRpb246cHVibGljICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkUHVibGljMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRQdWJsaWMyLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJwdWIiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpwdWJsaWMgICAgY29tcGxldGlvbjpwdWJsaWMgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRQdWJsaWMzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFB1YmxpYzMuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInB1YiI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OnB1YmxpYyAgICBjb21wbGV0aW9uOnB1YmxpYyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFB1YmxpYzQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkUHVibGljNC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHViIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFB1YmxpYzUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkUHVibGljNS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHViIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFB1YmxpYzYoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkUHVibGljNi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHViIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6cHVibGljICAgIGNvbXBsZXRpb246cHVibGljICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkUHVibGljNygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRQdWJsaWM3LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJwdWIiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpwdWJsaWMgICAgY29tcGxldGlvbjpwdWJsaWMgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRQdWJsaWM4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFB1YmxpYzguamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInB1YiI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OnB1YmxpYyAgICBjb21wbGV0aW9uOnB1YmxpYyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFB1YmxpYzkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkUHVibGljOS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHViIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFB1YmxpYzEwKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFB1YmxpYzEwLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJwdWIiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkUHJpdmF0ZTEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkUHJpdmF0ZTEuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInByaSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OnByaXZhdGUgICAgY29tcGxldGlvbjpwcml2YXRlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkUHJpdmF0ZTIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkUHJpdmF0ZTIuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInByaSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OnByaXZhdGUgICAgY29tcGxldGlvbjpwcml2YXRlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkUHJpdmF0ZTMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkUHJpdmF0ZTMuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInByaSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OnByaXZhdGUgICAgY29tcGxldGlvbjpwcml2YXRlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkUHJpdmF0ZTQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkUHJpdmF0ZTQuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInByaSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRQcml2YXRlNSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRQcml2YXRlNS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHJpIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFByb3RlY3RlZDEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkUHJvdGVjdGVkMS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHJvIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6cHJvdGVjdGVkICAgIGNvbXBsZXRpb246cHJvdGVjdGVkICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkUHJvdGVjdGVkMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRQcm90ZWN0ZWQyLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJwcm8iOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpwcm90ZWN0ZWQgICAgY29tcGxldGlvbjpwcm90ZWN0ZWQgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRQcm90ZWN0ZWQzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFByb3RlY3RlZDMuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInBybyI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OnByb3RlY3RlZCAgICBjb21wbGV0aW9uOnByb3RlY3RlZCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFByb3RlY3RlZDQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkUHJvdGVjdGVkNC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHJvIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFByb3RlY3RlZDUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkUHJvdGVjdGVkNS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHJvIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEZpbmFsMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRGaW5hbDEuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZpbiI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OmZpbmFsICAgIGNvbXBsZXRpb246ZmluYWwgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRGaW5hbDIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkRmluYWwyLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmaW4iOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkRmluYWwzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEZpbmFsMy5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZmluIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6ZmluYWwgICAgY29tcGxldGlvbjpmaW5hbCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEZpbmFsNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRGaW5hbDQuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZpbiI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OmZpbmFsICAgIGNvbXBsZXRpb246ZmluYWwgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRGaW5hbDUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkRmluYWw1LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmaW4iOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpmaW5hbCAgICBjb21wbGV0aW9uOmZpbmFsICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSsiXG4iKwotCQkJImVsZW1lbnQ6ZmluYWxpemUgICAgY29tcGxldGlvbjpwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRGaW5hbDYoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkRmluYWw2LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmaW4iOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkRmluYWw3KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEZpbmFsNy5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZmluIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6ZmluYWwgICAgY29tcGxldGlvbjpmaW5hbCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSkrIlxuIisKLQkJCSJlbGVtZW50OmZpbmFsaXplICAgIGNvbXBsZXRpb246cHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkRmluYWw4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEZpbmFsOC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZmluIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6ZmluYWwgICAgY29tcGxldGlvbjpmaW5hbCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEZpbmFsOSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRGaW5hbDkuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZpbiI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OmZpbmFsICAgIGNvbXBsZXRpb246ZmluYWwgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpKyJcbiIrCi0JCQkiZWxlbWVudDpmaW5hbGl6ZSAgICBjb21wbGV0aW9uOmZpbmFsaXplKCkgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgK1JfVU5RVUFMSUZJRUQpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRBYnN0cmFjdDEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3QxLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJhYnMiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDphYnN0cmFjdCAgICBjb21wbGV0aW9uOmFic3RyYWN0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3QyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEFic3RyYWN0Mi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYWJzIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEFic3RyYWN0MygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDMuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImFicyI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OmFic3RyYWN0ICAgIGNvbXBsZXRpb246YWJzdHJhY3QgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRBYnN0cmFjdDQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3Q0LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJhYnMiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDphYnN0cmFjdCAgICBjb21wbGV0aW9uOmFic3RyYWN0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3Q1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEFic3RyYWN0NS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYWJzIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6YWJzdHJhY3QgICAgY29tcGxldGlvbjphYnN0cmFjdCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEFic3RyYWN0NigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDYuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImFicyI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRBYnN0cmFjdDcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3Q3LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJhYnMiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDphYnN0cmFjdCAgICBjb21wbGV0aW9uOmFic3RyYWN0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3Q4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEFic3RyYWN0OC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYWJzIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6YWJzdHJhY3QgICAgY29tcGxldGlvbjphYnN0cmFjdCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFRydWUxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFRydWUxLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ0cnUiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkVHJ1ZTIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkVHJ1ZTIuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRydSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OnRydWUgICAgY29tcGxldGlvbjp0cnVlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkRmFsc2UxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEZhbHNlMS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZmFsIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEZhbHNlMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRGYWxzZTIuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZhbCI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OmZhbHNlICAgIGNvbXBsZXRpb246ZmFsc2UgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmROdWxsMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmROdWxsMS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibnVsIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZE51bGwyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZE51bGwyLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJudWwiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpudWxsICAgIGNvbXBsZXRpb246bnVsbCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEluc3RhbmNlb2YxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEluc3RhbmNlb2YxLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbnMiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDppbnN0YW5jZW9mICAgIGNvbXBsZXRpb246aW5zdGFuY2VvZiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEluc3RhbmNlb2YyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEluc3RhbmNlb2YyLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbnMiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkSW5zdGFuY2VvZjMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkSW5zdGFuY2VvZjMuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImlucyI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFRoaXM4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFRoaXM4LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ0aGkiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDp0aGlzICAgIGNvbXBsZXRpb246dGhpcyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFRoaXM5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFRoaXM5LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ0aGkiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDp0aGlzICAgIGNvbXBsZXRpb246dGhpcyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFRoaXMxMCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRUaGlzMTAuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRoaSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRUaGlzMTEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkVGhpczExLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ0aGkiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDp0aGlzICAgIGNvbXBsZXRpb246dGhpcyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFRoaXMxMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRUaGlzMTIuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRoaSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRUaGlzMTMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkVGhpczEzLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ0aGkiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDp0aGlzICAgIGNvbXBsZXRpb246dGhpcyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFRoaXMxNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRUaGlzMTQuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRoaSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRTdXBlcjcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkU3VwZXI3LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJzdXAiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpTdXBlckNsYXNzICAgIGNvbXBsZXRpb246U3VwZXJDbGFzcyAgICByZWxldmFuY2U6IiArIChSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9VTlFVQUxJRklFRCkgKyAiXG4iICsKLQkJCSJlbGVtZW50OlN1cGVySW50ZXJmYWNlICAgIGNvbXBsZXRpb246U3VwZXJJbnRlcmZhY2UgICAgcmVsZXZhbmNlOiIgKyAoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpICsgIlxuIiArCi0JCQkiZWxlbWVudDpzdXBlciAgICBjb21wbGV0aW9uOnN1cGVyICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkU3VwZXI4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFN1cGVyOC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3VwIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6U3VwZXJDbGFzcyAgICBjb21wbGV0aW9uOlN1cGVyQ2xhc3MgICAgcmVsZXZhbmNlOiIgKyAoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpICsgIlxuIiArCi0JCQkiZWxlbWVudDpTdXBlckludGVyZmFjZSAgICBjb21wbGV0aW9uOlN1cGVySW50ZXJmYWNlICAgIHJlbGV2YW5jZToiICsgKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX1VOUVVBTElGSUVEKSArICJcbiIgKwotCQkJImVsZW1lbnQ6c3VwZXIgICAgY29tcGxldGlvbjpzdXBlciAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFN1cGVyOSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRTdXBlcjkuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInN1cCI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OlN1cGVyQ2xhc3MgICAgY29tcGxldGlvbjpTdXBlckNsYXNzICAgIHJlbGV2YW5jZToiICsgKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX1VOUVVBTElGSUVEKSArICJcbiIgKwotCQkJImVsZW1lbnQ6U3VwZXJJbnRlcmZhY2UgICAgY29tcGxldGlvbjpTdXBlckludGVyZmFjZSAgICByZWxldmFuY2U6IiArIChSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9VTlFVQUxJRklFRCksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFN1cGVyMTAoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkU3VwZXIxMC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3VwIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6U3VwZXJDbGFzcyAgICBjb21wbGV0aW9uOlN1cGVyQ2xhc3MgICAgcmVsZXZhbmNlOiIgKyAoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpICsgIlxuIiArCi0JCQkiZWxlbWVudDpTdXBlckludGVyZmFjZSAgICBjb21wbGV0aW9uOlN1cGVySW50ZXJmYWNlICAgIHJlbGV2YW5jZToiICsgKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX1VOUVVBTElGSUVEKSArICJcbiIgKwotCQkJImVsZW1lbnQ6c3VwZXIgICAgY29tcGxldGlvbjpzdXBlciAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFN1cGVyMTEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkU3VwZXIxMS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3VwIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6U3VwZXJDbGFzcyAgICBjb21wbGV0aW9uOlN1cGVyQ2xhc3MgICAgcmVsZXZhbmNlOiIgKyAoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpICsgIlxuIiArCi0JCQkiZWxlbWVudDpTdXBlckludGVyZmFjZSAgICBjb21wbGV0aW9uOlN1cGVySW50ZXJmYWNlICAgIHJlbGV2YW5jZToiICsgKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX1VOUVVBTElGSUVEKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkU3VwZXIxMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRTdXBlcjEyLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJzdXAiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpTdXBlckNsYXNzICAgIGNvbXBsZXRpb246U3VwZXJDbGFzcyAgICByZWxldmFuY2U6IiArIChSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9VTlFVQUxJRklFRCkgKyAiXG4iICsKLQkJCSJlbGVtZW50OlN1cGVySW50ZXJmYWNlICAgIGNvbXBsZXRpb246U3VwZXJJbnRlcmZhY2UgICAgcmVsZXZhbmNlOiIgKyAoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpICsgIlxuIiArCi0JCQkiZWxlbWVudDpzdXBlciAgICBjb21wbGV0aW9uOnN1cGVyICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSArICJcbiIgKwotCQkJImVsZW1lbnQ6c3VwZXIgICAgY29tcGxldGlvbjpzdXBlcigpICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkVHJ5NCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRUcnk0LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ0ciI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OnRyeSAgICBjb21wbGV0aW9uOnRyeSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFRyeTUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkVHJ5NS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidHIiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDp0cnVlICAgIGNvbXBsZXRpb246dHJ1ZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFRyeTYoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkVHJ5Ni5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidHJ5IjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZERvNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmREbzQuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImRvIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6ZG8gICAgY29tcGxldGlvbjpkbyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhBQ1RfTkFNRSkrIlxuIisKLQkJCSJlbGVtZW50OmRvdWJsZSAgICBjb21wbGV0aW9uOmRvdWJsZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZERvNSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmREbzUuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImRvIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6ZG91YmxlICAgIGNvbXBsZXRpb246ZG91YmxlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkRG82KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZERvNi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZG8iOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpkb3VibGUgICAgY29tcGxldGlvbjpkb3VibGUgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRGb3I0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEZvcjQuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZvIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6Zm9vICAgIGNvbXBsZXRpb246Zm9vKCkgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iKwotCQkJImVsZW1lbnQ6Zm9yICAgIGNvbXBsZXRpb246Zm9yICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkRm9yNSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRGb3I1LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmbyI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OmZvbyAgICBjb21wbGV0aW9uOmZvbygpICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEZvcjYoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkRm9yNi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZm8iOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkSWY0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZElmNC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaWYiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDppZiAgICBjb21wbGV0aW9uOmlmICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWEFDVF9OQU1FKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkSWY1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZElmNS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaWYiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkSWY2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZElmNi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaWYiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkUmV0dXJuNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRSZXR1cm40LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJyZSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OnJldHVybiAgICBjb21wbGV0aW9uOnJldHVybiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFJldHVybjUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkUmV0dXJuNS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicmUiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkUmV0dXJuNigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRSZXR1cm42LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJyZSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRTd2l0Y2g0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFN3aXRjaDQuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInN3IjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6c3dpdGNoICAgIGNvbXBsZXRpb246c3dpdGNoICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkU3dpdGNoNSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRTd2l0Y2g1LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJzdyI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRTd2l0Y2g2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFN3aXRjaDYuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInN3IjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFRocm93NCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRUaHJvdzQuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRociI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OlRocm93YWJsZSAgICBjb21wbGV0aW9uOlRocm93YWJsZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpKyJcbiIrCi0JCQkiZWxlbWVudDp0aHJvdyAgICBjb21wbGV0aW9uOnRocm93ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkVGhyb3c1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFRocm93NS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidGhyIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6VGhyb3dhYmxlICAgIGNvbXBsZXRpb246VGhyb3dhYmxlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9VTlFVQUxJRklFRCksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFRocm93NigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRUaHJvdzYuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRociI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OlRocm93YWJsZSAgICBjb21wbGV0aW9uOlRocm93YWJsZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRBc3NlcnQ0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEFzc2VydDQuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImFzIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6YXNzZXJ0ICAgIGNvbXBsZXRpb246YXNzZXJ0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkQXNzZXJ0NSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRBc3NlcnQ1LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJhcyI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRBc3NlcnQ2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEFzc2VydDYuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImFzIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEVsc2U1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEVsc2U1LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJlbHMiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDplbHNlICAgIGNvbXBsZXRpb246ZWxzZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEVsc2U2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEVsc2U2LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJlbHMiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkRWxzZTcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkRWxzZTcuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImVscyI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRFbHNlOCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRFbHNlOC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZWxzIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZENhdGNoNigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRDYXRjaDYuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNhdCI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OmNhdGNoICAgIGNvbXBsZXRpb246Y2F0Y2ggICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRDYXRjaDcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkQ2F0Y2g3LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJjYXQiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkQ2F0Y2g4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZENhdGNoOC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2F0IjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZENhdGNoOSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRDYXRjaDkuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNhdCI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRDYXRjaDEwKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZENhdGNoMTAuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNhdCI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OmNhdGNoICAgIGNvbXBsZXRpb246Y2F0Y2ggICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpKyJcbiIrCi0JCQkiZWxlbWVudDpjYXRjaHogICAgY29tcGxldGlvbjpjYXRjaHogICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkRmluYWxseTgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkRmluYWxseTguamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZpbmFsbCI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OmZpbmFsbHkgICAgY29tcGxldGlvbjpmaW5hbGx5ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkRmluYWxseTkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkRmluYWxseTkuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZpbmFsbCI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRGaW5hbGx5MTAoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkRmluYWxseTEwLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmaW5hbGwiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkRmluYWxseTExKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEZpbmFsbHkxMS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZmluYWxsIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEZpbmFsbHkxMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRGaW5hbGx5MTIuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZpbmFsbCI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OmZpbmFsbHkgICAgY29tcGxldGlvbjpmaW5hbGx5ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkRmluYWxseTEzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEZpbmFsbHkxMy5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZmluYWxsIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6ZmluYWxseSAgICBjb21wbGV0aW9uOmZpbmFsbHkgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpKyJcbiIrCi0JCQkiZWxlbWVudDpmaW5hbGx5eiAgICBjb21wbGV0aW9uOmZpbmFsbHl6ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEZpbmFsbHkxNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRGaW5hbGx5MTQuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZpbmFsbCI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OmZpbmFsbHl6ICAgIGNvbXBsZXRpb246ZmluYWxseXogICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkQ29udGludWUzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZENvbnRpbnVlMy5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY29udCI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OmNvbnRpbnVlICAgIGNvbXBsZXRpb246Y29udGludWUgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRDb250aW51ZTQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkQ29udGludWU0LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJjb250IjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEJyZWFrNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRCcmVhazQuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImJyZSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OmJyZWFrICAgIGNvbXBsZXRpb246YnJlYWsgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRCcmVhazUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkQnJlYWs1LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJicmUiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkQnJlYWs2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEJyZWFrNi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiYnJlIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6YnJlYWsgICAgY29tcGxldGlvbjpicmVhayAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFdoaWxlNigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRXaGlsZTYuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIndoIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6d2hpbGUgICAgY29tcGxldGlvbjp3aGlsZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFdoaWxlNygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRXaGlsZTcuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIndoIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFdoaWxlOCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRXaGlsZTguamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIndoIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFdoaWxlOSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRXaGlsZTkuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIndoIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6d2hpbGUgICAgY29tcGxldGlvbjp3aGlsZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFdoaWxlMTAoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkV2hpbGUxMC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAid2giOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDp3aGlsZSAgICBjb21wbGV0aW9uOndoaWxlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkRXh0ZW5kczYoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkRXh0ZW5kczYuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImV4dCI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OmV4dGVuZHMgICAgY29tcGxldGlvbjpleHRlbmRzICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkRXh0ZW5kczcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkRXh0ZW5kczcuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImV4dCI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRFeHRlbmRzOCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRFeHRlbmRzOC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZXh0IjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEV4dGVuZHM5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEV4dGVuZHM5LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJleHQiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpleHRlbmRzICAgIGNvbXBsZXRpb246ZXh0ZW5kcyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEV4dGVuZHMxMCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRFeHRlbmRzMTAuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImV4dCI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRJbXBsZW1lbnRzNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRJbXBsZW1lbnRzNC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW1wIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6aW1wbGVtZW50cyAgICBjb21wbGV0aW9uOmltcGxlbWVudHMgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRJbXBsZW1lbnRzNSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRJbXBsZW1lbnRzNS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW1wIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6aW1wbGVtZW50cyAgICBjb21wbGV0aW9uOmltcGxlbWVudHMgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRJbXBsZW1lbnRzNigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRJbXBsZW1lbnRzNi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW1wIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFBhY2thZ2U1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFBhY2thZ2U1LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJwYWMiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkUGFja2FnZTYoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkUGFja2FnZTYuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInBhYyI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRQYWNrYWdlNygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRQYWNrYWdlNy5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicGFjIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFBhY2thZ2U4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgInAiLCAiQ29tcGxldGlvbktleXdvcmRQYWNrYWdlOC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicGFjIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEltcG9ydDUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkSW1wb3J0NS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW1wIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6aW1wb3J0ICAgIGNvbXBsZXRpb246aW1wb3J0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkSW1wb3J0NigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRJbXBvcnQ2LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbXAiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkSW1wb3J0NygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRJbXBvcnQ3LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbXAiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDppbXBvcnQgICAgY29tcGxldGlvbjppbXBvcnQgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRJbXBvcnQ4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgInAiLCAiQ29tcGxldGlvbktleXdvcmRJbXBvcnQ4LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbXAiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDppbXBvcnQgICAgY29tcGxldGlvbjppbXBvcnQgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRDYXNlNigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRDYXNlNi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2FzIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6Y2FzZSAgICBjb21wbGV0aW9uOmNhc2UgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRDYXNlNygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRDYXNlNy5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2FzIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6Y2FzZSAgICBjb21wbGV0aW9uOmNhc2UgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRDYXNlOCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRDYXNlOC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2FzIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6Y2FzZSAgICBjb21wbGV0aW9uOmNhc2UgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRDYXNlOSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRDYXNlOS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2FzIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6Y2FzZSAgICBjb21wbGV0aW9uOmNhc2UgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRDYXNlMTAoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkQ2FzZTEwLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJjYXMiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkRGVmYXVsdDYoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkRGVmYXVsdDYuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImRlZiI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OmRlZmF1bHQgICAgY29tcGxldGlvbjpkZWZhdWx0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkRGVmYXVsdDcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkRGVmYXVsdDcuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImRlZiI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OkRlZmF1bHQgICAgY29tcGxldGlvbjpEZWZhdWx0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJCSJlbGVtZW50OmRlZmF1bHQgICAgY29tcGxldGlvbjpkZWZhdWx0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkRGVmYXVsdDgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkRGVmYXVsdDguamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImRlZiI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OkRlZmF1bHQgICAgY29tcGxldGlvbjpEZWZhdWx0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJCSJlbGVtZW50OmRlZmF1bHQgICAgY29tcGxldGlvbjpkZWZhdWx0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkRGVmYXVsdDkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkRGVmYXVsdDkuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImRlZiI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OkRlZmF1bHQgICAgY29tcGxldGlvbjpEZWZhdWx0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9VTlFVQUxJRklFRCksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZERlZmF1bHQxMCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmREZWZhdWx0MTAuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImRlZiI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OkRlZmF1bHQgICAgY29tcGxldGlvbjpEZWZhdWx0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9VTlFVQUxJRklFRCksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZENsYXNzMTMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkQ2xhc3MxMy5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2xhIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6Y2xhc3MgICAgY29tcGxldGlvbjpjbGFzcyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZENsYXNzMTQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkQ2xhc3MxNC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2xhIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6Q2xhc3MgICAgY29tcGxldGlvbjpDbGFzcyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpKyJcbiIrCi0JCQkiZWxlbWVudDpDbGFzc1dpdGhDb21wbGV4TmFtZSAgICBjb21wbGV0aW9uOkNsYXNzV2l0aENvbXBsZXhOYW1lICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJCSJlbGVtZW50OmNsYXNzICAgIGNvbXBsZXRpb246Y2xhc3MgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRDbGFzczE1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZENsYXNzMTUuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNsYSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OkNsYXNzICAgIGNvbXBsZXRpb246Q2xhc3MgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX1VOUVVBTElGSUVEKSsiXG4iKwotCQkJImVsZW1lbnQ6Q2xhc3NXaXRoQ29tcGxleE5hbWUgICAgY29tcGxldGlvbjpDbGFzc1dpdGhDb21wbGV4TmFtZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpKyJcbiIrCi0JCQkiZWxlbWVudDpjbGFzcyAgICBjb21wbGV0aW9uOmNsYXNzICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkQ2xhc3MxNigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRDbGFzczE2LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJjbGEiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpDbGFzcyAgICBjb21wbGV0aW9uOkNsYXNzICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJCSJlbGVtZW50OkNsYXNzV2l0aENvbXBsZXhOYW1lICAgIGNvbXBsZXRpb246Q2xhc3NXaXRoQ29tcGxleE5hbWUgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX1VOUVVBTElGSUVEKSsiXG4iKwotCQkJImVsZW1lbnQ6Y2xhc3MgICAgY29tcGxldGlvbjpjbGFzcyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZENsYXNzMTcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkQ2xhc3MxNy5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2xhIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6Y2xhc3MgICAgY29tcGxldGlvbjpjbGFzcyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZENsYXNzMTgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkQ2xhc3MxOC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2xhIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6Y2xhc3MgICAgY29tcGxldGlvbjpjbGFzcyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZENsYXNzMTkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkQ2xhc3MxOS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2xhIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6Y2xhc3MgICAgY29tcGxldGlvbjpjbGFzcyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZENsYXNzMjAoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkQ2xhc3MyMC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2xhIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6Y2xhc3MgICAgY29tcGxldGlvbjpjbGFzcyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZENsYXNzMjEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkQ2xhc3MyMS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2xhIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6Q2xhc3MgICAgY29tcGxldGlvbjpDbGFzcyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpKyJcbiIrCi0JCQkiZWxlbWVudDpDbGFzc1dpdGhDb21wbGV4TmFtZSAgICBjb21wbGV0aW9uOkNsYXNzV2l0aENvbXBsZXhOYW1lICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJCSJlbGVtZW50OmNsYXNzICAgIGNvbXBsZXRpb246Y2xhc3MgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRDbGFzczIyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZENsYXNzMjIuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImNsYSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OkNsYXNzICAgIGNvbXBsZXRpb246Q2xhc3MgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX1VOUVVBTElGSUVEKSsiXG4iKwotCQkJImVsZW1lbnQ6Q2xhc3NXaXRoQ29tcGxleE5hbWUgICAgY29tcGxldGlvbjpDbGFzc1dpdGhDb21wbGV4TmFtZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpKyJcbiIrCi0JCQkiZWxlbWVudDpjbGFzcyAgICBjb21wbGV0aW9uOmNsYXNzICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkQ2xhc3MyMygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRDbGFzczIzLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJjbGEiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpDbGFzcyAgICBjb21wbGV0aW9uOkNsYXNzICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJCSJlbGVtZW50OkNsYXNzV2l0aENvbXBsZXhOYW1lICAgIGNvbXBsZXRpb246Q2xhc3NXaXRoQ29tcGxleE5hbWUgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX1VOUVVBTElGSUVEKSsiXG4iKwotCQkJImVsZW1lbnQ6Y2xhc3MgICAgY29tcGxldGlvbjpjbGFzcyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZENsYXNzMjQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkQ2xhc3MyNC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiY2xhIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6Q2xhc3MgICAgY29tcGxldGlvbjpDbGFzcyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpKyJcbiIrCi0JCQkiZWxlbWVudDpDbGFzc1dpdGhDb21wbGV4TmFtZSAgICBjb21wbGV0aW9uOkNsYXNzV2l0aENvbXBsZXhOYW1lICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJCSJlbGVtZW50OmNsYXNzICAgIGNvbXBsZXRpb246Y2xhc3MgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UxMCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UxLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbnRlcmYiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDppbnRlcmZhY2UgICAgY29tcGxldGlvbjppbnRlcmZhY2UgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UxMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UxMS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW50ZXJmIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6aW50ZXJmYWNlICAgIGNvbXBsZXRpb246aW50ZXJmYWNlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlMTIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlMTIuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImludGVyZiI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OmludGVyZmFjZSAgICBjb21wbGV0aW9uOmludGVyZmFjZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEludGVyZmFjZTEzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEludGVyZmFjZTEzLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbnRlcmYiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDppbnRlcmZhY2UgICAgY29tcGxldGlvbjppbnRlcmZhY2UgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UxNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UxNC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW50ZXJmIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6aW50ZXJmYWNlICAgIGNvbXBsZXRpb246aW50ZXJmYWNlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlMTUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlMTUuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImludGVyZiI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OmludGVyZmFjZSAgICBjb21wbGV0aW9uOmludGVyZmFjZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEludGVyZmFjZTE2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEludGVyZmFjZTE2LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJpbnRlcmYiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDppbnRlcmZhY2UgICAgY29tcGxldGlvbjppbnRlcmZhY2UgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UxNygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UxNy5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW50ZXJmIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6aW50ZXJmYWNlICAgIGNvbXBsZXRpb246aW50ZXJmYWNlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlMTgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlMTguamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImludGVyZiI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OmludGVyZmFjZSAgICBjb21wbGV0aW9uOmludGVyZmFjZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFRocm93czUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkVGhyb3dzNS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidGhybyI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OnRocm93cyAgICBjb21wbGV0aW9uOnRocm93cyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFRocm93czYoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkVGhyb3dzNi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidGhybyI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRUaHJvd3M3KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFRocm93czcuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRocm8iOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDp0aHJvd3MgICAgY29tcGxldGlvbjp0aHJvd3MgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRUaHJvd3M4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFRocm93czguamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRocm8iOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDp0aHJvd3MgICAgY29tcGxldGlvbjp0aHJvd3MgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRTeW5jaHJvbml6ZWQ3KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFN5bmNocm9uaXplZDcuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInN5biI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OnN5bmNocm9uaXplZCAgICBjb21wbGV0aW9uOnN5bmNocm9uaXplZCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFN5bmNocm9uaXplZDgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkU3luY2hyb25pemVkOC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3luIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFN5bmNocm9uaXplZDkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkU3luY2hyb25pemVkOS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3luIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6c3luY2hyb25pemVkICAgIGNvbXBsZXRpb246c3luY2hyb25pemVkICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkU3luY2hyb25pemVkMTAoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkU3luY2hyb25pemVkMTAuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInN5biI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRTeW5jaHJvbml6ZWQxMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRTeW5jaHJvbml6ZWQxMS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3luIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6c3luY2hyb25pemVkICAgIGNvbXBsZXRpb246c3luY2hyb25pemVkICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkU3luY2hyb25pemVkMTIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkU3luY2hyb25pemVkMTIuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInN5biI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmROYXRpdmU1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZE5hdGl2ZTUuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIm5hdCI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50Om5hdGl2ZSAgICBjb21wbGV0aW9uOm5hdGl2ZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZE5hdGl2ZTYoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkTmF0aXZlNi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibmF0IjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZE5hdGl2ZTcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkTmF0aXZlNy5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAibmF0IjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6bmF0aXZlICAgIGNvbXBsZXRpb246bmF0aXZlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkTmF0aXZlOCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmROYXRpdmU4LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuYXQiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkU3RyaWN0ZnA1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFN0cmljdGZwNS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3RyaWMiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpzdHJpY3RmcCAgICBjb21wbGV0aW9uOnN0cmljdGZwICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkU3RyaWN0ZnA2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFN0cmljdGZwNi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3RyaWMiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkU3RyaWN0ZnA3KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFN0cmljdGZwNy5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3RyaWMiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpzdHJpY3RmcCAgICBjb21wbGV0aW9uOnN0cmljdGZwICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkU3RyaWN0ZnA4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFN0cmljdGZwOC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3RyaWMiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkVm9sYXRpbGU1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFZvbGF0aWxlNS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidm9sIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6dm9sYXRpbGUgICAgY29tcGxldGlvbjp2b2xhdGlsZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFZvbGF0aWxlNigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRWb2xhdGlsZTYuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInZvbCI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRWb2xhdGlsZTcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkVm9sYXRpbGU3LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ2b2wiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDp2b2xhdGlsZSAgICBjb21wbGV0aW9uOnZvbGF0aWxlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkVm9sYXRpbGU4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFZvbGF0aWxlOC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidm9sIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFRyYW5zaWVudDUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkVHJhbnNpZW50NS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidHJhbiI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OnRyYW5zaWVudCAgICBjb21wbGV0aW9uOnRyYW5zaWVudCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFRyYW5zaWVudDYoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkVHJhbnNpZW50Ni5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidHJhbiI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRUcmFuc2llbnQ3KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFRyYW5zaWVudDcuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRyYW4iOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDp0cmFuc2llbnQgICAgY29tcGxldGlvbjp0cmFuc2llbnQgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRUcmFuc2llbnQ4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFRyYW5zaWVudDguamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRyYW4iOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkTmV3OSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmROZXc5LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuZSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50Om5ldyAgICBjb21wbGV0aW9uOm5ldyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZE5ldzEwKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZE5ldzEwLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuZSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50Om5ldyAgICBjb21wbGV0aW9uOm5ldyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZE5ldzExKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZE5ldzExLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuZSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50Om5ldyAgICBjb21wbGV0aW9uOm5ldyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZE5ldzEyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZE5ldzEyLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuZSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50Om5ldyAgICBjb21wbGV0aW9uOm5ldyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZE5ldzEzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZE5ldzEzLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuZSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50Om5ldyAgICBjb21wbGV0aW9uOm5ldyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZE5ldzE0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZE5ldzE0LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuZSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50Om5ldyAgICBjb21wbGV0aW9uOm5ldyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZE5ldzE1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZE5ldzE1LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuZSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50Om5ldyAgICBjb21wbGV0aW9uOm5ldyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZE5ldzE2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZE5ldzE2LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuZSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50Om5ldyAgICBjb21wbGV0aW9uOm5ldyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFN0YXRpYzYoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkU3RhdGljNi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3RhIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6c3RhdGljICAgIGNvbXBsZXRpb246c3RhdGljICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkU3RhdGljNygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRTdGF0aWM3LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJzdGEiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpzdGF0aWMgICAgY29tcGxldGlvbjpzdGF0aWMgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRTdGF0aWM4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFN0YXRpYzguamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInN0YSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OnN0YXRpYyAgICBjb21wbGV0aW9uOnN0YXRpYyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFN0YXRpYzkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkU3RhdGljOS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAic3RhIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFN0YXRpYzEwKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFN0YXRpYzEwLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJzdGEiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpzdGF0aWMgICAgY29tcGxldGlvbjpzdGF0aWMgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRQdWJsaWMyMCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRQdWJsaWMxMC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHViIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFB1YmxpYzExKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFB1YmxpYzExLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJwdWIiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpwdWJsaWMgICAgY29tcGxldGlvbjpwdWJsaWMgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRQdWJsaWMxMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRQdWJsaWMxMi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHViIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFB1YmxpYzEzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFB1YmxpYzEzLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJwdWIiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpwdWJsaWMgICAgY29tcGxldGlvbjpwdWJsaWMgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRQdWJsaWMxNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRQdWJsaWMxNC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHViIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6cHVibGljICAgIGNvbXBsZXRpb246cHVibGljICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkUHVibGljMTUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkUHVibGljMTUuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInB1YiI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRQdWJsaWMxNigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRQdWJsaWMxNi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHViIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFB1YmxpYzE3KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFB1YmxpYzE3LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJwdWIiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpwdWJsaWMgICAgY29tcGxldGlvbjpwdWJsaWMgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRQdWJsaWMxOCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRQdWJsaWMxOC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHViIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6cHVibGljICAgIGNvbXBsZXRpb246cHVibGljICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkUHVibGljMTkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkUHVibGljMTkuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInB1YiI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OnB1YmxpYyAgICBjb21wbGV0aW9uOnB1YmxpYyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFByaXZhdGU2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFByaXZhdGU2LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJwcmkiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpwcml2YXRlICAgIGNvbXBsZXRpb246cHJpdmF0ZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFByaXZhdGU3KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFByaXZhdGU3LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJwcmkiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpwcml2YXRlICAgIGNvbXBsZXRpb246cHJpdmF0ZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFByaXZhdGU4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFByaXZhdGU4LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJwcmkiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpwcml2YXRlICAgIGNvbXBsZXRpb246cHJpdmF0ZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFByaXZhdGU5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFByaXZhdGU5LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJwcmkiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkUHJpdmF0ZTEwKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFByaXZhdGUxMC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHJpIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFByb3RlY3RlZDYoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkUHJvdGVjdGVkNi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHJvIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6cHJvdGVjdGVkICAgIGNvbXBsZXRpb246cHJvdGVjdGVkICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkUHJvdGVjdGVkNygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRQcm90ZWN0ZWQ3LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJwcm8iOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpwcm90ZWN0ZWQgICAgY29tcGxldGlvbjpwcm90ZWN0ZWQgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRQcm90ZWN0ZWQ4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFByb3RlY3RlZDguamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInBybyI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OnByb3RlY3RlZCAgICBjb21wbGV0aW9uOnByb3RlY3RlZCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFByb3RlY3RlZDkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkUHJvdGVjdGVkOS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAicHJvIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZFByb3RlY3RlZDEwKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZFByb3RlY3RlZDEwLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJwcm8iOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkRmluYWwxOCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRGaW5hbDE4LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmaW4iOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpmaW5hbCAgICBjb21wbGV0aW9uOmZpbmFsICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSsiXG4iKwotCQkJImVsZW1lbnQ6ZmluYWxpemUgICAgY29tcGxldGlvbjpmaW5hbGl6ZSgpICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEZpbmFsMTAoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkRmluYWwxMC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZmluIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6ZmluYWwgICAgY29tcGxldGlvbjpmaW5hbCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEZpbmFsMTEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkRmluYWwxMS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZmluIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEZpbmFsMTIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkRmluYWwxMi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZmluIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6ZmluYWwgICAgY29tcGxldGlvbjpmaW5hbCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEZpbmFsMTMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkRmluYWwxMy5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZmluIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6ZmluYWwgICAgY29tcGxldGlvbjpmaW5hbCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZEZpbmFsMTQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkRmluYWwxNC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZmluIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6ZmluYWwgICAgY29tcGxldGlvbjpmaW5hbCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSkrIlxuIisKLQkJCSJlbGVtZW50OmZpbmFsaXplICAgIGNvbXBsZXRpb246cHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkRmluYWwxNSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRGaW5hbDE1LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmaW4iOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkRmluYWwxNigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRGaW5hbDE2LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmaW4iOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDpmaW5hbCAgICBjb21wbGV0aW9uOmZpbmFsICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSsiXG4iKwotCQkJImVsZW1lbnQ6ZmluYWxpemUgICAgY29tcGxldGlvbjpwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRGaW5hbDE3KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEZpbmFsMTcuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImZpbiI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OmZpbmFsICAgIGNvbXBsZXRpb246ZmluYWwgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRBYnN0cmFjdDkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3Q5LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJhYnMiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDphYnN0cmFjdCAgICBjb21wbGV0aW9uOmFic3RyYWN0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3QxMCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDEwLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJhYnMiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3QxMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDExLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJhYnMiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDphYnN0cmFjdCAgICBjb21wbGV0aW9uOmFic3RyYWN0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3QxMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDEyLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJhYnMiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDphYnN0cmFjdCAgICBjb21wbGV0aW9uOmFic3RyYWN0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3QxMygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDEzLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJhYnMiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDphYnN0cmFjdCAgICBjb21wbGV0aW9uOmFic3RyYWN0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3QxNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDE0LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJhYnMiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3QxNSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDE1LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJhYnMiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDphYnN0cmFjdCAgICBjb21wbGV0aW9uOmFic3RyYWN0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3QxNigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDE2LmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJhYnMiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDphYnN0cmFjdCAgICBjb21wbGV0aW9uOmFic3RyYWN0ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkVHJ1ZTMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkVHJ1ZTMuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInRydSI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRUcnVlNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRUcnVlNC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAidHJ1IjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6dHJ1ZSAgICBjb21wbGV0aW9uOnRydWUgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRGYWxzZTMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkRmFsc2UzLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJmYWwiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkRmFsc2U0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZEZhbHNlNC5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiZmFsIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6ZmFsc2UgICAgY29tcGxldGlvbjpmYWxzZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uS2V5d29yZE51bGwzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMyIiwgIiIsICJDb21wbGV0aW9uS2V5d29yZE51bGwzLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJudWwiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiIiwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkTnVsbDQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkTnVsbDQuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIm51bCI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50Om51bGwgICAgY29tcGxldGlvbjpudWxsICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkSW5zdGFuY2VvZjQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkSW5zdGFuY2VvZjQuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImlucyI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50Omluc3RhbmNlb2YgICAgY29tcGxldGlvbjppbnN0YW5jZW9mICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25LZXl3b3JkSW5zdGFuY2VvZjUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYzIiLCAiIiwgIkNvbXBsZXRpb25LZXl3b3JkSW5zdGFuY2VvZjUuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gImlucyI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSIiLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbktleXdvcmRJbnN0YW5jZW9mNigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjMiIsICIiLCAiQ29tcGxldGlvbktleXdvcmRJbnN0YW5jZW9mNi5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiaW5zIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uTWVtYmVyVHlwZTIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvbk1lbWJlclR5cGUyLmphdmEiKTsKLQotCQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJuZXcgIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6Q29tcGxldGlvbk1lbWJlclR5cGUyICAgIGNvbXBsZXRpb246Q29tcGxldGlvbk1lbWJlclR5cGUyICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJCSJlbGVtZW50OkNvbXBsZXRpb25NZW1iZXJUeXBlMi5NZW1iZXJFeGNlcHRpb24gICAgY29tcGxldGlvbjpNZW1iZXJFeGNlcHRpb24gICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0VYQ0VQVElPTiksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uQWZ0ZXJDYXNlMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uQWZ0ZXJDYXNlMS5qYXZhIik7Ci0KLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienoiOwotCQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiZWxlbWVudDp6enogICAgY29tcGxldGlvbjp6enogICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25BZnRlckNhc2UyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvbkFmdGVyQ2FzZTIuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gInp6IjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6enp6ICAgIGNvbXBsZXRpb246enp6ICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uVG9wbGV2ZWxUeXBlMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAicDMiLCAiQ29tcGxldGlvblRvcGxldmVsVHlwZTEuamF2YSIpOwotCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIkNvbXBsZXRpb25Ub3BsZXZlbFR5cGUxIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6Q29tcGxldGlvblRvcGxldmVsVHlwZTEgICAgY29tcGxldGlvbjpDb21wbGV0aW9uVG9wbGV2ZWxUeXBlMSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQgKyBSX0VYQUNUX05BTUUpLAotCQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbkNhdGNoQXJndW1lbnROYW1lMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUhhc2h0YWJsZSBvcHRpb25zID0gSmF2YUNvcmUuZ2V0T3B0aW9ucygpOwotCU9iamVjdCBhcmd1bWVudFByZWZpeFByZXZpb3VzVmFsdWUgPSBvcHRpb25zLmdldChKYXZhQ29yZS5DT0RFQVNTSVNUX0FSR1VNRU5UX1BSRUZJWEVTKTsKLQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT0RFQVNTSVNUX0FSR1VNRU5UX1BSRUZJWEVTLCJhcmciKTsgLy8kTk9OLU5MUy0xJAotCU9iamVjdCBsb2NhbFByZWZpeFByZXZpb3VzVmFsdWUgPSBvcHRpb25zLmdldChKYXZhQ29yZS5DT0RFQVNTSVNUX0xPQ0FMX1BSRUZJWEVTKTsKLQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT0RFQVNTSVNUX0xPQ0FMX1BSRUZJWEVTLCJsb2MiKTsgLy8kTk9OLU5MUy0xJAotCQotCUphdmFDb3JlLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0KLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25DYXRjaEFyZ3VtZW50TmFtZTIuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJFeGNlcHRpb24gIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0Jb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9BUkdVTUVOVF9QUkVGSVhFUyxhcmd1bWVudFByZWZpeFByZXZpb3VzVmFsdWUpOwotCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPREVBU1NJU1RfTE9DQUxfUFJFRklYRVMsbG9jYWxQcmVmaXhQcmV2aW91c1ZhbHVlKTsKLQlKYXZhQ29yZS5zZXRPcHRpb25zKG9wdGlvbnMpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiZWxlbWVudDpleGNlcHRpb24gICAgY29tcGxldGlvbjpleGNlcHRpb24gICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpKyJcbiIrCi0JCSJlbGVtZW50OmxvY0V4Y2VwdGlvbiAgICBjb21wbGV0aW9uOmxvY0V4Y2VwdGlvbiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfTkFNRV9GSVJTVF9QUkVGSVgpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uQXJyYXlBY2Nlc3MxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uQXJyYXlBY2Nlc3MxLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienp6IjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiZWxlbWVudDp6enoxICAgIGNvbXBsZXRpb246enp6MSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIrCi0JCSJlbGVtZW50Onp6ejIgICAgY29tcGxldGlvbjp6enoyICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWEFDVF9FWFBFQ1RFRF9UWVBFICtSX1VOUVVBTElGSUVEKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvblZhcmlhYmxlTmFtZTMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlIYXNodGFibGUgb3B0aW9ucyA9IEphdmFDb3JlLmdldE9wdGlvbnMoKTsKLQlPYmplY3QgYXJndW1lbnRQcmVmaXhQcmV2aW91c1ZhbHVlID0gb3B0aW9ucy5nZXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9MT0NBTF9QUkVGSVhFUyk7Ci0Jb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9MT0NBTF9QUkVGSVhFUywicDEscDIiKTsgLy8kTk9OLU5MUy0xJAotCU9iamVjdCBsb2NhbFByZWZpeFByZXZpb3VzVmFsdWUgPSBvcHRpb25zLmdldChKYXZhQ29yZS5DT0RFQVNTSVNUX0xPQ0FMX1NVRkZJWEVTKTsKLQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT0RFQVNTSVNUX0xPQ0FMX1NVRkZJWEVTLCJzMSxzMiIpOyAvLyROT04tTkxTLTEkCi0JCi0JSmF2YUNvcmUuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvblZhcmlhYmxlTmFtZTMuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJPbmVOYW1lICI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPREVBU1NJU1RfTE9DQUxfUFJFRklYRVMsYXJndW1lbnRQcmVmaXhQcmV2aW91c1ZhbHVlKTsKLQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT0RFQVNTSVNUX0xPQ0FMX1NVRkZJWEVTLGxvY2FsUHJlZml4UHJldmlvdXNWYWx1ZSk7Ci0JSmF2YUNvcmUuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQotCWFzc2VydEVxdWFscygKLQkJImVsZW1lbnQ6bmFtZSAgICBjb21wbGV0aW9uOm5hbWUgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpKyJcbiIrCi0JCSJlbGVtZW50Om5hbWVzMSAgICBjb21wbGV0aW9uOm5hbWVzMSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfTkFNRV9GSVJTVF9TVUZGSVgpKyJcbiIrCi0JCSJlbGVtZW50Om5hbWVzMiAgICBjb21wbGV0aW9uOm5hbWVzMiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfTkFNRV9TVUZGSVgpKyJcbiIrCi0JCSJlbGVtZW50Om9uZU5hbWUgICAgY29tcGxldGlvbjpvbmVOYW1lICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSsiXG4iKwotCQkiZWxlbWVudDpvbmVOYW1lczEgICAgY29tcGxldGlvbjpvbmVOYW1lczEgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX05BTUVfRklSU1RfU1VGRklYKSsiXG4iKwotCQkiZWxlbWVudDpvbmVOYW1lczIgICAgY29tcGxldGlvbjpvbmVOYW1lczIgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX05BTUVfU1VGRklYKSsiXG4iKwotCQkiZWxlbWVudDpwMU5hbWUgICAgY29tcGxldGlvbjpwMU5hbWUgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX05BTUVfRklSU1RfUFJFRklYKSsiXG4iKwotCQkiZWxlbWVudDpwMU5hbWVzMSAgICBjb21wbGV0aW9uOnAxTmFtZXMxICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9OQU1FX0ZJUlNUX1BSRUZJWCArIFJfTkFNRV9GSVJTVF9TVUZGSVgpKyJcbiIrCi0JCSJlbGVtZW50OnAxTmFtZXMyICAgIGNvbXBsZXRpb246cDFOYW1lczIgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX05BTUVfRklSU1RfUFJFRklYICsgUl9OQU1FX1NVRkZJWCkrIlxuIisKLQkJImVsZW1lbnQ6cDFPbmVOYW1lICAgIGNvbXBsZXRpb246cDFPbmVOYW1lICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9OQU1FX0ZJUlNUX1BSRUZJWCkrIlxuIisKLQkJImVsZW1lbnQ6cDFPbmVOYW1lczEgICAgY29tcGxldGlvbjpwMU9uZU5hbWVzMSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfTkFNRV9GSVJTVF9QUkVGSVggKyBSX05BTUVfRklSU1RfU1VGRklYKSsiXG4iKwotCQkiZWxlbWVudDpwMU9uZU5hbWVzMiAgICBjb21wbGV0aW9uOnAxT25lTmFtZXMyICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9OQU1FX0ZJUlNUX1BSRUZJWCArIFJfTkFNRV9TVUZGSVgpKyJcbiIrCi0JCSJlbGVtZW50OnAyTmFtZSAgICBjb21wbGV0aW9uOnAyTmFtZSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfTkFNRV9QUkVGSVgpKyJcbiIrCi0JCSJlbGVtZW50OnAyTmFtZXMxICAgIGNvbXBsZXRpb246cDJOYW1lczEgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX05BTUVfUFJFRklYICsgUl9OQU1FX0ZJUlNUX1NVRkZJWCkrIlxuIisKLQkJImVsZW1lbnQ6cDJOYW1lczIgICAgY29tcGxldGlvbjpwMk5hbWVzMiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfTkFNRV9QUkVGSVggKyBSX05BTUVfU1VGRklYKSsiXG4iKwotCQkiZWxlbWVudDpwMk9uZU5hbWUgICAgY29tcGxldGlvbjpwMk9uZU5hbWUgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX05BTUVfUFJFRklYKSsiXG4iKwotCQkiZWxlbWVudDpwMk9uZU5hbWVzMSAgICBjb21wbGV0aW9uOnAyT25lTmFtZXMxICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9OQU1FX1BSRUZJWCArIFJfTkFNRV9GSVJTVF9TVUZGSVgpKyJcbiIrCi0JCSJlbGVtZW50OnAyT25lTmFtZXMyICAgIGNvbXBsZXRpb246cDJPbmVOYW1lczIgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX05BTUVfUFJFRklYICsgUl9OQU1FX1NVRkZJWCksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdENvbXBsZXRpb25Ob25FbXB0eVRva2VuMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvbk5vbkVtcHR5VG9rZW4xLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAienoiOwotCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQlpbnQgc3RhcnQgPSBjdXJzb3JMb2NhdGlvbiAtIDI7Ci0JaW50IGVuZCA9IHN0YXJ0ICsgNDsKLQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQlhc3NlcnRFcXVhbHMoCi0JCSJlbGVtZW50Onp6eXkgICAgY29tcGxldGlvbjp6enl5ICAgIHBvc2l0aW9uOlsiK3N0YXJ0KyIsIitlbmQrIl0gICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHNXaXRoUG9zaXRpb24oKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbkVtcHR5VG9rZW4xKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uRW1wdHlUb2tlbjEuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBjb21wbGV0ZUJlaGluZCA9ICJ6eiI7Ci0JLy8gY29tcGxldGlvbiBpcyBqdXN0IGF0IHN0YXJ0IG9mICd6eicKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpOwotCWludCBzdGFydCA9IGN1cnNvckxvY2F0aW9uOwotCWludCBlbmQgPSBzdGFydCArIDQ7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiZWxlbWVudDpDb21wbGV0aW9uRW1wdHlUb2tlbjEgICAgY29tcGxldGlvbjpDb21wbGV0aW9uRW1wdHlUb2tlbjEgICAgcG9zaXRpb246WyIrc3RhcnQrIiwiK2VuZCsiXSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIrCi0JCSJlbGVtZW50OmNsb25lICAgIGNvbXBsZXRpb246Y2xvbmUoKSAgICBwb3NpdGlvbjpbIitzdGFydCsiLCIrZW5kKyJdICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJImVsZW1lbnQ6ZXF1YWxzICAgIGNvbXBsZXRpb246ZXF1YWxzKCkgICAgcG9zaXRpb246WyIrc3RhcnQrIiwiK2VuZCsiXSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIrCi0JCSJlbGVtZW50OmZpbmFsaXplICAgIGNvbXBsZXRpb246ZmluYWxpemUoKSAgICBwb3NpdGlvbjpbIitzdGFydCsiLCIrZW5kKyJdICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJImVsZW1lbnQ6Zm9vICAgIGNvbXBsZXRpb246Zm9vKCkgICAgcG9zaXRpb246WyIrc3RhcnQrIiwiK2VuZCsiXSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIrCi0JCSJlbGVtZW50OmdldENsYXNzICAgIGNvbXBsZXRpb246Z2V0Q2xhc3MoKSAgICBwb3NpdGlvbjpbIitzdGFydCsiLCIrZW5kKyJdICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJImVsZW1lbnQ6aGFzaENvZGUgICAgY29tcGxldGlvbjpoYXNoQ29kZSgpICAgIHBvc2l0aW9uOlsiK3N0YXJ0KyIsIitlbmQrIl0gICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iKwotCQkiZWxlbWVudDpub3RpZnkgICAgY29tcGxldGlvbjpub3RpZnkoKSAgICBwb3NpdGlvbjpbIitzdGFydCsiLCIrZW5kKyJdICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJImVsZW1lbnQ6bm90aWZ5QWxsICAgIGNvbXBsZXRpb246bm90aWZ5QWxsKCkgICAgcG9zaXRpb246WyIrc3RhcnQrIiwiK2VuZCsiXSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIrCi0JCSJlbGVtZW50OnRvU3RyaW5nICAgIGNvbXBsZXRpb246dG9TdHJpbmcoKSAgICBwb3NpdGlvbjpbIitzdGFydCsiLCIrZW5kKyJdICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJImVsZW1lbnQ6d2FpdCAgICBjb21wbGV0aW9uOndhaXQoKSAgICBwb3NpdGlvbjpbIitzdGFydCsiLCIrZW5kKyJdICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJImVsZW1lbnQ6d2FpdCAgICBjb21wbGV0aW9uOndhaXQoKSAgICBwb3NpdGlvbjpbIitzdGFydCsiLCIrZW5kKyJdICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJImVsZW1lbnQ6d2FpdCAgICBjb21wbGV0aW9uOndhaXQoKSAgICBwb3NpdGlvbjpbIitzdGFydCsiLCIrZW5kKyJdICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJImVsZW1lbnQ6enp5eSAgICBjb21wbGV0aW9uOnp6eXkgICAgcG9zaXRpb246WyIrc3RhcnQrIiwiK2VuZCsiXSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0c1dpdGhQb3NpdGlvbigpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uRmluZFNlY29uZGFyeVR5cGUxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBnZXRDb21waWxhdGlvblVuaXQoIkNvbXBsZXRpb24iLCAic3JjIiwgIiIsICJDb21wbGV0aW9uRmluZFNlY29uZGFyeVR5cGUxLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiLyoqL1NlY29uZGFyeSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCWFzc2VydEVxdWFscygKLQkJImVsZW1lbnQ6U2Vjb25kYXJ5VHlwZTEgICAgY29tcGxldGlvbjpTZWNvbmRhcnlUeXBlMSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIrCi0JCSJlbGVtZW50OlNlY29uZGFyeVR5cGUyICAgIGNvbXBsZXRpb246U2Vjb25kYXJ5VHlwZTIgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbkxvY2FsVHlwZTEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25Mb2NhbFR5cGUxLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiWlpaIjsKLQlpbnQgY3Vyc29yTG9jYXRpb24gPSBzdHIubGFzdEluZGV4T2YoY29tcGxldGVCZWhpbmQpICsgY29tcGxldGVCZWhpbmQubGVuZ3RoKCk7Ci0JY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JYXNzZXJ0RXF1YWxzKAotCQkiZWxlbWVudDpaWlpaICAgIGNvbXBsZXRpb246WlpaWiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uVHlwZTEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29tcGxldGlvbiIsICJzcmMiLCAiIiwgIkNvbXBsZXRpb25UeXBlMS5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIkNUMSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCWFzc2VydEVxdWFscygKLQkJImVsZW1lbnQ6Q1QxICAgIGNvbXBsZXRpb246Q1QxICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWEFDVF9OQU1FICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJImVsZW1lbnQ6Q1QxICAgIGNvbXBsZXRpb246cTIuQ1QxICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWEFDVF9OQU1FKSwKLQkJcmVxdWVzdG9yLmdldFJlc3VsdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvblF1YWxpZmllZEFsbG9jYXRpb25UeXBlMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb21wbGV0aW9uIiwgInNyYyIsICIiLCAiQ29tcGxldGlvblF1YWxpZmllZEFsbG9jYXRpb25UeXBlMS5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIllZWSI7Ci0JaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCWN1LmNvZGVDb21wbGV0ZShjdXJzb3JMb2NhdGlvbiwgcmVxdWVzdG9yKTsKLQotCWFzc2VydEVxdWFscygKLQkJImVsZW1lbnQ6Q29tcGxldGlvblF1YWxpZmllZEFsbG9jYXRpb25UeXBlMS5ZWVkgICAgY29tcGxldGlvbjpZWVkgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX0VYQUNUX05BTUUpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9Db21wbGV0aW9uVGVzdHMyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvQ29tcGxldGlvblRlc3RzMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTNjMGJlLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9Db21wbGV0aW9uVGVzdHMyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy51dGlsLlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuUmVsZXZhbmNlQ29uc3RhbnRzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0KLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uVGVzdHMyIGV4dGVuZHMgTW9kaWZ5aW5nUmVzb3VyY2VUZXN0cyBpbXBsZW1lbnRzIFJlbGV2YW5jZUNvbnN0YW50cyB7Ci0KLXB1YmxpYyBDb21wbGV0aW9uVGVzdHMyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRVcFN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0Jc3VwZXIuc2V0VXBTdWl0ZSgpOwotCQotCXNldFVwSmF2YVByb2plY3QoIkNvbXBsZXRpb24iKTsKLX0KLXB1YmxpYyB2b2lkIHRlYXJEb3duU3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQlkZWxldGVQcm9qZWN0KCJDb21wbGV0aW9uIik7Ci0JCi0Jc3VwZXIudGVhckRvd25TdWl0ZSgpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgU3VpdGUoQ29tcGxldGlvblRlc3RzMi5jbGFzcy5nZXROYW1lKCkpOwotCQotCXN1aXRlLmFkZFRlc3QobmV3IENvbXBsZXRpb25UZXN0czIoInRlc3RCdWcyOTgzMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBDb21wbGV0aW9uVGVzdHMyKCJ0ZXN0QnVnMzM1NjAiKSk7Ci0JCi0JcmV0dXJuIHN1aXRlOwotfQotCi1GaWxlIGNyZWF0ZUZpbGUoRmlsZSBwYXJlbnQsIFN0cmluZyBuYW1lLCBTdHJpbmcgY29udGVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXJlbnQsIG5hbWUpOwotCUZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0Jb3V0LndyaXRlKGNvbnRlbnQuZ2V0Qnl0ZXMoKSk7Ci0Jb3V0LmNsb3NlKCk7Ci0JcmV0dXJuIGZpbGU7Ci19Ci1GaWxlIGNyZWF0ZURpcmVjdG9yeShGaWxlIHBhcmVudCwgU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JRmlsZSBkaXIgPSBuZXcgRmlsZShwYXJlbnQsIG5hbWUpOwotCWRpci5ta2RpcnMoKTsKLQlyZXR1cm4gZGlyOwotfQotdm9pZCBhZGRMaWJyYXJ5RW50cnkoSUphdmFQcm9qZWN0IHByb2plY3QsIFN0cmluZyBwYXRoLCBib29sZWFuIGV4cG9ydGVkKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQl0aGlzLmFkZExpYnJhcnlFbnRyeShwcm9qZWN0LCBuZXcgUGF0aChwYXRoKSwgbnVsbCwgbnVsbCwgZXhwb3J0ZWQpOwotfSAKLXZvaWQgYWRkTGlicmFyeUVudHJ5KElKYXZhUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgcGF0aCwgU3RyaW5nIHNyY0F0dGFjaG1lbnRQYXRoLCBTdHJpbmcgc3JjQXR0YWNobWVudFBhdGhSb290LCBib29sZWFuIGV4cG9ydGVkKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uewotCXRoaXMuYWRkTGlicmFyeUVudHJ5KAotCQlwcm9qZWN0LAotCQluZXcgUGF0aChwYXRoKSwKLQkJc3JjQXR0YWNobWVudFBhdGggPT0gbnVsbCA/IG51bGwgOiBuZXcgUGF0aChzcmNBdHRhY2htZW50UGF0aCksCi0JCXNyY0F0dGFjaG1lbnRQYXRoUm9vdCA9PSBudWxsID8gbnVsbCA6IG5ldyBQYXRoKHNyY0F0dGFjaG1lbnRQYXRoUm9vdCksCi0JCWV4cG9ydGVkCi0JKTsKLX0KLXZvaWQgYWRkTGlicmFyeUVudHJ5KElKYXZhUHJvamVjdCBwcm9qZWN0LCBJUGF0aCBwYXRoLCBJUGF0aCBzcmNBdHRhY2htZW50UGF0aCwgSVBhdGggc3JjQXR0YWNobWVudFBhdGhSb290LCBib29sZWFuIGV4cG9ydGVkKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uewotCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBwcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCWludCBsZW5ndGggPSBlbnRyaWVzLmxlbmd0aDsKLQlTeXN0ZW0uYXJyYXljb3B5KGVudHJpZXMsIDAsIGVudHJpZXMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W2xlbmd0aCArIDFdLCAxLCBsZW5ndGgpOwotCWVudHJpZXNbMF0gPSBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkocGF0aCwgc3JjQXR0YWNobWVudFBhdGgsIHNyY0F0dGFjaG1lbnRQYXRoUm9vdCwgZXhwb3J0ZWQpOwotCXByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKGVudHJpZXMsIG51bGwpOwotfQotLyoqCi0gKiBUZXN0IGZvciBidWcgMjk4MzIKLSAqLwotcHVibGljIHZvaWQgdGVzdEJ1ZzI5ODMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJLy8gY3JlYXRlIHZhcmlhYmxlCi0JCUphdmFDb3JlLnNldENsYXNzcGF0aFZhcmlhYmxlcygKLQkJCW5ldyBTdHJpbmdbXSB7IkpDTF9MSUIiLCAiSkNMX1NSQyIsICJKQ0xfU1JDUk9PVCJ9LAotCQkJbmV3IElQYXRoW10ge2dldEV4dGVybmFsSkNMUGF0aCgpLCBnZXRFeHRlcm5hbEpDTFNvdXJjZVBhdGgoKSwgZ2V0RXh0ZXJuYWxKQ0xSb290U291cmNlUGF0aCgpfSwKLQkJCW51bGwpOwotCi0JCS8vIGNyZWF0ZSBQMQotCQlJRmlsZSBmID0gZ2V0RmlsZSgiL0NvbXBsZXRpb24vbGliLmphciIpOwotCQlJSmF2YVByb2plY3QgcCA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoCi0JCQkiUDEiLAotCQkJbmV3IFN0cmluZ1tde30sCi0JCQluZXcgU3RyaW5nW117VXRpbC5nZXRKYXZhQ2xhc3NMaWIoKX0sCi0JCQkgIiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoIi9QMS9saWIuamFyIiwgZi5nZXRDb250ZW50cygpKTsKLQkJdGhpcy5hZGRMaWJyYXJ5RW50cnkocCwgIi9QMS9saWIuamFyIiwgdHJ1ZSk7Ci0JCQotCQkvLyBjcmVhdGUgUDIKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgKLQkJCSJQMiIsCi0JCQluZXcgU3RyaW5nW117InNyYyJ9LAotCQkJbmV3IFN0cmluZ1tde1V0aWwuZ2V0SmF2YUNsYXNzTGliKCl9LAotCQkJbmV3IFN0cmluZ1tdeyIvUDEifSwKLQkJCSJiaW4iKTsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QMi9zcmMvWC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iKwotCQkJIiAgWlpaIHo7XG4iKwotCQkJIn0iKTsKLQkJCi0JCS8vIGRvIGNvbXBsZXRpb24KLQkJQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdT0gZ2V0Q29tcGlsYXRpb25Vbml0KCJQMiIsICJzcmMiLCAiIiwgIlguamF2YSIpOwotCQkKLQkJU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCQlTdHJpbmcgY29tcGxldGVCZWhpbmQgPSAiWlpaIjsKLQkJaW50IGN1cnNvckxvY2F0aW9uID0gc3RyLmxhc3RJbmRleE9mKGNvbXBsZXRlQmVoaW5kKSArIGNvbXBsZXRlQmVoaW5kLmxlbmd0aCgpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6WlpaICAgIGNvbXBsZXRpb246cHouWlpaICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWEFDVF9OQU1FKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotCQkKLQkJCi0JCS8vIGRlbGV0ZSBQMQotCQlwLmdldFByb2plY3QoKS5kZWxldGUodHJ1ZSwgZmFsc2UsIG51bGwpOwotCQkKLQkJLy8gY3JlYXRlIFAxCi0JCUZpbGUgZGVzdCA9IGdldFdvcmtzcGFjZVJvb3QoKS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpOwotCQlGaWxlIHBybyA9IHRoaXMuY3JlYXRlRGlyZWN0b3J5KGRlc3QsICJQMSIpOwotCQkKLQkJdGhpcy5jcmVhdGVGaWxlKHBybywgIi5jbGFzc3BhdGgiLCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iICsKLQkJCSI8Y2xhc3NwYXRoPlxuIiArCi0JCQkiICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPVwic3JjXCIgcGF0aD1cInNyY1wiLz5cbiIgKwotCQkJIiAgICA8Y2xhc3NwYXRoZW50cnkga2luZD1cInZhclwiIHBhdGg9XCJKQ0xfTElCXCIgc291cmNlcGF0aD1cIkpDTF9TUkNcIiByb290cGF0aD1cIkpDTF9TUkNST09UXCIvPlxuIiArCi0JCQkiICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPVwib3V0cHV0XCIgcGF0aD1cImJpblwiLz5cbiIgKwotCQkJIjwvY2xhc3NwYXRoPiIpOwotCQkJCi0JCXRoaXMuY3JlYXRlRmlsZShwcm8sICIucHJvamVjdCIsIAotCQkJIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIiArCi0JCQkiPHByb2plY3REZXNjcmlwdGlvbj5cbiIgKwotCQkJIgk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZTwvbmFtZT5cbiIgKwotCQkJIgk8Y29tbWVudD48L2NvbW1lbnQ+XG4iICsKLQkJCSIJPHByb2plY3RzPlxuIiArCi0JCQkiCTwvcHJvamVjdHM+XG4iICsKLQkJCSIJPGJ1aWxkU3BlYz5cbiIgKwotCQkJIgkJPGJ1aWxkQ29tbWFuZD5cbiIgKwotCQkJIgkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPlxuIiArCi0JCQkiCQkJPGFyZ3VtZW50cz5cbiIgKwotCQkJIgkJCTwvYXJndW1lbnRzPlxuIiArCi0JCQkiCQk8L2J1aWxkQ29tbWFuZD5cbiIgKwotCQkJIgk8L2J1aWxkU3BlYz5cbiIgKwotCQkJIgk8bmF0dXJlcz5cbiIgKwotCQkJIgkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+XG4iICsKLQkJCSIJPC9uYXR1cmVzPlxuIiArCi0JCQkiPC9wcm9qZWN0RGVzY3JpcHRpb24+Iik7Ci0JCQotCQlGaWxlIHNyYyA9IHRoaXMuY3JlYXRlRGlyZWN0b3J5KHBybywgInNyYyIpOwotCQkKLQkJRmlsZSBweiA9IHRoaXMuY3JlYXRlRGlyZWN0b3J5KHNyYywgInB6Iik7Ci0JCQotCQl0aGlzLmNyZWF0ZUZpbGUocHosICJaWlouamF2YSIsCi0JCQkicGFja2FnZSBwejtcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBaWloge1xuIiArCi0JCQkifSIpOwotCQkKLQkJZmluYWwgSVByb2plY3QgcHJvamVjdCA9IGdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KCJQMSIpOwotCQlJV29ya3NwYWNlUnVubmFibGUgcG9wdWxhdGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCXByb2plY3QuY3JlYXRlKG51bGwpOwotCQkJCXByb2plY3Qub3BlbihudWxsKTsKLQkJCX0KLQkJfTsKLQkJZ2V0V29ya3NwYWNlKCkucnVuKHBvcHVsYXRlLCBudWxsKTsKLQkJSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkKLQkJCi0JCS8vIGRvIGNvbXBsZXRpb24KLQkJcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCQljdS5jb2RlQ29tcGxldGUoY3Vyc29yTG9jYXRpb24sIHJlcXVlc3Rvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJImVsZW1lbnQ6WlpaICAgIGNvbXBsZXRpb246cHouWlpaICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9FWEFDVF9OQU1FKSwKLQkJCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDEiKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMiIpOwotCX0KLX0KLS8qKgotICogVGVzdCBmb3IgYnVnIDMzNTYwCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RCdWczMzU2MCgpIHRocm93cyBFeGNlcHRpb24gewotCXRyeSB7Ci0JCS8vIGNyZWF0ZSB2YXJpYWJsZQotCQlKYXZhQ29yZS5zZXRDbGFzc3BhdGhWYXJpYWJsZXMoCi0JCQluZXcgU3RyaW5nW10geyJKQ0xfTElCIiwgIkpDTF9TUkMiLCAiSkNMX1NSQ1JPT1QifSwKLQkJCW5ldyBJUGF0aFtdIHtnZXRFeHRlcm5hbEpDTFBhdGgoKSwgZ2V0RXh0ZXJuYWxKQ0xTb3VyY2VQYXRoKCksIGdldEV4dGVybmFsSkNMUm9vdFNvdXJjZVBhdGgoKX0sCi0JCQludWxsKTsKLQotCQkvLyBjcmVhdGUgUDEKLQkJSUZpbGUgZiA9IGdldEZpbGUoIi9Db21wbGV0aW9uL2xpYi5qYXIiKTsKLQkJSUphdmFQcm9qZWN0IHAgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KAotCQkJIlAxIiwKLQkJCW5ldyBTdHJpbmdbXXt9LAotCQkJbmV3IFN0cmluZ1tde1V0aWwuZ2V0SmF2YUNsYXNzTGliKCl9LAotCQkJICIiKTsKLQkJdGhpcy5jcmVhdGVGaWxlKCIvUDEvbGliLmphciIsIGYuZ2V0Q29udGVudHMoKSk7Ci0JCXRoaXMuYWRkTGlicmFyeUVudHJ5KHAsICIvUDEvbGliLmphciIsIHRydWUpOwotCQkKLQkJLy8gY3JlYXRlIFAyCi0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoCi0JCQkiUDIiLAotCQkJbmV3IFN0cmluZ1tdeyJzcmMifSwKLQkJCW5ldyBTdHJpbmdbXXtVdGlsLmdldEphdmFDbGFzc0xpYigpfSwKLQkJCW5ldyBTdHJpbmdbXXsiL1AxIn0sCi0JCQluZXcgYm9vbGVhbltde3RydWV9LAotCQkJImJpbiIpOwotCQkJCQkKLQkJLy8gY3JlYXRlIFAzCi0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoCi0JCQkiUDMiLAotCQkJbmV3IFN0cmluZ1tdeyJzcmMifSwKLQkJCW5ldyBTdHJpbmdbXXtVdGlsLmdldEphdmFDbGFzc0xpYigpfSwKLQkJCW5ldyBTdHJpbmdbXXsiL1AyIn0sCi0JCQkiYmluIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUDMvc3JjL1guamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFgge1xuIisKLQkJCSIgIFpaWiB6O1xuIisKLQkJCSJ9Iik7Ci0JCQotCQkvLyBkbyBjb21wbGV0aW9uCi0JCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3U9IGdldENvbXBpbGF0aW9uVW5pdCgiUDMiLCAic3JjIiwgIiIsICJYLmphdmEiKTsKLQkJCi0JCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQkJU3RyaW5nIGNvbXBsZXRlQmVoaW5kID0gIlpaWiI7Ci0JCWludCBjdXJzb3JMb2NhdGlvbiA9IHN0ci5sYXN0SW5kZXhPZihjb21wbGV0ZUJlaGluZCkgKyBjb21wbGV0ZUJlaGluZC5sZW5ndGgoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OlpaWiAgICBjb21wbGV0aW9uOnB6LlpaWiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhBQ1RfTkFNRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLQkJCi0JCQotCQkvLyBkZWxldGUgUDEKLQkJcC5nZXRQcm9qZWN0KCkuZGVsZXRlKHRydWUsIGZhbHNlLCBudWxsKTsKLQkJCi0JCS8vIGNyZWF0ZSBQMQotCQlGaWxlIGRlc3QgPSBnZXRXb3Jrc3BhY2VSb290KCkuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKTsKLQkJRmlsZSBwcm8gPSB0aGlzLmNyZWF0ZURpcmVjdG9yeShkZXN0LCAiUDEiKTsKLQkJCi0JCXRoaXMuY3JlYXRlRmlsZShwcm8sICIuY2xhc3NwYXRoIiwgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIiArCi0JCQkiPGNsYXNzcGF0aD5cbiIgKwotCQkJIiAgICA8Y2xhc3NwYXRoZW50cnkga2luZD1cInNyY1wiIHBhdGg9XCJzcmNcIi8+XG4iICsKLQkJCSIgICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9XCJ2YXJcIiBwYXRoPVwiSkNMX0xJQlwiIHNvdXJjZXBhdGg9XCJKQ0xfU1JDXCIgcm9vdHBhdGg9XCJKQ0xfU1JDUk9PVFwiLz5cbiIgKwotCQkJIiAgICA8Y2xhc3NwYXRoZW50cnkga2luZD1cIm91dHB1dFwiIHBhdGg9XCJiaW5cIi8+XG4iICsKLQkJCSI8L2NsYXNzcGF0aD4iKTsKLQkJCQotCQl0aGlzLmNyZWF0ZUZpbGUocHJvLCAiLnByb2plY3QiLCAKLQkJCSI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIgKwotCQkJIjxwcm9qZWN0RGVzY3JpcHRpb24+XG4iICsKLQkJCSIJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmU8L25hbWU+XG4iICsKLQkJCSIJPGNvbW1lbnQ+PC9jb21tZW50PlxuIiArCi0JCQkiCTxwcm9qZWN0cz5cbiIgKwotCQkJIgk8L3Byb2plY3RzPlxuIiArCi0JCQkiCTxidWlsZFNwZWM+XG4iICsKLQkJCSIJCTxidWlsZENvbW1hbmQ+XG4iICsKLQkJCSIJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT5cbiIgKwotCQkJIgkJCTxhcmd1bWVudHM+XG4iICsKLQkJCSIJCQk8L2FyZ3VtZW50cz5cbiIgKwotCQkJIgkJPC9idWlsZENvbW1hbmQ+XG4iICsKLQkJCSIJPC9idWlsZFNwZWM+XG4iICsKLQkJCSIJPG5hdHVyZXM+XG4iICsKLQkJCSIJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPlxuIiArCi0JCQkiCTwvbmF0dXJlcz5cbiIgKwotCQkJIjwvcHJvamVjdERlc2NyaXB0aW9uPiIpOwotCQkKLQkJRmlsZSBzcmMgPSB0aGlzLmNyZWF0ZURpcmVjdG9yeShwcm8sICJzcmMiKTsKLQkJCi0JCUZpbGUgcHogPSB0aGlzLmNyZWF0ZURpcmVjdG9yeShzcmMsICJweiIpOwotCQkKLQkJdGhpcy5jcmVhdGVGaWxlKHB6LCAiWlpaLmphdmEiLAotCQkJInBhY2thZ2UgcHo7XG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgWlpaIHtcbiIgKwotCQkJIn0iKTsKLQkJCi0JCWZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBnZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdCgiUDEiKTsKLQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHBvcHVsYXRlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQlwcm9qZWN0LmNyZWF0ZShudWxsKTsKLQkJCQlwcm9qZWN0Lm9wZW4obnVsbCk7Ci0JCQl9Ci0JCX07Ci0JCWdldFdvcmtzcGFjZSgpLnJ1bihwb3B1bGF0ZSwgbnVsbCk7Ci0JCUphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCi0JCQotCQkvLyBkbyBjb21wbGV0aW9uCi0JCXJlcXVlc3RvciA9IG5ldyBDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IoKTsKLQkJY3UuY29kZUNvbXBsZXRlKGN1cnNvckxvY2F0aW9uLCByZXF1ZXN0b3IpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJlbGVtZW50OlpaWiAgICBjb21wbGV0aW9uOnB6LlpaWiAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfRVhBQ1RfTkFNRSksCi0JCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAxIik7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMyIpOwotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9Db21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9Db21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFjMWMwMy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21wbGV0aW9uUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotcHVibGljIGNsYXNzIENvbXBsZXRpb25UZXN0c1JlcXVlc3RvciBpbXBsZW1lbnRzIElDb21wbGV0aW9uUmVxdWVzdG9yIHsKLQlwcml2YXRlIFZlY3RvciBmRWxlbWVudHMgPSBuZXcgVmVjdG9yKCk7Ci0JcHJpdmF0ZSBWZWN0b3IgZkNvbXBsZXRpb25zID0gbmV3IFZlY3RvcigpOwotCXByaXZhdGUgVmVjdG9yIGZSZWxldmFuY2VzID0gbmV3IFZlY3RvcigpOwotCXByaXZhdGUgVmVjdG9yIGZDb21wbGV0aW9uU3RhcnQgPSBuZXcgVmVjdG9yKCk7Ci0JcHJpdmF0ZSBWZWN0b3IgZkNvbXBsZXRpb25FbmQgPSBuZXcgVmVjdG9yKCk7Ci0JCi0JcHVibGljIGJvb2xlYW4gZkRlYnVnID0gZmFsc2U7Ci0vKioKLSAqIENvbXBsZXRpb25UZXN0c1JlcXVlc3RvciBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCkgewotCXN1cGVyKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIGFjY2VwdEFub255bW91c1R5cGUoY2hhcltdIHN1cGVyVHlwZVBhY2thZ2VOYW1lLGNoYXJbXSBzdXBlclR5cGVOYW1lLGNoYXJbXVtdIHBhcmFtZXRlclBhY2thZ2VOYW1lcyxjaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMsY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsY2hhcltdIGNvbXBsZXRpb25OYW1lLGludCBtb2RpZmllcnMsaW50IGNvbXBsZXRpb25TdGFydCxpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSl7Ci0JZkVsZW1lbnRzLmFkZEVsZW1lbnQobmV3IFN0cmluZyhzdXBlclR5cGVOYW1lKSk7Ci0JZkNvbXBsZXRpb25zLmFkZEVsZW1lbnQobmV3IFN0cmluZyhjb21wbGV0aW9uTmFtZSkpOwotCWZSZWxldmFuY2VzLmFkZEVsZW1lbnQoU3RyaW5nLnZhbHVlT2YocmVsZXZhbmNlKSk7Ci0JZkNvbXBsZXRpb25TdGFydC5hZGRFbGVtZW50KFN0cmluZy52YWx1ZU9mKGNvbXBsZXRpb25TdGFydCkpOwotCWZDb21wbGV0aW9uRW5kLmFkZEVsZW1lbnQoU3RyaW5nLnZhbHVlT2YoY29tcGxldGlvbkVuZCkpOwotCWlmIChmRGVidWcpCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiYW5vbnltb3VzIHR5cGUgIiArIG5ldyBTdHJpbmcoc3VwZXJUeXBlTmFtZSkpOwotfQotLyoqCi0gKiBAc2VlIElDb21wbGV0aW9uUmVxdWVzdG9yCi0gKi8KLXB1YmxpYyB2b2lkIGFjY2VwdENsYXNzKGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIGNsYXNzTmFtZSwgY2hhcltdIGNvbXBsZXRpb25OYW1lLCBpbnQgbW9kaWZpZXJzLCBpbnQgY29tcGxldGlvblN0YXJ0LCBpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSkgewotCWZFbGVtZW50cy5hZGRFbGVtZW50KG5ldyBTdHJpbmcoY2xhc3NOYW1lKSk7Ci0JZkNvbXBsZXRpb25zLmFkZEVsZW1lbnQobmV3IFN0cmluZyhjb21wbGV0aW9uTmFtZSkpOwotCWZSZWxldmFuY2VzLmFkZEVsZW1lbnQoU3RyaW5nLnZhbHVlT2YocmVsZXZhbmNlKSk7Ci0JZkNvbXBsZXRpb25TdGFydC5hZGRFbGVtZW50KFN0cmluZy52YWx1ZU9mKGNvbXBsZXRpb25TdGFydCkpOwotCWZDb21wbGV0aW9uRW5kLmFkZEVsZW1lbnQoU3RyaW5nLnZhbHVlT2YoY29tcGxldGlvbkVuZCkpOwotCWlmIChmRGVidWcpCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3MgIiArIG5ldyBTdHJpbmcoY2xhc3NOYW1lKSk7Ci19Ci0vKioKLSAqIEBzZWUgSUNvbXBsZXRpb25SZXF1ZXN0b3IKLSAqLwotcHVibGljIHZvaWQgYWNjZXB0RXJyb3IoSVByb2JsZW0gZXJyb3IpIHsKLX0KLS8qKgotICogQHNlZSBJQ29tcGxldGlvblJlcXVlc3RvcgotICovCi1wdWJsaWMgdm9pZCBhY2NlcHRGaWVsZCgKLQljaGFyW10gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLAotCWNoYXJbXSBkZWNsYXJpbmdUeXBlTmFtZSwKLQljaGFyW10gbmFtZSwKLQljaGFyW10gdHlwZVBhY2thZ2VOYW1lLAotCWNoYXJbXSB0eXBlTmFtZSwKLQljaGFyW10gY29tcGxldGlvbk5hbWUsCi0JaW50IG1vZGlmaWVycywKLQlpbnQgY29tcGxldGlvblN0YXJ0LAotCWludCBjb21wbGV0aW9uRW5kLAotCWludCByZWxldmFuY2UpIHsKLQkJCi0JZkVsZW1lbnRzLmFkZEVsZW1lbnQobmV3IFN0cmluZyhuYW1lKSk7Ci0JZkNvbXBsZXRpb25zLmFkZEVsZW1lbnQobmV3IFN0cmluZyhjb21wbGV0aW9uTmFtZSkpOwotCWZSZWxldmFuY2VzLmFkZEVsZW1lbnQoU3RyaW5nLnZhbHVlT2YocmVsZXZhbmNlKSk7Ci0JZkNvbXBsZXRpb25TdGFydC5hZGRFbGVtZW50KFN0cmluZy52YWx1ZU9mKGNvbXBsZXRpb25TdGFydCkpOwotCWZDb21wbGV0aW9uRW5kLmFkZEVsZW1lbnQoU3RyaW5nLnZhbHVlT2YoY29tcGxldGlvbkVuZCkpOwotCWlmIChmRGVidWcpCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiRmllbGQgIiArIG5ldyBTdHJpbmcobmFtZSkpOwotfQotLyoqCi0gKiBAc2VlIElDb21wbGV0aW9uUmVxdWVzdG9yCi0gKi8KLXB1YmxpYyB2b2lkIGFjY2VwdEludGVyZmFjZShjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSBpbnRlcmZhY2VOYW1lLCBjaGFyW10gY29tcGxldGlvbk5hbWUsIGludCBtb2RpZmllcnMsIGludCBjb21wbGV0aW9uU3RhcnQsIGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKSB7Ci0JZkVsZW1lbnRzLmFkZEVsZW1lbnQobmV3IFN0cmluZyhpbnRlcmZhY2VOYW1lKSk7Ci0JZkNvbXBsZXRpb25zLmFkZEVsZW1lbnQobmV3IFN0cmluZyhjb21wbGV0aW9uTmFtZSkpOwotCWZSZWxldmFuY2VzLmFkZEVsZW1lbnQoU3RyaW5nLnZhbHVlT2YocmVsZXZhbmNlKSk7Ci0JZkNvbXBsZXRpb25TdGFydC5hZGRFbGVtZW50KFN0cmluZy52YWx1ZU9mKGNvbXBsZXRpb25TdGFydCkpOwotCWZDb21wbGV0aW9uRW5kLmFkZEVsZW1lbnQoU3RyaW5nLnZhbHVlT2YoY29tcGxldGlvbkVuZCkpOwotCWlmIChmRGVidWcpCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiSW50ZXJmYWNlICIgKyBuZXcgU3RyaW5nKGludGVyZmFjZU5hbWUpKTsKLQotfQotLyoqCi0gKiBAc2VlIElDb21wbGV0aW9uUmVxdWVzdG9yCi0gKi8KLXB1YmxpYyB2b2lkIGFjY2VwdEtleXdvcmQoY2hhcltdIGtleXdvcmROYW1lLCBpbnQgY29tcGxldGlvblN0YXJ0LCBpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSkgewotCWZFbGVtZW50cy5hZGRFbGVtZW50KG5ldyBTdHJpbmcoa2V5d29yZE5hbWUpKTsKLQlmQ29tcGxldGlvbnMuYWRkRWxlbWVudChuZXcgU3RyaW5nKGtleXdvcmROYW1lKSk7Ci0JZlJlbGV2YW5jZXMuYWRkRWxlbWVudChTdHJpbmcudmFsdWVPZihyZWxldmFuY2UpKTsKLQlmQ29tcGxldGlvblN0YXJ0LmFkZEVsZW1lbnQoU3RyaW5nLnZhbHVlT2YoY29tcGxldGlvblN0YXJ0KSk7Ci0JZkNvbXBsZXRpb25FbmQuYWRkRWxlbWVudChTdHJpbmcudmFsdWVPZihjb21wbGV0aW9uRW5kKSk7Ci0JaWYgKGZEZWJ1ZykKLQkJU3lzdGVtLm91dC5wcmludGxuKCJLZXl3b3JkICIgKyBuZXcgU3RyaW5nKGtleXdvcmROYW1lKSk7Ci19Ci0vKioKLSAqIEBzZWUgSUNvbXBsZXRpb25SZXF1ZXN0b3IKLSAqLwotcHVibGljIHZvaWQgYWNjZXB0TGFiZWwoY2hhcltdIGxhYmVsTmFtZSwgaW50IGNvbXBsZXRpb25TdGFydCwgaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpIHsKLQlmRWxlbWVudHMuYWRkRWxlbWVudChuZXcgU3RyaW5nKGxhYmVsTmFtZSkpOwotCWZDb21wbGV0aW9ucy5hZGRFbGVtZW50KG5ldyBTdHJpbmcobGFiZWxOYW1lKSk7Ci0JZlJlbGV2YW5jZXMuYWRkRWxlbWVudChTdHJpbmcudmFsdWVPZihyZWxldmFuY2UpKTsKLQlmQ29tcGxldGlvblN0YXJ0LmFkZEVsZW1lbnQoU3RyaW5nLnZhbHVlT2YoY29tcGxldGlvblN0YXJ0KSk7Ci0JZkNvbXBsZXRpb25FbmQuYWRkRWxlbWVudChTdHJpbmcudmFsdWVPZihjb21wbGV0aW9uRW5kKSk7Ci0JaWYgKGZEZWJ1ZykKLQkJU3lzdGVtLm91dC5wcmludGxuKCJMYWJlbCAiICsgbmV3IFN0cmluZyhsYWJlbE5hbWUpKTsKLX0KLS8qKgotICogQHNlZSBJQ29tcGxldGlvblJlcXVlc3RvcgotICovCi1wdWJsaWMgdm9pZCBhY2NlcHRMb2NhbFZhcmlhYmxlKGNoYXJbXSBuYW1lLCBjaGFyW10gdHlwZVBhY2thZ2VOYW1lLCBjaGFyW10gdHlwZU5hbWUsIGludCBtb2RpZmllcnMsIGludCBjb21wbGV0aW9uU3RhcnQsIGludCBjb21wbGV0aW9uRW5kLCBpbnQgcmVsZXZhbmNlKSB7Ci0JZkVsZW1lbnRzLmFkZEVsZW1lbnQobmV3IFN0cmluZyhuYW1lKSk7Ci0JZkNvbXBsZXRpb25zLmFkZEVsZW1lbnQobmV3IFN0cmluZyhuYW1lKSk7Ci0JZlJlbGV2YW5jZXMuYWRkRWxlbWVudChTdHJpbmcudmFsdWVPZihyZWxldmFuY2UpKTsKLQlmQ29tcGxldGlvblN0YXJ0LmFkZEVsZW1lbnQoU3RyaW5nLnZhbHVlT2YoY29tcGxldGlvblN0YXJ0KSk7Ci0JZkNvbXBsZXRpb25FbmQuYWRkRWxlbWVudChTdHJpbmcudmFsdWVPZihjb21wbGV0aW9uRW5kKSk7Ci0JaWYgKGZEZWJ1ZykKLQkJU3lzdGVtLm91dC5wcmludGxuKCJMb2NhbCB2YXJpYWJsZSAiICsgbmV3IFN0cmluZyhuYW1lKSk7Ci19Ci0vKioKLSAqIEBzZWUgSUNvbXBsZXRpb25SZXF1ZXN0b3IKLSAqLwotcHVibGljIHZvaWQgYWNjZXB0TWV0aG9kKAotCWNoYXJbXSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsCi0JY2hhcltdIGRlY2xhcmluZ1R5cGVOYW1lLAotCWNoYXJbXSBzZWxlY3RvciwKLQljaGFyW11bXSBwYXJhbWV0ZXJQYWNrYWdlTmFtZSwKLQljaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZSwKLQljaGFyW11bXSBwYXJhbWV0ZXJOYW1lcywKLQljaGFyW10gcmV0dXJuVHlwZVBhY2thZ2VOYW1lLAotCWNoYXJbXSByZXR1cm5UeXBlTmFtZSwKLQljaGFyW10gY29tcGxldGlvbk5hbWUsCi0JaW50IG1vZGlmaWVycywKLQlpbnQgY29tcGxldGlvblN0YXJ0LAotCWludCBjb21wbGV0aW9uRW5kLAotCWludCByZWxldmFuY2UpIHsKLQkJCi0JZkVsZW1lbnRzLmFkZEVsZW1lbnQobmV3IFN0cmluZyhzZWxlY3RvcikpOwotCWZDb21wbGV0aW9ucy5hZGRFbGVtZW50KG5ldyBTdHJpbmcoY29tcGxldGlvbk5hbWUpKTsKLQlmUmVsZXZhbmNlcy5hZGRFbGVtZW50KFN0cmluZy52YWx1ZU9mKHJlbGV2YW5jZSkpOwotCWZDb21wbGV0aW9uU3RhcnQuYWRkRWxlbWVudChTdHJpbmcudmFsdWVPZihjb21wbGV0aW9uU3RhcnQpKTsKLQlmQ29tcGxldGlvbkVuZC5hZGRFbGVtZW50KFN0cmluZy52YWx1ZU9mKGNvbXBsZXRpb25FbmQpKTsKLQlpZiAoZkRlYnVnKQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIm1ldGhvZCAiICsgbmV3IFN0cmluZyhzZWxlY3RvcikpOwotfQotLyoqCi0gKiBAc2VlIElDb21wbGV0aW9uUmVxdWVzdG9yCi0gKi8KLXB1YmxpYyB2b2lkIGFjY2VwdE1ldGhvZERlY2xhcmF0aW9uKAotCWNoYXJbXSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsCi0JY2hhcltdIGRlY2xhcmluZ1R5cGVOYW1lLAotCWNoYXJbXSBzZWxlY3RvciwKLQljaGFyW11bXSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsCi0JY2hhcltdW10gcGFyYW1ldGVyVHlwZU5hbWVzLAotCWNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLAotCWNoYXJbXSByZXR1cm5UeXBlUGFja2FnZU5hbWUsCi0JY2hhcltdIHJldHVyblR5cGVOYW1lLAotCWNoYXJbXSBjb21wbGV0aW9uTmFtZSwKLQlpbnQgbW9kaWZpZXJzLAotCWludCBjb21wbGV0aW9uU3RhcnQsCi0JaW50IGNvbXBsZXRpb25FbmQsCi0JaW50IHJlbGV2YW5jZSkgewotCQkKLQlmRWxlbWVudHMuYWRkRWxlbWVudChuZXcgU3RyaW5nKHNlbGVjdG9yKSk7Ci0JZkNvbXBsZXRpb25zLmFkZEVsZW1lbnQobmV3IFN0cmluZyhjb21wbGV0aW9uTmFtZSkpOwotCWZSZWxldmFuY2VzLmFkZEVsZW1lbnQoU3RyaW5nLnZhbHVlT2YocmVsZXZhbmNlKSk7Ci0JZkNvbXBsZXRpb25TdGFydC5hZGRFbGVtZW50KFN0cmluZy52YWx1ZU9mKGNvbXBsZXRpb25TdGFydCkpOwotCWZDb21wbGV0aW9uRW5kLmFkZEVsZW1lbnQoU3RyaW5nLnZhbHVlT2YoY29tcGxldGlvbkVuZCkpOwotCWlmIChmRGVidWcpCi0JCVN5c3RlbS5vdXQucHJpbnRsbigibWV0aG9kIGRlY2xhcmF0aW9uICIgKyBuZXcgU3RyaW5nKHNlbGVjdG9yKSk7Ci19Ci0vKioKLSAqIEBzZWUgSUNvbXBsZXRpb25SZXF1ZXN0b3IKLSAqLwotcHVibGljIHZvaWQgYWNjZXB0TW9kaWZpZXIoY2hhcltdIG1vZGlmaWVyTmFtZSwgaW50IGNvbXBsZXRpb25TdGFydCwgaW50IGNvbXBsZXRpb25FbmQsIGludCByZWxldmFuY2UpIHsKLQlmRWxlbWVudHMuYWRkRWxlbWVudChuZXcgU3RyaW5nKG1vZGlmaWVyTmFtZSkpOwotCWZDb21wbGV0aW9ucy5hZGRFbGVtZW50KG5ldyBTdHJpbmcobW9kaWZpZXJOYW1lKSk7Ci0JZlJlbGV2YW5jZXMuYWRkRWxlbWVudChTdHJpbmcudmFsdWVPZihyZWxldmFuY2UpKTsKLQlmQ29tcGxldGlvblN0YXJ0LmFkZEVsZW1lbnQoU3RyaW5nLnZhbHVlT2YoY29tcGxldGlvblN0YXJ0KSk7Ci0JZkNvbXBsZXRpb25FbmQuYWRkRWxlbWVudChTdHJpbmcudmFsdWVPZihjb21wbGV0aW9uRW5kKSk7Ci0JaWYgKGZEZWJ1ZykKLQkJU3lzdGVtLm91dC5wcmludGxuKCJtb2RpZmllciAiICsgbmV3IFN0cmluZyhtb2RpZmllck5hbWUpKTsKLX0KLS8qKgotICogQHNlZSBJQ29tcGxldGlvblJlcXVlc3RvcgotICovCi1wdWJsaWMgdm9pZCBhY2NlcHRQYWNrYWdlKGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIGNvbXBsZXRpb25OYW1lLCBpbnQgY29tcGxldGlvblN0YXJ0LCBpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSkgewotCWZFbGVtZW50cy5hZGRFbGVtZW50KG5ldyBTdHJpbmcocGFja2FnZU5hbWUpKTsKLQlmQ29tcGxldGlvbnMuYWRkRWxlbWVudChuZXcgU3RyaW5nKGNvbXBsZXRpb25OYW1lKSk7Ci0JZlJlbGV2YW5jZXMuYWRkRWxlbWVudChTdHJpbmcudmFsdWVPZihyZWxldmFuY2UpKTsKLQlmQ29tcGxldGlvblN0YXJ0LmFkZEVsZW1lbnQoU3RyaW5nLnZhbHVlT2YoY29tcGxldGlvblN0YXJ0KSk7Ci0JZkNvbXBsZXRpb25FbmQuYWRkRWxlbWVudChTdHJpbmcudmFsdWVPZihjb21wbGV0aW9uRW5kKSk7Ci0JaWYgKGZEZWJ1ZykKLQkJU3lzdGVtLm91dC5wcmludGxuKCJwYWNrYWdlICIgKyBuZXcgU3RyaW5nKHBhY2thZ2VOYW1lKSk7Ci19Ci0vKioKLSAqIEBzZWUgSUNvbXBsZXRpb25SZXF1ZXN0b3IKLSAqLwotcHVibGljIHZvaWQgYWNjZXB0VHlwZShjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSB0eXBlTmFtZSwgY2hhcltdIGNvbXBsZXRpb25OYW1lLCBpbnQgY29tcGxldGlvblN0YXJ0LCBpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSkgewotCWZFbGVtZW50cy5hZGRFbGVtZW50KG5ldyBTdHJpbmcodHlwZU5hbWUpKTsKLQlmQ29tcGxldGlvbnMuYWRkRWxlbWVudChuZXcgU3RyaW5nKGNvbXBsZXRpb25OYW1lKSk7Ci0JZlJlbGV2YW5jZXMuYWRkRWxlbWVudChTdHJpbmcudmFsdWVPZihyZWxldmFuY2UpKTsKLQlmQ29tcGxldGlvblN0YXJ0LmFkZEVsZW1lbnQoU3RyaW5nLnZhbHVlT2YoY29tcGxldGlvblN0YXJ0KSk7Ci0JZkNvbXBsZXRpb25FbmQuYWRkRWxlbWVudChTdHJpbmcudmFsdWVPZihjb21wbGV0aW9uRW5kKSk7Ci0JaWYgKGZEZWJ1ZykKLQkJU3lzdGVtLm91dC5wcmludGxuKCJ0eXBlICIgKyBuZXcgU3RyaW5nKHR5cGVOYW1lKSk7Ci19Ci0KLS8qKgotICogQHNlZSBJQ29tcGxldGlvblJlcXVlc3RvcgotICovCi1wdWJsaWMgdm9pZCBhY2NlcHRWYXJpYWJsZU5hbWUoY2hhcltdIHR5cGVQYWNrYWdlTmFtZSwgY2hhcltdIHR5cGVOYW1lLCBjaGFyW10gbmFtZSwgY2hhcltdIGNvbXBsZXRpb25OYW1lLCBpbnQgY29tcGxldGlvblN0YXJ0LCBpbnQgY29tcGxldGlvbkVuZCwgaW50IHJlbGV2YW5jZSl7Ci0JZkVsZW1lbnRzLmFkZEVsZW1lbnQobmV3IFN0cmluZyhuYW1lKSk7Ci0JZkNvbXBsZXRpb25zLmFkZEVsZW1lbnQobmV3IFN0cmluZyhjb21wbGV0aW9uTmFtZSkpOwotCWZSZWxldmFuY2VzLmFkZEVsZW1lbnQoU3RyaW5nLnZhbHVlT2YocmVsZXZhbmNlKSk7Ci0JZkNvbXBsZXRpb25TdGFydC5hZGRFbGVtZW50KFN0cmluZy52YWx1ZU9mKGNvbXBsZXRpb25TdGFydCkpOwotCWZDb21wbGV0aW9uRW5kLmFkZEVsZW1lbnQoU3RyaW5nLnZhbHVlT2YoY29tcGxldGlvbkVuZCkpOwotCWlmIChmRGVidWcpCi0JCVN5c3RlbS5vdXQucHJpbnRsbigidmFyaWFibGUgbmFtZSAiICsgbmV3IFN0cmluZyhuYW1lKSk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0cygpIHsKLQlyZXR1cm4gZ2V0UmVzdWx0cyh0cnVlLCBmYWxzZSk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0c1dpdGhQb3NpdGlvbigpewotCXJldHVybiBnZXRSZXN1bHRzKHRydWUsIHRydWUpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldFJlc3VsdHMoYm9vbGVhbiByZWxldmFuY2UsIGJvb2xlYW4gcG9zaXRpb24pIHsKLQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCWludCBzaXplID0gZkVsZW1lbnRzLnNpemUoKTsKLQkKLQlpZiAoc2l6ZSA9PSAxKSB7Ci0JCXJlc3VsdC5hcHBlbmQoZ2V0UmVzdWx0KDAsIHJlbGV2YW5jZSwgcG9zaXRpb24pKTsKLQl9IGVsc2UgaWYgKHNpemUgPiAxKSB7Ci0JCVN0cmluZ1tdIHNvcnRlZEJ1Y2tldCA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlzb3J0ZWRCdWNrZXRbaV0gPSBnZXRSZXN1bHQoaSwgcmVsZXZhbmNlLCBwb3NpdGlvbik7Ci0JCX0KLQkJcXVpY2tTb3J0KHNvcnRlZEJ1Y2tldCwgMCwgc2l6ZSAtIDEpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHNvcnRlZEJ1Y2tldC5sZW5ndGg7IGorKykgewotCQkJaWYgKHJlc3VsdC5sZW5ndGgoKSA+IDApIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0JCQlyZXN1bHQuYXBwZW5kKHNvcnRlZEJ1Y2tldFtqXSk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci19Ci0KLXByaXZhdGUgU3RyaW5nIGdldFJlc3VsdChpbnQgaSwgYm9vbGVhbiByZWxldmFuY2UsIGJvb2xlYW4gcG9zaXRpb24pIHsKLQlpZihpIDwgMCB8fCBpID49IGZFbGVtZW50cy5zaXplKCkpCi0JCXJldHVybiAiIjsKLQkKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gIG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlidWZmZXIuYXBwZW5kKCJlbGVtZW50OiIpOwotCWJ1ZmZlci5hcHBlbmQoZkVsZW1lbnRzLmVsZW1lbnRBdChpKSk7Ci0JYnVmZmVyLmFwcGVuZCgiICAgIGNvbXBsZXRpb246Iik7Ci0JYnVmZmVyLmFwcGVuZChmQ29tcGxldGlvbnMuZWxlbWVudEF0KGkpKTsKLQlpZihwb3NpdGlvbikgewotCQlidWZmZXIuYXBwZW5kKCIgICAgcG9zaXRpb246WyIpOwotCQlidWZmZXIuYXBwZW5kKGZDb21wbGV0aW9uU3RhcnQuZWxlbWVudEF0KGkpKTsKLQkJYnVmZmVyLmFwcGVuZCgiLCIpOwotCQlidWZmZXIuYXBwZW5kKGZDb21wbGV0aW9uRW5kLmVsZW1lbnRBdChpKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIl0iKTsKLQl9Ci0JaWYocmVsZXZhbmNlKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoIiAgICByZWxldmFuY2U6Iik7Ci0JCWJ1ZmZlci5hcHBlbmQoZlJlbGV2YW5jZXMuZWxlbWVudEF0KGkpKTsKLQl9Ci0JcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotfQotCi1wcm90ZWN0ZWQgU3RyaW5nW10gcXVpY2tTb3J0KFN0cmluZ1tdIGNvbGxlY3Rpb24sIGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKLQlpbnQgb3JpZ2luYWxfbGVmdCA9IGxlZnQ7Ci0JaW50IG9yaWdpbmFsX3JpZ2h0ID0gcmlnaHQ7Ci0JU3RyaW5nIG1pZCA9IGNvbGxlY3Rpb25bIChsZWZ0ICsgcmlnaHQpIC8gMl07Ci0JZG8gewotCQl3aGlsZSAobWlkLmNvbXBhcmVUbyhjb2xsZWN0aW9uW2xlZnRdKSA+IDApCi0JCQkvLyBzW2xlZnRdID49IG1pZAotCQkJbGVmdCsrOwotCQl3aGlsZSAobWlkLmNvbXBhcmVUbyhjb2xsZWN0aW9uW3JpZ2h0XSkgPCAwKQotCQkJLy8gc1tyaWdodF0gPD0gbWlkCi0JCQlyaWdodC0tOwotCQlpZiAobGVmdCA8PSByaWdodCkgewotCQkJU3RyaW5nIHRtcCA9IGNvbGxlY3Rpb25bbGVmdF07Ci0JCQljb2xsZWN0aW9uW2xlZnRdID0gY29sbGVjdGlvbltyaWdodF07Ci0JCQljb2xsZWN0aW9uW3JpZ2h0XSA9IHRtcDsKLQkJCWxlZnQrKzsKLQkJCXJpZ2h0LS07Ci0JCX0KLQl9IHdoaWxlIChsZWZ0IDw9IHJpZ2h0KTsKLQlpZiAob3JpZ2luYWxfbGVmdCA8IHJpZ2h0KQotCQljb2xsZWN0aW9uID0gcXVpY2tTb3J0KGNvbGxlY3Rpb24sIG9yaWdpbmFsX2xlZnQsIHJpZ2h0KTsKLQlpZiAobGVmdCA8IG9yaWdpbmFsX3JpZ2h0KQotCQljb2xsZWN0aW9uID0gcXVpY2tTb3J0KGNvbGxlY3Rpb24sIGxlZnQsIG9yaWdpbmFsX3JpZ2h0KTsKLQlyZXR1cm4gY29sbGVjdGlvbjsKLX0KLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JcmV0dXJuIGdldFJlc3VsdHMoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9Db250YWluZXJJbml0aWFsaXplci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0NvbnRhaW5lckluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0M2ExZGQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0NvbnRhaW5lckluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLQotcHVibGljIGNsYXNzIENvbnRhaW5lckluaXRpYWxpemVyIGV4dGVuZHMgQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIgewotCXB1YmxpYyBzdGF0aWMgSVRlc3RJbml0aWFsaXplciBpbml0aWFsaXplcjsKLQkKLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBJVGVzdEluaXRpYWxpemVyIHsKLQkJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbml0aWFsaXplcihJVGVzdEluaXRpYWxpemVyIGluaXRpYWxpemVyKSB7Ci0JCUNvbnRhaW5lckluaXRpYWxpemVyLmluaXRpYWxpemVyID0gaW5pdGlhbGl6ZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGluaXRpYWxpemVyID09IG51bGwpIHJldHVybjsKLQkJaW5pdGlhbGl6ZXIuaW5pdGlhbGl6ZShjb250YWluZXJQYXRoLCBwcm9qZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvQ29weU1vdmVFbGVtZW50c1Rlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvQ29weU1vdmVFbGVtZW50c1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZWZiNjIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0NvcHlNb3ZlRWxlbWVudHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotCi1wdWJsaWMgY2xhc3MgQ29weU1vdmVFbGVtZW50c1Rlc3RzIGV4dGVuZHMgQ29weU1vdmVUZXN0cyB7Ci1wdWJsaWMgQ29weU1vdmVFbGVtZW50c1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRVcFN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0Jc3VwZXIuc2V0VXBTdWl0ZSgpOwotCQotCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiQmluYXJ5UHJvamVjdCIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCBuZXcgU3RyaW5nW10geyJKQ0xfTElCIn0sICJiaW4iKTsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvQmluYXJ5UHJvamVjdC9zcmMvWC5qYXZhIiwKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBpbnQgYmFyO1xuIiArCi0JCSIgIHB1YmxpYyB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iCi0JKTsKLQlwcm9qZWN0LmdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkZVTExfQlVJTEQsIG51bGwpOwotfQotLyoqCi0gKiBTZXR1cCBmb3IgdGhlIG5leHQgdGVzdC4KLSAqLwotcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQlzdXBlci5zZXRVcCgpOwotCQotCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgbmV3IFN0cmluZ1tdIHsiL0JpbmFyeVByb2plY3QvYmluIn0sICJiaW4iKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlyZXR1cm4gbmV3IFN1aXRlKENvcHlNb3ZlRWxlbWVudHNUZXN0cy5jbGFzcyk7Ci19Ci0vKioKLSAqIENsZWFudXAgYWZ0ZXIgdGhlIHByZXZpb3VzIHRlc3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JCi0Jc3VwZXIudGVhckRvd24oKTsKLX0KLXB1YmxpYyB2b2lkIHRlYXJEb3duU3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQl0aGlzLmRlbGV0ZVByb2plY3QoIkJpbmFyeVByb2plY3QiKTsKLQlzdXBlci50ZWFyRG93blN1aXRlKCk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIGJpbmFyeSBmaWVsZCBjYW5ub3QgYmUgcmVuYW1lZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlCaW5hcnlGaWVsZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlDbGFzc0ZpbGUgY2YgPSBnZXRDbGFzc0ZpbGUoIlAiLCAiL0JpbmFyeVByb2plY3QvYmluIiwgIiIsICJYLmNsYXNzIik7Ci0JSUZpZWxkIGJpbmFyeUZpZWxkID0gY2YuZ2V0VHlwZSgpLmdldEZpZWxkKCJiYXIiKTsKLQljb3B5TmVnYXRpdmUoYmluYXJ5RmllbGQsIGNmLCBudWxsLCAiYmFyMiIsIGZhbHNlLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLlJFQURfT05MWSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIGJpbmFyeSBtZXRob2QgY2Fubm90IGJlIHJlbmFtZWQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb3B5QmluYXJ5TWV0aG9kKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNsYXNzRmlsZSBjZiA9IGdldENsYXNzRmlsZSgiUCIsICIvQmluYXJ5UHJvamVjdC9iaW4iLCAiIiwgIlguY2xhc3MiKTsKLQlJTWV0aG9kIGJpbmFyeU1ldGhvZCA9IGNmLmdldFR5cGUoKS5nZXRNZXRob2QoImZvbyIsIG5ldyBTdHJpbmdbXSB7fSk7Ci0JY29weU5lZ2F0aXZlKGJpbmFyeU1ldGhvZCwgY2YsIG51bGwsICJmb28yIiwgZmFsc2UsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuUkVBRF9PTkxZKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgYmluYXJ5IHR5cGUgY2Fubm90IGJlIGNvcGllZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlCaW5hcnlUeXBlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNsYXNzRmlsZSBjZiA9IGdldENsYXNzRmlsZSgiUCIsICIvQmluYXJ5UHJvamVjdC9iaW4iLCAiIiwgIlguY2xhc3MiKTsKLQlJVHlwZSBiaW5hcnlUeXBlID0gY2YuZ2V0VHlwZSgpOwotCWNvcHlOZWdhdGl2ZShiaW5hcnlUeXBlLCBjZiwgbnVsbCwgIlkiLCBmYWxzZSwgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5SRUFEX09OTFkpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBjb25zdHJ1Y3RvciBjYW4gYmUgY29waWVkIHRvIGEgZGlmZmVyZW50IHR5cGUuICBUaGUgY29uc3RydWN0b3IKLSAqIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IHJlbmFtZWQgdG8gdGhhdCBvZiB0aGUgZGVzdGluYXRpb24gdHlwZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlDb25zdHJ1Y3RvcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvWC5qYXZhIiwKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBYKFN0cmluZyBzKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IgotCSk7Ci0JSVR5cGUgdHlwZVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpLmdldFR5cGUoIlgiKTsKLQlJTWV0aG9kIG1ldGhvZFNvdXJjZSA9IHR5cGVTb3VyY2UuZ2V0TWV0aG9kKCJYIiwgbmV3IFN0cmluZ1tdIHsiUVN0cmluZzsifSk7Ci0KLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvWS5qYXZhIiwKLQkJInB1YmxpYyBjbGFzcyBZIHtcbiIgKwotCQkifSIKLQkpOwotCUlUeXBlIHR5cGVEZXN0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWS5qYXZhIikuZ2V0VHlwZSgiWSIpOwotCi0JY29weVBvc2l0aXZlKG1ldGhvZFNvdXJjZSwgdHlwZURlc3QsIG51bGwsIG51bGwsIGZhbHNlKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgY29uc3RydWN0b3IgY2FuIGJlIGNvcGllZCB0byBhIGRpZmZlcmVudCB0eXBlIGFjcm9zcyBwcm9qZWN0cy4gCi0gKiBUaGUgY29uc3RydWN0b3Igc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgcmVuYW1lZCB0byB0aGF0IG9mIHRoZSBkZXN0aW5hdGlvbiB0eXBlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29weUNvbnN0cnVjdG9ySW5EaWZmZXJlbnRQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvWC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSIgIFgoU3RyaW5nIHMpIHtcbiIgKwotCQkJIiAgfVxuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpLmdldFR5cGUoIlgiKTsKLQkJSU1ldGhvZCBtZXRob2RTb3VyY2UgPSB0eXBlU291cmNlLmdldE1ldGhvZCgiWCIsIG5ldyBTdHJpbmdbXSB7IlFTdHJpbmc7In0pOwotCQotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMiIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUDIvc3JjL1kuamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QMi9zcmMvWS5qYXZhIikuZ2V0VHlwZSgiWSIpOwotCQotCQljb3B5UG9zaXRpdmUobWV0aG9kU291cmNlLCB0eXBlRGVzdCwgbnVsbCwgbnVsbCwgZmFsc2UpOwotCi0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMiIpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgZmllbGQgY2FuIGJlIGNvcGllZCB0byBhIGRpZmZlcmVudCB0eXBlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29weUZpZWxkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9YLmphdmEiLAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIGludCBmb287XG4iICsKLQkJIn0iCi0JKTsKLQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCUlGaWVsZCBmaWVsZFNvdXJjZT0gdHlwZVNvdXJjZS5nZXRGaWVsZCgiZm9vIik7Ci0KLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvWS5qYXZhIiwKLQkJInB1YmxpYyBjbGFzcyBZIHtcbiIgKwotCQkifSIKLQkpOwotCUlUeXBlIHR5cGVEZXN0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWS5qYXZhIikuZ2V0VHlwZSgiWSIpOwotCi0JY29weVBvc2l0aXZlKGZpZWxkU291cmNlLCB0eXBlRGVzdCwgbnVsbCwgbnVsbCwgZmFsc2UpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBmaWVsZCBjYW4gYmUgY29waWVkIHRvIGEgZGlmZmVyZW50IHR5cGUgcmVwbGFjaW5nIGFuIGV4aXN0aW5nIGZpZWxkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29weUZpZWxkRm9yY2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL1guamF2YSIsCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgaW50IGZvbztcbiIgKwotCQkifSIKLQkpOwotCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JSUZpZWxkIGZpZWxkU291cmNlPSB0eXBlU291cmNlLmdldEZpZWxkKCJmb28iKTsKLQotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9ZLmphdmEiLAotCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCSIgIGJvb2xlYW4gZm9vO1xuIiArCi0JCSJ9IgotCSk7Ci0JSVR5cGUgdHlwZURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9ZLmphdmEiKS5nZXRUeXBlKCJZIik7Ci0KLQljb3B5UG9zaXRpdmUoZmllbGRTb3VyY2UsIHR5cGVEZXN0LCBudWxsLCBudWxsLCB0cnVlKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgZmllbGQgY2FuIGJlIGNvcGllZCB0byBhIGRpZmZlcmVudCB0eXBlIGFjcm9zcyBwcm9qZWN0cyAKLSAqIHJlcGxhY2luZyBhbiBleGlzdGluZyBmaWVsZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlGaWVsZEZvcmNlSW5EaWZmZXJlbnRQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvWC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSIgIGludCBiYXI7XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCQlJRmllbGQgZmllbGRTb3VyY2U9IHR5cGVTb3VyY2UuZ2V0RmllbGQoImJhciIpOwotCQotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMiIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUDIvc3JjL1kuamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCQkiICBib29sZWFuIGJhcjtcbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVEZXN0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUDIvc3JjL1kuamF2YSIpLmdldFR5cGUoIlkiKTsKLQkKLQkJY29weVBvc2l0aXZlKGZpZWxkU291cmNlLCB0eXBlRGVzdCwgbnVsbCwgbnVsbCwgdHJ1ZSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMiIpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgZmllbGQgY2FuIGJlIGNvcGllZCB0byBhIGRpZmZlcmVudCB0eXBlIGluIGEgZGlmZmVyZW50IHByb2plY3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb3B5RmllbGRJbkRpZmZlcmVudFByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QL3NyYy9YLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIiAgaW50IGJhcjtcbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JCUlGaWVsZCBmaWVsZFNvdXJjZT0gdHlwZVNvdXJjZS5nZXRGaWVsZCgiYmFyIik7Ci0JCi0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QMi9zcmMvWS5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWSB7XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJVHlwZSB0eXBlRGVzdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1AyL3NyYy9ZLmphdmEiKS5nZXRUeXBlKCJZIik7Ci0JCi0JCWNvcHlQb3NpdGl2ZShmaWVsZFNvdXJjZSwgdHlwZURlc3QsIG51bGwsIG51bGwsIGZhbHNlKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAyIik7Ci0JfQotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBmaWVsZCBjYW4gYmUgY29waWVkIHRvIGEgZGlmZmVyZW50IHR5cGUsCi0gKiBhbmQgcmVuYW1lZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlGaWVsZFJlbmFtZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvWC5qYXZhIiwKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBpbnQgZm9vO1xuIiArCi0JCSJ9IgotCSk7Ci0JSVR5cGUgdHlwZVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpLmdldFR5cGUoIlgiKTsKLQlJRmllbGQgZmllbGRTb3VyY2U9IHR5cGVTb3VyY2UuZ2V0RmllbGQoImZvbyIpOwotCi0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL1kuamF2YSIsCi0JCSJwdWJsaWMgY2xhc3MgWSB7XG4iICsKLQkJIn0iCi0JKTsKLQlJVHlwZSB0eXBlRGVzdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1kuamF2YSIpLmdldFR5cGUoIlkiKTsKLQotCWNvcHlQb3NpdGl2ZShmaWVsZFNvdXJjZSwgdHlwZURlc3QsIG51bGwsICJiYXIiLCBmYWxzZSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIGZpZWxkIGNhbiBiZSBjb3BpZWQgdG8gYSBkaWZmZXJlbnQgdHlwZSwKLSAqIGFuZCByZW5hbWVkLCBvdmVyd3JpdGluZyBhbiBleGlzdGluZyBmaWVsZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlGaWVsZFJlbmFtZUZvcmNlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9YLmphdmEiLAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIGludCBmb287XG4iICsKLQkJIn0iCi0JKTsKLQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCUlGaWVsZCBmaWVsZFNvdXJjZT0gdHlwZVNvdXJjZS5nZXRGaWVsZCgiZm9vIik7Ci0KLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvWS5qYXZhIiwKLQkJInB1YmxpYyBjbGFzcyBZIHtcbiIgKwotCQkiICBib29sZWFuIGJhcjtcbiIgKwotCQkifSIKLQkpOwotCUlUeXBlIHR5cGVEZXN0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWS5qYXZhIikuZ2V0VHlwZSgiWSIpOwotCi0JY29weVBvc2l0aXZlKGZpZWxkU291cmNlLCB0eXBlRGVzdCwgbnVsbCwgImJhciIsIHRydWUpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBmaWVsZCBjYW4gYmUgY29waWVkIHRvIGEgZGlmZmVyZW50IHR5cGUgYWNyb3NzIHR3byBkaWZmZXJlbnQgCi0gKiBwcm9qZWN0cywgYW5kIHJlbmFtZWQsIG92ZXJ3cml0aW5nIGFuIGV4aXN0aW5nIGZpZWxkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29weUZpZWxkUmVuYW1lRm9yY2VJbkRpZmZlcmVudFByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QL3NyYy9YLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIiAgaW50IGZvbztcbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JCUlGaWVsZCBmaWVsZFNvdXJjZT0gdHlwZVNvdXJjZS5nZXRGaWVsZCgiZm9vIik7Ci0JCi0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QMi9zcmMvWS5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWSB7XG4iICsKLQkJCSIgIGJvb2xlYW4gYmFyO1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QMi9zcmMvWS5qYXZhIikuZ2V0VHlwZSgiWSIpOwotCQotCQljb3B5UG9zaXRpdmUoZmllbGRTb3VyY2UsIHR5cGVEZXN0LCBudWxsLCAiYmFyIiwgdHJ1ZSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMiIpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgZmllbGQgY2FuIGJlIGNvcGllZCB0byBhIGRpZmZlcmVudCB0eXBlIGFjcm9zcyB0d28gZGlmZmVyZW50Ci0gKiBwcm9qZWN0cywgYW5kIHJlbmFtZWQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb3B5RmllbGRSZW5hbWVJbkRpZmZlcmVudFByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QL3NyYy9YLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIiAgaW50IGZvbztcbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JCUlGaWVsZCBmaWVsZFNvdXJjZT0gdHlwZVNvdXJjZS5nZXRGaWVsZCgiZm9vIik7Ci0JCi0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QMi9zcmMvWS5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWSB7XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJVHlwZSB0eXBlRGVzdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1AyL3NyYy9ZLmphdmEiKS5nZXRUeXBlKCJZIik7Ci0JCi0JCWNvcHlQb3NpdGl2ZShmaWVsZFNvdXJjZSwgdHlwZURlc3QsIG51bGwsICJiYXIiLCBmYWxzZSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMiIpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgZmllbGQgY2FuIGJlIGR1cGxpY2F0ZWQgaW4gdGhlIHNhbWUgdHlwZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlGaWVsZFNhbWVQYXJlbnQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL1guamF2YSIsCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgaW50IGZvbztcbiIgKwotCQkifSIKLQkpOwotCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JSUZpZWxkIGZpZWxkU291cmNlPSB0eXBlU291cmNlLmdldEZpZWxkKCJmb28iKTsKLQotCWNvcHlQb3NpdGl2ZShmaWVsZFNvdXJjZSwgdHlwZVNvdXJjZSwgbnVsbCwgImJhciIsIGZhbHNlKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgbXVsdGkgc3RhdHVzIGV4Y2VwdGlvbiBpcyBnZW5lcmF0ZWQgd2hlbiBjb3B5aW5nIGZpZWxkcy4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlGaWVsZHNNdWx0aVN0YXR1cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvWC5qYXZhIiwKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBpbnQgZm9vO1xuIiArCi0JCSIgIE9iamVjdCBiYXI7XG4iICsKLQkJIiAgY2hhcltdIGZyZWQ7XG4iICsKLQkJIn0iCi0JKTsKLQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCi0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL1kuamF2YSIsCi0JCSJwdWJsaWMgY2xhc3MgWSB7XG4iICsKLQkJIn0iCi0JKTsKLQlJVHlwZSB0eXBlRGVzdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1kuamF2YSIpLmdldFR5cGUoIlkiKTsKLQotCUlGaWVsZFtdIGZpZWxkc1NvdXJjZSA9IHR5cGVTb3VyY2UuZ2V0RmllbGRzKCk7Ci0JSUphdmFFbGVtZW50W10gZGVzdHMgPSBuZXcgSUphdmFFbGVtZW50W2ZpZWxkc1NvdXJjZS5sZW5ndGhdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzdHMubGVuZ3RoOyBpKyspIHsKLQkJZGVzdHNbaV0gPSB0eXBlRGVzdDsKLQl9Ci0JZGVzdHNbMV0gPSAoSUphdmFFbGVtZW50KWZpZWxkc1NvdXJjZVswXTsgLy9pbnZhbGlkIGRlc3RpbmF0aW9uCi0JZGVzdHNbMl09ICAoSUphdmFFbGVtZW50KWZpZWxkc1NvdXJjZVswXTsKLQotCXRyeSB7Ci0JCXN0YXJ0RGVsdGFzKCk7Ci0JCWJvb2xlYW4gZT0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0eXBlRGVzdC5nZXRKYXZhTW9kZWwoKS5jb3B5KGZpZWxkc1NvdXJjZSwgZGVzdHMsIG51bGwsIG51bGwsIGZhbHNlLCBudWxsKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIGJlIG11bHRpc3RhdHVzIiwgam1lLmdldFN0YXR1cygpLmlzTXVsdGlTdGF0dXMoKSk7Ci0JCQlhc3NlcnRUcnVlKCJTaG91bGQgYmUgYW4gaW52YWxpZCBkZXN0aW5hdGlvbiIsICgoSUphdmFNb2RlbFN0YXR1cylqbWUuZ2V0U3RhdHVzKCkuZ2V0Q2hpbGRyZW4oKVswXSkuZ2V0Q29kZSgpPT0gSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0RFU1RJTkFUSU9OKTsKLQkJCWUgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIlNob3VsZCBoYXZlIGJlZW4gYW4gZXhjZXB0aW9uIiwgZSk7Ci0JCQotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSIsCi0JCQkiUFsqXToge0NISUxEUkVOfVxuIiArIAotCQkJIglzcmNbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJCSIJCVtkZWZhdWx0XVsqXToge0NISUxEUkVOfVxuIiArIAotCQkJIgkJCVkuamF2YVsqXToge0NISUxEUkVOIHwgRklORSBHUkFJTkVEfVxuIiArIAotCQkJIgkJCQlZWypdOiB7Q0hJTERSRU4gfCBGSU5FIEdSQUlORUR9XG4iICsgCi0JCQkiCQkJCQlmb29bK106IHt9IgotCQkpOwotCi0JCUlKYXZhRWxlbWVudCBjb3B5PSBnZW5lcmF0ZUhhbmRsZShmaWVsZHNTb3VyY2VbMF0sIG51bGwsIHR5cGVEZXN0KTsKLQkJYXNzZXJ0VHJ1ZSgiQ29weSBzaG91bGQgZXhpc3QiLCBjb3B5LmV4aXN0cygpKTsKLQl9IGZpbmFsbHkgewotCQlzdG9wRGVsdGFzKCk7Ci0JfQotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBtdWx0aSBzdGF0dXMgZXhjZXB0aW9uIGlzIGdlbmVyYXRlZCB3aGVuIGNvcHlpbmcgZmllbGRzLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29weUZpZWxkc011bHRpU3RhdHVzSW5EaWZmZXJlbnRQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvWC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSIgIGludCBmb287XG4iICsKLQkJCSIgIE9iamVjdCBiYXI7XG4iICsKLQkJCSIgIGNoYXJbXSBmcmVkO1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpLmdldFR5cGUoIlgiKTsKLQkKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDIiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1AyL3NyYy9ZLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBZIHtcbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVEZXN0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUDIvc3JjL1kuamF2YSIpLmdldFR5cGUoIlkiKTsKLQkKLQkJSUZpZWxkW10gZmllbGRzU291cmNlID0gdHlwZVNvdXJjZS5nZXRGaWVsZHMoKTsKLQkJSUphdmFFbGVtZW50W10gZGVzdHMgPSBuZXcgSUphdmFFbGVtZW50W2ZpZWxkc1NvdXJjZS5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlkZXN0c1tpXSA9IHR5cGVEZXN0OwotCQl9Ci0JCWRlc3RzWzFdID0gKElKYXZhRWxlbWVudClmaWVsZHNTb3VyY2VbMF07IC8vaW52YWxpZCBkZXN0aW5hdGlvbgotCQlkZXN0c1syXT0gIChJSmF2YUVsZW1lbnQpZmllbGRzU291cmNlWzBdOwotCi0JCXN0YXJ0RGVsdGFzKCk7Ci0JCWJvb2xlYW4gZT0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0eXBlRGVzdC5nZXRKYXZhTW9kZWwoKS5jb3B5KGZpZWxkc1NvdXJjZSwgZGVzdHMsIG51bGwsIG51bGwsIGZhbHNlLCBudWxsKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIGJlIG11bHRpc3RhdHVzIiwgam1lLmdldFN0YXR1cygpLmlzTXVsdGlTdGF0dXMoKSk7Ci0JCQlhc3NlcnRUcnVlKCJTaG91bGQgYmUgYW4gaW52YWxpZCBkZXN0aW5hdGlvbiIsICgoSUphdmFNb2RlbFN0YXR1cylqbWUuZ2V0U3RhdHVzKCkuZ2V0Q2hpbGRyZW4oKVswXSkuZ2V0Q29kZSgpPT0gSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0RFU1RJTkFUSU9OKTsKLQkJCWUgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIlNob3VsZCBoYXZlIGJlZW4gYW4gZXhjZXB0aW9uIiwgZSk7Ci0JCQotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSIsCi0JCQkiUDJbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJCSIJc3JjWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCQlbZGVmYXVsdF1bKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJCSIJCQlZLmphdmFbKl06IHtDSElMRFJFTiB8IEZJTkUgR1JBSU5FRH1cbiIgKyAKLQkJCSIJCQkJWVsqXToge0NISUxEUkVOIHwgRklORSBHUkFJTkVEfVxuIiArIAotCQkJIgkJCQkJZm9vWytdOiB7fSIKLQkJKTsKLQotCQlJSmF2YUVsZW1lbnQgY29weT0gZ2VuZXJhdGVIYW5kbGUoZmllbGRzU291cmNlWzBdLCBudWxsLCB0eXBlRGVzdCk7Ci0JCWFzc2VydFRydWUoIkNvcHkgc2hvdWxkIGV4aXN0IiwgY29weS5leGlzdHMoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAyIik7Ci0JfQotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBmaWVsZCBjYW5ub3QgYmUgY29waWVkIHRvIGEgZGlmZmVyZW50IHR5cGUgcmVwbGFjaW5nIGFuIGV4aXN0aW5nIGZpZWxkIGlmCi0gKiBubyBmb3JjZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlGaWVsZFdpdGhDb2xsaXNpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL1guamF2YSIsCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgaW50IGZvbztcbiIgKwotCQkifSIKLQkpOwotCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JSUZpZWxkIGZpZWxkU291cmNlPSB0eXBlU291cmNlLmdldEZpZWxkKCJmb28iKTsKLQotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9ZLmphdmEiLAotCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCSIgIGJvb2xlYW4gZm9vO1xuIiArCi0JCSJ9IgotCSk7Ci0JSVR5cGUgdHlwZURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9ZLmphdmEiKS5nZXRUeXBlKCJZIik7Ci0KLQljb3B5TmVnYXRpdmUoZmllbGRTb3VyY2UsIHR5cGVEZXN0LCBudWxsLCBudWxsLCBmYWxzZSwgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OQU1FX0NPTExJU0lPTik7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIGZpZWxkIGNhbm5vdCBiZSBjb3BpZWQgdG8gYSBkaWZmZXJlbnQgdHlwZSBhY3Jvc3MgZGlmZmVyZW50IHByb2plY3RzCi0gKiByZXBsYWNpbmcgYW4gZXhpc3RpbmcgZmllbGQgaWYgbm8gZm9yY2UuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb3B5RmllbGRXaXRoQ29sbGlzaW9uSW5EaWZmZXJlbnRQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvWC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSIgIGludCBiYXI7XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCQlJRmllbGQgZmllbGRTb3VyY2U9IHR5cGVTb3VyY2UuZ2V0RmllbGQoImJhciIpOwotCQotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMiIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUDIvc3JjL1kuamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCQkiICBib29sZWFuIGJhcjtcbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVEZXN0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUDIvc3JjL1kuamF2YSIpLmdldFR5cGUoIlkiKTsKLQkKLQkJY29weU5lZ2F0aXZlKGZpZWxkU291cmNlLCB0eXBlRGVzdCwgbnVsbCwgbnVsbCwgZmFsc2UsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTkFNRV9DT0xMSVNJT04pOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIGZpZWxkIGNhbm5vdCBiZSBjb3BpZWQgdG8gYW4gaW52YWxpZCBkZXN0aW5hdGlvbi4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlGaWVsZFdpdGhJbnZhbGlkRGVzdGluYXRpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL1guamF2YSIsCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgaW50IGZvbztcbiIgKwotCQkifSIKLQkpOwotCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JSUZpZWxkIGZpZWxkU291cmNlPSB0eXBlU291cmNlLmdldEZpZWxkKCJmb28iKTsKLQotCUlDbGFzc0ZpbGUgY2YgPSBnZXRDbGFzc0ZpbGUoIlAiLCAiL0JpbmFyeVByb2plY3QvYmluIiwgIiIsICJYLmNsYXNzIik7Ci0KLQljb3B5TmVnYXRpdmUoZmllbGRTb3VyY2UsIGNmLmdldFR5cGUoKSwgbnVsbCwgbnVsbCwgZmFsc2UsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9ERVNUSU5BVElPTik7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIGZpZWxkIGNhbm5vdCBiZSBjb3BpZWQgdG8gYW4gaW52YWxpZCBkZXN0aW5hdGlvbi4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlGaWVsZFdpdGhJbnZhbGlkRGVzdGluYXRpb25JbkRpZmZlcmVudFByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QL3NyYy9YLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIiAgaW50IGZvbztcbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JCUlGaWVsZCBmaWVsZFNvdXJjZT0gdHlwZVNvdXJjZS5nZXRGaWVsZCgiZm9vIik7Ci0JCi0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sIG5ldyBTdHJpbmdbXSB7Ii9CaW5hcnlQcm9qZWN0L2JpbiJ9LCAiYmluIik7Ci0JCUlDbGFzc0ZpbGUgY2YgPSBnZXRDbGFzc0ZpbGUoIlAyIiwgIi9CaW5hcnlQcm9qZWN0L2JpbiIsICIiLCAiWC5jbGFzcyIpOwotCQotCQljb3B5TmVnYXRpdmUoZmllbGRTb3VyY2UsIGNmLmdldFR5cGUoKSwgbnVsbCwgbnVsbCwgZmFsc2UsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9ERVNUSU5BVElPTik7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMiIpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgZmllbGQgY2Fubm90IGJlIGNvcGllZCB0byBhIGRpZmZlcmVudCB0eXBlIHdpdGggYW4gaW52YWxpZCBzaWJsaW5nCi0gKiB1c2VkIGZvciBwb3NpdGlvbmluZy4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlGaWVsZFdpdGhJbnZhbGlkUG9zaXRpb25pbmcoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL1guamF2YSIsCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgaW50IGZvbztcbiIgKwotCQkifSIKLQkpOwotCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JSUZpZWxkIGZpZWxkU291cmNlPSB0eXBlU291cmNlLmdldEZpZWxkKCJmb28iKTsKLQotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9ZLmphdmEiLAotCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCSJ9IgotCSk7Ci0JSVR5cGUgdHlwZURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9ZLmphdmEiKS5nZXRUeXBlKCJZIik7Ci0KLQljb3B5TmVnYXRpdmUoCi0JCWZpZWxkU291cmNlLCAKLQkJdHlwZURlc3QsIAotCQl0eXBlRGVzdC5nZXRGaWVsZCgiaW52YWxpZCIpLCAKLQkJbnVsbCwgCi0JCWZhbHNlLCAKLQkJSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX1NJQkxJTkcpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBmaWVsZCBjYW5ub3QgYmUgY29waWVkIHRvIGEgZGlmZmVyZW50IHR5cGUgd2l0aCBhbiBpbnZhbGlkIHNpYmxpbmcKLSAqIHVzZWQgZm9yIHBvc2l0aW9uaW5nLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29weUZpZWxkV2l0aEludmFsaWRQb3NpdGlvbmluZ0luRGlmZmVyZW50UHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1Avc3JjL1guamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkiICBpbnQgZm9vO1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpLmdldFR5cGUoIlgiKTsKLQkJSUZpZWxkIGZpZWxkU291cmNlPSB0eXBlU291cmNlLmdldEZpZWxkKCJmb28iKTsKLQkKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDIiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1AyL3NyYy9ZLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBZIHtcbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVEZXN0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUDIvc3JjL1kuamF2YSIpLmdldFR5cGUoIlkiKTsKLQkKLQkJY29weU5lZ2F0aXZlKAotCQkJZmllbGRTb3VyY2UsIAotCQkJdHlwZURlc3QsIAotCQkJdHlwZURlc3QuZ2V0RmllbGQoImludmFsaWQiKSwgCi0JCQludWxsLCAKLQkJCWZhbHNlLCAKLQkJCUlKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9TSUJMSU5HKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAyIik7Ci0JfQotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBmaWVsZCBjYW4gYmUgY29waWVkIHRvIGEgZGlmZmVyZW50IHR5cGUgd2l0aCBwb3NpdGlvbmluZy4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlGaWVsZFdpdGhQb3NpdGlvbmluZygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvWC5qYXZhIiwKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBpbnQgZm9vO1xuIiArCi0JCSJ9IgotCSk7Ci0JSVR5cGUgdHlwZVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpLmdldFR5cGUoIlgiKTsKLQlJRmllbGQgZmllbGRTb3VyY2U9IHR5cGVTb3VyY2UuZ2V0RmllbGQoImZvbyIpOwotCi0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL1kuamF2YSIsCi0JCSJwdWJsaWMgY2xhc3MgWSB7XG4iICsKLQkJIiAgYm9vbGVhbiBiYXI7XG4iICsKLQkJIn0iCi0JKTsKLQlJVHlwZSB0eXBlRGVzdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1kuamF2YSIpLmdldFR5cGUoIlkiKTsKLQotCWNvcHlQb3NpdGl2ZShmaWVsZFNvdXJjZSwgdHlwZURlc3QsIHR5cGVEZXN0LmdldEZpZWxkKCJiYXIiKSwgbnVsbCwgZmFsc2UpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBmaWVsZCBjYW4gYmUgY29waWVkIHRvIGEgZGlmZmVyZW50IHR5cGUgYWNyb3NzIGRpZmZlcmVudCBwcm9qZWN0cyAKLSAqIHdpdGggcG9zaXRpb25pbmcuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb3B5RmllbGRXaXRoUG9zaXRpb25pbmdJbkRpZmZlcmVudFByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QL3NyYy9YLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIiAgaW50IGZvbztcbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JCUlGaWVsZCBmaWVsZFNvdXJjZT0gdHlwZVNvdXJjZS5nZXRGaWVsZCgiZm9vIik7Ci0JCi0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QMi9zcmMvWS5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWSB7XG4iICsKLQkJCSIgIGJvb2xlYW4gYmFyO1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QMi9zcmMvWS5qYXZhIikuZ2V0VHlwZSgiWSIpOwotCQotCQljb3B5UG9zaXRpdmUoZmllbGRTb3VyY2UsIHR5cGVEZXN0LCB0eXBlRGVzdC5nZXRGaWVsZCgiYmFyIiksIG51bGwsIGZhbHNlKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAyIik7Ci0JfQotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBpbml0aWFsaXplciBjYW4gYmUgY29waWVkIHRvIGEgZGlmZmVyZW50IHR5cGUuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb3B5SW5pdGlhbGl6ZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL1guamF2YSIsCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgaW50IGZvbztcbiIgKwotCQkiICB7XG4iICsKLQkJIiAgICBmb28gPSAxMDtcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iCi0JKTsKLQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCUlJbml0aWFsaXplciBpbml0aWFsaXplclNvdXJjZT0gdHlwZVNvdXJjZS5nZXRJbml0aWFsaXplcigxKTsKLQotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9ZLmphdmEiLAotCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCSJ9IgotCSk7Ci0JSVR5cGUgdHlwZURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9ZLmphdmEiKS5nZXRUeXBlKCJZIik7Ci0KLQljb3B5UG9zaXRpdmUoaW5pdGlhbGl6ZXJTb3VyY2UsIHR5cGVEZXN0LCBudWxsLCBudWxsLCBmYWxzZSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIGluaXRpYWxpemVyIGNhbiBiZSBjb3BpZWQgdG8gYSBkaWZmZXJlbnQgdHlwZSBhY3Jvc3MgdHdvIGRpZmZlcmVudAotICogcHJvamVjdHMuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb3B5SW5pdGlhbGl6ZXJJbkRpZmZlcmVudFByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QL3NyYy9YLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIiAgaW50IGZvbztcbiIgKwotCQkJIiAge1xuIiArCi0JCQkiICAgIGZvbyA9IDEwO1xuIiArCi0JCQkiICB9XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCQlJSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXJTb3VyY2U9IHR5cGVTb3VyY2UuZ2V0SW5pdGlhbGl6ZXIoMSk7Ci0JCi0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QMi9zcmMvWS5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWSB7XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJVHlwZSB0eXBlRGVzdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1AyL3NyYy9ZLmphdmEiKS5nZXRUeXBlKCJZIik7Ci0JCi0JCWNvcHlQb3NpdGl2ZShpbml0aWFsaXplclNvdXJjZSwgdHlwZURlc3QsIG51bGwsIG51bGwsIGZhbHNlKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAyIik7Ci0JfQotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBpbml0aWFsaXplciBjYW5ub3QgYmUgY29waWVkIGFuZCByZW5hbWVkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29weUluaXRpYWxpemVyUmVuYW1lKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9YLmphdmEiLAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIGludCBmb287XG4iICsKLQkJIiAge1xuIiArCi0JCSIgICAgZm9vID0gMTA7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IgotCSk7Ci0JSVR5cGUgdHlwZVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpLmdldFR5cGUoIlgiKTsKLQlJSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXJTb3VyY2U9IHR5cGVTb3VyY2UuZ2V0SW5pdGlhbGl6ZXIoMSk7Ci0KLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvWS5qYXZhIiwKLQkJInB1YmxpYyBjbGFzcyBZIHtcbiIgKwotCQkifSIKLQkpOwotCUlUeXBlIHR5cGVEZXN0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWS5qYXZhIikuZ2V0VHlwZSgiWSIpOwotCi0JY29weU5lZ2F0aXZlKGluaXRpYWxpemVyU291cmNlLCB0eXBlRGVzdCwgbnVsbCwgIm5ld05hbWUiLCBmYWxzZSwgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX05BTUUpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBpbml0aWFsaXplciBjYW5ub3QgYmUgY29waWVkIGFuZCByZW5hbWVkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29weUluaXRpYWxpemVyUmVuYW1lSW5EaWZmZXJlbnRQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvWC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSIgIGludCBmb287XG4iICsKLQkJCSIgIHtcbiIgKwotCQkJIiAgICBmb28gPSAxMDtcbiIgKwotCQkJIiAgfVxuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpLmdldFR5cGUoIlgiKTsKLQkJSUluaXRpYWxpemVyIGluaXRpYWxpemVyU291cmNlPSB0eXBlU291cmNlLmdldEluaXRpYWxpemVyKDEpOwotCQotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMiIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUDIvc3JjL1kuamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QMi9zcmMvWS5qYXZhIikuZ2V0VHlwZSgiWSIpOwotCQotCQljb3B5TmVnYXRpdmUoaW5pdGlhbGl6ZXJTb3VyY2UsIHR5cGVEZXN0LCBudWxsLCAibmV3TmFtZSIsIGZhbHNlLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfTkFNRSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMiIpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgaW5pdGlhbGl6ZXIgY2FuIGJlIGNvcGllZCB0byBhIGRpZmZlcmVudCB0eXBlIGFjcm9zcyB0d28gZGlmZmVyZW50Ci0gKiBwcm9qZWN0cyB3aXRoIHBvc2l0aW9uaW5nLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29weUluaXRpYWxpemVyV2l0aFBvc2l0aW9uaW5nSW5EaWZmZXJlbnRQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvWC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSIgIGludCBmb287XG4iICsKLQkJCSIgIHtcbiIgKwotCQkJIiAgICBmb28gPSAxMDtcbiIgKwotCQkJIiAgfVxuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpLmdldFR5cGUoIlgiKTsKLQkJSUluaXRpYWxpemVyIGluaXRpYWxpemVyU291cmNlPSB0eXBlU291cmNlLmdldEluaXRpYWxpemVyKDEpOwotCQotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMiIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUDIvc3JjL1kuamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCQkiICBpbnQgYmFyO1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QMi9zcmMvWS5qYXZhIikuZ2V0VHlwZSgiWSIpOwotCQotCQljb3B5UG9zaXRpdmUoaW5pdGlhbGl6ZXJTb3VyY2UsIHR5cGVEZXN0LCB0eXBlRGVzdC5nZXRGaWVsZCgiYmFyIiksIG51bGwsIGZhbHNlKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAyIik7Ci0JfQotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYW4gaW5uZXIgdHlwZSBjYW4gYmUgY29waWVkIHdpdGggcG9zaXRpb25pbmcuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb3B5SW5uZXJUeXBlV2l0aFBvc2l0aW9uaW5nSW5EaWZmZXJlbnRQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvWC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSIgIGNsYXNzIElubmVyIHtcbiIgKwotCQkJIiAgfSIgKwkJCQotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJYIikuZ2V0VHlwZSgiSW5uZXIiKTsKLQkKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDIiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1AyL3NyYy9ZLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBZIHtcbiIgKwotCQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJCSIgIH1cbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3VEZXN0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUDIvc3JjL1kuamF2YSIpOwotCQlJVHlwZSB0eXBlRGVzdCA9IGN1RGVzdC5nZXRUeXBlKCJZIik7Ci0JCi0JCWNvcHlQb3NpdGl2ZSh0eXBlU291cmNlLCAgdHlwZURlc3QsIHR5cGVEZXN0LmdldE1ldGhvZCgiZm9vIiwgbmV3IFN0cmluZ1tdIHt9KSwgbnVsbCwgZmFsc2UpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIG1haW4gdHlwZSBjYW4gYmUgY29waWVkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29weU1haW5UeXBlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9YLmphdmEiLAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSJ9IgotCSk7Ci0JSVR5cGUgdHlwZVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpLmdldFR5cGUoIlgiKTsKLQotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9ZLmphdmEiLAotCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCSJ9IgotCSk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9ZLmphdmEiKTsKLQotCWNvcHlQb3NpdGl2ZSh0eXBlU291cmNlLCAgY3VEZXN0LCBudWxsLCBudWxsLCBmYWxzZSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIG1haW4gdHlwZSBjYW4gYmUgY29waWVkIGFjcm9zcyB0d28gZGlmZmVyZW50IHByb2plY3RzLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29weU1haW5UeXBlSW5EaWZmZXJlbnRQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvWC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCQotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMiIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUDIvc3JjL1kuamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QMi9zcmMvWS5qYXZhIik7Ci0JCi0JCWNvcHlQb3NpdGl2ZSh0eXBlU291cmNlLCAgY3VEZXN0LCBudWxsLCBudWxsLCBmYWxzZSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMiIpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgbWV0aG9kIGNhbiBiZSBjb3BpZWQgdG8gYSBkaWZmZXJlbnQgdHlwZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlNZXRob2QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbnsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvWC5qYXZhIiwKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbyhTdHJpbmcgcykge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifSIKLQkpOwotCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JSU1ldGhvZCBtZXRob2RTb3VyY2U9IHR5cGVTb3VyY2UuZ2V0TWV0aG9kKCJmb28iLCBuZXcgU3RyaW5nW10geyJRU3RyaW5nOyJ9KTsKLQotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9ZLmphdmEiLAotCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCSJ9IgotCSk7Ci0JSVR5cGUgdHlwZURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9ZLmphdmEiKS5nZXRUeXBlKCJZIik7Ci0KLQljb3B5UG9zaXRpdmUobWV0aG9kU291cmNlLCB0eXBlRGVzdCwgbnVsbCwgbnVsbCwgZmFsc2UpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBtZXRob2QgY2FuIGJlIGNvcGllZCB0byBhIGRpZmZlcmVudCB0eXBlLCBmb3JjaW5nCi0gKiBhbiBvdmVyd3JpdGUgd2hlbiB0aGVyZSBpcyBhIG5hbWUgY29sbGlzaW9uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb3B5TWV0aG9kRm9yY2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL1guamF2YSIsCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oU3RyaW5nIHMpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iCi0JKTsKLQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCUlNZXRob2QgbWV0aG9kU291cmNlPSB0eXBlU291cmNlLmdldE1ldGhvZCgiZm9vIiwgbmV3IFN0cmluZ1tdIHsiUVN0cmluZzsifSk7Ci0KLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvWS5qYXZhIiwKLQkJInB1YmxpYyBjbGFzcyBZIHtcbiIgKwotCQkiICBpbnQgZm9vKFN0cmluZyBzKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IgotCSk7Ci0JSVR5cGUgdHlwZURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9ZLmphdmEiKS5nZXRUeXBlKCJZIik7Ci0KLQljb3B5UG9zaXRpdmUobWV0aG9kU291cmNlLCB0eXBlRGVzdCwgbnVsbCwgbnVsbCwgdHJ1ZSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIG1ldGhvZCBjYW4gYmUgY29waWVkIHRvIGEgZGlmZmVyZW50IHR5cGUgYWNyb3NzIGRpZmZlcmVudCBwcm9qZWN0cywgCi0gKiBmb3JjaW5nIGFuIG92ZXJ3cml0ZSB3aGVuIHRoZXJlIGlzIGEgbmFtZSBjb2xsaXNpb24KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlNZXRob2RGb3JjZUluRGlmZmVyZW50UHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1Avc3JjL1guamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkiICB2b2lkIGZvbyhTdHJpbmcgcykge1xuIiArCi0JCQkiICB9XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCQlJTWV0aG9kIG1ldGhvZFNvdXJjZT0gdHlwZVNvdXJjZS5nZXRNZXRob2QoImZvbyIsIG5ldyBTdHJpbmdbXSB7IlFTdHJpbmc7In0pOwotCQotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMiIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUDIvc3JjL1kuamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCQkiICBpbnQgZm9vKFN0cmluZyBzKSB7XG4iICsKLQkJCSIgIH1cbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVEZXN0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUDIvc3JjL1kuamF2YSIpLmdldFR5cGUoIlkiKTsKLQkKLQkJY29weVBvc2l0aXZlKG1ldGhvZFNvdXJjZSwgdHlwZURlc3QsIG51bGwsIG51bGwsIHRydWUpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIG1ldGhvZCBjYW4gYmUgY29waWVkIHRvIGEgZGlmZmVyZW50IHR5cGUgYWNyb3NzIGRpZmZlcmVudCBwcm9qZWN0cy4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlNZXRob2RJbkRpZmZlcmVudFByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QL3NyYy9YLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIiAgdm9pZCBmb28oU3RyaW5nIHMpIHtcbiIgKwotCQkJIiAgfVxuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpLmdldFR5cGUoIlgiKTsKLQkJSU1ldGhvZCBtZXRob2RTb3VyY2U9IHR5cGVTb3VyY2UuZ2V0TWV0aG9kKCJmb28iLCBuZXcgU3RyaW5nW10geyJRU3RyaW5nOyJ9KTsKLQkKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDIiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1AyL3NyYy9ZLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBZIHtcbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVEZXN0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUDIvc3JjL1kuamF2YSIpLmdldFR5cGUoIlkiKTsKLQotCQljb3B5UG9zaXRpdmUobWV0aG9kU291cmNlLCB0eXBlRGVzdCwgbnVsbCwgbnVsbCwgZmFsc2UpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIG1ldGhvZCBjYW4gYmUgY29waWVkIHRvIGEgZGlmZmVyZW50IHR5cGUsIHJlbmFtZWQKLSAqIHNpbWFsdGFuZW91c2x5LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29weU1ldGhvZFJlbmFtZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvWC5qYXZhIiwKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbyhTdHJpbmcgcykge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifSIKLQkpOwotCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JSU1ldGhvZCBtZXRob2RTb3VyY2U9IHR5cGVTb3VyY2UuZ2V0TWV0aG9kKCJmb28iLCBuZXcgU3RyaW5nW10geyJRU3RyaW5nOyJ9KTsKLQotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9ZLmphdmEiLAotCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCSJ9IgotCSk7Ci0JSVR5cGUgdHlwZURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9ZLmphdmEiKS5nZXRUeXBlKCJZIik7Ci0KLQljb3B5UG9zaXRpdmUobWV0aG9kU291cmNlLCB0eXBlRGVzdCwgbnVsbCwgImJhciIsIGZhbHNlKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgbWV0aG9kIGNhbiBiZSBjb3BpZWQgdG8gYSBkaWZmZXJlbnQgdHlwZSwgcmVuYW1lZAotICogc2ltYWx0YW5lb3VzbHksIG92ZXJ3cml0aW5nIGFuIGV4aXN0aW5nIG1ldGhvZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlNZXRob2RSZW5hbWVGb3JjZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvWC5qYXZhIiwKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbyhTdHJpbmcgcykge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifSIKLQkpOwotCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JSU1ldGhvZCBtZXRob2RTb3VyY2U9IHR5cGVTb3VyY2UuZ2V0TWV0aG9kKCJmb28iLCBuZXcgU3RyaW5nW10geyJRU3RyaW5nOyJ9KTsKLQotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9ZLmphdmEiLAotCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCSIgIHZvaWQgYmFyKFN0cmluZyBzKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IgotCSk7Ci0JSVR5cGUgdHlwZURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9ZLmphdmEiKS5nZXRUeXBlKCJZIik7Ci0KLQljb3B5UG9zaXRpdmUobWV0aG9kU291cmNlLCB0eXBlRGVzdCwgbnVsbCwgImJhciIsIHRydWUpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBtZXRob2QgY2FuIGJlIGNvcGllZCB0byBhIGRpZmZlcmVudCB0eXBlIGFjcm9zcyBkaWZmZXJlbnQgcHJvamVjdHMsIAotICogcmVuYW1lZCBzaW1hbHRhbmVvdXNseSwgb3ZlcndyaXRpbmcgYW4gZXhpc3RpbmcgbWV0aG9kLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29weU1ldGhvZFJlbmFtZUZvcmNlSW5EaWZmZXJlbnRQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvWC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSIgIHZvaWQgZm9vKFN0cmluZyBzKSB7XG4iICsKLQkJCSIgIH1cbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JCUlNZXRob2QgbWV0aG9kU291cmNlPSB0eXBlU291cmNlLmdldE1ldGhvZCgiZm9vIiwgbmV3IFN0cmluZ1tdIHsiUVN0cmluZzsifSk7Ci0JCi0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QMi9zcmMvWS5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWSB7XG4iICsKLQkJCSIgIHZvaWQgYmFyKFN0cmluZyBzKSB7XG4iICsKLQkJCSIgIH1cbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVEZXN0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUDIvc3JjL1kuamF2YSIpLmdldFR5cGUoIlkiKTsKLQotCQljb3B5UG9zaXRpdmUobWV0aG9kU291cmNlLCB0eXBlRGVzdCwgbnVsbCwgImJhciIsIHRydWUpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIG1ldGhvZCBjYW4gYmUgY29waWVkIHRvIGEgZGlmZmVyZW50IHR5cGUgYWNyb3NzIGRpZmZlcmVudCBwcm9qZWN0cywgCi0gKiByZW5hbWVkIHNpbWFsdGFuZW91c2x5LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29weU1ldGhvZFJlbmFtZUluRGlmZmVyZW50UHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1Avc3JjL1guamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkiICB2b2lkIGZvbyhTdHJpbmcgcykge1xuIiArCi0JCQkiICB9XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCQlJTWV0aG9kIG1ldGhvZFNvdXJjZT0gdHlwZVNvdXJjZS5nZXRNZXRob2QoImZvbyIsIG5ldyBTdHJpbmdbXSB7IlFTdHJpbmc7In0pOwotCQotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMiIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUDIvc3JjL1kuamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QMi9zcmMvWS5qYXZhIikuZ2V0VHlwZSgiWSIpOwotCQotCQljb3B5UG9zaXRpdmUobWV0aG9kU291cmNlLCB0eXBlRGVzdCwgbnVsbCwgImJhciIsIGZhbHNlKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAyIik7Ci0JfQotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBtZXRob2QgY2FuIGJlIGNvcGllZCB0byB0aGUgc2FtZSB0eXBlLCByZW5hbWVkCi0gKiBzaW1hbHRhbmVvdXNseS4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlNZXRob2RTYW1lUGFyZW50KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9YLmphdmEiLAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKFN0cmluZyBzKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IgotCSk7Ci0JSVR5cGUgdHlwZVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpLmdldFR5cGUoIlgiKTsKLQlJTWV0aG9kIG1ldGhvZFNvdXJjZT0gdHlwZVNvdXJjZS5nZXRNZXRob2QoImZvbyIsIG5ldyBTdHJpbmdbXSB7IlFTdHJpbmc7In0pOwotCi0JY29weVBvc2l0aXZlKG1ldGhvZFNvdXJjZSwgdHlwZVNvdXJjZSwgbnVsbCwgImJhciIsIGZhbHNlKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgbWV0aG9kIGNhbm5vdCBiZSBjb3BpZWQgdG8gYSBkaWZmZXJlbnQgdHlwZSwgd2hlbiBub3QgZm9yY2luZwotICogYW4gb3ZlcndyaXRlIHdoZW4gdGhlcmUgaXMgYSBuYW1lIGNvbGxpc2lvbgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29weU1ldGhvZFdpdGhDb2xsaXNpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL1guamF2YSIsCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oU3RyaW5nIHMpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iCi0JKTsKLQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCUlNZXRob2QgbWV0aG9kU291cmNlPSB0eXBlU291cmNlLmdldE1ldGhvZCgiZm9vIiwgbmV3IFN0cmluZ1tdIHsiUVN0cmluZzsifSk7Ci0KLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvWS5qYXZhIiwKLQkJInB1YmxpYyBjbGFzcyBZIHtcbiIgKwotCQkiICB2b2lkIGZvbyhTdHJpbmcgcykge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifSIKLQkpOwotCUlUeXBlIHR5cGVEZXN0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWS5qYXZhIikuZ2V0VHlwZSgiWSIpOwotCi0JY29weU5lZ2F0aXZlKG1ldGhvZFNvdXJjZSwgdHlwZURlc3QsIG51bGwsIG51bGwsIGZhbHNlLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5BTUVfQ09MTElTSU9OKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgbWV0aG9kIGNhbm5vdCBiZSBjb3BpZWQgdG8gYSBkaWZmZXJlbnQgdHlwZSBhY3Jvc3MgZGlmZmVyZW50IHByb2plY3RzLCAKLSAqIHdoZW4gbm90IGZvcmNpbmcgYW4gb3ZlcndyaXRlIHdoZW4gdGhlcmUgaXMgYSBuYW1lIGNvbGxpc2lvbgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29weU1ldGhvZFdpdGhDb2xsaXNpb25JbkRpZmZlcmVudFByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QL3NyYy9YLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIiAgdm9pZCBmb28oU3RyaW5nIHMpIHtcbiIgKwotCQkJIiAgfVxuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpLmdldFR5cGUoIlgiKTsKLQkJSU1ldGhvZCBtZXRob2RTb3VyY2U9IHR5cGVTb3VyY2UuZ2V0TWV0aG9kKCJmb28iLCBuZXcgU3RyaW5nW10geyJRU3RyaW5nOyJ9KTsKLQkKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDIiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1AyL3NyYy9ZLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBZIHtcbiIgKwotCQkJIiAgdm9pZCBmb28oU3RyaW5nIHMpIHtcbiIgKwotCQkJIiAgfVxuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QMi9zcmMvWS5qYXZhIikuZ2V0VHlwZSgiWSIpOwotCQotCQljb3B5TmVnYXRpdmUobWV0aG9kU291cmNlLCB0eXBlRGVzdCwgbnVsbCwgbnVsbCwgZmFsc2UsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTkFNRV9DT0xMSVNJT04pOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIG1ldGhvZCBjYW5ub3QgYmUgY29waWVkIHRvIGFuIGludmFsaWQgZGVzdGluYXRpb24uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb3B5TWV0aG9kV2l0aEludmFsaWREZXN0aW5hdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvWC5qYXZhIiwKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbyhTdHJpbmcgcykge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifSIKLQkpOwotCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JSU1ldGhvZCBtZXRob2RTb3VyY2U9IHR5cGVTb3VyY2UuZ2V0TWV0aG9kKCJmb28iLCBuZXcgU3RyaW5nW10geyJRU3RyaW5nOyJ9KTsKLQotCWNvcHlOZWdhdGl2ZShtZXRob2RTb3VyY2UsIG1ldGhvZFNvdXJjZSwgbnVsbCwgbnVsbCwgZmFsc2UsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9ERVNUSU5BVElPTik7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIG1ldGhvZCBjYW5ub3QgYmUgY29waWVkIHRvIGFuIGludmFsaWQgZGVzdGluYXRpb24uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb3B5TWV0aG9kV2l0aEludmFsaWREZXN0aW5hdGlvbkluRGlmZmVyZW50UHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1Avc3JjL1guamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkiICB2b2lkIGZvbyhTdHJpbmcgcykge1xuIiArCi0JCQkiICB9XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCQlJTWV0aG9kIG1ldGhvZFNvdXJjZSA9IHR5cGVTb3VyY2UuZ2V0TWV0aG9kKCJmb28iLCBuZXcgU3RyaW5nW10geyJRU3RyaW5nOyJ9KTsKLQkKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDIiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1AyL3NyYy9ZLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBZIHtcbiIgKwotCQkJIiAgdm9pZCBiYXIoKSB7XG4iICsKLQkJCSIgIH1cbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVEZXN0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUDIvc3JjL1kuamF2YSIpLmdldFR5cGUoIlkiKTsKLQkJSU1ldGhvZCBtZXRob2REZXN0ID0gdHlwZURlc3QuZ2V0TWV0aG9kKCJiYXIiLCBuZXcgU3RyaW5nW10ge30pOwotCQkKLQkJY29weU5lZ2F0aXZlKG1ldGhvZFNvdXJjZSwgbWV0aG9kRGVzdCwgbnVsbCwgbnVsbCwgZmFsc2UsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9ERVNUSU5BVElPTik7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMiIpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgbWV0aG9kIGNhbiBiZSBjb3BpZWQgdG8gYSBkaWZmZXJlbnQgdHlwZSAgd2l0aCBwb3NpdGlvbmluZy4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlNZXRob2RXaXRoUG9zaXRpb25pbmdJbkRpZmZlcmVudFByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QL3NyYy9YLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIiAgaW50IGZvbyhTdHJpbmcgcykge1xuIiArCi0JCQkiICB9XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCQlJTWV0aG9kIG1ldGhvZFNvdXJjZSA9IHR5cGVTb3VyY2UuZ2V0TWV0aG9kKCJmb28iLCBuZXcgU3RyaW5nW10geyJRU3RyaW5nOyJ9KTsKLQkKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDIiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1AyL3NyYy9ZLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBZIHtcbiIgKwotCQkJIiAgYm9vbGVhbiBiYXIoKSB7XG4iICsKLQkJCSIgIH1cbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVEZXN0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUDIvc3JjL1kuamF2YSIpLmdldFR5cGUoIlkiKTsKLQkKLQkJY29weVBvc2l0aXZlKG1ldGhvZFNvdXJjZSwgdHlwZURlc3QsIHR5cGVEZXN0LmdldE1ldGhvZCgiYmFyIiwgbmV3IFN0cmluZ1tdIHt9KSwgbnVsbCwgZmFsc2UpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhdHRlbXB0aW5nIHRvIHJlbmFtZSB3aXRoIGFuIGluY29ycmVjdCBudW1iZXIgb2YgcmVuYW1pbmdzIGZhaWxzCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb3B5TW92ZVdpdGhJbnZhbGlkUmVuYW1pbmdzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9YLmphdmEiLAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iCi0JKTsKLQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCUlNZXRob2QgbWV0aG9kU291cmNlID0gdHlwZVNvdXJjZS5nZXRNZXRob2QoImZvbyIsIG5ldyBTdHJpbmdbXXt9KTsKLQljb3B5TmVnYXRpdmUoCi0JCW5ldyBJSmF2YUVsZW1lbnRbXSB7bWV0aG9kU291cmNlfSwgCi0JCW5ldyBJSmF2YUVsZW1lbnRbXSB7dHlwZVNvdXJjZX0sIAotCQludWxsLCAKLQkJbmV3IFN0cmluZ1tdIHsiYmFyIiwgImZyZWQifSwgCi0JCWZhbHNlLCAKLQkJSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTkRFWF9PVVRfT0ZfQk9VTkRTKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgbWV0aG9kIHdpdGggc3ludGF4IGVycm9ycyBjYW4gYmUgY29waWVkIHRvIGEgZGlmZmVyZW50IHR5cGUuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb3B5U3ludGF4RXJyb3JNZXRob2QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL1guamF2YSIsCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oU3RyaW5nIHNcbiIgKyAvLyBzeW50YXggZXJyb3IKLQkJIiAgfVxuIiArCi0JCSJ9IgotCSk7Ci0JSVR5cGUgdHlwZVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpLmdldFR5cGUoIlgiKTsKLQlJTWV0aG9kIG1ldGhvZFNvdXJjZT0gdHlwZVNvdXJjZS5nZXRNZXRob2QoImZvbyIsIG5ldyBTdHJpbmdbXSB7IlFTdHJpbmc7In0pOwotCi0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL1kuamF2YSIsCi0JCSJwdWJsaWMgY2xhc3MgWSB7XG4iICsKLQkJIn0iCi0JKTsKLQlJVHlwZSB0eXBlRGVzdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1kuamF2YSIpLmdldFR5cGUoIlkiKTsKLQotCWNvcHlQb3NpdGl2ZShtZXRob2RTb3VyY2UsIHR5cGVEZXN0LCBudWxsLCBudWxsLCBmYWxzZSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIG1ldGhvZCB3aXRoIHN5bnRheCBlcnJvcnMgY2FuIGJlIGNvcGllZCB0byBhIGRpZmZlcmVudCB0eXBlIGFjcm9zcyBkaWZmZXJlbnQKLSAqIHByb2plY3RzLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29weVN5bnRheEVycm9yTWV0aG9kSW5EaWZmZXJlbnRQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvWC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSIgIHZvaWQgZm9vKFN0cmluZyBzXG4iICsgLy8gc3ludGF4IGVycm9yCi0JCQkiICB9XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCQlJTWV0aG9kIG1ldGhvZFNvdXJjZT0gdHlwZVNvdXJjZS5nZXRNZXRob2QoImZvbyIsIG5ldyBTdHJpbmdbXSB7IlFTdHJpbmc7In0pOwotCQotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMiIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUDIvc3JjL1kuamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QMi9zcmMvWS5qYXZhIikuZ2V0VHlwZSgiWSIpOwotCQotCQljb3B5UG9zaXRpdmUobWV0aG9kU291cmNlLCB0eXBlRGVzdCwgbnVsbCwgbnVsbCwgZmFsc2UpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIHR5cGUgY2FuIGJlIGNvcGllZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlUeXBlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9YLmphdmEiLAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSJ9XG4iICsKLQkJImNsYXNzIFoge1xuIiArCi0JCSJ9IgotCSk7Ci0JSVR5cGUgdHlwZVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpLmdldFR5cGUoIloiKTsKLQotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9ZLmphdmEiLAotCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCSJ9IgotCSk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9ZLmphdmEiKTsKLQotCWNvcHlQb3NpdGl2ZSh0eXBlU291cmNlLCAgY3VEZXN0LCBudWxsLCBudWxsLCBmYWxzZSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIHR5cGUgY2FuIGJlIGNvcGllZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlUeXBlSW5EaWZmZXJlbnRQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvWC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSJ9XG4iICsKLQkJCSJjbGFzcyBaIHtcbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJaIik7Ci0JCi0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QMi9zcmMvWS5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWSB7XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1RGVzdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1AyL3NyYy9ZLmphdmEiKTsKLQkKLQkJY29weVBvc2l0aXZlKHR5cGVTb3VyY2UsICBjdURlc3QsIG51bGwsIG51bGwsIGZhbHNlKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAyIik7Ci0JfQotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSB0eXBlIGNhbiBiZSBjb3BpZWQgd2l0aCBwb3NpdGlvbmluZy4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlUeXBlV2l0aFBvc2l0aW9uaW5nSW5EaWZmZXJlbnRQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvWC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSJ9XG4iICsKLQkJCSJjbGFzcyBaIHtcbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJaIik7Ci0JCi0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QMi9zcmMvWS5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWSB7XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1RGVzdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1AyL3NyYy9ZLmphdmEiKTsKLQkKLQkJY29weVBvc2l0aXZlKHR5cGVTb3VyY2UsICBjdURlc3QsIGN1RGVzdC5nZXRUeXBlKCJZIiksIG51bGwsIGZhbHNlKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAyIik7Ci0JfQotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBjb25zdHJ1Y3RvciBjYW4gYmUgbW92ZWQgdG8gYSBkaWZmZXJlbnQgdHlwZS4gIFRoZSBjb25zdHJ1Y3RvcgotICogc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgcmVuYW1lZCB0byB0aGF0IG9mIHRoZSBkZXN0aW5hdGlvbiB0eXBlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TW92ZUNvbnN0cnVjdG9yKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9YLmphdmEiLAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIFgoU3RyaW5nIHMpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iCi0JKTsKLQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCUlNZXRob2QgbWV0aG9kU291cmNlPSB0eXBlU291cmNlLmdldE1ldGhvZCgiWCIsIG5ldyBTdHJpbmdbXSB7IlFTdHJpbmc7In0pOwotCi0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL1kuamF2YSIsCi0JCSJwdWJsaWMgY2xhc3MgWSB7XG4iICsKLQkJIn0iCi0JKTsKLQlJVHlwZSB0eXBlRGVzdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1kuamF2YSIpLmdldFR5cGUoIlkiKTsKLQotCW1vdmVQb3NpdGl2ZShtZXRob2RTb3VyY2UsIHR5cGVEZXN0LCBudWxsLCBudWxsLCBmYWxzZSk7Ci0JCi0JLy8gdGVzdCB0aGF0IHRoZSBjb25zdHJ1Y3RvciBoYXMgYmVlbiByZW5hbWVkCi0JYXNzZXJ0VHJ1ZSgKLQkJIkNvbnN0cnVjdG9yIHdhcyBub3QgcmVuYW1lZCIsIAotCQl0eXBlRGVzdC5nZXRNZXRob2QoIlkiLCBuZXcgU3RyaW5nW10geyJRU3RyaW5nOyJ9KS5leGlzdHMoKSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIGNvbnN0cnVjdG9yIGNhbiBiZSBtb3ZlZCB0byBhIGRpZmZlcmVudCB0eXBlIGFjcm9zcyBkaWZmZXJlbnQgcHJvamVjdHMuIAotICogVGhlIGNvbnN0cnVjdG9yIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IHJlbmFtZWQgdG8gdGhhdCBvZiB0aGUgZGVzdGluYXRpb24gdHlwZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdE1vdmVDb25zdHJ1Y3RvckluRGlmZmVyZW50UHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1Avc3JjL1guamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkiICBYKFN0cmluZyBzKSB7XG4iICsKLQkJCSIgIH1cbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JCUlNZXRob2QgbWV0aG9kU291cmNlPSB0eXBlU291cmNlLmdldE1ldGhvZCgiWCIsIG5ldyBTdHJpbmdbXSB7IlFTdHJpbmc7In0pOwotCQotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMiIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUDIvc3JjL1kuamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QMi9zcmMvWS5qYXZhIikuZ2V0VHlwZSgiWSIpOwotCQotCQltb3ZlUG9zaXRpdmUobWV0aG9kU291cmNlLCB0eXBlRGVzdCwgbnVsbCwgbnVsbCwgZmFsc2UpOwotCi0JCS8vIHRlc3QgdGhhdCB0aGUgY29uc3RydWN0b3IgaGFzIGJlZW4gcmVuYW1lZAotCQlhc3NlcnRUcnVlKAotCQkJIkNvbnN0cnVjdG9yIHdhcyBub3QgcmVuYW1lZCIsIAotCQkJdHlwZURlc3QuZ2V0TWV0aG9kKCJZIiwgbmV3IFN0cmluZ1tdIHsiUVN0cmluZzsifSkuZXhpc3RzKCkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIGZpZWxkIGNhbiBiZSBtb3ZlZCB0byBhIGRpZmZlcmVudCB0eXBlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TW92ZUZpZWxkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9YLmphdmEiLAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIGludCBmb287XG4iICsKLQkJIn0iCi0JKTsKLQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCUlGaWVsZCBmaWVsZFNvdXJjZT0gdHlwZVNvdXJjZS5nZXRGaWVsZCgiZm9vIik7Ci0KLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvWS5qYXZhIiwKLQkJInB1YmxpYyBjbGFzcyBZIHtcbiIgKwotCQkifSIKLQkpOwotCUlUeXBlIHR5cGVEZXN0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWS5qYXZhIikuZ2V0VHlwZSgiWSIpOwotCi0JbW92ZVBvc2l0aXZlKGZpZWxkU291cmNlLCB0eXBlRGVzdCwgbnVsbCwgbnVsbCwgZmFsc2UpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBmaWVsZCBjYW4gYmUgbW92ZWQgdG8gYSBkaWZmZXJlbnQgdHlwZSByZXBsYWNpbmcgYW4gZXhpc3RpbmcgZmllbGQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNb3ZlRmllbGRGb3JjZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvWC5qYXZhIiwKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBpbnQgZm9vO1xuIiArCi0JCSJ9IgotCSk7Ci0JSVR5cGUgdHlwZVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpLmdldFR5cGUoIlgiKTsKLQlJRmllbGQgZmllbGRTb3VyY2U9IHR5cGVTb3VyY2UuZ2V0RmllbGQoImZvbyIpOwotCi0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL1kuamF2YSIsCi0JCSJwdWJsaWMgY2xhc3MgWSB7XG4iICsKLQkJIiAgYm9vbGVhbiBmb287XG4iICsKLQkJIn0iCi0JKTsKLQlJVHlwZSB0eXBlRGVzdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1kuamF2YSIpLmdldFR5cGUoIlkiKTsKLQotCW1vdmVQb3NpdGl2ZShmaWVsZFNvdXJjZSwgdHlwZURlc3QsIG51bGwsIG51bGwsIHRydWUpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBmaWVsZCBjYW4gYmUgbW92ZWQgdG8gYSBkaWZmZXJlbnQgdHlwZSBhY3Jvc3MgZGlmZmVybnQgcHJvamVjdHMgCi0gKiByZXBsYWNpbmcgYW4gZXhpc3RpbmcgZmllbGQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNb3ZlRmllbGRGb3JjZUluRGlmZmVyZW50UHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1Avc3JjL1guamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkiICBpbnQgYmFyO1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpLmdldFR5cGUoIlgiKTsKLQkJSUZpZWxkIGZpZWxkU291cmNlPSB0eXBlU291cmNlLmdldEZpZWxkKCJiYXIiKTsKLQkKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDIiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1AyL3NyYy9ZLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBZIHtcbiIgKwotCQkJIiAgYm9vbGVhbiBiYXI7XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJVHlwZSB0eXBlRGVzdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1AyL3NyYy9ZLmphdmEiKS5nZXRUeXBlKCJZIik7Ci0JCi0JCW1vdmVQb3NpdGl2ZShmaWVsZFNvdXJjZSwgdHlwZURlc3QsIG51bGwsIG51bGwsIHRydWUpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIGZpZWxkIGNhbiBiZSBtb3ZlZCB0byBhIGRpZmZlcmVudCB0eXBlIGFjcm9zcyBkaWZmZXJudCBwcm9qZWN0cy4KLSAqLwotcHVibGljIHZvaWQgdGVzdE1vdmVGaWVsZEluRGlmZmVyZW50UHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1Avc3JjL1guamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkiICBpbnQgYmFyO1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpLmdldFR5cGUoIlgiKTsKLQkJSUZpZWxkIGZpZWxkU291cmNlPSB0eXBlU291cmNlLmdldEZpZWxkKCJiYXIiKTsKLQkKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDIiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1AyL3NyYy9ZLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBZIHtcbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVEZXN0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUDIvc3JjL1kuamF2YSIpLmdldFR5cGUoIlkiKTsKLQkKLQkJbW92ZVBvc2l0aXZlKGZpZWxkU291cmNlLCB0eXBlRGVzdCwgbnVsbCwgbnVsbCwgZmFsc2UpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIGZpZWxkIGNhbiBiZSBtb3ZlZCB0byBhIGRpZmZlcmVudCB0eXBlLAotICogYW5kIHJlbmFtZWQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNb3ZlRmllbGRSZW5hbWUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL1guamF2YSIsCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgaW50IGZvbztcbiIgKwotCQkifSIKLQkpOwotCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JSUZpZWxkIGZpZWxkU291cmNlPSB0eXBlU291cmNlLmdldEZpZWxkKCJmb28iKTsKLQotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9ZLmphdmEiLAotCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCSJ9IgotCSk7Ci0JSVR5cGUgdHlwZURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9ZLmphdmEiKS5nZXRUeXBlKCJZIik7Ci0KLQltb3ZlUG9zaXRpdmUoZmllbGRTb3VyY2UsIHR5cGVEZXN0LCBudWxsLCAiZnJlZCIsIGZhbHNlKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgZmllbGQgY2FuIGJlIG1vdmVkIHRvIGEgZGlmZmVyZW50IHR5cGUsCi0gKiBhbmQgcmVuYW1lZCwgb3ZlcndyaXRpbmcgYW4gZXhpc3RpbmcgZmllbGQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNb3ZlRmllbGRSZW5hbWVGb3JjZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvWC5qYXZhIiwKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBpbnQgZm9vO1xuIiArCi0JCSJ9IgotCSk7Ci0JSVR5cGUgdHlwZVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpLmdldFR5cGUoIlgiKTsKLQlJRmllbGQgZmllbGRTb3VyY2U9IHR5cGVTb3VyY2UuZ2V0RmllbGQoImZvbyIpOwotCi0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL1kuamF2YSIsCi0JCSJwdWJsaWMgY2xhc3MgWSB7XG4iICsKLQkJIiAgYm9vbGVhbiBiYXI7XG4iICsKLQkJIn0iCi0JKTsKLQlJVHlwZSB0eXBlRGVzdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1kuamF2YSIpLmdldFR5cGUoIlkiKTsKLQotCW1vdmVQb3NpdGl2ZShmaWVsZFNvdXJjZSwgdHlwZURlc3QsIG51bGwsICJiYXIiLCB0cnVlKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgZmllbGQgY2FuIGJlIG1vdmVkIHRvIGEgZGlmZmVyZW50IHR5cGUgYWNyb3NzIGRpZmZlcm50IHByb2plY3RzLAotICogYW5kIHJlbmFtZWQsIG92ZXJ3cml0aW5nIGFuIGV4aXN0aW5nIGZpZWxkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TW92ZUZpZWxkUmVuYW1lRm9yY2VJbkRpZmZlcmVudFByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QL3NyYy9YLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIiAgaW50IGZvbztcbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JCUlGaWVsZCBmaWVsZFNvdXJjZT0gdHlwZVNvdXJjZS5nZXRGaWVsZCgiZm9vIik7Ci0JCi0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QMi9zcmMvWS5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWSB7XG4iICsKLQkJCSIgIGJvb2xlYW4gYmFyO1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QMi9zcmMvWS5qYXZhIikuZ2V0VHlwZSgiWSIpOwotCQotCQltb3ZlUG9zaXRpdmUoZmllbGRTb3VyY2UsIHR5cGVEZXN0LCBudWxsLCAiYmFyIiwgdHJ1ZSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMiIpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgZmllbGQgY2FuIGJlIG1vdmVkIHRvIGEgZGlmZmVyZW50IHR5cGUgYWNyb3NzIGRpZmZlcmVudCBwcm9qZWN0cywKLSAqIGFuZCByZW5hbWVkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TW92ZUZpZWxkUmVuYW1lSW5EaWZmZXJlbnRQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvWC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSIgIGludCBmb287XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCQlJRmllbGQgZmllbGRTb3VyY2U9IHR5cGVTb3VyY2UuZ2V0RmllbGQoImZvbyIpOwotCQotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMiIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUDIvc3JjL1kuamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QMi9zcmMvWS5qYXZhIikuZ2V0VHlwZSgiWSIpOwotCQotCQltb3ZlUG9zaXRpdmUoZmllbGRTb3VyY2UsIHR5cGVEZXN0LCBudWxsLCAiYmFyIiwgZmFsc2UpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIGZpZWxkIGNhbiBiZSBjb3BpZWQgdG8gYSBkaWZmZXJlbnQgdHlwZSBhY3Jvc3MgZGlmZmVyZW50IHByb2plY3RzIAotICogd2l0aCBwb3NpdGlvbmluZy4KLSAqLwotcHVibGljIHZvaWQgdGVzdE1vdmVGaWVsZFJlbmFtZUZvcmNlV2l0aFBvc2l0aW9uaW5nSW5EaWZmZXJlbnRQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvWC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSIgIGludCBmb287XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCQlJRmllbGQgZmllbGRTb3VyY2U9IHR5cGVTb3VyY2UuZ2V0RmllbGQoImZvbyIpOwotCQotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMiIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUDIvc3JjL1kuamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCQkiICBib29sZWFuIGJhcjtcbiIgKwotCQkJIiAgY2hhciBmcmVkO1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QMi9zcmMvWS5qYXZhIikuZ2V0VHlwZSgiWSIpOwotCQotCQltb3ZlUG9zaXRpdmUoZmllbGRTb3VyY2UsIHR5cGVEZXN0LCB0eXBlRGVzdC5nZXRGaWVsZCgiYmFyIiksICJmcmVkIiwgdHJ1ZSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMiIpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgZmllbGQgY2FuIGJlIG1vdmVkIGluIHRoZSBzYW1lIHR5cGUuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNb3ZlRmllbGRTYW1lUGFyZW50KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9YLmphdmEiLAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIGludCBmb287XG4iICsKLQkJIn0iCi0JKTsKLQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCUlGaWVsZCBmaWVsZFNvdXJjZT0gdHlwZVNvdXJjZS5nZXRGaWVsZCgiZm9vIik7Ci0KLQltb3ZlUG9zaXRpdmUoZmllbGRTb3VyY2UsIHR5cGVTb3VyY2UsIG51bGwsICJiYXIiLCBmYWxzZSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIGZpZWxkIGNhbm5vdCBiZSBtb3ZlZCB0byBhIGRpZmZlcmVudCB0eXBlIHJlcGxhY2luZyBhbiBleGlzdGluZyBmaWVsZCBpZgotICogbm90IGZvcmNlZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdE1vdmVGaWVsZFdpdGhDb2xsaXNpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL1guamF2YSIsCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgaW50IGZvbztcbiIgKwotCQkifSIKLQkpOwotCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JSUZpZWxkIGZpZWxkU291cmNlPSB0eXBlU291cmNlLmdldEZpZWxkKCJmb28iKTsKLQotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9ZLmphdmEiLAotCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCSIgIGJvb2xlYW4gZm9vO1xuIiArCi0JCSJ9IgotCSk7Ci0JSVR5cGUgdHlwZURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9ZLmphdmEiKS5nZXRUeXBlKCJZIik7Ci0KLQltb3ZlTmVnYXRpdmUoZmllbGRTb3VyY2UsIHR5cGVEZXN0LCBudWxsLCBudWxsLCBmYWxzZSwgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OQU1FX0NPTExJU0lPTik7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIGZpZWxkIGNhbm5vdCBiZSBtb3ZlZCB0byBhIGRpZmZlcmVudCB0eXBlIGFjcm9zcyBkaWZmZXJudCBwcm9qZWN0cwotICogcmVwbGFjaW5nIGFuIGV4aXN0aW5nIGZpZWxkIGlmIG5vdCBmb3JjZWQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNb3ZlRmllbGRXaXRoQ29sbGlzaW9uSW5EaWZmZXJlbnRQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvWC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSIgIGludCBiYXI7XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCQlJRmllbGQgZmllbGRTb3VyY2U9IHR5cGVTb3VyY2UuZ2V0RmllbGQoImJhciIpOwotCQotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMiIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUDIvc3JjL1kuamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCQkiICBib29sZWFuIGJhcjtcbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVEZXN0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUDIvc3JjL1kuamF2YSIpLmdldFR5cGUoIlkiKTsKLQkKLQkJbW92ZU5lZ2F0aXZlKGZpZWxkU291cmNlLCB0eXBlRGVzdCwgbnVsbCwgbnVsbCwgZmFsc2UsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTkFNRV9DT0xMSVNJT04pOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIGZpZWxkIGNhbm5vdCBiZSBtb3ZlZCB0byBhbiBpbnZhbGlkIGRlc3RpbmF0aW9uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNb3ZlRmllbGRXaXRoSW52YWxpZERlc3RpbmF0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9YLmphdmEiLAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIGludCBmb287XG4iICsKLQkJIn0iCi0JKTsKLQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCUlGaWVsZCBmaWVsZFNvdXJjZT0gdHlwZVNvdXJjZS5nZXRGaWVsZCgiZm9vIik7Ci0KLQlJQ2xhc3NGaWxlIGNmID0gZ2V0Q2xhc3NGaWxlKCJQIiwgIi9CaW5hcnlQcm9qZWN0L2JpbiIsICIiLCAiWC5jbGFzcyIpOwotCi0JbW92ZU5lZ2F0aXZlKGZpZWxkU291cmNlLCBjZi5nZXRUeXBlKCksIG51bGwsIG51bGwsIGZhbHNlLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfREVTVElOQVRJT04pOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBmaWVsZCBjYW5ub3QgYmUgbW92ZWQgdG8gYW4gaW52YWxpZCBkZXN0aW5hdGlvbi4KLSAqLwotcHVibGljIHZvaWQgdGVzdE1vdmVGaWVsZFdpdGhJbnZhbGlkRGVzdGluYXRpb25JbkRpZmZlcmVudFByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QL3NyYy9YLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIiAgaW50IGZvbztcbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JCUlGaWVsZCBmaWVsZFNvdXJjZT0gdHlwZVNvdXJjZS5nZXRGaWVsZCgiZm9vIik7Ci0JCi0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sIG5ldyBTdHJpbmdbXSB7Ii9CaW5hcnlQcm9qZWN0L2JpbiJ9LCAiYmluIik7Ci0JCUlDbGFzc0ZpbGUgY2YgPSBnZXRDbGFzc0ZpbGUoIlAyIiwgIi9CaW5hcnlQcm9qZWN0L2JpbiIsICIiLCAiWC5jbGFzcyIpOwotCQotCQltb3ZlTmVnYXRpdmUoZmllbGRTb3VyY2UsIGNmLmdldFR5cGUoKSwgbnVsbCwgbnVsbCwgZmFsc2UsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9ERVNUSU5BVElPTik7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMiIpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgZmllbGQgY2FuIGJlIGNvcGllZCB0byBhIGRpZmZlcmVudCB0eXBlIGFjcm9zcyBkaWZmZXJlbnQgcHJvamVjdHMgCi0gKiB3aXRoIHBvc2l0aW9uaW5nLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TW92ZUZpZWxkV2l0aFBvc2l0aW9uaW5nSW5EaWZmZXJlbnRQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvWC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSIgIGludCBmb287XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCQlJRmllbGQgZmllbGRTb3VyY2U9IHR5cGVTb3VyY2UuZ2V0RmllbGQoImZvbyIpOwotCQotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMiIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUDIvc3JjL1kuamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCQkiICBib29sZWFuIGJhcjtcbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVEZXN0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUDIvc3JjL1kuamF2YSIpLmdldFR5cGUoIlkiKTsKLQkKLQkJbW92ZVBvc2l0aXZlKGZpZWxkU291cmNlLCB0eXBlRGVzdCwgdHlwZURlc3QuZ2V0RmllbGQoImJhciIpLCBudWxsLCBmYWxzZSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMiIpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgaW5pdGlhbGl6ZXIgY2FuIGJlIG1vdmVkIHRvIGEgZGlmZmVyZW50IHR5cGUuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNb3ZlSW5pdGlhbGl6ZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL1guamF2YSIsCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgaW50IGZvbztcbiIgKwotCQkiICB7XG4iICsKLQkJIiAgICBmb28gPSAxMDtcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iCi0JKTsKLQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCUlJbml0aWFsaXplciBpbml0aWFsaXplclNvdXJjZT0gdHlwZVNvdXJjZS5nZXRJbml0aWFsaXplcigxKTsKLQotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9ZLmphdmEiLAotCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCSJ9IgotCSk7Ci0JSVR5cGUgdHlwZURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9ZLmphdmEiKS5nZXRUeXBlKCJZIik7Ci0KLQltb3ZlUG9zaXRpdmUoaW5pdGlhbGl6ZXJTb3VyY2UsIHR5cGVEZXN0LCBudWxsLCBudWxsLCBmYWxzZSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIGluaXRpYWxpemVyIGNhbiBiZSBjb3BpZWQgdG8gYSBkaWZmZXJlbnQgdHlwZSB0aGF0IGlzIGluIGEgZGlmZmVyZW50Ci0gKiBwcm9qZWN0cz0uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNb3ZlSW5pdGlhbGl6ZXJJbkRpZmZlcmVudFByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QL3NyYy9YLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIiAgaW50IGZvbztcbiIgKwotCQkJIiAge1xuIiArCi0JCQkiICAgIGZvbyA9IDEwO1xuIiArCi0JCQkiICB9XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCQlJSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXJTb3VyY2U9IHR5cGVTb3VyY2UuZ2V0SW5pdGlhbGl6ZXIoMSk7Ci0JCi0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QMi9zcmMvWS5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWSB7XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJVHlwZSB0eXBlRGVzdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1AyL3NyYy9ZLmphdmEiKS5nZXRUeXBlKCJZIik7Ci0JCi0JCW1vdmVQb3NpdGl2ZShpbml0aWFsaXplclNvdXJjZSwgdHlwZURlc3QsIG51bGwsIG51bGwsIGZhbHNlKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAyIik7Ci0JfQotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBpbml0aWFsaXplciBjYW5ub3QgYmUgbW92ZWQgYW5kIHJlbmFtZWQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNb3ZlSW5pdGlhbGl6ZXJSZW5hbWUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL1guamF2YSIsCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgaW50IGZvbztcbiIgKwotCQkiICB7XG4iICsKLQkJIiAgICBmb28gPSAxMDtcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iCi0JKTsKLQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCUlJbml0aWFsaXplciBpbml0aWFsaXplclNvdXJjZT0gdHlwZVNvdXJjZS5nZXRJbml0aWFsaXplcigxKTsKLQotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9ZLmphdmEiLAotCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCSJ9IgotCSk7Ci0JSVR5cGUgdHlwZURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9ZLmphdmEiKS5nZXRUeXBlKCJZIik7Ci0KLQltb3ZlTmVnYXRpdmUoaW5pdGlhbGl6ZXJTb3VyY2UsIHR5cGVEZXN0LCBudWxsLCAibmV3TmFtZSIsIGZhbHNlLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfTkFNRSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIGluaXRpYWxpemVyIGNhbm5vdCBiZSBtb3ZlZCBhbmQgcmVuYW1lZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdE1vdmVJbml0aWFsaXplclJlbmFtZUluRGlmZmVyZW50UHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1Avc3JjL1guamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkiICBpbnQgZm9vO1xuIiArCi0JCQkiICB7XG4iICsKLQkJCSIgICAgZm9vID0gMTA7XG4iICsKLQkJCSIgIH1cbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JCUlJbml0aWFsaXplciBpbml0aWFsaXplclNvdXJjZT0gdHlwZVNvdXJjZS5nZXRJbml0aWFsaXplcigxKTsKLQkKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDIiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1AyL3NyYy9ZLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBZIHtcbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVEZXN0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUDIvc3JjL1kuamF2YSIpLmdldFR5cGUoIlkiKTsKLQkKLQkJbW92ZU5lZ2F0aXZlKGluaXRpYWxpemVyU291cmNlLCB0eXBlRGVzdCwgbnVsbCwgIm5ld05hbWUiLCBmYWxzZSwgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX05BTUUpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIGluaXRpYWxpemVyIGNhbiBiZSBtb3ZlZCB0byBhIGRpZmZlcmVudCB0eXBlIGluIGEgZGlmZmVyZW50IHByb2plY3QgCi0gKiB3aXRoIHBvc2l0aW9uaW5nLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TW92ZUluaXRpYWxpemVyV2l0aFBvc2l0aW9uaW5nSW5EaWZmZXJlbnRQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvWC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSIgIGludCBmb287XG4iICsKLQkJCSIgIHtcbiIgKwotCQkJIiAgICBmb28gPSAxMDtcbiIgKwotCQkJIiAgfVxuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpLmdldFR5cGUoIlgiKTsKLQkJSUluaXRpYWxpemVyIGluaXRpYWxpemVyU291cmNlPSB0eXBlU291cmNlLmdldEluaXRpYWxpemVyKDEpOwotCQotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMiIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUDIvc3JjL1kuamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCQkiICBpbnQgYmFyO1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QMi9zcmMvWS5qYXZhIikuZ2V0VHlwZSgiWSIpOwotCQotCQltb3ZlUG9zaXRpdmUoaW5pdGlhbGl6ZXJTb3VyY2UsIHR5cGVEZXN0LCB0eXBlRGVzdC5nZXRGaWVsZCgiYmFyIiksIG51bGwsIGZhbHNlKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAyIik7Ci0JfQotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYW4gaW5uZXIgdHlwZSBjYW4gYmUgbW92ZWQgYW5kIHJlbmFtZWQgdG8gYSB0eXBlIHRoYXQgaXMgaW4gZGlmZmVyZW50IHByb2plY3QKLSAqIHdpdGggcG9zaXRpb25pbmcuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNb3ZlSW5uZXJUeXBlUmVuYW1lV2l0aFBvc2l0aW9uaW5nSW5EaWZmZXJlbnRQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvWC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSIgIGNsYXNzIElubmVyIHtcbiIgKwotCQkJIiAgfSIgKwkJCQotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJYIikuZ2V0VHlwZSgiSW5uZXIiKTsKLQkKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDIiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1AyL3NyYy9ZLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBZIHtcbiIgKwotCQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJCSIgIH1cbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3VEZXN0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUDIvc3JjL1kuamF2YSIpOwotCQlJVHlwZSB0eXBlRGVzdCA9IGN1RGVzdC5nZXRUeXBlKCJZIik7Ci0KLQkJbW92ZVBvc2l0aXZlKHR5cGVTb3VyY2UsICB0eXBlRGVzdCwgdHlwZURlc3QuZ2V0TWV0aG9kKCJmb28iLCBuZXcgU3RyaW5nW10ge30pLCAiVCIsIGZhbHNlKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAyIik7Ci0JfQotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYW4gaW5uZXIgdHlwZSBjYW4gYmUgbW92ZWQgdG8gYSB0eXBlIHRoYXQgaXMgaW4gZGlmZmVyZW50IHByb2plY3QKLSAqIHdpdGggcG9zaXRpb25pbmcuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNb3ZlSW5uZXJUeXBlV2l0aFBvc2l0aW9uaW5nSW5EaWZmZXJlbnRQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvWC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSIgIGNsYXNzIElubmVyIHtcbiIgKwotCQkJIiAgfSIgKwkJCQotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJYIikuZ2V0VHlwZSgiSW5uZXIiKTsKLQkKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDIiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1AyL3NyYy9ZLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBZIHtcbiIgKwotCQkJIiAgdm9pZCBmb28oKSB7XG4iICsKLQkJCSIgIH1cbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3VEZXN0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUDIvc3JjL1kuamF2YSIpOwotCQlJVHlwZSB0eXBlRGVzdCA9IGN1RGVzdC5nZXRUeXBlKCJZIik7Ci0JCi0JCW1vdmVQb3NpdGl2ZSh0eXBlU291cmNlLCAgdHlwZURlc3QsIHR5cGVEZXN0LmdldE1ldGhvZCgiZm9vIiwgbmV3IFN0cmluZ1tdIHt9KSwgbnVsbCwgZmFsc2UpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBtYWluIHR5cGVzIGNhbiBiZSBtb3ZlZCBhbmQgcmVuYW1lZCAod2l0aGluIHRoZSBzYW1lIHBhcmVudCkuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNb3ZlTWFpblR5cGVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9YLmphdmEiLAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSJ9IgotCSk7Ci0JSVBhY2thZ2VGcmFnbWVudCBwa2cgPSBnZXRQYWNrYWdlKCIvUC9zcmMiKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gcGtnLmdldENvbXBpbGF0aW9uVW5pdCgiWC5qYXZhIik7Ci0JSVR5cGUgdHlwZVNvdXJjZSA9IGN1LmdldFR5cGUoIlgiKTsKLQotCW1vdmVQb3NpdGl2ZSgKLQkJbmV3IElKYXZhRWxlbWVudFtdIHt0eXBlU291cmNlfSwgCi0JCW5ldyBJSmF2YUVsZW1lbnRbXXtjdX0sIAotCQludWxsLCAKLQkJbmV3IFN0cmluZ1tdIHsiWSJ9LCAKLQkJZmFsc2UpOwotCi0JLy8gdGVzdCB0aGF0IGJvdGggdGhlIGNvbXBpbGF0aW9uIHVuaXQgYW5kIHRoZSBtYWluIHR5cGUgaGF2ZSBiZWVuIHJlbmFtZWQuCi0JSUNvbXBpbGF0aW9uVW5pdCByZW5hbWVkQ1UgPSBwa2cuZ2V0Q29tcGlsYXRpb25Vbml0KCJZLmphdmEiKTsKLQlhc3NlcnRUcnVlKCJSZW5hbWVkIGVsZW1lbnQgc2hvdWxkIGJlIHByZXNlbnQiLCByZW5hbWVkQ1UuZ2V0VHlwZSgiWSIpLmV4aXN0cygpKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgbWV0aG9kIGNhbiBiZSBtb3ZlZCB0byBhIGRpZmZlcmVudCB0eXBlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TW92ZU1ldGhvZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvWC5qYXZhIiwKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbyhTdHJpbmcgcykge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifSIKLQkpOwotCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JSU1ldGhvZCBtZXRob2RTb3VyY2U9IHR5cGVTb3VyY2UuZ2V0TWV0aG9kKCJmb28iLCBuZXcgU3RyaW5nW10geyJRU3RyaW5nOyJ9KTsKLQotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9ZLmphdmEiLAotCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCSJ9IgotCSk7Ci0JSVR5cGUgdHlwZURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9ZLmphdmEiKS5nZXRUeXBlKCJZIik7Ci0KLQltb3ZlUG9zaXRpdmUobWV0aG9kU291cmNlLCB0eXBlRGVzdCwgbnVsbCwgbnVsbCwgZmFsc2UpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBtZXRob2QgY2FuIGJlIG1vdmVkIHRvIGEgZGlmZmVyZW50IHR5cGUsIGZvcmNpbmcKLSAqIGFuIG92ZXJ3cml0ZSB3aGVuIHRoZXJlIGlzIGEgbmFtZSBjb2xsaXNpb24KLSAqLwotcHVibGljIHZvaWQgdGVzdE1vdmVNZXRob2RGb3JjZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvWC5qYXZhIiwKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbyhTdHJpbmcgcykge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifSIKLQkpOwotCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JSU1ldGhvZCBtZXRob2RTb3VyY2U9IHR5cGVTb3VyY2UuZ2V0TWV0aG9kKCJmb28iLCBuZXcgU3RyaW5nW10geyJRU3RyaW5nOyJ9KTsKLQotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9ZLmphdmEiLAotCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCSIgIGludCBmb28oU3RyaW5nIHMpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iCi0JKTsKLQlJVHlwZSB0eXBlRGVzdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1kuamF2YSIpLmdldFR5cGUoIlkiKTsKLQotCW1vdmVQb3NpdGl2ZShtZXRob2RTb3VyY2UsIHR5cGVEZXN0LCBudWxsLCBudWxsLCB0cnVlKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgbWV0aG9kIGNhbiBiZSBtb3ZlZCB0byBhIGRpZmZlcmVudCB0eXBlIGFjcm9zcyBkaWZmZXJlbnQgcHJvamVjdHMsCi0gKiBmb3JjaW5nIGFuIG92ZXJ3cml0ZSB3aGVuIHRoZXJlIGlzIGEgbmFtZSBjb2xsaXNpb24KLSAqLwotcHVibGljIHZvaWQgdGVzdE1vdmVNZXRob2RGb3JjZUluRGlmZmVyZW50UHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1Avc3JjL1guamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkiICB2b2lkIGZvbyhTdHJpbmcgcykge1xuIiArCi0JCQkiICB9XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCQlJTWV0aG9kIG1ldGhvZFNvdXJjZT0gdHlwZVNvdXJjZS5nZXRNZXRob2QoImZvbyIsIG5ldyBTdHJpbmdbXSB7IlFTdHJpbmc7In0pOwotCQotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMiIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUDIvc3JjL1kuamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCQkiICBpbnQgZm9vKFN0cmluZyBzKSB7XG4iICsKLQkJCSIgIH1cbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVEZXN0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUDIvc3JjL1kuamF2YSIpLmdldFR5cGUoIlkiKTsKLQkKLQkJbW92ZVBvc2l0aXZlKG1ldGhvZFNvdXJjZSwgdHlwZURlc3QsIG51bGwsIG51bGwsIHRydWUpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIG1ldGhvZCBjYW4gYmUgbW92ZWQgdG8gYSBkaWZmZXJlbnQgdHlwZSBpbiBhIGRpZmZlcmVudCBwcm9qZWN0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TW92ZU1ldGhvZEluRGlmZmVyZW50UHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1Avc3JjL1guamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkiICB2b2lkIGZvbyhTdHJpbmcgcykge1xuIiArCi0JCQkiICB9XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCQlJTWV0aG9kIG1ldGhvZFNvdXJjZT0gdHlwZVNvdXJjZS5nZXRNZXRob2QoImZvbyIsIG5ldyBTdHJpbmdbXSB7IlFTdHJpbmc7In0pOwotCQotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMiIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUDIvc3JjL1kuamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QMi9zcmMvWS5qYXZhIikuZ2V0VHlwZSgiWSIpOwotCi0JCW1vdmVQb3NpdGl2ZShtZXRob2RTb3VyY2UsIHR5cGVEZXN0LCBudWxsLCBudWxsLCBmYWxzZSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMiIpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgbWV0aG9kIGNhbiBiZSBtb3ZlZCB0byBhIGRpZmZlcmVudCB0eXBlLCByZW5hbWVkCi0gKiBzaW1hbHRhbmVvdXNseS4KLSAqLwotcHVibGljIHZvaWQgdGVzdE1vdmVNZXRob2RSZW5hbWUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL1guamF2YSIsCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oU3RyaW5nIHMpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iCi0JKTsKLQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCUlNZXRob2QgbWV0aG9kU291cmNlPSB0eXBlU291cmNlLmdldE1ldGhvZCgiZm9vIiwgbmV3IFN0cmluZ1tdIHsiUVN0cmluZzsifSk7Ci0KLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvWS5qYXZhIiwKLQkJInB1YmxpYyBjbGFzcyBZIHtcbiIgKwotCQkifSIKLQkpOwotCUlUeXBlIHR5cGVEZXN0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWS5qYXZhIikuZ2V0VHlwZSgiWSIpOwotCi0JbW92ZVBvc2l0aXZlKG1ldGhvZFNvdXJjZSwgdHlwZURlc3QsIG51bGwsICJiYXIiLCBmYWxzZSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIG1ldGhvZCBjYW4gYmUgbW92ZWQgdG8gYSBkaWZmZXJlbnQgdHlwZSwgcmVuYW1lZAotICogc2ltYWx0YW5lb3VzbHksIG92ZXJ3cml0aW5nIGFuIGV4aXN0aW5nIG1ldGhvZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdE1vdmVNZXRob2RSZW5hbWVGb3JjZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvWC5qYXZhIiwKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbyhTdHJpbmcgcykge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifSIKLQkpOwotCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JSU1ldGhvZCBtZXRob2RTb3VyY2U9IHR5cGVTb3VyY2UuZ2V0TWV0aG9kKCJmb28iLCBuZXcgU3RyaW5nW10geyJRU3RyaW5nOyJ9KTsKLQotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9ZLmphdmEiLAotCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCSIgIHZvaWQgYmFyKFN0cmluZyBzKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IgotCSk7Ci0JSVR5cGUgdHlwZURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9ZLmphdmEiKS5nZXRUeXBlKCJZIik7Ci0KLQltb3ZlUG9zaXRpdmUobWV0aG9kU291cmNlLCB0eXBlRGVzdCwgbnVsbCwgImJhciIsIHRydWUpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBtZXRob2QgY2FuIGJlIG1vdmVkIHRvIGEgZGlmZmVyZW50IHR5cGUgYWNyb3NzIGRpZmZlcmVudCBwcm9qZWN0cywKLSAqIHJlbmFtZWQgc2ltYWx0YW5lb3VzbHksIG92ZXJ3cml0aW5nIGFuIGV4aXN0aW5nIG1ldGhvZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdE1vdmVNZXRob2RSZW5hbWVGb3JjZUluRGlmZmVyZW50UHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1Avc3JjL1guamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkiICB2b2lkIGZvbyhTdHJpbmcgcykge1xuIiArCi0JCQkiICB9XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCQlJTWV0aG9kIG1ldGhvZFNvdXJjZT0gdHlwZVNvdXJjZS5nZXRNZXRob2QoImZvbyIsIG5ldyBTdHJpbmdbXSB7IlFTdHJpbmc7In0pOwotCQotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMiIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUDIvc3JjL1kuamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCQkiICB2b2lkIGJhcihTdHJpbmcgcykge1xuIiArCi0JCQkiICB9XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJVHlwZSB0eXBlRGVzdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1AyL3NyYy9ZLmphdmEiKS5nZXRUeXBlKCJZIik7Ci0KLQkJbW92ZVBvc2l0aXZlKG1ldGhvZFNvdXJjZSwgdHlwZURlc3QsIG51bGwsICJiYXIiLCB0cnVlKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAyIik7Ci0JfQotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBtZXRob2QgY2FuIGJlIG1vdmVkIHRvIGEgZGlmZmVyZW50IHR5cGUgYWNyb3NzIGRpZmZlcmVudCBwcm9qZWN0cywKLSAqIHJlbmFtZWQgc2ltYWx0YW5lb3VzbHkuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNb3ZlTWV0aG9kUmVuYW1lSW5EaWZmZXJlbnRQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvWC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSIgIHZvaWQgZm9vKFN0cmluZyBzKSB7XG4iICsKLQkJCSIgIH1cbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JCUlNZXRob2QgbWV0aG9kU291cmNlPSB0eXBlU291cmNlLmdldE1ldGhvZCgiZm9vIiwgbmV3IFN0cmluZ1tdIHsiUVN0cmluZzsifSk7Ci0JCi0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QMi9zcmMvWS5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWSB7XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJVHlwZSB0eXBlRGVzdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1AyL3NyYy9ZLmphdmEiKS5nZXRUeXBlKCJZIik7Ci0JCi0JCW1vdmVQb3NpdGl2ZShtZXRob2RTb3VyY2UsIHR5cGVEZXN0LCBudWxsLCAiYmFyIiwgZmFsc2UpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIG1ldGhvZCBjYW4gYmUgbW92ZWQgYW5kIHJlbmFtZWQgdG8gYSBkaWZmZXJlbnQgdHlwZSBhY3Jvc3MgdHdvIGRpZmZlcmVudCBwcm9qZWN0cwotICogd2l0aCBwb3NpdGlvbmluZy4KLSAqLwotcHVibGljIHZvaWQgdGVzdE1vdmVNZXRob2RSZW5hbWVXaXRoUG9zaXRpb25pbmdJbkRpZmZlcmVudFByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QL3NyYy9YLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIiAgaW50IGZvbyhTdHJpbmcgcykge1xuIiArCi0JCQkiICB9XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCQlJTWV0aG9kIG1ldGhvZFNvdXJjZSA9IHR5cGVTb3VyY2UuZ2V0TWV0aG9kKCJmb28iLCBuZXcgU3RyaW5nW10geyJRU3RyaW5nOyJ9KTsKLQkKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDIiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1AyL3NyYy9ZLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBZIHtcbiIgKwotCQkJIiAgYm9vbGVhbiBiYXIoKSB7XG4iICsKLQkJCSIgIH1cbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVEZXN0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUDIvc3JjL1kuamF2YSIpLmdldFR5cGUoIlkiKTsKLQkKLQkJbW92ZVBvc2l0aXZlKG1ldGhvZFNvdXJjZSwgdHlwZURlc3QsIHR5cGVEZXN0LmdldE1ldGhvZCgiYmFyIiwgbmV3IFN0cmluZ1tdIHt9KSwgImZyZWQiLCBmYWxzZSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMiIpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgbWV0aG9kIGNhbiBiZSBtb3ZlZCB0byB0aGUgc2FtZSB0eXBlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TW92ZU1ldGhvZFNhbWVQYXJlbnQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL1guamF2YSIsCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgdm9pZCBmb28oU3RyaW5nIHMpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iCi0JKTsKLQlJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCUlNZXRob2QgbWV0aG9kU291cmNlPSB0eXBlU291cmNlLmdldE1ldGhvZCgiZm9vIiwgbmV3IFN0cmluZ1tdIHsiUVN0cmluZzsifSk7Ci0KLQltb3ZlUG9zaXRpdmUobWV0aG9kU291cmNlLCB0eXBlU291cmNlLCBudWxsLCAiYmFyIiwgZmFsc2UpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBtZXRob2QgbW92ZXMgY2FuIGJlIGNhbmNlbGxlZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdE1vdmVNZXRob2RzV2l0aENhbmNlbCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvWC5qYXZhIiwKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICB2b2lkIGZvbyhTdHJpbmcgcykge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIGJhcigpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iCi0JKTsKLQlmaW5hbCBJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCi0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL1kuamF2YSIsCi0JCSJwdWJsaWMgY2xhc3MgWSB7XG4iICsKLQkJIiAgdm9pZCBmb28oU3RyaW5nIHMpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iCi0JKTsKLQlJVHlwZSB0eXBlRGVzdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1kuamF2YSIpLmdldFR5cGUoIlkiKTsKLQotCWJvb2xlYW4gaXNDYW5jZWxlZCA9IGZhbHNlOwotCXRyeSB7Ci0JCVRlc3RQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IFRlc3RQcm9ncmVzc01vbml0b3IuZ2V0SW5zdGFuY2UoKTsKLQkJbW9uaXRvci5zZXRDYW5jZWxsZWRDb3VudGVyKDEpOwotCQltb3ZlUG9zaXRpdmUodHlwZVNvdXJjZS5nZXRNZXRob2RzKCksIG5ldyBJSmF2YUVsZW1lbnRbXSB7dHlwZURlc3R9LCBudWxsLCBudWxsLCBmYWxzZSwgbW9uaXRvcik7Ci0JfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQlpc0NhbmNlbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiT3BlcmF0aW9uIHNob3VsZCBoYXZlIHRocm93biBhbiBvcGVyYXRpb24gY2FuY2VsZWQgZXhjZXB0aW9uIiwgaXNDYW5jZWxlZCk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIG1ldGhvZCBtb3ZlcyBhY3Jvc3MgZGlmZmVybnQgcHJvamVjdHMgY2FuIGJlIGNhbmNlbGxlZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdE1vdmVNZXRob2RzV2l0aENhbmNlbEluRGlmZmVyZW50UHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1Avc3JjL1guamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkiICB2b2lkIGZvbyhTdHJpbmcgcykge1xuIiArCi0JCQkiICB9XG4iICsKLQkJCSIgIHZvaWQgYmFyKCkge1xuIiArCi0JCQkiICB9XG4iICsKLQkJCSJ9IgotCQkpOwotCQlmaW5hbCBJVHlwZSB0eXBlU291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCQotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMiIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUDIvc3JjL1kuamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCQkiICB2b2lkIGZvbyhTdHJpbmcgcykge1xuIiArCi0JCQkiICB9XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJVHlwZSB0eXBlRGVzdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1AyL3NyYy9ZLmphdmEiKS5nZXRUeXBlKCJZIik7Ci0JCi0JCWJvb2xlYW4gaXNDYW5jZWxlZCA9IGZhbHNlOwotCQl0cnkgewotCQkJVGVzdFByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gVGVzdFByb2dyZXNzTW9uaXRvci5nZXRJbnN0YW5jZSgpOwotCQkJbW9uaXRvci5zZXRDYW5jZWxsZWRDb3VudGVyKDEpOwotCQkJbW92ZVBvc2l0aXZlKHR5cGVTb3VyY2UuZ2V0TWV0aG9kcygpLCBuZXcgSUphdmFFbGVtZW50W10ge3R5cGVEZXN0fSwgbnVsbCwgbnVsbCwgZmFsc2UsIG1vbml0b3IpOwotCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlpc0NhbmNlbGVkID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJPcGVyYXRpb24gc2hvdWxkIGhhdmUgdGhyb3duIGFuIG9wZXJhdGlvbiBjYW5jZWxlZCBleGNlcHRpb24iLCBpc0NhbmNlbGVkKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAyIik7Ci0JfQotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBtZXRob2QgY2Fubm90IGJlIG1vdmVkIHRvIGEgZGlmZmVyZW50IHR5cGUsIHdoZW4gbm90IGZvcmNpbmcKLSAqIGFuIG92ZXJ3cml0ZSB3aGVuIHRoZXJlIGlzIGEgbmFtZSBjb2xsaXNpb24KLSAqLwotcHVibGljIHZvaWQgdGVzdE1vdmVNZXRob2RXaXRoQ29sbGlzaW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9YLmphdmEiLAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKFN0cmluZyBzKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IgotCSk7Ci0JSVR5cGUgdHlwZVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpLmdldFR5cGUoIlgiKTsKLQlJTWV0aG9kIG1ldGhvZFNvdXJjZT0gdHlwZVNvdXJjZS5nZXRNZXRob2QoImZvbyIsIG5ldyBTdHJpbmdbXSB7IlFTdHJpbmc7In0pOwotCi0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL1kuamF2YSIsCi0JCSJwdWJsaWMgY2xhc3MgWSB7XG4iICsKLQkJIiAgdm9pZCBmb28oU3RyaW5nIHMpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iCi0JKTsKLQlJVHlwZSB0eXBlRGVzdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1kuamF2YSIpLmdldFR5cGUoIlkiKTsKLQotCW1vdmVOZWdhdGl2ZShtZXRob2RTb3VyY2UsIHR5cGVEZXN0LCBudWxsLCBudWxsLCBmYWxzZSwgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OQU1FX0NPTExJU0lPTik7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIG1ldGhvZCBjYW5ub3QgYmUgbW92ZWQgdG8gYSBkaWZmZXJlbnQgdHlwZSwgd2hlbiBub3QgZm9yY2luZwotICogYW4gb3ZlcndyaXRlIHdoZW4gdGhlcmUgaXMgYSBuYW1lIGNvbGxpc2lvbgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TW92ZU1ldGhvZFdpdGhDb2xsaXNpb25JbkRpZmZlcmVudFByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QL3NyYy9YLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIiAgdm9pZCBmb28oU3RyaW5nIHMpIHtcbiIgKwotCQkJIiAgfVxuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpLmdldFR5cGUoIlgiKTsKLQkJSU1ldGhvZCBtZXRob2RTb3VyY2U9IHR5cGVTb3VyY2UuZ2V0TWV0aG9kKCJmb28iLCBuZXcgU3RyaW5nW10geyJRU3RyaW5nOyJ9KTsKLQkKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDIiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1AyL3NyYy9ZLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBZIHtcbiIgKwotCQkJIiAgdm9pZCBmb28oU3RyaW5nIHMpIHtcbiIgKwotCQkJIiAgfVxuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QMi9zcmMvWS5qYXZhIikuZ2V0VHlwZSgiWSIpOwotCQotCQltb3ZlTmVnYXRpdmUobWV0aG9kU291cmNlLCB0eXBlRGVzdCwgbnVsbCwgbnVsbCwgZmFsc2UsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTkFNRV9DT0xMSVNJT04pOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIG1ldGhvZCBjYW5ub3QgYmUgbW92ZWQgdG8gYW4gaW52YWxpZCBkZXN0aW5hdGlvbi4KLSAqLwotcHVibGljIHZvaWQgdGVzdE1vdmVNZXRob2RXaXRoSW52YWxpZERlc3RpbmF0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9YLmphdmEiLAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKFN0cmluZyBzKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IgotCSk7Ci0JSVR5cGUgdHlwZVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpLmdldFR5cGUoIlgiKTsKLQlJTWV0aG9kIG1ldGhvZFNvdXJjZT0gdHlwZVNvdXJjZS5nZXRNZXRob2QoImZvbyIsIG5ldyBTdHJpbmdbXSB7IlFTdHJpbmc7In0pOwotCi0JbW92ZU5lZ2F0aXZlKG1ldGhvZFNvdXJjZSwgbWV0aG9kU291cmNlLCBudWxsLCBudWxsLCBmYWxzZSwgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0RFU1RJTkFUSU9OKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgbWV0aG9kIGNhbm5vdCBiZSBtb3ZlZCB0byBhbiBpbnZhbGlkIGRlc3RpbmF0aW9uLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TW92ZU1ldGhvZFdpdGhJbnZhbGlkRGVzdGluYXRpb25JbkRpZmZlcmVudFByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QL3NyYy9YLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIiAgdm9pZCBmb28oU3RyaW5nIHMpIHtcbiIgKwotCQkJIiAgfVxuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpLmdldFR5cGUoIlgiKTsKLQkJSU1ldGhvZCBtZXRob2RTb3VyY2UgPSB0eXBlU291cmNlLmdldE1ldGhvZCgiZm9vIiwgbmV3IFN0cmluZ1tdIHsiUVN0cmluZzsifSk7Ci0JCi0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QMi9zcmMvWS5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWSB7XG4iICsKLQkJCSIgIHZvaWQgYmFyKCkge1xuIiArCi0JCQkiICB9XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJVHlwZSB0eXBlRGVzdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1AyL3NyYy9ZLmphdmEiKS5nZXRUeXBlKCJZIik7Ci0JCUlNZXRob2QgbWV0aG9kRGVzdCA9IHR5cGVEZXN0LmdldE1ldGhvZCgiYmFyIiwgbmV3IFN0cmluZ1tdIHt9KTsKLQkJCi0JCW1vdmVOZWdhdGl2ZShtZXRob2RTb3VyY2UsIG1ldGhvZERlc3QsIG51bGwsIG51bGwsIGZhbHNlLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfREVTVElOQVRJT04pOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIG1ldGhvZCBjYW4gYmUgbW92ZWQgdG8gYSBkaWZmZXJlbnQgdHlwZSB0aGF0IGlzIGluIGEgZGlmZmVyZW50IHByb2plY3QKLSAqIHdpdGggcG9zaXRpb25pbmcuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNb3ZlTWV0aG9kV2l0aFBvc2l0aW9uaW5nSW5EaWZmZXJlbnRQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvWC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSIgIGludCBmb28oU3RyaW5nIHMpIHtcbiIgKwotCQkJIiAgfVxuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpLmdldFR5cGUoIlgiKTsKLQkJSU1ldGhvZCBtZXRob2RTb3VyY2UgPSB0eXBlU291cmNlLmdldE1ldGhvZCgiZm9vIiwgbmV3IFN0cmluZ1tdIHsiUVN0cmluZzsifSk7Ci0JCi0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QMi9zcmMvWS5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWSB7XG4iICsKLQkJCSIgIGJvb2xlYW4gYmFyKCkge1xuIiArCi0JCQkiICB9XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJVHlwZSB0eXBlRGVzdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1AyL3NyYy9ZLmphdmEiKS5nZXRUeXBlKCJZIik7Ci0JCi0JCW1vdmVQb3NpdGl2ZShtZXRob2RTb3VyY2UsIHR5cGVEZXN0LCB0eXBlRGVzdC5nZXRNZXRob2QoImJhciIsIG5ldyBTdHJpbmdbXSB7fSksIG51bGwsIGZhbHNlKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAyIik7Ci0JfQotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBtZXRob2Qgd2l0aCBzeW50YXggZXJyb3JzIGNhbiBiZSBtb3ZlZCB0byBhIGRpZmZlcmVudCB0eXBlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TW92ZVN5bnRheEVycm9yTWV0aG9kKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9YLmphdmEiLAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHZvaWQgZm9vKFN0cmluZyBzXG4iICsgLy8gc3ludGF4IGVycm9yCi0JCSIgIH1cbiIgKwotCQkifSIKLQkpOwotCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JSU1ldGhvZCBtZXRob2RTb3VyY2U9IHR5cGVTb3VyY2UuZ2V0TWV0aG9kKCJmb28iLCBuZXcgU3RyaW5nW10geyJRU3RyaW5nOyJ9KTsKLQotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9ZLmphdmEiLAotCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCSJ9IgotCSk7Ci0JSVR5cGUgdHlwZURlc3QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9ZLmphdmEiKS5nZXRUeXBlKCJZIik7Ci0KLQltb3ZlUG9zaXRpdmUobWV0aG9kU291cmNlLCB0eXBlRGVzdCwgbnVsbCwgbnVsbCwgZmFsc2UpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBtZXRob2Qgd2l0aCBzeW50YXggZXJyb3JzIGNhbiBiZSBtb3ZlZCB0byBhIGRpZmZlcmVudCB0eXBlCi0gKiB0aGF0IGlzIGluIGEgZGlmZmVyZW50IHByb2plY3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3ludGF4RXJyb3JNZXRob2RJbkRpZmZlcmVudFByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QL3NyYy9YLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIiAgdm9pZCBmb28oU3RyaW5nIHNcbiIgKyAvLyBzeW50YXggZXJyb3IKLQkJCSIgIH1cbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlUeXBlIHR5cGVTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9YLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JCUlNZXRob2QgbWV0aG9kU291cmNlPSB0eXBlU291cmNlLmdldE1ldGhvZCgiZm9vIiwgbmV3IFN0cmluZ1tdIHsiUVN0cmluZzsifSk7Ci0JCi0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QMi9zcmMvWS5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWSB7XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJVHlwZSB0eXBlRGVzdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1AyL3NyYy9ZLmphdmEiKS5nZXRUeXBlKCJZIik7Ci0JCi0JCW1vdmVQb3NpdGl2ZShtZXRob2RTb3VyY2UsIHR5cGVEZXN0LCBudWxsLCBudWxsLCBmYWxzZSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMiIpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgdHlwZSBjYW4gYmUgbW92ZWQgYW5kIHJlbmFtZWQgYWNyb3NzIHByb2plY3RzIHRvIGEgc3BlY2lmaWVkIHBvc2l0aW9uLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TW92ZVR5cGVSZW5hbWVXaXRoUG9zaXRpb25pbmdJbkRpZmZlcmVudFByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QL3NyYy9YLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIn1cbiIgKwotCQkJImNsYXNzIFoge1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpLmdldFR5cGUoIloiKTsKLQkKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDIiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1AyL3NyYy9ZLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBZIHtcbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3VEZXN0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUDIvc3JjL1kuamF2YSIpOwotCQotCQltb3ZlUG9zaXRpdmUodHlwZVNvdXJjZSwgIGN1RGVzdCwgY3VEZXN0LmdldFR5cGUoIlkiKSwgIlQiLCBmYWxzZSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMiIpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgdHlwZSB0aGF0IGlzIGluIGEgZGlmZmVyZW50IHByb2plY3QgY2FuIGJlIG1vdmVkIHRvIGEgc3BlY2lmaWVkIHBvc2l0aW9uLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TW92ZVR5cGVXaXRoUG9zaXRpb25pbmdJbkRpZmZlcmVudFByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QL3NyYy9YLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIn1cbiIgKwotCQkJImNsYXNzIFoge1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpLmdldFR5cGUoIloiKTsKLQkKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDIiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1AyL3NyYy9ZLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBZIHtcbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3VEZXN0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUDIvc3JjL1kuamF2YSIpOwotCQotCQltb3ZlUG9zaXRpdmUodHlwZVNvdXJjZSwgIGN1RGVzdCwgY3VEZXN0LmdldFR5cGUoIlkiKSwgbnVsbCwgZmFsc2UpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvQ29weU1vdmVSZXNvdXJjZXNUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0NvcHlNb3ZlUmVzb3VyY2VzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMzZDM1MS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvQ29weU1vdmVSZXNvdXJjZXNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci0KLXB1YmxpYyBjbGFzcyBDb3B5TW92ZVJlc291cmNlc1Rlc3RzIGV4dGVuZHMgQ29weU1vdmVUZXN0cyB7Ci0vKioKLSAqLwotcHVibGljIENvcHlNb3ZlUmVzb3VyY2VzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLS8qKgotICogQ29waWVzIHRoZSBlbGVtZW50IHRvIHRoZSBjb250YWluZXIgd2l0aCBvcHRpb25hbCByZW5hbWUKLSAqIGFuZCBmb3JjaW5nLiBUaGUgb3BlcmF0aW9uIHNob3VsZCBzdWNjZWVkLCBzbyBhbnkgZXhjZXB0aW9ucwotICogZW5jb3VudGVyZWQgYXJlIHRocm93bi4KLSAqLwotcHVibGljIElKYXZhRWxlbWVudCBjb3B5UG9zaXRpdmUoSUphdmFFbGVtZW50IGVsZW1lbnQsIElKYXZhRWxlbWVudCBjb250YWluZXIsIElKYXZhRWxlbWVudCBzaWJsaW5nLCBTdHJpbmcgcmVuYW1lLCBib29sZWFuIGZvcmNlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQl0cnkgewotCQlzdGFydERlbHRhcygpOwotCQkKLQkJLy8gaWYgZm9yY2luZywgZW5zdXJlIHRoYXQgYSBuYW1lIGNvbGxpc2lvbiBleGlzdHMKLQkJaWYgKGZvcmNlKSB7Ci0JCQlJSmF2YUVsZW1lbnQgY29sbGlzaW9uID0gZ2VuZXJhdGVIYW5kbGUoZWxlbWVudCwgcmVuYW1lLCBjb250YWluZXIpOwotCQkJYXNzZXJ0VHJ1ZSgiQ29sbGlzaW9uIGRvZXMgbm90IGV4aXN0IiwgY29sbGlzaW9uLmV4aXN0cygpKTsKLQkJfQotCQotCQkvLyBjb3B5Ci0JIAkoKElTb3VyY2VNYW5pcHVsYXRpb24pIGVsZW1lbnQpLmNvcHkoY29udGFpbmVyLCBzaWJsaW5nLCByZW5hbWUsIGZvcmNlLCBudWxsKTsKLQkKLQkJLy8gZW5zdXJlIHRoZSBvcmlnaW5hbCBlbGVtZW50IHN0aWxsIGV4aXN0cwotCQlhc3NlcnRUcnVlKCJUaGUgb3JpZ2luYWwgZWxlbWVudCBtdXN0IHN0aWxsIGV4aXN0IiwgZWxlbWVudC5leGlzdHMoKSk7Ci0JCi0JCS8vIGdlbmVyYXRlIHRoZSBuZXcgZWxlbWVudAloYW5kbGUKLQkJSUphdmFFbGVtZW50IGNvcHkgPSBnZW5lcmF0ZUhhbmRsZShlbGVtZW50LCByZW5hbWUsIGNvbnRhaW5lcik7Ci0JCWFzc2VydFRydWUoIkNvcHkgc2hvdWxkIGV4aXN0IiwgY29weS5leGlzdHMoKSk7Ci0JCS8vZW5zdXJlIGNvcnJlY3QgcG9zaXRpb24KLQkJaWYgKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA+IElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUKSB7Ci0JCQllbnN1cmVDb3JyZWN0UG9zaXRpb25pbmcoKElQYXJlbnQpIGNvbnRhaW5lciwgc2libGluZywgY29weSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoY29udGFpbmVyLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCkgewotCQkJfSBlbHNlIHsKLQkJCQkvLyBlbnN1cmUgcGFja2FnZSBuYW1lIGlzIGNvcnJlY3QKLQkJCQlpZiAoY29udGFpbmVyLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKCIiKSkgewotCQkJCQkvLyBkZWZhdWx0IHBhY2thZ2UgLSBzaG91bGQgYmUgbm8gcGFja2FnZSBkZWNsCi0JCQkJCUlKYXZhRWxlbWVudFtdIGNoaWxkcmVuID0gKChJQ29tcGlsYXRpb25Vbml0KSBjb3B5KS5nZXRDaGlsZHJlbigpOwotCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmIChjaGlsZHJlbltpXSBpbnN0YW5jZW9mIElQYWNrYWdlRGVjbGFyYXRpb24pIHsKLQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIG5vdCBmaW5kIHBhY2thZ2UgZGVjbCIsICFmb3VuZCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSAoKElDb21waWxhdGlvblVuaXQpIGNvcHkpLmdldENoaWxkcmVuKCk7Ci0JCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKGNoaWxkcmVuW2ldIGluc3RhbmNlb2YgSVBhY2thZ2VEZWNsYXJhdGlvbikgewotCQkJCQkJCWFzc2VydFRydWUoInBhY2thZ2UgZGVjbGFyYXRpb24gaW5jb3JyZWN0IiwgKChJUGFja2FnZURlY2xhcmF0aW9uKSBjaGlsZHJlbltpXSkuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoY29udGFpbmVyLmdldEVsZW1lbnROYW1lKCkpKTsKLQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYXNzZXJ0VHJ1ZSgiRGlkIG5vdCBmaW5kIHBhY2thZ2UgZGVjbCIsIGZvdW5kKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJSUphdmFFbGVtZW50RGVsdGEgZGVzdERlbHRhID0gZ2V0RGVsdGFGb3IoY29udGFpbmVyLCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgiRGVzdGluYXRpb24gY29udGFpbmVyIG5vdCBjaGFuZ2VkIiwgZGVzdERlbHRhICE9IG51bGwgJiYgZGVzdERlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5DSEFOR0VEKTsKLQkJSUphdmFFbGVtZW50RGVsdGFbXSBkZWx0YXMgPSBkZXN0RGVsdGEuZ2V0QWRkZWRDaGlsZHJlbigpOwotCQkvLyBGSVhNRTogbm90IHN0cm9uZyBlbm91Z2gKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGRlbHRhc1tpXS5nZXRFbGVtZW50KCkuZXF1YWxzKGNvcHkpKQotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJBZGRlZCBjaGlsZHJlbiBub3QgY29ycmVjdCBmb3IgZWxlbWVudCBjb3B5IiwgZm91bmQpOwotCQlyZXR1cm4gY29weTsKLQl9IGZpbmFsbHkgewotCQlzdG9wRGVsdGFzKCk7Ci0JfQotfQotCi0vKioKLSAqIE1vdmVzIHRoZSBlbGVtZW50cyB0byB0aGUgY29udGFpbmVycyB3aXRoIG9wdGlvbmFsIHJlbmFtaW5nCi0gKiBhbmQgZm9yY2luZy4gVGhlIG9wZXJhdGlvbiBzaG91bGQgc3VjY2VlZCwgc28gYW55IGV4Y2VwdGlvbnMKLSAqIGVuY291bnRlcmVkIGFyZSB0aHJvd24uCi0gKi8KLXB1YmxpYyB2b2lkIG1vdmVQb3NpdGl2ZShJSmF2YUVsZW1lbnRbXSBlbGVtZW50cywgSUphdmFFbGVtZW50W10gZGVzdGluYXRpb25zLCBJSmF2YUVsZW1lbnRbXSBzaWJsaW5ncywgU3RyaW5nW10gbmFtZXMsIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJc3RhcnREZWx0YXMoKTsKLQkJCi0JCS8vIGlmIGZvcmNpbmcsIGVuc3VyZSB0aGF0IGEgbmFtZSBjb2xsaXNpb24gZXhpc3RzCi0JCWludCBpOwotCQlpZiAoZm9yY2UpIHsKLQkJCWZvciAoaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCUlKYXZhRWxlbWVudCBlID0gZWxlbWVudHNbaV07Ci0JCQkJSUphdmFFbGVtZW50IGNvbGxpc2lvbiA9IG51bGw7Ci0JCQkJaWYgKG5hbWVzID09IG51bGwpIHsKLQkJCQkJY29sbGlzaW9uID0gZ2VuZXJhdGVIYW5kbGUoZSwgbnVsbCwgZGVzdGluYXRpb25zW2ldKTsKLQkJCQl9IGVsc2UgewotCQkJCQljb2xsaXNpb24gPSBnZW5lcmF0ZUhhbmRsZShlLCBuYW1lc1tpXSwgZGVzdGluYXRpb25zW2ldKTsKLQkJCQl9Ci0JCQkJYXNzZXJ0VHJ1ZSgiQ29sbGlzaW9uIGRvZXMgbm90IGV4aXN0IiwgY29sbGlzaW9uLmV4aXN0cygpKTsKLQkJCX0KLQkJfQotCQotCQkvLyBtb3ZlCi0JCWdldEphdmFNb2RlbCgpLm1vdmUoZWxlbWVudHMsIGRlc3RpbmF0aW9ucywgc2libGluZ3MsIG5hbWVzLCBmb3JjZSwgbW9uaXRvcik7Ci0JCi0JCWZvciAoaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCUlKYXZhRWxlbWVudCBtb3ZlZCA9IG51bGw7Ci0JCQlpZiAobmFtZXMgPT0gbnVsbCkgewotCQkJCW1vdmVkID0gZ2VuZXJhdGVIYW5kbGUoZWxlbWVudCwgbnVsbCwgZGVzdGluYXRpb25zW2ldKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbW92ZWQgPSBnZW5lcmF0ZUhhbmRsZShlbGVtZW50LCBuYW1lc1tpXSwgZGVzdGluYXRpb25zW2ldKTsKLQkJCX0KLQkJCS8vIGVuc3VyZSB0aGUgb3JpZ2luYWwgZWxlbWVudCBubyBsb25nZXIgZXhpc3RzLCB1bmxlc3MgbW92aW5nIHdpdGhpbiB0aGUgc2FtZSBjb250YWluZXIKLQkJCWlmICghZGVzdGluYXRpb25zW2ldLmVxdWFscyhlbGVtZW50LmdldFBhcmVudCgpKSkgewotCQkJCWFzc2VydFRydWUoIlRoZSBvcmlnaW5hbCBlbGVtZW50IG11c3Qgbm90IGV4aXN0IiwgIWVsZW1lbnQuZXhpc3RzKCkpOwotCQkJfQotCQkJYXNzZXJ0VHJ1ZSgiTW92ZWQgZWxlbWVudCBzaG91bGQgZXhpc3QiLCBtb3ZlZC5leGlzdHMoKSk7Ci0JCi0JCQlJSmF2YUVsZW1lbnQgY29udGFpbmVyID0gZGVzdGluYXRpb25zW2ldOwotCQkJaWYgKGNvbnRhaW5lci5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UKSB7Ci0JCQkJaWYgKGNvbnRhaW5lci5nZXRFbGVtZW50TmFtZSgpLmVxdWFscygiIikpIHsKLQkJCQkJLy8gZGVmYXVsdCBwYWNrYWdlCi0JCQkJCWlmIChtb3ZlZC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUKSB7Ci0JCQkJCQlJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbiA9ICgoSUNvbXBpbGF0aW9uVW5pdCkgbW92ZWQpLmdldENoaWxkcmVuKCk7Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNoaWxkcmVuLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJaWYgKGNoaWxkcmVuW2pdLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT04pIHsKLQkJCQkJCQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIG5vdCBmaW5kIHBhY2thZ2UgZGVjbCIsIGZhbHNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbiA9ICgoSUNvbXBpbGF0aW9uVW5pdCkgbW92ZWQpLmdldENoaWxkcmVuKCk7Ci0JCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjaGlsZHJlbi5sZW5ndGg7IGorKykgewotCQkJCQkJaWYgKGNoaWxkcmVuW2pdIGluc3RhbmNlb2YgSVBhY2thZ2VEZWNsYXJhdGlvbikgewotCQkJCQkJCWFzc2VydFRydWUoInBhY2thZ2UgZGVjbGFyYXRpb24gaW5jb3JyZWN0IiwgKChJUGFja2FnZURlY2xhcmF0aW9uKSBjaGlsZHJlbltqXSkuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoY29udGFpbmVyLmdldEVsZW1lbnROYW1lKCkpKTsKLQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYXNzZXJ0VHJ1ZSgiRGlkIG5vdCBmaW5kIHBhY2thZ2UgZGVjbCIsIGZvdW5kKTsKLQkJCQl9Ci0JCQl9Ci0JCQlJSmF2YUVsZW1lbnREZWx0YSBkZXN0RGVsdGEgPSBudWxsOwotCQkJaWYgKGlzTWFpblR5cGUoZWxlbWVudCwgZGVzdGluYXRpb25zW2ldKSAmJiBuYW1lcyAhPSBudWxsICYmIG5hbWVzW2ldICE9IG51bGwpIHsgLy9tb3ZlZC9yZW5hbWVkIG1haW4gdHlwZSB0byBzYW1lIGN1Ci0JCQkJZGVzdERlbHRhID0gZ2V0RGVsdGFGb3IobW92ZWQuZ2V0UGFyZW50KCkpOwotCQkJCWFzc2VydFRydWUoIlJlbmFtZWQgY29tcGlsYXRpb24gdW5pdCBhcyByZXN1bHQgb2YgbWFpbiB0eXBlIG5vdCBhZGRlZCIsIGRlc3REZWx0YSAhPSBudWxsICYmIGRlc3REZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQURERUQpOwotCQkJCUlKYXZhRWxlbWVudERlbHRhW10gZGVsdGFzID0gZGVzdERlbHRhLmdldEFkZGVkQ2hpbGRyZW4oKTsKLQkJCQlhc3NlcnRUcnVlKCJBZGRlZCBjaGlsZHJlbiBub3QgY29ycmVjdCBmb3IgZWxlbWVudCBjb3B5IiwgZGVsdGFzWzBdLmdldEVsZW1lbnQoKS5lcXVhbHMobW92ZWQpKTsKLQkJCQlhc3NlcnRUcnVlKCJmbGFnIHNob3VsZCBiZSBGX01PVkVEX0ZST00iLCAoZGVsdGFzWzBdLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX01PVkVEX0ZST00pID4gMCk7Ci0JCQkJYXNzZXJ0VHJ1ZSgibW92ZWQgZnJvbSBoYW5kbGUgc2hvdWxkIGJlIG9yaWdpbmFsIiwgZGVsdGFzWzBdLmdldE1vdmVkRnJvbUVsZW1lbnQoKS5lcXVhbHMoZWxlbWVudCkpOwotCQkJfSBlbHNlIHsKLQkJCQlkZXN0RGVsdGEgPSBnZXREZWx0YUZvcihkZXN0aW5hdGlvbnNbaV0sIHRydWUpOwotCQkJCWFzc2VydFRydWUoIkRlc3RpbmF0aW9uIGNvbnRhaW5lciBub3QgY2hhbmdlZCIsIGRlc3REZWx0YSAhPSBudWxsICYmIGRlc3REZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQ0hBTkdFRCk7Ci0JCQkJSUphdmFFbGVtZW50RGVsdGFbXSBkZWx0YXMgPSBkZXN0RGVsdGEuZ2V0QWRkZWRDaGlsZHJlbigpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZGVsdGFzLmxlbmd0aCAtIDE7IGorKykgewotCQkJCQkvLyBzaWRlIGVmZmVjdCBwYWNrYWdlcyBhZGRlZAotCQkJCQlJSmF2YUVsZW1lbnQgcGtnID0gZGVsdGFzW2pdLmdldEVsZW1lbnQoKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiU2lkZSBlZmZlY3QgY2hpbGQgc2hvdWxkIGJlIGEgcGFja2FnZSBmcmFnbWVudCIsIHBrZy5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiU2lkZSBlZmZlY3QgY2hpbGQgc2hvdWxkIGJlIGFuIGVuY2xvc2luZyBwYWNrYWdlIiwgZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLnN0YXJ0c1dpdGgocGtnLmdldEVsZW1lbnROYW1lKCkpKTsKLQkJCQl9Ci0JCQkJSUphdmFFbGVtZW50RGVsdGEgcGtnRGVsdGEgPSBkZWx0YXNbZGVsdGFzLmxlbmd0aCAtIDFdOwotCQkJCWFzc2VydFRydWUoIkFkZGVkIGNoaWxkcmVuIG5vdCBjb3JyZWN0IGZvciBlbGVtZW50IGNvcHkiLCBwa2dEZWx0YS5nZXRFbGVtZW50KCkuZXF1YWxzKG1vdmVkKSk7Ci0JCQkJYXNzZXJ0VHJ1ZSgiZmxhZyBzaG91bGQgYmUgRl9NT1ZFRF9GUk9NIiwgKHBrZ0RlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX01PVkVEX0ZST00pID4gMCk7Ci0JCQkJYXNzZXJ0VHJ1ZSgibW92ZWQgZnJvbSBoYW5kbGUgc2hvdWQgYmUgb3JpZ2luYWwiLCBwa2dEZWx0YS5nZXRNb3ZlZEZyb21FbGVtZW50KCkuZXF1YWxzKGVsZW1lbnQpKTsKLQkJCQlJSmF2YUVsZW1lbnREZWx0YSBzb3VyY2VEZWx0YSA9IGdldERlbHRhRm9yKGVsZW1lbnQsIHRydWUpOwotCQkJCWFzc2VydFRydWUoIm1vdmVkIHRvIGhhbmRsZSBzaG91bGQgYmUgb3JpZ2luYWwiLCBzb3VyY2VEZWx0YS5nZXRNb3ZlZFRvRWxlbWVudCgpLmVxdWFscyhtb3ZlZCkpOwotCQkJfQotCQl9Ci0JfSBmaW5hbGx5IHsKLQkJc3RvcERlbHRhcygpOwotCX0KLX0KLS8qKgotICogU2V0dXAgZm9yIHRoZSBuZXh0IHRlc3QuCi0gKi8KLXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQkKLQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIiwgInNyYzIifSwgImJpbiIpOwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCXJldHVybiBuZXcgU3VpdGUoQ29weU1vdmVSZXNvdXJjZXNUZXN0cy5jbGFzcyk7Ci19Ci0vKioKLSAqIENsZWFudXAgYWZ0ZXIgdGhlIHByZXZpb3VzIHRlc3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JCi0Jc3VwZXIudGVhckRvd24oKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgQ1UgY2FuIGJlIGNvcGllZCB0byBhIGRpZmZlcmVudCBwYWNrYWdlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29weUNVKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuY3JlYXRlRm9sZGVyKCIvUC9zcmMvcDEiKTsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvcDEvWC5qYXZhIiwKLQkJInBhY2thZ2UgcDE7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkifSIKLQkpOwotCUlDb21waWxhdGlvblVuaXQgY3VTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9wMS9YLmphdmEiKTsKLQotCXRoaXMuY3JlYXRlRm9sZGVyKCIvUC9zcmMvcDIiKTsKLQlJUGFja2FnZUZyYWdtZW50IHBrZ0Rlc3QgPSBnZXRQYWNrYWdlKCIvUC9zcmMvcDIiKTsKLQotCWNvcHlQb3NpdGl2ZShjdVNvdXJjZSwgcGtnRGVzdCwgbnVsbCwgbnVsbCwgZmFsc2UpOwotCQotCUlDb21waWxhdGlvblVuaXQgY3U9IHBrZ0Rlc3QuZ2V0Q29tcGlsYXRpb25Vbml0KCJYLmphdmEiKTsKLQlhc3NlcnRUcnVlKCJQYWNrYWdlIGRlY2xhcmF0aW9uIG5vdCB1cGRhdGVkIGZvciBjb3BpZWQgY3UiLCBjdS5nZXRQYWNrYWdlRGVjbGFyYXRpb24oInAyIikuZXhpc3RzKCkpOwotfQotLyoqCi0gKiBUaGlzIG9wZXJhdGlvbiBzaG91bGQgZmFpbCBhcyBjb3B5aW5nIGEgQ1UgYW5kIGEgQ1UgbWVtYmVyIGF0IHRoZQotICogc2FtZSB0aW1lIGlzIG5vdCBzdXBwb3J0ZWQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb3B5Q1VBbmRUeXBlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuY3JlYXRlRm9sZGVyKCIvUC9zcmMvcDEiKTsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvcDEvWC5qYXZhIiwKLQkJInBhY2thZ2UgcDE7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkifSIKLQkpOwotCUlDb21waWxhdGlvblVuaXQgY3VTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9wMS9YLmphdmEiKTsKLQotCWNvcHlOZWdhdGl2ZSgKLQkJbmV3IElKYXZhRWxlbWVudFtde2N1U291cmNlLCBjdVNvdXJjZS5nZXRUeXBlKCJYIil9LCAKLQkJbmV3IElKYXZhRWxlbWVudFtde2N1U291cmNlLmdldFBhcmVudCgpLCBjdVNvdXJjZX0sIAotCQludWxsLCAKLQkJbmV3IFN0cmluZ1tdeyJZLmphdmEiLCAiWSJ9LCAKLQkJZmFsc2UsIAotCQlJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfRUxFTUVOVF9UWVBFUyk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIENVIGNhbiBiZSBjb3BpZWQgdG8gYSBkaWZmZXJlbnQgcGFja2FnZSwgcmVwbGFjaW5nIGFuIGV4aXN0aW5nIENVLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29weUNVRm9yY2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy9wMSIpOwotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9wMS9YLmphdmEiLAotCQkicGFja2FnZSBwMTtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSJ9IgotCSk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL3AxL1guamF2YSIpOwotCi0JdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy9wMiIpOwotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9wMi9YLmphdmEiLAotCQkicGFja2FnZSBwMjtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSJ9IgotCSk7Ci0JSVBhY2thZ2VGcmFnbWVudCBwa2dEZXN0ID0gZ2V0UGFja2FnZSgiL1Avc3JjL3AyIik7Ci0KLQljb3B5UG9zaXRpdmUoY3VTb3VyY2UsIHBrZ0Rlc3QsIG51bGwsIG51bGwsIHRydWUpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBDVSBjYW4gYmUgY29waWVkIHRvIGEgZGlmZmVyZW50IHBhY2thZ2UsCi0gKiBhbmQgYmUgcmVuYW1lZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlDVVJlbmFtZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjL3AxIik7Ci0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL3AxL1guamF2YSIsCi0JCSJwYWNrYWdlIHAxO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIn0iCi0JKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1U291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvcDEvWC5qYXZhIik7Ci0KLQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjL3AyIik7Ci0JSVBhY2thZ2VGcmFnbWVudCBwa2dEZXN0ID0gZ2V0UGFja2FnZSgiL1Avc3JjL3AyIik7Ci0KLQljb3B5UG9zaXRpdmUoY3VTb3VyY2UsIHBrZ0Rlc3QsIG51bGwsICJZLmphdmEiLCBmYWxzZSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIENVIGNhbiBiZSBjb3BpZWQgdG8gYSBkaWZmZXJlbnQgcGFja2FnZSwKLSAqIGFuZCBiZSByZW5hbWVkLCBvdmVyd3JpdGluZyBhbiBleGlzdGluZyBDVQotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29weUNVUmVuYW1lRm9yY2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy9wMSIpOwotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9wMS9YLmphdmEiLAotCQkicGFja2FnZSBwMTtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSJ9IgotCSk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL3AxL1guamF2YSIpOwotCi0JdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy9wMiIpOwotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9wMi9ZLmphdmEiLAotCQkicGFja2FnZSBwMjtcbiIgKwotCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCSJ9IgotCSk7Ci0JSVBhY2thZ2VGcmFnbWVudCBwa2dEZXN0ID0gZ2V0UGFja2FnZSgiL1Avc3JjL3AyIik7Ci0KLQljb3B5UG9zaXRpdmUoY3VTb3VyY2UsIHBrZ0Rlc3QsIG51bGwsICJZLmphdmEiLCB0cnVlKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgQ1UgY2Fubm90IGJlIGNvcGllZCB0byBhIGRpZmZlcmVudCBwYWNrYWdlLG92ZXIgYW4gZXhpc3RpbmcgQ1Ugd2hlbiBubyBmb3JjZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlDVVdpdGhDb2xsaXNpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy9wMSIpOwotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9wMS9YLmphdmEiLAotCQkicGFja2FnZSBwMTtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSJ9IgotCSk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL3AxL1guamF2YSIpOwotCi0JdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy9wMiIpOwotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9wMi9YLmphdmEiLAotCQkicGFja2FnZSBwMjtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSJ9IgotCSk7Ci0JSVBhY2thZ2VGcmFnbWVudCBwa2dEZXN0ID0gZ2V0UGFja2FnZSgiL1Avc3JjL3AyIik7Ci0KLQljb3B5TmVnYXRpdmUoY3VTb3VyY2UsIHBrZ0Rlc3QsIG51bGwsIG51bGwsIGZhbHNlLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5BTUVfQ09MTElTSU9OKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgQ1UgY2Fubm90IGJlIGNvcGllZCB0byBhbiBpbnZhbGlkIGRlc3RpbmF0aW9uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb3B5Q1VXaXRoSW52YWxpZERlc3RpbmF0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuY3JlYXRlRm9sZGVyKCIvUC9zcmMvcDEiKTsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvcDEvWC5qYXZhIiwKLQkJInBhY2thZ2UgcDE7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkifSIKLQkpOwotCUlDb21waWxhdGlvblVuaXQgY3VTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9wMS9YLmphdmEiKTsKLQotCWNvcHlOZWdhdGl2ZShjdVNvdXJjZSwgY3VTb3VyY2UsIG51bGwsIG51bGwsIGZhbHNlLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfREVTVElOQVRJT04pOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBDVSBjYW4gYmUgY29waWVkIHRvIGEgbnVsbCBjb250YWluZXIKLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlDVVdpdGhOdWxsQ29udGFpbmVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuY3JlYXRlRm9sZGVyKCIvUC9zcmMvcDEiKTsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvcDEvWC5qYXZhIiwKLQkJInBhY2thZ2UgcDE7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkifSIKLQkpOwotCUlDb21waWxhdGlvblVuaXQgY3VTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9wMS9YLmphdmEiKTsKLQotCXRyeSB7Ci0JCWN1U291cmNlLmNvcHkobnVsbCwgbnVsbCwgbnVsbCwgZmFsc2UsIG51bGwpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLQkJcmV0dXJuOwotCX0KLQlhc3NlcnRUcnVlKCJTaG91bGQgbm90IGJlIGFibGUgdG8gbW92ZSBhIGN1IHRvIGEgbnVsbCBjb250YWluZXIiLCBmYWxzZSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIENVIGNhbiBiZSBjb3BpZWQgdG8gYWxvbmcgd2l0aCBpdHMgc2VydmVyIHByb3BlcnRpZXMuCi0gKiAoUmVncmVzc2lvbiB0ZXN0IGZvciBQUiAjMUc1NlFUOSkKLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlDVVdpdGhTZXJ2ZXJQcm9wZXJ0aWVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuY3JlYXRlRm9sZGVyKCIvUC9zcmMvcDEiKTsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvcDEvWC5qYXZhIiwKLQkJInBhY2thZ2UgcDE7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkifSIKLQkpOwotCUlDb21waWxhdGlvblVuaXQgY3VTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9wMS9YLmphdmEiKTsKLQotCVF1YWxpZmllZE5hbWUgcXVhbGlmaWVkTmFtZSA9IG5ldyBRdWFsaWZpZWROYW1lKCJ4LnkueiIsICJhIHByb3BlcnR5Iik7Ci0JY3VTb3VyY2UuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkuc2V0UGVyc2lzdGVudFByb3BlcnR5KAotCQlxdWFsaWZpZWROYW1lLAotCQkic29tZSB2YWx1ZSIpOwotCi0JdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy9wMiIpOwotCUlQYWNrYWdlRnJhZ21lbnQgcGtnRGVzdCA9IGdldFBhY2thZ2UoIi9QL3NyYy9wMiIpOwotCi0JY29weVBvc2l0aXZlKGN1U291cmNlLCBwa2dEZXN0LCBudWxsLCBudWxsLCBmYWxzZSk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdT0gcGtnRGVzdC5nZXRDb21waWxhdGlvblVuaXQoIlguamF2YSIpOwotCVN0cmluZyBwcm9wZXJ0eVZhbHVlID0gY3UuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkuZ2V0UGVyc2lzdGVudFByb3BlcnR5KHF1YWxpZmllZE5hbWUpOwotCWFzc2VydEVxdWFscygKLQkJIlNlcnZlciBwcm9wZXJ0eSBzaG91bGQgYmUgY29waWVkIHdpdGggY3UiLAotCQkic29tZSB2YWx1ZSIsCi0JCXByb3BlcnR5VmFsdWUKLQkpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBwYWNrYWdlIGZyYWdtZW50IGNhbiBiZSBjb3BpZWQgdG8gYSBkaWZmZXJlbnQgcGFja2FnZSBmcmFnbWVudCByb290LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29weVBhY2thZ2VGcmFnbWVudCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjL3AxIik7Ci0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL3AxL1guamF2YSIsCi0JCSJwYWNrYWdlIHAxO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIn0iCi0JKTsKLQlJUGFja2FnZUZyYWdtZW50IHBrZ1NvdXJjZSA9IGdldFBhY2thZ2UoIi9QL3NyYy9wMSIpOwotCi0JSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdERlc3Q9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoIlAiLCAic3JjMiIpOwotCi0JY29weVBvc2l0aXZlKHBrZ1NvdXJjZSwgcm9vdERlc3QsIG51bGwsIG51bGwsIGZhbHNlKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgcGFja2FnZSBmcmFnbWVudCBjYW4gYmUgY29waWVkIHRvIGEgZGlmZmVyZW50IHBhY2thZ2UgZnJhZ21lbnQgcm9vdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlSZWFkT25seVBhY2thZ2VGcmFnbWVudCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjL3AxL3AyL3AzIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvcDEvcDIvcDMvWC5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxLnAyLnAzO1xuIiArCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkifSIKLQkJKTsKLQkJZ2V0RmlsZSgiL1Avc3JjL3AxL3AyL3AzL1guamF2YSIpLnNldFJlYWRPbmx5KHRydWUpOwotCQlJUGFja2FnZUZyYWdtZW50IHBrZ1NvdXJjZSA9IGdldFBhY2thZ2UoIi9QL3NyYy9wMSIpOwotCQlwa2dTb3VyY2UuZ2V0UmVzb3VyY2UoKS5zZXRSZWFkT25seSh0cnVlKTsKLQkJSVBhY2thZ2VGcmFnbWVudCBwa2cyID0gZ2V0UGFja2FnZSgiL1Avc3JjL3AxL3AyL3AzIik7Ci0JCXBrZzIuZ2V0UmVzb3VyY2UoKS5zZXRSZWFkT25seSh0cnVlKTsKLQkKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdERlc3Q9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoIlAiLCAic3JjMiIpOwotCQotCQljb3B5UG9zaXRpdmUocGtnMiwgcm9vdERlc3QsIG51bGwsIG51bGwsIGZhbHNlKTsKLQkJCi0JCWFzc2VydFRydWUoIk5vdCByZWFkT25seSIsIGdldFBhY2thZ2UoIi9QL3NyYzIvcDEiKS5nZXRSZXNvdXJjZSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUoIklzIHJlYWRPbmx5IiwgIWdldFBhY2thZ2UoIi9QL3NyYzIvcDEvcDIiKS5nZXRSZXNvdXJjZSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUoIk5vdCByZWFkT25seSIsIGdldFBhY2thZ2UoIi9QL3NyYzIvcDEvcDIvcDMiKS5nZXRSZXNvdXJjZSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUoIklzIHJlYWRPbmx5IiwgZ2V0RmlsZSgiL1Avc3JjMi9wMS9wMi9wMy9YLmphdmEiKS5pc1JlYWRPbmx5KCkpOwotCX0gZmluYWxseSB7Ci0JCWRlbGV0ZUZvbGRlcigiL1Avc3JjL3AxIik7Ci0JfQotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBXb3JraW5nQ29weSBjYW4gYmUgY29waWVkIHRvIGEgZGlmZmVyZW50IHBhY2thZ2UuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb3B5V29ya2luZ0NvcHkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjb3B5ID0gbnVsbDsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjL3AxIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvcDEvWC5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxO1xuIiArCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL3AxL1guamF2YSIpOwotCQljb3B5ID0gKElDb21waWxhdGlvblVuaXQpY3VTb3VyY2UuZ2V0V29ya2luZ0NvcHkoKTsKLQkKLQkJdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy9wMiIpOwotCQlJUGFja2FnZUZyYWdtZW50IHBrZ0Rlc3QgPSBnZXRQYWNrYWdlKCIvUC9zcmMvcDIiKTsKLQkKLQkJY29weVBvc2l0aXZlKGNvcHksIHBrZ0Rlc3QsIG51bGwsIG51bGwsIGZhbHNlKTsKLQl9IGZpbmFsbHkgewotCQlpZiAoY29weSAhPSBudWxsKSBjb3B5LmRlc3Ryb3koKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIFdvcmtpbmdDb3B5IGNhbiBiZSBjb3BpZWQgdG8gYSBkaWZmZXJlbnQgcGFja2FnZSwgcmVwbGFjaW5nIGFuIGV4aXN0aW5nIFdvcmtpbmdDb3B5LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29weVdvcmtpbmdDb3B5Rm9yY2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjb3B5ID0gbnVsbDsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjL3AxIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvcDEvWC5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxO1xuIiArCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL3AxL1guamF2YSIpOwotCQljb3B5ID0gKElDb21waWxhdGlvblVuaXQpY3VTb3VyY2UuZ2V0V29ya2luZ0NvcHkoKTsKLQkKLQkJdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy9wMiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1Avc3JjL3AyL1guamF2YSIsCi0JCQkicGFja2FnZSBwMjtcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlQYWNrYWdlRnJhZ21lbnQgcGtnRGVzdCA9IGdldFBhY2thZ2UoIi9QL3NyYy9wMiIpOwotCQotCQljb3B5UG9zaXRpdmUoY29weSwgcGtnRGVzdCwgbnVsbCwgbnVsbCwgdHJ1ZSk7Ci0JfSBmaW5hbGx5IHsKLQkJaWYgKGNvcHkgIT0gbnVsbCkgY29weS5kZXN0cm95KCk7Ci0JfQotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBXb3JraW5nQ29weSBjYW4gYmUgY29waWVkIHRvIGEgZGlmZmVyZW50IHBhY2thZ2UsCi0gKiBhbmQgYmUgcmVuYW1lZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlXb3JraW5nQ29weVJlbmFtZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlJQ29tcGlsYXRpb25Vbml0IGNvcHkgPSBudWxsOwotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlRm9sZGVyKCIvUC9zcmMvcDEiKTsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QL3NyYy9wMS9YLmphdmEiLAotCQkJInBhY2thZ2UgcDE7XG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1U291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvcDEvWC5qYXZhIik7Ci0JCWNvcHkgPSAoSUNvbXBpbGF0aW9uVW5pdCljdVNvdXJjZS5nZXRXb3JraW5nQ29weSgpOwotCQotCQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjL3AyIik7Ci0JCUlQYWNrYWdlRnJhZ21lbnQgcGtnRGVzdCA9IGdldFBhY2thZ2UoIi9QL3NyYy9wMiIpOwotCQotCQljb3B5UG9zaXRpdmUoY29weSwgcGtnRGVzdCwgbnVsbCwgIlkuamF2YSIsIGZhbHNlKTsKLQl9IGZpbmFsbHkgewotCQlpZiAoY29weSAhPSBudWxsKSBjb3B5LmRlc3Ryb3koKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIFdvcmtpbmdDb3B5IGNhbiBiZSBjb3BpZWQgdG8gYSBkaWZmZXJlbnQgcGFja2FnZSwKLSAqIGFuZCBiZSByZW5hbWVkLCBvdmVyd3JpdGluZyBhbiBleGlzdGluZyBXb3JraW5nQ29weQotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29weVdvcmtpbmdDb3B5UmVuYW1lRm9yY2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjb3B5ID0gbnVsbDsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjL3AxIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvcDEvWC5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxO1xuIiArCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL3AxL1guamF2YSIpOwotCQljb3B5ID0gKElDb21waWxhdGlvblVuaXQpY3VTb3VyY2UuZ2V0V29ya2luZ0NvcHkoKTsKLQkKLQkJdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy9wMiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1Avc3JjL3AyL1kuamF2YSIsCi0JCQkicGFja2FnZSBwMjtcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBZIHtcbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlQYWNrYWdlRnJhZ21lbnQgcGtnRGVzdCA9IGdldFBhY2thZ2UoIi9QL3NyYy9wMiIpOwotCQotCQljb3B5UG9zaXRpdmUoY29weSwgcGtnRGVzdCwgbnVsbCwgIlkuamF2YSIsIHRydWUpOwotCX0gZmluYWxseSB7Ci0JCWlmIChjb3B5ICE9IG51bGwpIGNvcHkuZGVzdHJveSgpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgV29ya2luZ0NvcHkgY2Fubm90IGJlIGNvcGllZCB0byBhIGRpZmZlcmVudCBwYWNrYWdlLG92ZXIgYW4gZXhpc3RpbmcgV29ya2luZ0NvcHkgd2hlbiBubyBmb3JjZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlXb3JraW5nQ29weVdpdGhDb2xsaXNpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjb3B5ID0gbnVsbDsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjL3AxIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvcDEvWC5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxO1xuIiArCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL3AxL1guamF2YSIpOwotCQljb3B5ID0gKElDb21waWxhdGlvblVuaXQpY3VTb3VyY2UuZ2V0V29ya2luZ0NvcHkoKTsKLQkKLQkJdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy9wMiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1Avc3JjL3AyL1guamF2YSIsCi0JCQkicGFja2FnZSBwMjtcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlQYWNrYWdlRnJhZ21lbnQgcGtnRGVzdCA9IGdldFBhY2thZ2UoIi9QL3NyYy9wMiIpOwotCQotCQljb3B5TmVnYXRpdmUoY29weSwgcGtnRGVzdCwgbnVsbCwgbnVsbCwgZmFsc2UsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTkFNRV9DT0xMSVNJT04pOwotCX0gZmluYWxseSB7Ci0JCWlmIChjb3B5ICE9IG51bGwpIGNvcHkuZGVzdHJveSgpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgV29ya2luZ0NvcHkgY2Fubm90IGJlIGNvcGllZCB0byBhbiBpbnZhbGlkIGRlc3RpbmF0aW9uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb3B5V29ya2luZ0NvcHlXaXRoSW52YWxpZERlc3RpbmF0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUlDb21waWxhdGlvblVuaXQgY29weSA9IG51bGw7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy9wMSIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1Avc3JjL3AxL1guamF2YSIsCi0JCQkicGFja2FnZSBwMTtcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3VTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9wMS9YLmphdmEiKTsKLQkJY29weSA9IChJQ29tcGlsYXRpb25Vbml0KWN1U291cmNlLmdldFdvcmtpbmdDb3B5KCk7Ci0JCi0JCWNvcHlOZWdhdGl2ZShjb3B5LCBjdVNvdXJjZSwgbnVsbCwgbnVsbCwgZmFsc2UsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9ERVNUSU5BVElPTik7Ci0JfSBmaW5hbGx5IHsKLQkJaWYgKGNvcHkgIT0gbnVsbCkgY29weS5kZXN0cm95KCk7Ci0JfQotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBDVSBjYW4gYmUgbW92ZWQgdG8gYSBkaWZmZXJlbnQgcGFja2FnZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdE1vdmVDVSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjL3AxIik7Ci0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL3AxL1guamF2YSIsCi0JCSJwYWNrYWdlIHAxO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIn0iCi0JKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1U291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvcDEvWC5qYXZhIik7Ci0KLQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjL3AyIik7Ci0JSVBhY2thZ2VGcmFnbWVudCBwa2dEZXN0ID0gZ2V0UGFja2FnZSgiL1Avc3JjL3AyIik7Ci0KLQltb3ZlUG9zaXRpdmUoY3VTb3VyY2UsIHBrZ0Rlc3QsIG51bGwsIG51bGwsIGZhbHNlKTsKLQkKLQlJQ29tcGlsYXRpb25Vbml0IGN1PSBwa2dEZXN0LmdldENvbXBpbGF0aW9uVW5pdCgiWC5qYXZhIik7Ci0JYXNzZXJ0VHJ1ZSgiUGFja2FnZSBkZWNsYXJhdGlvbiBub3QgdXBkYXRlZCBmb3IgY29waWVkIGN1IiwgY3UuZ2V0UGFja2FnZURlY2xhcmF0aW9uKCJwMiIpLmV4aXN0cygpKTsKLX0KLS8qKgotICogVGhpcyBvcGVyYXRpb24gc2hvdWxkIGZhaWwgYXMgbW92aW5nIGEgQ1UgYW5kIGEgQ1UgbWVtYmVyIGF0IHRoZQotICogc2FtZSB0aW1lIGlzIG5vdCBzdXBwb3J0ZWQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNb3ZlQ1VBbmRUeXBlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuY3JlYXRlRm9sZGVyKCIvUC9zcmMvcDEiKTsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvcDEvWC5qYXZhIiwKLQkJInBhY2thZ2UgcDE7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkifSIKLQkpOwotCUlDb21waWxhdGlvblVuaXQgY3VTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9wMS9YLmphdmEiKTsKLQotCW1vdmVOZWdhdGl2ZSgKLQkJbmV3IElKYXZhRWxlbWVudFtde2N1U291cmNlLCBjdVNvdXJjZS5nZXRUeXBlKCJYIil9LCAKLQkJbmV3IElKYXZhRWxlbWVudFtde2N1U291cmNlLmdldFBhcmVudCgpLCBjdVNvdXJjZX0sIAotCQludWxsLCAKLQkJbmV3IFN0cmluZ1tdeyJZLmphdmEiLCAiWSJ9LCAKLQkJZmFsc2UsIAotCQlJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfRUxFTUVOVF9UWVBFUyk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIENVIGNhbiBiZSBtb3ZlZCB0byBhIGRpZmZlcmVudCBwYWNrYWdlLCByZXBsYWNpbmcgYW4KLSAqIGV4aXN0aW5nIENVLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TW92ZUNVRm9yY2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy9wMSIpOwotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9wMS9YLmphdmEiLAotCQkicGFja2FnZSBwMTtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSJ9IgotCSk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL3AxL1guamF2YSIpOwotCi0JdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy9wMiIpOwotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9wMi9YLmphdmEiLAotCQkicGFja2FnZSBwMjtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSJ9IgotCSk7Ci0JSVBhY2thZ2VGcmFnbWVudCBwa2dEZXN0ID0gZ2V0UGFja2FnZSgiL1Avc3JjL3AyIik7Ci0KLQltb3ZlUG9zaXRpdmUoY3VTb3VyY2UsIHBrZ0Rlc3QsIG51bGwsIG51bGwsIHRydWUpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBDVSBjYW4gYmUgbW92ZWQgdG8gYSBkaWZmZXJlbnQgcGFja2FnZSwKLSAqIGJlIHJlbmFtZWQKLSAqLwotcHVibGljIHZvaWQgdGVzdE1vdmVDVVJlbmFtZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjL3AxIik7Ci0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL3AxL1guamF2YSIsCi0JCSJwYWNrYWdlIHAxO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIn0iCi0JKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1U291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvcDEvWC5qYXZhIik7Ci0KLQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjL3AyIik7Ci0JSVBhY2thZ2VGcmFnbWVudCBwa2dEZXN0ID0gZ2V0UGFja2FnZSgiL1Avc3JjL3AyIik7Ci0KLQltb3ZlUG9zaXRpdmUoY3VTb3VyY2UsIHBrZ0Rlc3QsIG51bGwsICJZLmphdmEiLCBmYWxzZSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIENVIGNhbiBiZSBtb3ZlZCB0byBhIGRpZmZlcmVudCBwYWNrYWdlLAotICogYmUgcmVuYW1lZCwgb3ZlcndyaXRpbmcgYW4gZXhpc3RpbmcgcmVzb3VyY2UuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNb3ZlQ1VSZW5hbWVGb3JjZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjL3AxIik7Ci0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL3AxL1guamF2YSIsCi0JCSJwYWNrYWdlIHAxO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIn0iCi0JKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1U291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvcDEvWC5qYXZhIik7Ci0KLQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjL3AyIik7Ci0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL3AyL1kuamF2YSIsCi0JCSJwYWNrYWdlIHAyO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWSB7XG4iICsKLQkJIn0iCi0JKTsKLQlJUGFja2FnZUZyYWdtZW50IHBrZ0Rlc3QgPSBnZXRQYWNrYWdlKCIvUC9zcmMvcDIiKTsKLQotCW1vdmVQb3NpdGl2ZShjdVNvdXJjZSwgcGtnRGVzdCwgbnVsbCwgIlkuamF2YSIsIHRydWUpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBDVSBjYW5ub3QgYmUgbW92ZWQgdG8gYSBkaWZmZXJlbnQgcGFja2FnZSwgcmVwbGFjaW5nIGFuCi0gKiBleGlzdGluZyBDVSB3aGVuIG5vdCBmb3JjZWQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNb3ZlQ1VXaXRoQ29sbGlzaW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuY3JlYXRlRm9sZGVyKCIvUC9zcmMvcDEiKTsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvcDEvWC5qYXZhIiwKLQkJInBhY2thZ2UgcDE7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkifSIKLQkpOwotCUlDb21waWxhdGlvblVuaXQgY3VTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9wMS9YLmphdmEiKTsKLQotCXRoaXMuY3JlYXRlRm9sZGVyKCIvUC9zcmMvcDIiKTsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvcDIvWC5qYXZhIiwKLQkJInBhY2thZ2UgcDI7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkifSIKLQkpOwotCUlQYWNrYWdlRnJhZ21lbnQgcGtnRGVzdCA9IGdldFBhY2thZ2UoIi9QL3NyYy9wMiIpOwotCi0JbW92ZU5lZ2F0aXZlKGN1U291cmNlLCBwa2dEZXN0LCBudWxsLCBudWxsLCBmYWxzZSwgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OQU1FX0NPTExJU0lPTik7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIENVIGNhbm5vdCBiZSBtb3ZlZCB0byBhbiBpbnZhbGlkIGRlc3RpbmF0aW9uLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TW92ZUNVV2l0aEludmFsaWREZXN0aW5hdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjL3AxIik7Ci0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL3AxL1guamF2YSIsCi0JCSJwYWNrYWdlIHAxO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIn0iCi0JKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1U291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvcDEvWC5qYXZhIik7Ci0KLQltb3ZlTmVnYXRpdmUoY3VTb3VyY2UsIGN1U291cmNlLCBudWxsLCBudWxsLCBmYWxzZSwgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0RFU1RJTkFUSU9OKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgQ1UgY2Fubm90IGJlIG1vdmVkIHRvIGEgbnVsbCBjb250YWluZXIKLSAqLwotcHVibGljIHZvaWQgdGVzdE1vdmVDVVdpdGhOdWxsQ29udGFpbmVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuY3JlYXRlRm9sZGVyKCIvUC9zcmMvcDEiKTsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvcDEvWC5qYXZhIiwKLQkJInBhY2thZ2UgcDE7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkifSIKLQkpOwotCUlDb21waWxhdGlvblVuaXQgY3VTb3VyY2UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9wMS9YLmphdmEiKTsKLQotCXRyeSB7Ci0JCWN1U291cmNlLm1vdmUobnVsbCwgbnVsbCwgbnVsbCwgZmFsc2UsIG51bGwpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLQkJcmV0dXJuOwotCX0KLQlhc3NlcnRUcnVlKCJTaG91bGQgbm90IGJlIGFibGUgdG8gbW92ZSBhIGN1IHRvIGEgbnVsbCBjb250YWluZXIiLCBmYWxzZSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIHBhY2thZ2UgZnJhZ21lbnQgY2FuIGJlIG1vdmVkIHRvIGEgZGlmZmVyZW50IHBhY2thZ2UgZnJhZ21lbnQgcm9vdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdE1vdmVQYWNrYWdlRnJhZ21lbnQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy9wMSIpOwotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9wMS9YLmphdmEiLAotCQkicGFja2FnZSBwMTtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSJ9IgotCSk7Ci0JSVBhY2thZ2VGcmFnbWVudCBwa2dTb3VyY2UgPSBnZXRQYWNrYWdlKCIvUC9zcmMvcDEiKTsKLQotCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3REZXN0PSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCJQIiwgInNyYzIiKTsKLQotCW1vdmVQb3NpdGl2ZShwa2dTb3VyY2UsIHJvb3REZXN0LCBudWxsLCBudWxsLCBmYWxzZSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIHBhY2thZ2UgZnJhZ21lbnQgY2FuIGJlIGNvcGllZCB0byBhIGRpZmZlcmVudCBwYWNrYWdlIGZyYWdtZW50IHJvb3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNb3ZlUmVhZE9ubHlQYWNrYWdlRnJhZ21lbnQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy9wMS9wMi9wMyIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1Avc3JjL3AxL3AyL3AzL1guamF2YSIsCi0JCQkicGFja2FnZSBwMS5wMi5wMztcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIn0iCi0JCSk7Ci0JCWdldEZpbGUoIi9QL3NyYy9wMS9wMi9wMy9YLmphdmEiKS5zZXRSZWFkT25seSh0cnVlKTsKLQkJSVBhY2thZ2VGcmFnbWVudCBwa2dTb3VyY2UgPSBnZXRQYWNrYWdlKCIvUC9zcmMvcDEiKTsKLQkJcGtnU291cmNlLmdldFJlc291cmNlKCkuc2V0UmVhZE9ubHkodHJ1ZSk7Ci0JCUlQYWNrYWdlRnJhZ21lbnQgcGtnMiA9IGdldFBhY2thZ2UoIi9QL3NyYy9wMS9wMi9wMyIpOwotCQlwa2cyLmdldFJlc291cmNlKCkuc2V0UmVhZE9ubHkodHJ1ZSk7Ci0JCi0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3REZXN0PSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCJQIiwgInNyYzIiKTsKLQkKLQkJbW92ZVBvc2l0aXZlKHBrZzIsIHJvb3REZXN0LCBudWxsLCBudWxsLCBmYWxzZSk7Ci0JCQotCQlhc3NlcnRUcnVlKCJOb3QgcmVhZE9ubHkiLCBnZXRQYWNrYWdlKCIvUC9zcmMyL3AxIikuZ2V0UmVzb3VyY2UoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKCJJcyByZWFkT25seSIsICFnZXRQYWNrYWdlKCIvUC9zcmMyL3AxL3AyIikuZ2V0UmVzb3VyY2UoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKCJOb3QgcmVhZE9ubHkiLCBnZXRQYWNrYWdlKCIvUC9zcmMyL3AxL3AyL3AzIikuZ2V0UmVzb3VyY2UoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKCJJcyByZWFkT25seSIsIGdldEZpbGUoIi9QL3NyYzIvcDEvcDIvcDMvWC5qYXZhIikuaXNSZWFkT25seSgpKTsKLQl9IGZpbmFsbHkgewotCQlkZWxldGVGb2xkZXIoIi9QL3NyYy9wMSIpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgV29ya2luZ0NvcHkgY2Fubm90IGJlIG1vdmVkIHRvIGEgZGlmZmVyZW50IHBhY2thZ2UuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNb3ZlV29ya2luZ0NvcHkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjb3B5ID0gbnVsbDsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjL3AxIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvcDEvWC5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxO1xuIiArCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdVNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL3AxL1guamF2YSIpOwotCQljb3B5ID0gKElDb21waWxhdGlvblVuaXQpY3VTb3VyY2UuZ2V0V29ya2luZ0NvcHkoKTsKLQkKLQkJdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy9wMiIpOwotCQlJUGFja2FnZUZyYWdtZW50IHBrZ0Rlc3QgPSBnZXRQYWNrYWdlKCIvUC9zcmMvcDIiKTsKLQkKLQkJbW92ZU5lZ2F0aXZlKGNvcHksIHBrZ0Rlc3QsIG51bGwsIG51bGwsIGZhbHNlLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfRUxFTUVOVF9UWVBFUyk7Ci0JfSBmaW5hbGx5IHsKLQkJaWYgKGNvcHkgIT0gbnVsbCkgY29weS5kZXN0cm95KCk7Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0NvcHlNb3ZlVGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9Db3B5TW92ZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NjJkYzYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0NvcHlNb3ZlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIENvcHlNb3ZlVGVzdHMgZXh0ZW5kcyBNb2RpZnlpbmdSZXNvdXJjZVRlc3RzIHsKLXB1YmxpYyBDb3B5TW92ZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0vKioKLSAqIEF0dGVtcHRzIHRvIGNvcHkgdGhlIGVsZW1lbnQgd2l0aCBvcHRpb25hbCAKLSAqIGZvcmNpbmcuIFRoZSBvcGVyYXRpb24gc2hvdWxkIGZhaWwgd2l0aCB0aGUgZmFpbHVyZSBjb2RlLgotICovCi1wdWJsaWMgdm9pZCBjb3B5TmVnYXRpdmUoSUphdmFFbGVtZW50IGVsZW1lbnQsIElKYXZhRWxlbWVudCBkZXN0aW5hdGlvbiwgSUphdmFFbGVtZW50IHNpYmxpbmcsIFN0cmluZyByZW5hbWUsIGJvb2xlYW4gZm9yY2UsIGludCBmYWlsdXJlQ29kZSkgewotCXRyeSB7Ci0JCSgoSVNvdXJjZU1hbmlwdWxhdGlvbillbGVtZW50KS5jb3B5KGRlc3RpbmF0aW9uLCBzaWJsaW5nLCByZW5hbWUsIGZvcmNlLCBudWxsKTsKLQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCWFzc2VydFRydWUoIkNvZGUgbm90IGNvcnJlY3QgZm9yIEphdmFNb2RlbEV4Y2VwdGlvbjogIiArIGptZSwgam1lLmdldFN0YXR1cygpLmdldENvZGUoKSA9PSBmYWlsdXJlQ29kZSk7Ci0JCXJldHVybjsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiVGhlIGNvcHkgc2hvdWxkIGhhdmUgZmFpbGVkIGZvcjogIiArIGVsZW1lbnQsIGZhbHNlKTsKLQlyZXR1cm47Ci19Ci0vKioKLSAqIEF0dGVtcHRzIHRvIGNvcHkgdGhlIGVsZW1lbnRzIHdpdGggb3B0aW9uYWwgCi0gKiBmb3JjaW5nLiBUaGUgb3BlcmF0aW9uIHNob3VsZCBmYWlsIHdpdGggdGhlIGZhaWx1cmUgY29kZS4KLSAqLwotcHVibGljIHZvaWQgY29weU5lZ2F0aXZlKElKYXZhRWxlbWVudFtdIGVsZW1lbnRzLCBJSmF2YUVsZW1lbnRbXSBkZXN0aW5hdGlvbnMsIElKYXZhRWxlbWVudFtdIHNpYmxpbmdzLCBTdHJpbmdbXSByZW5hbWVzLCBib29sZWFuIGZvcmNlLCBpbnQgZmFpbHVyZUNvZGUpIHsKLQl0cnkgewotCQlnZXRKYXZhTW9kZWwoKS5jb3B5KGVsZW1lbnRzLCBkZXN0aW5hdGlvbnMsIHNpYmxpbmdzLCByZW5hbWVzLCBmb3JjZSwgbnVsbCk7Ci0JfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQlhc3NlcnRUcnVlKCJDb2RlIG5vdCBjb3JyZWN0IGZvciBKYXZhTW9kZWxFeGNlcHRpb246ICIgKyBqbWUsIGptZS5nZXRTdGF0dXMoKS5nZXRDb2RlKCkgPT0gZmFpbHVyZUNvZGUpOwotCQlyZXR1cm47Ci0JfQotCWFzc2VydFRydWUoIlRoZSBtb3ZlIHNob3VsZCBoYXZlIGZhaWxlZCBmb3IgZm9yIG11bHRpcGxlIGVsZW1lbnRzOiAiLCBmYWxzZSk7Ci0JcmV0dXJuOwotfQotLyoqCi0gKiBDb3BpZXMgdGhlIGVsZW1lbnQgdG8gdGhlIGNvbnRhaW5lciB3aXRoIG9wdGlvbmFsIHJlbmFtZQotICogYW5kIGZvcmNpbmcuIFRoZSBvcGVyYXRpb24gc2hvdWxkIHN1Y2NlZWQsIHNvIGFueSBleGNlcHRpb25zCi0gKiBlbmNvdW50ZXJlZCBhcmUgdGhyb3duLgotICovCi1wdWJsaWMgSUphdmFFbGVtZW50IGNvcHlQb3NpdGl2ZShJSmF2YUVsZW1lbnQgZWxlbWVudCwgSUphdmFFbGVtZW50IGNvbnRhaW5lciwgSUphdmFFbGVtZW50IHNpYmxpbmcsIFN0cmluZyByZW5hbWUsIGJvb2xlYW4gZm9yY2UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCS8vIGlmIGZvcmNpbmcsIGVuc3VyZSB0aGF0IGEgbmFtZSBjb2xsaXNpb24gZXhpc3RzCi0JaWYgKGZvcmNlKSB7Ci0JCUlKYXZhRWxlbWVudCBjb2xsaXNpb24gPSBnZW5lcmF0ZUhhbmRsZShlbGVtZW50LCByZW5hbWUsIGNvbnRhaW5lcik7Ci0JCWFzc2VydFRydWUoIkNvbGxpc2lvbiBkb2VzIG5vdCBleGlzdCIsIGNvbGxpc2lvbi5leGlzdHMoKSk7Ci0JfQotCi0JSUphdmFFbGVtZW50IGNvcHk7Ci0JdHJ5IHsKLQkJc3RhcnREZWx0YXMoKTsKLQkJCi0JCS8vIGNvcHkKLQkgCSgoSVNvdXJjZU1hbmlwdWxhdGlvbikgZWxlbWVudCkuY29weShjb250YWluZXIsIHNpYmxpbmcsIHJlbmFtZSwgZm9yY2UsIG51bGwpOwotCQotCQkvLyBlbnN1cmUgdGhlIG9yaWdpbmFsIGVsZW1lbnQgc3RpbGwgZXhpc3RzCi0JCWFzc2VydFRydWUoIlRoZSBvcmlnaW5hbCBlbGVtZW50IG11c3Qgc3RpbGwgZXhpc3QiLCBlbGVtZW50LmV4aXN0cygpKTsKLQkKLQkJLy8gZ2VuZXJhdGUgdGhlIG5ldyBlbGVtZW50CWhhbmRsZQotCQljb3B5ID0gZ2VuZXJhdGVIYW5kbGUoZWxlbWVudCwgcmVuYW1lLCBjb250YWluZXIpOwotCQlhc3NlcnRUcnVlKCJDb3B5IHNob3VsZCBleGlzdCIsIGNvcHkuZXhpc3RzKCkpOwotCQotCQkvL2Vuc3VyZSBjb3JyZWN0IHBvc2l0aW9uCi0JCWlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPiBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCkgewotCQkJZW5zdXJlQ29ycmVjdFBvc2l0aW9uaW5nKChJUGFyZW50KSBjb250YWluZXIsIHNpYmxpbmcsIGNvcHkpOwotCQl9IGVsc2UgewotCQkJaWYgKGNvbnRhaW5lci5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QpIHsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gZW5zdXJlIHBhY2thZ2UgbmFtZSBpcyBjb3JyZWN0Ci0JCQkJaWYgKGNvbnRhaW5lci5nZXRFbGVtZW50TmFtZSgpLmVxdWFscygiIikpIHsKLQkJCQkJLy8gZGVmYXVsdCBwYWNrYWdlIC0gc2hvdWxkIGJlIG5vIHBhY2thZ2UgZGVjbAotCQkJCQlJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbiA9ICgoSUNvbXBpbGF0aW9uVW5pdCkgY29weSkuZ2V0Q2hpbGRyZW4oKTsKLQkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAoY2hpbGRyZW5baV0gaW5zdGFuY2VvZiBJUGFja2FnZURlY2xhcmF0aW9uKSB7Ci0JCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWFzc2VydFRydWUoIlNob3VsZCBub3QgZmluZCBwYWNrYWdlIGRlY2wiLCAhZm91bmQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUlKYXZhRWxlbWVudFtdIGNoaWxkcmVuID0gKChJQ29tcGlsYXRpb25Vbml0KSBjb3B5KS5nZXRDaGlsZHJlbigpOwotCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmIChjaGlsZHJlbltpXSBpbnN0YW5jZW9mIElQYWNrYWdlRGVjbGFyYXRpb24pIHsKLQkJCQkJCQlhc3NlcnRUcnVlKCJwYWNrYWdlIGRlY2xhcmF0aW9uIGluY29ycmVjdCIsICgoSVBhY2thZ2VEZWNsYXJhdGlvbikgY2hpbGRyZW5baV0pLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKGNvbnRhaW5lci5nZXRFbGVtZW50TmFtZSgpKSk7Ci0JCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWFzc2VydFRydWUoIkRpZCBub3QgZmluZCBwYWNrYWdlIGRlY2wiLCBmb3VuZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUlKYXZhRWxlbWVudERlbHRhIGRlc3REZWx0YSA9IGdldERlbHRhRm9yKGNvbnRhaW5lciwgdHJ1ZSk7Ci0JCWFzc2VydFRydWUoIkRlc3RpbmF0aW9uIGNvbnRhaW5lciBub3QgY2hhbmdlZCIsIGRlc3REZWx0YSAhPSBudWxsICYmIGRlc3REZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQ0hBTkdFRCk7Ci0JCUlKYXZhRWxlbWVudERlbHRhW10gZGVsdGFzID0gZGVzdERlbHRhLmdldEFkZGVkQ2hpbGRyZW4oKTsKLQkJYXNzZXJ0VHJ1ZSgiQWRkZWQgY2hpbGRyZW4gbm90IGNvcnJlY3QgZm9yIGVsZW1lbnQgY29weSIsIGRlbHRhc1swXS5nZXRFbGVtZW50KCkuZXF1YWxzKGNvcHkpKTsKLQl9IGZpbmFsbHkgewotCQlzdG9wRGVsdGFzKCk7Ci0JfQotCXJldHVybiBjb3B5OwotfQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBuZXcgaGFuZGxlIHRvIHRoZSBvcmlnaW5hbCBlbGVtZW50IGluCi0gKiBpdHMgbmV3IGNvbnRhaW5lci4KLSAqLwotcHVibGljIElKYXZhRWxlbWVudCBnZW5lcmF0ZUhhbmRsZShJSmF2YUVsZW1lbnQgb3JpZ2luYWwsIFN0cmluZyByZW5hbWUsIElKYXZhRWxlbWVudCBjb250YWluZXIpIHsKLQlTdHJpbmcgbmFtZSA9IG9yaWdpbmFsLmdldEVsZW1lbnROYW1lKCk7Ci0JaWYgKHJlbmFtZSAhPSBudWxsKSB7Ci0JCW5hbWUgPSByZW5hbWU7Ci0JfQotCXN3aXRjaCAoY29udGFpbmVyLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UIDoKLQkJCXN3aXRjaCAob3JpZ2luYWwuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQgOgotCQkJCQlyZXR1cm4gKChJUGFja2FnZUZyYWdtZW50Um9vdCkgY29udGFpbmVyKS5nZXRQYWNrYWdlRnJhZ21lbnQobmFtZSk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWFzc2VydFRydWUoImlsbGVnYWwgY2hpbGQgdHlwZSIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVCA6Ci0JCQlzd2l0Y2ggKG9yaWdpbmFsLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCQljYXNlIElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUIDoKLQkJCQkJcmV0dXJuICgoSVBhY2thZ2VGcmFnbWVudCkgY29udGFpbmVyKS5nZXRDb21waWxhdGlvblVuaXQobmFtZSk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWFzc2VydFRydWUoImlsbGVnYWwgY2hpbGQgdHlwZSIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCA6Ci0JCQlzd2l0Y2ggKG9yaWdpbmFsLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCQljYXNlIElKYXZhRWxlbWVudC5JTVBPUlRfREVDTEFSQVRJT04gOgotCQkJCQlyZXR1cm4gKChJQ29tcGlsYXRpb25Vbml0KSBjb250YWluZXIpLmdldEltcG9ydChuYW1lKTsKLQkJCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OIDoKLQkJCQkJcmV0dXJuICgoSUNvbXBpbGF0aW9uVW5pdCkgY29udGFpbmVyKS5nZXRQYWNrYWdlRGVjbGFyYXRpb24obmFtZSk7Ci0JCQkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRSA6Ci0JCQkJCWlmIChpc01haW5UeXBlKG9yaWdpbmFsLCBjb250YWluZXIpKSB7Ci0JCQkJCQkvL3RoZSBjdSBoYXMgYmVlbiByZW5hbWVkIGFzIHdlbGwKLQkJCQkJCWNvbnRhaW5lciA9ICgoSVBhY2thZ2VGcmFnbWVudCkgY29udGFpbmVyLmdldFBhcmVudCgpKS5nZXRDb21waWxhdGlvblVuaXQobmFtZSArICIuamF2YSIpOwotCQkJCQl9Ci0JCQkJCXJldHVybiAoKElDb21waWxhdGlvblVuaXQpIGNvbnRhaW5lcikuZ2V0VHlwZShuYW1lKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJYXNzZXJ0VHJ1ZSgiaWxsZWdhbCBjaGlsZCB0eXBlIiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIElKYXZhRWxlbWVudC5UWVBFIDoKLQkJCXN3aXRjaCAob3JpZ2luYWwuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJCWNhc2UgSUphdmFFbGVtZW50Lk1FVEhPRCA6Ci0JCQkJCWlmIChuYW1lLmVxdWFscyhvcmlnaW5hbC5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpKSkgewotCQkJCQkJLy9tZXRob2QgaXMgYSBjb25zdHJ1Y3RvcgotCQkJCQkJcmV0dXJuICgoSVR5cGUpIGNvbnRhaW5lcikuZ2V0TWV0aG9kKGNvbnRhaW5lci5nZXRFbGVtZW50TmFtZSgpLCAoKElNZXRob2QpIG9yaWdpbmFsKS5nZXRQYXJhbWV0ZXJUeXBlcygpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiAoKElUeXBlKSBjb250YWluZXIpLmdldE1ldGhvZChuYW1lLCAoKElNZXRob2QpIG9yaWdpbmFsKS5nZXRQYXJhbWV0ZXJUeXBlcygpKTsKLQkJCQkJfQotCQkJCWNhc2UgSUphdmFFbGVtZW50LkZJRUxEIDoKLQkJCQkJcmV0dXJuICgoSVR5cGUpIGNvbnRhaW5lcikuZ2V0RmllbGQobmFtZSk7Ci0JCQkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRSA6Ci0JCQkJCXJldHVybiAoKElUeXBlKSBjb250YWluZXIpLmdldFR5cGUobmFtZSk7Ci0JCQkJY2FzZSBJSmF2YUVsZW1lbnQuSU5JVElBTElaRVIgOgotCQkJCQkvL2hhY2sgdG8gcmV0dXJuIHRoZSBmaXJzdCBpbml0aWFsaXplcgotCQkJCQlyZXR1cm4gKChJVHlwZSkgY29udGFpbmVyKS5nZXRJbml0aWFsaXplcigxKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJYXNzZXJ0VHJ1ZSgiaWxsZWdhbCBjaGlsZCB0eXBlIiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0IDoKLQkJCWFzc2VydFRydWUoInVuc3VwcG9ydGVkIGNvbnRhaW5lciB0eXBlIiwgZmFsc2UpOwotCQkJYnJlYWs7Ci0JfQotCWFzc2VydFRydWUoInNob3VsZCBub3QgZ2V0IGhlcmUiLCBmYWxzZSk7Ci0JcmV0dXJuIG51bGw7Ci19Ci0vKioKLSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGVsZW1lbnQgaXMgdGhlIG1haW4gdHlwZSBvZiBpdHMgY29tcGlsYXRpb24gdW5pdC4KLSAqLwotcHJvdGVjdGVkIGJvb2xlYW4gaXNNYWluVHlwZShJSmF2YUVsZW1lbnQgZWxlbWVudCwgSUphdmFFbGVtZW50IHBhcmVudCkgewotCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpIHsKLQkJCUlDb21waWxhdGlvblVuaXQgY3U9IChJQ29tcGlsYXRpb25Vbml0KXBhcmVudDsKLQkJCVN0cmluZyB0eXBlTmFtZSA9IGN1LmdldEVsZW1lbnROYW1lKCk7Ci0JCQl0eXBlTmFtZSA9IHR5cGVOYW1lLnN1YnN0cmluZygwLCB0eXBlTmFtZS5sZW5ndGgoKSAtIDUpOwotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHModHlwZU5hbWUpICYmIGVsZW1lbnQuZ2V0UGFyZW50KCkuZXF1YWxzKGN1KTsKLQkJfQotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0vKioKLSAqIEF0dGVtcHRzIHRvIG1vdmUgdGhlIGVsZW1lbnQgd2l0aCBvcHRpb25hbCAKLSAqIGZvcmNpbmcuIFRoZSBvcGVyYXRpb24gc2hvdWxkIGZhaWwgd2l0aCB0aGUgZmFpbHVyZSBjb2RlLgotICovCi1wdWJsaWMgdm9pZCBtb3ZlTmVnYXRpdmUoSUphdmFFbGVtZW50IGVsZW1lbnQsIElKYXZhRWxlbWVudCBkZXN0aW5hdGlvbiwgSUphdmFFbGVtZW50IHNpYmxpbmcsIFN0cmluZyByZW5hbWUsIGJvb2xlYW4gZm9yY2UsIGludCBmYWlsdXJlQ29kZSkgewotCXRyeSB7Ci0JCSgoSVNvdXJjZU1hbmlwdWxhdGlvbillbGVtZW50KS5tb3ZlKGRlc3RpbmF0aW9uLCBzaWJsaW5nLCByZW5hbWUsIGZvcmNlLCBudWxsKTsKLQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCWFzc2VydFRydWUoIkNvZGUgbm90IGNvcnJlY3QgZm9yIEphdmFNb2RlbEV4Y2VwdGlvbjogIiArIGptZSwgam1lLmdldFN0YXR1cygpLmdldENvZGUoKSA9PSBmYWlsdXJlQ29kZSk7Ci0JCXJldHVybjsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiVGhlIG1vdmUgc2hvdWxkIGhhdmUgZmFpbGVkIGZvcjogIiArIGVsZW1lbnQsIGZhbHNlKTsKLQlyZXR1cm47Ci19Ci0vKioKLSAqIEF0dGVtcHRzIHRvIG1vdmUgdGhlIGVsZW1lbnQgd2l0aCBvcHRpb25hbCAKLSAqIGZvcmNpbmcuIFRoZSBvcGVyYXRpb24gc2hvdWxkIGZhaWwgd2l0aCB0aGUgZmFpbHVyZSBjb2RlLgotICovCi1wdWJsaWMgdm9pZCBtb3ZlTmVnYXRpdmUoSUphdmFFbGVtZW50W10gZWxlbWVudHMsIElKYXZhRWxlbWVudFtdIGRlc3RpbmF0aW9ucywgSUphdmFFbGVtZW50W10gc2libGluZ3MsIFN0cmluZ1tdIHJlbmFtZXMsIGJvb2xlYW4gZm9yY2UsIGludCBmYWlsdXJlQ29kZSkgewotCXRyeSB7Ci0JCWdldEphdmFNb2RlbCgpLm1vdmUoZWxlbWVudHMsIGRlc3RpbmF0aW9ucywgc2libGluZ3MsIHJlbmFtZXMsIGZvcmNlLCBudWxsKTsKLQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCWFzc2VydFRydWUoIkNvZGUgbm90IGNvcnJlY3QgZm9yIEphdmFNb2RlbEV4Y2VwdGlvbjogIiArIGptZSwgam1lLmdldFN0YXR1cygpLmdldENvZGUoKSA9PSBmYWlsdXJlQ29kZSk7Ci0JCXJldHVybjsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiVGhlIG1vdmUgc2hvdWxkIGhhdmUgZmFpbGVkIGZvciBmb3IgbXVsdGlwbGUgZWxlbWVudHM6ICIsIGZhbHNlKTsKLQlyZXR1cm47Ci19Ci0vKioKLSAqIE1vdmVzIHRoZSBlbGVtZW50IHRvIHRoZSBjb250YWluZXIgd2l0aCBvcHRpb25hbCByZW5hbWUKLSAqIGFuZCBmb3JjaW5nLiBUaGUgb3BlcmF0aW9uIHNob3VsZCBzdWNjZWVkLCBzbyBhbnkgZXhjZXB0aW9ucwotICogZW5jb3VudGVyZWQgYXJlIHRocm93bi4KLSAqLwotcHVibGljIHZvaWQgbW92ZVBvc2l0aXZlKElKYXZhRWxlbWVudCBlbGVtZW50LCBJSmF2YUVsZW1lbnQgY29udGFpbmVyLCBJSmF2YUVsZW1lbnQgc2libGluZywgU3RyaW5nIHJlbmFtZSwgYm9vbGVhbiBmb3JjZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUphdmFFbGVtZW50W10gc2libGluZ3MgPSBuZXcgSUphdmFFbGVtZW50W10ge3NpYmxpbmd9OwotCVN0cmluZ1tdIHJlbmFtaW5ncyA9IG5ldyBTdHJpbmdbXSB7cmVuYW1lfTsKLQlpZiAoc2libGluZyA9PSBudWxsKSB7Ci0JCXNpYmxpbmdzID0gbnVsbDsKLQl9Ci0JaWYgKHJlbmFtZSA9PSBudWxsKSB7Ci0JCXJlbmFtaW5ncyA9IG51bGw7Ci0JfQotCW1vdmVQb3NpdGl2ZShuZXcgSUphdmFFbGVtZW50W10ge2VsZW1lbnR9LCBuZXcgSUphdmFFbGVtZW50W10ge2NvbnRhaW5lcn0sIHNpYmxpbmdzLCByZW5hbWluZ3MsIGZvcmNlKTsKLX0KLS8qKgotICogTW92ZXMgdGhlIGVsZW1lbnRzIHRvIHRoZSBjb250YWluZXJzIHdpdGggb3B0aW9uYWwgcmVuYW1pbmcKLSAqIGFuZCBmb3JjaW5nLiBUaGUgb3BlcmF0aW9uIHNob3VsZCBzdWNjZWVkLCBzbyBhbnkgZXhjZXB0aW9ucwotICogZW5jb3VudGVyZWQgYXJlIHRocm93bi4KLSAqLwotcHVibGljIHZvaWQgbW92ZVBvc2l0aXZlKElKYXZhRWxlbWVudFtdIGVsZW1lbnRzLCBJSmF2YUVsZW1lbnRbXSBkZXN0aW5hdGlvbnMsIElKYXZhRWxlbWVudFtdIHNpYmxpbmdzLCBTdHJpbmdbXSBuYW1lcywgYm9vbGVhbiBmb3JjZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JbW92ZVBvc2l0aXZlKGVsZW1lbnRzLCBkZXN0aW5hdGlvbnMsIHNpYmxpbmdzLCBuYW1lcywgZm9yY2UsIG51bGwpOwotfQotLyoqCi0gKiBNb3ZlcyB0aGUgZWxlbWVudHMgdG8gdGhlIGNvbnRhaW5lcnMgd2l0aCBvcHRpb25hbCByZW5hbWluZwotICogYW5kIGZvcmNpbmcuIFRoZSBvcGVyYXRpb24gc2hvdWxkIHN1Y2NlZWQsIHNvIGFueSBleGNlcHRpb25zCi0gKiBlbmNvdW50ZXJlZCBhcmUgdGhyb3duLgotICovCi1wdWJsaWMgdm9pZCBtb3ZlUG9zaXRpdmUoSUphdmFFbGVtZW50W10gZWxlbWVudHMsIElKYXZhRWxlbWVudFtdIGRlc3RpbmF0aW9ucywgSUphdmFFbGVtZW50W10gc2libGluZ3MsIFN0cmluZ1tdIG5hbWVzLCBib29sZWFuIGZvcmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCS8vIGlmIGZvcmNpbmcsIGVuc3VyZSB0aGF0IGEgbmFtZSBjb2xsaXNpb24gZXhpc3RzCi0JaW50IGk7Ci0JaWYgKGZvcmNlKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJSUphdmFFbGVtZW50IGUgPSBlbGVtZW50c1tpXTsKLQkJCUlKYXZhRWxlbWVudCBjb2xsaXNpb24gPSBudWxsOwotCQkJaWYgKG5hbWVzID09IG51bGwpIHsKLQkJCQljb2xsaXNpb24gPSBnZW5lcmF0ZUhhbmRsZShlLCBudWxsLCBkZXN0aW5hdGlvbnNbaV0pOwotCQkJfSBlbHNlIHsKLQkJCQljb2xsaXNpb24gPSBnZW5lcmF0ZUhhbmRsZShlLCBuYW1lc1tpXSwgZGVzdGluYXRpb25zW2ldKTsKLQkJCX0KLQkJCWFzc2VydFRydWUoIkNvbGxpc2lvbiBkb2VzIG5vdCBleGlzdCIsIGNvbGxpc2lvbi5leGlzdHMoKSk7Ci0JCX0KLQl9Ci0KLQl0cnkgewotCQlzdGFydERlbHRhcygpOwotCQkKLQkJLy8gbW92ZQotCQlnZXRKYXZhTW9kZWwoKS5tb3ZlKGVsZW1lbnRzLCBkZXN0aW5hdGlvbnMsIHNpYmxpbmdzLCBuYW1lcywgZm9yY2UsIG1vbml0b3IpOwotCQlmb3IgKGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQlJSmF2YUVsZW1lbnQgbW92ZWQgPSBudWxsOwotCQkJaWYgKG5hbWVzID09IG51bGwpIHsKLQkJCQltb3ZlZCA9IGdlbmVyYXRlSGFuZGxlKGVsZW1lbnQsIG51bGwsIGRlc3RpbmF0aW9uc1tpXSk7Ci0JCQl9IGVsc2UgewotCQkJCW1vdmVkID0gZ2VuZXJhdGVIYW5kbGUoZWxlbWVudCwgbmFtZXNbaV0sIGRlc3RpbmF0aW9uc1tpXSk7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgdGhlIG9yaWdpbmFsIGVsZW1lbnQgbm8gbG9uZ2VyIGV4aXN0cywgdW5sZXNzIG1vdmluZyB3aXRoaW4gdGhlIHNhbWUgY29udGFpbmVyCi0JCQlpZiAoIWRlc3RpbmF0aW9uc1tpXS5lcXVhbHMoZWxlbWVudC5nZXRQYXJlbnQoKSkpIHsKLQkJCQlpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UKSB7Ci0JCQkJCS8vbW92aW5nIGEgcGFja2FnZSBmcmFnbWVudCBkb2VzIG5vdCBuZWNlc3NhcnkgbWVhbiB0aGF0IGl0IG5vIGxvbmdlciBleGlzdHMKLQkJCQkJLy9pdCBjb3VsZCBoYXZlIG1lbWJlcnMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIEphdmEgTW9kZWwKLQkJCQkJdHJ5IHsKLQkJCQkJCUlSZXNvdXJjZVtdIG1lbWJlcnMgPSAoKElDb250YWluZXIpIGVsZW1lbnQuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkpLm1lbWJlcnMoKTsKLQkJCQkJCWlmIChtZW1iZXJzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQkJYXNzZXJ0VHJ1ZSgiVGhlIG9yaWdpbmFsIGVsZW1lbnQgbXVzdCBub3QgZXhpc3QiLCAhZWxlbWVudC5leGlzdHMoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJCXRocm93IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24oY2UpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiVGhlIG9yaWdpbmFsIGVsZW1lbnQgbXVzdCBub3QgZXhpc3QiLCAhZWxlbWVudC5leGlzdHMoKSk7Ci0JCQkJfQotCQkJfQotCQkJYXNzZXJ0VHJ1ZSgiTW92ZWQgZWxlbWVudCBzaG91bGQgZXhpc3QiLCBtb3ZlZC5leGlzdHMoKSk7Ci0JCi0JCQkvL2Vuc3VyZSBjb3JyZWN0IHBvc2l0aW9uCi0JCQlpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID4gSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQpIHsKLQkJCQlpZiAoc2libGluZ3MgIT0gbnVsbCAmJiBzaWJsaW5ncy5sZW5ndGggPiAwKSB7Ci0JCQkJCWVuc3VyZUNvcnJlY3RQb3NpdGlvbmluZygoSVBhcmVudCkgbW92ZWQuZ2V0UGFyZW50KCksIHNpYmxpbmdzW2ldLCBtb3ZlZCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlJSmF2YUVsZW1lbnQgY29udGFpbmVyID0gZGVzdGluYXRpb25zW2ldOwotCQkJCWlmIChjb250YWluZXIuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UKSB7Ci0JCQkJfSBlbHNlIHsgLy8gZW5zdXJlIHBhY2thZ2UgbmFtZSBpcyBjb3JyZWN0Ci0JCi0JCQkJCWlmIChjb250YWluZXIuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoIiIpKSB7Ci0JCQkJCQkvLyBkZWZhdWx0IHBhY2thZ2UgLSBzaG91bGQgYmUgbm8gcGFja2FnZSBkZWNsCi0JCQkJCQlJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbiA9ICgoSUNvbXBpbGF0aW9uVW5pdCkgbW92ZWQpLmdldENoaWxkcmVuKCk7Ci0JCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNoaWxkcmVuLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJaWYgKGNoaWxkcmVuW2pdIGluc3RhbmNlb2YgSVBhY2thZ2VEZWNsYXJhdGlvbikgewotCQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWFzc2VydFRydWUoIlNob3VsZCBub3QgZmluZCBwYWNrYWdlIGRlY2wiLCAhZm91bmQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSAoKElDb21waWxhdGlvblVuaXQpIG1vdmVkKS5nZXRDaGlsZHJlbigpOwotCQkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjaGlsZHJlbi5sZW5ndGg7IGorKykgewotCQkJCQkJCWlmIChjaGlsZHJlbltqXSBpbnN0YW5jZW9mIElQYWNrYWdlRGVjbGFyYXRpb24pIHsKLQkJCQkJCQkJYXNzZXJ0VHJ1ZSgicGFja2FnZSBkZWNsYXJhdGlvbiBpbmNvcnJlY3QiLCAoKElQYWNrYWdlRGVjbGFyYXRpb24pIGNoaWxkcmVuW2pdKS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhjb250YWluZXIuZ2V0RWxlbWVudE5hbWUoKSkpOwotCQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWFzc2VydFRydWUoIkRpZCBub3QgZmluZCBwYWNrYWdlIGRlY2wiLCBmb3VuZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlJSmF2YUVsZW1lbnREZWx0YSBkZXN0RGVsdGEgPSBudWxsOwotCQkJaWYgKGlzTWFpblR5cGUoZWxlbWVudCwgZGVzdGluYXRpb25zW2ldKSAmJiBuYW1lcyAhPSBudWxsICYmIG5hbWVzW2ldICE9IG51bGwpIHsgLy9tb3ZlZC9yZW5hbWVkIG1haW4gdHlwZSB0byBzYW1lIGN1Ci0JCQkJZGVzdERlbHRhID0gZ2V0RGVsdGFGb3IobW92ZWQuZ2V0UGFyZW50KCkpOwotCQkJCWFzc2VydFRydWUoIlJlbmFtZWQgY29tcGlsYXRpb24gdW5pdCBhcyByZXN1bHQgb2YgbWFpbiB0eXBlIG5vdCBhZGRlZCIsIGRlc3REZWx0YSAhPSBudWxsICYmIGRlc3REZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQURERUQpOwotCQkJCWFzc2VydFRydWUoImZsYWcgc2hvdWxkIGJlIEZfTU9WRURfRlJPTSIsIChkZXN0RGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfTU9WRURfRlJPTSkgPiAwKTsKLQkJCQlhc3NlcnRUcnVlKCJtb3ZlZCBmcm9tIGhhbmRsZSBzaG91bGQgYmUgb3JpZ2luYWwiLCBkZXN0RGVsdGEuZ2V0TW92ZWRGcm9tRWxlbWVudCgpLmVxdWFscyhlbGVtZW50LmdldFBhcmVudCgpKSk7Ci0JCQl9IGVsc2UgewotCQkJCWRlc3REZWx0YSA9IGdldERlbHRhRm9yKGRlc3RpbmF0aW9uc1tpXSwgdHJ1ZSk7Ci0JCQkJYXNzZXJ0VHJ1ZSgiRGVzdGluYXRpb24gY29udGFpbmVyIG5vdCBjaGFuZ2VkIiwgZGVzdERlbHRhICE9IG51bGwgJiYgZGVzdERlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5DSEFOR0VEKTsKLQkJCQlJSmF2YUVsZW1lbnREZWx0YVtdIGRlbHRhcyA9IGRlc3REZWx0YS5nZXRBZGRlZENoaWxkcmVuKCk7Ci0JCQkJYXNzZXJ0VHJ1ZSgiQWRkZWQgY2hpbGRyZW4gbm90IGNvcnJlY3QgZm9yIGVsZW1lbnQgY29weSIsIGRlbHRhc1tpXS5nZXRFbGVtZW50KCkuZXF1YWxzKG1vdmVkKSk7Ci0JCQkJYXNzZXJ0VHJ1ZSgic2hvdWxkIGJlIEtfQURERUQiLCBkZWx0YXNbaV0uZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLkFEREVEKTsKLQkJCQlJSmF2YUVsZW1lbnREZWx0YSBzb3VyY2VEZWx0YT0gZ2V0RGVsdGFGb3IoZWxlbWVudCwgZmFsc2UpOwotCQkJCWFzc2VydFRydWUoInNob3VsZCBiZSBLX1JFTU9WRUQiLCBzb3VyY2VEZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuUkVNT1ZFRCk7Ci0JCQl9Ci0JCX0KLQl9IGZpbmFsbHkgewotCQlzdG9wRGVsdGFzKCk7Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0NyZWF0ZU1lbWJlcnNUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0NyZWF0ZU1lbWJlcnNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGQ4YzA3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9DcmVhdGVNZW1iZXJzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIENyZWF0ZU1lbWJlcnNUZXN0cyBleHRlbmRzIEFic3RyYWN0SmF2YU1vZGVsVGVzdHMgewotCi0JSUphdmFQcm9qZWN0IHByb2plY3Q7Ci0KLQlwdWJsaWMgQ3JlYXRlTWVtYmVyc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBTdWl0ZShDcmVhdGVNZW1iZXJzVGVzdHMuY2xhc3MpOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRVcFN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwU3VpdGUoKTsKLQotCQlzZXRVcEphdmFQcm9qZWN0KCJDcmVhdGVNZW1iZXJzIik7Ci0JfQotCXB1YmxpYyB2b2lkIHRlYXJEb3duU3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZGVsZXRlUHJvamVjdCgiQ3JlYXRlTWVtYmVycyIpOwotCi0JCXN1cGVyLnRlYXJEb3duU3VpdGUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYXNzZXJ0QXJyYXlzRXF1YWxzKFN0cmluZyBhY3R1YWxDb250ZW50cywgU3RyaW5nIGV4cGVjdGVkQ29udGVudHMpIHsKLQkJU3RyaW5nW10gYWN0dWFsQ29udGVudHNBcnJheSA9IGNyZWF0ZUFycmF5T2ZTdHJpbmcoYWN0dWFsQ29udGVudHMpOwotCQlTdHJpbmdbXSBleHBlY3RlZENvbnRlbnRzQXJyYXkgPSBjcmVhdGVBcnJheU9mU3RyaW5nKGV4cGVjdGVkQ29udGVudHMpOwotCQlhc3NlcnRUcnVlKCJEaWZmZXJlbnQgc2l6ZSIsIGFjdHVhbENvbnRlbnRzQXJyYXkubGVuZ3RoID09IGV4cGVjdGVkQ29udGVudHNBcnJheS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwLCBtYXggPSBleHBlY3RlZENvbnRlbnRzQXJyYXkubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCWlmICghZXhwZWN0ZWRDb250ZW50c0FycmF5W2ldLmVxdWFscyhhY3R1YWxDb250ZW50c0FycmF5W2ldKSkgewotCQkJCWFzc2VydFRydWUoIkZvdW5kOiBcbiIgKyBhY3R1YWxDb250ZW50cyArICJcbkV4cGVjdGluZzogXG4iICsgZXhwZWN0ZWRDb250ZW50cywgZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nW10gY3JlYXRlQXJyYXlPZlN0cmluZyhTdHJpbmcgcykgewotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzLCAiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCUFycmF5TGlzdCBhcnJheUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCVN0cmluZyBuZXh0VG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlpZiAobmV4dFRva2VuLmxlbmd0aCgpICE9IDApIHsKLQkJCQlhcnJheUxpc3QuYWRkKG5leHRUb2tlbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChTdHJpbmdbXSkgYXJyYXlMaXN0LnRvQXJyYXkobmV3IFN0cmluZ1thcnJheUxpc3Quc2l6ZSgpXSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3QwMDEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNyZWF0ZU1lbWJlcnMiLCAic3JjIiwgIiIsICJBLmphdmEiKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29tcGlsYXRpb24gdW5pdCIsIGNvbXBpbGF0aW9uVW5pdCk7Ci0JCUlUeXBlW10gdHlwZXMgPSBjb21waWxhdGlvblVuaXQuZ2V0VHlwZXMoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdHlwZXMiLCB0eXBlcyk7Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgc2l6ZSIsIDEsIHR5cGVzLmxlbmd0aCk7Ci0JCUlUeXBlIHR5cGUgPSB0eXBlc1swXTsKLQkJdHlwZS5jcmVhdGVNZXRob2QoIlx0cHVibGljIHZvaWQgZm9vKCkge1xuXHRcdFN5c3RlbS5vdXQucHJpbnRsbihcIkhlbGxvIFdvcmxkXCIpO1xuXHR9XG4iLCBudWxsLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJU3RyaW5nIGV4cGVjdGVkU291cmNlID0gInB1YmxpYyBjbGFzcyBBXG4iICsKLQkJCSJ7CXB1YmxpYyB2b2lkIGZvbygpIHtcbiIgKwotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKFwiSGVsbG8gV29ybGRcIik7XG4iICsKLQkJCSIJfVxuIiArCi0JCQkifSI7Ci0JCWFzc2VydEFycmF5c0VxdWFscyh0eXBlLmdldFNvdXJjZSgpLCBleHBlY3RlZFNvdXJjZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0NyZWF0ZU1ldGhvZFNvdXJjZUV4YW1wbGVzVGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9DcmVhdGVNZXRob2RTb3VyY2VFeGFtcGxlc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlODEyNTIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0NyZWF0ZU1ldGhvZFNvdXJjZUV4YW1wbGVzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5JQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmpkb20uKjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlTWV0aG9kU291cmNlRXhhbXBsZXNUZXN0cyBleHRlbmRzIEFic3RyYWN0SmF2YU1vZGVsVGVzdHMgewotCQotCUlET01GYWN0b3J5IGRvbUZhY3Rvcnk7Ci0KLXB1YmxpYyBDcmVhdGVNZXRob2RTb3VyY2VFeGFtcGxlc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRVcFN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0Jc3VwZXIuc2V0VXBTdWl0ZSgpOwotCXRoaXMuZG9tRmFjdG9yeSA9IG5ldyBET01GYWN0b3J5KCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlyZXR1cm4gbmV3IFN1aXRlKENyZWF0ZU1ldGhvZFNvdXJjZUV4YW1wbGVzVGVzdHMuY2xhc3MpOwotfQotLyoqCi0gKiBFeGFtcGxlIG9mIGNyZWF0aW5nIHNvdXJjZSBmb3IgYSBtZXRob2QgaW4gYW4gaW50ZXJmYWNlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRW1wdHlJbnRlcmZhY2VNZXRob2QoKSB7Ci0JSURPTU1ldGhvZCBtZXRob2Q9IHRoaXMuZG9tRmFjdG9yeS5jcmVhdGVNZXRob2QoKTsKLQltZXRob2Quc2V0TmFtZSgiZm9vIik7Ci0JbWV0aG9kLnNldEJvZHkoIjtcbiIpOwotCWFzc2VydFNvdXJjZUVxdWFscygKLQkJInNvdXJjZSBjb2RlIGluY29ycmVjdCIsIAotCQkicHVibGljIHZvaWQgZm9vKCk7XG4iLAotCQltZXRob2QuZ2V0Q29udGVudHMoKSk7Ci19Ci0vKioKLSAqIEV4YW1wbGUgb2YgY3JlYXRpbmcgYSBkZWZhdWx0IGVtcHR5IG1ldGhvZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdENyZWF0ZUVtcHR5TWV0aG9kKCkgewotCUlET01NZXRob2QgbWV0aG9kPSB0aGlzLmRvbUZhY3RvcnkuY3JlYXRlTWV0aG9kKCk7Ci0JbWV0aG9kLnNldE5hbWUoImZvbyIpOwotCWFzc2VydFNvdXJjZUVxdWFscygKLQkJInNvdXJjZSBjb2RlIGluY29ycmVjdCIsIAotCQkicHVibGljIHZvaWQgZm9vKCkge1xuIiArCi0JCSJ9XG4iLAotCQltZXRob2QuZ2V0Q29udGVudHMoKSk7Ci19Ci0vKioKLSAqIEV4YW1wbGUgb2YgY3JlYXRpbmcgYW4gYWJzdHJhY3QgbWV0aG9kLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTWV0aG9kV2l0aEFic3RyYWN0TW9kaWZpZXIoKSB7Ci0JCi0JSURPTU1ldGhvZCBtZXRob2Q9IHRoaXMuZG9tRmFjdG9yeS5jcmVhdGVNZXRob2QoKTsKLQltZXRob2Quc2V0TmFtZSgiZm9vIik7Ci0JbWV0aG9kLnNldEZsYWdzKElDb25zdGFudHMuQWNjUHVibGljfCBJQ29uc3RhbnRzLkFjY0Fic3RyYWN0KTsKLQlhc3NlcnRTb3VyY2VFcXVhbHMoCi0JCSJzb3VyY2UgY29kZSBpbmNvcnJlY3QiLCAKLQkJInB1YmxpYyBhYnN0cmFjdCB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIn1cbiIsCi0JCW1ldGhvZC5nZXRDb250ZW50cygpKTsKLQkKLX0KLS8qKgotICogRXhhbXBsZSBvZiBjcmVhdGluZyBhIG1ldGhvZCBib2R5LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTWV0aG9kV2l0aEJvZHkoKSB7Ci0KLQlJRE9NTWV0aG9kIG1ldGhvZD0gdGhpcy5kb21GYWN0b3J5LmNyZWF0ZU1ldGhvZCgpOwotCW1ldGhvZC5zZXROYW1lKCJmb28iKTsKLQltZXRob2Quc2V0Qm9keSgKLQkJIiB7XG4iICsgCi0JCSJcdC4uLm1ldGhvZCBib2R5Li4uXG4iICsgCi0JCSJ9XG4iKTsKLQlhc3NlcnRTb3VyY2VFcXVhbHMoCi0JCSJzb3VyY2UgY29kZSBpbmNvcnJlY3QiLCAKLQkJInB1YmxpYyB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIlx0Li4ubWV0aG9kIGJvZHkuLi5cbiIgKyAKLQkJIn1cbiIsCi0JCW1ldGhvZC5nZXRDb250ZW50cygpKTsKLQotfQotLyoqCi0gKiBFeGFtcGxlIG9mIGNyZWF0aW5nIGEgbWV0aG9kIHdpdGggcHVibGljIGFuZCBzdGF0aWMgbW9kaWZpZXJzLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTWV0aG9kV2l0aE1vZGlmaWVycygpIHsKLQotCUlET01NZXRob2QgbWV0aG9kPSB0aGlzLmRvbUZhY3RvcnkuY3JlYXRlTWV0aG9kKCk7Ci0JbWV0aG9kLnNldE5hbWUoImZvbyIpOwotCW1ldGhvZC5zZXRGbGFncyhJQ29uc3RhbnRzLkFjY1B1YmxpY3wgSUNvbnN0YW50cy5BY2NTdGF0aWMpOwotCWFzc2VydFNvdXJjZUVxdWFscygKLQkJInNvdXJjZSBjb2RlIGluY29ycmVjdCIsIAotCQkicHVibGljIHN0YXRpYyB2b2lkIGZvbygpIHtcbiIgKyAKLQkJIn1cbiIsCi0JCW1ldGhvZC5nZXRDb250ZW50cygpKTsKLQotfQotLyoqCi0gKiBFeGFtcGxlIG9mIGNyZWF0aW5nIGEgbWV0aG9kIHdpdGggbW9kaWZpZXJzIGFuZCBleGNlcHRpb25zCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVNZXRob2RXaXRoTW9kaWZpZXJzQW5kRXhjZXB0aW9ucygpIHsKLQkKLQlJRE9NTWV0aG9kIG1ldGhvZD0gdGhpcy5kb21GYWN0b3J5LmNyZWF0ZU1ldGhvZCgpOwotCW1ldGhvZC5zZXROYW1lKCJmb28iKTsKLQltZXRob2Quc2V0RmxhZ3MoSUNvbnN0YW50cy5BY2NQcml2YXRlKTsKLQltZXRob2Quc2V0RXhjZXB0aW9ucyhuZXcgU3RyaW5nW10KLQkJeyJqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwKLQkJICJqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y3BldGlvbiJ9KTsKLQlhc3NlcnRTb3VyY2VFcXVhbHMoCi0JCSJzb3VyY2UgY29kZSBpbmNvcnJlY3QiLCAKLQkJInByaXZhdGUgdm9pZCBmb28oKSB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgamF2YS5pby5GaWxlTm90Rm91bmRFeGNwZXRpb24ge1xuIiArIAotCQkifVxuIiwKLQkJbWV0aG9kLmdldENvbnRlbnRzKCkpOwotCi19Ci0vKioKLSAqIEV4YW1wbGUgb2YgY3JlYXRpbmcgYSBtZXRob2Qgd2l0aCBwYXJhbWV0ZXJzCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVNZXRob2RXaXRoUGFyYW1ldGVycygpIHsKLQotCUlET01NZXRob2QgbWV0aG9kPSB0aGlzLmRvbUZhY3RvcnkuY3JlYXRlTWV0aG9kKCk7Ci0JbWV0aG9kLnNldE5hbWUoImZvbyIpOwotCW1ldGhvZC5zZXRQYXJhbWV0ZXJzKAotCQluZXcgU3RyaW5nW10geyJTdHJpbmciLCAiaW50IiwgImNoYXJbXSJ9LCAKLQkJbmV3IFN0cmluZ1tdIHsibmFtZSIsICJudW1iZXIiLCAiYnVmZmVyIn0pOwotCWFzc2VydFNvdXJjZUVxdWFscygKLQkJInNvdXJjZSBjb2RlIGluY29ycmVjdCIsIAotCQkicHVibGljIHZvaWQgZm9vKFN0cmluZyBuYW1lLCBpbnQgbnVtYmVyLCBjaGFyW10gYnVmZmVyKSB7XG4iICsgCi0JCSJ9XG4iLAotCQltZXRob2QuZ2V0Q29udGVudHMoKSk7Ci19Ci0vKioKLSAqIEV4YW1wbGUgb2YgY3JlYXRpbmcgYSBtZXRob2Qgd2l0aCBhIHJldHVybiB0eXBlCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVNZXRob2RXaXRoUmV0dXJuVHlwZSgpIHsKLQotCUlET01NZXRob2QgbWV0aG9kPSB0aGlzLmRvbUZhY3RvcnkuY3JlYXRlTWV0aG9kKCk7Ci0JbWV0aG9kLnNldE5hbWUoImZvbyIpOwotCW1ldGhvZC5zZXRSZXR1cm5UeXBlKCJTdHJpbmciKTsKLQlhc3NlcnRTb3VyY2VFcXVhbHMoCi0JCSJzb3VyY2UgY29kZSBpbmNvcnJlY3QiLCAKLQkJInB1YmxpYyBTdHJpbmcgZm9vKCkge1xuIiArCi0JCSJ9XG4iLAotCQltZXRob2QuZ2V0Q29udGVudHMoKSk7Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvQ3JlYXRlVHlwZVNvdXJjZUV4YW1wbGVzVGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9DcmVhdGVUeXBlU291cmNlRXhhbXBsZXNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWEwN2RmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9DcmVhdGVUeXBlU291cmNlRXhhbXBsZXNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuamRvbS4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBDcmVhdGVUeXBlU291cmNlRXhhbXBsZXNUZXN0cyBleHRlbmRzIEFic3RyYWN0SmF2YU1vZGVsVGVzdHMgewotCUlET01GYWN0b3J5IGRvbUZhY3Rvcnk7Ci0KLXB1YmxpYyBDcmVhdGVUeXBlU291cmNlRXhhbXBsZXNUZXN0cyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCXJldHVybiBuZXcgU3VpdGUoQ3JlYXRlVHlwZVNvdXJjZUV4YW1wbGVzVGVzdHMuY2xhc3MpOwotfQotcHVibGljIHZvaWQgc2V0VXBTdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCXN1cGVyLnNldFVwU3VpdGUoKTsKLQl0aGlzLmRvbUZhY3RvcnkgPSBuZXcgRE9NRmFjdG9yeSgpOwotfQotLyoqCi0gKiBFeGFtcGxlIG9mIGNyZWF0aW5nIGEgY2xhc3Mgd2l0aCBhbiBleHRlbmRzIGNsYXVzZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQ2xhc3NXaXRoRXh0ZW5kcygpIHsKLQlJRE9NVHlwZSB0eXBlPSB0aGlzLmRvbUZhY3RvcnkuY3JlYXRlVHlwZSgpOwotCXR5cGUuc2V0TmFtZSgiRm9vIik7Ci0JdHlwZS5zZXRTdXBlcmNsYXNzKCJCYXIiKTsKLQlhc3NlcnRTb3VyY2VFcXVhbHMoCi0JCSJzb3VyY2UgY29kZSBpbmNvcnJlY3QiLCAKLQkJInB1YmxpYyBjbGFzcyBGb28gZXh0ZW5kcyBCYXIge1xuIiArCi0JCSJ9XG4iLAotCQl0eXBlLmdldENvbnRlbnRzKCkpOwotfQotLyoqCi0gKiBFeGFtcGxlIG9mIGNyZWF0aW5nIGEgY2xhc3Mgd2l0aCBhbiBpbXBsZW1lbnRzIGNsYXVzZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdENyZWF0ZUNsYXNzV2l0aEltcGxlbWVudHMoKSB7Ci0JSURPTVR5cGUgdHlwZT0gdGhpcy5kb21GYWN0b3J5LmNyZWF0ZVR5cGUoKTsKLQl0eXBlLnNldE5hbWUoIkZvbyIpOwotCXR5cGUuc2V0U3VwZXJJbnRlcmZhY2VzKG5ldyBTdHJpbmdbXSB7IklTb21ldGhpbmciLCAiSU90aGVyd2lzZSJ9KTsKLQlhc3NlcnRTb3VyY2VFcXVhbHMoCi0JCSJzb3VyY2UgY29kZSBpbmNvcnJlY3QiLCAKLQkJInB1YmxpYyBjbGFzcyBGb28gaW1wbGVtZW50cyBJU29tZXRoaW5nLCBJT3RoZXJ3aXNlIHtcbiIgKwotCQkifVxuIiwKLQkJdHlwZS5nZXRDb250ZW50cygpKTsKLX0KLQotLyoqCi0gKiBFeGFtcGxlIG9mIGNyZWF0aW5nIGEgY2xhc3Mgd2l0aCBhbiBpbXBsZW1lbnRzIGNsYXVzZS4KLSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA5NzkKLSAqLwotcHVibGljIHZvaWQgdGVzdENyZWF0ZUNsYXNzV2l0aEltcGxlbWVudHMyKCkgewotCUlET01UeXBlIHR5cGU9IHRoaXMuZG9tRmFjdG9yeS5jcmVhdGVUeXBlKCJjbGFzcyBBIGltcGxlbWVudHMgSTEge1xufSIpOwotCXR5cGUuYWRkU3VwZXJJbnRlcmZhY2UoIkkyIik7Ci0JYXNzZXJ0U291cmNlRXF1YWxzKAotCQkic291cmNlIGNvZGUgaW5jb3JyZWN0IiwgCi0JCSJjbGFzcyBBIGltcGxlbWVudHMgSTEsIEkyIHtcbn0iLAotCQl0eXBlLmdldENvbnRlbnRzKCkpOwotfQotCi0vKioKLSAqIEV4YW1wbGUgb2YgY3JlYXRpbmcgYSBjbGFzcyB3aXRoIGFuIGltcGxlbWVudHMgY2xhdXNlLgotICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDk3OQotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQ2xhc3NXaXRoSW1wbGVtZW50czMoKSB7Ci0JSURPTVR5cGUgdHlwZT0gdGhpcy5kb21GYWN0b3J5LmNyZWF0ZVR5cGUoImNsYXNzIEEge1xufSIpOwotCXR5cGUuc2V0U3VwZXJJbnRlcmZhY2VzKG5ldyBTdHJpbmdbXSB7IkkxIiwgIkkyIn0pOwotCWFzc2VydFNvdXJjZUVxdWFscygKLQkJInNvdXJjZSBjb2RlIGluY29ycmVjdCIsIAotCQkiY2xhc3MgQSBpbXBsZW1lbnRzIEkxLCBJMiB7XG59IiwKLQkJdHlwZS5nZXRDb250ZW50cygpKTsKLX0KLQotLyoqCi0gKiBFeGFtcGxlIG9mIGNyZWF0aW5nIGEgY2xhc3Mgd2l0aCBhbiBpbXBsZW1lbnRzIGNsYXVzZS4KLSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA5NzkKLSAqLwotcHVibGljIHZvaWQgdGVzdENyZWF0ZUNsYXNzV2l0aEltcGxlbWVudHM0KCkgewotCUlET01UeXBlIHR5cGU9IHRoaXMuZG9tRmFjdG9yeS5jcmVhdGVUeXBlKCJjbGFzcyBBIGltcGxlbWVudHMgSTF7XG59Iik7Ci0JdHlwZS5hZGRTdXBlckludGVyZmFjZSgiSTIiKTsKLQlhc3NlcnRTb3VyY2VFcXVhbHMoCi0JCSJzb3VyY2UgY29kZSBpbmNvcnJlY3QiLCAKLQkJImNsYXNzIEEgaW1wbGVtZW50cyBJMSwgSTJ7XG59IiwKLQkJdHlwZS5nZXRDb250ZW50cygpKTsKLX0KLQotLyoqCi0gKiBFeGFtcGxlIG9mIGNyZWF0aW5nIGEgY2xhc3Mgd2l0aCBtb2RpZmllcnMKLSAqLwotcHVibGljIHZvaWQgdGVzdENyZWF0ZUNsYXNzV2l0aE1vZGlmaWVycygpIHsKLQlJRE9NVHlwZSB0eXBlPSB0aGlzLmRvbUZhY3RvcnkuY3JlYXRlVHlwZSgpOwotCXR5cGUuc2V0TmFtZSgiRm9vIik7Ci0JdHlwZS5zZXRGbGFncyhJQ29uc3RhbnRzLkFjY1B1YmxpYyB8IElDb25zdGFudHMuQWNjRmluYWwpOwotCWFzc2VydFNvdXJjZUVxdWFscygKLQkJInNvdXJjZSBjb2RlIGluY29ycmVjdCIsIAotCQkicHVibGljIGZpbmFsIGNsYXNzIEZvbyB7XG4iICsKLQkJIn1cbiIsCi0JCXR5cGUuZ2V0Q29udGVudHMoKSk7Ci19Ci0vKioKLSAqIEV4YW1wbGUgb2YgY3JlYXRpbmcgYSBkZWZhdWx0IGNsYXNzCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVFbXB0eUNsYXNzKCkgewotCUlET01UeXBlIHR5cGU9IHRoaXMuZG9tRmFjdG9yeS5jcmVhdGVUeXBlKCk7Ci0JdHlwZS5zZXROYW1lKCJGb28iKTsKLQlhc3NlcnRTb3VyY2VFcXVhbHMoCi0JCSJzb3VyY2UgY29kZSBpbmNvcnJlY3QiLCAKLQkJInB1YmxpYyBjbGFzcyBGb28ge1xuIiArCi0JCSJ9XG4iLAotCQl0eXBlLmdldENvbnRlbnRzKCkpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYW4gaW50ZXJmYWNlIGlzIGNyZWF0ZWQgdXNpbmcKLSAqIDxjb2RlPkNyZWF0ZVR5cGVTb3VyY2VPcGVyYXRpb248L2NvZGU+IGFuZCB0aGF0IHRoZSBzb3VyY2UKLSAqIG9mIHRoZSBjcmVhdGVkIGludGVyZmFjZSBpcyBjb3JyZWN0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRW1wdHlJbnRlcmZhY2UoKSB7Ci0JSURPTVR5cGUgdHlwZT0gdGhpcy5kb21GYWN0b3J5LmNyZWF0ZVR5cGUoKTsKLQl0eXBlLnNldE5hbWUoIkZvbyIpOwotCXR5cGUuc2V0Q2xhc3MoZmFsc2UpOwotCWFzc2VydFNvdXJjZUVxdWFscygKLQkJInNvdXJjZSBjb2RlIGluY29ycmVjdCIsIAotCQkicHVibGljIGludGVyZmFjZSBGb28ge1xuIiArCi0JCSJ9XG4iLAotCQl0eXBlLmdldENvbnRlbnRzKCkpOwotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0RlZmF1bHRKYXZhRWxlbWVudENvbXBhcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9EZWZhdWx0SmF2YUVsZW1lbnRDb21wYXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNDVkZWMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0RlZmF1bHRKYXZhRWxlbWVudENvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRmxhZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFycmF5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9keURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5GaWVsZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Jbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlByaW1pdGl2ZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbXBsZU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbXBsZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuQ29tcGlsYXRpb25Vbml0U29ydGVyOwotCi0vKioKLSAqIFRoZSBjbGFzcyA8Y29kZT5EZWZhdWx0SmF2YUVsZW1lbnRDb21wYXJhdG9yPC9jb2RlPiBpcyBhIHN0YW5kYXJkCi0gKiBpbXBsZW1lbnRhdGlvbiBvZiBhIGNvbXBhcmF0b3IuCi0gKiA8cD4KLSAqIDx1bD4KLSAqIDxsaT5zdGF0aWMgZmllbGRzLCBhcnJhbmdlZCBhbHBoYWJldGljYWxseSBieSBuYW1lIGFuZCBhY2Nlc3MgbW9kaWZpZXIKLSAqIChwdWJsaWMsIHByb3RlY3RlZCwgcHJpdmF0ZSwgZGVmYXVsdCk8L2xpPgotICogPGxpPnN0YXRpYyBpbml0aWFsaXplcnMgaW4gb3JkZXIgb2YgYXBwZWFyYW5jZTwvbGk+Ci0gKiA8bGk+aW5zdGFuY2UgZmllbGRzLCBhcnJhbmdlZCBhbHBoYWJldGljYWxseSBieSBuYW1lIGFuZCBhY2Nlc3MgbW9kaWZpZXIKLSAqIChwdWJsaWMsIHByb3RlY3RlZCwgcHJpdmF0ZSwgZGVmYXVsdCk8L2xpPgotICogPGxpPmluc3RhbmNlIGluaXRpYWxpemVycyBpbiBvcmRlciBvZiBhcHBlYXJhbmNlPC9saT4KLSAqIDxsaT50eXBlIGRlY2xhcmF0aW9ucywgYXJyYW5nZWQgYWxwaGFiZXRpY2FsbHkgYnkgbmFtZSBhbmQgYWNjZXNzIG1vZGlmaWVyCi0gKiAocHVibGljLCBwcm90ZWN0ZWQsIHByaXZhdGUsIGRlZmF1bHQpPC9saT4KLSAqIDxsaT5jb25zdHJ1Y3RvcnMsIGFycmFuZ2VkIGJ5IHBhcmFtZXRlciBvcmRlciBhbmQgYWNjZXNzIG1vZGlmaWVyCi0gKiAocHVibGljLCBwcm90ZWN0ZWQsIHByaXZhdGUsIGRlZmF1bHQpPC9saT4KLSAqIDxsaT5tZXRob2RzLCBhcnJhbmdlZCBieSBhbHBoYWJldGljYWxseSBieSBuYW1lIGFuZCBwYXJhbWV0ZXIgb3JkZXIgYW5kIAotICogYWNjZXNzIG1vZGlmaWVyIChwdWJsaWMsIHByb3RlY3RlZCwgcHJpdmF0ZSwgZGVmYXVsdCk8L2xpPgotICogPC9wPgotICovCi1jbGFzcyBEZWZhdWx0SmF2YUVsZW1lbnRDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVElDX1RZUEVfQ0FURUdPUlkgPSAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUSUNfRklFTERfQ0FURUdPUlkgPSAxOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUSUNfSU5JVElBTElaRVJfQ0FURUdPUlkgPSAyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUSUNfTUVUSE9EX0NBVEVHT1JZID0gMzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9DQVRFR09SWSA9IDQ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJRUxEX0NBVEVHT1JZID0gNTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTElaRVJfQ0FURUdPUlkgPSA2OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05TVFJVQ1RPUl9DQVRFR09SWSA9IDc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9DQVRFR09SWSA9IDg7Ci0JCi0JcHJpdmF0ZSBDb2xsYXRvciBjb2xsYXRvcjsKLQkKLQlwcml2YXRlIGludFtdIGNhdGVnb3JpZXM7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSB0aGF0IHNvcnRzIHRoZSB2YXJpb3VzIGNhdGVnb3JpZXMgb2YgYm9keQotCSAqIGRlY2xhcmF0aW9ucyBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgotCSAqIDxvbD4KLQkgKiA8bGk+c3RhdGljIHR5cGVzPC9saT4KLQkgKiA8bGk+c3RhdGljIGZpZWxkcyA8L2xpPgotCSAqIDxsaT5zdGF0aWMgaW5pdGlhbGl6ZXJzPC9saT4KLQkgKiA8bGk+bm9uLXN0YXRpYyBmaWVsZHM8L2xpPgotCSAqIDxsaT5pbnN0YW5jZSBpbml0aWFsaXplcnM8L2xpPgotCSAqIDxsaT50eXBlczwvbGk+Ci0JICogPGxpPnN0YXRpYyBtZXRob2RzPC9saT4KLQkgKiA8bGk+Y29uc3RydWN0b3JzPC9saT4KLQkgKiA8bGk+bm9uLXN0YXRpYyBtZXRob2RzPC9saT4KLQkgKiA8L29sPgotCSAqLwotCXB1YmxpYyBEZWZhdWx0SmF2YUVsZW1lbnRDb21wYXJhdG9yKCkgewotCQkvLyBpbml0aWFsaXplIGRlZmF1bHQgY2F0ZWdvcmllcwotCQl0aGlzLmNhdGVnb3JpZXMgPSBuZXcgaW50W10gewotCQkJMSwgLy8gc3RhdGljIHR5cGUKLQkJCTIsIC8vIHN0YXRpYyBmaWVsZAotCQkJMywgLy8gc3RhdGljIGluaXRpYWxpemVyCi0JCQk3LCAvLyBzdGF0aWMgbWV0aG9kCi0JCQk2LCAvLyB0eXBlCi0JCQk0LCAvLyBmaWVsZAotCQkJNSwgLy8gaW5pdGlhbGl6ZXIKLQkJCTgsIC8vIGNvbnN0cnVjdG9yCi0JCQk5ICAvLyBtZXRob2QKLQkJfTsKLQkJdGhpcy5jb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSB0aGF0IGFycmFuZ2VzIHRoZSB2YXJpb3VzIGNhdGVnb3JpZXMgb2YgYm9keQotCSAqIGRlY2xhcmF0aW9ucy4KLQkgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgdG8gc3BlY2lmeSBjdXN0b21pemVkIHZhbHVlcyBmb3IgdGhlIGRpZmZlcmVudCBjYXRlZ29yaWVzLgotCSAqIFRoZXkgYXJlIGEgY29udmluaWVudCB3YXkgdG8gZGlzdGluZ3Vpc2ggQVNUIG5vZGVzLiAKLQkgKiBUaGUgbG93ZXIgYSB2YWx1ZSBpcywgdGhlIGhpZ2hlciB0aGUgbm9kZSB3aWxsIGFwcGVhciBpbiB0aGUgc29ydGVkCi0JICogY29tcGlsYXRpb24gdW5pdC4KLQkgKiA8cD4KLQkgKiBUaGVyZSBhcmUgbmluZSBjYXRlZ29yaWVzIHdpdGggdGhlaXJzIGRlZmF1bHQgdmFsdWVzOgotCSAqIDxvbD4KLQkgKiA8bGk+c3RhdGljIHR5cGVzICgxKTwvbGk+Ci0JICogPGxpPnN0YXRpYyBmaWVsZHMgKDIpPC9saT4KLQkgKiA8bGk+c3RhdGljIGluaXRpYWxpemVycyAoMyk8L2xpPgotCSAqIDxsaT5maWVsZHMgKDQpIDwvbGk+Ci0JICogPGxpPmluaXRpYWxpemVycyAoNSk8L2xpPgotCSAqIDxsaT50eXBlcyAoNik8L2xpPgotCSAqIDxsaT5zdGF0aWMgbWV0aG9kcyAoNyk8L2xpPgotCSAqIDxsaT5jb25zdHJ1Y3RvcnMgKDgpPC9saT4KLQkgKiA8bGk+bWV0aG9kcyAoOSk8L2xpPgotCSAqIDwvb2w+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBzdGF0aWNUeXBlQ2F0ZWdvcnkgdGhlIGdpdmVuIHZhbHVlIGZvciB0aGUgc3RhdGljIHR5cGUgY2F0ZWdvcnkKLQkgKiBAcGFyYW0gc3RhdGljRmllbGRDYXRlZ29yeSB0aGUgZ2l2ZW4gdmFsdWUgZm9yIHRoZSBzdGF0aWMgZmllbGQgY2F0ZWdvcnkKLQkgKiBAcGFyYW0gc3RhdGljSW5pdGlhbGl6ZXJDYXRlZ29yeSB0aGUgZ2l2ZW4gdmFsdWUgZm9yIHRoZSBzdGF0aWMgaW5pdGlhbGl6ZXIgY2F0ZWdvcnkKLQkgKiBAcGFyYW0gc3RhdGljTWV0aG9kQ2F0ZWdvcnkgdGhlIGdpdmVuIHZhbHVlIGZvciBzdGF0aWMgdGhlIG1ldGhvZCBjYXRlZ29yeQotCSAqIEBwYXJhbSB0eXBlQ2F0ZWdvcnkgdGhlIGdpdmVuIHZhbHVlIGZvciB0aGUgdHlwZSBjYXRlZ29yeQotCSAqIEBwYXJhbSBmaWVsZENhdGVnb3J5IHRoZSBnaXZlbiB2YWx1ZSBmb3IgZmllbGQgY2F0ZWdvcnkKLQkgKiBAcGFyYW0gaW5pdGlhbGl6ZXJDYXRlZ29yeSB0aGUgZ2l2ZW4gdmFsdWUgZm9yIGluaXRpYWxpemVyIGNhdGVnb3J5Ci0JICogQHBhcmFtIGNvbnN0cnVjdG9yQ2F0ZWdvcnkgdGhlIGdpdmVuIHZhbHVlIGZvciBjb25zdHJ1Y3RvciBjYXRlZ29yeQotCSAqIEBwYXJhbSBtZXRob2RDYXRlZ29yeSB0aGUgZ2l2ZW4gdmFsdWUgZm9yIG1ldGhvZCBjYXRlZ29yeQotCSAqLwotCXB1YmxpYyBEZWZhdWx0SmF2YUVsZW1lbnRDb21wYXJhdG9yKAotCQlpbnQgc3RhdGljVHlwZUNhdGVnb3J5LAotCQlpbnQgc3RhdGljRmllbGRDYXRlZ29yeSwKLQkJaW50IHN0YXRpY0luaXRpYWxpemVyQ2F0ZWdvcnksCi0JCWludCBzdGF0aWNNZXRob2RDYXRlZ29yeSwKLQkJaW50IHR5cGVDYXRlZ29yeSwKLQkJaW50IGZpZWxkQ2F0ZWdvcnksCi0JCWludCBpbml0aWFsaXplckNhdGVnb3J5LAotCQlpbnQgY29uc3RydWN0b3JDYXRlZ29yeSwKLQkJaW50IG1ldGhvZENhdGVnb3J5KSB7Ci0JCQl0aGlzLmNhdGVnb3JpZXMgPSBuZXcgaW50W10gewotCQkJCXN0YXRpY1R5cGVDYXRlZ29yeSwKLQkJCQlzdGF0aWNGaWVsZENhdGVnb3J5LAotCQkJCXN0YXRpY0luaXRpYWxpemVyQ2F0ZWdvcnksCi0JCQkJc3RhdGljTWV0aG9kQ2F0ZWdvcnksCi0JCQkJdHlwZUNhdGVnb3J5LAotCQkJCWZpZWxkQ2F0ZWdvcnksCi0JCQkJaW5pdGlhbGl6ZXJDYXRlZ29yeSwKLQkJCQljb25zdHJ1Y3RvckNhdGVnb3J5LAotCQkJCW1ldGhvZENhdGVnb3J5Ci0JCQl9OwotCQl0aGlzLmNvbGxhdG9yID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBjYXRlZ29yeSBmb3IgYSBib2R5IGRlY2xhcmF0aW9uIG5vZGUgYWNjb3JkaW5nIHRvIHRoZSAKLQkgKiBwcmVmZXJlbmNlcyBwYXNzZWQgYXQgdGhlIGNyZWF0aW9uIG9mIHRoZSBjb21wYXJhdG9yLgotCSAqIAotCSAqIEBwYXJhbSBub2RlIHRoZSBnaXZlbiBub2RlCi0JICogQHJldHVybiB0aGUgY2F0ZWdvcnkgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gbm9kZQotCSAqIAotCSAqIEBzaW5jZSAyLjEKLQkgKi8KLQlwcml2YXRlIGludCBnZXRDYXRlZ29yeShCb2R5RGVjbGFyYXRpb24gbm9kZSkgewotCQlzd2l0Y2gobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIEFTVE5vZGUuTUVUSE9EX0RFQ0xBUkFUSU9OIDoKLQkJCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbikgbm9kZTsKLQkJCQlpZiAobWV0aG9kRGVjbGFyYXRpb24uaXNDb25zdHJ1Y3RvcigpKSB7Ci0JCQkJCXJldHVybiB0aGlzLmNhdGVnb3JpZXNbQ09OU1RSVUNUT1JfQ0FURUdPUlldOwotCQkJCX0KLQkJCQlpZiAoRmxhZ3MuaXNTdGF0aWMobWV0aG9kRGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCkpKSB7Ci0JCQkJCXJldHVybiB0aGlzLmNhdGVnb3JpZXNbU1RBVElDX01FVEhPRF9DQVRFR09SWV07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIHRoaXMuY2F0ZWdvcmllc1tNRVRIT0RfQ0FURUdPUlldOwotCQkJCX0KLQkJCWNhc2UgQVNUTm9kZS5GSUVMRF9ERUNMQVJBVElPTiA6Ci0JCQkJRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gKEZpZWxkRGVjbGFyYXRpb24pIG5vZGU7Ci0JCQkJaWYgKEZsYWdzLmlzU3RhdGljKGZpZWxkRGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCkpKSB7Ci0JCQkJCXJldHVybiB0aGlzLmNhdGVnb3JpZXNbU1RBVElDX0ZJRUxEX0NBVEVHT1JZXTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gdGhpcy5jYXRlZ29yaWVzW0ZJRUxEX0NBVEVHT1JZXTsKLQkJCQl9Ci0JCQljYXNlIEFTVE5vZGUuVFlQRV9ERUNMQVJBVElPTiA6Ci0JCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pIG5vZGU7Ci0JCQkJaWYgKEZsYWdzLmlzU3RhdGljKHR5cGVEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKSkpIHsKLQkJCQkJcmV0dXJuIHRoaXMuY2F0ZWdvcmllc1tTVEFUSUNfVFlQRV9DQVRFR09SWV07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIHRoaXMuY2F0ZWdvcmllc1tUWVBFX0NBVEVHT1JZXTsKLQkJCQl9Ci0JCQljYXNlIEFTVE5vZGUuSU5JVElBTElaRVIgOgotCQkJCUluaXRpYWxpemVyIGluaXRpYWxpemVyID0gKEluaXRpYWxpemVyKSBub2RlOwotCQkJCWlmIChGbGFncy5pc1N0YXRpYyhpbml0aWFsaXplci5nZXRNb2RpZmllcnMoKSkpIHsKLQkJCQkJcmV0dXJuIHRoaXMuY2F0ZWdvcmllc1tTVEFUSUNfSU5JVElBTElaRVJfQ0FURUdPUlldOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiB0aGlzLmNhdGVnb3JpZXNbSU5JVElBTElaRVJfQ0FURUdPUlldOwotCQkJCX0KLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+RGVmYXVsdEphdmFFbGVtZW50Q29tcGFyYXRvcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcwotCSAqIDxjb2RlPmphdmEudXRpbC5Db21wYXJhdG9yPC9jb2RlPiBtZXRob2QgY2FuIG9ubHkgYmUgdXNlZCB0byBjb21wYXJlCi0JICogaW5zdGFuY2VzIG9mIDxjb2RlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Cb2R5RGVjbGFyYXRpb248L2NvZGU+LgotCSAqIDxwPgotCSAqIFRoZSBjYXRlZ29yaWVzIG9mIGVhY2ggYm9keSBkZWNsYXJhdGlvbiBhcmUgY29tcGFyZWQuIElmIHRoZXkgYXJlCi0JICogaW4gZGlmZmVyZW50IGNhdGVnb3JpZXMsIHRoZXkgYXJlIG9yZGVyZWQgYmFzZWQgb24gdGhlaXIgY2F0ZWdvcnkuCi0JICogQm9keSBkZWNsYXJhdGlvbnMgd2l0aGluIHRoZSBzYW1lIGNhdGVnb3J5IGFyZSBvcmRlcmVkIGJ5IHNpZ25hdHVyZQotCSAqIHN0cmluZy4gQm9keSBkZWNsYXJhdGlvbnMgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgc3RyaW5nIGFyZSBvcmRlcmVkCi0JICogYnkgdGhlaXIgb3JpZ2luYWwgcmVsYXRpdmUgcG9zaXRpb25zLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJaWYgKCEobzEgaW5zdGFuY2VvZiBCb2R5RGVjbGFyYXRpb24pICYmICEobzIgaW5zdGFuY2VvZiBCb2R5RGVjbGFyYXRpb24pKSB7Ci0JCQl0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKCk7Ci0JCX0KLQkJQm9keURlY2xhcmF0aW9uIG5vZGUxID0gKEJvZHlEZWNsYXJhdGlvbikgbzE7Ci0JCUJvZHlEZWNsYXJhdGlvbiBub2RlMiA9IChCb2R5RGVjbGFyYXRpb24pIG8yOwotCQlpbnQgY2F0ZWdvcnkxID0gZ2V0Q2F0ZWdvcnkobm9kZTEpOwotCQlpbnQgY2F0ZWdvcnkyID0gZ2V0Q2F0ZWdvcnkobm9kZTIpOwotCQkKLQkJaWYgKGNhdGVnb3J5MSAhPSBjYXRlZ29yeTIpIHsKLQkJCXJldHVybiBjYXRlZ29yeTEgLSBjYXRlZ29yeTI7Ci0JCX0KLQkJaWYgKG8xID09IG8yKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlTdHJpbmcgbm9kZTFTaWduYXR1cmUgPSBidWlsZFNpZ25hdHVyZShub2RlMSk7Ci0JCVN0cmluZyBub2RlMlNpZ25hdHVyZSA9IGJ1aWxkU2lnbmF0dXJlKG5vZGUyKTsKLQkJaWYgKG5vZGUxU2lnbmF0dXJlLmxlbmd0aCgpICE9IDAgJiYgbm9kZTJTaWduYXR1cmUubGVuZ3RoKCkgIT0gMCkgewotCQkJaW50IGNvbXBhcmUgPSB0aGlzLmNvbGxhdG9yLmNvbXBhcmUobm9kZTFTaWduYXR1cmUsIG5vZGUyU2lnbmF0dXJlKTsKLQkJCWlmIChjb21wYXJlICE9IDApIHsKLQkJCQlyZXR1cm4gY29tcGFyZTsKLQkJCX0KLQkJfQotCQlpbnQgc291cmNlU3RhcnQxID0gKChJbnRlZ2VyKSBub2RlMS5nZXRQcm9wZXJ0eShDb21waWxhdGlvblVuaXRTb3J0ZXIuUkVMQVRJVkVfT1JERVIpKS5pbnRWYWx1ZSgpOwotCQlpbnQgc291cmNlU3RhcnQyID0gKChJbnRlZ2VyKSBub2RlMi5nZXRQcm9wZXJ0eShDb21waWxhdGlvblVuaXRTb3J0ZXIuUkVMQVRJVkVfT1JERVIpKS5pbnRWYWx1ZSgpOwotCQlyZXR1cm4gc291cmNlU3RhcnQxIC0gc291cmNlU3RhcnQyOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkU2lnbmF0dXJlKEJvZHlEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCXN3aXRjaChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgQVNUTm9kZS5NRVRIT0RfREVDTEFSQVRJT04gOgotCQkJCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBub2RlOwotCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJYnVmZmVyLmFwcGVuZChtZXRob2REZWNsYXJhdGlvbi5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpKTsKLQkJCQlmaW5hbCBMaXN0IHBhcmFtZXRlcnMgPSBtZXRob2REZWNsYXJhdGlvbi5wYXJhbWV0ZXJzKCk7Ci0JCQkJaW50IGxlbmd0aDEgPSBwYXJhbWV0ZXJzLnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDE7IGkrKykgewotCQkJCQlTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciA9IChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSBwYXJhbWV0ZXJzLmdldChpKTsKLQkJCQkJYnVmZmVyLmFwcGVuZChwYXJhbWV0ZXIuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKSk7Ci0JCQkJCVR5cGUgdHlwZSA9IHBhcmFtZXRlci5nZXRUeXBlKCk7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoYnVpbGRTaWduYXR1cmUodHlwZSkpOwotCQkJCX0KLQkJCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQljYXNlIEFTVE5vZGUuRklFTERfREVDTEFSQVRJT04gOgotCQkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IChGaWVsZERlY2xhcmF0aW9uKSBub2RlOwotCQkJCXJldHVybiAoKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgZmllbGREZWNsYXJhdGlvbi5mcmFnbWVudHMoKS5nZXQoMCkpLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCk7Ci0JCQljYXNlIEFTVE5vZGUuSU5JVElBTElaRVIgOgotCQkJCXJldHVybiAoKEludGVnZXIpIG5vZGUuZ2V0UHJvcGVydHkoQ29tcGlsYXRpb25Vbml0U29ydGVyLlJFTEFUSVZFX09SREVSKSkudG9TdHJpbmcoKTsKLQkJCWNhc2UgQVNUTm9kZS5UWVBFX0RFQ0xBUkFUSU9OIDoKLQkJCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgbm9kZTsKLQkJCQlyZXR1cm4gdHlwZURlY2xhcmF0aW9uLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRTaWduYXR1cmUoVHlwZSB0eXBlKSB7Ci0JCXN3aXRjaCh0eXBlLmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgQVNUTm9kZS5QUklNSVRJVkVfVFlQRSA6Ci0JCQkJUHJpbWl0aXZlVHlwZS5Db2RlIGNvZGUgPSAoKFByaW1pdGl2ZVR5cGUpIHR5cGUpLmdldFByaW1pdGl2ZVR5cGVDb2RlKCk7Ci0JCQkJcmV0dXJuIGNvZGUudG9TdHJpbmcoKTsKLQkJCWNhc2UgQVNUTm9kZS5BUlJBWV9UWVBFIDoKLQkJCQlBcnJheVR5cGUgYXJyYXlUeXBlID0gKEFycmF5VHlwZSkgdHlwZTsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCWJ1ZmZlci5hcHBlbmQoYnVpbGRTaWduYXR1cmUoYXJyYXlUeXBlLmdldEVsZW1lbnRUeXBlKCkpKTsKLQkJCQlpbnQgZGltZW5zaW9ucyA9IGFycmF5VHlwZS5nZXREaW1lbnNpb25zKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkaW1lbnNpb25zOyBqKyspIHsKLQkJCQkJYnVmZmVyLmFwcGVuZCgiW10iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQljYXNlIEFTVE5vZGUuU0lNUExFX1RZUEUgOgotCQkJCVNpbXBsZVR5cGUgc2ltcGxlVHlwZSA9IChTaW1wbGVUeXBlKSB0eXBlOwotCQkJCXJldHVybiBidWlsZFNpZ25hdHVyZShzaW1wbGVUeXBlLmdldE5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7IC8vIHNob3VsZCBuZXZlciBoYXBwZW4KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRTaWduYXR1cmUoTmFtZSBuYW1lKSB7Ci0JCWlmIChuYW1lLmlzU2ltcGxlTmFtZSgpKSB7Ci0JCQlyZXR1cm4gKChTaW1wbGVOYW1lKSBuYW1lKS5nZXRJZGVudGlmaWVyKCk7Ci0JCX0gZWxzZSB7Ci0JCQlRdWFsaWZpZWROYW1lIHF1YWxpZmllZE5hbWUgPSAoUXVhbGlmaWVkTmFtZSkgbmFtZTsKLQkJCXJldHVybiBidWlsZFNpZ25hdHVyZShxdWFsaWZpZWROYW1lLmdldFF1YWxpZmllcigpKSArICIuIiArIGJ1aWxkU2lnbmF0dXJlKHF1YWxpZmllZE5hbWUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9FbmNvZGluZ1Rlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvRW5jb2RpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2UxNzJkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9FbmNvZGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5VdGlsOwotCi0vKioKLSAqIEBhdXRob3Igb2xpdmllcnQKLSAqLwotcHVibGljIGNsYXNzIEVuY29kaW5nVGVzdHMgZXh0ZW5kcyBNb2RpZnlpbmdSZXNvdXJjZVRlc3RzIHsKLQotCi0JcHVibGljIEVuY29kaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFN1aXRlKEVuY29kaW5nVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgRW5jb2RpbmdUZXN0cygidGVzdENyZWF0ZUNvbXBpbGF0aW9uVW5pdEFuZEltcG9ydENvbnRhaW5lciIpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCi0JCi0JLyoqCi0JICogQ2hlY2sgdGhhdCB0aGUgY29tcGlsYXRpb24gdW5pdCBpcyBzYXZlZCB3aXRoIHRoZSBwcm9wZXIgZW5jb2RpbmcuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUNvbXBpbGF0aW9uVW5pdEFuZEltcG9ydENvbnRhaW5lcigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgc2F2ZWRFbmNvZGluZyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJCi0JCQlzYXZlZEVuY29kaW5nID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKFJlc291cmNlc1BsdWdpbi5QUkVGX0VOQ09ESU5HKTsKLQkJCXByZWZlcmVuY2VzLnNldFZhbHVlKFJlc291cmNlc1BsdWdpbi5QUkVGX0VOQ09ESU5HLCAiVVRGLTgiKTsKLQkJCQotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFBsdWdpbigpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBjcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7ICIiIH0sICIiKTsKLQkJCUlQYWNrYWdlRnJhZ21lbnQgcGtnID0gZ2V0UGFja2FnZUZyYWdtZW50KCJQIiwgIiIsICIiKTsKLQkJCUlDb21waWxhdGlvblVuaXQgY3U9IHBrZy5jcmVhdGVDb21waWxhdGlvblVuaXQoIkEuamF2YSIsIAotCQkJCSgicHVibGljIGNsYXNzIEEge1xyXG4iICsKLQkJCQkiCXB1YmxpYyBzdGF0aWMgbWFpbihTdHJpbmdbXSBhcmdzKSB7XHJcbiIgKwotCQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihcIulcIik7XHJcbiIgKwotCQkJCSIJfVxyXG4iICsKLQkJCQkifSIpLCBmYWxzZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQlhc3NlcnRDcmVhdGlvbihjdSk7Ci0JCQljdS5yZW5hbWUoIkIuamF2YSIsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJY3UgPSBwa2cuZ2V0Q29tcGlsYXRpb25Vbml0KCJCLmphdmEiKTsKLQkJCWN1LnJlbmFtZSgiQS5qYXZhIiwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQljdSA9IHBrZy5nZXRDb21waWxhdGlvblVuaXQoIkEuamF2YSIpOwotCQkJYnl0ZVtdIHRhYiA9IG5ldyBieXRlWzkwXTsKLQkJCXRhYlswXT0xMTI7Ci0JCQl0YWJbMV09MTE3OwotCQkJdGFiWzJdPTk4OwotCQkJdGFiWzNdPTEwODsKLQkJCXRhYls0XT0xMDU7Ci0JCQl0YWJbNV09OTk7Ci0JCQl0YWJbNl09MzI7Ci0JCQl0YWJbN109OTk7Ci0JCQl0YWJbOF09MTA4OwotCQkJdGFiWzldPTk3OwotCQkJdGFiWzEwXT0xMTU7Ci0JCQl0YWJbMTFdPTExNTsKLQkJCXRhYlsxMl09MzI7Ci0JCQl0YWJbMTNdPTY1OwotCQkJdGFiWzE0XT0zMjsKLQkJCXRhYlsxNV09MTIzOwotCQkJdGFiWzE2XT0xMzsKLQkJCXRhYlsxN109MTA7Ci0JCQl0YWJbMThdPTk7Ci0JCQl0YWJbMTldPTExMjsKLQkJCXRhYlsyMF09MTE3OwotCQkJdGFiWzIxXT05ODsKLQkJCXRhYlsyMl09MTA4OwotCQkJdGFiWzIzXT0xMDU7Ci0JCQl0YWJbMjRdPTk5OwotCQkJdGFiWzI1XT0zMjsKLQkJCXRhYlsyNl09MTE1OwotCQkJdGFiWzI3XT0xMTY7Ci0JCQl0YWJbMjhdPTk3OwotCQkJdGFiWzI5XT0xMTY7Ci0JCQl0YWJbMzBdPTEwNTsKLQkJCXRhYlszMV09OTk7Ci0JCQl0YWJbMzJdPTMyOwotCQkJdGFiWzMzXT0xMDk7Ci0JCQl0YWJbMzRdPTk3OwotCQkJdGFiWzM1XT0xMDU7Ci0JCQl0YWJbMzZdPTExMDsKLQkJCXRhYlszN109NDA7Ci0JCQl0YWJbMzhdPTgzOwotCQkJdGFiWzM5XT0xMTY7Ci0JCQl0YWJbNDBdPTExNDsKLQkJCXRhYls0MV09MTA1OwotCQkJdGFiWzQyXT0xMTA7Ci0JCQl0YWJbNDNdPTEwMzsKLQkJCXRhYls0NF09OTE7Ci0JCQl0YWJbNDVdPTkzOwotCQkJdGFiWzQ2XT0zMjsKLQkJCXRhYls0N109OTc7Ci0JCQl0YWJbNDhdPTExNDsKLQkJCXRhYls0OV09MTAzOwotCQkJdGFiWzUwXT0xMTU7Ci0JCQl0YWJbNTFdPTQxOwotCQkJdGFiWzUyXT0zMjsKLQkJCXRhYls1M109MTIzOwotCQkJdGFiWzU0XT0xMzsKLQkJCXRhYls1NV09MTA7Ci0JCQl0YWJbNTZdPTk7Ci0JCQl0YWJbNTddPTk7Ci0JCQl0YWJbNThdPTgzOwotCQkJdGFiWzU5XT0xMjE7Ci0JCQl0YWJbNjBdPTExNTsKLQkJCXRhYls2MV09MTE2OwotCQkJdGFiWzYyXT0xMDE7Ci0JCQl0YWJbNjNdPTEwOTsKLQkJCXRhYls2NF09NDY7Ci0JCQl0YWJbNjVdPTExMTsKLQkJCXRhYls2Nl09MTE3OwotCQkJdGFiWzY3XT0xMTY7Ci0JCQl0YWJbNjhdPTQ2OwotCQkJdGFiWzY5XT0xMTI7Ci0JCQl0YWJbNzBdPTExNDsKLQkJCXRhYls3MV09MTA1OwotCQkJdGFiWzcyXT0xMTA7Ci0JCQl0YWJbNzNdPTExNjsKLQkJCXRhYls3NF09MTA4OwotCQkJdGFiWzc1XT0xMTA7Ci0JCQl0YWJbNzZdPTQwOwotCQkJdGFiWzc3XT0zNDsKLQkJCXRhYls3OF09LTYxOwotCQkJdGFiWzc5XT0tODc7Ci0JCQl0YWJbODBdPTM0OwotCQkJdGFiWzgxXT00MTsKLQkJCXRhYls4Ml09NTk7Ci0JCQl0YWJbODNdPTEzOwotCQkJdGFiWzg0XT0xMDsKLQkJCXRhYls4NV09OTsKLQkJCXRhYls4Nl09MTI1OwotCQkJdGFiWzg3XT0xMzsKLQkJCXRhYls4OF09MTA7Ci0JCQl0YWJbODldPTEyNTsKLQkJCWJ5dGVbXSBlbmNvZGVkQ29udGVudHMgPSBVdGlsLmdldFJlc291cmNlQ29udGVudHNBc0J5dGVBcnJheShqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoY3UuZ2V0UGF0aCgpKSk7Ci0JCQlhc3NlcnRUcnVlKCJ3cm9uZyBzaXplIG9mIGVuY29kZWQgc3RyaW5nIiwgdGFiLmxlbmd0aCA9PSBlbmNvZGVkQ29udGVudHMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwLCBtYXggPSB0YWIubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCQlhc3NlcnRUcnVlKCJ3cm9uZyBzaXplIG9mIGVuY29kZWQgY2hhcmFjdGVyIGF0IiArIGksIHRhYltpXSA9PSBlbmNvZGVkQ29udGVudHNbaV0pOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJZGVsZXRlUHJvamVjdCgiUCIpOwotCQkJCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJCi0JCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShSZXNvdXJjZXNQbHVnaW4uUFJFRl9FTkNPRElORywgc2F2ZWRFbmNvZGluZyk7Ci0JCQkKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRQbHVnaW4oKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJfQotCX0JCi19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvRXhjbHVzaW9uUGF0dGVybnNUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0V4Y2x1c2lvblBhdHRlcm5zVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI0ODUyOS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvRXhjbHVzaW9uUGF0dGVybnNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotCi1wdWJsaWMgY2xhc3MgRXhjbHVzaW9uUGF0dGVybnNUZXN0cyBleHRlbmRzIE1vZGlmeWluZ1Jlc291cmNlVGVzdHMgewotCUlKYXZhUHJvamVjdCBwcm9qZWN0OwotcHVibGljIEV4Y2x1c2lvblBhdHRlcm5zVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXByb3RlY3RlZCB2b2lkIHNldENsYXNzcGF0aChTdHJpbmdbXSBzb3VyY2VGb2xkZXJzQW5kRXhjbHVzaW9uUGF0dGVybnMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCXRoaXMucHJvamVjdC5zZXRSYXdDbGFzc3BhdGgoY3JlYXRlQ2xhc3NwYXRoKHNvdXJjZUZvbGRlcnNBbmRFeGNsdXNpb25QYXR0ZXJucyksIG51bGwpOwotfQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQlzdXBlci5zZXRVcCgpOwotCXRoaXMucHJvamVjdCA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCXN0YXJ0RGVsdGFzKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlpZiAoZmFsc2UpIHsKLQkJU3VpdGUgc3VpdGUgPSBuZXcgU3VpdGUoRXhjbHVzaW9uUGF0dGVybnNUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFeGNsdXNpb25QYXR0ZXJuc1Rlc3RzKCJ0ZXN0U2VhcmNoUG90ZW50aWFsTWF0Y2hJbk91dHB1dCIpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQlyZXR1cm4gbmV3IFN1aXRlKEV4Y2x1c2lvblBhdHRlcm5zVGVzdHMuY2xhc3MpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCXN0b3BEZWx0YXMoKTsKLQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQlzdXBlci50ZWFyRG93bigpOwotfQotLyoKLSAqIEVuc3VyZSB0aGF0IGFkZGluZyBhbiBleGNsdXNpb24gb24gYSBjb21waWxhdGlvbiB1bml0Ci0gKiBtYWtlcyBpdCBkaXNhcHBlYXJzIGZyb20gdGhlIGNoaWxkcmVuIG9mIGl0cyBwYWNrYWdlIGFuZCBpdCBpcyBhZGRlZCB0byB0aGUgbm9uLWphdmEgcmVzb3VyY2VzLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0QWRkRXhjbHVzaW9uT25Db21waWxhdGlvblVuaXQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy9wIik7Ci0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL3AvQS5qYXZhIiwKLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCSJ9IgotCSk7Ci0JCi0JY2xlYXJEZWx0YXMoKTsKLQl0aGlzLnNldENsYXNzcGF0aChuZXcgU3RyaW5nW10geyIvUC9zcmMiLCAiKiovQS5qYXZhIn0pOwotCQotCWFzc2VydERlbHRhcygKLQkJIlVuZXhwZWN0ZWQgZGVsdGFzIiwKLQkJIlBbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJIglzcmNbKl06IHtBRERFRCBUTyBDTEFTU1BBVEggfCBSRU1PVkVEIEZST00gQ0xBU1NQQVRIfVxuIiArIAotCQkiCVJlc291cmNlRGVsdGEoL1AvLmNsYXNzcGF0aClbKl0iCi0JKTsKLQkKLQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IGdldFBhY2thZ2UoIi9QL3NyYy9wIik7Ci0JYXNzZXJ0U29ydGVkRWxlbWVudHNFcXVhbCgKLQkJIlVuZXhwZWN0ZWQgY2hpbGRyZW4iLAotCQkiIiwKLQkJcGtnLmdldENoaWxkcmVuKCkpOwotCQkKLQlhc3NlcnRSZXNvdXJjZXNFcXVhbCgKLQkJIlVuZXhwZWN0ZWQgbm9uLWphdmEgcmVzb3VyY2VzIiwKLQkJIkEuamF2YSIsCi0JCXBrZy5nZXROb25KYXZhUmVzb3VyY2VzKCkpOwotfQotLyoKLSAqIEVuc3VyZSB0aGF0IGFkZGluZyBhbiBleGNsdXNpb24gb24gYSBmb2xkZXIgZGlyZWN0bHkgdW5kZXIgYSBwcm9qZWN0IChhbmQgcHJqPXNyYykKLSAqIG1ha2VzIGl0IGFwcGVhcnMgYXMgYSBub24tamF2YSByZXNvdXJjZXMuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMjkzNzQgRXhjbHVkZWQgZm9sZGVyIG9uIHByb2plY3Qgbm90IHJldHVybmVkIGJ5IEphdmEgTW9kZWwpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RBZGRFeGNsdXNpb25PbkZvbGRlclVuZGVyUHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMSIsIG5ldyBTdHJpbmdbXSB7IiJ9LCAiIik7Ci0JCXRoaXMuY3JlYXRlRm9sZGVyKCIvUDEvZG9jIik7Ci0KLQkJY2xlYXJEZWx0YXMoKTsKLQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKGNyZWF0ZUNsYXNzcGF0aChuZXcgU3RyaW5nW10geyIvUDEiLCAiZG9jLyJ9KSwgbnVsbCk7Ci0JCi0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhcyIsCi0JCQkiUDFbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJCSIJW3Byb2plY3Qgcm9vdF1bKl06IHtBRERFRCBUTyBDTEFTU1BBVEggfCBSRU1PVkVEIEZST00gQ0xBU1NQQVRIfVxuIiArIAotCQkJIglSZXNvdXJjZURlbHRhKC9QMS8uY2xhc3NwYXRoKVsqXSIKLQkJKTsKLQkKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoIi9QMSIpOwotCQlhc3NlcnRTb3J0ZWRFbGVtZW50c0VxdWFsKAotCQkJIlVuZXhwZWN0ZWQgY2hpbGRyZW4iLAotCQkJIiIsCi0JCQlyb290LmdldENoaWxkcmVuKCkpOwotCQkKLQkJYXNzZXJ0UmVzb3VyY2VzRXF1YWwoCi0JCQkiVW5leHBlY3RlZCBub24tamF2YSByZXNvdXJjZXMgb2YgcHJvamVjdCIsCi0JCQkiLmNsYXNzcGF0aFxuIiArCi0JCQkiLnByb2plY3RcbiIgKwotCQkJImRvYyIsCi0JCQlqYXZhUHJvamVjdC5nZXROb25KYXZhUmVzb3VyY2VzKCkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDEiKTsKLQl9Ci19Ci0vKgotICogRW5zdXJlIHRoYXQgYWRkaW5nIGFuIGV4Y2x1c2lvbiBvbiBhIHBhY2thZ2UKLSAqIG1ha2VzIGl0IGRpc2FwcGVhcnMgZnJvbSB0aGUgY2hpbGRyZW4gb2YgaXRzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCAKLSAqIGFuZCBpdCBpcyBhZGRlZCB0byB0aGUgbm9uLWphdmEgcmVzb3VyY2VzLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0QWRkRXhjbHVzaW9uT25QYWNrYWdlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuY3JlYXRlRm9sZGVyKCIvUC9zcmMvcCIpOwotCQotCWNsZWFyRGVsdGFzKCk7Ci0JdGhpcy5zZXRDbGFzc3BhdGgobmV3IFN0cmluZ1tdIHsiL1Avc3JjIiwgInAvIn0pOwotCQotCWFzc2VydERlbHRhcygKLQkJIlVuZXhwZWN0ZWQgZGVsdGFzIiwKLQkJIlBbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJIglzcmNbKl06IHtBRERFRCBUTyBDTEFTU1BBVEggfCBSRU1PVkVEIEZST00gQ0xBU1NQQVRIfVxuIiArIAotCQkiCVJlc291cmNlRGVsdGEoL1AvLmNsYXNzcGF0aClbKl0iCi0JKTsKLQkKLQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgiL1Avc3JjIik7Ci0JYXNzZXJ0U29ydGVkRWxlbWVudHNFcXVhbCgKLQkJIlVuZXhwZWN0ZWQgY2hpbGRyZW4iLAotCQkiIiwKLQkJcm9vdC5nZXRDaGlsZHJlbigpKTsKLQkJCi0JYXNzZXJ0UmVzb3VyY2VzRXF1YWwoCi0JCSJVbmV4cGVjdGVkIG5vbi1qYXZhIHJlc291cmNlcyIsCi0JCSJwIiwKLQkJcm9vdC5nZXROb25KYXZhUmVzb3VyY2VzKCkpOwotfQotLyoKLSAqIEVuc3VyZSB0aGF0IGFkZGluZyBhIGZpbGUgdG8gYSBmb2xkZXIgdGhhdCBpcyBleGNsdWRlZCByZXBvcnRzIHRoZSBjb3JyZWN0IGRlbHRhLgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDI5NjIxIFdyb25nIERlbHRhIFdoZW4gQWRkaW5nIHRvIEZpbHRlcmVkIEZvbGRlcikKLSAqLwotcHVibGljIHZvaWQgdGVzdEFkZFRvRXhjbHVkZWRGb2xkZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy9pY29ucyIpOwotCQotCS8vIGV4Y2x1ZGUgZm9sZGVyIGFuZCBpdHMgY29udGVudHMKLQl0aGlzLnNldENsYXNzcGF0aChuZXcgU3RyaW5nW10geyIvUC9zcmMiLCAiaWNvbnMvIn0pOwotCQotCWNsZWFyRGVsdGFzKCk7Ci0JdGhpcy5jcmVhdGVGaWxlKCIvUC9zcmMvaWNvbnMvbXkudHh0IiwgIiIpOwotCWFzc2VydERlbHRhcygKLQkJIlVuZXhwZWN0ZWQgZGVsdGFzIiwKLQkJIlBbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJIglzcmNbKl06IHtDT05URU5UfVxuIiArIAotCQkiCQlSZXNvdXJjZURlbHRhKC9QL3NyYy9pY29ucylbKl0iCi0JKTsKLQkKLQljbGVhckRlbHRhcygpOwotCXRoaXMuZGVsZXRlRmlsZSgiL1Avc3JjL2ljb25zL215LnR4dCIpOwotCWFzc2VydERlbHRhcygKLQkJIlVuZXhwZWN0ZWQgZGVsdGFzIiwKLQkJIlBbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJIglzcmNbKl06IHtDT05URU5UfVxuIiArIAotCQkiCQlSZXNvdXJjZURlbHRhKC9QL3NyYy9pY29ucylbKl0iCi0JKTsKLX0KLS8qCi0gKiBFbnN1cmUgdGhhdCBjcmVhdGluZyBhbiBleGNsdWRlZCBjb21waWxhdGlvbiB1bml0IAotICogZG9lc24ndCBtYWtlIGl0IGFwcGVhciBhcyBhIGNoaWxkIG9mIGl0cyBwYWNrYWdlIGJ1dCBpdCBpcyBhIG5vbi1qYXZhIHJlc291cmNlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRXhjbHVkZWRDb21waWxhdGlvblVuaXQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5zZXRDbGFzc3BhdGgobmV3IFN0cmluZ1tdIHsiL1Avc3JjIiwgIioqL0EuamF2YSJ9KTsKLQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjL3AiKTsKLQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IGdldFBhY2thZ2UoIi9QL3NyYy9wIik7Ci0KLQljbGVhckRlbHRhcygpOwotCXBrZy5jcmVhdGVDb21waWxhdGlvblVuaXQoCi0JCSJBLmphdmEiLAotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJIn0iLAotCQlmYWxzZSwKLQkJbnVsbCk7Ci0JCi0JYXNzZXJ0RGVsdGFzKAotCQkiVW5leHBlY3RlZCBkZWx0YXMiLAotCQkiUFsqXToge0NISUxEUkVOfVxuIiArIAotCQkiCXNyY1sqXToge0NISUxEUkVOfVxuIiArIAotCQkiCQlwWypdOiB7Q09OVEVOVH1cbiIgKyAKLQkJIgkJCVJlc291cmNlRGVsdGEoL1Avc3JjL3AvQS5qYXZhKVsrXSIKLQkpOwotCQotCWFzc2VydFNvcnRlZEVsZW1lbnRzRXF1YWwoCi0JCSJVbmV4cGVjdGVkIGNoaWxkcmVuIiwKLQkJIiIsCi0JCXBrZy5nZXRDaGlsZHJlbigpKTsKLQkJCi0JYXNzZXJ0UmVzb3VyY2VzRXF1YWwoCi0JCSJVbmV4cGVjdGVkIG5vbi1qYXZhIHJlc291cmNlcyIsCi0JCSJBLmphdmEiLAotCQlwa2cuZ2V0Tm9uSmF2YVJlc291cmNlcygpKTsKLX0KLS8qCi0gKiBFbnN1cmUgdGhhdCBjcmVhcmluZyBhbiBleGNsdWRlZCBwYWNrYWdlIAotICogZG9lc24ndCBtYWtlIGl0IGFwcGVhciBhcyBhIGNoaWxkIG9mIGl0cyBwYWNrYWdlIGZyYWdtZW50IHJvb3QgYnV0IGl0IGlzIGEgbm9uLWphdmEgcmVzb3VyY2UuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVFeGNsdWRlZFBhY2thZ2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5zZXRDbGFzc3BhdGgobmV3IFN0cmluZ1tdIHsiL1Avc3JjIiwgInAvIn0pOwotCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCIvUC9zcmMiKTsKLQkKLQljbGVhckRlbHRhcygpOwotCXJvb3QuY3JlYXRlUGFja2FnZUZyYWdtZW50KCJwIiwgZmFsc2UsIG51bGwpOwotCQotCWFzc2VydERlbHRhcygKLQkJIlVuZXhwZWN0ZWQgZGVsdGFzIiwKLQkJIlBbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJIglzcmNbKl06IHtDT05URU5UfVxuIiArIAotCQkiCQlSZXNvdXJjZURlbHRhKC9QL3NyYy9wKVsrXSIKLQkpOwotCQotCWFzc2VydFNvcnRlZEVsZW1lbnRzRXF1YWwoCi0JCSJVbmV4cGVjdGVkIGNoaWxkcmVuIiwKLQkJIiIsCi0JCXJvb3QuZ2V0Q2hpbGRyZW4oKSk7Ci0JCQotCWFzc2VydFJlc291cmNlc0VxdWFsKAotCQkiVW5leHBlY3RlZCBub24tamF2YSByZXNvdXJjZXMiLAotCQkicCIsCi0JCXJvb3QuZ2V0Tm9uSmF2YVJlc291cmNlcygpKTsKLX0KLS8qCi0gKiBFbnN1cmUgdGhhdCBjcmVhdGluZyBhIGZpbGUgdGhhdCBjb3JyZXNwb25kcyB0byBhbiBleGNsdWRlZCBjb21waWxhdGlvbiB1bml0IAotICogZG9lc24ndCBtYWtlIGl0IGFwcGVhciBhcyBhIGNoaWxkIG9mIGl0cyBwYWNrYWdlIGJ1dCBpdCBpcyBhIG5vbi1qYXZhIHJlc291cmNlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUmVzb3VyY2VFeGNsdWRlZENvbXBpbGF0aW9uVW5pdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLnNldENsYXNzcGF0aChuZXcgU3RyaW5nW10geyIvUC9zcmMiLCAiKiovQS5qYXZhIn0pOwotCXRoaXMuY3JlYXRlRm9sZGVyKCIvUC9zcmMvcCIpOwotCQotCWNsZWFyRGVsdGFzKCk7Ci0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL3AvQS5qYXZhIiwKLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCSJ9IgotCSk7Ci0JCi0JYXNzZXJ0RGVsdGFzKAotCQkiVW5leHBlY3RlZCBkZWx0YXMiLAotCQkiUFsqXToge0NISUxEUkVOfVxuIiArIAotCQkiCXNyY1sqXToge0NISUxEUkVOfVxuIiArIAotCQkiCQlwWypdOiB7Q09OVEVOVH1cbiIgKyAKLQkJIgkJCVJlc291cmNlRGVsdGEoL1Avc3JjL3AvQS5qYXZhKVsrXSIKLQkpOwotCQotCUlQYWNrYWdlRnJhZ21lbnQgcGtnID0gZ2V0UGFja2FnZSgiL1Avc3JjL3AiKTsKLQlhc3NlcnRTb3J0ZWRFbGVtZW50c0VxdWFsKAotCQkiVW5leHBlY3RlZCBjaGlsZHJlbiIsCi0JCSIiLAotCQlwa2cuZ2V0Q2hpbGRyZW4oKSk7Ci0JCQotCWFzc2VydFJlc291cmNlc0VxdWFsKAotCQkiVW5leHBlY3RlZCBub24tamF2YSByZXNvdXJjZXMiLAotCQkiQS5qYXZhIiwKLQkJcGtnLmdldE5vbkphdmFSZXNvdXJjZXMoKSk7Ci19Ci0vKgotICogRW5zdXJlIHRoYXQgY3JlYXRpbmcgYSBmb2xkZXIgdGhhdCBjb3JyZXNwb25kcyB0byBhbiBleGNsdWRlZCBwYWNrYWdlIAotICogZG9lc24ndCBtYWtlIGl0IGFwcGVhciBhcyBhIGNoaWxkIG9mIGl0cyBwYWNrYWdlIGZyYWdtZW50IHJvb3QgYnV0IGl0IGlzIGEgbm9uLWphdmEgcmVzb3VyY2UuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVSZXNvdXJjZUV4Y2x1ZGVkUGFja2FnZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLnNldENsYXNzcGF0aChuZXcgU3RyaW5nW10geyIvUC9zcmMiLCAicC8ifSk7Ci0JCi0JY2xlYXJEZWx0YXMoKTsKLQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjL3AiKTsKLQkKLQlhc3NlcnREZWx0YXMoCi0JCSJVbmV4cGVjdGVkIGRlbHRhcyIsCi0JCSJQWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCSIJc3JjWypdOiB7Q09OVEVOVH1cbiIgKyAKLQkJIgkJUmVzb3VyY2VEZWx0YSgvUC9zcmMvcClbK10iCi0JKTsKLQkKLQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgiL1Avc3JjIik7Ci0JYXNzZXJ0U29ydGVkRWxlbWVudHNFcXVhbCgKLQkJIlVuZXhwZWN0ZWQgY2hpbGRyZW4iLAotCQkiIiwKLQkJcm9vdC5nZXRDaGlsZHJlbigpKTsKLQkJCi0JYXNzZXJ0UmVzb3VyY2VzRXF1YWwoCi0JCSJVbmV4cGVjdGVkIG5vbi1qYXZhIHJlc291cmNlcyIsCi0JCSJwIiwKLQkJcm9vdC5nZXROb25KYXZhUmVzb3VyY2VzKCkpOwotfQotLyoKLSAqIEVuc3VyZXMgdGhhdCBhIGN1IHRoYXQgaXMgbm90IGV4Y2x1ZGVkIGlzIG9uIHRoZSBjbGFzc3BhdGggb2YgdGhlIHByb2plY3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RJc09uQ2xhc3NwYXRoMSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLnNldENsYXNzcGF0aChuZXcgU3RyaW5nW10geyIvUC9zcmMiLCAiIn0pOwotCXRoaXMuY3JlYXRlRm9sZGVyKCIvUC9zcmMvcCIpOwotCUlGaWxlIGZpbGUgPSB0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvcC9BLmphdmEiLAotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJIn0iCi0JKTsKLQlhc3NlcnRUcnVlKCJSZXNvdXJjZSBzaG91bGQgYmUgb24gY2xhc3NwYXRoIiwgcHJvamVjdC5pc09uQ2xhc3NwYXRoKGZpbGUpKTsKLQkKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvcC9BLmphdmEiKTsKLQlhc3NlcnRUcnVlKCJDVSBzaG91bGQgYmUgb24gY2xhc3NwYXRoIiwgcHJvamVjdC5pc09uQ2xhc3NwYXRoKGN1KSk7Ci19Ci0vKgotICogRW5zdXJlcyB0aGF0IGEgY3UgdGhhdCBpcyBleGNsdWRlZCBpcyBub3Qgb24gdGhlIGNsYXNzcGF0aCBvZiB0aGUgcHJvamVjdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdElzT25DbGFzc3BhdGgyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuc2V0Q2xhc3NwYXRoKG5ldyBTdHJpbmdbXSB7Ii9QL3NyYyIsICIqKi9BLmphdmEifSk7Ci0JdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy9wIik7Ci0JSUZpbGUgZmlsZSA9IHRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9wL0EuamF2YSIsCi0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkifSIKLQkpOwotCWFzc2VydFRydWUoIlJlc291cmNlIHNob3VsZCBub3QgYmUgb24gY2xhc3NwYXRoIiwgIXByb2plY3QuaXNPbkNsYXNzcGF0aChmaWxlKSk7Ci0JCi0JSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL3AvQS5qYXZhIik7Ci0JYXNzZXJ0VHJ1ZSgiQ1Ugc2hvdWxkIG5vdCBiZSBvbiBjbGFzc3BhdGgiLCAhcHJvamVjdC5pc09uQ2xhc3NwYXRoKGN1KSk7Ci19Ci0vKgotICogRW5zdXJlcyB0aGF0IGEgbm9uLWphdmEgcmVzb3VyY2UgdGhhdCBpcyBub3QgZXhjbHVkZWQgaXMgb24gdGhlIGNsYXNzcGF0aCBvZiB0aGUgcHJvamVjdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdElzT25DbGFzc3BhdGgzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuc2V0Q2xhc3NwYXRoKG5ldyBTdHJpbmdbXSB7Ii9QL3NyYyIsICIifSk7Ci0JdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy9wIik7Ci0JSUZpbGUgZmlsZSA9IHRoaXMuY3JlYXRlRmlsZSgiL1Avc3JjL3AvcmVhZG1lLnR4dCIsICIiKTsKLQlhc3NlcnRUcnVlKCJSZXNvdXJjZSBzaG91bGQgYmUgb24gY2xhc3NwYXRoIiwgcHJvamVjdC5pc09uQ2xhc3NwYXRoKGZpbGUpKTsKLX0KLS8qCi0gKiBFbnN1cmVzIHRoYXQgYSBub24tamF2YSByZXNvdXJjZSB0aGF0IGlzIGV4Y2x1ZGVkIGlzIG5vdCBvbiB0aGUgY2xhc3NwYXRoIG9mIHRoZSBwcm9qZWN0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0SXNPbkNsYXNzcGF0aDQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5zZXRDbGFzc3BhdGgobmV3IFN0cmluZ1tdIHsiL1Avc3JjIiwgInAvKioifSk7Ci0JdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy9wIik7Ci0JSUZpbGUgZmlsZSA9IHRoaXMuY3JlYXRlRmlsZSgiL1Avc3JjL3AvcmVhZG1lLnR4dCIsICIiKTsKLQlhc3NlcnRUcnVlKCJSZXNvdXJjZSBzaG91bGQgbm90IGJlIG9uIGNsYXNzcGF0aCIsICFwcm9qZWN0LmlzT25DbGFzc3BhdGgoZmlsZSkpOwotfQotLyoKLSAqIEVuc3VyZXMgdGhhdCBhbiBleGNsdWRlZCBuZXN0ZWQgc291cmNlIGZvbGRlciBkb2Vzbid0IGFwcGVhciBhcyBhIG5vbi1qYXZhIHJlc291cmNlIG9mIHRoZSBvdXRlciBmb2xkZXIuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMjgxMTUgVWJpcXVpdG91cyByZXNvdXJjZSBpbiB0aGUgSmF2YU1vZGVsKQotICogCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRTb3VyY2VGb2xkZXIxKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuc2V0Q2xhc3NwYXRoKG5ldyBTdHJpbmdbXSB7Ii9QL3NyYzEiLCAic3JjMi8qKiIsICIvUC9zcmMxL3NyYzIiLCAiIn0pOwotCXRoaXMuY3JlYXRlRm9sZGVyKCIvUC9zcmMxL3NyYzIiKTsKLQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290MSA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoIi9QL3NyYzEiKTsKLQlhc3NlcnRSZXNvdXJjZXNFcXVhbCgKLQkJIlVuZXhwZWN0ZWQgbm9uLWphdmEgcmVzb3VyY2VzIGZvciAvUC9zcmMxIiwKLQkJIiIsCi0JCXJvb3QxLmdldE5vbkphdmFSZXNvdXJjZXMoKSk7Ci19Ci0vKgotICogRW5zdXJlcyB0aGF0IGFkZGluZyBhIC5qYXZhIGZpbGUgaW4gYSBuZXN0ZWQgc291cmNlIGZvbGRlciByZXBvcnRzIAotICogYSBkZWx0YSBvbiB0aGUgbmVzdGVkIHNvdXJjZSBmb2xkZXIgYW5kIG5vdCBvbiB0aGUgb3V0ZXIgb25lLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TmVzdGVkU291cmNlRm9sZGVyMigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLnNldENsYXNzcGF0aChuZXcgU3RyaW5nW10geyIvUC9zcmMxIiwgInNyYzIvKioiLCAiL1Avc3JjMS9zcmMyIiwgIiJ9KTsKLQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjMS9zcmMyIik7Ci0JCi0JdGhpcy5jbGVhckRlbHRhcygpOwotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYzEvc3JjMi9BLmphdmEiLAotCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCSJ9IgotCSk7Ci0JCi0JYXNzZXJ0RGVsdGFzKAotCQkiVW5leHBlY3RlZCBkZWx0YXMiLAotCQkiUFsqXToge0NISUxEUkVOfVxuIiArIAotCQkiCXNyYzEvc3JjMlsqXToge0NISUxEUkVOfVxuIiArIAotCQkiCQlbZGVmYXVsdF1bKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJIgkJCUEuamF2YVsrXToge30iCi0JKTsKLX0KLS8qCi0gKiBFbnN1cmVzIHRoYXQgYWRkaW5nIGEgLnR4dCBmaWxlIGluIGEgbmVzdGVkIHNvdXJjZSBmb2xkZXIgcmVwb3J0cyAKLSAqIGEgcmVzb3VyY2UgZGVsdGEgb24gdGhlIG5lc3RlZCBzb3VyY2UgZm9sZGVyIGFuZCBub3Qgb24gdGhlIG91dGVyIG9uZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdE5lc3RlZFNvdXJjZUZvbGRlcjMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5zZXRDbGFzc3BhdGgobmV3IFN0cmluZ1tdIHsiL1Avc3JjMSIsICJzcmMyLyoqIiwgIi9QL3NyYzEvc3JjMiIsICIifSk7Ci0JdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYzEvc3JjMiIpOwotCQotCXRoaXMuY2xlYXJEZWx0YXMoKTsKLQl0aGlzLmNyZWF0ZUZpbGUoIi9QL3NyYzEvc3JjMi9yZWFkbWUudHh0IiwgIiIpOwotCQotCWFzc2VydERlbHRhcygKLQkJIlVuZXhwZWN0ZWQgZGVsdGFzIiwKLQkJIlBbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJIglzcmMxL3NyYzJbKl06IHtDT05URU5UfVxuIiArIAotCQkiCQlSZXNvdXJjZURlbHRhKC9QL3NyYzEvc3JjMi9yZWFkbWUudHh0KVsrXSIKLQkpOwotfQotLyoKLSAqIEVuc3VyZXMgdGhhdCBhZGRpbmcgYSBmb2xkZXIgaW4gYSBuZXN0ZWQgc291cmNlIGZvbGRlciByZXBvcnRzIAotICogYSBkZWx0YSBvbiB0aGUgbmVzdGVkIHNvdXJjZSBmb2xkZXIgYW5kIG5vdCBvbiB0aGUgb3V0ZXIgb25lLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TmVzdGVkU291cmNlRm9sZGVyNCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLnNldENsYXNzcGF0aChuZXcgU3RyaW5nW10geyIvUC9zcmMxIiwgInNyYzIvKioiLCAiL1Avc3JjMS9zcmMyIiwgIiJ9KTsKLQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjMS9zcmMyIik7Ci0JCi0JdGhpcy5jbGVhckRlbHRhcygpOwotCXRoaXMuY3JlYXRlRm9sZGVyKCIvUC9zcmMxL3NyYzIvcCIpOwotCQotCWFzc2VydERlbHRhcygKLQkJIlVuZXhwZWN0ZWQgZGVsdGFzIiwKLQkJIlBbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJIglzcmMxL3NyYzJbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJIgkJcFsrXToge30iCi0JKTsKLX0KLS8qCi0gKiBFbnN1cmVzIHRoYXQgYWRkaW5nIGEgZm9sZGVyIGluIGEgb3V0ZXIgc291cmNlIGZvbGRlciByZXBvcnRzIAotICogYSBkZWx0YSBvbiB0aGUgb3V0ZXIgc291cmNlIGZvbGRlciBhbmQgbm90IG9uIHRoZSBuZXN0ZWQgb25lLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TmVzdGVkU291cmNlRm9sZGVyNSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLnNldENsYXNzcGF0aChuZXcgU3RyaW5nW10geyIvUC9zcmMxIiwgInNyYzIvKioiLCAiL1Avc3JjMS9zcmMyIiwgIiJ9KTsKLQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjMS9zcmMyIik7Ci0JCi0JdGhpcy5jbGVhckRlbHRhcygpOwotCXRoaXMuY3JlYXRlRm9sZGVyKCIvUC9zcmMxL3AiKTsKLQkKLQlhc3NlcnREZWx0YXMoCi0JCSJVbmV4cGVjdGVkIGRlbHRhcyIsCi0JCSJQWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCSIJc3JjMVsqXToge0NISUxEUkVOfVxuIiArIAotCQkiCQlwWytdOiB7fSIKLQkpOwotfQotLyoKLSAqIEVuc3VyZXMgdGhhdCBtb3ZpbmcgYSBwYWNrYWdlIGZyb20gYW4gb3V0ZXIgc291cmNlIGZvbGRlciB0byBhIG5lc3RlZAotICogc291cmNlIGZvbGRlciByZXBvcnRzIGEgbW92ZSBkZWx0YS4KLSAqLwotcHVibGljIHZvaWQgdGVzdE5lc3RlZFNvdXJjZUZvbGRlcjYoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5zZXRDbGFzc3BhdGgobmV3IFN0cmluZ1tdIHsiL1Avc3JjMSIsICJzcmMyLyoqIiwgIi9QL3NyYzEvc3JjMiIsICIifSk7Ci0JdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYzEvc3JjMiIpOwotCXRoaXMuY3JlYXRlRm9sZGVyKCIvUC9zcmMxL3AiKTsKLQkKLQl0aGlzLmNsZWFyRGVsdGFzKCk7Ci0JdGhpcy5tb3ZlRm9sZGVyKCIvUC9zcmMxL3AiLCAiL1Avc3JjMS9zcmMyL3AiKTsKLQkKLQlhc3NlcnREZWx0YXMoCi0JCSJVbmV4cGVjdGVkIGRlbHRhcyIsCi0JCSJQWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCSIJc3JjMVsqXToge0NISUxEUkVOfVxuIiArIAotCQkiCQlwWy1dOiB7TU9WRURfVE8ocCBbaW4gc3JjMS9zcmMyIFtpbiBQXV0pfVxuIiArIAotCQkiCXNyYzEvc3JjMlsqXToge0NISUxEUkVOfVxuIiArIAotCQkiCQlwWytdOiB7TU9WRURfRlJPTShwIFtpbiBzcmMxIFtpbiBQXV0pfSIKLQkpOwotfQotLyoKLSAqIEVuc3VyZSB0aGF0IHJlbmFtaW5nIGFuIGV4Y2x1ZGVkIGNvbXBpbGF0aW9uIHVuaXQgc28gdGhhdCBpdCBpcyBub3QgZXhjbHVkZWQgYW55IGxvbmdlcgotICogbWFrZXMgaXQgYXBwZWFycyBhcyBhIGNoaWxkIG9mIGl0cyBwYWNrYWdlIGFuZCBpdCBpcyByZW1vdmVkIGZyb20gdGhlIG5vbi1qYXZhIHJlc291cmNlcy4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJlbmFtZUV4Y2x1ZGVkQ29tcGlsYXRpb25Vbml0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuc2V0Q2xhc3NwYXRoKG5ldyBTdHJpbmdbXSB7Ii9QL3NyYyIsICIqKi9BLmphdmEifSk7Ci0JdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy9wIik7Ci0JSUZpbGUgZmlsZSA9IHRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9wL0EuamF2YSIsCi0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkifSIKLQkpOwotCi0JY2xlYXJEZWx0YXMoKTsKLQlmaWxlLm1vdmUobmV3IFBhdGgoIi9QL3NyYy9wL0IuamF2YSIpLCBmYWxzZSwgbnVsbCk7Ci0JCi0JYXNzZXJ0RGVsdGFzKAotCQkiVW5leHBlY3RlZCBkZWx0YXMiLAotCQkiUFsqXToge0NISUxEUkVOfVxuIiArIAotCQkiCXNyY1sqXToge0NISUxEUkVOfVxuIiArIAotCQkiCQlwWypdOiB7Q0hJTERSRU4gfCBDT05URU5UfVxuIiArIAotCQkiCQkJQi5qYXZhWytdOiB7fVxuIiArIAotCQkiCQkJUmVzb3VyY2VEZWx0YSgvUC9zcmMvcC9BLmphdmEpWy1dIgotCSk7Ci0JCi0JSVBhY2thZ2VGcmFnbWVudCBwa2cgPSBnZXRQYWNrYWdlKCIvUC9zcmMvcCIpOwotCWFzc2VydFNvcnRlZEVsZW1lbnRzRXF1YWwoCi0JCSJVbmV4cGVjdGVkIGNoaWxkcmVuIiwKLQkJIkIuamF2YSIsCi0JCXBrZy5nZXRDaGlsZHJlbigpKTsKLQkJCi0JYXNzZXJ0UmVzb3VyY2VzRXF1YWwoCi0JCSJVbmV4cGVjdGVkIG5vbi1qYXZhIHJlc291cmNlcyIsCi0JCSIiLAotCQlwa2cuZ2V0Tm9uSmF2YVJlc291cmNlcygpKTsKLX0KLS8qCi0gKiBFbnN1cmUgdGhhdCByZW5hbWluZyBhbiBleGNsdWRlZCBwYWNrYWdlIHNvIHRoYXQgaXQgaXMgbm90IGV4Y2x1ZGVkIGFueSBsb25nZXIKLSAqIG1ha2VzIGl0IGFwcGVhcnMgYXMgYSBjaGlsZCBvZiBpdHMgcGFja2FnZSBmcmFnbWVudCByb290IAotICogYW5kIGl0IGlzIHJlbW92ZWQgZnJvbSB0aGUgbm9uLWphdmEgcmVzb3VyY2VzLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVuYW1lRXhjbHVkZWRQYWNrYWdlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuc2V0Q2xhc3NwYXRoKG5ldyBTdHJpbmdbXSB7Ii9QL3NyYyIsICJwLyJ9KTsKLQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgiL1Avc3JjIik7Ci0JSVBhY2thZ2VGcmFnbWVudCBwa2cgPSByb290LmNyZWF0ZVBhY2thZ2VGcmFnbWVudCgicCIsIGZhbHNlLCBudWxsKTsKLQkKLQljbGVhckRlbHRhcygpOwotCXBrZy5yZW5hbWUoInEiLCBmYWxzZSwgbnVsbCk7Ci0JCi0JYXNzZXJ0RGVsdGFzKAotCQkiVW5leHBlY3RlZCBkZWx0YXMiLAotCQkiUFsqXToge0NISUxEUkVOfVxuIiArIAotCQkiCXNyY1sqXToge0NISUxEUkVOIHwgQ09OVEVOVH1cbiIgKyAKLQkJIgkJcVsrXToge31cbiIgKyAKLQkJIgkJUmVzb3VyY2VEZWx0YSgvUC9zcmMvcClbLV0iCi0JKTsKLQkKLQlhc3NlcnRTb3J0ZWRFbGVtZW50c0VxdWFsKAotCQkiVW5leHBlY3RlZCBjaGlsZHJlbiIsCi0JCSJcbiIgKyAvLyBkZWZhdWx0IHBhY2thZ2UKLQkJInEiLAotCQlyb290LmdldENoaWxkcmVuKCkpOwotCQkKLQlhc3NlcnRSZXNvdXJjZXNFcXVhbCgKLQkJIlVuZXhwZWN0ZWQgbm9uLWphdmEgcmVzb3VyY2VzIiwKLQkJIiIsCi0JCXJvb3QuZ2V0Tm9uSmF2YVJlc291cmNlcygpKTsKLX0KLS8qCi0gKiBFbnN1cmUgdGhhdCByZW5hbWluZyBhIGZpbGUgdGhhdCBjb3JyZXNwb25kcyB0byBhbiBleGNsdWRlZCBjb21waWxhdGlvbiB1bml0IHNvIHRoYXQgaXQgaXMgbm90IGV4Y2x1ZGVkIGFueSBsb25nZXIKLSAqIG1ha2VzIGl0IGFwcGVhcnMgYXMgYSBjaGlsZCBvZiBpdHMgcGFja2FnZSBhbmQgaXQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBub24tamF2YSByZXNvdXJjZXMuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZW5hbWVSZXNvdXJjZUV4Y2x1ZGVkQ29tcGlsYXRpb25Vbml0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuc2V0Q2xhc3NwYXRoKG5ldyBTdHJpbmdbXSB7Ii9QL3NyYyIsICIqKi9BLmphdmEifSk7Ci0JdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy9wIik7Ci0JSUZpbGUgZmlsZSA9IHRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9wL0EuamF2YSIsCi0JCSJwYWNrYWdlIHA7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkifSIKLQkpOwotCQotCWNsZWFyRGVsdGFzKCk7Ci0JZmlsZS5tb3ZlKG5ldyBQYXRoKCIvUC9zcmMvcC9CLmphdmEiKSwgIGZhbHNlLCBudWxsKTsKLQkKLQlhc3NlcnREZWx0YXMoCi0JCSJVbmV4cGVjdGVkIGRlbHRhcyIsCi0JCSJQWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCSIJc3JjWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCSIJCXBbKl06IHtDSElMRFJFTiB8IENPTlRFTlR9XG4iICsgCi0JCSIJCQlCLmphdmFbK106IHt9XG4iICsgCi0JCSIJCQlSZXNvdXJjZURlbHRhKC9QL3NyYy9wL0EuamF2YSlbLV0iCi0JKTsKLQkKLQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IGdldFBhY2thZ2UoIi9QL3NyYy9wIik7Ci0JYXNzZXJ0U29ydGVkRWxlbWVudHNFcXVhbCgKLQkJIlVuZXhwZWN0ZWQgY2hpbGRyZW4iLAotCQkiQi5qYXZhIiwKLQkJcGtnLmdldENoaWxkcmVuKCkpOwotCQkKLQlhc3NlcnRSZXNvdXJjZXNFcXVhbCgKLQkJIlVuZXhwZWN0ZWQgbm9uLWphdmEgcmVzb3VyY2VzIiwKLQkJIiIsCi0JCXBrZy5nZXROb25KYXZhUmVzb3VyY2VzKCkpOwotfQotLyoKLSAqIEVuc3VyZSBzZWFyY2ggZG9lc24ndCBmaW5kIG1hdGNoZXMgaW4gYW4gZXhjbHVkZWQgY29tcGlsYXRpb24gdW5pdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdFNlYXJjaFdpdGhFeGNsdWRlZENvbXBpbGF0aW9uVW5pdDEoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5zZXRDbGFzc3BhdGgobmV3IFN0cmluZ1tdIHsiL1Avc3JjIiwgIioqL0EuamF2YSJ9KTsKLQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjL3AiKTsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvcC9BLmphdmEiLAotCQkicGFja2FnZSBwO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJIn0iCi0JKTsKLQkKLQlKYXZhU2VhcmNoVGVzdHMuSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFRlc3RzLkphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCSJBIiwKLQkJSUphdmFTZWFyY2hDb25zdGFudHMuVFlQRSwKLQkJSUphdmFTZWFyY2hDb25zdGFudHMuREVDTEFSQVRJT05TLCAKLQkJU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShuZXcgSUphdmFQcm9qZWN0W10ge2dldEphdmFQcm9qZWN0KCJQIil9KSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiVW5leHBlY3RlZCBtYXRjaGVzIGZvdW5kIiwKLQkJIiIsCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qCi0gKiBFbnN1cmUgc2VhcmNoIGZpbmQgbWF0Y2hlcyBpbiBhIGNvbXBpbGF0aW9uIHVuaXQgdGhhdCB3YXMgZXhjbHVkZWQgYnV0IHRoYXQgaXMgbm90IGFueSBsb25nZXIuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTZWFyY2hXaXRoRXhjbHVkZWRDb21waWxhdGlvblVuaXQyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuc2V0Q2xhc3NwYXRoKG5ldyBTdHJpbmdbXSB7Ii9QL3NyYyIsICJBLmphdmEifSk7Ci0JdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy9wIik7Ci0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL3AvQS5qYXZhIiwKLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCSJ9IgotCSk7Ci0JCi0JdGhpcy5zZXRDbGFzc3BhdGgobmV3IFN0cmluZ1tdIHsiL1Avc3JjIiwgIiJ9KTsKLQlKYXZhU2VhcmNoVGVzdHMuSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFRlc3RzLkphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCSJBIiwKLQkJSUphdmFTZWFyY2hDb25zdGFudHMuVFlQRSwKLQkJSUphdmFTZWFyY2hDb25zdGFudHMuREVDTEFSQVRJT05TLCAKLQkJU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShuZXcgSUphdmFQcm9qZWN0W10ge2dldEphdmFQcm9qZWN0KCJQIil9KSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiVW5leHBlY3RlZCBtYXRjaGVzIGZvdW5kIiwKLQkJInNyYy9wL0EuamF2YSBwLkEgW0FdIiwKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoKLSAqIEVuc3VyZSB0aGF0IHJlbmFtaW5nIGEgZm9sZGVyIHRoYXQgY29ycmVzcG9uZHMgdG8gYW4gZXhjbHVkZWQgcGFja2FnZSAKLSAqIHNvIHRoYXQgaXQgaXMgbm90IGV4Y2x1ZGVkIGFueSBsb25nZXIKLSAqIG1ha2VzIGl0IGFwcGVhcnMgYXMgYSBjaGlsZCBvZiBpdHMgcGFja2FnZSBmcmFnbWVudCByb290IAotICogYW5kIGl0IGlzIHJlbW92ZWQgZnJvbSB0aGUgbm9uLWphdmEgcmVzb3VyY2VzLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVuYW1lUmVzb3VyY2VFeGNsdWRlZFBhY2thZ2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5zZXRDbGFzc3BhdGgobmV3IFN0cmluZ1tdIHsiL1Avc3JjIiwgInAvIn0pOwotCUlGb2xkZXIgZm9sZGVyID0gdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy9wIik7Ci0JCi0JY2xlYXJEZWx0YXMoKTsKLQlmb2xkZXIubW92ZShuZXcgUGF0aCgiL1Avc3JjL3EiKSwgZmFsc2UsIG51bGwpOwotCQotCWFzc2VydERlbHRhcygKLQkJIlVuZXhwZWN0ZWQgZGVsdGFzIiwKLQkJIlBbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJIglzcmNbKl06IHtDSElMRFJFTiB8IENPTlRFTlR9XG4iICsgCi0JCSIJCXFbK106IHt9XG4iICsgCi0JCSIJCVJlc291cmNlRGVsdGEoL1Avc3JjL3ApWy1dIgotCSk7Ci0JCi0JSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoIi9QL3NyYyIpOwotCWFzc2VydFNvcnRlZEVsZW1lbnRzRXF1YWwoCi0JCSJVbmV4cGVjdGVkIGNoaWxkcmVuIiwKLQkJIlxuIiArIC8vIGRlZmF1bHQgcGFja2FnZQotCQkicSIsCi0JCXJvb3QuZ2V0Q2hpbGRyZW4oKSk7Ci0JCQotCWFzc2VydFJlc291cmNlc0VxdWFsKAotCQkiVW5leHBlY3RlZCBub24tamF2YSByZXNvdXJjZXMiLAotCQkiIiwKLQkJcm9vdC5nZXROb25KYXZhUmVzb3VyY2VzKCkpOwotfQotLyoKLSAqIEVuc3VyZSB0aGF0IGEgcG90ZW50aWFsIG1hdGNoIGluIHRoZSBvdXRwdXQgZm9sZGVyIGlzIG5vdCBpbmRleGVkLgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDMyMDQxIE11bHRpcGxlIG91dHB1dCBmb2xkZXJzIGZvb2xpbmcgSmF2YSBNb2RlbCkKLSAqLwotcHVibGljIHZvaWQgdGVzdFNlYXJjaFBvdGVudGlhbE1hdGNoSW5PdXRwdXQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJSmF2YUNvcmUucnVuKG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHt9LCAiYmluIik7Ci0JCQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKGNyZWF0ZUNsYXNzcGF0aChuZXcgU3RyaW5nW10geyIvUDIiLCAic3JjLyIsICIvUDIvc3JjIiwgIiJ9KSwgbnVsbCk7Ci0JCQkJY3JlYXRlRmlsZSgKLQkJCQkJIi9QMi9iaW4vWC5qYXZhIiwKLQkJCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJCQkifSIKLQkJCQkpOwotCQkJfQotCQl9LCBudWxsKTsKLQkJCi0JCUphdmFTZWFyY2hUZXN0cy5KYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoVGVzdHMuSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0gU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShuZXcgSUphdmFFbGVtZW50W10ge2dldEphdmFQcm9qZWN0KCJQIil9KTsKLQkJbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJCWdldFdvcmtzcGFjZSgpLCAKLQkJCSJYIiwKLQkJCUlKYXZhU2VhcmNoQ29uc3RhbnRzLlRZUEUsCi0JCQlJSmF2YVNlYXJjaENvbnN0YW50cy5ERUNMQVJBVElPTlMsIAotCQkJc2NvcGUsIAotCQkJcmVzdWx0Q29sbGVjdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCByZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMiIpOwotCX0KLX0KLS8qCi0gKiBFbnN1cmUgdGhhdCByZW1vdmluZyB0aGUgZXhjbHVzaW9uIG9uIGEgY29tcGlsYXRpb24gdW5pdAotICogbWFrZXMgaXQgYXBwZWFycyBhcyBhIGNoaWxkIG9mIGl0cyBwYWNrYWdlIGFuZCBpdCBpcyByZW1vdmVkIGZyb20gdGhlIG5vbi1qYXZhIHJlc291cmNlcy4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJlbW92ZUV4Y2x1c2lvbk9uQ29tcGlsYXRpb25Vbml0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuc2V0Q2xhc3NwYXRoKG5ldyBTdHJpbmdbXSB7Ii9QL3NyYyIsICJBLmphdmEifSk7Ci0JdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy9wIik7Ci0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL3AvQS5qYXZhIiwKLQkJInBhY2thZ2UgcDtcbiIgKwotCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCSJ9IgotCSk7Ci0JCi0JY2xlYXJEZWx0YXMoKTsKLQl0aGlzLnNldENsYXNzcGF0aChuZXcgU3RyaW5nW10geyIvUC9zcmMiLCAiIn0pOwotCQotCWFzc2VydERlbHRhcygKLQkJIlVuZXhwZWN0ZWQgZGVsdGFzIiwKLQkJIlBbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJIglzcmNbKl06IHtBRERFRCBUTyBDTEFTU1BBVEggfCBSRU1PVkVEIEZST00gQ0xBU1NQQVRIfVxuIiArIAotCQkiCVJlc291cmNlRGVsdGEoL1AvLmNsYXNzcGF0aClbKl0iCi0JKTsKLQkKLQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IGdldFBhY2thZ2UoIi9QL3NyYy9wIik7Ci0JYXNzZXJ0U29ydGVkRWxlbWVudHNFcXVhbCgKLQkJIlVuZXhwZWN0ZWQgY2hpbGRyZW4iLAotCQkiQS5qYXZhIiwKLQkJcGtnLmdldENoaWxkcmVuKCkpOwotCQkKLQlhc3NlcnRSZXNvdXJjZXNFcXVhbCgKLQkJIlVuZXhwZWN0ZWQgbm9uLWphdmEgcmVzb3VyY2VzIiwKLQkJIiIsCi0JCXBrZy5nZXROb25KYXZhUmVzb3VyY2VzKCkpOwotfQotLyoKLSAqIEVuc3VyZSB0aGF0IHJlbW92aW5nIHRoZSBleGNsdXNpb24gb24gYSBwYWNrYWdlCi0gKiBtYWtlcyBpdCBhcHBlYXJzIGFzIGEgY2hpbGQgb2YgaXRzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCAKLSAqIGFuZCBpdCBpcyByZW1vdmVkIGZyb20gdGhlIG5vbi1qYXZhIHJlc291cmNlcy4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJlbW92ZUV4Y2x1c2lvbk9uUGFja2FnZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLnNldENsYXNzcGF0aChuZXcgU3RyaW5nW10geyIvUC9zcmMiLCAicCJ9KTsKLQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjL3AiKTsKLQkKLQljbGVhckRlbHRhcygpOwotCXRoaXMuc2V0Q2xhc3NwYXRoKG5ldyBTdHJpbmdbXSB7Ii9QL3NyYyIsICIifSk7Ci0JCi0JYXNzZXJ0RGVsdGFzKAotCQkiVW5leHBlY3RlZCBkZWx0YXMiLAotCQkiUFsqXToge0NISUxEUkVOfVxuIiArIAotCQkiCXNyY1sqXToge0FEREVEIFRPIENMQVNTUEFUSCB8IFJFTU9WRUQgRlJPTSBDTEFTU1BBVEh9XG4iICsgCi0JCSIJUmVzb3VyY2VEZWx0YSgvUC8uY2xhc3NwYXRoKVsqXSIKLQkpOwotCQotCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCIvUC9zcmMiKTsKLQlhc3NlcnRTb3J0ZWRFbGVtZW50c0VxdWFsKAotCQkiVW5leHBlY3RlZCBjaGlsZHJlbiIsCi0JCSJcbiIgKyAvLyBkZWZhdWx0IHBhY2thZ2UKLQkJInAiLAotCQlyb290LmdldENoaWxkcmVuKCkpOwotCQkKLQlhc3NlcnRSZXNvdXJjZXNFcXVhbCgKLQkJIlVuZXhwZWN0ZWQgbm9uLWphdmEgcmVzb3VyY2VzIiwKLQkJIiIsCi0JCXJvb3QuZ2V0Tm9uSmF2YVJlc291cmNlcygpKTsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9FeGlzdGVuY2VUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0V4aXN0ZW5jZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MTU4YTAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0V4aXN0ZW5jZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLXB1YmxpYyBjbGFzcyBFeGlzdGVuY2VUZXN0cyBleHRlbmRzIE1vZGlmeWluZ1Jlc291cmNlVGVzdHMgewotcHVibGljIEV4aXN0ZW5jZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlyZXR1cm4gbmV3IFN1aXRlKEV4aXN0ZW5jZVRlc3RzLmNsYXNzKTsKLX0KLXByb3RlY3RlZCB2b2lkIGFzc2VydENvcnJlc3BvbmRpbmdSZXNvdXJjZUZhaWxzKElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0JYm9vbGVhbiBnb3RFeGNlcHRpb24gPSBmYWxzZTsKLQl0cnkgewotCQllbGVtZW50LmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOwotCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCWlmIChlLmlzRG9lc05vdEV4aXN0KCkpIHsKLQkJCWdvdEV4Y2VwdGlvbiA9IHRydWU7Ci0JCX0KLQl9Ci0JYXNzZXJ0VHJ1ZSgiU2hvdWxkIG5vdCBiZSBhYmxlIHRvIGdldCBjb3JyZXNwb25kaW5nIHJlc291cmNlIiwgZ290RXhjZXB0aW9uKTsKLX0KLXByb3RlY3RlZCB2b2lkIGFzc2VydE9wZW5GYWlscyhJT3BlbmFibGUgb3BlbmFibGUpIHsKLQlib29sZWFuIGdvdEV4Y2VwdGlvbiA9IGZhbHNlOwotCXRyeSB7Ci0JCW9wZW5hYmxlLm9wZW4obnVsbCk7Ci0JfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJaWYgKGUuaXNEb2VzTm90RXhpc3QoKSkgewotCQkJZ290RXhjZXB0aW9uID0gdHJ1ZTsKLQkJfQotCX0KLQlhc3NlcnRUcnVlKCJTaG91bGQgbm90IGJlIGFibGUgdG8gb3BlbiBlbGVtZW50IiwgZ290RXhjZXB0aW9uKTsKLX0KLXByb3RlY3RlZCB2b2lkIGFzc2VydFVuZGVybHlpbmdSZXNvdXJjZUZhaWxzKElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0JYm9vbGVhbiBnb3RFeGNlcHRpb24gPSBmYWxzZTsKLQl0cnkgewotCQllbGVtZW50LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCWlmIChlLmlzRG9lc05vdEV4aXN0KCkpIHsKLQkJCWdvdEV4Y2VwdGlvbiA9IHRydWU7Ci0JCX0KLQl9Ci0JYXNzZXJ0VHJ1ZSgiU2hvdWxkIG5vdCBiZSBhYmxlIHRvIGdldCB1bmRlcmx5aW5nIHJlc291cmNlIiwgZ290RXhjZXB0aW9uKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RDbGFzc0ZpbGVJbkJpbmFyeSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJdGhpcy5jcmVhdGVGaWxlKCJQL2Jpbi9YLmNsYXNzIiwgIiIpOwotCQlJQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IHRoaXMuZ2V0Q2xhc3NGaWxlKCJQL2Jpbi9YLmNsYXNzIik7Ci0JCWFzc2VydFRydWUoIWNsYXNzRmlsZS5leGlzdHMoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotcHVibGljIHZvaWQgdGVzdENsYXNzRmlsZUluTGlicmFyeSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHt9LCBuZXcgU3RyaW5nW10geyJsaWIifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoIlAvbGliL1guY2xhc3MiLCAiIik7Ci0JCUlDbGFzc0ZpbGUgY2xhc3NGaWxlID0gdGhpcy5nZXRDbGFzc0ZpbGUoIlAvbGliL1guY2xhc3MiKTsKLQkJYXNzZXJ0VHJ1ZShjbGFzc0ZpbGUuZXhpc3RzKCkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qCi0gKiBFbnN1cmUgdGhhdCBhbiBJQ2xhc3NGaWxlIGhhbmRsZSBjcmVhdGVkIG9uIGEgLmNsYXNzIGZpbGUgaW4gYSBzb3VyY2UgZm9sZGVyCi0gKiBkb2Vzbid0IG5vdCBleGlzdC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAzNjQ5OSBleGlzdHMoKSByZXR1cm5zIHRydWUgZm9yIGEgc291cmNlIGZpbGUgaW5zaWRlIGEgY2xhc3Nmb2xkZXIpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDbGFzc0ZpbGVJblNvdXJjZTEoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgiUC9zcmMvWC5jbGFzcyIsICIiKTsKLQkJSUNsYXNzRmlsZSBjbGFzc0ZpbGUgPSB0aGlzLmdldENsYXNzRmlsZSgiUC9zcmMvWC5jbGFzcyIpOwotCQlhc3NlcnRUcnVlKCJDbGFzcyBmaWxlIHNob3VsZCBub3QgZXhpc3QiLCAhY2xhc3NGaWxlLmV4aXN0cygpKTsgCi0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoKLSAqIEVuc3VyZSB0aGF0IGFuIElDbGFzc0ZpbGUgaGFuZGxlIGNyZWF0ZWQgb24gYSAuY2xhc3MgZmlsZSBpbiBhIHNvdXJjZSBmb2xkZXIKLSAqIGNhbm5vdCBiZSBvcGVuZWQuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMzY0OTkgZXhpc3RzKCkgcmV0dXJucyB0cnVlIGZvciBhIHNvdXJjZSBmaWxlIGluc2lkZSBhIGNsYXNzZm9sZGVyKQotICovCi0gcHVibGljIHZvaWQgdGVzdENsYXNzRmlsZUluU291cmNlMigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJdGhpcy5jcmVhdGVGaWxlKCJQL3NyYy9YLmNsYXNzIiwgIiIpOwotCQlJQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IHRoaXMuZ2V0Q2xhc3NGaWxlKCJQL3NyYy9YLmNsYXNzIik7Ci0JCWFzc2VydE9wZW5GYWlscygoSU9wZW5hYmxlKWNsYXNzRmlsZSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoKLSAqIEVuc3VyZSB0aGF0IGFuIElDb21waWxhdGlvblVuaXQgaGFuZGxlIGNyZWF0ZWQgb24gYSAuamF2YSBmaWxlIGluIGEgbGlicmFyeSBmb2xkZXIKLSAqIGRvZXNuJ3Qgbm90IGV4aXN0LgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDM2NDk5IGV4aXN0cygpIHJldHVybnMgdHJ1ZSBmb3IgYSBzb3VyY2UgZmlsZSBpbnNpZGUgYSBjbGFzc2ZvbGRlcikKLSAqLwotcHVibGljIHZvaWQgdGVzdENvbXBpbGF0aW9uVW5pdEluTGlicmFyeTEoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7fSwgbmV3IFN0cmluZ1tdIHsibGliIn0sICAiYmluIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSJQL2xpYi9YLmphdmEiLCAKLQkJCSJwdWJsaWMgY2xhc3MgWCB7fSIKLQkJKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuZ2V0Q29tcGlsYXRpb25Vbml0KCJQL2xpYi9YLmphdmEiKTsKLQkJYXNzZXJ0VHJ1ZSgiQ2NvbXBpbGF0aW9uIHVuaXQgc2hvdWxkIG5vdCBleGlzdCIsICFjdS5leGlzdHMoKSk7IAotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qCi0gKiBFbnN1cmUgdGhhdCBhbiBJQ29tcGlsYXRpb25Vbml0IGhhbmRsZSBjcmVhdGVkIG9uIGEgLmphdmEgZmlsZSBpbiBhIGxpYnJhcnkgZm9sZGVyCi0gKmNhbm5vdCBiZSBvcGVuZWQuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMzY0OTkgZXhpc3RzKCkgcmV0dXJucyB0cnVlIGZvciBhIHNvdXJjZSBmaWxlIGluc2lkZSBhIGNsYXNzZm9sZGVyKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGlsYXRpb25Vbml0SW5MaWJyYXJ5MigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHt9LCBuZXcgU3RyaW5nW10geyJsaWIifSwgICJiaW4iKTsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIlAvbGliL1guamF2YSIsIAotCQkJInB1YmxpYyBjbGFzcyBYIHt9IgotCQkpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5nZXRDb21waWxhdGlvblVuaXQoIlAvbGliL1guamF2YSIpOwotCQlhc3NlcnRPcGVuRmFpbHMoKElPcGVuYWJsZSljdSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoKLSAqIEVuc3VyZSB0aGF0IGEgbm9uLWV4aXN0aW5nIGNsYXNzIGZpbGUgY2Fubm90IGJlIG9wZW5lZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdE5vbkV4aXN0aW5nQ2xhc3NGaWxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgbmV3IFN0cmluZ1tdIHsibGliIn0sICJiaW4iKTsKLQkJSUNsYXNzRmlsZSBjbGFzc0ZpbGUgPSBnZXRDbGFzc0ZpbGUoIi9QL2xpYi9YLmNsYXNzIik7Ci0JCWFzc2VydE9wZW5GYWlscyhjbGFzc0ZpbGUpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qCi0gKiBFbnN1cmUgdGhhdCBhIG5vbi1leGlzdGluZyBjb21waWxhdGlvbiB1bml0IGNhbm5vdCBiZSBvcGVuZWQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3ROb25FeGlzdGluZ0NvbXBpbGF0aW9uVW5pdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpOwotCQlhc3NlcnRPcGVuRmFpbHMoY3UpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qCi0gKiBFbnN1cmUgdGhhdCBhIG5vbi1leGlzdGluZyBwYWNrYWdlIGZyYWdtZW50IGNhbm5vdCBiZSBvcGVuZWQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3ROb25FeGlzdGluZ1BhY2thZ2VGcmFnbWVudCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJSVBhY2thZ2VGcmFnbWVudCBwa2cgPSB0aGlzLmdldFBhY2thZ2UoIi9QL3NyYy94Iik7Ci0JCWFzc2VydE9wZW5GYWlscyhwa2cpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qCi0gKiBFbnN1cmUgdGhhdCBhIG5vbi1KYXZhIHByb2plY3QgZG9lc24ndCBleGlzdC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAyODU0NSBKYXZhUHJvamVjdC5leGlzdHMoKSByZXR1cm5zIHRydWUgaWYgcHJvamVjdCBkb2Vzbid0IGhhdmUgSmF2YSBuYXR1cmUpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3ROb25KYXZhUHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZVByb2plY3QoIlAiKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IHRoaXMuZ2V0UHJvamVjdCgiUCIpOwotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQotCQlhc3NlcnRUcnVlKCJTaW1wbGUgcHJvamVjdCBzaG91bGQgbm90IGV4aXN0IiwgIWphdmFQcm9qZWN0LmV4aXN0cygpKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0vKgotICogRW5zdXJlcyB0aGF0IGEgcGFja2FnZSBmcmFnbWVudCByb290IHRoYXQgaXMgbm90IG9uIHRoZSBjbGFzc3BhdGggY2Fubm90IGJlIG9wZW5lZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdFBrZ0ZyYWdtZW50Um9vdE5vdEluQ2xhc3NwYXRoKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCUlGb2xkZXIgZm9sZGVyID0gdGhpcy5jcmVhdGVGb2xkZXIoIi9QL290aGVyUm9vdCIpOwotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KGZvbGRlcik7Ci0JCWFzc2VydFRydWUoIlJvb3Qgc2hvdWxkIG5vdCBleGlzdCIsICFyb290LmV4aXN0cygpKTsKLQkJYm9vbGVhbiBnb3RFeGNlcHRpb24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXJvb3Qub3BlbihudWxsKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChlLmlzRG9lc05vdEV4aXN0KCkpIHsKLQkJCQlnb3RFeGNlcHRpb24gPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlNob3VsZCBub3QgYmUgYWJsZSB0byBvcGVuIHJvb3QiLCBnb3RFeGNlcHRpb24pOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qCi0gKiBFbnN1cmVzIHRoYXQgb25lIGNhbm5vdCBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2Ugb2YgYSBub24tZXhpc3RpbmcgY2xhc3MgZmlsZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcnJlc3BvbmRpbmdSZXNvdXJjZU5vbkV4aXN0aW5nQ2xhc3NGaWxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgbmV3IFN0cmluZ1tdIHsibGliIn0sICJiaW4iKTsKLQkJSUNsYXNzRmlsZSBjbGFzc0ZpbGUgPSB0aGlzLmdldENsYXNzRmlsZSgiL1AvbGliL1guY2xhc3MiKTsKLQkJYXNzZXJ0Q29ycmVzcG9uZGluZ1Jlc291cmNlRmFpbHMoY2xhc3NGaWxlKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0vKgotICogRW5zdXJlcyB0aGF0IG9uZSBjYW5ub3QgZ2V0IHRoZSBjb3JyZXNwb25kaW5nIHJlc291cmNlIG9mIGEgbm9uLWV4aXN0aW5nIGNvbXBpbGF0aW9uIHVuaXQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb3JyZXNwb25kaW5nUmVzb3VyY2VOb25FeGlzdGluZ0NvbXBpbGF0aW9uVW5pdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSB0aGlzLmdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpOwotCQlhc3NlcnRDb3JyZXNwb25kaW5nUmVzb3VyY2VGYWlscyhjb21waWxhdGlvblVuaXQpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qCi0gKiBFbnN1cmVzIHRoYXQgb25lIGNhbm5vdCBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2Ugb2YgYSBub24tZXhpc3RpbmcgamFyIHBhY2thZ2UgZnJhZ21lbnQgcm9vdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcnJlc3BvbmRpbmdSZXNvdXJjZU5vbkV4aXN0aW5nSmFyUGtnRnJhZ21lbnRSb290KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoIi9ub25FeGlzdGluZy5qYXIiKTsKLQkJYXNzZXJ0Q29ycmVzcG9uZGluZ1Jlc291cmNlRmFpbHMocm9vdCk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoKLSAqIEVuc3VyZXMgdGhhdCBvbmUgY2Fubm90IGdldCB0aGUgY29ycmVzcG9uZGluZyByZXNvdXJjZSBvZiBhIG5vbi1leGlzdGluZyBwYWNrYWdlIGZyYWdtZW50LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29ycmVzcG9uZGluZ1Jlc291cmNlTm9uRXhpc3RpbmdQa2dGcmFnbWVudCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJSVBhY2thZ2VGcmFnbWVudCBwa2cgPSB0aGlzLmdldFBhY2thZ2UoIi9QL3NyYy9ub25FeGlzdGluZyIpOwotCQlhc3NlcnRDb3JyZXNwb25kaW5nUmVzb3VyY2VGYWlscyhwa2cpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qCi0gKiBFbnN1cmVzIHRoYXQgb25lIGNhbm5vdCBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2Ugb2YgYSBub24tZXhpc3RpbmcgcGFja2FnZSBmcmFnbWVudCByb290LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29ycmVzcG9uZGluZ1Jlc291cmNlTm9uRXhpc3RpbmdQa2dGcmFnbWVudFJvb3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJSUZvbGRlciBmb2xkZXIgPSB0aGlzLmNyZWF0ZUZvbGRlcigiL1Avbm9uRXhpc3RpbmdSb290Iik7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoZm9sZGVyKTsKLQkJYXNzZXJ0Q29ycmVzcG9uZGluZ1Jlc291cmNlRmFpbHMocm9vdCk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoKLSAqIEVuc3VyZXMgdGhhdCBvbmUgY2Fubm90IGdldCB0aGUgY29ycmVzcG9uZGluZyByZXNvdXJjZSBvZiBhIG5vbi1leGlzdGluZyBqYXZhIHByb2plY3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb3JyZXNwb25kaW5nUmVzb3VyY2VOb25FeGlzdGluZ1Byb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSVByb2plY3Qgbm9uRXhpc3RpbmdQcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KCJOb25FeGlzdGluZyIpOwotCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShub25FeGlzdGluZ1Byb2plY3QpOwotCWFzc2VydENvcnJlc3BvbmRpbmdSZXNvdXJjZUZhaWxzKGphdmFQcm9qZWN0KTsKLX0KLS8qCi0gKiBFbnN1cmVzIHRoYXQgb25lIGNhbm5vdCBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2Ugb2YgYSBub24tZXhpc3RpbmcgdHlwZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcnJlc3BvbmRpbmdSZXNvdXJjZU5vbkV4aXN0aW5nVHlwZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QL3NyYy9YLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBYe1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpLmdldFR5cGUoIk5vbkV4aXN0aW5nIik7Ci0JCWFzc2VydENvcnJlc3BvbmRpbmdSZXNvdXJjZUZhaWxzKHR5cGUpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qCi0gKiBFbnN1cmVzIHRoYXQgb25lIGNhbm5vdCBnZXQgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2Ugb2YgYSBub24tZXhpc3RpbmcgY2xhc3MgZmlsZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdFVuZGVybHlpbmdSZXNvdXJjZU5vbkV4aXN0aW5nQ2xhc3NGaWxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgbmV3IFN0cmluZ1tdIHsibGliIn0sICJiaW4iKTsKLQkJSUNsYXNzRmlsZSBjbGFzc0ZpbGUgPSB0aGlzLmdldENsYXNzRmlsZSgiL1AvbGliL1guY2xhc3MiKTsKLQkJYXNzZXJ0VW5kZXJseWluZ1Jlc291cmNlRmFpbHMoY2xhc3NGaWxlKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0vKgotICogRW5zdXJlcyB0aGF0IG9uZSBjYW5ub3QgZ2V0IHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIG9mIGEgbm9uLWV4aXN0aW5nIGNvbXBpbGF0aW9uIHVuaXQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RVbmRlcmx5aW5nUmVzb3VyY2VOb25FeGlzdGluZ0NvbXBpbGF0aW9uVW5pdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSB0aGlzLmdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpOwotCQlhc3NlcnRVbmRlcmx5aW5nUmVzb3VyY2VGYWlscyhjb21waWxhdGlvblVuaXQpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qCi0gKiBFbnN1cmVzIHRoYXQgb25lIGNhbm5vdCBnZXQgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2Ugb2YgYSBub24tZXhpc3RpbmcgamFyIHBhY2thZ2UgZnJhZ21lbnQgcm9vdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdFVuZGVybHlpbmdSZXNvdXJjZU5vbkV4aXN0aW5nSmFyUGtnRnJhZ21lbnRSb290KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoIi9ub25FeGlzdGluZy5qYXIiKTsKLQkJYXNzZXJ0VW5kZXJseWluZ1Jlc291cmNlRmFpbHMocm9vdCk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoKLSAqIEVuc3VyZXMgdGhhdCBvbmUgY2Fubm90IGdldCB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBvZiBhIG5vbi1leGlzdGluZyBwYWNrYWdlIGZyYWdtZW50LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0VW5kZXJseWluZ1Jlc291cmNlTm9uRXhpc3RpbmdQa2dGcmFnbWVudCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJSVBhY2thZ2VGcmFnbWVudCBwa2cgPSB0aGlzLmdldFBhY2thZ2UoIi9QL3NyYy9ub25FeGlzdGluZyIpOwotCQlhc3NlcnRVbmRlcmx5aW5nUmVzb3VyY2VGYWlscyhwa2cpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qCi0gKiBFbnN1cmVzIHRoYXQgb25lIGNhbm5vdCBnZXQgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2Ugb2YgYSBub24tZXhpc3RpbmcgcGFja2FnZSBmcmFnbWVudCByb290LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0VW5kZXJseWluZ1Jlc291cmNlTm9uRXhpc3RpbmdQa2dGcmFnbWVudFJvb3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJSUZvbGRlciBmb2xkZXIgPSB0aGlzLmNyZWF0ZUZvbGRlcigiL1Avbm9uRXhpc3RpbmdSb290Iik7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoZm9sZGVyKTsKLQkJYXNzZXJ0VW5kZXJseWluZ1Jlc291cmNlRmFpbHMocm9vdCk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoKLSAqIEVuc3VyZXMgdGhhdCBvbmUgY2Fubm90IGdldCB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBvZiBhIG5vbi1leGlzdGluZyBqYXZhIHByb2plY3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RVbmRlcmx5aW5nUmVzb3VyY2VOb25FeGlzdGluZ1Byb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSVByb2plY3Qgbm9uRXhpc3RpbmdQcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KCJOb25FeGlzdGluZyIpOwotCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShub25FeGlzdGluZ1Byb2plY3QpOwotCWFzc2VydFVuZGVybHlpbmdSZXNvdXJjZUZhaWxzKGphdmFQcm9qZWN0KTsKLX0KLS8qCi0gKiBFbnN1cmVzIHRoYXQgb25lIGNhbm5vdCBnZXQgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2Ugb2YgYSBub24tZXhpc3RpbmcgdHlwZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdFVuZGVybHlpbmdSZXNvdXJjZU5vbkV4aXN0aW5nVHlwZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QL3NyYy9YLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBYe1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpLmdldFR5cGUoIk5vbkV4aXN0aW5nIik7Ci0JCWFzc2VydFVuZGVybHlpbmdSZXNvdXJjZUZhaWxzKHR5cGUpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9FeHRlcm5hbEphckRlbHRhVGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9FeHRlcm5hbEphckRlbHRhVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRiODBkOC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvRXh0ZXJuYWxKYXJEZWx0YVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLS8qKgotICogVGhlc2UgdGVzdCBlbnN1cmUgdGhhdCBtb2RpZmljYXRpb25zIGluIGV4dGVybmFsIGphciBhcmUgY29ycmVjdGx5IHJlcG9ydGVkIGFzCi0gKiBJSmF2YUVsbGVtZW50RGVsdGFzIGFmdGVyIGEgSmF2YU1vZGVsI3JlZnJlc2hFeHRlcm5hbEFyY2hpdmVzKCkuCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlcm5hbEphckRlbHRhVGVzdHMgZXh0ZW5kcyBNb2RpZnlpbmdSZXNvdXJjZVRlc3RzIHsKLQkKLXB1YmxpYyBFeHRlcm5hbEphckRlbHRhVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgU3VpdGUoRXh0ZXJuYWxKYXJEZWx0YVRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCi0Jc3VpdGUuYWRkVGVzdChuZXcgRXh0ZXJuYWxKYXJEZWx0YVRlc3RzKCJ0ZXN0RXh0ZXJuYWxKYXIwIikpOwotCi0Jc3VpdGUuYWRkVGVzdChuZXcgRXh0ZXJuYWxKYXJEZWx0YVRlc3RzKCJ0ZXN0RXh0ZXJuYWxKYXJDaGFuZ2VkMSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBFeHRlcm5hbEphckRlbHRhVGVzdHMoInRlc3RFeHRlcm5hbEphckNoYW5nZWQyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEV4dGVybmFsSmFyRGVsdGFUZXN0cygidGVzdEV4dGVybmFsSmFyQ2hhbmdlZDMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgRXh0ZXJuYWxKYXJEZWx0YVRlc3RzKCJ0ZXN0RXh0ZXJuYWxKYXJBZGRlZDEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgRXh0ZXJuYWxKYXJEZWx0YVRlc3RzKCJ0ZXN0RXh0ZXJuYWxKYXJBZGRlZDIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgRXh0ZXJuYWxKYXJEZWx0YVRlc3RzKCJ0ZXN0RXh0ZXJuYWxKYXJBZGRlZDMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgRXh0ZXJuYWxKYXJEZWx0YVRlc3RzKCJ0ZXN0RXh0ZXJuYWxKYXJSZW1vdmVkMSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBFeHRlcm5hbEphckRlbHRhVGVzdHMoInRlc3RFeHRlcm5hbEphclJlbW92ZWQyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEV4dGVybmFsSmFyRGVsdGFUZXN0cygidGVzdEV4dGVybmFsSmFyUmVtb3ZlZDMiKSk7Ci0JCi0Jc3VpdGUuYWRkVGVzdChuZXcgRXh0ZXJuYWxKYXJEZWx0YVRlc3RzKCJ0ZXN0RXh0ZXJuYWxKYXJJbnRlcm5hbEV4dGVybmFsSmFyIikpOwotCQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHJpdmF0ZSBTdHJpbmcgZ2V0RXh0ZXJuYWxQYXRoKCkgewotCXJldHVybiBFWFRFUk5BTF9KQVJfRElSX1BBVEg7Ci19Ci0KLXByaXZhdGUgU3RyaW5nIGdldExpYnJhcnlQYXRoKCkgewotCXJldHVybiBnZXRQbHVnaW5EaXJlY3RvcnlQYXRoKCkuc3Vic3RyaW5nKDEpLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCcvJykrIi9MSUIiOwotfQotCi0vKioKLSAqIFRlc3QgaWYgYSBtb2RpZmljYXRpb24gaXMgZGV0ZWN0ZWQgd2l0aG91dCBkb2luZyBhIHJlZnJlc2guCi0gKiBDdXJyZW50bHkgbm8gbW9kaWZpY2F0aW9uIGFyZSBkZXRlY3RlZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdEV4dGVybmFsSmFyMCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlGaWxlIGYgPSBudWxsOwotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7IiJ9LCAiIik7Ci0JCVN0cmluZyBsaWJQYXRoID0gZ2V0TGlicmFyeVBhdGgoKTsKLQkJU3RyaW5nIHBQYXRoID0gZ2V0RXh0ZXJuYWxQYXRoKCkrIi9wLmphciI7Ci0JCVN0cmluZyBwMVBhdGggPSBsaWJQYXRoKyIvcDEuamFyIjsKLQkJU3RyaW5nIHAyUGF0aCA9IGxpYlBhdGgrIi9wMi5qYXIiOwotCQkKLQkJc2V0Q2xhc3NwYXRoKHByb2plY3QsIG5ldyBJQ2xhc3NwYXRoRW50cnlbXXtKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkobmV3IFBhdGgocFBhdGgpLCBudWxsLCBudWxsKX0pOwotCQkKLQkJZiA9IG5ldyBGaWxlKHBQYXRoKTsKLQkJRmlsZSBmMSA9IG5ldyBGaWxlKHAxUGF0aCk7Ci0JCUZpbGUgZjIgPSBuZXcgRmlsZShwMlBhdGgpOwotCQkKLQkJY29weShmMSwgZik7Ci0JCXRoaXMuZ2V0SmF2YU1vZGVsKCkucmVmcmVzaEV4dGVybmFsQXJjaGl2ZXMobnVsbCxudWxsKTsKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQkKLQkJY29weShmMiwgZik7Ci0JCQotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSIsIAotCQkJIiIKLQkJKTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JfSBmaW5hbGx5IHsKLQkJaWYoZiAhPSBudWxsKSB7Ci0JCQlkZWxldGVGaWxlKGYpOwotCQl9Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCQl0aGlzLnN0b3BEZWx0YXMoKTsKLQl9Ci19Ci0KLS8qKgotICogUmVmcmVzaCB0aGUgSmF2YU1vZGVsIGFmdGVyIGEgbW9kaWZpY2F0aW9uIG9mIGFuIGV4dGVybmFsIGphci4KLSAqLwotcHVibGljIHZvaWQgdGVzdEV4dGVybmFsSmFyQ2hhbmdlZDEoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JRmlsZSBmID0gbnVsbDsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyIifSwgIiIpOwotCQkKLQkJU3RyaW5nIGxpYlBhdGggPSBnZXRMaWJyYXJ5UGF0aCgpOwotCQlTdHJpbmcgcFBhdGggPSBnZXRFeHRlcm5hbFBhdGgoKSsiL3AuamFyIjsKLQkJU3RyaW5nIHAxUGF0aCA9IGxpYlBhdGgrIi9wMS5qYXIiOwotCQlTdHJpbmcgcDJQYXRoID0gbGliUGF0aCsiL3AyLmphciI7Ci0JCQotCQlzZXRDbGFzc3BhdGgocHJvamVjdCwgbmV3IElDbGFzc3BhdGhFbnRyeVtde0phdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShuZXcgUGF0aChwUGF0aCksIG51bGwsIG51bGwpfSk7Ci0JCQotCQlmID0gbmV3IEZpbGUocFBhdGgpOwotCQlGaWxlIGYxID0gbmV3IEZpbGUocDFQYXRoKTsKLQkJRmlsZSBmMiA9IG5ldyBGaWxlKHAyUGF0aCk7Ci0JCQotCQljb3B5KGYxLCBmKTsKLQkJdGhpcy5nZXRKYXZhTW9kZWwoKS5yZWZyZXNoRXh0ZXJuYWxBcmNoaXZlcyhudWxsLG51bGwpOwotCQl0aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCQotCQljb3B5KGYyLCBmKTsKLQkJdGhpcy5nZXRKYXZhTW9kZWwoKS5yZWZyZXNoRXh0ZXJuYWxBcmNoaXZlcyhudWxsLG51bGwpOwotCQkKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEiLCAKLQkJCSJQWypdOiB7Q0hJTERSRU59XG4iKwotCQkJIgkiK3BQYXRoKyJbKl06IHtDT05URU5UIHwgQVJDSElWRSBDT05URU5UIENIQU5HRUR9IgotCQkpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQl9IGZpbmFsbHkgewotCQlpZihmICE9IG51bGwpIHsKLQkJCWRlbGV0ZUZpbGUoZik7Ci0JCX0KLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JCXRoaXMuc3RvcERlbHRhcygpOwotCX0KLX0KLS8qKgotICogUmVmcmVzaCBhIEphdmFQcm9qZWN0IGFmdGVyIGEgbW9kaWZpY2F0aW9uIG9mIGFuIGV4dGVybmFsIGphci4KLSAqLwotcHVibGljIHZvaWQgdGVzdEV4dGVybmFsSmFyQ2hhbmdlZDIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JRmlsZSBmID0gbnVsbDsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyIifSwgIiIpOwotCQkKLQkJU3RyaW5nIGxpYlBhdGggPSBnZXRMaWJyYXJ5UGF0aCgpOwotCQlTdHJpbmcgcFBhdGggPSBnZXRFeHRlcm5hbFBhdGgoKSsiL3AuamFyIjsKLQkJU3RyaW5nIHAxUGF0aCA9IGxpYlBhdGgrIi9wMS5qYXIiOwotCQlTdHJpbmcgcDJQYXRoID0gbGliUGF0aCsiL3AyLmphciI7Ci0JCQotCQlzZXRDbGFzc3BhdGgocHJvamVjdCwgbmV3IElDbGFzc3BhdGhFbnRyeVtde0phdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShuZXcgUGF0aChwUGF0aCksIG51bGwsIG51bGwpfSk7Ci0JCQotCQlmID0gbmV3IEZpbGUocFBhdGgpOwotCQlGaWxlIGYxID0gbmV3IEZpbGUocDFQYXRoKTsKLQkJRmlsZSBmMiA9IG5ldyBGaWxlKHAyUGF0aCk7Ci0JCQotCQljb3B5KGYxLCBmKTsKLQkJdGhpcy5nZXRKYXZhTW9kZWwoKS5yZWZyZXNoRXh0ZXJuYWxBcmNoaXZlcyhudWxsLG51bGwpOwotCQl0aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCQotCQljb3B5KGYyLCBmKTsKLQkJdGhpcy5nZXRKYXZhTW9kZWwoKS5yZWZyZXNoRXh0ZXJuYWxBcmNoaXZlcyhuZXcgSUphdmFFbGVtZW50W117cHJvamVjdH0sbnVsbCk7Ci0JCQotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSIsIAotCQkJIlBbKl06IHtDSElMRFJFTn1cbiIrCi0JCQkiCSIrcFBhdGgrIlsqXToge0NPTlRFTlQgfCBBUkNISVZFIENPTlRFTlQgQ0hBTkdFRH0iCi0JCSk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCX0gZmluYWxseSB7Ci0JCWlmKGYgIT0gbnVsbCkgewotCQkJZGVsZXRlRmlsZShmKTsKLQkJfQotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JfQotfQotLyoqCi0gKiBSZWZyZXNoIGFuIGV4dGVybmFsIGphciBhZnRlciBhIG1vZGlmaWNhdGlvbiBvZiB0aGlzIGphci4KLSAqLwotcHVibGljIHZvaWQgdGVzdEV4dGVybmFsSmFyQ2hhbmdlZDMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JRmlsZSBmID0gbnVsbDsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyIifSwgIiIpOwotCQkKLQkJU3RyaW5nIGxpYlBhdGggPSBnZXRMaWJyYXJ5UGF0aCgpOwotCQlTdHJpbmcgcFBhdGggPSBnZXRFeHRlcm5hbFBhdGgoKSsiL3AuamFyIjsKLQkJU3RyaW5nIHAxUGF0aCA9IGxpYlBhdGgrIi9wMS5qYXIiOwotCQlTdHJpbmcgcDJQYXRoID0gbGliUGF0aCsiL3AyLmphciI7Ci0JCQotCQlzZXRDbGFzc3BhdGgocHJvamVjdCwgbmV3IElDbGFzc3BhdGhFbnRyeVtde0phdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShuZXcgUGF0aChwUGF0aCksIG51bGwsIG51bGwpfSk7Ci0JCQotCQlmID0gbmV3IEZpbGUocFBhdGgpOwotCQlGaWxlIGYxID0gbmV3IEZpbGUocDFQYXRoKTsKLQkJRmlsZSBmMiA9IG5ldyBGaWxlKHAyUGF0aCk7Ci0JCQotCQljb3B5KGYxLCBmKTsKLQkJdGhpcy5nZXRKYXZhTW9kZWwoKS5yZWZyZXNoRXh0ZXJuYWxBcmNoaXZlcyhudWxsLG51bGwpOwotCQl0aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCQotCQljb3B5KGYyLCBmKTsKLQkJCi0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QocFBhdGgpOwotCQl0aGlzLmdldEphdmFNb2RlbCgpLnJlZnJlc2hFeHRlcm5hbEFyY2hpdmVzKG5ldyBJSmF2YUVsZW1lbnRbXXtyb290fSxudWxsKTsKLQkJCi0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIiwgCi0JCQkiUFsqXToge0NISUxEUkVOfVxuIisKLQkJCSIJIitwUGF0aCsiWypdOiB7Q09OVEVOVCB8IEFSQ0hJVkUgQ09OVEVOVCBDSEFOR0VEfSIKLQkJKTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JfSBmaW5hbGx5IHsKLQkJaWYoZiAhPSBudWxsKSB7Ci0JCQlkZWxldGVGaWxlKGYpOwotCQl9Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCQl0aGlzLnN0b3BEZWx0YXMoKTsKLQl9Ci19Ci0vKioKLSAqIFJlZnJlc2ggdGhlIEphdmFNb2RlbCBhZnRlciBhbiBhZGRpdGlvbiBvZiBhbiBleHRlcm5hbCBqYXIuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RFeHRlcm5hbEphckFkZGVkMSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlGaWxlIGYgPSBudWxsOwotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7IiJ9LCAiIik7Ci0JCQotCQlTdHJpbmcgbGliUGF0aCA9IGdldExpYnJhcnlQYXRoKCk7Ci0JCVN0cmluZyBwUGF0aCA9IGdldEV4dGVybmFsUGF0aCgpKyIvcEFkZGVkMS5qYXIiOwotCQlTdHJpbmcgcDJQYXRoID0gbGliUGF0aCsiL3AyLmphciI7Ci0JCQotCQlzZXRDbGFzc3BhdGgocHJvamVjdCwgbmV3IElDbGFzc3BhdGhFbnRyeVtde0phdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShuZXcgUGF0aChwUGF0aCksIG51bGwsIG51bGwpfSk7Ci0JCQotCQlmID0gbmV3IEZpbGUocFBhdGgpOwotCQlGaWxlIGYyID0gbmV3IEZpbGUocDJQYXRoKTsKLQkJCi0JCXRoaXMuZ2V0SmF2YU1vZGVsKCkucmVmcmVzaEV4dGVybmFsQXJjaGl2ZXMobnVsbCxudWxsKTsKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQkKLQkJY29weShmMiwgZik7Ci0JCXRoaXMuZ2V0SmF2YU1vZGVsKCkucmVmcmVzaEV4dGVybmFsQXJjaGl2ZXMobnVsbCxudWxsKTsKLQkJCi0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIiwgCi0JCQkiUFsqXToge0NISUxEUkVOfVxuIisKLQkJCSIJIitwUGF0aCsiWytdOiB7fSIKLQkJKTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JfSBmaW5hbGx5IHsKLQkJaWYoZiAhPSBudWxsKSB7Ci0JCQlkZWxldGVGaWxlKGYpOwotCQl9Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCQl0aGlzLnN0b3BEZWx0YXMoKTsKLQl9Ci19Ci0vKioKLSAqIFJlZnJlc2ggYSBKYXZhUHJvamVjdCBhZnRlciBhbiBhZGRpdGlvbiBvZiBhbiBleHRlcm5hbCBqYXIuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RFeHRlcm5hbEphckFkZGVkMigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlGaWxlIGYgPSBudWxsOwotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7IiJ9LCAiIik7Ci0JCQotCQlTdHJpbmcgbGliUGF0aCA9IGdldExpYnJhcnlQYXRoKCk7Ci0JCVN0cmluZyBwUGF0aCA9IGdldEV4dGVybmFsUGF0aCgpKyIvcEFkZGVkMi5qYXIiOwotCQlTdHJpbmcgcDJQYXRoID0gbGliUGF0aCsiL3AyLmphciI7Ci0JCQotCQlzZXRDbGFzc3BhdGgocHJvamVjdCwgbmV3IElDbGFzc3BhdGhFbnRyeVtde0phdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShuZXcgUGF0aChwUGF0aCksIG51bGwsIG51bGwpfSk7Ci0JCQotCQlmID0gbmV3IEZpbGUocFBhdGgpOwotCQlGaWxlIGYyID0gbmV3IEZpbGUocDJQYXRoKTsKLQkJCi0JCXRoaXMuZ2V0SmF2YU1vZGVsKCkucmVmcmVzaEV4dGVybmFsQXJjaGl2ZXMobnVsbCxudWxsKTsKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQkKLQkJY29weShmMiwgZik7Ci0JCXRoaXMuZ2V0SmF2YU1vZGVsKCkucmVmcmVzaEV4dGVybmFsQXJjaGl2ZXMobmV3IElKYXZhRWxlbWVudFtde3Byb2plY3R9LG51bGwpOwotCQkKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEiLCAKLQkJCSJQWypdOiB7Q0hJTERSRU59XG4iKwotCQkJIgkiK3BQYXRoKyJbK106IHt9IgotCQkpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQl9IGZpbmFsbHkgewotCQlpZihmICE9IG51bGwpIHsKLQkJCWRlbGV0ZUZpbGUoZik7Ci0JCX0KLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JCXRoaXMuc3RvcERlbHRhcygpOwotCX0KLX0KLS8qKgotICogUmVmcmVzaCBhbiBleHRlcm5hbCBqYXIgYWZ0ZXIgYW4gYWRkaXRpb24gb2YgdGhpcyBqYXIuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RFeHRlcm5hbEphckFkZGVkMygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlGaWxlIGYgPSBudWxsOwotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7IiJ9LCAiIik7Ci0JCQotCQlTdHJpbmcgbGliUGF0aCA9Z2V0TGlicmFyeVBhdGgoKTsKLQkJU3RyaW5nIHBQYXRoID0gZ2V0RXh0ZXJuYWxQYXRoKCkrIi9wQWRkZWQzLmphciI7Ci0JCVN0cmluZyBwMlBhdGggPSBsaWJQYXRoKyIvcDIuamFyIjsKLQkJCi0JCXNldENsYXNzcGF0aChwcm9qZWN0LCBuZXcgSUNsYXNzcGF0aEVudHJ5W117SmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KG5ldyBQYXRoKHBQYXRoKSwgbnVsbCwgbnVsbCl9KTsKLQkJCi0JCWYgPSBuZXcgRmlsZShwUGF0aCk7Ci0JCUZpbGUgZjIgPSBuZXcgRmlsZShwMlBhdGgpOwotCQkKLQkJdGhpcy5nZXRKYXZhTW9kZWwoKS5yZWZyZXNoRXh0ZXJuYWxBcmNoaXZlcyhudWxsLG51bGwpOwotCQl0aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCQotCQljb3B5KGYyLCBmKTsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChwUGF0aCk7Ci0JCXRoaXMuZ2V0SmF2YU1vZGVsKCkucmVmcmVzaEV4dGVybmFsQXJjaGl2ZXMobmV3IElKYXZhRWxlbWVudFtde3Jvb3R9LG51bGwpOwotCQkKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEiLCAKLQkJCSJQWypdOiB7Q0hJTERSRU59XG4iKwotCQkJIgkiK3BQYXRoKyJbK106IHt9IgotCQkpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQl9IGZpbmFsbHkgewotCQlpZihmICE9IG51bGwpIHsKLQkJCWRlbGV0ZUZpbGUoZik7Ci0JCX0KLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JCXRoaXMuc3RvcERlbHRhcygpOwotCX0KLX0KLS8qKgotICogUmVmcmVzaCB0aGUgSmF2YU1vZGVsIGFmdGVyIGEgcmVtb3ZhbCBvZiBhbiBleHRlcm5hbCBqYXIuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RFeHRlcm5hbEphclJlbW92ZWQxKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUZpbGUgZiA9IG51bGw7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsiIn0sICIiKTsKLQkJCi0JCVN0cmluZyBsaWJQYXRoID0gZ2V0TGlicmFyeVBhdGgoKTsKLQkJU3RyaW5nIHBQYXRoID0gZ2V0RXh0ZXJuYWxQYXRoKCkrIi9wLmphciI7Ci0JCVN0cmluZyBwMlBhdGggPSBsaWJQYXRoKyIvcDIuamFyIjsKLQkJCi0JCXNldENsYXNzcGF0aChwcm9qZWN0LCBuZXcgSUNsYXNzcGF0aEVudHJ5W117SmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KG5ldyBQYXRoKHBQYXRoKSwgbnVsbCwgbnVsbCl9KTsKLQkJCi0JCWYgPSBuZXcgRmlsZShwUGF0aCk7Ci0JCUZpbGUgZjIgPSBuZXcgRmlsZShwMlBhdGgpOwotCQkKLQkJY29weShmMiwgZik7Ci0JCXRoaXMuZ2V0SmF2YU1vZGVsKCkucmVmcmVzaEV4dGVybmFsQXJjaGl2ZXMobnVsbCxudWxsKTsKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQkKLQkJZGVsZXRlRmlsZShmKTsKLQkJdGhpcy5nZXRKYXZhTW9kZWwoKS5yZWZyZXNoRXh0ZXJuYWxBcmNoaXZlcyhudWxsLG51bGwpOwotCQkKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEiLCAKLQkJCSJQWypdOiB7Q0hJTERSRU59XG4iKwotCQkJIgkiK3BQYXRoKyJbLV06IHt9IgotCQkpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQl9IGZpbmFsbHkgewotCQlpZihmICE9IG51bGwpIHsKLQkJCWRlbGV0ZUZpbGUoZik7Ci0JCX0KLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JCXRoaXMuc3RvcERlbHRhcygpOwotCX0KLX0KLS8qKgotICogUmVmcmVzaCBhIEphdmFQcm9qZWN0IGFmdGVyIGEgcmVtb3ZhbCBvZiBhbiBleHRlcm5hbCBqYXIuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RFeHRlcm5hbEphclJlbW92ZWQyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUZpbGUgZiA9IG51bGw7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsiIn0sICIiKTsKLQkJCi0JCVN0cmluZyBsaWJQYXRoID0gZ2V0TGlicmFyeVBhdGgoKTsKLQkJU3RyaW5nIHBQYXRoID0gZ2V0RXh0ZXJuYWxQYXRoKCkrIi9wLmphciI7Ci0JCVN0cmluZyBwMlBhdGggPSBsaWJQYXRoKyIvcDIuamFyIjsKLQkJCi0JCXNldENsYXNzcGF0aChwcm9qZWN0LCBuZXcgSUNsYXNzcGF0aEVudHJ5W117SmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KG5ldyBQYXRoKHBQYXRoKSwgbnVsbCwgbnVsbCl9KTsKLQkJCi0JCWYgPSBuZXcgRmlsZShwUGF0aCk7Ci0JCUZpbGUgZjIgPSBuZXcgRmlsZShwMlBhdGgpOwotCQkKLQkJY29weShmMiwgZik7Ci0JCXRoaXMuZ2V0SmF2YU1vZGVsKCkucmVmcmVzaEV4dGVybmFsQXJjaGl2ZXMobnVsbCxudWxsKTsKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQkKLQkJZGVsZXRlRmlsZShmKTsKLQkJdGhpcy5nZXRKYXZhTW9kZWwoKS5yZWZyZXNoRXh0ZXJuYWxBcmNoaXZlcyhuZXcgSUphdmFFbGVtZW50W117cHJvamVjdH0sbnVsbCk7Ci0JCQotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSIsIAotCQkJIlBbKl06IHtDSElMRFJFTn1cbiIrCi0JCQkiCSIrcFBhdGgrIlstXToge30iCi0JCSk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCX0gZmluYWxseSB7Ci0JCWlmKGYgIT0gbnVsbCkgewotCQkJZGVsZXRlRmlsZShmKTsKLQkJfQotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JfQotfQotLyoqCi0gKiBSZWZyZXNoIGFuIGV4dGVybmFsIGphciBhZnRlciBhIHJlbW92YWwgb2YgdGhpcyBqYXIuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RFeHRlcm5hbEphclJlbW92ZWQzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUZpbGUgZiA9IG51bGw7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsiIn0sICIiKTsKLQkJCi0JCVN0cmluZyBsaWJQYXRoID0gZ2V0TGlicmFyeVBhdGgoKTsKLQkJU3RyaW5nIHBQYXRoID0gZ2V0RXh0ZXJuYWxQYXRoKCkrIi9wLmphciI7Ci0JCVN0cmluZyBwMlBhdGggPSBsaWJQYXRoKyIvcDIuamFyIjsKLQkJCi0JCXNldENsYXNzcGF0aChwcm9qZWN0LCBuZXcgSUNsYXNzcGF0aEVudHJ5W117SmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KG5ldyBQYXRoKHBQYXRoKSwgbnVsbCwgbnVsbCl9KTsKLQkJCi0JCWYgPSBuZXcgRmlsZShwUGF0aCk7Ci0JCUZpbGUgZjIgPSBuZXcgRmlsZShwMlBhdGgpOwotCQkKLQkJY29weShmMiwgZik7Ci0JCXRoaXMuZ2V0SmF2YU1vZGVsKCkucmVmcmVzaEV4dGVybmFsQXJjaGl2ZXMobnVsbCxudWxsKTsKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQkKLQkJZGVsZXRlRmlsZShmKTsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChwUGF0aCk7Ci0JCXRoaXMuZ2V0SmF2YU1vZGVsKCkucmVmcmVzaEV4dGVybmFsQXJjaGl2ZXMobmV3IElKYXZhRWxlbWVudFtde3Jvb3R9LG51bGwpOwotCQkKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEiLCAKLQkJCSJQWypdOiB7Q0hJTERSRU59XG4iKwotCQkJIgkiK3BQYXRoKyJbLV06IHt9IgotCQkpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQl9IGZpbmFsbHkgewotCQlpZihmICE9IG51bGwpIHsKLQkJCWRlbGV0ZUZpbGUoZik7Ci0JCX0KLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JCXRoaXMuc3RvcERlbHRhcygpOwotCX0KLX0KLS8qKgotICogLSBhZGQgYW4gaW50ZXJuYWwgamFyIHRvIGNsYXNwYXRoCi0gKiAtIHJlbW92ZSBpbnRlcm5hbCBqYXIgYW5kIHRoZSBzYW1lIGphciBhcyBleHRlcm5hbCBqYXIKLSAqIC0gcmVmcmVzaCB0aGUgSmF2YU1vZGVsCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RFeHRlcm5hbEphckludGVybmFsRXh0ZXJuYWxKYXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JRmlsZSBmID0gbnVsbDsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyIifSwgIiIpOwotCQkKLQkJU3RyaW5nIGxpYlBhdGggPSBnZXRMaWJyYXJ5UGF0aCgpOwotCQlTdHJpbmcgcDFQYXRoID0gbGliUGF0aCsiL3AxLmphciI7Ci0JCVN0cmluZyBwMlBhdGggPSBsaWJQYXRoKyIvcDIuamFyIjsKLQkJRmlsZSBmMT0gbmV3IEZpbGUocDFQYXRoKTsKLQkJRmlsZSBmMiA9IG5ldyBGaWxlKHAyUGF0aCk7Ci0JCQotCQlTdHJpbmcgaW50ZXJuYWxGb29QYXRoID0gIi9QL2Zvby5qYXIiOwotCQlJRmlsZSBmb29JRmlsZSA9IHRoaXMuY3JlYXRlRmlsZShpbnRlcm5hbEZvb1BhdGgsIHJlYWQoZjEpKTsKLQkJCi0JCXNldENsYXNzcGF0aChwcm9qZWN0LCBuZXcgSUNsYXNzcGF0aEVudHJ5W117SmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KG5ldyBQYXRoKGludGVybmFsRm9vUGF0aCksIG51bGwsIG51bGwpfSk7Ci0JCXRoaXMuZ2V0SmF2YU1vZGVsKCkucmVmcmVzaEV4dGVybmFsQXJjaGl2ZXMobnVsbCxudWxsKTsKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQkKLQkJSVBhdGggZXh0ZXJuYWxGb29QYXRoID0gZm9vSUZpbGUuZ2V0TG9jYXRpb24oKTsKLQkJc2V0Q2xhc3NwYXRoKHByb2plY3QsIG5ldyBJQ2xhc3NwYXRoRW50cnlbXXtKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkoZXh0ZXJuYWxGb29QYXRoLCBudWxsLCBudWxsKX0pOwotCQkKLQkJZiA9IG5ldyBGaWxlKGV4dGVybmFsRm9vUGF0aC50b1N0cmluZygpKTsKLQkJY29weShmMiwgZik7Ci0JCQotCQl0aGlzLmdldEphdmFNb2RlbCgpLnJlZnJlc2hFeHRlcm5hbEFyY2hpdmVzKG51bGwsbnVsbCk7Ci0JCQotCQlTdHJpbmcgZGVsdGFQYXRoID0gZXh0ZXJuYWxGb29QYXRoLnRvU3RyaW5nKCk7Ci0JCWRlbHRhUGF0aCA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShkZWx0YVBhdGguY2hhckF0KDApKSArIGRlbHRhUGF0aC5zdWJzdHJpbmcoMSk7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIiwgCi0JCQkiUFsqXToge0NISUxEUkVOfVxuIisKLQkJCSIJZm9vLmphclsqXToge1JFTU9WRUQgRlJPTSBDTEFTU1BBVEh9XG4iKwotCQkJIgkiK2RlbHRhUGF0aC5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKSsiWypdOiB7QURERUQgVE8gQ0xBU1NQQVRIfVxuIisKLQkJCSIJUmVzb3VyY2VEZWx0YSgvUC8uY2xhc3NwYXRoKVsqXVxuIisKLQkJCSJcbiIrCi0JCQkiUFsqXToge0NISUxEUkVOfVxuIisKLQkJCSIJIitkZWx0YVBhdGgrIlsqXToge0NPTlRFTlQgfCBBUkNISVZFIENPTlRFTlQgQ0hBTkdFRH0iCi0JCSk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCX0gZmluYWxseSB7Ci0JCWlmKGYgIT0gbnVsbCkgewotCQkJZGVsZXRlRmlsZShmKTsKLQkJfQotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JfQotfQotfQotCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvRmFjdG9yeVRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvRmFjdG9yeVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYjhiNDUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0ZhY3RvcnlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLXB1YmxpYyBjbGFzcyBGYWN0b3J5VGVzdHMgZXh0ZW5kcyBNb2RpZnlpbmdSZXNvdXJjZVRlc3RzIHsKLXB1YmxpYyBGYWN0b3J5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCXJldHVybiBuZXcgU3VpdGUoRmFjdG9yeVRlc3RzLmNsYXNzKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgSmF2YSBtb2RlbCBlbGVtZW50IGNhbiBiZSBjcmVhdGVkIGZyb20gYSBJRmlsZSB0aGF0Ci0gKiBpcyBhIGNsYXNzIGZpbGUuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVCaW5hcnlUb29sT2JqZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10ge30sIG5ldyBTdHJpbmdbXSB7ImxpYiJ9LCAiYmluIik7Ci0JCUlGaWxlIGZpbGUgPSB0aGlzLmNyZWF0ZUZpbGUoIi9QL2xpYi9YLmNsYXNzIiwgIiIpOwotCQkKLQkJSUphdmFFbGVtZW50IG9iamVjdCA9IEphdmFDb3JlLmNyZWF0ZShmaWxlKTsKLQkJYXNzZXJ0VHJ1ZSgidG9vbGluZyBvYmplY3Qgbm90IGNyZWF0ZWQiLCBvYmplY3QgIT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoImNsYXNzIGZpbGUgZG9lcyBub3QgZXhpc3QiLCBvYmplY3QuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKCJ3cm9uZyBvYmplY3QgY3JlYXRlZCIsIG9iamVjdCBpbnN0YW5jZW9mIElDbGFzc0ZpbGUpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgSmF2YSBtb2RlbCBlbGVtZW50IGNhbiBiZSBjcmVhdGVkIGZyb20gYSBJRmlsZSB0aGF0Ci0gKiBpcyBhIEphdmEgZmlsZS4gIEVuc3VyZXMgdGhhdCBhbnkgdHdvIG1vZGVsIGVsZW1lbnRzIGNyZWF0ZWQgd2lsbCBzaGFyZQotICogdGhlIHNhbWUgcHJvamVjdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdENyZWF0ZUNvbXBpbGF0aW9uVW5pdHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCXRoaXMuY3JlYXRlRm9sZGVyKCIvUC9zcmMveC95L3oiKTsKLQkJSUZpbGUgZmlsZUEgPSB0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1Avc3JjL3gveS96L0EuamF2YSIsIAotCQkJInBhY2thZ2UgeC55Lno7XG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJRmlsZSBmaWxlQiA9IHRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMveC95L0IuamF2YSIsIAotCQkJInBhY2thZ2UgeC55O1xuIiArCi0JCQkicHVibGljIGNsYXNzIEIge1xuIiArCi0JCQkifSIKLQkJKTsKLQotCQlJSmF2YUVsZW1lbnQgb2JqZWN0QSA9IEphdmFDb3JlLmNyZWF0ZShmaWxlQSk7Ci0JCWFzc2VydFRydWUoInRvb2xpbmcgb2JqZWN0IEEgbm90IGNyZWF0ZWQiLCBvYmplY3RBICE9IG51bGwpOwotCQlhc3NlcnRUcnVlKCJ3cm9uZyBvYmplY3QgQSBjcmVhdGVkIiwgb2JqZWN0QSBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpOwotCQlhc3NlcnRUcnVlKCJjb21waWxhdGlvbiB1bml0IEEgZG9lcyBub3QgZXhpc3QiLCBvYmplY3RBLmV4aXN0cygpKTsKLQotCQlJSmF2YUVsZW1lbnQgb2JqZWN0QiA9IEphdmFDb3JlLmNyZWF0ZShmaWxlQik7Ci0JCWFzc2VydFRydWUoInRvb2xpbmcgb2JqZWN0IEIgbm90IGNyZWF0ZWQiLCBvYmplY3RCICE9IG51bGwpOwotCQlhc3NlcnRUcnVlKCJ3cm9uZyBvYmplY3QgQiBjcmVhdGVkIiwgb2JqZWN0QiBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpOwotCQlhc3NlcnRUcnVlKCJjb21waWxhdGlvbiB1bml0IEIgZG9lcyBub3QgZXhpc3QiLCBvYmplY3RCLmV4aXN0cygpKTsKLQotCQlhc3NlcnRFcXVhbHMoInNob3VsZCBzaGFyZSBwcm9qZWN0IiwgKChJQ29tcGlsYXRpb25Vbml0KW9iamVjdEEpLmdldEphdmFQcm9qZWN0KCksICgoSUNvbXBpbGF0aW9uVW5pdClvYmplY3RCKS5nZXRKYXZhUHJvamVjdCgpKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIEphdmEgbW9kZWwgZWxlbWVudCBjYW4gYmUgY3JlYXRlZCBmcm9tIGEgSUZpbGUgdGhhdAotICogaXMgYSBKYXZhIGZpbGUuIEV2ZW4gaWYgbm90IG9uIHRoZSBjbGFzc3BhdGggKGluIHRoaXMgY2FzZSBpdCBzaG91bGQgbm90IGV4aXN0KS4KLSAqLwotcHVibGljIHZvaWQgdGVzdENyZWF0ZUNvbXBpbGF0aW9uVW5pdHNOb3RPbkNsYXNzcGF0aCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJdGhpcy5jcmVhdGVGb2xkZXIoIi9QL290aGVyL25lc3RlZCIpOwotCQlJRmlsZSBmaWxlQSA9IHRoaXMuY3JlYXRlRmlsZSgiL1Avb3RoZXIvQS5qYXZhIiwgInB1YmxpYyBjbGFzcyBBIHt9Iik7Ci0JCUlGaWxlIGZpbGVCID0gdGhpcy5jcmVhdGVGaWxlKCIvUC9vdGhlci9uZXN0ZWQvQi5qYXZhIiwgInB1YmxpYyBjbGFzcyBCIHt9Iik7Ci0JCUlGaWxlIGZpbGVDID0gdGhpcy5jcmVhdGVGaWxlKCIvUC9DLmphdmEiLCAicHVibGljIGNsYXNzIEMge30iKTsKLQkJCi0JCUlKYXZhRWxlbWVudCBvYmplY3RBID0gSmF2YUNvcmUuY3JlYXRlKGZpbGVBKTsKLQkJYXNzZXJ0VHJ1ZSgidG9vbGluZyBvYmplY3QgQSBub3QgY3JlYXRlZCIsIG9iamVjdEEgIT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoIndyb25nIG9iamVjdCBBIGNyZWF0ZWQiLCBvYmplY3RBIGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCk7Ci0JCWFzc2VydFRydWUoImNvbXBpbGF0aW9uIHVuaXQgQSBzaG91bGQgbm90IGV4aXN0IiwgIW9iamVjdEEuZXhpc3RzKCkpOwotCi0JCUlKYXZhRWxlbWVudCBvYmplY3RCID0gSmF2YUNvcmUuY3JlYXRlKGZpbGVCKTsKLQkJYXNzZXJ0VHJ1ZSgidG9vbGluZyBvYmplY3QgQiBub3QgY3JlYXRlZCIsIG9iamVjdEIgIT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoIndyb25nIG9iamVjdCBCIGNyZWF0ZWQiLCBvYmplY3RCIGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCk7Ci0JCWFzc2VydFRydWUoImNvbXBpbGF0aW9uIHVuaXQgQiBzaG91bGQgbm90IGV4aXN0IiwgIW9iamVjdEIuZXhpc3RzKCkpOwotCi0JCWFzc2VydEVxdWFscygic2hvdWxkIHNoYXJlIHByb2plY3QiLCAoKElDb21waWxhdGlvblVuaXQpb2JqZWN0QSkuZ2V0SmF2YVByb2plY3QoKSwgKChJQ29tcGlsYXRpb25Vbml0KW9iamVjdEIpLmdldEphdmFQcm9qZWN0KCkpOwotCi0JCUlKYXZhRWxlbWVudCBvYmplY3RDID0gSmF2YUNvcmUuY3JlYXRlKGZpbGVDKTsKLQkJYXNzZXJ0VHJ1ZSgidG9vbGluZyBvYmplY3QgQyBub3QgY3JlYXRlZCIsIG9iamVjdEMgIT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoIndyb25nIG9iamVjdCBDIGNyZWF0ZWQiLCBvYmplY3RDIGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCk7Ci0JCWFzc2VydFRydWUoImNvbXBpbGF0aW9uIHVuaXQgQyBzaG91bGQgbm90IGV4aXN0IiwgIW9iamVjdEMuZXhpc3RzKCkpOwotCi0JCUlQYWNrYWdlRnJhZ21lbnQgcGtnPSAoSVBhY2thZ2VGcmFnbWVudClvYmplY3RBLmdldFBhcmVudCgpIDsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdD0gKElQYWNrYWdlRnJhZ21lbnRSb290KXBrZy5nZXRQYXJlbnQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJwa2cgc2hvdWxkIGJlIGRlZmF1bHQiLCAiIiwgcGtnLmdldEVsZW1lbnROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgcGFyZW50J3MgZm9sZGVyIiwgdGhpcy5nZXRGb2xkZXIoIi9QL290aGVyIiksIHBrZy5nZXRSZXNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIHJvb3QiLCB0aGlzLmdldEZvbGRlcigiL1Avb3RoZXIiKSwgcm9vdC5nZXRSZXNvdXJjZSgpKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIEphdmEgbW9kZWwgZWxlbWVudCBjYW4gYmUgY3JlYXRlZCBmcm9tIGEgSUZvbGRlci4gIAotICogVGVzdCB0aGF0IG5vIGVsZW1lbnRzIGFyZSBjcmVhdGVkIGlmIHRoZXJlIGlzIG5vIGNsYXNzcGF0aC4KLSAqIEVuc3VyZSB0aGF0IHRoZSBjb3JyZWN0IEphdmEgbW9kZWwgZWxlbWVudCBpcyBjcmVhdGVkIGJhc2VkIG9uIHRoZQotICogY2xhc3NwYXRoLiAgCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVGb2xkZXJUb29sT2JqZWN0cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHt9LCAiYmluIik7Ci0JCXRoaXMuY3JlYXRlRm9sZGVyKCIvUC9zcmMveC95L3oiKTsKLQkJCi0JCUlGb2xkZXIgc3JjID10aGlzLmdldEZvbGRlcigiL1Avc3JjIik7Ci0JCUlGb2xkZXIgcmVzID0gc3JjLmdldEZvbGRlcigieCIpOwotCQlJSmF2YUVsZW1lbnQgb2JqZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHJlcyk7Ci0JCWFzc2VydFRydWUoInRvb2xpbmcgb2JqZWN0IDEgc2hvdWxkIG5vdCBiZSBjcmVhdGVkIiwgb2JqZWN0ID09IG51bGwpOwotCQotCQkvL3NldCBhIGNsYXNzcGF0aAotCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGg9IG5ldyBJQ2xhc3NwYXRoRW50cnlbXSB7SmF2YUNvcmUubmV3U291cmNlRW50cnkoc3JjLmdldEZ1bGxQYXRoKCkpfTsKLQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKGNsYXNzcGF0aCwgbnVsbCk7Ci0JCi0JCS8vdGVzdCB3aXRoIGEgY2xhc3MgcGF0aAotCQlvYmplY3QgPSBKYXZhQ29yZS5jcmVhdGUoc3JjKTsKLQkJYXNzZXJ0VHJ1ZSgidG9vbGluZyBvYmplY3QgMiBzaG91bGQgYmUgY3JlYXRlZCIsIG9iamVjdCAhPSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSgidG9vbGluZyBvYmplY3QgMiBzaG91bGQgYmUgYSBJUGFja2FnZUZyYWdtZW50Um9vdCIsIG9iamVjdCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KTsKLQkJYXNzZXJ0RXF1YWxzKCJJUGFja2FnZUZyYWdtZW50Um9vdCAyIG5hbWUgaXMgaW5jb3JyZWN0IiwgInNyYyIsIG9iamVjdC5nZXRFbGVtZW50TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgicm9vdCAnc3JjJyBkb2VzIG5vdCBleGlzdCIsIG9iamVjdC5leGlzdHMoKSk7Ci0JCQotCQlvYmplY3QgPSBKYXZhQ29yZS5jcmVhdGUocmVzKTsKLQkJYXNzZXJ0VHJ1ZSgidG9vbGluZyBvYmplY3QgMyBzaG91bGQgYmUgY3JlYXRlZCIsIG9iamVjdCAhPSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSgidG9vbGluZyBvYmplY3QgMyBzaG91bGQgYmUgYSBJUGFja2FnZUZyYWdtZW50Iiwgb2JqZWN0IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCk7Ci0JCWFzc2VydEVxdWFscygiSVBhY2thZ2VGcmFnbWVudCAzIG5hbWUgaXMgaW5jb3JyZWN0IiwgIngiLCBvYmplY3QuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoInBhY2thZ2UgJ2NvbScgZG9lcyBub3QgZXhpc3QiLCBvYmplY3QuZXhpc3RzKCkpOwotCQotCQlJRm9sZGVyIHN1YkZvbGRlcj0gKChJRm9sZGVyKXJlcykuZ2V0Rm9sZGVyKCJ5Iik7Ci0JCW9iamVjdD0gSmF2YUNvcmUuY3JlYXRlKHN1YkZvbGRlcik7Ci0JCWFzc2VydFRydWUoInRvb2xpbmcgb2JqZWN0ICd4LnknIHNob3VsZCBiZSBjcmVhdGVkIiwgb2JqZWN0ICE9IG51bGwpOwotCQlhc3NlcnRUcnVlKCJ0b29saW5nIG9iamVjdCAneC55JyBzaG91bGQgYmUgYSBJUGFja2FnZUZyYWdtZW50Iiwgb2JqZWN0IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCk7Ci0JCWFzc2VydEVxdWFscygiSVBhY2thZ2VGcmFnbWVudCAneC55JyBuYW1lIGlzIGluY29ycmVjdCIsICJ4LnkiLCBvYmplY3QuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoInBhY2thZ2UgJ3gueScgZG9lcyBub3QgZXhpc3QiLCBvYmplY3QuZXhpc3RzKCkpOwotCQotCQkvL25vdCBvbiBvciBiZWxvdyB0aGUgY2xhc3MgcGF0aAotCQlJRm9sZGVyIGJpbiA9IHRoaXMuZ2V0Rm9sZGVyKCIvUC9iaW4iKTsKLQkJb2JqZWN0ID0gSmF2YUNvcmUuY3JlYXRlKGJpbik7Ci0JCWFzc2VydFRydWUoInRvb2xpbmcgb2JqZWN0IDQgc2hvdWxkIG5vdCBiZSBjcmVhdGVkIiwgb2JqZWN0ID09IG51bGwpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IHRoZSBmYWN0b3J5IGNvcnJlY3RseSBoYW5kbGVzIGVtcHR5IGphdmEgZmlsZXMgCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVGcm9tRW1wdHlKYXZhRmlsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJSUZpbGUgZmlsZSA9IHRoaXMuY3JlYXRlRmlsZSgiL1Avc3JjL1guamF2YSIsICIiKTsKLQotCQlJSmF2YUVsZW1lbnQgY3UgPSBKYXZhQ29yZS5jcmVhdGUoZmlsZSk7Ci0JCWFzc2VydFRydWUoImRvZXMgbm90IGhhbmRsZSBlbXB0eSBKYXZhIGZpbGVzIiwgY3UgIT0gbnVsbCk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgdGhlIGZhY3RvcnkgY29ycmVjdGx5IGhhbmRsZXMgZmlsZXMgd2l0aG91dCBleHRlbnNpb25zCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVGcm9tRmlsZVdpdGhvdXRFeHRlbnNpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCUlGaWxlIGZpbGUgPSB0aGlzLmNyZWF0ZUZpbGUoIi9QL3NyYy9GaWxlV2l0aG91dEV4dGVuc2lvbiIsICJwdWJsaWMgY2xhc3MgWCB7fSIpOwotCi0JCUlKYXZhRWxlbWVudCBjdSA9IEphdmFDb3JlLmNyZWF0ZShmaWxlKTsKLQkJYXNzZXJ0VHJ1ZSgiaW52YWxpZCBmaWxlIG5vdCBkZXRlY3RlZCIsIGN1ID09IG51bGwpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGZhY3RvcnkgY29ycmVjdGx5IGhhbmRsZXMgaW52YWxpZCBtZW1lbnRvcy4KLSAqLwotcHVibGljIHZvaWQgdGVzdENyZWF0ZUZyb21JbnZhbGlkTWVtZW50bygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCWFzc2VydFRydWUoImludmFsaWQgcGFyYW1ldGVyIG5vdCBkZXRlY3RlZCIsIEphdmFDb3JlLmNyZWF0ZSgoU3RyaW5nKSBudWxsKSA9PSBudWxsKTsKLQlhc3NlcnRUcnVlKCJzaG91bGQgcmV0dXJuIHRoZSBqYXZhIG1vZGVsIiwgSmF2YUNvcmUuY3JlYXRlKCIiKSAhPSBudWxsKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgSmF2YSBtb2RlbCBlbGVtZW50IGNhbiBiZSBjcmVhdGVkIGZyb20gYSBJRmlsZQotICogdGhhdCBpcyBhIHppcCBvciBqYXIuICAKLSAqLwotcHVibGljIHZvaWQgdGVzdENyZWF0ZUphclRvb2xPYmplY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7fSwgbmV3IFN0cmluZ1tdIHsiL1AvbGliLmphciJ9LCAiIik7Ci0JCUlGaWxlIGZpbGUgPSB0aGlzLmNyZWF0ZUZpbGUoIi9QL2xpYi5qYXIiLCAiIik7Ci0KLQkJSUphdmFFbGVtZW50IGphciA9IEphdmFDb3JlLmNyZWF0ZShmaWxlKTsKLQkJYXNzZXJ0VHJ1ZSgidG9vbGluZyBvYmplY3Qgbm90IGNyZWF0ZWQiLCBqYXIgIT0gbnVsbCk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBKYXZhIG1vZGVsIGVsZW1lbnQgY2FuIGJlIGNyZWF0ZWQgZnJvbSBhIGNsYXNzIGZvbGRlciBsaWJyYXJ5IHRoYXQgaXMgaW4gdGhlIHByb2plY3QncyBvdXRwdXQuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMjU1MzggQ29uZmxpY3Qgb2YgY2xhc3Nmb2xkZXIgYW5kIG91dHB1dGZvbGRlciBub3QgcmVwb3J0ZWQpCi0qLyAKLXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVMaWJJbk91dHB1dCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHt9LCBuZXcgU3RyaW5nW10geyIvUC9saWIifSwgIiIpOwotCQlJRm9sZGVyIGZvbGRlciA9IHRoaXMuY3JlYXRlRm9sZGVyKCIvUC9saWIiKTsKLQotCQlJSmF2YUVsZW1lbnQgbGliID0gSmF2YUNvcmUuY3JlYXRlKGZvbGRlcik7Ci0JCWFzc2VydFRydWUoInRvb2xpbmcgb2JqZWN0IG5vdCBjcmVhdGVkIiwgbGliICE9IG51bGwpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9IaWVyYXJjaHlPbldvcmtpbmdDb3BpZXNUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0hpZXJhcmNoeU9uV29ya2luZ0NvcGllc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMGY3ZGMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0hpZXJhcmNoeU9uV29ya2luZ0NvcGllc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlSGllcmFyY2h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklXb3JraW5nQ29weTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgSGllcmFyY2h5T25Xb3JraW5nQ29waWVzVGVzdHMgZXh0ZW5kcyBXb3JraW5nQ29weVRlc3RzIHsKLQotcHVibGljIEhpZXJhcmNoeU9uV29ya2luZ0NvcGllc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgU3VpdGUoSGllcmFyY2h5T25Xb3JraW5nQ29waWVzVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQotCXN1aXRlLmFkZFRlc3QobmV3IEhpZXJhcmNoeU9uV29ya2luZ0NvcGllc1Rlc3RzKCJ0ZXN0U2ltcGxlU3VwZXJUeXBlSGllcmFyY2h5IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEhpZXJhcmNoeU9uV29ya2luZ0NvcGllc1Rlc3RzKCJ0ZXN0U2ltcGxlU3ViVHlwZUhpZXJhcmNoeSIpKTsKLQotCXJldHVybiBzdWl0ZTsKLX0KLS8qKgotICovCi1wdWJsaWMgdm9pZCB0ZXN0U2ltcGxlU3ViVHlwZUhpZXJhcmNoeSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlTdHJpbmcgbmV3Q29udGVudHMgPQotCQkicGFja2FnZSB4Lnk7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBBIGV4dGVuZHMgQiB7XG4iICsKLQkJIn0iOwotCXRoaXMuY29weS5nZXRCdWZmZXIoKS5zZXRDb250ZW50cyhuZXdDb250ZW50cyk7Ci0JdGhpcy5jb3B5LnJlY29uY2lsZSgpOwotCQotCUlGaWxlIGZpbGUgPSBudWxsOwotCXRyeSB7Ci0JCWZpbGUgPSB0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiUC9zcmMveC95L0IuamF2YSIsIAotCQkJInBhY2thZ2UgeC55O1xuIiArCi0JCQkicHVibGljIGNsYXNzIEIge1xuIiArCi0JCQkifSIpOwotCQotCQlJVHlwZSB0eXBlID0gdGhpcy5nZXRDb21waWxhdGlvblVuaXQoIlAvc3JjL3gveS9CLmphdmEiKS5nZXRUeXBlKCJCIik7Ci0JCUlUeXBlSGllcmFyY2h5IGggPSB0eXBlLm5ld1R5cGVIaWVyYXJjaHkobmV3IElXb3JraW5nQ29weVtdIHt0aGlzLmNvcHl9LCBudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVW5leHBlY3RlZCBoaWVyYXJjaHkiLAotCQkJIkZvY3VzOiB4LnkuQlxuIiArCi0JCQkiU3VwZXIgdHlwZXM6XG4iICsKLQkJCSIgIEIgW2luIEIuamF2YSBbaW4geC55IFtpbiBzcmMgW2luIFBdXV1dXG4iICsKLQkJCSIgICAgT2JqZWN0IFtpbiBPYmplY3QuY2xhc3MgW2luIGphdmEubGFuZyBbaW4gIiArIHRoaXMuZ2V0RXh0ZXJuYWxKQ0xQYXRoKCkgKyAiIFtpbiBQXV1dXVxuIiArCi0JCQkiU3ViIHR5cGVzOlxuIiArCi0JCQkiICBCIFtpbiBCLmphdmEgW2luIHgueSBbaW4gc3JjIFtpbiBQXV1dXVxuIiArCi0JCQkiICAgIEEgW2luIFtXb3JraW5nIGNvcHldIEEuamF2YSBbaW4geC55IFtpbiBzcmMgW2luIFBdXV1dXG4iLAotCQkJaC50b1N0cmluZygpKTsKLQl9IGZpbmFsbHkgewotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmRlbGV0ZVJlc291cmNlKGZpbGUpOwotCQl9Ci0JfQotfQotLyoqCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVTdXBlclR5cGVIaWVyYXJjaHkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JU3RyaW5nIG5ld0NvbnRlbnRzID0KLQkJInBhY2thZ2UgeC55O1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJIn1cbiIgICsKLQkJImNsYXNzIEIge1xuIiArCi0JCSJ9IjsKLQl0aGlzLmNvcHkuZ2V0QnVmZmVyKCkuc2V0Q29udGVudHMobmV3Q29udGVudHMpOwotCXRoaXMuY29weS5yZWNvbmNpbGUoKTsKLQkKLQlJRmlsZSBmaWxlID0gbnVsbDsKLQl0cnkgewotCQlmaWxlID0gdGhpcy5jcmVhdGVGaWxlKAotCQkJIlAvc3JjL3gveS9DLmphdmEiLCAKLQkJCSJwYWNrYWdlIHgueTtcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBDIGV4dGVuZHMgQiB7XG4iICsKLQkJCSJ9Iik7Ci0JCi0JCUlUeXBlIHR5cGUgPSB0aGlzLmdldENvbXBpbGF0aW9uVW5pdCgiUC9zcmMveC95L0MuamF2YSIpLmdldFR5cGUoIkMiKTsKLQkJSVR5cGVIaWVyYXJjaHkgaCA9IHR5cGUubmV3U3VwZXJ0eXBlSGllcmFyY2h5KG5ldyBJV29ya2luZ0NvcHlbXSB7dGhpcy5jb3B5fSwgbnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlVuZXhwZWN0ZWQgaGllcmFyY2h5IiwKLQkJCSJGb2N1czogeC55LkNcbiIgKwotCQkJIlN1cGVyIHR5cGVzOlxuIiArCi0JCQkiICBDIFtpbiBDLmphdmEgW2luIHgueSBbaW4gc3JjIFtpbiBQXV1dXVxuIiArCi0JCQkiICAgIEIgW2luIFtXb3JraW5nIGNvcHldIEEuamF2YSBbaW4geC55IFtpbiBzcmMgW2luIFBdXV1dXG4iICsKLQkJCSIgICAgICBPYmplY3QgW2luIE9iamVjdC5jbGFzcyBbaW4gamF2YS5sYW5nIFtpbiAiICsgdGhpcy5nZXRFeHRlcm5hbEpDTFBhdGgoKSArICIgW2luIFBdXV1dXG4iICsKLQkJCSJTdWIgdHlwZXM6XG4iICsKLQkJCSIgIEMgW2luIEMuamF2YSBbaW4geC55IFtpbiBzcmMgW2luIFBdXV1dXG4iLAotCQkJaC50b1N0cmluZygpKTsKLQl9IGZpbmFsbHkgewotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmRlbGV0ZVJlc291cmNlKGZpbGUpOwotCQl9Ci0JfQotfQotCi19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvSmF2YUNvbnZlbnRpb25UZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0phdmFDb252ZW50aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBmN2VhYS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvSmF2YUNvbnZlbnRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEphdmFDb252ZW50aW9uVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEphdmFNb2RlbFRlc3RzIHsKLXB1YmxpYyBKYXZhQ29udmVudGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgU3VpdGUoSmF2YUNvbnZlbnRpb25UZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCi0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUNvbnZlbnRpb25UZXN0cygidGVzdEludmFsaWRJbXBvcnREZWNsYXJhdGlvbjEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUNvbnZlbnRpb25UZXN0cygidGVzdEludmFsaWRJbXBvcnREZWNsYXJhdGlvbjIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUNvbnZlbnRpb25UZXN0cygidGVzdEludmFsaWRJbXBvcnREZWNsYXJhdGlvbjMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUNvbnZlbnRpb25UZXN0cygidGVzdFBhY2thZ2VGcmFnbWVudFJvb3RPdmVybGFwIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFDb252ZW50aW9uVGVzdHMoInRlc3RWYWxpZENvbXBpbGF0aW9uVW5pdE5hbWUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUNvbnZlbnRpb25UZXN0cygidGVzdFZhbGlkSWRlbnRpZmllciIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhQ29udmVudGlvblRlc3RzKCJ0ZXN0SW52YWxpZElkZW50aWZpZXIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUNvbnZlbnRpb25UZXN0cygidGVzdFZhbGlkRmllbGROYW1lIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFDb252ZW50aW9uVGVzdHMoInRlc3RWYWxpZEltcG9ydERlY2xhcmF0aW9uIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFDb252ZW50aW9uVGVzdHMoInRlc3RWYWxpZE1ldGhvZE5hbWUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUNvbnZlbnRpb25UZXN0cygidGVzdFZhbGlkUGFja2FnZU5hbWUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUNvbnZlbnRpb25UZXN0cygidGVzdFZhbGlkVHlwZU5hbWUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUNvbnZlbnRpb25UZXN0cygidGVzdFZhbGlkVW5pY29kZUltcG9ydERlY2xhcmF0aW9uIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFDb252ZW50aW9uVGVzdHMoInRlc3RWYWxpZFVuaWNvZGVQYWNrYWdlTmFtZSIpKTsKLQkKLQlyZXR1cm4gc3VpdGU7Ci19Ci0vKioKLSAqIEBzZWUgSmF2YUNvbnZlbnRpb25zCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkSWRlbnRpZmllcigpIHsKLQlTdHJpbmdbXSBpbnZhbGlkSWRzID0gbmV3IFN0cmluZ1tdIHsiIiwgIjFqYXZhIiwgIkZvbyBCYXIiLCAiI0AkISIsICJGb28tQmFyIiwgImlmIiwgIkludmFsaWRFc2NhcGVTZXF1ZW5jZVxcZyIsICJ0cnVlIiwgImZhbHNlIiwgIm51bGwiLCBudWxsLCAiIHVudHJpbW1tZWQgIn07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkSWRzLmxlbmd0aDsgaSsrKSB7Ci0JCWFzc2VydFRydWUoImlkZW50aWZpZXIgbm90IHJlY29nbml6ZWQgYXMgaW52YWxpZDogIiArIGludmFsaWRJZHNbaV0sICFKYXZhQ29udmVudGlvbnMudmFsaWRhdGVJZGVudGlmaWVyKGludmFsaWRJZHNbaV0pLmlzT0soKSk7Ci0JfQotfQotLyoqCi0gKiBAc2VlIEphdmFOYW1pbmdDb252ZW50aW9ucwotICovCi1wdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEltcG9ydERlY2xhcmF0aW9uMSgpIHsKLQlhc3NlcnRUcnVlKCJpbXBvcnQgbm90IHJlY29uaXplZCBhcyBpbnZhbGlkOyBqYXZhLm1hdGguIiwgIUphdmFDb252ZW50aW9ucy52YWxpZGF0ZUltcG9ydERlY2xhcmF0aW9uKCJqYXZhLm1hdGguIikuaXNPSygpKTsKLX0KLS8qKgotICogQHNlZSBKYXZhTmFtaW5nQ29udmVudGlvbnMKLSAqLwotcHVibGljIHZvaWQgdGVzdEludmFsaWRJbXBvcnREZWNsYXJhdGlvbjIoKSB7Ci0JYXNzZXJ0VHJ1ZSgiaW1wb3J0IG5vdCByZWNvbml6ZWQgYXMgaW52YWxpZDsgamF2YS5tYXRoKiIsICFKYXZhQ29udmVudGlvbnMudmFsaWRhdGVJbXBvcnREZWNsYXJhdGlvbigiamF2YS5tYXRoKiIpLmlzT0soKSk7Ci19Ci0vKioKLSAqIEBzZWUgSmF2YU5hbWluZ0NvbnZlbnRpb25zCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkSW1wb3J0RGVjbGFyYXRpb24zKCkgewotCWFzc2VydFRydWUoImltcG9ydCBub3QgcmVjb25pemVkIGFzIGludmFsaWQ7IGVtcHR5IHN0cmluZyIsICFKYXZhQ29udmVudGlvbnMudmFsaWRhdGVJbXBvcnREZWNsYXJhdGlvbigiIikuaXNPSygpKTsKLX0KLS8qKgotICogVGVzdCBmb3IgcGFja2FnZSBmcmFnbWVudCByb290IG92ZXJsYXAKLSAqIEBkZXByZWNhdGVkIGlzT3ZlcmxhcHBpbmdSb290cyBpcyBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlRnJhZ21lbnRSb290T3ZlcmxhcCgpIHRocm93cyBFeGNlcHRpb24gewotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDEiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgbmV3IFN0cmluZ1tdIHsiL1AxL2pjbE1pbi5qYXIifSwgImJpbiIpOwotCQl0aGlzLmNvcHkobmV3IGphdmEuaW8uRmlsZShnZXRFeHRlcm5hbEpDTFBhdGhTdHJpbmcoKSksIG5ldyBqYXZhLmlvLkZpbGUoZ2V0V29ya3NwYWNlUm9vdCgpLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpICsgamF2YS5pby5GaWxlLnNlcGFyYXRvciArICJQMSIgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yICsgImpjbE1pbi5qYXIiKSk7Ci0JCXByb2plY3QuZ2V0UHJvamVjdCgpLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG51bGwpOwotCQkKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3QgcDFaaXA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoIlAxIiwgImpjbE1pbi5qYXIiKTsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3QgcDFTcmM9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoIlAxIiwgInNyYyIpOwotCQotCQlhc3NlcnRUcnVlKCJ6aXAgc2hvdWxkIG5vdCBvdmVybGFwIHNvdXJjZSByb290IiwKLQkJCQkhSmF2YUNvbnZlbnRpb25zLmlzT3ZlcmxhcHBpbmdSb290cyhwMVppcC5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpLCBwMVNyYy5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpKSk7Ci0JCi0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3QgcDJTcmM9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoIlAyIiwgInNyYyIpOwotCQlhc3NlcnRUcnVlKCJzb3VyY2Ugcm9vdHMgaW4gZGlmZmVyZW50IHByb2plY3RzIHNob3VsZCBub3Qgb3ZlcmxhcCAiLAotCQkJCSFKYXZhQ29udmVudGlvbnMuaXNPdmVybGFwcGluZ1Jvb3RzKHAxU3JjLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCksIHAyU3JjLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkpKTsKLQkKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNhbWUgcm9vdCBzaG91bGQgb3ZlcmxhcCIsIEphdmFDb252ZW50aW9ucy5pc092ZXJsYXBwaW5nUm9vdHMocDJTcmMuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkuZ2V0RnVsbFBhdGgoKSwgcDJTcmMuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkuZ2V0RnVsbFBhdGgoKSkpOwotCQotCQlhc3NlcnRUcnVlKCJpc092ZXJMYXBwaW5nUm9vdCBkb2VzIG5vdCBoYW5kbGUgbnVsbCBhcmd1bWVudHMiLCAhSmF2YUNvbnZlbnRpb25zLmlzT3ZlcmxhcHBpbmdSb290cyhwMlNyYy5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpLCBudWxsKSk7Ci0JCWFzc2VydFRydWUoImlzT3ZlckxhcHBpbmdSb290IGRvZXMgbm90IGhhbmRsZSBudWxsIGFyZ3VtZW50cyIsICFKYXZhQ29udmVudGlvbnMuaXNPdmVybGFwcGluZ1Jvb3RzKG51bGwsIG51bGwpKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAxIik7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0vKioKLSAqIEBzZWUgSmF2YUNvbnZlbnRpb25zCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RWYWxpZENvbXBpbGF0aW9uVW5pdE5hbWUoKSB7Ci0JU3RyaW5nW10gaW52YWxpZE5hbWVzID0gbmV3IFN0cmluZ1tdIHsiamF2YS9sYW5nL09iamVjdC5qYXZhIiwgIk9iamVjdC5jbGFzcyIsICIuamF2YSIsICJPYmplY3QuamF2YWFhIiwgIkEuQi5qYXZhIn07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJYXNzZXJ0VHJ1ZSgiY29tcGlsYXRpb24gdW5pdCBuYW1lIG5vdCByZWNvZ25pemVkIGFzIGludmFsaWQ6ICIgKyBpbnZhbGlkTmFtZXNbaV0sICFKYXZhQ29udmVudGlvbnMudmFsaWRhdGVDb21waWxhdGlvblVuaXROYW1lKGludmFsaWROYW1lc1tpXSkuaXNPSygpKTsKLQl9Ci0JU3RyaW5nW10gdmFsaWROYW1lcyA9IG5ldyBTdHJpbmdbXSB7Ik9iamVjdC5KYVZhIn07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZE5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWFzc2VydFRydWUoImNvbXBpbGF0aW9uIHVuaXQgbmFtZSBub3QgcmVjb2duaXplZCBhcyB2YWxpZDogIiArIHZhbGlkTmFtZXNbaV0sIEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUNvbXBpbGF0aW9uVW5pdE5hbWUodmFsaWROYW1lc1tpXSkuaXNPSygpKTsKLQl9Ci19Ci0vKioKLSAqIEBzZWUgSmF2YU5hbWluZ0NvbnZlbnRpb25zCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RWYWxpZEZpZWxkTmFtZSgpIHsKLQlhc3NlcnRUcnVlKCJ1bmljb2RlIGZpZWxkIG5hbWUgbm90IGhhbmRsZWQiLCBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVGaWVsZE5hbWUoInNcXHUwMDY5emUiKS5pc09LKCkpOwotfQotLyoqCi0gKiBAc2VlIEphdmFDb252ZW50aW9ucwotICovCi1wdWJsaWMgdm9pZCB0ZXN0VmFsaWRJZGVudGlmaWVyKCkgewotCVN0cmluZ1tdIHZhbGlkSWRzID0gbmV3IFN0cmluZ1tdIHsic1xcdTAwNjl6ZSIsICJPYmplY3QiLCAiQW5fRXh0cmVtbHlfTG9uZ19DbGFzc19OYW1lX1dpdGhfV29yZHNfU2VwYXJhdGVkX0J5X1VuZGVzY29yZXMifTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkSWRzLmxlbmd0aDsgaSsrKSB7Ci0JCWFzc2VydFRydWUoImlkZW50aWZpZXIgbm90IHJlY29nbml6ZWQgYXMgdmFsaWQ6ICIgKyB2YWxpZElkc1tpXSwgSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlSWRlbnRpZmllcih2YWxpZElkc1tpXSkuaXNPSygpKTsKLQl9Ci19Ci0vKioKLSAqIEBzZWUgSmF2YUNvbnZlbnRpb25zCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RWYWxpZEltcG9ydERlY2xhcmF0aW9uKCkgewotCWFzc2VydFRydWUoImltcG9ydCBub3QgcmVjb25pemVkIGFzIHZhbGlkIiwgSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlSW1wb3J0RGVjbGFyYXRpb24oImphdmEubWF0aC4qIikuaXNPSygpKTsKLX0KLS8qKgotICogQHNlZSBKYXZhTmFtaW5nQ29udmVudGlvbnMKLSAqLwotcHVibGljIHZvaWQgdGVzdFZhbGlkTWV0aG9kTmFtZSgpIHsKLQlhc3NlcnRUcnVlKCJ1bmljb2RlIG1ldGhvZCBuYW1lIG5vdCBoYW5kbGVkIiwgSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlTWV0aG9kTmFtZSgiZ2V0U2l6XFx1MDA2NSIpLmlzT0soKSk7Ci19Ci0vKioKLSAqIEBzZWUgSmF2YU5hbWluZ0NvbnZlbnRpb25zCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RWYWxpZFBhY2thZ2VOYW1lKCkgewotCQotCVN0cmluZyBwa2dOYW1lPSAib3JnLmVjbGlwc2UuamR0LmNvcmUudFxcdTAwNjVzdHMuTXlQYWNrYWdlIjsKLQlhc3NlcnRUcnVlKCJ1bmljb2RlIHBhY2thZ2UgbmFtZSBub3QgaGFuZGxlZCIsIEphdmFDb252ZW50aW9ucy52YWxpZGF0ZVBhY2thZ2VOYW1lKHBrZ05hbWUpLmlzT0soKSk7Ci0KLQlhc3NlcnRUcnVlKCJwYWNrYWdlIG5hbWUgbm90IHJlY29nbml6ZWQgYXMgaW52YWxpZDEiLCAhSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlUGFja2FnZU5hbWUoIiIpLmlzT0soKSk7Ci0JYXNzZXJ0VHJ1ZSgicGFja2FnZSBuYW1lIG5vdCByZWNvZ25pemVkIGFzIHZhbGlkMSIsIEphdmFDb252ZW50aW9ucy52YWxpZGF0ZVBhY2thZ2VOYW1lKCJqYXZhIC4gbGFuZyIpLmlzT0soKSk7Ci0JYXNzZXJ0VHJ1ZSgicGFja2FnZSBuYW1lIG5vdCByZWNvZ25pemVkIGFzIGludmFsaWQyIiwgIUphdmFDb252ZW50aW9ucy52YWxpZGF0ZVBhY2thZ2VOYW1lKCIgICBqYXZhIC4gbGFuZyIpLmlzT0soKSk7Ci0JYXNzZXJ0VHJ1ZSgicGFja2FnZSBuYW1lIG5vdCByZWNvZ25pemVkIGFzIGludmFsaWQzIiwgIUphdmFDb252ZW50aW9ucy52YWxpZGF0ZVBhY2thZ2VOYW1lKCJqYXZhIC4gbGFuZyAgIikuaXNPSygpKTsKLQlhc3NlcnRUcnVlKCJwYWNrYWdlIG5hbWUgbm90IHJlY29nbml6ZWQgYXMgaW52YWxpZDQiLCAhSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlUGFja2FnZU5hbWUobnVsbCkuaXNPSygpKTsKLQlhc3NlcnRUcnVlKCJwYWNrYWdlIG5hbWUgbm90IHJlY29nbml6ZWQgYXMgdW5jb252ZW50aW9uYWwxIiwgSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlUGFja2FnZU5hbWUoIkphdmEubGFuZyIpLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKTsKLQlhc3NlcnRUcnVlKCJwYWNrYWdlIG5hbWUgbm90IHJlY29nbml6ZWQgYXMgdmFsaWQyIiwgSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlUGFja2FnZU5hbWUoImphdmEuTGFuZyIpLmlzT0soKSk7Ci19Ci0vKioKLSAqIEBzZWUgSmF2YU5hbWluZ0NvbnZlbnRpb25zCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RWYWxpZFR5cGVOYW1lKCkgewotCS8vIHJlZ3Jlc3Npb24gdGVzdHMgZm9yIDFHNUhWUEI6IElUUEpDT1JFOldJTk5UIC0gdmFsaWRhdGVKYXZhVHlwZU5hbWUgYWNjZXB0cyB0eXBlIG5hbWVzIGVuZGluZyB3aXRoIFwKLQlhc3NlcnRUcnVlKCJ0eXBlIG5hbWUgc2hvdWxkIG5vdCBjb250YWluIHNsYXNoZXMgKDEpIiwgSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlSmF2YVR5cGVOYW1lKCJPYmplY3RcXCIpLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUik7Ci0JYXNzZXJ0VHJ1ZSgidHlwZSBuYW1lIHNob3VsZCBub3QgY29udGFpbiBzbGFzaGVzICgyKSIsIEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUphdmFUeXBlTmFtZSgiT2JqZWN0LyIpLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUik7Ci0JYXNzZXJ0VHJ1ZSgidHlwZSBuYW1lIHNob3VsZCBub3QgY29udGFpbiBzbGFzaGVzICgzKSIsIEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUphdmFUeXBlTmFtZSgiXFxPYmplY3QiKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpOwotCWFzc2VydFRydWUoInR5cGUgbmFtZSBzaG91bGQgbm90IGNvbnRhaW4gc2xhc2hlcyAoNCkiLCBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVKYXZhVHlwZU5hbWUoImphdmFcXGxhbmdcXE9iamVjdCIpLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUik7Ci0KLQkvLyByZWdyZXNzaW9uIHRlc3QgZm9yIDFHNTJaSUY6IElUUEpVSTpXSU5OVCAtIFdpemFyZHMgc2hvdWxkIHN0cm9uZ2x5IGRpc2NvdXJhZ2UgdGhlIHVzZSBvZiBub24tc3RhbmRhcmQgbmFtZXMKLQlhc3NlcnRUcnVlKCJkaXNjb3VyYWdlZCB0eXBlIG5hbWVzIG5vdCBoYW5kbGVkIiwgSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlSmF2YVR5cGVOYW1lKCJhbG93ZXJjYXNldHlwZW5hbWUiKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORyk7Ci0KLQkvLyBvdGhlciB0ZXN0cwotCWFzc2VydFRydWUoInVuaWNvZGUgdHlwZSBuYW1lIG5vdCBoYW5kbGVkIiwgSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlSmF2YVR5cGVOYW1lKCJQXFx1MDA2NWEiKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0spOwotCWFzc2VydFRydWUoInF1YWxpZmllZCB0eXBlIG5hbWVzIG5vdCBoYW5kbGVkIiwgSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlSmF2YVR5cGVOYW1lKCJqYXZhICAuICBsYW5nXHQuT2JqZWN0IikuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LKTsKLQlhc3NlcnRUcnVlKCJzaW1wbGUgcXVhbGlmaWVkIHR5cGUgbmFtZXMgbm90IGhhbmRsZWQiLCBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVKYXZhVHlwZU5hbWUoImphdmEubGFuZy5PYmplY3QiKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0spOwotCWFzc2VydFRydWUoInNpbXBsZSB0eXBlIG5hbWVzIG5vdCBoYW5kbGVkIiwgSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlSmF2YVR5cGVOYW1lKCJPYmplY3QiKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0spOwotCWFzc2VydFRydWUoImRpc2NvdXJhZ2VkIHR5cGUgbmFtZXMgbm90IGhhbmRsZWQiLCBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVKYXZhVHlwZU5hbWUoIk9iamVjdCRTdWJUeXBlIikuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLldBUk5JTkcpOwotCWFzc2VydFRydWUoImludmFsaWQgdHlwZSBuYW1lIG5vdCByZWNvZ25pemVkIiwgSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlSmF2YVR5cGVOYW1lKCI9PT89PSIpLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUik7Ci19Ci0vKioKLSAqIEBzZWUgSmF2YU5hbWluZ0NvbnZlbnRpb25zCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RWYWxpZFVuaWNvZGVJbXBvcnREZWNsYXJhdGlvbigpIHsKLQkKLQlTdHJpbmcgcGtnTmFtZT0gImNvbS5cXHUwMDY5Ym0uamR0LmNvcmUudGVzdHMuTXlQYWNrYWdcXHUwMDY1IjsKLQlhc3NlcnRUcnVlKCJpbXBvcnQgbm90IHJlY29uaXplZCBhcyB2YWxpZCIsIEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUltcG9ydERlY2xhcmF0aW9uKHBrZ05hbWUpLmlzT0soKSk7Ci0KLX0KLS8qKgotICogQHNlZSBKYXZhTmFtaW5nQ29udmVudGlvbnMKLSAqLwotcHVibGljIHZvaWQgdGVzdFZhbGlkVW5pY29kZVBhY2thZ2VOYW1lKCkgewotCQotCVN0cmluZyBwa2dOYW1lPSAiY29tLlxcdTAwNjlibS5qZHQuY29yZS50ZXN0cy5NeVBhY2thZ1xcdTAwNjUiOwotCWFzc2VydFRydWUoInVuaWNvZGUgcGFja2FnZSBuYW1lIG5vdCBoYW5kbGVkIiwgSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlUGFja2FnZU5hbWUocGtnTmFtZSkuaXNPSygpKTsKLQlhc3NlcnRUcnVlKCJQYXJhbWV0ZXIgbW9kaWZpZWQiLCBwa2dOYW1lLmVxdWFscygiY29tLlxcdTAwNjlibS5qZHQuY29yZS50ZXN0cy5NeVBhY2thZ1xcdTAwNjUiKSk7Ci0KLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9KYXZhRWxlbWVudERlbHRhVGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9KYXZhRWxlbWVudERlbHRhVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhZGIzYi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvSmF2YUVsZW1lbnREZWx0YVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklFbGVtZW50Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5EZWx0YVByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFQcm9qZWN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBUaGVzZSB0ZXN0IGVuc3VyZSB0aGF0IG1vZGlmaWNhdGlvbnMgaW4gSmF2YSBwcm9qZWN0cyBhcmUgY29ycmVjdGx5IHJlcG9ydGVkIGFzCi0gKiBJSmF2YUVsZW1lbnREZWx0YXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRWxlbWVudERlbHRhVGVzdHMgZXh0ZW5kcyBNb2RpZnlpbmdSZXNvdXJjZVRlc3RzIHsKLQkKLQlwdWJsaWMgY2xhc3MgRGVsdGFMaXN0ZW5lciBpbXBsZW1lbnRzIElFbGVtZW50Q2hhbmdlZExpc3RlbmVyIHsKLQkJQXJyYXlMaXN0IGRlbHRhczsKLQkJaW50IGV2ZW50VHlwZTsKLQkJCi0JCXB1YmxpYyBEZWx0YUxpc3RlbmVyKCkgewotCQkJRGVsdGFMaXN0ZW5lci50aGlzLmRlbHRhcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCURlbHRhTGlzdGVuZXIudGhpcy5ldmVudFR5cGUgPSAtMTsKLQkJfQotCQlwdWJsaWMgRGVsdGFMaXN0ZW5lcihpbnQgZXZlbnRUeXBlKSB7Ci0JCQlEZWx0YUxpc3RlbmVyLnRoaXMuZGVsdGFzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJRGVsdGFMaXN0ZW5lci50aGlzLmV2ZW50VHlwZSA9IGV2ZW50VHlwZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoRGVsdGFMaXN0ZW5lci50aGlzLmV2ZW50VHlwZSA9PSAtMSB8fCBldmVudC5nZXRUeXBlKCkgPT0gRGVsdGFMaXN0ZW5lci50aGlzLmV2ZW50VHlwZSkgewotCQkJCURlbHRhTGlzdGVuZXIudGhpcy5kZWx0YXMuYWRkKGV2ZW50LmdldERlbHRhKCkpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGZsdXNoKCkgewotCQkJRGVsdGFMaXN0ZW5lci50aGlzLmRlbHRhcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBEZWx0YUxpc3RlbmVyLnRoaXMuZGVsdGFzLnNpemUoKTsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJSUphdmFFbGVtZW50RGVsdGEgZGVsdGEgPSAoSUphdmFFbGVtZW50RGVsdGEpdGhpcy5kZWx0YXMuZ2V0KGkpOwotCQkJCUlKYXZhRWxlbWVudERlbHRhW10gY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHsKLQkJCQkJZm9yIChpbnQgaj0wLCBjaGlsZHJlbkxlbmd0aD1jaGlsZHJlbi5sZW5ndGg7IGo8Y2hpbGRyZW5MZW5ndGg7IGorKykgewotCQkJCQkJYnVmZmVyLmFwcGVuZChjaGlsZHJlbltqXSk7Ci0JCQkJCQlpZiAoaiAhPSBjaGlsZHJlbkxlbmd0aC0xKSB7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoZGVsdGEpOwotCQkJCX0KLQkJCQlpZiAoaSAhPSBsZW5ndGgtMSkgewotCQkJCQlidWZmZXIuYXBwZW5kKCJcblxuIik7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0JfQotCi0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBTdWl0ZShKYXZhRWxlbWVudERlbHRhVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkKLQkvLyBhZGQvcmVtb3ZlL29wZW4vY2xvc2UgcHJvamVjdHMKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhRWxlbWVudERlbHRhVGVzdHMoInRlc3RBZGRKYXZhUHJvamVjdCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhRWxlbWVudERlbHRhVGVzdHMoInRlc3RSZW1vdmVKYXZhUHJvamVjdCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhRWxlbWVudERlbHRhVGVzdHMoInRlc3RSZW1vdmVBZGRKYXZhUHJvamVjdCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhRWxlbWVudERlbHRhVGVzdHMoInRlc3RSZW1vdmVBZGRCaW5hcnlQcm9qZWN0IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFFbGVtZW50RGVsdGFUZXN0cygidGVzdEFkZEphdmFOYXR1cmUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUVsZW1lbnREZWx0YVRlc3RzKCJ0ZXN0UmVtb3ZlSmF2YU5hdHVyZSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhRWxlbWVudERlbHRhVGVzdHMoInRlc3RPcGVuSmF2YVByb2plY3QiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUVsZW1lbnREZWx0YVRlc3RzKCJ0ZXN0Q2xvc2VKYXZhUHJvamVjdCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhRWxlbWVudERlbHRhVGVzdHMoInRlc3RBZGRUd29KYXZhUHJvamVjdHMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUVsZW1lbnREZWx0YVRlc3RzKCJ0ZXN0QWRkVHdvSmF2YVByb2plY3RzV2l0aEV4dHJhU2V0Q2xhc3NwYXRoIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFFbGVtZW50RGVsdGFUZXN0cygidGVzdERlbGV0ZVByb2plY3RTZXRDUEFub3RoZXJQcm9qZWN0IikpOwotCi0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUVsZW1lbnREZWx0YVRlc3RzKCJ0ZXN0UmVuYW1lSmF2YVByb2plY3QiKSk7Ci0KLQkvLyBub24tamF2YSBwcm9qZWN0cwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFFbGVtZW50RGVsdGFUZXN0cygidGVzdEFkZE5vbkphdmFQcm9qZWN0IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFFbGVtZW50RGVsdGFUZXN0cygidGVzdFJlbW92ZU5vbkphdmFQcm9qZWN0IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFFbGVtZW50RGVsdGFUZXN0cygidGVzdFJlbW92ZU5vbkphdmFQcm9qZWN0VXBkYXRlRGVwZW5kZW50MSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhRWxlbWVudERlbHRhVGVzdHMoInRlc3RSZW1vdmVOb25KYXZhUHJvamVjdFVwZGF0ZURlcGVuZGVudDIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUVsZW1lbnREZWx0YVRlc3RzKCJ0ZXN0UmVtb3ZlTm9uSmF2YVByb2plY3RVcGRhdGVEZXBlbmRlbnQzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFFbGVtZW50RGVsdGFUZXN0cygidGVzdE9wZW5Ob25KYXZhUHJvamVjdCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhRWxlbWVudERlbHRhVGVzdHMoInRlc3RDbG9zZU5vbkphdmFQcm9qZWN0IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFFbGVtZW50RGVsdGFUZXN0cygidGVzdENsb3NlTm9uSmF2YVByb2plY3RVcGRhdGVEZXBlbmRlbnQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUVsZW1lbnREZWx0YVRlc3RzKCJ0ZXN0UmVuYW1lTm9uSmF2YVByb2plY3QiKSk7Ci0JCi0JLy8gcGFja2FnZSBmcmFnbWVudCByb290cwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFFbGVtZW50RGVsdGFUZXN0cygidGVzdERlbGV0ZUlubmVySmFyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFFbGVtZW50RGVsdGFUZXN0cygidGVzdE5lc3RlZFJvb3RQYXJlbnRNb3ZlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFFbGVtZW50RGVsdGFUZXN0cygidGVzdFBhY2thZ2VGcmFnbWVudFJvb3RSZW1vdmVBbmRBZGQiKSk7Ci0JCi0JLy8gcGFja2FnZXMKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhRWxlbWVudERlbHRhVGVzdHMoInRlc3RBZGRQYWNrYWdlU291cmNlSXNCaW4iKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUVsZW1lbnREZWx0YVRlc3RzKCJ0ZXN0UmVuYW1lT3V0ZXJQa2dGcmFnbWVudCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhRWxlbWVudERlbHRhVGVzdHMoInRlc3RQYWNrYWdlRnJhZ21lbnRBZGRBbmRSZW1vdmUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUVsZW1lbnREZWx0YVRlc3RzKCJ0ZXN0UGFja2FnZUZyYWdtZW50TW92ZSIpKTsKLQkKLQkvLyBjb21waWxhdGlvbiB1bml0cwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFFbGVtZW50RGVsdGFUZXN0cygidGVzdEFkZEN1SW5EZWZhdWx0UGtnMSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhRWxlbWVudERlbHRhVGVzdHMoInRlc3RBZGRDdUluRGVmYXVsdFBrZzIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUVsZW1lbnREZWx0YVRlc3RzKCJ0ZXN0TW92ZUN1SW5FbmNsb3NpbmdQa2ciKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUVsZW1lbnREZWx0YVRlc3RzKCJ0ZXN0Q29tcGlsYXRpb25Vbml0UmVtb3ZlQW5kQWRkIikpOwotCQotCS8vIGNvbW1pdC9zYXZlIHdvcmtpbmcgY29waWVzCi0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUVsZW1lbnREZWx0YVRlc3RzKCJ0ZXN0TW9kaWZ5TWV0aG9kQm9keUFuZFNhdmUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUVsZW1lbnREZWx0YVRlc3RzKCJ0ZXN0UmVuYW1lTWV0aG9kQW5kU2F2ZSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhRWxlbWVudERlbHRhVGVzdHMoInRlc3RTYXZlV29ya2luZ0NvcHkiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUVsZW1lbnREZWx0YVRlc3RzKCJ0ZXN0V29ya2luZ0NvcHlDb21taXQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUVsZW1lbnREZWx0YVRlc3RzKCJ0ZXN0QWRkQ29tbWVudEFuZENvbW1pdCIpKTsKLQkKLQkvLyBtYW5hZ2VkIHdvcmtpbmcgY29waWVzCi0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUVsZW1lbnREZWx0YVRlc3RzKCJ0ZXN0Q3JlYXRlV29ya2luZ0NvcHkiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUVsZW1lbnREZWx0YVRlc3RzKCJ0ZXN0RGVzdHJveVdvcmtpbmdDb3B5IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFFbGVtZW50RGVsdGFUZXN0cygidGVzdENyZWF0ZVNoYXJlZFdvcmtpbmdDb3B5IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFFbGVtZW50RGVsdGFUZXN0cygidGVzdERlc3Ryb3lTaGFyZWRXb3JraW5nQ29weSIpKTsKLQkKLQkvLyBub24tamF2YSByZXNvdXJjZXMKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhRWxlbWVudERlbHRhVGVzdHMoInRlc3RNb3ZlUmVzSW5Eb3ROYW1lZEZvbGRlciIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhRWxlbWVudERlbHRhVGVzdHMoInRlc3RNb3ZlVHdvUmVzSW5Sb290IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFFbGVtZW50RGVsdGFUZXN0cygidGVzdE1lcmdlUmVzb3VyY2VEZWx0YXMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUVsZW1lbnREZWx0YVRlc3RzKCJ0ZXN0QWRkRmlsZVRvTm9uSmF2YVByb2plY3QiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUVsZW1lbnREZWx0YVRlc3RzKCJ0ZXN0RGVsZXRlTm9uSmF2YUZvbGRlciIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhRWxlbWVudERlbHRhVGVzdHMoInRlc3RBZGRJbnZhbGlkU3ViZm9sZGVyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFFbGVtZW50RGVsdGFUZXN0cygidGVzdENVTm90T25DbGFzc3BhdGgiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUVsZW1lbnREZWx0YVRlc3RzKCJ0ZXN0Tm9uSmF2YVJlc291cmNlUmVtb3ZlQW5kQWRkIikpOwotCQotCS8vIGxpc3RlbmVycwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFFbGVtZW50RGVsdGFUZXN0cygidGVzdExpc3RlbmVyQXV0b0J1aWxkIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFFbGVtZW50RGVsdGFUZXN0cygidGVzdExpc3RlbmVyUmVjb25jaWxlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFFbGVtZW50RGVsdGFUZXN0cygidGVzdExpc3RlbmVyUG9zdENoYW5nZSIpKTsKLQkKLQkvLyBjbGFzc3BhdGgKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhRWxlbWVudERlbHRhVGVzdHMoInRlc3RTZXRDbGFzc3BhdGhWYXJpYWJsZTEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUVsZW1lbnREZWx0YVRlc3RzKCJ0ZXN0U2V0Q2xhc3NwYXRoVmFyaWFibGUyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFFbGVtZW50RGVsdGFUZXN0cygidGVzdENoYW5nZVJvb3RLaW5kIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFFbGVtZW50RGVsdGFUZXN0cygidGVzdE92ZXJ3cml0ZUNsYXNzcGF0aCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhRWxlbWVudERlbHRhVGVzdHMoInRlc3RSZW1vdmVDUEVudHJ5QW5kUm9vdDEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUVsZW1lbnREZWx0YVRlc3RzKCJ0ZXN0UmVtb3ZlQ1BFbnRyeUFuZFJvb3QyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFFbGVtZW50RGVsdGFUZXN0cygidGVzdFJlbW92ZUNQRW50cnlBbmRSb290MyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhRWxlbWVudERlbHRhVGVzdHMoInRlc3RBZGREb3RDbGFzc3BhdGhGaWxlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFFbGVtZW50RGVsdGFUZXN0cygidGVzdFNldENsYXNzcGF0aE9uRnJlc2hQcm9qZWN0IikpOwotCQotCS8vIGJhdGNoIG9wZXJhdGlvbnMKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhRWxlbWVudERlbHRhVGVzdHMoInRlc3RCYXRjaE9wZXJhdGlvbiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhRWxlbWVudERlbHRhVGVzdHMoInRlc3RNb2RpZnlQcm9qZWN0RGVzY3JpcHRpb25BbmRSZW1vdmVGb2xkZXIiKSk7Ci0JCi0JLy8gYnVpbGQKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhRWxlbWVudERlbHRhVGVzdHMoInRlc3RCdWlsZFByb2plY3RVc2VkQXNMaWIiKSk7Ci0JCi0JLy8gb3V0cHV0IGxvY2F0aW9ucwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFFbGVtZW50RGVsdGFUZXN0cygidGVzdE1vZGlmeU91dHB1dExvY2F0aW9uMSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhRWxlbWVudERlbHRhVGVzdHMoInRlc3RNb2RpZnlPdXRwdXRMb2NhdGlvbjIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YUVsZW1lbnREZWx0YVRlc3RzKCJ0ZXN0TW9kaWZ5T3V0cHV0TG9jYXRpb24zIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFFbGVtZW50RGVsdGFUZXN0cygidGVzdE1vZGlmeU91dHB1dExvY2F0aW9uNCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhRWxlbWVudERlbHRhVGVzdHMoInRlc3RDaGFuZ2VDdXN0b21PdXRwdXQiKSk7Ci0JCi0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgSmF2YUVsZW1lbnREZWx0YVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhZGRpbmcgYSBjb21tZW50IHRvIGEgd29ya2luZyBjb3B5IGFuZCBjb21taXRpbmcgaXQgdHJpZ2dlcnMgYW4gZW1wdHkgZmluZSBncmFpbmVkCi0gKiBkZWx0YSB3aXRoIHRoZSBraW5kIHNldCBmb3IgUFJFX0FVVE9fQlVJTEQgbGlzdGVuZXJzLgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDMyOTM3IEtpbmQgbm90IHNldCBmb3IgZW1wdHkgZmluZS1ncmFpbmVkIGRlbHRhKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0QWRkQ29tbWVudEFuZENvbW1pdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlEZWx0YUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IERlbHRhTGlzdGVuZXIoRWxlbWVudENoYW5nZWRFdmVudC5QUkVfQVVUT19CVUlMRCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjb3B5ID0gbnVsbDsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsiIn0sICIiKTsKLQkJdGhpcy5jcmVhdGVGaWxlKCJQL1guamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkifSIpOwotCQlJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSB0aGlzLmdldENvbXBpbGF0aW9uVW5pdCgiUCIsICIiLCAiIiwgIlguamF2YSIpOwotCQljb3B5ID0gKElDb21waWxhdGlvblVuaXQpdW5pdC5nZXRXb3JraW5nQ29weShudWxsLCBudWxsLCBudWxsKTsKLQkJCi0JCS8vIGFkZCBjb21tZW50IHRvIHdvcmtpbmcgY29weQotCQljb3B5LmdldEJ1ZmZlcigpLnNldENvbnRlbnRzKAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIiAgLy8gc29tZSBjb21tZW50XG4iICsKLQkJCSJ9Iik7Ci0KLQkJLy8gY29tbWl0IHdvcmtpbmcgY29weQotCQlKYXZhQ29yZS5hZGRFbGVtZW50Q2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyLCBFbGVtZW50Q2hhbmdlZEV2ZW50LlBSRV9BVVRPX0JVSUxEKTsKLQkJY29weS5jb21taXQodHJ1ZSwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIGFmdGVyIGNvbW1pdHRpbmcgd29ya2luZyBjb3B5IiwgCi0JCQkiWC5qYXZhWypdOiB7Q09OVEVOVCB8IEZJTkUgR1JBSU5FRH0iLAotCQkJbGlzdGVuZXIudG9TdHJpbmcoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJSmF2YUNvcmUucmVtb3ZlRWxlbWVudENoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWlmIChjb3B5ICE9IG51bGwpIGNvcHkuZGVzdHJveSgpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0KLS8qCi0gKiBBZGQgY3UgaW4gZGVmYXVsdCBwYWNrYWdlIHRlc3QgKHByb2o9c3JjPWJpbikuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RBZGRDdUluRGVmYXVsdFBrZzEoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7IiJ9LCAiIik7Ci0JCXRoaXMuc3RhcnREZWx0YXMoKTsKLQkJdGhpcy5jcmVhdGVGaWxlKCJQL1guamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkifSIpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSIsIAotCQkJIlBbKl06IHtDSElMRFJFTn1cbiIgKwotCQkJIglbcHJvamVjdCByb290XVsqXToge0NISUxEUkVOfVxuIiArCi0JCQkiCQlbZGVmYXVsdF1bKl06IHtDSElMRFJFTn1cbiIgKwotCQkJIgkJCVguamF2YVsrXToge30iCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLQotLyoKLSAqIEFkZCBjdSBpbiBkZWZhdWx0IHBhY2thZ2UgdGVzdCAocHJvaiE9c3JjIT1iaW4pLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0QWRkQ3VJbkRlZmF1bHRQa2cyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQl0aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCXRoaXMuY3JlYXRlRmlsZSgiUC9zcmMvWC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSJ9Iik7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIiwgCi0JCQkiUFsqXToge0NISUxEUkVOfVxuIiArCi0JCQkiCXNyY1sqXToge0NISUxEUkVOfVxuIiArCi0JCQkiCQlbZGVmYXVsdF1bKl06IHtDSElMRFJFTn1cbiIgKwotCQkJIgkJCVguamF2YVsrXToge30iCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qCi0gKiBBZGQgdGhlIC5jbGFzc3BhdGggZmlsZSB0byBhIEphdmEgcHJvamVjdCB0aGF0IHdhcyBtaXNzaW5nIGl0LgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDI2MTI4IHBhY2thZ2VzIGRvbid0IGFwcGVhciBpbiBwYWNrYWdlIGV4cGxvcmVyIHZpZXcpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RBZGREb3RDbGFzc3BhdGhGaWxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlUHJvamVjdCgiUCIpOwotCQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjIik7Ci0JCQotCQkvLyBhZGQgSmF2YSBuYXR1cmUKLQkJdGhpcy5lZGl0RmlsZSgKLQkJCSIvUC8ucHJvamVjdCIsCi0JCQkiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iICsKLQkJCSI8cHJvamVjdERlc2NyaXB0aW9uPlxuIiArCi0JCQkiCTxuYW1lPlRlc3Q8L25hbWU+XG4iICsKLQkJCSIJPGNvbW1lbnQ+PC9jb21tZW50PlxuIiArCi0JCQkiCTxwcm9qZWN0cz5cbiIgKwotCQkJIgk8L3Byb2plY3RzPlxuIiArCi0JCQkiCTxidWlsZFNwZWM+XG4iICsKLQkJCSIJCTxidWlsZENvbW1hbmQ+XG4iICsKLQkJCSIJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT5cbiIgKwotCQkJIgkJCTxhcmd1bWVudHM+XG4iICsKLQkJCSIJCQk8L2FyZ3VtZW50cz5cbiIgKwotCQkJIgkJPC9idWlsZENvbW1hbmQ+XG4iICsKLQkJCSIJPC9idWlsZFNwZWM+XG4iICsKLQkJCSIJPG5hdHVyZXM+XG4iICsKLQkJCSIJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPlxuIiArCi0JCQkiCTwvbmF0dXJlcz5cbiIgKwotCQkJIjwvcHJvamVjdERlc2NyaXB0aW9uPiIKLQkJKTsKLQkJCi0JCXRoaXMuc3RhcnREZWx0YXMoKTsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIlAvLmNsYXNzcGF0aCIsCi0JCQkiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iICsKLQkJCSI8Y2xhc3NwYXRoPlxuIiArCi0JCQkiICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPVwic3JjXCIgcGF0aD1cInNyY1wiLz5cbiIgKwotCQkJIiAgICA8Y2xhc3NwYXRoZW50cnkga2luZD1cIm91dHB1dFwiIHBhdGg9XCJiaW5cIi8+XG4iICsKLQkJCSI8L2NsYXNzcGF0aD4iCi0JCSk7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIiwgCi0JCQkiUFsqXToge0NISUxEUkVOfVxuIiArIAotCQkJIglbcHJvamVjdCByb290XVsqXToge1JFTU9WRUQgRlJPTSBDTEFTU1BBVEh9XG4iICsgCi0JCQkiCXNyY1sqXToge0FEREVEIFRPIENMQVNTUEFUSH1cbiIgKyAKLQkJCSIJUmVzb3VyY2VEZWx0YSgvUC8uY2xhc3NwYXRoKVsrXSIKLQkJKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLnN0b3BEZWx0YXMoKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoKLSAqIEVuc3VyZSB0aGF0IGEgcmVzb3VyY2UgZGVsdGEgaXMgZmlyZWQgd2hlbiBhIGZpbGUgaXMgYWRkZWQgdG8gYSBub24tamF2YSBwcm9qZWN0LgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDE4Njk4IFNlZWluZyBub24tamF2YSBwcm9qZWN0cyBpbiBwYWNrYWdlIHZpZXcpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RBZGRGaWxlVG9Ob25KYXZhUHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZVByb2plY3QoIlAiKTsKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQl0aGlzLmNyZWF0ZUZpbGUoIi9QL3RvdG8udHh0IiwgIiIpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSIsIAotCQkJIlJlc291cmNlRGVsdGEoL1ApIgotCQkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0vKgotICogRW5zdXJlIHRoYXQgYSByZXNvdXJjZSBkZWx0YSBpcyBmaXJlZCB3aGVuIGEgLm5hbWUgZm9sZGVyIGlzIGFkZGVkIHRvIGEgamF2YSBwcm9qZWN0IHdoZXJlIHByaj1zcmMuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMzEzODMgU3RyYW5nZSByZW5kZXJpbmcgb2Ygb2YgbGluayByZXNvdXJjZXMgd2hlbiBsaW5rIHBvaW50cyB0byBFY2xpcHNlIHdvcmtzcGFjZSkKLSAqLwotcHVibGljIHZvaWQgdGVzdEFkZEludmFsaWRTdWJmb2xkZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIpOwotCQl0aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCXRoaXMuY3JlYXRlRm9sZGVyKCIvUC9wLy5mb2xkZXIiKTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEiLCAKLQkJCSJQWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCVtwcm9qZWN0IHJvb3RdWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCQlwWytdOiB7fSIKLQkJKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLnN0b3BEZWx0YXMoKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotCi0vKgotICogQWRkIHRoZSBqYXZhIG5hdHVyZSB0byBhbiBleGlzdGluZyBwcm9qZWN0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0QWRkSmF2YU5hdHVyZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZVByb2plY3QoIlAiKTsKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQl0aGlzLmFkZEphdmFOYXR1cmUoIlAiKTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEiLCAKLQkJCSJQWytdOiB7fVxuIiArIAotCQkJIlJlc291cmNlRGVsdGEoL1ApIgotCQkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0KLS8qCi0gKiBBZGQgYSBqYXZhIHByb2plY3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RBZGRKYXZhUHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyIifSwgIiIpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSIsIAotCQkJIlBbK106IHt9IgotCQkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0KLS8qCi0gKiBBZGQgYSBub24tamF2YSBwcm9qZWN0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0QWRkTm9uSmF2YVByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQl0aGlzLmNyZWF0ZVByb2plY3QoIlAiKTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlNob3VsZCBnZXQgYSBub24tSmF2YSByZXNvdXJjZSBkZWx0YSIsIAotCQkJIlJlc291cmNlRGVsdGEoL1ApIgotCQkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0QWRkUGFja2FnZVNvdXJjZUlzQmluKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgInNyYyIpOwotCQl0aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCXRoaXMuY3JlYXRlRm9sZGVyKCJQL3NyYy94Iik7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIiwgCi0JCQkiUFsqXToge0NISUxEUkVOfVxuIiArCi0JCQkiCXNyY1sqXToge0NISUxEUkVOfVxuIiArCi0JCQkiCQl4WytdOiB7fSIKLQkJKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLnN0b3BEZWx0YXMoKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoKLSAqIEFkZCAyIGphdmEgcHJvamVjdHMgaW4gYW4gSVdvcmtzcGFjZVJ1bm5hYmxlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0QWRkVHdvSmF2YVByb2plY3RzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuc3RhcnREZWx0YXMoKTsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bigKLQkJCW5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQljcmVhdGVKYXZhUHJvamVjdCgiUDEiLCBuZXcgU3RyaW5nW10geyIifSwgIiIpOwotCQkJCQljcmVhdGVKYXZhUHJvamVjdCgiUDIiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQkJCX0KLQkJCX0sCi0JCQludWxsKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEiLCAKLQkJCSJQMVsrXToge31cbiIgKwotCQkJIlAyWytdOiB7fSIsIAotCQkJdGhpcy5nZXRTb3J0ZWRCeVByb2plY3REZWx0YXMoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDEiKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMiIpOwotCX0KLX0KLQotLyoKLSAqIEFkZCAyIGphdmEgcHJvamVjdHMgaW4gYW4gSVdvcmtzcGFjZVJ1bm5hYmxlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0QWRkVHdvSmF2YVByb2plY3RzV2l0aEV4dHJhU2V0Q2xhc3NwYXRoKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuc3RhcnREZWx0YXMoKTsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bigKLQkJCW5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQlJSmF2YVByb2plY3QgcDEgPSBjcmVhdGVKYXZhUHJvamVjdCgiUDEiLCBuZXcgU3RyaW5nW10geyIifSwgIiIpOwotCQkJCQkvLyBzaG91bGQgYmUgYSBuby1vcCBhbmQgbm8gZXh0cmEgZGVsdGEgdm9sbGV5IHNob3VsZCBiZSBmaXJlZAotCQkJCQlwMS5zZXRSYXdDbGFzc3BhdGgocDEuZ2V0UmF3Q2xhc3NwYXRoKCksIHAxLmdldE91dHB1dExvY2F0aW9uKCksIG51bGwpOwotCQkJCQljcmVhdGVKYXZhUHJvamVjdCgiUDIiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQkJCX0KLQkJCX0sCi0JCQludWxsKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEiLCAKLQkJCSJQMVsrXToge31cbiIgKwotCQkJIlAyWytdOiB7fSIsIAotCQkJdGhpcy5nZXRTb3J0ZWRCeVByb2plY3REZWx0YXMoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDEiKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMiIpOwotCX0KLX0KLS8qCi0gKiBCYXRjaCBvcGVyYXRpb24gdGVzdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdEJhdGNoT3BlcmF0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZvbGRlcigiUC9zcmMveCIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiUC9zcmMveC9BLmphdmEiLAotCQkJInBhY2thZ2UgeDtcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkJIn0iKTsKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQlKYXZhQ29yZS5ydW4oCi0JCQluZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJSUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJQL3NyYy94L0EuamF2YSIpOwotCQkJCQl1bml0LmNyZWF0ZVR5cGUoImNsYXNzIEIge30iLCBudWxsLCBmYWxzZSwgbW9uaXRvcik7Ci0JCQkJCXVuaXQuZ2V0VHlwZSgiQSIpLmNyZWF0ZUZpZWxkKCJpbnQgaTsiLCBudWxsLCBmYWxzZSwgbW9uaXRvcik7Ci0JCQkJfQotCQkJfSwKLQkJCW51bGwpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSIsIAotCQkJIlBbKl06IHtDSElMRFJFTn1cbiIgKwotCQkJIglzcmNbKl06IHtDSElMRFJFTn1cbiIgKwotCQkJIgkJeFsqXToge0NISUxEUkVOfVxuIiArCi0JCQkiCQkJQS5qYXZhWypdOiB7Q0hJTERSRU4gfCBGSU5FIEdSQUlORUR9XG4iICsKLQkJCSIJCQkJQlsrXToge31cbiIgKwotCQkJIgkJCQlBWypdOiB7Q0hJTERSRU4gfCBGSU5FIEdSQUlORUR9XG4iICsKLQkJCSIJCQkJCWlbK106IHt9IgotCQkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0vKgotICogRW5zdXJlcyB0aGF0IGlmIGEgcHJvamVjdCdzIG91dHB1dCBmb2xkZXIgaXMgdXNlZCBhcyBhIGxpYiBmb2xkZXIgaW4gYW5vdGhlciBwcm9qZWN0LCBidWlsZGluZwotICogdGhlIGZpcnN0IHByb2plY3QgcmVzdWx0cyBpbiB0aGUgY29ycmVjdCBkZWx0YSBpbiB0aGUgb3RoZXIgcHJvamVjdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdEJ1aWxkUHJvamVjdFVzZWRBc0xpYigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcDEgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMSIsIG5ldyBTdHJpbmdbXSB7InNyYzEifSwgbmV3IFN0cmluZ1tdIHsiSkNMX0xJQiJ9LCAiYmluMSIpOwotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMiIsIG5ldyBTdHJpbmdbXSB7InNyYzIifSwgbmV3IFN0cmluZ1tdIHsiL1AxL2JpbjEifSwgImJpbjIiKTsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QMS9zcmMxL1guamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkifSIKLQkJKTsKLQkJCi0JCS8vIGZvcmNlIG9wZW5pbmcgb2YgcHJvamVjdCB0byBhdm9pZCBleHRlcm5hbCBqYXIgZGVsdGEKLQkJcDEub3BlbihudWxsKTsKLQkJCi0JCXRoaXMuc3RhcnREZWx0YXMoKTsKLQkJCi0JCS8vIGZ1bGwgYnVpbGQKLQkJcDEuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuRlVMTF9CVUlMRCwgbnVsbCk7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhICgxKSIsCi0JCQkiUDJbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJCSIJL1AxL2JpbjFbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJCSIJCVtkZWZhdWx0XVsqXToge0NISUxEUkVOfVxuIiArIAotCQkJIgkJCVguY2xhc3NbK106IHt9IgotCQkJKTsKLQkJCQotCQl0aGlzLmVkaXRGaWxlKAotCQkJIi9QMS9zcmMxL1guamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkiICB2b2lkIGZvbygpIHt9XG4iICsKLQkJCSJ9XG4iICsKLQkJCSJjbGFzcyBZIHtcbiIgKwotCQkJIn0iCi0JCSk7Ci0JCXRoaXMuY2xlYXJEZWx0YXMoKTsKLQotCQkvLyBpbmNyZW1lbnRhbCBidWlkCi0JCXAxLmdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLklOQ1JFTUVOVEFMX0JVSUxELCBudWxsKTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEgKDIpIiwKLQkJCSJQMlsqXToge0NISUxEUkVOfVxuIiArIAotCQkJIgkvUDEvYmluMVsqXToge0NISUxEUkVOfVxuIiArIAotCQkJIgkJW2RlZmF1bHRdWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCQkJWC5jbGFzc1sqXToge0NPTlRFTlR9XG4iICsgCi0JCQkiCQkJWS5jbGFzc1srXToge30iCi0JCQkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAxIik7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0KLS8qKgotICogRW5zdXJlcyB0aGF0IGNoYW5naW5nIHRoZSBjdXN0b20gb3V0cHV0IGZvbGRlciBvZiBhIHNvdXJjZSBlbnRyeQotICogdHJpZ2dlcnMgYSBGX1JFTU9WRURfRlJPTV9DTEFTU1BBVEggYW5kIEZfQURERURfVE9fQ0xBU1NQQVRIIGRlbHRhLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlQ3VzdG9tT3V0cHV0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIiwgbmV3IFN0cmluZ1tdIHsiYmluMSJ9KTsKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQl0aGlzLnNldENsYXNzcGF0aCgKLQkJCXByb2osIAotCQkJbmV3IElDbGFzc3BhdGhFbnRyeVtdIHsKLQkJCQlKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShuZXcgUGF0aCgiL1Avc3JjIiksIG5ldyBJUGF0aFswXSwgbmV3IFBhdGgoIi9QL2JpbjIiKSkKLQkJCX0pOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSIsIAotCQkJIlBbKl06IHtDSElMRFJFTn1cbiIgKwotCQkJIglzcmNbKl06IHtBRERFRCBUTyBDTEFTU1BBVEggfCBSRU1PVkVEIEZST00gQ0xBU1NQQVRIfVxuIiArCi0JCQkiCVJlc291cmNlRGVsdGEoL1AvLmNsYXNzcGF0aClbKl0iCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IHRoZSBzZXR0aW5nIHRoZSBjbGFzc3BhdGggd2l0aCBhIGxpYnJhcnkgZW50cnkKLSAqIHRyaWdnZXJzIGEgRl9SRU1PVkVEX0ZST01fQ0xBU1NQQVRIIGFuZCBGX0FEREVEX1RPX0NMQVNTUEFUSCBkZWx0YS4KLSAqLwotcHVibGljIHZvaWQgdGVzdENoYW5nZVJvb3RLaW5kKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCXRoaXMuc3RhcnREZWx0YXMoKTsKLQkJdGhpcy5zZXRDbGFzc3BhdGgoCi0JCQlwcm9qLCAKLQkJCW5ldyBJQ2xhc3NwYXRoRW50cnlbXSB7Ci0JCQkJSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KG5ldyBQYXRoKCIvUC9zcmMiKSwgbnVsbCwgbnVsbCwgZmFsc2UpCi0JCQl9KTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEiLCAKLQkJCSJQWypdOiB7Q0hJTERSRU59XG4iICsKLQkJCSIJc3JjWypdOiB7QURERUQgVE8gQ0xBU1NQQVRIIHwgUkVNT1ZFRCBGUk9NIENMQVNTUEFUSH1cbiIgKwotCQkJIglSZXNvdXJjZURlbHRhKC9QLy5jbGFzc3BhdGgpWypdIgotCQkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0KLS8qCi0gKiBDbG9zZSBhIGphdmEgcHJvamVjdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdENsb3NlSmF2YVByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7IiJ9LCAiIik7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSB0aGlzLmdldFByb2plY3QoIlAiKTsKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQlwcm9qZWN0LmNsb3NlKG51bGwpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSIsIAotCQkJIlBbLV06IHt9XG4iICsgCi0JCQkiUmVzb3VyY2VEZWx0YSgvUCkiCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLQotLyoKLSAqIENsb3NlIGEgbm9uLWphdmEgcHJvamVjdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdENsb3NlTm9uSmF2YVByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVQcm9qZWN0KCJQIik7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSB0aGlzLmdldFByb2plY3QoIlAiKTsKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQlwcm9qZWN0LmNsb3NlKG51bGwpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSIsIAotCQkJIlJlc291cmNlRGVsdGEoL1ApIgotCQkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0KLS8qCi0gKiBDbG9zaW5nIGEgbm9uLWphdmEgcHJvamVjdCB0aGF0IGNvbnRhaW5zIGEgamFyIHJlZmVyZW5jZWQgaW4gYW5vdGhlciBwcm9qZWN0IHNob3VsZCBwcm9kdWNlCi0gKiBhIGRlbHRhIG9uIHRoaXMgb3RoZXIgcHJvamVjdC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAxOTA1OCBDbG9zaW5nIG5vbi1qYXZhIHByb2plY3QgZG9lc24ndCByZW1vdmUgcm9vdCBmcm9tIGphdmEgcHJvamVjdCkKLSAqLwotcHVibGljIHZvaWQgdGVzdENsb3NlTm9uSmF2YVByb2plY3RVcGRhdGVEZXBlbmRlbnQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVQcm9qZWN0KCJTUCIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoIi9TUC94LmphciIsICIiKTsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiSlAiLCBuZXcgU3RyaW5nW10geyIifSwgbmV3IFN0cmluZ1tdIHsiL1NQL3guamFyIn0sICIiKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IHRoaXMuZ2V0UHJvamVjdCgiU1AiKTsKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQlwcm9qZWN0LmNsb3NlKG51bGwpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSIsIAotCQkJIkpQWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCS9TUC94LmphclstXToge31cbiIgKyAKLQkJCSJSZXNvdXJjZURlbHRhKC9TUCkiCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiU1AiKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJKUCIpOwotCX0KLX0KLS8qKgotICogVGVzdCB0aGF0IGRlbHRhcyBhcmUgZ2VuZXJhdGVkIHdoZW4gYSBjb21waWxhdGlvbiB1bml0IGlzIGFkZGVkCi0gKiBhbmQgcmVtb3ZlZCBmcm9tIGEgcGFja2FnZSB2aWEgY29yZSBBUEkuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb21waWxhdGlvblVuaXRSZW1vdmVBbmRBZGQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJY3JlYXRlSmF2YVByb2plY3QoIlAiKTsKLQkJY3JlYXRlRm9sZGVyKCIvUC9wIik7Ci0JCUlGaWxlIGZpbGUgPSBjcmVhdGVGaWxlKAotCQkJIi9QL3AvWC5qYXZhIiwKLQkJCSJwYWNrYWdlIHA7XG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSJ9IgotCQkpOwotCQkKLQkJLy8gZGVsZXRlIGN1Ci0JCXN0YXJ0RGVsdGFzKCk7Ci0JCWRlbGV0ZVJlc291cmNlKGZpbGUpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSBhZnRlciBkZWxldGluZyAvUC9wL1guamF2YSIsCi0JCQkiUFsqXToge0NISUxEUkVOfVxuIiArIAotCQkJIglbcHJvamVjdCByb290XVsqXToge0NISUxEUkVOfVxuIiArIAotCQkJIgkJcFsqXToge0NISUxEUkVOfVxuIiArIAotCQkJIgkJCVguamF2YVstXToge30iCi0JCSk7Ci0JCQotCQkvLyBhZGQgY3UKLQkJY2xlYXJEZWx0YXMoKTsKLQkJY3JlYXRlRmlsZSgKLQkJCSIvUC9wL1guamF2YSIsCi0JCQkicGFja2FnZSBwO1xuIiArCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkifSIKLQkJKTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEgYWZ0ZXIgYWRkaW5nIC9QL3AvWC5qYXZhIiwKLQkJCSJQWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCVtwcm9qZWN0IHJvb3RdWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCQlwWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCQkJWC5qYXZhWytdOiB7fSIKLQkJKTsKLQl9IGZpbmFsbHkgewotCQlzdG9wRGVsdGFzKCk7Ci0JCWRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVTaGFyZWRXb3JraW5nQ29weSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlJV29ya2luZ0NvcHkgY29weSA9IG51bGw7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7IiJ9LCAiIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgiUC9YLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIn0iKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gdGhpcy5nZXRDb21waWxhdGlvblVuaXQoIlAiLCAiIiwgIiIsICJYLmphdmEiKTsKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQljb3B5ID0gKElXb3JraW5nQ29weSl1bml0LmdldFNoYXJlZFdvcmtpbmdDb3B5KG51bGwsIG51bGwsIG51bGwpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSIsIAotCQkJIlBbKl06IHtDSElMRFJFTn1cbiIgKwotCQkJIglbcHJvamVjdCByb290XVsqXToge0NISUxEUkVOfVxuIiArCi0JCQkiCQlbZGVmYXVsdF1bKl06IHtDSElMRFJFTn1cbiIgKwotCQkJIgkJCVtXb3JraW5nIGNvcHldIFguamF2YVsrXToge30iCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCWlmIChjb3B5ICE9IG51bGwpIGNvcHkuZGVzdHJveSgpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlV29ya2luZ0NvcHkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSVdvcmtpbmdDb3B5IGNvcHkgPSBudWxsOwotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyIifSwgIiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoIlAvWC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSJ9Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgdW5pdCA9IHRoaXMuZ2V0Q29tcGlsYXRpb25Vbml0KCJQIiwgIiIsICIiLCAiWC5qYXZhIik7Ci0JCXRoaXMuc3RhcnREZWx0YXMoKTsKLQkJY29weSA9IChJV29ya2luZ0NvcHkpdW5pdC5nZXRXb3JraW5nQ29weSgpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSIsIAotCQkJIlBbKl06IHtDSElMRFJFTn1cbiIgKwotCQkJIglbcHJvamVjdCByb290XVsqXToge0NISUxEUkVOfVxuIiArCi0JCQkiCQlbZGVmYXVsdF1bKl06IHtDSElMRFJFTn1cbiIgKwotCQkJIgkJCVtXb3JraW5nIGNvcHldIFguamF2YVsrXToge30iCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCWlmIChjb3B5ICE9IG51bGwpIGNvcHkuZGVzdHJveSgpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0vKioKLSAqIFRlc3QgdGhhdCBkZWx0YXMgYXJlIGdlbmVyYXRlZCB3aGVuIGEgY29tcGlsYXRpb24gdW5pdCBub3Qgb24gdGhlIGNsYXNzcGF0aCBpcyBhZGRlZAotICogYW5kIHJlbW92ZWQgZnJvbSBhIHBhY2thZ2UgdmlhIGNvcmUgQVBJLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q1VOb3RPbkNsYXNzcGF0aCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQljcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7fSwgImJpbiIpOwotCQljcmVhdGVGb2xkZXIoIi9QL3NyYy9wIik7Ci0JCUlGaWxlIGZpbGUgPSBjcmVhdGVGaWxlKAotCQkJIi9QL3NyYy9wL1guamF2YSIsCi0JCQkicGFja2FnZSBwO1xuIiArCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkifSIKLQkJKTsKLQkJCi0JCXN0YXJ0RGVsdGFzKCk7Ci0JCWRlbGV0ZVJlc291cmNlKGZpbGUpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSBhZnRlciBkZWxldGlvbiBvZiAvUC9zcmMvcC9YLmphdmEiLAotCQkJIlBbKl06IHtDT05URU5UfVxuIiArIAotCQkJIglSZXNvdXJjZURlbHRhKC9QL3NyYylbKl0iCi0JCSk7Ci0JCQotCQljbGVhckRlbHRhcygpOwotCQljcmVhdGVGaWxlKAotCQkJIi9QL3NyYy9wL1guamF2YSIsCi0JCQkicGFja2FnZSBwO1xuIiArCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkifSIKLQkJKTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEgYWZ0ZXIgYWRkaXRpb24gb2YgL1Avc3JjL3AvWC5qYXZhIiwKLQkJCSJQWypdOiB7Q09OVEVOVH1cbiIgKyAKLQkJCSIJUmVzb3VyY2VEZWx0YSgvUC9zcmMpWypdIgotCQkpOwotCX0gZmluYWxseSB7Ci0JCXN0b3BEZWx0YXMoKTsKLQkJZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qCi0gKiBFbnN1cmUgdGhhdCBkZWxldGluZyBhIGphciB0aGF0IGlzIGluIGEgZm9sZGVyIGFuZCB0aGF0IGlzIG9uIHRoZSBjbGFzc3BhdGggcmVwb3J0cwotICogYSByZW1vdmVkICBwa2cgZnJhZ21lbnQgcm9vdCBkZWx0YS4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAyNzA2OCBFbGVtZW50cyBpbiB0aGUgUGFja2FnZSBFeHBsb3JlciBhcmUgZGlzcGxheWVkIGJ1dCBkb24ndCBtb3JlIGV4aXN0IFtwYWNrYWdlIGV4cGxvcmVyXSkKLSAqIAotICovCi1wdWJsaWMgdm9pZCB0ZXN0RGVsZXRlSW5uZXJKYXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCBuZXcgU3RyaW5nW10geyIvUC9saWIveC5qYXIifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZvbGRlcigiL1AvbGliIik7Ci0JCUlGaWxlIGZpbGUgPSB0aGlzLmNyZWF0ZUZpbGUoIi9QL2xpYi94LmphciIsICIiKTsKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQlkZWxldGVSZXNvdXJjZShmaWxlKTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGFzIiwKLQkJCSJQWypdOiB7Q0hJTERSRU4gfCBDT05URU5UfVxuIiArIAotCQkJIglsaWIveC5qYXJbLV06IHt9XG4iICsgCi0JCQkiCVJlc291cmNlRGVsdGEoL1AvbGliKVsqXSIKLQkJKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLnN0b3BEZWx0YXMoKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoKLSAqIEVuc3VyZSB0aGF0IGRlbGV0aW5nIGEgbm9uLUphdmEgZm9sZGVyIHRoYXQgY29udGFpbnMgYSBzb3VyY2Ugcm9vdCBmb2xkZXIgcmVwb3J0cwotICogYSByZW1vdmVkIHJvb3QgZGVsdGEgYXMgd2VsbCBhcyBhIHJlc291cmNlIGRlbHRhIGZvciB0aGUgcmVtb3ZlZCBmb2xkZXIuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMjQwNDUgRXJyb3IgZGVsZXRpbmcgcGFyZW50IGZvbGRlciBvZiBzb3VyY2UgZm9sZGVyKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0RGVsZXRlTm9uSmF2YUZvbGRlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsiZm9vL2JhciJ9LCAiYmluIik7Ci0JCUlGb2xkZXIgZm9sZGVyID0gdGhpcy5nZXRGb2xkZXIoIi9QL2ZvbyIpOwotCQl0aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCWRlbGV0ZVJlc291cmNlKGZvbGRlcik7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhcyIsCi0JCQkiUFsqXToge0NISUxEUkVOIHwgQ09OVEVOVH1cbiIgKyAKLQkJCSIJZm9vL2JhclstXToge31cbiIgKyAKLQkJCSIJUmVzb3VyY2VEZWx0YSgvUC9mb28pWy1dIgotCQkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0vKgotICogRW5zdXJlIHRoYXQgZGVsZXRpbmcgYSBwcm9qZWN0IGFuZCBzZXR0aW5nIHRoZSBjbGFzc3BhdGggb24gYW5vdGhlciBwcm9qZWN0Ci0gKiBpbiBhbiBJV29ya3NwYWNlUnVubmFibGUgZG9lc24ndCB0aHJvdyBhIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMjUxOTcgTlBFIGltcG9ydGluZyBleHRlcm5hbCBwbHVnaW5zKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0RGVsZXRlUHJvamVjdFNldENQQW5vdGhlclByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JZmluYWwgSUphdmFQcm9qZWN0IHByb2plY3QgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMSIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDIiLCBuZXcgU3RyaW5nW10ge30sICIiKTsKLQotCXRyeSB7Ci0JCXRoaXMuc3RhcnREZWx0YXMoKTsKLQkJSmF2YUNvcmUucnVuKAotCQkJbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCWRlbGV0ZVByb2plY3QoIlAyIik7Ci0JCQkJCXByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKAotCQkJCQkJbmV3IElDbGFzc3BhdGhFbnRyeVtdIHsKLQkJCQkJCQlKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShwcm9qZWN0LmdldFBhdGgoKSkKLQkJCQkJCX0sCi0JCQkJCQludWxsKTsKLQkJCQl9Ci0JCQl9LAotCQkJbnVsbCk7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhcyIsCi0JCQkiUDFbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJCSIJc3JjWypdOiB7UkVNT1ZFRCBGUk9NIENMQVNTUEFUSH1cbiIgKyAKLQkJCSIJW3Byb2plY3Qgcm9vdF1bKl06IHtBRERFRCBUTyBDTEFTU1BBVEh9XG4iICsgCi0JCQkiCVJlc291cmNlRGVsdGEoL1AxLy5jbGFzc3BhdGgpWypdXG4iICsgCi0JCQkiUDJbLV06IHt9IgotCQkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAxIik7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0RGVzdHJveVNoYXJlZFdvcmtpbmdDb3B5KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUlXb3JraW5nQ29weSBjb3B5ID0gbnVsbDsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsiIn0sICIiKTsKLQkJdGhpcy5jcmVhdGVGaWxlKCJQL1guamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkifSIpOwotCQlJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSB0aGlzLmdldENvbXBpbGF0aW9uVW5pdCgiUCIsICIiLCAiIiwgIlguamF2YSIpOwotCQljb3B5ID0gKElXb3JraW5nQ29weSl1bml0LmdldFNoYXJlZFdvcmtpbmdDb3B5KG51bGwsIG51bGwsIG51bGwpOwotCQl0aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCWNvcHkuZGVzdHJveSgpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSIsIAotCQkJIlBbKl06IHtDSElMRFJFTn1cbiIgKwotCQkJIglbcHJvamVjdCByb290XVsqXToge0NISUxEUkVOfVxuIiArCi0JCQkiCQlbZGVmYXVsdF1bKl06IHtDSElMRFJFTn1cbiIgKwotCQkJIgkJCVtXb3JraW5nIGNvcHldIFguamF2YVstXToge30iCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLXB1YmxpYyB2b2lkIHRlc3REZXN0cm95V29ya2luZ0NvcHkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSVdvcmtpbmdDb3B5IGNvcHkgPSBudWxsOwotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyIifSwgIiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoIlAvWC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSJ9Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgdW5pdCA9IHRoaXMuZ2V0Q29tcGlsYXRpb25Vbml0KCJQIiwgIiIsICIiLCAiWC5qYXZhIik7Ci0JCWNvcHkgPSAoSVdvcmtpbmdDb3B5KXVuaXQuZ2V0V29ya2luZ0NvcHkoKTsKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQljb3B5LmRlc3Ryb3koKTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEiLCAKLQkJCSJQWypdOiB7Q0hJTERSRU59XG4iICsKLQkJCSIJW3Byb2plY3Qgcm9vdF1bKl06IHtDSElMRFJFTn1cbiIgKwotCQkJIgkJW2RlZmF1bHRdWypdOiB7Q0hJTERSRU59XG4iICsKLQkJCSIJCQlbV29ya2luZyBjb3B5XSBYLmphdmFbLV06IHt9IgotCQkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0vKgotICogRW5zdXJlcyB0aGF0IGEgZGVsdGEgbGlzdGVuZXIgdGhhdCBhc2tzIGZvciBQUkVfQVVUT19CVUlMRCBldmVudHMgZ2V0cyB0aG9zZSBldmVudHMgCi0gKiBhbmQgbm8gb3RoZXJzLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TGlzdGVuZXJBdXRvQnVpbGQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JRGVsdGFMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBEZWx0YUxpc3RlbmVyKEVsZW1lbnRDaGFuZ2VkRXZlbnQuUFJFX0FVVE9fQlVJTEQpOwotCUlDb21waWxhdGlvblVuaXQgd2MgPSBudWxsOwotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyIifSwgIiIpOwotCQlKYXZhQ29yZS5hZGRFbGVtZW50Q2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyLCBFbGVtZW50Q2hhbmdlZEV2ZW50LlBSRV9BVVRPX0JVSUxEKTsKLQkJCi0JCS8vIGN1IGNyZWF0aW9uCi0JCUlQYWNrYWdlRnJhZ21lbnQgcGtnID0gdGhpcy5nZXRQYWNrYWdlKCJQIik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBwa2cuY3JlYXRlQ29tcGlsYXRpb25Vbml0KAotCQkJIlguamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkifSIsCi0JCQlmYWxzZSwKLQkJCW51bGwpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSBhZnRlciBjcmVhdGluZyBDVSIsIAotCQkJIlBbKl06IHtDSElMRFJFTn1cbiIgKwotCQkJIglbcHJvamVjdCByb290XVsqXToge0NISUxEUkVOfVxuIiArCi0JCQkiCQlbZGVmYXVsdF1bKl06IHtDSElMRFJFTn1cbiIgKwotCQkJIgkJCVguamF2YVsrXToge30iLCAKLQkJCWxpc3RlbmVyLnRvU3RyaW5nKCkpOwotCQlsaXN0ZW5lci5mbHVzaCgpOwotCQkKLQkJLy8gdHlwZSBjcmVhdGlvbgotCQljdS5jcmVhdGVUeXBlKAotCQkJImNsYXNzIEEge1xuIiArCi0JCQkifSIsCi0JCQljdS5nZXRUeXBlKCJYIiksCi0JCQlmYWxzZSwKLQkJCW51bGwpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSBhZnRlciBjcmVhdGluZyB0eXBlIiwgCi0JCQkiUFsqXToge0NISUxEUkVOfVxuIiArCi0JCQkiCVtwcm9qZWN0IHJvb3RdWypdOiB7Q0hJTERSRU59XG4iICsKLQkJCSIJCVtkZWZhdWx0XVsqXToge0NISUxEUkVOfVxuIiArCi0JCQkiCQkJWC5qYXZhWypdOiB7Q0hJTERSRU4gfCBGSU5FIEdSQUlORUR9XG4iICsKLQkJCSIJCQkJQVsrXToge30iLCAKLQkJCWxpc3RlbmVyLnRvU3RyaW5nKCkpOwotCQlsaXN0ZW5lci5mbHVzaCgpOwotCQkKLQkJLy8gbm9uLWphdmEgcmVzb3VyY2UgY3JlYXRpb24KLQkJdGhpcy5jcmVhdGVGaWxlKCJQL3JlYWRtZS50eHQiLCAiIik7Ci0JCWFzc2VydEVxdWFscygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIGFmdGVyIGNyZWF0aW5nIG5vbi1qYXZhIHJlc291cmNlIiwKLQkJCSIiLAotCQkJbGlzdGVuZXIudG9TdHJpbmcoKSk7Ci0JCWxpc3RlbmVyLmZsdXNoKCk7Ci0JCQotCQkvLyBzaGFyZWQgd29ya2luZyBjb3B5IGNyZWF0aW9uCi0JCXdjID0gKElDb21waWxhdGlvblVuaXQpY3UuZ2V0U2hhcmVkV29ya2luZ0NvcHkobnVsbCwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIGFmdGVyIGNyZWF0aW5nIHNoYXJlZCB3b3JraW5nIGNvcHkiLAotCQkJIlBbKl06IHtDSElMRFJFTn1cbiIgKwotCQkJIglbcHJvamVjdCByb290XVsqXToge0NISUxEUkVOfVxuIiArCi0JCQkiCQlbZGVmYXVsdF1bKl06IHtDSElMRFJFTn1cbiIgKwotCQkJIgkJCVtXb3JraW5nIGNvcHldIFguamF2YVsrXToge30iLAotCQkJbGlzdGVuZXIudG9TdHJpbmcoKSk7Ci0JCWxpc3RlbmVyLmZsdXNoKCk7Ci0JCQkKLQkJLy8gcmVjb25jaWxlCi0JCXdjLmdldEJ1ZmZlcigpLnNldENvbnRlbnRzKAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIiAgcHVibGljIHZvaWQgZm9vKCkge1xuIiArCi0JCQkiICB9XG4iICsKLQkJCSJ9Iik7Ci0JCXdjLnJlY29uY2lsZSgpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSBhZnRlciByZWNvbmNpbGluZyB3b3JraW5nIGNvcHkiLAotCQkJIiIsCi0JCQlsaXN0ZW5lci50b1N0cmluZygpKTsKLQkJbGlzdGVuZXIuZmx1c2goKTsKLQkJCi0JCS8vIGNvbW1pdAotCQl3Yy5jb21taXQoZmFsc2UsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSBhZnRlciBjb21taXR0aW5nIHdvcmtpbmcgY29weSIsCi0JCQkiWFsqXToge0NISUxEUkVOIHwgRklORSBHUkFJTkVEfVxuIiArCi0JCQkiCWZvb1srXToge31cbiIgKwotCQkJIkFbLV06IHt9IiwKLQkJCWxpc3RlbmVyLnRvU3RyaW5nKCkpOwotCQlsaXN0ZW5lci5mbHVzaCgpOwotCQkKLQkJLy8gc2hhcmVkIHdvcmtpbmcgY29weSBkZXN0cnVjdGlvbgotCQl3Yy5kZXN0cm95KCk7Ci0JCWFzc2VydEVxdWFscygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIGFmdGVyIGRlc3Ryb3lpbmcgc2hhcmVkIHdvcmtpbmcgY29weSIsCi0JCQkiUFsqXToge0NISUxEUkVOfVxuIiArCi0JCQkiCVtwcm9qZWN0IHJvb3RdWypdOiB7Q0hJTERSRU59XG4iICsKLQkJCSIJCVtkZWZhdWx0XVsqXToge0NISUxEUkVOfVxuIiArCi0JCQkiCQkJW1dvcmtpbmcgY29weV0gWC5qYXZhWy1dOiB7fSIsCi0JCQlsaXN0ZW5lci50b1N0cmluZygpKTsKLQkJbGlzdGVuZXIuZmx1c2goKTsKLQkJd2MgPSBudWxsOwotCQkKLQkJCQotCX0gZmluYWxseSB7Ci0JCWlmICh3YyAhPSBudWxsKSB3Yy5kZXN0cm95KCk7Ci0JCUphdmFDb3JlLnJlbW92ZUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0vKgotICogRW5zdXJlcyB0aGF0IGEgZGVsdGEgbGlzdGVuZXIgdGhhdCBhc2tzIGZvciBQT1NUX0NIQU5HRSBldmVudHMgZ2V0cyB0aG9zZSBldmVudHMgCi0gKiBhbmQgbm8gb3RoZXJzLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TGlzdGVuZXJQb3N0Q2hhbmdlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCURlbHRhTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRGVsdGFMaXN0ZW5lcihFbGVtZW50Q2hhbmdlZEV2ZW50LlBPU1RfQ0hBTkdFKTsKLQlJQ29tcGlsYXRpb25Vbml0IHdjID0gbnVsbDsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsiIn0sICIiKTsKLQkJSmF2YUNvcmUuYWRkRWxlbWVudENoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lciwgRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX0NIQU5HRSk7Ci0JCQotCQkvLyBjdSBjcmVhdGlvbgotCQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IHRoaXMuZ2V0UGFja2FnZSgiUCIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gcGtnLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgKLQkJCSJYLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIn0iLAotCQkJZmFsc2UsCi0JCQludWxsKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEgYWZ0ZXIgY3JlYXRpbmcgQ1UiLCAKLQkJCSJQWypdOiB7Q0hJTERSRU59XG4iICsKLQkJCSIJW3Byb2plY3Qgcm9vdF1bKl06IHtDSElMRFJFTn1cbiIgKwotCQkJIgkJW2RlZmF1bHRdWypdOiB7Q0hJTERSRU59XG4iICsKLQkJCSIJCQlYLmphdmFbK106IHt9IiwgCi0JCQlsaXN0ZW5lci50b1N0cmluZygpKTsKLQkJbGlzdGVuZXIuZmx1c2goKTsKLQkJCi0JCS8vIHR5cGUgY3JlYXRpb24KLQkJY3UuY3JlYXRlVHlwZSgKLQkJCSJjbGFzcyBBIHtcbiIgKwotCQkJIn0iLAotCQkJY3UuZ2V0VHlwZSgiWCIpLAotCQkJZmFsc2UsCi0JCQludWxsKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEgYWZ0ZXIgY3JlYXRpbmcgdHlwZSIsIAotCQkJIlBbKl06IHtDSElMRFJFTn1cbiIgKwotCQkJIglbcHJvamVjdCByb290XVsqXToge0NISUxEUkVOfVxuIiArCi0JCQkiCQlbZGVmYXVsdF1bKl06IHtDSElMRFJFTn1cbiIgKwotCQkJIgkJCVguamF2YVsqXToge0NISUxEUkVOIHwgRklORSBHUkFJTkVEfVxuIiArCi0JCQkiCQkJCUFbK106IHt9IiwgCi0JCQlsaXN0ZW5lci50b1N0cmluZygpKTsKLQkJbGlzdGVuZXIuZmx1c2goKTsKLQkJCi0JCS8vIG5vbi1qYXZhIHJlc291cmNlIGNyZWF0aW9uCi0JCXRoaXMuY3JlYXRlRmlsZSgiUC9yZWFkbWUudHh0IiwgIiIpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSBhZnRlciBjcmVhdGluZyBub24tamF2YSByZXNvdXJjZSIsCi0JCQkiUFsqXToge0NPTlRFTlR9XG4iICsKLQkJCSIJUmVzb3VyY2VEZWx0YSgvUC9yZWFkbWUudHh0KVsrXSIsCi0JCQlsaXN0ZW5lci50b1N0cmluZygpKTsKLQkJbGlzdGVuZXIuZmx1c2goKTsKLQkJCi0JCS8vIHNoYXJlZCB3b3JraW5nIGNvcHkgY3JlYXRpb24KLQkJd2MgPSAoSUNvbXBpbGF0aW9uVW5pdCljdS5nZXRTaGFyZWRXb3JraW5nQ29weShudWxsLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEgYWZ0ZXIgY3JlYXRpbmcgc2hhcmVkIHdvcmtpbmcgY29weSIsCi0JCQkiUFsqXToge0NISUxEUkVOfVxuIiArCi0JCQkiCVtwcm9qZWN0IHJvb3RdWypdOiB7Q0hJTERSRU59XG4iICsKLQkJCSIJCVtkZWZhdWx0XVsqXToge0NISUxEUkVOfVxuIiArCi0JCQkiCQkJW1dvcmtpbmcgY29weV0gWC5qYXZhWytdOiB7fSIsCi0JCQlsaXN0ZW5lci50b1N0cmluZygpKTsKLQkJbGlzdGVuZXIuZmx1c2goKTsKLQkJCQotCQkvLyByZWNvbmNpbGUKLQkJd2MuZ2V0QnVmZmVyKCkuc2V0Q29udGVudHMoCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkiICBwdWJsaWMgdm9pZCBmb28oKSB7XG4iICsKLQkJCSIgIH1cbiIgKwotCQkJIn0iKTsKLQkJd2MucmVjb25jaWxlKCk7Ci0JCWFzc2VydEVxdWFscygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIGFmdGVyIHJlY29uY2lsaW5nIHdvcmtpbmcgY29weSIsCi0JCQkiIiwKLQkJCWxpc3RlbmVyLnRvU3RyaW5nKCkpOwotCQlsaXN0ZW5lci5mbHVzaCgpOwotCQkKLQkJLy8gY29tbWl0Ci0JCXdjLmNvbW1pdChmYWxzZSwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIGFmdGVyIGNvbW1pdHRpbmcgd29ya2luZyBjb3B5IiwKLQkJCSJQWypdOiB7Q0hJTERSRU59XG4iICsKLQkJCSIJW3Byb2plY3Qgcm9vdF1bKl06IHtDSElMRFJFTn1cbiIgKwotCQkJIgkJW2RlZmF1bHRdWypdOiB7Q0hJTERSRU59XG4iICsKLQkJCSIJCQlYLmphdmFbKl06IHtDSElMRFJFTiB8IEZJTkUgR1JBSU5FRH1cbiIgKwotCQkJIgkJCQlYWypdOiB7Q0hJTERSRU4gfCBGSU5FIEdSQUlORUR9XG4iICsKLQkJCSIJCQkJCWZvb1srXToge31cbiIgKwotCQkJIgkJCQlBWy1dOiB7fSIsCi0JCQlsaXN0ZW5lci50b1N0cmluZygpKTsKLQkJbGlzdGVuZXIuZmx1c2goKTsKLQkJCi0JCS8vIHNoYXJlZCB3b3JraW5nIGNvcHkgZGVzdHJ1Y3Rpb24KLQkJd2MuZGVzdHJveSgpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSBhZnRlciBkZXN0cm95aW5nIHNoYXJlZCB3b3JraW5nIGNvcHkiLAotCQkJIlBbKl06IHtDSElMRFJFTn1cbiIgKwotCQkJIglbcHJvamVjdCByb290XVsqXToge0NISUxEUkVOfVxuIiArCi0JCQkiCQlbZGVmYXVsdF1bKl06IHtDSElMRFJFTn1cbiIgKwotCQkJIgkJCVtXb3JraW5nIGNvcHldIFguamF2YVstXToge30iLAotCQkJbGlzdGVuZXIudG9TdHJpbmcoKSk7Ci0JCWxpc3RlbmVyLmZsdXNoKCk7Ci0JCXdjID0gbnVsbDsKLQkJCi0JCQkKLQl9IGZpbmFsbHkgewotCQlpZiAod2MgIT0gbnVsbCkgd2MuZGVzdHJveSgpOwotCQlKYXZhQ29yZS5yZW1vdmVFbGVtZW50Q2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoKLSAqIEVuc3VyZXMgdGhhdCBhIGRlbHRhIGxpc3RlbmVyIHRoYXQgYXNrcyBmb3IgUE9TVF9SRUNPTkNJTEUgZXZlbnRzIGdldHMgdGhvc2UgZXZlbnRzIAotICogYW5kIG5vIG90aGVycy4KLSAqLwotcHVibGljIHZvaWQgdGVzdExpc3RlbmVyUmVjb25jaWxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCURlbHRhTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRGVsdGFMaXN0ZW5lcihFbGVtZW50Q2hhbmdlZEV2ZW50LlBPU1RfUkVDT05DSUxFKTsKLQlJQ29tcGlsYXRpb25Vbml0IHdjID0gbnVsbDsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsiIn0sICIiKTsKLQkJSmF2YUNvcmUuYWRkRWxlbWVudENoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lciwgRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX1JFQ09OQ0lMRSk7Ci0JCQotCQkvLyBjdSBjcmVhdGlvbgotCQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IHRoaXMuZ2V0UGFja2FnZSgiUCIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gcGtnLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgKLQkJCSJYLmphdmEiLAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIn0iLAotCQkJZmFsc2UsCi0JCQludWxsKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEgYWZ0ZXIgY3JlYXRpbmcgQ1UiLCAKLQkJCSIiLCAKLQkJCWxpc3RlbmVyLnRvU3RyaW5nKCkpOwotCQlsaXN0ZW5lci5mbHVzaCgpOwotCQkKLQkJLy8gdHlwZSBjcmVhdGlvbgotCQljdS5jcmVhdGVUeXBlKAotCQkJImNsYXNzIEEge1xuIiArCi0JCQkifSIsCi0JCQljdS5nZXRUeXBlKCJYIiksCi0JCQlmYWxzZSwKLQkJCW51bGwpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSBhZnRlciBjcmVhdGluZyB0eXBlIiwgCi0JCQkiIiwgCi0JCQlsaXN0ZW5lci50b1N0cmluZygpKTsKLQkJbGlzdGVuZXIuZmx1c2goKTsKLQkJCi0JCS8vIG5vbi1qYXZhIHJlc291cmNlIGNyZWF0aW9uCi0JCXRoaXMuY3JlYXRlRmlsZSgiUC9yZWFkbWUudHh0IiwgIiIpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSBhZnRlciBjcmVhdGluZyBub24tamF2YSByZXNvdXJjZSIsCi0JCQkiIiwKLQkJCWxpc3RlbmVyLnRvU3RyaW5nKCkpOwotCQlsaXN0ZW5lci5mbHVzaCgpOwotCQkKLQkJLy8gc2hhcmVkIHdvcmtpbmcgY29weSBjcmVhdGlvbgotCQl3YyA9IChJQ29tcGlsYXRpb25Vbml0KWN1LmdldFNoYXJlZFdvcmtpbmdDb3B5KG51bGwsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSBhZnRlciBjcmVhdGluZyBzaGFyZWQgd29ya2luZyBjb3B5IiwKLQkJCSIiLAotCQkJbGlzdGVuZXIudG9TdHJpbmcoKSk7Ci0JCWxpc3RlbmVyLmZsdXNoKCk7Ci0JCQkKLQkJLy8gcmVjb25jaWxlCi0JCXdjLmdldEJ1ZmZlcigpLnNldENvbnRlbnRzKAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIiAgcHVibGljIHZvaWQgZm9vKCkge1xuIiArCi0JCQkiICB9XG4iICsKLQkJCSJ9Iik7Ci0JCXdjLnJlY29uY2lsZSgpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSBhZnRlciByZWNvbmNpbGluZyB3b3JraW5nIGNvcHkiLAotCQkJIlhbKl06IHtDSElMRFJFTiB8IEZJTkUgR1JBSU5FRH1cbiIgKwotCQkJIglmb29bK106IHt9XG4iICsKLQkJCSJBWy1dOiB7fSIsCi0JCQlsaXN0ZW5lci50b1N0cmluZygpKTsKLQkJbGlzdGVuZXIuZmx1c2goKTsKLQkJCi0JCS8vIGNvbW1pdAotCQl3Yy5jb21taXQoZmFsc2UsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSBhZnRlciBjb21taXR0aW5nIHdvcmtpbmcgY29weSIsCi0JCQkiIiwKLQkJCWxpc3RlbmVyLnRvU3RyaW5nKCkpOwotCQlsaXN0ZW5lci5mbHVzaCgpOwotCQkKLQkJLy8gc2hhcmVkIHdvcmtpbmcgY29weSBkZXN0cnVjdGlvbgotCQl3Yy5kZXN0cm95KCk7Ci0JCWFzc2VydEVxdWFscygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIGFmdGVyIGRlc3Ryb3lpbmcgc2hhcmVkIHdvcmtpbmcgY29weSIsCi0JCQkiIiwKLQkJCWxpc3RlbmVyLnRvU3RyaW5nKCkpOwotCQlsaXN0ZW5lci5mbHVzaCgpOwotCQl3YyA9IG51bGw7Ci0JCQotCQkJCi0JfSBmaW5hbGx5IHsKLQkJaWYgKHdjICE9IG51bGwpIHdjLmRlc3Ryb3koKTsKLQkJSmF2YUNvcmUucmVtb3ZlRWxlbWVudENoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IG1lcmdpbmcgYSBqYXZhIGRlbHRhIHdpdGggYW5vdGhlciBvbmUgdGhhdCBjb250YWlucyBhIHJlc291cmNlIGRlbHRhCi0gKiByZXN1bHRzIGluIGEgamF2YSBkZWx0YSB3aXRoIHRoZSByZXNvdXJjZSBkZWx0YS4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIDExMjEwIFJlc291cmNlRGVsdGFzIGFyZSBsb3N0IHdoZW4gbWVyZ2luZyBkZWx0YXMpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNZXJnZVJlc291cmNlRGVsdGFzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyIifSwgIiIpOwotCQl0aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4oCi0JCQluZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJLy8gYW4gb3BlcmF0aW9uIHRoYXQgY3JlYXRlcyBhIGphdmEgZGVsdGEgd2l0aG91dCBmaXJpbmcgaXQKLQkJCQkJSVBhY2thZ2VGcmFnbWVudCBwa2cgPSBnZXRQYWNrYWdlRnJhZ21lbnQoIlAiLCAiIiwgIiIpOwotCQkJCQlwa2cuY3JlYXRlQ29tcGlsYXRpb25Vbml0KAotCQkJCQkJIlguamF2YSIsCi0JCQkJCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkJCQkifSIsCi0JCQkJCQl0cnVlLAotCQkJCQkJbnVsbCk7Ci0JCQkJCQkKLQkJCQkJLy8gYW4gb3BlcmF0aW9uIHRoYXQgZ2VuZXJhdGVzIGEgbm9uIGphdmEgcmVzb3VyY2UgZGVsdGEKLQkJCQkJY3JlYXRlRmlsZSgiUC9ZLnR4dCIsICIiKTsKLQkJCQl9Ci0JCQl9LAotCQkJbnVsbAotCQkpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSIsIAotCQkJIlBbKl06IHtDSElMRFJFTn1cbiIgKwotCQkJIglbcHJvamVjdCByb290XVsqXToge0NISUxEUkVOfVxuIiArCi0JCQkiCQlbZGVmYXVsdF1bKl06IHtDSElMRFJFTn1cbiIgKwotCQkJIgkJCVguamF2YVsrXToge31cbiIgKwotCQkJIglSZXNvdXJjZURlbHRhKC9QL1kudHh0KVsrXSIKLQkJKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLnN0b3BEZWx0YXMoKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotCi0JCi19Ci1wdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWV0aG9kQm9keUFuZFNhdmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCB3b3JraW5nQ29weSA9IG51bGw7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7IiJ9LCAiIik7Ci0JCXRoaXMuY3JlYXRlRm9sZGVyKCJQL3gveSIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoIlAveC95L0EuamF2YSIsCi0JCQkicGFja2FnZSB4Lnk7XG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJCSIgIHB1YmxpYyB2b2lkIGZvbygpIHtcbiIgKwotCQkJIiAgfVxuIiArCi0JCQkifSIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5nZXRDb21waWxhdGlvblVuaXQoIlAveC95L0EuamF2YSIpOyAKLQkJd29ya2luZ0NvcHkgPSAoSUNvbXBpbGF0aW9uVW5pdCljdS5nZXRXb3JraW5nQ29weSgpOwotCQl3b3JraW5nQ29weS5nZXRCdWZmZXIoKS5zZXRDb250ZW50cygKLQkJCSJwYWNrYWdlIHgueTtcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkJIiAgcHVibGljIHZvaWQgZm9vKCkge1xuIiArCi0JCQkiICAgIC8vIG1ldGhvZCBib2R5IGNoYW5nZSBcbiIgKwotCQkJIiAgfVxuIiArCi0JCQkifSIpOwotCQkKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQl3b3JraW5nQ29weS5jb21taXQodHJ1ZSwgbnVsbCk7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIiwgCi0JCQkiUFsqXToge0NISUxEUkVOfVxuIiArCi0JCQkiCVtwcm9qZWN0IHJvb3RdWypdOiB7Q0hJTERSRU59XG4iICsKLQkJCSIJCXgueVsqXToge0NISUxEUkVOfVxuIiArCi0JCQkiCQkJQS5qYXZhWypdOiB7Q09OVEVOVCB8IEZJTkUgR1JBSU5FRH0iCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCWlmICh3b3JraW5nQ29weSAhPSBudWxsKSB7Ci0JCQl3b3JraW5nQ29weS5kZXN0cm95KCk7Ci0JCX0KLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoKLSAqIEVuc3VyZXMgdGhhdCBtb2RpZnlpbmcgdGhlIHByb2plY3Qgb3V0cHV0IGxvY2F0aW9uIChpLmUuIHNpbXVsYXRlIGEgYnVpbGQpIGRvZXNuJ3QgcmVwb3J0IGFueSBkZWx0YS4KLSAqLwotcHVibGljIHZvaWQgdGVzdE1vZGlmeU91dHB1dExvY2F0aW9uMSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJCi0JCXRoaXMuc3RhcnREZWx0YXMoKTsKLQkJdGhpcy5jcmVhdGVGaWxlKCIvUC9iaW4vWC5jbGFzcyIsICIiKTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEiLAotCQkJIiIKLQkJKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLnN0b3BEZWx0YXMoKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoKLSAqIEVuc3VyZXMgdGhhdCBtb2RpZnlpbmcgYSBjdXN0b20gb3V0cHV0IGxvY2F0aW9uIChpLmUuIHNpbXVsYXRlIGEgYnVpbGQpIGRvZXNuJ3QgcmVwb3J0IGFueSBkZWx0YS4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAyNzQ5NCBTb3VyY2UgZm9sZGVyIG91dHB1dCBmb2xkZXIgc2hvd24gaW4gUGFja2FnZSBleHBsb3JlcikKLSAqLwotcHVibGljIHZvaWQgdGVzdE1vZGlmeU91dHB1dExvY2F0aW9uMigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4xIiwgbmV3IFN0cmluZ1tdIHsiYmluMiJ9KTsKLQkJCi0JCXRoaXMuc3RhcnREZWx0YXMoKTsKLQkJdGhpcy5jcmVhdGVGaWxlKCIvUC9iaW4yL1guY2xhc3MiLCAiIik7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIiwKLQkJCSIiCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qCi0gKiBFbnN1cmVzIHRoYXQgbW9kaWZ5aW5nIGEgY3VzdG9tIG91dHB1dCBsb2NhdGlvbiAoaS5lLiBzaW11bGF0ZSBhIGJ1aWxkKSBkb2Vzbid0IHJlcG9ydCBhbnkgZGVsdGEuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMjc0OTQgU291cmNlIGZvbGRlciBvdXRwdXQgZm9sZGVyIHNob3duIGluIFBhY2thZ2UgZXhwbG9yZXIpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlPdXRwdXRMb2NhdGlvbjMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7InNyYzEiLCAic3JjMiJ9LCAiYmluIiwgbmV3IFN0cmluZ1tdIHsic3JjMSIsIG51bGx9KTsKLQkJCi0JCXRoaXMuc3RhcnREZWx0YXMoKTsKLQkJdGhpcy5jcmVhdGVGaWxlKCIvUC9iaW4vWC5jbGFzcyIsICIiKTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEiLAotCQkJIiIKLQkJKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLnN0b3BEZWx0YXMoKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoKLSAqIEVuc3VyZXMgdGhhdCBtb2RpZnlpbmcgYSBjdXN0b20gb3V0cHV0IGxvY2F0aW9uIChpLmUuIHNpbXVsYXRlIGEgYnVpbGQpIGRvZXNuJ3QgcmVwb3J0IGFueSBkZWx0YS4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAzMjYyOSBEZWx0YVByb2Nlc3NvciB3YWxraW5nIHNvbWUgYmluYXJ5IG91dHB1dCkKLSAqLwotcHVibGljIHZvaWQgdGVzdE1vZGlmeU91dHB1dExvY2F0aW9uNCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIik7Ci0JCXRoaXMuZWRpdEZpbGUoCi0JCQkiL1AvLmNsYXNzcGF0aCIsCi0JCQkiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iICsKLQkJCSI8Y2xhc3NwYXRoPlxuIiArCi0JCQkiICAgIDxjbGFzc3BhdGhlbnRyeSBleGNsdWRpbmc9XCJzcmMvXCIga2luZD1cInNyY1wiIG91dHB1dD1cImJpbjFcIiBwYXRoPVwiXCIvPlxuIiArCi0JCQkiICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPVwic3JjXCIgb3V0cHV0PVwiYmluMlwiIHBhdGg9XCJzcmNcIi8+XG4iICsKLQkJCSIgICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9XCJvdXRwdXRcIiBwYXRoPVwiYmluXCIvPlxuIiArCi0JCQkiPC9jbGFzc3BhdGg+IgotCQkpOwotCQl0aGlzLmNyZWF0ZUZvbGRlcigiL1AvYmluMiIpOwotCi0JCXRoaXMuc3RhcnREZWx0YXMoKTsKLQkJdGhpcy5jcmVhdGVGaWxlKCIvUC9iaW4yL1guY2xhc3MiLCAiIik7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIiwKLQkJCSIiCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qKgotICogYnVnIDE4OTUzCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlQcm9qZWN0RGVzY3JpcHRpb25BbmRSZW1vdmVGb2xkZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSBjcmVhdGVKYXZhUHJvamVjdCgiUCIpOwotCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0Rm9sZGVyID0gcHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0JCWZpbmFsIElGb2xkZXIgZm9sZGVyID0gY3JlYXRlRm9sZGVyKCIvUC9mb2xkZXIiKTsKLQkJCi0JCXN0YXJ0RGVsdGFzKCk7Ci0JCWdldFdvcmtzcGFjZSgpLnJ1bigKLQkJCW5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2MgPSBwcm9qZWN0Rm9sZGVyLmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJCWRlc2Muc2V0Q29tbWVudCgiQSBjb21tZW50Iik7Ci0JCQkJCXByb2plY3RGb2xkZXIuc2V0RGVzY3JpcHRpb24oZGVzYywgbnVsbCk7Ci0JCQkJCWRlbGV0ZVJlc291cmNlKGZvbGRlcik7Ci0JCQkJfQotCQkJfSwKLQkJCW51bGwpOwotCQkJCi0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIiwgCi0JCQkiUFsqXToge0NISUxEUkVOIHwgQ09OVEVOVH1cbiIrCi0JCQkiCVtwcm9qZWN0IHJvb3RdWypdOiB7Q0hJTERSRU59XG4iKwotCQkJIgkJZm9sZGVyWy1dOiB7fVxuIisKLQkJCSIJUmVzb3VyY2VEZWx0YSgvUC8ucHJvamVjdClbKl0iCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJc3RvcERlbHRhcygpOwotCQlkZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoKLSAqIE1vdmUgYSBjdSBmcm9tIGEgcGFja2FnZSB0byBpdHMgZW5jbG9zaW5nIHBhY2thZ2UuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgNzAzMyBTdGFsZSBwYWNrYWdlcyB2aWV3IGFmdGVyIG1vdmluZyBjb21waWxhdGlvbiB1bml0cykKLSAqLwotcHVibGljIHZvaWQgdGVzdE1vdmVDdUluRW5jbG9zaW5nUGtnKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyIifSwgIiIpOwotCQl0aGlzLmNyZWF0ZUZvbGRlcigiUC94L3kiKTsKLQkJdGhpcy5jcmVhdGVGaWxlKCJQL3gveS9BLmphdmEiLAotCQkJInBhY2thZ2UgeC55O1xuIiArCi0JCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCQkifSIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5nZXRDb21waWxhdGlvblVuaXQoIlAveC95L0EuamF2YSIpOyAKLQkJSVBhY2thZ2VGcmFnbWVudCBwa2cgPSB0aGlzLmdldFBhY2thZ2UoIlAveCIpOwotCQkKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQljdS5tb3ZlKHBrZywgbnVsbCwgbnVsbCwgdHJ1ZSwgbnVsbCk7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIiwgCi0JCQkiUFsqXToge0NISUxEUkVOfVxuIiArCi0JCQkiCVtwcm9qZWN0IHJvb3RdWypdOiB7Q0hJTERSRU59XG4iICsKLQkJCSIJCXgueVsqXToge0NISUxEUkVOfVxuIiArCi0JCQkiCQkJQS5qYXZhWy1dOiB7TU9WRURfVE8oQS5qYXZhIFtpbiB4IFtpbiBbcHJvamVjdCByb290XSBbaW4gUF1dXSl9XG4iICsKLQkJCSIJCXhbKl06IHtDSElMRFJFTn1cbiIgKwotCQkJIgkJCUEuamF2YVsrXToge01PVkVEX0ZST00oQS5qYXZhIFtpbiB4LnkgW2luIFtwcm9qZWN0IHJvb3RdIFtpbiBQXV1dKX0iCi0JCSk7Ci0JCWFzc2VydEVxdWFscygKLQkJCSJVbmV4cGVjdGVkIGNoaWxkcmVuIGZvciBwYWNrYWdlIHgiLAotCQkJInhcbiIgKwotCQkJIiAgQS5qYXZhXG4iICsKLQkJCSIgICAgcGFja2FnZSB4XG4iICsKLQkJCSIgICAgY2xhc3MgQSIsCi0JCQl0aGlzLmV4cGFuZEFsbChwa2cpKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlVuZXhwZWN0ZWQgY2hpbGRyZW4gZm9yIHBhY2thZ2UgeC55IiwKLQkJCSJ4LnkiLAotCQkJdGhpcy5leHBhbmRBbGwodGhpcy5nZXRQYWNrYWdlKCJQL3gveSIpKSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLQotLyoKLSAqIE1vdmUgYSBub24tamF2YSByZXNvdXJjZXMgdGhhdCBpcyB1bmRlciBhIGRvdC1uYW1lZCBmb2xkZXIuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgNjY4NyBXcm9uZyBKYXZhTW9kZWwgcmVmcmVzaCBhZnRlciBkcmFnIGFuZCBkcm9wIG91dHNpZGUgZm9sZGVyIHdpdGggZG90IGluIG5hbWUpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNb3ZlUmVzSW5Eb3ROYW1lZEZvbGRlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHt9LCAiIik7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSB0aGlzLmdldFByb2plY3QoIlAiKTsKLQkJdGhpcy5jcmVhdGVGb2xkZXIoIlAveC55Iik7Ci0JCUlGaWxlIGZpbGUgPSB0aGlzLmNyZWF0ZUZpbGUoIlAveC55L3Rlc3QudHh0IiwgIiIpOwotCQkKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQlmaWxlLm1vdmUocHJvamVjdC5nZXRGdWxsUGF0aCgpLmFwcGVuZCgidGVzdC50eHQiKSwgdHJ1ZSwgbnVsbCk7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIiwgCi0JCQkiUFsqXToge0NPTlRFTlR9XG4iICsKLQkJCSIJUmVzb3VyY2VEZWx0YSgvUC90ZXN0LnR4dClbK11cbiIgKwotCQkJIglSZXNvdXJjZURlbHRhKC9QL3gueSlbKl0iCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qCi0gKiBNb3ZlIDIgbm9uLWphdmEgcmVzb3VyY2VzIHRoYXQgd2VyZSBvdXRzaWRlIGNsYXNzcGF0aCB0byBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAyODU4MyBNaXNzaW5nIG9uZSB1bml0IGluIHBhY2thZ2UgdmlldykKLSAqLwotcHVibGljIHZvaWQgdGVzdE1vdmVUd29SZXNJblJvb3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCWZpbmFsIElGaWxlIGYxID0gdGhpcy5jcmVhdGVGaWxlKCJQL1guamF2YSIsICJwdWJsaWMgY2xhc3MgWCB7fSIpOwotCQlmaW5hbCBJRmlsZSBmMiA9IHRoaXMuY3JlYXRlRmlsZSgiUC9ZLmphdmEiLCAicHVibGljIGNsYXNzIFkge30iKTsKLQkJCi0JCXRoaXMuc3RhcnREZWx0YXMoKTsKLQkJSmF2YUNvcmUucnVuKAotCQkJbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCWYxLm1vdmUobmV3IFBhdGgoIi9QL3NyYy9YLmphdmEiKSwgdHJ1ZSwgbnVsbCk7Ci0JCQkJCWYyLm1vdmUobmV3IFBhdGgoIi9QL3NyYy9ZLmphdmEiKSwgdHJ1ZSwgbnVsbCk7Ci0JCQkJfQotCQkJfSwKLQkJCW51bGwpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSIsIAotCQkJIlBbKl06IHtDSElMRFJFTiB8IENPTlRFTlR9XG4iICsgCi0JCQkiCXNyY1sqXToge0NISUxEUkVOfVxuIiArIAotCQkJIgkJW2RlZmF1bHRdWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCQkJWC5qYXZhWytdOiB7fVxuIiArIAotCQkJIgkJCVkuamF2YVsrXToge31cbiIgKyAKLQkJCSIJUmVzb3VyY2VEZWx0YSgvUC9YLmphdmEpWy1dXG4iICsgCi0JCQkiCVJlc291cmNlRGVsdGEoL1AvWS5qYXZhKVstXSIKLQkJKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLnN0b3BEZWx0YXMoKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoqCi0gKiBUZXN0IHRoYXQgZGVsdGFzIGFyZSBnZW5lcmF0ZWQgd2hlbiBhIG5lc3RlZCBwYWNrYWdlIGZyYWdtZW50IHJvb3QgaXMgcmVtb3ZlZAotICogYW5kIGFkZGVkIHZpYSBjb3JlIEFQSS4KLSAqLwotcHVibGljIHZvaWQgdGVzdE5lc3RlZFJvb3RQYXJlbnRNb3ZlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCWNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsibmVzdGVkMi9zcmMiLCAibmVzdGVkL3NyYyJ9LCAiYmluIik7Ci0JCWRlbGV0ZUZvbGRlcigiL1AvbmVzdGVkMi9zcmMiKTsKLQkJCi0JCXN0YXJ0RGVsdGFzKCk7Ci0JCUlGb2xkZXIgZm9sZGVyID0gZ2V0Rm9sZGVyKCIvUC9uZXN0ZWQvc3JjIik7Ci0JCWZvbGRlci5tb3ZlKG5ldyBQYXRoKCIvUC9uZXN0ZWQyL3NyYyIpLCBmYWxzZSwgbnVsbCk7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIiwKLQkJCSJQWypdOiB7Q0hJTERSRU4gfCBDT05URU5UfVxuIiArIAotCQkJIgluZXN0ZWQvc3JjWy1dOiB7TU9WRURfVE8obmVzdGVkMi9zcmMgW2luIFBdKX1cbiIgKyAKLQkJCSIJbmVzdGVkMi9zcmNbK106IHtNT1ZFRF9GUk9NKG5lc3RlZC9zcmMgW2luIFBdKX1cbiIgKyAKLQkJCSIJUmVzb3VyY2VEZWx0YSgvUC9uZXN0ZWQpWypdXG4iICsgCi0JCQkiCVJlc291cmNlRGVsdGEoL1AvbmVzdGVkMilbKl0iCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qKgotICogVGVzdCB0aGF0IGRlbHRhcyBhcmUgZ2VuZXJhdGVkIHdoZW4gYSBub24tamF2YSBmaWxlIGlzCi0gKiByZW1vdmVkIGFuZCBhZGRlZAotICovCi1wdWJsaWMgdm9pZCB0ZXN0Tm9uSmF2YVJlc291cmNlUmVtb3ZlQW5kQWRkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCWNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJSUZpbGUgZmlsZSA9IGNyZWF0ZUZpbGUoIi9QL3NyYy9yZWFkLnR4dCIsICIiKTsKLQkJCi0JCXN0YXJ0RGVsdGFzKCk7Ci0JCWRlbGV0ZVJlc291cmNlKGZpbGUpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSBhZnRlciBkZWxldGluZyAvUC9zcmMvcmVhZC50eHQiLAotCQkJIlBbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJCSIJc3JjWypdOiB7Q09OVEVOVH1cbiIgKyAKLQkJCSIJCVJlc291cmNlRGVsdGEoL1Avc3JjL3JlYWQudHh0KVstXSIKLQkJKTsKLQkJCi0JCWNsZWFyRGVsdGFzKCk7Ci0JCWNyZWF0ZUZpbGUoIi9QL3NyYy9yZWFkLnR4dCIsICIiKTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEgYWZ0ZXIgY3JlYXRpbmcgL1Avc3JjL3JlYWQudHh0IiwKLQkJCSJQWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCXNyY1sqXToge0NPTlRFTlR9XG4iICsgCi0JCQkiCQlSZXNvdXJjZURlbHRhKC9QL3NyYy9yZWFkLnR4dClbK10iCi0JCSk7Ci0JCQotCX0gZmluYWxseSB7Ci0JCXRoaXMuc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0KLQotLyoKLSAqIE9wZW4gYSBqYXZhIHByb2plY3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RPcGVuSmF2YVByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7IiJ9LCAiIik7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSB0aGlzLmdldFByb2plY3QoIlAiKTsKLQkJcHJvamVjdC5jbG9zZShudWxsKTsKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQlwcm9qZWN0Lm9wZW4obnVsbCk7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIiwgCi0JCQkiUFsrXToge31cbiIgKyAKLQkJCSJSZXNvdXJjZURlbHRhKC9QKSIKLQkJKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLnN0b3BEZWx0YXMoKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotCi0vKgotICogT3BlbiBhIG5vbi1qYXZhIHByb2plY3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RPcGVuTm9uSmF2YVByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVQcm9qZWN0KCJQIik7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSB0aGlzLmdldFByb2plY3QoIlAiKTsKLQkJcHJvamVjdC5jbG9zZShudWxsKTsKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQlwcm9qZWN0Lm9wZW4obnVsbCk7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIiwgCi0JCQkiUmVzb3VyY2VEZWx0YSgvUCkiCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IC5jbGFzc3BhdGggb3ZlcndyaXRlIGlzIHRha2VuIGludG8gYWNjb3VudC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAyMTQyMCBDaGFuZ2luZyAuY2xhc3NwYXRoIGRvZXNuJ3QgdXBkYXRlIEpEVCkKLSAqLwotcHVibGljIHZvaWQgdGVzdE92ZXJ3cml0ZUNsYXNzcGF0aCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsiIn0sICIiKTsKLQkJdGhpcy5jcmVhdGVGb2xkZXIoIlAvc3JjIik7Ci0JCXRoaXMuY3JlYXRlRm9sZGVyKCJQL2JpbiIpOwotCQlmaW5hbCBJRmlsZSBuZXdDUCA9IHRoaXMuY3JlYXRlRmlsZSgKLQkJCSJQLy5jbGFzc3BhdGgyIiwgCi0JCQkiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iICsKLQkJCSI8Y2xhc3NwYXRoPlxuIiArCi0JCQkiICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPVwic3JjXCIgcGF0aD1cInNyY1wiLz5cbiIgKwotCQkJIiAgICA8Y2xhc3NwYXRoZW50cnkga2luZD1cIm91dHB1dFwiIHBhdGg9XCJiaW5cIi8+XG4iICsKLQkJCSI8L2NsYXNzcGF0aD4iKTsKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQlJV29ya3NwYWNlUnVubmFibGUgcnVuID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQlJRmlsZSBvbGRDUCA9IG5ld0NQLmdldFBhcmVudCgpLmdldEZpbGUobmV3IFBhdGgoIi5jbGFzc3BhdGgiKSk7Ci0JCQkJZGVsZXRlUmVzb3VyY2Uob2xkQ1ApOwotCQkJCW5ld0NQLm1vdmUobmV3IFBhdGgoIi9QLy5jbGFzc3BhdGgiKSwgdHJ1ZSwgbnVsbCk7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuZ2V0V29ya3NwYWNlKCkucnVuKHJ1biwgbnVsbCk7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIiwgCi0JCQkiUFsqXToge0NISUxEUkVOfVxuIiArCi0JCQkiCVtwcm9qZWN0IHJvb3RdWypdOiB7UkVNT1ZFRCBGUk9NIENMQVNTUEFUSH1cbiIgKwotCQkJIglzcmNbKl06IHtBRERFRCBUTyBDTEFTU1BBVEh9XG4iICsKLQkJCSIJUmVzb3VyY2VEZWx0YSgvUC8uY2xhc3NwYXRoKVsqXVxuIiArCi0JCQkiCVJlc291cmNlRGVsdGEoL1AvLmNsYXNzcGF0aDIpWy1dIgotCQkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0vKioKLSAqIFRlc3QgdGhhdCBkZWx0YXMgYXJlIGdlbmVyYXRlZCB3aGVuIHBhY2thZ2UgZnJhZ21lbnRzIGFyZSBhZGRlZAotICogYW5kIHJlbW92ZWQgZnJvbSBhIHJvb3QgdmlhIGNvcmUgQVBJLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UGFja2FnZUZyYWdtZW50QWRkQW5kUmVtb3ZlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCWNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJCi0JCXN0YXJ0RGVsdGFzKCk7Ci0JCUlGb2xkZXIgZm9sZGVyID0gY3JlYXRlRm9sZGVyKCIvUC9zcmMvcCIpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSIsIAotCQkJIlBbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJCSIJc3JjWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCQlwWytdOiB7fSIKLQkJKTsKLQkJCi0JCWNsZWFyRGVsdGFzKCk7Ci0JCWRlbGV0ZVJlc291cmNlKGZvbGRlcik7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIiwgCi0JCQkiUFsqXToge0NISUxEUkVOfVxuIiArIAotCQkJIglzcmNbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJCSIJCXBbLV06IHt9IgotCQkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0vKioKLSAqIFRlc3QgdGhhdCBkZWx0YXMgYXJlIGdlbmVyYXRlZCB3aGVuIGEgcGFja2FnZSBmcmFnbWVudCBpcyBtb3ZlZAotICogdmlhIGNvcmUgQVBJLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UGFja2FnZUZyYWdtZW50TW92ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQljcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCUlGb2xkZXIgZm9sZGVyID0gY3JlYXRlRm9sZGVyKCIvUC9zcmMvcCIpOwotCi0JCXN0YXJ0RGVsdGFzKCk7Ci0JCWZvbGRlci5tb3ZlKG5ldyBQYXRoKCIvUC9zcmMvcDIiKSwgZmFsc2UsIG51bGwpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSIsIAotCQkJIlBbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJCSIJc3JjWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCQlwWy1dOiB7TU9WRURfVE8ocDIgW2luIHNyYyBbaW4gUF1dKX1cbiIgKyAKLQkJCSIJCXAyWytdOiB7TU9WRURfRlJPTShwIFtpbiBzcmMgW2luIFBdXSl9IgotCQkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0vKioKLSAqIFRlc3QgdGhhdCBkZWx0YXMgYXJlIGdlbmVyYXRlZCB3aGVuIGEgcGFja2FnZSBmcmFnbWVudCByb290IGlzIHJlbW92ZWQKLSAqIGFuZCBhZGRlZCB2aWEgY29yZSBBUEkuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlRnJhZ21lbnRSb290UmVtb3ZlQW5kQWRkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCWNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJCi0JCXN0YXJ0RGVsdGFzKCk7Ci0JCWRlbGV0ZUZvbGRlcigiL1Avc3JjIik7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIGFmdGVyIGRlbGV0aW5nIC9QL3NyYyIsCi0JCQkiUFsqXToge0NISUxEUkVOfVxuIiArIAotCQkJIglzcmNbLV06IHt9IgotCQkpOwotCQkKLQkJY2xlYXJEZWx0YXMoKTsKLQkJY3JlYXRlRm9sZGVyKCIvUC9zcmMiKTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEgYWZ0ZXIgY3JlYXRpbmcgL1Avc3JjIiwKLQkJCSJQWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCXNyY1srXToge30iCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJc3RvcERlbHRhcygpOwotCQlkZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoKLSAqIFJlbW92ZSB0aGVuIGFkZCBhIGJpbmFyeSBwcm9qZWN0IChpbiBhIHdvcmtzcGFjZSBydW5uYWJsZSkuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciAyNDc3NSBXcm9uZyBkZWx0YSB3aGVuIHJlcGxhY2luZyBiaW5hcnkgcHJvamVjdCB3aXRoIHNvdXJjZSBwcm9qZWN0KQotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWRkQmluYXJ5UHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyIifSwgIiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoIlAvbGliLmphciIsICIiKTsKLQkJcHJvamVjdC5zZXRSYXdDbGFzc3BhdGgoCi0JCQluZXcgSUNsYXNzcGF0aEVudHJ5W10gewotCQkJCUphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShuZXcgUGF0aCgiL1AvbGliLmphciIpLCBudWxsLCBudWxsKQotCQkJfSwKLQkJCW51bGwKLQkJKTsKLQkJCi0JCXRoaXMuc3RhcnREZWx0YXMoKTsKLQkJZ2V0V29ya3NwYWNlKCkucnVuKAotCQkJbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCWRlbGV0ZVByb2plY3QoIlAiKTsKLQkJCQkJY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyIifSwgIiIpOwotCQkJCX0KLQkJCX0sCi0JCQludWxsKTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEiLCAKLQkJCSJQWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCWxpYi5qYXJbLV06IHt9XG4iICsgCi0JCQkiCVtwcm9qZWN0IHJvb3RdWypdOiB7QURERUQgVE8gQ0xBU1NQQVRIfVxuIiArIAotCQkJIglSZXNvdXJjZURlbHRhKC9QLy5jbGFzc3BhdGgpWypdXG4iICsgCi0JCQkiCVJlc291cmNlRGVsdGEoL1AvLnByb2plY3QpWypdIgotCQkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0vKgotICogUmVtb3ZlIHRoZW4gYWRkIGEgamF2YSBwcm9qZWN0IChpbiBhIHdvcmtzcGFjZSBydW5uYWJsZSkuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBZGRKYXZhUHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsiIn0sICIiKTsKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQlnZXRXb3Jrc3BhY2UoKS5ydW4oCi0JCQluZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJZGVsZXRlUHJvamVjdCgiUCIpOwotCQkJCQljcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7IiJ9LCAiIik7Ci0JCQkJfQotCQkJfSwKLQkJCW51bGwpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSIsIAotCQkJIlBbKl06IHtDT05URU5UfVxuIiArCi0JCQkiCVJlc291cmNlRGVsdGEoL1AvLmNsYXNzcGF0aClbKl1cbiIgKwotCQkJIglSZXNvdXJjZURlbHRhKC9QLy5wcm9qZWN0KVsqXSIKLQkJKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLnN0b3BEZWx0YXMoKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoKLSAqIENoYW5nZSB0aGUgLmNsYXNzcGF0aCBmaWxlIHNvIGFzIHRvIHJlbW92ZSBhIGNsYXNzcGF0aCBlbnRyeSBhbmQgcmVtb3ZlIHRoZSBjb3JyZXNwb25kaW5nIHJlc291cmNlLgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDI0NTE3IHR5cGUgdmlldyBkb2VzIG5vdCBub3RpY2Ugd2hlbiBqYXIgZGlzYXBwZWFycykKLQotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ1BFbnRyeUFuZFJvb3QxKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCQotCQkvLyBlbnN1cmUgdGhhdCB0aGUgcHJvamVjdCBpcyBvcGVuICh0aGVyZSBhcmUgY2xpZW50cyBvZiB0aGUgZGVsdGEgb25seSBpZiB0aGUgcHJvamVjdCBpcyBvcGVuKQotCQlwcm9qZWN0Lm9wZW4obnVsbCk7Ci0JCSAKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQlKYXZhQ29yZS5ydW4oCi0JCQluZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJZWRpdEZpbGUoCi0JCQkJCQkiL1AvLmNsYXNzcGF0aCIsCi0JCQkJCQkiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iICsKLQkJCQkJCSI8Y2xhc3NwYXRoPlxuIiArCi0JCQkJCQkiICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPVwib3V0cHV0XCIgcGF0aD1cImJpblwiLz5cbiIgKwotCQkJCQkJIjwvY2xhc3NwYXRoPiIpOwotCQkJCQlkZWxldGVGb2xkZXIoIi9QL3NyYyIpOwotCQkJCX0KLQkJCX0sCi0JCQludWxsKTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEiLCAKLQkJCSJQWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCXNyY1stXToge31cbiIgKyAKLQkJCSIJUmVzb3VyY2VEZWx0YSgvUC8uY2xhc3NwYXRoKVsqXSIKLQkJKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLnN0b3BEZWx0YXMoKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoKLSAqIFJlbW92ZSBhIGNsYXNzcGF0aCBlbnRyeSBhbmQgcmVtb3ZlIHRoZSBjb3JyZXNwb25kaW5nIHJlc291cmNlLgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDI0NTE3IHR5cGUgdmlldyBkb2VzIG5vdCBub3RpY2Ugd2hlbiBqYXIgZGlzYXBwZWFycykKLQotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ1BFbnRyeUFuZFJvb3QyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCWZpbmFsIElKYXZhUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCQotCQkvLyBlbnN1cmUgdGhhdCB0aGUgcHJvamVjdCBpcyBvcGVuICh0aGVyZSBhcmUgY2xpZW50cyBvZiB0aGUgZGVsdGEgb25seSBpZiB0aGUgcHJvamVjdCBpcyBvcGVuKQotCQlwcm9qZWN0Lm9wZW4obnVsbCk7Ci0JCSAKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQlKYXZhQ29yZS5ydW4oCi0JCQluZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJcHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3IElDbGFzc3BhdGhFbnRyeVtdIHt9LCBudWxsKTsKLQkJCQkJZGVsZXRlRm9sZGVyKCIvUC9zcmMiKTsKLQkJCQl9Ci0JCQl9LAotCQkJbnVsbCk7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIiwgCi0JCQkiUFsqXToge0NISUxEUkVOfVxuIiArIAotCQkJIglzcmNbLV06IHt9XG4iICsgCi0JCQkiCVJlc291cmNlRGVsdGEoL1AvLmNsYXNzcGF0aClbKl0iCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qCi0gKiBSZW1vdmUgIHRoZSByZXNvdXJjZSBvZiBhIGNsYXNzcGF0aCBlbnRyeSBhbmQgcmVtb3ZlIHRoZSAgY2xhc3NwYXRoIGVudHJ5LgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDI0NTE3IHR5cGUgdmlldyBkb2VzIG5vdCBub3RpY2Ugd2hlbiBqYXIgZGlzYXBwZWFycykKLQotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ1BFbnRyeUFuZFJvb3QzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCWZpbmFsIElKYXZhUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCQotCQkvLyBlbnN1cmUgdGhhdCB0aGUgcHJvamVjdCBpcyBvcGVuICh0aGVyZSBhcmUgY2xpZW50cyBvZiB0aGUgZGVsdGEgb25seSBpZiB0aGUgcHJvamVjdCBpcyBvcGVuKQotCQlwcm9qZWN0Lm9wZW4obnVsbCk7Ci0JCSAKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQlKYXZhQ29yZS5ydW4oCi0JCQluZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJZGVsZXRlRm9sZGVyKCIvUC9zcmMiKTsKLQkJCQkJcHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3IElDbGFzc3BhdGhFbnRyeVtdIHt9LCBudWxsKTsKLQkJCQl9Ci0JCQl9LAotCQkJbnVsbCk7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIiwgCi0JCQkiUFsqXToge0NISUxEUkVOfVxuIiArIAotCQkJIglzcmNbLV06IHt9XG4iICsgCi0JCQkiCVJlc291cmNlRGVsdGEoL1AvLmNsYXNzcGF0aClbKl0iCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLQotCi0vKgotICogUmVtb3ZlIHRoZSBqYXZhIG5hdHVyZSBvZiBhbiBleGlzdGluZyBqYXZhIHByb2plY3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVKYXZhTmF0dXJlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyIifSwgIiIpOwotCQl0aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCXRoaXMucmVtb3ZlSmF2YU5hdHVyZSgiUCIpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSIsIAotCQkJIlBbLV06IHt9XG4iICsgCi0JCQkiUmVzb3VyY2VEZWx0YSgvUCkiCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVKYXZhUHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsiIn0sICIiKTsKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEiLCAKLQkJCSJQWy1dOiB7fSIKLQkJKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLnN0b3BEZWx0YXMoKTsKLQl9Ci19Ci0vKgotICogUmVtb3ZlIGEgbm9uLWphdmEgcHJvamVjdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJlbW92ZU5vbkphdmFQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlUHJvamVjdCgiUCIpOwotCQl0aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiU2hvdWxkIGdldCBhIG5vbi1KYXZhIHJlc291cmNlIGRlbHRhIiwgCi0JCQkiUmVzb3VyY2VEZWx0YSgvUCkiCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JfQotfQotLyoKLSAqIFJlbW92aW5nIGEgbm9uLWphdmEgcHJvamVjdCB0aGF0IGNvbnRhaW5zIGEgamFyIHJlZmVyZW5jZWQgaW4gYW5vdGhlciBwcm9qZWN0IHNob3VsZCBwcm9kdWNlCi0gKiBhIGRlbHRhIG9uIHRoaXMgb3RoZXIgcHJvamVjdC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAxOTA1OCBDbG9zaW5nIG5vbi1qYXZhIHByb2plY3QgZG9lc24ndCByZW1vdmUgcm9vdCBmcm9tIGphdmEgcHJvamVjdCkKLSAqLwotcHVibGljIHZvaWQgdGVzdFJlbW92ZU5vbkphdmFQcm9qZWN0VXBkYXRlRGVwZW5kZW50MSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZVByb2plY3QoIlNQIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgiL1NQL3guamFyIiwgIiIpOwotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJKUCIsIG5ldyBTdHJpbmdbXSB7IiJ9LCBuZXcgU3RyaW5nW10geyIvU1AveC5qYXIifSwgIiIpOwotCQl0aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiU1AiKTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEiLCAKLQkJCSJKUFsqXToge0NISUxEUkVOfVxuIiArIAotCQkJIgkvU1AveC5qYXJbLV06IHt9XG4iICsgCi0JCQkiUmVzb3VyY2VEZWx0YSgvU1ApIgotCQkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlNQIik7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiSlAiKTsKLQl9Ci19Ci0vKgotICogUmVtb3ZpbmcgYSBub24tamF2YSBwcm9qZWN0IGFuZCBhbm90aGVyIHByb2plY3QgcmVmZXJlbmNlIGEgbm9uIGV4aXRpbmcgZm9sZGVyIGluIHRoZSBkZWxldGVkIHByb2plY3QKLSAqIHNob3VsZCBub3QgcHJvZHVjZSBhIGRlbHRhIG9uIHRoaXMgb3RoZXIgcHJvamVjdCAoYW5kIG5vIG51bGwgcG9pbnRlciBleGNlcHRpb24pCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMTkxMzEgTlBFIHdoZW4gcmVtb3ZpbmcgYSBwcm9qZWN0IGNvbnRhaW5pbmcgbWlzc2luZyBjbGFzc2ZpbGUgZm9sZGVyKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTm9uSmF2YVByb2plY3RVcGRhdGVEZXBlbmRlbnQyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlUHJvamVjdCgiU1AiKTsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiSlAiLCBuZXcgU3RyaW5nW10geyIifSwgbmV3IFN0cmluZ1tdIHsiL1NQL21pc3NpbmcifSwgIiIpOwotCQl0aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiU1AiKTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEiLCAKLQkJCSJSZXNvdXJjZURlbHRhKC9TUCkiCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiU1AiKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJKUCIpOwotCX0KLX0KLS8qCi0gKiBSZW1vdmluZyBhIG5vbi1qYXZhIHByb2plY3QgdGhhdCBjb250YWlucyBhIGphciByZWZlcmVuY2VkIGluIGFub3RoZXIgcHJvamVjdCBzaG91bGQgcHJvZHVjZQotICogYSBkZWx0YSBvbiB0aGlzIG90aGVyIHByb2plY3QuIENhc2Ugb2YgdGhlIHJlbW92YWwgYmVpbmcgZG9uZSByaWdodCBhZnRlciBzdGFydC11cC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAzMTM3NyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBvbiBiaW5hcnkgaW1wb3J0KQotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTm9uSmF2YVByb2plY3RVcGRhdGVEZXBlbmRlbnQzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlUHJvamVjdCgiU1AiKTsKLQkJdGhpcy5jcmVhdGVGaWxlKCIvU1AveC5qYXIiLCAiIik7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIkpQIiwgbmV3IFN0cmluZ1tdIHsiIn0sIG5ldyBTdHJpbmdbXSB7Ii9TUC94LmphciJ9LCAiIik7Ci0JCQotCQkvLyBzaW11bGF0ZSBzdGFydC11cCBzdGF0ZSBvZiBEZWx0YVByb2Nlc3NvcgotCQlEZWx0YVByb2Nlc3NvciBkZWx0YVByb2Nlc3NvciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmRlbHRhUHJvY2Vzc29yOwotCQlkZWx0YVByb2Nlc3Nvci5vbGRSb290cyA9IG51bGw7Ci0JCWRlbHRhUHJvY2Vzc29yLnJvb3RzID0gbnVsbDsKLQkJZGVsdGFQcm9jZXNzb3Iucm9vdHNBcmVTdGFsZSA9IHRydWU7Ci0JCQotCQl0aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCUphdmFDb3JlLnJ1bigKLQkJCW5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQlkZWxldGVQcm9qZWN0KCJTUCIpOwotCQkJCX0KLQkJCX0sIAotCQkJbnVsbCk7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIiwgCi0JCQkiSlBbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJCSIJL1NQL3guamFyWy1dOiB7fVxuIiArIAotCQkJIlJlc291cmNlRGVsdGEoL1NQKSIKLQkJKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLnN0b3BEZWx0YXMoKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJTUCIpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIkpQIik7Ci0JfQotfQotLyoKLSAqIFJlbmFtZSBhIGphdmEgcHJvamVjdC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyA3MDMwIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiByZW5hbWluZyBwcm9qZWN0KQotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVuYW1lSmF2YVByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7IiJ9LCAiIik7Ci0JCXRoaXMuc3RhcnREZWx0YXMoKTsKLQkJdGhpcy5yZW5hbWVQcm9qZWN0KCJQIiwgIlAxIik7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIiwgCi0JCQkiUFstXToge01PVkVEX1RPKFAxKX1cbiIgKwotCQkJIlAxWytdOiB7TU9WRURfRlJPTShQKX0iCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAxIik7Ci0JfQotfQotcHVibGljIHZvaWQgdGVzdFJlbmFtZU1ldGhvZEFuZFNhdmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCB3b3JraW5nQ29weSA9IG51bGw7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7IiJ9LCAiIik7Ci0JCXRoaXMuY3JlYXRlRm9sZGVyKCJQL3gveSIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoIlAveC95L0EuamF2YSIsCi0JCQkicGFja2FnZSB4Lnk7XG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJCSIgIHB1YmxpYyB2b2lkIGZvbzEoKSB7XG4iICsKLQkJCSIgIH1cbiIgKwotCQkJIn0iKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuZ2V0Q29tcGlsYXRpb25Vbml0KCJQL3gveS9BLmphdmEiKTsgCi0JCXdvcmtpbmdDb3B5ID0gKElDb21waWxhdGlvblVuaXQpY3UuZ2V0V29ya2luZ0NvcHkoKTsKLQkJd29ya2luZ0NvcHkuZ2V0QnVmZmVyKCkuc2V0Q29udGVudHMoCi0JCQkicGFja2FnZSB4Lnk7XG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJCSIgIHB1YmxpYyB2b2lkIGZvbzIoKSB7XG4iICsKLQkJCSIgIH1cbiIgKwotCQkJIn0iKTsKLQkJCi0JCXRoaXMuc3RhcnREZWx0YXMoKTsKLQkJd29ya2luZ0NvcHkuY29tbWl0KHRydWUsIG51bGwpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSIsIAotCQkJIlBbKl06IHtDSElMRFJFTn1cbiIgKwotCQkJIglbcHJvamVjdCByb290XVsqXToge0NISUxEUkVOfVxuIiArCi0JCQkiCQl4LnlbKl06IHtDSElMRFJFTn1cbiIgKwotCQkJIgkJCUEuamF2YVsqXToge0NISUxEUkVOIHwgRklORSBHUkFJTkVEfVxuIiArCi0JCQkiCQkJCUFbKl06IHtDSElMRFJFTiB8IEZJTkUgR1JBSU5FRH1cbiIgKwotCQkJIgkJCQkJZm9vMlsrXToge31cbiIgKwotCQkJIgkJCQkJZm9vMVstXToge30iCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCWlmICh3b3JraW5nQ29weSAhPSBudWxsKSB7Ci0JCQl3b3JraW5nQ29weS5kZXN0cm95KCk7Ci0JCX0KLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoKLSAqIFJlbmFtZSBhIG5vbi1qYXZhIHByb2plY3QuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMzAyMjQgTm8gSmF2YUVsZW1lbnQgZGVsdGEgd2hlbiByZW5hbWluZyBub24tSmF2YSBwcm9qZWN0KQotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVuYW1lTm9uSmF2YVByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVQcm9qZWN0KCJQIik7Ci0JCXRoaXMuc3RhcnREZWx0YXMoKTsKLQkJdGhpcy5yZW5hbWVQcm9qZWN0KCJQIiwgIlAxIik7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIiwgCi0JCQkiUmVzb3VyY2VEZWx0YSgvUClcbiIgKyAKLQkJCSJSZXNvdXJjZURlbHRhKC9QMSkiCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAxIik7Ci0JfQotfQotLyoKLSAqIFJlbmFtZSBhbiBvdXRlciBwa2cgZnJhZ21lbnQuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMjQ2ODUgSW5uZXIgcGFja2FnZSBmcmFnbWVudHMgZ2V0cyBkZWxldGVkIC0gbW9kZWwgb3V0IG9mIHN5bmNoKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVuYW1lT3V0ZXJQa2dGcmFnbWVudCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsiIn0sICIiKTsKLQkJdGhpcy5jcmVhdGVGb2xkZXIoIlAveC95Iik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSJQL3gveS9YLmphdmEiLAotCQkJInBhY2thZ2UgeC55O1xuIiArCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkifSIpOwotCQl0aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCUlQYWNrYWdlRnJhZ21lbnQgcGtnID0gZ2V0UGFja2FnZUZyYWdtZW50KCJQIiwgIiIsICJ4Iik7Ci0JCXBrZy5yZW5hbWUoInoiLCBmYWxzZSwgbnVsbCk7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIiwgCi0JCQkiUFsqXToge0NISUxEUkVOfVxuIiArIAotCQkJIglbcHJvamVjdCByb290XVsqXToge0NISUxEUkVOfVxuIiArIAotCQkJIgkJelsrXToge30iCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IHNhdmluZyBhIHdvcmtpbmcgY29weSBkb2Vzbid0IGNoYW5nZSB0aGUgdW5kZXJseWluZyByZXNvdXJjZS4KLSAqIChvbmx5IGNvbW1pdCBzaG91bGQgZG8gc28pCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTYXZlV29ya2luZ0NvcHkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjb3B5ID0gbnVsbDsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsiIn0sICIiKTsKLQkJdGhpcy5jcmVhdGVGaWxlKCJQL1guamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkifSIpOwotCQlJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSB0aGlzLmdldENvbXBpbGF0aW9uVW5pdCgiUCIsICIiLCAiIiwgIlguamF2YSIpOwotCQljb3B5ID0gKElDb21waWxhdGlvblVuaXQpdW5pdC5nZXRXb3JraW5nQ29weShudWxsLCBudWxsLCBudWxsKTsKLQkJY29weS5nZXRUeXBlKCJYIikuY3JlYXRlTWV0aG9kKCJ2b2lkIGZvbygpIHt9IiwgbnVsbCwgdHJ1ZSwgbnVsbCk7Ci0JCXRoaXMuc3RhcnREZWx0YXMoKTsKLQkJY29weS5zYXZlKG51bGwsIHRydWUpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSBhZnRlciBzYXZpbmcgd29ya2luZyBjb3B5IiwgCi0JCQkiIgotCQkpOwotCQljb3B5LmNvbW1pdCh0cnVlLCBudWxsKTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEgYWZ0ZXIgY29tbWl0dGluZyB3b3JraW5nIGNvcHkiLCAKLQkJCSJQWypdOiB7Q0hJTERSRU59XG4iICsKLQkJCSIJW3Byb2plY3Qgcm9vdF1bKl06IHtDSElMRFJFTn1cbiIgKwotCQkJIgkJW2RlZmF1bHRdWypdOiB7Q0hJTERSRU59XG4iICsKLQkJCSIJCQlYLmphdmFbKl06IHtDSElMRFJFTiB8IEZJTkUgR1JBSU5FRH1cbiIgKwotCQkJIgkJCQlYWypdOiB7Q0hJTERSRU4gfCBGSU5FIEdSQUlORUR9XG4iICsKLQkJCSIJCQkJCWZvb1srXToge30iCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCWlmIChjb3B5ICE9IG51bGwpIGNvcHkuZGVzdHJveSgpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0KLQotCi0vKioKLSAqIEVuc3VyZSB0aGF0IGEgY2xhc3NwYXRoIGNoYW5nZSBpcyBkZXRlY3RlZCBldmVuIG9uIGEgcHJvamVjdCB3aGljaCBnb3QgY2xvc2VkCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTZXRDbGFzc3BhdGhPbkZyZXNoUHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZVByb2plY3QoIkxpYlByb2oiKTsKLQkJdGhpcy5jcmVhdGVGaWxlKCJMaWJQcm9qL215bGliLmphciIsICIiKTsKLQkJSmF2YVByb2plY3QgcDEgPSAoSmF2YVByb2plY3QpdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDEiLCBuZXcgU3RyaW5nW10geyIifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZvbGRlcigiUDEvc3JjMiIpOwotCi0JCXAxLmdldFByb2plY3QoKS5jbG9zZShudWxsKTsKLQkJcDEuZ2V0UHJvamVjdCgpLm9wZW4obnVsbCk7Ci0KLQkJdGhpcy5zdGFydERlbHRhcygpOwotCi0JCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCA9IAotCQkJbmV3IElDbGFzc3BhdGhFbnRyeVtdIHsKLQkJCQlKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShuZXcgUGF0aCgiL1AxL3NyYzIiKSksCi0JCQkJSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KG5ldyBQYXRoKCIvTGliUHJvai9teWxpYi5qYXIiKSwgbnVsbCwgbnVsbCkKLQkJCX07Ci0JCXAxLnNldFJhd0NsYXNzcGF0aChjbGFzc3BhdGgsIG51bGwpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiU2hvdWxkIG5vdGljZSBzcmMyIGFuZCBteUxpYiBhZGRpdGlvbnMgdG8gdGhlIGNsYXNzcGF0aCIsIAotCQkJIlAxWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCVtwcm9qZWN0IHJvb3RdWypdOiB7UkVNT1ZFRCBGUk9NIENMQVNTUEFUSH1cbiIgKyAKLQkJCSIJc3JjMlsqXToge0FEREVEIFRPIENMQVNTUEFUSH1cbiIgKyAKLQkJCSIJL0xpYlByb2ovbXlsaWIuamFyWypdOiB7QURERUQgVE8gQ0xBU1NQQVRIfVxuIiArIAotCQkJIglSZXNvdXJjZURlbHRhKC9QMS8uY2xhc3NwYXRoKVsqXSIpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAxIik7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiTGliUHJvaiIpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IHNldHRpbmcgYSBjbGFzc3BhdGggdmFyaWFibGUgd2hlbiB0aGVyZSBpcyBleGFjdGx5IG9uZSBwcm9qZWN0Ci0gKiB0cmlnZ2VycyBhIGphdmEgZWxlbWVudCBkZWx0YS4KLSAqLwotcHVibGljIHZvaWQgdGVzdFNldENsYXNzcGF0aFZhcmlhYmxlMSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZVByb2plY3QoIkxpYlByb2oiKTsKLQkJdGhpcy5jcmVhdGVGaWxlKCJMaWJQcm9qL215bGliLmphciIsICIiKTsKLQkJdGhpcy5jcmVhdGVGaWxlKCJMaWJQcm9qL290aGVybGliLmphciIsICIiKTsKLQkJSmF2YUNvcmUuc2V0Q2xhc3NwYXRoVmFyaWFibGVzKG5ldyBTdHJpbmdbXSB7IkxJQiJ9LCBuZXcgSVBhdGhbXSB7bmV3IFBhdGgoIi9MaWJQcm9qL215bGliLmphciIpfSwgbnVsbCk7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyIifSwgbmV3IFN0cmluZ1tdIHsiTElCIn0sICIiKTsKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQlKYXZhQ29yZS5zZXRDbGFzc3BhdGhWYXJpYWJsZXMobmV3IFN0cmluZ1tdIHsiTElCIn0sIG5ldyBJUGF0aFtdIHtuZXcgUGF0aCgiL0xpYlByb2ovb3RoZXJsaWIuamFyIil9LCBudWxsKTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEgYWZ0ZXIgc2V0dGluZyBjbGFzc3BhdGggdmFyaWFibGUiLCAKLQkJCSJQWypdOiB7Q0hJTERSRU59XG4iICsKLQkJCSIJL0xpYlByb2ovbXlsaWIuamFyWypdOiB7UkVNT1ZFRCBGUk9NIENMQVNTUEFUSH1cbiIgKwotCQkJIgkvTGliUHJvai9vdGhlcmxpYi5qYXJbKl06IHtBRERFRCBUTyBDTEFTU1BBVEh9IgotCQkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJMaWJQcm9qIik7Ci0JfQotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgc2V0dGluZyBhIGNsYXNzcGF0aCB2YXJpYWJsZSB3aGVuIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHByb2plY3QKLSAqIHRyaWdnZXJzIGEgamF2YSBlbGVtZW50IGRlbHRhLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0U2V0Q2xhc3NwYXRoVmFyaWFibGUyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlUHJvamVjdCgiTGliUHJvaiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoIkxpYlByb2ovbXlsaWIuamFyIiwgIiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoIkxpYlByb2ovb3RoZXJsaWIuamFyIiwgIiIpOwotCQlKYXZhQ29yZS5zZXRDbGFzc3BhdGhWYXJpYWJsZXMobmV3IFN0cmluZ1tdIHsiTElCIn0sIG5ldyBJUGF0aFtdIHtuZXcgUGF0aCgiL0xpYlByb2ovbXlsaWIuamFyIil9LCBudWxsKTsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDEiLCBuZXcgU3RyaW5nW10geyIifSwgbmV3IFN0cmluZ1tdIHsiTElCIn0sICIiKTsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDIiLCBuZXcgU3RyaW5nW10geyIifSwgbmV3IFN0cmluZ1tdIHsiTElCIn0sICIiKTsKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQlKYXZhQ29yZS5zZXRDbGFzc3BhdGhWYXJpYWJsZXMobmV3IFN0cmluZ1tdIHsiTElCIn0sIG5ldyBJUGF0aFtdIHtuZXcgUGF0aCgiL0xpYlByb2ovb3RoZXJsaWIuamFyIil9LCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEgYWZ0ZXIgc2V0dGluZyBjbGFzc3BhdGggdmFyaWFibGUiLCAKLQkJCSJQMVsqXToge0NISUxEUkVOfVxuIiArCi0JCQkiCS9MaWJQcm9qL215bGliLmphclsqXToge1JFTU9WRUQgRlJPTSBDTEFTU1BBVEh9XG4iICsKLQkJCSIJL0xpYlByb2ovb3RoZXJsaWIuamFyWypdOiB7QURERUQgVE8gQ0xBU1NQQVRIfVxuIiArIAotCQkJIlAyWypdOiB7Q0hJTERSRU59XG4iICsKLQkJCSIJL0xpYlByb2ovbXlsaWIuamFyWypdOiB7UkVNT1ZFRCBGUk9NIENMQVNTUEFUSH1cbiIgKwotCQkJIgkvTGliUHJvai9vdGhlcmxpYi5qYXJbKl06IHtBRERFRCBUTyBDTEFTU1BBVEh9IiwgCi0JCQl0aGlzLmdldFNvcnRlZEJ5UHJvamVjdERlbHRhcygpKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLnN0b3BEZWx0YXMoKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMSIpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAyIik7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiTGliUHJvaiIpOwotCX0KLX0KLQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgY29tbWl0dGluZyBhIHdvcmtpbmcgY29weSBmaXJlcyBhIGZpbmUgZ3JhaW5lZCBkZWx0YS4KLSAqLwotcHVibGljIHZvaWQgdGVzdFdvcmtpbmdDb3B5Q29tbWl0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyIifSwgIiIpOwotCQl0aGlzLmNyZWF0ZUZvbGRlcigiUC94L3kiKTsKLQkJdGhpcy5jcmVhdGVGaWxlKCJQL3gveS9BLmphdmEiLCAKLQkJCSJwYWNrYWdlIHgueTtcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkJIn0iKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuZ2V0Q29tcGlsYXRpb25Vbml0KCJQL3gveS9BLmphdmEiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjb3B5ID0gKElDb21waWxhdGlvblVuaXQpIGN1LmdldFdvcmtpbmdDb3B5KCk7Ci0JCWNvcHkuZ2V0QnVmZmVyKCkuc2V0Q29udGVudHMoCi0JCQkicGFja2FnZSB4Lnk7XG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJCSIgIHB1YmxpYyB2b2lkIGZvbygpIHtcbiIgKwotCQkJIiAgfVxuIiArCi0JCQkifSIpOwotCQljb3B5LnNhdmUobnVsbCwgZmFsc2UpOwotCQl0aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCWNvcHkuY29tbWl0KHRydWUsIG51bGwpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSBhZnRlciBjb21taXQiLCAKLQkJCSJQWypdOiB7Q0hJTERSRU59XG4iICsKLQkJCSIJW3Byb2plY3Qgcm9vdF1bKl06IHtDSElMRFJFTn1cbiIgKwotCQkJIgkJeC55WypdOiB7Q0hJTERSRU59XG4iICsKLQkJCSIJCQlBLmphdmFbKl06IHtDSElMRFJFTiB8IEZJTkUgR1JBSU5FRH1cbiIgKwotCQkJIgkJCQlBWypdOiB7Q0hJTERSRU4gfCBGSU5FIEdSQUlORUR9XG4iICsKLQkJCSIJCQkJCWZvb1srXToge30iCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLX0KLQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0phdmFNb2RlbFRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvSmF2YU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgxYmI5NC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvSmF2YU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLS8qKgotICogVGVzdHMgSUphdmFNb2RlbCBBUEkuCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhTW9kZWxUZXN0cyBleHRlbmRzIE1vZGlmeWluZ1Jlc291cmNlVGVzdHMgewotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JcmV0dXJuIG5ldyBTdWl0ZShKYXZhTW9kZWxUZXN0cy5jbGFzcyk7Ci19Ci1wdWJsaWMgSmF2YU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXByb3RlY3RlZCBpbnQgaW5kZXhPZihTdHJpbmcgcHJvamVjdE5hbWUsIElKYXZhUHJvamVjdFtdIHByb2plY3RzKSB7Ci0JZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHByb2plY3RzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCWlmIChwcm9qZWN0c1tpXS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhwcm9qZWN0TmFtZSkpIHsKLQkJCXJldHVybiBpOwotCQl9Ci0JfQotCXJldHVybiAtMTsKLX0KLS8qCi0gKiBFbnN1cmUgdGhhdCBhIGphdmEgcHJvamVjdCBpcyBub3QgYWRkZWQgdG8gdGhlIGxpc3Qgb2Yga25vd24gamF2YSBwcm9qZWN0Ci0gKiB3aGVuIGEgZmlsZSBpcyBhZGRlZCB0byBhIG5vbi1qYXZhIHByb2plY3QuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMTg2OTggU2VlaW5nIG5vbi1qYXZhIHByb2plY3RzIGluIHBhY2thZ2UgdmlldykKLSAqLwotcHVibGljIHZvaWQgdGVzdEFkZEZpbGVUb05vbkphdmFQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUlKYXZhTW9kZWwgbW9kZWwgPSB0aGlzLmdldEphdmFNb2RlbCgpOwotCUlKYXZhUHJvamVjdFtdIHByb2plY3RzID0gbW9kZWwuZ2V0SmF2YVByb2plY3RzKCk7Ci0JYXNzZXJ0VHJ1ZSgKLQkJIlByb2plY3QgUCBzaG91bGQgbm90IGJlIHByZXNlbnQgYWxyZWFkeSIsCi0JCXRoaXMuaW5kZXhPZigiUCIsIHByb2plY3RzKSA9PSAtMQotCSk7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVQcm9qZWN0KCJQIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgiL1AvdG90by50eHQiLCAiIik7Ci0JCXByb2plY3RzID0gbW9kZWwuZ2V0SmF2YVByb2plY3RzKCk7Ci0JCWFzc2VydFRydWUoCi0JCQkiUHJvamVjdCBQIHNob3VsZCBub3QgYmUgcHJlc2VudCIsCi0JCQl0aGlzLmluZGV4T2YoIlAiLCBwcm9qZWN0cykgPT0gLTEKLQkJKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0vKgotICogRW5zdXJlIHRoYXQgYSByZXNvdXJjZSBiZWxvbmdpbmcgdG8gdGhlIEphdmEgbW9kZWwgaXMga25vd24gdG8gYmUgY29udGFpbmVkIGluIHRoZSBKYXZhIG1vZGVsLgotICogQ2FzZSBvZiBub24tYWNjZXNzaWJsZSByZXNvdXJjZXMKLSAqLwotcHVibGljIHZvaWQgdGVzdENvbnRhaW5zMSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyIifSwgIiIpOwotCi0JCS8vIC5qYXZhIGZpbGUKLQkJSUZpbGUgZmlsZSA9IHRoaXMuZ2V0RmlsZSgiL1AvWC5qYXZhIik7Ci0JCWFzc2VydFRydWUoIi9QL1guamF2YSBzaG91bGQgYmUgaW4gbW9kZWwiLCBnZXRKYXZhTW9kZWwoKS5jb250YWlucyhmaWxlKSk7Ci0KLQkJLy8gLmNsYXNzIGZpbGUKLQkJZmlsZSA9IHRoaXMuZ2V0RmlsZSgiL1AvWC5jbGFzcyIpOwotCQlhc3NlcnRUcnVlKCIvUC9YLmNsYXNzIHNob3VsZCBub3QgYmUgaW4gbW9kZWwiLCAhZ2V0SmF2YU1vZGVsKCkuY29udGFpbnMoZmlsZSkpOwotCi0JCS8vIG5vbi1KYXZhIHJlc291cmNlCi0JCWZpbGUgPSB0aGlzLmdldEZpbGUoIi9QL3JlYWQudHh0Iik7Ci0JCWFzc2VydFRydWUoIi9QL3JlYWQudHh0IHNob3VsZCBiZSBpbiBtb2RlbCIsIGdldEphdmFNb2RlbCgpLmNvbnRhaW5zKGZpbGUpKTsKLQotCQkvLyBwYWNrYWdlCi0JCUlGb2xkZXIgZm9sZGVyID0gdGhpcy5nZXRGb2xkZXIoIi9QL3AiKTsKLQkJYXNzZXJ0VHJ1ZSgiL1AvcCBzaG91bGQgYmUgaW4gbW9kZWwiLCBnZXRKYXZhTW9kZWwoKS5jb250YWlucyhmb2xkZXIpKTsKLQkJCi0JCS8vIHJlc291cmNlIGluIGNsb3NlZCBwcm9qZWN0Ci0JCWZpbGUgPSB0aGlzLmNyZWF0ZUZpbGUoIi9QL1guamF2YSIsICIiKTsKLQkJcHJvamVjdC5nZXRQcm9qZWN0KCkuY2xvc2UobnVsbCk7Ci0JCWFzc2VydFRydWUoIi9QL1guamF2YSBzaG91bGQgYmUgaW4gbW9kZWwgKGV2ZW4gaWYgcHJvamVjdCBpcyBjbG9zZWQpIiwgZ2V0SmF2YU1vZGVsKCkuY29udGFpbnMoZmlsZSkpOwotCQkKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0vKgotICogRW5zdXJlIHRoYXQgYSByZXNvdXJjZSBiZWxvbmdpbmcgdG8gdGhlIEphdmEgbW9kZWwgaXMga25vd24gdG8gYmUgY29udGFpbmVkIGluIHRoZSBKYXZhIG1vZGVsLgotICogQ2FzZSBvZiBwcm9qZWN0cwotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnMyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCS8vIEphdmEgcHJvamVjdAotCQlJUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDEiLCBuZXcgU3RyaW5nW10geyIifSwgIiIpLmdldFByb2plY3QoKTsKLQkJYXNzZXJ0VHJ1ZSgiL1AxIHNob3VsZCBiZSBpbiBtb2RlbCIsIGdldEphdmFNb2RlbCgpLmNvbnRhaW5zKHByb2plY3QpKTsKLQotCQkvLyBub24tSmF2YSBwcm9qZWN0Ci0JCXByb2plY3QgPSB0aGlzLmNyZWF0ZVByb2plY3QoIlAyIik7Ci0JCWFzc2VydFRydWUoIi9QMiBzaG91bGQgYmUgaW4gbW9kZWwiLCBnZXRKYXZhTW9kZWwoKS5jb250YWlucyhwcm9qZWN0KSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMSIpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAyIik7Ci0JfQotfQotLyoKLSAqIEVuc3VyZSB0aGF0IGEgcmVzb3VyY2UgYmVsb25naW5nIHRvIHRoZSBKYXZhIG1vZGVsIGlzIGtub3duIHRvIGJlIGNvbnRhaW5lZCBpbiB0aGUgSmF2YSBtb2RlbC4KLSAqIENhc2Ugb2YgcHJqPXNyYz1iaW4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvbnRhaW5zMygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsiIn0sICIiKTsKLQotCQkvLyAuamF2YSBmaWxlCi0JCUlGaWxlIGZpbGUgPSB0aGlzLmNyZWF0ZUZpbGUoIi9QL1guamF2YSIsICIiKTsKLQkJYXNzZXJ0VHJ1ZSgiL1AvWC5qYXZhIHNob3VsZCBiZSBpbiBtb2RlbCIsIGdldEphdmFNb2RlbCgpLmNvbnRhaW5zKGZpbGUpKTsKLQotCQkvLyAuY2xhc3MgZmlsZQotCQlmaWxlID0gdGhpcy5jcmVhdGVGaWxlKCIvUC9YLmNsYXNzIiwgIiIpOwotCQlhc3NlcnRUcnVlKCIvUC9YLmNsYXNzIHNob3VsZCBub3QgYmUgaW4gbW9kZWwiLCAhZ2V0SmF2YU1vZGVsKCkuY29udGFpbnMoZmlsZSkpOwotCi0JCS8vIG5vbi1KYXZhIHJlc291cmNlCi0JCWZpbGUgPSB0aGlzLmNyZWF0ZUZpbGUoIi9QL3JlYWQudHh0IiwgIiIpOwotCQlhc3NlcnRUcnVlKCIvUC9yZWFkLnR4dCBzaG91bGQgYmUgaW4gbW9kZWwiLCBnZXRKYXZhTW9kZWwoKS5jb250YWlucyhmaWxlKSk7Ci0KLQkJLy8gcGFja2FnZQotCQlJRm9sZGVyIGZvbGRlciA9IHRoaXMuY3JlYXRlRm9sZGVyKCIvUC9wIik7Ci0JCWFzc2VydFRydWUoIi9QL3Agc2hvdWxkIGJlIGluIG1vZGVsIiwgZ2V0SmF2YU1vZGVsKCkuY29udGFpbnMoZm9sZGVyKSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoKLSAqIEVuc3VyZSB0aGF0IGEgcmVzb3VyY2UgYmVsb25naW5nIHRvIHRoZSBKYXZhIG1vZGVsIGlzIGtub3duIHRvIGJlIGNvbnRhaW5lZCBpbiB0aGUgSmF2YSBtb2RlbC4KLSAqIENhc2Ugb2YgZW1wdHkgY2xhc3NwYXRoLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnM0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10ge30sICJiaW4iKTsKLQotCQkvLyAuamF2YSBmaWxlCi0JCUlGaWxlIGZpbGUgPSB0aGlzLmNyZWF0ZUZpbGUoIi9QL1guamF2YSIsICIiKTsKLQkJYXNzZXJ0VHJ1ZSgiL1AvWC5qYXZhIHNob3VsZCBiZSBpbiBtb2RlbCIsIGdldEphdmFNb2RlbCgpLmNvbnRhaW5zKGZpbGUpKTsKLQkJCi0JCS8vIC5jbGFzcyBmaWxlCi0JCWZpbGUgPSB0aGlzLmNyZWF0ZUZpbGUoIi9QL1guY2xhc3MiLCAiIik7Ci0JCWFzc2VydFRydWUoIi9QL1guY2xhc3Mgc2hvdWxkIGJlIGluIG1vZGVsIiwgZ2V0SmF2YU1vZGVsKCkuY29udGFpbnMoZmlsZSkpOwotCi0JCS8vIG5vbi1KYXZhIHJlc291cmNlIGZpbGUKLQkJZmlsZSA9IHRoaXMuY3JlYXRlRmlsZSgiL1AvcmVhZC50eHQiLCAiIik7Ci0JCWFzc2VydFRydWUoIi9QL3JlYWQudHh0IHNob3VsZCBiZSBpbiBtb2RlbCIsIGdldEphdmFNb2RlbCgpLmNvbnRhaW5zKGZpbGUpKTsKLQotCQkvLyBub24tSmF2YSByZXNvdXJjZSBmb2xkZXIKLQkJSUZvbGRlciBmb2xkZXIgPSB0aGlzLmNyZWF0ZUZvbGRlcigiL1AvcCIpOwotCQlhc3NlcnRUcnVlKCIvUC9wIHNob3VsZCBiZSBpbiBtb2RlbCIsIGdldEphdmFNb2RlbCgpLmNvbnRhaW5zKGZvbGRlcikpOwotCQkKLQkJLy8gYmluIGZvbGRlcgotCQlmb2xkZXIgPSB0aGlzLmdldEZvbGRlcigiL1AvYmluIik7Ci0JCWFzc2VydFRydWUoIi9QL2JpbiBzaG91bGQgbm90IGJlIGluIG1vZGVsIiwgIWdldEphdmFNb2RlbCgpLmNvbnRhaW5zKGZvbGRlcikpOwotCQkKLQkJLy8gY2xhc3NmaWxlIGluIGJpbiBmb2xkZXIKLQkJZmlsZSA9IHRoaXMuY3JlYXRlRmlsZSgiL1AvYmluL1guY2xhc3MiLCAiIik7Ci0JCWFzc2VydFRydWUoIi9QL2Jpbi9YLmNsYXNzIHNob3VsZCBub3QgYmUgaW4gbW9kZWwiLCAhZ2V0SmF2YU1vZGVsKCkuY29udGFpbnMoZmlsZSkpOwotCQkKLQkJLy8gcmVzb3VyY2UgZmlsZSBpbiBiaW4gZm9sZGVyCi0JCXRoaXMuY3JlYXRlRm9sZGVyKCIvUC9iaW4vaW1hZ2UiKTsKLQkJZmlsZSA9IHRoaXMuY3JlYXRlRmlsZSgiL1AvYmluL2ltYWdlL29rLmdpZiIsICIiKTsKLQkJYXNzZXJ0VHJ1ZSgiL1AvYmluL2ltYWdlL29rLmdpZiBzaG91bGQgbm90IGJlIGluIG1vZGVsIiwgIWdldEphdmFNb2RlbCgpLmNvbnRhaW5zKGZpbGUpKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0vKgotICogRW5zdXJlIHRoYXQgYSByZXNvdXJjZSBiZWxvbmdpbmcgdG8gdGhlIEphdmEgbW9kZWwgaXMga25vd24gdG8gYmUgY29udGFpbmVkIGluIHRoZSBKYXZhIG1vZGVsLgotICogQ2FzZSBvZiBzcmMgIT0gYmluCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb250YWluczUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0KLQkJLy8gLmphdmEgZmlsZQotCQlJRmlsZSBmaWxlID0gdGhpcy5jcmVhdGVGaWxlKCIvUC9zcmMvWC5qYXZhIiwgIiIpOwotCQlhc3NlcnRUcnVlKCIvUC9zcmMvWC5qYXZhIHNob3VsZCBiZSBpbiBtb2RlbCIsIGdldEphdmFNb2RlbCgpLmNvbnRhaW5zKGZpbGUpKTsKLQotCQkvLyByZXNvdXJjZSBmaWxlIGluIHNyYwotCQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjL2ltYWdlIik7Ci0JCWZpbGUgPSB0aGlzLmNyZWF0ZUZpbGUoIi9QL3NyYy9pbWFnZS9vay5naWYiLCAiIik7Ci0JCWFzc2VydFRydWUoIi9QL3NyYy9pbWFnZS9vay5naWYgc2hvdWxkIG5vdCBiZSBpbiBtb2RlbCIsIGdldEphdmFNb2RlbCgpLmNvbnRhaW5zKGZpbGUpKTsKLQkJCi0JCS8vIC5jbGFzcyBmaWxlIGluIGJpbgotCQlmaWxlID0gdGhpcy5jcmVhdGVGaWxlKCIvUC9iaW4vWC5jbGFzcyIsICIiKTsKLQkJYXNzZXJ0VHJ1ZSgiL1AvYmluL1guY2xhc3Mgc2hvdWxkIG5vdCBiZSBpbiBtb2RlbCIsICFnZXRKYXZhTW9kZWwoKS5jb250YWlucyhmaWxlKSk7Ci0KLQkJLy8gcmVzb3VyY2UgZmlsZSBpbiBiaW4KLQkJdGhpcy5jcmVhdGVGb2xkZXIoIi9QL2Jpbi9pbWFnZSIpOwotCQlmaWxlID0gdGhpcy5jcmVhdGVGaWxlKCIvUC9iaW4vaW1hZ2Uvb2suZ2lmIiwgIiIpOwotCQlhc3NlcnRUcnVlKCIvUC9iaW4vaW1hZ2Uvb2suZ2lmIHNob3VsZCBub3QgYmUgaW4gbW9kZWwiLCAhZ2V0SmF2YU1vZGVsKCkuY29udGFpbnMoZmlsZSkpOwotCi0JCS8vIC5jbGFzcyBmaWxlIGluIHNyYwotCQlmaWxlID0gdGhpcy5jcmVhdGVGaWxlKCIvUC9zcmMvWC5jbGFzcyIsICIiKTsKLQkJYXNzZXJ0VHJ1ZSgiL1Avc3JjL1guY2xhc3Mgc2hvdWxkIG5vdCBiZSBpbiBtb2RlbCIsICFnZXRKYXZhTW9kZWwoKS5jb250YWlucyhmaWxlKSk7Ci0KLQkJLy8gbm9uLUphdmEgcmVzb3VyY2UKLQkJZmlsZSA9IHRoaXMuY3JlYXRlRmlsZSgiL1Avc3JjL3JlYWQudHh0IiwgIiIpOwotCQlhc3NlcnRUcnVlKCIvUC9zcmMvcmVhZC50eHQgc2hvdWxkIGJlIGluIG1vZGVsIiwgZ2V0SmF2YU1vZGVsKCkuY29udGFpbnMoZmlsZSkpOwotCi0JCS8vIHBhY2thZ2UKLQkJSUZvbGRlciBmb2xkZXIgPSB0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjL3AiKTsKLQkJYXNzZXJ0VHJ1ZSgiL1Avc3JjL3Agc2hvdWxkIGJlIGluIG1vZGVsIiwgZ2V0SmF2YU1vZGVsKCkuY29udGFpbnMoZm9sZGVyKSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoKLSAqIEVuc3VyZSB0aGF0IGEgcmVzb3VyY2UgYmVsb25naW5nIHRvIHRoZSBKYXZhIG1vZGVsIGlzIGtub3duIHRvIGJlIGNvbnRhaW5lZCBpbiB0aGUgSmF2YSBtb2RlbC4KLSAqIENhc2Ugb2YgcHJqPT1zcmMgYW5kIHNlcGFyYXRlIGJpbgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnM2KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyIifSwgImJpbiIpOwotCi0JCS8vIC5qYXZhIGZpbGUKLQkJSUZpbGUgZmlsZSA9IHRoaXMuY3JlYXRlRmlsZSgiL1AvWC5qYXZhIiwgIiIpOwotCQlhc3NlcnRUcnVlKCIvUC9YLmphdmEgc2hvdWxkIGJlIGluIG1vZGVsIiwgZ2V0SmF2YU1vZGVsKCkuY29udGFpbnMoZmlsZSkpOwotCi0JCS8vIHJlc291cmNlIGZpbGUgaW4gc3JjCi0JCXRoaXMuY3JlYXRlRm9sZGVyKCIvUC9pbWFnZSIpOwotCQlmaWxlID0gdGhpcy5jcmVhdGVGaWxlKCIvUC9pbWFnZS9vay5naWYiLCAiIik7Ci0JCWFzc2VydFRydWUoIi9QL2ltYWdlL29rLmdpZiBzaG91bGQgbm90IGJlIGluIG1vZGVsIiwgZ2V0SmF2YU1vZGVsKCkuY29udGFpbnMoZmlsZSkpOwotCQkKLQkJLy8gLmNsYXNzIGZpbGUgaW4gYmluCi0JCWZpbGUgPSB0aGlzLmNyZWF0ZUZpbGUoIi9QL2Jpbi9YLmNsYXNzIiwgIiIpOwotCQlhc3NlcnRUcnVlKCIvUC9iaW4vWC5jbGFzcyBzaG91bGQgbm90IGJlIGluIG1vZGVsIiwgIWdldEphdmFNb2RlbCgpLmNvbnRhaW5zKGZpbGUpKTsKLQotCQkvLyByZXNvdXJjZSBmaWxlIGluIGJpbgotCQl0aGlzLmNyZWF0ZUZvbGRlcigiL1AvYmluL2ltYWdlIik7Ci0JCWZpbGUgPSB0aGlzLmNyZWF0ZUZpbGUoIi9QL2Jpbi9pbWFnZS9vay5naWYiLCAiIik7Ci0JCWFzc2VydFRydWUoIi9QL2Jpbi9pbWFnZS9vay5naWYgc2hvdWxkIG5vdCBiZSBpbiBtb2RlbCIsICFnZXRKYXZhTW9kZWwoKS5jb250YWlucyhmaWxlKSk7Ci0KLQkJLy8gLmNsYXNzIGZpbGUgaW4gc3JjCi0JCWZpbGUgPSB0aGlzLmNyZWF0ZUZpbGUoIi9QL1guY2xhc3MiLCAiIik7Ci0JCWFzc2VydFRydWUoIi9QL1guY2xhc3Mgc2hvdWxkIG5vdCBiZSBpbiBtb2RlbCIsICFnZXRKYXZhTW9kZWwoKS5jb250YWlucyhmaWxlKSk7Ci0KLQkJLy8gbm9uLUphdmEgcmVzb3VyY2UKLQkJZmlsZSA9IHRoaXMuY3JlYXRlRmlsZSgiL1AvcmVhZC50eHQiLCAiIik7Ci0JCWFzc2VydFRydWUoIi9QL3JlYWQudHh0IHNob3VsZCBiZSBpbiBtb2RlbCIsIGdldEphdmFNb2RlbCgpLmNvbnRhaW5zKGZpbGUpKTsKLQotCQkvLyBwYWNrYWdlCi0JCUlGb2xkZXIgZm9sZGVyID0gdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3AiKTsKLQkJYXNzZXJ0VHJ1ZSgiL1AvcCBzaG91bGQgYmUgaW4gbW9kZWwiLCBnZXRKYXZhTW9kZWwoKS5jb250YWlucyhmb2xkZXIpKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0KLS8qKgotICogVGVzdCB0aGF0IGEgbW9kZWwgaGFzIG5vIHByb2plY3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXRKYXZhUHJvamVjdCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlKYXZhTW9kZWwgbW9kZWw9IGdldEphdmFNb2RlbCgpOwotCWFzc2VydFRydWUoInByb2plY3Qgc2hvdWxkIGJlIG51bGwiLCBtb2RlbC5nZXRKYXZhUHJvamVjdCgpID09IG51bGwpOwotfQotLyoKLSAqIEVuc3VyZSB0aGF0IGEgamF2YSBwcm9qZWN0IHRoYXQgaXMgYWRkZWQgYXBwZWFycyBpbiB0aGUgbGlzdCBvZiBrbm93biBqYXZhIHByb2plY3QsCi0gKiBhbmQgdGhhdCBpdCBpcyByZW1vdmVkIGZyb20gdGhpcyBsaXN0IHdoZW4gZGVsZXRlZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdEdldEphdmFQcm9qZWN0czEoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUphdmFNb2RlbCBtb2RlbCA9IHRoaXMuZ2V0SmF2YU1vZGVsKCk7Ci0JSUphdmFQcm9qZWN0W10gcHJvamVjdHMgPSBtb2RlbC5nZXRKYXZhUHJvamVjdHMoKTsKLQlhc3NlcnRUcnVlKAotCQkiUHJvamVjdCBQIHNob3VsZCBub3QgYmUgcHJlc2VudCBhbHJlYWR5IiwKLQkJdGhpcy5pbmRleE9mKCJQIiwgcHJvamVjdHMpID09IC0xCi0JKTsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHt9LCAiIik7Ci0JCXByb2plY3RzID0gbW9kZWwuZ2V0SmF2YVByb2plY3RzKCk7Ci0JCWFzc2VydFRydWUoCi0JCQkiUHJvamVjdCBQIHNob3VsZCBiZSBwcmVzZW50IiwKLQkJCXRoaXMuaW5kZXhPZigiUCIsIHByb2plY3RzKSAhPSAtMQotCQkpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQkJcHJvamVjdHMgPSBtb2RlbC5nZXRKYXZhUHJvamVjdHMoKTsKLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJQcm9qZWN0IFAgc2hvdWxkIG5vdCBiZSBwcmVzZW50IGFueSBsb25nZXIiLAotCQkJdGhpcy5pbmRleE9mKCJQIiwgcHJvamVjdHMpID09IC0xCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoKLSAqIEVuc3VyZSB0aGF0IGEgbm9uLWphdmEgcHJvamVjdCB0aGF0IGlzIGFkZGVkIGRvZXMgbm90IGFwcGVhcnMgaW4gdGhlIGxpc3Qgb2Yga25vd24gamF2YSBwcm9qZWN0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0R2V0SmF2YVByb2plY3RzMigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlJSmF2YU1vZGVsIG1vZGVsID0gdGhpcy5nZXRKYXZhTW9kZWwoKTsKLQlJSmF2YVByb2plY3RbXSBwcm9qZWN0cyA9IG1vZGVsLmdldEphdmFQcm9qZWN0cygpOwotCWFzc2VydFRydWUoCi0JCSJQcm9qZWN0IFAgc2hvdWxkIG5vdCBiZSBwcmVzZW50IGFscmVhZHkiLAotCQl0aGlzLmluZGV4T2YoIlAiLCBwcm9qZWN0cykgPT0gLTEKLQkpOwotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlUHJvamVjdCgiUCIpOwotCQlwcm9qZWN0cyA9IG1vZGVsLmdldEphdmFQcm9qZWN0cygpOwotCQlhc3NlcnRUcnVlKAotCQkJIlByb2plY3QgUCBzaG91bGQgbm90IGJlIHByZXNlbnQiLAotCQkJdGhpcy5pbmRleE9mKCJQIiwgcHJvamVjdHMpID09IC0xCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoKLSAqIFRlc3QgcmV0cmlldmluZyBub24tSmF2YSBwcm9qZWN0cy4KLSAqLwotcHVibGljIHZvaWQgdGVzdEdldE5vbkphdmFSZXNvdXJjZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJSUphdmFNb2RlbCBtb2RlbCA9IHRoaXMuZ2V0SmF2YU1vZGVsKCk7Ci0KLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiSlAiLCBuZXcgU3RyaW5nW117fSwgIiIpOwotCQlhc3NlcnRSZXNvdXJjZXNFcXVhbCgKLQkJCSJVbmV4cGVjdGVkIG5vbi1KYXZhIHJlc291cmNlcyIsCi0JCQkiIiwKLQkJCW1vZGVsLmdldE5vbkphdmFSZXNvdXJjZXMoKSk7Ci0KLQkJdGhpcy5jcmVhdGVQcm9qZWN0KCJTUDEiKTsKLQkJYXNzZXJ0UmVzb3VyY2VzRXF1YWwoCi0JCQkiVW5leHBlY3RlZCBub24tSmF2YSByZXNvdXJjZXMgYWZ0ZXIgY3JlYXRpb24gb2YgU1AxIiwKLQkJCSJTUDEiLAotCQkJbW9kZWwuZ2V0Tm9uSmF2YVJlc291cmNlcygpKTsKLQkJCi0JCXRoaXMuY3JlYXRlUHJvamVjdCgiU1AyIik7Ci0JCWFzc2VydFJlc291cmNlc0VxdWFsKAotCQkJIlVuZXhwZWN0ZWQgbm9uLUphdmEgcmVzb3VyY2VzIGFmdGVyIGNyZWF0aW9uIG9mIFNQMiIsCi0JCQkiU1AxXG4iICsKLQkJCSJTUDIiLAotCQkJbW9kZWwuZ2V0Tm9uSmF2YVJlc291cmNlcygpKTsKLQotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlNQMSIpOwotCQlhc3NlcnRSZXNvdXJjZXNFcXVhbCgKLQkJCSJVbmV4cGVjdGVkIG5vbi1KYXZhIHJlc291cmNlcyBhZnRlciBkZWxldGlvbiBvZiBTUDEiLAotCQkJIlNQMiIsCi0JCQltb2RlbC5nZXROb25KYXZhUmVzb3VyY2VzKCkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiU1AxIik7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiU1AyIik7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiSlAiKTsKLQl9Ci19Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0phdmFQcm9qZWN0VGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9KYXZhUHJvamVjdFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NzM0YjQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0phdmFQcm9qZWN0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhUHJvamVjdFRlc3RzIGV4dGVuZHMgTW9kaWZ5aW5nUmVzb3VyY2VUZXN0cyB7Ci1wdWJsaWMgSmF2YVByb2plY3RUZXN0cyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHJvdGVjdGVkIHZvaWQgYXNzZXJ0UmVzb3VyY2VzKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZXhwZWN0ZWQsIElSZXNvdXJjZVtdIHJlc291cmNlcykgewotCS8vIHNvcnQgaW4gYWxwaGFiZXRpY2FsIG9yZGVyCi0JVXRpbC5Db21wYXJlciBjb21wYXJlciA9IG5ldyBVdGlsLkNvbXBhcmVyKCkgewotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2VBID0gKElSZXNvdXJjZSlhOwotCQkJSVJlc291cmNlIHJlc291cmNlQiA9IChJUmVzb3VyY2UpYjsKLQkJCXJldHVybiByZXNvdXJjZUEuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLmNvbXBhcmVUbyhyZXNvdXJjZUIuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJfQotCX07Ci0JVXRpbC5zb3J0KHJlc291cmNlcywgY29tcGFyZXIpOwotCQotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IHJlc291cmNlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQlidWZmZXIuYXBwZW5kKCgoSVJlc291cmNlKXJlc291cmNlc1tpXSkuZ2V0RnVsbFBhdGgoKSk7Ci0JCWlmIChpICE9IGxlbmd0aC0xKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCJcbiIpOwotCQl9Ci0JfQotCi0JU3RyaW5nIGFjdHVhbCA9IGJ1ZmZlci50b1N0cmluZygpOwotCWlmICghZXhwZWN0ZWQuZXF1YWxzKGFjdHVhbCkpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLnV0aWwuVXRpbC5kaXNwbGF5U3RyaW5nKGJ1ZmZlci50b1N0cmluZygpLCAyKSk7Ci0JfQotCQotCWFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkKLQlpZiAoZmFsc2UpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFN1aXRlKEphdmFQcm9qZWN0VGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgSmF2YVByb2plY3RUZXN0cygidGVzdFBhY2thZ2VGcmFnbWVudFJvb3RSYXdFbnRyeVdoZW5EdXBsaWNhdGUiKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFN1aXRlKEphdmFQcm9qZWN0VGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhUHJvamVjdFRlc3RzKCJ0ZXN0UGFja2FnZUZyYWdtZW50Um9vdFJhd0VudHJ5IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFQcm9qZWN0VGVzdHMoInRlc3RQYWNrYWdlRnJhZ21lbnRSb290UmF3RW50cnlXaGVuRHVwbGljYXRlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFQcm9qZWN0VGVzdHMoInRlc3RQcm9qZWN0R2V0Q2hpbGRyZW4iKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVByb2plY3RUZXN0cygidGVzdFByb2plY3RHZXRQYWNrYWdlRnJhZ21lbnRzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFQcm9qZWN0VGVzdHMoInRlc3RSb290R2V0UGFja2FnZUZyYWdtZW50cyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhUHJvamVjdFRlc3RzKCJ0ZXN0Um9vdEdldFBhY2thZ2VGcmFnbWVudHMyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFQcm9qZWN0VGVzdHMoInRlc3RJbnRlcm5hbEFyY2hpdmVDb3JyZXNwb25kaW5nUmVzb3VyY2UiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVByb2plY3RUZXN0cygidGVzdEV4dGVybmFsQXJjaGl2ZUNvcnJlc3BvbmRpbmdSZXNvdXJjZSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhUHJvamVjdFRlc3RzKCJ0ZXN0UHJvamVjdENvcnJlc3BvbmRpbmdSZXNvdXJjZSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhUHJvamVjdFRlc3RzKCJ0ZXN0UGFja2FnZUZyYWdtZW50Q29ycmVzcG9uZGluZ1Jlc291cmNlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFQcm9qZWN0VGVzdHMoInRlc3RQYWNrYWdlRnJhZ21lbnRIYXNTdWJwYWNrYWdlcyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhUHJvamVjdFRlc3RzKCJ0ZXN0SXNEZWZhdWx0UGFja2FnZSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhUHJvamVjdFRlc3RzKCJ0ZXN0UGFja2FnZUZyYWdtZW50Um9vdENvcnJlc3BvbmRpbmdSZXNvdXJjZSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhUHJvamVjdFRlc3RzKCJ0ZXN0SmFyUGFja2FnZUZyYWdtZW50Q29ycmVzcG9uZGluZ1Jlc291cmNlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFQcm9qZWN0VGVzdHMoInRlc3RDb21waWxhdGlvblVuaXRDb3JyZXNwb25kaW5nUmVzb3VyY2UiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVByb2plY3RUZXN0cygidGVzdENsYXNzRmlsZUNvcnJlc3BvbmRpbmdSZXNvdXJjZSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhUHJvamVjdFRlc3RzKCJ0ZXN0QXJjaGl2ZUNsYXNzRmlsZUNvcnJlc3BvbmRpbmdSZXNvdXJjZSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhUHJvamVjdFRlc3RzKCJ0ZXN0QmluYXJ5VHlwZUNvcnJlc3BvbmRpbmdSZXNvdXJjZSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhUHJvamVjdFRlc3RzKCJ0ZXN0U291cmNlTWV0aG9kQ29ycmVzcG9uZGluZ1Jlc291cmNlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFQcm9qZWN0VGVzdHMoInRlc3RPdXRwdXRMb2NhdGlvbk5vdEFkZGVkQXNQYWNrYWdlRnJhZ21lbnQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVByb2plY3RUZXN0cygidGVzdE91dHB1dExvY2F0aW9uTmVzdGVkSW5Sb290IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFQcm9qZWN0VGVzdHMoInRlc3RDaGFuZ2VPdXRwdXRMb2NhdGlvbiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhUHJvamVjdFRlc3RzKCJ0ZXN0RmluZEVsZW1lbnRQYWNrYWdlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFQcm9qZWN0VGVzdHMoInRlc3RGaW5kRWxlbWVudENsYXNzRmlsZSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhUHJvamVjdFRlc3RzKCJ0ZXN0RmluZEVsZW1lbnRDb21waWxhdGlvblVuaXQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVByb2plY3RUZXN0cygidGVzdEZpbmRFbGVtZW50Q29tcGlsYXRpb25Vbml0RGVmYXVsdFBhY2thZ2UiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVByb2plY3RUZXN0cygidGVzdEZpbmRFbGVtZW50SW52YWxpZFBhdGgiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVByb2plY3RUZXN0cygidGVzdEZpbmRFbGVtZW50UHJlcmVxU2ltcGxlUHJvamVjdCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhUHJvamVjdFRlc3RzKCJ0ZXN0UHJvamVjdENsb3NlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFQcm9qZWN0VGVzdHMoInRlc3RQYWNrYWdlRnJhZ21lbnRSZW5hbWVBbmRDcmVhdGUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVByb2plY3RUZXN0cygidGVzdEZvbGRlcldpdGhEb3ROYW1lIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFQcm9qZWN0VGVzdHMoInRlc3RQYWNrYWdlRnJhZ21lbnROb25KYXZhUmVzb3VyY2VzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFQcm9qZWN0VGVzdHMoInRlc3RQYWNrYWdlRnJhZ21lbnRSb290Tm9uSmF2YVJlc291cmNlcyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhUHJvamVjdFRlc3RzKCJ0ZXN0QWRkTm9uSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhUHJvamVjdFRlc3RzKCJ0ZXN0RmluZFBhY2thZ2VGcmFnbWVudFJvb3RGcm9tQ2xhc3NwYXRoRW50cnkiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVByb2plY3RUZXN0cygidGVzdEdldENsYXNzcGF0aE9uQ2xvc2VkUHJvamVjdCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhUHJvamVjdFRlc3RzKCJ0ZXN0R2V0UmVxdWlyZWRQcm9qZWN0TmFtZXMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVByb2plY3RUZXN0cygidGVzdEdldE5vbkphdmFSZXNvdXJjZXMxIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFQcm9qZWN0VGVzdHMoInRlc3RHZXROb25KYXZhUmVzb3VyY2VzMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhUHJvamVjdFRlc3RzKCJ0ZXN0R2V0Tm9uSmF2YVJlc291cmNlczMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVByb2plY3RUZXN0cygidGVzdEdldE5vbkphdmFSZXNvdXJjZXM0IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFQcm9qZWN0VGVzdHMoInRlc3RTb3VyY2VGb2xkZXJXaXRoSmFyTmFtZSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhUHJvamVjdFRlc3RzKCJ0ZXN0SmRrTGV2ZWxSb290IikpOwotCQotCS8vIFRoZSBmb2xsb3dpbmcgdGVzdCBtdXN0IGJlIGF0IHRoZSBlbmQgYXMgaXQgZGVsZXRlcyBhIHBhY2thZ2UgYW5kIHRoaXMgd291bGQgaGF2ZSBzaWRlIGVmZmVjdHMKLQkvLyBvbiBvdGhlciB0ZXN0cwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFQcm9qZWN0VGVzdHMoInRlc3REZWxldGVQYWNrYWdlV2l0aEF1dG9idWlsZCIpKTsKLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgdm9pZCBzZXRVcFN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0Jc3VwZXIuc2V0VXBTdWl0ZSgpOwotCXNldFVwSmF2YVByb2plY3QoIkphdmFQcm9qZWN0VGVzdHMiKTsKLQlzZXRVcEphdmFQcm9qZWN0KCJKYXZhUHJvamVjdFNyY1Rlc3RzIik7Ci0Jc2V0VXBKYXZhUHJvamVjdCgiSmF2YVByb2plY3RMaWJUZXN0cyIpOwotfQotcHVibGljIHZvaWQgdGVhckRvd25TdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCWRlbGV0ZVByb2plY3QoIkphdmFQcm9qZWN0VGVzdHMiKTsKLQlkZWxldGVQcm9qZWN0KCJKYXZhUHJvamVjdFNyY1Rlc3RzIik7Ci0JZGVsZXRlUHJvamVjdCgiSmF2YVByb2plY3RMaWJUZXN0cyIpOwotCXN1cGVyLnRlYXJEb3duU3VpdGUoKTsKLX0KLQotCi0vKioKLSAqIFRlc3QgYWRkaW5nIGEgbm9uLWphdmEgcmVzb3VyY2UgaW4gYSBwYWNrYWdlIGZyYWdtZW50IHJvb3QgdGhhdCBjb3JyZXNwb25kIHRvCi0gKiB0aGUgcHJvamVjdC4KLSAqIChSZWdyZXNzaW9uIHRlc3QgZm9yIFBSICMxRzU4TkI4KQotICovCi1wdWJsaWMgdm9pZCB0ZXN0QWRkTm9uSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCS8vIGdldCByZXNvdXJjZXMgb2Ygc291cmNlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBhdCBwcm9qZWN0IGxldmVsCi0JSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoIkphdmFQcm9qZWN0VGVzdHMiLCAiIik7Ci0JT2JqZWN0W10gcmVzb3VyY2VzID0gcm9vdC5nZXROb25KYXZhUmVzb3VyY2VzKCk7Ci0JYXNzZXJ0RXF1YWxzKCJpbmNvcnJlY3QgbnVtYmVyIG9mIG5vbiBqYXZhIHJlc291cmNlcyIsIDIsIHJlc291cmNlcy5sZW5ndGgpOyAvLyAuY2xhc3NwYXRoIGFuZCAucHJvamVjdCBmaWxlcwotCWFzc2VydFRydWUoInJlc291cmNlIHNob3VsZCBiZSBhbiBJRmlsZSIsICByZXNvdXJjZXNbMF0gaW5zdGFuY2VvZiBJRmlsZSk7Ci0JSUZpbGUgcmVzb3VyY2UgPSAoSUZpbGUpcmVzb3VyY2VzWzBdOwotCUlQYXRoIG5ld1BhdGggPSByb290LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkuYXBwZW5kKCJUZXN0Tm9uSmF2YVJlc291cmNlLmFiYyIpOwotCXRyeSB7Ci0JCS8vIGNvcHkgYW5kIHJlbmFtZSByZXNvdXJjZQotCQlyZXNvdXJjZS5jb3B5KAotCQkJbmV3UGF0aCwgCi0JCQl0cnVlLCAKLQkJCW51bGwpOwotCQkKLQkJLy8gZW5zdXJlIHRoZSBuZXcgcmVzb3VyY2UgaXMgcHJlc2VudAotCQlyZXNvdXJjZXMgPSByb290LmdldE5vbkphdmFSZXNvdXJjZXMoKTsKLQkJYXNzZXJ0UmVzb3VyY2VzKAotCQkJImluY29ycmVjdCBub24gamF2YSByZXNvdXJjZXMiLCAKLQkJCSIvSmF2YVByb2plY3RUZXN0cy8uY2xhc3NwYXRoXG4iICsKLQkJCSIvSmF2YVByb2plY3RUZXN0cy8ucHJvamVjdFxuIiArCi0JCQkiL0phdmFQcm9qZWN0VGVzdHMvVGVzdE5vbkphdmFSZXNvdXJjZS5hYmMiLAotCQkJKElSZXNvdXJjZVtdKXJlc291cmNlcyk7Ci0JfSBmaW5hbGx5IHsKLQkJLy8gY2xlYW4gdXAKLQkJZGVsZXRlUmVzb3VyY2UocmVzb3VyY2UuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3UGF0aCkpOwotCX0KLX0KLS8qKgotICogVGVzdCB0aGF0IGEgY2xhc3MgZmlsZSBpbiBhIGphciBoYXMgbm8gY29ycmVzcG9uZGluZyByZXNvdXJjZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdEFyY2hpdmVDbGFzc0ZpbGVDb3JyZXNwb25kaW5nUmVzb3VyY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgiSmF2YVByb2plY3RUZXN0cyIsICJsaWIuamFyIik7Ci0JSVBhY2thZ2VGcmFnbWVudCBlbGVtZW50ID0gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoInAiKTsKLQlJQ2xhc3NGaWxlIGNmPSBlbGVtZW50LmdldENsYXNzRmlsZSgiWC5jbGFzcyIpOwotCUlSZXNvdXJjZSBjb3JyID0gY2YuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7Ci0JYXNzZXJ0VHJ1ZSgiaW5jb3JyZWN0IGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UiLCBjb3JyID09IG51bGwpOwotfQotLyoqCi0gKiBUZXN0IHRoYXQgYSBiaW5hcnkgdHlwZQotICogaGFzIGEgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdEJpbmFyeVR5cGVDb3JyZXNwb25kaW5nUmVzb3VyY2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUNsYXNzRmlsZSBlbGVtZW50PSBnZXRDbGFzc0ZpbGUoIi9KYXZhUHJvamVjdExpYlRlc3RzL2xpYi9wL1kuY2xhc3MiKTsKLQlJVHlwZSB0eXBlPSBlbGVtZW50LmdldFR5cGUoKTsKLQlJUmVzb3VyY2UgY29ycj0gdHlwZS5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKLQlhc3NlcnRUcnVlKCJpbmNvcnJlY3QgY29ycmVzcG9uZGluZyByZXNvdXJjZSIsIGNvcnIgPT0gbnVsbCk7Ci19Ci0vKioKLSAqIFdoZW4gdGhlIG91dHB1dCBsb2NhdGlvbiBpcyBjaGFuZ2VkLCBwYWNrYWdlIGZyYWdtZW50cyBjYW4gYmUgYWRkZWQvcmVtb3ZlZAotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlT3V0cHV0TG9jYXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJSmF2YVByb2plY3QgcHJvamVjdD0gZ2V0SmF2YVByb2plY3QoIkphdmFQcm9qZWN0VGVzdHMiKTsKLQlJQ29udGFpbmVyIHVuZGVyTHlpbmdSZXNvdXJjZSA9IChJQ29udGFpbmVyKXByb2plY3QuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7Ci0JSUZvbGRlciBmb2xkZXI9IHVuZGVyTHlpbmdSZXNvdXJjZS5nZXRGb2xkZXIobmV3IFBhdGgoIm91dHB1dCIpKTsKLQotCXRyeSB7Ci0JCXN0YXJ0RGVsdGFzKCk7Ci0JCXByb2plY3Quc2V0T3V0cHV0TG9jYXRpb24oZm9sZGVyLmdldEZ1bGxQYXRoKCksIG51bGwpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSAxIiwKLQkJCSJKYXZhUHJvamVjdFRlc3RzWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCVtwcm9qZWN0IHJvb3RdWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCQliaW5bK106IHt9XG4iICsgCi0JCQkiCVJlc291cmNlRGVsdGEoL0phdmFQcm9qZWN0VGVzdHMvLmNsYXNzcGF0aClbKl0iCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJc3RvcERlbHRhcygpOwotCQl0cnkgewotCQkJc3RhcnREZWx0YXMoKTsKLQkJCWZvbGRlcj0gdW5kZXJMeWluZ1Jlc291cmNlLmdldEZvbGRlcihuZXcgUGF0aCgiYmluIikpOwkKLQkJCXByb2plY3Quc2V0T3V0cHV0TG9jYXRpb24oZm9sZGVyLmdldEZ1bGxQYXRoKCksIG51bGwpOwotCQkJYXNzZXJ0RGVsdGFzKAotCQkJCSJVbmV4cGVjdGVkIGRlbHRhIDIiLAotCQkJCSJKYXZhUHJvamVjdFRlc3RzWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkJIglbcHJvamVjdCByb290XVsqXToge0NISUxEUkVOfVxuIiArIAotCQkJCSIJCWJpblstXToge31cbiIgKyAKLQkJCQkiCVJlc291cmNlRGVsdGEoL0phdmFQcm9qZWN0VGVzdHMvLmNsYXNzcGF0aClbKl0iCi0JCQkpOwotCQl9IGZpbmFsbHkgewotCQkJc3RvcERlbHRhcygpOwotCQl9Ci0JfQotfQotLyoqCi0gKiBUZXN0IHRoYXQgYSBjbGFzcyBmaWxlCi0gKiBoYXMgYSBjb3JyZXNwb25kaW5nIHJlc291cmNlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q2xhc3NGaWxlQ29ycmVzcG9uZGluZ1Jlc291cmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNsYXNzRmlsZSBlbGVtZW50PSBnZXRDbGFzc0ZpbGUoIkphdmFQcm9qZWN0TGliVGVzdHMiLCAibGliIiwgInAiLCAiWS5jbGFzcyIpOwotCUlSZXNvdXJjZSBjb3JyPSBlbGVtZW50LmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOwotCUlSZXNvdXJjZSByZXM9IGdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KCJKYXZhUHJvamVjdExpYlRlc3RzIikuZ2V0Rm9sZGVyKCJsaWIiKS5nZXRGb2xkZXIoInAiKS5nZXRGaWxlKCJZLmNsYXNzIik7Ci0JYXNzZXJ0VHJ1ZSgiaW5jb3JyZWN0IGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UiLCBjb3JyLmVxdWFscyhyZXMpKTsKLX0KLS8qKgotICogVGVzdCB0aGF0IGEgY29tcGlsYXRpb24gdW5pdAotICogaGFzIGEgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvbXBpbGF0aW9uVW5pdENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlDb21waWxhdGlvblVuaXQgZWxlbWVudD0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhUHJvamVjdFRlc3RzIiwgIiIsICJxIiwgIkEuamF2YSIpOwotCUlSZXNvdXJjZSBjb3JyPSBlbGVtZW50LmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOwotCUlSZXNvdXJjZSByZXM9IGdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KCJKYXZhUHJvamVjdFRlc3RzIikuZ2V0Rm9sZGVyKCJxIikuZ2V0RmlsZSgiQS5qYXZhIik7Ci0JYXNzZXJ0VHJ1ZSgiaW5jb3JyZWN0IGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UiLCBjb3JyLmVxdWFscyhyZXMpKTsKLQlhc3NlcnRFcXVhbHMoIlByb2plY3QgaXMgaW5jb3JyZWN0IGZvciB0aGUgY29tcGlsYXRpb24gdW5pdCIsICJKYXZhUHJvamVjdFRlc3RzIiwgY29yci5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKLX0KLS8qKgotICogVGVzdHMgdGhlIGZpeCBmb3IgIjFGV05NS0Q6IElUUEpDT1JFOkFMTCAtIFBhY2thZ2UgRnJhZ21lbnQgUmVtb3ZhbCBub3QgcmVwb3J0ZWQgY29ycmVjdGx5IgotICovCi1wdWJsaWMgdm9pZCB0ZXN0RGVsZXRlUGFja2FnZVdpdGhBdXRvYnVpbGQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JLy8gY2xvc2UgYWxsIHByb2plY3QgZXhjZXB0IEphdmFQcm9qZWN0VGVzdHMgc28gYXMgdG8gYXZvaWQgc2lkZSBlZmZlY3RzIHdoaWxlIGF1dG9idWlsZGluZwotCUlQcm9qZWN0W10gcHJvamVjdHMgPSBnZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdHMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQkJaWYgKHByb2plY3QuZ2V0TmFtZSgpLmVxdWFscygiSmF2YVByb2plY3RUZXN0cyIpKSBjb250aW51ZTsKLQkJcHJvamVjdC5jbG9zZShudWxsKTsKLQl9Ci0KLQkvLyB0dXJuIGF1dG9idWlsZGluZyBvbgotCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gZ2V0V29ya3NwYWNlKCk7Ci0JYm9vbGVhbiBhdXRvQnVpbGQgPSB3b3Jrc3BhY2UuaXNBdXRvQnVpbGRpbmcoKTsKLQlJV29ya3NwYWNlRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSB3b3Jrc3BhY2UuZ2V0RGVzY3JpcHRpb24oKTsKLQlkZXNjcmlwdGlvbi5zZXRBdXRvQnVpbGRpbmcodHJ1ZSk7Ci0Jd29ya3NwYWNlLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQotCXN0YXJ0RGVsdGFzKCk7Ci0JSVBhY2thZ2VGcmFnbWVudCBmcmFnID0gZ2V0UGFja2FnZUZyYWdtZW50KCJKYXZhUHJvamVjdFRlc3RzIiwgIiIsICJ4LnkiKTsKLQlJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKSBmcmFnLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCXRyeSB7Ci0JCWRlbGV0ZVJlc291cmNlKGZvbGRlcik7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIiwKLQkJCSJKYXZhUHJvamVjdFRlc3RzWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCVtwcm9qZWN0IHJvb3RdWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCQl4LnlbLV06IHt9IgotCQkpOwotCX0gZmluYWxseSB7Ci0JCXN0b3BEZWx0YXMoKTsKLQkJCi0JCS8vIHR1cm4gYXV0b2J1aWxkIG9mZgotCQlkZXNjcmlwdGlvbi5zZXRBdXRvQnVpbGRpbmcoYXV0b0J1aWxkKTsKLQkJd29ya3NwYWNlLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQotCQkvLyByZW9wZW4gcHJvamVjdHMKLQkJcHJvamVjdHMgPSBnZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCQkJaWYgKHByb2plY3QuZ2V0TmFtZSgpLmVxdWFscygiSmF2YVByb2plY3RUZXN0cyIpKSBjb250aW51ZTsKLQkJCXByb2plY3Qub3BlbihudWxsKTsKLQkJfQotCX0KLX0KLS8qKgotICogVGVzdCB0aGF0IGFuIChleHRlcm5hbCkgamFyCi0gKiBoYXMgbm8gY29ycmVzcG9uZGluZyByZXNvdXJjZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdEV4dGVybmFsQXJjaGl2ZUNvcnJlc3BvbmRpbmdSZXNvdXJjZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlKYXZhUHJvamVjdCBwcm9qZWN0PSBnZXRKYXZhUHJvamVjdCgiSmF2YVByb2plY3RUZXN0cyIpOwotCUlQYWNrYWdlRnJhZ21lbnRSb290IGVsZW1lbnQ9IHByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChnZXRFeHRlcm5hbEpDTFBhdGhTdHJpbmcoKSk7Ci0JSVJlc291cmNlIGNvcnI9IGVsZW1lbnQuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7Ci0JYXNzZXJ0VHJ1ZSgiaW5jb3JyZWN0IGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UiLCBjb3JyID09IG51bGwpOwotfQotLyoqCi0gKiBUZXN0IHRoYXQgYSBjb21waWxhdGlvbiB1bml0IGNhbiBiZSBmb3VuZCBmb3IgYSBiaW5hcnkgdHlwZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0RmluZEVsZW1lbnRDbGFzc0ZpbGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJSmF2YVByb2plY3QgcHJvamVjdD0gZ2V0SmF2YVByb2plY3QoIkphdmFQcm9qZWN0VGVzdHMiKTsKLQlJSmF2YUVsZW1lbnQgZWxlbWVudD0gcHJvamVjdC5maW5kRWxlbWVudChuZXcgUGF0aCgiamF2YS9sYW5nL09iamVjdC5qYXZhIikpOwotCWFzc2VydFRydWUoIkNVIG5vdCBmb3VuZCIgLCBlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5DTEFTU19GSUxFCi0JCSYmIGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoIk9iamVjdC5jbGFzcyIpKTsKLX0KLS8qKgotICogVGVzdCB0aGF0IGEgY29tcGlsYXRpb24gdW5pdCBjYW4gYmUgZm91bmQKLSAqLwotcHVibGljIHZvaWQgdGVzdEZpbmRFbGVtZW50Q29tcGlsYXRpb25Vbml0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUphdmFQcm9qZWN0IHByb2plY3Q9IGdldEphdmFQcm9qZWN0KCJKYXZhUHJvamVjdFRlc3RzIik7Ci0JSUphdmFFbGVtZW50IGVsZW1lbnQ9IHByb2plY3QuZmluZEVsZW1lbnQobmV3IFBhdGgoIngveS9NYWluLmphdmEiKSk7Ci0JYXNzZXJ0VHJ1ZSgiQ1Ugbm90IGZvdW5kIiAsIGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQKLQkJJiYgZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLmVxdWFscygiTWFpbi5qYXZhIikpOwotfQotLyoqCi0gKiBUZXN0IHRoYXQgYSBjb21waWxhdGlvbiB1bml0IGNhbiBiZSBmb3VuZCBpbiBhIGRlZmF1bHQgcGFja2FnZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0RmluZEVsZW1lbnRDb21waWxhdGlvblVuaXREZWZhdWx0UGFja2FnZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlKYXZhUHJvamVjdCBwcm9qZWN0PSBnZXRKYXZhUHJvamVjdCgiSmF2YVByb2plY3RUZXN0cyIpOwotCUlKYXZhRWxlbWVudCBlbGVtZW50PSBwcm9qZWN0LmZpbmRFbGVtZW50KG5ldyBQYXRoKCJCLmphdmEiKSk7Ci0JYXNzZXJ0VHJ1ZSgiQ1Ugbm90IGZvdW5kIiAsIGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQKLQkJJiYgZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLmVxdWFscygiQi5qYXZhIikpOwotfQotLyoqCi0gKiBUZXN0IHRoYXQgYW4gaW52bGFpZCBwYXRoIHRocm93cyBhbiBleGNlcHRpb24KLSAqLwotcHVibGljIHZvaWQgdGVzdEZpbmRFbGVtZW50SW52YWxpZFBhdGgoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJSmF2YVByb2plY3QgcHJvamVjdD0gZ2V0SmF2YVByb2plY3QoIkphdmFQcm9qZWN0VGVzdHMiKTsKLQlib29sZWFuIGZhaWxlZD0gZmFsc2U7Ci0JdHJ5IHsKLQkJcHJvamVjdC5maW5kRWxlbWVudChudWxsKTsKLQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQlmYWlsZWQ9IHRydWU7Ci0JCWFzc2VydFRydWUoIndyb25nIHN0YXR1cyBjb2RlIiAsIGUuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpID09IElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9QQVRIKTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiU2hvbGQgaGF2ZSBmYWlsZWQiLCBmYWlsZWQpOwotCQotCWZhaWxlZCA9IGZhbHNlOwotCXRyeSB7Ci0JCXByb2plY3QuZmluZEVsZW1lbnQobmV3IFBhdGgoIi9zb21ldGhpbmcvYWJzb2x1dGUiKSk7Ci0JfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJZmFpbGVkPSB0cnVlOwotCQlhc3NlcnRUcnVlKCJ3cm9uZyBzdGF0dXMgY29kZSIgLCBlLmdldFN0YXR1cygpLmdldENvZGUoKSA9PSBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfUEFUSCk7Ci0JfQotCWFzc2VydFRydWUoIlNob2xkIGhhdmUgZmFpbGVkIiwgZmFpbGVkKTsKLQotCUlKYXZhRWxlbWVudCBlbGVtZW50PSBwcm9qZWN0LmZpbmRFbGVtZW50KG5ldyBQYXRoKCJkb2VzL25vdC9leGlzdC9IZWxsb1dvcmxkLmphdmEiKSk7Ci0JYXNzZXJ0VHJ1ZSgic2hvdWxkIGdldCBubyBlbGVtZW50IiwgZWxlbWVudCA9PSBudWxsKTsKLX0KLS8qKgotICogVGVzdCB0aGF0IGEgcGFja2FnZSBjYW4gYmUgZm91bmQKLSAqLwotcHVibGljIHZvaWQgdGVzdEZpbmRFbGVtZW50UGFja2FnZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlKYXZhUHJvamVjdCBwcm9qZWN0PSBnZXRKYXZhUHJvamVjdCgiSmF2YVByb2plY3RUZXN0cyIpOwotCUlKYXZhRWxlbWVudCBlbGVtZW50PSBwcm9qZWN0LmZpbmRFbGVtZW50KG5ldyBQYXRoKCJ4L3kiKSk7Ci0JYXNzZXJ0VHJ1ZSgicGFja2FnZSBub3QgZm91bmQiICwgZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVAotCQkmJiBlbGVtZW50LmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKCJ4LnkiKSk7Ci19Ci0vKioKLSAqIFRlc3QgdGhhdCBhIGNsYXNzIGNhbiBiZSBmb3VuZCBldmVuIGlmIHRoZSBwcm9qZWN0IHByZXJlcSBhIHNpbXBsZSBwcm9qZWN0Ci0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMjg0MzQgT3BlbiBUeXBlIGJyb2tlbiB3aGVuIHdvcmtzcGFjZSBoYXMgYnVpbGQgcGF0aCBwcm9ibGVtcykKLSAqLwotcHVibGljIHZvaWQgdGVzdEZpbmRFbGVtZW50UHJlcmVxU2ltcGxlUHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZVByb2plY3QoIlIiKTsKLQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJKIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sIG5ldyBTdHJpbmdbXSB7fSwgbmV3IFN0cmluZ1tdIHsiL1IifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiSi9zcmMvWC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSJ9IgotCQkpOwotCQlhc3NlcnRUcnVlKCJYLmphdmEgbm90IGZvdW5kIiwgcHJvamVjdC5maW5kRWxlbWVudChuZXcgUGF0aCgiWC5qYXZhIikpICE9IG51bGwpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUiIpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIkoiKTsKLQl9Ci19Ci0vKioKLSAqIFRlc3QgdGhhdCBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBjYW4gYmUgZm91bmQgZnJvbSBhIGNsYXNzcGF0aCBlbnRyeS4KLSAqLwotcHVibGljIHZvaWQgdGVzdEZpbmRQYWNrYWdlRnJhZ21lbnRSb290RnJvbUNsYXNzcGF0aEVudHJ5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUphdmFQcm9qZWN0IHByb2plY3QgPSBnZXRKYXZhUHJvamVjdCgiSmF2YVByb2plY3RUZXN0cyIpOwotCQotCS8vIGV4aXN0aW5nIGNsYXNzcGF0aCBlbnRyeQotCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShuZXcgUGF0aCgiL0phdmFQcm9qZWN0VGVzdHMvbGliLmphciIpLCBudWxsLCBudWxsKTsKLQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzID0gcHJvamVjdC5maW5kUGFja2FnZUZyYWdtZW50Um9vdHMoZW50cnkpOwotCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2Ygcm9vdHMgZm9yIGV4aXN0aW5nIGVudHJ5IiwgMSwgcm9vdHMubGVuZ3RoKTsKLQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgcm9vdCIsICIvSmF2YVByb2plY3RUZXN0cy9saWIuamFyIiwgcm9vdHNbMF0uZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOwotCQotCS8vIG5vbi1leGlzdGluZyBjbGFzc3BhdGggZW50cnkKLQllbnRyeSA9IEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KG5ldyBQYXRoKCIvSmF2YVByb2plY3RUZXN0cy9ub25FeGlzdGluZyIpKTsKLQlyb290cyA9IHByb2plY3QuZmluZFBhY2thZ2VGcmFnbWVudFJvb3RzKGVudHJ5KTsKLQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIHJvb3RzIGZvciBub24gZXhpc3RpbmcgZW50cnkiLCAwLCByb290cy5sZW5ndGgpOwotCi19Ci0vKioKLSAqIFRlc3QgdGhhdCBhIGZvbGRlciB3aXRoIGEgZG90IG5hbWUgZG9lcyBub3QgcmVsYXRlIHRvIGEgcGFja2FnZSBmcmFnbWVudAotICovCi1wdWJsaWMgdm9pZCB0ZXN0Rm9sZGVyV2l0aERvdE5hbWUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290PSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCJKYXZhUHJvamVjdFRlc3RzIiwgIiIpOwotCUlDb250YWluZXIgZm9sZGVyPSAoSUNvbnRhaW5lcilyb290LmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOwotCXRyeSB7Ci0JCXN0YXJ0RGVsdGFzKCk7Ci0JCWZvbGRlci5nZXRGb2xkZXIobmV3IFBhdGgoIm9yZy5lY2xpcHNlIikpLmNyZWF0ZShmYWxzZSwgdHJ1ZSwgbnVsbCk7Ci0JCWFzc2VydFRydWUoInNob3VsZCBiZSBvbmUgSmF2YSBEZWx0YSIsIHRoaXMuZGVsdGFMaXN0ZW5lci5kZWx0YXMubGVuZ3RoID09IDEpOwotCQkKLQkJc3RvcERlbHRhcygpOwotCQlJSmF2YUVsZW1lbnRbXSBjaGlsZHJlbiA9IHJvb3QuZ2V0Q2hpbGRyZW4oKTsKLQkJSVBhY2thZ2VGcmFnbWVudCBib2d1cyA9IHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KCJvcmcuZWNsaXBzZSIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlhc3NlcnRUcnVlKCJvcmcuZWNsaXBzZSBzaG91bGQgbm90IGJlIHByZXNlbnQgYXMgY2hpbGQiLCAhY2hpbGRyZW5baV0uZXF1YWxzKGJvZ3VzKSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgib3JnLmVjbGlwc2Ugc2hvdWxkIG5vdCBleGlzdCIsICFib2d1cy5leGlzdHMoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJZGVsZXRlUmVzb3VyY2UoZm9sZGVyLmdldEZvbGRlcihuZXcgUGF0aCgib3JnLmVjbGlwc2UiKSkpOwotCX0JCi19Ci0vKgotICogRW5zdXJlcyB0aGF0IGdldHRpbmcgdGhlIGNsYXNzcGF0aCBvbiBhIGNsb3NlZCBwcm9qZWN0IHRocm93cyBhIEphdmFNb2RlbEV4Y2VwdGlvbgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDI1MzU4IENyZWF0aW5nIGEgbmV3IEphdmEgY2xhc3MgLSBCcm93c2UgZm9yIHBhcmVudCkKLSAqLyAKLXB1YmxpYyB2b2lkIHRlc3RHZXRDbGFzc3BhdGhPbkNsb3NlZFByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoIkphdmFQcm9qZWN0VGVzdHMiKTsKLQl0cnkgewotCQlwcm9qZWN0LmNsb3NlKG51bGwpOwotCQlib29sZWFuIGdvdEV4Y2VwdGlvbiA9IGZhbHNlOwotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCXRyeSB7Ci0JCQlqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChlLmlzRG9lc05vdEV4aXN0KCkpIHsKLQkJCQlnb3RFeGNlcHRpb24gPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlNob3VsZCBnZXQgYSBub3QgcHJlc2VudCBleGNlcHRpb24gZm9yIGdldFJhd0NsYXNzcGF0aCgpIiwgZ290RXhjZXB0aW9uKTsKLQkJZ290RXhjZXB0aW9uID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlqYXZhUHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChlLmlzRG9lc05vdEV4aXN0KCkpIHsKLQkJCQlnb3RFeGNlcHRpb24gPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlNob3VsZCBnZXQgYSBub3QgcHJlc2VudCBleGNlcHRpb24gZm9yIGdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpIiwgZ290RXhjZXB0aW9uKTsKLQl9IGZpbmFsbHkgewotCQlwcm9qZWN0Lm9wZW4obnVsbCk7Ci0JfQotfQotLyoKLSAqIEVuc3VyZXMgdGhhdCB0aGUgbm9uLWphdmEgcmVzb3VyY2VzIGZvciBhIHByb2plY3QgZG8gbm90IGNvbnRhaW4gdGhlIHByb2plY3Qgb3V0cHV0IGxvY2F0aW9uLiAKLSAqLwotcHVibGljIHZvaWQgdGVzdEdldE5vbkphdmFSZXNvdXJjZXMxKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCWFzc2VydFJlc291cmNlcygKLQkJCSJVbmV4cGVjdGVkIG5vbi1qYXZhIHJlc291cmNlcyBmb3IgcHJvamVjdCIsCi0JCQkiL1AvLmNsYXNzcGF0aFxuIiArCi0JCQkiL1AvLnByb2plY3QiLAotCQkJKElSZXNvdXJjZVtdKXByb2plY3QuZ2V0Tm9uSmF2YVJlc291cmNlcygpKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0vKgotICogRW5zdXJlcyB0aGF0IHRoZSBub24tamF2YSByZXNvdXJjZXMgZm9yIGEgcHJvamVjdCBkbyBub3QgY29udGFpbiBhIGN1c3RvbSBvdXRwdXQgbG9jYXRpb24uIAotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgMjc0OTQgIFNvdXJjZSBmb2xkZXIgb3V0cHV0IGZvbGRlciBzaG93biBpbiBQYWNrYWdlIGV4cGxvcmVyKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0R2V0Tm9uSmF2YVJlc291cmNlczIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4xIiwgbmV3IFN0cmluZ1tdIHsiYmluMiJ9KTsKLQkJYXNzZXJ0UmVzb3VyY2VzKAotCQkJIlVuZXhwZWN0ZWQgbm9uLWphdmEgcmVzb3VyY2VzIGZvciBwcm9qZWN0IiwKLQkJCSIvUC8uY2xhc3NwYXRoXG4iICsKLQkJCSIvUC8ucHJvamVjdCIsCi0JCQkoSVJlc291cmNlW10pcHJvamVjdC5nZXROb25KYXZhUmVzb3VyY2VzKCkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qCi0gKiBFbnN1cmVzIHRoYXQgdGhlIG5vbi1qYXZhIHJlc291cmNlcyBmb3IgYSBwcm9qZWN0IGRvIG5vdCBjb250YWluIGEgZm9sZGVyIHRoYXQgc2hvdWxkIGJlIGEgcGFja2FnZSBmcmFnbWVudC4KLSAqLwotcHVibGljIHZvaWQgdGVzdEdldE5vbkphdmFSZXNvdXJjZXMzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7IiJ9LCAiIik7Ci0JCXRoaXMuY3JlYXRlRm9sZGVyKCIvUC9wMSIpOwotCQlhc3NlcnRSZXNvdXJjZXMoCi0JCQkiVW5leHBlY3RlZCBub24tamF2YSByZXNvdXJjZXMgZm9yIHByb2plY3QiLAotCQkJIi9QLy5jbGFzc3BhdGhcbiIgKwotCQkJIi9QLy5wcm9qZWN0IiwKLQkJCShJUmVzb3VyY2VbXSlwcm9qZWN0LmdldE5vbkphdmFSZXNvdXJjZXMoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoKLSAqIEVuc3VyZXMgdGhhdCB0aGUgbm9uLWphdmEgcmVzb3VyY2VzIGZvciBhIHByb2plY3QgY29udGFpbiBhIGZvbGRlciB0aGF0IGhhdmUgYW4gaW52YWxpZCBuYW1lIGZvciBhIHBhY2thZ2UgZnJhZ21lbnQuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMzE3NTcgRm9sZGVyIHdpdGggaW52YWxpZCBwa2cgbmFtZSBzaG91bGQgYmUgbm9uLUphdmEgcmVzb3VyY2UpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXROb25KYXZhUmVzb3VyY2VzNCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiKTsKLQkJdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3gueSIpOwotCQlhc3NlcnRSZXNvdXJjZXMoCi0JCQkiVW5leHBlY3RlZCBub24tamF2YSByZXNvdXJjZXMgZm9yIHByb2plY3QiLAotCQkJIi9QLy5jbGFzc3BhdGhcbiIgKyAKLQkJCSIvUC8ucHJvamVjdFxuIiArIAotCQkJIi9QL3gueSIsCi0JCQkoSVJlc291cmNlW10pcHJvamVjdC5nZXROb25KYXZhUmVzb3VyY2VzKCkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0gCi0vKgotICogRW5zdXJlcyB0aGF0IGdldFJlcXVpcmVkUHJvamVjdE5hbWVzKCkgcmV0dXJucyB0aGUgcHJvamVjdCBuYW1lcyBpbiB0aGUgY2xhc3NwYXRoIG9yZGVyCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMjU2MDUgW0FQSV0gc29tZUphdmFQcm9qZWN0LmdldFJlcXVpcmVkUHJvamVjdE5hbWVzKCk7IEFQSSBzaG91bGQgc3BlY2lmeSB0aGF0IHRoZSBhcnJheSBpcyByZXR1cm5lZCBpbiBDbGFzc1BhdGggb3JkZXIpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXRSZXF1aXJlZFByb2plY3ROYW1lcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoCi0JCQkiUCIsIAotCQkJbmV3IFN0cmluZ1tdIHt9LCAKLQkJCW5ldyBTdHJpbmdbXSB7fSwgCi0JCQluZXcgU3RyaW5nW10geyIvSmF2YVByb2plY3RUZXN0cyIsICIvUDEiLCAiL1AwIiwgIi9QMiIsICIvSmF2YVByb2plY3RTcmNUZXN0cyJ9LCAKLQkJCSIiKTsKLQkJU3RyaW5nW10gcmVxdWlyZWRQcm9qZWN0TmFtZXMgPSBwcm9qZWN0LmdldFJlcXVpcmVkUHJvamVjdE5hbWVzKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSByZXF1aXJlZFByb2plY3ROYW1lcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZChyZXF1aXJlZFByb2plY3ROYW1lc1tpXSk7Ci0JCQlpZiAoaSAhPSBsZW5ndGgtMSkgewotCQkJCWJ1ZmZlci5hcHBlbmQoIiwgIik7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlVuZXhwZWN0ZWQgcmVxdWlyZWQgcHJvamVjdCBuYW1lcyIsCi0JCQkiSmF2YVByb2plY3RUZXN0cywgUDEsIFAwLCBQMiwgSmF2YVByb2plY3RTcmNUZXN0cyIsCi0JCQlidWZmZXIudG9TdHJpbmcoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoqCi0gKiBUZXN0IHRoYXQgYW4gKGludGVybmFsKSBqYXIKLSAqIGhhcyBhIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RJbnRlcm5hbEFyY2hpdmVDb3JyZXNwb25kaW5nUmVzb3VyY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJUGFja2FnZUZyYWdtZW50Um9vdCBlbGVtZW50PSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCJKYXZhUHJvamVjdFRlc3RzIiwgImxpYi5qYXIiKTsKLQlJUmVzb3VyY2UgY29ycj0gZWxlbWVudC5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKLQlJUmVzb3VyY2UgcmVzPSBnZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCgiSmF2YVByb2plY3RUZXN0cyIpLmdldEZpbGUoImxpYi5qYXIiKTsKLQlhc3NlcnRUcnVlKCJpbmNvcnJlY3QgY29ycmVzcG9uZGluZyByZXNvdXJjZSIsIGNvcnIuZXF1YWxzKHJlcykpOwotfQotLyoqCi0gKiBUZXN0IElKYXZhUGFja2FnZUZyYWdtZW50LmlzRGVmYXVsdFBhY2thZ2UoKS4KLSAqLwotcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdFBhY2thZ2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJUGFja2FnZUZyYWdtZW50IGRlZiA9IGdldFBhY2thZ2VGcmFnbWVudCgiSmF2YVByb2plY3RUZXN0cyIsICIiLCAiIik7Ci0JYXNzZXJ0VHJ1ZSgic2hvdWxkIGJlIGRlZmF1bHQgcGFja2FnZSIsIGRlZi5pc0RlZmF1bHRQYWNrYWdlKCkpOwotCUlQYWNrYWdlRnJhZ21lbnQgeSA9Ci0JCWdldFBhY2thZ2VGcmFnbWVudCgiSmF2YVByb2plY3RUZXN0cyIsICIiLCAieC55Iik7Ci0JYXNzZXJ0VHJ1ZSgieC55IHNob3VsZCBub3QgYmUgZGVmYXVsdCBwYWthY2thZ2UiLCAheS5pc0RlZmF1bHRQYWNrYWdlKCkpOwotCi0JSVBhY2thZ2VGcmFnbWVudCBkZWYyID0gZ2V0UGFja2FnZUZyYWdtZW50KCJKYXZhUHJvamVjdFRlc3RzIiwgImxpYi5qYXIiLCAiIik7Ci0JYXNzZXJ0VHJ1ZSgibGliLmphciBzaG91bGQgaGF2ZSBkZWZhdWx0IHBhY2thZ2UiLCBkZWYyLmlzRGVmYXVsdFBhY2thZ2UoKSk7Ci0JSVBhY2thZ2VGcmFnbWVudCBwID0KLQkJZ2V0UGFja2FnZUZyYWdtZW50KCJKYXZhUHJvamVjdFRlc3RzIiwgImxpYi5qYXIiLCAicCIpOwotCWFzc2VydFRydWUoInAgc2hvdWxkIG5vdCBiZSBkZWZhdWx0IHBhY2thZ2UiLCAhcC5pc0RlZmF1bHRQYWNrYWdlKCkpOwotfQotLyoqCi0gKiBUZXN0IHRoYXQgYSBwYWNrYWdlIGZyYWdtZW50IGluIGEgamFyIGhhcyBubyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0SmFyUGFja2FnZUZyYWdtZW50Q29ycmVzcG9uZGluZ1Jlc291cmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoIkphdmFQcm9qZWN0VGVzdHMiLCAibGliLmphciIpOwotCUlQYWNrYWdlRnJhZ21lbnQgZWxlbWVudCA9IHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KCJwIik7Ci0JSVJlc291cmNlIGNvcnIgPSBlbGVtZW50LmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOwotCWFzc2VydFRydWUoImluY29ycmVjdCBjb3JyZXNwb25kaW5nIHJlc291cmNlIiwgY29yciA9PSBudWxsKTsKLX0KLS8qKgotICogVGVzdCB0aGF0IGFuIG91dHB1dCBsb2NhdGlvbiBjYW4ndCBiZSBzZXQgdG8gYSBsb2NhdGlvbiBpbnNpZGUgYSBwYWNrYWdlIGZyYWdtZW50Ci0gKiByb290LCBleGNlcHQgdGhlIHJvb3QgcHJvamVjdCBmb2xkZXIuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RPdXRwdXRMb2NhdGlvbk5lc3RlZEluUm9vdCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3Q9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoIkphdmFQcm9qZWN0U3JjVGVzdHMiLCAic3JjIik7Ci0JSUZvbGRlciBmb2xkZXI9IChJRm9sZGVyKSByb290LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCUlKYXZhUHJvamVjdCBwcm9qZWN0PSBnZXRKYXZhUHJvamVjdCgiSmF2YVByb2plY3RTcmNUZXN0cyIpOwotCWZvbGRlcj0gZm9sZGVyLmdldEZvbGRlcigieCIpOwotCWJvb2xlYW4gZmFpbGVkPSBmYWxzZTsKLQl0cnkgewotCQlwcm9qZWN0LnNldE91dHB1dExvY2F0aW9uKGZvbGRlci5nZXRGdWxsUGF0aCgpLCBudWxsKTsKLQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQlhc3NlcnRUcnVlKCJzaG91bGQgYmUgYW4gaW52YWxpZCBjbGFzc3BhdGgiLCBlLmdldFN0YXR1cygpLmdldENvZGUoKSA9PSBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfQ0xBU1NQQVRIKTsKLQkJZmFpbGVkPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBmYWlsZWQiLCBmYWlsZWQpOwotCQotfQotLyoqCi0gKiBUZXN0IHRoYXQgYW4gb3V0cHV0IGxvY2F0aW9uIGZvbGRlciBpcyBub3QgY3JlYXRlZCBhcyBhIHBhY2thZ2UgZnJhZ21lbnQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RPdXRwdXRMb2NhdGlvbk5vdEFkZGVkQXNQYWNrYWdlRnJhZ21lbnQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290PSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCJKYXZhUHJvamVjdFRlc3RzIiwgIiIpOwotCUlKYXZhRWxlbWVudFtdIHBhY2thZ2VzPSByb290LmdldENoaWxkcmVuKCk7Ci0JYXNzZXJ0RXF1YWxzKCJ1bmVwZWN0ZWQgbnVtYmVyIG9mIHBhY2thZ2VzIiwgNCwgcGFja2FnZXMubGVuZ3RoKTsKLQlhc3NlcnRUcnVlKCJzaG91bGQgYmUgZGVmYXVsdCIsIHBhY2thZ2VzWzBdLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKCIiKSk7Ci0KLQotCS8vIGNyZWF0ZSBhIG5lc3RlZCBmb2xkZXIgaW4gdGhlIG91dHB1dCBsb2NhdGlvbiBhbmQgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGFwcGVhcgotCS8vIGFzIGEgcGFja2FnZSBmcmFnbWVudAotCUlDb250YWluZXIgdW5kZXJMeWluZ1Jlc291cmNlID0gKElDb250YWluZXIpcm9vdC5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQlJRm9sZGVyIG5ld0ZvbGRlcj0gdW5kZXJMeWluZ1Jlc291cmNlLmdldEZvbGRlcihuZXcgUGF0aCgiYmluIikpLmdldEZvbGRlcihuZXcgUGF0aCgibmVzdGVkIikpOwotCXRyeSB7Ci0JCXN0YXJ0RGVsdGFzKCk7Ci0JCW5ld0ZvbGRlci5jcmVhdGUoZmFsc2UsIHRydWUsIG51bGwpOwotCQlhc3NlcnRUcnVlKCJzaG91bGQgYmUgb25lIGRlbHRhIChyZXNvdXJjZSBkZWx0YXMpIiwgdGhpcy5kZWx0YUxpc3RlbmVyLmRlbHRhcyAhPSBudWxsIHx8IHRoaXMuZGVsdGFMaXN0ZW5lci5kZWx0YXMubGVuZ3RoID09IDEpOwotCX0gZmluYWxseSB7Ci0JCXN0b3BEZWx0YXMoKTsKLQkJZGVsZXRlUmVzb3VyY2UobmV3Rm9sZGVyKTsKLQl9Ci19Ci0vKioKLSAqIFRlc3QgdGhhdCBhIHBhY2thZ2UgZnJhZ21lbnQgKG5vbi1leHRlcm5hbCwgbm9uLWphciwgbm9uLWRlZmF1bHQpCi0gKiBoYXMgYSBjb3JyZXNwb25kaW5nIHJlc291cmNlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UGFja2FnZUZyYWdtZW50Q29ycmVzcG9uZGluZ1Jlc291cmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSVBhY2thZ2VGcmFnbWVudCBlbGVtZW50PSBnZXRQYWNrYWdlRnJhZ21lbnQoIkphdmFQcm9qZWN0VGVzdHMiLCAiIiwgIngueSIpOwotCUlSZXNvdXJjZSBjb3JyPSBlbGVtZW50LmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOwotCUlSZXNvdXJjZSByZXM9IGdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KCJKYXZhUHJvamVjdFRlc3RzIikuZ2V0Rm9sZGVyKCJ4IikuZ2V0Rm9sZGVyKCJ5Iik7Ci0JYXNzZXJ0VHJ1ZSgiaW5jb3JyZWN0IGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UiLCBjb3JyLmVxdWFscyhyZXMpKTsKLX0KLS8qKgotICogVGVzdCB0aGF0IGEgcGFja2FnZSBmcmFnbWVudCAobm9uLWV4dGVybmFsLCBub24tamFyLCBub24tZGVmYXVsdCkKLSAqIGhhcyBhIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlRnJhZ21lbnRIYXNTdWJwYWNrYWdlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlQYWNrYWdlRnJhZ21lbnQgZGVmPQkJZ2V0UGFja2FnZUZyYWdtZW50KCJKYXZhUHJvamVjdFRlc3RzIiwgIiIsICIiKTsKLQlJUGFja2FnZUZyYWdtZW50IHg9CQlnZXRQYWNrYWdlRnJhZ21lbnQoIkphdmFQcm9qZWN0VGVzdHMiLCAiIiwgIngiKTsKLQlJUGFja2FnZUZyYWdtZW50IHk9CQlnZXRQYWNrYWdlRnJhZ21lbnQoIkphdmFQcm9qZWN0VGVzdHMiLCAiIiwgIngueSIpOwotCWFzc2VydFRydWUoImRlZmF1bHQgc2hvdWxkIGhhdmUgc3VicGFja2FnZXMiLAkJCQkJCQlkZWYuaGFzU3VicGFja2FnZXMoKSk7Ci0JYXNzZXJ0VHJ1ZSgieCBzaG91bGQgaGF2ZSBzdWJwYWNrYWdlcyIsCQkJCQkJCQl4Lmhhc1N1YnBhY2thZ2VzKCkpOwotCWFzc2VydFRydWUoIngueSBzaG91bGQgTk9UIGhhdmUgc3VicGFja2FnZXMiLAkJIXkuaGFzU3VicGFja2FnZXMoKSk7Ci0KLQlJUGFja2FnZUZyYWdtZW50IGphdmEgPSBnZXRQYWNrYWdlRnJhZ21lbnQoIkphdmFQcm9qZWN0VGVzdHMiLCBnZXRFeHRlcm5hbEpDTFBhdGhTdHJpbmcoKSwgImphdmEiKTsKLQlJUGFja2FnZUZyYWdtZW50IGxhbmc9IGdldFBhY2thZ2VGcmFnbWVudCgiSmF2YVByb2plY3RUZXN0cyIsIGdldEV4dGVybmFsSkNMUGF0aFN0cmluZygpLCAiamF2YS5sYW5nIik7Ci0KLQlhc3NlcnRUcnVlKCJqYXZhIHNob3VsZCBoYXZlIHN1YnBhY2thZ2VzIiwJCQkJCWphdmEuaGFzU3VicGFja2FnZXMoKSk7Ci0JYXNzZXJ0VHJ1ZSgiamF2YS5sYW5nICBzaG91bGQgTk9UIGhhdmUgc3VicGFja2FnZXMiLAkJCSFsYW5nLmhhc1N1YnBhY2thZ2VzKCkpOwotfQotLyoqCi0gKiBUZXN0IGdldHRpbmcgdGhlIG5vbi1qYXZhIHJlc291cmNlcyBmcm9tIGEgcGFja2FnZSBmcmFnbWVudC4KLSAqLwotcHVibGljIHZvaWQgdGVzdFBhY2thZ2VGcmFnbWVudE5vbkphdmFSZXNvdXJjZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkvLyByZWd1bGFyIHNvdXJjZSBwYWNrYWdlIHdpdGggcmVzb3VyY2VzCi0JSVBhY2thZ2VGcmFnbWVudCBwa2cgPSBnZXRQYWNrYWdlRnJhZ21lbnQoIkphdmFQcm9qZWN0VGVzdHMiLCAiIiwgIngiKTsKLQlPYmplY3RbXSByZXNvdXJjZXMgPSBwa2cuZ2V0Tm9uSmF2YVJlc291cmNlcygpOwotCWFzc2VydEVxdWFscygiaW5jb3JyZWN0IG51bWJlciBvZiBub24gamF2YSByZXNvdXJjZXMgKHRlc3QgY2FzZSAxKSIsIDIsIHJlc291cmNlcy5sZW5ndGgpOwotCi0JLy8gcmVndWxhciBzb3VyY2UgcGFja2FnZSB3aXRob3V0IHJlc291cmNlcwotCXBrZyA9IGdldFBhY2thZ2VGcmFnbWVudCgiSmF2YVByb2plY3RUZXN0cyIsICIiLCAieC55Iik7Ci0JcmVzb3VyY2VzID0gcGtnLmdldE5vbkphdmFSZXNvdXJjZXMoKTsKLQlhc3NlcnRFcXVhbHMoImluY29ycmVjdCBudW1iZXIgb2Ygbm9uIGphdmEgcmVzb3VyY2VzICh0ZXN0IGNhc2UgMikiLCAwLCByZXNvdXJjZXMubGVuZ3RoKTsKLQotCS8vIHNvdXJjZSBkZWZhdWx0IHBhY2thZ2Ugd2l0aCBwb3RlbnRpYWx5IHJlc291cmNlcwotCXBrZyA9IGdldFBhY2thZ2VGcmFnbWVudCgiSmF2YVByb2plY3RUZXN0cyIsICIiLCAiIik7Ci0JcmVzb3VyY2VzID0gcGtnLmdldE5vbkphdmFSZXNvdXJjZXMoKTsKLQlhc3NlcnRFcXVhbHMoImluY29ycmVjdCBudW1iZXIgb2Ygbm9uIGphdmEgcmVzb3VyY2VzICh0ZXN0IGNhc2UgMykiLCAwLCByZXNvdXJjZXMubGVuZ3RoKTsKLQotCS8vIHJlZ3VsYXIgemlwIHBhY2thZ2Ugd2l0aCByZXNvdXJjZXMKLQkvLyBUTyBETwotCi0JLy8gcmVndWxhciB6aXAgcGFja2FnZSB3aXRob3V0IHJlc291cmNlcwotCXBrZyA9IGdldFBhY2thZ2VGcmFnbWVudCgiSmF2YVByb2plY3RUZXN0cyIsICJsaWIuamFyIiwgInAiKTsKLQlyZXNvdXJjZXMgPSBwa2cuZ2V0Tm9uSmF2YVJlc291cmNlcygpOwotCWFzc2VydEVxdWFscygiaW5jb3JyZWN0IG51bWJlciBvZiBub24gamF2YSByZXNvdXJjZXMgKHRlc3QgY2FzZSA1KSIsIDAsIHJlc291cmNlcy5sZW5ndGgpOwotCi0JLy8gemlwIGRlZmF1bHQgcGFja2FnZSB3aXRoIHBvdGVudGlhbHkgcmVzb3VyY2VzCi0JLy8gVE8gRE8KLQkKLQkvLyB6aXAgZGVmYXVsdCBwYWNrYWdlIHdpdGggcG90ZW50aWFseSBubyByZXNvdXJjZXMKLQlwa2cgPSBnZXRQYWNrYWdlRnJhZ21lbnQoIkphdmFQcm9qZWN0VGVzdHMiLCAibGliLmphciIsICIiKTsKLQlyZXNvdXJjZXMgPSBwa2cuZ2V0Tm9uSmF2YVJlc291cmNlcygpOwotCWFzc2VydEVxdWFscygiaW5jb3JyZWN0IG51bWJlciBvZiBub24gamF2YSByZXNvdXJjZXMgKHRlc3QgY2FzZSA3KSIsIDAsIHJlc291cmNlcy5sZW5ndGgpOwotCQotfQotLyoqCi0gKiBUZXN0cyB0aGF0IGFmdGVyIGEgcGFja2FnZSAiZm9vIiBoYXMgYmVlbiByZW5hbWVkIGludG8gImJhciIsIGl0IGlzIHBvc3NpYmxlIHRvIHJlY3JlYXRlCi0gKiBhICJmb28iIHBhY2thZ2UuCi0gKiBAc2VlIDFGV1gwSFk6IElUUENPUkU6V0lOOTggLSBQcm9ibGVtIGFmdGVyIHJlbmFtaW5nIGEgSmF2YSBwYWNrYWdlCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlRnJhZ21lbnRSZW5hbWVBbmRDcmVhdGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJUGFja2FnZUZyYWdtZW50IHkgPSBnZXRQYWNrYWdlRnJhZ21lbnQoIkphdmFQcm9qZWN0VGVzdHMiLCAiIiwgIngueSIpOwotCUlGb2xkZXIgeUZvbGRlciA9IChJRm9sZGVyKSB5LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCUlQYXRoIHlQYXRoID0geUZvbGRlci5nZXRGdWxsUGF0aCgpOwotCUlQYXRoIGZvb1BhdGggPSB5UGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkuYXBwZW5kKCJmb28iKTsKLQkKLQl5Rm9sZGVyLm1vdmUoZm9vUGF0aCwgdHJ1ZSwgbnVsbCk7Ci0JdHJ5IHsKLQkJeUZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJYXNzZXJ0VHJ1ZSgic2hvdWxkIGJlIGFibGUgdG8gcmVjcmVhdGUgdGhlIHkgZm9sZGVyIiwgZmFsc2UpOwotCX0KLQkvLyByZXN0b3JlIHRoZSBvcmlnaW5hbCBzdGF0ZQotCWRlbGV0ZVJlc291cmNlKHlGb2xkZXIpOwotCUlQYWNrYWdlRnJhZ21lbnQgZm9vID0gZ2V0UGFja2FnZUZyYWdtZW50KCJKYXZhUHJvamVjdFRlc3RzIiwgIiIsICJ4LmZvbyIpOwotCUlGb2xkZXIgZm9vRm9sZGVyID0gKElGb2xkZXIpIGZvby5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQlmb29Gb2xkZXIubW92ZSh5UGF0aCwgdHJ1ZSwgbnVsbCk7Ci19Ci0vKioKLSAqIFRlc3QgdGhhdCBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCAobm9uLWV4dGVybmFsLCBub24tamFyLCBub24tZGVmYXVsdCByb290KQotICogaGFzIGEgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdFBhY2thZ2VGcmFnbWVudFJvb3RDb3JyZXNwb25kaW5nUmVzb3VyY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJUGFja2FnZUZyYWdtZW50Um9vdCBlbGVtZW50PSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCJKYXZhUHJvamVjdFRlc3RzIiwgIiIpOwotCUlSZXNvdXJjZSBjb3JyPSBlbGVtZW50LmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOwotCUlSZXNvdXJjZSByZXM9IGdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KCJKYXZhUHJvamVjdFRlc3RzIik7Ci0JYXNzZXJ0VHJ1ZSgiaW5jb3JyZWN0IGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UiLCBjb3JyLmVxdWFscyhyZXMpKTsKLQlhc3NlcnRFcXVhbHMoIlByb2plY3QgaW5jb3JyZWN0IGZvciBmb2xkZXIgcmVzb3VyY2UiLCAiSmF2YVByb2plY3RUZXN0cyIsIGNvcnIuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci19Ci0vKioKLSAqIFRlc3QgZ2V0dGluZyB0aGUgbm9uLWphdmEgcmVzb3VyY2VzIGZyb20gYSBwYWNrYWdlIGZyYWdtZW50IHJvb3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlRnJhZ21lbnRSb290Tm9uSmF2YVJlc291cmNlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCS8vIHNvdXJjZSBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgd2l0aCByZXNvdXJjZXMKLQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgiSmF2YVByb2plY3RUZXN0cyIsICIiKTsKLQlPYmplY3RbXSByZXNvdXJjZXMgPSByb290LmdldE5vbkphdmFSZXNvdXJjZXMoKTsKLQlhc3NlcnRFcXVhbHMoImluY29ycmVjdCBudW1iZXIgb2Ygbm9uIGphdmEgcmVzb3VyY2VzICh0ZXN0IGNhc2UgMSkiLCAyLCByZXNvdXJjZXMubGVuZ3RoKTsKLQotCS8vIHNvdXJjZSBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgd2l0aG91dCByZXNvdXJjZXMKLSAJcm9vdCA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoIkphdmFQcm9qZWN0U3JjVGVzdHMiLCAic3JjIik7Ci0JcmVzb3VyY2VzID0gcm9vdC5nZXROb25KYXZhUmVzb3VyY2VzKCk7Ci0JYXNzZXJ0RXF1YWxzKCJpbmNvcnJlY3QgbnVtYmVyIG9mIG5vbiBqYXZhIHJlc291cmNlcyAodGVzdCBjYXNlIDIpIiwgMCwgcmVzb3VyY2VzLmxlbmd0aCk7Ci0KLQkvLyB6aXAgcGFja2FnZSBmcmFnbWVudCByb290IHdpdGggcmVzb3VyY2VzCi0JLy8gVE8gRE8KLQkKLQkvLyB6aXAgcGFja2FnZSBmcmFnbWVudCByb290IHdpdGhvdXQgcmVzb3VyY2VzCi0Jcm9vdCA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoIkphdmFQcm9qZWN0VGVzdHMiLCAibGliLmphciIpOwotCXJlc291cmNlcyA9IHJvb3QuZ2V0Tm9uSmF2YVJlc291cmNlcygpOwotCWFzc2VydEVxdWFscygiaW5jb3JyZWN0IG51bWJlciBvZiBub24gamF2YSByZXNvdXJjZXMgKHRlc3QgY2FzZSA0KSIsIDAsIHJlc291cmNlcy5sZW5ndGgpOwotfQotLyoqCi0gKiBUZXN0IHJhdyBlbnRyeSBpbmZlcmVuY2UgcGVyZm9ybWFuY2UgZm9yIHBhY2thZ2UgZnJhZ21lbnQgcm9vdAotICovCi1wdWJsaWMgdm9pZCB0ZXN0UGFja2FnZUZyYWdtZW50Um9vdFJhd0VudHJ5KCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQlGaWxlIGxpYkRpciA9IG51bGw7Ci0JdHJ5IHsKLQkJU3RyaW5nIGxpYlBhdGggPSBFWFRFUk5BTF9KQVJfRElSX1BBVEggKyBGaWxlLnNlcGFyYXRvciArICJsaWIiOwotCQlKYXZhQ29yZS5zZXRDbGFzc3BhdGhWYXJpYWJsZSgiTXlWYXIiLCBuZXcgUGF0aChsaWJQYXRoKSwgbnVsbCk7Ci0JCUlKYXZhUHJvamVjdCBwcm9qID0gIHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10ge30sICJiaW4iKTsKLQkJbGliRGlyID0gbmV3IEZpbGUobGliUGF0aCk7Ci0JCWxpYkRpci5ta2RpcnMoKTsKLQkJZmluYWwgaW50IGxlbmd0aCA9IDIwMDsKLQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gbmV3IElDbGFzc3BhdGhFbnRyeVtsZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKXsKLQkJCUZpbGUgbGliSmFyID0gbmV3IEZpbGUobGliRGlyLCAibGliIitpKyIuamFyIik7Ci0JCQlsaWJKYXIuY3JlYXRlTmV3RmlsZSgpOwotCQkJY2xhc3NwYXRoW2ldID0gSmF2YUNvcmUubmV3VmFyaWFibGVFbnRyeShuZXcgUGF0aCgiL015VmFyL2xpYiIraSsiLmphciIpLCBudWxsLCBudWxsKTsKLQkJfQotCQlwcm9qLnNldFJhd0NsYXNzcGF0aChjbGFzc3BhdGgsIG51bGwpOwotCQkKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSByb290cyA9IHByb2ouZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2YgZW50cmllczoiLCBsZW5ndGgsIHJvb3RzLmxlbmd0aCk7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb290cy5sZW5ndGg7IGkrKyl7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgcmF3RW50cnkgPSByb290c1tpXS5nZXRSYXdDbGFzc3BhdGhFbnRyeSgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ1bmV4cGVjdGVkIHJvb3QgcmF3IGVudHJ5OiIsIGNsYXNzcGF0aFtpXSwgcmF3RW50cnkpOwotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydCkrICJtcyBmb3IgIityb290cy5sZW5ndGgrIiByb290cyIpOwotCX0gZmluYWxseSB7Ci0JCWlmIChsaWJEaXIgIT0gbnVsbCkgewotCQkJU3RyaW5nW10gbGliSmFycyA9IGxpYkRpci5saXN0KCk7Ci0JCQlpZiAobGliSmFycyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGxpYkphcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJbmV3IEZpbGUobGliRGlyLCBsaWJKYXJzW2ldKS5kZWxldGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlsaWJEaXIuZGVsZXRlKCk7Ci0JCX0KLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JCUphdmFDb3JlLnJlbW92ZUNsYXNzcGF0aFZhcmlhYmxlKCJNeVZhciIsIG51bGwpOwotCX0KLX0KLS8qKgotICogVGVzdCByYXcgZW50cnkgaW5mZXJlbmNlIHBlcmZvcm1hbmNlIGZvciBwYWNrYWdlIGZyYWdtZW50IHJvb3QgaW4gY2FzZQotICogb3JpZ2luYWwgY2xhc3NwYXRoIGhhZCBkdXBsaWNhdGUgZW50cmllcyBwb2ludGluZyB0byBpdDogZmlyc3QgcmF3IGVudHJ5IHNob3VsZCBiZSBmb3VuZAotICovCi1wdWJsaWMgdm9pZCB0ZXN0UGFja2FnZUZyYWdtZW50Um9vdFJhd0VudHJ5V2hlbkR1cGxpY2F0ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JRmlsZSBsaWJEaXIgPSBudWxsOwotCXRyeSB7Ci0JCVN0cmluZyBsaWJQYXRoID0gRVhURVJOQUxfSkFSX0RJUl9QQVRIICsgRmlsZS5zZXBhcmF0b3IgKyAibGliIjsKLQkJSmF2YUNvcmUuc2V0Q2xhc3NwYXRoVmFyaWFibGUoIk15VmFyIiwgbmV3IFBhdGgoRVhURVJOQUxfSkFSX0RJUl9QQVRIKSwgbnVsbCk7Ci0JCUlKYXZhUHJvamVjdCBwcm9qID0gIHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10ge30sICJiaW4iKTsKLQkJbGliRGlyID0gbmV3IEZpbGUobGliUGF0aCk7Ci0JCWxpYkRpci5ta2RpcnMoKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gbmV3IElDbGFzc3BhdGhFbnRyeVsyXTsKLQkJRmlsZSBsaWJKYXIgPSBuZXcgRmlsZShsaWJEaXIsICJsaWIuamFyIik7Ci0JCWxpYkphci5jcmVhdGVOZXdGaWxlKCk7Ci0JCWNsYXNzcGF0aFswXSA9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShuZXcgUGF0aChsaWJQYXRoKS5hcHBlbmQoImxpYi5qYXIiKSwgbnVsbCwgbnVsbCk7Ci0JCWNsYXNzcGF0aFsxXSA9IEphdmFDb3JlLm5ld1ZhcmlhYmxlRW50cnkobmV3IFBhdGgoIi9NeVZhciIpLmFwcGVuZCgibGliLmphciIpLCBudWxsLCBudWxsKTsKLQkJcHJvai5zZXRSYXdDbGFzc3BhdGgoY2xhc3NwYXRoLCBudWxsKTsKLQkJSmF2YUNvcmUuc2V0Q2xhc3NwYXRoVmFyaWFibGUoIk15VmFyIiwgbmV3IFBhdGgobGliUGF0aCksIG51bGwpOyAvLyBjaGFuZ2UgQ1AgdmFyIHZhbHVlIHRvIGNhdXNlIGNvbGxpc2lvbgotCQkKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSByb290cyA9IHByb2ouZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2YgZW50cmllczoiLCAxLCByb290cy5sZW5ndGgpOwotCQlJQ2xhc3NwYXRoRW50cnkgcmF3RW50cnkgPSByb290c1swXS5nZXRSYXdDbGFzc3BhdGhFbnRyeSgpOwotCQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgcm9vdCByYXcgZW50cnk6IiwgY2xhc3NwYXRoWzBdLCByYXdFbnRyeSk7IC8vIGVuc3VyZSBmaXJzdCBlbnRyeSBpcyBhc3NvY2lhdGVkIHRvIHRoZSByb290Ci0JfSBmaW5hbGx5IHsKLQkJaWYgKGxpYkRpciAhPSBudWxsKSB7Ci0JCQlTdHJpbmdbXSBsaWJKYXJzID0gbGliRGlyLmxpc3QoKTsKLQkJCWlmIChsaWJKYXJzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gbGliSmFycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCQluZXcgRmlsZShsaWJEaXIsIGxpYkphcnNbaV0pLmRlbGV0ZSgpOwotCQkJCX0KLQkJCX0KLQkJCWxpYkRpci5kZWxldGUoKTsKLQkJfQotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQkJSmF2YUNvcmUucmVtb3ZlQ2xhc3NwYXRoVmFyaWFibGUoIk15VmFyIiwgbnVsbCk7Ci0JfQotfQotLyoqCi0gKiBUZXN0cyB0aGF0IGNsb3NpbmcgYW5kIG9wZW5pbmcgYSBwcm9qZWN0IHRyaWdnZXJzIHRoZSBjb3JyZWN0IGRlbHRhcy4KLSAqLwotcHVibGljIHZvaWQgdGVzdFByb2plY3RDbG9zZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlKYXZhUHJvamVjdCBqcHJvamVjdD0gZ2V0SmF2YVByb2plY3QoIkphdmFQcm9qZWN0VGVzdHMiKTsKLQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIG9yaWdpbmFsUm9vdHMgPSBqcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOwotCUlQcm9qZWN0IHByb2plY3Q9IGpwcm9qZWN0LmdldFByb2plY3QoKTsKLQotCXRyeSB7Ci0JCXN0YXJ0RGVsdGFzKCk7Ci0JCXByb2plY3QuY2xvc2UobnVsbCk7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIDEiLAotCQkJIkphdmFQcm9qZWN0VGVzdHNbLV06IHt9XG4iICsgCi0JCQkiUmVzb3VyY2VEZWx0YSgvSmF2YVByb2plY3RUZXN0cykiCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJdHJ5IHsKLQkJCWNsZWFyRGVsdGFzKCk7Ci0JCQkKLQkJCXByb2plY3Qub3BlbihudWxsKTsKLQkJCWFzc2VydERlbHRhcygKLQkJCQkiVW5leHBlY3RlZCBkZWx0YSAyIiwKLQkJCQkiSmF2YVByb2plY3RUZXN0c1srXToge31cbiIgKyAKLQkJCQkiUmVzb3VyY2VEZWx0YSgvSmF2YVByb2plY3RUZXN0cykiCi0JCQkpOwotCi0JCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIG9wZW5Sb290cyA9IGpwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0JCQlhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBzYW1lIG51bWJlciBvZiByb290cyIsIG9wZW5Sb290cy5sZW5ndGggPT0gb3JpZ2luYWxSb290cy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcGVuUm9vdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlhc3NlcnRUcnVlKCJyb290IG5vdCB0aGUgc2FtZSIsIG9wZW5Sb290c1tpXS5lcXVhbHMob3JpZ2luYWxSb290c1tpXSkpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJc3RvcERlbHRhcygpOwotCQl9Ci0JfQotfQotLyoqCi0gKiBUZXN0IHRoYXQgYSBwcm9qZWN0IGhhcyBhIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RQcm9qZWN0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUphdmFQcm9qZWN0IHByb2plY3Q9IGdldEphdmFQcm9qZWN0KCJKYXZhUHJvamVjdFRlc3RzIik7Ci0JSVJlc291cmNlIGNvcnI9IHByb2plY3QuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7Ci0JSVJlc291cmNlIHJlcz0gZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoIkphdmFQcm9qZWN0VGVzdHMiKTsKLQlhc3NlcnRUcnVlKCJpbmNvcnJlY3QgY29ycmVzcG9uZGluZyByZXNvdXJjZSIsIGNvcnIuZXF1YWxzKHJlcykpOwotfQotLyoqCi0gKiBUZXN0IHRoYXQgdGhlIGNvcnJlY3QgY2hpbGRyZW4gZXhpc3QgaW4gYSBwcm9qZWN0Ci0gKi8KLXB1YmxpYyB2b2lkIHRlc3RQcm9qZWN0R2V0Q2hpbGRyZW4oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJSmF2YVByb2plY3QgcHJvamVjdCA9IGdldEphdmFQcm9qZWN0KCJKYXZhUHJvamVjdFRlc3RzIik7Ci0JSUphdmFFbGVtZW50W10gcm9vdHM9IHByb2plY3QuZ2V0Q2hpbGRyZW4oKTsKLQlhc3NlcnRUcnVlKCJzaG91bGQgYmUgcGFja2FnZSAzIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBjaGlsZHJlbiBpbiAnSmF2YVByb2plY3RUZXN0cycsIHdlcmUgIiArIHJvb3RzLmxlbmd0aCAsIHJvb3RzLmxlbmd0aCA9PSAzKTsKLX0KLS8qKgotICogVGVzdCB0aGF0IHRoZSBjb3JyZWN0IHBhY2thZ2UgZnJhZ21lbnRzIGV4aXN0IGluIHRoZSBwcm9qZWN0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UHJvamVjdEdldFBhY2thZ2VGcmFnbWVudHMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJSmF2YVByb2plY3QgcHJvamVjdD0gZ2V0SmF2YVByb2plY3QoIkphdmFQcm9qZWN0VGVzdHMiKTsKLQlJUGFja2FnZUZyYWdtZW50W10gZnJhZ21lbnRzPSBwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudHMoKTsKLQlhc3NlcnRUcnVlKCJzaG91bGQgYmUgcGFja2FnZSAxMiBwYWNrYWdlIGZyYWdtZW50cyBpbiAnSmF2YVByb2plY3RUZXN0cycsIHdlcmUgIiArIGZyYWdtZW50cy5sZW5ndGggLCBmcmFnbWVudHMubGVuZ3RoID09IDExKTsKLX0KLS8qKgotICogVGVzdCB0aGF0IHRoZSBjb3JyZWN0IHBhY2thZ2UgZnJhZ21lbnRzIGV4aXN0IGluIHRoZSBwcm9qZWN0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Um9vdEdldFBhY2thZ2VGcmFnbWVudHMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290PSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCJKYXZhUHJvamVjdFRlc3RzIiwgIiIpOwotCUlKYXZhRWxlbWVudFtdIGZyYWdtZW50cz0gcm9vdC5nZXRDaGlsZHJlbigpOwotCWFzc2VydFRydWUoInNob3VsZCBiZSBwYWNrYWdlIDUgcGFja2FnZSBmcmFnbWVudHMgaW4gc291cmNlIHJvb3QsIHdlcmUgIiArIGZyYWdtZW50cy5sZW5ndGggLCBmcmFnbWVudHMubGVuZ3RoID09IDQpOwotCi0Jcm9vdD0gZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgiSmF2YVByb2plY3RUZXN0cyIsICJsaWIuamFyIik7Ci0JZnJhZ21lbnRzPSByb290LmdldENoaWxkcmVuKCk7CQotCWFzc2VydFRydWUoInNob3VsZCBiZSBwYWNrYWdlIDMgcGFja2FnZSBmcmFnbWVudHMgaW4gbGliLmphciwgd2VyZSAiICsgZnJhZ21lbnRzLmxlbmd0aCAsIGZyYWdtZW50cy5sZW5ndGggPT0gMyk7Ci19Ci0vKioKLSAqIFRlc3QgdGhhdCB0aGUgY29ycmVjdCBwYWNrYWdlIGZyYWdtZW50cyBleGlzdCBpbiB0aGUgcHJvamVjdC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAzMjA0MSBNdWx0aXBsZSBvdXRwdXQgZm9sZGVycyBmb29saW5nIEphdmEgTW9kZWwpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSb290R2V0UGFja2FnZUZyYWdtZW50czIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIpOwotCQl0aGlzLmNyZWF0ZUZvbGRlcigiL1AvYmluIik7Ci0JCXRoaXMuY3JlYXRlRm9sZGVyKCIvUC9iaW4yIik7Ci0JCXRoaXMuZWRpdEZpbGUoCi0JCQkiL1AvLmNsYXNzcGF0aCIsIAotCQkJIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIiArCi0JCQkiPGNsYXNzcGF0aD5cbiIgKwotCQkJIiAgICA8Y2xhc3NwYXRoZW50cnkga2luZD1cInNyY1wiIG91dHB1dD1cImJpbjJcIiBwYXRoPVwiXCIvPlxuIiArCi0JCQkiICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPVwib3V0cHV0XCIgcGF0aD1cImJpblwiLz5cbiIgKwotCQkJIjwvY2xhc3NwYXRoPiIKLQkJKTsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoIi9QIik7Ci0JCWFzc2VydEVsZW1lbnRzRXF1YWwoCi0JCQkiVW5leHBlY3RlZCBwYWNrYWdlcyIsCi0JCQkiIiwKLQkJCXJvb3QuZ2V0Q2hpbGRyZW4oKSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoqCi0gKiBFbnN1cmUgYSBzb3VyY2UgZm9sZGVyIGNhbiBoYXZlIGEgbmFtZSBlbmRpbmcgd2l0aCAiLmphciIKLSAqLwotcHVibGljIHZvaWQgdGVzdFNvdXJjZUZvbGRlcldpdGhKYXJOYW1lKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyJzcmMuamFyIn0sICJiaW4iKTsKLQkJSUZpbGUgZmlsZSA9IGNyZWF0ZUZpbGUoIi9QL3NyYy5qYXIvWC5qYXZhIiwgImNsYXNzIFgge30iKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gKElDb21waWxhdGlvblVuaXQpSmF2YUNvcmUuY3JlYXRlKGZpbGUpOwotCQl1bml0LmdldEFsbFR5cGVzKCk7IC8vIGZvcmNlIHRvIG9wZW4KLQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0VHJ1ZSgidW5hYmxlIHRvIG9wZW4gdW5pdCBpbiAnc3JjLmphcicgc291cmNlIGZvbGRlciIsIGZhbHNlKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19LyoqCi0gKiBUZXN0IHRoYXQgYSBtZXRob2QKLSAqIGhhcyBubyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0U291cmNlTWV0aG9kQ29ycmVzcG9uZGluZ1Jlc291cmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBlbGVtZW50PSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFQcm9qZWN0VGVzdHMiLCAiIiwgInEiLCAiQS5qYXZhIik7Ci0JSU1ldGhvZFtdIG1ldGhvZHMgPSBlbGVtZW50LmdldFR5cGUoIkEiKS5nZXRNZXRob2RzKCk7Ci0JYXNzZXJ0VHJ1ZSgibWlzc2luZyBtZXRob2RzIiwgbWV0aG9kcy5sZW5ndGggPiAwKTsKLQlJUmVzb3VyY2UgY29ycj0gbWV0aG9kc1swXS5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKLQlhc3NlcnRUcnVlKCJpbmNvcnJlY3QgY29ycmVzcG9uZGluZyByZXNvdXJjZSIsIGNvcnIgPT0gbnVsbCk7Ci19Ci0vKioKLSAqIFRlc3QgdGhlIGpka2xldmVsIG9mIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3QKLSAqLwotcHVibGljIHZvaWQgdGVzdEpka0xldmVsUm9vdCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3Q9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoIkphdmFQcm9qZWN0TGliVGVzdHMiLCAibGliLyIpOwotCWFzc2VydEVxdWFscygid3JvbmcgdHlwZSIsIElQYWNrYWdlRnJhZ21lbnRSb290LktfQklOQVJZLCByb290LmdldEtpbmQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCJ3cm9uZyBqZGsgbGV2ZWwiLCBDbGFzc0ZpbGVDb25zdGFudHMuSkRLMV8xLCBVdGlsLmdldEpka0xldmVsKHJvb3QuZ2V0UmVzb3VyY2UoKSkpOwotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0phdmFTZWFyY2hNdWx0aXBsZVByb2plY3RzVGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9KYXZhU2VhcmNoTXVsdGlwbGVQcm9qZWN0c1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YTcxZGEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0phdmFTZWFyY2hNdWx0aXBsZVByb2plY3RzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsLkphdmFTZWFyY2hUZXN0cy5KYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yOwotCi0vKioKLSAqIFRlc3RzIHRoZSBKYXZhIHNlYXJjaCBlbmdpbmUgYWNjcm9zcyBtdWx0aXBsZSBwcm9qZWN0cy4KLSAqLwotcHVibGljIGNsYXNzIEphdmFTZWFyY2hNdWx0aXBsZVByb2plY3RzVGVzdHMgZXh0ZW5kcyBNb2RpZnlpbmdSZXNvdXJjZVRlc3RzIGltcGxlbWVudHMgSUphdmFTZWFyY2hDb25zdGFudHMgewotcHVibGljIEphdmFTZWFyY2hNdWx0aXBsZVByb2plY3RzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlyZXR1cm4gbmV3IFN1aXRlKEphdmFTZWFyY2hNdWx0aXBsZVByb2plY3RzVGVzdHMuY2xhc3MpOwotfQotLyoqCi0gKiBTZWFyY2ggZm9yIHJlZmVyZW5jZXMgaW4gYSBoaWVyYXJjaHkgc2hvdWxkIGZpbmQgbWF0Y2hlcyBpbiBzdXBlciB0eXBlLgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDMxNzQ4IFtzZWFyY2hdIHNlYXJjaCBmb3IgcmVmZXJlbmNlIGlzIGJyb2tlbiAyLjEgTTUpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RIaWVyYXJjaHlTY29wZTEoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJY3JlYXRlSmF2YVByb2plY3QoIlAxIik7Ci0JCWNyZWF0ZUZvbGRlcigiL1AxL3AiKTsKLQkJY3JlYXRlRmlsZSgKLQkJCSIvUDEvcC9YLmphdmEiLAotCQkJInBhY2thZ2UgcDtcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIglwcm90ZWN0ZWQgdm9pZCBmb28oKSB7XG4iICsKLQkJCSIJfVxuIiArCi0JCQkiCXZvaWQgYmFyKCkge1xuIiArCi0JCQkiCQlmb28oKTtcbiIgKwotCQkJIgl9XG4iICsKLQkJCSJ9IiAKLQkJKTsKLQkJY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHsiIn0sIG5ldyBTdHJpbmdbXSB7IkpDTF9MSUIifSwgbmV3IFN0cmluZ1tdIHsiL1AxIn0sICIiKTsKLQkJY3JlYXRlRmlsZSgKLQkJCSIvUDIvWS5qYXZhIiwKLQkJCSJpbXBvcnQgcC5YO1xuIiArCi0JCQkicHVibGljIGNsYXNzIFkgZXh0ZW5kcyBYIHtcbiIgKwotCQkJIglwcm90ZWN0ZWQgdm9pZCBmb28oKSB7XG4iICsKLQkJCSIJfVxuIiArCi0JCQkifSIgCi0JCSk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QMi9ZLmphdmEiKTsKLQkJSVR5cGUgdHlwZSA9IGN1LmdldFR5cGUoIlkiKTsKLQkJSU1ldGhvZCBtZXRob2QgPSB0eXBlLmdldE1ldGhvZCgiZm9vIiwgbmV3IFN0cmluZ1tdIHt9KTsKLQkJSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVIaWVyYXJjaHlTY29wZSh0eXBlKTsKLQkJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCQlyZXN1bHRDb2xsZWN0b3Iuc2hvd1Byb2plY3QgPSB0cnVlOwotCQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQkJZ2V0V29ya3NwYWNlKCksIAotCQkJbWV0aG9kLCAKLQkJCVJFRkVSRU5DRVMsIAotCQkJc2NvcGUsIAotCQkJcmVzdWx0Q29sbGVjdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJInAvWC5qYXZhIFtpbiBQMV0gcC5YLmJhcigpIC0+IHZvaWQgW2ZvbygpXSIsIAotCQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotCX0gZmluYWxseSB7Ci0JCWRlbGV0ZVByb2plY3QoIlAxIik7Ci0JCWRlbGV0ZVByb2plY3QoIlAyIik7Ci0JfQotfQotLyoqCi0gKiBTZWFyY2ggZm9yIHJlZmVyZW5jZXMgaW4gYSBoaWVyYXJjaHkgc2hvdWxkIGZpbmQgbWF0Y2hlcyBpbiBzdXBlciB0eXBlLgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDMxNzQ4IFtzZWFyY2hdIHNlYXJjaCBmb3IgcmVmZXJlbmNlIGlzIGJyb2tlbiAyLjEgTTUpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RIaWVyYXJjaHlTY29wZTIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJY3JlYXRlSmF2YVByb2plY3QoIlAxIik7Ci0JCWNyZWF0ZUZvbGRlcigiL1AxL3AiKTsKLQkJY3JlYXRlRmlsZSgKLQkJCSIvUDEvcC9YLmphdmEiLAotCQkJInBhY2thZ2UgcDtcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIglwcm90ZWN0ZWQgdm9pZCBmb28oKSB7XG4iICsKLQkJCSIJfVxuIiArCi0JCQkiCXZvaWQgYmFyKCkge1xuIiArCi0JCQkiCQlmb28oKTtcbiIgKwotCQkJIgl9XG4iICsKLQkJCSJ9IiAKLQkJKTsKLQkJY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHsiIn0sIG5ldyBTdHJpbmdbXSB7IkpDTF9MSUIifSwgbmV3IFN0cmluZ1tdIHsiL1AxIn0sICIiKTsKLQkJY3JlYXRlRmlsZSgKLQkJCSIvUDIvWS5qYXZhIiwKLQkJCSJpbXBvcnQgcC5YO1xuIiArCi0JCQkicHVibGljIGNsYXNzIFkgZXh0ZW5kcyBYIHtcbiIgKwotCQkJIglwcm90ZWN0ZWQgdm9pZCBmb28oKSB7XG4iICsKLQkJCSIJfVxuIiArCi0JCQkifSIgCi0JCSk7Ci0JCWNyZWF0ZUZpbGUoCi0JCQkiL1AyL1ouamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFogZXh0ZW5kcyBZIHtcbiIgKwotCQkJIglwcm90ZWN0ZWQgdm9pZCBmb28oKSB7XG4iICsKLQkJCSIJfVxuIiArCi0JCQkifSIgCi0JCSk7Ci0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1AyL1ouamF2YSIpOwotCQlJVHlwZSB0eXBlID0gY3UuZ2V0VHlwZSgiWiIpOwotCQlJTWV0aG9kIG1ldGhvZCA9IHR5cGUuZ2V0TWV0aG9kKCJmb28iLCBuZXcgU3RyaW5nW10ge30pOwotCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0gU2VhcmNoRW5naW5lLmNyZWF0ZUhpZXJhcmNoeVNjb3BlKHR5cGUpOwotCQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JCXJlc3VsdENvbGxlY3Rvci5zaG93UHJvamVjdCA9IHRydWU7Ci0JCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCQltZXRob2QsIAotCQkJUkVGRVJFTkNFUywgCi0JCQlzY29wZSwgCi0JCQlyZXN1bHRDb2xsZWN0b3IpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkicC9YLmphdmEgW2luIFAxXSBwLlguYmFyKCkgLT4gdm9pZCBbZm9vKCldIiwgCi0JCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJZGVsZXRlUHJvamVjdCgiUDEiKTsKLQkJZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0vKioKLSAqIFNlYXJjaCBmb3IgcmVmZXJlbmNlcyBpbiBhIGhpZXJhcmNoeSBzaG91bGQgZmluZCBtYXRjaGVzIGluIHN1cGVyIHR5cGUuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMzU3NTUgU2VhcmNoIGluIGhpZXJhcmNoeSBtaXNzZXMgZGVwZW5kZW50IHByb2plY3RzICkKLSAqLwotcHVibGljIHZvaWQgdGVzdEhpZXJhcmNoeVNjb3BlMygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQljcmVhdGVKYXZhUHJvamVjdCgiUDEiKTsKLQkJY3JlYXRlRm9sZGVyKCIvUDEvcCIpOwotCQljcmVhdGVGaWxlKAotCQkJIi9QMS9wL1guamF2YSIsCi0JCQkicGFja2FnZSBwO1xuIiArCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkiCXByb3RlY3RlZCB2b2lkIGZvbygpIHtcbiIgKwotCQkJIgl9XG4iICsKLQkJCSJ9IiAKLQkJKTsKLQkJY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHsiIn0sIG5ldyBTdHJpbmdbXSB7IkpDTF9MSUIifSwgbmV3IFN0cmluZ1tdIHsiL1AxIn0sICIiKTsKLQkJY3JlYXRlRm9sZGVyKCIvUDIvcSIpOwotCQljcmVhdGVGaWxlKAotCQkJIi9QMi9xL1kuamF2YSIsCi0JCQkicGFja2FnZSBxO1xuIiArCi0JCQkiaW1wb3J0IHAuWDtcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBZIGV4dGVuZHMgWCB7XG4iICsKLQkJCSIJdm9pZCBiYXIoKSB7XG4iICsKLQkJCSIJCWZvbygpO1xuIiArCi0JCQkiCX1cbiIgKwotCQkJIn0iIAotCQkpOwotCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QMS9wL1guamF2YSIpOwotCQlJVHlwZSB0eXBlID0gY3UuZ2V0VHlwZSgiWCIpOwotCQlJTWV0aG9kIG1ldGhvZCA9IHR5cGUuZ2V0TWV0aG9kKCJmb28iLCBuZXcgU3RyaW5nW10ge30pOwotCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0gU2VhcmNoRW5naW5lLmNyZWF0ZUhpZXJhcmNoeVNjb3BlKHR5cGUpOwotCQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JCXJlc3VsdENvbGxlY3Rvci5zaG93UHJvamVjdCA9IHRydWU7Ci0JCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCQltZXRob2QsIAotCQkJUkVGRVJFTkNFUywgCi0JCQlzY29wZSwgCi0JCQlyZXN1bHRDb2xsZWN0b3IpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkicS9ZLmphdmEgW2luIFAyXSBxLlkuYmFyKCkgLT4gdm9pZCBbZm9vKCldIiwgCi0JCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJZGVsZXRlUHJvamVjdCgiUDEiKTsKLQkJZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0vKioKLSAqIFNlYXJjaCBmb3IgcmVmZXJlbmNlcyBpbiBhIGhpZXJhcmNoeSBzaG91bGQgbm90IGZpbmQgaW5hY2N1cmF0ZSBtYXRjaCBpZiByZWZlcmVuY2UgaXMgaW5kaXJlY3QuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMzU3NTUgU2VhcmNoIGluIGhpZXJhcmNoeSBtaXNzZXMgZGVwZW5kZW50IHByb2plY3RzICkKLSAqLwotcHVibGljIHZvaWQgdGVzdEhpZXJhcmNoeVNjb3BlNCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQljcmVhdGVKYXZhUHJvamVjdCgiUDAiKTsKLQkJY3JlYXRlRm9sZGVyKCIvUDAvcDAiKTsKLQkJY3JlYXRlRmlsZSgKLQkJCSIvUDAvcDAvWC5qYXZhIiwKLQkJCSJwYWNrYWdlIHAwO1xuIiArCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkiICBwdWJsaWMgc3RhdGljIFggVGhlWDtcbiIgKwotCQkJIglwdWJsaWMgdm9pZCBmb28oKSB7XG4iICsKLQkJCSIJfVxuIiArCi0JCQkifSIgCi0JCSk7Ci0JCWNyZWF0ZUphdmFQcm9qZWN0KCJQMSIsIG5ldyBTdHJpbmdbXSB7IiJ9LCBuZXcgU3RyaW5nW10geyJKQ0xfTElCIn0sIG5ldyBTdHJpbmdbXSB7Ii9QMCJ9LCAiIik7Ci0JCWNyZWF0ZUZvbGRlcigiL1AxL3AxIik7Ci0JCWNyZWF0ZUZpbGUoCi0JCQkiL1AxL3AxL1QuamF2YSIsCi0JCQkicGFja2FnZSBwMTtcbiIgKwotCQkJImltcG9ydCBwMC5YO1xuIiArCi0JCQkicHVibGljIGNsYXNzIFQge1xuIiArCi0JCQkiCXB1YmxpYyBYIHpvcmsoKSB7XG4iICsKLQkJCSIJCXJldHVybiBYLlRoZVg7XG4iICsKLQkJCSIJfVxuIiArCi0JCQkifSIgCi0JCSk7Ci0JCWNyZWF0ZUphdmFQcm9qZWN0KCJQMiIsIG5ldyBTdHJpbmdbXSB7IiJ9LCBuZXcgU3RyaW5nW10geyJKQ0xfTElCIn0sIG5ldyBTdHJpbmdbXSB7Ii9QMCIsICIvUDEifSwgIiIpOwotCQljcmVhdGVGb2xkZXIoIi9QMi9wMiIpOwotCQljcmVhdGVGaWxlKAotCQkJIi9QMi9wMi9ZLmphdmEiLAotCQkJInBhY2thZ2UgcDI7XG4iICsKLQkJCSJpbXBvcnQgcDAuWDtcbiIgKwotCQkJImltcG9ydCBwMS5UO1xuIiArCi0JCQkicHVibGljIGNsYXNzIFkgZXh0ZW5kcyBYIHtcbiIgKwotCQkJIglwdWJsaWMgdm9pZCBiYXIoKSB7XG4iICsKLQkJCSIJCW5ldyBUKCkuem9yaygpLmZvbygpO1xuIiArCi0JCQkiCX1cbiIgKwotCQkJIn0iIAotCQkpOwotCQljcmVhdGVKYXZhUHJvamVjdCgiUDMiLCBuZXcgU3RyaW5nW10geyIifSwgbmV3IFN0cmluZ1tdIHsiSkNMX0xJQiJ9LCBuZXcgU3RyaW5nW10geyIvUDAiLCAiL1AyIn0sICIiKTsKLQkJY3JlYXRlRm9sZGVyKCIvUDMvcDMiKTsKLQkJY3JlYXRlRmlsZSgKLQkJCSIvUDMvcDMvWi5qYXZhIiwKLQkJCSJwYWNrYWdlIHAzO1xuIiArCi0JCQkiaW1wb3J0IHAwLlg7XG4iICsKLQkJCSJpbXBvcnQgcDIuWTtcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBaIGV4dGVuZHMgWSB7XG4iICsKLQkJCSIJc3RhdGljIHtcbiIgKwotCQkJIgkJWC5UaGVYID0gbmV3IFooKTsgLy8gem9yaygpIHdpbGwgYWN0dWFsbHkgYW5zd2VyIGFuIGluc3RhbmNlIG9mIFpcbiIgKwotCQkJIgl9XG4iICsKLQkJCSIJcHVibGljIHZvaWQgZm9vKCkge1xuIiArCi0JCQkiCX0gLy8gcmVmcyBzaG91bGQgZmluZCBvbmUgaW4gWS5iYXIoKVxuIiArCi0JCQkifSIgCi0JCSk7Ci0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1AzL3AzL1ouamF2YSIpOwotCQlJVHlwZSB0eXBlID0gY3UuZ2V0VHlwZSgiWiIpOwotCQlJTWV0aG9kIG1ldGhvZCA9IHR5cGUuZ2V0TWV0aG9kKCJmb28iLCBuZXcgU3RyaW5nW10ge30pOwotCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0gU2VhcmNoRW5naW5lLmNyZWF0ZUhpZXJhcmNoeVNjb3BlKHR5cGUpOwotCQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JCXJlc3VsdENvbGxlY3Rvci5zaG93QWNjdXJhY3kgPSB0cnVlOwotCQlyZXN1bHRDb2xsZWN0b3Iuc2hvd1Byb2plY3QgPSB0cnVlOwotCQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQkJZ2V0V29ya3NwYWNlKCksIAotCQkJbWV0aG9kLCAKLQkJCVJFRkVSRU5DRVMsIAotCQkJc2NvcGUsIAotCQkJcmVzdWx0Q29sbGVjdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJInAyL1kuamF2YSBbaW4gUDJdIHAyLlkuYmFyKCkgLT4gdm9pZCBbZm9vKCldIEVYQUNUX01BVENIIiwgCi0JCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJZGVsZXRlUHJvamVjdHMobmV3IFN0cmluZ1tdIHsiUDAiLCAiUDEiLCAiUDIiLCAiUDMifSk7Ci0JfQotfQotLyoqCi0gKiBNZXRob2Qgb2NjdXJlbmNlcyB3aXRoIDIgdW5yZWxhdGVkIHByb2plY3RzIHRoYXQgY29udGFpbiB0aGUgc2FtZSBzb3VyY2UuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMzM4MDAgc2VhcmNoOiByZXBvcnRpbmcgdG9vIG1hbnkgbWV0aG9kIG9jY3VycmVuY2VzKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0TWV0aG9kT2NjdXJlbmNlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQkvLyBzZXR1cCBwcm9qZWN0IFAxCi0JCUlKYXZhUHJvamVjdCBwMSA9IGNyZWF0ZUphdmFQcm9qZWN0KCJQMSIpOwotCQljcmVhdGVGb2xkZXIoIi9QMS9wIik7Ci0JCWNyZWF0ZUZpbGUoCi0JCQkiL1AxL3AvSS5qYXZhIiwKLQkJCSJwYWNrYWdlIHA7XG4iICsKLQkJCSJwdWJsaWMgaW50ZXJmYWNlIEkge1xuIiArCi0JCQkiICAgIHZvaWQgbWV0aG9kKE9iamVjdCBvKTtcbiIgKwotCQkJIn0iCi0JCSk7Ci0JCWNyZWF0ZUZpbGUoCi0JCQkiL1AxL3AvQy5qYXZhIiwKLQkJCSJwYWNrYWdlIHA7XG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgQyBpbXBsZW1lbnRzIEkge1xuIiArCi0JCQkiICAgIHZvaWQgbWV0aG9kKE9iamVjdCBvKSB7XG4iICsKLQkJCSIgICAgfVxuIiArCi0JCQkifSIKLQkJKTsKLQkJCi0JCS8vIGNvcHkgdG8gcHJvamVjdCBQMgotCQlwMS5nZXRQcm9qZWN0KCkuY29weShuZXcgUGF0aCgiL1AyIiksIGZhbHNlLCBudWxsKTsKLQkJSUphdmFQcm9qZWN0IHAyID0gZ2V0SmF2YVByb2plY3QoIlAyIik7Ci0JCQotCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0gU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShuZXcgSUphdmFFbGVtZW50W10ge3AxLCBwMn0pOwotCQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JCXJlc3VsdENvbGxlY3Rvci5zaG93UHJvamVjdCA9IHRydWU7Ci0JCUlNZXRob2QgbWV0aG9kID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUDEvcC9JLmphdmEiKS5nZXRUeXBlKCJJIikuZ2V0TWV0aG9kKCJtZXRob2QiLCBuZXcgU3RyaW5nW10geyJRT2JqZWN0OyJ9KTsKLQkJbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJCWdldFdvcmtzcGFjZSgpLCAKLQkJCW1ldGhvZCwKLQkJCUFMTF9PQ0NVUlJFTkNFUywgCi0JCQlzY29wZSwgCi0JCQlyZXN1bHRDb2xsZWN0b3IpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVW5leHBlY3RlZCBvY2N1cmVuY2VzIG9mIG1ldGhvZCBwLkkubWV0aG9kKE9iamVjdCkiLAotCQkJInAvQy5qYXZhIFtpbiBQMV0gcC5DLm1ldGhvZChPYmplY3QpIC0+IHZvaWQgW21ldGhvZF1cbiIgKwotCQkJInAvSS5qYXZhIFtpbiBQMV0gcC5JLm1ldGhvZChPYmplY3QpIC0+IHZvaWQgW21ldGhvZF0iLCAKLQkJCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLQl9IGZpbmFsbHkgewotCQlkZWxldGVQcm9qZWN0KCJQMSIpOwotCQlkZWxldGVQcm9qZWN0KCJQMiIpOwotCX0KLX0KLS8qKgotICogVHlwZSBkZWNsYXJhdGlvbiBpbiBleHRlcm5hbCBqYXIgZmlsZSB0aGF0IGlzIHNoYXJlZCBieSAyIHByb2plY3RzLgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDI3NDg1IFNlYXJjaEVuZ2luZSByZXR1cm5zIHdyb25nIGphdmEgZWxlbWVudCB3aGVuIHNlYXJjaGluZyBpbiBhbiBhcmNoaXZlIHRoYXQgaXMgaW5jbHVkZWQgYnkgdHdvIGRpc3RpbmN0IGphdmEgcHJvamVjdHMuKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0VHlwZURlY2xhcmF0aW9uSW5KYXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IHAxID0gY3JlYXRlSmF2YVByb2plY3QoIlAxIiwgbmV3IFN0cmluZ1tdIHt9LCBuZXcgU3RyaW5nW10geyJKQ0xfTElCIn0sICIiKTsKLQkJSUphdmFQcm9qZWN0IHAyID0gY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHt9LCBuZXcgU3RyaW5nW10geyJKQ0xfTElCIn0sICIiKTsKLQkJCi0JCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKG5ldyBJSmF2YUVsZW1lbnRbXSB7cDF9KTsKLQkJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCQlyZXN1bHRDb2xsZWN0b3Iuc2hvd1Byb2plY3QgPSB0cnVlOwotCQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQkJZ2V0V29ya3NwYWNlKCksIAotCQkJIk9iamVjdCIsCi0JCQlUWVBFLCAKLQkJCURFQ0xBUkFUSU9OUywgCi0JCQlzY29wZSwgCi0JCQlyZXN1bHRDb2xsZWN0b3IpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVW5leHBlY3RlZCByZXN1bHQgaW4gc2NvcGUgb2YgUDEiLAotCQkJZ2V0RXh0ZXJuYWxKQ0xQYXRoU3RyaW5nKCkgKyAiIFtpbiBQMV0gamF2YS5sYW5nLk9iamVjdCIsIAotCQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotCQkJCi0JCXNjb3BlID0gU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShuZXcgSUphdmFFbGVtZW50W10ge3AyfSk7Ci0JCXJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JCXJlc3VsdENvbGxlY3Rvci5zaG93UHJvamVjdCA9IHRydWU7Ci0JCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCQkiT2JqZWN0IiwKLQkJCVRZUEUsIAotCQkJREVDTEFSQVRJT05TLCAKLQkJCXNjb3BlLCAKLQkJCXJlc3VsdENvbGxlY3Rvcik7Ci0JCWFzc2VydEVxdWFscygKLQkJCSJVbmV4cGVjdGVkIHJlc3VsdCBpbiBzY29wZSBvZiBQMiIsCi0JCQlnZXRFeHRlcm5hbEpDTFBhdGhTdHJpbmcoKSArICIgW2luIFAyXSBqYXZhLmxhbmcuT2JqZWN0IiwgCi0JCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJZGVsZXRlUHJvamVjdCgiUDEiKTsKLQkJZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvSmF2YVNlYXJjaFRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvSmF2YVNlYXJjaFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MzI1NDAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL0phdmFTZWFyY2hUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi0vKioKLSAqIFRlc3RzIHRoZSBKYXZhIHNlYXJjaCBlbmdpbmUgd2hlcmUgcmVzdWx0cyBhcmUgSmF2YUVsZW1lbnRzIGFuZCBzb3VyY2UgcG9zaXRpb25zLgotICovCi1wdWJsaWMgY2xhc3MgSmF2YVNlYXJjaFRlc3RzIGV4dGVuZHMgQWJzdHJhY3RKYXZhTW9kZWxUZXN0cyBpbXBsZW1lbnRzIElKYXZhU2VhcmNoQ29uc3RhbnRzIHsKLQotLyoqCi0gKiBDb2xsZWN0cyByZXN1bHRzIGFzIGEgc3RyaW5nLgotICovCi1wdWJsaWMgc3RhdGljIGNsYXNzIEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgaW1wbGVtZW50cyBJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciB7Ci0JcHVibGljIFN0cmluZ0J1ZmZlciByZXN1bHRzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCXB1YmxpYyBib29sZWFuIHNob3dBY2N1cmFjeSA9IGZhbHNlOwotCXB1YmxpYyBib29sZWFuIHNob3dQcm9qZWN0ID0gZmFsc2U7Ci0JcHVibGljIHZvaWQgYWJvdXRUb1N0YXJ0KCkgewotCX0KLQlwdWJsaWMgdm9pZCBhY2NlcHQoSVJlc291cmNlIHJlc291cmNlLCBpbnQgc3RhcnQsIGludCBlbmQsIElKYXZhRWxlbWVudCBlbGVtZW50LCBpbnQgYWNjdXJhY3kpIHsKLQkJdHJ5IHsKLQkJCWlmIChyZXN1bHRzLmxlbmd0aCgpID4gMCkgcmVzdWx0cy5hcHBlbmQoIlxuIik7Ci0JCQlJUGF0aCBwYXRoID0gcmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQkJaWYgKHBhdGguc2VnbWVudENvdW50KCkgPT0gMCkgewotCQkJCUlKYXZhRWxlbWVudCByb290ID0gZWxlbWVudDsKLQkJCQl3aGlsZSAocm9vdCAhPSBudWxsICYmICEocm9vdCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSkgewotCQkJCQlyb290ID0gcm9vdC5nZXRQYXJlbnQoKTsKLQkJCQl9Ci0JCQkJaWYgKHJvb3QgIT0gbnVsbCkgewotCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCBwa2dGcmFnbWVudFJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3Qpcm9vdDsKLQkJCQkJaWYgKHBrZ0ZyYWdtZW50Um9vdC5pc0V4dGVybmFsKCkpIHsKLQkJCQkJCXJlc3VsdHMuYXBwZW5kKHBrZ0ZyYWdtZW50Um9vdC5nZXRQYXRoKCkudG9PU1N0cmluZygpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJlc3VsdHMuYXBwZW5kKHBrZ0ZyYWdtZW50Um9vdC5nZXRQYXRoKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyZXN1bHRzLmFwcGVuZChwYXRoKTsKLQkJCX0KLQkJCWlmIChzaG93UHJvamVjdCkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBlbGVtZW50LmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQkJCXJlc3VsdHMuYXBwZW5kKCIgW2luICIpOwotCQkJCXJlc3VsdHMuYXBwZW5kKHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCQlyZXN1bHRzLmFwcGVuZCgiXSIpOwotCQkJfQotCQkJSUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gbnVsbDsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1ldGhvZCkgewotCQkJCXJlc3VsdHMuYXBwZW5kKCIgIik7Ci0JCQkJSU1ldGhvZCBtZXRob2QgPSAoSU1ldGhvZCllbGVtZW50OwotCQkJCXJlc3VsdHMuYXBwZW5kKG1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQkJCWlmICghbWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgewotCQkJCQlyZXN1bHRzLmFwcGVuZCgiLiIpOwotCQkJCQlyZXN1bHRzLmFwcGVuZChtZXRob2QuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQkJfQotCQkJCXJlc3VsdHMuYXBwZW5kKCIoIik7Ci0JCQkJU3RyaW5nW10gcGFyYW1ldGVycyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwkJCQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewotCQkJCQlyZXN1bHRzLmFwcGVuZChTaWduYXR1cmUudG9TdHJpbmcocGFyYW1ldGVyc1tpXSkpOwotCQkJCQlpZiAoaSA8IHBhcmFtZXRlcnMubGVuZ3RoLTEpIHsKLQkJCQkJCXJlc3VsdHMuYXBwZW5kKCIsICIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJlc3VsdHMuYXBwZW5kKCIpIik7Ci0JCQkJaWYgKCFtZXRob2QuaXNDb25zdHJ1Y3RvcigpKSB7Ci0JCQkJCXJlc3VsdHMuYXBwZW5kKCIgLT4gIik7Ci0JCQkJCXJlc3VsdHMuYXBwZW5kKFNpZ25hdHVyZS50b1N0cmluZyhtZXRob2QuZ2V0UmV0dXJuVHlwZSgpKSk7Ci0JCQkJfQotCQkJCXVuaXQgPSBtZXRob2QuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkgewotCQkJCXJlc3VsdHMuYXBwZW5kKCIgIik7Ci0JCQkJSVR5cGUgdHlwZSA9IChJVHlwZSllbGVtZW50OwotCQkJCXJlc3VsdHMuYXBwZW5kKHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQkJCXVuaXQgPSB0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZpZWxkKSB7Ci0JCQkJcmVzdWx0cy5hcHBlbmQoIiAiKTsKLQkJCQlJRmllbGQgZmllbGQgPSAoSUZpZWxkKWVsZW1lbnQ7Ci0JCQkJcmVzdWx0cy5hcHBlbmQoZmllbGQuZ2V0RGVjbGFyaW5nVHlwZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJCQlyZXN1bHRzLmFwcGVuZCgiLiIpOwotCQkJCXJlc3VsdHMuYXBwZW5kKGZpZWxkLmdldEVsZW1lbnROYW1lKCkpOwotCQkJCXVuaXQgPSBmaWVsZC5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElJbml0aWFsaXplcikgewotCQkJCXJlc3VsdHMuYXBwZW5kKCIgIik7Ci0JCQkJSUluaXRpYWxpemVyIGluaXRpYWxpemVyID0gKElJbml0aWFsaXplcillbGVtZW50OwotCQkJCXJlc3VsdHMuYXBwZW5kKGluaXRpYWxpemVyLmdldERlY2xhcmluZ1R5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCQkJcmVzdWx0cy5hcHBlbmQoIi4iKTsKLQkJCQlpZiAoRmxhZ3MuaXNTdGF0aWMoaW5pdGlhbGl6ZXIuZ2V0RmxhZ3MoKSkpIHsKLQkJCQkJcmVzdWx0cy5hcHBlbmQoInN0YXRpYyAiKTsKLQkJCQl9Ci0JCQkJcmVzdWx0cy5hcHBlbmQoInt9Iik7Ci0JCQkJdW5pdCA9IGluaXRpYWxpemVyLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkgewotCQkJCXJlc3VsdHMuYXBwZW5kKCIgIik7Ci0JCQkJcmVzdWx0cy5hcHBlbmQoZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKLQkJCX0KLQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJY2hhcltdIGNvbnRlbnRzID0gbnVsbDsKLQkJCQlpZiAoImphdmEiLmVxdWFscyhyZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkpKSB7Ci0JCQkJCWlmICghcmVzb3VyY2UuZXF1YWxzKGVsZW1lbnQuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkpKSB7Ci0JCQkJCQkvLyB3b3JraW5nIGNvcHkKLQkJCQkJCWNvbnRlbnRzID0gdW5pdC5nZXRCdWZmZXIoKS5nZXRDaGFyYWN0ZXJzKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljb250ZW50cyA9IG5ldyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuYmF0Y2guQ29tcGlsYXRpb25Vbml0KAotCQkJCQkJCW51bGwsIAotCQkJCQkJCSgoSUZpbGUpIHJlc291cmNlKS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmdldFBhdGgoKSwKLQkJCQkJCQludWxsKS5nZXRDb250ZW50cygpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChzdGFydCA9PSAtMSB8fCBjb250ZW50cyAhPSBudWxsKSB7IC8vIHJldHJpZXZpbmcgYXR0YWNoZWQgc291cmNlIG5vdCBpbXBsZW1lbnRlZCBoZXJlCi0JCQkJCXJlc3VsdHMuYXBwZW5kKCIgWyIpOwotCQkJCQlpZiAoc3RhcnQgPiAtMSkgewotCQkJCQkJcmVzdWx0cy5hcHBlbmQoQ2hhck9wZXJhdGlvbi5zdWJhcnJheShjb250ZW50cywgc3RhcnQsIGVuZCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmVzdWx0cy5hcHBlbmQoIk5vIHNvdXJjZSIpOwotCQkJCQl9Ci0JCQkJCXJlc3VsdHMuYXBwZW5kKCJdIik7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHNob3dBY2N1cmFjeSkgewotCQkJCXJlc3VsdHMuYXBwZW5kKCIgIik7Ci0JCQkJc3dpdGNoIChhY2N1cmFjeSkgewotCQkJCQljYXNlIEVYQUNUX01BVENIOgotCQkJCQkJcmVzdWx0cy5hcHBlbmQoIkVYQUNUX01BVENIIik7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBQT1RFTlRJQUxfTUFUQ0g6Ci0JCQkJCQlyZXN1bHRzLmFwcGVuZCgiUE9URU5USUFMX01BVENIIik7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXN1bHRzLmFwcGVuZCgiXG4iKTsKLQkJCXJlc3VsdHMuYXBwZW5kKGUudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgZG9uZSgpIHsKLQl9Ci0JcHVibGljIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHJlc3VsdHMudG9TdHJpbmcoKTsKLQl9Ci19Ci1wdWJsaWMgSmF2YVNlYXJjaFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wcml2YXRlIElKYXZhU2VhcmNoU2NvcGUgZ2V0SmF2YVNlYXJjaFNjb3BlKCkgewotCXJldHVybiBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKG5ldyBJSmF2YVByb2plY3RbXSB7Z2V0SmF2YVByb2plY3QoIkphdmFTZWFyY2giKX0pOwotfQotcHVibGljIHZvaWQgc2V0VXBTdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCXN1cGVyLnNldFVwU3VpdGUoKTsKLQkKLQlzZXRVcEphdmFQcm9qZWN0KCJKYXZhU2VhcmNoIik7Ci19Ci1wdWJsaWMgdm9pZCB0ZWFyRG93blN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JZGVsZXRlUHJvamVjdCgiSmF2YVNlYXJjaCIpOwotCQotCXN1cGVyLnRlYXJEb3duU3VpdGUoKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFN1aXRlKEphdmFTZWFyY2hUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQotCWlmIChmYWxzZSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RUeXBlT2NjdXJlbmNlMiIpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQkvLyBwYWNrYWdlIGRlY2xhcmF0aW9uCi0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0U2ltcGxlUGFja2FnZURlY2xhcmF0aW9uIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdFZhcmlvdXNQYWNrYWdlRGVjbGFyYXRpb25zIikpOwotCQotCS8vIHBhY2thZ2UgcmVmZXJlbmNlCi0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0U2ltcGxlUGFja2FnZVJlZmVyZW5jZSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RQYWNrYWdlUmVmZXJlbmNlMSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RQYWNrYWdlUmVmZXJlbmNlMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RWYXJpb3VzUGFja2FnZVJlZmVyZW5jZSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RBY2N1cmF0ZVBhY2thZ2VSZWZlcmVuY2UiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0UGF0dGVybk1hdGNoUGFja2FnZVJlZmVyZW5jZSIpKTsKLQotCS8vIHR5cGUgZGVjbGFyYXRpb24KLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RTaW1wbGVUeXBlRGVjbGFyYXRpb24iKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0VHlwZURlY2xhcmF0aW9uIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdFR5cGVEZWNsYXJhdGlvbkluSmFyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdFR5cGVEZWNsYXJhdGlvbkluSmFyMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RUeXBlRGVjbGFyYXRpb25JblBhY2thZ2VTY29wZSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RUeXBlRGVjbGFyYXRpb25JblBhY2thZ2VTY29wZTIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0TWVtYmVyVHlwZURlY2xhcmF0aW9uIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdFBhdHRlcm5NYXRjaFR5cGVEZWNsYXJhdGlvbiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RMb25nRGVjbGFyYXRpb24iKSk7Ci0JCi0JLy8gdHlwZSByZWZlcmVuY2UKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RTaW1wbGVUeXBlUmVmZXJlbmNlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdFR5cGVSZWZlcmVuY2UxIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdFR5cGVSZWZlcmVuY2UyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdFR5cGVSZWZlcmVuY2UzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdFR5cGVSZWZlcmVuY2U0IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdFR5cGVSZWZlcmVuY2VJbkluaXRpYWxpemVyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdFR5cGVSZWZlcmVuY2VBc1NpbmdsZU5hbWVSZWZlcmVuY2UiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0TWVtYmVyVHlwZVJlZmVyZW5jZSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RNZW1iZXJUeXBlUmVmZXJlbmNlMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RPYmplY3RNZW1iZXJUeXBlUmVmZXJlbmNlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdFR5cGVSZWZlcmVuY2VJblF1YWxpZmllZE5hbWVSZWZlcmVuY2UiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0VHlwZVJlZmVyZW5jZUluUXVhbGlmaWVkTmFtZVJlZmVyZW5jZTIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0VHlwZVJlZmVyZW5jZUluUXVhbGlmaWVkTmFtZVJlZmVyZW5jZTMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0VHlwZVJlZmVyZW5jZUluUXVhbGlmaWVkTmFtZVJlZmVyZW5jZTQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0VHlwZVJlZmVyZW5jZU5vdEluQ2xhc3NwYXRoIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdFZhcmlvdXNUeXBlUmVmZXJlbmNlcyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RUeXBlUmVmZXJlbmNlSW5JbXBvcnQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0VHlwZVJlZmVyZW5jZUluSW1wb3J0MiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RUeXBlUmVmZXJlbmNlSW5BcnJheSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RUeXBlUmVmZXJlbmNlSW5BcnJheTIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0TmVnYXRpdmVUeXBlUmVmZXJlbmNlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdFR5cGVSZWZlcmVuY2VJblRocm93cyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RJbm5hY3VyYXRlVHlwZVJlZmVyZW5jZTEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0SW5uYWN1cmF0ZVR5cGVSZWZlcmVuY2UyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdElubmFjdXJhdGVUeXBlUmVmZXJlbmNlMyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RUeXBlUmVmZXJlbmNlSW5DYXN0IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdFBhdHRlcm5NYXRjaFR5cGVSZWZlcmVuY2UiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0VHlwZVJlZmVyZW5jZU5vdENhc2VTZW5zaXRpdmUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0QWNjdXJhdGVUeXBlUmVmZXJlbmNlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdFR5cGVSZWZlcmVuY2VJbkhpZXJhcmNoeSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RUeXBlUmVmZXJlbmNlV2l0aFJlY292ZXJ5IikpOwotCQotCS8vIHR5cGUgb2NjdXJlbmNlcwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdFR5cGVPY2N1cmVuY2UiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0VHlwZU9jY3VyZW5jZTIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0VHlwZU9jY3VyZW5jZVdpdGhEb2xsYXIiKSk7Ci0JCi0JLy8gaW50ZXJmYWNlIGltcGxlbWVudG9yCi0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0SW50ZXJmYWNlSW1wbGVtZW50b3JzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdEludGVyZmFjZUltcGxlbWVudG9yczIiKSk7Ci0JCi0JLy8gbWV0aG9kIGRlY2xhcmF0aW9uCi0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0U2ltcGxlTWV0aG9kRGVjbGFyYXRpb24iKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0U2ltcGxlQ29uc3RydWN0b3JEZWNsYXJhdGlvbiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RJbm5lck1ldGhvZERlY2xhcmF0aW9uIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdE1ldGhvZERlY2xhcmF0aW9uSW5IaWVyYXJjaHlTY29wZTEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0TWV0aG9kRGVjbGFyYXRpb25JbkhpZXJhcmNoeVNjb3BlMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RNZXRob2REZWNsYXJhdGlvbkluSGllcmFyY2h5U2NvcGUzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdE1ldGhvZERlY2xhcmF0aW9uSW5QYWNrYWdlU2NvcGUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0TWV0aG9kRGVjbGFyYXRpb25JbkphciIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RDb25zdHJ1Y3RvckRlY2xhcmF0aW9uSW5KYXIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0TWV0aG9kRGVjbGFyYXRpb25JbkluaXRpYWxpemVyIikpOwotCQotCS8vIG1ldGhvZCByZWZlcmVuY2UKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RTaW1wbGVNZXRob2RSZWZlcmVuY2UiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0U3RhdGljTWV0aG9kUmVmZXJlbmNlMSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RTdGF0aWNNZXRob2RSZWZlcmVuY2UyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdElubmVyTWV0aG9kUmVmZXJlbmNlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdE1ldGhvZFJlZmVyZW5jZVRocm91Z2hTdXBlciIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RNZXRob2RSZWZlcmVuY2VJbklubmVyQ2xhc3MiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0TWV0aG9kUmVmZXJlbmNlSW5Bbm9ueW1vdXNDbGFzcyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RNZXRob2RSZWZlcmVuY2VUaHJvdWdoQXJyYXkiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0TWV0aG9kUmVmZXJlbmNlMSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RNZXRob2RSZWZlcmVuY2UyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdE1ldGhvZFJlZmVyZW5jZTMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0TWV0aG9kUmVmZXJlbmNlNCIpKTsKLQkKLQkvLyBjb25zdHJ1Y3RvciByZWZlcmVuY2UKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RTaW1wbGVDb25zdHJ1Y3RvclJlZmVyZW5jZTEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0U2ltcGxlQ29uc3RydWN0b3JSZWZlcmVuY2UyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdENvbnN0cnVjdG9yUmVmZXJlbmNlRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwxIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdENvbnN0cnVjdG9yUmVmZXJlbmNlRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdENvbnN0cnVjdG9yUmVmZXJlbmNlSW1wbGljaXRDb25zdHJ1Y3RvckNhbGwxIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdENvbnN0cnVjdG9yUmVmZXJlbmNlSW1wbGljaXRDb25zdHJ1Y3RvckNhbGwyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdENvbnN0cnVjdG9yUmVmZXJlbmNlSW5GaWVsZEluaXRpYWxpemVyIikpOwotCi0JLy8gZmllbGQgZGVjbGFyYXRpb24KLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RTaW1wbGVGaWVsZERlY2xhcmF0aW9uIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdEZpZWxkRGVjbGFyYXRpb25JbkphciIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RGaWVsZERlY2xhcmF0aW9uQXJyYXlUeXBlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdEZpZWxkRGVjbGFyYXRpb25XaXRoV2lsZENhcmQiKSk7Ci0KLQkvLyBmaWVsZCByZWZlcmVuY2UKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RTaW1wbGVGaWVsZFJlZmVyZW5jZSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RTaW1wbGVSZWFkRmllbGRSZWZlcmVuY2UiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0U2ltcGxlV3JpdGVGaWVsZFJlZmVyZW5jZSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RNdWx0aXBsZUZpZWxkUmVmZXJlbmNlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdFN0YXRpY0ZpZWxkUmVmZXJlbmNlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdEZpZWxkUmVmZXJlbmNlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdEZpZWxkUmVmZXJlbmNlMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RGaWVsZFJlZmVyZW5jZTMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0RmllbGRSZWZlcmVuY2U0IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdEZpZWxkUmVmZXJlbmNlNSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RGaWVsZFJlZmVyZW5jZTYiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0RmllbGRSZWZlcmVuY2VJbklubmVyQ2xhc3MiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0RmllbGRSZWZlcmVuY2VJbkFub255bW91c0NsYXNzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdEZpZWxkUmVmZXJlbmNlVGhyb3VnaFN1YmNsYXNzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdFJlYWRXcml0ZUZpZWxkUmVmZXJlbmNlSW5Db21wb3VuZEV4cHJlc3Npb24iKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0UmVhZFdyaXRlQWNjZXNzSW5RdWFsaWZpZWROYW1lUmVmZXJlbmNlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdEZpZWxkUmVmZXJlbmNlSW5CcmFja2V0cyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RBY2N1cmF0ZUZpZWxkUmVmZXJlbmNlMSIpKTsKLQkKLQkvLyBvciBwYXR0ZXJuCi0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0T3JQYXR0ZXJuIikpOwotCQotCS8vIGRlY2xhcmF0aW9ucyBvZiBhY2Nlc3NlZCBmaWVsZHMKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3REZWNsYXJhdGlvbk9mQWNjZXNzZWRGaWVsZHMxIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IEphdmFTZWFyY2hUZXN0cygidGVzdERlY2xhcmF0aW9uT2ZBY2Nlc3NlZEZpZWxkczIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0RGVjbGFyYXRpb25PZkFjY2Vzc2VkRmllbGRzMyIpKTsKLQotCS8vIGRlY2xhcmF0aW9ucyBvZiByZWZlcmVuY2VkIHR5cGVzCi0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0RGVjbGFyYXRpb25PZlJlZmVyZW5jZWRUeXBlczEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0RGVjbGFyYXRpb25PZlJlZmVyZW5jZWRUeXBlczIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0RGVjbGFyYXRpb25PZlJlZmVyZW5jZWRUeXBlczMiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0RGVjbGFyYXRpb25PZlJlZmVyZW5jZWRUeXBlczQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0RGVjbGFyYXRpb25PZlJlZmVyZW5jZWRUeXBlczUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0RGVjbGFyYXRpb25PZlJlZmVyZW5jZWRUeXBlczYiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgSmF2YVNlYXJjaFRlc3RzKCJ0ZXN0RGVjbGFyYXRpb25PZlJlZmVyZW5jZWRUeXBlczciKSk7Ci0JCi0JLy8gZGVjbGFyYXRpb25zIG9mIHNlbnQgbWVzc2FnZXMKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RTaW1wbGVEZWNsYXJhdGlvbnNPZlNlbnRNZXNzYWdlcyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3REZWNsYXJhdGlvbk9mU2VudE1lc3NhZ2VzIikpOwotCQotCS8vIHBvdGVudGlhbCBtYXRjaCBpbiBiaW5hcnkKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RQb3RlbnRpYWxNYXRjaEluQmluYXJ5IikpOwotCi0JLy8gY29yZSBleGNlcHRpb24KLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RDb3JlRXhjZXB0aW9uIikpOwotCQotCS8vIHNlYXJjaCBzY29wZXMKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RIaWVyYXJjaHlTY29wZSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RTdWJDVVNlYXJjaFNjb3BlMSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RTdWJDVVNlYXJjaFNjb3BlMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RTdWJDVVNlYXJjaFNjb3BlMyIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBKYXZhU2VhcmNoVGVzdHMoInRlc3RFeHRlcm5hbEphclNjb3BlIikpOwotCi0JcmV0dXJuIHN1aXRlOwotfQotLyoqCi0gKiBUeXBlIHJlZmVyZW5jZSB0ZXN0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0QWNjdXJhdGVGaWVsZFJlZmVyZW5jZTEoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJImQ2LlguQ09OU1RBTlQiLCAKLQkJRklFTEQsCi0JCVJFRkVSRU5DRVMsIAotCQlTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKG5ldyBJSmF2YUVsZW1lbnRbXSB7Ci0JCQlnZXRQYWNrYWdlRnJhZ21lbnQoIkphdmFTZWFyY2giLCAic3JjIiwgImQ2IikKLQkJfSksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJInNyYy9kNi9ZLmphdmEgZDYuWS5UIFtDT05TVEFOVF0iLAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIFJlZ3Jlc3Npb24gdGVzdCBmb3IgMUdCSzdCMjogSVRQSkNPUkU6V0lOTlQgLSBwYWNrYWdlIHJlZmVyZW5jZXM6IGNvdWxkIGJlIG1vcmUgcHJlY2lzZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0QWNjdXJhdGVQYWNrYWdlUmVmZXJlbmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVBhY2thZ2VGcmFnbWVudCBwa2cgPSBnZXRQYWNrYWdlRnJhZ21lbnQoIkphdmFTZWFyY2giLCAic3JjIiwgInAzLnAyIik7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJcGtnLCAKLQkJUkVGRVJFTkNFUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvUGFja2FnZVJlZmVyZW5jZS9LLmphdmEgW3AzLnAyXSIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIFR5cGUgcmVmZXJlbmNlIHRlc3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RBY2N1cmF0ZVR5cGVSZWZlcmVuY2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJImQ1LlgiLCAKLQkJVFlQRSwKLQkJUkVGRVJFTkNFUywgCi0JCVNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUobmV3IElKYXZhRWxlbWVudFtdIHsKLQkJCWdldFBhY2thZ2VGcmFnbWVudCgiSmF2YVNlYXJjaCIsICJzcmMiLCAiZDUiKQotCQl9KSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic3JjL2Q1L1kuamF2YSBkNS5ZLlQgW2Q1LlhdXG4iICsKLQkJInNyYy9kNS9ZLmphdmEgZDUuWS5jIFtkNS5YXVxuIiArCi0JCSJzcmMvZDUvWS5qYXZhIGQ1LlkubyBbZDUuWF0iLAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIENvbnN0cnVjdG9yIGRlY2xhcmF0aW9uIGluIGphciBmaWxlIHRlc3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvckRlY2xhcmF0aW9uSW5KYXIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q2xhc3NGaWxlKCJKYXZhU2VhcmNoIiwgIk15SmFyLmphciIsICJwMSIsICJBLmNsYXNzIikuZ2V0VHlwZSgpOwotCUlNZXRob2QgbWV0aG9kID0gdHlwZS5nZXRNZXRob2QoIkEiLCBuZXcgU3RyaW5nW10geyJMamF2YS5sYW5nLlN0cmluZzsifSk7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJbWV0aG9kLCAKLQkJREVDTEFSQVRJT05TLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJIk15SmFyLmphciBwMS5BKGphdmEubGFuZy5TdHJpbmcpIFtObyBzb3VyY2VdIiwgCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogQ29uc3RydWN0b3IgcmVmZXJlbmNlIHVzaW5nIGFuIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGNhbGwuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvclJlZmVyZW5jZUV4cGxpY2l0Q29uc3RydWN0b3JDYWxsMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgInAiLCAiWS5qYXZhIikuZ2V0VHlwZSgiWSIpOwotCUlNZXRob2QgbWV0aG9kID0gdHlwZS5nZXRNZXRob2QoIlkiLCBuZXcgU3RyaW5nW10geyJJIn0pOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCW1ldGhvZCwgCi0JCVJFRkVSRU5DRVMsIAotCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic3JjL3AvWi5qYXZhIHAuWihpbnQpIFtzdXBlcihpKV0iLCAKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBDb25zdHJ1Y3RvciByZWZlcmVuY2UgdXNpbmcgYW4gZXhwbGljaXQgY29uc3RydWN0b3IgY2FsbC4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yUmVmZXJlbmNlRXhwbGljaXRDb25zdHJ1Y3RvckNhbGwyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAicCIsICJYLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JSU1ldGhvZCBtZXRob2QgPSB0eXBlLmdldE1ldGhvZCgiWCIsIG5ldyBTdHJpbmdbXSB7IkkifSk7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJbWV0aG9kLCAKLQkJUkVGRVJFTkNFUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvcC9ZLmphdmEgcC5ZKGludCkgW3N1cGVyKGkpXVxuIiArCi0JCSJzcmMvcC9ZLmphdmEgcC5ZKGJvb2xlYW4pIFtzdXBlcigxKV0iLCAKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBDb25zdHJ1Y3RvciByZWZlcmVuY2UgdXNpbmcgYW4gaW1wbGljaXQgY29uc3RydWN0b3IgY2FsbC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAyMzExMiBzZWFyY2g6IG5lZWQgYSB3YXkgdG8gc2VhcmNoIGZvciByZWZlcmVuY2VzIHRvIHRoZSBpbXBsaWNpdCBub24tYXJnIGNvbnN0cnVjdG9yKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JSZWZlcmVuY2VJbXBsaWNpdENvbnN0cnVjdG9yQ2FsbDEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJjNyIsICJYLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JSU1ldGhvZCBtZXRob2QgPSB0eXBlLmdldE1ldGhvZCgiWCIsIG5ldyBTdHJpbmdbXSB7fSk7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJbWV0aG9kLCAKLQkJUkVGRVJFTkNFUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvYzcvWS5qYXZhIGM3LlkoKSBbWV0iLCAKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBDb25zdHJ1Y3RvciByZWZlcmVuY2UgdXNpbmcgYW4gaW1wbGljaXQgY29uc3RydWN0b3IgY2FsbC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAyMzExMiBzZWFyY2g6IG5lZWQgYSB3YXkgdG8gc2VhcmNoIGZvciByZWZlcmVuY2VzIHRvIHRoZSBpbXBsaWNpdCBub24tYXJnIGNvbnN0cnVjdG9yKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JSZWZlcmVuY2VJbXBsaWNpdENvbnN0cnVjdG9yQ2FsbDIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQkiYzguWCgpIiwgCi0JCUNPTlNUUlVDVE9SLAotCQlSRUZFUkVOQ0VTLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJInNyYy9jOC9ZLmphdmEgYzguWSBbWV0iLCAKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBDb25zdHJ1Y3RvciByZWZlcmVuY2UgaW4gYSBmaWVsZCBpbml0aWFsaXplci4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIFBSIDFHS1o4Vlo6IElUUEpDT1JFOldJTk5UIC0gU2VhcmNoIC0gZGlkIG5vdCBmaW5kIHJlZmVyZW5jZXMgdG8gbWVtYmVyIGNvbnN0cnVjdG9yKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JSZWZlcmVuY2VJbkZpZWxkSW5pdGlhbGl6ZXIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICIiLCAiQS5qYXZhIikuZ2V0VHlwZSgiQSIpLmdldFR5cGUoIklubmVyIik7Ci0JSU1ldGhvZCBtZXRob2QgPSB0eXBlLmdldE1ldGhvZCgiSW5uZXIiLCBuZXcgU3RyaW5nW10geyJJIn0pOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCW1ldGhvZCwgCi0JCVJFRkVSRU5DRVMsIAotCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic3JjL0EuamF2YSBBLmZpZWxkIFtuZXcgSW5uZXIoMSldXG4iICsKLQkJInNyYy9BLmphdmEgQS5maWVsZCBbbmV3IElubmVyKDIpXSIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIENvcmVFeGNlcHRpb24gdGhyb3duIGR1cmluZyBhY2NlcHQuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBQUiAjMUczVUk3QSkKLSAqLwotcHVibGljIHZvaWQgdGVzdENvcmVFeGNlcHRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJwIiwgIlguamF2YSIpLmdldFR5cGUoIlgiKTsKLQlJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKSB7Ci0JCXB1YmxpYyB2b2lkIGFjY2VwdChJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBzdGFydCwgaW50IGVuZCwgSUphdmFFbGVtZW50IGVuY2xvc2luZ0VsZW1lbnQsIGludCBhY2N1cmFjeSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IEphdmFNb2RlbFN0YXR1cygtMSwgInRlc3QiKSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWJvdXRUb1N0YXJ0KCkge30KLQkJcHVibGljIHZvaWQgZG9uZSgpIHt9Ci0JCXB1YmxpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfTsKLQl0cnkgewotCQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQkJZ2V0V29ya3NwYWNlKCksIAotCQkJdHlwZSwgCi0JCQlERUNMQVJBVElPTlMsIAotCQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQkJcmVzdWx0Q29sbGVjdG9yKTsKLQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQlUaHJvd2FibGUgd3JhcHBlZEV4Y2VwdGlvbiA9IGUuZ2V0RXhjZXB0aW9uKCk7Ci0JCWFzc2VydFRydWUoIlVuZXhwZWN0ZWQgd3JhcHBlZCBleGNlcHRpb24iLCB3cmFwcGVkRXhjZXB0aW9uIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbik7Ci0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBDb3JlRXhjZXB0aW9uIGhhcyBiZWVuIHRocm93biIsICJ0ZXN0IiwgKChDb3JlRXhjZXB0aW9uKXdyYXBwZWRFeGNlcHRpb24pLmdldFN0YXR1cygpLmdldE1lc3NhZ2UoKSk7Ci0JCXJldHVybjsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiQ29yZUV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biIsIGZhbHNlKTsKLX0KLS8qKgotICogRGVjbGFyYXRpb24gb2YgYWNjZXNzZWQgZmllbGRzIHRlc3QuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgNjUzOCBzZWFyY2hEZWNsYXJhdGlvbnNPZiogaW5jb3JyZWN0KQotICovCi1wdWJsaWMgdm9pZCB0ZXN0RGVjbGFyYXRpb25PZkFjY2Vzc2VkRmllbGRzMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlNZXRob2QgbWV0aG9kID0gCi0JCWdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAiYTUiLCAiQi5qYXZhIikuCi0JCQlnZXRUeXBlKCJDIikuZ2V0TWV0aG9kKCJpIiwgbmV3IFN0cmluZ1tdIHt9KTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaERlY2xhcmF0aW9uc09mQWNjZXNzZWRGaWVsZHMoCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJbWV0aG9kLAotCQlyZXN1bHRDb2xsZWN0b3IKLQkpOwotCWFzc2VydEVxdWFscygKLQkJIiIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIERlY2xhcmF0aW9uIG9mIGFjY2Vzc2VkIGZpZWxkcyB0ZXN0LgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDY1Mzggc2VhcmNoRGVjbGFyYXRpb25zT2YqIGluY29ycmVjdCkKLSAqLwotcHVibGljIHZvaWQgdGVzdERlY2xhcmF0aW9uT2ZBY2Nlc3NlZEZpZWxkczIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJTWV0aG9kIG1ldGhvZCA9IAotCQlnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgImE2IiwgIkEuamF2YSIpLgotCQkJZ2V0VHlwZSgiQiIpLmdldE1ldGhvZCgibSIsIG5ldyBTdHJpbmdbXSB7fSk7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2hEZWNsYXJhdGlvbnNPZkFjY2Vzc2VkRmllbGRzKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCW1ldGhvZCwKLQkJcmVzdWx0Q29sbGVjdG9yCi0JKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvYTYvQS5qYXZhIGE2LkIuZiBbZl0iLCAKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBEZWNsYXJhdGlvbiBvZiBhY2Nlc3NlZCBmaWVsZHMgdGVzdC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAxMDM4NiBOUEUgaW4gTWF0Y2hMb2NhdG9yLmxvb2t1cFR5cGUpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3REZWNsYXJhdGlvbk9mQWNjZXNzZWRGaWVsZHMzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSU1ldGhvZCBtZXRob2QgPSAKLQkJZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJiNiIsICJBLmphdmEiKS4KLQkJCWdldFR5cGUoIkEiKS5nZXRNZXRob2QoImZvbyIsIG5ldyBTdHJpbmdbXSB7fSk7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2hEZWNsYXJhdGlvbnNPZkFjY2Vzc2VkRmllbGRzKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCW1ldGhvZCwKLQkJcmVzdWx0Q29sbGVjdG9yCi0JKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvYjYvQS5qYXZhIGI2LkEuZmllbGQgW2ZpZWxkXSIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIERlY2xhcmF0aW9uIG9mIHJlZmVyZW5jZWQgdHlwZXMgdGVzdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdERlY2xhcmF0aW9uT2ZSZWZlcmVuY2VkVHlwZXMxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSU1ldGhvZCBtZXRob2QgPSAKLQkJZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJhMyIsICJSZWZlcmVuY2VzLmphdmEiKS4KLQkJCWdldFR5cGUoIlJlZmVyZW5jZXMiKS5nZXRNZXRob2QoImZvbyIsIG5ldyBTdHJpbmdbXSB7fSk7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2hEZWNsYXJhdGlvbnNPZlJlZmVyZW5jZWRUeXBlcygKLQkJZ2V0V29ya3NwYWNlKCksIAotCQltZXRob2QsCi0JCXJlc3VsdENvbGxlY3RvcgotCSk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic3JjL2EzL1guamF2YSBhMy5YIFtYXVxuIiArCi0JCSJzcmMvYTMvWi5qYXZhIGEzLlogW1pdXG4iICsKLQkJInNyYy9hMy9iL0EuamF2YSBhMy5iLkEgW0FdXG4iICsKLQkJInNyYy9hMy9iL0EuamF2YSBhMy5iLkEkQiRDIFtDXVxuIiArCi0JCSJzcmMvYTMvYi9BLmphdmEgYTMuYi5BJEIgW0JdXG4iICsKLQkJZ2V0RXh0ZXJuYWxKQ0xQYXRoU3RyaW5nKCkgKyAiIGphdmEubGFuZy5PYmplY3RcbiIgKwotCQkic3JjL2EzL1kuamF2YSBhMy5ZIFtZXVxuIiArCi0JCSJzcmMvYTMvYi9CLmphdmEgYTMuYi5CIFtCXSIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIERlY2xhcmF0aW9uIG9mIHJlZmVyZW5jZWQgdHlwZXMgdGVzdC4KLSAqIChSZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyA2Nzc5IHNlYXJjaERlY2xhcmF0aW9uc09mUmVmZXJlbmNlZFR5cGVkIC0gbWlzc2luZyBleGNlcHRpb24gdHlwZXMpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3REZWNsYXJhdGlvbk9mUmVmZXJlbmNlZFR5cGVzMigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlJTWV0aG9kIG1ldGhvZCA9IAotCQlnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgImE3IiwgIlguamF2YSIpLgotCQkJZ2V0VHlwZSgiWCIpLmdldE1ldGhvZCgiZm9vIiwgbmV3IFN0cmluZ1tdIHt9KTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaERlY2xhcmF0aW9uc09mUmVmZXJlbmNlZFR5cGVzKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCW1ldGhvZCwKLQkJcmVzdWx0Q29sbGVjdG9yCi0JKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvYTcvWC5qYXZhIGE3Lk15RXhjZXB0aW9uIFtNeUV4Y2VwdGlvbl0iLCAKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBEZWNsYXJhdGlvbiBvZiByZWZlcmVuY2VkIHR5cGVzIHRlc3QuCi0gKiAoUmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMTI2NDkgTWlzc2luZyBpbXBvcnQgYWZ0ZXIgbW92ZSAgKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0RGVjbGFyYXRpb25PZlJlZmVyZW5jZWRUeXBlczMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJjMSIsICJBLmphdmEiKTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaERlY2xhcmF0aW9uc09mUmVmZXJlbmNlZFR5cGVzKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCXVuaXQsCi0JCXJlc3VsdENvbGxlY3RvcgotCSk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic3JjL2MxL0kuamF2YSBjMS5JIFtJXSIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIERlY2xhcmF0aW9uIG9mIHJlZmVyZW5jZWQgdHlwZXMgdGVzdC4KLSAqIChSZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAxMjY0OSBNaXNzaW5nIGltcG9ydCBhZnRlciBtb3ZlICApCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3REZWNsYXJhdGlvbk9mUmVmZXJlbmNlZFR5cGVzNCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgImMxIiwgIkIuamF2YSIpOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoRGVjbGFyYXRpb25zT2ZSZWZlcmVuY2VkVHlwZXMoCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJdW5pdCwKLQkJcmVzdWx0Q29sbGVjdG9yCi0JKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvYzEvSS5qYXZhIGMxLkkgW0ldIiwgCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogRGVjbGFyYXRpb24gb2YgcmVmZXJlbmNlZCB0eXBlcyB0ZXN0LgotICogKFJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDE4NDE4IHNlYXJjaDogc2VhcmNoRGVjbGFyYXRpb25zT2ZSZWZlcmVuY2VkVHlwZXMgcmVwb3J0cyBpbXBvcnQgZGVjbGFyYXRpb25zKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0RGVjbGFyYXRpb25PZlJlZmVyZW5jZWRUeXBlczUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJjMiIsICJBLmphdmEiKTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaERlY2xhcmF0aW9uc09mUmVmZXJlbmNlZFR5cGVzKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCXVuaXQsCi0JCXJlc3VsdENvbGxlY3RvcgotCSk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic3JjL2MzL0MuamF2YSBjMy5DIFtDXSIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIERlY2xhcmF0aW9uIG9mIHJlZmVyZW5jZWQgdHlwZXMgdGVzdC4KLSAqIChSZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAyNDkzNCBNb3ZlIHRvcCBsZXZlbCBkb2Vzbid0IG9wdGltaXplIHRoZSBpbXBvcnRzW3JlZmFjdG9yaW5nXSkKLSAqLwotcHVibGljIHZvaWQgdGVzdERlY2xhcmF0aW9uT2ZSZWZlcmVuY2VkVHlwZXM2KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUlDb21waWxhdGlvblVuaXQgdW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAiZDEiLCAiWC5qYXZhIik7Ci0JSVR5cGUgaW5uZXJUeXBlID0gdW5pdC5nZXRUeXBlKCJYIikuZ2V0VHlwZSgiSW5uZXIiKTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaERlY2xhcmF0aW9uc09mUmVmZXJlbmNlZFR5cGVzKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCWlubmVyVHlwZSwKLQkJcmVzdWx0Q29sbGVjdG9yCi0JKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvZDIvWS5qYXZhIGQyLlkgW1ldIiwgCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogRGVjbGFyYXRpb24gb2YgcmVmZXJlbmNlZCB0eXBlcyB0ZXN0LgotICogKFJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDM3NDM4IHNlYXJjaGVuZ2luZyBOUEUgaW4gc2VhcmNoRGVjbGFyYXRpb25zT2ZSZWZlcmVuY2VkVHlwZXMgCi0pCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3REZWNsYXJhdGlvbk9mUmVmZXJlbmNlZFR5cGVzNygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IGdldFBhY2thZ2VGcmFnbWVudCgiSmF2YVNlYXJjaCIsICJzcmMiLCAicjciKTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaERlY2xhcmF0aW9uc09mUmVmZXJlbmNlZFR5cGVzKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCXBrZywKLQkJcmVzdWx0Q29sbGVjdG9yCi0JKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSIiLCAKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotCi0vKioKLSAqIERlY2xhcmF0aW9uIG9mIHNlbnQgbWVzc2FnZXMgdGVzdC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyA2NTM4IHNlYXJjaERlY2xhcmF0aW9uc09mKiBpbmNvcnJlY3QpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3REZWNsYXJhdGlvbk9mU2VudE1lc3NhZ2VzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSU1ldGhvZCBtZXRob2QgPSAKLQkJZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJhNSIsICJCLmphdmEiKS4KLQkJCWdldFR5cGUoIkMiKS5nZXRNZXRob2QoImkiLCBuZXcgU3RyaW5nW10ge30pOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoRGVjbGFyYXRpb25zT2ZTZW50TWVzc2FnZXMoCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJbWV0aG9kLAotCQlyZXN1bHRDb2xsZWN0b3IKLQkpOwotCWFzc2VydEVxdWFscygKLQkJIiIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIEphdmEgc2VhcmNoIHNjb3BlIG9uIGphdmEgZWxlbWVudCBpbiBleHRlcm5hbCBqYXIgdGVzdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdEV4dGVybmFsSmFyU2NvcGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCUZpbGUgd29ya3NwYWNlTG9jYXRpb24gPSBuZXcgRmlsZSh3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLQlGaWxlIG1pbmltYWxKYXIgPSBuZXcgRmlsZSh3b3Jrc3BhY2VMb2NhdGlvbiwgIkphdmFTZWFyY2gvTXlKYXIuamFyIik7Ci0JRmlsZSBleHRlcm5hbEphciA9IG5ldyBGaWxlKHdvcmtzcGFjZUxvY2F0aW9uLmdldFBhcmVudEZpbGUoKSwgIk15SmFyLmphciIpOwotCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5nZXRKYXZhUHJvamVjdCgiSmF2YVNlYXJjaCIpOwotCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCA9IHByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JdHJ5IHsKLQkJY29weShtaW5pbWFsSmFyLCBleHRlcm5hbEphcik7Ci0JCWludCBsZW5ndGggPSBjbGFzc3BhdGgubGVuZ3RoOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdDbGFzc3BhdGggPSBuZXcgSUNsYXNzcGF0aEVudHJ5W2xlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoY2xhc3NwYXRoLCAwLCBuZXdDbGFzc3BhdGgsIDAsIGxlbmd0aC0xKTsKLQkJU3RyaW5nIGV4dGVybmFsUGF0aCA9IGV4dGVybmFsSmFyLmdldEFic29sdXRlUGF0aCgpOwotCQluZXdDbGFzc3BhdGhbbGVuZ3RoLTFdID0gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KG5ldyBQYXRoKGV4dGVybmFsUGF0aCksIG5ldyBQYXRoKGV4dGVybmFsUGF0aCksIG51bGwsIGZhbHNlKTsKLQkJcHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoLCBudWxsKTsKLQkJCi0JCUlQYWNrYWdlRnJhZ21lbnQgcGtnID0gdGhpcy5nZXRQYWNrYWdlRnJhZ21lbnQoIkphdmFTZWFyY2giLCBleHRlcm5hbFBhdGgsICJwMCIpOwotCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0gU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShuZXcgSUphdmFFbGVtZW50W10ge3BrZ30pOwotCQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCQl3b3Jrc3BhY2UsIAotCQkJIlgiLAotCQkJVFlQRSwKLQkJCURFQ0xBUkFUSU9OUywKLQkJCXNjb3BlLAotCQkJcmVzdWx0Q29sbGVjdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJZXh0ZXJuYWxKYXIuZ2V0Q2Fub25pY2FsUGF0aCgpKyAiIHAwLlgiLAotCQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotCQkJCi0JCUlDbGFzc0ZpbGUgY2xhc3NGaWxlID0gcGtnLmdldENsYXNzRmlsZSgiWC5jbGFzcyIpOwotCQlzY29wZSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUobmV3IElKYXZhRWxlbWVudFtdIHtjbGFzc0ZpbGV9KTsKLQkJcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQkJbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJCXdvcmtzcGFjZSwgCi0JCQljbGFzc0ZpbGUuZ2V0VHlwZSgpLAotCQkJREVDTEFSQVRJT05TLAotCQkJc2NvcGUsCi0JCQlyZXN1bHRDb2xsZWN0b3IpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQlleHRlcm5hbEphci5nZXRDYW5vbmljYWxQYXRoKCkrICIgcDAuWCIsCi0JCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci0JCQotCX0gZmluYWxseSB7Ci0JCWV4dGVybmFsSmFyLmRlbGV0ZSgpOwotCQlwcm9qZWN0LnNldFJhd0NsYXNzcGF0aChjbGFzc3BhdGgsIG51bGwpOwotCX0KLQkKLX0KLQotCi0vKioKLSAqIEZpZWxkIGRlY2xhcmF0aW9uIHdpdGggYXJyYXkgdHlwZSB0ZXN0LgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgUFIgMUdLRUc3MzogSVRQSkNPUkU6V0lOMjAwMCAtIHNlYXJjaCAoMTM2KTogbWlzc2luZyBmaWVsZCBkZWNsYXJhdGlvbikKLSAqLwotcHVibGljIHZvaWQgdGVzdEZpZWxkRGVjbGFyYXRpb25BcnJheVR5cGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICIiLCAiQi5qYXZhIikuZ2V0VHlwZSgiQiIpOwotCUlGaWVsZCBmaWVsZCA9IHR5cGUuZ2V0RmllbGQoIm9wZW4iKTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQlmaWVsZCwgCi0JCURFQ0xBUkFUSU9OUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvQi5qYXZhIEIub3BlbiBbb3Blbl0iLCAKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBGaWVsZCBkZWNsYXJhdGlvbiBpbiBqYXIgZmlsZSB0ZXN0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0RmllbGREZWNsYXJhdGlvbkluSmFyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENsYXNzRmlsZSgiSmF2YVNlYXJjaCIsICJNeUphci5qYXIiLCAicDEiLCAiQS5jbGFzcyIpLmdldFR5cGUoKTsKLQlJRmllbGQgZmllbGQgPSB0eXBlLmdldEZpZWxkKCJmaWVsZCIpOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCWZpZWxkLCAKLQkJREVDTEFSQVRJT05TLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJIk15SmFyLmphciBwMS5BLmZpZWxkIFtObyBzb3VyY2VdIiwgCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogRmllbGQgZGVjbGFyYXRpb24gd2l0aCB3aWxkIGNhcmQgdGVzdC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAyMTc2MyBQcm9ibGVtIGluIEphdmEgc2VhcmNoIFtzZWFyY2hdICApCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RGaWVsZERlY2xhcmF0aW9uV2l0aFdpbGRDYXJkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJImNsYXNzKnBhdGgiLAotCQlGSUVMRCwKLQkJREVDTEFSQVRJT05TLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJInNyYy9jNS9UZXN0LmphdmEgYzUuVGVzdC5jbGFzc19wYXRoIFtjbGFzc19wYXRoXSIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIE11bHRpcGxlIGZpZWxkIHJlZmVyZW5jZXMgaW4gb25lIGFzdCB0ZXN0LgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgUFIgMUdENzlYTTogSVRQSkNPUkU6V0lOTlQgLSBTZWFyY2ggLSBzZWFyY2ggZm9yIGZpZWxkIHJlZmVyZW5jZXMgLSBub3QgYWxsIGZvdW5kKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVGaWVsZFJlZmVyZW5jZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgInA1IiwgIkEuamF2YSIpLmdldFR5cGUoIkEiKTsKLQlJRmllbGQgZmllbGQgPSB0eXBlLmdldEZpZWxkKCJ4Iik7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJZmllbGQsIAotCQlSRUZFUkVOQ0VTLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJInNyYy9wNS9BLmphdmEgcDUuQS5rKCkgLT4gdm9pZCBbeF1cbiIgKwotCQkic3JjL3A1L0EuamF2YSBwNS5BLmsoKSAtPiB2b2lkIFt4XVxuIiArCi0JCSJzcmMvcDUvQS5qYXZhIHA1LkEuaygpIC0+IHZvaWQgW3hdIiwgCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogRmllbGQgcmVmZXJlbmNlIGluIGlubmVyIGNsYXNzIHRlc3QuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBQUiAxR0wxMUo2OiBJVFBKQ09SRTpXSU4yMDAwIC0gc2VhcmNoOiBtaXNzaW5nIGZpZWxkIHJlZmVyZW5jZXMgKG5lc3RlZCB0eXBlcykpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RGaWVsZFJlZmVyZW5jZUluSW5uZXJDbGFzcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgIiIsICJPLmphdmEiKS5nZXRUeXBlKCJPIik7Ci0JSUZpZWxkIGZpZWxkID0gdHlwZS5nZXRGaWVsZCgieSIpOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCWZpZWxkLCAKLQkJUkVGRVJFTkNFUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvTy5qYXZhIE8kSS55KCkgLT4gdm9pZCBbeV0iLCAKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBGaWVsZCByZWZlcmVuY2UgdGVzdC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAjMzQzMyBzZWFyY2g6IG1pc3NpbmcgZmllbGQgb2NjdXJyZWNuY2VzICgxR0taOEo2KSkKLSAqLwotcHVibGljIHZvaWQgdGVzdEZpZWxkUmVmZXJlbmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAicDgiLCAiQS5qYXZhIikuZ2V0VHlwZSgiQSIpOwotCUlGaWVsZCBmaWVsZCA9IHR5cGUuZ2V0RmllbGQoImciKTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQlmaWVsZCwgCi0JCVJFRkVSRU5DRVMsIAotCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic3JjL3A4L0EuamF2YSBwOC5BLm0oKSAtPiB2b2lkIFtnXVxuIiArCi0JCSJzcmMvcDgvQS5qYXZhIHA4LkIubSgpIC0+IHZvaWQgW2ddIiwgCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogRmllbGQgcmVmZXJlbmNlIHRlc3QuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBQUiAxR0s4VFhFOiBJVFBKQ09SRTpXSU4yMDAwIC0gc2VhcmNoOiBtaXNzaW5nIGZpZWxkIHJlZmVyZW5jZSkKLSAqLwotcHVibGljIHZvaWQgdGVzdEZpZWxkUmVmZXJlbmNlMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgInA5IiwgIlguamF2YSIpLmdldFR5cGUoIlgiKTsKLQlJRmllbGQgZmllbGQgPSB0eXBlLmdldEZpZWxkKCJmIik7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJZmllbGQsIAotCQlSRUZFUkVOQ0VTLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJInNyYy9wOS9YLmphdmEgcDkuWC5tKCkgLT4gdm9pZCBbZl0iLCAKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBGaWVsZCByZWZlcmVuY2UgdGVzdC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyA1ODIxIFJlZmFjdG9yID4gUmVuYW1lIHJlbmFtZXMgbG9jYWwgdmFyaWFibGUgaW5zdGVhZCBvZiBtZW1iZXIgaW4gY2FzZSBvZiBuYW1lIGNsYXNoICApCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RGaWVsZFJlZmVyZW5jZTMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJxOCIsICJFY2xpcHNlVGVzdC5qYXZhIikuZ2V0VHlwZSgiRWNsaXBzZVRlc3QiKTsKLQlJRmllbGQgZmllbGQgPSB0eXBlLmdldEZpZWxkKCJ0ZXN0Iik7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJZmllbGQsIAotCQlSRUZFUkVOQ0VTLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJInNyYy9xOC9FY2xpcHNlVGVzdC5qYXZhIHE4LkVjbGlwc2VUZXN0Lm1haW4oU3RyaW5nW10pIC0+IHZvaWQgW3Rlc3RdIiwgCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogRmllbGQgcmVmZXJlbmNlIHRlc3QuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgNTkyMyBTZWFyY2ggZm9yICJsZW5ndGgiIGZpZWxkIHJlZnMgZmluZHMgW10ubGVuZ3RoKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0RmllbGRSZWZlcmVuY2U0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAiYTIiLCAiWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCUlGaWVsZCBmaWVsZCA9IHR5cGUuZ2V0RmllbGQoImxlbmd0aCIpOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCWZpZWxkLCAKLQkJUkVGRVJFTkNFUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvYTIvWC5qYXZhIGEyLlguZm9vKCkgLT4gdm9pZCBbbGVuZ3RoXSIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIEZpZWxkIHJlZmVyZW5jZSB0ZXN0LgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDc5ODcgRmllbGQgcmVmZXJlbmNlIHNlYXJjaCBzaG91bGQgZG8gbG9va3VwIGluIDEuNCBtb2RlKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0RmllbGRSZWZlcmVuY2U1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAiYjEiLCAiQS5qYXZhIikuZ2V0VHlwZSgiQSIpOwotCUlGaWVsZCBmaWVsZCA9IHR5cGUuZ2V0RmllbGQoIngiKTsKLQkKLQkvLyBTZXQgMS40IGNvbXBsaWFuY2UgbGV2ZWwgKG5vIGNvbnN0YW50IHlldCkKLQlIYXNodGFibGUgb3B0aW9ucyA9IEphdmFDb3JlLmdldE9wdGlvbnMoKTsKLQlTdHJpbmcgY3VycmVudE9wdGlvbiA9IChTdHJpbmcpb3B0aW9ucy5nZXQoIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2UiKTsKLQlvcHRpb25zLnB1dCgib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZSIsICIxLjQiKTsKLQlKYXZhQ29yZS5zZXRPcHRpb25zKG9wdGlvbnMpOwotCQotCXRyeSB7Ci0JCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQkJbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJCWdldFdvcmtzcGFjZSgpLCAKLQkJCWZpZWxkLCAKLQkJCVJFRkVSRU5DRVMsIAotCQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQkJcmVzdWx0Q29sbGVjdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJInNyYy9iMS9CLmphdmEgYjEuQi5mb28oKSAtPiB2b2lkIFt4XSIsIAotCQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotCX0gZmluYWxseSB7Ci0JCS8vIFJlc3RvcmUgY29tcGxpYW5jZSBsZXZlbAotCQlvcHRpb25zLnB1dCgib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZSIsIGN1cnJlbnRPcHRpb24pOwotCQlKYXZhQ29yZS5zZXRPcHRpb25zKG9wdGlvbnMpOwotCX0KLX0KLS8qKgotICogRmllbGQgcmVmZXJlbmNlIHRlc3QuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMjA2OTMgRmluZGluZyByZWZlcmVuY2VzIHRvIHZhcmlhYmxlcyBkb2VzIG5vdCBmaW5kIGFsbCBvY2N1cmFuY2VzKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0RmllbGRSZWZlcmVuY2U2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAiYzQiLCAiWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCUlGaWVsZCBmaWVsZCA9IHR5cGUuZ2V0RmllbGQoIngiKTsKLQkKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQlmaWVsZCwgCi0JCVJFRkVSRU5DRVMsIAotCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic3JjL2M0L1guamF2YSBjNC5YLmZvbygpIC0+IGludCBbeF0iLCAKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBGaWVsZCByZWZlcmVuY2UgaW4gYW5vbnltb3VzIGNsYXNzIHRlc3QuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBQUiAxR0wxMlhFOiBJVFBKQ09SRTpXSU4yMDAwIC0gc2VhcmNoOiBtaXNzaW5nIGZpZWxkIHJlZmVyZW5jZXMgaW4gaW5uZXIgY2xhc3MpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RGaWVsZFJlZmVyZW5jZUluQW5vbnltb3VzQ2xhc3MoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICIiLCAiRC5qYXZhIikuZ2V0VHlwZSgiRCIpOwotCUlGaWVsZCBmaWVsZCA9IHR5cGUuZ2V0RmllbGQoImgiKTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQlmaWVsZCwgCi0JCVJFRkVSRU5DRVMsIAotCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic3JjL0QuamF2YSBELmcoKSAtPiB2b2lkIFtoXSIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIEZpZWxkIHJlZmVyZW5jZSBpbiBicmFja2V0cyB0ZXN0LgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDIzMzI5IHNlYXJjaDogaW5jb3JyZWN0IHJhbmdlIGZvciB0eXBlIHJlZmVyZW5jZXMgaW4gYnJhY2tldHMpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RGaWVsZFJlZmVyZW5jZUluQnJhY2tldHMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJzMyIsICJBLmphdmEiKS5nZXRUeXBlKCJBIik7Ci0JSUZpZWxkIGZpZWxkID0gdHlwZS5nZXRGaWVsZCgiZmllbGQiKTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQlmaWVsZCwgCi0JCVJFRkVSRU5DRVMsIAotCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic3JjL3MzL0EuamF2YSBzMy5BLmJhcigpIC0+IGludCBbZmllbGRdIiwKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBGaWVsZCByZWZlcmVuY2UgdGhyb3VnaCBzdWJjbGFzcyB0ZXN0LgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgUFIgMUdLQjlZSDogSVRQSkNPUkU6V0lOMjAwMCAtIHNlYXJjaCBmb3IgZmllbGQgcmVmcyAtIGluY29ycmVjdCByZXN1bHRzKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0RmllbGRSZWZlcmVuY2VUaHJvdWdoU3ViY2xhc3MoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJwNiIsICJBLmphdmEiKS5nZXRUeXBlKCJBIik7Ci0JSUZpZWxkIGZpZWxkID0gdHlwZS5nZXRGaWVsZCgiZiIpOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCWZpZWxkLCAKLQkJUkVGRVJFTkNFUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvcDYvQS5qYXZhIHA2LkEubSgpIC0+IHZvaWQgW2ZdXG4iICsKLQkJInNyYy9wNi9BLmphdmEgcDYuQi5tKCkgLT4gdm9pZCBbZl1cbiIgKwotCQkic3JjL3A2L0EuamF2YSBwNi5CLm0oKSAtPiB2b2lkIFtmXSIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci0JCQotCXR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgInA2IiwgIkEuamF2YSIpLmdldFR5cGUoIkFBIik7Ci0JZmllbGQgPSB0eXBlLmdldEZpZWxkKCJmIik7Ci0JcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCWZpZWxkLCAKLQkJUkVGRVJFTkNFUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvcDYvQS5qYXZhIHA2LkIubSgpIC0+IHZvaWQgW2ZdIiwgCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLQkJCi19Ci0vKioKLSAqIEhpZXJhcmNoeSBzY29wZSB0ZXN0LgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDM0NDUgc2VhcmNoOiB0eXBlIGhpZXJhcmNoeSBzY29wZSBpbmNvcnJlY3QgKDFHTEM4VlMpKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0SGllcmFyY2h5U2NvcGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy4gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJhOSIsICJBLmphdmEiKTsKLQlJVHlwZSB0eXBlID0gY3UuZ2V0VHlwZSgiQyIpOwotCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSBTZWFyY2hFbmdpbmUuY3JlYXRlSGllcmFyY2h5U2NvcGUodHlwZSk7Ci0JYXNzZXJ0VHJ1ZSgiYTkuQyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gaGllcmFyY2h5IHNjb3BlIiwgc2NvcGUuZW5jbG9zZXModHlwZSkpOwotCWFzc2VydFRydWUoImE5LkEgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGhpZXJhcmNoeSBzY29wZSIsIHNjb3BlLmVuY2xvc2VzKGN1LmdldFR5cGUoIkEiKSkpOwotCWFzc2VydFRydWUoImE5LkIgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGhpZXJhcmNoeSBzY29wZSIsIHNjb3BlLmVuY2xvc2VzKGN1LmdldFR5cGUoIkIiKSkpOwotCWFzc2VydFRydWUoImE5L0EuamF2YSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gaGllcmFyY2h5IHNjb3BlIiwgc2NvcGUuZW5jbG9zZXMoY3UuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSk7Ci19Ci0vKioKLSAqIFR5cGUgcmVmZXJlbmNlIHRlc3QuCi0gKiAoUmVncmVzc2lvbiB0ZXN0IGZvciBidWcgOTY0MiBTZWFyY2ggLSBtaXNzaW5nIGluYWNjdXJhdGUgdHlwZSBtYXRjaGVzKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0SW5uYWN1cmF0ZVR5cGVSZWZlcmVuY2UxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJIlpvcmsiLCAKLQkJVFlQRSwKLQkJUkVGRVJFTkNFUywgCi0JCVNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUobmV3IElKYXZhRWxlbWVudFtdIHsKLQkJCWdldFBhY2thZ2VGcmFnbWVudCgiSmF2YVNlYXJjaCIsICJzcmMiLCAiYjUiKQotCQl9KSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic3JjL2I1L0EuamF2YSBbWm9ya11cbiIgKwotCQkic3JjL2I1L0EuamF2YSBiNS5BLnt9IFtab3JrXVxuIiArCi0JCSJzcmMvYjUvQS5qYXZhIGI1LkEue30gW1pvcmtdXG4iICsKLQkJInNyYy9iNS9BLmphdmEgYjUuQS57fSBbWm9ya10iLAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIFR5cGUgcmVmZXJlbmNlIHRlc3QuCi0gKiAoUmVncmVzc2lvbiB0ZXN0IGZvciBidWcgOTY0MiBTZWFyY2ggLSBtaXNzaW5nIGluYWNjdXJhdGUgdHlwZSBtYXRjaGVzKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0SW5uYWN1cmF0ZVR5cGVSZWZlcmVuY2UyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJInAuWm9yayIsIAotCQlUWVBFLAotCQlSRUZFUkVOQ0VTLCAKLQkJU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShuZXcgSUphdmFFbGVtZW50W10gewotCQkJZ2V0UGFja2FnZUZyYWdtZW50KCJKYXZhU2VhcmNoIiwgInNyYyIsICJiNSIpCi0JCX0pLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvYjUvQS5qYXZhIGI1LkEue30gW1pvcmtdXG4iICsKLQkJInNyYy9iNS9BLmphdmEgYjUuQS57fSBbWm9ya11cbiIgKwotCQkic3JjL2I1L0EuamF2YSBiNS5BLnt9IFtab3JrXSIsCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogVHlwZSByZWZlcmVuY2UgdGVzdC4KLSAqIChSZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAyMTQ4NSAgTlBFIHdoZW4gZG9pbmcgYSByZWZlcmVuY2Ugc2VhcmNoIHRvIGEgcGFja2FnZSkKLSAqLwotcHVibGljIHZvaWQgdGVzdElubmFjdXJhdGVUeXBlUmVmZXJlbmNlMygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJyMyIsICJBMjE0ODUuamF2YSIpLmdldFR5cGUoIkEyMTQ4NSIpOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQlyZXN1bHRDb2xsZWN0b3Iuc2hvd0FjY3VyYWN5ID0gdHJ1ZTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCXR5cGUsIAotCQlSRUZFUkVOQ0VTLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJInNyYy9yNC9CMjE0ODUuamF2YSBbQTIxNDg1XSBQT1RFTlRJQUxfTUFUQ0hcbiIgKwotCQkic3JjL3I0L0IyMTQ4NS5qYXZhIHI0LkIyMTQ4NSBbQTIxNDg1XSBQT1RFTlRJQUxfTUFUQ0giLAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0KLQotLyoqCi0gKiBJbm5lciBtZXRob2QgZGVjbGFyYXRpb24gdGVzdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdElubmVyTWV0aG9kRGVjbGFyYXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJwIiwgIlguamF2YSIpLmdldFR5cGUoIlgiKS5nZXRUeXBlKCJJbm5lciIpOwotCUlNZXRob2QgbWV0aG9kID0gdHlwZS5nZXRNZXRob2QoImZvbyIsIG5ldyBTdHJpbmdbXSB7fSk7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJbWV0aG9kLCAKLQkJREVDTEFSQVRJT05TLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksICAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvcC9YLmphdmEgcC5YJElubmVyLmZvbygpIC0+IFN0cmluZyBbZm9vXSIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIElubmVyIG1ldGhvZCByZWZlcmVuY2UgdGVzdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdElubmVyTWV0aG9kUmVmZXJlbmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAicCIsICJYLmphdmEiKS5nZXRUeXBlKCJYIikuZ2V0VHlwZSgiSW5uZXIiKTsKLQlJTWV0aG9kIG1ldGhvZCA9IHR5cGUuZ2V0TWV0aG9kKCJmb28iLCBuZXcgU3RyaW5nW10ge30pOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCW1ldGhvZCwgCi0JCVJFRkVSRU5DRVMsIAotCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJInNyYy9wL0EuamF2YSBwLkEuZm9vKGludCwgU3RyaW5nLCBYKSAtPiB2b2lkIFtmb28oKV0iLCAKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBJbnRlcmZhY2UgaW1wbGVtZW50b3JzIHRlc3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RJbnRlcmZhY2VJbXBsZW1lbnRvcnMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkvLyBpbXBsZW1lbnRvcnMgb2YgYW4gaW50ZXJmYWNlCi0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAicCIsICJJLmphdmEiKS5nZXRUeXBlKCJJIik7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJdHlwZSwgCi0JCUlNUExFTUVOVE9SUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic3JjL0ludGVyZmFjZUltcGxlbWVudG9ycy5qYXZhIEludGVyZmFjZUltcGxlbWVudG9ycyBbcC5JXVxuIiArCi0JCSJzcmMvcC9YLmphdmEgcC5YIFtJXSIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci0KLQkvLyBpbXBsZW1lbnRvcnMgb2YgYSBjbGFzcyBzaG91bGQgZ2l2ZSBubyBtYXRjaAotCS8vIChyZWdyZXNzaW9uIHRlc3QgZm9yIDFHNUhCUUE6IElUUEpVSTpXSU5OVCAtIFNlYXJjaCAtIHNlYXJjaCBmb3IgaW1wbGVtZW50b3JzIG9mIGEgY2xhc3MgZmluZHMgc3ViY2xhc3NlcykKLQl0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJwIiwgIlguamF2YSIpLmdldFR5cGUoIlgiKTsKLQlyZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJdHlwZSwgCi0JCUlNUExFTUVOVE9SUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiIiwgCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsJCi19Ci0vKioKLSAqIEludGVyZmFjZSBpbXBsZW1lbnRvcnMgdGVzdC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAyMjEwMiBOb3QgYWxsIGltcGxlbWVudG9ycyBmb3VuZCBmb3IgSVBhcnRMaXN0ZW5lcikKLSAqLwotcHVibGljIHZvaWQgdGVzdEludGVyZmFjZUltcGxlbWVudG9yczIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkvLyBpbXBsZW1lbnRvcnMgb2YgYW4gaW50ZXJmYWNlCi0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAicjIiLCAiSS5qYXZhIikuZ2V0VHlwZSgiSSIpOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCXR5cGUsIAotCQlJTVBMRU1FTlRPUlMsIAotCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJInNyYy9yMi9YLmphdmEgcjIuWC5maWVsZCBbSV0iLCAKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBMb25nIGRlY2xhcmF0aW9uICg+MjU1KSB0ZXN0LgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDI1ODU5IEVycm9yIGRvaW5nIEphdmEgU2VhcmNoKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0TG9uZ0RlY2xhcmF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJIkFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLCAKLQkJVFlQRSwKLQkJREVDTEFSQVRJT05TLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksICAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvYzkvWC5qYXZhIGM5LkFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogW0FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpdIiwgCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogTWVtZWJlciB0eXBlIGRlY2xhcmF0aW9uIHRlc3QuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgOTk5MiBNZW1iZXIgY2xhc3MgZGVjbGFyYXRpb24gbm90IGZvdW5kKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0TWVtYmVyVHlwZURlY2xhcmF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUobmV3IElKYXZhRWxlbWVudFtdewotCQl0aGlzLmdldFBhY2thZ2VGcmFnbWVudCgiSmF2YVNlYXJjaCIsICJzcmMiLCAiYjQiKQotCX0pOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCSIqLkEuQiIsCi0JCVRZUEUsCi0JCURFQ0xBUkFUSU9OUywgCi0JCXNjb3BlLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvYjQvQS5qYXZhIGI0LkEkQiBbQl0iLCAKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBNZW1iZXIgdHlwZSByZWZlcmVuY2UgdGVzdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdE1lbWJlclR5cGVSZWZlcmVuY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkvLyByZWZlcmVuY2VzIHRvIHNlY29uZCBsZXZlbCBtZW1iZXIgdHlwZQotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQlyZXN1bHRDb2xsZWN0b3Iuc2hvd0FjY3VyYWN5ID0gdHJ1ZTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCSJCTWVtYmVyIiwKLQkJVFlQRSwKLQkJUkVGRVJFTkNFUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJSZWZlcmVuY2VzIHRvIHR5cGUgQk1lbWJlciIsCi0JCSJzcmMvTWVtYmVyVHlwZVJlZmVyZW5jZS9BenouamF2YSBNZW1iZXJUeXBlUmVmZXJlbmNlLkF6ei5wb28oKSAtPiB2b2lkIFtCLkJNZW1iZXJdIEVYQUNUX01BVENIXG4iICsKLQkJInNyYy9NZW1iZXJUeXBlUmVmZXJlbmNlL0F6ei5qYXZhIE1lbWJlclR5cGVSZWZlcmVuY2UuQXp6JEF6ek1lbWJlciBbQk1lbWJlcl0gRVhBQ1RfTUFUQ0hcbiIgKwotCQkic3JjL01lbWJlclR5cGVSZWZlcmVuY2UvQXp6LmphdmEgTWVtYmVyVHlwZVJlZmVyZW5jZS5YLnZhbCBbQXp6LkF6ek1lbWJlci5CTWVtYmVyXSBFWEFDVF9NQVRDSFxuIiArCi0JCSJzcmMvTWVtYmVyVHlwZVJlZmVyZW5jZS9CLmphdmEgTWVtYmVyVHlwZVJlZmVyZW5jZS5CLmZvbygpIC0+IHZvaWQgW0F6ei5BenpNZW1iZXIuQk1lbWJlcl0gRVhBQ1RfTUFUQ0giLAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci0KLQkvLyByZWZlcmVuY2VzIHRvIGZpcnN0IGxldmVsIG1lbWJlciB0eXBlCi0JcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQlyZXN1bHRDb2xsZWN0b3Iuc2hvd0FjY3VyYWN5ID0gdHJ1ZTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCSJBenpNZW1iZXIiLAotCQlUWVBFLAotCQlSRUZFUkVOQ0VTLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJIlJlZmVyZW5jZXMgdG8gdHlwZSBBenpNZW1iZXIiLAotCQkic3JjL01lbWJlclR5cGVSZWZlcmVuY2UvQXp6LmphdmEgTWVtYmVyVHlwZVJlZmVyZW5jZS5YLnZhbCBbQXp6LkF6ek1lbWJlcl0gRVhBQ1RfTUFUQ0hcbiIgKwotCQkic3JjL01lbWJlclR5cGVSZWZlcmVuY2UvQi5qYXZhIE1lbWJlclR5cGVSZWZlcmVuY2UuQi5mb28oKSAtPiB2b2lkIFtBenouQXp6TWVtYmVyXSBFWEFDVF9NQVRDSCIsCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLQotCS8vIG5vIHJlZmVyZW5jZSB0byBhIGZpZWxkIHdpdGggc2FtZSBuYW1lIGFzIG1lbWJlciB0eXBlCi0JcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQlyZXN1bHRDb2xsZWN0b3Iuc2hvd0FjY3VyYWN5ID0gdHJ1ZTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCSJCTWVtYmVyIiwKLQkJRklFTEQsCi0JCVJFRkVSRU5DRVMsIAotCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiUmVmZXJlbmNlcyB0byBmaWVsZCBCTWVtYmVyIiwKLQkJIiIsCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogTWVtYmVyIHR5cGUgcmVmZXJlbmNlIHRlc3QuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBQUiAxR0wwTU45OiBJVFBKQ09SRTpXSU4yMDAwIC0gc2VhcmNoOiBub3QgY29uc2lzdGVudCByZXN1bHRzIGZvciBuZXN0ZWQgdHlwZXMpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNZW1iZXJUeXBlUmVmZXJlbmNlMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgImEiLCAiQS5qYXZhIikuZ2V0VHlwZSgiQSIpLmdldFR5cGUoIlgiKTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQl0eXBlLCAKLQkJUkVGRVJFTkNFUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvYS9BLmphdmEgYS5CLmF4IFtBLlhdXG4iICsKLQkJInNyYy9hL0EuamF2YSBhLkIuc3ggW1MuWF0iLCAKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBNZXRob2QgZGVjbGFyYXRpb24gaW4gaGllcmFyY2h5IHRlc3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNZXRob2REZWNsYXJhdGlvbkluSGllcmFyY2h5U2NvcGUxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAicCIsICJYLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJImZvbyIsCi0JCU1FVEhPRCwKLQkJREVDTEFSQVRJT05TLCAKLQkJU2VhcmNoRW5naW5lLmNyZWF0ZUhpZXJhcmNoeVNjb3BlKHR5cGUpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvcC9YLmphdmEgcC5YLmZvbyhpbnQsIFN0cmluZywgWCkgLT4gdm9pZCBbZm9vXVxuIiArCi0JCSJzcmMvcC9aLmphdmEgcC5aLmZvbyhpbnQsIFN0cmluZywgWCkgLT4gdm9pZCBbZm9vXSIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIE1ldGhvZCBkZWNsYXJhdGlvbiBpbiBoaWVyYXJjaHkgdGhhdCBjb250YWlucyBlbGVtZW50cyBpbiBleHRlcm5hbCBqYXIuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBQUiAjMUcyRTRGMSkKLSAqLwotcHVibGljIHZvaWQgdGVzdE1ldGhvZERlY2xhcmF0aW9uSW5IaWVyYXJjaHlTY29wZTIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJwIiwgIlguamF2YSIpLmdldFR5cGUoIlgiKTsKLQlJTWV0aG9kIG1ldGhvZCA9IHR5cGUuZ2V0TWV0aG9kKCJmb28iLCBuZXcgU3RyaW5nW10geyJJIiwgIlFTdHJpbmc7IiwgIlFYOyJ9KTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQltZXRob2QsCi0JCURFQ0xBUkFUSU9OUywgCi0JCVNlYXJjaEVuZ2luZS5jcmVhdGVIaWVyYXJjaHlTY29wZSh0eXBlKSwgLy8gamF2YS5sYW5nLk9iamVjdCBpcyBpbiBleHRlcm5hbCBqY2wKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvcC9YLmphdmEgcC5YLmZvbyhpbnQsIFN0cmluZywgWCkgLT4gdm9pZCBbZm9vXVxuIiArCi0JCSJzcmMvcC9aLmphdmEgcC5aLmZvbyhpbnQsIFN0cmluZywgWCkgLT4gdm9pZCBbZm9vXSIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIE1ldGhvZCBkZWNsYXJhdGlvbiBpbiBoaWVyYXJjaHkgb24gYSBzZWNvbmRhcnkgdHlwZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdE1ldGhvZERlY2xhcmF0aW9uSW5IaWVyYXJjaHlTY29wZTMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJkMyIsICJBLmphdmEiKS5nZXRUeXBlKCJCIik7Ci0JSU1ldGhvZCBtZXRob2QgPSB0eXBlLmdldE1ldGhvZCgiZm9vIiwgbmV3IFN0cmluZ1tdIHt9KTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQltZXRob2QsCi0JCURFQ0xBUkFUSU9OUywgCi0JCVNlYXJjaEVuZ2luZS5jcmVhdGVIaWVyYXJjaHlTY29wZSh0eXBlKSwKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvZDMvQS5qYXZhIGQzLkIuZm9vKCkgLT4gdm9pZCBbZm9vXSIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIE1ldGhvZCBkZWNsYXJhdGlvbiBpbiBmaWVsZCBpbml0aWFsemVyLgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDI0MzQ2IE1ldGhvZCBkZWNsYXJhdGlvbiBub3QgZm91bmQgaW4gZmllbGQgaW5pdGlhbGl6ZXIgICkKLSAqLwotcHVibGljIHZvaWQgdGVzdE1ldGhvZERlY2xhcmF0aW9uSW5Jbml0aWFsaXplcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQkiZm9vMjQzNDYiLAotCQlNRVRIT0QsCi0JCURFQ0xBUkFUSU9OUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJInNyYy9jNi9YLmphdmEgYzYuWC54IFtmb28yNDM0Nl0iLCAKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBNZXRob2QgZGVjbGFyYXRpb24gaW4gamFyIGZpbGUgdGVzdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdE1ldGhvZERlY2xhcmF0aW9uSW5KYXIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q2xhc3NGaWxlKCJKYXZhU2VhcmNoIiwgIk15SmFyLmphciIsICJwMSIsICJBLmNsYXNzIikuZ2V0VHlwZSgpOwotCUlNZXRob2QgbWV0aG9kID0gdHlwZS5nZXRNZXRob2QoImZvbyIsIG5ldyBTdHJpbmdbXSB7IkxqYXZhLmxhbmcuU3RyaW5nOyJ9KTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQltZXRob2QsIAotCQlERUNMQVJBVElPTlMsIAotCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JLy8gU3lzdGVtLm91dC5wcmludGxuKGRpc3BsYXlTdHJpbmcocmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCksIDIpKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJNeUphci5qYXIgcDEuQS5mb28oamF2YS5sYW5nLlN0cmluZykgLT4gYm9vbGVhbiBbTm8gc291cmNlXSIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIE1ldGhvZCBkZWNsYXJhdGlvbiBpbiBwYWNrYWdlIHRlc3QuCi0gKiAocmVncmVzc2lvbiB0ZXRzIGZvciBQUiAjMUcyS0E5NykKLSAqLwotcHVibGljIHZvaWQgdGVzdE1ldGhvZERlY2xhcmF0aW9uSW5QYWNrYWdlU2NvcGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJwIiwgIlguamF2YSIpLmdldFR5cGUoIlgiKTsKLQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0gU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShuZXcgSUphdmFFbGVtZW50W10ge3R5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCl9KTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQkibWFpbihTdHJpbmdbXSkiLAotCQlNRVRIT0QsCi0JCURFQ0xBUkFUSU9OUywgCi0JCXNjb3BlLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvcC9BLmphdmEgcC5BLm1haW4oU3RyaW5nW10pIC0+IHZvaWQgW21haW5dIiwgCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogVHlwZSBkZWNsYXJhdGlvbiB1c2luZyBhIHBhY2thZ2Ugc2NvcGUgdGVzdC4KLSAqIChjaGVjayB0aGF0IHN1YnBhY2thZ2VzIGFyZSBub3QgaW5jbHVkZWQpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RUeXBlRGVjbGFyYXRpb25JblBhY2thZ2VTY29wZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgInAzIiwgIlguamF2YSIpLmdldFR5cGUoIlgiKTsKLQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0gU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShuZXcgSUphdmFFbGVtZW50W10ge3R5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCl9KTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQkiWCIsCi0JCVRZUEUsCi0JCURFQ0xBUkFUSU9OUywgCi0JCXNjb3BlLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvcDMvWC5qYXZhIHAzLlggW1hdIiwgCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogVHlwZSBkZWNsYXJhdGlvbiB1c2luZyBhIGJpbmFyeSBwYWNrYWdlIHNjb3BlIHRlc3QuCi0gKiAoY2hlY2sgdGhhdCBzdWJwYWNrYWdlcyBhcmUgbm90IGluY2x1ZGVkKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0VHlwZURlY2xhcmF0aW9uSW5QYWNrYWdlU2NvcGUyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENsYXNzRmlsZSgiSmF2YVNlYXJjaCIsICJNeUphci5qYXIiLCAicDAiLCAiWC5jbGFzcyIpLmdldFR5cGUoKTsKLQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0gU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShuZXcgSUphdmFFbGVtZW50W10ge3R5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCl9KTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0SmF2YVByb2plY3QoIkphdmFTZWFyY2giKS5nZXRQcm9qZWN0KCkuZ2V0V29ya3NwYWNlKCksIAotCQkiWCIsCi0JCVRZUEUsCi0JCURFQ0xBUkFUSU9OUywgCi0JCXNjb3BlLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJNeUphci5qYXIgcDAuWCBbTm8gc291cmNlXSIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIE1ldGhvZCByZWZlcmVuY2UgdGhyb3VnaCBzdXBlciB0ZXN0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TWV0aG9kUmVmZXJlbmNlVGhyb3VnaFN1cGVyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAic2QiLCAiQVEuamF2YSIpLmdldFR5cGUoIkFRIik7Ci0JSU1ldGhvZCBtZXRob2QgPSB0eXBlLmdldE1ldGhvZCgiayIsIG5ldyBTdHJpbmdbXSB7fSk7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJbWV0aG9kLCAKLQkJUkVGRVJFTkNFUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvc2QvQVEuamF2YSBzZC5BUUUuaygpIC0+IHZvaWQgW2soKV0iLCAKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBNZXRob2QgcmVmZXJlbmNlIHRlc3QuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgNTA2OCBzZWFyY2g6IG1pc3NpbmcgbWV0aG9kIHJlZmVyZW5jZSkKLSAqLwotcHVibGljIHZvaWQgdGVzdE1ldGhvZFJlZmVyZW5jZTEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJxNSIsICJBUS5qYXZhIikuZ2V0VHlwZSgiSSIpOwotCUlNZXRob2QgbWV0aG9kID0gdHlwZS5nZXRNZXRob2QoImsiLCBuZXcgU3RyaW5nW10ge30pOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCW1ldGhvZCwgCi0JCVJFRkVSRU5DRVMsIAotCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic3JjL3E1L0FRLmphdmEgcTUuVC5tKCkgLT4gdm9pZCBbaygpXSIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIE1ldGhvZCByZWZlcmVuY2UgdGVzdC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyA1MDY5IHNlYXJjaDogbWV0aG9kIHJlZmVyZW5jZSBpbiBzdXBlciBtaXNzaW5nKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0TWV0aG9kUmVmZXJlbmNlMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgInE2IiwgIkNELmphdmEiKS5nZXRUeXBlKCJBUSIpOwotCUlNZXRob2QgbWV0aG9kID0gdHlwZS5nZXRNZXRob2QoImsiLCBuZXcgU3RyaW5nW10ge30pOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCW1ldGhvZCwgCi0JCVJFRkVSRU5DRVMsIAotCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic3JjL3E2L0NELmphdmEgcTYuQVFFLmsoKSAtPiB2b2lkIFtrKCldIiwgCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogTWV0aG9kIHJlZmVyZW5jZSB0ZXN0LgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDUwNzAgc2VhcmNoOiBtaXNzaW5nIGludGVyZmFjZSBtZXRob2QgcmVmZXJlbmNlICApCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNZXRob2RSZWZlcmVuY2UzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAicTciLCAiQVEuamF2YSIpLmdldFR5cGUoIkkiKTsKLQlJTWV0aG9kIG1ldGhvZCA9IHR5cGUuZ2V0TWV0aG9kKCJrIiwgbmV3IFN0cmluZ1tdIHt9KTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQltZXRob2QsIAotCQlSRUZFUkVOQ0VTLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJInNyYy9xNy9BUS5qYXZhIHE3LkQuaCgpIC0+IHZvaWQgW2soKV0iLCAKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBNZXRob2QgcmVmZXJlbmNlIHRlc3QuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgODkyOCBVbmFibGUgdG8gZmluZCByZWZlcmVuY2VzIG9yIGRlY2xhcmF0aW9ucyBvZiBtZXRob2RzIHRoYXQgdXNlIHN0YXRpYyBpbm5lciBjbGFzc2VzIGluIHRoZSBzaWduYXR1cmUpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNZXRob2RSZWZlcmVuY2U0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAiYjIiLCAiWS5qYXZhIikuZ2V0VHlwZSgiWSIpOwotCUlNZXRob2QgbWV0aG9kID0gdHlwZS5nZXRNZXRob2QoImZvbyIsIG5ldyBTdHJpbmdbXSB7IlFYLklubmVyOyJ9KTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQltZXRob2QsIAotCQlSRUZFUkVOQ0VTLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJInNyYy9iMi9aLmphdmEgYjIuWi5iYXIoKSAtPiB2b2lkIFtmb28oaW5uZXIpXSIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIE1ldGhvZCByZWZlcmVuY2UgdGhyb3VnaCBhcnJheSB0ZXN0LgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgMUdIREEyVjogSVRQSkNPUkU6V0lOTlQgLSBDbGFzc0Nhc3RFeGNlcHRpb24gd2hlbiBkb2luZyBhIHNlYXJjaCkKLSAqLwotcHVibGljIHZvaWQgdGVzdE1ldGhvZFJlZmVyZW5jZVRocm91Z2hBcnJheSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDbGFzc0ZpbGUoIkphdmFTZWFyY2giLCBnZXRFeHRlcm5hbEpDTFBhdGhTdHJpbmcoKSwgImphdmEubGFuZyIsICJPYmplY3QuY2xhc3MiKS5nZXRUeXBlKCk7Ci0JSU1ldGhvZCBtZXRob2QgPSB0eXBlLmdldE1ldGhvZCgiY2xvbmUiLCBuZXcgU3RyaW5nW10ge30pOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCW1ldGhvZCwgCi0JCVJFRkVSRU5DRVMsIAotCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic3JjL0UuamF2YSBFLmZvbygpIC0+IE9iamVjdCBbY2xvbmUoKV0iLCAKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBNZXRob2QgcmVmZXJlbmNlIGluIGlubmVyIGNsYXNzIHRlc3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNZXRob2RSZWZlcmVuY2VJbklubmVyQ2xhc3MoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICIiLCAiQ0EuamF2YSIpLmdldFR5cGUoIkNBIik7Ci0JSU1ldGhvZCBtZXRob2QgPSB0eXBlLmdldE1ldGhvZCgibSIsIG5ldyBTdHJpbmdbXSB7fSk7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJbWV0aG9kLCAKLQkJUkVGRVJFTkNFUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvQ0EuamF2YSBDQSRDQi5mKCkgLT4gdm9pZCBbbSgpXVxuIiArCi0JCSJzcmMvQ0EuamF2YSBDQSRDQiRDQy5mKCkgLT4gdm9pZCBbbSgpXSIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIE1ldGhvZCByZWZlcmVuY2UgaW4gYW5vbnltb3VzIGNsYXNzIHRlc3QuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBQUiAxR0dOT1RGOiBJVFBKQ09SRTpXSU5OVCAtIFNlYXJjaCBkb2Vzbid0IGZpbmQgbWV0aG9kIHJlZmVyZW5jZWQgaW4gYW5vbnltb3VzIGlubmVyIGNsYXNzKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0TWV0aG9kUmVmZXJlbmNlSW5Bbm9ueW1vdXNDbGFzcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgIiIsICJQUl8xR0dOT1RGLmphdmEiKS5nZXRUeXBlKCJQUl8xR0dOT1RGIik7Ci0JSU1ldGhvZCBtZXRob2QgPSB0eXBlLmdldE1ldGhvZCgibWV0aG9kIiwgbmV3IFN0cmluZ1tdIHt9KTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQltZXRob2QsIAotCQlSRUZFUkVOQ0VTLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJInNyYy9QUl8xR0dOT1RGLmphdmEgUFJfMUdHTk9URi5tZXRob2QyKCkgLT4gdm9pZCBbbWV0aG9kKCldIiwgCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogTWVtYmVyIHR5cGUgbmFtZWQgIk9iamVjdCIgcmVmZXJlbmNlIHRlc3QuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciAxRzRHSFBTOiBJVFBKVUk6V0lOTlQgLSBTdHJhbmdlIGVycm9yIG1lc3NhZ2UgaW4gc2VhcmNoKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0T2JqZWN0TWVtYmVyVHlwZVJlZmVyZW5jZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgIk9iamVjdE1lbWJlclR5cGVSZWZlcmVuY2UiLCAiQS5qYXZhIikKLQkJLmdldFR5cGUoIkEiKQotCQkuZ2V0VHlwZSgiT2JqZWN0Iik7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCXJlc3VsdENvbGxlY3Rvci5zaG93QWNjdXJhY3kgPSB0cnVlOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJdHlwZSwgCi0JCVJFRkVSRU5DRVMsIAotCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic3JjL09iamVjdE1lbWJlclR5cGVSZWZlcmVuY2UvQS5qYXZhIE9iamVjdE1lbWJlclR5cGVSZWZlcmVuY2UuQS5mb28oKSAtPiB2b2lkIFtPYmplY3RdIEVYQUNUX01BVENIIiwKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBPclBhdHRlcm4gdGVzdC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyA1ODYyIHNlYXJjaCA6IHRvbyBtYW55IG1hdGNoZXMgb24gc2VhcmNoIHdpdGggT3JQYXR0ZXJuKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0T3JQYXR0ZXJuKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUlNZXRob2QgbGVmdE1ldGhvZCA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAicTkiLCAiSS5qYXZhIikKLQkJLmdldFR5cGUoIkkiKS5nZXRNZXRob2QoIm0iLCBuZXcgU3RyaW5nW10ge30pOwotCUlTZWFyY2hQYXR0ZXJuIGxlZnRQYXR0ZXJuID0gU2VhcmNoRW5naW5lLmNyZWF0ZVNlYXJjaFBhdHRlcm4obGVmdE1ldGhvZCwgQUxMX09DQ1VSUkVOQ0VTKTsKLQlJTWV0aG9kIHJpZ2h0TWV0aG9kID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJxOSIsICJJLmphdmEiKQotCQkuZ2V0VHlwZSgiQTEiKS5nZXRNZXRob2QoIm0iLCBuZXcgU3RyaW5nW10ge30pOwotCUlTZWFyY2hQYXR0ZXJuIHJpZ2h0UGF0dGVybiA9IFNlYXJjaEVuZ2luZS5jcmVhdGVTZWFyY2hQYXR0ZXJuKHJpZ2h0TWV0aG9kLCBBTExfT0NDVVJSRU5DRVMpOwotCUlTZWFyY2hQYXR0ZXJuIG9yUGF0dGVybiA9IFNlYXJjaEVuZ2luZS5jcmVhdGVPclNlYXJjaFBhdHRlcm4obGVmdFBhdHRlcm4sIHJpZ2h0UGF0dGVybik7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCXJlc3VsdENvbGxlY3Rvci5zaG93QWNjdXJhY3kgPSB0cnVlOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJb3JQYXR0ZXJuLAotCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvcTkvSS5qYXZhIHE5LkkubSgpIC0+IHZvaWQgW21dIEVYQUNUX01BVENIXG4iICsKLQkJInNyYy9xOS9JLmphdmEgcTkuQTEubSgpIC0+IHZvaWQgW21dIEVYQUNUX01BVENIIiwKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBQYWNrYWdlIHJlZmVyZW5jZSB0ZXN0LgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgUFIgMUdLOTBINDogSVRQSkNPUkU6V0lOMjAwMCAtIHNlYXJjaDogbWlzc2luZyBwYWNrYWdlIHJlZmVyZW5jZSkKLSAqLwotcHVibGljIHZvaWQgdGVzdFBhY2thZ2VSZWZlcmVuY2UxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVBhY2thZ2VGcmFnbWVudCBwa2cgPSBnZXRQYWNrYWdlRnJhZ21lbnQoIkphdmFTZWFyY2giLCAic3JjIiwgInEyIik7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJcGtnLCAKLQkJUkVGRVJFTkNFUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvcTEvQi5qYXZhIHExLkIubShBQSkgLT4gdm9pZCBbcTJdIiwgCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogUGFja2FnZSByZWZlcmVuY2UgdGVzdC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAxNzkwNiBSZW5hbWUgcGFja2FnZSBmYWlscyB3aGVuIGlubmVyIGNsYXNzZXMgYXJlIGltcG9ydGVkKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0UGFja2FnZVJlZmVyZW5jZTIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IGdldFBhY2thZ2VGcmFnbWVudCgiSmF2YVNlYXJjaCIsICJzcmMiLCAiYjgiKTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQlwa2csIAotCQlSRUZFUkVOQ0VTLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJInNyYy9iOS9Gb28uamF2YSBbYjhdIiwgCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLQotLyoqCi0gKiBUZXN0IHBhdHRlcm4gbWF0Y2ggcGFja2FnZSByZWZlcmVuY2VzCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RQYXR0ZXJuTWF0Y2hQYWNrYWdlUmVmZXJlbmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJIipwMi4qIiwKLQkJUEFDS0FHRSwKLQkJUkVGRVJFTkNFUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvUGFja2FnZVJlZmVyZW5jZS9BLmphdmEgW3AzLnAyLnBdXG4iICsKLQkJInNyYy9QYWNrYWdlUmVmZXJlbmNlL0IuamF2YSBbcDMucDIucF1cbiIgKwotCQkic3JjL1BhY2thZ2VSZWZlcmVuY2UvQy5qYXZhIFBhY2thZ2VSZWZlcmVuY2UuQyBbcDMucDIucF1cbiIgKwotCQkic3JjL1BhY2thZ2VSZWZlcmVuY2UvRC5qYXZhIFBhY2thZ2VSZWZlcmVuY2UuRC54IFtwMy5wMi5wXVxuIiArCi0JCSJzcmMvUGFja2FnZVJlZmVyZW5jZS9FLmphdmEgUGFja2FnZVJlZmVyZW5jZS5FLnggW3AzLnAyLnBdXG4iICsKLQkJInNyYy9QYWNrYWdlUmVmZXJlbmNlL0YuamF2YSBQYWNrYWdlUmVmZXJlbmNlLkYuZm9vKCkgLT4gcDMucDIucC5YIFtwMy5wMi5wXVxuIiArCi0JCSJzcmMvUGFja2FnZVJlZmVyZW5jZS9HLmphdmEgUGFja2FnZVJlZmVyZW5jZS5HLmZvbyhwMy5wMi5wLlgpIC0+IHZvaWQgW3AzLnAyLnBdXG4iICsKLQkJInNyYy9QYWNrYWdlUmVmZXJlbmNlL0guamF2YSBQYWNrYWdlUmVmZXJlbmNlLkguZm9vKCkgLT4gdm9pZCBbcDMucDIucF1cbiIgKwotCQkic3JjL1BhY2thZ2VSZWZlcmVuY2UvSS5qYXZhIFBhY2thZ2VSZWZlcmVuY2UuSS5mb28oKSAtPiB2b2lkIFtwMy5wMi5wXVxuIiArCi0JCSJzcmMvUGFja2FnZVJlZmVyZW5jZS9KLmphdmEgUGFja2FnZVJlZmVyZW5jZS5KLmZvbygpIC0+IHZvaWQgW3AzLnAyLnBdIiwgCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogVGVzdCBwYXR0ZXJuIG1hdGNoIHR5cGUgZGVjbGFyYXRpb24KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAxNzIxMCBObyBtYXRjaCBmb3VuZCB3aGVuIHF1ZXJ5IGNvbnRhaW5zICc/JykKLSAqLwotcHVibGljIHZvaWQgdGVzdFBhdHRlcm5NYXRjaFR5cGVEZWNsYXJhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQkiWD9aIiwKLQkJVFlQRSwKLQkJREVDTEFSQVRJT05TLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygic3JjL3I1L1hZWi5qYXZhIHI1LlhZWiBbWFlaXSIsIHJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogVGVzdCBwYXR0ZXJuIG1hdGNoIHR5cGUgcmVmZXJlbmNlIGluIGJpbmFyeQotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDI0NzQxIFNlYXJjaCBkb2VzIG5vdCBmaW5kIHBhdHRlcm5lZCB0eXBlIHJlZmVyZW5jZSBpbiBiaW5hcnkgcHJvamVjdCAgKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0UGF0dGVybk1hdGNoVHlwZVJlZmVyZW5jZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQkicDI0NzQxLioiLAotCQlUWVBFLAotCQlSRUZFUkVOQ0VTLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJInRlc3QyNDc0MS5qYXIgcTI0NzQxLkIiLCAKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBUZXN0IHRoYXQgd2UgZmluZCBwb3RlbnRpYWwgbWF0Y2hlcyBpbiBiaW5hcmllcyBldmVuIGlmIHdlIGNhbid0IHJlc29sdmUgdGhlIGVudGlyZQotICogY2xhc3MgZmlsZS4KLSAqIChSZWdyZXNzaW9uIHRlc3QgZm9yIDFHNElOM0U6IElUUEpDT1JFOldJTk5UIC0gQWJvcnRDb21waWxhdGlvbiB1c2luZyBKOSB0byBzZWFyY2ggZm9yIGNsYXNzIGRlY2xhcmF0aW9uKSAKLSAqLwotcHVibGljIHZvaWQgdGVzdFBvdGVudGlhbE1hdGNoSW5CaW5hcnkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJSmF2YVByb2plY3QgcHJvamVjdCA9IHRoaXMuZ2V0SmF2YVByb2plY3QoIkphdmFTZWFyY2giKTsKLQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBwcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCXRyeSB7Ci0JCS8vIGFkZCBBYm9ydENvbXBpbGF0aW9uLmphciB0byBjbGFzc3BhdGgKLQkJaW50IGxlbmd0aCA9IGNsYXNzcGF0aC5sZW5ndGg7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0NsYXNzcGF0aCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbbGVuZ3RoKzFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGNsYXNzcGF0aCwgMCwgbmV3Q2xhc3NwYXRoLCAwLCBsZW5ndGgpOwotCQluZXdDbGFzc3BhdGhbbGVuZ3RoXSA9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShuZXcgUGF0aCgiL0phdmFTZWFyY2gvQWJvcnRDb21waWxhdGlvbi5qYXIiKSwgbnVsbCwgbnVsbCk7Ci0JCXByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0NsYXNzcGF0aCwgbnVsbCk7Ci0JCQotCQkvLyBwb3RlbnRpYWwgbWF0Y2ggZm9yIGEgZmllbGQgZGVjbGFyYXRpb24KLQkJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCQlyZXN1bHRDb2xsZWN0b3Iuc2hvd0FjY3VyYWN5ID0gdHJ1ZTsKLQkJbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJCWdldFdvcmtzcGFjZSgpLAotCQkJIk1pc3NpbmdGaWVsZFR5cGUuKiIsCi0JCQlGSUVMRCwgCi0JCQlERUNMQVJBVElPTlMsIAotCQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQkJcmVzdWx0Q29sbGVjdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJIkFib3J0Q29tcGlsYXRpb24uamFyIEFib3J0Q29tcGlsYXRpb24uTWlzc2luZ0ZpZWxkVHlwZS5maWVsZCBbTm8gc291cmNlXSBQT1RFTlRJQUxfTUFUQ0hcbiIgKwotCQkJIkFib3J0Q29tcGlsYXRpb24uamFyIEFib3J0Q29tcGlsYXRpb24uTWlzc2luZ0ZpZWxkVHlwZS5taXNzaW5nIFtObyBzb3VyY2VdIFBPVEVOVElBTF9NQVRDSFxuIiArCi0JCQkiQWJvcnRDb21waWxhdGlvbi5qYXIgQWJvcnRDb21waWxhdGlvbi5NaXNzaW5nRmllbGRUeXBlLm90aGVyRmllbGQgW05vIHNvdXJjZV0gUE9URU5USUFMX01BVENIIiwgCi0JCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci0JCi0JCS8vIHBvdGVudGlhbCBtYXRjaCBmb3IgYSBtZXRob2QgZGVjbGFyYXRpb24KLQkJcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQkJcmVzdWx0Q29sbGVjdG9yLnNob3dBY2N1cmFjeSA9IHRydWU7Ci0JCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCQlnZXRXb3Jrc3BhY2UoKSwKLQkJCSJNaXNzaW5nQXJndW1lbnRUeXBlLmZvbyoiLAotCQkJTUVUSE9ELCAKLQkJCURFQ0xBUkFUSU9OUywgCi0JCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCQlyZXN1bHRDb2xsZWN0b3IpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkiQWJvcnRDb21waWxhdGlvbi5qYXIgQWJvcnRDb21waWxhdGlvbi5NaXNzaW5nQXJndW1lbnRUeXBlLmZvbygpIC0+IHZvaWQgW05vIHNvdXJjZV0gUE9URU5USUFMX01BVENIXG4iICsKLQkJCSJBYm9ydENvbXBpbGF0aW9uLmphciBBYm9ydENvbXBpbGF0aW9uLk1pc3NpbmdBcmd1bWVudFR5cGUuZm9vKGphdmEudXRpbC5FdmVudExpc3RlbmVyKSAtPiB2b2lkIFtObyBzb3VyY2VdIFBPVEVOVElBTF9NQVRDSFxuIiArCi0JCQkiQWJvcnRDb21waWxhdGlvbi5qYXIgQWJvcnRDb21waWxhdGlvbi5NaXNzaW5nQXJndW1lbnRUeXBlLmZvbzIoKSAtPiB2b2lkIFtObyBzb3VyY2VdIFBPVEVOVElBTF9NQVRDSCIsIAotCQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotCQotCQkvLyBwb3RlbnRpYWwgbWF0Y2ggZm9yIGEgdHlwZSBkZWNsYXJhdGlvbgotCQlyZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCQlyZXN1bHRDb2xsZWN0b3Iuc2hvd0FjY3VyYWN5ID0gdHJ1ZTsKLQkJbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJCWdldFdvcmtzcGFjZSgpLAotCQkJIk1pc3NpbmcqIiwKLQkJCVRZUEUsIAotCQkJREVDTEFSQVRJT05TLCAKLQkJCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJCXJlc3VsdENvbGxlY3Rvcik7Ci0JCWFzc2VydEVxdWFscygKLQkJCSJBYm9ydENvbXBpbGF0aW9uLmphciBBYm9ydENvbXBpbGF0aW9uLkVuY2xvc2luZ1R5cGUkTWlzc2luZ0VuY2xvc2luZ1R5cGUgW05vIHNvdXJjZV0gRVhBQ1RfTUFUQ0hcbiIgKwotCQkJIkFib3J0Q29tcGlsYXRpb24uamFyIEFib3J0Q29tcGlsYXRpb24uTWlzc2luZ0FyZ3VtZW50VHlwZSBbTm8gc291cmNlXSBFWEFDVF9NQVRDSFxuIiArCi0JCQkiQWJvcnRDb21waWxhdGlvbi5qYXIgQWJvcnRDb21waWxhdGlvbi5NaXNzaW5nRmllbGRUeXBlIFtObyBzb3VyY2VdIEVYQUNUX01BVENIIiwgCi0JCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJLy8gcmVzZXQgY2xhc3NwYXRoCi0JCXByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKGNsYXNzcGF0aCwgbnVsbCk7Ci0JfQotfQotLyoqCi0gKiBSZWFkIGFuZCB3cml0ZSBhY2Nlc3MgcmVmZXJlbmNlIGluIGNvbXBvdW5kIGV4cHJlc3Npb24gdGVzdC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyA2MTU4IFNlYXJjaCAtIFByZWZpeCBhbmQgcG9zdGZpeCBleHByZXNzaW9uIG5vdCBmb3VuZCBhcyB3cml0ZSByZWZlcmVuY2UpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZWFkV3JpdGVGaWVsZFJlZmVyZW5jZUluQ29tcG91bmRFeHByZXNzaW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAiYTQiLCAiWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCUlGaWVsZCBmaWVsZCA9IHR5cGUuZ2V0RmllbGQoImZpZWxkIik7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCQotCS8vIFJlYWQgcmVmZXJlbmNlCi0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQlmaWVsZCwgCi0JCVJFQURfQUNDRVNTRVMsIAotCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic3JjL2E0L1guamF2YSBhNC5YLmZvbygpIC0+IHZvaWQgW2ZpZWxkXSIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci0JCQotCS8vIFdyaXRlIHJlZmVyZW5jZQotCXJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQlmaWVsZCwgCi0JCVdSSVRFX0FDQ0VTU0VTLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJInNyYy9hNC9YLmphdmEgYTQuWC5mb28oKSAtPiB2b2lkIFtmaWVsZF0iLCAKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotCQkKLX0KLS8qKgotICogU2ltcGxlIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uIHRlc3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAicCIsICJBLmphdmEiKS5nZXRUeXBlKCJBIik7Ci0JSU1ldGhvZCBjb25zdHJ1Y3RvciA9IHR5cGUuZ2V0TWV0aG9kKCJBIiwgbmV3IFN0cmluZ1tdIHsiUVg7In0pOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCWNvbnN0cnVjdG9yLCAKLQkJREVDTEFSQVRJT05TLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygic3JjL3AvQS5qYXZhIHAuQShYKSBbQV0iLCByZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIFNpbXBsZSBjb25zdHJ1Y3RvciByZWZlcmVuY2UgdGVzdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdFNpbXBsZUNvbnN0cnVjdG9yUmVmZXJlbmNlMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgInAiLCAiQS5qYXZhIikuZ2V0VHlwZSgiQSIpOwotCUlNZXRob2QgY29uc3RydWN0b3IgPSB0eXBlLmdldE1ldGhvZCgiQSIsIG5ldyBTdHJpbmdbXSB7IlFYOyJ9KTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQljb25zdHJ1Y3RvciwgCi0JCVJFRkVSRU5DRVMsIAotCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKCJzcmMvVGVzdC5qYXZhIFRlc3QubWFpbihTdHJpbmdbXSkgLT4gdm9pZCBbbmV3IHAuQSh5KV0iLCByZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIFNpbXBsZSBjb25zdHJ1Y3RvciByZWZlcmVuY2UgdGVzdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdFNpbXBsZUNvbnN0cnVjdG9yUmVmZXJlbmNlMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCSJwLkEoWCkiLAotCQlDT05TVFJVQ1RPUiwKLQkJUkVGRVJFTkNFUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoInNyYy9UZXN0LmphdmEgVGVzdC5tYWluKFN0cmluZ1tdKSAtPiB2b2lkIFtuZXcgcC5BKHkpXSIsIHJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogU2ltcGxlIGRlY2xhcmF0aW9ucyBvZiBzZW50IG1lc3NhZ2VzIHRlc3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVEZWNsYXJhdGlvbnNPZlNlbnRNZXNzYWdlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgIiIsICJUZXN0LmphdmEiKTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaERlY2xhcmF0aW9uc09mU2VudE1lc3NhZ2VzKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCWN1LCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvcC9YLmphdmEgcC5YLmZvbyhpbnQsIFN0cmluZywgWCkgLT4gdm9pZCBbZm9vKGludCBpLCBTdHJpbmcgcywgWCB4KV1cbiIgKwotCQkic3JjL3AvWS5qYXZhIHAuWS5iYXIoKSAtPiB2b2lkIFtiYXIoKV1cbiIgKwotCQkic3JjL3AvWi5qYXZhIHAuWi5mb28oaW50LCBTdHJpbmcsIFgpIC0+IHZvaWQgW2ZvbyhpbnQgaSwgU3RyaW5nIHMsIFggeCldXG4iICsKLQkJInNyYy9wL0EuamF2YSBwLkEuZm9vKGludCwgU3RyaW5nLCBYKSAtPiB2b2lkIFtmb28oKV0iLCAKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBTaW1wbGUgZmllbGQgZGVjbGFyYXRpb24gdGVzdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdFNpbXBsZUZpZWxkRGVjbGFyYXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJwIiwgIkEuamF2YSIpLmdldFR5cGUoIkEiKTsKLQlJRmllbGQgZmllbGQgPSB0eXBlLmdldEZpZWxkKCJ4Iik7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJZmllbGQsIAotCQlERUNMQVJBVElPTlMsIAotCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic3JjL3AvQS5qYXZhIHAuQS54IFt4XSIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIFNpbXBsZSBmaWVsZCByZWZlcmVuY2UgdGVzdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdFNpbXBsZUZpZWxkUmVmZXJlbmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAicCIsICJBLmphdmEiKS5nZXRUeXBlKCJBIik7Ci0JSUZpZWxkIGZpZWxkID0gdHlwZS5nZXRGaWVsZCgieCIpOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCWZpZWxkLCAKLQkJUkVGRVJFTkNFUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvVGVzdC5qYXZhIFRlc3QubWFpbihTdHJpbmdbXSkgLT4gdm9pZCBbeF1cbiIgKwotCQkic3JjL3AvQS5qYXZhIHAuQShYKSBbeF0iLCAKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBTaW1wbGUgd3JpdGUgZmllbGQgYWNjZXNzIHJlZmVyZW5jZSB0ZXN0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0U2ltcGxlV3JpdGVGaWVsZFJlZmVyZW5jZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgInAiLCAiQS5qYXZhIikuZ2V0VHlwZSgiQSIpOwotCUlGaWVsZCBmaWVsZCA9IHR5cGUuZ2V0RmllbGQoIngiKTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQlmaWVsZCwgCi0JCVdSSVRFX0FDQ0VTU0VTLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJInNyYy9wL0EuamF2YSBwLkEoWCkgW3hdIiwgCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogU3ViLWN1IGphdmEgc2VhcmNoIHNjb3BlIHRlc3QuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgOTA0MSBzZWFyY2g6IGNhbm5vdCBjcmVhdGUgYSBzdWItY3Ugc2NvcGUpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTdWJDVVNlYXJjaFNjb3BlMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgImIzIiwgIlguamF2YSIpLmdldFR5cGUoIlgiKTsKLQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0gU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShuZXcgSUphdmFFbGVtZW50W10ge3R5cGV9KTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQl0eXBlLAotCQlSRUZFUkVOQ0VTLCAKLQkJc2NvcGUsIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJInNyYy9iMy9YLmphdmEgYjMuWC5maWVsZCBbWF1cbiIgKwotCQkic3JjL2IzL1guamF2YSBiMy5YLmZvbygpIC0+IE9iamVjdCBbWF1cbiIgKwotCQkic3JjL2IzL1guamF2YSBiMy5YJFkuZmllbGQyIFtYXVxuIiArCi0JCSJzcmMvYjMvWC5qYXZhIGIzLlgkWS5mb28yKCkgLT4gT2JqZWN0IFtYXSIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIFN1Yi1jdSBqYXZhIHNlYXJjaCBzY29wZSB0ZXN0LgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDkwNDEgc2VhcmNoOiBjYW5ub3QgY3JlYXRlIGEgc3ViLWN1IHNjb3BlKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0U3ViQ1VTZWFyY2hTY29wZTIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJiMyIsICJYLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUobmV3IElKYXZhRWxlbWVudFtdIHt0eXBlLmdldEZpZWxkKCJmaWVsZCIpfSk7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJdHlwZSwKLQkJUkVGRVJFTkNFUywgCi0JCXNjb3BlLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvYjMvWC5qYXZhIGIzLlguZmllbGQgW1hdIiwgCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogU3ViLWN1IGphdmEgc2VhcmNoIHNjb3BlIHRlc3QuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgOTA0MSBzZWFyY2g6IGNhbm5vdCBjcmVhdGUgYSBzdWItY3Ugc2NvcGUpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTdWJDVVNlYXJjaFNjb3BlMygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgImIzIiwgIlguamF2YSIpLmdldFR5cGUoIlgiKTsKLQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0gU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShuZXcgSUphdmFFbGVtZW50W10ge3R5cGUuZ2V0VHlwZSgiWSIpfSk7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJdHlwZSwKLQkJUkVGRVJFTkNFUywgCi0JCXNjb3BlLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvYjMvWC5qYXZhIGIzLlgkWS5maWVsZDIgW1hdXG4iICsKLQkJInNyYy9iMy9YLmphdmEgYjMuWCRZLmZvbzIoKSAtPiBPYmplY3QgW1hdIiwgCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogVHlwZSBkZWNsYXJhdGlvbiB0ZXN0LgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDI5NTI0IFNlYXJjaCBmb3IgZGVjbGFyYXRpb24gdmlhIHBhdHRlcm5zIGFkZHMgJyIqIikKLSAqLwotcHVibGljIHZvaWQgdGVzdFR5cGVEZWNsYXJhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlQYWNrYWdlRnJhZ21lbnQgcGtnID0gdGhpcy5nZXRQYWNrYWdlRnJhZ21lbnQoIkphdmFTZWFyY2giLCAic3JjIiwgImQ4Iik7Ci0JSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUobmV3IElKYXZhRWxlbWVudFtdIHtwa2d9KTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQkiQSIsCi0JCVRZUEUsCi0JCURFQ0xBUkFUSU9OUywgCi0JCXNjb3BlLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoInNyYy9kOC9BLmphdmEgZDguQSBbQV0iLCByZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIFNpbXBsZSBtZXRob2QgZGVjbGFyYXRpb24gdGVzdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdFNpbXBsZU1ldGhvZERlY2xhcmF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAicCIsICJYLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JSU1ldGhvZCBtZXRob2QgPSB0eXBlLmdldE1ldGhvZCgiZm9vIiwgbmV3IFN0cmluZ1tdIHsiSSIsICJRU3RyaW5nOyIsICJRWDsifSk7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJbWV0aG9kLCAKLQkJREVDTEFSQVRJT05TLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJInNyYy9wL1guamF2YSBwLlguZm9vKGludCwgU3RyaW5nLCBYKSAtPiB2b2lkIFtmb29dXG4iICsKLQkJInNyYy9wL1ouamF2YSBwLlouZm9vKGludCwgU3RyaW5nLCBYKSAtPiB2b2lkIFtmb29dIiwgCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogU2ltcGxlIG1ldGhvZCByZWZlcmVuY2UgdGVzdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdFNpbXBsZU1ldGhvZFJlZmVyZW5jZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgInAiLCAiWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCUlNZXRob2QgbWV0aG9kID0gdHlwZS5nZXRNZXRob2QoImZvbyIsIG5ldyBTdHJpbmdbXSB7IkkiLCAiUVN0cmluZzsiLCAiUVg7In0pOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCW1ldGhvZCwgCi0JCVJFRkVSRU5DRVMsIAotCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic3JjL1Rlc3QuamF2YSBUZXN0Lm1haW4oU3RyaW5nW10pIC0+IHZvaWQgW2ZvbygxLCBcImFcIiwgeSldXG4iICsKLQkJInNyYy9UZXN0LmphdmEgVGVzdC5tYWluKFN0cmluZ1tdKSAtPiB2b2lkIFtmb28oMSwgXCJhXCIsIHopXVxuIiArCi0JCSJzcmMvcC9aLmphdmEgcC5aLmZvbyhpbnQsIFN0cmluZywgWCkgLT4gdm9pZCBbZm9vKGksIHMsIG5ldyBZKHRydWUpKV0iLCAKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBTaW1wbGUgcGFja2FnZSBkZWNsYXJhdGlvbiB0ZXN0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0U2ltcGxlUGFja2FnZURlY2xhcmF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVBhY2thZ2VGcmFnbWVudCBwa2cgPSBnZXRQYWNrYWdlRnJhZ21lbnQoIkphdmFTZWFyY2giLCAic3JjIiwgInAiKTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQlwa2csIAotCQlERUNMQVJBVElPTlMsIAotCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic3JjL3AgcCIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIFNpbXBsZSBwYWNrYWdlIHJlZmVyZW5jZSB0ZXN0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0U2ltcGxlUGFja2FnZVJlZmVyZW5jZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlQYWNrYWdlRnJhZ21lbnQgcGtnID0gZ2V0UGFja2FnZUZyYWdtZW50KCJKYXZhU2VhcmNoIiwgInNyYyIsICJwIik7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJcGtnLCAKLQkJUkVGRVJFTkNFUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvSW50ZXJmYWNlSW1wbGVtZW50b3JzLmphdmEgSW50ZXJmYWNlSW1wbGVtZW50b3JzIFtwXVxuIiArCi0JCSJzcmMvVGVzdC5qYXZhIFRlc3QubWFpbihTdHJpbmdbXSkgLT4gdm9pZCBbcF1cbiIgKwotCQkic3JjL1Rlc3QuamF2YSBUZXN0Lm1haW4oU3RyaW5nW10pIC0+IHZvaWQgW3BdXG4iICsKLQkJInNyYy9UZXN0LmphdmEgVGVzdC5tYWluKFN0cmluZ1tdKSAtPiB2b2lkIFtwXVxuIiArCi0JCSJzcmMvVGVzdC5qYXZhIFRlc3QubWFpbihTdHJpbmdbXSkgLT4gdm9pZCBbcF1cbiIgKwotCQkic3JjL1Rlc3QuamF2YSBUZXN0Lm1haW4oU3RyaW5nW10pIC0+IHZvaWQgW3BdXG4iICsKLQkJInNyYy9UZXN0LmphdmEgVGVzdC5tYWluKFN0cmluZ1tdKSAtPiB2b2lkIFtwXVxuIiArCi0JCSJzcmMvVGVzdC5qYXZhIFRlc3QubWFpbihTdHJpbmdbXSkgLT4gdm9pZCBbcF1cbiIgKwotCQkic3JjL1R5cGVSZWZlcmVuY2VJbkltcG9ydC9YLmphdmEgW3BdIiwgCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogU2ltcGxlIGZpZWxkIHJlYWQgYWNjZXNzIHJlZmVyZW5jZSB0ZXN0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0U2ltcGxlUmVhZEZpZWxkUmVmZXJlbmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAicCIsICJBLmphdmEiKS5nZXRUeXBlKCJBIik7Ci0JSUZpZWxkIGZpZWxkID0gdHlwZS5nZXRGaWVsZCgieCIpOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCWZpZWxkLCAKLQkJUkVBRF9BQ0NFU1NFUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvVGVzdC5qYXZhIFRlc3QubWFpbihTdHJpbmdbXSkgLT4gdm9pZCBbeF0iLCAKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBTaW1wbGUgdHlwZSBkZWNsYXJhdGlvbiB0ZXN0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0U2ltcGxlVHlwZURlY2xhcmF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAicCIsICJYLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJdHlwZSwKLQkJREVDTEFSQVRJT05TLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygic3JjL3AvWC5qYXZhIHAuWCBbWF0iLCByZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIFNpbXBsZSB0eXBlIHJlZmVyZW5jZSB0ZXN0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0U2ltcGxlVHlwZVJlZmVyZW5jZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgInAiLCAiWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCXR5cGUsIAotCQlSRUZFUkVOQ0VTLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJInNyYy9wL0EuamF2YSBwLkEueCBbWF1cbiIgKwotCQkic3JjL3AvQS5qYXZhIHAuQShYKSBbWF1cbiIgKwotCQkic3JjL3AvQS5qYXZhIHAuQS5mb28oaW50LCBTdHJpbmcsIFgpIC0+IHZvaWQgW1hdXG4iICsKLQkJInNyYy9wL1guamF2YSBwLlgoKSBbWF1cbiIgKwotCQkic3JjL3AvWC5qYXZhIHAuWC5mb28oaW50LCBTdHJpbmcsIFgpIC0+IHZvaWQgW1hdXG4iICsKLQkJInNyYy9wL1kuamF2YSBwLlkgW1hdXG4iICsKLQkJInNyYy9wL1ouamF2YSBwLlouZm9vKGludCwgU3RyaW5nLCBYKSAtPiB2b2lkIFtYXSIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIFN0YXRpYyBmaWVsZCByZWZlcmVuY2UgdGVzdC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIFBSICMxRzJQNUVQKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0U3RhdGljRmllbGRSZWZlcmVuY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJwIiwgIkEuamF2YSIpLmdldFR5cGUoIkEiKTsKLQlJRmllbGQgZmllbGQgPSB0eXBlLmdldEZpZWxkKCJERUJVRyIpOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCWZpZWxkLCAKLQkJUkVGRVJFTkNFUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvcC9BLmphdmEgcC5BLmZvbygpIC0+IHZvaWQgW0RFQlVHXSIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIFN0YXRpYyBtZXRob2QgcmVmZXJlbmNlIHRlc3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTdGF0aWNNZXRob2RSZWZlcmVuY2UxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAicCIsICJZLmphdmEiKS5nZXRUeXBlKCJZIik7Ci0JSU1ldGhvZCBtZXRob2QgPSB0eXBlLmdldE1ldGhvZCgiYmFyIiwgbmV3IFN0cmluZ1tdIHt9KTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQltZXRob2QsIAotCQlSRUZFUkVOQ0VTLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJInNyYy9UZXN0LmphdmEgVGVzdC5tYWluKFN0cmluZ1tdKSAtPiB2b2lkIFtiYXIoKV0iLCAKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBTdGF0aWMgbWV0aG9kIHJlZmVyZW5jZSB0ZXN0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0U3RhdGljTWV0aG9kUmVmZXJlbmNlMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgInAiLCAiWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCUlNZXRob2QgbWV0aG9kID0gdHlwZS5nZXRNZXRob2QoImJhciIsIG5ldyBTdHJpbmdbXSB7fSk7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJbWV0aG9kLCAKLQkJUkVGRVJFTkNFUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSIiLCAKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBUeXBlIGRlY2xhcmF0aW9uIGluIGphciBmaWxlIHRlc3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RUeXBlRGVjbGFyYXRpb25JbkphcigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDbGFzc0ZpbGUoIkphdmFTZWFyY2giLCAiTXlKYXIuamFyIiwgInAxIiwgIkEuY2xhc3MiKS5nZXRUeXBlKCk7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJdHlwZSwgCi0JCURFQ0xBUkFUSU9OUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJNeUphci5qYXIgcDEuQSBbTm8gc291cmNlXSIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIFR5cGUgZGVjbGFyYXRpb24gaW4gamFyIGZpbGUgYW5kIGluIGFub255bW91cyBjbGFzcyB0ZXN0LgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgMjA2MzEgRGVjbGFyYXRpb24gb2YgbG9jYWwgYmluYXJ5IHR5cGUgbm90IGZvdW5kKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0VHlwZURlY2xhcmF0aW9uSW5KYXIyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoIkphdmFTZWFyY2giLCAidGVzdDIwNjMxLmphciIpOwotCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKG5ldyBJSmF2YUVsZW1lbnRbXSB7cm9vdH0pOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCSJZIiwKLQkJVFlQRSwgCi0JCURFQ0xBUkFUSU9OUywgCi0JCXNjb3BlLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJ0ZXN0MjA2MzEuamFyIFgkMSRZIiwgCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogVHlwZSBvY3VycmVuY2UgdGVzdC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIFBSIDFHS0FRSlM6IElUUEpDT1JFOldJTjIwMDAgLSBzZWFyY2g6IGluY29ycmVjdCByZXN1bHRzIGZvciBuZXN0ZWQgdHlwZXMpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RUeXBlT2NjdXJlbmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAiciIsICJBLmphdmEiKS5nZXRUeXBlKCJBIikuZ2V0VHlwZSgiWCIpOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCXR5cGUsIAotCQlBTExfT0NDVVJSRU5DRVMsIAotCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic3JjL3IvQS5qYXZhIHIuQS5tKCkgLT4gQSBbWF1cbiIgKwotCQkic3JjL3IvQS5qYXZhIHIuQSRYIFtYXVxuIiArCi0JCSJzcmMvci9BLmphdmEgci5BJFgoWCkgW1hdXG4iICsKLQkJInNyYy9yL0EuamF2YSByLkEkWChYKSBbWF1cbiIgKwotCQkic3JjL3IvQS5qYXZhIHIuQi5heCBbQS5YXVxuIiArCi0JCSJzcmMvci9BLmphdmEgci5CLmF4IFtYXSIsCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogVHlwZSBvY3V1cmVuY2UgaW4gdW5yZXNvbHZhYmxlIGltcG9ydCB0ZXN0LgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDM3MTY2IE5QRSBpbiBTZWFyY2hFbmdpbmUgd2hlbiBtYXRjaGluZyB0eXBlIGFnYWluc3QgUHJvYmxlbVJlZmVyZW5jZUJpbmRpbmcgKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0VHlwZU9jY3VyZW5jZTIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAicjgiLCAiQi5qYXZhIikuZ2V0VHlwZSgiQiIpOwotCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKG5ldyBJSmF2YUVsZW1lbnRbXSB7dHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKX0pOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCXR5cGUsIAotCQlBTExfT0NDVVJSRU5DRVMsIAotCQlzY29wZSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic3JjL3I4L0EuamF2YSBbcjguQl0iLAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIFR5cGUgbmFtZSB3aXRoICQgb2N1cnJlbmNlIHRlc3QuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMzMxMCBTbW9rZSAxMjQ6IENvbXBpbGUgZXJyb3JzIGludHJvZHVjZWQgd2l0aCByZW5hbWUgcmVmYWN0b3JpbmcgKDFHRkJLMkcpKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0VHlwZU9jY3VyZW5jZVdpdGhEb2xsYXIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJxMyIsICJBJEIuamF2YSIpLmdldFR5cGUoIkEkQiIpOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCXR5cGUsIAotCQlBTExfT0NDVVJSRU5DRVMsIAotCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic3JjL3EzL0EkQi5qYXZhIHEzLkEkQiBbQSRCXVxuIiArCi0JCSJzcmMvcTQvQy5qYXZhIHE0LkMuZm9vKCkgLT4gT2JqZWN0IFtxMy5BJEJdIiwKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBUeXBlIHJlZmVyZW5jZSB0ZXN0LgotICogKFJlZ3Jlc3Npb24gdGVzdCBmb3IgUFIgMUdLN0sxNzogSVRQSkNPUkU6V0lOMjAwMCAtIHNlYXJjaDogbWlzc2luZyB0eXBlIHJlZmVyZW5jZSkKLSAqLwotcHVibGljIHZvaWQgdGVzdFR5cGVSZWZlcmVuY2UxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAiIiwgIlguamF2YSIpLmdldFR5cGUoIlgiKTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQl0eXBlLCAKLQkJUkVGRVJFTkNFUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvWC5qYXZhIEFBKCkgW1hdIiwKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBUeXBlIHJlZmVyZW5jZSB0ZXN0LgotICogKFJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDI5NTE2IFNlYXJjaEVuZ2luZSByZWdyZXNzaW9ucyBpbiAyMDAzMDExNCkKLSAqLwotcHVibGljIHZvaWQgdGVzdFR5cGVSZWZlcmVuY2UyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAiZDciLCAiQS5qYXZhIikuZ2V0VHlwZSgiQSIpOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCXR5cGUsIAotCQlSRUZFUkVOQ0VTLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJInNyYy9kNy9BLmphdmEgZDcuQS5BIFtBXVxuIiArCi0JCSJzcmMvZDcvQS5qYXZhIGQ3LkEuQShBKSAtPiBBIFtBXVxuIiArCi0JCSJzcmMvZDcvQS5qYXZhIGQ3LkEuQShBKSAtPiBBIFtBXSIsCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogVHlwZSByZWZlcmVuY2UgdGVzdC4KLSAqIChSZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAzMTk4NSBOUEUgc2VhcmNoaW5nIG5vbi1xdWFsaWZpZWQgYW5kIGNhc2UgaW5zZW5zaXRpdmUgdHlwZSByZWYpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RUeXBlUmVmZXJlbmNlMygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlTZWFyY2hQYXR0ZXJuIHBhdHRlcm4gPSBTZWFyY2hFbmdpbmUuY3JlYXRlU2VhcmNoUGF0dGVybigieDMxOTg1IiwgVFlQRSwgUkVGRVJFTkNFUywgZmFsc2UpOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQlyZXN1bHRDb2xsZWN0b3Iuc2hvd0FjY3VyYWN5ID0gdHJ1ZTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCXBhdHRlcm4sCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvZTMvWDMxOTg1LmphdmEgZTMuWDMxOTg1LkNPTlNUQU5UIFtYMzE5ODVdIEVYQUNUX01BVENIXG4iICsKLQkJInNyYy9lMy9ZMzE5ODUuamF2YSBlMy5ZMzE5ODUuZm9vKCkgLT4gT2JqZWN0IFtYMzE5ODVdIEVYQUNUX01BVENIIiwKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBUeXBlIHJlZmVyZW5jZSB0ZXN0LgotICogKFJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDMxOTk3IFJlZmFjdG9yaW5nIGQubi4gd29yayBmb3IgcHJvamVjdHMgd2l0aCBicmFja2V0cyBpbiBuYW1lLikKLSAqLwotcHVibGljIHZvaWQgdGVzdFR5cGVSZWZlcmVuY2U0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJvdGhlclNyYygpIiwgIiIsICJYMzE5OTcuamF2YSIpLmdldFR5cGUoIlgzMTk5NyIpOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCXR5cGUsIAotCQlSRUZFUkVOQ0VTLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJIm90aGVyU3JjKCkvWTMxOTk3LmphdmEgWTMxOTk3IFtYMzE5OTddIiwKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBUeXBlIHJlZmVyZW5jZSBhcyBhIHNpbmdsZSBuYW1lIHJlZmVyZW5jZSB0ZXN0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0VHlwZVJlZmVyZW5jZUFzU2luZ2xlTmFtZVJlZmVyZW5jZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgIiIsICJUeXBlUmVmZXJlbmNlQXNTaW5nbGVOYW1lUmVmZXJlbmNlLmphdmEiKS5nZXRUeXBlKCJUeXBlUmVmZXJlbmNlQXNTaW5nbGVOYW1lUmVmZXJlbmNlIik7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJdHlwZSwgCi0JCVJFRkVSRU5DRVMsIAotCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic3JjL1R5cGVSZWZlcmVuY2VBc1NpbmdsZU5hbWVSZWZlcmVuY2UuamF2YSBUeXBlUmVmZXJlbmNlQXNTaW5nbGVOYW1lUmVmZXJlbmNlLmhhc1JlZmVyZW5jZSgpIC0+IHZvaWQgW1R5cGVSZWZlcmVuY2VBc1NpbmdsZU5hbWVSZWZlcmVuY2VdXG4iICsKLQkJInNyYy9UeXBlUmVmZXJlbmNlQXNTaW5nbGVOYW1lUmVmZXJlbmNlLmphdmEgVHlwZVJlZmVyZW5jZUFzU2luZ2xlTmFtZVJlZmVyZW5jZS5oYXNSZWZlcmVuY2UoKSAtPiB2b2lkIFtUeXBlUmVmZXJlbmNlQXNTaW5nbGVOYW1lUmVmZXJlbmNlXSIsCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogVHlwZSByZWZlcmVuY2UgaW4gYXJyYXkgdGVzdC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIFBSICMxR0FMNDI0KQotICovCi1wdWJsaWMgdm9pZCB0ZXN0VHlwZVJlZmVyZW5jZUluQXJyYXkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJUeXBlUmVmZXJlbmNlSW5BcnJheSIsICJBLmphdmEiKS5nZXRUeXBlKCJBIik7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJdHlwZSwgCi0JCVJFRkVSRU5DRVMsIAotCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic3JjL1R5cGVSZWZlcmVuY2VJbkFycmF5L0EuamF2YSBUeXBlUmVmZXJlbmNlSW5BcnJheS5BLmEgW0FdXG4iICsKLQkJInNyYy9UeXBlUmVmZXJlbmNlSW5BcnJheS9BLmphdmEgVHlwZVJlZmVyZW5jZUluQXJyYXkuQS5iIFtUeXBlUmVmZXJlbmNlSW5BcnJheS5BXSIsCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogVHlwZSByZWZlcmVuY2UgaW4gYXJyYXkgdGVzdC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAzMjMwIFNlYXJjaCAtIFRvbyBtYW55IHR5cGUgcmVmZXJlbmNlcyBmb3IgcXVlcnkgZW5kaW5nIHdpdGggKiAoMUdBWlZHSSkgICkKLSAqLwotcHVibGljIHZvaWQgdGVzdFR5cGVSZWZlcmVuY2VJbkFycmF5MigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgInMxIiwgIlguamF2YSIpLmdldFR5cGUoIlgiKTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQl0eXBlLCAKLQkJUkVGRVJFTkNFUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvczEvWS5qYXZhIHMxLlkuZiBbWF0iLAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIFR5cGUgcmVmZXJlbmNlIGluIGNhc3QgdGVzdC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAyMzMyOSBzZWFyY2g6IGluY29ycmVjdCByYW5nZSBmb3IgdHlwZSByZWZlcmVuY2VzIGluIGJyYWNrZXRzKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0VHlwZVJlZmVyZW5jZUluQ2FzdCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgInMzIiwgIkEuamF2YSIpLmdldFR5cGUoIkIiKTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQl0eXBlLCAKLQkJUkVGRVJFTkNFUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvczMvQS5qYXZhIHMzLkEuZm9vKCkgLT4gT2JqZWN0IFtCXSIsCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogVHlwZSByZWZlcmVuY2UgaW4gaGllcmFyY2h5IHRlc3QuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMjgyMzYgU2VhcmNoIGZvciByZWZzIHRvIGNsYXNzIGluIGhpZXJhcmNoeSBtYXRjaGVzIGNsYXNzIG91dHNpZGUgaGllcmFyY2h5ICkKLSAqLwotcHVibGljIHZvaWQgdGVzdFR5cGVSZWZlcmVuY2VJbkhpZXJhcmNoeSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgImQ5LnAxIiwgIkEuamF2YSIpLmdldFR5cGUoIkEiKTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVIaWVyYXJjaHlTY29wZSh0eXBlKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCXR5cGUsIAotCQlSRUZFUkVOQ0VTLCAKLQkJc2NvcGUsIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJIiIsCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogVHlwZSByZWZlcmVuY2UgaW4gaW1wb3J0IHRlc3QuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBQUiAjMUdBN1BBUykKLSAqLwotcHVibGljIHZvaWQgdGVzdFR5cGVSZWZlcmVuY2VJbkltcG9ydCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgInAyIiwgIlouamF2YSIpLmdldFR5cGUoIloiKTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQl0eXBlLCAKLQkJUkVGRVJFTkNFUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvVHlwZVJlZmVyZW5jZUluSW1wb3J0L1guamF2YSBbcDIuWl0iLAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIFR5cGUgcmVmZXJlbmNlIGluIGltcG9ydCB0ZXN0LgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDIzMDc3IHNlYXJjaDogZG9lcyBub3QgZmluZCB0eXBlIHJlZmVyZW5jZXMgaW4gc29tZSBpbXBvcnRzKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0VHlwZVJlZmVyZW5jZUluSW1wb3J0MigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgInI2IiwgIkEuamF2YSIpLmdldFR5cGUoIkEiKTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQl0eXBlLCAKLQkJUkVGRVJFTkNFUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvcjYvQi5qYXZhIFtyNi5BXVxuIiArCi0JCSJzcmMvcjYvQi5qYXZhIFtyNi5BXVxuIiArCi0JCSJzcmMvcjYvQi5qYXZhIFtyNi5BXVxuIiArCi0JCSJzcmMvcjYvQi5qYXZhIFtyNi5BXVxuIiArCi0JCSJzcmMvcjYvQi5qYXZhIFtyNi5BXVxuIiArCi0JCSJzcmMvcjYvQi5qYXZhIFtyNi5BXSIsCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogVHlwZSByZWZlcmVuY2UgaW4gaW5pdGlhbGl6ZXIgdGVzdC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIFBSICMxRzRHTzRPKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0VHlwZVJlZmVyZW5jZUluSW5pdGlhbGl6ZXIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICIiLCAiVGVzdC5qYXZhIikuZ2V0VHlwZSgiVGVzdCIpOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCXR5cGUsIAotCQlSRUZFUkVOQ0VTLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJInNyYy9UZXN0LmphdmEgVGVzdC5zdGF0aWMge30gW1Rlc3RdXG4iICsKLQkJInNyYy9UZXN0LmphdmEgVGVzdC5zdGF0aWMge30gW1Rlc3RdXG4iICsKLQkJInNyYy9UZXN0LmphdmEgVGVzdC57fSBbVGVzdF0iLAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIFR5cGUgcmVmZXJlbmNlIGluc2lkZSBhIHF1YWxpZmllZCBuYW1lIHJlZmVyZW5jZSB0ZXN0LgotICogKFJlZ3Jlc3Npb24gdGVzdCBmb3IgUFIgIzFHNFRTQzApCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RUeXBlUmVmZXJlbmNlSW5RdWFsaWZpZWROYW1lUmVmZXJlbmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAicCIsICJBLmphdmEiKS5nZXRUeXBlKCJBIik7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJdHlwZSwgCi0JCVJFRkVSRU5DRVMsIAotCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic3JjL1Rlc3QuamF2YSBUZXN0Lm1haW4oU3RyaW5nW10pIC0+IHZvaWQgW3AuQV1cbiIgKwotCQkic3JjL1Rlc3QuamF2YSBUZXN0Lm1haW4oU3RyaW5nW10pIC0+IHZvaWQgW3AuQV1cbiIgKwotCQkic3JjL3AvQS5qYXZhIHAuQS5mb28oKSAtPiB2b2lkIFtBXSIsCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogVHlwZSByZWZlcmVuY2UgaW5zaWRlIGEgcXVhbGlmaWVkIG5hbWUgcmVmZXJlbmNlIHRlc3QuCi0gKiAoUmVncmVzc2lvbiB0ZXN0IGZvciBQUiAjMUdMQlA2NSkKLSAqLwotcHVibGljIHZvaWQgdGVzdFR5cGVSZWZlcmVuY2VJblF1YWxpZmllZE5hbWVSZWZlcmVuY2UyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAicDQiLCAiQS5qYXZhIikuZ2V0VHlwZSgiQSIpOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCXR5cGUsIAotCQlSRUZFUkVOQ0VTLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJInNyYy9wNC9BLmphdmEgcDQuQS5BIFtBXVxuIiArCi0JCSJzcmMvcDQvQS5qYXZhIHA0LlgueCgpIC0+IHZvaWQgW3A0LkFdXG4iICsKLQkJInNyYy9wNC9BLmphdmEgcDQuWCBbcDQuQV0iLAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIFR5cGUgcmVmZXJlbmNlIGluc2lkZSBhIHF1YWxpZmllZCBuYW1lIHJlZmVyZW5jZSB0ZXN0LgotICogKFJlZ3Jlc3Npb24gdGVzdCBmb3IgUFIgMUdMOVVNSDogSVRQSkNPUkU6V0lOMjAwMCAtIHNlYXJjaDogbWlzc2luZyB0eXBlIG9jY3VycmVuY2VzKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0VHlwZVJlZmVyZW5jZUluUXVhbGlmaWVkTmFtZVJlZmVyZW5jZTMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICIiLCAiVy5qYXZhIikuZ2V0VHlwZSgiVyIpOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCXR5cGUsIAotCQlSRUZFUkVOQ0VTLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJInNyYy9XLmphdmEgVy5tKCkgLT4gaW50IFtXXSIsCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogVHlwZSByZWZlcmVuY2UgaW5zaWRlIGEgcXVhbGlmaWVkIG5hbWUgcmVmZXJlbmNlIHRlc3QuCi0gKiAoUmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMTY3NTEgUmVuYW1pbmcgYSBjbGFzcyBkb2Vzbid0IHVwZGF0ZSBhbGwgcmVmZXJlbmNlcyAgKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0VHlwZVJlZmVyZW5jZUluUXVhbGlmaWVkTmFtZVJlZmVyZW5jZTQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAiYjciLCAiWC5qYXZhIikuZ2V0VHlwZSgiU3ViQ2xhc3MiKTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQl0eXBlLCAKLQkJUkVGRVJFTkNFUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvYjcvWC5qYXZhIGI3LlRlc3QubWFpbihTdHJpbmdbXSkgLT4gdm9pZCBbU3ViQ2xhc3NdIiwKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBUeXBlIHJlZmVyZW5jZSBpbiBhIHRocm93IGNsYXVzZSB0ZXN0LgotICogKFJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDY3Nzkgc2VhcmNoRGVjbGFyYXRpb25zT2ZSZWZlcmVuY2VkVHlwZWQgLSBtaXNzaW5nIGV4Y2VwdGlvbiB0eXBlcykKLSAqLwotcHVibGljIHZvaWQgdGVzdFR5cGVSZWZlcmVuY2VJblRocm93cygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgImE3IiwgIlguamF2YSIpLmdldFR5cGUoIk15RXhjZXB0aW9uIik7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCXJlc3VsdENvbGxlY3Rvci5zaG93QWNjdXJhY3kgPSB0cnVlOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJdHlwZSwgCi0JCVJFRkVSRU5DRVMsIAotCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic3JjL2E3L1guamF2YSBhNy5YLmZvbygpIC0+IHZvaWQgW015RXhjZXB0aW9uXSBFWEFDVF9NQVRDSCIsCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogVHlwZSByZWZlcmVuY2UgdGVzdCAobm90IGNhc2Ugc2Vuc2l0aXZlKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0VHlwZVJlZmVyZW5jZU5vdENhc2VTZW5zaXRpdmUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IGdldFBhY2thZ2VGcmFnbWVudCgiSmF2YVNlYXJjaCIsICJzcmMiLCAiZDQiKTsKLQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0gU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShuZXcgSUphdmFFbGVtZW50W10ge3BrZ30pOwotCUlTZWFyY2hQYXR0ZXJuIHBhdHRlcm4gPSBTZWFyY2hFbmdpbmUuY3JlYXRlU2VhcmNoUGF0dGVybigiWSIsIFRZUEUsIFJFRkVSRU5DRVMsIGZhbHNlKTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQlwYXR0ZXJuLCAKLQkJc2NvcGUsCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic3JjL2Q0L1guamF2YSBkNC5YLmZvbygpIC0+IE9iamVjdCBbWV0iLAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIFR5cGUgcmVmZXJlbmNlIGluIGEgZm9sZGVyIHRoYXQgaXMgbm90IGluIHRoZSBjbGFzc3BhdGguCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBQUiAjMUc1TjhLUykKLSAqLwotcHVibGljIHZvaWQgdGVzdFR5cGVSZWZlcmVuY2VOb3RJbkNsYXNzcGF0aCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgInAiLCAiWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCXR5cGUsIAotCQlSRUZFUkVOQ0VTLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJInNyYy9wL0EuamF2YSBwLkEueCBbWF1cbiIgKwotCQkic3JjL3AvQS5qYXZhIHAuQShYKSBbWF1cbiIgKwotCQkic3JjL3AvQS5qYXZhIHAuQS5mb28oaW50LCBTdHJpbmcsIFgpIC0+IHZvaWQgW1hdXG4iICsKLQkJInNyYy9wL1guamF2YSBwLlgoKSBbWF1cbiIgKwotCQkic3JjL3AvWC5qYXZhIHAuWC5mb28oaW50LCBTdHJpbmcsIFgpIC0+IHZvaWQgW1hdXG4iICsKLQkJInNyYy9wL1kuamF2YSBwLlkgW1hdXG4iICsKLQkJInNyYy9wL1ouamF2YSBwLlouZm9vKGludCwgU3RyaW5nLCBYKSAtPiB2b2lkIFtYXSIsCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogVHlwZSByZWZlcmVuY2Ugd2l0aCByZWNvdmVyeSB0ZXN0LgotICogKFJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDI5MzY2IFNlYXJjaCByZXBvcnRpbmcgaW52YWxpZCBpbmFjY3VyYXRlIG1hdGNoICkKLSAqLwotcHVibGljIHZvaWQgdGVzdFR5cGVSZWZlcmVuY2VXaXRoUmVjb3ZlcnkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJlMSIsICJBMjkzNjYuamF2YSIpLmdldFR5cGUoIkEyOTM2NiIpOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQlyZXN1bHRDb2xsZWN0b3Iuc2hvd0FjY3VyYWN5ID0gdHJ1ZTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCXR5cGUsIAotCQlSRUZFUkVOQ0VTLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJInNyYy9lMS9BMjkzNjYuamF2YSBlMS5BMjkzNjYuZm9vKCkgLT4gdm9pZCBbQTI5MzY2XSBFWEFDVF9NQVRDSCIsCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLX0KLS8qKgotICogTmVnYXRpdmUgdHlwZSByZWZlcmVuY2UgdGVzdC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIDFHNTJGN1A6IElUUEpDT1JFOldJTk5UIC0gU2VhcmNoIC0gZmluZHMgYm9ndXMgcmVmZXJlbmNlcyB0byBjbGFzcykKLSAqLwotcHVibGljIHZvaWQgdGVzdE5lZ2F0aXZlVHlwZVJlZmVyZW5jZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgInA3IiwgIkEuamF2YSIpLmdldFR5cGUoIkEiKTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQl0eXBlLCAKLQkJUkVGRVJFTkNFUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSIiLAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0KLS8qKgotICogVmFyaW91cyBwYWNrYWdlIGRlY2xhcmF0aW9ucyB0ZXN0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0VmFyaW91c1BhY2thZ2VEZWNsYXJhdGlvbnMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQkicDMqIiwKLQkJUEFDS0FHRSwgCi0JCURFQ0xBUkFUSU9OUywgCi0JCWdldEphdmFTZWFyY2hTY29wZSgpLCAKLQkJcmVzdWx0Q29sbGVjdG9yKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJzcmMvcDMgcDNcbiIgKwotCQkic3JjL3AzL3AyL3AgcDMucDIucCIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIFZhcmlvdXMgcGFja2FnZSByZWZlcmVuY2UgdGVzdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdFZhcmlvdXNQYWNrYWdlUmVmZXJlbmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVBhY2thZ2VGcmFnbWVudCBwa2cgPSBnZXRQYWNrYWdlRnJhZ21lbnQoIkphdmFTZWFyY2giLCAic3JjIiwgInAzLnAyLnAiKTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaCgKLQkJZ2V0V29ya3NwYWNlKCksIAotCQlwa2csIAotCQlSRUZFUkVOQ0VTLCAKLQkJZ2V0SmF2YVNlYXJjaFNjb3BlKCksIAotCQlyZXN1bHRDb2xsZWN0b3IpOwotCWFzc2VydEVxdWFscygKLQkJInNyYy9QYWNrYWdlUmVmZXJlbmNlL0EuamF2YSBbcDMucDIucF1cbiIgKwotCQkic3JjL1BhY2thZ2VSZWZlcmVuY2UvQi5qYXZhIFtwMy5wMi5wXVxuIiArCi0JCSJzcmMvUGFja2FnZVJlZmVyZW5jZS9DLmphdmEgUGFja2FnZVJlZmVyZW5jZS5DIFtwMy5wMi5wXVxuIiArCi0JCSJzcmMvUGFja2FnZVJlZmVyZW5jZS9ELmphdmEgUGFja2FnZVJlZmVyZW5jZS5ELnggW3AzLnAyLnBdXG4iICsKLQkJInNyYy9QYWNrYWdlUmVmZXJlbmNlL0UuamF2YSBQYWNrYWdlUmVmZXJlbmNlLkUueCBbcDMucDIucF1cbiIgKwotCQkic3JjL1BhY2thZ2VSZWZlcmVuY2UvRi5qYXZhIFBhY2thZ2VSZWZlcmVuY2UuRi5mb28oKSAtPiBwMy5wMi5wLlggW3AzLnAyLnBdXG4iICsKLQkJInNyYy9QYWNrYWdlUmVmZXJlbmNlL0cuamF2YSBQYWNrYWdlUmVmZXJlbmNlLkcuZm9vKHAzLnAyLnAuWCkgLT4gdm9pZCBbcDMucDIucF1cbiIgKwotCQkic3JjL1BhY2thZ2VSZWZlcmVuY2UvSC5qYXZhIFBhY2thZ2VSZWZlcmVuY2UuSC5mb28oKSAtPiB2b2lkIFtwMy5wMi5wXVxuIiArCi0JCSJzcmMvUGFja2FnZVJlZmVyZW5jZS9JLmphdmEgUGFja2FnZVJlZmVyZW5jZS5JLmZvbygpIC0+IHZvaWQgW3AzLnAyLnBdXG4iICsKLQkJInNyYy9QYWNrYWdlUmVmZXJlbmNlL0ouamF2YSBQYWNrYWdlUmVmZXJlbmNlLkouZm9vKCkgLT4gdm9pZCBbcDMucDIucF0iLCAKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBUeXBlIHJlZmVyZW5jZSBpbnNpZGUgYW4gYXJndW1lbnQsIGEgcmV0dXJuIHR5cGUgb3IgYSBmaWVsZCB0eXBlLgotICogKFJlZ3Jlc3Npb24gdGVzdCBmb3IgUFIgIzFHQTdRQTEpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RWYXJpb3VzVHlwZVJlZmVyZW5jZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJOb1JlZmVyZW5jZSIsICJBLmphdmEiKS5nZXRUeXBlKCJBIik7Ci0JSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJdHlwZSwgCi0JCVJFRkVSRU5DRVMsIAotCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiIiwgLy8gbm8gcmVmZXJlbmNlIHNob3VsZCBiZSBmb3VuZAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIFdyaXRlIGFjY2VzcyByZWZlcmVuY2UgaW4gYSBxdWFsaWZpZWQgbmFtZSByZWZlcmVuY2UgdGVzdC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyA3MzQ0IFNlYXJjaCAtIHdyaXRlIGFjY2VzIGdpdmUgd3JvbmcgcmVzdWx0KQotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVhZFdyaXRlQWNjZXNzSW5RdWFsaWZpZWROYW1lUmVmZXJlbmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiSmF2YVNlYXJjaCIsICJzcmMiLCAiYTgiLCAiQS5qYXZhIikuZ2V0VHlwZSgiQSIpOwotCUlGaWVsZCBmaWVsZCA9IHR5cGUuZ2V0RmllbGQoImEiKTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JCi0JcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoKAotCQlnZXRXb3Jrc3BhY2UoKSwgCi0JCWZpZWxkLCAKLQkJV1JJVEVfQUNDRVNTRVMsIAotCQlnZXRKYXZhU2VhcmNoU2NvcGUoKSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiIiwgCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLQkJCi19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvTWVtZW50b1Rlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvTWVtZW50b1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMWMxNTUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL01lbWVudG9UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy51dGlsLlV0aWw7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBNZW1lbnRvVGVzdHMgZXh0ZW5kcyBNb2RpZnlpbmdSZXNvdXJjZVRlc3RzIHsKLXB1YmxpYyBNZW1lbnRvVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlyZXR1cm4gbmV3IFN1aXRlKE1lbWVudG9UZXN0cy5jbGFzcyk7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBhc3NlcnRNZW1lbnRvKFN0cmluZyBleHBlY3RlZCwgSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKLQlTdHJpbmcgYWN0dWFsID0gZWxlbWVudC5nZXRIYW5kbGVJZGVudGlmaWVyKCk7Ci0JaWYgKCFleHBlY3RlZC5lcXVhbHMoYWN0dWFsKSl7Ci0JIAlTeXN0ZW0ub3V0LnByaW50bG4oVXRpbC5kaXNwbGF5U3RyaW5nKGFjdHVhbCwgMikpOwotCX0KLQlhc3NlcnRFcXVhbHMoCi0JCSJVbmV4cGVjdGVkIG1lbWVudG8gZm9yICIgKyBlbGVtZW50LAotCQlleHBlY3RlZCwKLQkJYWN0dWFsKTsKLQlJSmF2YUVsZW1lbnQgcmVzdG9yZWQgPSBKYXZhQ29yZS5jcmVhdGUoYWN0dWFsKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJVbmV4cGVjdGVkIHJlc3RvcmVkIGVsZW1lbnQiLAotCQllbGVtZW50LAotCQlyZXN0b3JlZCk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRVcFN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0Jc3VwZXIuc2V0VXBTdWl0ZSgpOwotCQotCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoCi0JCQkiUCIsIAotCQkJbmV3IFN0cmluZ1tdIHsic3JjIn0sIAotCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQlnZXRFeHRlcm5hbEpDTFBhdGhTdHJpbmcoKSwgCi0JCQkJIi9QL2xpYiIsCi0JCQkJIi9QL2xpYi9teUxpYi5qYXIiLAotCQkJCSIvT3RoZXJQcm9qL2xpYiIsIAotCQkJCSIvT3RoZXJQcm9qL2xpYi9teUxpYi5qYXIiLAotCQkJfSwKLQkJCSJiaW4iKTsKLX0KLXB1YmxpYyB2b2lkIHRlYXJEb3duU3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQlzdXBlci50ZWFyRG93blN1aXRlKCk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoYXQgYSBiaW5hcnkgZmllbGQgY2FuIGJlIHBlcnNpc3RlZCBhbmQgcmVzdG9yZWQgdXNpbmcgaXRzIG1lbWVudG8uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RCaW5hcnlGaWVsZE1lbWVudG8oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJRmllbGQgZmllbGQgPSBnZXRDbGFzc0ZpbGUoIi9QL2xpYi9wL1guY2xhc3MiKS5nZXRUeXBlKCkuZ2V0RmllbGQoImZpZWxkIik7Ci0JYXNzZXJ0TWVtZW50bygKLQkJIj1QL2xpYjxwKFguY2xhc3NbWF5maWVsZCIsCi0JCWZpZWxkKTsKLX0KLS8qKgotICogVGVzdHMgdGhhdCBhbiBpbm5lciB0eXBlLCBpbm5lciBmaWVsZCBhbmQgaW5uZXIgbWV0aG9kIGNhbiBiZSBwZXJzaXN0ZWQgYW5kIHJlc3RvcmVkCi0gKiB1c2luZyBtZW1lbnRvcy4KLSAqLwotcHVibGljIHZvaWQgdGVzdEJpbmFyeUlubmVyVHlwZU1lbWVudG8oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q2xhc3NGaWxlKCIvUC9saWIvcC9YJElubmVyLmNsYXNzIikuZ2V0VHlwZSgpOwotCi0JYXNzZXJ0TWVtZW50bygKLQkJIj1QL2xpYjxwKFgkSW5uZXIuY2xhc3NbSW5uZXIiLAotCQl0eXBlKTsKLQotCUlGaWVsZCBpbm5lckZpZWxkID0gdHlwZS5nZXRGaWVsZCgiZmllbGQiKTsKLQlhc3NlcnRNZW1lbnRvKAotCQkiPVAvbGliPHAoWCRJbm5lci5jbGFzc1tJbm5lcl5maWVsZCIsCi0JCWlubmVyRmllbGQpOwotCQotCUlNZXRob2QgaW5uZXJNZXRob2QgPSB0eXBlLmdldE1ldGhvZCgiZm9vIiwgbmV3IFN0cmluZ1tdIHsiSSIsICJMamF2YS5sYW5nLlN0cmluZzsifSk7Ci0JYXNzZXJ0TWVtZW50bygKLQkJIj1QL2xpYjxwKFgkSW5uZXIuY2xhc3NbSW5uZXJ+Zm9vfkl+TGphdmEubGFuZy5TdHJpbmc7IiwKLQkJaW5uZXJNZXRob2QpOwotfQotLyoqCi0gKiBUZXN0cyB0aGF0IGEgYmluYXJ5IG1ldGhvZCBjYW4gYmUgcGVyc2lzdGVkIGFuZCByZXN0b3JlZCB1c2luZyBpdHMgbWVtZW50by4KLSAqLwotcHVibGljIHZvaWQgdGVzdEJpbmFyeU1ldGhvZE1lbWVudG8oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q2xhc3NGaWxlKCIvUC9saWIvcC9YLmNsYXNzIikuZ2V0VHlwZSgpOwotCi0JSU1ldGhvZCBtZXRob2QgPSB0eXBlLmdldE1ldGhvZCgiZm9vIiwgbmV3IFN0cmluZ1tdIHsiSSIsICJMamF2YS5sYW5nLlN0cmluZzsifSk7Ci0JYXNzZXJ0TWVtZW50bygKLQkJIj1QL2xpYjxwKFguY2xhc3NbWH5mb29+SX5MamF2YS5sYW5nLlN0cmluZzsiLAotCQltZXRob2QpOwotCQkKLQltZXRob2QgPSB0eXBlLmdldE1ldGhvZCgiYmFyIiwgbmV3IFN0cmluZ1tdIHt9KTsKLQlhc3NlcnRNZW1lbnRvKAotCQkiPVAvbGliPHAoWC5jbGFzc1tYfmJhciIsCi0JCW1ldGhvZCk7Ci0JCQotCW1ldGhvZCA9IHR5cGUuZ2V0TWV0aG9kKCJmcmVkIiwgbmV3IFN0cmluZ1tdIHsiW1oifSk7Ci0JYXNzZXJ0TWVtZW50bygKLQkJIj1QL2xpYjxwKFguY2xhc3NbWH5mcmVkfltaIiwKLQkJbWV0aG9kKTsKLX0KLS8qKgotICogVGVzdHMgdGhhdCBhIGJpbmFyeSB0eXBlIGNhbiBiZSBwZXJzaXN0ZWQgYW5kIHJlc3RvcmVkIHVzaW5nIGl0cyBtZW1lbnRvLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0QmluYXJ5VHlwZU1lbWVudG8oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q2xhc3NGaWxlKCIvUC9saWIvcC9YLmNsYXNzIikuZ2V0VHlwZSgpOwotCWFzc2VydE1lbWVudG8oCi0JCSI9UC9saWI8cChYLmNsYXNzW1giLAotCQl0eXBlKTsKLX0KLS8qKgotICogVGVzdHMgdGhhdCBhIGNsYXNzIGZpbGUgY2FuIGJlIHBlcnNpc3RlZCBhbmQgcmVzdG9yZWQgdXNpbmcgaXRzIG1lbWVudG8uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDbGFzc0ZpbGVNZW1lbnRvKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNsYXNzRmlsZSBjZiA9ICBnZXRDbGFzc0ZpbGUoIi9QL2xpYi9wL1guY2xhc3MiKTsKLQlhc3NlcnRNZW1lbnRvKAotCQkiPVAvbGliPHAoWC5jbGFzcyIsCi0JCWNmKTsKLQotCWNmID0gZ2V0Q2xhc3NGaWxlKCIvUC9saWIvWS5jbGFzcyIpOwotCWFzc2VydE1lbWVudG8oCi0JCSI9UC9saWI8KFkuY2xhc3MiLAotCQljZik7Ci0JCi19Ci0vKioKLSAqIFRlc3RzIHRoYXQgYSBjb21waWxhdGlvbiB1bml0IGNhbiBiZSBwZXJzaXN0ZWQgYW5kIHJlc3RvcmVkIHVzaW5nIGl0cyBtZW1lbnRvLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29tcGlsYXRpb25Vbml0TWVtZW50bygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9wL1guamF2YSIpOwotCWFzc2VydE1lbWVudG8oCi0JCSI9UC9zcmM8cHtYLmphdmEiLAotCQljdSk7Ci0JCQotCWN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWS5qYXZhIik7Ci0JYXNzZXJ0TWVtZW50bygKLQkJIj1QL3NyYzx7WS5qYXZhIiwKLQkJY3UpOwotfQotLyoqCi0gKiBUZXN0cyB0aGF0IGFuIGltcG9ydCBkZWNsYXJhdGlvbiBjYW4gYmUgcGVyc2lzdGVkIGFuZCByZXN0b3JlZCB1c2luZyBpdHMgbWVtZW50by4KLSAqLwotcHVibGljIHZvaWQgdGVzdEltcG9ydENvbnRhaW5lck1lbWVudG8oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJSW1wb3J0Q29udGFpbmVyIGltcG9ydENvbnRhaW5lciA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL3AvWC5qYXZhIikuZ2V0SW1wb3J0Q29udGFpbmVyKCk7Ci0JYXNzZXJ0TWVtZW50bygKLQkJIj1QL3NyYzxwe1guamF2YSMiLAotCQlpbXBvcnRDb250YWluZXIpOwotfQotLyoqCi0gKiBUZXN0cyB0aGF0IGFuIGltcG9ydCBkZWNsYXJhdGlvbiBjYW4gYmUgcGVyc2lzdGVkIGFuZCByZXN0b3JlZCB1c2luZyBpdHMgbWVtZW50by4KLSAqLwotcHVibGljIHZvaWQgdGVzdEltcG9ydERlY2xhcmF0aW9uTWVtZW50bygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlJbXBvcnREZWNsYXJhdGlvbiBpbXBvcnREZWNsID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvcC9YLmphdmEiKS5nZXRJbXBvcnQoImphdmEuaW8uU2VyaWFsaXphYmxlIik7Ci0JYXNzZXJ0TWVtZW50bygKLQkJIj1QL3NyYzxwe1guamF2YSNqYXZhLmlvLlNlcmlhbGl6YWJsZSIsCi0JCWltcG9ydERlY2wpOwotCQotCWltcG9ydERlY2wgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9wL1guamF2YSIpLmdldEltcG9ydCgiamF2YS51dGlsLioiKTsKLQlhc3NlcnRNZW1lbnRvKAotCQkiPVAvc3JjPHB7WC5qYXZhI2phdmEudXRpbC4qIiwKLQkJaW1wb3J0RGVjbCk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoYXQgYW4gaW5pdGlhbGl6ZXIgY2FuIGJlIHBlcnNpc3RlZCBhbmQgcmVzdG9yZWQgdXNpbmcgaXRzIG1lbWVudG8uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXplck1lbWVudG8oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvcC9YLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JCi0JSUluaXRpYWxpemVyIGluaXRpYWxpemVyID0gdHlwZS5nZXRJbml0aWFsaXplcigxKTsKLQlhc3NlcnRNZW1lbnRvKAotCQkiPVAvc3JjPHB7WC5qYXZhW1h8MSIsCi0JCWluaXRpYWxpemVyKTsKLQkKLQlpbml0aWFsaXplciA9IHR5cGUuZ2V0SW5pdGlhbGl6ZXIoMik7Ci0JYXNzZXJ0TWVtZW50bygKLQkJIj1QL3NyYzxwe1guamF2YVtYfDIiLAotCQlpbml0aWFsaXplcik7Ci19Ci0vKioKLSAqIFRlc3RzIHRoYXQgYSBiaW5hcnkgZmllbGQgaW4gYW4gaW50ZXJuYWwgamFyIGNhbiBiZSBwZXJzaXN0ZWQgYW5kIHJlc3RvcmVkIHVzaW5nIGl0cyBtZW1lbnRvLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0SW50ZXJuYWxKYXJCaW5hcnlGaWVsZE1lbWVudG8oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsJCi0JSVR5cGUgdHlwZSA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoIi9QL2xpYi9teUxpYi5qYXIiKS5nZXRQYWNrYWdlRnJhZ21lbnQoInAiKS5nZXRDbGFzc0ZpbGUoIlguY2xhc3MiKS5nZXRUeXBlKCk7Ci0JSUZpZWxkIGZpZWxkID0gdHlwZS5nZXRGaWVsZCgiZmllbGQiKTsKLQlhc3NlcnRNZW1lbnRvKAotCQkiPVAvbGliL215TGliLmphcjxwKFguY2xhc3NbWF5maWVsZCIsCi0JCWZpZWxkKTsKLX0KLS8qKgotICogVGVzdHMgdGhhdCBhIGlubmVyIGJpbmFyeSB0eXBlIGFuZCBmaWVsZCBpbiBhbiBpbnRlcm5hbCBqYXIgY2FuIGJlIHBlcnNpc3RlZCBhbmQgcmVzdG9yZWQgdXNpbmcgaXRzIG1lbWVudG8uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RJbnRlcm5hbEphckJpbmFyeUlubmVyVHlwZU1lbWVudG8oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsJCi0JSVR5cGUgdHlwZSA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoIi9QL2xpYi9teUxpYi5qYXIiKS5nZXRQYWNrYWdlRnJhZ21lbnQoInAiKS5nZXRDbGFzc0ZpbGUoIlgkSW5uZXIuY2xhc3MiKS5nZXRUeXBlKCk7Ci0JYXNzZXJ0TWVtZW50bygKLQkJIj1QL2xpYi9teUxpYi5qYXI8cChYJElubmVyLmNsYXNzW0lubmVyIiwKLQkJdHlwZSk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoYXQgYSBiaW5hcnkgbWV0aG9kIGluIGFuIGludGVybmFsIGphciBjYW4gYmUgcGVyc2lzdGVkIGFuZCByZXN0b3JlZCB1c2luZyBpdHMgbWVtZW50by4KLSAqLwotcHVibGljIHZvaWQgdGVzdEludGVybmFsSmFyQmluYXJ5TWV0aG9kTWVtZW50bygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewkKLQlJVHlwZSB0eXBlID0gZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgiL1AvbGliL215TGliLmphciIpLmdldFBhY2thZ2VGcmFnbWVudCgicCIpLmdldENsYXNzRmlsZSgiWC5jbGFzcyIpLmdldFR5cGUoKTsKLQlJTWV0aG9kIG1ldGhvZCA9IHR5cGUuZ2V0TWV0aG9kKCJmb28iLCBuZXcgU3RyaW5nW10geyJbTGphdmEubGFuZy5TdHJpbmc7In0pOwotCWFzc2VydE1lbWVudG8oCi0JCSI9UC9saWIvbXlMaWIuamFyPHAoWC5jbGFzc1tYfmZvb35bTGphdmEubGFuZy5TdHJpbmc7IiwKLQkJbWV0aG9kKTsKLX0KLS8qKgotICogVGVzdHMgdGhhdCBhIGJpbmFyeSB0eXBlIGluIGFuIGludGVybmFsIGphciBjYW4gYmUgcGVyc2lzdGVkIGFuZCByZXN0b3JlZCB1c2luZyBpdHMgbWVtZW50by4KLSAqLwotcHVibGljIHZvaWQgdGVzdEludGVybmFsSmFyQmluYXJ5VHlwZU1lbWVudG8oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsJCi0JSVR5cGUgdHlwZSA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoIi9QL2xpYi9teUxpYi5qYXIiKS5nZXRQYWNrYWdlRnJhZ21lbnQoInAiKS5nZXRDbGFzc0ZpbGUoIlguY2xhc3MiKS5nZXRUeXBlKCk7Ci0JYXNzZXJ0TWVtZW50bygKLQkJIj1QL2xpYi9teUxpYi5qYXI8cChYLmNsYXNzW1giLAotCQl0eXBlKTsJCi19Ci0vKioKLSAqIFRlc3RzIHRoYXQgYSBiaW5hcnkgZmllbGQgaW4gYW4gZXh0ZXJuYWwgamFyIGNhbiBiZSBwZXJzaXN0ZWQgYW5kIHJlc3RvcmVkIHVzaW5nIGl0cyBtZW1lbnRvLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0RXh0ZXJuYWxKYXJCaW5hcnlGaWVsZE1lbWVudG8oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsJCi0JSVR5cGUgdHlwZSA9IGdldENsYXNzRmlsZSgiUCIsIGdldEV4dGVybmFsSkNMUGF0aFN0cmluZygpLCAicCIsICJYLmNsYXNzIikuZ2V0VHlwZSgpOwotCUlGaWVsZCBmaWVsZCA9IHR5cGUuZ2V0RmllbGQoImZpZWxkIik7Ci0JYXNzZXJ0TWVtZW50bygKLQkJIj1QLyIgKyBnZXRFeHRlcm5hbEpDTFBhdGgoKSArICI8cChYLmNsYXNzW1heZmllbGQiLAotCQlmaWVsZCk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoYXQgYSBpbm5lciBiaW5hcnkgdHlwZSBhbmQgZmllbGQgaW4gYW4gZXh0ZXJuYWwgamFyIGNhbiBiZSBwZXJzaXN0ZWQgYW5kIHJlc3RvcmVkIHVzaW5nIGl0cyBtZW1lbnRvLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0RXh0ZXJuYWxKYXJCaW5hcnlJbm5lclR5cGVNZW1lbnRvKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENsYXNzRmlsZSgiUCIsIGdldEV4dGVybmFsSkNMUGF0aFN0cmluZygpLCAicCIsICJYJElubmVyLmNsYXNzIikuZ2V0VHlwZSgpOwotCWFzc2VydE1lbWVudG8oCi0JCSI9UC8iICsgZ2V0RXh0ZXJuYWxKQ0xQYXRoKCkgKyAiPHAoWCRJbm5lci5jbGFzc1tJbm5lciIsCi0JCXR5cGUpOwotfQotLyoqCi0gKiBUZXN0cyB0aGF0IGEgYmluYXJ5IG1ldGhvZCBpbiBhbiBleHRlcm5hbCBqYXIgY2FuIGJlIHBlcnNpc3RlZCBhbmQgcmVzdG9yZWQgdXNpbmcgaXRzIG1lbWVudG8uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RFeHRlcm5hbEphckJpbmFyeU1ldGhvZE1lbWVudG8oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsJCi0JSVR5cGUgdHlwZSA9IGdldENsYXNzRmlsZSgiUCIsIGdldEV4dGVybmFsSkNMUGF0aFN0cmluZygpLCAicCIsICJYLmNsYXNzIikuZ2V0VHlwZSgpOwotCUlNZXRob2QgbWV0aG9kID0gdHlwZS5nZXRNZXRob2QoImZvbyIsIG5ldyBTdHJpbmdbXSB7IltMamF2YS5sYW5nLlN0cmluZzsifSk7Ci0JYXNzZXJ0TWVtZW50bygKLQkJIj1QLyIgKyBnZXRFeHRlcm5hbEpDTFBhdGgoKSArICI8cChYLmNsYXNzW1h+Zm9vfltMamF2YS5sYW5nLlN0cmluZzsiLAotCQltZXRob2QpOwotfQotLyoqCi0gKiBUZXN0cyB0aGF0IGEgYmluYXJ5IHR5cGUgaW4gYW4gZXh0ZXJuYWwgamFyIGNhbiBiZSBwZXJzaXN0ZWQgYW5kIHJlc3RvcmVkIHVzaW5nIGl0cyBtZW1lbnRvLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0RXh0ZXJuYWxKYXJCaW5hcnlUeXBlTWVtZW50bygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewkKLQlJVHlwZSB0eXBlID0gZ2V0Q2xhc3NGaWxlKCJQIiwgZ2V0RXh0ZXJuYWxKQ0xQYXRoU3RyaW5nKCksICJwIiwgIlguY2xhc3MiKS5nZXRUeXBlKCk7Ci0JYXNzZXJ0TWVtZW50bygKLQkJIj1QLyIgKyBnZXRFeHRlcm5hbEpDTFBhdGgoKSArICI8cChYLmNsYXNzW1giLAotCQl0eXBlKTsJCi19Ci0vKioKLSAqIFRlc3RzIHRoYXQgYSBwYWNrYWdlIGRlY2xhcmF0aW9uIGNhbiBiZSBwZXJzaXN0ZWQgYW5kIHJlc3RvcmVkIHVzaW5nIGl0cyBtZW1lbnRvLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UGFja2FnZURlY2xhcmF0aW9uTWVtZW50bygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlQYWNrYWdlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9wL1guamF2YSIpLmdldFBhY2thZ2VEZWNsYXJhdGlvbigicCIpOwotCWFzc2VydE1lbWVudG8oCi0JCSI9UC9zcmM8cHtYLmphdmElcCIsCi0JCWRlY2xhcmF0aW9uKTsKLQkJCi0JZGVjbGFyYXRpb24gPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9wMS9wMi9YLmphdmEiKS5nZXRQYWNrYWdlRGVjbGFyYXRpb24oInAxLnAyIik7Ci0JYXNzZXJ0TWVtZW50bygKLQkJIj1QL3NyYzxwMS5wMntYLmphdmElcDEucDIiLAotCQlkZWNsYXJhdGlvbik7Ci19Ci0vKioKLSAqIFRlc3RzIHRoYXQgYSBwYWNrYWdlIGZyYWdtZW50IGNhbiBiZSBwZXJzaXN0ZWQgYW5kIHJlc3RvcmVkIHVzaW5nIGl0cyBtZW1lbnRvLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UGFja2FnZUZyYWdtZW50TWVtZW50bygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlQYWNrYWdlRnJhZ21lbnQgcGtnID0gZ2V0UGFja2FnZSgiL1Avc3JjL3AiKTsKLQlhc3NlcnRNZW1lbnRvKAotCQkiPVAvc3JjPHAiLAotCQlwa2cpOwotCQkKLQlwa2cgPSBnZXRQYWNrYWdlKCIvUC9zcmMvcDEvcDIiKTsKLQlhc3NlcnRNZW1lbnRvKAotCQkiPVAvc3JjPHAxLnAyIiwKLQkJcGtnKTsKLQotCXBrZyA9IGdldFBhY2thZ2UoIi9QL3NyYyIpOwotCWFzc2VydE1lbWVudG8oCi0JCSI9UC9zcmM8IiwKLQkJcGtnKTsKLX0KLS8qKgotICogVGVzdHMgdGhhdCBhIHNvdXJjZSBmb2xkZXIgcGFja2FnZSBmcmFnbWVudCByb290IGNhbiBiZSBwZXJzaXN0ZWQgYW5kIHJlc3RvcmVkIHVzaW5nIGl0cyBtZW1lbnRvLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UGFja2FnZUZyYWdtZW50Um9vdE1lbWVudG8xKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QoIlAiKTsKLQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3QuZ2V0UHJvamVjdCgpLmdldEZvbGRlcigic3JjIikpOwotCWFzc2VydE1lbWVudG8oCi0JCSI9UC9zcmMiLAotCQlyb290KTsKLX0KLS8qKgotICogVGVzdHMgdGhhdCBhIHNvdXJjZSBmb2xkZXIgcGFja2FnZSBmcmFnbWVudCByb290IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb2plY3QKLSAqIGNhbiBiZSBwZXJzaXN0ZWQgYW5kIHJlc3RvcmVkIHVzaW5nIGl0cyBtZW1lbnRvLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UGFja2FnZUZyYWdtZW50Um9vdE1lbWVudG8yKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDEiLCBuZXcgU3RyaW5nW10geyIifSwgIiIpOwotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQkJYXNzZXJ0TWVtZW50bygKLQkJCSI9UDEvIiwKLQkJCXJvb3QpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDEiKTsKLQl9CQkKLX0JCi0vKioKLSAqIFRlc3RzIHRoYXQgYSBsaWJyYXJ5IGZvbGRlciBwYWNrYWdlIGZyYWdtZW50IHJvb3QgaW4gdGhlIHNhbWUgcHJvamVjdAotICogY2FuIGJlIHBlcnNpc3RlZCBhbmQgcmVzdG9yZWQgdXNpbmcgaXRzIG1lbWVudG8uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlRnJhZ21lbnRSb290TWVtZW50bzMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUphdmFQcm9qZWN0IHByb2plY3QgPSBnZXRKYXZhUHJvamVjdCgiUCIpOwotCUlGb2xkZXIgbGliRm9sZGVyID0gcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJsaWIiKTsKLQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KGxpYkZvbGRlcik7Ci0JYXNzZXJ0TWVtZW50bygKLQkJIj1QL2xpYiIsCi0JCXJvb3QpOwotfQotLyoqCi0gKiBUZXN0cyB0aGF0IGEgbGlicmFyeSBmb2xkZXIgcGFja2FnZSBmcmFnbWVudCByb290IGluIGFub3RoZXIgcHJvamVjdAotICogY2FuIGJlIHBlcnNpc3RlZCBhbmQgcmVzdG9yZWQgdXNpbmcgaXRzIG1lbWVudG8uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlRnJhZ21lbnRSb290TWVtZW50bzQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUphdmFQcm9qZWN0IHByb2plY3QgPSBnZXRKYXZhUHJvamVjdCgiUCIpOwotCUlGb2xkZXIgb3RoZXJMaWJGb2xkZXIgPSBnZXRGb2xkZXIoIi9PdGhlclByb2ovbGliIik7Ci0JSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChvdGhlckxpYkZvbGRlcik7Ci0JYXNzZXJ0TWVtZW50bygKLQkJIj1QLy9PdGhlclByb2ovbGliIiwKLQkJcm9vdCk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoYXQgYSBqYXIgcGFja2FnZSBmcmFnbWVudCByb290IGluIHRoZSBzYW1lIHByb2plY3QKLSAqIGNhbiBiZSBwZXJzaXN0ZWQgYW5kIHJlc3RvcmVkIHVzaW5nIGl0cyBtZW1lbnRvLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UGFja2FnZUZyYWdtZW50Um9vdE1lbWVudG81KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QoIlAiKTsKLQlJRmlsZSBqYXIgPSBnZXRGaWxlKCIvUC9saWIvbXlMaWIuamFyIik7Ci0JSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChqYXIpOwotCWFzc2VydE1lbWVudG8oCi0JCSI9UC9saWIvbXlMaWIuamFyIiwKLQkJcm9vdCk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoYXQgYSBqYXIgcGFja2FnZSBmcmFnbWVudCByb290IGluIGFub3RoZXIgcHJvamVjdAotICogY2FuIGJlIHBlcnNpc3RlZCBhbmQgcmVzdG9yZWQgdXNpbmcgaXRzIG1lbWVudG8uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlRnJhZ21lbnRSb290TWVtZW50bzYoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUphdmFQcm9qZWN0IHByb2plY3QgPSBnZXRKYXZhUHJvamVjdCgiUCIpOwotCUlGaWxlIGphciA9IGdldEZpbGUoIi9PdGhlclByb2ovbGliL215TGliLmphciIpOwotCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoamFyKTsKLQlhc3NlcnRNZW1lbnRvKAotCQkiPVAvL090aGVyUHJvai9saWIvbXlMaWIuamFyIiwKLQkJcm9vdCk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoYXQgYW4gZXh0ZXJuYWwgamFyIHBhY2thZ2UgZnJhZ21lbnQgcm9vdAotICogY2FuIGJlIHBlcnNpc3RlZCBhbmQgcmVzdG9yZWQgdXNpbmcgaXRzIG1lbWVudG8uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlRnJhZ21lbnRSb290TWVtZW50bzcoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoIlAiLCBnZXRFeHRlcm5hbEpDTFBhdGhTdHJpbmcoKSk7Ci0JYXNzZXJ0TWVtZW50bygKLQkJIj1QLyIgKyBnZXRFeHRlcm5hbEpDTFBhdGgoKSwKLQkJcm9vdCk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoYXQgYSBwcm9qZWN0IGNhbiBiZSBwZXJzaXN0ZWQgYW5kIHJlc3RvcmVkIHVzaW5nIGl0cyBtZW1lbnRvLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UHJvamVjdE1lbWVudG8oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJSmF2YVByb2plY3QgcHJvamVjdCA9IGdldEphdmFQcm9qZWN0KCJQIik7Ci0JYXNzZXJ0TWVtZW50bygKLQkJIj1QIiwKLQkJcHJvamVjdCk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoYXQgYSBib2d1cyBtZW1lbnRvIGNhbm5vdCBiZSByZXN0b3JlZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJlc3RvcmVCb2d1c01lbWVudG8oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJSmF2YUVsZW1lbnQgcmVzdG9yZWQgPSBKYXZhQ29yZS5jcmVhdGUoImJvZ3VzIik7Ci0JYXNzZXJ0RXF1YWxzKCJzaG91bGQgbm90IGJlIGFibGUgdG8gcmVzdG9yZSBhIGJvZ3VzIG1lbWVudG8iLCBudWxsLCByZXN0b3JlZCk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoYXQgYSBzb3VyY2UgZmllbGQgY2FuIGJlIHBlcnNpc3RlZCBhbmQgcmVzdG9yZWQgdXNpbmcgaXRzIG1lbWVudG8uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTb3VyY2VGaWVsZE1lbWVudG8oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJRmllbGQgZmllbGQgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9wL1guamF2YSIpLmdldFR5cGUoIlgiKS5nZXRGaWVsZCgiZmllbGQiKTsKLQlhc3NlcnRNZW1lbnRvKAotCQkiPVAvc3JjPHB7WC5qYXZhW1heZmllbGQiLAotCQlmaWVsZCk7Ci19Ci0vKioKLSAqIFRlc3RzIHRoYXQgYSBzb3VyY2UgaW5uZXIgdHlwZSwgaW5uZXIgZmllbGQgYW5kIGlubmVyIG1ldGhvZCBjYW4gYmUgcGVyc2lzdGVkIGFuZCByZXN0b3JlZAotICogdXNpbmcgbWVtZW50b3MuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTb3VyY2VJbm5lclR5cGVNZW1lbnRvKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSVR5cGUgaW5uZXJUeXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvcC9YLmphdmEiKS5nZXRUeXBlKCJYIikuZ2V0VHlwZSgiSW5uZXIiKTsKLQlhc3NlcnRNZW1lbnRvKAotCQkiPVAvc3JjPHB7WC5qYXZhW1hbSW5uZXIiLAotCQlpbm5lclR5cGUpOwotfQotLyoqCi0gKiBUZXN0cyB0aGF0IGEgc291cmNlIG1ldGhvZCBjYW4gYmUgcGVyc2lzdGVkIGFuZCByZXN0b3JlZCB1c2luZyBpdHMgbWVtZW50by4KLSAqLwotcHVibGljIHZvaWQgdGVzdFNvdXJjZU1ldGhvZE1lbWVudG8oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvcC9YLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0KLQlJTWV0aG9kIG1ldGhvZCA9IHR5cGUuZ2V0TWV0aG9kKCJmb28iLCBuZXcgU3RyaW5nW10geyJJIiwgIkxqYXZhLmxhbmcuU3RyaW5nOyJ9KTsKLQlhc3NlcnRNZW1lbnRvKAotCQkiPVAvc3JjPHB7WC5qYXZhW1h+Zm9vfkl+TGphdmEubGFuZy5TdHJpbmc7IiwKLQkJbWV0aG9kKTsKLQkJCi0JbWV0aG9kID0gdHlwZS5nZXRNZXRob2QoImJhciIsIG5ldyBTdHJpbmdbXSB7fSk7Ci0JYXNzZXJ0TWVtZW50bygKLQkJIj1QL3NyYzxwe1guamF2YVtYfmJhciIsCi0JCW1ldGhvZCk7Ci0JCQotCW1ldGhvZCA9IHR5cGUuZ2V0TWV0aG9kKCJmcmVkIiwgbmV3IFN0cmluZ1tdIHsiW1oifSk7Ci0JYXNzZXJ0TWVtZW50bygKLQkJIj1QL3NyYzxwe1guamF2YVtYfmZyZWR+W1oiLAotCQltZXRob2QpOwotfQotLyoqCi0gKiBUZXN0cyB0aGF0IGEgc291cmNlIHR5cGUgY2FuIGJlIHBlcnNpc3RlZCBhbmQgcmVzdG9yZWQgdXNpbmcgaXRzIG1lbWVudG8uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTb3VyY2VUeXBlTWVtZW50bygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9wL1guamF2YSIpLmdldFR5cGUoIlgiKTsKLQlhc3NlcnRNZW1lbnRvKAotCQkiPVAvc3JjPHB7WC5qYXZhW1giLAotCQl0eXBlKTsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9Nb2RpZnlpbmdSZXNvdXJjZVRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvTW9kaWZ5aW5nUmVzb3VyY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTE5OTMxLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9Nb2RpZnlpbmdSZXNvdXJjZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhcmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy51dGlsLlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmJhdGNoLk1haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YUVsZW1lbnQ7Ci0KLS8qCi0gKiBUZXN0cyB0aGF0IG1vZGlmeSByZXNvdXJjZXMgaW4gdGhlIHdvcmtzcGFjZS4KLSAqLwotcHVibGljIGNsYXNzIE1vZGlmeWluZ1Jlc291cmNlVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEphdmFNb2RlbFRlc3RzIHsKLQkKLXB1YmxpYyBNb2RpZnlpbmdSZXNvdXJjZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBhc3NlcnREZWx0YXMoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBleHBlY3RlZCkgewotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JSUphdmFFbGVtZW50RGVsdGFbXSBkZWx0YXMgPSB0aGlzLmRlbHRhTGlzdGVuZXIuZGVsdGFzOwotCWZvciAoaW50IGk9MCwgbGVuZ3RoPSBkZWx0YXMubGVuZ3RoOyBpPGxlbmd0aDsgaSsrKSB7Ci0JCUlKYXZhRWxlbWVudERlbHRhW10gcHJvamVjdHMgPSBkZWx0YXNbaV0uZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQl0aGlzLnNvcnREZWx0YXMocHJvamVjdHMpOwotCQlmb3IgKGludCBqPTAsIHByb2plY3RzTGVuZ3RoPXByb2plY3RzLmxlbmd0aDsgajxwcm9qZWN0c0xlbmd0aDsgaisrKSB7Ci0JCQlidWZmZXIuYXBwZW5kKHByb2plY3RzW2pdKTsKLQkJCWlmIChqICE9IHByb2plY3RzTGVuZ3RoLTEpIHsKLQkJCQlidWZmZXIuYXBwZW5kKCJcbiIpOwotCQkJfQotCQl9Ci0JCUlSZXNvdXJjZURlbHRhW10gbm9uSmF2YVByb2plY3RzID0gZGVsdGFzW2ldLmdldFJlc291cmNlRGVsdGFzKCk7Ci0JCWlmIChub25KYXZhUHJvamVjdHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaj0wLCBub25KYXZhUHJvamVjdHNMZW5ndGg9bm9uSmF2YVByb2plY3RzLmxlbmd0aDsgajxub25KYXZhUHJvamVjdHNMZW5ndGg7IGorKykgewotCQkJCWlmIChqID09IDAgJiYgYnVmZmVyLmxlbmd0aCgpICE9IDApIHsKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsKLQkJCQl9Ci0JCQkJYnVmZmVyLmFwcGVuZChub25KYXZhUHJvamVjdHNbal0pOwotCQkJCWlmIChqICE9IG5vbkphdmFQcm9qZWN0c0xlbmd0aC0xKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlxuIik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChpICE9IGxlbmd0aC0xKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCJcblxuIik7Ci0JCX0KLQl9Ci0JU3RyaW5nIGFjdHVhbCA9IGJ1ZmZlci50b1N0cmluZygpOwotCWlmICghZXhwZWN0ZWQuZXF1YWxzKGFjdHVhbCkpewotCSAJU3lzdGVtLm91dC5wcmludGxuKFV0aWwuZGlzcGxheVN0cmluZyhhY3R1YWwsIDMpKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKAotCQltZXNzYWdlLAotCQlleHBlY3RlZCwKLQkJYWN0dWFsKTsKLX0KLS8qKgotICogRS5nLiA8Y29kZT4KLSAqIG9yZy5lY2xpcHNlLmpkdC50ZXN0cy5jb3JlLk1vZGlmeWluZ1Jlc291cmNlVGVzdHMuZ2VuZXJhdGVDbGFzc0ZpbGUoCi0gKiAgICJBIiwKLSAqICAgInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotICogICAifSIpCi0gKi8KLXB1YmxpYyBzdGF0aWMgdm9pZCBnZW5lcmF0ZUNsYXNzRmlsZShTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgamF2YVNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlTdHJpbmcgY3UgPSAiZDovdGVtcC8iICsgY2xhc3NOYW1lICsgIi5qYXZhIjsKLQlGaWxlT3V0cHV0U3RyZWFtIG91dHB1dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGN1KTsKLQl0cnkgewotCQlvdXRwdXQud3JpdGUoamF2YVNvdXJjZS5nZXRCeXRlcygpKTsKLQl9IGZpbmFsbHkgewotCQlvdXRwdXQuY2xvc2UoKTsKLQl9Ci0JTWFpbi5jb21waWxlKGN1ICsgIiAtZCBkOi90ZW1wIC1jbGFzc3BhdGggIiArIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikgKyAiL2xpYi9ydC5qYXIiKTsKLQlGaWxlSW5wdXRTdHJlYW0gaW5wdXQgPSBuZXcgRmlsZUlucHV0U3RyZWFtKCJkOi90ZW1wLyIgKyBjbGFzc05hbWUgKyAiLmNsYXNzIik7Ci0JdHJ5IHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJ7Iik7Ci0JCWJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs4MF07Ci0JCWludCByZWFkID0gMDsKLQkJd2hpbGUgKHJlYWQgIT0gLTEpIHsKLQkJCXJlYWQgPSBpbnB1dC5yZWFkKGJ1ZmZlcik7Ci0JCQlpZiAocmVhZCAhPSAtMSkgU3lzdGVtLm91dC5wcmludCgiXHQiKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVhZDsgaSsrKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludChidWZmZXJbaV0pOwotCQkJCVN5c3RlbS5vdXQucHJpbnQoIiwgIik7CQotCQkJfQotCQkJaWYgKHJlYWQgIT0gLTEpIFN5c3RlbS5vdXQucHJpbnRsbigpOwotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnQoIn0iKTsKLQl9IGZpbmFsbHkgewotCQlpbnB1dC5jbG9zZSgpOwotCX0KLX0KLQotcHJvdGVjdGVkIElGaWxlIGNyZWF0ZUZpbGUoU3RyaW5nIHBhdGgsIElucHV0U3RyZWFtIGNvbnRlbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlJRmlsZSBmaWxlID0gdGhpcy5nZXRGaWxlKHBhdGgpOwotCWZpbGUuY3JlYXRlKGNvbnRlbnQsIHRydWUsIG51bGwpOwotCXJldHVybiBmaWxlOwotfQotCi1wcm90ZWN0ZWQgSUZpbGUgY3JlYXRlRmlsZShTdHJpbmcgcGF0aCwgYnl0ZVtdIGNvbnRlbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlJRmlsZSBmaWxlID0gdGhpcy5nZXRGaWxlKHBhdGgpOwotCUlucHV0U3RyZWFtIGlucHV0ID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbnRlbnQpOwotCWZpbGUuY3JlYXRlKGlucHV0LCB0cnVlLCBudWxsKTsKLQlyZXR1cm4gZmlsZTsKLX0KLQotcHJvdGVjdGVkIElGaWxlIGNyZWF0ZUZpbGUoU3RyaW5nIHBhdGgsIFN0cmluZyBjb250ZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUZpbGUgZmlsZSA9IHRoaXMuZ2V0RmlsZShwYXRoKTsKLQlJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb250ZW50LmdldEJ5dGVzKCkpOwotCWZpbGUuY3JlYXRlKGlucHV0LCB0cnVlLCBudWxsKTsKLQlyZXR1cm4gZmlsZTsKLX0KLXByb3RlY3RlZCBJRm9sZGVyIGNyZWF0ZUZvbGRlcihTdHJpbmcgcGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCWZpbmFsIElGb2xkZXIgZm9sZGVyID0gdGhpcy5nZXRGb2xkZXIocGF0aCk7Ci0JZ2V0V29ya3NwYWNlKCkucnVuKG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCUlDb250YWluZXIgcGFyZW50ID0gZm9sZGVyLmdldFBhcmVudCgpOwotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElGb2xkZXIgJiYgIXBhcmVudC5leGlzdHMoKSkgewotCQkJCWNyZWF0ZUZvbGRlcihwYXJlbnQuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJCX0gCi0JCQlmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOwotCQl9Ci0JfSwKLQludWxsKTsKLQotCXJldHVybiBmb2xkZXI7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBkZWxldGVGaWxlKFN0cmluZyBmaWxlUGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCWRlbGV0ZVJlc291cmNlKHRoaXMuZ2V0RmlsZShmaWxlUGF0aCkpOwotfQotcHJvdGVjdGVkIHZvaWQgZGVsZXRlRm9sZGVyKFN0cmluZyBmb2xkZXJQYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JZGVsZXRlUmVzb3VyY2UodGhpcy5nZXRGb2xkZXIoZm9sZGVyUGF0aCkpOwotfQotcHJvdGVjdGVkIElGaWxlIGVkaXRGaWxlKFN0cmluZyBwYXRoLCBTdHJpbmcgY29udGVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUlGaWxlIGZpbGUgPSB0aGlzLmdldEZpbGUocGF0aCk7Ci0JSW5wdXRTdHJlYW0gaW5wdXQgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY29udGVudC5nZXRCeXRlcygpKTsKLQlmaWxlLnNldENvbnRlbnRzKGlucHV0LCBJRmlsZS5GT1JDRSwgbnVsbCk7Ci0JcmV0dXJuIGZpbGU7Ci19Ci0vKiAKLSAqIEV4cGFuZHMgKGkuZS4gb3BlbikgdGhlIGdpdmVuIGVsZW1lbnQgYW5kIHJldHVybnMgYSB0b1N0cmluZygpIHJlcHJlc2VudGF0aW9uCi0gKiBvZiB0aGUgdHJlZS4KLSAqLwotcHJvdGVjdGVkIFN0cmluZyBleHBhbmRBbGwoSUphdmFFbGVtZW50IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCXRoaXMuZXhwYW5kQWxsKGVsZW1lbnQsIDAsIGJ1ZmZlcik7Ci0JcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotfQotcHJpdmF0ZSB2b2lkIGV4cGFuZEFsbChJSmF2YUVsZW1lbnQgZWxlbWVudCwgaW50IHRhYiwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUlKYXZhRWxlbWVudFtdIGNoaWxkcmVuID0gbnVsbDsKLQkvLyBmb3JjZSBvcGVuaW5nIG9mIGVsZW1lbnQgYnkgZ2V0dGluZyBpdHMgY2hpbGRyZW4KLQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQYXJlbnQpIHsKLQkJSVBhcmVudCBwYXJlbnQgPSAoSVBhcmVudCllbGVtZW50OwotCQljaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZHJlbigpOwotCX0KLQkoKEphdmFFbGVtZW50KWVsZW1lbnQpLnRvU3RyaW5nSW5mbyh0YWIsIGJ1ZmZlcik7Ci0JaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCJcbiIpOwotCQkJdGhpcy5leHBhbmRBbGwoY2hpbGRyZW5baV0sIHRhYisxLCBidWZmZXIpOwotCQl9Ci0JfQotfQotcHJvdGVjdGVkIHZvaWQgcmVuYW1lUHJvamVjdChTdHJpbmcgcHJvamVjdCwgU3RyaW5nIG5ld05hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLmdldFByb2plY3QocHJvamVjdCkubW92ZShuZXcgUGF0aChuZXdOYW1lKSwgdHJ1ZSwgbnVsbCk7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBzb3J0RGVsdGFzKElKYXZhRWxlbWVudERlbHRhW10gZGVsdGFzKSB7Ci0Jb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuVXRpbC5Db21wYXJlciBjb21wYXJlciA9IG5ldyBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5VdGlsLkNvbXBhcmVyKCkgewotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCQlJSmF2YUVsZW1lbnREZWx0YSBkZWx0YUEgPSAoSUphdmFFbGVtZW50RGVsdGEpYTsKLQkJCUlKYXZhRWxlbWVudERlbHRhIGRlbHRhQiA9IChJSmF2YUVsZW1lbnREZWx0YSliOwotCQkJcmV0dXJuIGRlbHRhQS5nZXRFbGVtZW50KCkuZ2V0RWxlbWVudE5hbWUoKS5jb21wYXJlVG8oZGVsdGFCLmdldEVsZW1lbnQoKS5nZXRFbGVtZW50TmFtZSgpKTsKLQkJfQotCX07Ci0Jb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuVXRpbC5zb3J0KGRlbHRhcywgY29tcGFyZXIpOwotfQotcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KFN0cmluZyBwYXRoKSB7Ci0JcmV0dXJuIChJQ29tcGlsYXRpb25Vbml0KUphdmFDb3JlLmNyZWF0ZSh0aGlzLmdldEZpbGUocGF0aCkpOwotfQotcHJvdGVjdGVkIElDbGFzc0ZpbGUgZ2V0Q2xhc3NGaWxlKFN0cmluZyBwYXRoKSB7Ci0JcmV0dXJuIChJQ2xhc3NGaWxlKUphdmFDb3JlLmNyZWF0ZSh0aGlzLmdldEZpbGUocGF0aCkpOwotfQotcHJvdGVjdGVkIElGaWxlIGdldEZpbGUoU3RyaW5nIHBhdGgpIHsKLQlyZXR1cm4gZ2V0V29ya3NwYWNlUm9vdCgpLmdldEZpbGUobmV3IFBhdGgocGF0aCkpOwotfQotcHJvdGVjdGVkIElGb2xkZXIgZ2V0Rm9sZGVyKFN0cmluZyBwYXRoKSB7Ci0JcmV0dXJuIGdldFdvcmtzcGFjZVJvb3QoKS5nZXRGb2xkZXIobmV3IFBhdGgocGF0aCkpOwotfQotcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnQgZ2V0UGFja2FnZShTdHJpbmcgcGF0aCkgewotCWlmIChwYXRoLmluZGV4T2YoJy8nLCAxKSAhPSAtMSkgeyAvLyBpZiBwYXRoIGFzIG1vcmUgdGhhbiBvbmUgc2VnbWVudAotCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IEphdmFDb3JlLmNyZWF0ZSh0aGlzLmdldEZvbGRlcihwYXRoKSk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpIHsKLQkJCXJldHVybiAoKElQYWNrYWdlRnJhZ21lbnRSb290KWVsZW1lbnQpLmdldFBhY2thZ2VGcmFnbWVudCgiIik7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKElQYWNrYWdlRnJhZ21lbnQpZWxlbWVudDsKLQkJfQotCX0gZWxzZSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSB0aGlzLmdldFByb2plY3QocGF0aCk7Ci0JCXJldHVybiBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCkuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChwcm9qZWN0KS5nZXRQYWNrYWdlRnJhZ21lbnQoIiIpOwotCX0KLX0KLXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRQYWNrYWdlRnJhZ21lbnRSb290KFN0cmluZyBwYXRoKSB7Ci0JaWYgKHBhdGguaW5kZXhPZignLycsIDEpICE9IC0xKSB7IC8vIGlmIHBhdGggYXMgbW9yZSB0aGFuIG9uZSBzZWdtZW50Ci0JCWlmIChwYXRoLmVuZHNXaXRoKCIuamFyIikpIHsKLQkJCXJldHVybiAgKElQYWNrYWdlRnJhZ21lbnRSb290KUphdmFDb3JlLmNyZWF0ZSh0aGlzLmdldEZpbGUocGF0aCkpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIChJUGFja2FnZUZyYWdtZW50Um9vdClKYXZhQ29yZS5jcmVhdGUodGhpcy5nZXRGb2xkZXIocGF0aCkpOwotCQl9Ci0JfSBlbHNlIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IHRoaXMuZ2V0UHJvamVjdChwYXRoKTsKLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KS5nZXRQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3QpOwotCX0KLX0KLXByb3RlY3RlZCBTdHJpbmcgZ2V0U29ydGVkQnlQcm9qZWN0RGVsdGFzKCkgewotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JZm9yIChpbnQgaT0wLCBsZW5ndGggPSB0aGlzLmRlbHRhTGlzdGVuZXIuZGVsdGFzLmxlbmd0aDsgaTxsZW5ndGg7IGkrKykgewotCQlJSmF2YUVsZW1lbnREZWx0YVtdIHByb2plY3RzID0gdGhpcy5kZWx0YUxpc3RlbmVyLmRlbHRhc1tpXS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCWludCBwcm9qZWN0c0xlbmd0aCA9IHByb2plY3RzLmxlbmd0aDsKLQkJCi0JCS8vIHNvcnQgYnkgcHJvamVjdAotCQlJSmF2YUVsZW1lbnREZWx0YVtdIHNvcnRlZCA9IG5ldyBJSmF2YUVsZW1lbnREZWx0YVtwcm9qZWN0c0xlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkocHJvamVjdHMsIDAsIHNvcnRlZCwgMCwgcHJvamVjdHNMZW5ndGgpOwotCQlvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5VdGlsLnNvcnQoCi0JCQlzb3J0ZWQsIAotCQkJbmV3ICBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5VdGlsLkNvbXBhcmVyKCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkJCQkJcmV0dXJuIGEudG9TdHJpbmcoKS5jb21wYXJlVG8oYi50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCi0JCWZvciAoaW50IGo9MDsgajxwcm9qZWN0c0xlbmd0aDsgaisrKSB7Ci0JCQlidWZmZXIuYXBwZW5kKHNvcnRlZFtqXSk7Ci0JCQlpZiAoaiAhPSBwcm9qZWN0c0xlbmd0aC0xKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsKLQkJCX0KLQkJfQotCQlpZiAoaSAhPSBsZW5ndGgtMSkgewotCQkJYnVmZmVyLmFwcGVuZCgiXG5cbiIpOwotCQl9Ci0JfQotCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLX0KLXByb3RlY3RlZCB2b2lkIG1vdmVGaWxlKFN0cmluZyBzb3VyY2VQYXRoLCBTdHJpbmcgZGVzdFBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLmdldEZpbGUoc291cmNlUGF0aCkubW92ZSh0aGlzLmdldEZpbGUoZGVzdFBhdGgpLmdldEZ1bGxQYXRoKCksIGZhbHNlLCBudWxsKTsKLX0KLXByb3RlY3RlZCB2b2lkIG1vdmVGb2xkZXIoU3RyaW5nIHNvdXJjZVBhdGgsIFN0cmluZyBkZXN0UGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuZ2V0Rm9sZGVyKHNvdXJjZVBhdGgpLm1vdmUodGhpcy5nZXRGb2xkZXIoZGVzdFBhdGgpLmdldEZ1bGxQYXRoKCksIGZhbHNlLCBudWxsKTsKLX0KLXByb3RlY3RlZCB2b2lkIHN3YXBGaWxlcyhTdHJpbmcgZmlyc3RQYXRoLCBTdHJpbmcgc2Vjb25kUGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCWZpbmFsIElGaWxlIGZpcnN0ID0gdGhpcy5nZXRGaWxlKGZpcnN0UGF0aCk7Ci0JZmluYWwgSUZpbGUgc2Vjb25kID0gdGhpcy5nZXRGaWxlKHNlY29uZFBhdGgpOwotCUlXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoCSkgewotCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlJUGF0aCB0ZW1wUGF0aCA9IGZpcnN0LmdldFBhcmVudCgpLmdldEZ1bGxQYXRoKCkuYXBwZW5kKCJzd2FwcGluZ0ZpbGUudGVtcCIpOwotCQkJZmlyc3QubW92ZSh0ZW1wUGF0aCwgZmFsc2UsIG1vbml0b3IpOwotCQkJc2Vjb25kLm1vdmUoZmlyc3QuZ2V0RnVsbFBhdGgoKSwgZmFsc2UsIG1vbml0b3IpOwotCQkJZ2V0V29ya3NwYWNlUm9vdCgpLmdldEZpbGUodGVtcFBhdGgpLm1vdmUoc2Vjb25kLmdldEZ1bGxQYXRoKCksIGZhbHNlLCBtb25pdG9yKTsKLQkJfQotCX07Ci0JZ2V0V29ya3NwYWNlKCkucnVuKHJ1bm5hYmxlLCBudWxsKTsKLX0KLS8qCi0gKiBSZXR1cm5zIGEgbmV3IGNsYXNzcGF0aCBmcm9tIHRoZSBnaXZlbiBzb3VyY2UgZm9sZGVycyBhbmQgdGhlaXIgcmVzcGVjdGl2ZSBleGNsdXNpb24gcGF0dGVybnMuCi0gKiBUaGUgZ2l2ZW4gYXJyYXkgYXMgdGhlIGZvbGxvd2luZyBmb3JtOgotICogWzxzb3VyY2UgZm9sZGVyPiwgIjxwYXR0ZXJuPlt8PHBhdHRlcm5dKiJdKgotICogRS5nLiBuZXcgU3RyaW5nW10gewotICogICAic3JjMSIsICJwL0EuamF2YSIsCi0gKiAgICJzcmMyIiwgIioudHh0fGNvbS50ZXN0cy8qKiIKLSAqIH0KLSAqLwotcHJvdGVjdGVkIElDbGFzc3BhdGhFbnRyeVtdIGNyZWF0ZUNsYXNzcGF0aChTdHJpbmdbXSBzb3VyY2VGb2xkZXJzQW5kRXhjbHVzaW9uUGF0dGVybnMpIHsKLQlpbnQgbGVuZ3RoID0gc291cmNlRm9sZGVyc0FuZEV4Y2x1c2lvblBhdHRlcm5zLmxlbmd0aDsKLQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBuZXcgSUNsYXNzcGF0aEVudHJ5W2xlbmd0aC8yXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSs9MikgewotCQlTdHJpbmcgc3JjID0gc291cmNlRm9sZGVyc0FuZEV4Y2x1c2lvblBhdHRlcm5zW2ldOwotCQlTdHJpbmcgcGF0dGVybnMgPSBzb3VyY2VGb2xkZXJzQW5kRXhjbHVzaW9uUGF0dGVybnNbaSsxXTsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGF0dGVybnMsICJ8Iik7Ci0JCWludCBwYXR0ZXJuc0NvdW50ID0gIHRva2VuaXplci5jb3VudFRva2VucygpOwotCQlJUGF0aFtdIHBhdHRlcm5QYXRocyA9IG5ldyBJUGF0aFtwYXR0ZXJuc0NvdW50XTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBwYXR0ZXJuc0NvdW50OyBqKyspIHsKLQkJCXBhdHRlcm5QYXRoc1tqXSA9IG5ldyBQYXRoKHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCX0KLQkJY2xhc3NwYXRoW2kvMl0gPSBKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShuZXcgUGF0aChzcmMpLCBwYXR0ZXJuUGF0aHMpOyAKLQl9Ci0JcmV0dXJuIGNsYXNzcGF0aDsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL05hbWVMb29rdXBUZXN0czIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9OYW1lTG9va3VwVGVzdHMyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2M2Y3NzUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL05hbWVMb29rdXBUZXN0czIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFQcm9qZWN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotCi0vKioKLSAqIFRoZXNlIHRlc3QgZW5zdXJlIHRoYXQgbW9kaWZpY2F0aW9ucyBpbiBKYXZhIHByb2plY3RzIGFyZSBjb3JyZWN0bHkgcmVwb3J0ZWQgYXMKLSAqIElKYXZhRWxsZW1lbnREZWx0YXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBOYW1lTG9va3VwVGVzdHMyIGV4dGVuZHMgTW9kaWZ5aW5nUmVzb3VyY2VUZXN0cyB7Ci0JCi1wdWJsaWMgTmFtZUxvb2t1cFRlc3RzMihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCXJldHVybiBuZXcgU3VpdGUoTmFtZUxvb2t1cFRlc3RzMi5jbGFzcyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RBZGRQYWNrYWdlRnJhZ21lbnRSb290QW5kUGFja2FnZUZyYW1lbnQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IHAxID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDEiLCBuZXcgU3RyaW5nW10geyJzcmMxIn0sICJiaW4iKTsKLQkJSUphdmFQcm9qZWN0IHAyID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDIiLCBuZXcgU3RyaW5nW10ge30sICIiKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gCi0JCQluZXcgSUNsYXNzcGF0aEVudHJ5W10gewotCQkJCUphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShuZXcgUGF0aCgiL1AxIikpCi0JCQl9OwotCQlwMi5zZXRSYXdDbGFzc3BhdGgoY2xhc3NwYXRoLCBudWxsKTsKLQkJCi0JCUlQYWNrYWdlRnJhZ21lbnRbXSByZXMgPSAoKEphdmFQcm9qZWN0KXAyKS5nZXROYW1lTG9va3VwKCkuZmluZFBhY2thZ2VGcmFnbWVudHMoInAxIiwgZmFsc2UpOwotCQlhc3NlcnRUcnVlKCJTaG91bGQgZ2V0IG5vIHBhY2thZ2UgZnJhZ21lbnQiLCByZXMgPT0gbnVsbCk7Ci0JCQotCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGgyID0gCi0JCQluZXcgSUNsYXNzcGF0aEVudHJ5W10gewotCQkJCUphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KG5ldyBQYXRoKCIvUDEvc3JjMSIpKSwKLQkJCQlKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShuZXcgUGF0aCgiL1AxL3NyYzIiKSkKLQkJCX07Ci0JCXAxLnNldFJhd0NsYXNzcGF0aChjbGFzc3BhdGgyLCBudWxsKTsKLQkJdGhpcy5jcmVhdGVGb2xkZXIoIi9QMS9zcmMyL3AxIik7Ci0JCQotCQlyZXMgPSAoKEphdmFQcm9qZWN0KXAyKS5nZXROYW1lTG9va3VwKCkuZmluZFBhY2thZ2VGcmFnbWVudHMoInAxIiwgZmFsc2UpOwotCQlhc3NlcnRUcnVlKAotCQkJIlNob3VsZCBnZXQgJ3AxJyBwYWNrYWdlIGZyYWdtZW50IiwKLQkJCXJlcyAhPSBudWxsICYmCi0JCQlyZXMubGVuZ3RoID09IDEgJiYKLQkJCXJlc1swXS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscygicDEiKSk7Ci0KLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAxIik7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0QWRkUGFja2FnZUZyYWdtZW50KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAxIiwgbmV3IFN0cmluZ1tdIHsic3JjMSJ9LCAiYmluIik7Ci0JCUlKYXZhUHJvamVjdCBwMiA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHt9LCAiIik7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCA9IAotCQkJbmV3IElDbGFzc3BhdGhFbnRyeVtdIHsKLQkJCQlKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkobmV3IFBhdGgoIi9QMSIpKQotCQkJfTsKLQkJcDIuc2V0UmF3Q2xhc3NwYXRoKGNsYXNzcGF0aCwgbnVsbCk7Ci0JCQotCQlJUGFja2FnZUZyYWdtZW50W10gcmVzID0gKChKYXZhUHJvamVjdClwMikuZ2V0TmFtZUxvb2t1cCgpLmZpbmRQYWNrYWdlRnJhZ21lbnRzKCJwMSIsIGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIGdldCBubyBwYWNrYWdlIGZyYWdtZW50IiwgcmVzID09IG51bGwpOwotCQkKLQkJdGhpcy5jcmVhdGVGb2xkZXIoIi9QMS9zcmMxL3AxIik7Ci0JCQotCQlyZXMgPSAoKEphdmFQcm9qZWN0KXAyKS5nZXROYW1lTG9va3VwKCkuZmluZFBhY2thZ2VGcmFnbWVudHMoInAxIiwgZmFsc2UpOwotCQlhc3NlcnRUcnVlKAotCQkJIlNob3VsZCBnZXQgJ3AxJyBwYWNrYWdlIGZyYWdtZW50IiwKLQkJCXJlcyAhPSBudWxsICYmCi0JCQlyZXMubGVuZ3RoID09IDEgJiYKLQkJCXJlc1swXS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscygicDEiKSk7Ci0KLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAxIik7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0vKgotICogUmVzb2x2ZSwgYWRkIHBrZywgcmVzb2x2ZSBhZ2FpbjogbmV3IHBrZyBzaG91bGQgYmUgYWNjZXNzaWJsZQotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDM3OTYyIFVuZXhwZWN0ZWQgdHJhbnNpZW50IHByb2JsZW0gZHVyaW5nIHJlY29uY2lsZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0QWRkUGFja2FnZUZyYWdtZW50MigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlKYXZhUHJvamVjdCBwcm9qZWN0ID0gKEphdmFQcm9qZWN0KXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjL3AxIik7Ci0JCQotCQlJUGFja2FnZUZyYWdtZW50W10gcGtncyA9IHByb2plY3QuZ2V0TmFtZUxvb2t1cCgpLmZpbmRQYWNrYWdlRnJhZ21lbnRzKCJwMSIsIGZhbHNlKTsKLQkJYXNzZXJ0RWxlbWVudHNFcXVhbCgKLQkJCSJEaWRuJ3QgZmluZCBwMSIsCi0JCQkicDEiLAotCQkJcGtncyk7Ci0JCQotCQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjL3AyIik7Ci0JCi0JCXBrZ3MgPSBwcm9qZWN0LmdldE5hbWVMb29rdXAoKS5maW5kUGFja2FnZUZyYWdtZW50cygicDIiLCBmYWxzZSk7Ci0JCWFzc2VydEVsZW1lbnRzRXF1YWwoCi0JCQkiRGlkbid0IGZpbmQgcDIiLAotCQkJInAyIiwKLQkJCXBrZ3MpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLX0KLQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL05hbWluZ0NvbnZlbnRpb25UZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL05hbWluZ0NvbnZlbnRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGM4YjUxLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9OYW1pbmdDb252ZW50aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRmxhZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuTmFtaW5nQ29udmVudGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2hhck9wZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLQotcHVibGljIGNsYXNzIE5hbWluZ0NvbnZlbnRpb25UZXN0cyBleHRlbmRzIEFic3RyYWN0SmF2YU1vZGVsVGVzdHMgewotCi1JSmF2YVByb2plY3QgcHJvamVjdDsKLQotcHVibGljIE5hbWluZ0NvbnZlbnRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JcmV0dXJuIG5ldyBTdWl0ZShOYW1pbmdDb252ZW50aW9uVGVzdHMuY2xhc3MpOwotfQotLyoqCi0gKiBTZXR1cCBmb3IgdGhlIG5leHQgdGVzdC4KLSAqLwotcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQlzdXBlci5zZXRVcCgpOwotCQotCXByb2plY3QgPSBjcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXXsic3JjIn0sICJiaW4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLX0KLS8qKgotICogQ2xlYW51cCBhZnRlciB0aGUgcHJldmlvdXMgdGVzdC4KLSAqLwotcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsgLy8kTk9OLU5MUy0xJAotCQotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci1wcml2YXRlIFN0cmluZyB0b1N0cmluZyhjaGFyW11bXSBzdWdnZXN0aW9ucykgewotCWlmKHN1Z2dlc3Rpb25zID09IG51bGwpIHsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBzdWdnZXN0aW9ucy5sZW5ndGg7IGkrKykgewotCQlpZihpICE9IDApIHsKLQkJCWJ1ZmZlci5hcHBlbmQoJ1xuJyk7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZChzdWdnZXN0aW9uc1tpXSk7Ci0JfQotCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLX0KLXByaXZhdGUgU3RyaW5nIHRvU3RyaW5nKFN0cmluZ1tdIHN1Z2dlc3Rpb25zKSB7Ci0JaWYoc3VnZ2VzdGlvbnMgPT0gbnVsbCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHN1Z2dlc3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCWlmKGkgIT0gMCkgewotCQkJYnVmZmVyLmFwcGVuZCgnXG4nKTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKHN1Z2dlc3Rpb25zW2ldKTsKLQl9Ci0JcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotfQotcHVibGljIHZvaWQgdGVzdFN1Z2dlc3RGaWVsZE5hbWUwMDEoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JY2hhcltdW10gc3VnZ2VzdGlvbnMgPSBOYW1pbmdDb252ZW50aW9ucy5zdWdnZXN0RmllbGROYW1lcygKLQkJcHJvamVjdCwKLQkJImEuYi5jIi50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkCi0JCSJPbmVOYW1lIi50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkCi0JCTAsCi0JCTAsCi0JCUNoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSKTsKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJuYW1lXG4iICsgLy8kTk9OLU5MUy0xJAotCQkib25lTmFtZSIsIC8vJE5PTi1OTFMtMSQKLQkJdG9TdHJpbmcoc3VnZ2VzdGlvbnMpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RTdWdnZXN0RmllbGROYW1lMDAyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCWNoYXJbXVtdIHN1Z2dlc3Rpb25zID0gTmFtaW5nQ29udmVudGlvbnMuc3VnZ2VzdEZpZWxkTmFtZXMoCi0JCXByb2plY3QsCi0JCSJhLmIuYyIudG9DaGFyQXJyYXkoKSwgLy8kTk9OLU5MUy0xJAotCQkiT25lQ2xhc3MiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKLQkJMCwKLQkJMCwKLQkJQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIpOwotCQotCWFzc2VydEVxdWFscygKLQkJImNsYXNzMVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJIm9uZUNsYXNzIiwgLy8kTk9OLU5MUy0xJAotCQl0b1N0cmluZyhzdWdnZXN0aW9ucykpOwotfQotcHVibGljIHZvaWQgdGVzdFN1Z2dlc3RGaWVsZE5hbWUwMDMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSGFzaHRhYmxlIG9wdGlvbnMgPSBKYXZhQ29yZS5nZXRPcHRpb25zKCk7Ci0JT2JqZWN0IGZpZWxkUHJlZml4UHJldmlvdXNWYWx1ZSA9IG9wdGlvbnMuZ2V0KEphdmFDb3JlLkNPREVBU1NJU1RfRklFTERfUFJFRklYRVMpOwotCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPREVBU1NJU1RfRklFTERfUFJFRklYRVMsImYiKTsgLy8kTk9OLU5MUy0xJAotCUphdmFDb3JlLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0JCi0JY2hhcltdW10gc3VnZ2VzdGlvbnMgPSBOYW1pbmdDb252ZW50aW9ucy5zdWdnZXN0RmllbGROYW1lcygKLQkJcHJvamVjdCwKLQkJImEuYi5jIi50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkCi0JCSJPbmVOYW1lIi50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkCi0JCTAsCi0JCTAsCi0JCUNoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSKTsKLQkKLQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTLGZpZWxkUHJlZml4UHJldmlvdXNWYWx1ZSk7Ci0JSmF2YUNvcmUuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJmTmFtZVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJImZPbmVOYW1lXG4iICsgLy8kTk9OLU5MUy0xJAotCQkibmFtZVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJIm9uZU5hbWUiLCAvLyROT04tTkxTLTEkCi0JCXRvU3RyaW5nKHN1Z2dlc3Rpb25zKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0U3VnZ2VzdEZpZWxkTmFtZTAwNCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlIYXNodGFibGUgb3B0aW9ucyA9IEphdmFDb3JlLmdldE9wdGlvbnMoKTsKLQlPYmplY3QgZmllbGRQcmVmaXhQcmV2aW91c1ZhbHVlID0gb3B0aW9ucy5nZXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9GSUVMRF9QUkVGSVhFUyk7Ci0Jb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9GSUVMRF9QUkVGSVhFUywiXyIpOyAvLyROT04tTkxTLTEkCi0JSmF2YUNvcmUuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQkKLQljaGFyW11bXSBzdWdnZXN0aW9ucyA9IE5hbWluZ0NvbnZlbnRpb25zLnN1Z2dlc3RGaWVsZE5hbWVzKAotCQlwcm9qZWN0LAotCQkiYS5iLmMiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKLQkJIk9uZU5hbWUiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKLQkJMCwKLQkJMCwKLQkJQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIpOwotCQotCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPREVBU1NJU1RfRklFTERfUFJFRklYRVMsZmllbGRQcmVmaXhQcmV2aW91c1ZhbHVlKTsKLQlKYXZhQ29yZS5zZXRPcHRpb25zKG9wdGlvbnMpOwotCWFzc2VydEVxdWFscygKLQkJIl9uYW1lXG4iICsgLy8kTk9OLU5MUy0xJAotCQkiX29uZU5hbWVcbiIgKyAvLyROT04tTkxTLTEkCi0JCSJuYW1lXG4iICsgLy8kTk9OLU5MUy0xJAotCQkib25lTmFtZSIsIC8vJE5PTi1OTFMtMSQKLQkJdG9TdHJpbmcoc3VnZ2VzdGlvbnMpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RTdWdnZXN0RmllbGROYW1lMDA1KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUhhc2h0YWJsZSBvcHRpb25zID0gSmF2YUNvcmUuZ2V0T3B0aW9ucygpOwotCU9iamVjdCBmaWVsZFByZWZpeFByZXZpb3VzVmFsdWUgPSBvcHRpb25zLmdldChKYXZhQ29yZS5DT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTKTsKLQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTLCJmIik7IC8vJE5PTi1OTFMtMSQKLQlPYmplY3Qgc3RhdGljRmllbGRQcmVmaXhQcmV2aW91c1ZhbHVlID0gb3B0aW9ucy5nZXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9GSUVMRF9QUkVGSVhFUyk7Ci0Jb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9TVEFUSUNfRklFTERfUFJFRklYRVMsImZnIik7IC8vJE5PTi1OTFMtMSQKLQlKYXZhQ29yZS5zZXRPcHRpb25zKG9wdGlvbnMpOwotCQotCWNoYXJbXVtdIHN1Z2dlc3Rpb25zID0gTmFtaW5nQ29udmVudGlvbnMuc3VnZ2VzdEZpZWxkTmFtZXMoCi0JCXByb2plY3QsCi0JCSJhLmIuYyIudG9DaGFyQXJyYXkoKSwgLy8kTk9OLU5MUy0xJAotCQkiT25lTmFtZSIudG9DaGFyQXJyYXkoKSwgLy8kTk9OLU5MUy0xJAotCQkwLAotCQlGbGFncy5BY2NTdGF0aWMsCi0JCUNoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSKTsKLQkKLQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTLGZpZWxkUHJlZml4UHJldmlvdXNWYWx1ZSk7Ci0Jb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9TVEFUSUNfRklFTERfUFJFRklYRVMsc3RhdGljRmllbGRQcmVmaXhQcmV2aW91c1ZhbHVlKTsKLQlKYXZhQ29yZS5zZXRPcHRpb25zKG9wdGlvbnMpOwotCWFzc2VydEVxdWFscygKLQkJImZnTmFtZVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJImZnT25lTmFtZVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJIm5hbWVcbiIgKyAvLyROT04tTkxTLTEkCi0JCSJvbmVOYW1lIiwgLy8kTk9OLU5MUy0xJAotCQl0b1N0cmluZyhzdWdnZXN0aW9ucykpOwotfQotcHVibGljIHZvaWQgdGVzdFN1Z2dlc3RGaWVsZE5hbWUwMDYoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSGFzaHRhYmxlIG9wdGlvbnMgPSBKYXZhQ29yZS5nZXRPcHRpb25zKCk7Ci0JT2JqZWN0IGZpZWxkUHJlZml4UHJldmlvdXNWYWx1ZSA9IG9wdGlvbnMuZ2V0KEphdmFDb3JlLkNPREVBU1NJU1RfRklFTERfUFJFRklYRVMpOwotCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPREVBU1NJU1RfRklFTERfUFJFRklYRVMsInByZSIpOyAvLyROT04tTkxTLTEkCi0JT2JqZWN0IGZpZWxkU3VmZml4UHJldmlvdXNWYWx1ZSA9IG9wdGlvbnMuZ2V0KEphdmFDb3JlLkNPREVBU1NJU1RfRklFTERfU1VGRklYRVMpOwotCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPREVBU1NJU1RfRklFTERfU1VGRklYRVMsInN1ZiIpOyAvLyROT04tTkxTLTEkCi0JSmF2YUNvcmUuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQkKLQljaGFyW11bXSBzdWdnZXN0aW9ucyA9IE5hbWluZ0NvbnZlbnRpb25zLnN1Z2dlc3RGaWVsZE5hbWVzKAotCQlwcm9qZWN0LAotCQkiYS5iLmMiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKLQkJIk9uZU5hbWUiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKLQkJMCwKLQkJMCwKLQkJQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIpOwotCQotCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPREVBU1NJU1RfRklFTERfUFJFRklYRVMsZmllbGRQcmVmaXhQcmV2aW91c1ZhbHVlKTsKLQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT0RFQVNTSVNUX0ZJRUxEX1NVRkZJWEVTLGZpZWxkU3VmZml4UHJldmlvdXNWYWx1ZSk7Ci0JSmF2YUNvcmUuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJwcmVOYW1lc3VmXG4iICsgLy8kTk9OLU5MUy0xJAotCQkicHJlT25lTmFtZXN1ZlxuIiArIC8vJE5PTi1OTFMtMSQKLQkJInByZU5hbWVcbiIgKyAvLyROT04tTkxTLTEkCi0JCSJwcmVPbmVOYW1lXG4iICsgLy8kTk9OLU5MUy0xJAotCQkibmFtZXN1ZlxuIiArIC8vJE5PTi1OTFMtMSQKLQkJIm9uZU5hbWVzdWZcbiIgKyAvLyROT04tTkxTLTEkCi0JCSJuYW1lXG4iICsgLy8kTk9OLU5MUy0xJAotCQkib25lTmFtZSIsIC8vJE5PTi1OTFMtMSQKLQkJdG9TdHJpbmcoc3VnZ2VzdGlvbnMpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RTdWdnZXN0RmllbGROYW1lMDA3KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUhhc2h0YWJsZSBvcHRpb25zID0gSmF2YUNvcmUuZ2V0T3B0aW9ucygpOwotCU9iamVjdCBmaWVsZFByZWZpeFByZXZpb3VzVmFsdWUgPSBvcHRpb25zLmdldChKYXZhQ29yZS5DT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTKTsKLQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTLCJwcmUiKTsgLy8kTk9OLU5MUy0xJAotCU9iamVjdCBmaWVsZFN1ZmZpeFByZXZpb3VzVmFsdWUgPSBvcHRpb25zLmdldChKYXZhQ29yZS5DT0RFQVNTSVNUX0ZJRUxEX1NVRkZJWEVTKTsKLQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT0RFQVNTSVNUX0ZJRUxEX1NVRkZJWEVTLCJzdWYiKTsgLy8kTk9OLU5MUy0xJAotCUphdmFDb3JlLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0JCi0JY2hhcltdW10gc3VnZ2VzdGlvbnMgPSBOYW1pbmdDb252ZW50aW9ucy5zdWdnZXN0RmllbGROYW1lcygKLQkJcHJvamVjdCwKLQkJImEuYi5jIi50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkCi0JCSJpbnQiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKLQkJMCwKLQkJMCwKLQkJQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIpOwotCQotCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPREVBU1NJU1RfRklFTERfUFJFRklYRVMsZmllbGRQcmVmaXhQcmV2aW91c1ZhbHVlKTsKLQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT0RFQVNTSVNUX0ZJRUxEX1NVRkZJWEVTLGZpZWxkU3VmZml4UHJldmlvdXNWYWx1ZSk7Ci0JSmF2YUNvcmUuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJwcmVJc3VmXG4iICsgLy8kTk9OLU5MUy0xJAotCQkicHJlSVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJImlzdWZcbiIgKyAvLyROT04tTkxTLTEkCi0JCSJpIiwgLy8kTk9OLU5MUy0xJAotCQl0b1N0cmluZyhzdWdnZXN0aW9ucykpOwotfQotcHVibGljIHZvaWQgdGVzdFN1Z2dlc3RGaWVsZE5hbWUwMDgoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JY2hhcltdW10gc3VnZ2VzdGlvbnMgPSBOYW1pbmdDb252ZW50aW9ucy5zdWdnZXN0RmllbGROYW1lcygKLQkJcHJvamVjdCwKLQkJImEuYi5jIi50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkCi0JCSJPbmVOYW1lIi50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkCi0JCTAsCi0JCTAsCi0JCW5ldyBjaGFyW11bXXsibmFtZSIudG9DaGFyQXJyYXkoKX0pOyAvLyROT04tTkxTLTEkCi0JCi0JYXNzZXJ0RXF1YWxzKAotCQkibmFtZTJcbiIgKyAvLyROT04tTkxTLTEkCi0JCSJvbmVOYW1lIiwgLy8kTk9OLU5MUy0xJAotCQl0b1N0cmluZyhzdWdnZXN0aW9ucykpOwotfQotcHVibGljIHZvaWQgdGVzdFN1Z2dlc3RGaWVsZE5hbWUwMDkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSGFzaHRhYmxlIG9wdGlvbnMgPSBKYXZhQ29yZS5nZXRPcHRpb25zKCk7Ci0JT2JqZWN0IGZpZWxkUHJlZml4UHJldmlvdXNWYWx1ZSA9IG9wdGlvbnMuZ2V0KEphdmFDb3JlLkNPREVBU1NJU1RfRklFTERfUFJFRklYRVMpOwotCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPREVBU1NJU1RfRklFTERfUFJFRklYRVMsInByZSIpOyAvLyROT04tTkxTLTEkCi0JT2JqZWN0IGZpZWxkU3VmZml4UHJldmlvdXNWYWx1ZSA9IG9wdGlvbnMuZ2V0KEphdmFDb3JlLkNPREVBU1NJU1RfRklFTERfU1VGRklYRVMpOwotCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPREVBU1NJU1RfRklFTERfU1VGRklYRVMsInN1ZiIpOyAvLyROT04tTkxTLTEkCi0JSmF2YUNvcmUuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQkKLQljaGFyW11bXSBzdWdnZXN0aW9ucyA9IE5hbWluZ0NvbnZlbnRpb25zLnN1Z2dlc3RGaWVsZE5hbWVzKAotCQlwcm9qZWN0LAotCQkiYS5iLmMiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKLQkJIk9uZU5hbWUiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKLQkJMCwKLQkJMCwKLQkJbmV3IGNoYXJbXVtdeyJwcmVOYW1lc3VmIi50b0NoYXJBcnJheSgpfSk7IC8vJE5PTi1OTFMtMSQKLQkKLQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTLGZpZWxkUHJlZml4UHJldmlvdXNWYWx1ZSk7Ci0Jb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9GSUVMRF9TVUZGSVhFUyxmaWVsZFN1ZmZpeFByZXZpb3VzVmFsdWUpOwotCUphdmFDb3JlLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkicHJlTmFtZTJzdWZcbiIgKyAvLyROT04tTkxTLTEkCi0JCSJwcmVPbmVOYW1lc3VmXG4iICsgLy8kTk9OLU5MUy0xJAotCQkicHJlTmFtZVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJInByZU9uZU5hbWVcbiIgKyAvLyROT04tTkxTLTEkCi0JCSJuYW1lc3VmXG4iICsgLy8kTk9OLU5MUy0xJAotCQkib25lTmFtZXN1ZlxuIiArIC8vJE5PTi1OTFMtMSQKLQkJIm5hbWVcbiIgKyAvLyROT04tTkxTLTEkCi0JCSJvbmVOYW1lIiwgLy8kTk9OLU5MUy0xJAotCQl0b1N0cmluZyhzdWdnZXN0aW9ucykpOwotfQotcHVibGljIHZvaWQgdGVzdFN1Z2dlc3RGaWVsZE5hbWUwMTAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSGFzaHRhYmxlIG9wdGlvbnMgPSBKYXZhQ29yZS5nZXRPcHRpb25zKCk7Ci0JT2JqZWN0IGZpZWxkUHJlZml4UHJldmlvdXNWYWx1ZSA9IG9wdGlvbnMuZ2V0KEphdmFDb3JlLkNPREVBU1NJU1RfRklFTERfUFJFRklYRVMpOwotCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPREVBU1NJU1RfRklFTERfUFJFRklYRVMsInByZSIpOyAvLyROT04tTkxTLTEkCi0JT2JqZWN0IGZpZWxkU3VmZml4UHJldmlvdXNWYWx1ZSA9IG9wdGlvbnMuZ2V0KEphdmFDb3JlLkNPREVBU1NJU1RfRklFTERfU1VGRklYRVMpOwotCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPREVBU1NJU1RfRklFTERfU1VGRklYRVMsInN1ZiIpOyAvLyROT04tTkxTLTEkCi0JSmF2YUNvcmUuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQkKLQljaGFyW11bXSBzdWdnZXN0aW9ucyA9IE5hbWluZ0NvbnZlbnRpb25zLnN1Z2dlc3RGaWVsZE5hbWVzKAotCQlwcm9qZWN0LAotCQkiYS5iLmMiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKLQkJIk9uZU5hbWUiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKLQkJMSwKLQkJMCwKLQkJbmV3IGNoYXJbXVtdeyJwcmVOYW1lc3VmIi50b0NoYXJBcnJheSgpfSk7IC8vJE5PTi1OTFMtMSQKLQkKLQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTLGZpZWxkUHJlZml4UHJldmlvdXNWYWx1ZSk7Ci0Jb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9GSUVMRF9TVUZGSVhFUyxmaWVsZFN1ZmZpeFByZXZpb3VzVmFsdWUpOwotCUphdmFDb3JlLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkicHJlTmFtZXNzdWZcbiIgKyAvLyROT04tTkxTLTEkCi0JCSJwcmVPbmVOYW1lc3N1ZlxuIiArIC8vJE5PTi1OTFMtMSQKLQkJInByZU5hbWVzXG4iICsgLy8kTk9OLU5MUy0xJAotCQkicHJlT25lTmFtZXNcbiIgKyAvLyROT04tTkxTLTEkCi0JCSJuYW1lc3N1ZlxuIiArIC8vJE5PTi1OTFMtMSQKLQkJIm9uZU5hbWVzc3VmXG4iICsgLy8kTk9OLU5MUy0xJAotCQkibmFtZXNcbiIgKyAvLyROT04tTkxTLTEkCi0JCSJvbmVOYW1lcyIsIC8vJE5PTi1OTFMtMSQKLQkJdG9TdHJpbmcoc3VnZ2VzdGlvbnMpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RTdWdnZXN0RmllbGROYW1lMDExKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCWNoYXJbXVtdIHN1Z2dlc3Rpb25zID0gTmFtaW5nQ29udmVudGlvbnMuc3VnZ2VzdEZpZWxkTmFtZXMoCi0JCXByb2plY3QsCi0JCSJhLmIuYyIudG9DaGFyQXJyYXkoKSwgLy8kTk9OLU5MUy0xJAotCQkiRmFjdG9yeSIudG9DaGFyQXJyYXkoKSwgLy8kTk9OLU5MUy0xJAotCQkxLAotCQkwLAotCQlDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUik7IC8vJE5PTi1OTFMtMSQKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJmYWN0b3JpZXMiLCAvLyROT04tTkxTLTEkCi0JCXRvU3RyaW5nKHN1Z2dlc3Rpb25zKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0U3VnZ2VzdEZpZWxkTmFtZTAxMigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlTdHJpbmdbXSBzdWdnZXN0aW9ucyA9IE5hbWluZ0NvbnZlbnRpb25zLnN1Z2dlc3RGaWVsZE5hbWVzKAotCQlwcm9qZWN0LAotCQkiYS5iLmMiLCAvLyROT04tTkxTLTEkCi0JCSJGb29CYXIiLCAvLyROT04tTkxTLTEkCi0JCTAsCi0JCTAsCi0JCW5ldyBTdHJpbmdbXXsiYmFyIn0pOyAvLyROT04tTkxTLTEkCi0JCi0JYXNzZXJ0RXF1YWxzKAotCQkiYmFyMlxuIiArIC8vJE5PTi1OTFMtMSQKLQkJImZvb0JhciIsIC8vJE5PTi1OTFMtMSQKLQkJdG9TdHJpbmcoc3VnZ2VzdGlvbnMpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RTdWdnZXN0RmllbGROYW1lMDEzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCWNoYXJbXVtdIHN1Z2dlc3Rpb25zID0gTmFtaW5nQ29udmVudGlvbnMuc3VnZ2VzdEZpZWxkTmFtZXMoCi0JCXByb2plY3QsCi0JCSJqYXZhLmxhbmciLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKLQkJIkNsYXNzIi50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkCi0JCTAsCi0JCTAsCi0JCUNoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSKTsKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJjbGFzczEiLC8vJE5PTi1OTFMtMSQKLQkJdG9TdHJpbmcoc3VnZ2VzdGlvbnMpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RTdWdnZXN0RmllbGROYW1lMDE0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCWNoYXJbXVtdIHN1Z2dlc3Rpb25zID0gTmFtaW5nQ29udmVudGlvbnMuc3VnZ2VzdEZpZWxkTmFtZXMoCi0JCXByb2plY3QsCi0JCSJqYXZhLmxhbmciLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKLQkJIkNsYXNzIi50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkCi0JCTAsCi0JCTAsCi0JCW5ldyBjaGFyW11bXXsiY2xhc3MxIi50b0NoYXJBcnJheSgpfSk7IC8vJE5PTi1OTFMtMSQKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJjbGFzczIiLC8vJE5PTi1OTFMtMSQKLQkJdG9TdHJpbmcoc3VnZ2VzdGlvbnMpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RTdWdnZXN0RmllbGROYW1lMDE1KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCWNoYXJbXVtdIHN1Z2dlc3Rpb25zID0gTmFtaW5nQ29udmVudGlvbnMuc3VnZ2VzdEZpZWxkTmFtZXMoCi0JCXByb2plY3QsCi0JCSIiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKLQkJIiMiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKLQkJMCwKLQkJMCwKLQkJQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIpOwotCQotCWFzc2VydEVxdWFscygKLQkJIm5hbWUiLC8vJE5PTi1OTFMtMSQKLQkJdG9TdHJpbmcoc3VnZ2VzdGlvbnMpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RTdWdnZXN0RmllbGROYW1lMDE2KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCWNoYXJbXVtdIHN1Z2dlc3Rpb25zID0gTmFtaW5nQ29udmVudGlvbnMuc3VnZ2VzdEZpZWxkTmFtZXMoCi0JCXByb2plY3QsCi0JCSIiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKLQkJIiMiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKLQkJMCwKLQkJMCwKLQkJbmV3IGNoYXJbXVtdeyJuYW1lIi50b0NoYXJBcnJheSgpfSk7IC8vJE5PTi1OTFMtMSQKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJuYW1lMiIsLy8kTk9OLU5MUy0xJAotCQl0b1N0cmluZyhzdWdnZXN0aW9ucykpOwotfQotcHVibGljIHZvaWQgdGVzdFJlbW92ZVByZWZpeEFuZFN1ZmZpeEZvckZpZWxkTmFtZTAwMSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlIYXNodGFibGUgb3B0aW9ucyA9IEphdmFDb3JlLmdldE9wdGlvbnMoKTsKLQlPYmplY3QgZmllbGRQcmVmaXhQcmV2aW91c1ZhbHVlID0gb3B0aW9ucy5nZXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9GSUVMRF9QUkVGSVhFUyk7Ci0Jb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9GSUVMRF9QUkVGSVhFUywicHJlIik7IC8vJE5PTi1OTFMtMSQKLQlPYmplY3QgZmllbGRTdWZmaXhQcmV2aW91c1ZhbHVlID0gb3B0aW9ucy5nZXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9GSUVMRF9TVUZGSVhFUyk7Ci0Jb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9GSUVMRF9TVUZGSVhFUywic3VmIik7IC8vJE5PTi1OTFMtMSQKLQlKYXZhQ29yZS5zZXRPcHRpb25zKG9wdGlvbnMpOwotCQotCWNoYXJbXSBuYW1lID0gTmFtaW5nQ29udmVudGlvbnMucmVtb3ZlUHJlZml4QW5kU3VmZml4Rm9yRmllbGROYW1lKAotCQlwcm9qZWN0LAotCQkicHJlT25lTmFtZXN1ZiIudG9DaGFyQXJyYXkoKSwgLy8kTk9OLU5MUy0xJAotCQkwKTsKLQkKLQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTLGZpZWxkUHJlZml4UHJldmlvdXNWYWx1ZSk7Ci0Jb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9GSUVMRF9TVUZGSVhFUyxmaWVsZFN1ZmZpeFByZXZpb3VzVmFsdWUpOwotCUphdmFDb3JlLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkib25lTmFtZSIsIC8vJE5PTi1OTFMtMSQKLQkJbmV3IFN0cmluZyhuYW1lKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUHJlZml4QW5kU3VmZml4Rm9yRmllbGROYW1lMDAyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUhhc2h0YWJsZSBvcHRpb25zID0gSmF2YUNvcmUuZ2V0T3B0aW9ucygpOwotCU9iamVjdCBmaWVsZFByZWZpeFByZXZpb3VzVmFsdWUgPSBvcHRpb25zLmdldChKYXZhQ29yZS5DT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTKTsKLQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTLCJwciwgcHJlIik7IC8vJE5PTi1OTFMtMSQKLQlPYmplY3QgZmllbGRTdWZmaXhQcmV2aW91c1ZhbHVlID0gb3B0aW9ucy5nZXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9GSUVMRF9TVUZGSVhFUyk7Ci0Jb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9GSUVMRF9TVUZGSVhFUywidWYsIHN1ZiIpOyAvLyROT04tTkxTLTEkCi0JSmF2YUNvcmUuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQkKLQljaGFyW10gbmFtZSA9IE5hbWluZ0NvbnZlbnRpb25zLnJlbW92ZVByZWZpeEFuZFN1ZmZpeEZvckZpZWxkTmFtZSgKLQkJcHJvamVjdCwKLQkJInByZU9uZU5hbWVzdWYiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKLQkJRmxhZ3MuQWNjU3RhdGljKTsKLQkKLQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTLGZpZWxkUHJlZml4UHJldmlvdXNWYWx1ZSk7Ci0Jb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9GSUVMRF9TVUZGSVhFUyxmaWVsZFN1ZmZpeFByZXZpb3VzVmFsdWUpOwotCUphdmFDb3JlLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkicHJlT25lTmFtZXN1ZiIsIC8vJE5PTi1OTFMtMSQKLQkJbmV3IFN0cmluZyhuYW1lKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUHJlZml4QW5kU3VmZml4Rm9yRmllbGROYW1lMDAzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUhhc2h0YWJsZSBvcHRpb25zID0gSmF2YUNvcmUuZ2V0T3B0aW9ucygpOwotCU9iamVjdCBmaWVsZFByZWZpeFByZXZpb3VzVmFsdWUgPSBvcHRpb25zLmdldChKYXZhQ29yZS5DT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTKTsKLQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTLCJwciwgcHJlIik7IC8vJE5PTi1OTFMtMSQKLQlPYmplY3QgZmllbGRTdWZmaXhQcmV2aW91c1ZhbHVlID0gb3B0aW9ucy5nZXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9GSUVMRF9TVUZGSVhFUyk7Ci0Jb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9GSUVMRF9TVUZGSVhFUywidWYsIHN1ZiIpOyAvLyROT04tTkxTLTEkCi0JSmF2YUNvcmUuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQkKLQljaGFyW10gbmFtZSA9IE5hbWluZ0NvbnZlbnRpb25zLnJlbW92ZVByZWZpeEFuZFN1ZmZpeEZvckZpZWxkTmFtZSgKLQkJcHJvamVjdCwKLQkJInByZU9uZU5hbWVzdWYiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKLQkJMCk7Ci0JCi0Jb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9GSUVMRF9QUkVGSVhFUyxmaWVsZFByZWZpeFByZXZpb3VzVmFsdWUpOwotCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPREVBU1NJU1RfRklFTERfU1VGRklYRVMsZmllbGRTdWZmaXhQcmV2aW91c1ZhbHVlKTsKLQlKYXZhQ29yZS5zZXRPcHRpb25zKG9wdGlvbnMpOwotCWFzc2VydEVxdWFscygKLQkJIm9uZU5hbWUiLCAvLyROT04tTkxTLTEkCi0JCW5ldyBTdHJpbmcobmFtZSkpOwotfQotcHVibGljIHZvaWQgdGVzdFN1Z2dlc3RHZXR0ZXJOYW1lMDAxKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCWNoYXJbXSBzdWdnZXN0aW9uID0gTmFtaW5nQ29udmVudGlvbnMuc3VnZ2VzdEdldHRlck5hbWUoCi0JCXByb2plY3QsCi0JCSJmaWVsZE5hbWUiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKLQkJMCwKLQkJZmFsc2UsCi0JCUNoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSKTsKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJnZXRGaWVsZE5hbWUiLCAvLyROT04tTkxTLTEkCi0JCW5ldyBTdHJpbmcoc3VnZ2VzdGlvbikpOwotfQotcHVibGljIHZvaWQgdGVzdFN1Z2dlc3RHZXR0ZXJOYW1lMDAyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCWNoYXJbXSBzdWdnZXN0aW9uID0gTmFtaW5nQ29udmVudGlvbnMuc3VnZ2VzdEdldHRlck5hbWUoCi0JCXByb2plY3QsCi0JCSJGaWVsZE5hbWUiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKLQkJMCwKLQkJZmFsc2UsCi0JCUNoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSKTsKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJnZXRGaWVsZE5hbWUiLCAvLyROT04tTkxTLTEkCi0JCW5ldyBTdHJpbmcoc3VnZ2VzdGlvbikpOwotfQotcHVibGljIHZvaWQgdGVzdFN1Z2dlc3RHZXR0ZXJOYW1lMDAzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUhhc2h0YWJsZSBvcHRpb25zID0gSmF2YUNvcmUuZ2V0T3B0aW9ucygpOwotCU9iamVjdCBmaWVsZFByZWZpeFByZXZpb3VzVmFsdWUgPSBvcHRpb25zLmdldChKYXZhQ29yZS5DT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTKTsKLQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTLCJwciwgcHJlIik7IC8vJE5PTi1OTFMtMSQKLQlPYmplY3QgZmllbGRTdWZmaXhQcmV2aW91c1ZhbHVlID0gb3B0aW9ucy5nZXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9GSUVMRF9TVUZGSVhFUyk7Ci0Jb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9GSUVMRF9TVUZGSVhFUywidWYsIHN1ZiIpOyAvLyROT04tTkxTLTEkCi0JSmF2YUNvcmUuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQkKLQljaGFyW10gc3VnZ2VzdGlvbiA9IE5hbWluZ0NvbnZlbnRpb25zLnN1Z2dlc3RHZXR0ZXJOYW1lKAotCQlwcm9qZWN0LAotCQkicHJlRmllbGROYW1lIi50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkCi0JCTAsCi0JCWZhbHNlLAotCQlDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUik7Ci0JCi0Jb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9GSUVMRF9QUkVGSVhFUyxmaWVsZFByZWZpeFByZXZpb3VzVmFsdWUpOwotCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPREVBU1NJU1RfRklFTERfU1VGRklYRVMsZmllbGRTdWZmaXhQcmV2aW91c1ZhbHVlKTsKLQlKYXZhQ29yZS5zZXRPcHRpb25zKG9wdGlvbnMpOwotCWFzc2VydEVxdWFscygKLQkJImdldEZpZWxkTmFtZSIsIC8vJE5PTi1OTFMtMSQKLQkJbmV3IFN0cmluZyhzdWdnZXN0aW9uKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0U3VnZ2VzdEdldHRlck5hbWUwMDQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSGFzaHRhYmxlIG9wdGlvbnMgPSBKYXZhQ29yZS5nZXRPcHRpb25zKCk7Ci0JT2JqZWN0IGZpZWxkUHJlZml4UHJldmlvdXNWYWx1ZSA9IG9wdGlvbnMuZ2V0KEphdmFDb3JlLkNPREVBU1NJU1RfRklFTERfUFJFRklYRVMpOwotCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPREVBU1NJU1RfRklFTERfUFJFRklYRVMsInByLCBwcmUiKTsgLy8kTk9OLU5MUy0xJAotCU9iamVjdCBmaWVsZFN1ZmZpeFByZXZpb3VzVmFsdWUgPSBvcHRpb25zLmdldChKYXZhQ29yZS5DT0RFQVNTSVNUX0ZJRUxEX1NVRkZJWEVTKTsKLQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT0RFQVNTSVNUX0ZJRUxEX1NVRkZJWEVTLCJ1Ziwgc3VmIik7IC8vJE5PTi1OTFMtMSQKLQlKYXZhQ29yZS5zZXRPcHRpb25zKG9wdGlvbnMpOwotCQotCWNoYXJbXSBzdWdnZXN0aW9uID0gTmFtaW5nQ29udmVudGlvbnMuc3VnZ2VzdEdldHRlck5hbWUoCi0JCXByb2plY3QsCi0JCSJwcmVGaWVsZE5hbWVzdWYiLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKLQkJMCwKLQkJZmFsc2UsCi0JCUNoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSKTsKLQkKLQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT0RFQVNTSVNUX0ZJRUxEX1BSRUZJWEVTLGZpZWxkUHJlZml4UHJldmlvdXNWYWx1ZSk7Ci0Jb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9GSUVMRF9TVUZGSVhFUyxmaWVsZFN1ZmZpeFByZXZpb3VzVmFsdWUpOwotCUphdmFDb3JlLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiZ2V0RmllbGROYW1lIiwgLy8kTk9OLU5MUy0xJAotCQluZXcgU3RyaW5nKHN1Z2dlc3Rpb24pKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RTdWdnZXN0R2V0dGVyTmFtZTAwNSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlIYXNodGFibGUgb3B0aW9ucyA9IEphdmFDb3JlLmdldE9wdGlvbnMoKTsKLQlPYmplY3QgZmllbGRQcmVmaXhQcmV2aW91c1ZhbHVlID0gb3B0aW9ucy5nZXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9GSUVMRF9QUkVGSVhFUyk7Ci0Jb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9GSUVMRF9QUkVGSVhFUywicHIsIHByZSIpOyAvLyROT04tTkxTLTEkCi0JT2JqZWN0IGZpZWxkU3VmZml4UHJldmlvdXNWYWx1ZSA9IG9wdGlvbnMuZ2V0KEphdmFDb3JlLkNPREVBU1NJU1RfRklFTERfU1VGRklYRVMpOwotCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPREVBU1NJU1RfRklFTERfU1VGRklYRVMsInVmLCBzdWYiKTsgLy8kTk9OLU5MUy0xJAotCUphdmFDb3JlLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0JCi0JY2hhcltdIHN1Z2dlc3Rpb24gPSBOYW1pbmdDb252ZW50aW9ucy5zdWdnZXN0R2V0dGVyTmFtZSgKLQkJcHJvamVjdCwKLQkJInByZUZpZWxkTmFtZXN1ZiIudG9DaGFyQXJyYXkoKSwgLy8kTk9OLU5MUy0xJAotCQkwLAotCQl0cnVlLAotCQlDaGFyT3BlcmF0aW9uLk5PX0NIQVJfQ0hBUik7Ci0JCi0Jb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09ERUFTU0lTVF9GSUVMRF9QUkVGSVhFUyxmaWVsZFByZWZpeFByZXZpb3VzVmFsdWUpOwotCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPREVBU1NJU1RfRklFTERfU1VGRklYRVMsZmllbGRTdWZmaXhQcmV2aW91c1ZhbHVlKTsKLQlKYXZhQ29yZS5zZXRPcHRpb25zKG9wdGlvbnMpOwotCWFzc2VydEVxdWFscygKLQkJImlzRmllbGROYW1lIiwgLy8kTk9OLU5MUy0xJAotCQluZXcgU3RyaW5nKHN1Z2dlc3Rpb24pKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RTdWdnZXN0R2V0dGVyTmFtZTAwNigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQljaGFyW10gc3VnZ2VzdGlvbiA9IE5hbWluZ0NvbnZlbnRpb25zLnN1Z2dlc3RHZXR0ZXJOYW1lKAotCQlwcm9qZWN0LAotCQkiaXNTb21ldGhpbmciLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKLQkJMCwKLQkJdHJ1ZSwKLQkJQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIpOwotCQotCWFzc2VydEVxdWFscygKLQkJImlzU29tZXRoaW5nIiwgLy8kTk9OLU5MUy0xJAotCQluZXcgU3RyaW5nKHN1Z2dlc3Rpb24pKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RTdWdnZXN0R2V0dGVyTmFtZTAwNygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQljaGFyW10gc3VnZ2VzdGlvbiA9IE5hbWluZ0NvbnZlbnRpb25zLnN1Z2dlc3RHZXR0ZXJOYW1lKAotCQlwcm9qZWN0LAotCQkiaXNTb21ldGhpbmciLnRvQ2hhckFycmF5KCksIC8vJE5PTi1OTFMtMSQKLQkJMCwKLQkJZmFsc2UsCi0JCUNoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSKTsKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJnZXRJc1NvbWV0aGluZyIsIC8vJE5PTi1OTFMtMSQKLQkJbmV3IFN0cmluZyhzdWdnZXN0aW9uKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0U3VnZ2VzdFNldHRlck5hbWUwMDEoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JY2hhcltdIHN1Z2dlc3Rpb24gPSBOYW1pbmdDb252ZW50aW9ucy5zdWdnZXN0U2V0dGVyTmFtZSgKLQkJcHJvamVjdCwKLQkJImlzU29tZXRoaW5nIi50b0NoYXJBcnJheSgpLCAvLyROT04tTkxTLTEkCi0JCTAsCi0JCXRydWUsCi0JCUNoYXJPcGVyYXRpb24uTk9fQ0hBUl9DSEFSKTsKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJzZXRTb21ldGhpbmciLCAvLyROT04tTkxTLTEkCi0JCW5ldyBTdHJpbmcoc3VnZ2VzdGlvbikpOwotfQotcHVibGljIHZvaWQgdGVzdFN1Z2dlc3RTZXR0ZXJOYW1lMDAyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCWNoYXJbXSBzdWdnZXN0aW9uID0gTmFtaW5nQ29udmVudGlvbnMuc3VnZ2VzdFNldHRlck5hbWUoCi0JCXByb2plY3QsCi0JCSJpc1NvbWV0aGluZyIudG9DaGFyQXJyYXkoKSwgLy8kTk9OLU5MUy0xJAotCQkwLAotCQlmYWxzZSwKLQkJQ2hhck9wZXJhdGlvbi5OT19DSEFSX0NIQVIpOwotCQotCWFzc2VydEVxdWFscygKLQkJInNldElzU29tZXRoaW5nIiwgLy8kTk9OLU5MUy0xJAotCQluZXcgU3RyaW5nKHN1Z2dlc3Rpb24pKTsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9PcHRpb25UZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL09wdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMDcwNzMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL09wdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotCi1wdWJsaWMgY2xhc3MgT3B0aW9uVGVzdHMgZXh0ZW5kcyBNb2RpZnlpbmdSZXNvdXJjZVRlc3RzIHsKLQotcHVibGljIE9wdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0KLQlpZiAoZmFsc2UpewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgU3VpdGUoT3B0aW9uVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQ2xhc3NwYXRoVGVzdHMoInRlc3REZW5zZUN5Y2xlRGV0ZWN0aW9uIikpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCXJldHVybiBuZXcgU3VpdGUoT3B0aW9uVGVzdHMuY2xhc3MpOwkKLX0KLS8qKgotICogVGVzdCBwZXJzaXN0ZW5jZSBvZiBwcm9qZWN0IGN1c3RvbSBvcHRpb25zCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvamVjdEEgPSAKLQkJCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoCi0JCQkJIkEiLCAKLQkJCQluZXcgU3RyaW5nW10ge30sIC8vIHNvdXJjZSBmb2xkZXJzCi0JCQkJbmV3IFN0cmluZ1tdIHt9LCAvLyBsaWIgZm9sZGVycwotCQkJCW5ldyBTdHJpbmdbXSB7fSwgLy8gcHJvamVjdHMKLQkJCQkiIik7Ci0JCUlKYXZhUHJvamVjdCBwcm9qZWN0QiA9IAotCQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgKLQkJCQkiQiIsIAotCQkJCW5ldyBTdHJpbmdbXSB7fSwgLy8gc291cmNlIGZvbGRlcnMKLQkJCQluZXcgU3RyaW5nW10ge30sIC8vIGxpYiBmb2xkZXJzCi0JCQkJbmV3IFN0cmluZ1tdIHt9LCAvLyBwcm9qZWN0cwotCQkJCSIiKTsKLQkJCQkKLQkJSGFzaHRhYmxlIG9wdGlvbnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPTVBJTEVSX1BCX0RFUFJFQ0FUSU9OX0lOX0RFUFJFQ0FURURfQ09ERSwgSmF2YUNvcmUuRElTQUJMRUQpOwotCQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFLCAiOC4wIik7Ci0JCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPTVBJTEVSX1BCX0hJRERFTl9DQVRDSF9CTE9DSywgSmF2YUNvcmUuRVJST1IpOwotCQlKYXZhQ29yZS5zZXRPcHRpb25zKG9wdGlvbnMpOwotCi0JCW9wdGlvbnMuY2xlYXIoKTsKLQkJb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09NUElMRVJfUEJfREVQUkVDQVRJT05fSU5fREVQUkVDQVRFRF9DT0RFLCBKYXZhQ29yZS5FTkFCTEVEKTsKLQkJb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSwgIjEwLjAiKTsKLQkJcHJvamVjdEEuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQotCQkvLyBjaGVjayBwcm9qZWN0IEEgY3VzdG9tIG9wdGlvbnMJCQotCQlhc3NlcnRFcXVhbHMoInByb2pBOnVuZXhwZWN0ZWQgY3VzdG9tIHZhbHVlIGZvciBkZXByZWNhdGlvbiBvcHRpb24iLCBKYXZhQ29yZS5FTkFCTEVELCBwcm9qZWN0QS5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfUEJfREVQUkVDQVRJT05fSU5fREVQUkVDQVRFRF9DT0RFLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygicHJvakE6dW5leHBlY3RlZCBjdXN0b20gdmFsdWUgZm9yIGNvbXBsaWFuY2Ugb3B0aW9uIiwgIjEwLjAiLCBwcm9qZWN0QS5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSwgdHJ1ZSkpOwotCQlhc3NlcnRFcXVhbHMoInByb2pBOnVuZXhwZWN0ZWQgaW5oZXJpdGVkIHZhbHVlMSBmb3IgaGlkZGVuLWNhdGNoIG9wdGlvbiIsIEphdmFDb3JlLkVSUk9SLCBwcm9qZWN0QS5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfUEJfSElEREVOX0NBVENIX0JMT0NLLCB0cnVlKSk7Ci0JCQotCQkvLyBjaGVjayBwcm9qZWN0IEIgY3VzdG9tIG9wdGlvbnMJKHNob3VsZCBiZSBub25lLCBpbmRpY2F0aW5nIGl0IHNlZXMgZ2xvYmFsIG9uZXMgb25seSkKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qQjp1bmV4cGVjdGVkIGN1c3RvbSB2YWx1ZSBmb3IgZGVwcmVjYXRpb24gb3B0aW9uIiwgSmF2YUNvcmUuRElTQUJMRUQsIHByb2plY3RCLmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9QQl9ERVBSRUNBVElPTl9JTl9ERVBSRUNBVEVEX0NPREUsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qQjp1bmV4cGVjdGVkIGN1c3RvbSB2YWx1ZSBmb3IgY29tcGxpYW5jZSBvcHRpb24iLCAiOC4wIiwgcHJvamVjdEIuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qQjp1bmV4cGVjdGVkIGluaGVyaXRlZCB2YWx1ZSBmb3IgaGlkZGVuLWNhdGNoIG9wdGlvbiIsIEphdmFDb3JlLkVSUk9SLCBwcm9qZWN0Qi5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfUEJfSElEREVOX0NBVENIX0JMT0NLLCB0cnVlKSk7Ci0KLQkJLy8gZmx1c2ggY3VzdG9tIG9wdGlvbnMgLSBwcm9qZWN0IEEgc2hvdWxkIHJldmVydCB0byBnbG9iYWwgb25lcwotCQlwcm9qZWN0QS5zZXRPcHRpb25zKG51bGwpOyAKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qQTp1bmV4cGVjdGVkIHJldmVydGVkIHZhbHVlIGZvciBkZXByZWNhdGlvbiBvcHRpb24iLCBKYXZhQ29yZS5ESVNBQkxFRCwgcHJvamVjdEEuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX1BCX0RFUFJFQ0FUSU9OX0lOX0RFUFJFQ0FURURfQ09ERSwgdHJ1ZSkpOwotCQlhc3NlcnRFcXVhbHMoInByb2pBOnVuZXhwZWN0ZWQgcmV2ZXJ0ZWQgdmFsdWUgZm9yIGNvbXBsaWFuY2Ugb3B0aW9uIiwgIjguMCIsIHByb2plY3RBLmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygicHJvakE6dW5leHBlY3RlZCBpbmhlcml0ZWQgdmFsdWUyIGZvciBoaWRkZW4tY2F0Y2ggb3B0aW9uIiwgSmF2YUNvcmUuRVJST1IsIHByb2plY3RBLmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9QQl9ISURERU5fQ0FUQ0hfQkxPQ0ssIHRydWUpKTsKLQotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiQSIpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIkIiKTsKLQl9Ci19Ci0KLS8qKgotICogVGVzdCBjdXN0b20gZW5jb2RpbmcKLSAqLwotcHVibGljIHZvaWQgdGVzdDAyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qZWN0QSA9IAotCQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgKLQkJCQkiQSIsIAotCQkJCW5ldyBTdHJpbmdbXSB7fSwgLy8gc291cmNlIGZvbGRlcnMKLQkJCQluZXcgU3RyaW5nW10ge30sIC8vIGxpYiBmb2xkZXJzCi0JCQkJbmV3IFN0cmluZ1tdIHt9LCAvLyBwcm9qZWN0cwotCQkJCSIiKTsKLQkJSUphdmFQcm9qZWN0IHByb2plY3RCID0gCi0JCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KAotCQkJCSJCIiwgCi0JCQkJbmV3IFN0cmluZ1tdIHt9LCAvLyBzb3VyY2UgZm9sZGVycwotCQkJCW5ldyBTdHJpbmdbXSB7fSwgLy8gbGliIGZvbGRlcnMKLQkJCQluZXcgU3RyaW5nW10ge30sIC8vIHByb2plY3RzCi0JCQkJIiIpOwotCQkJCQotCQlTdHJpbmcgZ2xvYmFsRW5jb2RpbmcgPSBKYXZhQ29yZS5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9FTkNPRElORyk7Ci0KLQkJSGFzaHRhYmxlIG9wdGlvbnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPUkVfRU5DT0RJTkcsICJjdXN0b20iKTsKLQkJcHJvamVjdEEuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQotCQkvLyBjaGVjayBwcm9qZWN0IEEgY3VzdG9tIG9wdGlvbnMJCQotCQlhc3NlcnRFcXVhbHMoInByb2pBOnVuZXhwZWN0ZWQgY3VzdG9tIGVuY29kaW5nIiwgImN1c3RvbSIsIHByb2plY3RBLmdldE9wdGlvbihKYXZhQ29yZS5DT1JFX0VOQ09ESU5HLCB0cnVlKSk7Ci0JCQotCQkvLyBjaGVjayBwcm9qZWN0IEIgY3VzdG9tIG9wdGlvbnMJKHNob3VsZCBiZSBub25lLCBpbmRpY2F0aW5nIGl0IHNlZXMgZ2xvYmFsIG9uZXMgb25seSkKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qQjp1bmV4cGVjdGVkIGN1c3RvbSBlbmNvZGluZyIsIGdsb2JhbEVuY29kaW5nLCBwcm9qZWN0Qi5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9FTkNPRElORywgdHJ1ZSkpOwotCi0JCS8vIGZsdXNoIGN1c3RvbSBvcHRpb25zIC0gcHJvamVjdCBBIHNob3VsZCByZXZlcnQgdG8gZ2xvYmFsIG9uZXMKLQkJcHJvamVjdEEuc2V0T3B0aW9ucyhudWxsKTsgCi0JCWFzc2VydEVxdWFscygicHJvakE6dW5leHBlY3RlZCByZXZlcnRlZCBlbmNvZGluZyIsIGdsb2JhbEVuY29kaW5nLCBwcm9qZWN0QS5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9FTkNPRElORywgdHJ1ZSkpOwotCi0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJBIik7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiQiIpOwotCX0KLX0KLQotLyoqCi0gKiBUZXN0IGN1c3RvbSBwcm9qZWN0IG9wdGlvbiAoaWYgbm90IGNvbnNpZGVyaW5nIEphdmFDb3JlIG9wdGlvbnMpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwMygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvamVjdEEgPSAKLQkJCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoCi0JCQkJIkEiLCAKLQkJCQluZXcgU3RyaW5nW10ge30sIC8vIHNvdXJjZSBmb2xkZXJzCi0JCQkJbmV3IFN0cmluZ1tdIHt9LCAvLyBsaWIgZm9sZGVycwotCQkJCW5ldyBTdHJpbmdbXSB7fSwgLy8gcHJvamVjdHMKLQkJCQkiIik7Ci0JCUlKYXZhUHJvamVjdCBwcm9qZWN0QiA9IAotCQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgKLQkJCQkiQiIsIAotCQkJCW5ldyBTdHJpbmdbXSB7fSwgLy8gc291cmNlIGZvbGRlcnMKLQkJCQluZXcgU3RyaW5nW10ge30sIC8vIGxpYiBmb2xkZXJzCi0JCQkJbmV3IFN0cmluZ1tdIHt9LCAvLyBwcm9qZWN0cwotCQkJCSIiKTsKLQkJCQkKLQkJSGFzaHRhYmxlIG9wdGlvbnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPTVBJTEVSX1BCX0RFUFJFQ0FUSU9OX0lOX0RFUFJFQ0FURURfQ09ERSwgSmF2YUNvcmUuRElTQUJMRUQpOwotCQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFLCAiOC4wIik7Ci0JCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPTVBJTEVSX1BCX0hJRERFTl9DQVRDSF9CTE9DSywgSmF2YUNvcmUuRVJST1IpOwotCQlKYXZhQ29yZS5zZXRPcHRpb25zKG9wdGlvbnMpOwotCi0JCW9wdGlvbnMuY2xlYXIoKTsKLQkJb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09NUElMRVJfUEJfREVQUkVDQVRJT05fSU5fREVQUkVDQVRFRF9DT0RFLCBKYXZhQ29yZS5FTkFCTEVEKTsKLQkJb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSwgIjEwLjAiKTsKLQkJcHJvamVjdEEuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQotCQkvLyBjaGVjayBwcm9qZWN0IEEgY3VzdG9tIG9wdGlvbnMJCQotCQlhc3NlcnRFcXVhbHMoInByb2pBOnVuZXhwZWN0ZWQgY3VzdG9tIHZhbHVlIGZvciBkZXByZWNhdGlvbiBvcHRpb24iLCBKYXZhQ29yZS5FTkFCTEVELCBwcm9qZWN0QS5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfUEJfREVQUkVDQVRJT05fSU5fREVQUkVDQVRFRF9DT0RFLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInByb2pBOnVuZXhwZWN0ZWQgY3VzdG9tIHZhbHVlIGZvciBjb21wbGlhbmNlIG9wdGlvbiIsICIxMC4wIiwgcHJvamVjdEEuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygicHJvakE6dW5leHBlY3RlZCBpbmhlcml0ZWQgdmFsdWUxIGZvciBoaWRkZW4tY2F0Y2ggb3B0aW9uIiwgbnVsbCwgcHJvamVjdEEuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX1BCX0hJRERFTl9DQVRDSF9CTE9DSywgZmFsc2UpKTsKLQkJCi0JCS8vIGNoZWNrIHByb2plY3QgQiBjdXN0b20gb3B0aW9ucwkoc2hvdWxkIGJlIG5vbmUsIGluZGljYXRpbmcgaXQgc2VlcyBnbG9iYWwgb25lcyBvbmx5KQotCQlhc3NlcnRFcXVhbHMoInByb2pCOnVuZXhwZWN0ZWQgY3VzdG9tIHZhbHVlIGZvciBkZXByZWNhdGlvbiBvcHRpb24iLCBudWxsLCBwcm9qZWN0Qi5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfUEJfREVQUkVDQVRJT05fSU5fREVQUkVDQVRFRF9DT0RFLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInByb2pCOnVuZXhwZWN0ZWQgY3VzdG9tIHZhbHVlIGZvciBjb21wbGlhbmNlIG9wdGlvbiIsIG51bGwsIHByb2plY3RCLmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInByb2pCOnVuZXhwZWN0ZWQgaW5oZXJpdGVkIHZhbHVlIGZvciBoaWRkZW4tY2F0Y2ggb3B0aW9uIiwgbnVsbCwgcHJvamVjdEIuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX1BCX0hJRERFTl9DQVRDSF9CTE9DSywgZmFsc2UpKTsKLQotCQkvLyBmbHVzaCBjdXN0b20gb3B0aW9ucyAtIHByb2plY3QgQSBzaG91bGQgcmV2ZXJ0IHRvIGdsb2JhbCBvbmVzCi0JCXByb2plY3RBLnNldE9wdGlvbnMobnVsbCk7IAotCQlhc3NlcnRFcXVhbHMoInByb2pBOnVuZXhwZWN0ZWQgcmV2ZXJ0ZWQgdmFsdWUgZm9yIGRlcHJlY2F0aW9uIG9wdGlvbiIsIG51bGwsIHByb2plY3RBLmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9QQl9ERVBSRUNBVElPTl9JTl9ERVBSRUNBVEVEX0NPREUsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygicHJvakE6dW5leHBlY3RlZCByZXZlcnRlZCB2YWx1ZSBmb3IgY29tcGxpYW5jZSBvcHRpb24iLCBudWxsLCBwcm9qZWN0QS5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qQTp1bmV4cGVjdGVkIGluaGVyaXRlZCB2YWx1ZTIgZm9yIGhpZGRlbi1jYXRjaCBvcHRpb24iLCBudWxsLCBwcm9qZWN0QS5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfUEJfSElEREVOX0NBVENIX0JMT0NLLCBmYWxzZSkpOwotCi0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJBIik7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiQiIpOwotCX0KLX0KLS8qKgotICogVGVzdCBwZXJzaXN0ZW5jZSBvZiBwcm9qZWN0IGN1c3RvbSBvcHRpb25zIC0gdXNpbmcgZ2V0T3B0aW9ucygpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwNCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvamVjdEEgPSAKLQkJCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoCi0JCQkJIkEiLCAKLQkJCQluZXcgU3RyaW5nW10ge30sIC8vIHNvdXJjZSBmb2xkZXJzCi0JCQkJbmV3IFN0cmluZ1tdIHt9LCAvLyBsaWIgZm9sZGVycwotCQkJCW5ldyBTdHJpbmdbXSB7fSwgLy8gcHJvamVjdHMKLQkJCQkiIik7Ci0JCUlKYXZhUHJvamVjdCBwcm9qZWN0QiA9IAotCQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgKLQkJCQkiQiIsIAotCQkJCW5ldyBTdHJpbmdbXSB7fSwgLy8gc291cmNlIGZvbGRlcnMKLQkJCQluZXcgU3RyaW5nW10ge30sIC8vIGxpYiBmb2xkZXJzCi0JCQkJbmV3IFN0cmluZ1tdIHt9LCAvLyBwcm9qZWN0cwotCQkJCSIiKTsKLQkJCQkKLQkJSGFzaHRhYmxlIG9wdGlvbnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPTVBJTEVSX1BCX0RFUFJFQ0FUSU9OX0lOX0RFUFJFQ0FURURfQ09ERSwgSmF2YUNvcmUuRElTQUJMRUQpOwotCQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFLCAiOC4wIik7Ci0JCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPTVBJTEVSX1BCX0hJRERFTl9DQVRDSF9CTE9DSywgSmF2YUNvcmUuRVJST1IpOwotCQlKYXZhQ29yZS5zZXRPcHRpb25zKG9wdGlvbnMpOwotCi0JCW9wdGlvbnMuY2xlYXIoKTsKLQkJb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09NUElMRVJfUEJfREVQUkVDQVRJT05fSU5fREVQUkVDQVRFRF9DT0RFLCBKYXZhQ29yZS5FTkFCTEVEKTsKLQkJb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSwgIjEwLjAiKTsKLQkJcHJvamVjdEEuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQotCQkvLyBjaGVjayBwcm9qZWN0IEEgY3VzdG9tIG9wdGlvbnMJCQotCQlhc3NlcnRFcXVhbHMoInByb2pBOnVuZXhwZWN0ZWQgY3VzdG9tIHZhbHVlIGZvciBkZXByZWNhdGlvbiBvcHRpb24iLCBKYXZhQ29yZS5FTkFCTEVELCBwcm9qZWN0QS5nZXRPcHRpb25zKHRydWUpLmdldChKYXZhQ29yZS5DT01QSUxFUl9QQl9ERVBSRUNBVElPTl9JTl9ERVBSRUNBVEVEX0NPREUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qQTp1bmV4cGVjdGVkIGN1c3RvbSB2YWx1ZSBmb3IgY29tcGxpYW5jZSBvcHRpb24iLCAiMTAuMCIsIHByb2plY3RBLmdldE9wdGlvbnModHJ1ZSkuZ2V0KEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qQTp1bmV4cGVjdGVkIGluaGVyaXRlZCB2YWx1ZTEgZm9yIGhpZGRlbi1jYXRjaCBvcHRpb24iLCBKYXZhQ29yZS5FUlJPUiwgcHJvamVjdEEuZ2V0T3B0aW9ucyh0cnVlKS5nZXQoSmF2YUNvcmUuQ09NUElMRVJfUEJfSElEREVOX0NBVENIX0JMT0NLKSk7Ci0JCQotCQkvLyBjaGVjayBwcm9qZWN0IEIgY3VzdG9tIG9wdGlvbnMJKHNob3VsZCBiZSBub25lLCBpbmRpY2F0aW5nIGl0IHNlZXMgZ2xvYmFsIG9uZXMgb25seSkKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qQjp1bmV4cGVjdGVkIGN1c3RvbSB2YWx1ZSBmb3IgZGVwcmVjYXRpb24gb3B0aW9uIiwgSmF2YUNvcmUuRElTQUJMRUQsIHByb2plY3RCLmdldE9wdGlvbnModHJ1ZSkuZ2V0KEphdmFDb3JlLkNPTVBJTEVSX1BCX0RFUFJFQ0FUSU9OX0lOX0RFUFJFQ0FURURfQ09ERSkpOwotCQlhc3NlcnRFcXVhbHMoInByb2pCOnVuZXhwZWN0ZWQgY3VzdG9tIHZhbHVlIGZvciBjb21wbGlhbmNlIG9wdGlvbiIsICI4LjAiLCBwcm9qZWN0Qi5nZXRPcHRpb25zKHRydWUpLmdldChKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFKSk7Ci0JCWFzc2VydEVxdWFscygicHJvakI6dW5leHBlY3RlZCBpbmhlcml0ZWQgdmFsdWUgZm9yIGhpZGRlbi1jYXRjaCBvcHRpb24iLCBKYXZhQ29yZS5FUlJPUiwgcHJvamVjdEIuZ2V0T3B0aW9ucyh0cnVlKS5nZXQoSmF2YUNvcmUuQ09NUElMRVJfUEJfSElEREVOX0NBVENIX0JMT0NLKSk7Ci0KLQkJLy8gZmx1c2ggY3VzdG9tIG9wdGlvbnMgLSBwcm9qZWN0IEEgc2hvdWxkIHJldmVydCB0byBnbG9iYWwgb25lcwotCQlwcm9qZWN0QS5zZXRPcHRpb25zKG51bGwpOyAKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qQTp1bmV4cGVjdGVkIHJldmVydGVkIHZhbHVlIGZvciBkZXByZWNhdGlvbiBvcHRpb24iLCBKYXZhQ29yZS5ESVNBQkxFRCwgcHJvamVjdEEuZ2V0T3B0aW9ucyh0cnVlKS5nZXQoSmF2YUNvcmUuQ09NUElMRVJfUEJfREVQUkVDQVRJT05fSU5fREVQUkVDQVRFRF9DT0RFKSk7Ci0JCWFzc2VydEVxdWFscygicHJvakE6dW5leHBlY3RlZCByZXZlcnRlZCB2YWx1ZSBmb3IgY29tcGxpYW5jZSBvcHRpb24iLCAiOC4wIiwgcHJvamVjdEEuZ2V0T3B0aW9ucyh0cnVlKS5nZXQoSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSkpOwotCQlhc3NlcnRFcXVhbHMoInByb2pBOnVuZXhwZWN0ZWQgaW5oZXJpdGVkIHZhbHVlMiBmb3IgaGlkZGVuLWNhdGNoIG9wdGlvbiIsIEphdmFDb3JlLkVSUk9SLCBwcm9qZWN0QS5nZXRPcHRpb25zKHRydWUpLmdldChKYXZhQ29yZS5DT01QSUxFUl9QQl9ISURERU5fQ0FUQ0hfQkxPQ0spKTsKLQotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiQSIpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIkIiKTsKLQl9Ci19Ci0KLS8qKgotICogVGVzdCBjdXN0b20gZW5jb2RpbmcgLSB1c2luZyBnZXRPcHRpb25zKCkKLSAqLwotcHVibGljIHZvaWQgdGVzdDA1KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qZWN0QSA9IAotCQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgKLQkJCQkiQSIsIAotCQkJCW5ldyBTdHJpbmdbXSB7fSwgLy8gc291cmNlIGZvbGRlcnMKLQkJCQluZXcgU3RyaW5nW10ge30sIC8vIGxpYiBmb2xkZXJzCi0JCQkJbmV3IFN0cmluZ1tdIHt9LCAvLyBwcm9qZWN0cwotCQkJCSIiKTsKLQkJSUphdmFQcm9qZWN0IHByb2plY3RCID0gCi0JCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KAotCQkJCSJCIiwgCi0JCQkJbmV3IFN0cmluZ1tdIHt9LCAvLyBzb3VyY2UgZm9sZGVycwotCQkJCW5ldyBTdHJpbmdbXSB7fSwgLy8gbGliIGZvbGRlcnMKLQkJCQluZXcgU3RyaW5nW10ge30sIC8vIHByb2plY3RzCi0JCQkJIiIpOwotCQkJCQotCQlTdHJpbmcgZ2xvYmFsRW5jb2RpbmcgPSBKYXZhQ29yZS5nZXRPcHRpb24oSmF2YUNvcmUuQ09SRV9FTkNPRElORyk7Ci0KLQkJSGFzaHRhYmxlIG9wdGlvbnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPUkVfRU5DT0RJTkcsICJjdXN0b20iKTsKLQkJcHJvamVjdEEuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQotCQkvLyBjaGVjayBwcm9qZWN0IEEgY3VzdG9tIG9wdGlvbnMJCQotCQlhc3NlcnRFcXVhbHMoInByb2pBOnVuZXhwZWN0ZWQgY3VzdG9tIGVuY29kaW5nIiwgImN1c3RvbSIsIHByb2plY3RBLmdldE9wdGlvbnModHJ1ZSkuZ2V0KEphdmFDb3JlLkNPUkVfRU5DT0RJTkcpKTsKLQkJCi0JCS8vIGNoZWNrIHByb2plY3QgQiBjdXN0b20gb3B0aW9ucwkoc2hvdWxkIGJlIG5vbmUsIGluZGljYXRpbmcgaXQgc2VlcyBnbG9iYWwgb25lcyBvbmx5KQotCQlhc3NlcnRFcXVhbHMoInByb2pCOnVuZXhwZWN0ZWQgY3VzdG9tIGVuY29kaW5nIiwgZ2xvYmFsRW5jb2RpbmcsIHByb2plY3RCLmdldE9wdGlvbnModHJ1ZSkuZ2V0KEphdmFDb3JlLkNPUkVfRU5DT0RJTkcpKTsKLQotCQkvLyBmbHVzaCBjdXN0b20gb3B0aW9ucyAtIHByb2plY3QgQSBzaG91bGQgcmV2ZXJ0IHRvIGdsb2JhbCBvbmVzCi0JCXByb2plY3RBLnNldE9wdGlvbnMobnVsbCk7IAotCQlhc3NlcnRFcXVhbHMoInByb2pBOnVuZXhwZWN0ZWQgcmV2ZXJ0ZWQgZW5jb2RpbmciLCBnbG9iYWxFbmNvZGluZywgcHJvamVjdEEuZ2V0T3B0aW9ucyh0cnVlKS5nZXQoSmF2YUNvcmUuQ09SRV9FTkNPRElORykpOwotCi0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJBIik7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiQiIpOwotCX0KLX0KLQotLyoqCi0gKiBUZXN0IGN1c3RvbSBwcm9qZWN0IG9wdGlvbiAoaWYgbm90IGNvbnNpZGVyaW5nIEphdmFDb3JlIG9wdGlvbnMpIC0gdXNpbmcgZ2V0T3B0aW9ucygpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3QwNigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvamVjdEEgPSAKLQkJCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoCi0JCQkJIkEiLCAKLQkJCQluZXcgU3RyaW5nW10ge30sIC8vIHNvdXJjZSBmb2xkZXJzCi0JCQkJbmV3IFN0cmluZ1tdIHt9LCAvLyBsaWIgZm9sZGVycwotCQkJCW5ldyBTdHJpbmdbXSB7fSwgLy8gcHJvamVjdHMKLQkJCQkiIik7Ci0JCUlKYXZhUHJvamVjdCBwcm9qZWN0QiA9IAotCQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgKLQkJCQkiQiIsIAotCQkJCW5ldyBTdHJpbmdbXSB7fSwgLy8gc291cmNlIGZvbGRlcnMKLQkJCQluZXcgU3RyaW5nW10ge30sIC8vIGxpYiBmb2xkZXJzCi0JCQkJbmV3IFN0cmluZ1tdIHt9LCAvLyBwcm9qZWN0cwotCQkJCSIiKTsKLQkJCQkKLQkJSGFzaHRhYmxlIG9wdGlvbnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPTVBJTEVSX1BCX0RFUFJFQ0FUSU9OX0lOX0RFUFJFQ0FURURfQ09ERSwgSmF2YUNvcmUuRElTQUJMRUQpOwotCQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFLCAiOC4wIik7Ci0JCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPTVBJTEVSX1BCX0hJRERFTl9DQVRDSF9CTE9DSywgSmF2YUNvcmUuRVJST1IpOwotCQlKYXZhQ29yZS5zZXRPcHRpb25zKG9wdGlvbnMpOwotCi0JCW9wdGlvbnMuY2xlYXIoKTsKLQkJb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09NUElMRVJfUEJfREVQUkVDQVRJT05fSU5fREVQUkVDQVRFRF9DT0RFLCBKYXZhQ29yZS5FTkFCTEVEKTsKLQkJb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSwgIjEwLjAiKTsKLQkJcHJvamVjdEEuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQotCQkvLyBjaGVjayBwcm9qZWN0IEEgY3VzdG9tIG9wdGlvbnMJCQotCQlhc3NlcnRFcXVhbHMoInByb2pBOnVuZXhwZWN0ZWQgY3VzdG9tIHZhbHVlIGZvciBkZXByZWNhdGlvbiBvcHRpb24iLCBKYXZhQ29yZS5FTkFCTEVELCBwcm9qZWN0QS5nZXRPcHRpb25zKGZhbHNlKS5nZXQoSmF2YUNvcmUuQ09NUElMRVJfUEJfREVQUkVDQVRJT05fSU5fREVQUkVDQVRFRF9DT0RFKSk7Ci0JCWFzc2VydEVxdWFscygicHJvakE6dW5leHBlY3RlZCBjdXN0b20gdmFsdWUgZm9yIGNvbXBsaWFuY2Ugb3B0aW9uIiwgIjEwLjAiLCBwcm9qZWN0QS5nZXRPcHRpb25zKGZhbHNlKS5nZXQoSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSkpOwotCQlhc3NlcnRFcXVhbHMoInByb2pBOnVuZXhwZWN0ZWQgaW5oZXJpdGVkIHZhbHVlMSBmb3IgaGlkZGVuLWNhdGNoIG9wdGlvbiIsIG51bGwsIHByb2plY3RBLmdldE9wdGlvbnMoZmFsc2UpLmdldChKYXZhQ29yZS5DT01QSUxFUl9QQl9ISURERU5fQ0FUQ0hfQkxPQ0spKTsKLQkJCi0JCS8vIGNoZWNrIHByb2plY3QgQiBjdXN0b20gb3B0aW9ucwkoc2hvdWxkIGJlIG5vbmUsIGluZGljYXRpbmcgaXQgc2VlcyBnbG9iYWwgb25lcyBvbmx5KQotCQlhc3NlcnRFcXVhbHMoInByb2pCOnVuZXhwZWN0ZWQgY3VzdG9tIHZhbHVlIGZvciBkZXByZWNhdGlvbiBvcHRpb24iLCBudWxsLCBwcm9qZWN0Qi5nZXRPcHRpb25zKGZhbHNlKS5nZXQoSmF2YUNvcmUuQ09NUElMRVJfUEJfREVQUkVDQVRJT05fSU5fREVQUkVDQVRFRF9DT0RFKSk7Ci0JCWFzc2VydEVxdWFscygicHJvakI6dW5leHBlY3RlZCBjdXN0b20gdmFsdWUgZm9yIGNvbXBsaWFuY2Ugb3B0aW9uIiwgbnVsbCwgcHJvamVjdEIuZ2V0T3B0aW9ucyhmYWxzZSkuZ2V0KEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qQjp1bmV4cGVjdGVkIGluaGVyaXRlZCB2YWx1ZSBmb3IgaGlkZGVuLWNhdGNoIG9wdGlvbiIsIG51bGwsIHByb2plY3RCLmdldE9wdGlvbnMoZmFsc2UpLmdldChKYXZhQ29yZS5DT01QSUxFUl9QQl9ISURERU5fQ0FUQ0hfQkxPQ0spKTsKLQotCQkvLyBmbHVzaCBjdXN0b20gb3B0aW9ucyAtIHByb2plY3QgQSBzaG91bGQgcmV2ZXJ0IHRvIGdsb2JhbCBvbmVzCi0JCXByb2plY3RBLnNldE9wdGlvbnMobnVsbCk7IAotCQlhc3NlcnRFcXVhbHMoInByb2pBOnVuZXhwZWN0ZWQgcmV2ZXJ0ZWQgdmFsdWUgZm9yIGRlcHJlY2F0aW9uIG9wdGlvbiIsIG51bGwsIHByb2plY3RBLmdldE9wdGlvbnMoZmFsc2UpLmdldChKYXZhQ29yZS5DT01QSUxFUl9QQl9ERVBSRUNBVElPTl9JTl9ERVBSRUNBVEVEX0NPREUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qQTp1bmV4cGVjdGVkIHJldmVydGVkIHZhbHVlIGZvciBjb21wbGlhbmNlIG9wdGlvbiIsIG51bGwsIHByb2plY3RBLmdldE9wdGlvbnMoZmFsc2UpLmdldChKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFKSk7Ci0JCWFzc2VydEVxdWFscygicHJvakE6dW5leHBlY3RlZCBpbmhlcml0ZWQgdmFsdWUyIGZvciBoaWRkZW4tY2F0Y2ggb3B0aW9uIiwgbnVsbCwgcHJvamVjdEEuZ2V0T3B0aW9ucyhmYWxzZSkuZ2V0KEphdmFDb3JlLkNPTVBJTEVSX1BCX0hJRERFTl9DQVRDSF9CTE9DSykpOwotCi0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJBIik7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiQiIpOwotCX0KLX0KLS8qKgotICogQ3VzdG9tIG9wdGlvbnMgbXVzdCByZXBsYWNlIGV4aXN0aW5nIG9uZXMgY29tcGxldGVseQotICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjYyNTUKLSAqLwotcHVibGljIHZvaWQgdGVzdDA3KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qZWN0QSA9IAotCQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgKLQkJCQkiQSIsIAotCQkJCW5ldyBTdHJpbmdbXSB7fSwgLy8gc291cmNlIGZvbGRlcnMKLQkJCQluZXcgU3RyaW5nW10ge30sIC8vIGxpYiBmb2xkZXJzCi0JCQkJbmV3IFN0cmluZ1tdIHt9LCAvLyBwcm9qZWN0cwotCQkJCSIiKTsKLQkJCQkKLQkJSGFzaHRhYmxlIG9wdGlvbnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPTVBJTEVSX1BCX0RFUFJFQ0FUSU9OX0lOX0RFUFJFQ0FURURfQ09ERSwgSmF2YUNvcmUuRU5BQkxFRCk7Ci0JCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UsICIxMC4wIik7Ci0JCXByb2plY3RBLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0KLQkJLy8gY2hlY2sgcHJvamVjdCBBIGN1c3RvbSBvcHRpb25zCQkKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qQTp1bmV4cGVjdGVkIGN1c3RvbSB2YWx1ZSBmb3IgZGVwcmVjYXRpb24gb3B0aW9uIiwgSmF2YUNvcmUuRU5BQkxFRCwgcHJvamVjdEEuZ2V0T3B0aW9ucyhmYWxzZSkuZ2V0KEphdmFDb3JlLkNPTVBJTEVSX1BCX0RFUFJFQ0FUSU9OX0lOX0RFUFJFQ0FURURfQ09ERSkpOwotCQlhc3NlcnRFcXVhbHMoInByb2pBOnVuZXhwZWN0ZWQgY3VzdG9tIHZhbHVlIGZvciBjb21wbGlhbmNlIG9wdGlvbiIsICIxMC4wIiwgcHJvamVjdEEuZ2V0T3B0aW9ucyhmYWxzZSkuZ2V0KEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qQTp1bmV4cGVjdGVkIGluaGVyaXRlZCB2YWx1ZTEgZm9yIGhpZGRlbi1jYXRjaCBvcHRpb24iLCBudWxsLCBwcm9qZWN0QS5nZXRPcHRpb25zKGZhbHNlKS5nZXQoSmF2YUNvcmUuQ09NUElMRVJfUEJfSElEREVOX0NBVENIX0JMT0NLKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY3VzdG9tIG9wdGlvbnMgdG8gaGF2ZSBvbmUgbGVzcwotCQlvcHRpb25zLmNsZWFyKCk7Ci0JCW9wdGlvbnMucHV0KEphdmFDb3JlLkNPTVBJTEVSX1BCX0RFUFJFQ0FUSU9OX0lOX0RFUFJFQ0FURURfQ09ERSwgSmF2YUNvcmUuRU5BQkxFRCk7Ci0JCXByb2plY3RBLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0JCWFzc2VydEVxdWFscygicHJvakE6dW5leHBlY3RlZCBjdXN0b20gdmFsdWUgZm9yIGRlcHJlY2F0aW9uIG9wdGlvbiIsIEphdmFDb3JlLkVOQUJMRUQsIHByb2plY3RBLmdldE9wdGlvbnMoZmFsc2UpLmdldChKYXZhQ29yZS5DT01QSUxFUl9QQl9ERVBSRUNBVElPTl9JTl9ERVBSRUNBVEVEX0NPREUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qQTp1bmV4cGVjdGVkIGN1c3RvbSB2YWx1ZSBmb3IgY29tcGxpYW5jZSBvcHRpb24iLCBudWxsLCBwcm9qZWN0QS5nZXRPcHRpb25zKGZhbHNlKS5nZXQoSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSkpOwotCQlhc3NlcnRFcXVhbHMoInByb2pBOnVuZXhwZWN0ZWQgaW5oZXJpdGVkIHZhbHVlMSBmb3IgaGlkZGVuLWNhdGNoIG9wdGlvbiIsIG51bGwsIHByb2plY3RBLmdldE9wdGlvbnMoZmFsc2UpLmdldChKYXZhQ29yZS5DT01QSUxFUl9QQl9ISURERU5fQ0FUQ0hfQkxPQ0spKTsKLQotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiQSIpOwotCX0KLX0KLS8qKgotICogRW1wdHkgY3VzdG9tIG9wdGlvbiBtdXN0IG5vdCBiZSBpZ25vcmVkCi0gKiBodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjI1MQotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDgoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IHByb2plY3RBID0gCi0JCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KAotCQkJCSJBIiwgCi0JCQkJbmV3IFN0cmluZ1tdIHt9LCAvLyBzb3VyY2UgZm9sZGVycwotCQkJCW5ldyBTdHJpbmdbXSB7fSwgLy8gbGliIGZvbGRlcnMKLQkJCQluZXcgU3RyaW5nW10ge30sIC8vIHByb2plY3RzCi0JCQkJIiIpOwotCi0JCUhhc2h0YWJsZSBvcHRpb25zID0gbmV3IEhhc2h0YWJsZSgpOwotCQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT01QSUxFUl9UQVNLX1RBR1MsICJUT0RPOiIpOwotCQlKYXZhQ29yZS5zZXRPcHRpb25zKG9wdGlvbnMpOwotCQkKLQotCQkvLyBjaGVjayBwcm9qZWN0IEEgY3VzdG9tIG9wdGlvbnMJCQotCQlhc3NlcnRFcXVhbHMoIjEjcHJvakE6dW5leHBlY3RlZCBjdXN0b20gdmFsdWUgZm9yIHRhc2sgdGFncyBvcHRpb24iLCBudWxsLCBwcm9qZWN0QS5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfVEFTS19UQUdTLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoIjEjcHJvakE6dW5leHBlY3RlZCBjdXN0b20gdmFsdWUgZm9yIGluaGVyaXRlZCB0YXNrIHRhZ3Mgb3B0aW9uIiwgIlRPRE86IiwgcHJvamVjdEEuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX1RBU0tfVEFHUywgdHJ1ZSkpOwotCQlhc3NlcnRFcXVhbHMoIjEjd29ya3NwYWNlOnVuZXhwZWN0ZWQgY3VzdG9tIHZhbHVlIGZvciB0YXNrIHRhZ3Mgb3B0aW9uIiwgIlRPRE86IiwgSmF2YUNvcmUuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX1RBU0tfVEFHUykpOwotCQkKLQkJLy8gY2hhbmdlIGN1c3RvbSBvcHRpb25zIHRvIGhhdmUgb25lIGxlc3MKLQkJb3B0aW9ucy5jbGVhcigpOwotCQlvcHRpb25zLnB1dChKYXZhQ29yZS5DT01QSUxFUl9UQVNLX1RBR1MsICIiKTsKLQkJcHJvamVjdEEuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQkJYXNzZXJ0RXF1YWxzKCIyI3Byb2pBOnVuZXhwZWN0ZWQgY3VzdG9tIHZhbHVlIGZvciB0YXNrIHRhZ3Mgb3B0aW9uIiwgIiIsIHByb2plY3RBLmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9UQVNLX1RBR1MsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygiMiNwcm9qQTp1bmV4cGVjdGVkIGN1c3RvbSB2YWx1ZSBmb3IgaW5oZXJpdGVkIHRhc2sgdGFncyBvcHRpb24iLCAiIiwgcHJvamVjdEEuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX1RBU0tfVEFHUywgdHJ1ZSkpOwotCQlhc3NlcnRFcXVhbHMoIjIjd29ya3NwYWNlOnVuZXhwZWN0ZWQgY3VzdG9tIHZhbHVlIGZvciB0YXNrIHRhZ3Mgb3B0aW9uIiwgIlRPRE86IiwgSmF2YUNvcmUuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX1RBU0tfVEFHUykpOwotCi0JCS8vIGNoYW5nZSBjdXN0b20gb3B0aW9ucyB0byBoYXZlIG9uZSBsZXNzCi0JCW9wdGlvbnMuY2xlYXIoKTsKLQkJb3B0aW9ucy5wdXQoSmF2YUNvcmUuQ09NUElMRVJfVEFTS19UQUdTLCAiQFRPRE8iKTsKLQkJSmF2YUNvcmUuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQkJYXNzZXJ0RXF1YWxzKCIzI3Byb2pBOnVuZXhwZWN0ZWQgY3VzdG9tIHZhbHVlIGZvciB0YXNrIHRhZ3Mgb3B0aW9uIiwgIiIsIHByb2plY3RBLmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9UQVNLX1RBR1MsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygiMyNwcm9qQTp1bmV4cGVjdGVkIGN1c3RvbSB2YWx1ZSBmb3IgaW5oZXJpdGVkIHRhc2sgdGFncyBvcHRpb24iLCAiIiwgcHJvamVjdEEuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX1RBU0tfVEFHUywgdHJ1ZSkpOwotCQlhc3NlcnRFcXVhbHMoIjMjd29ya3NwYWNlOnVuZXhwZWN0ZWQgY3VzdG9tIHZhbHVlIGZvciB0YXNrIHRhZ3Mgb3B0aW9uIiwgIkBUT0RPIiwgSmF2YUNvcmUuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX1RBU0tfVEFHUykpOwotCi0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJBIik7Ci0JfQotfQotCi0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9SZWNvbmNpbGVyVGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9SZWNvbmNpbGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJlYTg5MC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvUmVjb25jaWxlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMudXRpbC5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkRlZmF1bHRQcm9ibGVtOwotCi1wdWJsaWMgY2xhc3MgUmVjb25jaWxlclRlc3RzIGV4dGVuZHMgTW9kaWZ5aW5nUmVzb3VyY2VUZXN0cyB7Ci0JCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgY3U7Ci0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgd29ya2luZ0NvcHk7Ci0JcHJvdGVjdGVkIFByb2JsZW1SZXF1ZXN0b3IgcHJvYmxlbVJlcXVlc3RvcjsKLQkKLQljbGFzcyBQcm9ibGVtUmVxdWVzdG9yIGltcGxlbWVudHMgSVByb2JsZW1SZXF1ZXN0b3IgewotCQlTdHJpbmdCdWZmZXIgcHJvYmxlbXM7Ci0JCWludCBwcm9ibGVtQ291bnQ7Ci0JCXB1YmxpYyBQcm9ibGVtUmVxdWVzdG9yKCkgewotCQkJdGhpcy5pbml0aWFsaXplKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWNjZXB0UHJvYmxlbShJUHJvYmxlbSBwcm9ibGVtKSB7Ci0JCQkJcHJvYmxlbXMuYXBwZW5kKCsrcHJvYmxlbUNvdW50ICsgKHByb2JsZW0uaXNFcnJvcigpID8gIi4gRVJST1IiIDogIi4gV0FSTklORyIpKTsKLQkJCQlwcm9ibGVtcy5hcHBlbmQoIiBpbiAiICsgbmV3IFN0cmluZyhwcm9ibGVtLmdldE9yaWdpbmF0aW5nRmlsZU5hbWUoKSkpOwotCQkJCXRyeSB7Ci0JCQkJCXByb2JsZW1zLmFwcGVuZCgoKERlZmF1bHRQcm9ibGVtKXByb2JsZW0pLmVycm9yUmVwb3J0U291cmNlKChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklDb21waWxhdGlvblVuaXQpKHdvcmtpbmdDb3B5ID09IG51bGwgPyBjdSA6IHdvcmtpbmdDb3B5KSkpOwotCQkJCQlwcm9ibGVtcy5hcHBlbmQoIlxuIik7Ci0JCQkJCXByb2JsZW1zLmFwcGVuZChwcm9ibGVtLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCXByb2JsZW1zLmFwcGVuZCgiXG4iKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBiZWdpblJlcG9ydGluZygpIHsKLQkJCXRoaXMucHJvYmxlbXMuYXBwZW5kKCItLS0tLS0tLS0tXG4iKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlbmRSZXBvcnRpbmcoKSB7Ci0JCQlwcm9ibGVtcy5hcHBlbmQoIi0tLS0tLS0tLS1cbiIpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzQWN0aXZlKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJCXRoaXMucHJvYmxlbXMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQl0aGlzLnByb2JsZW1Db3VudCA9IDA7Ci0JCX0KLQl9Ci0JCi0vKioKLSAqLwotcHVibGljIFJlY29uY2lsZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHJvdGVjdGVkIHZvaWQgYXNzZXJ0UHJvYmxlbXMoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBleHBlY3RlZCkgewotCVN0cmluZyBhY3R1YWwgPSB0aGlzLnByb2JsZW1SZXF1ZXN0b3IucHJvYmxlbXMudG9TdHJpbmcoKTsKLQlpZiAoIWV4cGVjdGVkLmVxdWFscyhhY3R1YWwpKXsKLQkgCVN5c3RlbS5vdXQucHJpbnRsbihVdGlsLmRpc3BsYXlTdHJpbmcoYWN0dWFsLCAyKSk7Ci0JfQotCWFzc2VydEVxdWFscygKLQkJbWVzc2FnZSwKLQkJZXhwZWN0ZWQsCi0JCWFjdHVhbCk7Ci19Ci0vKioKLSAqIFNldHVwIGZvciB0aGUgbmV4dCB0ZXN0LgotICovCi1wdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCXN1cGVyLnNldFVwKCk7Ci0JdGhpcy5jdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiUmVjb25jaWxlciIsICJzcmMiLCAicDEiLCAiWC5qYXZhIik7Ci0JdGhpcy5wcm9ibGVtUmVxdWVzdG9yID0gIG5ldyBQcm9ibGVtUmVxdWVzdG9yKCk7Ci0JdGhpcy53b3JraW5nQ29weSA9IChJQ29tcGlsYXRpb25Vbml0KWN1LmdldFdvcmtpbmdDb3B5KG51bGwsIG51bGwsIHRoaXMucHJvYmxlbVJlcXVlc3Rvcik7Ci0JdGhpcy5wcm9ibGVtUmVxdWVzdG9yLmluaXRpYWxpemUoKTsKLQl0aGlzLnN0YXJ0RGVsdGFzKCk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRVcFN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0Jc3VwZXIuc2V0VXBTdWl0ZSgpOwotCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlJlY29uY2lsZXIiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgbmV3IFN0cmluZ1tdIHsiSkNMX0xJQiJ9LCAiYmluIik7Ci0JdGhpcy5jcmVhdGVGb2xkZXIoIi9SZWNvbmNpbGVyL3NyYy9wMSIpOwotCXRoaXMuY3JlYXRlRm9sZGVyKCIvUmVjb25jaWxlci9zcmMvcDIiKTsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUmVjb25jaWxlci9zcmMvcDEvWC5qYXZhIiwgCi0JCSJwYWNrYWdlIHAxO1xuIiArCi0JCSJpbXBvcnQgcDIuKjtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iCi0JKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlyZXR1cm4gbmV3IFN1aXRlKFJlY29uY2lsZXJUZXN0cy5jbGFzcyk7Ci19Ci0vKioKLSAqIENsZWFudXAgYWZ0ZXIgdGhlIHByZXZpb3VzIHRlc3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JaWYgKHRoaXMud29ya2luZ0NvcHkgIT0gbnVsbCkgewotCQl0aGlzLndvcmtpbmdDb3B5LmRlc3Ryb3koKTsKLQl9Ci0JdGhpcy5zdG9wRGVsdGFzKCk7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLXB1YmxpYyB2b2lkIHRlYXJEb3duU3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQl0aGlzLmRlbGV0ZVByb2plY3QoIlJlY29uY2lsZXIiKTsKLQlzdXBlci50ZWFyRG93blN1aXRlKCk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCB0aGUgcmVjb25jaWxlciBoYW5kbGVzIGR1cGxpY2F0ZSBtZW1iZXJzIGNvcnJlY3RseS4KLSAqLwotcHVibGljIHZvaWQgdGVzdEFkZER1cGxpY2F0ZU1lbWJlcigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCXRoaXMud29ya2luZ0NvcHkuZ2V0QnVmZmVyKCkuc2V0Q29udGVudHMoCi0JCSJwYWNrYWdlIHAxO1xuIiArCi0JCSJpbXBvcnQgcDIuKjtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgcHVibGljIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifSIpOwotCXRoaXMud29ya2luZ0NvcHkucmVjb25jaWxlKCk7Ci0JYXNzZXJ0RGVsdGFzKAotCQkiVW5leHBlY3RlZCBkZWx0YSIsIAotCQkiWFsqXToge0NISUxEUkVOIHwgRklORSBHUkFJTkVEfVxuIiArCi0JCSIJZm9vWytdOiB7fSIKLQkpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgdGhlIHJlY29uY2lsZXIgcmVjb25jaWxlcyB0aGUgbmV3IGNvbnRlbnRzIHdpdGggdGhlIGN1cnJlbnQKLSAqIGNvbnRlbnRzLCB1cGRhdGluZyB0aGUgc3RydWN0dXJlIG9mIHRoaXMgcmVjb25jaWxlcidzIGNvbXBpbGF0aW9uCi0gKiB1bml0LCBhbmQgZmlyZXMgdGhlIEphdmEgZWxlbWVudCBkZWx0YSBmb3IgdGhlIHN0cnVjdHVyYWwgY2hhbmdlcwotICogb2YgdGhlIGFkZGl0aW9uIG9mIGEgZmllbGQgYW5kIGEgY29uc3RydWN0b3IuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RBZGRGaWVsZEFuZENvbnN0cnVjdG9yKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JdGhpcy53b3JraW5nQ29weS5nZXRCdWZmZXIoKS5zZXRDb250ZW50cygKLQkJInBhY2thZ2UgcDE7XG4iICsKLQkJImltcG9ydCBwMi4qO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgaW50IGk7XG4iICsKLQkJIiAgWChpbnQgaSkge1xuIiArCi0JCSIgICAgdGhpcy5pID0gaTtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgcHVibGljIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifSIpOwotCXRoaXMud29ya2luZ0NvcHkucmVjb25jaWxlKCk7Ci0JYXNzZXJ0RGVsdGFzKAotCQkiVW5leHBlY3RlZCBkZWx0YSIsIAotCQkiWFsqXToge0NISUxEUkVOIHwgRklORSBHUkFJTkVEfVxuIiArCi0JCSIJaVsrXToge31cbiIgKwotCQkiCVhbK106IHt9IgotCSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCB0aGUgcmVjb25jaWxlciByZWNvbmNpbGVzIHRoZSBuZXcgY29udGVudHMgd2l0aCB0aGUgY3VycmVudAotICogY29udGVudHMsIHVwZGF0aW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhpcyByZWNvbmNpbGVyJ3MgY29tcGlsYXRpb24KLSAqIHVuaXQsIGFuZCBmaXJlcyB0aGUgSmF2YSBlbGVtZW50IGRlbHRhIGZvciB0aGUgc3RydWN0dXJhbCBjaGFuZ2VzCi0gKiBvZiB0aGUgYWRkaXRpb24gb2YgYSBmaWVsZCBhbmQgYSBjb25zdHJ1Y3Rvci4KLSAqLwotcHVibGljIHZvaWQgdGVzdEFkZEltcG9ydHMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQl0aGlzLndvcmtpbmdDb3B5LmdldEJ1ZmZlcigpLnNldENvbnRlbnRzKAotCQkicGFja2FnZSBwMTtcbiIgKwotCQkiaW1wb3J0IHAyLio7XG4iICsKLQkJImltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qO1xuIiArCi0JCSJpbXBvcnQgamF2YS51dGlsLlZlY3RvcjtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iKTsKLQl0aGlzLndvcmtpbmdDb3B5LnJlY29uY2lsZSgpOwotCWFzc2VydERlbHRhcygKLQkJIlVuZXhwZWN0ZWQgZGVsdGEiLCAKLQkJIltpbXBvcnQgY29udGFpbmVyXVsqXToge0NISUxEUkVOIHwgRklORSBHUkFJTkVEfVxuIiArCi0JCSIJaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LipbK106IHt9XG4iICsKLQkJIglpbXBvcnQgamF2YS51dGlsLlZlY3RvclsrXToge30iCi0JKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IHRoZSByZWNvbmNpbGVyIHJlY29uY2lsZXMgdGhlIG5ldyBjb250ZW50cyB3aXRoIHRoZSBjdXJyZW50Ci0gKiBjb250ZW50cywgdXBkYXRpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGlzIHJlY29uY2lsZXIncyBjb21waWxhdGlvbgotICogdW5pdCwgYW5kIGZpcmVzIHRoZSBKYXZhIGVsZW1lbnQgZGVsdGEgZm9yIHRoZSBzdHJ1Y3R1cmFsIGNoYW5nZXMKLSAqIG9mIHRoZSBhZGRpdGlvbiBvZiBhIG1ldGhvZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdEFkZE1ldGhvZDEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQl0aGlzLndvcmtpbmdDb3B5LmdldEJ1ZmZlcigpLnNldENvbnRlbnRzKAotCQkicGFja2FnZSBwMTtcbiIgKwotCQkiaW1wb3J0IHAyLio7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHB1YmxpYyB2b2lkIGJhcigpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iKTsKLQl0aGlzLndvcmtpbmdDb3B5LnJlY29uY2lsZSgpOwotCWFzc2VydERlbHRhcygKLQkJIlVuZXhwZWN0ZWQgZGVsdGEiLCAKLQkJIlhbKl06IHtDSElMRFJFTiB8IEZJTkUgR1JBSU5FRH1cbiIgKwotCQkiCWJhclsrXToge30iCi0JKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IHRoZSByZWNvbmNpbGVyIHJlY29uY2lsZXMgdGhlIG5ldyBjb250ZW50cyB3aXRoIHRoZSBjdXJyZW50Ci0gKiBjb250ZW50cyx1cGRhdGluZyB0aGUgc3RydWN0dXJlIG9mIHRoaXMgcmVjb25jaWxlcidzIGNvbXBpbGF0aW9uCi0gKiB1bml0LCBhbmQgZmlyZXMgdGhlIEphdmEgZWxlbWVudCBkZWx0YSBmb3IgdGhlIHN0cnVjdHVyYWwgY2hhbmdlcwotICogb2YgdGhlIGFkZGl0aW9uIG9mIGEgcG9ydGlvbiBvZiBhIG5ldyBtZXRob2QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RBZGRQYXJ0aWFsTWV0aG9kMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCXRoaXMud29ya2luZ0NvcHkuZ2V0QnVmZmVyKCkuc2V0Q29udGVudHMoCi0JCSJwYWNrYWdlIHAxO1xuIiArCi0JCSJpbXBvcnQgcDIuKjtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyB2b2lkIHNvbWUoKVxuIiArCi0JCSIgIHB1YmxpYyB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iKTsKLQl0aGlzLndvcmtpbmdDb3B5LnJlY29uY2lsZSgpOwotCWFzc2VydERlbHRhcygKLQkJIlVuZXhwZWN0ZWQgZGVsdGEiLCAKLQkJIlhbKl06IHtDSElMRFJFTiB8IEZJTkUgR1JBSU5FRH1cbiIgKwotCQkiCXNvbWVbK106IHt9IgotCSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCB0aGUgcmVjb25jaWxlciByZWNvbmNpbGVzIHRoZSBuZXcgY29udGVudHMgd2l0aCB0aGUgY3VycmVudAotICogY29udGVudHMsdXBkYXRpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGlzIHJlY29uY2lsZXIncyBjb21waWxhdGlvbgotICogdW5pdCwgYW5kIGZpcmVzIHRoZSBKYXZhIGVsZW1lbnQgZGVsdGEgZm9yIHRoZSBzdHJ1Y3R1cmFsIGNoYW5nZXMKLSAqIG9mIHRoZSBhZGRpdGlvbiBvZiBhIHBvcnRpb24gb2YgYSBuZXcgbWV0aG9kLiAgRW5zdXJlcyB0aGF0IHdoZW4gYQotICogc2Vjb25kIHBhcnQgaXMgYWRkZWQgdG8gdGhlIG5ldyBtZXRob2Qgbm8gc3RydWN0dXJhbCBjaGFuZ2VzIGFyZSByZWNvZ25pemVkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0QWRkUGFydGlhbE1ldGhvZDFhbmQyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JLy8gQWRkIHBhcnRpYWwgbWV0aG9kIGJlZm9yZSBmb28KLQl0aGlzLndvcmtpbmdDb3B5LmdldEJ1ZmZlcigpLnNldENvbnRlbnRzKAotCQkicGFja2FnZSBwMTtcbiIgKwotCQkiaW1wb3J0IHAyLio7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgdm9pZCBzb21lKClcbiIgKwotCQkiICBwdWJsaWMgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9Iik7Ci0JdGhpcy53b3JraW5nQ29weS5yZWNvbmNpbGUoKTsKLQkKLQkvLyBBZGQgeyBvbiBwYXJ0aWFsIG1ldGhvZAotCXRoaXMuY2xlYXJEZWx0YXMoKTsKLQl0aGlzLndvcmtpbmdDb3B5LmdldEJ1ZmZlcigpLnNldENvbnRlbnRzKAotCQkicGFja2FnZSBwMTtcbiIgKwotCQkiaW1wb3J0IHAyLio7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgdm9pZCBzb21lKCkge1xuIiArCi0JCSIgIHB1YmxpYyB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iKTsKLQl0aGlzLndvcmtpbmdDb3B5LnJlY29uY2lsZSgpOwotCWFzc2VydERlbHRhcygKLQkJIlVuZXhwZWN0ZWQgZGVsdGEiLCAKLQkJIiIKLQkpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgdGhlIHJlY29uY2lsZXIgcmVjb25jaWxlcyB0aGUgbmV3IGNvbnRlbnRzIHdpdGggdGhlIGN1cnJlbnQKLSAqIGNvbnRlbnRzLHVwZGF0aW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhpcyByZWNvbmNpbGVyJ3MgY29tcGlsYXRpb24KLSAqIHVuaXQsIGFuZCBmaXJlcyB0aGUgSmF2YSBlbGVtZW50IGRlbHRhcyBmb3IgdGhlIHN0cnVjdHVyYWwgY2hhbmdlcwotICogb2YgYSBtZXRob2QgdmlzaWJpbGl0eSBjaGFuZ2UuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VNZXRob2RWaXNpYmlsaXR5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JdGhpcy53b3JraW5nQ29weS5nZXRCdWZmZXIoKS5zZXRDb250ZW50cygKLQkJInBhY2thZ2UgcDE7XG4iICsKLQkJImltcG9ydCBwMi4qO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHJpdmF0ZSB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iKTsKLQl0aGlzLndvcmtpbmdDb3B5LnJlY29uY2lsZSgpOwotCWFzc2VydERlbHRhcygKLQkJIlVuZXhwZWN0ZWQgZGVsdGEiLCAKLQkJIlhbKl06IHtDSElMRFJFTiB8IEZJTkUgR1JBSU5FRH1cbiIgKwotCQkiCWZvb1sqXToge01PRElGSUVSUyBDSEFOR0VEfSIKLQkpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSByZWZlcmVuY2UgdG8gYSBjb25zdGFudCB3aXRoIHR5cGUgbWlzbWF0Y2ggZG9lc24ndCBzaG93IGFuIGVycm9yLgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDE3MTA0IENvbXBpbGVyIGRvZXMgbm90IGNvbXBsYWluIGJ1dCAiUXVpY2sgRml4IiA/Pz8gY29tcGxhaW5zKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29uc3RhbnRSZWZlcmVuY2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9SZWNvbmNpbGVyL3NyYy9wMS9PUy5qYXZhIiwKLQkJCSJwYWNrYWdlIHAxO1xuIiArCi0JCQkicHVibGljIGNsYXNzIE9TIHtcbiIgKwotCQkJIglwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05TVCA9IDIzICogMTAyNDtcbiIgKwotCQkJIn0iKTsKLQkJdGhpcy53b3JraW5nQ29weS5nZXRCdWZmZXIoKS5zZXRDb250ZW50cygKLQkJCSJwYWNrYWdlIHAxO1xuIiArCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkiCXB1YmxpYyBzaG9ydCBjO1xuIiArCi0JCQkiCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3VtZW50cykge1xuIiArCi0JCQkiCQlzaG9ydCBjID0gMTtcbiIgKwotCQkJIgkJc3dpdGNoIChjKSB7XG4iICsKLQkJCSIJCQljYXNlIE9TLkNPTlNUOiByZXR1cm47XG4iICsKLQkJCSIJCX1cbiIgKwotCQkJIgl9XG4iICsKLQkJCSJ9Iik7Ci0JCXRoaXMud29ya2luZ0NvcHkucmVjb25jaWxlKCk7Ci0JCWFzc2VydFByb2JsZW1zKAotCQkJIlVuZXhwZWN0ZWQgcHJvYmxlbXMiLAotCQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJCSItLS0tLS0tLS0tXG4iCi0JCSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVGaWxlKCIvUmVjb25jaWxlci9zcmMvcDEvT1MuamF2YSIpOwotCX0KLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IHRoZSByZWNvbmNpbGVyIHJlY29uY2lsZXMgdGhlIG5ldyBjb250ZW50cyB3aXRoIHRoZSBjdXJyZW50Ci0gKiBjb250ZW50cywgdXBkYXRpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGlzIHJlY29uY2lsZXIncyBjb21waWxhdGlvbgotICogdW5pdCwgYW5kIGZpcmVzIHRoZSBKYXZhIGVsZW1lbnQgZGVsdGFzIGZvciB0aGUgc3RydWN0dXJhbCBjaGFuZ2VzCi0gKiBvZiBhIG1ldGhvZCBiZWluZyBkZWxldGVkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0RGVsZXRlTWV0aG9kMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCXRoaXMud29ya2luZ0NvcHkuZ2V0QnVmZmVyKCkuc2V0Q29udGVudHMoCi0JCSJwYWNrYWdlIHAxO1xuIiArCi0JCSJpbXBvcnQgcDIuKjtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSJ9Iik7Ci0JdGhpcy53b3JraW5nQ29weS5yZWNvbmNpbGUoKTsKLQlhc3NlcnREZWx0YXMoCi0JCSJVbmV4cGVjdGVkIGRlbHRhIiwgCi0JCSJYWypdOiB7Q0hJTERSRU4gfCBGSU5FIEdSQUlORUR9XG4iICsKLQkJIglmb29bLV06IHt9IgotCSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCB0aGUgcmVjb25jaWxlciByZWNvbmNpbGVzIHRoZSBuZXcgY29udGVudHMgd2l0aCB0aGUgY3VycmVudAotICogY29udGVudHMsIHVwZGF0aW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhpcyByZWNvbmNpbGVyJ3MgY29tcGlsYXRpb24KLSAqIHVuaXQsIGFuZCBmaXJlcyB0aGUgSmF2YSBlbGVtZW50IGRlbHRhcyBmb3IgdGhlIHN0cnVjdHVyYWwgY2hhbmdlcwotICogb2YgdHdvIG1ldGhvZHMgYmVpbmcgZGVsZXRlZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdERlbGV0ZVR3b01ldGhvZHMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkvLyBjcmVhdGUgMiBtZXRob2RzCi0JdGhpcy53b3JraW5nQ29weS5nZXRCdWZmZXIoKS5zZXRDb250ZW50cygKLQkJInBhY2thZ2UgcDE7XG4iICsKLQkJImltcG9ydCBwMi4qO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICBwdWJsaWMgdm9pZCBiYXIoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9Iik7Ci0JdGhpcy53b3JraW5nQ29weS5yZWNvbmNpbGUoKTsKLQkKLQkvLyBkZWxldGUgdGhlIDIgbWV0aG9kcwotCXRoaXMuY2xlYXJEZWx0YXMoKTsKLQl0aGlzLndvcmtpbmdDb3B5LmdldEJ1ZmZlcigpLnNldENvbnRlbnRzKAotCQkicGFja2FnZSBwMTtcbiIgKwotCQkiaW1wb3J0IHAyLio7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkifSIpOwotCXRoaXMud29ya2luZ0NvcHkucmVjb25jaWxlKCk7Ci0JYXNzZXJ0RGVsdGFzKAotCQkiVW5leHBlY3RlZCBkZWx0YSIsIAotCQkiWFsqXToge0NISUxEUkVOIHwgRklORSBHUkFJTkVEfVxuIiArCi0JCSIJYmFyWy1dOiB7fVxuIiArCi0JCSIJZm9vWy1dOiB7fSIKLQkpOwotfQotLyoqCi0gKiBTdGFydCB3aXRoIG5vIGltcG9ydHMsIGFkZCBhbiBpbXBvcnQsIGFuZCB0aGVuIGFwcGVuZCB0byB0aGUgaW1wb3J0IG5hbWUuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHcm93SW1wb3J0cygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCS8vIG5vIGltcG9ydHMKLQl0aGlzLndvcmtpbmdDb3B5LmdldEJ1ZmZlcigpLnNldENvbnRlbnRzKAotCQkicGFja2FnZSBwMTtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSJ9Iik7Ci0JdGhpcy53b3JraW5nQ29weS5yZWNvbmNpbGUoKTsKLQkKLQkvLyBhZGQgYW4gaW1wb3J0Ci0JdGhpcy5jbGVhckRlbHRhcygpOwotCXRoaXMud29ya2luZ0NvcHkuZ2V0QnVmZmVyKCkuc2V0Q29udGVudHMoCi0JCSJwYWNrYWdlIHAxO1xuIiArCi0JCSJpbXBvcnQgcFxuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIn0iKTsKLQl0aGlzLndvcmtpbmdDb3B5LnJlY29uY2lsZSgpOwotCWFzc2VydERlbHRhcygKLQkJIlVuZXhwZWN0ZWQgZGVsdGEiLCAKLQkJIltpbXBvcnQgY29udGFpbmVyXVsrXToge30iCi0JKTsKLQkJCi0JLy8gYXBwZW5kIHRvIGltcG9ydCBuYW1lCi0JdGhpcy5jbGVhckRlbHRhcygpOwotCXRoaXMud29ya2luZ0NvcHkuZ2V0QnVmZmVyKCkuc2V0Q29udGVudHMoCi0JCSJwYWNrYWdlIHAxO1xuIiArCi0JCSJpbXBvcnQgcDJcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSJ9Iik7Ci0JdGhpcy53b3JraW5nQ29weS5yZWNvbmNpbGUoKTsKLQlhc3NlcnREZWx0YXMoCi0JCSJVbmV4cGVjdGVkIGRlbHRhIiwgCi0JCSJbaW1wb3J0IGNvbnRhaW5lcl1bKl06IHtDSElMRFJFTiB8IEZJTkUgR1JBSU5FRH1cbiIgKwotCQkiCWltcG9ydCBwMlsrXToge31cbiIgKwotCQkiCWltcG9ydCBwWy1dOiB7fSIKLQkpOwotfQotLyoqCi0gKiBJbnRyb2R1Y2VzIGEgc3ludGF4IGVycm9yIGluIHRoZSBtb2RpZmllcnMgb2YgYSBtZXRob2QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNZXRob2RXaXRoRXJyb3IoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkvLyBJbnRyb2R1Y2Ugc3ludGF4IGVycm9yCi0JdGhpcy53b3JraW5nQ29weS5nZXRCdWZmZXIoKS5zZXRDb250ZW50cygKLQkJInBhY2thZ2UgcDE7XG4iICsKLQkJImltcG9ydCBwMi4qO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljLnZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifSIpOwotCXRoaXMud29ya2luZ0NvcHkucmVjb25jaWxlKCk7Ci0JYXNzZXJ0RGVsdGFzKAotCQkiVW5leHBlY3RlZCBkZWx0YSBhZnRlciBzeW50YXggZXJyb3IiLCAKLQkJIlhbKl06IHtDSElMRFJFTiB8IEZJTkUgR1JBSU5FRH1cbiIgKwotCQkiCWZvb1sqXToge01PRElGSUVSUyBDSEFOR0VEfSIKLQkpOwotCWFzc2VydFByb2JsZW1zKAotCQkiVW5leHBlY3RlZCBwcm9ibGVtcyIsCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNClcbiIgKyAKLQkJIglwdWJsaWMudm9pZCBmb28oKSB7XG4iICsgCi0JCSIJICAgICAgXlxuIiArIAotCQkiU3ludGF4IGVycm9yIG9uIHRva2VuIFwiLlwiLCBcImJvb2xlYW5cIiwgXCJ2b2lkXCIsIFwiYnl0ZVwiLCBcInNob3J0XCIsIFwiaW50XCIsIFwibG9uZ1wiLCBcImNoYXJcIiwgXCJmbG9hdFwiLCBcImRvdWJsZVwiLCBcIklkZW50aWZpZXJcIiwgXCJpbnRlcmZhY2VcIiwgXCJjbGFzc1wiIGV4cGVjdGVkXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iCi0JKTsKLQotCS8vIEZpeCB0aGUgc3ludGF4IGVycm9yCi0JdGhpcy5jbGVhckRlbHRhcygpOwotCXRoaXMucHJvYmxlbVJlcXVlc3Rvci5pbml0aWFsaXplKCk7Ci0JdGhpcy53b3JraW5nQ29weS5nZXRCdWZmZXIoKS5zZXRDb250ZW50cygKLQkJInBhY2thZ2UgcDE7XG4iICsKLQkJImltcG9ydCBwMi4qO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifSIpOwotCXRoaXMud29ya2luZ0NvcHkucmVjb25jaWxlKCk7Ci0JYXNzZXJ0RGVsdGFzKAotCQkiVW5leHBlY3RlZCBkZWx0YSBhZnRlciBmaXhpbmcgc3ludGF4IGVycm9yIiwgCi0JCSJYWypdOiB7Q0hJTERSRU4gfCBGSU5FIEdSQUlORUR9XG4iICsKLQkJIglmb29bKl06IHtNT0RJRklFUlMgQ0hBTkdFRH0iCi0JKTsKLQlhc3NlcnRQcm9ibGVtcygKLQkJIlVuZXhwZWN0ZWQgcHJvYmxlbXMiLAotCQkiLS0tLS0tLS0tLVxuIiArIAotCQkiMS4gV0FSTklORyBpbiBYLmphdmEgKGF0IGxpbmUgMilcbiIgKyAKLQkJIglpbXBvcnQgcDIuKjtcbiIgKyAKLQkJIgkgICAgICAgXl5cbiIgKyAKLQkJIlRoZSBpbXBvcnQgcDIgaXMgbmV2ZXIgdXNlZFxuIiArIAotCQkiLS0tLS0tLS0tLVxuIgotCSk7Ci19Ci0vKioKLSAqIFRlc3QgcmVjb25jaWxlIGZvcmNlIGZsYWcKLSAqLwotcHVibGljIHZvaWQgdGVzdE1ldGhvZFdpdGhFcnJvcjIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLndvcmtpbmdDb3B5LmdldEJ1ZmZlcigpLnNldENvbnRlbnRzKAotCQkicGFja2FnZSBwMTtcbiIgKwotCQkiaW1wb3J0IHAyLio7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMudm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9Iik7Ci0JdGhpcy53b3JraW5nQ29weS5yZWNvbmNpbGUoKTsKLQl0aGlzLnByb2JsZW1SZXF1ZXN0b3IuaW5pdGlhbGl6ZSgpOwotCi0JLy8gdXNlIGZvcmNlIGZsYWcgdG8gcmVmcmVzaCBwcm9ibGVtcwkJCQotCXRoaXMud29ya2luZ0NvcHkucmVjb25jaWxlKHRydWUsIG51bGwpOwotCWFzc2VydFByb2JsZW1zKAotCQkiVW5leHBlY3RlZCBwcm9ibGVtcyIsCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNClcbiIgKyAKLQkJIglwdWJsaWMudm9pZCBmb28oKSB7XG4iICsgCi0JCSIJICAgICAgXlxuIiArIAotCQkiU3ludGF4IGVycm9yIG9uIHRva2VuIFwiLlwiLCBcImJvb2xlYW5cIiwgXCJ2b2lkXCIsIFwiYnl0ZVwiLCBcInNob3J0XCIsIFwiaW50XCIsIFwibG9uZ1wiLCBcImNoYXJcIiwgXCJmbG9hdFwiLCBcImRvdWJsZVwiLCBcIklkZW50aWZpZXJcIiwgXCJpbnRlcmZhY2VcIiwgXCJjbGFzc1wiIGV4cGVjdGVkXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iCi0JKTsKLX0KLQotLyoqCi0gKiBUZXN0IHJlY29uY2lsZSBmb3JjZSBmbGFnIG9mZgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TWV0aG9kV2l0aEVycm9yMygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCXRoaXMud29ya2luZ0NvcHkuZ2V0QnVmZmVyKCkuc2V0Q29udGVudHMoCi0JCSJwYWNrYWdlIHAxO1xuIiArCi0JCSJpbXBvcnQgcDIuKjtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYy52b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iKTsKLQl0aGlzLndvcmtpbmdDb3B5LnJlY29uY2lsZSgpOwotCXRoaXMucHJvYmxlbVJlcXVlc3Rvci5pbml0aWFsaXplKCk7Ci0KLQkvLyB1c2UgZm9yY2UgZmxhZyB0byByZWZyZXNoIHByb2JsZW1zCQkJCi0JdGhpcy53b3JraW5nQ29weS5yZWNvbmNpbGUoZmFsc2UsIG51bGwpOwotCWFzc2VydFByb2JsZW1zKAotCQkiVW5leHBlY3RlZCBwcm9ibGVtcyIsCi0JCSIiCi0JKTsKLX0KLS8qKgotICogVGVzdCByZWNvbmNpbGUgZm9yY2UgZmxhZyArIGNhbmNlbAotICovCi1wdWJsaWMgdm9pZCB0ZXN0TWV0aG9kV2l0aEVycm9yNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JZmluYWwgSVByb2dyZXNzTW9uaXRvciBteU1vbml0b3IgPSBuZXcgSVByb2dyZXNzTW9uaXRvcigpIHsKLQkJYm9vbGVhbiBpc0NhbmNlbGVkID0gZmFsc2U7Ci0JCXB1YmxpYyB2b2lkIGJlZ2luVGFzayhTdHJpbmcgbmFtZSwgaW50IHRvdGFsV29yaykge30KLQkJcHVibGljIHZvaWQgZG9uZSgpIHt9Ci0JCXB1YmxpYyB2b2lkIGludGVybmFsV29ya2VkKGRvdWJsZSB3b3JrKSB7fQotCQlwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGVkKCkgewotCQkJcmV0dXJuIHRoaXMuaXNDYW5jZWxlZDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRDYW5jZWxlZChib29sZWFuIHZhbHVlKSB7Ci0JCQl0aGlzLmlzQ2FuY2VsZWQgPSB2YWx1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRUYXNrTmFtZShTdHJpbmcgbmFtZSkge30KLQkJcHVibGljIHZvaWQgc3ViVGFzayhTdHJpbmcgbmFtZSkge30KLQkJcHVibGljIHZvaWQgd29ya2VkKGludCB3b3JrKSB7fQotCX07Ci0KLQljbGFzcyBDYW5jZWxpbmdQcm9ibGVtUmVxdWVzdG9yIGV4dGVuZHMgUHJvYmxlbVJlcXVlc3RvciB7Ci0JCWJvb2xlYW4gaXNDYW5jZWxpbmcgPSBmYWxzZTsKLQkJcHVibGljIHZvaWQgYWNjZXB0UHJvYmxlbShJUHJvYmxlbSBwcm9ibGVtKSB7Ci0JCQlpZiAoaXNDYW5jZWxpbmcpIG15TW9uaXRvci5zZXRDYW5jZWxlZCh0cnVlKTsgLy8gYXV0by1jYW5jZWwgb24gZmlyc3QgcHJvYmxlbQotCQkJc3VwZXIuYWNjZXB0UHJvYmxlbShwcm9ibGVtKTsKLQkJfQkJCi0JfTsKLQlDYW5jZWxpbmdQcm9ibGVtUmVxdWVzdG9yIG15UGJSZXF1ZXN0b3IgPSBuZXcgQ2FuY2VsaW5nUHJvYmxlbVJlcXVlc3RvcigpOwotCQotCXRoaXMud29ya2luZ0NvcHkuZGVzdHJveSgpOwotCUlDb21waWxhdGlvblVuaXQgeCA9IGdldENvbXBpbGF0aW9uVW5pdCgiUmVjb25jaWxlciIsICJzcmMiLCAicDEiLCAiWC5qYXZhIik7Ci0JdGhpcy5wcm9ibGVtUmVxdWVzdG9yID0gbXlQYlJlcXVlc3RvcjsKLQl0aGlzLndvcmtpbmdDb3B5ID0gKElDb21waWxhdGlvblVuaXQpIHguZ2V0V29ya2luZ0NvcHkobnVsbCwgbnVsbCx0aGlzLnByb2JsZW1SZXF1ZXN0b3IpOwotCQkJCQkJCQkJCQkJCQotCXRoaXMud29ya2luZ0NvcHkuZ2V0QnVmZmVyKCkuc2V0Q29udGVudHMoCi0JCSJwYWNrYWdlIHAxO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIglab3JrIGY7CVxuIisKLQkJIgl2b2lkIGZvbyhab3JrIHope1xuIisKLQkJIgl9XG4iKwotCQkifQlcbiIpOwotCi0JdGhpcy53b3JraW5nQ29weS5yZWNvbmNpbGUoKTsKLQl0aGlzLnByb2JsZW1SZXF1ZXN0b3IuaW5pdGlhbGl6ZSgpOwotCi0JLy8gdXNlIGZvcmNlIGZsYWcgdG8gcmVmcmVzaCBwcm9ibGVtcwkJCQotCW15UGJSZXF1ZXN0b3IuaXNDYW5jZWxpbmcgPSB0cnVlOwotCXRoaXMud29ya2luZ0NvcHkucmVjb25jaWxlKHRydWUsIG15TW9uaXRvcik7Ci0JYXNzZXJ0UHJvYmxlbXMoCi0JCSJVbmV4cGVjdGVkIHByb2JsZW1zIiwKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSAzKVxuIiArIAotCQkiCVpvcmsgZjsJXG4iICsgCi0JCSIJXl5eXlxuIiArIAotCQkiWm9yayBjYW5ub3QgYmUgcmVzb2x2ZWQgKG9yIGlzIG5vdCBhIHZhbGlkIHR5cGUpIGZvciB0aGUgZmllbGQgWC5mXG4iICsgCi0JCSItLS0tLS0tLS0tXG4iCi0JKTsKLX0KLQotLyoqCi0gKiBUZXN0IHJlY29uY2lsZSBmb3JjZSBmbGFnIG9mZgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TWV0aG9kV2l0aEVycm9yNSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlRm9sZGVyKCIvUmVjb25jaWxlci9zcmMvdGVzdHMiKTsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9SZWNvbmNpbGVyL3NyYy90ZXN0cy9BYnN0cmFjdFNlYXJjaGFibGVTb3VyY2UuamF2YSIsIAotCQkJInBhY2thZ2UgdGVzdHM7CVxuIisKLQkJCSJhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNlYXJjaGFibGVTb3VyY2UgZXh0ZW5kcyBBYnN0cmFjdFNvdXJjZSBpbXBsZW1lbnRzIFNlYXJjaGFibGVTb3VyY2UgewlcbiIrCi0JCQkiCWFic3RyYWN0IGludCBpbmRleE9mSW1wbChsb25nIHZhbHVlKTsJXG4iKwotCQkJIglwdWJsaWMgZmluYWwgaW50IGluZGV4T2YobG9uZyB2YWx1ZSkgewlcbiIrCi0JCQkiCQlyZXR1cm4gaW5kZXhPZkltcGwodmFsdWUpOwlcbiIrCi0JCQkiCX0JXG4iKwotCQkJIn0JXG4iKTsKLQkKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9SZWNvbmNpbGVyL3NyYy90ZXN0cy9Tb3VyY2UuamF2YSIsIAotCQkJInBhY2thZ2UgdGVzdHM7CVxuIisKLQkJCSJpbnRlcmZhY2UgU291cmNlIHsJXG4iKwotCQkJIglsb25nIGdldFZhbHVlKGludCBpbmRleCk7CVxuIisKLQkJCSIJaW50IHNpemUoKTsJXG4iKwotCQkJIn0JXG4iKTsKLQkKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9SZWNvbmNpbGVyL3NyYy90ZXN0cy9BYnN0cmFjdFNvdXJjZS5qYXZhIiwgCi0JCQkicGFja2FnZSB0ZXN0czsJXG4iKwotCQkJImFic3RyYWN0IGNsYXNzIEFic3RyYWN0U291cmNlIGltcGxlbWVudHMgU291cmNlIHsJXG4iKwotCQkJIglBYnN0cmFjdFNvdXJjZSgpIHsJXG4iKwotCQkJIgl9CVxuIisKLQkJCSIJdm9pZCBpbnZhbGlkYXRlKCkgewlcbiIrCi0JCQkiCX0JXG4iKwotCQkJIglhYnN0cmFjdCBsb25nIGdldFZhbHVlSW1wbChpbnQgaW5kZXgpOwlcbiIrCi0JCQkiCWFic3RyYWN0IGludCBzaXplSW1wbCgpOwlcbiIrCi0JCQkiCXB1YmxpYyBmaW5hbCBsb25nIGdldFZhbHVlKGludCBpbmRleCkgewlcbiIrCi0JCQkiCQlyZXR1cm4gMDsJXG4iKwotCQkJIgl9CVxuIisKLQkJCSIJcHVibGljIGZpbmFsIGludCBzaXplKCkgewlcbiIrCi0JCQkiCQlyZXR1cm4gMDsJXG4iKwotCQkJIgl9CVxuIisKLQkJCSJ9CVxuIik7Ci0JCi0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUmVjb25jaWxlci9zcmMvdGVzdHMvU2VhcmNoYWJsZVNvdXJjZS5qYXZhIiwgCi0JCQkicGFja2FnZSB0ZXN0czsJXG4iKwotCQkJImludGVyZmFjZSBTZWFyY2hhYmxlU291cmNlIGV4dGVuZHMgU291cmNlIHsJXG4iKwotCQkJIglpbnQgaW5kZXhPZihsb25nIHZhbHVlKTsJXG4iKwotCQkJIn0JXG4iKTsKLQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIlJlY29uY2lsZXIiLCAic3JjIiwgInRlc3RzIiwgIkFic3RyYWN0U2VhcmNoYWJsZVNvdXJjZS5qYXZhIik7Ci0JCVByb2JsZW1SZXF1ZXN0b3IgcGJSZXEgPSAgbmV3IFByb2JsZW1SZXF1ZXN0b3IoKTsKLQkJSVdvcmtpbmdDb3B5IHdjID0gKElDb21waWxhdGlvblVuaXQpY29tcGlsYXRpb25Vbml0LmdldFdvcmtpbmdDb3B5KG51bGwsIG51bGwsIHBiUmVxKTsKLQkJcGJSZXEuaW5pdGlhbGl6ZSgpOwotCQl0aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCXdjLnJlY29uY2lsZSh0cnVlLCBudWxsKTsKLQkJU3RyaW5nIGFjdHVhbCA9IHBiUmVxLnByb2JsZW1zLnRvU3RyaW5nKCk7Ci0JCVN0cmluZyBleHBlY3RlZCA9IAotCQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJCSItLS0tLS0tLS0tXG4iOwotCQlpZiAoIWV4cGVjdGVkLmVxdWFscyhhY3R1YWwpKXsKLQkJIAlTeXN0ZW0ub3V0LnByaW50bG4oVXRpbC5kaXNwbGF5U3RyaW5nKGFjdHVhbCwgMikpOwotCQl9Ci0JCWFzc2VydEVxdWFscygKLQkJCSJ1bmV4cGVjdGVkIGVycm9ycyIsCi0JCQlleHBlY3RlZCwKLQkJCWFjdHVhbCk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVGaWxlKCIvUmVjb25jaWxlci9zcmMvdGVzdHMvQWJzdHJhY3RTZWFyY2hhYmxlU291cmNlLmphdmEiKTsKLQkJdGhpcy5kZWxldGVGaWxlKCIvUmVjb25jaWxlci9zcmMvdGVzdHMvU2VhcmNoYWJsZVNvdXJjZS5qYXZhIik7Ci0JCXRoaXMuZGVsZXRlRmlsZSgiL1JlY29uY2lsZXIvc3JjL3Rlc3RzL1NvdXJjZS5qYXZhIik7Ci0JCXRoaXMuZGVsZXRlRmlsZSgiL1JlY29uY2lsZXIvc3JjL3Rlc3RzL0Fic3RyYWN0U291cmNlLmphdmEiKTsKLQkJdGhpcy5kZWxldGVGb2xkZXIoIi9SZWNvbmNpbGVyL3NyYy90ZXN0cyIpOwotCX0KLX0KLS8qCi0gKiBUZXN0IHRoYXQgdGhlIGNyZWF0aW9uIG9mIGEgd29ya2luZyBjb3B5IGRldGVjdHMgZXJyb3JzCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMzM3NTcgUHJvYmxlbSBub3QgZGV0ZWN0ZWQgd2hlbiBvcGVuaW5nIGEgd29ya2luZyBjb3B5KQotICovCi1wdWJsaWMgdm9pZCB0ZXN0TWV0aG9kV2l0aEVycm9yNigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCXRoaXMud29ya2luZ0NvcHkuZGVzdHJveSgpOyAvLyBkb24ndCB1c2UgdGhlIG9uZSBjcmVhdGVkIGluIHNldFVwKCkKLQl0aGlzLndvcmtpbmdDb3B5ID0gbnVsbDsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1JlY29uY2lsZXIvc3JjL3AxL1kuamF2YSIsIAotCQkJInBhY2thZ2UgcDE7XG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgWSB7XG4iICsKLQkJCSIgIHB1YmxpYy52b2lkIGZvbygpIHtcbiIgKwotCQkJIiAgfVxuIiArCi0JCQkifSIKLQkJKTsKLQkJdGhpcy5jdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiUmVjb25jaWxlciIsICJzcmMiLCAicDEiLCAiWS5qYXZhIik7Ci0JCXRoaXMucHJvYmxlbVJlcXVlc3RvciA9ICBuZXcgUHJvYmxlbVJlcXVlc3RvcigpOwotCQl0aGlzLnByb2JsZW1SZXF1ZXN0b3IuaW5pdGlhbGl6ZSgpOwotCQl0aGlzLndvcmtpbmdDb3B5ID0gKElDb21waWxhdGlvblVuaXQpdGhpcy5jdS5nZXRXb3JraW5nQ29weShudWxsLCBudWxsLCB0aGlzLnByb2JsZW1SZXF1ZXN0b3IpOwotCQlhc3NlcnRQcm9ibGVtcygKLQkJCSJVbmV4cGVjdGVkIHByb2JsZW1zIiwKLQkJCSItLS0tLS0tLS0tXG4iICsgCi0JCQkiMS4gRVJST1IgaW4gWS5qYXZhIChhdCBsaW5lIDMpXG4iICsgCi0JCQkiCXB1YmxpYy52b2lkIGZvbygpIHtcbiIgKyAKLQkJCSIJICAgICAgXlxuIiArIAotCQkJIlN5bnRheCBlcnJvciBvbiB0b2tlbiBcIi5cIiwgXCJib29sZWFuXCIsIFwidm9pZFwiLCBcImJ5dGVcIiwgXCJzaG9ydFwiLCBcImludFwiLCBcImxvbmdcIiwgXCJjaGFyXCIsIFwiZmxvYXRcIiwgXCJkb3VibGVcIiwgXCJJZGVudGlmaWVyXCIsIFwiaW50ZXJmYWNlXCIsIFwiY2xhc3NcIiBleHBlY3RlZFxuIiArIAotCQkJIi0tLS0tLS0tLS1cbiIKLQkJKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZUZpbGUoIi9SZWNvbmNpbGVyL3NyYy9wMS9ZLmphdmEiKTsKLQl9Ci19Ci0vKgotICogVGVzdCB0aGF0IHRoZSBvcGVuaW5nIG9mIGEgd29ya2luZyBjb3B5IGRldGVjdHMgZXJyb3JzCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMzM3NTcgUHJvYmxlbSBub3QgZGV0ZWN0ZWQgd2hlbiBvcGVuaW5nIGEgd29ya2luZyBjb3B5KQotICovCi1wdWJsaWMgdm9pZCB0ZXN0TWV0aG9kV2l0aEVycm9yNygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCXRoaXMud29ya2luZ0NvcHkuZGVzdHJveSgpOyAvLyBkb24ndCB1c2UgdGhlIG9uZSBjcmVhdGVkIGluIHNldFVwKCkKLQl0aGlzLndvcmtpbmdDb3B5ID0gbnVsbDsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1JlY29uY2lsZXIvc3JjL3AxL1kuamF2YSIsIAotCQkJInBhY2thZ2UgcDE7XG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgWSB7XG4iICsKLQkJCSIgIHB1YmxpYy52b2lkIGZvbygpIHtcbiIgKwotCQkJIiAgfVxuIiArCi0JCQkifSIKLQkJKTsKLQkJdGhpcy5jdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiUmVjb25jaWxlciIsICJzcmMiLCAicDEiLCAiWS5qYXZhIik7Ci0JCXRoaXMucHJvYmxlbVJlcXVlc3RvciA9ICBuZXcgUHJvYmxlbVJlcXVlc3RvcigpOwotCQl0aGlzLndvcmtpbmdDb3B5ID0gKElDb21waWxhdGlvblVuaXQpdGhpcy5jdS5nZXRXb3JraW5nQ29weShudWxsLCBudWxsLCB0aGlzLnByb2JsZW1SZXF1ZXN0b3IpOwotCi0JCS8vIENsb3NlIHdvcmtpbmcgY29weQotCQl0aGlzLndvcmtpbmdDb3B5LmNsb3NlKCk7Ci0JCQotCQkvLyBSZW9wZW4gc2hvdWxkIGRldGVjdCBzeW50YXggZXJyb3IKLQkJdGhpcy5wcm9ibGVtUmVxdWVzdG9yLmluaXRpYWxpemUoKTsKLQkJdGhpcy53b3JraW5nQ29weS5vcGVuKG51bGwpOwotCQlhc3NlcnRQcm9ibGVtcygKLQkJCSJVbmV4cGVjdGVkIHByb2JsZW1zIiwKLQkJCSItLS0tLS0tLS0tXG4iICsgCi0JCQkiMS4gRVJST1IgaW4gWS5qYXZhIChhdCBsaW5lIDMpXG4iICsgCi0JCQkiCXB1YmxpYy52b2lkIGZvbygpIHtcbiIgKyAKLQkJCSIJICAgICAgXlxuIiArIAotCQkJIlN5bnRheCBlcnJvciBvbiB0b2tlbiBcIi5cIiwgXCJib29sZWFuXCIsIFwidm9pZFwiLCBcImJ5dGVcIiwgXCJzaG9ydFwiLCBcImludFwiLCBcImxvbmdcIiwgXCJjaGFyXCIsIFwiZmxvYXRcIiwgXCJkb3VibGVcIiwgXCJJZGVudGlmaWVyXCIsIFwiaW50ZXJmYWNlXCIsIFwiY2xhc3NcIiBleHBlY3RlZFxuIiArIAotCQkJIi0tLS0tLS0tLS1cbiIKLQkJKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZUZpbGUoIi9SZWNvbmNpbGVyL3NyYy9wMS9ZLmphdmEiKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCB0aGUgcmVjb25jaWxlciBoYW5kbGVzIG1lbWJlciBtb3ZlIGNvcnJlY3RseS4KLSAqLwotcHVibGljIHZvaWQgdGVzdE1vdmVNZW1iZXIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQl0aGlzLndvcmtpbmdDb3B5LmdldEJ1ZmZlcigpLnNldENvbnRlbnRzKAotCQkicGFja2FnZSBwMTtcbiIgKwotCQkiaW1wb3J0IHAyLio7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHB1YmxpYyB2b2lkIGJhcigpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iKTsKLQl0aGlzLndvcmtpbmdDb3B5LnJlY29uY2lsZSgpOwotCXRoaXMuY2xlYXJEZWx0YXMoKTsKLQkKLQl0aGlzLndvcmtpbmdDb3B5LmdldEJ1ZmZlcigpLnNldENvbnRlbnRzKAotCQkicGFja2FnZSBwMTtcbiIgKwotCQkiaW1wb3J0IHAyLio7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBwdWJsaWMgdm9pZCBiYXIoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHB1YmxpYyB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iKTsKLQl0aGlzLndvcmtpbmdDb3B5LnJlY29uY2lsZSgpOwotCWFzc2VydERlbHRhcygKLQkJIlVuZXhwZWN0ZWQgZGVsdGEiLCAKLQkJIlhbKl06IHtDSElMRFJFTiB8IEZJTkUgR1JBSU5FRH1cbiIgKyAKLQkJIgliYXJbKl06IHtSRU9SREVSRUR9XG4iICsgCi0JCSIJZm9vWypdOiB7UkVPUkRFUkVEfSIKLQkpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgdGhlIHJlY29uY2lsZXIgZG9lcyBub3RoaW5nIHdoZW4gdGhlIHNvdXJjZQotICogdG8gcmVjb25jaWxlIHdpdGggaXMgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgY29udGVudHMuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3ROb0NoYW5nZXMxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JdGhpcy53b3JraW5nQ29weS5nZXRCdWZmZXIoKS5zZXRDb250ZW50cyh0aGlzLndvcmtpbmdDb3B5LmdldFNvdXJjZSgpKTsKLQl0aGlzLndvcmtpbmdDb3B5LnJlY29uY2lsZSgpOwotCWFzc2VydERlbHRhcygKLQkJIlVuZXhwZWN0ZWQgZGVsdGEiLAotCQkiIgotCSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCB0aGUgcmVjb25jaWxlciBkb2VzIG5vdGhpbmcgd2hlbiB0aGUgc291cmNlCi0gKiB0byByZWNvbmNpbGUgd2l0aCBoYXMgdGhlIHNhbWUgc3RydWN0dXJlIGFzIHRoZSBjdXJyZW50IGNvbnRlbnRzLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Tm9DaGFuZ2VzMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCXRoaXMud29ya2luZ0NvcHkuZ2V0QnVmZmVyKCkuc2V0Q29udGVudHMoCi0JCSJwYWNrYWdlIHAxO1xuIiArCi0JCSJpbXBvcnQgcDIuKjtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyB2b2lkIGZvbygpIHtcbiIgKwotCQkiICAgIFN5c3RlbS5vdXQucHJpbnRsbigpXG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IgotCSk7Ci0JdGhpcy53b3JraW5nQ29weS5yZWNvbmNpbGUoKTsKLQlhc3NlcnREZWx0YXMoCi0JCSJVbmV4cGVjdGVkIGRlbHRhIiwKLQkJIiIKLQkpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgdGhlIHJlY29uY2lsZXIgcmVjb25jaWxlcyB0aGUgbmV3IGNvbnRlbnRzIHdpdGggdGhlIGN1cnJlbnQKLSAqIGNvbnRlbnRzLCB1cGRhdGluZyB0aGUgc3RydWN0dXJlIG9mIHRoaXMgcmVjb25jaWxlcidzIGNvbXBpbGF0aW9uCi0gKiB1bml0LCBhbmQgZmlyZXMgdGhlIEphdmEgZWxlbWVudCBkZWx0YXMgZm9yIHRoZSBzdHJ1Y3R1cmFsIGNoYW5nZXMKLSAqIG9mIGEgcmVuYW1pbmcgYSBtZXRob2Q7IHRoZSBvcmlnaW5hbCBtZXRob2QgZGVsZXRlZCBhbmQgdGhlIG5ldyBtZXRob2QgYWRkZWQgc3RydWN0dXJhbGx5LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVuYW1lTWV0aG9kMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCXRoaXMud29ya2luZ0NvcHkuZ2V0QnVmZmVyKCkuc2V0Q29udGVudHMoCi0JCSJwYWNrYWdlIHAxO1xuIiArCi0JCSJpbXBvcnQgcDIuKjtcbiIgKwotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyB2b2lkIGJhcigpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iCi0JKTsKLQl0aGlzLndvcmtpbmdDb3B5LnJlY29uY2lsZSgpOwotCWFzc2VydERlbHRhcygKLQkJIlVuZXhwZWN0ZWQgZGVsdGEiLAotCQkiWFsqXToge0NISUxEUkVOIHwgRklORSBHUkFJTkVEfVxuIiArIAotCQkiCWJhclsrXToge31cbiIgKyAKLQkJIglmb29bLV06IHt9IgotCSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCB0aGUgcmVjb25jaWxlciByZWNvbmNpbGVzIHRoZSBuZXcgY29udGVudHMgd2l0aCB0aGUgY3VycmVudAotICogY29udGVudHMsdXBkYXRpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGlzIHJlY29uY2lsZXIncyBjb21waWxhdGlvbgotICogdW5pdCwgYW5kIGZpcmVzIHRoZSBKYXZhIGVsZW1lbnQgZGVsdGEgZm9yIHRoZSBzdHJ1Y3R1cmFsIGNoYW5nZXMKLSAqIG9mIHRoZSBhZGRpdGlvbiBvZiBhIHBvcnRpb24gb2YgYSBuZXcgbWV0aG9kLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVuYW1lV2l0aFN5bnRheEVycm9yKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JdGhpcy53b3JraW5nQ29weS5nZXRCdWZmZXIoKS5zZXRDb250ZW50cygKLQkJInBhY2thZ2UgcDE7XG4iICsKLQkJImltcG9ydCBwMi4qO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIHZvaWQgYmFyKCB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IgotCSk7Ci0JdGhpcy53b3JraW5nQ29weS5yZWNvbmNpbGUoKTsKLQlhc3NlcnREZWx0YXMoCi0JCSJVbmV4cGVjdGVkIGRlbHRhIiwKLQkJIlhbKl06IHtDSElMRFJFTiB8IEZJTkUgR1JBSU5FRH1cbiIgKyAKLQkJIgliYXJbK106IHt9XG4iICsgCi0JCSIJZm9vWy1dOiB7fSIKLQkpOwotCWFzc2VydFByb2JsZW1zKAotCQkiVW5leHBlY3RlZCBwcm9ibGVtcyIsCi0JCSItLS0tLS0tLS0tXG4iICsgCi0JCSIxLiBFUlJPUiBpbiBYLmphdmEgKGF0IGxpbmUgNClcbiIgKyAKLQkJIglwdWJsaWMgdm9pZCBiYXIoIHtcbiIgKyAKLQkJIgkgICAgICAgICAgICAgICAgIF5cbiIgKyAKLQkJIlN5bnRheCBlcnJvciBvbiB0b2tlbiBcIntcIiwgXCJmbG9hdFwiLCBcImRvdWJsZVwiLCBcImJ5dGVcIiwgXCJzaG9ydFwiLCBcImludFwiLCBcImxvbmdcIiwgXCJjaGFyXCIsIFwiYm9vbGVhblwiLCBcInZvaWRcIiwgXCJJZGVudGlmaWVyXCIgZXhwZWN0ZWRcbiIgKyAKLQkJIjIuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA0KVxuIiArIAotCQkiCXB1YmxpYyB2b2lkIGJhcigge1xuIiArIAotCQkiCSAgICAgICAgICAgICAgIF5cbiIgKyAKLQkJIlVubWF0Y2hlZCBicmFja2V0XG4iICsgCi0JCSItLS0tLS0tLS0tXG4iCi0JKTsKLX0KLS8qKgotICogRW5zdXJlIHRoYXQgYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbiBpcyBkZXRlY3RlZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdFVuaGFuZGxlZEV4Y2VwdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCXRoaXMud29ya2luZ0NvcHkuZ2V0QnVmZmVyKCkuc2V0Q29udGVudHMoCi0JCSJwYWNrYWdlIHAxO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJIiAgcHVibGljIHZvaWQgZm9vKCkge1xuIiArCi0JCSIgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigpO1xuIiArCi0JCSIgIH1cbiIgKwotCQkifSIKLQkpOwotCXRoaXMud29ya2luZ0NvcHkucmVjb25jaWxlKCk7Ci0JYXNzZXJ0UHJvYmxlbXMoCi0JCSJVbmV4cGVjdGVkIHByb2JsZW1zIiwKLQkJIi0tLS0tLS0tLS1cbiIgKyAKLQkJIjEuIEVSUk9SIGluIFguamF2YSAoYXQgbGluZSA0KVxuIiArIAotCQkiCXRocm93IG5ldyBFeGNlcHRpb24oKTtcbiIgKyAKLQkJIgleXl5eXl5eXl5eXl5eXl5eXl5eXl5cbiIgKyAKLQkJIlVuaGFuZGxlZCBleGNlcHRpb24gdHlwZSBFeGNlcHRpb25cbiIgKyAKLQkJIi0tLS0tLS0tLS1cbiIKLQkpOwotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL1JlbmFtZVRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvUmVuYW1lVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlNWI0Yi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvUmVuYW1lVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLQotcHVibGljIGNsYXNzIFJlbmFtZVRlc3RzIGV4dGVuZHMgQ29weU1vdmVUZXN0cyB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdTsKLS8qKgotICovCi1wdWJsaWMgUmVuYW1lVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLS8qKgotICogQXR0ZW1wdHMgdG8gcmVuYW1lIHRoZSBlbGVtZW50cyB3aXRoIG9wdGlvbmFsIAotICogZm9yY2luZy4gVGhlIG9wZXJhdGlvbiBzaG91bGQgZmFpbCB3aXRoIHRoZSBmYWlsdXJlIGNvZGUuCi0gKi8KLXB1YmxpYyB2b2lkIHJlbmFtZU5lZ2F0aXZlKElKYXZhRWxlbWVudFtdIGVsZW1lbnRzICxTdHJpbmdbXSByZW5hbWluZ3MsIGJvb2xlYW4gZm9yY2UsIGludCBmYWlsdXJlQ29kZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJLy9yZW5hbWUKLQkgCWdldEphdmFNb2RlbCgpLnJlbmFtZShlbGVtZW50cywgbmV3IElKYXZhRWxlbWVudFtde2VsZW1lbnRzWzBdLmdldFBhcmVudCgpfSwgcmVuYW1pbmdzLCBmb3JjZSwgbnVsbCk7Ci0JfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQlhc3NlcnRUcnVlKCJDb2RlIG5vdCBjb3JyZWN0IGZvciBKYXZhTW9kZWxFeGNlcHRpb246ICIgICsgam1lLCBqbWUuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpID09IGZhaWx1cmVDb2RlKTsgCi0JCXJldHVybjsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiVGhlIHJlbmFtZSBzaG91bGQgaGF2ZSBmYWlsZWQgZm9yIG11bHRpcGxlIHJlbmFtaW5nIiwgZmFsc2UpOwotCXJldHVybjsKLX0KLS8qKgotICogQXR0ZW1wdHMgdG8gcmVuYW1lIHRoZSBlbGVtZW50IHdpdGggb3B0aW9uYWwgCi0gKiBmb3JjaW5nLiBUaGUgb3BlcmF0aW9uIHNob3VsZCBmYWlsIHdpdGggdGhlIGZhaWx1cmUgY29kZS4KLSAqLwotcHVibGljIHZvaWQgcmVuYW1lTmVnYXRpdmUoSUphdmFFbGVtZW50IGVsZW1lbnQsIFN0cmluZyByZW5hbWUsIGJvb2xlYW4gZm9yY2UsIGludCBmYWlsdXJlQ29kZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJLy9yZW5hbWUKLQkJZ2V0SmF2YU1vZGVsKCkucmVuYW1lKG5ldyBJSmF2YUVsZW1lbnRbXSB7ZWxlbWVudH0sIG5ldyBJSmF2YUVsZW1lbnRbXSB7ZWxlbWVudC5nZXRQYXJlbnQoKX0sIG5ldyBTdHJpbmdbXSB7cmVuYW1lfSwgZm9yY2UsIG51bGwpOwotCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJYXNzZXJ0VHJ1ZSgiQ29kZSBub3QgY29ycmVjdCBmb3IgSmF2YU1vZGVsRXhjZXB0aW9uOiAiICsgam1lLCBqbWUuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpID09IGZhaWx1cmVDb2RlKTsKLQkJcmV0dXJuOwotCX0KLQlhc3NlcnRUcnVlKCJUaGUgcmVuYW1lIHNob3VsZCBoYXZlIGZhaWxlZCBmb3I6ICIgKyBlbGVtZW50LCBmYWxzZSk7Ci0JcmV0dXJuOwotfQotLyoqCi0gKiBSZW5hbWVzIHRoZSBlbGVtZW50IHRvIHRoZSBjb250YWluZXIgd2l0aCBvcHRpb25hbCAKLSAqIGZvcmNpbmcuIFRoZSBvcGVyYXRpb24gc2hvdWxkIHN1Y2NlZWQsIHNvIGFueSBleGNlcHRpb25zCi0gKiBlbmNvdW50ZXJlZCBhcmUgdGhyb3duLgotICovCi1wdWJsaWMgdm9pZCByZW5hbWVQb3NpdGl2ZShJSmF2YUVsZW1lbnRbXSBlbGVtZW50cywgU3RyaW5nW10gbmFtZXMsIGJvb2xlYW4gZm9yY2UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCXJlbmFtZVBvc2l0aXZlKGVsZW1lbnRzLCBuZXcgSUphdmFFbGVtZW50W117ZWxlbWVudHNbMF0uZ2V0UGFyZW50KCl9LCBuYW1lcywgZm9yY2UpOwotfQotLyoqCi0gKiBSZW5hbWVzIHRoZSBlbGVtZW50IHRvIHRoZSBjb250YWluZXIgd2l0aCBvcHRpb25hbCAKLSAqIGZvcmNpbmcuIFRoZSBvcGVyYXRpb24gc2hvdWxkIHN1Y2NlZWQsIHNvIGFueSBleGNlcHRpb25zCi0gKiBlbmNvdW50ZXJlZCBhcmUgdGhyb3duLgotICovCi1wdWJsaWMgdm9pZCByZW5hbWVQb3NpdGl2ZShJSmF2YUVsZW1lbnRbXSBlbGVtZW50cywgSUphdmFFbGVtZW50W10gZGVzdGluYXRpb25zLCBTdHJpbmdbXSBuYW1lcywgYm9vbGVhbiBmb3JjZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JcmVuYW1lUG9zaXRpdmUoZWxlbWVudHMsIGRlc3RpbmF0aW9ucywgbmFtZXMsIGZvcmNlLCBmYWxzZSk7Ci19Ci0vKioKLSAqIFJlbmFtZXMgdGhlIGVsZW1lbnQgdG8gdGhlIGNvbnRhaW5lciB3aXRoIG9wdGlvbmFsIAotICogZm9yY2luZy4gVGhlIG9wZXJhdGlvbiBzaG91bGQgc3VjY2VlZCwgc28gYW55IGV4Y2VwdGlvbnMKLSAqIGVuY291bnRlcmVkIGFyZSB0aHJvd24uCi0gKi8KLXB1YmxpYyB2b2lkIHJlbmFtZVBvc2l0aXZlKElKYXZhRWxlbWVudFtdIGVsZW1lbnRzLCBJSmF2YUVsZW1lbnRbXSBkZXN0aW5hdGlvbnMsIFN0cmluZ1tdIG5hbWVzLCBib29sZWFuIGZvcmNlLCBib29sZWFuIG9yaWdpbmFsU2hvdWxkRXhpc3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCXJlbmFtZVBvc2l0aXZlKGVsZW1lbnRzLCBkZXN0aW5hdGlvbnMsIG5hbWVzLCBmb3JjZSwgb3JpZ2luYWxTaG91bGRFeGlzdCwgbnVsbCk7Ci19Ci0vKioKLSAqIFJlbmFtZXMgdGhlIGVsZW1lbnQgdG8gdGhlIGNvbnRhaW5lciB3aXRoIG9wdGlvbmFsIAotICogZm9yY2luZy4gVGhlIG9wZXJhdGlvbiBzaG91bGQgc3VjY2VlZCwgc28gYW55IGV4Y2VwdGlvbnMKLSAqIGVuY291bnRlcmVkIGFyZSB0aHJvd24uCi0gKi8KLXB1YmxpYyB2b2lkIHJlbmFtZVBvc2l0aXZlKElKYXZhRWxlbWVudFtdIGVsZW1lbnRzLCBJSmF2YUVsZW1lbnRbXSBkZXN0aW5hdGlvbnMsIFN0cmluZ1tdIG5hbWVzLCBib29sZWFuIGZvcmNlLCBib29sZWFuIG9yaWdpbmFsU2hvdWxkRXhpc3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JLy8gaWYgZm9yY2luZywgZW5zdXJlIHRoYXQgYSBuYW1lIGNvbGxpc2lvbiBleGlzdHMKLQlpbnQgaTsKLQlpZiAoZm9yY2UpIHsKLQkJZm9yIChpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJSmF2YUVsZW1lbnQgZSA9IGVsZW1lbnRzW2ldOwotCQkJSUphdmFFbGVtZW50IGNvbGxpc2lvbiA9IGdlbmVyYXRlSGFuZGxlKGUsIG5hbWVzW2ldLCBlLmdldFBhcmVudCgpKTsKLQkJCWFzc2VydFRydWUoIkNvbGxpc2lvbiBkb2VzIG5vdCBleGlzdCIsIGNvbGxpc2lvbi5leGlzdHMoKSk7Ci0JCX0KLQl9Ci0KLQkvLyByZW5hbWUKLQlnZXRKYXZhTW9kZWwoKS5yZW5hbWUoZWxlbWVudHMsIGRlc3RpbmF0aW9ucywgbmFtZXMsIGZvcmNlLCBtb25pdG9yKTsKLQlmb3IgKGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJLy8gZ2VuZXJhdGUgdGhlIG5ldyBlbGVtZW50CWhhbmRsZQotCQlJSmF2YUVsZW1lbnQgZSA9IGVsZW1lbnRzW2ldOwotCQlJSmF2YUVsZW1lbnQgcmVuYW1lZCA9IGdlbmVyYXRlSGFuZGxlKGUsIG5hbWVzW2ldLCBlLmdldFBhcmVudCgpKTsKLQkJYXNzZXJ0VHJ1ZSgiUmVuYW1lZCBlbGVtZW50IHNob3VsZCBleGlzdCIsIHJlbmFtZWQuZXhpc3RzKCkpOwotCQlpZiAoIW9yaWdpbmFsU2hvdWxkRXhpc3QpIHsKLQkJCWFzc2VydFRydWUoIk9yaWdpbmFsIGVsZW1lbnQgc2hvdWxkIG5vdCBleGlzdCIsICFlLmV4aXN0cygpKTsKLQkJfQotCQlJSmF2YUVsZW1lbnREZWx0YSBkZXN0RGVsdGEgPSBnZXREZWx0YUZvcihyZW5hbWVkLmdldFBhcmVudCgpKTsKLQkJaWYgKGlzTWFpblR5cGUoZSwgZS5nZXRQYXJlbnQoKSkpIHsKLQkJCWFzc2VydFRydWUoIlJlbmFtZWQgY29tcGlsYXRpb24gdW5pdCBhcyByZXN1bHQgb2YgbWFpbiB0eXBlIG5vdCBhZGRlZCIsIGRlc3REZWx0YSAhPSBudWxsICYmIGRlc3REZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQURERUQpOwotCQkJYXNzZXJ0VHJ1ZSgiQWRkZWQgY2hpbGRyZW4gbm90IGNvcnJlY3QgZm9yIGVsZW1lbnQgY29weSIsIGRlc3REZWx0YS5nZXRFbGVtZW50KCkuZXF1YWxzKHJlbmFtZWQuZ2V0UGFyZW50KCkpKTsKLQkJCWFzc2VydFRydWUoImZsYWcgc2hvdWxkIGJlIEZfTU9WRURfRlJPTSIsIChkZXN0RGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfTU9WRURfRlJPTSkgPiAwKTsKLQkJCWFzc2VydFRydWUoIm1vdmVkIGZyb20gaGFuZGxlIHNob3VsZCBiZSBvcmlnaW5hbCIsIGRlc3REZWx0YS5nZXRNb3ZlZEZyb21FbGVtZW50KCkuZXF1YWxzKGUuZ2V0UGFyZW50KCkpKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydFRydWUoIkRlc3RpbmF0aW9uIGNvbnRhaW5lciBub3QgY2hhbmdlZCIsIGRlc3REZWx0YSAhPSBudWxsICYmIGRlbHRhQ2hpbGRyZW5DaGFuZ2VkKGRlc3REZWx0YSkpOwotCQkJSUphdmFFbGVtZW50RGVsdGFbXSBkZWx0YXMgPSBkZXN0RGVsdGEuZ2V0QWRkZWRDaGlsZHJlbigpOwotCQkJYXNzZXJ0VHJ1ZSgiQWRkZWQgY2hpbGRyZW4gbm90IGNvcnJlY3QgZm9yIGVsZW1lbnQgcmVuYW1lIiwgZGVsdGFzLmxlbmd0aCA+IGkgJiYgZGVsdGFzW2ldLmdldEVsZW1lbnQoKS5lcXVhbHMocmVuYW1lZCkpOwotCQkJYXNzZXJ0VHJ1ZSgia2luZCBzaG91bGQgYmUgS19BRERFRCIsIGRlbHRhc1tpXS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQURERUQpOwotCQkJZGVsdGFzID0gZGVzdERlbHRhLmdldFJlbW92ZWRDaGlsZHJlbigpOwotCQkJYXNzZXJ0VHJ1ZSgiUmVtb3ZlZCBjaGlsZHJlbiBub3QgY29ycmVjdCBmb3IgZWxlbWVudCByZW5hbWUiLCBkZWx0YXMubGVuZ3RoID4gaSAmJiBkZWx0YXNbaV0uZ2V0RWxlbWVudCgpLmVxdWFscyhlKSk7Ci0JCQlhc3NlcnRUcnVlKCJraW5kIHNob3VsZCBiZSBLX1JFTU9WRUQiLCBkZWx0YXNbaV0uZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQpOwotCQl9Ci0JfQotfQotLyoqCi0gKiBSZW5hbWVzIHRoZSBlbGVtZW50IHRvIHRoZSBjb250YWluZXIgd2l0aCBvcHRpb25hbCAKLSAqIGZvcmNpbmcuIFRoZSBvcGVyYXRpb24gc2hvdWxkIHN1Y2NlZWQsIHNvIGFueSBleGNlcHRpb25zCi0gKiBlbmNvdW50ZXJlZCBhcmUgdGhyb3duLgotICovCi1wdWJsaWMgdm9pZCByZW5hbWVQb3NpdGl2ZShJSmF2YUVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHJlbmFtZSwgYm9vbGVhbiBmb3JjZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JcmVuYW1lUG9zaXRpdmUobmV3IElKYXZhRWxlbWVudFtdIHtlbGVtZW50fSwgbmV3IFN0cmluZ1tdIHtyZW5hbWV9LCBmb3JjZSk7Ci19Ci0vKioKLSAqIFNldHVwIGZvciB0aGUgbmV4dCB0ZXN0LgotICovCi1wdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCXN1cGVyLnNldFVwKCk7Ci0KLQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvWC5qYXZhIiwKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBib29sZWFuIG90aGVyO1xuIiArCi0JCSIgIGludCBiYXI7XG4iICsKLQkJIiAge1xuIiArCi0JCSIgICAgYmFyID0gMTtcbiIgKwotCQkiICB9XG4iICsKLQkJIiAgWChpbnQgaSkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkiICB2b2lkIG90aGVyTWV0aG9kKFN0cmluZyBzKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSIgIHZvaWQgZm9vKFN0cmluZyBzKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IgotCSk7Ci0JdGhpcy5jdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpOwotCQotCXN0YXJ0RGVsdGFzKCk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRVcFN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0Jc3VwZXIuc2V0VXBTdWl0ZSgpOwotCQotCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiQmluYXJ5UHJvamVjdCIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCBuZXcgU3RyaW5nW10geyJKQ0xfTElCIn0sICJsaWIiKTsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvQmluYXJ5UHJvamVjdC9zcmMvWC5qYXZhIiwKLQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkiICBpbnQgYmFyO1xuIiArCi0JCSIgIHB1YmxpYyB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iCi0JKTsKLQlwcm9qZWN0LmdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkZVTExfQlVJTEQsIG51bGwpOwotCXByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKAotCQluZXcgSUNsYXNzcGF0aEVudHJ5W10gewotCQkJSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KG5ldyBQYXRoKCIvQmluYXJ5UHJvamVjdC9saWIiKSwgbnVsbCwgbnVsbCkKLQkJfSwKLQkJbnVsbAotCSk7Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JcmV0dXJuIG5ldyBTdWl0ZShSZW5hbWVUZXN0cy5jbGFzcyk7Ci19Ci0vKioKLSAqIENsZWFudXAgYWZ0ZXIgdGhlIHByZXZpb3VzIHRlc3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0Jc3RvcERlbHRhcygpOwotCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCi0Jc3VwZXIudGVhckRvd24oKTsKLX0KLXB1YmxpYyB2b2lkIHRlYXJEb3duU3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQl0aGlzLmRlbGV0ZVByb2plY3QoIkJpbmFyeVByb2plY3QiKTsKLQlzdXBlci50ZWFyRG93blN1aXRlKCk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIGJpbmFyeSBmaWVsZCBjYW5ub3QgYmUgcmVuYW1lZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJlbmFtZUJpbmFyeUZpZWxkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNsYXNzRmlsZSBjZiA9IGdldENsYXNzRmlsZSgiQmluYXJ5UHJvamVjdCIsICJsaWIiLCAiIiwgIlguY2xhc3MiKTsKLQlJRmllbGQgYmluYXJ5RmllbGQgPSBjZi5nZXRUeXBlKCkuZ2V0RmllbGQoImJhciIpOwotCXJlbmFtZU5lZ2F0aXZlKGJpbmFyeUZpZWxkLCAiZnJlZCIsIGZhbHNlLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLlJFQURfT05MWSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIGJpbmFyeSBtZXRob2QgY2Fubm90IGJlIHJlbmFtZWQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZW5hbWVCaW5hcnlNZXRob2QoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJQ2xhc3NGaWxlIGNmID0gZ2V0Q2xhc3NGaWxlKCJCaW5hcnlQcm9qZWN0IiwgImxpYiIsICIiLCAiWC5jbGFzcyIpOwotCUlNZXRob2QgYmluYXJ5TWV0aG9kID0gY2YuZ2V0VHlwZSgpLmdldE1ldGhvZHMoKVswXTsKLQlyZW5hbWVOZWdhdGl2ZShiaW5hcnlNZXRob2QsICJmcmVkIiwgZmFsc2UsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuUkVBRF9PTkxZKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgYmluYXJ5IHR5cGUgY2Fubm90IGJlIHJlbmFtZWQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZW5hbWVCaW5hcnlUeXBlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNsYXNzRmlsZSBjZiA9IGdldENsYXNzRmlsZSgiQmluYXJ5UHJvamVjdCIsICJsaWIiLCAiIiwgIlguY2xhc3MiKTsKLQlJVHlwZSBiaW5hcnlUeXBlID0gY2YuZ2V0VHlwZSgpOwotCXJlbmFtZU5lZ2F0aXZlKGJpbmFyeVR5cGUsICJZIiwgZmFsc2UsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuUkVBRF9PTkxZKTsKLX0KLQotLyoqCi0gKiBUaGlzIG9wZXJhdGlvbiBzaG91bGQgZmFpbCBhcyByZW5hbWluZyBhIENVIGFuZCBhIENVIG1lbWJlciBhdCB0aGUKLSAqIHNhbWUgdGltZSBpcyBub3Qgc3VwcG9ydGVkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVuYW1lQ29tcGlsYXRpb25Vbml0QW5kVHlwZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlyZW5hbWVOZWdhdGl2ZSgKLQkJbmV3IElKYXZhRWxlbWVudFtdIHt0aGlzLmN1LCB0aGlzLmN1LmdldFR5cGUoIlgiKX0sIAotCQluZXcgU3RyaW5nW117IlkuamF2YSIsICJZIn0sIAotCQlmYWxzZSwgCi0JCUlKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9FTEVNRU5UX1RZUEVTKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGNvbXBpbGF0aW9uIHVuaXRzIGNhbm5vdCBiZSByZW5hbWVkIHRvIGFuIGV4aXN0aW5nIGN1IG5hbWUKLSAqIHVubGVzcyB0aGUgZm9yY2UgZmxhZyBpcyBzZXQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZW5hbWVDb21waWxhdGlvblVuaXRSZXN1bHRpbmdJbkNvbGxpc2lvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uewotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9ZLmphdmEiLAotCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCSJ9IgotCSk7Ci0JCi0JcmVuYW1lTmVnYXRpdmUodGhpcy5jdSwgIlkuamF2YSIsIGZhbHNlLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5BTUVfQ09MTElTSU9OKTsKLQlyZW5hbWVQb3NpdGl2ZSh0aGlzLmN1LCAiWS5qYXZhIiwgdHJ1ZSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBjb21waWxhdGlvbiB1bml0cyBjYW4gYmUgcmVuYW1lZC4KLSAqIFZlcmlmaWVzIHRoYXQgdGhlIHByb3BlciBjaGFuZ2UgZGVsdGFzIGFyZSBnZW5lcmF0ZWQgYXMgYSBzaWRlIGVmZmVjdAotICogb2YgcnVubmluZyB0aGUgb3BlcmF0aW9uLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVuYW1lQ29tcGlsYXRpb25Vbml0c0NoZWNraW5nRGVsdGFzKCkgdGhyb3dzIENvcmVFeGNlcHRpb257Ci0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL1kuamF2YSIsCi0JCSJwdWJsaWMgY2xhc3MgWSB7XG4iICsKLQkJIn0iCi0JKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1MiA9IHRoaXMuZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWS5qYXZhIik7Ci0JCi0JY2xlYXJEZWx0YXMoKTsKLQlyZW5hbWVQb3NpdGl2ZSgKLQkJbmV3IElDb21waWxhdGlvblVuaXRbXSB7dGhpcy5jdSwgY3UyfSwgCi0JCW5ldyBTdHJpbmdbXSB7Ik5ld1guamF2YSIsICJOZXdZLmphdmEifSwgCi0JCWZhbHNlKTsKLQkKLQlhc3NlcnREZWx0YXMoCi0JCSJVbmV4cGVjdGVkIGRlbHRhcyIsCi0JCSJQWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCSIJc3JjWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCSIJCVtkZWZhdWx0XVsqXToge0NISUxEUkVOfVxuIiArIAotCQkiCQkJWC5qYXZhWy1dOiB7TU9WRURfVE8oTmV3WC5qYXZhIFtpbiBbZGVmYXVsdF0gW2luIHNyYyBbaW4gUF1dXSl9XG4iICsgCi0JCSIJCQlOZXdYLmphdmFbK106IHtNT1ZFRF9GUk9NKFguamF2YSBbaW4gW2RlZmF1bHRdIFtpbiBzcmMgW2luIFBdXV0pfVxuIiArIAotCQkiCQkJWS5qYXZhWy1dOiB7TU9WRURfVE8oTmV3WS5qYXZhIFtpbiBbZGVmYXVsdF0gW2luIHNyYyBbaW4gUF1dXSl9XG4iICsgCi0JCSIJCQlOZXdZLmphdmFbK106IHtNT1ZFRF9GUk9NKFkuamF2YSBbaW4gW2RlZmF1bHRdIFtpbiBzcmMgW2luIFBdXV0pfSIKLQkpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBjb21waWxhdGlvbiB1bml0IGNhbm5vdCBiZSByZW5hbWVkIHRvIGFuIGludmFsaWQgbmFtZS4gIAotICogVGhlIG5ldyBuYW1lIGZvciBhIGN1IG11c3QgZW5kIGluIC5qYXZhIGFuZCBiZSBhIHZhbGlkIEphdmEgaWRlbnRpZmllci4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJlbmFtZUNvbXBpbGF0aW9uVW5pdFdpdGhJbnZhbGlkTmFtZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCXJlbmFtZU5lZ2F0aXZlKHRoaXMuY3UsICJOZXdYIiwgZmFsc2UsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9OQU1FKTsKLQlyZW5hbWVOZWdhdGl2ZSh0aGlzLmN1LCAiTmV3IFguamF2YSIsIGZhbHNlLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfTkFNRSk7Ci19Ci0vKioKLSAqIFRoaXMgb3BlcmF0aW9uIHNob3VsZCBmYWlsIGFzIHJlbmFtaW5nIGEgQ1Ugd2l0aCBhIG51bGwgbmFtZSBzaG91bGQgdGhyb3cKLSAqIGFuIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJlbmFtZUNvbXBpbGF0aW9uVW5pdFdpdGhOdWxsKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jdS5yZW5hbWUobnVsbCwgZmFsc2UsIG51bGwpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLQkJcmV0dXJuOwotCX0KLQlhc3NlcnRUcnVlKCJTaG91bGQgbm90IGJlIGFibGUgdG8gcmVuYW1lIGEgY3Ugd2l0aCBhIG51bGwgbmFtZSIsIGZhbHNlKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgY29uc3RydXRvciBjYW5ub3QgYmUgcmVuYW1lZCB1c2luZyB0aGUKLSAqIDxjb2RlPlJlbmFtZUVsZW1lbnRzT3BlcmF0aW9uPC9jb2RlPi4gIAotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVuYW1lQ29uc3RydWN0b3IoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJTWV0aG9kIGNvbnN0cnVjdG9yID0gdGhpcy5jdS5nZXRUeXBlKCJYIikuZ2V0TWV0aG9kKCJYIiwgIG5ldyBTdHJpbmdbXSB7IkkifSk7Ci0JcmVuYW1lTmVnYXRpdmUoY29uc3RydWN0b3IsICJuZXdOYW1lIiwgZmFsc2UsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTkFNRV9DT0xMSVNJT04pOwotfQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVuYW1lQ1UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5jdS5yZW5hbWUoIk5ld1guamF2YSIsIGZhbHNlLCBudWxsKTsKLQlhc3NlcnRUcnVlKCJPcmlnaW5hbCBDVSBzaG91bGQgbm90IGV4aXN0IiwgIWN1LmV4aXN0cygpKTsKLQotCUlDb21waWxhdGlvblVuaXQgbmV3Q1UgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9OZXdYLmphdmEiKTsKLQlhc3NlcnRUcnVlKCJOZXcgQ1Ugc2hvdWxkIGV4aXN0IiwgbmV3Q1UuZXhpc3RzKCkpOwotCQotCWFzc2VydFR5cGVzRXF1YWwoCi0JCSJVbmV4cGVjdGVkIHR5cGVzIiwKLQkJIk5ld1hcbiIsCi0JCW5ld0NVLmdldEFsbFR5cGVzKCkpOwotCi0JYXNzZXJ0RGVsdGFzKAotCQkiVW5leHBlY3RlZCBkZWx0YXMiLAotCQkiUFsqXToge0NISUxEUkVOfVxuIiArIAotCQkiCXNyY1sqXToge0NISUxEUkVOfVxuIiArIAotCQkiCQlbZGVmYXVsdF1bKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJIgkJCVguamF2YVstXToge01PVkVEX1RPKE5ld1guamF2YSBbaW4gW2RlZmF1bHRdIFtpbiBzcmMgW2luIFBdXV0pfVxuIiArIAotCQkiCQkJTmV3WC5qYXZhWytdOiB7TU9WRURfRlJPTShYLmphdmEgW2luIFtkZWZhdWx0XSBbaW4gc3JjIFtpbiBQXV1dKX0iCi0JKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RSZW5hbWVDVUZvcmNlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9ZLmphdmEiLAotCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCSJ9IgotCSk7Ci0KLQljbGVhckRlbHRhcygpOwotCXRoaXMuY3UucmVuYW1lKCJZLmphdmEiLCB0cnVlLCBudWxsKTsKLQotCUlGaWxlIGZpbGUgPSAoSUZpbGUpdGhpcy5jdS5nZXRSZXNvdXJjZSgpOwotCUlDb21waWxhdGlvblVuaXQgZGVzdENVID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWS5qYXZhIik7Ci0JSUZpbGUgZGVzdEZpbGUgPSAoSUZpbGUpZGVzdENVLmdldFJlc291cmNlKCk7Ci0KLQlhc3NlcnRUcnVlKCJPcmlnaW5hbCBDVSBzaG91bGQgbm90IGV4aXN0IiwgIWN1LmV4aXN0cygpKTsKLQlhc3NlcnRUcnVlKCJPcmlnaW5hbCBmaWxlIHNob3VsZCBub3QgZXhpc3QiLCAhZmlsZS5leGlzdHMoKSk7Ci0JYXNzZXJ0VHJ1ZSgiRGVzdGluYXRpb24gQ1Ugc2hvdWxkIGV4aXN0IiwgZGVzdENVLmV4aXN0cygpKTsKLQlhc3NlcnRUcnVlKCJEZXN0aW5hdGlvbiBmaWxlIHNob3VsZCBleGlzdCIsIGRlc3RGaWxlLmV4aXN0cygpKTsKLQkKLQlhc3NlcnRUeXBlc0VxdWFsKAotCQkiVW5leHBlY3RlZCB0eXBlcyIsCi0JCSJZXG4iLAotCQlkZXN0Q1UuZ2V0QWxsVHlwZXMoKSk7Ci0KLQlhc3NlcnREZWx0YXMoCi0JCSJVbmV4cGVjdGVkIGRlbHRhcyIsCi0JCSJQWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCSIJc3JjWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCSIJCVtkZWZhdWx0XVsqXToge0NISUxEUkVOfVxuIiArIAotCQkiCQkJWC5qYXZhWy1dOiB7TU9WRURfVE8oWS5qYXZhIFtpbiBbZGVmYXVsdF0gW2luIHNyYyBbaW4gUF1dXSl9XG4iICsgCi0JCSIJCQlZLmphdmFbK106IHtNT1ZFRF9GUk9NKFguamF2YSBbaW4gW2RlZmF1bHRdIFtpbiBzcmMgW2luIFBdXV0pfSIKLQkpOwotfQotLyoKLSAqIEVuc3VyZXMgdGhhdCByZW5hbWluZyBhbiBlbXB0eSBwYWNrYWdlIGZyYWdtZW50IGRvZXNuJ3QgbWFrZSBpdCBkaXNhcHBlYXIKLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAyNDUwNSBSZWZhY3RvcmluZyBhbiBlbXB0eSBwYWNrYWdlIG1ha2VzIGl0IGRpc2FwcGVhcnMpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZW5hbWVFbXB0eVBGKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuY3JlYXRlRm9sZGVyKCIvUC9zcmMveC95L3oiKTsKLQotCWNsZWFyRGVsdGFzKCk7Ci0JZ2V0UGFja2FnZSgiL1Avc3JjL3gveS96IikucmVuYW1lKCJ4LnkiLCBmYWxzZSwgbnVsbCk7Ci0JCi0JSVBhY2thZ2VGcmFnbWVudCBuZXdGcmFnID0gZ2V0UGFja2FnZSgiL1Avc3JjL3gveSIpOwotCWFzc2VydFRydWUoIk5ldyBwYWNrYWdlIHNob3VsZCBleGlzdCIsIG5ld0ZyYWcuZXhpc3RzKCkpOwotCWFzc2VydERlbHRhcygKLQkJIlVuZXhwZWN0ZWQgZGVsdGFzIiwKLQkJIlBbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJIglzcmNbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJIgkJeC55LnpbLV06IHtNT1ZFRF9UTyh4LnkgW2luIHNyYyBbaW4gUF1dKX1cbiIgKyAKLQkJIgkJeC55WytdOiB7TU9WRURfRlJPTSh4LnkueiBbaW4gc3JjIFtpbiBQXV0pfSIKLQkpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgZmllbGRzIGNhbiBiZSByZW5hbWVkLiAgCi0gKiBWZXJpZmllcyB0aGF0IHRoZSBwcm9wZXIgY2hhbmdlIGRlbHRhcyBhcmUgZ2VuZXJhdGVkIGFzIGEgc2lkZSBlZmZlY3QKLSAqIG9mIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbi4gQXMgd2VsbCBlbnN1cmVzIHRoYXQgdGhlIGZpZWxkcyBhcmUKLSAqIHBvc2l0aW9uZWQgaW4gdGhlIHNhbWUgbG9jYXRpb24gYXMgYmVmb3JlIHRoZSByZW5hbWUuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZW5hbWVGaWVsZHNDaGVja2luZ0RlbHRhc0FuZFBvc2l0aW9ucygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSB0aGlzLmN1LmdldFR5cGUoIlgiKTsKLQlJRmllbGQgZmllbGQgPSB0eXBlLmdldEZpZWxkKCJiYXIiKTsKLQlyZW5hbWVQb3NpdGl2ZShmaWVsZCwgImZyZWQiLCBmYWxzZSk7Ci0JCi0JYXNzZXJ0RGVsdGFzKAotCQkiVW5leHBlY3RlZCBkZWx0YXMiLAotCQkiUFsqXToge0NISUxEUkVOfVxuIiArIAotCQkiCXNyY1sqXToge0NISUxEUkVOfVxuIiArIAotCQkiCQlbZGVmYXVsdF1bKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJIgkJCVguamF2YVsqXToge0NISUxEUkVOIHwgRklORSBHUkFJTkVEfVxuIiArIAotCQkiCQkJCVhbKl06IHtDSElMRFJFTiB8IEZJTkUgR1JBSU5FRH1cbiIgKyAKLQkJIgkJCQkJZnJlZFsrXToge31cbiIgKyAKLQkJIgkJCQkJYmFyWy1dOiB7fSIKLQkpOwotCWVuc3VyZUNvcnJlY3RQb3NpdGlvbmluZygoSVBhcmVudCl0eXBlLCB0eXBlLmdldEZpZWxkKCJmcmVkIiksIHR5cGUuZ2V0RmllbGQoIm90aGVyIikpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgZmllbGRzIGNhbiBiZSByZW5hbWVkIGV2ZW4gaWYgb25lIG9mIHRoZSByZW5hbWluZ3MgZmFpbHMuICAKLSAqLwotcHVibGljIHZvaWQgdGVzdFJlbmFtZUZpZWxkc011bHRpU3RhdHVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCVN0cmluZyBhZGRpdGlvbiA9ICJtdWx0aVN0YXR1cyI7Ci0JSVR5cGUgdHlwZSA9IHRoaXMuY3UuZ2V0VHlwZSgiWCIpOwotCUlGaWVsZFtdIGlGaWVsZHMgPSB0eXBlLmdldEZpZWxkcygpOwotCVN0cmluZ1tdIG5ld05hbWVzID0gbmV3IFN0cmluZ1tpRmllbGRzLmxlbmd0aF07Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IGlGaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJSUZpZWxkIGYgPSBpRmllbGRzW2ldOwotCQluZXdOYW1lc1tpXSA9IGFkZGl0aW9uICsgZi5nZXRFbGVtZW50TmFtZSgpOwotCX0KLQluZXdOYW1lc1sxXSA9ICI7IjsgLy9pbnZhbGlkIG5hbWUKLQotCWJvb2xlYW4gZSA9IGZhbHNlOwotCXRyeSB7Ci0JCXR5cGUuZ2V0SmF2YU1vZGVsKCkucmVuYW1lKGlGaWVsZHMsIG5ldyBJSmF2YUVsZW1lbnRbXSB7dHlwZX0sIG5ld05hbWVzLCBmYWxzZSwgbnVsbCk7Ci0JfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQlhc3NlcnRUcnVlKCJTaG91bGQgbm90IGJlIG11bHRpc3RhdHVzIChvbmx5IG9uZSBmYWlsdXJlKSIsICFqbWUuZ2V0U3RhdHVzKCkuaXNNdWx0aVN0YXR1cygpKTsKLQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIGJlIGFuIGludmFsaWQgZGVzdGluYXRpb24iLCBqbWUuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpID09IElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9OQU1FKTsKLQkJZSA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIlNob3VsZCBoYXZlIGJlZW4gYW4gZXhjZXB0aW9uIiwgZSk7Ci0JCi0JYXNzZXJ0RGVsdGFzKAotCQkiVW5leHBlY3RlZCBkZWx0YXMiLAotCQkiUFsqXToge0NISUxEUkVOfVxuIiArIAotCQkiCXNyY1sqXToge0NISUxEUkVOfVxuIiArIAotCQkiCQlbZGVmYXVsdF1bKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJIgkJCVguamF2YVsqXToge0NISUxEUkVOIHwgRklORSBHUkFJTkVEfVxuIiArIAotCQkiCQkJCVhbKl06IHtDSElMRFJFTiB8IEZJTkUgR1JBSU5FRH1cbiIgKyAKLQkJIgkJCQkJbXVsdGlTdGF0dXNvdGhlclsrXToge31cbiIgKyAKLQkJIgkJCQkJb3RoZXJbLV06IHt9IgotCSk7Ci0JCi0JSUphdmFFbGVtZW50IGNvcHkgPSBnZW5lcmF0ZUhhbmRsZShpRmllbGRzWzBdLCBuZXdOYW1lc1swXSwgdHlwZSk7Ci0JYXNzZXJ0VHJ1ZSgiQ29weSBzaG91bGQgZXhpc3QiLCBjb3B5LmV4aXN0cygpKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGZpZWxkcyBjYW5ub3QgYmUgcmVuYW1lZCB0byB0aGUgc2FtZSBuYW1lLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVuYW1lRmllbGRzUmVzdWx0aW5nSW5Db2xsaXNpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlTdHJpbmcgYWRkaXRpb24gPSAibmV3IjsKLQlJVHlwZSB0eXBlPSB0aGlzLmN1LmdldFR5cGUoIlgiKTsKLQlJRmllbGRbXSBpRmllbGRzID0gdHlwZS5nZXRGaWVsZHMoKTsKLQlTdHJpbmdbXSBuZXdOYW1lcyA9IG5ldyBTdHJpbmdbaUZpZWxkcy5sZW5ndGhdOwotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCBpRmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCUlGaWVsZCBmID0gaUZpZWxkc1tpXTsKLQkJbmV3TmFtZXNbaV0gPSBhZGRpdGlvbiArIGYuZ2V0RWxlbWVudE5hbWUoKTsKLQl9Ci0JLy9zZXQgdHdvIGZpZWxkcyB0byBoYXZlIHRoZSBzYW1lIG5ldyBuYW1lCi0JbmV3TmFtZXNbaS0xXT0gbmV3TmFtZXNbaS0yXTsKLQotCXJlbmFtZU5lZ2F0aXZlKGlGaWVsZHMsIG5ld05hbWVzLCBmYWxzZSwgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OQU1FX0NPTExJU0lPTik7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCByZW5hbWluZyBjYW4gYmUgY2FuY2VsZWQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZW5hbWVGaWVsZHNXaXRoQ2FuY2VsKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCWJvb2xlYW4gaXNDYW5jZWxlZCA9IGZhbHNlOwotCVN0cmluZyBhZGRpdGlvbiA9ICJuZXcxIjsKLQlJVHlwZSB0eXBlID0gUmVuYW1lVGVzdHMudGhpcy5jdS5nZXRUeXBlKCJYIik7Ci0JSUZpZWxkW10gaUZpZWxkcyA9IHR5cGUuZ2V0RmllbGRzKCk7Ci0JU3RyaW5nW10gbmV3TmFtZXMgPSBuZXcgU3RyaW5nW2lGaWVsZHMubGVuZ3RoXTsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgaUZpZWxkcy5sZW5ndGg7IGkrKykgewotCQlJRmllbGQgZiA9IGlGaWVsZHNbaV07Ci0JCW5ld05hbWVzW2ldID0gYWRkaXRpb24gKyBmLmdldEVsZW1lbnROYW1lKCk7Ci0JfQotCXRyeSB7Ci0JCVRlc3RQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IFRlc3RQcm9ncmVzc01vbml0b3IuZ2V0SW5zdGFuY2UoKTsKLQkJbW9uaXRvci5zZXRDYW5jZWxsZWRDb3VudGVyKDEpOwotCQlyZW5hbWVQb3NpdGl2ZShpRmllbGRzLCBuZXcgSUphdmFFbGVtZW50W10ge3R5cGV9LCBuZXdOYW1lcywgZmFsc2UsIGZhbHNlLCBtb25pdG9yKTsKLQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCWlzQ2FuY2VsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJPcGVyYXRpb24gc2hvdWxkIGhhdmUgdGhyb3duIGFuIG9wZXJhdGlvbiBjYW5jZWxlZCBleGNlcHRpb24iLCBpc0NhbmNlbGVkKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGFuIGluaXRpYWxpemVyIGNhbm5vdCBiZSByZW5hbWVkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVuYW1lSW5pdGlhbGl6ZXIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlU291cmNlPSB0aGlzLmN1LmdldFR5cGUoIlgiKTsKLQlJSW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXJTb3VyY2U9IHR5cGVTb3VyY2UuZ2V0SW5pdGlhbGl6ZXIoMSk7Ci0KLQlyZW5hbWVOZWdhdGl2ZShpbml0aWFsaXplclNvdXJjZSwgInNvbWVOYW1lIiwgZmFsc2UsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9FTEVNRU5UX1RZUEVTKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IG1haW4gdHlwZXMgY2FuIGJlIHJlbmFtZWQuIEFzIGEgc2lkZSBlZmZlY3QKLSAqIG9mIHJlbmFtaW5nIHRoZSBtYWluIHR5cGVzLCB0aGUgdHlwZXMnIGVuY2xvc2luZyBjb21waWxhdGlvbiB1bml0Ci0gKiBhcmUgcmVuYW1lZCBhcyB3ZWxsLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVuYW1lTWFpblR5cGVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy9ZLmphdmEiLAotCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCSIgIHB1YmxpYyBZKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifSIKLQkpOwotCUlDb21waWxhdGlvblVuaXQgY3UyID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvWS5qYXZhIik7Ci0JSVBhY2thZ2VGcmFnbWVudCBwa2cgPSAoSVBhY2thZ2VGcmFnbWVudCkgdGhpcy5jdS5nZXRQYXJlbnQoKTsKLQotCUlKYXZhRWxlbWVudFtdIHR5cGVzID0gbmV3IElKYXZhRWxlbWVudFtdIHsKLQkJdGhpcy5jdS5nZXRUeXBlKCJYIiksCi0JCWN1Mi5nZXRUeXBlKCJZIikKLQl9OwotCVN0cmluZ1tdIG5ld05hbWVzID0gbmV3IFN0cmluZ1tdIHsiTmV3WCIsICJOZXdZIn07Ci0JcmVuYW1lUG9zaXRpdmUoCi0JCW5ldyBJSmF2YUVsZW1lbnRbXSB7Ci0JCQl0aGlzLmN1LmdldFR5cGUoIlgiKSwKLQkJCWN1Mi5nZXRUeXBlKCJZIikKLQkJfSwgCi0JCW5ldyBJSmF2YUVsZW1lbnRbXSB7Ci0JCQl0eXBlc1swXS5nZXRQYXJlbnQoKSwgCi0JCQl0eXBlc1sxXS5nZXRQYXJlbnQoKX0sIAotCQluZXdOYW1lcywgCi0JCWZhbHNlKTsKLQotCS8vdGVzdCB0aGF0IGJvdGggdGhlIGNvbXBpbGF0aW9uIHVuaXQsIG1haW4gdHlwZSBhbmQgY29uc3RydWN0b3JzIGhhdmUgYmVlbiByZW5hbWVkLgotCUlDb21waWxhdGlvblVuaXQgcmVuYW1lZENVMT0gcGtnLmdldENvbXBpbGF0aW9uVW5pdCgiTmV3WC5qYXZhIik7Ci0JSUNvbXBpbGF0aW9uVW5pdCByZW5hbWVkQ1UyPSBwa2cuZ2V0Q29tcGlsYXRpb25Vbml0KCJOZXdZLmphdmEiKTsKLQlJVHlwZSBuZXdUeXBlMSA9IHJlbmFtZWRDVTEuZ2V0VHlwZSgiTmV3WCIpOwotCUlUeXBlIG5ld1R5cGUyID0gcmVuYW1lZENVMi5nZXRUeXBlKCJOZXdZIik7Ci0JYXNzZXJ0VHJ1ZSgiTmV3WCBzaG91bGQgYmUgcHJlc2VudCIsIG5ld1R5cGUxLmV4aXN0cygpKTsKLQlhc3NlcnRUcnVlKCJOZXdZIHNob3VsZCBiZSBwcmVzZW50IiwgbmV3VHlwZTIuZXhpc3RzKCkpOwotCQotCUlNZXRob2QgY29uc3RydWN0b3IxID0gbmV3VHlwZTEuZ2V0TWV0aG9kKCJOZXdYIiwgbmV3IFN0cmluZ1tdIHsiSSJ9KTsKLQlJTWV0aG9kIGNvbnN0cnVjdG9yMiA9IG5ld1R5cGUyLmdldE1ldGhvZCgiTmV3WSIsIG5ldyBTdHJpbmdbXSB7fSk7Ci0JYXNzZXJ0VHJ1ZSgiTmV3WChpbnQpIHNob3VsZCBiZSBwcmVzZW50IiwgY29uc3RydWN0b3IxLmV4aXN0cygpKTsKLQlhc3NlcnRUcnVlKCJOZXdZKCkgc2hvdWxkIGJlIHByZXNlbnQiLCBjb25zdHJ1Y3RvcjIuZXhpc3RzKCkpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgbWFpbiB0eXBlcyBjYW4gYmUgcmVuYW1lZCBhcyB3ZWxsIGFzIGEgY2hpbGQgb2YgYSBtYWluIHR5cGUuIEFzIGEgc2lkZSBlZmZlY3QKLSAqIG9mIHJlbmFtaW5nIHRoZSBtYWluIHR5cGVzLCB0aGUgdHlwZXMgZW5jbG9zaW5nIGNvbXBpbGF0aW9uIHVuaXQKLSAqIGFyZSByZW5hbWVkIGFzIHdlbGwuCi0gKiBAc2VlIDFGVEtNQkQ6IElUUEpDT1JFOkFMTCAtIEpNLSBDYW5ub3QgcmVuYW1lIHBhcmVudCBhbmQgY2hpbGQgd2l0aCB0aGUgc2FtZSBvcGVyYXRpb24KLSAqLwotcHVibGljIHZvaWQgdGVzdFJlbmFtZU1haW5UeXBlc0FuZEFDaGlsZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMvWS5qYXZhIiwKLQkJInB1YmxpYyBjbGFzcyBZIHtcbiIgKwotCQkiICBwdWJsaWMgWSgpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iCi0JKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1MiA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1kuamF2YSIpOwotCi0JU3RyaW5nW10gbmV3TmFtZXMgPSBuZXcgU3RyaW5nW10gewotCQkibmV3QmFyIiwKLQkJIk5ld1giLAotCQkiTmV3WSIKLQl9OwotCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gbmV3IElKYXZhRWxlbWVudFtdIHsKLQkJdGhpcy5jdS5nZXRUeXBlKCJYIikuZ2V0RmllbGQoImJhciIpLAotCQl0aGlzLmN1LmdldFR5cGUoIlgiKSwKLQkJY3UyLmdldFR5cGUoIlkiKQotCX07Ci0JSUphdmFFbGVtZW50W10gZGVzdGluYXRpb25zID0gbmV3IElKYXZhRWxlbWVudFtlbGVtZW50cy5sZW5ndGhdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJZGVzdGluYXRpb25zW2ldID0gZWxlbWVudHNbaV0uZ2V0UGFyZW50KCk7Ci0JfQotCQotCWdldEphdmFNb2RlbCgpLnJlbmFtZShlbGVtZW50cywgZGVzdGluYXRpb25zLCBuZXdOYW1lcywgZmFsc2UsIG51bGwpOwotCi0JLy90ZXN0IHRoYXQgYm90aCB0aGUgY29tcGlsYXRpb24gdW5pdCBhbmQgdGhlIG1haW4gdHlwZSBoYXZlIGJlZW4gcmVuYW1lZC4KLQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IChJUGFja2FnZUZyYWdtZW50KSB0aGlzLmN1LmdldFBhcmVudCgpOwotCUlDb21waWxhdGlvblVuaXQgcmVuYW1lZENVMT0gcGtnLmdldENvbXBpbGF0aW9uVW5pdCgiTmV3WC5qYXZhIik7Ci0JSVR5cGUgbmV3WCA9IHJlbmFtZWRDVTEuZ2V0VHlwZSgiTmV3WCIpOwotCWFzc2VydFRydWUoIk5ld1ggc2hvdWxkIGJlIHByZXNlbnQiLCBuZXdYLmV4aXN0cygpKTsKLQkKLQlJQ29tcGlsYXRpb25Vbml0IHJlbmFtZWRDVTI9IHBrZy5nZXRDb21waWxhdGlvblVuaXQoIk5ld1kuamF2YSIpOwotCUlUeXBlIG5ld1kgPSByZW5hbWVkQ1UyLmdldFR5cGUoIk5ld1kiKTsKLQlhc3NlcnRUcnVlKCJOZXdZIHNob3VsZCBiZSBwcmVzZW50IiwgbmV3WS5leGlzdHMoKSk7Ci0JCi0JSUZpZWxkIG5ld0JhciA9IG5ld1guZ2V0RmllbGQoIm5ld0JhciIpOwotCWFzc2VydFRydWUoIlJlbmFtZWQgZmllbGQgc2hvdWxkIGV4aXN0IiwgbmV3QmFyLmV4aXN0cygpKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgbWV0aG9kIGNhbiBiZSByZW5hbWVkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVuYW1lTWV0aG9kKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IHRoaXMuY3UuZ2V0VHlwZSgiWCIpOwotCUlNZXRob2QgbWV0aG9kID0gdHlwZS5nZXRNZXRob2QoImZvbyIsIG5ldyBTdHJpbmdbXSB7IlFTdHJpbmc7In0pOwotCXJlbmFtZVBvc2l0aXZlKG1ldGhvZCwgIm5ld0ZvbyIsIGZhbHNlKTsKLQkKLQkvL2Vuc3VyZSB0aGF0IHRoZSBtZXRob2QgZGlkIG5vdCBtb3ZlIGFzIGEgcmVzdWx0IG9mIHRoZSByZW5hbWUKLQllbnN1cmVDb3JyZWN0UG9zaXRpb25pbmcoCi0JCXR5cGUsIAotCQl0eXBlLmdldE1ldGhvZCgibmV3Rm9vIiwgbmV3IFN0cmluZ1tdIHsiUVN0cmluZzsifSksIAotCQl0eXBlLmdldE1ldGhvZCgib3RoZXJNZXRob2QiLCBuZXcgU3RyaW5nW10geyJRU3RyaW5nOyJ9KSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIG1ldGhvZCBjYW5ub3QgYmUgcmVuYW1lZCB0byBhbiBleGlzdGluZyBtZXRob2QgbmFtZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJlbmFtZU1ldGhvZFJlc3VsdGluZ0luQ29sbGlzaW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IHRoaXMuY3UuZ2V0VHlwZSgiWCIpOwotCUlNZXRob2QgbWV0aG9kID0gdHlwZS5nZXRNZXRob2QoImZvbyIsIG5ldyBTdHJpbmdbXSB7IlFTdHJpbmc7In0pOwotCXJlbmFtZU5lZ2F0aXZlKG1ldGhvZCwgIm90aGVyTWV0aG9kIiwgZmFsc2UsIElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuTkFNRV9DT0xMSVNJT04pOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBtZXRob2QgY2Fubm90IGJlIHJlbmFtZWQgdG8gYW4gaW52YWxpZCBtZXRob2QgbmFtZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVuYW1lTWV0aG9kc1dpdGhJbnZhbGlkTmFtZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlNZXRob2QgbWV0aG9kID0gdGhpcy5jdS5nZXRUeXBlKCJYIikuZ2V0TWV0aG9kKCJmb28iLCBuZXcgU3RyaW5nW10geyJRU3RyaW5nOyJ9KTsKLQlyZW5hbWVOZWdhdGl2ZShtZXRob2QsICIlJXNvbWVJbnZhbGlkTmFtZSIsIGZhbHNlLCBJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLklOVkFMSURfTkFNRSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0UmVuYW1lUEYoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy94L3kveiIpOwotCXRoaXMuY3JlYXRlRmlsZSgKLQkJIi9QL3NyYy94L3kvei9BLmphdmEiLAotCQkicGFja2FnZSB4LnkuejtcbiIgKwotCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCSJ9IgotCSk7Ci0KLQlJUGFja2FnZUZyYWdtZW50IGZyYWcgPSBnZXRQYWNrYWdlKCIvUC9zcmMveC95L3oiKTsKLQljbGVhckRlbHRhcygpOwotCWZyYWcucmVuYW1lKCJ4LnkubmV3WiIsIGZhbHNlLCBudWxsKTsKLQkKLQlJUGFja2FnZUZyYWdtZW50IG5ld0ZyYWcgPSBnZXRQYWNrYWdlKCIvUC9zcmMveC95L25ld1oiKTsKLQlhc3NlcnRUcnVlKCJPbGQgcGFja2FnZSBzaG91bGQgbm90IGV4aXN0IiwgIWZyYWcuZXhpc3RzKCkpOwotCWFzc2VydFRydWUoIk5ldyBwYWNrYWdlIHNob3VsZCBleGlzdCIsIG5ld0ZyYWcuZXhpc3RzKCkpOwotCi0JSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBuZXdGcmFnLmdldENvbXBpbGF0aW9uVW5pdCgiQS5qYXZhIik7Ci0JYXNzZXJ0VHJ1ZSgiQS5qYXZhIHNob3VsZCBleGl0cyBpbiBuZXcgcGFja2FnZSIsIGNvbXBpbGF0aW9uVW5pdC5leGlzdHMoKSk7Ci0JCi0JSVR5cGVbXSB0eXBlcyA9IGNvbXBpbGF0aW9uVW5pdC5nZXRUeXBlcygpOwotCWFzc2VydFRydWUodHlwZXMgIT0gbnVsbCAmJiB0eXBlcy5sZW5ndGggPT0gMSk7Ci0JSVR5cGUgbWFpblR5cGUgPSB0eXBlc1swXTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJVbmV4cGVjdGVkIEEuamF2YSdzIG1haW4gdHlwZSciLCAKLQkJIngueS5uZXdaLkEiLAotCQltYWluVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0KLQlhc3NlcnREZWx0YXMoCi0JCSJVbmV4cGVjdGVkIGRlbHRhcyIsCi0JCSJQWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCSIJc3JjWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCSIJCXgueS56Wy1dOiB7TU9WRURfVE8oeC55Lm5ld1ogW2luIHNyYyBbaW4gUF1dKX1cbiIgKyAKLQkJIgkJeC55Lm5ld1pbK106IHtNT1ZFRF9GUk9NKHgueS56IFtpbiBzcmMgW2luIFBdXSl9IgotCSk7Ci19Ci0vKgotICogRW5zdXJlcyB0aGF0IHJlbmFtaW5nIHRvIGEgbmFtZSBjb250YWluaW5nIHNwYWNlcyB3b3JrcwotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDIxOTU3ICdyZWZhY3RvciByZW5hbWUnIGFsbG93cyBzdWJwYWNrYWdlIG5hbWUgdG8gc3RhcnQgd2l0aCBhIHNwYWNlKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVuYW1lUEYyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuY3JlYXRlRm9sZGVyKCIvUC9zcmMveC95L3oiKTsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMveC95L3ovQS5qYXZhIiwKLQkJInBhY2thZ2UgeC55Lno7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkifSIKLQkpOwotCi0JSVBhY2thZ2VGcmFnbWVudCBmcmFnID0gZ2V0UGFja2FnZSgiL1Avc3JjL3gveS96Iik7Ci0JY2xlYXJEZWx0YXMoKTsKLQlmcmFnLnJlbmFtZSgieC55LiB6MiIsIGZhbHNlLCBudWxsKTsKLQkKLQlJUGFja2FnZUZyYWdtZW50IG5ld0ZyYWcgPSBnZXRQYWNrYWdlKCIvUC9zcmMveC95L3oyIik7Ci0JYXNzZXJ0VHJ1ZSgiT2xkIHBhY2thZ2Ugc2hvdWxkIG5vdCBleGlzdCIsICFmcmFnLmV4aXN0cygpKTsKLQlhc3NlcnRUcnVlKCJOZXcgcGFja2FnZSBzaG91bGQgZXhpc3QiLCBuZXdGcmFnLmV4aXN0cygpKTsKLQotCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gbmV3RnJhZy5nZXRDb21waWxhdGlvblVuaXQoIkEuamF2YSIpOwotCWFzc2VydFRydWUoIkEuamF2YSBzaG91bGQgZXhpdHMgaW4gbmV3IHBhY2thZ2UiLCBjb21waWxhdGlvblVuaXQuZXhpc3RzKCkpOwotCQotCUlUeXBlW10gdHlwZXMgPSBjb21waWxhdGlvblVuaXQuZ2V0VHlwZXMoKTsKLQlhc3NlcnRUcnVlKHR5cGVzICE9IG51bGwgJiYgdHlwZXMubGVuZ3RoID09IDEpOwotCUlUeXBlIG1haW5UeXBlID0gdHlwZXNbMF07Ci0JYXNzZXJ0RXF1YWxzKAotCQkiVW5leHBlY3RlZCBBLmphdmEncyBtYWluIHR5cGUnIiwgCi0JCSJ4LnkuejIuQSIsCi0JCW1haW5UeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQotCWFzc2VydERlbHRhcygKLQkJIlVuZXhwZWN0ZWQgZGVsdGFzIiwKLQkJIlBbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJIglzcmNbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJIgkJeC55LnpbLV06IHtNT1ZFRF9UTyh4LnkuejIgW2luIHNyYyBbaW4gUF1dKX1cbiIgKyAKLQkJIgkJeC55LnoyWytdOiB7TU9WRURfRlJPTSh4LnkueiBbaW4gc3JjIFtpbiBQXV0pfSIKLQkpOwotfQotcHVibGljIHZvaWQgdGVzdFJlbmFtZVBGV2l0aFN1YlBhY2thZ2VzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuY3JlYXRlRm9sZGVyKCIvUC9zcmMveC95L3oiKTsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSIvUC9zcmMveC95L3ovQS5qYXZhIiwKLQkJInBhY2thZ2UgeC55Lno7XG4iICsKLQkJInB1YmxpYyBjbGFzcyBBIHtcbiIgKwotCQkifSIKLQkpOwotCi0JY2xlYXJEZWx0YXMoKTsKLQlnZXRQYWNrYWdlKCIvUC9zcmMveCIpLnJlbmFtZSgibmV3WCIsIGZhbHNlLCBudWxsKTsKLQkKLQlJUGFja2FnZUZyYWdtZW50IG9sZEZyYWcgPSBnZXRQYWNrYWdlKCIvUC9zcmMveC95L3oiKTsKLQlhc3NlcnRUcnVlKCJPbGQgaW5uZXIgcGFja2FnZSBzaG91bGQgc3RpbGwgZXhpc3QiLCBvbGRGcmFnLmV4aXN0cygpKTsKLQotCUlQYWNrYWdlRnJhZ21lbnQgbmV3RnJhZyA9IGdldFBhY2thZ2UoIi9QL3NyYy9uZXdYIik7Ci0JYXNzZXJ0VHJ1ZSgiTmV3IHBhY2thZ2Ugc2hvdWxkIGV4aXN0IiwgbmV3RnJhZy5leGlzdHMoKSk7Ci0KLQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IG9sZEZyYWcuZ2V0Q29tcGlsYXRpb25Vbml0KCJBLmphdmEiKTsKLQlhc3NlcnRUcnVlKCJBLmphdmEgc2hvdWxkIGV4aXRzIGluIG9sZCBpbm5lciBwYWNrYWdlIiwgY29tcGlsYXRpb25Vbml0LmV4aXN0cygpKTsKLQkKLQlhc3NlcnREZWx0YXMoCi0JCSJVbmV4cGVjdGVkIGRlbHRhcyIsCi0JCSJQWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCSIJc3JjWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCSIJCW5ld1hbK106IHt9IgotCSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIG1ldGhvZCBjYW4gYmUgcmVuYW1lZCBpZiBpdCBjb250YWlucyBzeW50YXggZXJyb3JzLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVuYW1lU3ludGF4RXJyb3JNZXRob2QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy5jcmVhdGVGaWxlKAotCQkiL1Avc3JjL1kuamF2YSIsCi0JCSJwdWJsaWMgY2xhc3MgWSB7XG4iICsKLQkJIiAgdm9pZCBmb28oIHtcbiIgKyAvLyBzeW50YXggZXJyb3IKLQkJIiAgfVxuIiArCi0JCSJ9IgotCSk7Ci0JSU1ldGhvZCBtZXRob2QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9ZLmphdmEiKS5nZXRUeXBlKCJZIikuZ2V0TWV0aG9kKCJmb28iLCBudWxsKTs7Ci0JcmVuYW1lUG9zaXRpdmUobWV0aG9kLCAibmV3Rm9vIiwgZmFsc2UpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYXR0ZW1wdGluZyB0byByZW5hbWUgd2l0aCBhbiBpbmNvcnJlY3QgbnVtYmVyIG9mIHJlbmFtaW5ncyBmYWlscwotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVuYW1lV2l0aEludmFsaWRSZW5hbWluZ3MoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJTWV0aG9kIG1ldGhvZCA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL1guamF2YSIpLmdldFR5cGUoIlgiKS5nZXRNZXRob2QoImZvbyIsIG51bGwpOzsKLQotCXJlbmFtZU5lZ2F0aXZlKAotCQluZXcgSUphdmFFbGVtZW50W10ge21ldGhvZH0sIAotCQluZXcgU3RyaW5nW117IiIsICIifSwgCi0JCWZhbHNlLCAKLQkJSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTkRFWF9PVVRfT0ZfQk9VTkRTKTsKLQotCXJlbmFtZU5lZ2F0aXZlKAotCQluZXcgSUphdmFFbGVtZW50W10ge21ldGhvZH0sIAotCQludWxsLCAKLQkJZmFsc2UsIAotCQlJSmF2YU1vZGVsU3RhdHVzQ29uc3RhbnRzLk5VTExfTkFNRSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIHdvcmtpbmcgY29weSBjYW5ub3QgYmUgcmVuYW1lZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJlbmFtZVdvcmtpbmdDb3B5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSVdvcmtpbmdDb3B5IGNvcHkgPSBudWxsOwotCXRyeSB7Ci0JCWNvcHkgPSAoSVdvcmtpbmdDb3B5KSB0aGlzLmN1LmdldFdvcmtpbmdDb3B5KCk7Ci0JCXJlbmFtZU5lZ2F0aXZlKChJSmF2YUVsZW1lbnQpY29weSwgIk5ld1giLCBmYWxzZSwgSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0VMRU1FTlRfVFlQRVMpOwotCX0gZmluYWxseSB7Ci0JCWlmIChjb3B5ICE9IG51bGwpIGNvcHkuZGVzdHJveSgpOwotCX0KLX0KLQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL1Jlc29sdmVUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL1Jlc29sdmVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTFlOGM0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9SZXNvbHZlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbFN0YXR1czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi1wdWJsaWMgY2xhc3MgUmVzb2x2ZVRlc3RzIGV4dGVuZHMgQWJzdHJhY3RKYXZhTW9kZWxUZXN0cyB7Ci0KLXB1YmxpYyBSZXNvbHZlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXB1YmxpYyB2b2lkIHNldFVwU3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQlzdXBlci5zZXRVcFN1aXRlKCk7Ci0JCi0Jc2V0VXBKYXZhUHJvamVjdCgiUmVzb2x2ZSIpOwotfQotcHVibGljIHZvaWQgdGVhckRvd25TdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCWRlbGV0ZVByb2plY3QoIlJlc29sdmUiKTsKLQkKLQlzdXBlci50ZWFyRG93blN1aXRlKCk7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBTdWl0ZShSZXNvbHZlVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkKLQkvLyBlbXB0eSBzZWxlY3Rpb24gdGVzdHMKLQlzdWl0ZS5hZGRUZXN0KG5ldyBSZXNvbHZlVGVzdHMoInRlc3RSZXNvbHZlRW1wdHlTZWxlY3Rpb24iKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgUmVzb2x2ZVRlc3RzKCJ0ZXN0UmVzb2x2ZUVtcHR5U2VsZWN0aW9uMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBSZXNvbHZlVGVzdHMoInRlc3RSZXNvbHZlRW1wdHlTZWxlY3Rpb25Pbk1ldGhvZCIpKTsKLQkKLQkvLyBzZWxlY3Rpb24gdGVzdHMKLQlzdWl0ZS5hZGRUZXN0KG5ldyBSZXNvbHZlVGVzdHMoInRlc3RSZXNvbHZlSW52YWxpZFJlc29sdmUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgUmVzb2x2ZVRlc3RzKCJ0ZXN0UmVzb2x2ZUNvbnN0cnVjdG9yIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IFJlc29sdmVUZXN0cygidGVzdFJlc29sdmVNZXRob2QiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgUmVzb2x2ZVRlc3RzKCJ0ZXN0UmVzb2x2ZUZpZWxkIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IFJlc29sdmVUZXN0cygidGVzdFJlc29sdmVQYWNrYWdlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IFJlc29sdmVUZXN0cygidGVzdFJlc29sdmVDbGFzczEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgUmVzb2x2ZVRlc3RzKCJ0ZXN0UmVzb2x2ZUNsYXNzMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBSZXNvbHZlVGVzdHMoInRlc3RSZXNvbHZlQ2xhc3MzIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IFJlc29sdmVUZXN0cygidGVzdFJlc29sdmVDbGFzczQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgUmVzb2x2ZVRlc3RzKCJ0ZXN0UmVzb2x2ZUNsYXNzNSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBSZXNvbHZlVGVzdHMoInRlc3RSZXNvbHZlQ2xhc3M2IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IFJlc29sdmVUZXN0cygidGVzdFJlc29sdmVJbnRlcmZhY2UiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgUmVzb2x2ZVRlc3RzKCJ0ZXN0UmVzb2x2ZUluQ2xhc3NGaWxlV2l0aFNvdXJjZSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBSZXNvbHZlVGVzdHMoInRlc3RSZXNvbHZlSW5DbGFzc0ZpbGVXaXRob3V0U291cmNlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IFJlc29sdmVUZXN0cygidGVzdFJlc29sdmVRdWFsaWZpZWRUeXBlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IFJlc29sdmVUZXN0cygidGVzdFJlc29sdmVQYXJ0aWFsbHlRdWFsaWZpZWRUeXBlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IFJlc29sdmVUZXN0cygidGVzdFJlc29sdmVVbmljb2RlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IFJlc29sdmVUZXN0cygidGVzdE5lZ2F0aXZlUmVzb2x2ZVVuaWNvZGUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgUmVzb2x2ZVRlc3RzKCJ0ZXN0UmVzb2x2ZUFycmF5TGVuZ3RoIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IFJlc29sdmVUZXN0cygidGVzdFJlc29sdmVDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IFJlc29sdmVUZXN0cygidGVzdFJlc29sdmVNZXRob2REZWNsYXJhdGlvbiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBSZXNvbHZlVGVzdHMoInRlc3RSZXNvbHZlRmllbGREZWNsYXJhdGlvbiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBSZXNvbHZlVGVzdHMoInRlc3RSZXNvbHZlVHlwZURlY2xhcmF0aW9uIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IFJlc29sdmVUZXN0cygidGVzdFJlc29sdmVNZW1iZXJUeXBlRGVjbGFyYXRpb24iKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgUmVzb2x2ZVRlc3RzKCJ0ZXN0UmVzb2x2ZU1lbWJlclR5cGVEZWNsYXJhdGlvbjIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgUmVzb2x2ZVRlc3RzKCJ0ZXN0UmVzb2x2ZU1ldGhvZFdpdGhJbmNvcnJlY3RQYXJhbWV0ZXIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgUmVzb2x2ZVRlc3RzKCJ0ZXN0UmVzb2x2ZUV4cGxpY2l0U3VwZXJDb25zdHJ1Y3RvckNhbGwiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgUmVzb2x2ZVRlc3RzKCJ0ZXN0UmVzb2x2ZUV4cGxpY2l0VGhpc0NvbnN0cnVjdG9yQ2FsbCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBSZXNvbHZlVGVzdHMoInRlc3RSZXNvbHZlTWVzc2FnZVNlbmRPbkJhc2VUeXBlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IFJlc29sdmVUZXN0cygidGVzdFJlc29sdmVNZXRob2RXaXRoSW5uZXJUeXBlSW5DbGFzc0ZpbGUiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgUmVzb2x2ZVRlc3RzKCJ0ZXN0UmVzb2x2ZU1ldGhvZFdpdGhJbm5lclR5cGVJbkNsYXNzRmlsZTIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgUmVzb2x2ZVRlc3RzKCJ0ZXN0UmVzb2x2ZVR5cGVJbkNvbW1lbnQiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgUmVzb2x2ZVRlc3RzKCJ0ZXN0UmVzb2x2ZUltcG9ydCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBSZXNvbHZlVGVzdHMoInRlc3RSZXNvbHZlQ29uc3RydWN0b3JDYWxsT2ZNZW1iZXJUeXBlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IFJlc29sdmVUZXN0cygidGVzdFJlc29sdmVMb2NhbE5hbWUxIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IFJlc29sdmVUZXN0cygidGVzdFJlc29sdmVMb2NhbE5hbWUyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IFJlc29sdmVUZXN0cygidGVzdFJlc29sdmVBcmd1bWVudE5hbWUxIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IFJlc29sdmVUZXN0cygidGVzdFJlc29sdmVBcmd1bWVudE5hbWUyIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IFJlc29sdmVUZXN0cygidGVzdFJlc29sdmVDYXRjaEFyZ3VtZW50TmFtZTEiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgUmVzb2x2ZVRlc3RzKCJ0ZXN0UmVzb2x2ZUNhdGNoQXJndW1lbnROYW1lMiIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBSZXNvbHZlVGVzdHMoInRlc3RSZXNvbHZlQWJzdHJhY3RNZXRob2QiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgUmVzb2x2ZVRlc3RzKCJ0ZXN0UmVzb2x2ZUlubmVyQ2xhc3NBc1BhcmFtYXRlciIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBSZXNvbHZlVGVzdHMoInRlc3RSZXNvbHZlQ2F0Y2hBcmd1bWVudFR5cGUxIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IFJlc29sdmVUZXN0cygidGVzdFJlc29sdmVDYXRjaEFyZ3VtZW50VHlwZTIiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgUmVzb2x2ZVRlc3RzKCJ0ZXN0UmVzb2x2ZVN0YXRpY0NsYXNzQ29uc3RydWN0b3IiKSk7Ci0JcmV0dXJuIHN1aXRlOwotfQotCi0vKioKLSAqIFJlc29sdmUgZW1wdHkgc2VsZWN0aW9uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlRW1wdHlTZWxlY3Rpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJSZXNvbHZlIiwgInNyYyIsICIiLCAiUmVzb2x2ZVR5cGVFbXB0eVNlbGVjdGlvbi5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIHNlbGVjdEF0ID0gImVjdCI7Ci0JU3RyaW5nIHNlbGVjdGlvbiA9ICIiOwotCWludCBzdGFydCA9IHN0ci5sYXN0SW5kZXhPZihzZWxlY3RBdCk7Ci0JaW50IGxlbmd0aCA9IHNlbGVjdGlvbi5sZW5ndGgoKTsKLQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IGN1LmNvZGVTZWxlY3Qoc3RhcnQsIGxlbmd0aCk7Ci0JCi0JYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgb25lIHR5cGUiLCBlbGVtZW50cy5sZW5ndGggPT0gMSAmJiAKLQkJZWxlbWVudHNbMF0uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoIk9iamVjdCIpICYmCi0JCWVsZW1lbnRzWzBdIGluc3RhbmNlb2YgSVR5cGUpOwkKLX0KLS8qKgotICogUmVzb2x2ZSBlbXB0eSBzZWxlY3Rpb24KLSAqLwotcHVibGljIHZvaWQgdGVzdFJlc29sdmVFbXB0eVNlbGVjdGlvbjIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJSZXNvbHZlIiwgInNyYyIsICIiLCAiUmVzb2x2ZVR5cGVFbXB0eVNlbGVjdGlvbjIuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBzZWxlY3RBdCA9ICJPYmoiOwotCVN0cmluZyBzZWxlY3Rpb24gPSAiIjsKLQlpbnQgc3RhcnQgPSBzdHIubGFzdEluZGV4T2Yoc2VsZWN0QXQpOwotCWludCBsZW5ndGggPSBzZWxlY3Rpb24ubGVuZ3RoKCk7Ci0JSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBjdS5jb2RlU2VsZWN0KHN0YXJ0LCBsZW5ndGgpOwotCQotCWFzc2VydFRydWUoInNob3VsZCBoYXZlIG9uZSB0eXBlIiwgZWxlbWVudHMubGVuZ3RoID09IDEgJiYgCi0JCWVsZW1lbnRzWzBdLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKCJPYmplY3QiKSAmJgotCQllbGVtZW50c1swXSBpbnN0YW5jZW9mIElUeXBlKTsJCi19Ci0vKioKLSAqIFJlc29sdmUgZW1wdHkgc2VsZWN0aW9uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlRW1wdHlTZWxlY3Rpb25Pbk1ldGhvZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlJlc29sdmUiLCAic3JjIiwgIiIsICJSZXNvbHZlRW1wdHlTZWxlY3Rpb25Pbk1ldGhvZC5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIHNlbGVjdEF0ID0gIm9vIjsKLQlTdHJpbmcgc2VsZWN0aW9uID0gIiI7Ci0JaW50IHN0YXJ0ID0gc3RyLmxhc3RJbmRleE9mKHNlbGVjdEF0KTsKLQlpbnQgbGVuZ3RoID0gc2VsZWN0aW9uLmxlbmd0aCgpOwotCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gY3UuY29kZVNlbGVjdChzdGFydCwgbGVuZ3RoKTsKLQkKLQlhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBvbmUgbWV0aG9kIiwgZWxlbWVudHMubGVuZ3RoID09IDEgJiYgCi0JCWVsZW1lbnRzWzBdLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKCJmb28iKSAmJgotCQllbGVtZW50c1swXSBpbnN0YW5jZW9mIElNZXRob2QpOwkKLX0KLS8qKgotICogUmVzb2x2ZSB0aGUgbWV0aG9kCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlTWV0aG9kV2l0aEluY29ycmVjdFBhcmFtZXRlcigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlJlc29sdmUiLCAic3JjIiwgIiIsICJSZXNvbHZlTWV0aG9kV2l0aEluY29ycmVjdFBhcmFtZXRlci5qYXZhIik7Ci0JCi0JU3RyaW5nIHNvdXJjZSA9IGN1LmdldFNvdXJjZSgpOwotCQotCWludCBzdGFydCA9IHNvdXJjZS5pbmRleE9mKCJmb28oXCJTdHJpbmciKTsKLQlpbnQgbGVuZ3RoID0gImZvbyIubGVuZ3RoKCk7Ci0JCi0JSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBjdS5jb2RlU2VsZWN0KHN0YXJ0LCBsZW5ndGgpOwotCWFzc2VydFRydWUoInNob3VsZCBoYXZlIG9uZSBtZXRob2Qgb2YgJ2ZvbyciLAotCQllbGVtZW50cy5sZW5ndGggPT0gMSAmJgotCQllbGVtZW50c1swXS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscygiZm9vIikgJiYKLQkJZWxlbWVudHNbMF0gaW5zdGFuY2VvZiBJTWV0aG9kKTsJCQotfQotLyoqCi0gKiBSZXNvbHNlIGV4cGxpY2l0IHN1cGVyIGNvbnN0cnVjdG9yIGNhbGwKLSAqLwotcHVibGljIHZvaWQgdGVzdFJlc29sdmVFeHBsaWNpdFN1cGVyQ29uc3RydWN0b3JDYWxsKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiUmVzb2x2ZSIsICJzcmMiLCAiIiwgIlJlc29sdmVFeHBsaWNpdFN1cGVyQ29uc3RydWN0b3JDYWxsLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgc2VsZWN0QXQgPSAic3VwZXIoIjsKLQlTdHJpbmcgc2VsZWN0aW9uID0gInN1cGVyIjsKLQlpbnQgc3RhcnQgPSBzdHIuaW5kZXhPZihzZWxlY3RBdCk7Ci0JaW50IGxlbmd0aCA9IHNlbGVjdGlvbi5sZW5ndGgoKTsKLQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IGN1LmNvZGVTZWxlY3Qoc3RhcnQsIGxlbmd0aCk7Ci0KLQlhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBvbmUgdHlwZSIsIGVsZW1lbnRzLmxlbmd0aCA9PSAxICYmIAotCQllbGVtZW50c1swXS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscygiU3VwZXJDbGFzcyIpICYmCi0JCWVsZW1lbnRzWzBdIGluc3RhbmNlb2YgSU1ldGhvZCk7CQotfQotLyoqCi0gKiBSZXNvbHNlIGV4cGxpY2l0IHRoaXMgY29uc3RydWN0b3IgY2FsbAotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZUV4cGxpY2l0VGhpc0NvbnN0cnVjdG9yQ2FsbCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlJlc29sdmUiLCAic3JjIiwgIiIsICJSZXNvbHZlRXhwbGljaXRUaGlzQ29uc3RydWN0b3JDYWxsLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgc2VsZWN0QXQgPSAidGhpcygiOwotCVN0cmluZyBzZWxlY3Rpb24gPSAidGhpcyI7Ci0JaW50IHN0YXJ0ID0gc3RyLmluZGV4T2Yoc2VsZWN0QXQpOwotCWludCBsZW5ndGggPSBzZWxlY3Rpb24ubGVuZ3RoKCk7Ci0JSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBjdS5jb2RlU2VsZWN0KHN0YXJ0LCBsZW5ndGgpOwotCi0JYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgb25lIHR5cGUiLCBlbGVtZW50cy5sZW5ndGggPT0gMSAmJiAKLQkJZWxlbWVudHNbMF0uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoIlJlc29sdmVFeHBsaWNpdFRoaXNDb25zdHJ1Y3RvckNhbGwiKSAmJgotCQllbGVtZW50c1swXSBpbnN0YW5jZW9mIElNZXRob2QpOwkKLX0KLS8qKgotICogVHJ5IHRvIHJlc29sdmUgbWVzc2FnZSBzZW5kIG9uIGJhc2UgdHlwZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJlc29sdmVNZXNzYWdlU2VuZE9uQmFzZVR5cGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJSZXNvbHZlIiwgInNyYyIsICIiLCAiUmVzb2x2ZU1lc3NhZ2VTZW5kT25CYXNlVHlwZS5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIHNlbGVjdEF0ID0gImhlbGxvIjsKLQlTdHJpbmcgc2VsZWN0aW9uID0gImhlbGxvIjsKLQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IGN1LmNvZGVTZWxlY3QoCi0JCXN0ci5pbmRleE9mKHNlbGVjdEF0KSwgCi0JCXNlbGVjdGlvbi5sZW5ndGgoKSk7Ci0KLQlhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBub3RoaW5nIiwgZWxlbWVudHMubGVuZ3RoID09IDApOwkKLX0KLS8qKgotICogUmVzb2x2ZSBtZXRob2QgaW4gaW5uZXIgdHlwZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJlc29sdmVNZXRob2RXaXRoSW5uZXJUeXBlSW5DbGFzc0ZpbGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJQ2xhc3NGaWxlIGN1ID0gZ2V0Q2xhc3NGaWxlKCJSZXNvbHZlIiwgInp6ei5qYXIiLCAiIiwgIk15Q2xhc3MkSW5uZXIuY2xhc3MiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgc2VsZWN0QXQgPSAidGVzdCI7Ci0JU3RyaW5nIHNlbGVjdGlvbiA9ICJ0ZXN0IjsKLQlpbnQgc3RhcnQgPSBzdHIuaW5kZXhPZihzZWxlY3RBdCk7Ci0JaW50IGxlbmd0aCA9IHNlbGVjdGlvbi5sZW5ndGgoKTsKLQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IGN1LmNvZGVTZWxlY3Qoc3RhcnQsIGxlbmd0aCk7Ci0KLQlhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBvbmUgbWV0aG9kIiwgZWxlbWVudHMubGVuZ3RoID09IDEgJiYgCi0JCWVsZW1lbnRzWzBdLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKCJ0ZXN0IikgJiYKLQkJZWxlbWVudHNbMF0gaW5zdGFuY2VvZiBJTWV0aG9kKTsJCi19Ci0vKioKLSAqIGJ1ZyAzMzc4NQotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZU1ldGhvZFdpdGhJbm5lclR5cGVJbkNsYXNzRmlsZTIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJQ2xhc3NGaWxlIGN1ID0gZ2V0Q2xhc3NGaWxlKCJSZXNvbHZlIiwgInp6ei5qYXIiLCAiIiwgIk15Q2xhc3MyJElubmVyLmNsYXNzIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIHNlbGVjdEF0ID0gIm1ldGhvZCI7Ci0JU3RyaW5nIHNlbGVjdGlvbiA9ICJtZXRob2QiOwotCWludCBzdGFydCA9IHN0ci5sYXN0SW5kZXhPZihzZWxlY3RBdCk7Ci0JaW50IGxlbmd0aCA9IHNlbGVjdGlvbi5sZW5ndGgoKTsKLQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IGN1LmNvZGVTZWxlY3Qoc3RhcnQsIGxlbmd0aCk7Ci0KLQlhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBvbmUgbWV0aG9kIiwgZWxlbWVudHMubGVuZ3RoID09IDEgJiYgCi0JCWVsZW1lbnRzWzBdLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKCJtZXRob2QiKSAmJgotCQllbGVtZW50c1swXSBpbnN0YW5jZW9mIElNZXRob2QpOwkKLQkJCi0JSU1ldGhvZCBtZXRob2QgPSAoSU1ldGhvZCkgZWxlbWVudHNbMF07Ci0JSVNvdXJjZVJhbmdlIHNvdXJjZVJhbmdlID0gbWV0aG9kLmdldFNvdXJjZVJhbmdlKCk7Ci0JU3RyaW5nIG1ldGhvZFN0cmluZyA9ICJ2b2lkIG1ldGhvZChNeUNsYXNzMi5Jbm5lcltdIGFyZyl7fSI7Ci0JaW50IG8gPSBzdHIuaW5kZXhPZihtZXRob2RTdHJpbmcpOwotCWludCBsID0gbWV0aG9kU3RyaW5nLmxlbmd0aCgpOwotCWFzc2VydFRydWUoInNvdXJjZSByYW5nZSBzaG91bGQgYmUgKCIrbysiLCIrbCsiKSBhbmQgbm90ICgiK3NvdXJjZVJhbmdlLmdldE9mZnNldCgpKyIsIitzb3VyY2VSYW5nZS5nZXRMZW5ndGgoKSsiKSIsIHNvdXJjZVJhbmdlLmdldE9mZnNldCgpID09IG8gJiYgc291cmNlUmFuZ2UuZ2V0TGVuZ3RoKCkgPT0gbCk7Ci19Ci0vKioKLSAqIFJlc29sdmUgdHlwZSBpbiBjb21tZW50LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZVR5cGVJbkNvbW1lbnQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJSZXNvbHZlIiwgInNyYyIsICIiLCAiUmVzb2x2ZVR5cGVJbkNvbW1lbnQuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBzZWxlY3RBdCA9ICJYICovIjsKLQlTdHJpbmcgc2VsZWN0aW9uID0gIlgiOwotCWludCBzdGFydCA9IHN0ci5pbmRleE9mKHNlbGVjdEF0KTsKLQlpbnQgbGVuZ3RoID0gc2VsZWN0aW9uLmxlbmd0aCgpOwotCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gY3UuY29kZVNlbGVjdChzdGFydCwgbGVuZ3RoKTsKLQkKLQlhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBvbmUgdHlwZSIsIGVsZW1lbnRzLmxlbmd0aCA9PSAxICYmCi0JCWVsZW1lbnRzWzBdIGluc3RhbmNlb2YgSVR5cGUgJiYKLQkJKChJVHlwZSllbGVtZW50c1swXSkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKCJwMi5YIikpOwkKLX0KLS8qKgotICogUmVzb2x2ZSBpbiBpbXBvcnQKLSAqLwotcHVibGljIHZvaWQgdGVzdFJlc29sdmVJbXBvcnQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJSZXNvbHZlIiwgInNyYyIsICIiLCAiUmVzb2x2ZUltcG9ydC5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIHNlbGVjdEF0ID0gIkltcG9ydGVkQ2xhc3MiOwotCVN0cmluZyBzZWxlY3Rpb24gPSAiSW1wb3J0ZWRDbGFzcyI7Ci0JaW50IHN0YXJ0ID0gc3RyLmxhc3RJbmRleE9mKHNlbGVjdEF0KTsKLQlpbnQgbGVuZ3RoID0gc2VsZWN0aW9uLmxlbmd0aCgpOwotCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gY3UuY29kZVNlbGVjdChzdGFydCwgbGVuZ3RoKTsKLQkKLQlhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBvbmUgdHlwZSIsIGVsZW1lbnRzLmxlbmd0aCA9PSAxICYmIAotCQllbGVtZW50c1swXS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscygiSW1wb3J0ZWRDbGFzcyIpICYmCi0JCWVsZW1lbnRzWzBdIGluc3RhbmNlb2YgSVR5cGUpOwkKLX0KLS8qKgotICogUmVzb2x2ZSBjb25zdHJ1Y3RvciBjYWxsCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlQ29uc3RydWN0b3JDYWxsT2ZNZW1iZXJUeXBlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNsYXNzRmlsZSBjZiA9IGdldENsYXNzRmlsZSgiUmVzb2x2ZSIsICJjbGFzcy1mb2xkZXIiLCAiIiwgIlJlc29sdmVDb25zdHJ1Y3RvckNhbGxPZk1lbWJlclR5cGUuY2xhc3MiKTsKLQkKLQlTdHJpbmcgc3RyID0gY2YuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIHNlbGVjdEF0ID0gIklubmVyIjsKLQlTdHJpbmcgc2VsZWN0aW9uID0gIklubmVyIjsKLQlpbnQgc3RhcnQgPSBzdHIubGFzdEluZGV4T2Yoc2VsZWN0QXQpOwotCWludCBsZW5ndGggPSBzZWxlY3Rpb24ubGVuZ3RoKCk7Ci0JSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBjZi5jb2RlU2VsZWN0KHN0YXJ0LCBsZW5ndGgpOwotCQotCWFzc2VydFRydWUoInNob3VsZCBoYXZlIG9uZSBtZXRob2QiLCBlbGVtZW50cy5sZW5ndGggPT0gMSAmJiAKLQkJZWxlbWVudHNbMF0uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoIklubmVyIikgJiYKLQkJZWxlbWVudHNbMF0gaW5zdGFuY2VvZiBJTWV0aG9kKTsJCi19Ci0vKioKLSAqIFJlc29sdmUgYSBsb2NhbCBkZWNsYXJhdGlvbiBuYW1lCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlTG9jYWxOYW1lMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlJlc29sdmUiLCAic3JjIiwgIiIsICJSZXNvbHZlTG9jYWxOYW1lLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgc2VsZWN0QXQgPSAidmFyMSI7Ci0JU3RyaW5nIHNlbGVjdGlvbiA9ICJ2YXIxIjsKLQlpbnQgc3RhcnQgPSBzdHIubGFzdEluZGV4T2Yoc2VsZWN0QXQpOwotCWludCBsZW5ndGggPSBzZWxlY3Rpb24ubGVuZ3RoKCk7Ci0JSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBjdS5jb2RlU2VsZWN0KHN0YXJ0LCBsZW5ndGgpOwotCQotCWFzc2VydFRydWUoInNob3VsZCBoYXZlIG9uZSB0eXBlIiwgZWxlbWVudHMubGVuZ3RoID09IDEgJiYgCi0JCWVsZW1lbnRzWzBdLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKCJPYmplY3QiKSAmJgotCQllbGVtZW50c1swXSBpbnN0YW5jZW9mIElUeXBlKTsJCi19Ci0vKioKLSAqIFJlc29sdmUgYSBsb2NhbCBkZWNsYXJhdGlvbiBuYW1lIHdpdGggYmFzZSB0eXBlCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlTG9jYWxOYW1lMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlJlc29sdmUiLCAic3JjIiwgIiIsICJSZXNvbHZlTG9jYWxOYW1lLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgc2VsZWN0QXQgPSAidmFyMiI7Ci0JU3RyaW5nIHNlbGVjdGlvbiA9ICJ2YXIyIjsKLQlpbnQgc3RhcnQgPSBzdHIubGFzdEluZGV4T2Yoc2VsZWN0QXQpOwotCWludCBsZW5ndGggPSBzZWxlY3Rpb24ubGVuZ3RoKCk7Ci0JSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBjdS5jb2RlU2VsZWN0KHN0YXJ0LCBsZW5ndGgpOwotCQotCWFzc2VydFRydWUoInNob3VsZCBoYXZlIG5vdGhpbmciLCBlbGVtZW50cy5sZW5ndGggPT0gMCk7CQotfQotLyoqCi0gKiBSZXNvbHZlIGFuIGFyZ3VtZW50IG5hbWUKLSAqLwotcHVibGljIHZvaWQgdGVzdFJlc29sdmVBcmd1bWVudE5hbWUxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiUmVzb2x2ZSIsICJzcmMiLCAiIiwgIlJlc29sdmVBcmd1bWVudE5hbWUuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBzZWxlY3RBdCA9ICJ2YXIxIjsKLQlTdHJpbmcgc2VsZWN0aW9uID0gInZhcjEiOwotCWludCBzdGFydCA9IHN0ci5sYXN0SW5kZXhPZihzZWxlY3RBdCk7Ci0JaW50IGxlbmd0aCA9IHNlbGVjdGlvbi5sZW5ndGgoKTsKLQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IGN1LmNvZGVTZWxlY3Qoc3RhcnQsIGxlbmd0aCk7Ci0JCi0JYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgb25lIHR5cGUiLCBlbGVtZW50cy5sZW5ndGggPT0gMSAmJiAKLQkJZWxlbWVudHNbMF0uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoIk9iamVjdCIpICYmCi0JCWVsZW1lbnRzWzBdIGluc3RhbmNlb2YgSVR5cGUpOwkKLX0KLS8qKgotICogUmVzb2x2ZSBhbiBhcmd1bWVudCBuYW1lIHdpdGggYmFzZSB0eXBlCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlQXJndW1lbnROYW1lMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlJlc29sdmUiLCAic3JjIiwgIiIsICJSZXNvbHZlQXJndW1lbnROYW1lLmphdmEiKTsKLQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgc2VsZWN0QXQgPSAidmFyMiI7Ci0JU3RyaW5nIHNlbGVjdGlvbiA9ICJ2YXIyIjsKLQlpbnQgc3RhcnQgPSBzdHIubGFzdEluZGV4T2Yoc2VsZWN0QXQpOwotCWludCBsZW5ndGggPSBzZWxlY3Rpb24ubGVuZ3RoKCk7Ci0JSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBjdS5jb2RlU2VsZWN0KHN0YXJ0LCBsZW5ndGgpOwotCQotCWFzc2VydFRydWUoInNob3VsZCBoYXZlIG5vdGhpbmciLCBlbGVtZW50cy5sZW5ndGggPT0gMCk7CQotfQotCi0vKioKLSAqIFJlc29sdmUgYW4gYXJndW1lbnQgbmFtZSBpbnNpZGUgY2F0Y2ggc3RhdGVtZW50Ci0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlQ2F0Y2hBcmd1bWVudE5hbWUxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiUmVzb2x2ZSIsICJzcmMiLCAiIiwgIlJlc29sdmVDYXRjaEFyZ3VtZW50TmFtZS5qYXZhIik7Ci0KLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIHNlbGVjdEF0ID0gInZhcjEiOwotCVN0cmluZyBzZWxlY3Rpb24gPSAidmFyMSI7Ci0JaW50IHN0YXJ0ID0gc3RyLmxhc3RJbmRleE9mKHNlbGVjdEF0KTsKLQlpbnQgbGVuZ3RoID0gc2VsZWN0aW9uLmxlbmd0aCgpOwotCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gY3UuY29kZVNlbGVjdChzdGFydCwgbGVuZ3RoKTsKLQkKLQlhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBvbmUgdHlwZSIsIGVsZW1lbnRzLmxlbmd0aCA9PSAxICYmIAotCQllbGVtZW50c1swXS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscygiT2JqZWN0IikgJiYKLQkJZWxlbWVudHNbMF0gaW5zdGFuY2VvZiBJVHlwZSk7CQotfQotLyoqCi0gKiBSZXNvbHZlIGFuIGFyZ3VtZW50IG5hbWUgaW5zaWRlIGNhdGNoIHN0YXRlbWVudCB3aXRoIGJhc2UgdHlwZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZUNhdGNoQXJndW1lbnROYW1lMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlJlc29sdmUiLCAic3JjIiwgIiIsICJSZXNvbHZlQ2F0Y2hBcmd1bWVudE5hbWUuamF2YSIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBzZWxlY3RBdCA9ICJ2YXIyIjsKLQlTdHJpbmcgc2VsZWN0aW9uID0gInZhcjIiOwotCWludCBzdGFydCA9IHN0ci5sYXN0SW5kZXhPZihzZWxlY3RBdCk7Ci0JaW50IGxlbmd0aCA9IHNlbGVjdGlvbi5sZW5ndGgoKTsKLQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IGN1LmNvZGVTZWxlY3Qoc3RhcnQsIGxlbmd0aCk7Ci0JCi0JYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgbm90aGluZyIsIGVsZW1lbnRzLmxlbmd0aCA9PSAwKTsJCi19Ci0vKioKLSAqIEF0dGVtcHQgdG8gcmVzb2x2ZSBvdXRzaWRlIG9mIHRoZSByYW5nZSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJlc29sdmVJbnZhbGlkUmVzb2x2ZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlJlc29sdmUiLCAic3JjIiwgInAxIiwgIlguamF2YSIpOwotCXRyeSB7Ci0JCWN1LmNvZGVTZWxlY3QoLTEsIDEwKTsgCi0JfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3Qgc3RhdHVzIG9uIHRoZSBKYXZhTW9kZWxFeGNlcHRpb24iLCBqbWUuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpID09IEphdmFNb2RlbFN0YXR1cy5JTkRFWF9PVVRfT0ZfQk9VTkRTKTsKLQkJcmV0dXJuOwotCX0KLQlhc3NlcnRUcnVlKCJFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gZm9yIG91dCBvZiBib3VuZHMgcmVzb2x1dGlvbiIsIGZhbHNlKTsKLX0KLS8qKgotICogUmVzb2x2ZSBhIGNvbnN0cnVjdG9yCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlQ29uc3RydWN0b3IoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJSZXNvbHZlIiwgInNyYyIsICIiLCAiUmVzb2x2ZUNvbnN0cnVjdG9yLmphdmEiKTsKLQkKLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIHNlbGVjdEF0ID0gIlJlc29sdmVDb25zdHJ1Y3RvcihcIiI7Ci0JU3RyaW5nIHNlbGVjdGlvbiA9ICJSZXNvbHZlQ29uc3RydWN0b3IiOwotCWludCBzdGFydCA9IHN0ci5sYXN0SW5kZXhPZihzZWxlY3RBdCk7Ci0JaW50IGxlbmd0aCA9IHNlbGVjdGlvbi5sZW5ndGgoKTsKLQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IGN1LmNvZGVTZWxlY3Qoc3RhcnQsIGxlbmd0aCk7Ci0JCi0JYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgb25lIG1ldGhvZCIsIGVsZW1lbnRzLmxlbmd0aCA9PSAxICYmIAotCQllbGVtZW50c1swXS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscygiUmVzb2x2ZUNvbnN0cnVjdG9yIikgJiYKLQkJZWxlbWVudHNbMF0gaW5zdGFuY2VvZiBJTWV0aG9kICYmCi0JCSgoSU1ldGhvZCllbGVtZW50c1swXSkuZ2V0UGFyYW1ldGVyVHlwZXMoKVswXS5lcXVhbHMoIlFTdHJpbmc7IikpOwkKLX0KLS8qKgotICogUmVzb2x2ZSB0aGUgbWV0aG9kICJmb28iCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlTWV0aG9kKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiUmVzb2x2ZSIsICJzcmMiLCAiIiwgIlJlc29sdmVNZXRob2QuamF2YSIpOwotCQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgc2VsZWN0QXQgPSAiZm9vKFwiIjsKLQlTdHJpbmcgc2VsZWN0aW9uID0gImZvbyI7Ci0JaW50IHN0YXJ0ID0gc3RyLmxhc3RJbmRleE9mKHNlbGVjdEF0KTsKLQlpbnQgbGVuZ3RoID0gc2VsZWN0aW9uLmxlbmd0aCgpOwotCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gY3UuY29kZVNlbGVjdChzdGFydCwgbGVuZ3RoKTsKLQotCWFzc2VydFRydWUoInNob3VsZCBoYXZlIG9uZSBtZXRob2Qgb2YgJ2ZvbyciLAotCQllbGVtZW50cy5sZW5ndGggPT0gMSAmJgotCQllbGVtZW50c1swXS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscygiZm9vIikgJiYKLQkJZWxlbWVudHNbMF0gaW5zdGFuY2VvZiBJTWV0aG9kICYmCi0JCSgoSU1ldGhvZCllbGVtZW50c1swXSkuZ2V0UGFyYW1ldGVyVHlwZXMoKVswXS5lcXVhbHMoIlFTdHJpbmc7IikpOwkJCi19Ci0vKioKLSAqIFJlc29sdmUgdGhlIGZpZWxkICJmb28iCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlRmllbGQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJSZXNvbHZlIiwgInNyYyIsICIiLCAiUmVzb2x2ZUZpZWxkLmphdmEiKTsKLQkKLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIHNlbGVjdEF0ID0gImZvbyA9IjsKLQlTdHJpbmcgc2VsZWN0aW9uID0gImZvbyI7Ci0JaW50IHN0YXJ0ID0gc3RyLmxhc3RJbmRleE9mKHNlbGVjdEF0KTsKLQlpbnQgbGVuZ3RoID0gc2VsZWN0aW9uLmxlbmd0aCgpOwotCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gY3UuY29kZVNlbGVjdChzdGFydCwgbGVuZ3RoKTsKLQkKLQlhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBvbmUgZmllbGQgb2YgJ2ZvbyciLAotCQkJZWxlbWVudHMubGVuZ3RoID09IDEgJiYKLQkJCWVsZW1lbnRzWzBdLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKCJmb28iKSAmJgotCQkJZWxlbWVudHNbMF0gaW5zdGFuY2VvZiBJRmllbGQpOwkKLX0KLS8qKgotICogUmVzb2x2ZSB0aGUgcGFja2FnZSAiamF2YS5sYW5nIgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZVBhY2thZ2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJSZXNvbHZlIiwgInNyYyIsICIiLCAiUmVzb2x2ZVBhY2thZ2UuamF2YSIpOwotCQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgc2VsZWN0QXQgPSAibGFuZyI7Ci0JU3RyaW5nIHNlbGVjdGlvbiA9ICJsYW5nIjsKLQlpbnQgc3RhcnQgPSBzdHIubGFzdEluZGV4T2Yoc2VsZWN0QXQpOwotCWludCBsZW5ndGggPSBzZWxlY3Rpb24ubGVuZ3RoKCk7Ci0JSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBjdS5jb2RlU2VsZWN0KHN0YXJ0LCBsZW5ndGgpOwotCQotCWFzc2VydFRydWUoInNob3VsZCBoYXZlIG9uZSBwYWNrYWdlIG9mICdqYXZhLmxhbmcnIiwKLQkJZWxlbWVudHMubGVuZ3RoID09IDEgJiYKLQkJZWxlbWVudHNbMF0uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoImphdmEubGFuZyIpICYmCi0JCWVsZW1lbnRzWzBdIGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCk7CQotfQotLyoqCi0gKiBSZXNvbHZlIHRoZSBjbGFzcyAnWCcgKGZpZWxkIHR5cGUpLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZUNsYXNzMSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlJlc29sdmUiLCAic3JjIiwgIiIsICJSZXNvbHZlQ2xhc3MxLmphdmEiKTsKLQkKLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIHNlbGVjdEF0ID0gIlgiOwotCVN0cmluZyBzZWxlY3Rpb24gPSAiWCI7Ci0JaW50IHN0YXJ0ID0gc3RyLmxhc3RJbmRleE9mKHNlbGVjdEF0KTsKLQlpbnQgbGVuZ3RoID0gc2VsZWN0aW9uLmxlbmd0aCgpOwotCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gY3UuY29kZVNlbGVjdChzdGFydCwgbGVuZ3RoKTsKLQkKLQlhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBvbmUgY2xhc3MiLCBlbGVtZW50cy5sZW5ndGggPT0gMSAmJiAKLQkJZWxlbWVudHNbMF0uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoIlgiKSAmJgotCQllbGVtZW50c1swXSBpbnN0YW5jZW9mIElUeXBlKTsKLX0KLS8qKgotICogUmVzb2x2ZSB0aGUgY2xhc3MgJ1gnIChsb2NhbCB2YXJpYWJsZSB0eXBlKS4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJlc29sdmVDbGFzczIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJSZXNvbHZlIiwgInNyYyIsICIiLCAiUmVzb2x2ZUNsYXNzMi5qYXZhIik7Ci0JCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBzZWxlY3RBdCA9ICJYIjsKLQlTdHJpbmcgc2VsZWN0aW9uID0gIlgiOwotCWludCBzdGFydCA9IHN0ci5sYXN0SW5kZXhPZihzZWxlY3RBdCk7Ci0JaW50IGxlbmd0aCA9IHNlbGVjdGlvbi5sZW5ndGgoKTsKLQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IGN1LmNvZGVTZWxlY3Qoc3RhcnQsIGxlbmd0aCk7Ci0JCi0JYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgb25lIGNsYXNzIiwgZWxlbWVudHMubGVuZ3RoID09IDEgJiYgCi0JCWVsZW1lbnRzWzBdLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKCJYIikgJiYKLQkJZWxlbWVudHNbMF0gaW5zdGFuY2VvZiBJVHlwZSk7Ci19Ci0vKioKLSAqIFJlc29sdmUgdGhlIGNsYXNzICdYJyhhcnJheSBpbml0aWFsaXplciB0eXBlKS4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJlc29sdmVDbGFzczMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJSZXNvbHZlIiwgInNyYyIsICIiLCAiUmVzb2x2ZUNsYXNzMy5qYXZhIik7Ci0JCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBzZWxlY3RBdCA9ICJYW117IjsKLQlTdHJpbmcgc2VsZWN0aW9uID0gIlgiOwotCWludCBzdGFydCA9IHN0ci5sYXN0SW5kZXhPZihzZWxlY3RBdCk7Ci0JaW50IGxlbmd0aCA9IHNlbGVjdGlvbi5sZW5ndGgoKTsKLQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IGN1LmNvZGVTZWxlY3Qoc3RhcnQsIGxlbmd0aCk7Ci0JCi0JYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgb25lIGNsYXNzIiwgZWxlbWVudHMubGVuZ3RoID09IDEgJiYgCi0JCWVsZW1lbnRzWzBdLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKCJYIikgJiYKLQkJZWxlbWVudHNbMF0gaW5zdGFuY2VvZiBJVHlwZSk7Ci19Ci0vKioKLSAqIFJlc29sdmUgdGhlIGNsYXNzICdYJyAocmV0dXJuIHR5cGUpLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZUNsYXNzNCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlJlc29sdmUiLCAic3JjIiwgIiIsICJSZXNvbHZlQ2xhc3M0LmphdmEiKTsKLQkKLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIHNlbGVjdEF0ID0gIlgiOwotCVN0cmluZyBzZWxlY3Rpb24gPSAiWCI7Ci0JaW50IHN0YXJ0ID0gc3RyLmxhc3RJbmRleE9mKHNlbGVjdEF0KTsKLQlpbnQgbGVuZ3RoID0gc2VsZWN0aW9uLmxlbmd0aCgpOwotCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gY3UuY29kZVNlbGVjdChzdGFydCwgbGVuZ3RoKTsKLQkKLQlhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBvbmUgY2xhc3MiLCBlbGVtZW50cy5sZW5ndGggPT0gMSAmJiAKLQkJZWxlbWVudHNbMF0uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoIlgiKSAmJgotCQllbGVtZW50c1swXSBpbnN0YW5jZW9mIElUeXBlKTsKLX0KLS8qKgotICogUmVzb2x2ZSB0aGUgY2xhc3MgJ1gnIChtZXRob2QgYXJndW1lbnQpLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZUNsYXNzNSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlJlc29sdmUiLCAic3JjIiwgIiIsICJSZXNvbHZlQ2xhc3M1LmphdmEiKTsKLQkKLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIHNlbGVjdEF0ID0gIlgiOwotCVN0cmluZyBzZWxlY3Rpb24gPSAiWCI7Ci0JaW50IHN0YXJ0ID0gc3RyLmxhc3RJbmRleE9mKHNlbGVjdEF0KTsKLQlpbnQgbGVuZ3RoID0gc2VsZWN0aW9uLmxlbmd0aCgpOwotCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gY3UuY29kZVNlbGVjdChzdGFydCwgbGVuZ3RoKTsKLQkKLQlhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBvbmUgY2xhc3MiLCBlbGVtZW50cy5sZW5ndGggPT0gMSAmJiAKLQkJZWxlbWVudHNbMF0uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoIlgiKSAmJgotCQllbGVtZW50c1swXSBpbnN0YW5jZW9mIElUeXBlKTsKLX0KLS8qKgotICogUmVzb2x2ZSB0aGUgY2xhc3MgJ1N1cGVyQ2xhc3MnIChzdXBlciBjbGFzcykuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlQ2xhc3M2KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiUmVzb2x2ZSIsICJzcmMiLCAiIiwgIlJlc29sdmVDbGFzczYuamF2YSIpOwotCQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgc2VsZWN0QXQgPSAiWCI7Ci0JU3RyaW5nIHNlbGVjdGlvbiA9ICJYIjsKLQlpbnQgc3RhcnQgPSBzdHIubGFzdEluZGV4T2Yoc2VsZWN0QXQpOwotCWludCBsZW5ndGggPSBzZWxlY3Rpb24ubGVuZ3RoKCk7Ci0JSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBjdS5jb2RlU2VsZWN0KHN0YXJ0LCBsZW5ndGgpOwotCQotCWFzc2VydFRydWUoInNob3VsZCBoYXZlIG9uZSBjbGFzcyIsIGVsZW1lbnRzLmxlbmd0aCA9PSAxICYmIAotCQllbGVtZW50c1swXS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscygiWCIpICYmCi0JCWVsZW1lbnRzWzBdIGluc3RhbmNlb2YgSVR5cGUpOwotfQotLyoqCi0gKiBSZXNvbHZlIHRoZSBpbnRlcmZhY2UgIlkiCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlSW50ZXJmYWNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiUmVzb2x2ZSIsICJzcmMiLCAiIiwgIlJlc29sdmVJbnRlcmZhY2UuamF2YSIpOwotCQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgc2VsZWN0QXQgPSAiWSI7Ci0JU3RyaW5nIHNlbGVjdGlvbiA9ICJZIjsKLQlpbnQgc3RhcnQgPSBzdHIubGFzdEluZGV4T2Yoc2VsZWN0QXQpOwotCWludCBsZW5ndGggPSBzZWxlY3Rpb24ubGVuZ3RoKCk7Ci0JSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBjdS5jb2RlU2VsZWN0KHN0YXJ0LCBsZW5ndGgpOwotCQotCWFzc2VydFRydWUoInNob3VsZCBoYXZlIG9uZSBpbnRlcmZhY2UiLCBlbGVtZW50cy5sZW5ndGggPT0gMSAmJiAKLQkJZWxlbWVudHNbMF0uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoIlkiKSAmJgotCQllbGVtZW50c1swXSBpbnN0YW5jZW9mIElUeXBlKTsJCi19Ci0vKioKLSAqIFRlc3RzIGNvZGUgcmVzb2x2ZSBvbiBhIGNsYXNzIGZpbGUgd2l0aCBhdHRhY2hlZCBzb3VyY2UuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlSW5DbGFzc0ZpbGVXaXRoU291cmNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNsYXNzRmlsZSBjdSA9IGdldENsYXNzRmlsZSgiUmVzb2x2ZSIsICJwMy5qYXIiLCAicDMiLCAiWC5jbGFzcyIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBzZWxlY3RBdCA9ICJPYmplY3QiOwotCVN0cmluZyBzZWxlY3Rpb24gPSAiT2JqZWN0IjsKLQlpbnQgc3RhcnQgPSBzdHIuaW5kZXhPZihzZWxlY3RBdCk7Ci0JaW50IGxlbmd0aCA9IHNlbGVjdGlvbi5sZW5ndGgoKTsKLQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IGN1LmNvZGVTZWxlY3Qoc3RhcnQsIGxlbmd0aCk7Ci0JCi0JYXNzZXJ0VHJ1ZShlbGVtZW50cyAhPSBudWxsICYmIGVsZW1lbnRzLmxlbmd0aCA9PSAxICYmCi0JCWVsZW1lbnRzWzBdLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKCJPYmplY3QiKSAmJgotCQllbGVtZW50c1swXS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFKTsKLX0KLS8qKgotICogVGVzdHMgY29kZSByZXNvbHZlIG9uIGEgY2xhc3MgZmlsZSB3aXRob3V0IGF0dGFjaGVkIHNvdXJjZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJlc29sdmVJbkNsYXNzRmlsZVdpdGhvdXRTb3VyY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJQ2xhc3NGaWxlIGN1ID0gZ2V0Q2xhc3NGaWxlKCJSZXNvbHZlIiwgInA0LmphciIsICJwNCIsICJYLmNsYXNzIik7Ci0KLQlTdHJpbmcgc2VsZWN0aW9uID0gIk9iamVjdCI7Ci0JaW50IHN0YXJ0ID0gMzQ7Ci0JaW50IGxlbmd0aCA9IHNlbGVjdGlvbi5sZW5ndGgoKTsKLQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IGN1LmNvZGVTZWxlY3Qoc3RhcnQsIGxlbmd0aCk7Ci0JCi0JYXNzZXJ0VHJ1ZShlbGVtZW50cyAhPSBudWxsICYmIGVsZW1lbnRzLmxlbmd0aCA9PSAwKTsKLX0KLS8qKgotICogUmVzb2x2ZSB0aGUgcXVhbGlmaWVkIHR5cGUgImphdmEubGFuZy5PYmplY3QiCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlUXVhbGlmaWVkVHlwZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlJlc29sdmUiLCAic3JjIiwgIiIsICJSZXNvbHZlUXVhbGlmaWVkVHlwZS5qYXZhIik7Ci0JCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBzZWxlY3RBdCA9ICJqYXZhLmxhbmcuT2JqZWN0IjsKLQlTdHJpbmcgc2VsZWN0aW9uID0gImphdmEubGFuZy5PYmplY3QiOwotCWludCBzdGFydCA9IHN0ci5pbmRleE9mKHNlbGVjdEF0KTsKLQlpbnQgbGVuZ3RoID0gc2VsZWN0aW9uLmxlbmd0aCgpOwotCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gY3UuY29kZVNlbGVjdChzdGFydCwgbGVuZ3RoKTsKLQkKLQlhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBvbmUgY2xhc3MiLCBlbGVtZW50cy5sZW5ndGggPT0gMSk7Ci0JSUphdmFFbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50c1swXTsKLQlhc3NlcnRUcnVlKCJTaG91bGQgYmUgYW4gSVR5cGUiLCBlbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpOwotCUlUeXBlIHR5cGUgPSAoSVR5cGUpZWxlbWVudDsKLQlhc3NlcnRUcnVlKCJzaG91bGQgYmUgamF2YS5sYW5nLk9iamVjdCIsCi0JCXR5cGUuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoIk9iamVjdCIpICYmCi0JCXR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoImphdmEubGFuZyIpKTsJCi19Ci0vKioKLSAqIFRyeSB0byByZXNvbHZlIHRoZSBxdWFsaWZpZWQgdHlwZSAibGFuZy5PYmplY3QiCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlUGFydGlhbGx5UXVhbGlmaWVkVHlwZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlJlc29sdmUiLCAic3JjIiwgIiIsICJSZXNvbHZlUGFydGlhbGx5UXVhbGlmaWVkVHlwZS5qYXZhIik7Ci0JCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBzZWxlY3RBdCA9ICJsYW5nLk9iamVjdCI7Ci0JU3RyaW5nIHNlbGVjdGlvbiA9ICJsYW5nLk9iamVjdCI7Ci0JaW50IHN0YXJ0ID0gc3RyLmluZGV4T2Yoc2VsZWN0QXQpOwotCWludCBsZW5ndGggPSBzZWxlY3Rpb24ubGVuZ3RoKCk7Ci0JSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBjdS5jb2RlU2VsZWN0KHN0YXJ0LCBsZW5ndGgpOwotCQotCWFzc2VydFRydWUoInNob3VsZCBoYXZlIG5vIHJlc3VsdCBjbGFzcyIsIGVsZW1lbnRzICE9IG51bGwgJiYgZWxlbWVudHMubGVuZ3RoID09IDApOwotfQotLyoqCi0gKiBSZXNvbHZlIHRoZSB0eXBlICJqYXZhLmxhbmcuIFx1MDA1M3JpbmciCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlVW5pY29kZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlJlc29sdmUiLCAic3JjIiwgIiIsICJSZXNvbHZlVW5pY29kZS5qYXZhIik7Ci0JCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBzZWxlY3RBdCA9ICJqYXZhLmxhbmcuXFx1MDA1M3RyaW5nIjsKLQlTdHJpbmcgc2VsZWN0aW9uID0gImphdmEubGFuZy5cXHUwMDUzdHJpbmciOwotCWludCBzdGFydCA9IHN0ci5pbmRleE9mKHNlbGVjdEF0KTsKLQlpbnQgbGVuZ3RoID0gc2VsZWN0aW9uLmxlbmd0aCgpOwotCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gY3UuY29kZVNlbGVjdChzdGFydCwgbGVuZ3RoKTsKLQkKLQlhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBvbmUgY2xhc3MgJ2phdmEubGFuZy5cdTAwNTN0cmluZyciLCBlbGVtZW50cy5sZW5ndGggPT0gMSk7Ci0JSUphdmFFbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50c1swXTsKLQlhc3NlcnRUcnVlKCJzaG91bGQgYmUgYW4gSVR5cGUiLCBlbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpOwotCUlUeXBlIHR5cGUgPSAoSVR5cGUpZWxlbWVudDsKLQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgZWxlbWVudCBuYW1lIiwgIlx1MDA1M3RyaW5nIiwgdHlwZS5nZXRFbGVtZW50TmFtZSgpKTsKLQlhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgcGFyZW50IG5hbWUiLCAiamF2YS5sYW5nIiwgdHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpKTsKLX0KLS8qKgotICogVHJpZXMgdG8gcmVzb2x2ZSB0aGUgdHlwZSAibGFuZy4gXHUwMDUzdHJpbmciIHdoaWNoIGRvZXNuJ3QgZXhpc3QuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3ROZWdhdGl2ZVJlc29sdmVVbmljb2RlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiUmVzb2x2ZSIsICJzcmMiLCAiIiwgIlJlc29sdmVVbmljb2RlLmphdmEiKTsKLQkKLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIHNlbGVjdEF0ID0gImxhbmcuXFx1MDA1M3RyaW5nIjsKLQlTdHJpbmcgc2VsZWN0aW9uID0gImxhbmcuXFx1MDA1M3RyaW5nIjsKLQlpbnQgc3RhcnQgPSBzdHIuaW5kZXhPZihzZWxlY3RBdCk7Ci0JaW50IGxlbmd0aCA9IHNlbGVjdGlvbi5sZW5ndGgoKTsKLQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IGN1LmNvZGVTZWxlY3Qoc3RhcnQsIGxlbmd0aCk7Ci0JCi0JYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgbm8gY2xhc3MiLCBlbGVtZW50cyAhPSBudWxsICYmIGVsZW1lbnRzLmxlbmd0aCA9PSAwKTsKLX0KLS8qKgotICogUmVzb2x2ZSB0aGUgZmllbGQgImxlbmd0aCIgb2YgYW4gYXJyYXkKLSAqLwotcHVibGljIHZvaWQgdGVzdFJlc29sdmVBcnJheUxlbmd0aCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlJlc29sdmUiLCAic3JjIiwgIiIsICJSZXNvbHZlQXJyYXlMZW5ndGguamF2YSIpOwotCQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgc2VsZWN0QXQgPSAibGVuZ3RoIjsKLQlTdHJpbmcgc2VsZWN0aW9uID0gImxlbmd0aCI7Ci0JaW50IHN0YXJ0ID0gc3RyLmluZGV4T2Yoc2VsZWN0QXQpOwotCWludCBsZW5ndGggPSBzZWxlY3Rpb24ubGVuZ3RoKCk7Ci0JSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBjdS5jb2RlU2VsZWN0KHN0YXJ0LCBsZW5ndGgpOwotCi0JYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgbm8gZmllbGQgJ2xlbmd0aCciLCBlbGVtZW50cyAhPSBudWxsICYmICBlbGVtZW50cy5sZW5ndGggPT0gMCk7CQotfQotLyoqCi0gKiBSZXNvbHZlIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlQ29uc3RydWN0b3JEZWNsYXJhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlJlc29sdmUiLCAic3JjIiwgIiIsICJSZXNvbHZlQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5qYXZhIik7Ci0JCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBzZWxlY3RBdCA9ICJSZXNvbHZlQ29uc3RydWN0b3JEZWNsYXJhdGlvbihpIjsKLQlTdHJpbmcgc2VsZWN0aW9uID0gIlJlc29sdmVDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIjsKLQlpbnQgc3RhcnQgPSBzdHIuaW5kZXhPZihzZWxlY3RBdCk7Ci0JaW50IGxlbmd0aCA9IHNlbGVjdGlvbi5sZW5ndGgoKTsKLQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IGN1LmNvZGVTZWxlY3Qoc3RhcnQsIGxlbmd0aCk7Ci0JCi0JYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgb25lIG1ldGhvZCIsIGVsZW1lbnRzLmxlbmd0aCA9PSAxICYmIAotCQllbGVtZW50c1swXS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscygiUmVzb2x2ZUNvbnN0cnVjdG9yRGVjbGFyYXRpb24iKSAmJgotCQllbGVtZW50c1swXSBpbnN0YW5jZW9mIElNZXRob2QgJiYKLQkJKChJTWV0aG9kKWVsZW1lbnRzWzBdKS5nZXRQYXJhbWV0ZXJUeXBlcygpWzBdLmVxdWFscygiSSIpKTsJCi19Ci0vKioKLSAqIFJlc29sdmUgbWV0aG9kIGRlY2xhcmF0aW9uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlTWV0aG9kRGVjbGFyYXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJSZXNvbHZlIiwgInNyYyIsICIiLCAiUmVzb2x2ZU1ldGhvZERlY2xhcmF0aW9uLmphdmEiKTsKLQkKLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIHNlbGVjdEF0ID0gImZvbyhpIjsKLQlTdHJpbmcgc2VsZWN0aW9uID0gImZvbyI7Ci0JaW50IHN0YXJ0ID0gc3RyLmluZGV4T2Yoc2VsZWN0QXQpOwotCWludCBsZW5ndGggPSBzZWxlY3Rpb24ubGVuZ3RoKCk7Ci0JSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBjdS5jb2RlU2VsZWN0KHN0YXJ0LCBsZW5ndGgpOwotCQotCWFzc2VydFRydWUoInNob3VsZCBoYXZlIG9uZSBtZXRob2QiLCBlbGVtZW50cy5sZW5ndGggPT0gMSAmJiAKLQkJZWxlbWVudHNbMF0uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoImZvbyIpICYmCi0JCWVsZW1lbnRzWzBdIGluc3RhbmNlb2YgSU1ldGhvZCAmJgotCQkoKElNZXRob2QpZWxlbWVudHNbMF0pLmdldFBhcmFtZXRlclR5cGVzKClbMF0uZXF1YWxzKCJJIikpOwkKLX0KLS8qKgotICogUmVzb2x2ZSBmaWVsZCBkZWNsYXJhdGlvbgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZUZpZWxkRGVjbGFyYXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJSZXNvbHZlIiwgInNyYyIsICIiLCAiUmVzb2x2ZUZpZWxkRGVjbGFyYXRpb24uamF2YSIpOwotCQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgc2VsZWN0QXQgPSAiZm9vIjsKLQlTdHJpbmcgc2VsZWN0aW9uID0gImZvbyI7Ci0JaW50IHN0YXJ0ID0gc3RyLmluZGV4T2Yoc2VsZWN0QXQpOwotCWludCBsZW5ndGggPSBzZWxlY3Rpb24ubGVuZ3RoKCk7Ci0JSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBjdS5jb2RlU2VsZWN0KHN0YXJ0LCBsZW5ndGgpOwotCQotCWFzc2VydFRydWUoInNob3VsZCBoYXZlIG9uZSBmaWVsZCIsIGVsZW1lbnRzLmxlbmd0aCA9PSAxICYmIAotCQllbGVtZW50c1swXS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscygiZm9vIikgJiYKLQkJZWxlbWVudHNbMF0gaW5zdGFuY2VvZiBJRmllbGQpOwkKLX0KLS8qKgotICogUmVzb2x2ZSB0eXBlIGRlY2xhcmF0aW9uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlVHlwZURlY2xhcmF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiUmVzb2x2ZSIsICJzcmMiLCAiIiwgIlJlc29sdmVUeXBlRGVjbGFyYXRpb24uamF2YSIpOwotCQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgc2VsZWN0QXQgPSAiT3RoZXJUeXBlIjsKLQlTdHJpbmcgc2VsZWN0aW9uID0gIk90aGVyVHlwZSI7Ci0JaW50IHN0YXJ0ID0gc3RyLmluZGV4T2Yoc2VsZWN0QXQpOwotCWludCBsZW5ndGggPSBzZWxlY3Rpb24ubGVuZ3RoKCk7Ci0JSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBjdS5jb2RlU2VsZWN0KHN0YXJ0LCBsZW5ndGgpOwotCQotCWFzc2VydFRydWUoInNob3VsZCBoYXZlIG9uZSB0eXBlIiwgZWxlbWVudHMubGVuZ3RoID09IDEgJiYgCi0JCWVsZW1lbnRzWzBdLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKCJPdGhlclR5cGUiKSAmJgotCQllbGVtZW50c1swXSBpbnN0YW5jZW9mIElUeXBlKTsJCi19Ci0vKioKLSAqIFJlc29sdmUgbWVtYmVyIHR5cGUgZGVjbGFyYXRpb24KLSAqLwotcHVibGljIHZvaWQgdGVzdFJlc29sdmVNZW1iZXJUeXBlRGVjbGFyYXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJSZXNvbHZlIiwgInNyYyIsICIiLCAiUmVzb2x2ZU1lbWJlclR5cGVEZWNsYXJhdGlvbjEuamF2YSIpOwotCQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgc2VsZWN0QXQgPSAiTWVtYmVySW50ZXJmYWNlIjsKLQlTdHJpbmcgc2VsZWN0aW9uID0gIk1lbWJlckludGVyZmFjZSI7Ci0JaW50IHN0YXJ0ID0gc3RyLmluZGV4T2Yoc2VsZWN0QXQpOwotCWludCBsZW5ndGggPSBzZWxlY3Rpb24ubGVuZ3RoKCk7Ci0JSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBjdS5jb2RlU2VsZWN0KHN0YXJ0LCBsZW5ndGgpOwotCQotCWFzc2VydFRydWUoInNob3VsZCBoYXZlIG9uZSB0eXBlIiwgZWxlbWVudHMubGVuZ3RoID09IDEgJiYgCi0JCWVsZW1lbnRzWzBdLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKCJNZW1iZXJJbnRlcmZhY2UiKSAmJgotCQllbGVtZW50c1swXSBpbnN0YW5jZW9mIElUeXBlKTsJCi19Ci0vKioKLSAqIFJlc29sdmUgbWVtYmVyIHR5cGUgZGVjbGFyYXRpb24gbG9jYXRlZCBpbiBkZWZhdWx0IHBhY2thZ2UKLSAqLwotcHVibGljIHZvaWQgdGVzdFJlc29sdmVNZW1iZXJUeXBlRGVjbGFyYXRpb24yKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiUmVzb2x2ZSIsICJzcmMiLCAiIiwgIlJlc29sdmVNZW1iZXJUeXBlRGVjbGFyYXRpb24yLmphdmEiKTsKLQkKLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIHNlbGVjdEF0ID0gIk1lbWJlck9mTWVtYmVyIjsKLQlTdHJpbmcgc2VsZWN0aW9uID0gIk1lbWJlck9mTWVtYmVyIjsKLQlpbnQgc3RhcnQgPSBzdHIuaW5kZXhPZihzZWxlY3RBdCk7Ci0JaW50IGxlbmd0aCA9IHNlbGVjdGlvbi5sZW5ndGgoKTsKLQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IGN1LmNvZGVTZWxlY3Qoc3RhcnQsIGxlbmd0aCk7Ci0JCi0JYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgb25lIHR5cGUiLCBlbGVtZW50cy5sZW5ndGggPT0gMSAmJiAKLQkJZWxlbWVudHNbMF0uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoIk1lbWJlck9mTWVtYmVyIikgJiYKLQkJZWxlbWVudHNbMF0gaW5zdGFuY2VvZiBJVHlwZSk7CQotfQotLyoqCi0gKiBSZXNvbHZlIGRlZmF1bHQgYWJzdHJhcnQgbWV0aG9kCi0gKiBidWdzIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM1OTQKLSAqLwotcHVibGljIHZvaWQgdGVzdFJlc29sdmVBYnN0cmFjdE1ldGhvZCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlJlc29sdmUiLCAic3JjIiwgIiIsICJSZXNvbHZlQWJzdHJhY3RNZXRob2QuamF2YSIpOwotCQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgc2VsZWN0QXQgPSAiZm9vIjsKLQlTdHJpbmcgc2VsZWN0aW9uID0gImZvbyI7Ci0JaW50IHN0YXJ0ID0gc3RyLmluZGV4T2Yoc2VsZWN0QXQpOwotCWludCBsZW5ndGggPSBzZWxlY3Rpb24ubGVuZ3RoKCk7Ci0JSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBjdS5jb2RlU2VsZWN0KHN0YXJ0LCBsZW5ndGgpOwotCQotCWFzc2VydFRydWUoInNob3VsZCBoYXZlIG9uZSBtZXRob2QiLCBlbGVtZW50cy5sZW5ndGggPT0gMSAmJiAKLQkJZWxlbWVudHNbMF0uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoImZvbyIpICYmCi0JCWVsZW1lbnRzWzBdIGluc3RhbmNlb2YgSU1ldGhvZCAmJgotCQkoKElNZXRob2QpZWxlbWVudHNbMF0pLmdldERlY2xhcmluZ1R5cGUoKS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscygiU3VwZXJJbnRlcmZhY2UiKSk7Ci19Ci0vKioKLSAqIGJ1Z3MgaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTY4NwotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZUlubmVyQ2xhc3NBc1BhcmFtYXRlcigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlJlc29sdmUiLCAic3JjIiwgIiIsICJSZXNvbHZlSW5uZXJDbGFzc0FzUGFyYW1hdGVyLmphdmEiKTsKLQkKLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIHNlbGVjdEF0ID0gImZvbyI7Ci0JU3RyaW5nIHNlbGVjdGlvbiA9ICJmb28iOwotCWludCBzdGFydCA9IHN0ci5sYXN0SW5kZXhPZihzZWxlY3RBdCk7Ci0JaW50IGxlbmd0aCA9IHNlbGVjdGlvbi5sZW5ndGgoKTsKLQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IGN1LmNvZGVTZWxlY3Qoc3RhcnQsIGxlbmd0aCk7Ci0JCi0JYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgb25lIG1ldGhvZCIsIGVsZW1lbnRzLmxlbmd0aCA9PSAxICYmIAotCQllbGVtZW50c1swXS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscygiZm9vIikgJiYKLQkJZWxlbWVudHNbMF0gaW5zdGFuY2VvZiBJTWV0aG9kKTsKLX0KLS8qKgotICogYnVncyBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NjI2Ci0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlQ2F0Y2hBcmd1bWVudFR5cGUxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiUmVzb2x2ZSIsICJzcmMiLCAiIiwgIlJlc29sdmVDYXRjaEFyZ3VtZW50VHlwZTEuamF2YSIpOwotCQotCVN0cmluZyBzdHIgPSBjdS5nZXRTb3VyY2UoKTsKLQlTdHJpbmcgc2VsZWN0QXQgPSAiWTEiOwotCVN0cmluZyBzZWxlY3Rpb24gPSAiWTEiOwotCWludCBzdGFydCA9IHN0ci5sYXN0SW5kZXhPZihzZWxlY3RBdCk7Ci0JaW50IGxlbmd0aCA9IHNlbGVjdGlvbi5sZW5ndGgoKTsKLQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IGN1LmNvZGVTZWxlY3Qoc3RhcnQsIGxlbmd0aCk7Ci0JCi0JYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgb25lIHR5cGUiLCBlbGVtZW50cy5sZW5ndGggPT0gMSAmJiAKLQkJZWxlbWVudHNbMF0uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoIlkxIikgJiYKLQkJZWxlbWVudHNbMF0gaW5zdGFuY2VvZiBJVHlwZSk7Ci19Ci0vKioKLSAqIGJ1Z3MgaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDYyNgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZUNhdGNoQXJndW1lbnRUeXBlMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlJlc29sdmUiLCAic3JjIiwgIiIsICJSZXNvbHZlQ2F0Y2hBcmd1bWVudFR5cGUyLmphdmEiKTsKLQkKLQlTdHJpbmcgc3RyID0gY3UuZ2V0U291cmNlKCk7Ci0JU3RyaW5nIHNlbGVjdEF0ID0gIlkxIjsKLQlTdHJpbmcgc2VsZWN0aW9uID0gIlkxIjsKLQlpbnQgc3RhcnQgPSBzdHIubGFzdEluZGV4T2Yoc2VsZWN0QXQpOwotCWludCBsZW5ndGggPSBzZWxlY3Rpb24ubGVuZ3RoKCk7Ci0JSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBjdS5jb2RlU2VsZWN0KHN0YXJ0LCBsZW5ndGgpOwotCQotCWFzc2VydFRydWUoInNob3VsZCBoYXZlIG9uZSB0eXBlIiwgZWxlbWVudHMubGVuZ3RoID09IDEgJiYgCi0JCWVsZW1lbnRzWzBdLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKCJZMSIpICYmCi0JCWVsZW1lbnRzWzBdIGluc3RhbmNlb2YgSVR5cGUpOwotfQotLyoqCi0gKiBidWdzIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU4ODgKLSAqLwotcHVibGljIHZvaWQgdGVzdFJlc29sdmVTdGF0aWNDbGFzc0NvbnN0cnVjdG9yKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNsYXNzRmlsZSBjdSA9IGdldENsYXNzRmlsZSgiUmVzb2x2ZSIsICJ0ZXN0MjU4ODguamFyIiwgIiIsICJSZXNvbHZlU3RhdGljQ2xhc3NDb25zdHJ1Y3Rvci5jbGFzcyIpOwotCi0JU3RyaW5nIHN0ciA9IGN1LmdldFNvdXJjZSgpOwotCVN0cmluZyBzZWxlY3RBdCA9ICJTdGF0aWNJbm5lckNsYXNzIjsKLQlTdHJpbmcgc2VsZWN0aW9uID0gIlN0YXRpY0lubmVyQ2xhc3MiOwotCWludCBzdGFydCA9IHN0ci5sYXN0SW5kZXhPZihzZWxlY3RBdCk7Ci0JaW50IGxlbmd0aCA9IHNlbGVjdGlvbi5sZW5ndGgoKTsKLQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IGN1LmNvZGVTZWxlY3Qoc3RhcnQsIGxlbmd0aCk7Ci0KLQlhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBvbmUgbWV0aG9kIiwgZWxlbWVudHMubGVuZ3RoID09IDEgJiYKLQkJZWxlbWVudHNbMF0uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoIlN0YXRpY0lubmVyQ2xhc3MiKSAmJgotCQllbGVtZW50c1swXSBpbnN0YW5jZW9mIElNZXRob2QpOwotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL1Jvb3RNYW5pcHVsYXRpb25zVGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9Sb290TWFuaXB1bGF0aW9uc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4M2ViYTYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL1Jvb3RNYW5pcHVsYXRpb25zVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLnV0aWwuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhRWxlbWVudDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotCi1wdWJsaWMgY2xhc3MgUm9vdE1hbmlwdWxhdGlvbnNUZXN0cyBleHRlbmRzIE1vZGlmeWluZ1Jlc291cmNlVGVzdHMgewotcHVibGljIFJvb3RNYW5pcHVsYXRpb25zVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXByb3RlY3RlZCB2b2lkIGFzc2VydEphdmFQcm9qZWN0KFN0cmluZyBleHBlY3RlZCwgSUphdmFQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCXBvcHVsYXRlKGJ1ZmZlciwgcHJvamVjdCwgMCk7Ci0JCi0JU3RyaW5nIGFjdHVhbCA9IGJ1ZmZlci50b1N0cmluZygpOwotCWlmICghZXhwZWN0ZWQuZXF1YWxzKGFjdHVhbCkpIHsKLQkgCVN5c3RlbS5vdXQucHJpbnRsbihVdGlsLmRpc3BsYXlTdHJpbmcoYWN0dWFsLCAzKSk7Ci0JfQotCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLX0KLXByb3RlY3RlZCB2b2lkIGNvcHkoSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCwgSVBhdGggZGVzdGluYXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCWNvcHkocm9vdCwgZGVzdGluYXRpb24sIG51bGwpOwotfQotcHJvdGVjdGVkIHZvaWQgY29weShJUGFja2FnZUZyYWdtZW50Um9vdCByb290LCBJUGF0aCBkZXN0aW5hdGlvbiwgSUNsYXNzcGF0aEVudHJ5IHNpYmxpbmcpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCXJvb3QuY29weSgKLQkJZGVzdGluYXRpb24sCi0JCUlSZXNvdXJjZS5OT05FLAotCQlJUGFja2FnZUZyYWdtZW50Um9vdC5ERVNUSU5BVElPTl9QUk9KRUNUX0NMQVNTUEFUSCwKLQkJc2libGluZywKLQkJbnVsbCk7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBkZWxldGUoSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0Jcm9vdC5kZWxldGUoCi0JCUlSZXNvdXJjZS5OT05FLAotCQlJUGFja2FnZUZyYWdtZW50Um9vdC5PUklHSU5BVElOR19QUk9KRUNUX0NMQVNTUEFUSAotCQkJfCBJUGFja2FnZUZyYWdtZW50Um9vdC5PVEhFUl9SRUZFUlJJTkdfUFJPSkVDVFNfQ0xBU1NQQVRILAotCQludWxsKTsKLX0KLXByb3RlY3RlZCB2b2lkIG1vdmUoSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCwgSVBhdGggZGVzdGluYXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCW1vdmUocm9vdCwgZGVzdGluYXRpb24sIG51bGwpOwotfQotcHJvdGVjdGVkIHZvaWQgbW92ZShJUGFja2FnZUZyYWdtZW50Um9vdCByb290LCBJUGF0aCBkZXN0aW5hdGlvbiwgSUNsYXNzcGF0aEVudHJ5IHNpYmxpbmcpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCXJvb3QubW92ZSgKLQkJZGVzdGluYXRpb24sIAotCQlJUmVzb3VyY2UuTk9ORSwgCi0JCUlQYWNrYWdlRnJhZ21lbnRSb290LkRFU1RJTkFUSU9OX1BST0pFQ1RfQ0xBU1NQQVRICi0JCQl8IElQYWNrYWdlRnJhZ21lbnRSb290Lk9SSUdJTkFUSU5HX1BST0pFQ1RfQ0xBU1NQQVRICi0JCQl8IElQYWNrYWdlRnJhZ21lbnRSb290Lk9USEVSX1JFRkVSUklOR19QUk9KRUNUU19DTEFTU1BBVEgsCi0JCXNpYmxpbmcsIAotCQludWxsKTsKLX0KLXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlKFN0cmluZ0J1ZmZlciBidWZmZXIsIElKYXZhRWxlbWVudCBlbGVtZW50LCBpbnQgaW5kZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIElQYXJlbnQpIHx8ICEoZWxlbWVudCBpbnN0YW5jZW9mIElPcGVuYWJsZSkpIHJldHVybjsKLQotCWlmIChidWZmZXIubGVuZ3RoKCkgIT0gMCkgewkKLQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykgYnVmZmVyLmFwcGVuZCgiXHQiKTsKLQlidWZmZXIuYXBwZW5kKCgoSmF2YUVsZW1lbnQpZWxlbWVudCkudG9EZWJ1Z1N0cmluZygpKTsKLQkKLQlJUGFyZW50IHBhcmVudCA9IChJUGFyZW50KWVsZW1lbnQ7Ci0JSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSBudWxsOwotCXRyeSB7Ci0JCWNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkcmVuKCk7Ci0JfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQl9Ci0JaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlwb3B1bGF0ZShidWZmZXIsIGNoaWxkcmVuW2ldLCBpbmRlbnQrMSk7Ci0JCX0KLQl9Ci0JCi0JT2JqZWN0W10gbm9uSmF2YVJlc291cmNlcyA9IG51bGw7Ci0JdHJ5IHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpIHsKLQkJCW5vbkphdmFSZXNvdXJjZXMgPSAoKElKYXZhUHJvamVjdCllbGVtZW50KS5nZXROb25KYXZhUmVzb3VyY2VzKCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSB7Ci0JCQlub25KYXZhUmVzb3VyY2VzID0gKChJUGFja2FnZUZyYWdtZW50Um9vdCllbGVtZW50KS5nZXROb25KYXZhUmVzb3VyY2VzKCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnQpIHsKLQkJCW5vbkphdmFSZXNvdXJjZXMgPSAoKElQYWNrYWdlRnJhZ21lbnQpZWxlbWVudCkuZ2V0Tm9uSmF2YVJlc291cmNlcygpOwotCQl9Ci0JfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQl9Ci0JaWYgKG5vbkphdmFSZXNvdXJjZXMgIT0gbnVsbCkgewotCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gbm9uSmF2YVJlc291cmNlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJcG9wdWxhdGUoYnVmZmVyLCBub25KYXZhUmVzb3VyY2VzW2ldLCBpbmRlbnQrMSk7Ci0JCX0KLQl9Ci19Ci1wcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZShTdHJpbmdCdWZmZXIgYnVmZmVyLCBPYmplY3Qgbm9uSmF2YVJlc291cmNlLCBpbnQgaW5kZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JaWYgKGJ1ZmZlci5sZW5ndGgoKSAhPSAwKSB7CQotCQlidWZmZXIuYXBwZW5kKCJcbiIpOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudDsgaSsrKSBidWZmZXIuYXBwZW5kKCJcdCIpOwotCWJ1ZmZlci5hcHBlbmQobm9uSmF2YVJlc291cmNlKTsKLQkvKgotCWlmIChub25KYXZhUmVzb3VyY2UgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCUlSZXNvdXJjZVtdIG1lbWJlcnMgPSAoKElDb250YWluZXIpbm9uSmF2YVJlc291cmNlKS5tZW1iZXJzKCk7Ci0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBtZW1iZXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlwb3B1bGF0ZShidWZmZXIsIG1lbWJlcnNbaV0sIGluZGVudCsxKTsKLQkJfQotCX0qLwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCXJldHVybiBuZXcgU3VpdGUoUm9vdE1hbmlwdWxhdGlvbnNUZXN0cy5jbGFzcyk7Ci19Ci0vKgotICogRW5zdXJlIHRoYXQgYSBzaW1wbGUgY29weSBvZiBhIHNvdXJjZSByb290IHRvIGFub3RoZXIgcHJvamVjdCB0cmlnZ2VycyB0aGUgcmlnaHQgZGVsdGEKLSAqIGFuZCB0aGF0IHRoZSBtb2RlbCBpcyB1cC10by1kYXRlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29weVNvdXJjZUZvbGRlcjEoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDEiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMiIsIG5ldyBTdHJpbmdbXSB7fSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZvbGRlcigiL1AxL3NyYy9wIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUDEvc3JjL3AvWC5qYXZhIiwgCi0JCQkicGFja2FnZSBwO1xuIiArCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHRoaXMuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgiL1AxL3NyYyIpOwotCQl0aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCXRoaXMuY29weShyb290LCBuZXcgUGF0aCgiL1AyL3NyYyIpKTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEiLAotCQkJIlAyWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCXNyY1srXToge31cbiIgKyAKLQkJCSIJUmVzb3VyY2VEZWx0YSgvUDIvLmNsYXNzcGF0aClbKl0iCi0JCSk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmdldENvbXBpbGF0aW9uVW5pdCgiL1AyL3NyYy9wL1guamF2YSIpOwotCQlhc3NlcnRUcnVlKCJEZXN0aW5hdGlvbiBjdSBzaG91bGQgZXhpc3QiLCBjdS5leGlzdHMoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDEiKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMiIpOwotCX0KLX0KLS8qCi0gKiBFbnN1cmUgdGhhdCBjb3BpbmcgYW5kIHJlbmFtaW5nIGEgc291cmNlIHJvb3QgdG8gYW5vdGhlciBwcm9qZWN0IHRyaWdnZXJzIHRoZSByaWdodCBkZWx0YQotICogYW5kIHRoYXQgdGhlIG1vZGVsIGlzIHVwLXRvLWRhdGUuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb3B5U291cmNlRm9sZGVyMigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMSIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHt9LCAiYmluIik7Ci0JCXRoaXMuY3JlYXRlRm9sZGVyKCIvUDEvc3JjL3AiKTsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QMS9zcmMvcC9YLmphdmEiLCAKLQkJCSJwYWNrYWdlIHA7XG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gdGhpcy5nZXRQYWNrYWdlRnJhZ21lbnRSb290KCIvUDEvc3JjIik7Ci0JCXRoaXMuc3RhcnREZWx0YXMoKTsKLQkJdGhpcy5jb3B5KHJvb3QsIG5ldyBQYXRoKCIvUDIvc3JjMiIpKTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEiLAotCQkJIlAyWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCXNyYzJbK106IHt9XG4iICsgCi0JCQkiCVJlc291cmNlRGVsdGEoL1AyLy5jbGFzc3BhdGgpWypdIgotCQkpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5nZXRDb21waWxhdGlvblVuaXQoIi9QMi9zcmMyL3AvWC5qYXZhIik7Ci0JCWFzc2VydFRydWUoIkRlc3RpbmF0aW9uIGN1IHNob3VsZCBleGlzdCIsIGN1LmV4aXN0cygpKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLnN0b3BEZWx0YXMoKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMSIpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAyIik7Ci0JfQotfQotLyoKLSAqIEVuc3VyZSB0aGF0IGNvcGluZyBhIHNvdXJjZSByb290IHRvIGFub3RoZXIgcHJvamVjdCB0cmlnZ2VycyB0aGUgcmlnaHQgZGVsdGEKLSAqIGFuZCBkb2Vzbid0IGNvcHkgYSBuZXN0ZWQgc291cmNlIGZvbGRlci4KLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlTb3VyY2VGb2xkZXIzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwMSA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAxIiwgbmV3IFN0cmluZ1tdIHt9LCAiYmluIik7Ci0JCXAxLnNldFJhd0NsYXNzcGF0aChjcmVhdGVDbGFzc3BhdGgobmV3IFN0cmluZ1tdIHsiL1AxL3NyYzEiLCAic3JjMi8qKiIsICIvUDEvc3JjMS9zcmMyIiwgIiJ9KSwgbnVsbCk7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHt9LCAiYmluIik7Ci0JCXRoaXMuY3JlYXRlRm9sZGVyKCIvUDEvc3JjMS9wIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUDEvc3JjMS9wL1guamF2YSIsIAotCQkJInBhY2thZ2UgcDtcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIn0iCi0JCSk7Ci0JCXRoaXMuY3JlYXRlRm9sZGVyKCIvUDEvc3JjMS9zcmMyL3EiKTsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QMS9zcmMxL3NyYzIvcS9ZLmphdmEiLCAKLQkJCSJwYWNrYWdlIHE7XG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgWSB7XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gdGhpcy5nZXRQYWNrYWdlRnJhZ21lbnRSb290KCIvUDEvc3JjMSIpOwotCQl0aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCXRoaXMuY29weShyb290LCBuZXcgUGF0aCgiL1AyL3NyYzEiKSk7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIiwKLQkJCSJQMlsqXToge0NISUxEUkVOfVxuIiArIAotCQkJIglzcmMxWytdOiB7fVxuIiArIAotCQkJIglSZXNvdXJjZURlbHRhKC9QMi8uY2xhc3NwYXRoKVsqXSIKLQkJKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuZ2V0Q29tcGlsYXRpb25Vbml0KCIvUDIvc3JjMS9wL1guamF2YSIpOwotCQlhc3NlcnRUcnVlKCJEZXN0aW5hdGlvbiBjdSBzaG91bGQgZXhpc3QiLCBjdS5leGlzdHMoKSk7Ci0JCWN1ID0gdGhpcy5nZXRDb21waWxhdGlvblVuaXQoIi9QMi9zcmMxL3NyYzIvcS9ZLmphdmEiKTsKLQkJYXNzZXJ0VHJ1ZSgiTmVzdGVkIGN1IHNob3VsZCBub3QgZXhpc3QiLCAhY3UuZXhpc3RzKCkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAxIik7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0vKgotICogRW5zdXJlIHRoYXQgY29weWluZyBhIHNvdXJjZSByb290IHRvIGFub3RoZXIgcHJvamVjdCB1c2luZyBhIHNpYmxpbmcgY2xhc3NwYXRoIGVudHJ5IHRyaWdnZXJzIHRoZSByaWdodCBkZWx0YQotICogYW5kIHRoYXQgdGhlIG1vZGVsIGlzIHVwLXRvLWRhdGUuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb3B5U291cmNlRm9sZGVyNCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMSIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCUlKYXZhUHJvamVjdCBwMiA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHsic3JjMSIsICJzcmMyIn0sICJiaW4iKTsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHRoaXMuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgiL1AxL3NyYyIpOwotCi0JCS8vIGluc2VydCBmaXJzdAotCQlJQ2xhc3NwYXRoRW50cnkgc2libGluZyA9IEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KG5ldyBQYXRoKCIvUDIvc3JjMSIpKTsKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQl0aGlzLmNvcHkocm9vdCwgbmV3IFBhdGgoIi9QMi9zcmMiKSwgc2libGluZyk7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhICgxKSIsCi0JCQkiUDJbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJCSIJc3JjMVsqXToge1JFT1JERVJFRH1cbiIgKyAKLQkJCSIJc3JjMlsqXToge1JFT1JERVJFRH1cbiIgKyAKLQkJCSIJc3JjWytdOiB7fVxuIiArIAotCQkJIglSZXNvdXJjZURlbHRhKC9QMi8uY2xhc3NwYXRoKVsqXSIKLQkJKTsKLQkJYXNzZXJ0RWxlbWVudHNFcXVhbCgKLQkJCSJVbmV4cGVjdGVkIHJvb3RzIG9mIFAyIGFmdGVyIGluc2VydGlvbiBmaXJzdCIsCi0JCQkic3JjXG4iICsgCi0JCQkic3JjMVxuIiArIAotCQkJInNyYzIiLAotCQkJcDIuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKSk7Ci0KLQkJLy8gaW5zZXJ0IGluIHRoZSBtaWRkbGUKLQkJc2libGluZyA9IEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KG5ldyBQYXRoKCIvUDIvc3JjMiIpKTsKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQl0aGlzLmNvcHkocm9vdCwgbmV3IFBhdGgoIi9QMi9zcmMzIiksIHNpYmxpbmcpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSAoMikiLAotCQkJIlAyWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCXNyYzJbKl06IHtSRU9SREVSRUR9XG4iICsgCi0JCQkiCXNyYzNbK106IHt9XG4iICsgCi0JCQkiCVJlc291cmNlRGVsdGEoL1AyLy5jbGFzc3BhdGgpWypdIgotCQkpOwotCQlhc3NlcnRFbGVtZW50c0VxdWFsKAotCQkJIlVuZXhwZWN0ZWQgcm9vdHMgb2YgUDIgYWZ0ZXIgaW5zZXJ0aW9uIGluIHRoZSBtaWRkbGUiLAotCQkJInNyY1xuIiArIAotCQkJInNyYzFcbiIgKyAKLQkJCSJzcmMzXG4iICsgCi0JCQkic3JjMiIsCi0JCQlwMi5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpKTsKLQkJCQotCQkvLyBpbnNlcnQgbGFzdAotCQl0aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCXRoaXMuY29weShyb290LCBuZXcgUGF0aCgiL1AyL3NyYzQiKSwgbnVsbCk7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhICgzKSIsCi0JCQkiUDJbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJCSIJc3JjNFsrXToge31cbiIgKyAKLQkJCSIJUmVzb3VyY2VEZWx0YSgvUDIvLmNsYXNzcGF0aClbKl0iCi0JCSk7Ci0JCWFzc2VydEVsZW1lbnRzRXF1YWwoCi0JCQkiVW5leHBlY3RlZCByb290cyBvZiBQMiBhZnRlciBpbnNlcnRpb24gbGFzdCIsCi0JCQkic3JjXG4iICsgCi0JCQkic3JjMVxuIiArIAotCQkJInNyYzNcbiIgKyAKLQkJCSJzcmMyXG4iICsKLQkJCSJzcmM0IiwKLQkJCXAyLmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCkpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAxIik7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0vKgotICogRW5zdXJlIHRoYXQgY29waW5nIGEgc291cmNlIHJvb3QgdG8gYW5vdGhlciBwcm9qZWN0IHdpdGggYW4gZXhpc3Rpbmcgc291cmNlIHJvb3QgaW4KLSAqIFJFUExBQ0UgbW9kZSB0cmlnZ2VycyB0aGUgcmlnaHQgZGVsdGEgYW5kIHRoYXQgdGhlIG1vZGVsIGlzIHVwLXRvLWRhdGUuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGJ1ZyAzMDUxMSBJUGFja2FnZUZyYWdtZW50Um9vdDptb3ZlIGlnbm9yZXMgRk9SQ0UgZmxhZykKLSAqLwotcHVibGljIHZvaWQgdGVzdENvcHlTb3VyY2VGb2xkZXI1KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAxIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJSUphdmFQcm9qZWN0IHAyID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDIiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZvbGRlcigiL1AxL3NyYy9wIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUDEvc3JjL3AvWC5qYXZhIiwgCi0JCQkicGFja2FnZSBwO1xuIiArCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkifSIKLQkJKTsKLQotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gdGhpcy5nZXRQYWNrYWdlRnJhZ21lbnRSb290KCIvUDEvc3JjIik7Ci0JCXRoaXMuc3RhcnREZWx0YXMoKTsKLQkJcm9vdC5jb3B5KG5ldyBQYXRoKCIvUDIvc3JjIiksIElSZXNvdXJjZS5OT05FLCBJUGFja2FnZUZyYWdtZW50Um9vdC5SRVBMQUNFLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEiLAotCQkJIlAyWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCXNyY1sqXToge0NISUxEUkVOfVxuIiArIAotCQkJIgkJcFsrXToge30iCi0JCSk7Ci0JCWFzc2VydEphdmFQcm9qZWN0KAotCQkJIlAyXG4iICsgCi0JCQkiCXNyY1xuIiArIAotCQkJIgkJW2RlZmF1bHRdXG4iICsgCi0JCQkiCQlwXG4iICsgCi0JCQkiCQkJWC5qYXZhXG4iICsgCi0JCQkiCUwvUDIvLmNsYXNzcGF0aFxuIiArIAotCQkJIglML1AyLy5wcm9qZWN0IiwKLQkJCXAyKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLnN0b3BEZWx0YXMoKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMSIpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAyIik7Ci0JfQotfQotLyoKLSAqIEVuc3VyZSB0aGF0IGNvcGluZyBhbmQgcmVuYW1pbmcgYSBzb3VyY2Ugcm9vdCB0byBzYW1lIHByb2plY3QgaW4KLSAqIFJFUExBQ0UgbW9kZSB0cmlnZ2VycyB0aGUgcmlnaHQgZGVsdGEgYW5kIHRoYXQgdGhlIG1vZGVsIGlzIHVwLXRvLWRhdGUuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGJ1ZyAzMDg1NyBJUGFja2FnZUZyYWdtZW50Um9vdDogY29weSByZW1vdmVzIHNvdXJjZSBmb2xkZXJzIGZyb20gY2xhc3NwYXRoKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29weVNvdXJjZUZvbGRlcjYoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy9wIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvcC9YLmphdmEiLCAKLQkJCSJwYWNrYWdlIHA7XG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSJ9IgotCQkpOwotCi0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSB0aGlzLmdldFBhY2thZ2VGcmFnbWVudFJvb3QoIi9QL3NyYyIpOwotCQl0aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCXJvb3QuY29weSgKLQkJCW5ldyBQYXRoKCIvUC9zcmMxIiksIAotCQkJSVJlc291cmNlLktFRVBfSElTVE9SWSwgCi0JCQlJUGFja2FnZUZyYWdtZW50Um9vdC5SRVBMQUNFIHwgSVBhY2thZ2VGcmFnbWVudFJvb3QuREVTVElOQVRJT05fUFJPSkVDVF9DTEFTU1BBVEgsIAotCQkJbnVsbCwgCi0JCQludWxsKTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEiLAotCQkJIlBbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJCSIJc3JjMVsrXToge31cbiIgKyAKLQkJCSIJUmVzb3VyY2VEZWx0YSgvUC8uY2xhc3NwYXRoKVsqXSIKLQkJKTsKLQkJYXNzZXJ0SmF2YVByb2plY3QoCi0JCQkiUFxuIiArIAotCQkJIglzcmNcbiIgKyAKLQkJCSIJCVtkZWZhdWx0XVxuIiArIAotCQkJIgkJcFxuIiArIAotCQkJIgkJCVguamF2YVxuIiArIAotCQkJIglzcmMxXG4iICsgCi0JCQkiCQlbZGVmYXVsdF1cbiIgKyAKLQkJCSIJCXBcbiIgKyAKLQkJCSIJCQlYLmphdmFcbiIgKyAKLQkJCSIJTC9QLy5jbGFzc3BhdGhcbiIgKyAKLQkJCSIJTC9QLy5wcm9qZWN0IiwKLQkJCXByb2plY3QpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0vKgotICogRW5zdXJlIHRoYXQgY29waW5nIGEgc291cmNlIHJvb3QgdG8gYW5vdGhlciBwcm9qZWN0IHdpdGggYW4gZXhpc3Rpbmcgc291cmNlIHJvb3QgaW4KLSAqIG5vbiBSRVBMQUNFIG1vZGUgdGhyb3dzIHRoZSByaWdodCBKYXZhTW9kZWxFeGNlcHRpb24uCi0gKiAocmVncmVzc2lvbiB0ZXN0IGJ1ZyAzMDUxMSBJUGFja2FnZUZyYWdtZW50Um9vdDptb3ZlIGlnbm9yZXMgRk9SQ0UgZmxhZykKLSAqLwotcHVibGljIHZvaWQgdGVzdEZhaWxDb3B5U291cmNlRm9sZGVyMSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMSIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gdGhpcy5nZXRQYWNrYWdlRnJhZ21lbnRSb290KCIvUDEvc3JjIik7Ci0JCXRyeSB7Ci0JCQlyb290LmNvcHkobmV3IFBhdGgoIi9QMi9zcmMiKSwgSVJlc291cmNlLk5PTkUsIElQYWNrYWdlRnJhZ21lbnRSb290LkRFU1RJTkFUSU9OX1BST0pFQ1RfQ0xBU1NQQVRILCBudWxsLCBudWxsKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiL1AyL3NyYyBhbHJlYWR5IGV4aXN0cyBpbiB0YXJnZXQuIiwgZS5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWFzc2VydFRydWUoIlNob3VsZCB0aHJvdyBhIEphdmFNb2RlbEV4Y2VwdGlvbiIsIGZhbHNlKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAxIik7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0vKgotICogRW5zdXJlIHRoYXQgY29waW5nIGEgc291cmNlIHJvb3QgdG8gYW5vdGhlciBwcm9qZWN0IHdpdGggYW4gZXhpc3Rpbmcgc291cmNlIHJvb3QgaW4KLSAqIG5vbiBSRVBMQUNFIG1vZGUgdGhyb3dzIHRoZSByaWdodCBKYXZhTW9kZWxFeGNlcHRpb24uCi0gKiAocmVncmVzc2lvbiB0ZXN0IGJ1ZyAzMDUxMSBJUGFja2FnZUZyYWdtZW50Um9vdDptb3ZlIGlnbm9yZXMgRk9SQ0UgZmxhZykKLSAqLwotcHVibGljIHZvaWQgdGVzdEZhaWxDb3B5U291cmNlRm9sZGVyMigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMSIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sICJiaW4iKTsKLQkJdGhpcy5kZWxldGVGb2xkZXIoIi9QMi9zcmMiKTsKLQotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gdGhpcy5nZXRQYWNrYWdlRnJhZ21lbnRSb290KCIvUDEvc3JjIik7Ci0JCXRyeSB7Ci0JCQlyb290LmNvcHkobmV3IFBhdGgoIi9QMi9zcmMiKSwgSVJlc291cmNlLk5PTkUsIElQYWNrYWdlRnJhZ21lbnRSb290LkRFU1RJTkFUSU9OX1BST0pFQ1RfQ0xBU1NQQVRILCBudWxsLCBudWxsKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiL1AyL3NyYyBhbHJlYWR5IGV4aXN0cyBpbiB0YXJnZXQuIiwgZS5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWFzc2VydFRydWUoIlNob3VsZCB0aHJvdyBhIEphdmFNb2RlbEV4Y2VwdGlvbiIsIGZhbHNlKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAxIik7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0vKgotICogRW5zdXJlIHRoYXQgZGVsZXRpbmcgYSBqYXIgcGFja2FnZSBmcmFnbWVudCByb290IHRyaWdnZXJzIHRoZSByaWdodCBkZWx0YQotICogYW5kIHRoYXQgdGhlIG1vZGVsIGlzIHVwLXRvLWRhdGUuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3REZWxldGVKYXJGaWxlMSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgbmV3IFN0cmluZ1tdIHsiL1AvbXlMaWIuamFyIn0sICJiaW4iKTsKLQkJdGhpcy5jcmVhdGVGaWxlKCIvUC9teUxpYi5qYXIiLCAiIik7Ci0KLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHRoaXMuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgiL1AvbXlMaWIuamFyIik7Ci0JCXRoaXMuc3RhcnREZWx0YXMoKTsKLQkJdGhpcy5kZWxldGUocm9vdCk7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIiwKLQkJCSJQWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCW15TGliLmphclstXToge31cbiIgKyAKLQkJCSIJUmVzb3VyY2VEZWx0YSgvUC8uY2xhc3NwYXRoKVsqXSIKLQkJKTsKLQkJYXNzZXJ0SmF2YVByb2plY3QoCi0JCQkiUFxuIiArIAotCQkJIglzcmNcbiIgKyAKLQkJCSIJCVtkZWZhdWx0XVxuIiArIAotCQkJIglML1AvLmNsYXNzcGF0aFxuIiArIAotCQkJIglML1AvLnByb2plY3QiLAotCQkJcHJvamVjdCk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qCi0gKiBFbnN1cmUgdGhhdCBkZWxldGluZyBhbSBleHRlcm5hbCBqYXIgcGFja2FnZSBmcmFnbWVudCByb290IHRyaWdnZXJzIHRoZSByaWdodCBkZWx0YQotICogYW5kIHRoYXQgdGhlIG1vZGVsIGlzIHVwLXRvLWRhdGUuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMzA1MDYgSVBhY2thZ2VGcmFnbWVudFJvb3Q6ZGVsZXRlIGRvZXMgbm90IGhhbmRsZSBleHRlcm5hbCBqYXJzKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0RGVsZXRlSmFyRmlsZTMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sIG5ldyBTdHJpbmdbXSB7Z2V0RXh0ZXJuYWxKQ0xQYXRoU3RyaW5nKCl9LCAiYmluIik7Ci0KLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChnZXRFeHRlcm5hbEpDTFBhdGhTdHJpbmcoKSk7Ci0JCXRoaXMuc3RhcnREZWx0YXMoKTsKLQkJdGhpcy5kZWxldGUocm9vdCk7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIiwKLQkJCSJQWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCSIgKyBnZXRFeHRlcm5hbEpDTFBhdGgoKSArICJbKl06IHtSRU1PVkVEIEZST00gQ0xBU1NQQVRIfVxuIiArIAotCQkJIglSZXNvdXJjZURlbHRhKC9QLy5jbGFzc3BhdGgpWypdIgotCQkpOwotCQlhc3NlcnRKYXZhUHJvamVjdCgKLQkJCSJQXG4iICsgCi0JCQkiCXNyY1xuIiArIAotCQkJIgkJW2RlZmF1bHRdXG4iICsgCi0JCQkiCUwvUC8uY2xhc3NwYXRoXG4iICsgCi0JCQkiCUwvUC8ucHJvamVjdCIsCi0JCQlwcm9qZWN0KTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLnN0b3BEZWx0YXMoKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoKLSAqIEVuc3VyZSB0aGF0IGRlbGV0aW5nIGEgamFyIGZpbGUgdGhhdCBpcyByZWZlcmVuY2VkIGJ5IDIgcHJvamVjdHMgdHJpZ2dlcnMgdGhlIHJpZ2h0IGRlbHRhCi0gKiBhbmQgdGhhdCB0aGUgbW9kZWwgaXMgdXAtdG8tZGF0ZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdERlbGV0ZUphckZpbGUyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwMSA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAxIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sIG5ldyBTdHJpbmdbXSB7Ii9QMS9teUxpYi5qYXIifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoIi9QMS9teUxpYi5qYXIiLCAiIik7Ci0JCUlKYXZhUHJvamVjdCBwMiA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sIG5ldyBTdHJpbmdbXSB7Ii9QMS9teUxpYi5qYXIifSwgImJpbiIpOwotCi0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSB0aGlzLmdldFBhY2thZ2VGcmFnbWVudFJvb3QoIi9QMS9teUxpYi5qYXIiKTsKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZShyb290KTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEiLAotCQkJIlAxWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCW15TGliLmphclstXToge31cbiIgKyAKLQkJCSIJUmVzb3VyY2VEZWx0YSgvUDEvLmNsYXNzcGF0aClbKl1cbiIgKyAKLQkJCSJQMlsqXToge0NISUxEUkVOfVxuIiArIAotCQkJIgkvUDEvbXlMaWIuamFyWy1dOiB7fVxuIiArIAotCQkJIglSZXNvdXJjZURlbHRhKC9QMi8uY2xhc3NwYXRoKVsqXSIKLQkJKTsKLQkJYXNzZXJ0SmF2YVByb2plY3QoCi0JCQkiUDFcbiIgKyAKLQkJCSIJc3JjXG4iICsgCi0JCQkiCQlbZGVmYXVsdF1cbiIgKyAKLQkJCSIJTC9QMS8uY2xhc3NwYXRoXG4iICsgCi0JCQkiCUwvUDEvLnByb2plY3QiLAotCQkJcDEpOwotCQlhc3NlcnRKYXZhUHJvamVjdCgKLQkJCSJQMlxuIiArIAotCQkJIglzcmNcbiIgKyAKLQkJCSIJCVtkZWZhdWx0XVxuIiArIAotCQkJIglML1AyLy5jbGFzc3BhdGhcbiIgKyAKLQkJCSIJTC9QMi8ucHJvamVjdCIsCi0JCQlwMik7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDEiKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMiIpOwotCX0KLX0KLS8qCi0gKiBFbnN1cmUgdGhhdCBhIHNpbXBsZSBkZWxldGUgb2YgYSBzb3VyY2Ugcm9vdCB0cmlnZ2VycyB0aGUgcmlnaHQgZGVsdGEKLSAqIGFuZCB0aGF0IHRoZSBtb2RlbCBpcyB1cC10by1kYXRlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0RGVsZXRlU291cmNlRm9sZGVyMSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjL3AiKTsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QL3NyYy9wL1guamF2YSIsIAotCQkJInBhY2thZ2UgcDtcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIn0iCi0JCSk7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSB0aGlzLmdldFBhY2thZ2VGcmFnbWVudFJvb3QoIi9QL3NyYyIpOwotCQl0aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlKHJvb3QpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSIsCi0JCQkiUFsqXToge0NISUxEUkVOfVxuIiArIAotCQkJIglzcmNbLV06IHt9XG4iICsgCi0JCQkiCVJlc291cmNlRGVsdGEoL1AvLmNsYXNzcGF0aClbKl0iCi0JCSk7Ci0JCWFzc2VydEphdmFQcm9qZWN0KAotCQkJIlBcbiIgKyAKLQkJCSIJTC9QLy5jbGFzc3BhdGhcbiIgKyAKLQkJCSIJTC9QLy5wcm9qZWN0IiwKLQkJCXByb2plY3QpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci0vKgotICogRW5zdXJlIHRoYXQgZGVsZXRpbmcgYSBzb3VyY2Ugcm9vdCB0cmlnZ2VycyB0aGUgcmlnaHQgZGVsdGEKLSAqIGFuZCBkb2Vzbid0IGRlbGV0ZSBhIG5lc3RlZCBzb3VyY2UgZm9sZGVyLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0RGVsZXRlU291cmNlRm9sZGVyMigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10ge30sICJiaW4iKTsKLQkJcHJvamVjdC5zZXRSYXdDbGFzc3BhdGgoY3JlYXRlQ2xhc3NwYXRoKG5ldyBTdHJpbmdbXSB7Ii9QL3NyYzEiLCAic3JjMi8qKiIsICIvUC9zcmMxL3NyYzIiLCAiIn0pLCBudWxsKTsKLQkJSUZvbGRlciBmb2xkZXIgPSB0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjMS9wIik7Ci0JCUlGaWxlIGZpbGUgPSB0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1Avc3JjMS9wL1guamF2YSIsIAotCQkJInBhY2thZ2UgcDtcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKwotCQkJIn0iCi0JCSk7Ci0JCXRoaXMuY3JlYXRlRm9sZGVyKCIvUC9zcmMxL3NyYzIvcSIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1Avc3JjMS9zcmMyL3EvWS5qYXZhIiwgCi0JCQkicGFja2FnZSBxO1xuIiArCi0JCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHRoaXMuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgiL1Avc3JjMSIpOwotCQl0aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlKHJvb3QpOwotCQkKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEiLAotCQkJIlBbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJCSIJc3JjMVsqXToge1JFTU9WRUQgRlJPTSBDTEFTU1BBVEh9XG4iICsgCi0JCQkiCXNyYzEvc3JjMlsqXToge1JFT1JERVJFRH1cbiIgKyAKLQkJCSIJUmVzb3VyY2VEZWx0YSgvUC8uY2xhc3NwYXRoKVsqXVxuIiArIAotCQkJIglSZXNvdXJjZURlbHRhKC9QL3NyYzEpWypdIgotCQkpOwotCQkKLQkJYXNzZXJ0SmF2YVByb2plY3QoCi0JCQkiUFxuIiArIAotCQkJIglzcmMxL3NyYzJcbiIgKyAKLQkJCSIJCVtkZWZhdWx0XVxuIiArIAotCQkJIgkJcVxuIiArIAotCQkJIgkJCVkuamF2YVxuIiArIAotCQkJIglML1AvLmNsYXNzcGF0aFxuIiArIAotCQkJIglML1AvLnByb2plY3RcbiIgKyAKLQkJCSIJRi9QL3NyYzEiLAotCQkJcHJvamVjdCk7Ci0JCQkKLQkJYXNzZXJ0VHJ1ZSgiT3JpZ2luYWwgcGFja2FnZSBmb2xkZXIgc2hvdWxkIG5vdCBleGlzdCIsICFmb2xkZXIuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKCJPcmlnaW5hbCBjdSBmaWxlIHNob3VsZCBub3QgZXhpc3QiLCAhZmlsZS5leGlzdHMoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qCi0gKiBFbnN1cmUgdGhhdCBhIHNpbXBsZSBtb3ZlIG9mIGEgc291cmNlIHJvb3QgdG8gYW5vdGhlciBwcm9qZWN0IHRyaWdnZXJzIHRoZSByaWdodCBkZWx0YQotICogYW5kIHRoYXQgdGhlIG1vZGVsIGlzIHVwLXRvLWRhdGUuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNb3ZlU291cmNlRm9sZGVyMSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcDEgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMSIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCUlKYXZhUHJvamVjdCBwMiA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHt9LCAiYmluIik7Ci0JCXRoaXMuY3JlYXRlRm9sZGVyKCIvUDEvc3JjL3AiKTsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QMS9zcmMvcC9YLmphdmEiLCAKLQkJCSJwYWNrYWdlIHA7XG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gdGhpcy5nZXRQYWNrYWdlRnJhZ21lbnRSb290KCIvUDEvc3JjIik7Ci0JCXRoaXMuc3RhcnREZWx0YXMoKTsKLQkJdGhpcy5tb3ZlKHJvb3QsIG5ldyBQYXRoKCIvUDIvc3JjIikpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSIsCi0JCQkiUDFbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJCSIJc3JjWy1dOiB7TU9WRURfVE8oc3JjIFtpbiBQMl0pfVxuIiArIAotCQkJIglSZXNvdXJjZURlbHRhKC9QMS8uY2xhc3NwYXRoKVsqXVxuIiArIAotCQkJIlAyWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCXNyY1srXToge01PVkVEX0ZST00oc3JjIFtpbiBQMV0pfVxuIiArIAotCQkJIglSZXNvdXJjZURlbHRhKC9QMi8uY2xhc3NwYXRoKVsqXSIKLQkJKTsKLQkJYXNzZXJ0SmF2YVByb2plY3QoCi0JCQkiUDFcbiIgKyAKLQkJCSIJTC9QMS8uY2xhc3NwYXRoXG4iICsgCi0JCQkiCUwvUDEvLnByb2plY3QiLAotCQkJcDEpOwotCQlhc3NlcnRKYXZhUHJvamVjdCgKLQkJCSJQMlxuIiArIAotCQkJIglzcmNcbiIgKyAKLQkJCSIJCVtkZWZhdWx0XVxuIiArIAotCQkJIgkJcFxuIiArIAotCQkJIgkJCVguamF2YVxuIiArIAotCQkJIglML1AyLy5jbGFzc3BhdGhcbiIgKyAKLQkJCSIJTC9QMi8ucHJvamVjdCIsCi0JCQlwMik7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDEiKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMiIpOwotCX0KLX0KLS8qCi0gKiBFbnN1cmUgdGhhdCBtb3ZpbmcgYW5kIHJlbmFtaW5nIGEgc291cmNlIHJvb3QgdG8gYW5vdGhlciBwcm9qZWN0IHRyaWdnZXJzIHRoZSByaWdodCBkZWx0YQotICogYW5kIHRoYXQgdGhlIG1vZGVsIGlzIHVwLXRvLWRhdGUuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNb3ZlU291cmNlRm9sZGVyMigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcDEgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMSIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCUlKYXZhUHJvamVjdCBwMiA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHt9LCAiYmluIik7Ci0JCXRoaXMuY3JlYXRlRm9sZGVyKCIvUDEvc3JjL3AiKTsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QMS9zcmMvcC9YLmphdmEiLCAKLQkJCSJwYWNrYWdlIHA7XG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSJ9IgotCQkpOwotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gdGhpcy5nZXRQYWNrYWdlRnJhZ21lbnRSb290KCIvUDEvc3JjIik7Ci0JCXRoaXMuc3RhcnREZWx0YXMoKTsKLQkJdGhpcy5tb3ZlKHJvb3QsIG5ldyBQYXRoKCIvUDIvc3JjMiIpKTsKLQkJCi0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIiwKLQkJCSJQMVsqXToge0NISUxEUkVOfVxuIiArIAotCQkJIglzcmNbLV06IHtNT1ZFRF9UTyhzcmMyIFtpbiBQMl0pfVxuIiArIAotCQkJIglSZXNvdXJjZURlbHRhKC9QMS8uY2xhc3NwYXRoKVsqXVxuIiArIAotCQkJIlAyWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCXNyYzJbK106IHtNT1ZFRF9GUk9NKHNyYyBbaW4gUDFdKX1cbiIgKyAKLQkJCSIJUmVzb3VyY2VEZWx0YSgvUDIvLmNsYXNzcGF0aClbKl0iCi0JCSk7Ci0JCQotCQlhc3NlcnRKYXZhUHJvamVjdCgKLQkJCSJQMVxuIiArIAotCQkJIglML1AxLy5jbGFzc3BhdGhcbiIgKyAKLQkJCSIJTC9QMS8ucHJvamVjdCIsCi0JCQlwMSk7Ci0JCWFzc2VydEphdmFQcm9qZWN0KAotCQkJIlAyXG4iICsgCi0JCQkiCXNyYzJcbiIgKyAKLQkJCSIJCVtkZWZhdWx0XVxuIiArIAotCQkJIgkJcFxuIiArIAotCQkJIgkJCVguamF2YVxuIiArIAotCQkJIglML1AyLy5jbGFzc3BhdGhcbiIgKyAKLQkJCSIJTC9QMi8ucHJvamVjdCIsCi0JCQlwMik7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDEiKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMiIpOwotCX0KLX0KLS8qCi0gKiBFbnN1cmUgdGhhdCBtb3ZpbmcgYSBzb3VyY2Ugcm9vdCB0byBhbm90aGVyIHByb2plY3QgdHJpZ2dlcnMgdGhlIHJpZ2h0IGRlbHRhCi0gKiBhbmQgZG9lc24ndCBtb3ZlIGEgbmVzdGVkIHNvdXJjZSBmb2xkZXIuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNb3ZlU291cmNlRm9sZGVyMygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcDEgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMSIsIG5ldyBTdHJpbmdbXSB7fSwgImJpbiIpOwotCQlwMS5zZXRSYXdDbGFzc3BhdGgoY3JlYXRlQ2xhc3NwYXRoKG5ldyBTdHJpbmdbXSB7Ii9QMS9zcmMxIiwgInNyYzIvKioiLCAiL1AxL3NyYzEvc3JjMiIsICIifSksIG51bGwpOwotCQlJSmF2YVByb2plY3QgcDIgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMiIsIG5ldyBTdHJpbmdbXSB7fSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZvbGRlcigiL1AxL3NyYzEvcCIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1AxL3NyYzEvcC9YLmphdmEiLCAKLQkJCSJwYWNrYWdlIHA7XG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSJ9IgotCQkpOwotCQl0aGlzLmNyZWF0ZUZvbGRlcigiL1AxL3NyYzEvc3JjMi9xIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUDEvc3JjMS9zcmMyL3EvWS5qYXZhIiwgCi0JCQkicGFja2FnZSBxO1xuIiArCi0JCQkicHVibGljIGNsYXNzIFkge1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHRoaXMuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgiL1AxL3NyYzEiKTsKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQl0aGlzLm1vdmUocm9vdCwgbmV3IFBhdGgoIi9QMi9zcmMxIikpOwotCQkKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEiLAotCQkJIlAxWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCXNyYzFbKl06IHtSRU1PVkVEIEZST00gQ0xBU1NQQVRIfVxuIiArIAotCQkJIglzcmMxL3NyYzJbKl06IHtSRU9SREVSRUR9XG4iICsgCi0JCQkiCVJlc291cmNlRGVsdGEoL1AxLy5jbGFzc3BhdGgpWypdXG4iICsgCi0JCQkiCVJlc291cmNlRGVsdGEoL1AxL3NyYzEpWypdXG4iICsgCi0JCQkiUDJbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJCSIJc3JjMVsrXToge31cbiIgKyAKLQkJCSIJUmVzb3VyY2VEZWx0YSgvUDIvLmNsYXNzcGF0aClbKl0iCi0JCSk7Ci0JCQotCQlhc3NlcnRKYXZhUHJvamVjdCgKLQkJCSJQMVxuIiArIAotCQkJIglzcmMxL3NyYzJcbiIgKyAKLQkJCSIJCVtkZWZhdWx0XVxuIiArIAotCQkJIgkJcVxuIiArIAotCQkJIgkJCVkuamF2YVxuIiArIAotCQkJIglML1AxLy5jbGFzc3BhdGhcbiIgKyAKLQkJCSIJTC9QMS8ucHJvamVjdFxuIiArIAotCQkJIglGL1AxL3NyYzEiLAotCQkJcDEpOwotCQlhc3NlcnRKYXZhUHJvamVjdCgKLQkJCSJQMlxuIiArIAotCQkJIglzcmMxXG4iICsgCi0JCQkiCQlbZGVmYXVsdF1cbiIgKyAKLQkJCSIJCXBcbiIgKyAKLQkJCSIJCQlYLmphdmFcbiIgKyAKLQkJCSIJTC9QMi8uY2xhc3NwYXRoXG4iICsgCi0JCQkiCUwvUDIvLnByb2plY3QiLAotCQkJcDIpOwotCX0gZmluYWxseSB7Ci0JCXRoaXMuc3RvcERlbHRhcygpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAxIik7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDIiKTsKLQl9Ci19Ci0vKgotICogRW5zdXJlIHRoYXQgbW92aW5nIGEgc291cmNlIHJvb3QgdG8gYW5vdGhlciBwcm9qZWN0IGJlZm9yZSB0aGUgZmlyc3Qgcm9vdCB0cmlnZ2VycyB0aGUgcmlnaHQgZGVsdGEKLSAqIGFuZCB0aGF0IHRoZSBtb2RlbCBpcyB1cC10by1kYXRlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TW92ZVNvdXJjZUZvbGRlcjQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IHAxID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDEiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQlJSmF2YVByb2plY3QgcDIgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMiIsIG5ldyBTdHJpbmdbXSB7InNyYzEiLCAic3JjMiJ9LCAiYmluIik7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSB0aGlzLmdldFBhY2thZ2VGcmFnbWVudFJvb3QoIi9QMS9zcmMiKTsKLQotCQkvLyBpbnNlcnQgZmlyc3QKLQkJSUNsYXNzcGF0aEVudHJ5IHNpYmxpbmcgPSBKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShuZXcgUGF0aCgiL1AyL3NyYzEiKSk7Ci0JCXRoaXMuc3RhcnREZWx0YXMoKTsKLQkJdGhpcy5tb3ZlKHJvb3QsIG5ldyBQYXRoKCIvUDIvc3JjIiksIHNpYmxpbmcpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSIsCi0JCQkiUDFbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJCSIJc3JjWy1dOiB7TU9WRURfVE8oc3JjIFtpbiBQMl0pfVxuIiArIAotCQkJIglSZXNvdXJjZURlbHRhKC9QMS8uY2xhc3NwYXRoKVsqXVxuIiArIAotCQkJIlAyWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCXNyYzFbKl06IHtSRU9SREVSRUR9XG4iICsgCi0JCQkiCXNyYzJbKl06IHtSRU9SREVSRUR9XG4iICsgCi0JCQkiCXNyY1srXToge01PVkVEX0ZST00oc3JjIFtpbiBQMV0pfVxuIiArIAotCQkJIglSZXNvdXJjZURlbHRhKC9QMi8uY2xhc3NwYXRoKVsqXSIKLQkJKTsKLQkJYXNzZXJ0SmF2YVByb2plY3QoCi0JCQkiUDFcbiIgKyAKLQkJCSIJTC9QMS8uY2xhc3NwYXRoXG4iICsgCi0JCQkiCUwvUDEvLnByb2plY3QiLAotCQkJcDEpOwotCQlhc3NlcnRKYXZhUHJvamVjdCgKLQkJCSJQMlxuIiArIAotCQkJIglzcmNcbiIgKyAKLQkJCSIJCVtkZWZhdWx0XVxuIiArIAotCQkJIglzcmMxXG4iICsgCi0JCQkiCQlbZGVmYXVsdF1cbiIgKyAKLQkJCSIJc3JjMlxuIiArIAotCQkJIgkJW2RlZmF1bHRdXG4iICsgCi0JCQkiCUwvUDIvLmNsYXNzcGF0aFxuIiArIAotCQkJIglML1AyLy5wcm9qZWN0IiwKLQkJCXAyKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLnN0b3BEZWx0YXMoKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMSIpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAyIik7Ci0JfQotfQotLyoKLSAqIEVuc3VyZSB0aGF0IG1vdmluZyBhIHNvdXJjZSByb290IHRvIGFub3RoZXIgcHJvamVjdCBpbiB0aGUgbWlkZGxlIG9mIGV4aXN0aW5nIHJvb3RzIHRyaWdnZXJzIHRoZSByaWdodCBkZWx0YQotICogYW5kIHRoYXQgdGhlIG1vZGVsIGlzIHVwLXRvLWRhdGUuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNb3ZlU291cmNlRm9sZGVyNSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcDEgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMSIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCUlKYXZhUHJvamVjdCBwMiA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHsic3JjMSIsICJzcmMyIn0sICJiaW4iKTsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHRoaXMuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgiL1AxL3NyYyIpOwotCi0JCS8vIGluc2VydCBpbiB0aGUgbWlkZGxlCi0JCUlDbGFzc3BhdGhFbnRyeSBzaWJsaW5nID0gSmF2YUNvcmUubmV3U291cmNlRW50cnkobmV3IFBhdGgoIi9QMi9zcmMyIikpOwotCQl0aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCXRoaXMubW92ZShyb290LCBuZXcgUGF0aCgiL1AyL3NyYyIpLCBzaWJsaW5nKTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEiLAotCQkJIlAxWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCXNyY1stXToge01PVkVEX1RPKHNyYyBbaW4gUDJdKX1cbiIgKyAKLQkJCSIJUmVzb3VyY2VEZWx0YSgvUDEvLmNsYXNzcGF0aClbKl1cbiIgKyAKLQkJCSJQMlsqXToge0NISUxEUkVOfVxuIiArIAotCQkJIglzcmMyWypdOiB7UkVPUkRFUkVEfVxuIiArIAotCQkJIglzcmNbK106IHtNT1ZFRF9GUk9NKHNyYyBbaW4gUDFdKX1cbiIgKyAKLQkJCSIJUmVzb3VyY2VEZWx0YSgvUDIvLmNsYXNzcGF0aClbKl0iCi0JCSk7Ci0JCWFzc2VydEphdmFQcm9qZWN0KAotCQkJIlAxXG4iICsgCi0JCQkiCUwvUDEvLmNsYXNzcGF0aFxuIiArIAotCQkJIglML1AxLy5wcm9qZWN0IiwKLQkJCXAxKTsKLQkJYXNzZXJ0SmF2YVByb2plY3QoCi0JCQkiUDJcbiIgKyAKLQkJCSIJc3JjMVxuIiArIAotCQkJIgkJW2RlZmF1bHRdXG4iICsgCi0JCQkiCXNyY1xuIiArIAotCQkJIgkJW2RlZmF1bHRdXG4iICsgCi0JCQkiCXNyYzJcbiIgKyAKLQkJCSIJCVtkZWZhdWx0XVxuIiArIAotCQkJIglML1AyLy5jbGFzc3BhdGhcbiIgKyAKLQkJCSIJTC9QMi8ucHJvamVjdCIsCi0JCQlwMik7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDEiKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMiIpOwotCX0KLX0KLS8qCi0gKiBFbnN1cmUgdGhhdCBtb3ZpbmcgYSBzb3VyY2Ugcm9vdCB0byBhbm90aGVyIHByb2plY3QgYXQgdGhlIGVuZCBvZiB0aGUgY2xhc3NwYXRoIHRyaWdnZXJzIHRoZSByaWdodCBkZWx0YQotICogYW5kIHRoYXQgdGhlIG1vZGVsIGlzIHVwLXRvLWRhdGUuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RNb3ZlU291cmNlRm9sZGVyNigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcDEgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQMSIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCAiYmluIik7Ci0JCUlKYXZhUHJvamVjdCBwMiA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHsic3JjMSIsICJzcmMyIn0sICJiaW4iKTsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHRoaXMuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgiL1AxL3NyYyIpOwotCQkJCi0JCS8vIGluc2VydCBsYXN0Ci0JCXRoaXMuc3RhcnREZWx0YXMoKTsKLQkJdGhpcy5tb3ZlKHJvb3QsIG5ldyBQYXRoKCIvUDIvc3JjIiksIG51bGwpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSIsCi0JCQkiUDFbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJCSIJc3JjWy1dOiB7TU9WRURfVE8oc3JjIFtpbiBQMl0pfVxuIiArIAotCQkJIglSZXNvdXJjZURlbHRhKC9QMS8uY2xhc3NwYXRoKVsqXVxuIiArIAotCQkJIlAyWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCXNyY1srXToge01PVkVEX0ZST00oc3JjIFtpbiBQMV0pfVxuIiArIAotCQkJIglSZXNvdXJjZURlbHRhKC9QMi8uY2xhc3NwYXRoKVsqXSIKLQkJKTsKLQkJYXNzZXJ0SmF2YVByb2plY3QoCi0JCQkiUDFcbiIgKyAKLQkJCSIJTC9QMS8uY2xhc3NwYXRoXG4iICsgCi0JCQkiCUwvUDEvLnByb2plY3QiLAotCQkJcDEpOwotCQlhc3NlcnRKYXZhUHJvamVjdCgKLQkJCSJQMlxuIiArIAotCQkJIglzcmMxXG4iICsgCi0JCQkiCQlbZGVmYXVsdF1cbiIgKyAKLQkJCSIJc3JjMlxuIiArIAotCQkJIgkJW2RlZmF1bHRdXG4iICsgCi0JCQkiCXNyY1xuIiArIAotCQkJIgkJW2RlZmF1bHRdXG4iICsgCi0JCQkiCUwvUDIvLmNsYXNzcGF0aFxuIiArIAotCQkJIglML1AyLy5wcm9qZWN0IiwKLQkJCXAyKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLnN0b3BEZWx0YXMoKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMSIpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAyIik7Ci0JfQotfQotLyoKLSAqIEVuc3VyZSB0aGF0IGEgc2ltcGxlIHJlbmFtZSBvZiBhIHNvdXJjZSByb290IHRyaWdnZXJzIHRoZSByaWdodCBkZWx0YQotICogYW5kIHRoYXQgdGhlIG1vZGVsIGlzIHVwLXRvLWRhdGUuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZW5hbWVTb3VyY2VGb2xkZXIxKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7InNyYzEifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZvbGRlcigiL1Avc3JjMS9wIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMxL3AvWC5qYXZhIiwgCi0JCQkicGFja2FnZSBwO1xuIiArCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHRoaXMuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgiL1Avc3JjMSIpOwotCQl0aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCXRoaXMubW92ZShyb290LCBuZXcgUGF0aCgiL1Avc3JjMiIpKTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEiLAotCQkJIlBbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJCSIJc3JjMVstXToge01PVkVEX1RPKHNyYzIgW2luIFBdKX1cbiIgKyAKLQkJCSIJc3JjMlsrXToge01PVkVEX0ZST00oc3JjMSBbaW4gUF0pfVxuIiArIAotCQkJIglSZXNvdXJjZURlbHRhKC9QLy5jbGFzc3BhdGgpWypdIgotCQkpOwotCQlhc3NlcnRKYXZhUHJvamVjdCgKLQkJCSJQXG4iICsgCi0JCQkiCXNyYzJcbiIgKyAKLQkJCSIJCVtkZWZhdWx0XVxuIiArIAotCQkJIgkJcFxuIiArIAotCQkJIgkJCVguamF2YVxuIiArIAotCQkJIglML1AvLmNsYXNzcGF0aFxuIiArIAotCQkJIglML1AvLnByb2plY3QiLAotCQkJcHJvamVjdCk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qCi0gKiBFbnN1cmUgdGhhdCByZW5hbWluZyBhIHNvdXJjZSByb290IGtlZXBzIHRoZSBzYW1lIHJvb3RzIG9yZGVyLAotICogYW5kIHRoYXQgaXQgdHJpZ2dlcnMgdGhlIHJpZ2h0IGRlbHRhIGFuZCB0aGF0IHRoZSBtb2RlbCBpcyB1cC10by1kYXRlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVuYW1lU291cmNlRm9sZGVyMigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyJzcmMxIiwgInNyYzIiLCAic3JjMyJ9LCAiYmluIik7Ci0JCQotCQkvLyByZW5hbWUgc3JjMQotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gdGhpcy5nZXRQYWNrYWdlRnJhZ21lbnRSb290KCIvUC9zcmMxIik7Ci0JCXRoaXMuc3RhcnREZWx0YXMoKTsKLQkJdGhpcy5tb3ZlKHJvb3QsIG5ldyBQYXRoKCIvUC9zcmM0IikpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSBhZnRlciByZW5hbWluZyBzcmMxIiwKLQkJCSJQWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCXNyYzFbLV06IHtNT1ZFRF9UTyhzcmM0IFtpbiBQXSl9XG4iICsgCi0JCQkiCXNyYzRbK106IHtNT1ZFRF9GUk9NKHNyYzEgW2luIFBdKX1cbiIgKyAKLQkJCSIJUmVzb3VyY2VEZWx0YSgvUC8uY2xhc3NwYXRoKVsqXSIKLQkJKTsKLQkJYXNzZXJ0SmF2YVByb2plY3QoCi0JCQkiUFxuIiArIAotCQkJIglzcmM0XG4iICsgCi0JCQkiCQlbZGVmYXVsdF1cbiIgKyAKLQkJCSIJc3JjMlxuIiArIAotCQkJIgkJW2RlZmF1bHRdXG4iICsgCi0JCQkiCXNyYzNcbiIgKyAKLQkJCSIJCVtkZWZhdWx0XVxuIiArIAotCQkJIglML1AvLmNsYXNzcGF0aFxuIiArIAotCQkJIglML1AvLnByb2plY3QiLAotCQkJcHJvamVjdCk7Ci0JCQkKLQkJLy8gcmVuYW1lIHNyYzIKLQkJcm9vdCA9IHRoaXMuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgiL1Avc3JjMiIpOwotCQl0aGlzLmNsZWFyRGVsdGFzKCk7Ci0JCXRoaXMubW92ZShyb290LCBuZXcgUGF0aCgiL1Avc3JjNSIpKTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEgYWZ0ZXIgcmVuYW1pbmcgc3JjMiIsCi0JCQkiUFsqXToge0NISUxEUkVOfVxuIiArIAotCQkJIglzcmMyWy1dOiB7TU9WRURfVE8oc3JjNSBbaW4gUF0pfVxuIiArIAotCQkJIglzcmM1WytdOiB7TU9WRURfRlJPTShzcmMyIFtpbiBQXSl9XG4iICsgCi0JCQkiCVJlc291cmNlRGVsdGEoL1AvLmNsYXNzcGF0aClbKl0iCi0JCSk7Ci0JCWFzc2VydEphdmFQcm9qZWN0KAotCQkJIlBcbiIgKyAKLQkJCSIJc3JjNFxuIiArIAotCQkJIgkJW2RlZmF1bHRdXG4iICsgCi0JCQkiCXNyYzVcbiIgKyAKLQkJCSIJCVtkZWZhdWx0XVxuIiArIAotCQkJIglzcmMzXG4iICsgCi0JCQkiCQlbZGVmYXVsdF1cbiIgKyAKLQkJCSIJTC9QLy5jbGFzc3BhdGhcbiIgKyAKLQkJCSIJTC9QLy5wcm9qZWN0IiwKLQkJCXByb2plY3QpOwkJCi0KLQkJLy8gcmVuYW1lIHNyYzMKLQkJcm9vdCA9IHRoaXMuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgiL1Avc3JjMyIpOwotCQl0aGlzLmNsZWFyRGVsdGFzKCk7Ci0JCXRoaXMubW92ZShyb290LCBuZXcgUGF0aCgiL1Avc3JjNiIpKTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEgYWZ0ZXIgcmVuYW1pbmcgc3JjMyIsCi0JCQkiUFsqXToge0NISUxEUkVOfVxuIiArIAotCQkJIglzcmMzWy1dOiB7TU9WRURfVE8oc3JjNiBbaW4gUF0pfVxuIiArIAotCQkJIglzcmM2WytdOiB7TU9WRURfRlJPTShzcmMzIFtpbiBQXSl9XG4iICsgCi0JCQkiCVJlc291cmNlRGVsdGEoL1AvLmNsYXNzcGF0aClbKl0iCi0JCSk7Ci0JCWFzc2VydEphdmFQcm9qZWN0KAotCQkJIlBcbiIgKyAKLQkJCSIJc3JjNFxuIiArIAotCQkJIgkJW2RlZmF1bHRdXG4iICsgCi0JCQkiCXNyYzVcbiIgKyAKLQkJCSIJCVtkZWZhdWx0XVxuIiArIAotCQkJIglzcmM2XG4iICsgCi0JCQkiCQlbZGVmYXVsdF1cbiIgKyAKLQkJCSIJTC9QLy5jbGFzc3BhdGhcbiIgKyAKLQkJCSIJTC9QLy5wcm9qZWN0IiwKLQkJCXByb2plY3QpOwkJCi0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLS8qCi0gKiBFbnN1cmUgdGhhdCBhIHNpbXBsZSByZW5hbWUgb2YgYSBqYXIgZmlsZSB0cmlnZ2VycyB0aGUgcmlnaHQgZGVsdGEKLSAqIGFuZCB0aGF0IHRoZSBtb2RlbCBpcyB1cC10by1kYXRlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVuYW1lSmFyRmlsZTEoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSB0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sIG5ldyBTdHJpbmdbXSB7Ii9QL215TGliLmphciJ9LCAiYmluIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgiL1AvbXlMaWIuamFyIiwgIiIpOwotCi0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSB0aGlzLmdldFBhY2thZ2VGcmFnbWVudFJvb3QoIi9QL215TGliLmphciIpOwotCQl0aGlzLnN0YXJ0RGVsdGFzKCk7Ci0JCXRoaXMubW92ZShyb290LCBuZXcgUGF0aCgiL1AvbXlMaWIyLmphciIpKTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEiLAotCQkJIlBbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJCSIJbXlMaWIuamFyWy1dOiB7TU9WRURfVE8obXlMaWIyLmphciBbaW4gUF0pfVxuIiArIAotCQkJIglteUxpYjIuamFyWytdOiB7TU9WRURfRlJPTShteUxpYi5qYXIgW2luIFBdKX1cbiIgKyAKLQkJCSIJUmVzb3VyY2VEZWx0YSgvUC8uY2xhc3NwYXRoKVsqXSIKLQkJKTsKLQkJYXNzZXJ0SmF2YVByb2plY3QoCi0JCQkiUFxuIiArIAotCQkJIglzcmNcbiIgKyAKLQkJCSIJCVtkZWZhdWx0XVxuIiArIAotCQkJIglteUxpYjIuamFyXG4iICsgCi0JCQkiCUwvUC8uY2xhc3NwYXRoXG4iICsgCi0JCQkiCUwvUC8ucHJvamVjdCIsCi0JCQlwcm9qZWN0KTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLnN0b3BEZWx0YXMoKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci0JfQotfQotLyoKLSAqIEVuc3VyZSB0aGF0IHJlbmFtaW5nIG9mIGEgamFyIGZpbGUgdGhhdCBpcyByZWZlcmVuY2VkIGJ5IDIgcHJvamVjdHMgdHJpZ2dlcnMgdGhlIHJpZ2h0IGRlbHRhCi0gKiBhbmQgdGhhdCB0aGUgbW9kZWwgaXMgdXAtdG8tZGF0ZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJlbmFtZUphckZpbGUyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwMSA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAxIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sIG5ldyBTdHJpbmdbXSB7Ii9QMS9teUxpYi5qYXIifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoIi9QMS9teUxpYi5qYXIiLCAiIik7Ci0JCUlKYXZhUHJvamVjdCBwMiA9IHRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAyIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sIG5ldyBTdHJpbmdbXSB7Ii9QMS9teUxpYi5qYXIifSwgImJpbiIpOwotCi0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSB0aGlzLmdldFBhY2thZ2VGcmFnbWVudFJvb3QoIi9QMS9teUxpYi5qYXIiKTsKLQkJdGhpcy5zdGFydERlbHRhcygpOwotCQl0aGlzLm1vdmUocm9vdCwgbmV3IFBhdGgoIi9QMS9teUxpYjIuamFyIikpOwotCQlhc3NlcnREZWx0YXMoCi0JCQkiVW5leHBlY3RlZCBkZWx0YSIsCi0JCQkiUDFbKl06IHtDSElMRFJFTn1cbiIgKyAKLQkJCSIJbXlMaWIuamFyWy1dOiB7TU9WRURfVE8obXlMaWIyLmphciBbaW4gUDFdKX1cbiIgKyAKLQkJCSIJbXlMaWIyLmphclsrXToge01PVkVEX0ZST00obXlMaWIuamFyIFtpbiBQMV0pfVxuIiArIAotCQkJIglSZXNvdXJjZURlbHRhKC9QMS8uY2xhc3NwYXRoKVsqXVxuIiArIAotCQkJIlAyWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCS9QMS9teUxpYi5qYXJbLV06IHtNT1ZFRF9UTyhteUxpYjIuamFyIFtpbiBQMV0pfVxuIiArIAotCQkJIgkvUDEvbXlMaWIyLmphclsrXToge01PVkVEX0ZST00obXlMaWIuamFyIFtpbiBQMV0pfVxuIiArIAotCQkJIglSZXNvdXJjZURlbHRhKC9QMi8uY2xhc3NwYXRoKVsqXSIKLQkJKTsKLQkJYXNzZXJ0SmF2YVByb2plY3QoCi0JCQkiUDFcbiIgKyAKLQkJCSIJc3JjXG4iICsgCi0JCQkiCQlbZGVmYXVsdF1cbiIgKyAKLQkJCSIJbXlMaWIyLmphclxuIiArIAotCQkJIglML1AxLy5jbGFzc3BhdGhcbiIgKyAKLQkJCSIJTC9QMS8ucHJvamVjdCIsCi0JCQlwMSk7Ci0JCWFzc2VydEphdmFQcm9qZWN0KAotCQkJIlAyXG4iICsgCi0JCQkiCXNyY1xuIiArIAotCQkJIgkJW2RlZmF1bHRdXG4iICsgCi0JCQkiCS9QMS9teUxpYjIuamFyXG4iICsgCi0JCQkiCUwvUDIvLmNsYXNzcGF0aFxuIiArIAotCQkJIglML1AyLy5wcm9qZWN0IiwKLQkJCXAyKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLnN0b3BEZWx0YXMoKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJQMSIpOwotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAyIik7Ci0JfQotfQotLyoKLSAqIEVuc3VyZSB0aGF0IHJlbmFtaW5nIG9mIGEgamFyIGZpbGUgdG8gYW4gZXhpc3RpbmcgZmlsZSBpbiBSRVBMQUNFIG1vZGUKLSAqIHRyaWdnZXJzIHRoZSByaWdodCBkZWx0YSBhbmQgdGhhdCB0aGUgbW9kZWwgaXMgdXAtdG8tZGF0ZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJlbmFtZUphckZpbGUzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUCIsIG5ldyBTdHJpbmdbXSB7InNyYyJ9LCBuZXcgU3RyaW5nW10geyIvUC9teUxpYjEuamFyIiwgIi9QL215TGliMi5qYXIifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZpbGUoIi9QL215TGliMS5qYXIiLCAiIik7Ci0JCXRoaXMuY3JlYXRlRmlsZSgiL1AvbXlMaWIyLmphciIsICIiKTsKLQotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gdGhpcy5nZXRQYWNrYWdlRnJhZ21lbnRSb290KCIvUC9teUxpYjEuamFyIik7Ci0JCXRoaXMuc3RhcnREZWx0YXMoKTsKLQkJcm9vdC5tb3ZlKAotCQkJbmV3IFBhdGgoIi9QL215TGliMi5qYXIiKSwKLQkJCUlSZXNvdXJjZS5OT05FLAotCQkJSVBhY2thZ2VGcmFnbWVudFJvb3QuT1JJR0lOQVRJTkdfUFJPSkVDVF9DTEFTU1BBVEggCi0JCQkJfCBJUGFja2FnZUZyYWdtZW50Um9vdC5ERVNUSU5BVElPTl9QUk9KRUNUX0NMQVNTUEFUSCAKLQkJCQl8IElQYWNrYWdlRnJhZ21lbnRSb290LlJFUExBQ0UsCi0JCQludWxsLAotCQkJbnVsbCk7Ci0JCWFzc2VydERlbHRhcygKLQkJCSJVbmV4cGVjdGVkIGRlbHRhIiwKLQkJCSJQWypdOiB7Q0hJTERSRU59XG4iICsgCi0JCQkiCW15TGliMS5qYXJbLV06IHtNT1ZFRF9UTyhteUxpYjIuamFyIFtpbiBQXSl9XG4iICsgCi0JCQkiCW15TGliMi5qYXJbKl06IHtSRU9SREVSRUR9XG4iICsgCi0JCQkiCVJlc291cmNlRGVsdGEoL1AvLmNsYXNzcGF0aClbKl0iCi0JCSk7Ci0JCWFzc2VydEphdmFQcm9qZWN0KAotCQkJIlBcbiIgKyAKLQkJCSIJc3JjXG4iICsgCi0JCQkiCQlbZGVmYXVsdF1cbiIgKyAKLQkJCSIJbXlMaWIyLmphclxuIiArIAotCQkJIglML1AvLmNsYXNzcGF0aFxuIiArIAotCQkJIglML1AvLnByb2plY3QiLAotCQkJcHJvamVjdCk7Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5zdG9wRGVsdGFzKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUCIpOwotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9TZWFyY2hUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL1NlYXJjaFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZTI1NjYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL1NlYXJjaFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5DaGFyT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSVR5cGVOYW1lUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwuU2VtYXBob3JlLlRpbWVPdXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMudXRpbC5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nLkluZGV4TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gubWF0Y2hpbmcuU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2gucHJvY2Vzc2luZy5JSm9iOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLS8qCi0gKiBUZXN0IGluZGV4aW5nIHN1cHBvcnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWFyY2hUZXN0cyBleHRlbmRzIE1vZGlmeWluZ1Jlc291cmNlVGVzdHMgaW1wbGVtZW50cyBJSmF2YVNlYXJjaENvbnN0YW50cyB7Ci0JLyoKLQkgKiBFbXB0eSBqYXIgY29udGVudHMuCi0JICogR2VuZXJhdGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29kZToKLQkgCi0JIAlTdHJpbmcgZmlsZVBhdGggPSAiZDpcXHRlbXBcXGVtcHR5LmphciI7Ci0JCW5ldyBKYXJPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZVBhdGgpLCBuZXcgTWFuaWZlc3QoKSkuY2xvc2UoKTsKLQkJYnl0ZVtdIGNvbnRlbnRzID0gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5nZXRGaWxlQnl0ZUNvbnRlbnQobmV3IEZpbGUoZmlsZVBhdGgpKTsKLQkJU3lzdGVtLm91dC5wcmludCgieyIpOwotCQlmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gY29udGVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCVN5c3RlbS5vdXQucHJpbnQoY29udGVudHNbaV0pOwotCQkJU3lzdGVtLm91dC5wcmludCgiLCAiKTsKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50KCJ9Iik7Ci0JICovCi0Jc3RhdGljIGZpbmFsIGJ5dGVbXSBFTVBUWV9KQVIgPSB7ODAsIDc1LCAzLCA0LCAyMCwgMCwgOCwgMCwgOCwgMCwgMTA2LCAtMTAwLCAxMTYsIDQ2LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAyMCwgMCwgNCwgMCwgNzcsIDY5LCA4NCwgNjUsIDQ1LCA3MywgNzgsIDcwLCA0NywgNzcsIDY1LCA3OCwgNzMsIDcwLCA2OSwgODMsIDg0LCA0NiwgNzcsIDcwLCAtMiwgLTU0LCAwLCAwLCAtMjksIC0yNywgMiwgMCwgODAsIDc1LCA3LCA4LCAtODQsIC0xMjMsIC05NCwgMjAsIDQsIDAsIDAsIDAsIDIsIDAsIDAsIDAsIDgwLCA3NSwgMSwgMiwgMjAsIDAsIDIwLCAwLCA4LCAwLCA4LCAwLCAxMDYsIC0xMDAsIDExNiwgNDYsIC04NCwgLTEyMywgLTk0LCAyMCwgNCwgMCwgMCwgMCwgMiwgMCwgMCwgMCwgMjAsIDAsIDQsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDc3LCA2OSwgODQsIDY1LCA0NSwgNzMsIDc4LCA3MCwgNDcsIDc3LCA2NSwgNzgsIDczLCA3MCwgNjksIDgzLCA4NCwgNDYsIDc3LCA3MCwgLTIsIC01NCwgMCwgMCwgODAsIDc1LCA1LCA2LCAwLCAwLCAwLCAwLCAxLCAwLCAxLCAwLCA3MCwgMCwgMCwgMCwgNzQsIDAsIDAsIDAsIDAsIDAsIH07Ci0JY2xhc3MgV2FpdFVudGlsUmVhZHlNb25pdG9yIGltcGxlbWVudHMgSVByb2dyZXNzTW9uaXRvciB7Ci0JCXB1YmxpYyBTZW1hcGhvcmUgc2VtID0gbmV3IFNlbWFwaG9yZSgpOwotCQlwdWJsaWMgdm9pZCBiZWdpblRhc2soU3RyaW5nIG5hbWUsIGludCB0b3RhbFdvcmspIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBpbnRlcm5hbFdvcmtlZChkb3VibGUgd29yaykgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGRvbmUoKSB7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRDYW5jZWxlZChib29sZWFuIHZhbHVlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0VGFza05hbWUoU3RyaW5nIG5hbWUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBzdWJUYXNrKFN0cmluZyBuYW1lKSB7Ci0JCQkvLyBjb25jdXJyZW50IGpvYiBpcyBzaWduYWxpbmcgaXQgaXMgd29ya2luZwotCQkJdGhpcy5zZW0ucmVsZWFzZSgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHdvcmtlZChpbnQgd29yaykgewotCQl9Ci0JfQotCWNsYXNzIFR5cGVOYW1lUmVxdWVzdG9yIGltcGxlbWVudHMgSVR5cGVOYW1lUmVxdWVzdG9yIHsKLQkJVmVjdG9yIHJlc3VsdHMgPSBuZXcgVmVjdG9yKCk7Ci0JCXB1YmxpYyB2b2lkIGFjY2VwdENsYXNzKGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHNpbXBsZVR5cGVOYW1lLCBjaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMsIFN0cmluZyBwYXRoKXsKLQkJCWFjY2VwdFR5cGUocGFja2FnZU5hbWUsIHNpbXBsZVR5cGVOYW1lLCBlbmNsb3NpbmdUeXBlTmFtZXMpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFjY2VwdEludGVyZmFjZShjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSBzaW1wbGVUeXBlTmFtZSwgY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzLCBTdHJpbmcgcGF0aCl7Ci0JCQlhY2NlcHRUeXBlKHBhY2thZ2VOYW1lLCBzaW1wbGVUeXBlTmFtZSwgZW5jbG9zaW5nVHlwZU5hbWVzKTsKLQkJfQotCQlwcml2YXRlIHZvaWQgYWNjZXB0VHlwZShjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSBzaW1wbGVUeXBlTmFtZSwgY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzKSB7Ci0JCQljaGFyW10gdHlwZU5hbWUgPSAKLQkJCQlDaGFyT3BlcmF0aW9uLmNvbmNhdCgKLQkJCQkJQ2hhck9wZXJhdGlvbi5jb25jYXRXaXRoKGVuY2xvc2luZ1R5cGVOYW1lcywgJyQnKSwgCi0JCQkJCXNpbXBsZVR5cGVOYW1lLAotCQkJCQknJCcpOwotCQkJcmVzdWx0cy5hZGRFbGVtZW50KG5ldyBTdHJpbmcoQ2hhck9wZXJhdGlvbi5jb25jYXQocGFja2FnZU5hbWUsIHR5cGVOYW1lLCAnLicpKSk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpewotCQkJaW50IGxlbmd0aCA9IHJlc3VsdHMuc2l6ZSgpOwotCQkJU3RyaW5nW10gc3RyaW5ncyA9IG5ldyBTdHJpbmdbbGVuZ3RoXTsKLQkJCXJlc3VsdHMudG9BcnJheShzdHJpbmdzKTsKLQkJCW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlV0aWwuc29ydChzdHJpbmdzKTsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDEwMCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKXsKLQkJCQlidWZmZXIuYXBwZW5kKHN0cmluZ3NbaV0pOwotCQkJCWlmIChpICE9IGxlbmd0aC0xKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoJ1xuJyk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0JfQotCWNsYXNzIFdhaXRpbmdKb2IgaW1wbGVtZW50cyBJSm9iIHsKLQkJc3RhdGljIGZpbmFsIGludCBNQVhfV0FJVCA9IDMwMDAwOyAvLyB3YWl0IDMwcyBtYXgKLQkJU2VtYXBob3JlIHN0YXJ0aW5nU2VtID0gbmV3IFNlbWFwaG9yZSgpOwotCQlTZW1hcGhvcmUgcnVubmluZ1NlbSA9IG5ldyBTZW1hcGhvcmUoKTsKLQkJcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKFN0cmluZyBqb2JGYW1pbHkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjYW5jZWwoKSB7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKSB7Ci0JCQl0aGlzLnN0YXJ0aW5nU2VtLnJlbGVhc2UoKTsKLQkJCXRyeSB7Ci0JCQkJdGhpcy5ydW5uaW5nU2VtLmFjcXVpcmUoTUFYX1dBSVQpOwotCQkJfSBjYXRjaCAoVGltZU91dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzUmVhZHlUb1J1bigpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCXJldHVybiBuZXcgU3VpdGUoU2VhcmNoVGVzdHMuY2xhc3MpOwotfQotCi0KLXB1YmxpYyBTZWFyY2hUZXN0cyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHJvdGVjdGVkIHZvaWQgYXNzZXJ0QWxsVHlwZXMoaW50IHdhaXRpbmdQb2xpY3ksIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLCBTdHJpbmcgZXhwZWN0ZWQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCWFzc2VydEFsbFR5cGVzKCJVbmV4cGVjdGVkIGFsbCB0eXBlcyIsIG51bGwvKiBubyBzcGVjaWZpYyBwcm9qZWN0Ki8sIHdhaXRpbmdQb2xpY3ksIHByb2dyZXNzTW9uaXRvciwgZXhwZWN0ZWQpOwotfQotcHJvdGVjdGVkIHZvaWQgYXNzZXJ0QWxsVHlwZXMoU3RyaW5nIGV4cGVjdGVkKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlhc3NlcnRBbGxUeXBlcyhXQUlUX1VOVElMX1JFQURZX1RPX1NFQVJDSCwgbnVsbC8qIG5vIHByb2dyZXNzIG1vbml0b3IqLywgZXhwZWN0ZWQpOwotfQotcHJvdGVjdGVkIHZvaWQgYXNzZXJ0QWxsVHlwZXMoU3RyaW5nIG1lc3NhZ2UsIElKYXZhUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZXhwZWN0ZWQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCWFzc2VydEFsbFR5cGVzKG1lc3NhZ2UsIHByb2plY3QsIFdBSVRfVU5USUxfUkVBRFlfVE9fU0VBUkNILCBudWxsLyogbm8gcHJvZ3Jlc3MgbW9uaXRvciovLCBleHBlY3RlZCk7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBhc3NlcnRBbGxUeXBlcyhTdHJpbmcgbWVzc2FnZSwgSUphdmFQcm9qZWN0IHByb2plY3QsIGludCB3YWl0aW5nUG9saWN5LCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciwgU3RyaW5nIGV4cGVjdGVkKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0KLQkJcHJvamVjdCA9PSBudWxsID8KLQkJCVNlYXJjaEVuZ2luZS5jcmVhdGVXb3Jrc3BhY2VTY29wZSgpIDoKLQkJCVNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUobmV3IElKYXZhRWxlbWVudFtdIHtwcm9qZWN0fSk7Ci0JU2VhcmNoRW5naW5lIHNlYXJjaEVuZ2luZSA9IG5ldyBTZWFyY2hFbmdpbmUoKTsKLQlUeXBlTmFtZVJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgVHlwZU5hbWVSZXF1ZXN0b3IoKTsKLQlzZWFyY2hFbmdpbmUuc2VhcmNoQWxsVHlwZU5hbWVzKAotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCksCi0JCW51bGwsCi0JCW51bGwsCi0JCVBBVFRFUk5fTUFUQ0gsCi0JCUNBU0VfSU5TRU5TSVRJVkUsCi0JCVRZUEUsCi0JCXNjb3BlLCAKLQkJcmVxdWVzdG9yLAotCQl3YWl0aW5nUG9saWN5LAotCQlwcm9ncmVzc01vbml0b3IpOwotCVN0cmluZyBhY3R1YWwgPSByZXF1ZXN0b3IudG9TdHJpbmcoKTsKLQlpZiAoIWV4cGVjdGVkLmVxdWFscyhhY3R1YWwpKXsKLQkgCVN5c3RlbS5vdXQucHJpbnRsbihVdGlsLmRpc3BsYXlTdHJpbmcoYWN0dWFsLCAzKSk7Ci0JfQotCWFzc2VydEVxdWFscygKLQkJbWVzc2FnZSwKLQkJZXhwZWN0ZWQsCi0JCWFjdHVhbCk7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBhc3NlcnRQYXR0ZXJuKFN0cmluZyBleHBlY3RlZCwgSVNlYXJjaFBhdHRlcm4gYWN0dWFsUGF0dGVybikgewotCVN0cmluZyBhY3R1YWwgPSBhY3R1YWxQYXR0ZXJuID09IG51bGwgPyBudWxsIDogYWN0dWFsUGF0dGVybi50b1N0cmluZygpOwotCWlmICghZXhwZWN0ZWQuZXF1YWxzKGFjdHVhbCkpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKGFjdHVhbCA9PSBudWxsID8gIm51bGwiIDogVXRpbC5kaXNwbGF5U3RyaW5nKGFjdHVhbCkpOwotCX0KLQlhc3NlcnRFcXVhbHMoCi0JCSJVbmV4cGVjdGVkIHNlYXJjaCBwYXR0ZXJuIiwKLQkJZXhwZWN0ZWQsCi0JCWFjdHVhbCk7Ci19Ci1wdWJsaWMgdm9pZCBzZXRVcFN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0Jc3VwZXIuc2V0VXBTdWl0ZSgpOwotCWNyZWF0ZUphdmFQcm9qZWN0KCJQIik7Ci0JY3JlYXRlRm9sZGVyKCIvUC94L3kveiIpOwotCWNyZWF0ZUZpbGUoCi0JCSIvUC94L3kvei9Gb28uamF2YSIsCi0JCSJwYWNrYWdlIHgueSx6O1xuIiArCi0JCSJpbXBvcnQgeC55Lio7XG4iICsKLQkJImltcG9ydCBqYXZhLnV0aWwuVmVjdG9yO1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgRm9vIHtcbiIgKwotCQkiICBpbnQgZmllbGQ7XG4iICsKLQkJIiAgdm9pZCBiYXIoKSB7XG4iICsKLQkJIiAgfVxuIiArCi0JCSJ9IgotCSk7Ci0JY3JlYXRlRmlsZSgKLQkJIi9QL3gveS96L0kuamF2YSIsCi0JCSJwYWNrYWdlIHgueSx6O1xuIiArCi0JCSJwdWJsaWMgaW50ZXJmYWNlIEkge1xuIiArCi0JCSJ9IgotCSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZWFyRG93blN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JZGVsZXRlUHJvamVjdCgiUCIpOwotCXN1cGVyLnRlYXJEb3duU3VpdGUoKTsKLX0KLS8qCi0gKiBFbnN1cmUgdGhhdCBjaGFuZ2luZyB0aGUgY2xhc3NwYXRoIGluIHRoZSBtaWRkbGUgb2YgcmVpbmRleGluZwotICogYSBwcm9qZWN0IGNhdXNlcyBhbm90aGVyIHJlcXVlc3QgdG8gcmVpbmRleC4KLSAqLwotcHVibGljIHZvaWQgdGVzdENoYW5nZUNsYXNzcGF0aCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBUaW1lT3V0RXhjZXB0aW9uIHsKLQlJbmRleE1hbmFnZXIgaW5kZXhNYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5kZXhNYW5hZ2VyKCk7Ci0JV2FpdGluZ0pvYiBqb2IgPSBuZXcgV2FpdGluZ0pvYigpOwotCXRyeSB7Ci0JCS8vIHNldHVwOiBzdXNwZW5kIGluZGV4aW5nIGFuZCBjcmVhdGUgYSBwcm9qZWN0IChwcmo9c3JjKSB3aXRoIG9uZSBjdQotCQlpbmRleE1hbmFnZXIuZGlzYWJsZSgpOwotCQlKYXZhQ29yZS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQljcmVhdGVKYXZhUHJvamVjdCgiUDEiKTsKLQkJCQljcmVhdGVGaWxlKAotCQkJCQkiL1AxL1guamF2YSIsCi0JCQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCQkJIn0iCi0JCQkJKTsKLQkJCX0KLQkJfSwgbnVsbCk7Ci0JCQotCQkvLyBhZGQgd2FpdGluZyBqb2IgYW5kIHdhaXQgZm9yIGl0IHRvIGJlIGV4ZWN1dGVkCi0JCWluZGV4TWFuYWdlci5yZXF1ZXN0KGpvYik7Ci0JCWluZGV4TWFuYWdlci5lbmFibGUoKTsKLQkJam9iLnN0YXJ0aW5nU2VtLmFjcXVpcmUoMzAwMDApOyAvLyB3YWl0IGZvciBqb2IgdG8gc3RhcnQgKHdhaXQgMzBzIG1heCkKLQkJCi0JCS8vIHJlbW92ZSBzb3VyY2UgZm9sZGVyIGZyb20gY2xhc3NwYXRoCi0JCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QoIlAxIik7Ci0JCXByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKAotCQkJbmV3IElDbGFzc3BhdGhFbnRyeVswXSwgCi0JCQludWxsKTsKLQkJCQotCQkvLyByZXN1bWUgd2FpdGluZyBqb2IKLQkJam9iLnJ1bm5pbmdTZW0ucmVsZWFzZSgpOwotCQkKLQkJYXNzZXJ0QWxsVHlwZXMoCi0JCQkiVW5leHBlY3RlZCBhbGwgdHlwZXMgYWZ0ZXIgcmVtb3Zpbmcgc291cmNlIGZvbGRlciIsCi0JCQlwcm9qZWN0LAotCQkJIiIKLQkJKTsKLQl9IGZpbmFsbHkgewotCQlqb2IucnVubmluZ1NlbS5yZWxlYXNlKCk7Ci0JCWRlbGV0ZVByb2plY3QoIlAxIik7Ci0JCWluZGV4TWFuYWdlci5lbmFibGUoKTsKLQl9Ci19Ci0vKgotICogRW5zdXJlIHRoYXQgcGVyZm9ybWluZyBhIGNvbmN1cnJlbnQgam9iIHdoaWxlIGluZGV4aW5nIGEgamFyIGRvZXNuJ3QgdXNlIHRoZSBvbGQgaW5kZXguCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMzUzMDYgSW5kZXggdXBkYXRlIHJlcXVlc3QgY2FuIGJlIGluY29ycmVjdGx5IGhhbmRsZWQpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDb25jdXJyZW50Sm9iKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgVGltZU91dEV4Y2VwdGlvbiB7Ci0JSW5kZXhNYW5hZ2VyIGluZGV4TWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEluZGV4TWFuYWdlcigpOwotCVdhaXRpbmdKb2Igam9iID0gbmV3IFdhaXRpbmdKb2IoKTsKLQl0cnkgewotCQkvLyBzZXR1cDogc3VzcGVuZCBpbmRleGluZyBhbmQgY3JlYXRlIGEgcHJvamVjdCB3aXRoIG9uZSBlbXB0eSBqYXIgb24gaXRzIGNsYXNzcGF0aAotCQlpbmRleE1hbmFnZXIuZGlzYWJsZSgpOwotCQlKYXZhQ29yZS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQljcmVhdGVKYXZhUHJvamVjdCgiUDEiLCBuZXcgU3RyaW5nW10ge30sIG5ldyBTdHJpbmdbXSB7Ii9QMS9qY2xNaW4uamFyIn0sICJiaW4iKTsKLQkJCQljcmVhdGVGaWxlKCIvUDEvamNsTWluLmphciIsIEVNUFRZX0pBUik7Ci0JCQl9Ci0JCX0sIG51bGwpOwotCQkKLQkJLy8gYWRkIHdhaXRpbmcgam9iIGFuZCB3YWl0IGZvciBpdCB0byBiZSBleGVjdXRlZAotCQlpbmRleE1hbmFnZXIucmVxdWVzdChqb2IpOwotCQlpbmRleE1hbmFnZXIuZW5hYmxlKCk7Ci0JCWpvYi5zdGFydGluZ1NlbS5hY3F1aXJlKDMwMDAwKTsgLy8gd2FpdCBmb3Igam9iIHRvIHN0YXJ0ICh3YWl0IDMwcyBtYXgpCi0JCQkJCi0JCWZpbmFsIElKYXZhUHJvamVjdCBwcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QoIlAxIik7Ci0JCQkKLQkJLy8gc3RhcnQgY29uY3VycmVudCBqb2IKLQkJZmluYWwgYm9vbGVhbltdIHN1Y2Nlc3MgPSBuZXcgYm9vbGVhblsxXTsKLQkJZmluYWwgV2FpdFVudGlsUmVhZHlNb25pdG9yIG1vbml0b3IgPSBuZXcgV2FpdFVudGlsUmVhZHlNb25pdG9yKCk7Ci0JCVRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCWFzc2VydEFsbFR5cGVzKAotCQkJCQkJIlVuZXhwZWN0ZWQgYWxsIHR5cGVzIiwKLQkJCQkJCXByb2plY3QsCi0JCQkJCQlXQUlUX1VOVElMX1JFQURZX1RPX1NFQVJDSCwKLQkJCQkJCW1vbml0b3IsCi0JCQkJCQkiamF2YS5sYW5nLkNsYXNzXG4iICsgCi0JCQkJCQkiamF2YS5sYW5nLkNsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uXG4iICsgCi0JCQkJCQkiamF2YS5sYW5nLkVycm9yXG4iICsgCi0JCQkJCQkiamF2YS5sYW5nLkV4Y2VwdGlvblxuIiArIAotCQkJCQkJImphdmEubGFuZy5JbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uXG4iICsgCi0JCQkJCQkiamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uXG4iICsgCi0JCQkJCQkiamF2YS5sYW5nLk9iamVjdFxuIiArIAotCQkJCQkJImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uXG4iICsgCi0JCQkJCQkiamF2YS5sYW5nLlN0cmluZ1xuIiArIAotCQkJCQkJImphdmEubGFuZy5UaHJvd2FibGUiCi0JCQkJCSk7Ci0JCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlzdWNjZXNzWzBdID0gdHJ1ZTsKLQkJCX0KLQkJfTsKLQkJdGhyZWFkLnNldERhZW1vbih0cnVlKTsKLQkJdGhyZWFkLnN0YXJ0KCk7Ci0JCQkKLQkJLy8gd2FpdCBmb3IgY29uY3VycmVudCBqb2IgdG8gc3RhcnQKLQkJbW9uaXRvci5zZW0uYWNxdWlyZSgzMDAwMCk7IC8vIHdhaXQgMzBzIG1heAotCi0JCS8vIGNoYW5nZSBqYXIgY29udGVudHMKLQkJZ2V0RmlsZSgiL1AxL2pjbE1pbi5qYXIiKS5zZXRDb250ZW50cyhuZXcgRmlsZUlucHV0U3RyZWFtKGdldEV4dGVybmFsSkNMUGF0aFN0cmluZygpKSwgSVJlc291cmNlLk5PTkUsIG51bGwpOwotCQkJCi0JCS8vIHJlc3VtZSB3YWl0aW5nIGpvYgotCQlqb2IucnVubmluZ1NlbS5yZWxlYXNlKCk7Ci0JCQotCQkvLyB3YWl0IGZvciBjb25jdXJyZW50IGpvYiB0byBmaW5pc2gKLQkJdGhyZWFkLmpvaW4oMTAwMDApOyAvLyAxMHMgbWF4Ci0JCQotCQlhc3NlcnRUcnVlKCJGYWlsZWQgdG8gZ2V0IGFsbCB0eXBlcyIsIHN1Y2Nlc3NbMF0pOwotCQkJCQotCX0gZmluYWxseSB7Ci0JCWpvYi5ydW5uaW5nU2VtLnJlbGVhc2UoKTsKLQkJZGVsZXRlUHJvamVjdCgiUDEiKTsKLQkJaW5kZXhNYW5hZ2VyLmVuYWJsZSgpOwotCX0KLX0KLS8qCi0gKiBFbnN1cmVzIHRoYXQgcGFzc2luZyBhIG51bGwgcHJvZ3Jlc3MgbW9uaXRvciB3aXRoIGEgQ0FOQ0VMX0lGX05PVF9SRUFEWV9UT19TRUFSQ0gKLSAqIHdhaXRpbmcgcG9saWN5IGRvZXNuJ3QgdGhyb3cgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBidXQgYW4gT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24uCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMzM1NzEgU2VhcmNoRW5naW5lLnNlYXJjaEFsbFR5cGVOYW1lczogTlBFIHdoZW4gcGFzc2luZyBudWxsIGFzIHByb2dyZXNzIG1vbml0b3IpCi0gKi8KLSBwdWJsaWMgdm9pZCB0ZXN0TnVsbFByb2dyZXNzTW9uaXRvcigpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBUaW1lT3V0RXhjZXB0aW9uIHsKLQlJbmRleE1hbmFnZXIgaW5kZXhNYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5kZXhNYW5hZ2VyKCk7Ci0JV2FpdGluZ0pvYiBqb2IgPSBuZXcgV2FpdGluZ0pvYigpOwotIAl0cnkgewotIAkJLy8gYWRkIHdhaXRpbmcgam9iIGFuZCB3YWl0IGZvciBpdCB0byBiZSBleGVjdXRlZAotCQlpbmRleE1hbmFnZXIuZGlzYWJsZSgpOwotCQlpbmRleE1hbmFnZXIucmVxdWVzdChqb2IpOwotCQlpbmRleE1hbmFnZXIuZW5hYmxlKCk7Ci0JCWpvYi5zdGFydGluZ1NlbS5hY3F1aXJlKDMwMDAwKTsgLy8gd2FpdCBmb3Igam9iIHRvIHN0YXJ0ICh3YWl0IDMwcyBtYXgpCi0JCQotCQkvLyBxdWVyeSBhbGwgdHlwZSBuYW1lcyB3aXRoIGEgbnVsbCBwcm9ncmVzcyBtb25pdG9yCi0JCWJvb2xlYW4gb3BlcmF0aW9uQ2FuY2VsZWQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWFzc2VydEFsbFR5cGVzKAotCQkJCUNBTkNFTF9JRl9OT1RfUkVBRFlfVE9fU0VBUkNILAotCQkJCW51bGwsIC8vIG51bGwgcHJvZ3Jlc3MgbW9uaXRvcgotCQkJCSJTaG91bGQgbm90IGdldCBhbnkgdHlwZSIKLQkJCSk7Ci0JCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCW9wZXJhdGlvbkNhbmNlbGVkID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJTaG91bGQgdGhyb3cgYW4gT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24iLCBvcGVyYXRpb25DYW5jZWxlZCk7Ci0gCX0gZmluYWxseSB7Ci0gCQlqb2IucnVubmluZ1NlbS5yZWxlYXNlKCk7Ci0gCX0KLSB9Ci0vKgotICogRW5zdXJlIHRoYXQgcmVtb3ZpbmcgdGhlIG91dGVyIGZvbGRlciBmcm9tIHRoZSBjbGFzc3BhdGggZG9lc24ndCByZW1vdmUgY3VzIGluIGlubmVyIGZvbGRlcgotICogZnJvbSBpbmRleAotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDMyNjA3IFJlbW92aW5nIG91dGVyIGZvbGRlciByZW1vdmVzIG5lc3RlZCBmb2xkZXIncyBjdXMgZnJvbSBpbmRleCkKLSAqLwotcHVibGljIHZvaWQgdGVzdFJlbW92ZU91dGVyRm9sZGVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCS8vIHNldHVwOiBvbmUgY3UgaW4gYSBuZXN0ZWQgc291cmNlIGZvbGRlcgotCQlKYXZhQ29yZS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IGNyZWF0ZUphdmFQcm9qZWN0KCJQMSIpOwotCQkJCXByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKAotCQkJCQljcmVhdGVDbGFzc3BhdGgobmV3IFN0cmluZ1tdIHsiL1AxL3NyYzEiLCAic3JjMi8iLCAiL1AxL3NyYzEvc3JjMiIsICIifSksIAotCQkJCQluZXcgUGF0aCgiL1AxL2JpbiIpLAotCQkJCQludWxsKTsKLQkJCQljcmVhdGVGb2xkZXIoIi9QMS9zcmMxL3NyYzIiKTsKLQkJCQljcmVhdGVGaWxlKAotCQkJCQkiL1AxL3NyYzEvc3JjMi9YLmphdmEiLAotCQkJCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkJCSJ9IgotCQkJCSk7Ci0JCQl9Ci0JCX0sIG51bGwpOwotCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IGdldEphdmFQcm9qZWN0KCJQMSIpOwotCQlhc3NlcnRBbGxUeXBlcygKLQkJCSJVbmV4cGVjdGVkIGFsbCB0eXBlcyBhZnRlciBzZXR1cCIsCi0JCQlwcm9qZWN0LAotCQkJIlgiCi0JCSk7Ci0JCQotCQkvLyByZW1vdmUgb3V0ZXIgZm9sZGVyIGZyb20gY2xhc3NwYXRoCi0JCXByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKAotCQkJY3JlYXRlQ2xhc3NwYXRoKG5ldyBTdHJpbmdbXSB7Ii9QMS9zcmMxL3NyYzIiLCAiIn0pLCAKLQkJCW51bGwpOwotCQlhc3NlcnRBbGxUeXBlcygKLQkJCSJVbmV4cGVjdGVkIGFsbCB0eXBlcyBhZnRlciByZW1vdmluZyBvdXRlciBmb2xkZXIiLAotCQkJcHJvamVjdCwKLQkJCSJYIgotCQkpOwotCQkKLQl9IGZpbmFsbHkgewotCQlkZWxldGVQcm9qZWN0KCJQMSIpOwotCX0KLX0KLS8qKgotICogVGVzdCBwYXR0ZXJuIGNyZWF0aW9uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTZWFyY2hQYXR0ZXJuQ3JlYXRpb24wMSgpIHsKLQotCUlTZWFyY2hQYXR0ZXJuIHNlYXJjaFBhdHRlcm4gPSBTZWFyY2hFbmdpbmUuY3JlYXRlU2VhcmNoUGF0dGVybigKLQkJCSJtYWluKCopIiwgCi0JCQlJSmF2YVNlYXJjaENvbnN0YW50cy5NRVRIT0QsCi0JCQlJSmF2YVNlYXJjaENvbnN0YW50cy5SRUZFUkVOQ0VTLAotCQkJQ0FTRV9TRU5TSVRJVkUpOwotCQotCWFzc2VydFBhdHRlcm4oCi0JCSJNZXRob2RSZWZlcmVuY2VQYXR0ZXJuOiBtYWluKCopLCBwYXR0ZXJuIG1hdGNoLCBjYXNlIHNlbnNpdGl2ZSIsCi0JCXNlYXJjaFBhdHRlcm4pOwotfQotCi0vKioKLSAqIFRlc3QgcGF0dGVybiBjcmVhdGlvbgotICovCi1wdWJsaWMgdm9pZCB0ZXN0U2VhcmNoUGF0dGVybkNyZWF0aW9uMDIoKSB7Ci0KLQlJU2VhcmNoUGF0dGVybiBzZWFyY2hQYXR0ZXJuID0gU2VhcmNoRW5naW5lLmNyZWF0ZVNlYXJjaFBhdHRlcm4oCi0JCQkibWFpbigqKSB2b2lkIiwgCi0JCQlJSmF2YVNlYXJjaENvbnN0YW50cy5NRVRIT0QsCi0JCQlJSmF2YVNlYXJjaENvbnN0YW50cy5SRUZFUkVOQ0VTLAotCQkJQ0FTRV9TRU5TSVRJVkUpOwotCQotCWFzc2VydFBhdHRlcm4oCi0JCSJNZXRob2RSZWZlcmVuY2VQYXR0ZXJuOiBtYWluKCopIC0tPiB2b2lkLCBwYXR0ZXJuIG1hdGNoLCBjYXNlIHNlbnNpdGl2ZSIsCi0JCXNlYXJjaFBhdHRlcm4pOwotfQotCi0vKioKLSAqIFRlc3QgcGF0dGVybiBjcmVhdGlvbgotICovCi1wdWJsaWMgdm9pZCB0ZXN0U2VhcmNoUGF0dGVybkNyZWF0aW9uMDMoKSB7Ci0KLQlJU2VhcmNoUGF0dGVybiBzZWFyY2hQYXR0ZXJuID0gU2VhcmNoRW5naW5lLmNyZWF0ZVNlYXJjaFBhdHRlcm4oCi0JCQkibWFpbihTdHJpbmcqKSB2b2lkIiwgCi0JCQlJSmF2YVNlYXJjaENvbnN0YW50cy5NRVRIT0QsCi0JCQlJSmF2YVNlYXJjaENvbnN0YW50cy5SRUZFUkVOQ0VTLAotCQkJQ0FTRV9TRU5TSVRJVkUpOwotCQotCWFzc2VydFBhdHRlcm4oCi0JCSJNZXRob2RSZWZlcmVuY2VQYXR0ZXJuOiBtYWluKFN0cmluZyopIC0tPiB2b2lkLCBwYXR0ZXJuIG1hdGNoLCBjYXNlIHNlbnNpdGl2ZSIsCi0JCXNlYXJjaFBhdHRlcm4pOwotfQotCi0vKioKLSAqIFRlc3QgcGF0dGVybiBjcmVhdGlvbgotICovCi1wdWJsaWMgdm9pZCB0ZXN0U2VhcmNoUGF0dGVybkNyZWF0aW9uMDQoKSB7Ci0KLQlJU2VhcmNoUGF0dGVybiBzZWFyY2hQYXR0ZXJuID0gU2VhcmNoRW5naW5lLmNyZWF0ZVNlYXJjaFBhdHRlcm4oCi0JCQkibWFpbigqW10pIiwgCi0JCQlJSmF2YVNlYXJjaENvbnN0YW50cy5NRVRIT0QsCi0JCQlJSmF2YVNlYXJjaENvbnN0YW50cy5SRUZFUkVOQ0VTLAotCQkJQ0FTRV9TRU5TSVRJVkUpOwotCQotCWFzc2VydFBhdHRlcm4oCi0JCSJNZXRob2RSZWZlcmVuY2VQYXR0ZXJuOiBtYWluKCpbXSksIHBhdHRlcm4gbWF0Y2gsIGNhc2Ugc2Vuc2l0aXZlIiwKLQkJc2VhcmNoUGF0dGVybik7Ci19Ci0KLS8qKgotICogVGVzdCBwYXR0ZXJuIGNyZWF0aW9uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTZWFyY2hQYXR0ZXJuQ3JlYXRpb24wNSgpIHsKLQotCUlTZWFyY2hQYXR0ZXJuIHNlYXJjaFBhdHRlcm4gPSBTZWFyY2hFbmdpbmUuY3JlYXRlU2VhcmNoUGF0dGVybigKLQkJCSJqYXZhLmxhbmcuKi5tYWluICIsIAotCQkJSUphdmFTZWFyY2hDb25zdGFudHMuTUVUSE9ELAotCQkJSUphdmFTZWFyY2hDb25zdGFudHMuUkVGRVJFTkNFUywKLQkJCUNBU0VfU0VOU0lUSVZFKTsKLQkKLQlhc3NlcnRQYXR0ZXJuKAotCQkiTWV0aG9kUmVmZXJlbmNlUGF0dGVybjogamF2YS5sYW5nLioubWFpbiguLi4pLCBwYXR0ZXJuIG1hdGNoLCBjYXNlIHNlbnNpdGl2ZSIsCi0JCXNlYXJjaFBhdHRlcm4pOwotfQotCi0vKioKLSAqIFRlc3QgcGF0dGVybiBjcmVhdGlvbgotICovCi1wdWJsaWMgdm9pZCB0ZXN0U2VhcmNoUGF0dGVybkNyZWF0aW9uMDYoKSB7Ci0KLQlJU2VhcmNoUGF0dGVybiBzZWFyY2hQYXR0ZXJuID0gU2VhcmNoRW5naW5lLmNyZWF0ZVNlYXJjaFBhdHRlcm4oCi0JCQkiamF2YS5sYW5nLiogIiwgCi0JCQlJSmF2YVNlYXJjaENvbnN0YW50cy5DT05TVFJVQ1RPUiwKLQkJCUlKYXZhU2VhcmNoQ29uc3RhbnRzLlJFRkVSRU5DRVMsCi0JCQlDQVNFX1NFTlNJVElWRSk7Ci0JCi0JYXNzZXJ0UGF0dGVybigKLQkJIkNvbnN0cnVjdG9yUmVmZXJlbmNlUGF0dGVybjogamF2YS5sYW5nLiooLi4uKSwgcGF0dGVybiBtYXRjaCwgY2FzZSBzZW5zaXRpdmUiLAotCQlzZWFyY2hQYXR0ZXJuKTsKLX0KLQotLyoqCi0gKiBUZXN0IHBhdHRlcm4gY3JlYXRpb24KLSAqLwotcHVibGljIHZvaWQgdGVzdFNlYXJjaFBhdHRlcm5DcmVhdGlvbjA3KCkgewotCi0JSVNlYXJjaFBhdHRlcm4gc2VhcmNoUGF0dGVybiA9IFNlYXJjaEVuZ2luZS5jcmVhdGVTZWFyY2hQYXR0ZXJuKAotCQkJIlgoKiwqKSIsIAotCQkJSUphdmFTZWFyY2hDb25zdGFudHMuQ09OU1RSVUNUT1IsCi0JCQlJSmF2YVNlYXJjaENvbnN0YW50cy5SRUZFUkVOQ0VTLAotCQkJQ0FTRV9TRU5TSVRJVkUpOwotCQotCWFzc2VydFBhdHRlcm4oCi0JCSJDb25zdHJ1Y3RvclJlZmVyZW5jZVBhdHRlcm46IFgoKiwgKiksIHBhdHRlcm4gbWF0Y2gsIGNhc2Ugc2Vuc2l0aXZlIiwKLQkJc2VhcmNoUGF0dGVybik7Ci19Ci0KLS8qKgotICogVGVzdCBwYXR0ZXJuIGNyZWF0aW9uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTZWFyY2hQYXR0ZXJuQ3JlYXRpb24wOCgpIHsKLQotCUlTZWFyY2hQYXR0ZXJuIHNlYXJjaFBhdHRlcm4gPSBTZWFyY2hFbmdpbmUuY3JlYXRlU2VhcmNoUGF0dGVybigKLQkJCSJtYWluKFN0cmluZyosKikgdm9pZCIsIAotCQkJSUphdmFTZWFyY2hDb25zdGFudHMuTUVUSE9ELAotCQkJSUphdmFTZWFyY2hDb25zdGFudHMuUkVGRVJFTkNFUywKLQkJCUNBU0VfU0VOU0lUSVZFKTsKLQkKLQlhc3NlcnRQYXR0ZXJuKAotCQkiTWV0aG9kUmVmZXJlbmNlUGF0dGVybjogbWFpbihTdHJpbmcqLCAqKSAtLT4gdm9pZCwgcGF0dGVybiBtYXRjaCwgY2FzZSBzZW5zaXRpdmUiLAotCQlzZWFyY2hQYXR0ZXJuKTsKLX0KLQotLyoqCi0gKiBUZXN0IHBhdHRlcm4gY3JlYXRpb24KLSAqLwotcHVibGljIHZvaWQgdGVzdFNlYXJjaFBhdHRlcm5DcmVhdGlvbjA5KCkgewotCi0JU2VhcmNoUGF0dGVybiBzZWFyY2hQYXR0ZXJuID0gKFNlYXJjaFBhdHRlcm4pU2VhcmNoRW5naW5lLmNyZWF0ZVNlYXJjaFBhdHRlcm4oCi0JCQkiZm9vKihYLCBpbnQsIGludCwgWCwgaW50KSIsIAotCQkJSUphdmFTZWFyY2hDb25zdGFudHMuTUVUSE9ELAotCQkJSUphdmFTZWFyY2hDb25zdGFudHMuREVDTEFSQVRJT05TLAotCQkJQ0FTRV9TRU5TSVRJVkUpOwotCQotCWFzc2VydEVxdWFscygKLQkJIm1ldGhvZERlY2wvZm9vIiwKLQkJc2VhcmNoUGF0dGVybiA9PSBudWxsID8gbnVsbCA6IG5ldyBTdHJpbmcoc2VhcmNoUGF0dGVybi5pbmRleEVudHJ5UHJlZml4KCkpKTsKLX0KLQotLyoqCi0gKiBUZXN0IHBhdHRlcm4gY3JlYXRpb24KLSAqLwotcHVibGljIHZvaWQgdGVzdFNlYXJjaFBhdHRlcm5DcmVhdGlvbjEwKCkgewotCi0JSVNlYXJjaFBhdHRlcm4gc2VhcmNoUGF0dGVybiA9IFNlYXJjaEVuZ2luZS5jcmVhdGVTZWFyY2hQYXR0ZXJuKAotCQkJIngueS56LkJhci5maWVsZCBGb28iLCAKLQkJCUlKYXZhU2VhcmNoQ29uc3RhbnRzLkZJRUxELAotCQkJSUphdmFTZWFyY2hDb25zdGFudHMuREVDTEFSQVRJT05TLAotCQkJQ0FTRV9TRU5TSVRJVkUpOwotCQotCWFzc2VydFBhdHRlcm4oCi0JCSJGaWVsZERlY2xhcmF0aW9uUGF0dGVybjogeC55LnouQmFyLmZpZWxkIC0tPiBGb28sIGV4YWN0IG1hdGNoLCBjYXNlIHNlbnNpdGl2ZSIsCi0JCXNlYXJjaFBhdHRlcm4pOwotfQotCi0vKioKLSAqIFRlc3QgcGF0dGVybiBjcmVhdGlvbgotICovCi1wdWJsaWMgdm9pZCB0ZXN0U2VhcmNoUGF0dGVybkNyZWF0aW9uMTEoKSB7Ci0KLQlTZWFyY2hQYXR0ZXJuIHNlYXJjaFBhdHRlcm4gPSAoU2VhcmNoUGF0dGVybilTZWFyY2hFbmdpbmUuY3JlYXRlU2VhcmNoUGF0dGVybigKLQkJCSJ4Lnkuei5CYXIuZmllbGQgRm9vIiwgCi0JCQlJSmF2YVNlYXJjaENvbnN0YW50cy5GSUVMRCwKLQkJCUlKYXZhU2VhcmNoQ29uc3RhbnRzLkRFQ0xBUkFUSU9OUywKLQkJCUNBU0VfU0VOU0lUSVZFKTsKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJmaWVsZERlY2wvZmllbGQiLAotCQlzZWFyY2hQYXR0ZXJuID09IG51bGwgPyBudWxsIDogbmV3IFN0cmluZyhzZWFyY2hQYXR0ZXJuLmluZGV4RW50cnlQcmVmaXgoKSkpOwotfQotCi0vKioKLSAqIFRlc3QgcGF0dGVybiBjcmVhdGlvbgotICovCi1wdWJsaWMgdm9pZCB0ZXN0U2VhcmNoUGF0dGVybkNyZWF0aW9uMTIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUZpZWxkIGZpZWxkID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC94L3kvei9Gb28uamF2YSIpLmdldFR5cGUoIkZvbyIpLmdldEZpZWxkKCJmaWVsZCIpOwotCUlTZWFyY2hQYXR0ZXJuIHNlYXJjaFBhdHRlcm4gPSBTZWFyY2hFbmdpbmUuY3JlYXRlU2VhcmNoUGF0dGVybigKLQkJCWZpZWxkLCAKLQkJCUlKYXZhU2VhcmNoQ29uc3RhbnRzLlJFRkVSRU5DRVMpOwotCQotCWFzc2VydFBhdHRlcm4oCi0JCSJGaWVsZFJlZmVyZW5jZVBhdHRlcm46IHgueS56LkZvby5maWVsZCAtLT4gaW50LCBleGFjdCBtYXRjaCwgY2FzZSBzZW5zaXRpdmUiLAotCQlzZWFyY2hQYXR0ZXJuKTsKLX0KLQotLyoqCi0gKiBUZXN0IHBhdHRlcm4gY3JlYXRpb24KLSAqLwotcHVibGljIHZvaWQgdGVzdFNlYXJjaFBhdHRlcm5DcmVhdGlvbjEzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUlGaWVsZCBmaWVsZCA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1AveC95L3ovRm9vLmphdmEiKS5nZXRUeXBlKCJGb28iKS5nZXRGaWVsZCgiZmllbGQiKTsKLQlJU2VhcmNoUGF0dGVybiBzZWFyY2hQYXR0ZXJuID0gU2VhcmNoRW5naW5lLmNyZWF0ZVNlYXJjaFBhdHRlcm4oCi0JCQlmaWVsZCwgCi0JCQlJSmF2YVNlYXJjaENvbnN0YW50cy5ERUNMQVJBVElPTlMpOwotCQotCWFzc2VydFBhdHRlcm4oCi0JCSJGaWVsZERlY2xhcmF0aW9uUGF0dGVybjogeC55LnouRm9vLmZpZWxkIC0tPiBpbnQsIGV4YWN0IG1hdGNoLCBjYXNlIHNlbnNpdGl2ZSIsCi0JCXNlYXJjaFBhdHRlcm4pOwotfQotCi0vKioKLSAqIFRlc3QgcGF0dGVybiBjcmVhdGlvbgotICovCi1wdWJsaWMgdm9pZCB0ZXN0U2VhcmNoUGF0dGVybkNyZWF0aW9uMTQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUZpZWxkIGZpZWxkID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC94L3kvei9Gb28uamF2YSIpLmdldFR5cGUoIkZvbyIpLmdldEZpZWxkKCJmaWVsZCIpOwotCUlTZWFyY2hQYXR0ZXJuIHNlYXJjaFBhdHRlcm4gPSBTZWFyY2hFbmdpbmUuY3JlYXRlU2VhcmNoUGF0dGVybigKLQkJCWZpZWxkLCAKLQkJCUlKYXZhU2VhcmNoQ29uc3RhbnRzLkFMTF9PQ0NVUlJFTkNFUyk7Ci0JCi0JYXNzZXJ0UGF0dGVybigKLQkJIkZpZWxkRGVjbGFyYXRpb25QYXR0ZXJuOiB4Lnkuei5Gb28uZmllbGQgLS0+IGludCwgZXhhY3QgbWF0Y2gsIGNhc2Ugc2Vuc2l0aXZlXG4iICsKLQkJInwgRmllbGRSZWZlcmVuY2VQYXR0ZXJuOiB4Lnkuei5Gb28uZmllbGQgLS0+IGludCwgZXhhY3QgbWF0Y2gsIGNhc2Ugc2Vuc2l0aXZlIiwKLQkJc2VhcmNoUGF0dGVybik7Ci19Ci0KLS8qKgotICogVGVzdCBwYXR0ZXJuIGNyZWF0aW9uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTZWFyY2hQYXR0ZXJuQ3JlYXRpb24xNSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlJSW1wb3J0RGVjbGFyYXRpb24gaW1wb3J0RGVjbCA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1AveC95L3ovRm9vLmphdmEiKS5nZXRJbXBvcnQoIngueS4qIik7Ci0JSVNlYXJjaFBhdHRlcm4gc2VhcmNoUGF0dGVybiA9IFNlYXJjaEVuZ2luZS5jcmVhdGVTZWFyY2hQYXR0ZXJuKAotCQkJaW1wb3J0RGVjbCwgCi0JCQlJSmF2YVNlYXJjaENvbnN0YW50cy5SRUZFUkVOQ0VTKTsKLQkKLQlhc3NlcnRQYXR0ZXJuKAotCQkiUGFja2FnZVJlZmVyZW5jZVBhdHRlcm46IDx4Lnk+LCBleGFjdCBtYXRjaCwgY2FzZSBzZW5zaXRpdmUiLAotCQlzZWFyY2hQYXR0ZXJuKTsKLX0KLQotLyoqCi0gKiBUZXN0IHBhdHRlcm4gY3JlYXRpb24KLSAqLwotcHVibGljIHZvaWQgdGVzdFNlYXJjaFBhdHRlcm5DcmVhdGlvbjE2KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUlNZXRob2QgbWV0aG9kID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC94L3kvei9Gb28uamF2YSIpLmdldFR5cGUoIkZvbyIpLmdldE1ldGhvZCgiYmFyIiwgbmV3IFN0cmluZ1tdIHt9KTsKLQlJU2VhcmNoUGF0dGVybiBzZWFyY2hQYXR0ZXJuID0gU2VhcmNoRW5naW5lLmNyZWF0ZVNlYXJjaFBhdHRlcm4oCi0JCQltZXRob2QsIAotCQkJSUphdmFTZWFyY2hDb25zdGFudHMuREVDTEFSQVRJT05TKTsKLQkKLQlhc3NlcnRQYXR0ZXJuKAotCQkiTWV0aG9kRGVjbGFyYXRpb25QYXR0ZXJuOiB4Lnkuei5Gb28uYmFyKCkgLS0+IHZvaWQsIGV4YWN0IG1hdGNoLCBjYXNlIHNlbnNpdGl2ZSIsCi0JCXNlYXJjaFBhdHRlcm4pOwotfQotCi0vKioKLSAqIFRlc3QgcGF0dGVybiBjcmVhdGlvbgotICovCi1wdWJsaWMgdm9pZCB0ZXN0U2VhcmNoUGF0dGVybkNyZWF0aW9uMTcoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSU1ldGhvZCBtZXRob2QgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3gveS96L0Zvby5qYXZhIikuZ2V0VHlwZSgiRm9vIikuZ2V0TWV0aG9kKCJiYXIiLCBuZXcgU3RyaW5nW10ge30pOwotCUlTZWFyY2hQYXR0ZXJuIHNlYXJjaFBhdHRlcm4gPSBTZWFyY2hFbmdpbmUuY3JlYXRlU2VhcmNoUGF0dGVybigKLQkJCW1ldGhvZCwgCi0JCQlJSmF2YVNlYXJjaENvbnN0YW50cy5SRUZFUkVOQ0VTKTsKLQkKLQlhc3NlcnRQYXR0ZXJuKAotCQkiTWV0aG9kUmVmZXJlbmNlUGF0dGVybjogeC55LnouRm9vLmJhcigpIC0tPiB2b2lkLCBleGFjdCBtYXRjaCwgY2FzZSBzZW5zaXRpdmUiLAotCQlzZWFyY2hQYXR0ZXJuKTsKLX0KLQotLyoqCi0gKiBUZXN0IHBhdHRlcm4gY3JlYXRpb24KLSAqLwotcHVibGljIHZvaWQgdGVzdFNlYXJjaFBhdHRlcm5DcmVhdGlvbjE4KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUlNZXRob2QgbWV0aG9kID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC94L3kvei9Gb28uamF2YSIpLmdldFR5cGUoIkZvbyIpLmdldE1ldGhvZCgiYmFyIiwgbmV3IFN0cmluZ1tdIHt9KTsKLQlJU2VhcmNoUGF0dGVybiBzZWFyY2hQYXR0ZXJuID0gU2VhcmNoRW5naW5lLmNyZWF0ZVNlYXJjaFBhdHRlcm4oCi0JCQltZXRob2QsIAotCQkJSUphdmFTZWFyY2hDb25zdGFudHMuQUxMX09DQ1VSUkVOQ0VTKTsKLQkKLQlhc3NlcnRQYXR0ZXJuKAotCQkiTWV0aG9kRGVjbGFyYXRpb25QYXR0ZXJuOiB4Lnkuei5Gb28uYmFyKCkgLS0+IHZvaWQsIGV4YWN0IG1hdGNoLCBjYXNlIHNlbnNpdGl2ZVxuIiArCi0JCSJ8IE1ldGhvZFJlZmVyZW5jZVBhdHRlcm46IHgueS56LkZvby5iYXIoKSAtLT4gdm9pZCwgZXhhY3QgbWF0Y2gsIGNhc2Ugc2Vuc2l0aXZlIiwKLQkJc2VhcmNoUGF0dGVybik7Ci19Ci0KLS8qKgotICogVGVzdCBwYXR0ZXJuIGNyZWF0aW9uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTZWFyY2hQYXR0ZXJuQ3JlYXRpb24xOSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC94L3kvei9Gb28uamF2YSIpLmdldFR5cGUoIkZvbyIpOwotCUlTZWFyY2hQYXR0ZXJuIHNlYXJjaFBhdHRlcm4gPSBTZWFyY2hFbmdpbmUuY3JlYXRlU2VhcmNoUGF0dGVybigKLQkJCXR5cGUsIAotCQkJSUphdmFTZWFyY2hDb25zdGFudHMuREVDTEFSQVRJT05TKTsKLQkKLQlhc3NlcnRQYXR0ZXJuKAotCQkiVHlwZURlY2xhcmF0aW9uUGF0dGVybjogcGtnPHgueS56PiwgZW5jbG9zaW5nPD4sIHR5cGU8Rm9vPiwgZXhhY3QgbWF0Y2gsIGNhc2Ugc2Vuc2l0aXZlIiwKLQkJc2VhcmNoUGF0dGVybik7Ci19Ci0KLS8qKgotICogVGVzdCBwYXR0ZXJuIGNyZWF0aW9uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTZWFyY2hQYXR0ZXJuQ3JlYXRpb24yMCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC94L3kvei9Gb28uamF2YSIpLmdldFR5cGUoIkZvbyIpOwotCUlTZWFyY2hQYXR0ZXJuIHNlYXJjaFBhdHRlcm4gPSBTZWFyY2hFbmdpbmUuY3JlYXRlU2VhcmNoUGF0dGVybigKLQkJCXR5cGUsIAotCQkJSUphdmFTZWFyY2hDb25zdGFudHMuUkVGRVJFTkNFUyk7Ci0JCi0JYXNzZXJ0UGF0dGVybigKLQkJIlR5cGVSZWZlcmVuY2VQYXR0ZXJuOiBwa2c8eC55Lno+LCB0eXBlPEZvbz4sIGV4YWN0IG1hdGNoLCBjYXNlIHNlbnNpdGl2ZSIsCi0JCXNlYXJjaFBhdHRlcm4pOwotfQotCi0vKioKLSAqIFRlc3QgcGF0dGVybiBjcmVhdGlvbgotICovCi1wdWJsaWMgdm9pZCB0ZXN0U2VhcmNoUGF0dGVybkNyZWF0aW9uMjEoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1AveC95L3ovSS5qYXZhIikuZ2V0VHlwZSgiSSIpOwotCUlTZWFyY2hQYXR0ZXJuIHNlYXJjaFBhdHRlcm4gPSBTZWFyY2hFbmdpbmUuY3JlYXRlU2VhcmNoUGF0dGVybigKLQkJCXR5cGUsIAotCQkJSUphdmFTZWFyY2hDb25zdGFudHMuSU1QTEVNRU5UT1JTKTsKLQkKLQlhc3NlcnRQYXR0ZXJuKAotCQkiU3VwZXJJbnRlcmZhY2VSZWZlcmVuY2VQYXR0ZXJuOiA8ST4sIGV4YWN0IG1hdGNoLCBjYXNlIHNlbnNpdGl2ZSIsCi0JCXNlYXJjaFBhdHRlcm4pOwotfQotCi0vKioKLSAqIFRlc3QgcGF0dGVybiBjcmVhdGlvbgotICovCi1wdWJsaWMgdm9pZCB0ZXN0U2VhcmNoUGF0dGVybkNyZWF0aW9uMjIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1AveC95L3ovRm9vLmphdmEiKS5nZXRUeXBlKCJGb28iKTsKLQlJU2VhcmNoUGF0dGVybiBzZWFyY2hQYXR0ZXJuID0gU2VhcmNoRW5naW5lLmNyZWF0ZVNlYXJjaFBhdHRlcm4oCi0JCQl0eXBlLCAKLQkJCUlKYXZhU2VhcmNoQ29uc3RhbnRzLkFMTF9PQ0NVUlJFTkNFUyk7Ci0JCi0JYXNzZXJ0UGF0dGVybigKLQkJIlR5cGVEZWNsYXJhdGlvblBhdHRlcm46IHBrZzx4Lnkuej4sIGVuY2xvc2luZzw+LCB0eXBlPEZvbz4sIGV4YWN0IG1hdGNoLCBjYXNlIHNlbnNpdGl2ZVxuIiArCi0JCSJ8IFR5cGVSZWZlcmVuY2VQYXR0ZXJuOiBwa2c8eC55Lno+LCB0eXBlPEZvbz4sIGV4YWN0IG1hdGNoLCBjYXNlIHNlbnNpdGl2ZSIsCi0JCXNlYXJjaFBhdHRlcm4pOwotfQotCi0vKioKLSAqIFRlc3QgcGF0dGVybiBjcmVhdGlvbgotICovCi1wdWJsaWMgdm9pZCB0ZXN0U2VhcmNoUGF0dGVybkNyZWF0aW9uMjMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSVBhY2thZ2VEZWNsYXJhdGlvbiBwa2cgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3gveS96L0Zvby5qYXZhIikuZ2V0UGFja2FnZURlY2xhcmF0aW9uKCJ4LnkueiIpOwotCUlTZWFyY2hQYXR0ZXJuIHNlYXJjaFBhdHRlcm4gPSBTZWFyY2hFbmdpbmUuY3JlYXRlU2VhcmNoUGF0dGVybigKLQkJCXBrZywgCi0JCQlJSmF2YVNlYXJjaENvbnN0YW50cy5SRUZFUkVOQ0VTKTsKLQkKLQlhc3NlcnRQYXR0ZXJuKAotCQkiUGFja2FnZVJlZmVyZW5jZVBhdHRlcm46IDx4Lnkuej4sIGV4YWN0IG1hdGNoLCBjYXNlIHNlbnNpdGl2ZSIsCi0JCXNlYXJjaFBhdHRlcm4pOwotfQotCi0vKioKLSAqIFRlc3QgcGF0dGVybiBjcmVhdGlvbgotICovCi1wdWJsaWMgdm9pZCB0ZXN0U2VhcmNoUGF0dGVybkNyZWF0aW9uMjQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSVBhY2thZ2VGcmFnbWVudCBwa2cgPSBnZXRQYWNrYWdlKCIvUC94L3kveiIpOwotCUlTZWFyY2hQYXR0ZXJuIHNlYXJjaFBhdHRlcm4gPSBTZWFyY2hFbmdpbmUuY3JlYXRlU2VhcmNoUGF0dGVybigKLQkJCXBrZywgCi0JCQlJSmF2YVNlYXJjaENvbnN0YW50cy5SRUZFUkVOQ0VTKTsKLQkKLQlhc3NlcnRQYXR0ZXJuKAotCQkiUGFja2FnZVJlZmVyZW5jZVBhdHRlcm46IDx4Lnkuej4sIGV4YWN0IG1hdGNoLCBjYXNlIHNlbnNpdGl2ZSIsCi0JCXNlYXJjaFBhdHRlcm4pOwotfQotCi0vKioKLSAqIFRlc3QgcGF0dGVybiBjcmVhdGlvbgotICovCi1wdWJsaWMgdm9pZCB0ZXN0U2VhcmNoUGF0dGVybkNyZWF0aW9uMjUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUltcG9ydERlY2xhcmF0aW9uIGltcG9ydERlY2wgPSBnZXRDb21waWxhdGlvblVuaXQoIi9QL3gveS96L0Zvby5qYXZhIikuZ2V0SW1wb3J0KCJqYXZhLnV0aWwuVmVjdG9yIik7Ci0JSVNlYXJjaFBhdHRlcm4gc2VhcmNoUGF0dGVybiA9IFNlYXJjaEVuZ2luZS5jcmVhdGVTZWFyY2hQYXR0ZXJuKAotCQkJaW1wb3J0RGVjbCwgCi0JCQlJSmF2YVNlYXJjaENvbnN0YW50cy5SRUZFUkVOQ0VTKTsKLQkKLQlhc3NlcnRQYXR0ZXJuKAotCQkiVHlwZVJlZmVyZW5jZVBhdHRlcm46IHBrZzxqYXZhLnV0aWw+LCB0eXBlPFZlY3Rvcj4sIGV4YWN0IG1hdGNoLCBjYXNlIHNlbnNpdGl2ZSIsCi0JCXNlYXJjaFBhdHRlcm4pOwotfQotCi0vKioKLSAqIFRlc3QgcGF0dGVybiBjcmVhdGlvbgotICovCi1wdWJsaWMgdm9pZCB0ZXN0U2VhcmNoUGF0dGVybkNyZWF0aW9uMjYoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSVBhY2thZ2VGcmFnbWVudCBwa2cgPSBnZXRQYWNrYWdlKCIvUC94L3kveiIpOwotCUlTZWFyY2hQYXR0ZXJuIHNlYXJjaFBhdHRlcm4gPSBTZWFyY2hFbmdpbmUuY3JlYXRlU2VhcmNoUGF0dGVybigKLQkJCXBrZywgCi0JCQlJSmF2YVNlYXJjaENvbnN0YW50cy5ERUNMQVJBVElPTlMpOwotCQotCWFzc2VydFBhdHRlcm4oCi0JCSJQYWNrYWdlRGVjbGFyYXRpb25QYXR0ZXJuOiA8eC55Lno+LCBleGFjdCBtYXRjaCwgY2FzZSBzZW5zaXRpdmUiLAotCQlzZWFyY2hQYXR0ZXJuKTsKLX0KLQotLyoqCi0gKiBUZXN0IHBhdHRlcm4gY3JlYXRpb24KLSAqLwotcHVibGljIHZvaWQgdGVzdFNlYXJjaFBhdHRlcm5DcmVhdGlvbjI3KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUlQYWNrYWdlRGVjbGFyYXRpb24gcGtnID0gZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC94L3kvei9Gb28uamF2YSIpLmdldFBhY2thZ2VEZWNsYXJhdGlvbigieC55LnoiKTsKLQlJU2VhcmNoUGF0dGVybiBzZWFyY2hQYXR0ZXJuID0gU2VhcmNoRW5naW5lLmNyZWF0ZVNlYXJjaFBhdHRlcm4oCi0JCQlwa2csIAotCQkJSUphdmFTZWFyY2hDb25zdGFudHMuREVDTEFSQVRJT05TKTsKLQkKLQlhc3NlcnRQYXR0ZXJuKAotCQkiUGFja2FnZURlY2xhcmF0aW9uUGF0dGVybjogPHgueS56PiwgZXhhY3QgbWF0Y2gsIGNhc2Ugc2Vuc2l0aXZlIiwKLQkJc2VhcmNoUGF0dGVybik7Ci19Ci0KLS8qKgotICogVGVzdCBwYXR0ZXJuIGNyZWF0aW9uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTZWFyY2hQYXR0ZXJuQ3JlYXRpb24yOCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlJSW1wb3J0RGVjbGFyYXRpb24gaW1wb3J0RGVjbCA9IGdldENvbXBpbGF0aW9uVW5pdCgiL1AveC95L3ovRm9vLmphdmEiKS5nZXRJbXBvcnQoIngueS4qIik7Ci0JSVNlYXJjaFBhdHRlcm4gc2VhcmNoUGF0dGVybiA9IFNlYXJjaEVuZ2luZS5jcmVhdGVTZWFyY2hQYXR0ZXJuKAotCQkJaW1wb3J0RGVjbCwgCi0JCQlJSmF2YVNlYXJjaENvbnN0YW50cy5ERUNMQVJBVElPTlMpOwotCQotCWFzc2VydFBhdHRlcm4oCi0JCSJQYWNrYWdlRGVjbGFyYXRpb25QYXR0ZXJuOiA8eC55PiwgZXhhY3QgbWF0Y2gsIGNhc2Ugc2Vuc2l0aXZlIiwKLQkJc2VhcmNoUGF0dGVybik7Ci19Ci0KLS8qKgotICogVGVzdCBwYXR0ZXJuIGNyZWF0aW9uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTZWFyY2hQYXR0ZXJuQ3JlYXRpb24yOSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IGdldFBhY2thZ2UoIi9QL3gveS96Iik7Ci0JSVNlYXJjaFBhdHRlcm4gc2VhcmNoUGF0dGVybiA9IFNlYXJjaEVuZ2luZS5jcmVhdGVTZWFyY2hQYXR0ZXJuKAotCQkJcGtnLCAKLQkJCUlKYXZhU2VhcmNoQ29uc3RhbnRzLkFMTF9PQ0NVUlJFTkNFUyk7Ci0JCi0JYXNzZXJ0UGF0dGVybigKLQkJIlBhY2thZ2VEZWNsYXJhdGlvblBhdHRlcm46IDx4Lnkuej4sIGV4YWN0IG1hdGNoLCBjYXNlIHNlbnNpdGl2ZVxuIiArCi0JCSJ8IFBhY2thZ2VSZWZlcmVuY2VQYXR0ZXJuOiA8eC55Lno+LCBleGFjdCBtYXRjaCwgY2FzZSBzZW5zaXRpdmUiLAotCQlzZWFyY2hQYXR0ZXJuKTsKLX0KLQotCi19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvU2VtYXBob3JlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvU2VtYXBob3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ODNlY2IuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL1NlbWFwaG9yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbDsKLQotLyoqCi0gKiBBIHNlbWFwaG9yZSBpbXBsZW1lbnRhdGlvbiB3aXRoIHRpbWVvdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZW1hcGhvcmUgewotCQotCXByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOwotCXByaXZhdGUgaW50IHBlcm1pc3Npb25zID0gMDsKLQkKLQlwdWJsaWMgY2xhc3MgVGltZU91dEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JfQotCXB1YmxpYyBTZW1hcGhvcmUoKSB7Ci0JCXRoaXMobnVsbCwgMCk7Ci0JfQotCXB1YmxpYyBTZW1hcGhvcmUoaW50IGluaXRpYWxQZXJtaXNpb25zKSB7Ci0JCXRoaXMobnVsbCwgaW5pdGlhbFBlcm1pc2lvbnMpOwotCX0KLQlwdWJsaWMgU2VtYXBob3JlKFN0cmluZyBuYW1lLCBpbnQgaW5pdGlhbFBlcm1pc3Npb25zKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMucGVybWlzc2lvbnMgPSBpbml0aWFsUGVybWlzc2lvbnM7Ci0JfQotCXB1YmxpYyB2b2lkIGFjcXVpcmUoKSB7Ci0JCXRyeSB7Ci0JCQlhY3F1aXJlKExvbmcuTUFYX1ZBTFVFKTsKLQkJfSBjYXRjaCAoVGltZU91dEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhY3F1aXJlKGxvbmcgdGltZW91dCkgdGhyb3dzIFRpbWVPdXRFeGNlcHRpb24gewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCXdoaWxlICh0aGlzLnBlcm1pc3Npb25zIDw9IDAgJiYgdGltZW91dCA+IDApIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHRoaXMubmFtZSAhPSBudWxsKSBTeXN0ZW0ub3V0LnByaW50bG4oVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSArICIgLSB3YWl0aW5nIHRvIGFjcXVpcmU6ICIgKyB0aGlzLm5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHRpbWVvdXQgPT0gTG9uZy5NQVhfVkFMVUUpIHsKLQkJCQkJd2FpdCgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXdhaXQodGltZW91dCk7Ci0JCQkJfQotCQkJfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsKLQkJCX0KLQkJCXRpbWVvdXQgLT0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLQkJfQotCQlpZiAodGltZW91dCA8PSAwKSB7Ci0JCQl0aHJvdyBuZXcgVGltZU91dEV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMucGVybWlzc2lvbnMtLTsKLQkJaWYgKHRoaXMubmFtZSAhPSBudWxsKSBTeXN0ZW0ub3V0LnByaW50bG4oVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSArICIgLSBhY3F1aXJlZDogIiArIHRoaXMubmFtZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbGVhc2UoKSB7Ci0JCWlmICh0aGlzLm5hbWUgIT0gbnVsbCkgU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgKyAiIC0gcmVsZWFzaW5nOiAiICsgdGhpcy5uYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoKyt0aGlzLnBlcm1pc3Npb25zID4gMCkgbm90aWZ5QWxsKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9TaWduYXR1cmVUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL1NpZ25hdHVyZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOTdiN2EuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL1NpZ25hdHVyZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgU2lnbmF0dXJlVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEphdmFNb2RlbFRlc3RzIHsKLXB1YmxpYyBTaWduYXR1cmVUZXN0cyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgY3JlYXRpbmcgYW4gaW52YWxpZCB0eXBlIHNpZ25hdHVyZSB0aHJvd3MgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG9yIHJldHVybiB0aGUgZXhwZWN0ZWQgc2lnbmF0dXJlLgotICovCi1wcm90ZWN0ZWQgdm9pZCBhc3NlcnRJbnZhbGlkVHlwZVNpZ25hdHVyZShTdHJpbmcgdHlwZU5hbWUsIGJvb2xlYW4gaXNSZXNvbHZlZCwgU3RyaW5nIGV4cGVjdGVkKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlTdHJpbmcgYWN0dWFsOwotCXRyeSB7Ci0JCWFjdHVhbCA9IFNpZ25hdHVyZS5jcmVhdGVUeXBlU2lnbmF0dXJlKHR5cGVOYW1lLCBpc1Jlc29sdmVkKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlyZXR1cm47Ci0JfQotCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShTaWduYXR1cmVUZXN0cy5jbGFzcyk7Ci19Ci0vKioKLSAqIEBzZWUgU2lnbmF0dXJlCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBcnJheVNpZ25hdHVyZSgpIHsKLQlhc3NlcnRFcXVhbHMoCi0JCSJTaWduYXR1cmUjY3JlYXRlQXJyYXlTaWduYXR1cmUgbm90IGNvcnJlY3QiLCAKLQkJIltbW1tRU3RyaW5nIiwKLQkJU2lnbmF0dXJlLmNyZWF0ZUFycmF5U2lnbmF0dXJlKCJRU3RyaW5nIiwgNCkpOwotfQotLyoqCi0gKiBAc2VlIFNpZ25hdHVyZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTWV0aG9kU2lnbmF0dXJlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiU2lnbmF0dXJlI2NyZWF0ZU1ldGhvZFNpZ25hdHVyZSBpcyBub3QgY29ycmVjdCAxIiwgCi0JCSIoUVN0cmluZztRT2JqZWN0O0kpSSIsIAotCQlTaWduYXR1cmUuY3JlYXRlTWV0aG9kU2lnbmF0dXJlKG5ldyBTdHJpbmdbXSB7IlFTdHJpbmc7IiwgIlFPYmplY3Q7IiwgIkkifSwgIkkiKSk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiU2lnbmF0dXJlI2NyZWF0ZU1ldGhvZFNpZ25hdHVyZSBpcyBub3QgY29ycmVjdCAyIiwgCi0JCSIoKUxqYXZhLmxhbmcuU3RyaW5nOyIsIAotCQlTaWduYXR1cmUuY3JlYXRlTWV0aG9kU2lnbmF0dXJlKG5ldyBTdHJpbmdbXSB7fSwgIkxqYXZhLmxhbmcuU3RyaW5nOyIpKTsKLQotfQotLyoqCi0gKiBAc2VlIFNpZ25hdHVyZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlVHlwZVNpZ25hdHVyZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCWFzc2VydEVxdWFscygiU2lnbmF0dXJlI2NyZWF0ZVR5cGVTaWduYXR1cmUgaXMgbm90IGNvcnJlY3QxIiwgIkkiLCBTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZSgiaW50Ii50b0NoYXJBcnJheSgpLCBmYWxzZSkpOwotCWFzc2VydEVxdWFscygiU2lnbmF0dXJlI2NyZWF0ZVR5cGVTaWduYXR1cmUgaXMgbm90IGNvcnJlY3QyIiwgIkxqYXZhLmxhbmcuU3RyaW5nOyIsIFNpZ25hdHVyZS5jcmVhdGVUeXBlU2lnbmF0dXJlKCJqYXZhLmxhbmcuU3RyaW5nIi50b0NoYXJBcnJheSgpLCB0cnVlKSk7Ci0JYXNzZXJ0RXF1YWxzKCJTaWduYXR1cmUjY3JlYXRlVHlwZVNpZ25hdHVyZSBpcyBub3QgY29ycmVjdDMiLCAiUVN0cmluZzsiLCBTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZSgiU3RyaW5nIi50b0NoYXJBcnJheSgpLCBmYWxzZSkpOwotCWFzc2VydEVxdWFscygiU2lnbmF0dXJlI2NyZWF0ZVR5cGVTaWduYXR1cmUgaXMgbm90IGNvcnJlY3Q0IiwgIlFqYXZhLmxhbmcuU3RyaW5nOyIsIFNpZ25hdHVyZS5jcmVhdGVUeXBlU2lnbmF0dXJlKCJqYXZhLmxhbmcuU3RyaW5nIi50b0NoYXJBcnJheSgpLCBmYWxzZSkpOwotCWFzc2VydEVxdWFscygiU2lnbmF0dXJlI2NyZWF0ZVR5cGVTaWduYXR1cmUgaXMgbm90IGNvcnJlY3Q1IiwgIltJIiwgU2lnbmF0dXJlLmNyZWF0ZVR5cGVTaWduYXR1cmUoImludCBbXSIudG9DaGFyQXJyYXkoKSwgZmFsc2UpKTsKLQlhc3NlcnRFcXVhbHMoIlNpZ25hdHVyZSNjcmVhdGVUeXBlU2lnbmF0dXJlIGlzIG5vdCBjb3JyZWN0NiIsICJbUVN0cmluZzsiLCBTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZSgiU3RyaW5nIFtdIi50b0NoYXJBcnJheSgpLCBmYWxzZSkpOwotCWFzc2VydEVxdWFscygiU2lnbmF0dXJlI2NyZWF0ZVR5cGVTaWduYXR1cmUgaXMgbm90IGNvcnJlY3Q3IiwgIltMamF2YS51dGlsLlZlY3RvcjsiLCBTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZSgiamF2YS51dGlsLlZlY3RvciBbXSIudG9DaGFyQXJyYXkoKSwgdHJ1ZSkpOwotCWFzc2VydEVxdWFscygiU2lnbmF0dXJlI2NyZWF0ZVR5cGVTaWduYXR1cmUgaXMgbm90IGNvcnJlY3Q4IiwgIltbTGphdmEudXRpbC5WZWN0b3I7IiwgU2lnbmF0dXJlLmNyZWF0ZVR5cGVTaWduYXR1cmUoImphdmEgLlxuIHV0aWwgIC4gIFZlY3RvclsgIF1bXSIudG9DaGFyQXJyYXkoKSwgdHJ1ZSkpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgY3JlYXRpbmcgYW4gaW52YWxpZCB0eXBlIHNpZ25hdHVyZSB0aHJvd3MgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlSW52YWxpZFR5cGVTaWduYXR1cmUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlhc3NlcnRJbnZhbGlkVHlwZVNpZ25hdHVyZShudWxsLCBmYWxzZSwgbnVsbCk7Ci0JYXNzZXJ0SW52YWxpZFR5cGVTaWduYXR1cmUoIiIsIGZhbHNlLCAiIik7Ci0JYXNzZXJ0SW52YWxpZFR5cGVTaWduYXR1cmUoImludC5ZIiwgZmFsc2UsICJJIik7Ci0JYXNzZXJ0SW52YWxpZFR5cGVTaWduYXR1cmUoIlkgW10uWCIsIGZhbHNlLCAiW1FZOyIpOwotCWFzc2VydEludmFsaWRUeXBlU2lnbmF0dXJlKCJYW1tdIiwgdHJ1ZSwgIltbTFg7Iik7Ci19Ci0vKioKLSAqIEBzZWUgU2lnbmF0dXJlCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXRBcnJheUNvdW50KCkgewotCWFzc2VydFRydWUoIlNpZ25hdHVyZSNnZXRBcnJheUNvdW50IGlzIG5vdCBjb3JyZWN0IiwgU2lnbmF0dXJlLmdldEFycmF5Q291bnQoIltbW1tRU3RyaW5nOyIpID09IDQpOwotCXRyeSB7Ci0JCVNpZ25hdHVyZS5nZXRBcnJheUNvdW50KCIiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0JCXJldHVybjsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiU2lnbmF0dXJlI2dldEFycmF5Q291bnQgaXMgbm90IGNvcnJlY3QsIGV4Y2VwdGlvbiIsIGZhbHNlKTsKLX0KLS8qKgotICogQHNlZSBTaWduYXR1cmUKLSAqLwotcHVibGljIHZvaWQgdGVzdEdldEVsZW1lbnRUeXBlKCkgewotCWFzc2VydFRydWUoIlNpZ25hdHVyZSNnZXRFbGVtZW50VHlwZSBpcyBub3QgY29ycmVjdDEiLCBTaWduYXR1cmUuZ2V0RWxlbWVudFR5cGUoIltbW1tRU3RyaW5nOyIpLmVxdWFscygiUVN0cmluZzsiKSk7Ci0JYXNzZXJ0VHJ1ZSgiU2lnbmF0dXJlI2dldEVsZW1lbnRUeXBlIGlzIG5vdCBjb3JyZWN0MiIsIFNpZ25hdHVyZS5nZXRFbGVtZW50VHlwZSgiUVN0cmluZzsiKS5lcXVhbHMoIlFTdHJpbmc7IikpOwotCWFzc2VydFRydWUoIlNpZ25hdHVyZSNnZXRFbGVtZW50VHlwZSBpcyBub3QgY29ycmVjdDIiLCBTaWduYXR1cmUuZ2V0RWxlbWVudFR5cGUoIltbSSIpLmVxdWFscygiSSIpKTsKLQl0cnkgewotCQlTaWduYXR1cmUuZ2V0RWxlbWVudFR5cGUoIiIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLQkJcmV0dXJuOwotCX0KLQlhc3NlcnRUcnVlKCJTaWduYXR1cmUjZ2V0QXJyYXlDb3VudCBpcyBub3QgY29ycmVjdCwgZXhjZXB0aW9uIiwgZmFsc2UpOwotfQotLyoqCi0gKiBAc2VlIFNpZ25hdHVyZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0R2V0UGFyYW1ldGVyQ291bnQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlTdHJpbmcgbWV0aG9kU2lnID0gIihRU3RyaW5nO1FPYmplY3Q7SSlJIjsKLQlhc3NlcnRUcnVlKCJTaWduYXR1cmUjZ2V0UGFyYW1ldGVyQ291bnQgaXMgbm90IGNvcnJlY3QxIiwgU2lnbmF0dXJlLmdldFBhcmFtZXRlckNvdW50KG1ldGhvZFNpZykgPT0gMyk7Ci0JdHJ5IHsKLQkJU2lnbmF0dXJlLmdldFBhcmFtZXRlckNvdW50KCIiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0JCXJldHVybjsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiU2lnbmF0dXJlI2dldFBhcmFtZXRlckNvdW50IGlzIG5vdCBjb3JyZWN0OiBleGNlcHRpb24iLCBmYWxzZSk7Ci19Ci0vKioKLSAqIEBzZWUgU2lnbmF0dXJlCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXRQYXJhbWV0ZXJUeXBlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCVN0cmluZyBtZXRob2RTaWcgPSAiKFFTdHJpbmc7UU9iamVjdDtJKUkiOwotCVN0cmluZ1tdIHR5cGVzPSBTaWduYXR1cmUuZ2V0UGFyYW1ldGVyVHlwZXMobWV0aG9kU2lnKTsKLQlhc3NlcnRUcnVlKCJTaWduYXR1cmUjZ2V0UGFyYW1ldGVyVHlwZXMgaXMgbm90IGNvcnJlY3QxIiwgdHlwZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIlNpZ25hdHVyZSNnZXRQYXJhbWV0ZXJUeXBlcyBpcyBub3QgY29ycmVjdDIiLCB0eXBlc1sxXS5lcXVhbHMoIlFPYmplY3Q7IikpOwotCXRyeSB7Ci0JCVNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJUeXBlcygiIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgewotCQlyZXR1cm47Ci0JfQotCWFzc2VydFRydWUoIlNpZ25hdHVyZSNnZXRQYXJhbWV0ZXJUeXBlcyBpcyBub3QgY29ycmVjdDogZXhjZXB0aW9uIiwgZmFsc2UpOwotfQotLyoqCi0gKiBAc2VlIFNpZ25hdHVyZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0R2V0UXVhbGlmaWVyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JYXNzZXJ0VHJ1ZSgiU2lnbmF0dXJlI2dldFF1YWxpZmllciBpcyBub3QgY29ycmVjdDEiLCBTaWduYXR1cmUuZ2V0UXVhbGlmaWVyKCJqYXZhLmxhbmcuT2JqZWN0IikuZXF1YWxzKCJqYXZhLmxhbmciKSk7Ci0JYXNzZXJ0VHJ1ZSgiU2lnbmF0dXJlI2dldFF1YWxpZmllciBpcyBub3QgY29ycmVjdDIiLCAgU2lnbmF0dXJlLmdldFF1YWxpZmllcigiIikuZXF1YWxzKCIiKSk7Ci0JCi19Ci0vKioKLSAqIEBzZWUgU2lnbmF0dXJlCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXRSZXR1cm5UeXBlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JU3RyaW5nIG1ldGhvZFNpZyA9ICIoUVN0cmluZztRT2JqZWN0O0kpSSI7Ci0JYXNzZXJ0VHJ1ZSgiU2lnbmF0dXJlI2dldFJldHVyblR5cGUgaXMgbm90IGNvcnJlY3QxIiwgU2lnbmF0dXJlLmdldFJldHVyblR5cGUobWV0aG9kU2lnKS5lcXVhbHMoIkkiKSk7Ci0JdHJ5IHsKLQkJU2lnbmF0dXJlLmdldFJldHVyblR5cGUoIiIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLQkJcmV0dXJuOwotCX0KLQlhc3NlcnRUcnVlKCJTaWduYXR1cmUjZ2V0UmV0dXJuVHlwZSBpcyBub3QgY29ycmVjdDogZXhjZXB0aW9uIiwgZmFsc2UpOwotfQotLyoqCi0gKiBAc2VlIFNpZ25hdHVyZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0R2V0U2ltcGxlTmFtZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCWFzc2VydFRydWUoIlNpZ25hdHVyZSNnZXRTaW1wbGVOYW1lIGlzIG5vdCBjb3JyZWN0MSIsIFNpZ25hdHVyZS5nZXRTaW1wbGVOYW1lKCJqYXZhLmxhbmcuT2JqZWN0IikuZXF1YWxzKCJPYmplY3QiKSk7Ci0JYXNzZXJ0VHJ1ZSgiU2lnbmF0dXJlI2dldFNpbXBsZU5hbWUgaXMgbm90IGNvcnJlY3QyIiwgIFNpZ25hdHVyZS5nZXRTaW1wbGVOYW1lKCIiKS5lcXVhbHMoIiIpKTsKLX0KLS8qKgotICogQHNlZSBTaWduYXR1cmUKLSAqLwotcHVibGljIHZvaWQgdGVzdEdldFNpbXBsZU5hbWVzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JU3RyaW5nW10gc2ltcGxlTmFtZXMgPSBTaWduYXR1cmUuZ2V0U2ltcGxlTmFtZXMoImphdmEubGFuZy5PYmplY3QiKTsKLQlhc3NlcnRUcnVlKCJTaWduYXR1cmUjZ2V0U2ltcGxlTmFtZXMgaXMgbm90IGNvcnJlY3QxIiwgc2ltcGxlTmFtZXMubGVuZ3RoID09IDMgJiYgc2ltcGxlTmFtZXNbMl0uZXF1YWxzKCJPYmplY3QiKSk7Ci0Jc2ltcGxlTmFtZXMgPSBTaWduYXR1cmUuZ2V0U2ltcGxlTmFtZXMoIiIpOwotCWFzc2VydFRydWUoIlNpZ25hdHVyZSNnZXRTaW1wbGVOYW1lcyBpcyBub3QgY29ycmVjdDIiLCBzaW1wbGVOYW1lcy5sZW5ndGggPT0gMCk7Ci0Jc2ltcGxlTmFtZXMgPSBTaWduYXR1cmUuZ2V0U2ltcGxlTmFtZXMoIk9iamVjdCIpOwotCWFzc2VydFRydWUoIiBTaWduYXR1cmUgI2dldFNpbXBsZU5hbWVzIGlzIG5vdCBjb3JyZWN0MyAiLCBzaW1wbGVOYW1lcy5sZW5ndGggPT0gMSAmJiBzaW1wbGVOYW1lc1swXS5lcXVhbHMoIk9iamVjdCIpKTsKLX0KLS8qKgotICogQHNlZSBTaWduYXR1cmUKLSAqLwotcHVibGljIHZvaWQgdGVzdFRvUXVhbGlmaWVkTmFtZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCWFzc2VydFRydWUoIlNpZ25hdHVyZSN0b1F1YWxpZmllZE5hbWUgaXMgbm90IGNvcnJlY3QxIiwgU2lnbmF0dXJlLnRvUXVhbGlmaWVkTmFtZShuZXcgU3RyaW5nW10geyJqYXZhIiwgImxhbmciLCAiT2JqZWN0In0pLmVxdWFscygiamF2YS5sYW5nLk9iamVjdCIpKTsKLQlhc3NlcnRUcnVlKCJTaWduYXR1cmUjdG9RdWFsaWZpZWROYW1lIGlzIG5vdCBjb3JyZWN0MiIsIFNpZ25hdHVyZS50b1F1YWxpZmllZE5hbWUobmV3IFN0cmluZ1tdIHsiT2JqZWN0In0pLmVxdWFscygiT2JqZWN0IikpOwotCWFzc2VydFRydWUoIlNpZ25hdHVyZSN0b1F1YWxpZmllZE5hbWUgaXMgbm90IGNvcnJlY3QzIiwgU2lnbmF0dXJlLnRvUXVhbGlmaWVkTmFtZShuZXcgU3RyaW5nWzBdKS5lcXVhbHMoIiIpKTsKLX0KLS8qKgotICogQHNlZSBTaWduYXR1cmUudG9TdHJpbmcoU3RyaW5nKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiU2lnbmF0dXJlI3RvU3RyaW5nIGlzIG5vdCBjb3JyZWN0IDEiLCAKLQkJImphdmEubGFuZy5TdHJpbmciLAotCQlTaWduYXR1cmUudG9TdHJpbmcoIkxqYXZhLmxhbmcuU3RyaW5nOyIpKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJTaWduYXR1cmUjdG9TdHJpbmcgaXMgbm90IGNvcnJlY3QgMiIsIAotCQkiamF2YS5sYW5nLlN0cmluZ1tdIiwKLQkJU2lnbmF0dXJlLnRvU3RyaW5nKCJbTGphdmEubGFuZy5TdHJpbmc7IikpOwotCWFzc2VydEVxdWFscygKLQkJIlNpZ25hdHVyZSN0b1N0cmluZyBpcyBub3QgY29ycmVjdCAzIiwgCi0JCSJTdHJpbmciLAotCQlTaWduYXR1cmUudG9TdHJpbmcoIlFTdHJpbmc7IikpOwotCWFzc2VydEVxdWFscygKLQkJIlNpZ25hdHVyZSN0b1N0cmluZyBpcyBub3QgY29ycmVjdCA0IiwgCi0JCSJTdHJpbmdbXVtdIiwKLQkJU2lnbmF0dXJlLnRvU3RyaW5nKCJbW1FTdHJpbmc7IikpOwotCWFzc2VydEVxdWFscygKLQkJIlNpZ25hdHVyZSN0b1N0cmluZyBpcyBub3QgY29ycmVjdCA1IiwgCi0JCSJib29sZWFuIiwKLQkJU2lnbmF0dXJlLnRvU3RyaW5nKCJaIikpOwotCWFzc2VydEVxdWFscygKLQkJIlNpZ25hdHVyZSN0b1N0cmluZyBpcyBub3QgY29ycmVjdCA2IiwgCi0JCSJieXRlIiwKLQkJU2lnbmF0dXJlLnRvU3RyaW5nKCJCIikpOwotCWFzc2VydEVxdWFscygKLQkJIlNpZ25hdHVyZSN0b1N0cmluZyBpcyBub3QgY29ycmVjdCA3IiwgCi0JCSJjaGFyIiwKLQkJU2lnbmF0dXJlLnRvU3RyaW5nKCJDIikpOwotCWFzc2VydEVxdWFscygKLQkJIlNpZ25hdHVyZSN0b1N0cmluZyBpcyBub3QgY29ycmVjdCA4IiwgCi0JCSJkb3VibGUiLAotCQlTaWduYXR1cmUudG9TdHJpbmcoIkQiKSk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiU2lnbmF0dXJlI3RvU3RyaW5nIGlzIG5vdCBjb3JyZWN0IDkiLCAKLQkJImZsb2F0IiwKLQkJU2lnbmF0dXJlLnRvU3RyaW5nKCJGIikpOwotCWFzc2VydEVxdWFscygKLQkJIlNpZ25hdHVyZSN0b1N0cmluZyBpcyBub3QgY29ycmVjdCAxMCIsIAotCQkiaW50IiwKLQkJU2lnbmF0dXJlLnRvU3RyaW5nKCJJIikpOwotCWFzc2VydEVxdWFscygKLQkJIlNpZ25hdHVyZSN0b1N0cmluZyBpcyBub3QgY29ycmVjdCAxMSIsIAotCQkibG9uZyIsCi0JCVNpZ25hdHVyZS50b1N0cmluZygiSiIpKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJTaWduYXR1cmUjdG9TdHJpbmcgaXMgbm90IGNvcnJlY3QgMTIiLCAKLQkJInNob3J0IiwKLQkJU2lnbmF0dXJlLnRvU3RyaW5nKCJTIikpOwotCWFzc2VydEVxdWFscygKLQkJIlNpZ25hdHVyZSN0b1N0cmluZyBpcyBub3QgY29ycmVjdCAxMyIsIAotCQkidm9pZCIsCi0JCVNpZ25hdHVyZS50b1N0cmluZygiViIpKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJTaWduYXR1cmUjdG9TdHJpbmcgaXMgbm90IGNvcnJlY3QgMTQiLCAKLQkJImludFtdW11bXSIsCi0JCVNpZ25hdHVyZS50b1N0cmluZygiW1tbSSIpKTsKLX0KLS8qKgotICogQHNlZSBTaWduYXR1cmUudG9TdHJpbmcoU3RyaW5nLCBTdHJpbmcsIFN0cmluZ1tdLCBib29sZWFuLCBib29sZWFuKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiU2lnbmF0dXJlI3RvU3RyaW5nIGlzIG5vdCBjb3JyZWN0IDEiLCAKLQkJInZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSIsCi0JCVNpZ25hdHVyZS50b1N0cmluZygiKFtMamF2YS5sYW5nLlN0cmluZzspViIsICJtYWluIiwgbmV3IFN0cmluZ1tdIHsiYXJncyJ9LCBmYWxzZSwgdHJ1ZSkpOwotCWFzc2VydEVxdWFscygKLQkJIlNpZ25hdHVyZSN0b1N0cmluZyBpcyBub3QgY29ycmVjdCAyIiwgCi0JCSJtYWluKFN0cmluZ1tdIGFyZ3MpIiwKLQkJU2lnbmF0dXJlLnRvU3RyaW5nKCIoW0xqYXZhLmxhbmcuU3RyaW5nOylWIiwgIm1haW4iLCBuZXcgU3RyaW5nW10geyJhcmdzIn0sIGZhbHNlLCBmYWxzZSkpOwotCWFzc2VydEVxdWFscygKLQkJIlNpZ25hdHVyZSN0b1N0cmluZyBpcyBub3QgY29ycmVjdCAzIiwgCi0JCSJtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSIsCi0JCVNpZ25hdHVyZS50b1N0cmluZygiKFtMamF2YS5sYW5nLlN0cmluZzspViIsICJtYWluIiwgbmV3IFN0cmluZ1tdIHsiYXJncyJ9LCB0cnVlLCBmYWxzZSkpOwotCWFzc2VydEVxdWFscygKLQkJIlNpZ25hdHVyZSN0b1N0cmluZyBpcyBub3QgY29ycmVjdCA0IiwgCi0JCSIoamF2YS5sYW5nLlN0cmluZ1tdKSIsCi0JCVNpZ25hdHVyZS50b1N0cmluZygiKFtMamF2YS5sYW5nLlN0cmluZzspViIsIG51bGwsIG51bGwsIHRydWUsIGZhbHNlKSk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiU2lnbmF0dXJlI3RvU3RyaW5nIGlzIG5vdCBjb3JyZWN0IDUiLCAKLQkJIlN0cmluZyBtYWluKFN0cmluZ1tdIGFyZ3MpIiwKLQkJU2lnbmF0dXJlLnRvU3RyaW5nKCIoW0xqYXZhLmxhbmcuU3RyaW5nOylMamF2YS5sYW5nLlN0cmluZzsiLCAibWFpbiIsIG5ldyBTdHJpbmdbXSB7ImFyZ3MifSwgZmFsc2UsIHRydWUpKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJTaWduYXR1cmUjdG9TdHJpbmcgaXMgbm90IGNvcnJlY3QgNiIsIAotCQkiamF2YS5sYW5nLlN0cmluZyBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSIsCi0JCVNpZ25hdHVyZS50b1N0cmluZygiKFtMamF2YS5sYW5nLlN0cmluZzspTGphdmEubGFuZy5TdHJpbmc7IiwgIm1haW4iLCBuZXcgU3RyaW5nW10geyJhcmdzIn0sIHRydWUsIHRydWUpKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJTaWduYXR1cmUjdG9TdHJpbmcgaXMgbm90IGNvcnJlY3QgNyIsIAotCQkiamF2YS5sYW5nLlN0cmluZyBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSIsCi0JCVNpZ25hdHVyZS50b1N0cmluZygibWFpbihbTGphdmEubGFuZy5TdHJpbmc7KUxqYXZhLmxhbmcuU3RyaW5nOyIsICJtYWluIiwgbmV3IFN0cmluZ1tdIHsiYXJncyJ9LCB0cnVlLCB0cnVlKSk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiU2lnbmF0dXJlI3RvU3RyaW5nIGlzIG5vdCBjb3JyZWN0IDgiLCAKLQkJImphdmEubGFuZy5TdHJpbmdbXSBmb28oKSIsCi0JCVNpZ25hdHVyZS50b1N0cmluZygiKClbTGphdmEubGFuZy5TdHJpbmc7IiwgImZvbyIsIG51bGwsIHRydWUsIHRydWUpKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJTaWduYXR1cmUjdG9TdHJpbmcgaXMgbm90IGNvcnJlY3QgOSIsIAotCQkiSSBmb28oQywgTCkiLAotCQlTaWduYXR1cmUudG9TdHJpbmcoIihMQztMTDspTEk7IiwgImZvbyIsIG51bGwsIHRydWUsIHRydWUpKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJTaWduYXR1cmUjdG9TdHJpbmcgaXMgbm90IGNvcnJlY3QgMTAiLCAKLQkJImNoYXJbXVtdIGZvbygpIiwKLQkJU2lnbmF0dXJlLnRvU3RyaW5nKCIoKVtbQyIsICJmb28iLCBudWxsLCB0cnVlLCB0cnVlKSk7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiU2lnbmF0dXJlI3RvU3RyaW5nIGlzIG5vdCBjb3JyZWN0IDExIiwgCi0JCSJ2b2lkIGZvbyhqYXZhLmxhbmcuT2JqZWN0LCBTdHJpbmdbXVtdLCBib29sZWFuLCBieXRlLCBjaGFyLCBkb3VibGUsIGZsb2F0LCBpbnQsIGxvbmcsIHNob3J0KSIsCi0JCVNpZ25hdHVyZS50b1N0cmluZygiKExqYXZhLmxhbmcuT2JqZWN0O1tbUVN0cmluZztaQkNERklKUylWIiwgImZvbyIsIG51bGwsIHRydWUsIHRydWUpKTsKLQl0cnkgewotCQlTaWduYXR1cmUudG9TdHJpbmcoIihbTGphdmEubGFuZy5TdHJpbmc7ViIsIG51bGwsIG51bGwsIHRydWUsIGZhbHNlKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0JCXJldHVybjsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiU2lnbmF0dXJlI3RvU3RyaW5nIGlzIG5vdCBjb3JyZWN0IDEyOiBzaG91bGQgZ2V0IGFuIGV4Y2VwdGlvbiIsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBUZXN0IHRoZSB0b1N0cmluZygpIHNpZ25hdHVyZSBvZiBhbiBpbm5lciB0eXBlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmdJbm5lclR5cGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlhc3NlcnRFcXVhbHMoCi0JCSJTaWduYXR1cmUjdG9TdHJpbmcgaXMgbm90IGNvcnJlY3QiLCAKLQkJIngueS5BLklubmVyIiwKLQkJU2lnbmF0dXJlLnRvU3RyaW5nKCJMeC55LkEkSW5uZXI7IikpOwotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL1NuaXBwZXRDb21wbGV0aW9uVGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9TbmlwcGV0Q29tcGxldGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzODBjM2IuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL1NuaXBwZXRDb21wbGV0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29kZWFzc2lzdC5SZWxldmFuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmxvb2t1cC5Db21waWxlck1vZGlmaWVyczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldENvbXBsZXRpb25UZXN0cyBleHRlbmRzIEFic3RyYWN0SmF2YU1vZGVsVGVzdHMgaW1wbGVtZW50cyBSZWxldmFuY2VDb25zdGFudHMgewotCQotcHVibGljIFNuaXBwZXRDb21wbGV0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXB1YmxpYyB2b2lkIHNldFVwU3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQlzdXBlci5zZXRVcFN1aXRlKCk7Ci0JCi0Jc2V0VXBKYXZhUHJvamVjdCgiU25pcHBldENvbXBsZXRpb24iKTsKLX0KLXB1YmxpYyB2b2lkIHRlYXJEb3duU3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQlkZWxldGVQcm9qZWN0KCJTbmlwcGV0Q29tcGxldGlvbiIpOwotCQotCXN1cGVyLnRlYXJEb3duU3VpdGUoKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBTdWl0ZShTbmlwcGV0Q29tcGxldGlvblRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCi0Jc3VpdGUuYWRkVGVzdChuZXcgU25pcHBldENvbXBsZXRpb25UZXN0cygidGVzdENvZGVTbmlwcGV0QXNzaXN0Rm9yQ2xhc3NGaWxlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IFNuaXBwZXRDb21wbGV0aW9uVGVzdHMoInRlc3RDb2RlU25pcHBldEFzc2lzdEZvckNvbXBpbGF0aW9uVW5pdCIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBTbmlwcGV0Q29tcGxldGlvblRlc3RzKCJ0ZXN0Q29kZVNuaXBwZXRBc3Npc3RGb3JDbGFzc0ZpbGVXaXRoU291cmNlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IFNuaXBwZXRDb21wbGV0aW9uVGVzdHMoInRlc3RDb2RlU25pcHBldEFzc2lzdEZvckNvbXBpbGF0aW9uVW5pdFdpdGhvdXRTb3VyY2UiKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgU25pcHBldENvbXBsZXRpb25UZXN0cygidGVzdENvZGVTbmlwcGV0QXNzaXN0Rm9yQ2xhc3NGaWxlSW5Jbm5lckNsYXNzIikpOwotCi0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0Q29kZVNuaXBwZXRBc3Npc3RGb3JDbGFzc0ZpbGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDbGFzc0ZpbGUgY2YgPSBnZXRDbGFzc0ZpbGUoIlNuaXBwZXRDb21wbGV0aW9uIiwgImNsYXNzLWZvbGRlciIsICJhYS5iYi5jYyIsICJBQ2xhc3MuY2xhc3MiKTsKLQlJVHlwZSB0eXBlID0gY2YuZ2V0VHlwZSgpOwotCQotCVN0cmluZyBzbmlwcGV0ID0gCi0JCSJpbnQgdmFyWDtcbiIgKwotCQkiaW50IHZhclk7XG4iICsKLQkJInZhciI7Ci0JCQotCWNoYXJbXVtdIHR5cGVOYW1lcyA9IHsiU3VwZXJDbGFzcyIudG9DaGFyQXJyYXkoKSwgImludCIudG9DaGFyQXJyYXkoKX07Ci0JY2hhcltdW10gbmFtZXMgPSB7InZhcnNjIi50b0NoYXJBcnJheSgpLCAidmFyIi50b0NoYXJBcnJheSgpfTsKLQlpbnRbXSBtb2RpZmllcnMgPSB7Q29tcGlsZXJNb2RpZmllcnMuQWNjRGVmYXVsdCwgQ29tcGlsZXJNb2RpZmllcnMuQWNjRmluYWx9OwotCQotCXR5cGUuY29kZUNvbXBsZXRlKHNuaXBwZXQudG9DaGFyQXJyYXkoKSwgLTEsIHNuaXBwZXQubGVuZ3RoKCktMiwgdHlwZU5hbWVzLCBuYW1lcywgbW9kaWZpZXJzLCBmYWxzZSwgcmVxdWVzdG9yKTsKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSA1IGNvbXBsZXRpb25zIiwKLQkJImVsZW1lbnQ6dmFyICAgIGNvbXBsZXRpb246dmFyICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJImVsZW1lbnQ6dmFyWCAgICBjb21wbGV0aW9uOnZhclggICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iKwotCQkiZWxlbWVudDp2YXJZICAgIGNvbXBsZXRpb246dmFyWSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIrCi0JCSJlbGVtZW50OnZhcnNjICAgIGNvbXBsZXRpb246dmFyc2MgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iKwotCQkiZWxlbWVudDp2b2lkICAgIGNvbXBsZXRpb246dm9pZCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi0KLXB1YmxpYyB2b2lkIHRlc3RDb2RlU25pcHBldEFzc2lzdEZvckNvbXBpbGF0aW9uVW5pdCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiU25pcHBldENvbXBsZXRpb24iLCAic3JjIiwgImFhLmJiLmNjIiwgIkJDbGFzcy5qYXZhIik7Ci0JSVR5cGUgdHlwZSA9IGN1LmdldFR5cGVzKClbMF07Ci0JU3RyaW5nIHNuaXBwZXQgPSAKLQkJImludCB2YXJYO1xuIiArCi0JCSJpbnQgdmFyWTtcbiIgKwotCQkidmFyIjsKLQkJCi0JY2hhcltdW10gdHlwZU5hbWVzID0geyJTdXBlckNsYXNzIi50b0NoYXJBcnJheSgpLCAiaW50Ii50b0NoYXJBcnJheSgpfTsKLQljaGFyW11bXSBuYW1lcyA9IHsidmFyc2MiLnRvQ2hhckFycmF5KCksICJ2YXIiLnRvQ2hhckFycmF5KCl9OwotCWludFtdIG1vZGlmaWVycyA9IHtDb21waWxlck1vZGlmaWVycy5BY2NEZWZhdWx0LCBDb21waWxlck1vZGlmaWVycy5BY2NGaW5hbH07Ci0KLQlTdHJpbmcgaW5zZXJ0QWZ0cmVyID0gIlZpY3Rvcnl7fSI7Ci0JU3RyaW5nIHMgPSBjdS5nZXRTb3VyY2UoKTsKLQlpbnQgaW5zZXJ0aW9uID0gLTE7Ci0JaWYocyAhPSBudWxsKQotCQlpbnNlcnRpb24gPSBzLmxhc3RJbmRleE9mKGluc2VydEFmdHJlcikgKyBpbnNlcnRBZnRyZXIubGVuZ3RoKCk7Ci0KLQl0eXBlLmNvZGVDb21wbGV0ZShzbmlwcGV0LnRvQ2hhckFycmF5KCksIGluc2VydGlvbiwgc25pcHBldC5sZW5ndGgoKS0yLCB0eXBlTmFtZXMsIG5hbWVzLCBtb2RpZmllcnMsIGZhbHNlLCByZXF1ZXN0b3IpOwotCQotCWFzc2VydEVxdWFscygKLQkJInNob3VsZCBoYXZlIDYgY29tcGxldGlvbnMiLAotCQkiZWxlbWVudDpWaWN0b3J5ICAgIGNvbXBsZXRpb246VmljdG9yeSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfVU5RVUFMSUZJRUQpKyJcbiIrCi0JCSJlbGVtZW50OnZhciAgICBjb21wbGV0aW9uOnZhciAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIrCi0JCSJlbGVtZW50OnZhclggICAgY29tcGxldGlvbjp2YXJYICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJImVsZW1lbnQ6dmFyWSAgICBjb21wbGV0aW9uOnZhclkgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iKwotCQkiZWxlbWVudDp2YXJzYyAgICBjb21wbGV0aW9uOnZhcnNjICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJImVsZW1lbnQ6dm9pZCAgICBjb21wbGV0aW9uOnZvaWQgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UpLAotCQlyZXF1ZXN0b3IuZ2V0UmVzdWx0cygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdENvZGVTbmlwcGV0QXNzaXN0Rm9yQ2xhc3NGaWxlV2l0aFNvdXJjZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNsYXNzRmlsZSBjZiA9IGdldENsYXNzRmlsZSgiU25pcHBldENvbXBsZXRpb24iLCAiY2xhc3MtZm9sZGVyIiwgImFhLmJiLmNjIiwgIkNDbGFzcy5jbGFzcyIpOwotCUlUeXBlIHR5cGUgPSBjZi5nZXRUeXBlKCk7Ci0JCi0JU3RyaW5nIHNuaXBwZXQgPSAKLQkJImludCB2YXJYO1xuIiArCi0JCSJpbnQgdmFyWTtcbiIgKwotCQkidmFyIjsKLQkJCi0JY2hhcltdW10gdHlwZU5hbWVzID0geyJTdXBlckNsYXNzIi50b0NoYXJBcnJheSgpLCAiaW50Ii50b0NoYXJBcnJheSgpfTsKLQljaGFyW11bXSBuYW1lcyA9IHsidmFyc2MiLnRvQ2hhckFycmF5KCksICJ2YXIiLnRvQ2hhckFycmF5KCl9OwotCWludFtdIG1vZGlmaWVycyA9IHtDb21waWxlck1vZGlmaWVycy5BY2NEZWZhdWx0LCBDb21waWxlck1vZGlmaWVycy5BY2NGaW5hbH07Ci0KLQlTdHJpbmcgaW5zZXJ0QWZ0cmVyID0gIlZpY3Rvcnl7fSI7Ci0JU3RyaW5nIHMgPSBjZi5nZXRTb3VyY2UoKTsKLQlpbnQgaW5zZXJ0aW9uID0gLTE7Ci0JaWYocyAhPSBudWxsKQotCQlpbnNlcnRpb24gPSBzLmxhc3RJbmRleE9mKGluc2VydEFmdHJlcikgKyBpbnNlcnRBZnRyZXIubGVuZ3RoKCk7Ci0JCi0JdHlwZS5jb2RlQ29tcGxldGUoc25pcHBldC50b0NoYXJBcnJheSgpLCBpbnNlcnRpb24sIHNuaXBwZXQubGVuZ3RoKCktMiwgdHlwZU5hbWVzLCBuYW1lcywgbW9kaWZpZXJzLCBmYWxzZSwgcmVxdWVzdG9yKTsKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSA2IGNvbXBsZXRpb25zIiwKLQkJImVsZW1lbnQ6VmljdG9yeSAgICBjb21wbGV0aW9uOlZpY3RvcnkgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX1VOUVVBTElGSUVEKSsiXG4iKwotCQkiZWxlbWVudDp2YXIgICAgY29tcGxldGlvbjp2YXIgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iKwotCQkiZWxlbWVudDp2YXJYICAgIGNvbXBsZXRpb246dmFyWCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIrCi0JCSJlbGVtZW50OnZhclkgICAgY29tcGxldGlvbjp2YXJZICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJImVsZW1lbnQ6dmFyc2MgICAgY29tcGxldGlvbjp2YXJzYyAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIrCi0JCSJlbGVtZW50OnZvaWQgICAgY29tcGxldGlvbjp2b2lkICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFKSAsCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi0KLXB1YmxpYyB2b2lkIHRlc3RDb2RlU25pcHBldEFzc2lzdEZvckNvbXBpbGF0aW9uVW5pdFdpdGhvdXRTb3VyY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlDb21wbGV0aW9uVGVzdHNSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbXBsZXRpb25UZXN0c1JlcXVlc3RvcigpOwotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlNuaXBwZXRDb21wbGV0aW9uIiwgInNyYyIsICJhYS5iYi5jYyIsICJCQ2xhc3MuamF2YSIpOwotCUlUeXBlIHR5cGUgPSBjdS5nZXRUeXBlcygpWzBdOwotCQotCVN0cmluZyBzbmlwcGV0ID0gCi0JCSJpbnQgdmFyWDtcbiIgKwotCQkiaW50IHZhclk7XG4iICsKLQkJInZhciI7Ci0JCQotCWNoYXJbXVtdIHR5cGVOYW1lcyA9IHsiU3VwZXJDbGFzcyIudG9DaGFyQXJyYXkoKSwgImludCIudG9DaGFyQXJyYXkoKX07Ci0JY2hhcltdW10gbmFtZXMgPSB7InZhcnNjIi50b0NoYXJBcnJheSgpLCAidmFyIi50b0NoYXJBcnJheSgpfTsKLQlpbnRbXSBtb2RpZmllcnMgPSB7Q29tcGlsZXJNb2RpZmllcnMuQWNjRGVmYXVsdCwgQ29tcGlsZXJNb2RpZmllcnMuQWNjRmluYWx9OwotCi0JaW50IGluc2VydGlvbiA9IC0xOwotCi0JdHlwZS5jb2RlQ29tcGxldGUoc25pcHBldC50b0NoYXJBcnJheSgpLCBpbnNlcnRpb24sIHNuaXBwZXQubGVuZ3RoKCktMiwgdHlwZU5hbWVzLCBuYW1lcywgbW9kaWZpZXJzLCBmYWxzZSwgcmVxdWVzdG9yKTsKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSA1IGNvbXBsZXRpb25zIiwKLQkJImVsZW1lbnQ6dmFyICAgIGNvbXBsZXRpb246dmFyICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJImVsZW1lbnQ6dmFyWCAgICBjb21wbGV0aW9uOnZhclggICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iKwotCQkiZWxlbWVudDp2YXJZICAgIGNvbXBsZXRpb246dmFyWSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIrCi0JCSJlbGVtZW50OnZhcnNjICAgIGNvbXBsZXRpb246dmFyc2MgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iKwotCQkiZWxlbWVudDp2b2lkICAgIGNvbXBsZXRpb246dm9pZCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi0KLXB1YmxpYyB2b2lkIHRlc3RDb2RlU25pcHBldEFzc2lzdEZvckNsYXNzRmlsZUluSW5uZXJDbGFzcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUNvbXBsZXRpb25UZXN0c1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29tcGxldGlvblRlc3RzUmVxdWVzdG9yKCk7Ci0JSUNsYXNzRmlsZSBjZiA9IGdldENsYXNzRmlsZSgiU25pcHBldENvbXBsZXRpb24iLCAiY2xhc3MtZm9sZGVyIiwgImFhLmJiLmNjIiwgIkFDbGFzcyRJbm5lci5jbGFzcyIpOwotCUlUeXBlIHR5cGUgPSBjZi5nZXRUeXBlKCk7Ci0JCi0JU3RyaW5nIHNuaXBwZXQgPSAKLQkJImludCB2YXJYO1xuIiArCi0JCSJpbnQgdmFyWTtcbiIgKwotCQkidmFyIjsKLQkJCi0JY2hhcltdW10gdHlwZU5hbWVzID0geyJTdXBlckNsYXNzIi50b0NoYXJBcnJheSgpLCAiaW50Ii50b0NoYXJBcnJheSgpfTsKLQljaGFyW11bXSBuYW1lcyA9IHsidmFyc2MiLnRvQ2hhckFycmF5KCksICJ2YXIiLnRvQ2hhckFycmF5KCl9OwotCWludFtdIG1vZGlmaWVycyA9IHtDb21waWxlck1vZGlmaWVycy5BY2NEZWZhdWx0LCBDb21waWxlck1vZGlmaWVycy5BY2NGaW5hbH07Ci0KLQlTdHJpbmcgaW5zZXJ0QWZ0cmVyID0gIlZpY3Rvcnl7fSI7Ci0JU3RyaW5nIHMgPSBjZi5nZXRTb3VyY2UoKTsKLQlpbnQgaW5zZXJ0aW9uID0gLTE7Ci0JaWYocyAhPSBudWxsKQotCQlpbnNlcnRpb24gPSBzLmxhc3RJbmRleE9mKGluc2VydEFmdHJlcikgKyBpbnNlcnRBZnRyZXIubGVuZ3RoKCk7Ci0JCi0JdHlwZS5jb2RlQ29tcGxldGUoc25pcHBldC50b0NoYXJBcnJheSgpLCBpbnNlcnRpb24sIHNuaXBwZXQubGVuZ3RoKCktMiwgdHlwZU5hbWVzLCBuYW1lcywgbW9kaWZpZXJzLCBmYWxzZSwgcmVxdWVzdG9yKTsKLQkKLQlhc3NlcnRFcXVhbHMoCi0JCSJzaG91bGQgaGF2ZSA1IGNvbXBsZXRpb25zIiwKLQkJImVsZW1lbnQ6dmFyICAgIGNvbXBsZXRpb246dmFyICAgIHJlbGV2YW5jZToiKyhSX0RFRkFVTFQgKyBSX0lOVEVSRVNUSU5HICsgUl9DQVNFICsgUl9VTlFVQUxJRklFRCkrIlxuIisKLQkJImVsZW1lbnQ6dmFyWCAgICBjb21wbGV0aW9uOnZhclggICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iKwotCQkiZWxlbWVudDp2YXJZICAgIGNvbXBsZXRpb246dmFyWSAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSArIFJfVU5RVUFMSUZJRUQpKyJcbiIrCi0JCSJlbGVtZW50OnZhcnNjICAgIGNvbXBsZXRpb246dmFyc2MgICAgcmVsZXZhbmNlOiIrKFJfREVGQVVMVCArIFJfSU5URVJFU1RJTkcgKyBSX0NBU0UgKyBSX1VOUVVBTElGSUVEKSsiXG4iKwotCQkiZWxlbWVudDp2b2lkICAgIGNvbXBsZXRpb246dm9pZCAgICByZWxldmFuY2U6IisoUl9ERUZBVUxUICsgUl9JTlRFUkVTVElORyArIFJfQ0FTRSksCi0JCXJlcXVlc3Rvci5nZXRSZXN1bHRzKCkpOwotfQotCi19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvU29ydENvbXBpbGF0aW9uVW5pdEVsZW1lbnRzVGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9Tb3J0Q29tcGlsYXRpb25Vbml0RWxlbWVudHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzBiZjY3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9Tb3J0Q29tcGlsYXRpb25Vbml0RWxlbWVudHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUudXRpbC5Db21waWxhdGlvblVuaXRTb3J0ZXI7Ci0KLS8qKgotICogCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBTb3J0Q29tcGlsYXRpb25Vbml0RWxlbWVudHNUZXN0cyBleHRlbmRzIE1vZGlmeWluZ1Jlc291cmNlVGVzdHMgewotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0KLXB1YmxpYyBTb3J0Q29tcGlsYXRpb25Vbml0RWxlbWVudHNUZXN0cyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIHZvaWQgc2V0VXBTdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCXN1cGVyLnNldFVwU3VpdGUoKTsKLQkKLQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJQIiwgbmV3IFN0cmluZ1tdIHsic3JjIn0sIG5ldyBTdHJpbmdbXSB7Z2V0RXh0ZXJuYWxKQ0xQYXRoU3RyaW5nKCl9LCAiYmluIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JdGhpcy5jcmVhdGVGb2xkZXIoIi9QL3NyYy9wIik7IC8vJE5PTi1OTFMtMSQKLX0KLXByaXZhdGUgdm9pZCBzb3J0VW5pdChJQ29tcGlsYXRpb25Vbml0IHVuaXQsIFN0cmluZyBleHBlY3RlZFJlc3VsdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRoaXMuc29ydFVuaXQodW5pdCwgZXhwZWN0ZWRSZXN1bHQsIHRydWUpOwotfQotCi1wcml2YXRlIHZvaWQgc29ydFVuaXQoSUNvbXBpbGF0aW9uVW5pdCB1bml0LCBTdHJpbmcgZXhwZWN0ZWRSZXN1bHQsIGJvb2xlYW4gdGVzdFBvc2l0aW9ucykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCWNoYXJbXSBpbml0aWFsU291cmNlID0gdW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCWludFtdIHBvc2l0aW9ucyA9IG51bGw7Ci0JaWYgKHRlc3RQb3NpdGlvbnMpIHsKLQkJcG9zaXRpb25zID0gbmV3IGludFtpbml0aWFsU291cmNlLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5pdGlhbFNvdXJjZS5sZW5ndGg7IGkrKykgewotCQkJcG9zaXRpb25zW2ldID0gaTsKLQkJfQotCX0KLQlJQ29tcGlsYXRpb25Vbml0IGNvcHkgPSAoSUNvbXBpbGF0aW9uVW5pdCkgdW5pdC5nZXRXb3JraW5nQ29weSgpOwotCUNvbXBpbGF0aW9uVW5pdFNvcnRlci5zb3J0KGNvcHkgLCBwb3NpdGlvbnMsIG5ldyBEZWZhdWx0SmF2YUVsZW1lbnRDb21wYXJhdG9yKDEsMiwzLDQsNSw2LDcsOCw5KSwgMCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JU3RyaW5nIHNvcnRlZFNvdXJjZSA9IGNvcHkuZ2V0QnVmZmVyKCkuZ2V0Q29udGVudHMoKTsKLQlhc3NlcnRFcXVhbHMoIkRpZmZlcmVudCBvdXRwdXQiLCBzb3J0ZWRTb3VyY2UsIGV4cGVjdGVkUmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCWlmICh0ZXN0UG9zaXRpb25zKSB7Ci0JCWZvciAoaW50IGkgPSAwLCBtYXggPSBwb3NpdGlvbnMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKLQkJCWFzc2VydEVxdWFscygid3JvbmcgbWFwcGVkIHBvc2l0aW9ucyBhdCAiICsgaSArICIgPC0+ICIgKyBwb3NpdGlvbnNbaV0sIGluaXRpYWxTb3VyY2VbaV0sIGV4cGVjdGVkUmVzdWx0LmNoYXJBdChwb3NpdGlvbnNbaV0pKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci19Ci0KLXZvaWQgZGVidWcoSUNvbXBpbGF0aW9uVW5pdCB1bml0LCBTdHJpbmcgaWQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCVN0cmluZyBzb3VyY2UgPSB1bml0LmdldEJ1ZmZlcigpLmdldENvbnRlbnRzKCk7Ci0JaWYgKERFQlVHKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT0gIiArIGlkICsgIiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN5c3RlbS5vdXQucHJpbnRsbihzb3VyY2UpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09ICIgKyBpZCArICIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBTdWl0ZShTb3J0Q29tcGlsYXRpb25Vbml0RWxlbWVudHNUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCi0JaWYgKHRydWUpIHsKLQkJQ2xhc3MgYyA9IFNvcnRDb21waWxhdGlvblVuaXRFbGVtZW50c1Rlc3RzLmNsYXNzOwotCQlNZXRob2RbXSBtZXRob2RzID0gYy5nZXRNZXRob2RzKCk7Ci0JCWZvciAoaW50IGkgPSAwLCBtYXggPSBtZXRob2RzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7Ci0JCQlpZiAobWV0aG9kc1tpXS5nZXROYW1lKCkuc3RhcnRzV2l0aCgidGVzdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlzdWl0ZS5hZGRUZXN0KG5ldyBTb3J0Q29tcGlsYXRpb25Vbml0RWxlbWVudHNUZXN0cyhtZXRob2RzW2ldLmdldE5hbWUoKSkpOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgU29ydENvbXBpbGF0aW9uVW5pdEVsZW1lbnRzVGVzdHMoInRlc3QwMTEiKSk7IC8vJE5PTi1OTFMtMSQKLQl9CQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyB2b2lkIHRlYXJEb3duU3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsgLy8kTk9OLU5MUy0xJAotCXN1cGVyLnRlYXJEb3duU3VpdGUoKTsKLX0KLS8qKgotICogQ2FsbHMgbWV0aG9kcyB0aGF0IGRvIG5vdGhpbmcgdG8gZW5zdXJlIGNvZGUgY292ZXJhZ2UKLSAqLwotcHVibGljIHZvaWQgdGVzdDAwMSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1Avc3JjL3AvWC5qYXZhIiwgLy8kTk9OLU5MUy0xJAotCQkJIi8qKlxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIgKlxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIgKi9cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicGFja2FnZSBwO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCXN0YXRpYyBjbGFzcyBEIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlTdHJpbmcgdG9TdHJpbmcoKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJCXJldHVybiBcIkhFTExPXCI7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJLy8gc3RhcnQgb2Ygc3RhdGljIGZpZWxkIGRlY2xhcmF0aW9uXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIlxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJc3RhdGljIGludCBpLCBqID0gMywgLyogICAgICovIGsgPSA0Oy8vIGVuZCBvZiBzdGF0aWMgZmllbGQgZGVjbGFyYXRpb25cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCXZvaWQgYmFyKGludCBpKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl2b2lkIGJhcigpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlcblxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCWNsYXNzIEUge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjcoKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjkoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjIoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlPYmplY3QgbyA9IG5ldyBFKCk7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKG8pO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCWNsYXNzIEMge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjYoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjQoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjUoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCX1cblxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJT2JqZWN0IGIxID0gbnVsbCwgYTEgPSBuZXcgT2JqZWN0KCkge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCXZvaWQgYmFyMigpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJdm9pZCBiYXIoKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCXZvaWQgYmFyNCgpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJU3lzdGVtLm91dC5wcmludGxuKCk7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCXZvaWQgYmFyMygpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl9LCBjMSA9IG51bGw7IC8vIGVuZCBvZiBtdWx0aXBsZSBmaWVsZCBkZWNsYXJhdGlvblxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJLy8gZW5kIG9mIGNsYXNzIFhcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiArICAvLyROT04tTkxTLTEkCi0JCQkiLy8gZW5kIG9mIGNvbXBpbGF0aW9uIHVuaXRcbiIgLy8kTk9OLU5MUy0xJAotCQkpOwotCQlTdHJpbmcgZXhwZWN0ZWRSZXN1bHQgPSAiLyoqXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIiAqXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIiAqL1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwYWNrYWdlIHA7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJc3RhdGljIGNsYXNzIEQge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCVN0cmluZyB0b1N0cmluZygpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJcmV0dXJuIFwiSEVMTE9cIjtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkvLyBzdGFydCBvZiBzdGF0aWMgZmllbGQgZGVjbGFyYXRpb25cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglzdGF0aWMgaW50IGksIGogPSAzLCAvKiAgICAgKi8gayA9IDQ7Ly8gZW5kIG9mIHN0YXRpYyBmaWVsZCBkZWNsYXJhdGlvblxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCU9iamVjdCBiMSA9IG51bGwsIGExID0gbmV3IE9iamVjdCgpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQl2b2lkIGJhcigpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJdm9pZCBiYXIyKCkge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQl2b2lkIGJhcjMoKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCXZvaWQgYmFyNCgpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJU3lzdGVtLm91dC5wcmludGxuKCk7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJfSwgYzEgPSBudWxsOyAvLyBlbmQgb2YgbXVsdGlwbGUgZmllbGQgZGVjbGFyYXRpb25cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCXZvaWQgYmFyKCkge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQljbGFzcyBFIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJdm9pZCBiYXIyKCkge31cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJdm9pZCBiYXI3KCkge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQkJU3lzdGVtLm91dC5wcmludGxuKCk7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJdm9pZCBiYXI5KCkge31cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJT2JqZWN0IG8gPSBuZXcgRSgpO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihvKTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQljbGFzcyBDIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJdm9pZCBiYXI0KCkge31cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJdm9pZCBiYXI1KCkge31cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJdm9pZCBiYXI2KCkge31cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl2b2lkIGJhcihpbnQgaSkge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJLy8gZW5kIG9mIGNsYXNzIFhcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIvLyBlbmQgb2YgY29tcGlsYXRpb24gdW5pdFxuIjsgLy8kTk9OLU5MUy0xJAotCQlzb3J0VW5pdCh0aGlzLmdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL3AvWC5qYXZhIiksIGV4cGVjdGVkUmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlRmlsZSgiL1Avc3JjL3AvWC5qYXZhIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDAyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvcC9YLmphdmEiLCAvLyROT04tTkxTLTEkCi0JCQkicGFja2FnZSBwO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCWNsYXNzIEQge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCVN0cmluZyB0b1N0cmluZygpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJcmV0dXJuIFwiSEVMTE9cIjtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglpbnQgaSwgaiwgaztcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCU9iamVjdCBiYXIoKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKCk7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJT2JqZWN0IG8gPSBuZXcgT2JqZWN0KCkgeyAgICB9O1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihvKTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQljbGFzcyBDIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJdm9pZCBiYXI2KCkge31cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJdm9pZCBiYXI0KCkge31cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJdm9pZCBiYXI1KCkge31cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJcmV0dXJuIG5ldyBDKCk7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglPYmplY3QgYmFyMygpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oKTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlPYmplY3QgbyA9IG5ldyBPYmplY3QoKSB7ICAgICAgICB9O1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihvKTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlyZXR1cm4gbztcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCU9iamVjdCBhMSA9IG5ldyBPYmplY3QoKSB7IH0sIG8xID0gbnVsbDtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkifSIgLy8kTk9OLU5MUy0xJAotCQkpOwotCQlTdHJpbmcgZXhwZWN0ZWRTb3VyY2UgPSAicGFja2FnZSBwO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCWNsYXNzIEQge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCVN0cmluZyB0b1N0cmluZygpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJcmV0dXJuIFwiSEVMTE9cIjtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglPYmplY3QgYTEgPSBuZXcgT2JqZWN0KCkgeyB9LCBvMSA9IG51bGw7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglpbnQgaSwgaiwgaztcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCU9iamVjdCBiYXIoKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKCk7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJT2JqZWN0IG8gPSBuZXcgT2JqZWN0KCkgeyAgICB9O1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihvKTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQljbGFzcyBDIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJdm9pZCBiYXI0KCkge31cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJdm9pZCBiYXI1KCkge31cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJdm9pZCBiYXI2KCkge31cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJcmV0dXJuIG5ldyBDKCk7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglPYmplY3QgYmFyMygpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oKTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlPYmplY3QgbyA9IG5ldyBPYmplY3QoKSB7ICAgICAgICB9O1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihvKTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlyZXR1cm4gbztcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkifSI7IC8vJE5PTi1OTFMtMSQKLQkJc29ydFVuaXQodGhpcy5nZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9wL1guamF2YSIpLCBleHBlY3RlZFNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZUZpbGUoIi9QL3NyYy9wL1guamF2YSIpOyAvLyROT04tTkxTLTEkCi0JfQotfQotLyoqCi0gKiBDYWxscyBtZXRob2RzIHRoYXQgZG8gbm90aGluZyB0byBlbnN1cmUgY29kZSBjb3ZlcmFnZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDAzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvcC9YLmphdmEiLCAvLyROT04tTkxTLTEkCi0JCQkiLyoqXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIiAqXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIiAqL1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwYWNrYWdlIHA7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5DbG9uZWFibGUge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgljbGFzcyBEIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlTdHJpbmcgdG9TdHJpbmcoKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJCXJldHVybiBcIkhFTExPXCI7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCS8vIHN0YXJ0IG9mIGZpZWxkIGRlY2xhcmF0aW9uXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIlxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJaW50IGksIGogPSAzLCAvKiAgICAgKi8gayA9IDQ7Ly8gZW5kIG9mIGZpZWxkIGRlY2xhcmF0aW9uXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl2b2lkIGJhcihmaW5hbCBpbnQgaVtdKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl2b2lkIGJhcigpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlcblxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCWNsYXNzIEUge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjcoKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjkoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjIoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlPYmplY3QgbyA9IG5ldyBFKCk7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKG8pO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCWNsYXNzIEMge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjYoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjQoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjUoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCX1cblxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJT2JqZWN0IGIxW10gPSBudWxsLCBhMSA9IG5ldyBPYmplY3QoKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJdm9pZCBiYXIyKGludFtdIGopIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJdm9pZCBiYXIoKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCXZvaWQgYmFyNCgpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJU3lzdGVtLm91dC5wcmludGxuKCk7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCXZvaWQgYmFyMygpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl9LCBjMSA9IG51bGw7IC8vIGVuZCBvZiBtdWx0aXBsZSBmaWVsZCBkZWNsYXJhdGlvblxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJLy8gZW5kIG9mIGNsYXNzIFhcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiArICAvLyROT04tTkxTLTEkCi0JCQkiLy8gZW5kIG9mIGNvbXBpbGF0aW9uIHVuaXRcbiIgLy8kTk9OLU5MUy0xJAotCQkpOwotCQlTdHJpbmcgZXhwZWN0ZWRSZXN1bHQgPSAiLyoqXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIiAqXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIiAqL1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwYWNrYWdlIHA7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5DbG9uZWFibGUge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgljbGFzcyBEIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlTdHJpbmcgdG9TdHJpbmcoKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJCXJldHVybiBcIkhFTExPXCI7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCU9iamVjdCBiMVtdID0gbnVsbCwgYTEgPSBuZXcgT2JqZWN0KCkge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCXZvaWQgYmFyKCkge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQl2b2lkIGJhcjIoaW50W10gaikge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQl2b2lkIGJhcjMoKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCXZvaWQgYmFyNCgpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJU3lzdGVtLm91dC5wcmludGxuKCk7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJfSwgYzEgPSBudWxsOyAvLyBlbmQgb2YgbXVsdGlwbGUgZmllbGQgZGVjbGFyYXRpb25cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkvLyBzdGFydCBvZiBmaWVsZCBkZWNsYXJhdGlvblxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCWludCBpLCBqID0gMywgLyogICAgICovIGsgPSA0Oy8vIGVuZCBvZiBmaWVsZCBkZWNsYXJhdGlvblxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJdm9pZCBiYXIoKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIlxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCWNsYXNzIEUge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjIoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjcoKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjkoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlPYmplY3QgbyA9IG5ldyBFKCk7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKG8pO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCWNsYXNzIEMge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjQoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjUoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjYoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCXZvaWQgYmFyKGZpbmFsIGludCBpW10pIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCS8vIGVuZCBvZiBjbGFzcyBYXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIn1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiLy8gZW5kIG9mIGNvbXBpbGF0aW9uIHVuaXRcbiI7IC8vJE5PTi1OTFMtMSQKLQkJc29ydFVuaXQodGhpcy5nZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9wL1guamF2YSIpLCBleHBlY3RlZFJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZUZpbGUoIi9QL3NyYy9wL1guamF2YSIpOyAvLyROT04tTkxTLTEkCi0JfQotfQotLyoqCi0gKiBDYWxscyBtZXRob2RzIHRoYXQgZG8gbm90aGluZyB0byBlbnN1cmUgY29kZSBjb3ZlcmFnZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0MDA0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvcC9YLmphdmEiLCAvLyROT04tTkxTLTEkCi0JCQkiLyoqXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIiAqXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIiAqL1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwYWNrYWdlIHA7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5DbG9uZWFibGUge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgljbGFzcyBEIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlTdHJpbmcgdG9TdHJpbmcoKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJCXJldHVybiBcIkhFTExPXCI7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCS8vIHN0YXJ0IG9mIG1ldGhvZCBkZWNsYXJhdGlvblxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCXZvaWQgYmFyKGZpbmFsIGludCBpW10pIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCXZvaWQgYmFyKCkge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCVxuXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJY2xhc3MgRSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJCU9iamVjdCBiYXI3KCkge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQkJcmV0dXJuIG5ldyBPYmplY3QoKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJCQkJdm9pZCBiYXI5KCkge31cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJCQl2b2lkIGJhcjIoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQkJfTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjkoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjIoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlPYmplY3QgbyA9IG5ldyBFKCk7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKG8pO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCWNsYXNzIEMge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjYoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjQoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjUoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCX1cblxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJLy8gZW5kIG9mIGNsYXNzIFhcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiArICAvLyROT04tTkxTLTEkCi0JCQkiLy8gZW5kIG9mIGNvbXBpbGF0aW9uIHVuaXRcbiIgLy8kTk9OLU5MUy0xJAotCQkpOwotCQlTdHJpbmcgZXhwZWN0ZWRSZXN1bHQgPSAiLyoqXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIiAqXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIiAqL1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwYWNrYWdlIHA7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCBpbXBsZW1lbnRzIGphdmEudXRpbC5DbG9uZWFibGUge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgljbGFzcyBEIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlTdHJpbmcgdG9TdHJpbmcoKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJCXJldHVybiBcIkhFTExPXCI7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJdm9pZCBiYXIoKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIlxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCWNsYXNzIEUge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjIoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQlPYmplY3QgYmFyNygpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJCXJldHVybiBuZXcgT2JqZWN0KCkge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQkJCXZvaWQgYmFyMigpIHt9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJCQkJdm9pZCBiYXI5KCkge31cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJCX07XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJdm9pZCBiYXI5KCkge31cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJT2JqZWN0IG8gPSBuZXcgRSgpO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihvKTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQljbGFzcyBDIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJdm9pZCBiYXI0KCkge31cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJdm9pZCBiYXI1KCkge31cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJdm9pZCBiYXI2KCkge31cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIlxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJLy8gc3RhcnQgb2YgbWV0aG9kIGRlY2xhcmF0aW9uXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIlxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJdm9pZCBiYXIoZmluYWwgaW50IGlbXSkge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCS8vIGVuZCBvZiBjbGFzcyBYXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIn1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiLy8gZW5kIG9mIGNvbXBpbGF0aW9uIHVuaXRcbiI7IC8vJE5PTi1OTFMtMSQKLQkJc29ydFVuaXQodGhpcy5nZXRDb21waWxhdGlvblVuaXQoIi9QL3NyYy9wL1guamF2YSIpLCBleHBlY3RlZFJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZUZpbGUoIi9QL3NyYy9wL1guamF2YSIpOyAvLyROT04tTkxTLTEkCi0JfQotfQotcHVibGljIHZvaWQgdGVzdDAwNSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1Avc3JjL3AvWC5qYXZhIiwgLy8kTk9OLU5MUy0xJAotCQkJInBhY2thZ2UgcDtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJT2JqZWN0IGJhcjMoKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKCk7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJT2JqZWN0IG8gPSBuZXcgT2JqZWN0KCkgeyAgICAgICAgfTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4obyk7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJcmV0dXJuIG87XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIn0iIC8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJU3RyaW5nIGV4cGVjdGVkUmVzdWx0ID0gInBhY2thZ2UgcDtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJT2JqZWN0IGJhcjMoKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKCk7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJT2JqZWN0IG8gPSBuZXcgT2JqZWN0KCkgeyAgICAgICAgfTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4obyk7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJcmV0dXJuIG87XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIn0iOyAvLyROT04tTkxTLTEkCi0JCXNvcnRVbml0KHRoaXMuZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvcC9YLmphdmEiKSwgZXhwZWN0ZWRSZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVGaWxlKCIvUC9zcmMvcC9YLmphdmEiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KLXB1YmxpYyB2b2lkIHRlc3QwMDYoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QL3NyYy9wL1guamF2YSIsIC8vJE5PTi1OTFMtMSQKLQkJCSJwYWNrYWdlIHA7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCU9iamVjdCBiYXIzKCkge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbigpO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCXJldHVybiBuZXcgT2JqZWN0KCkge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQlwdWJsaWMgdm9pZCBiYXI2KCkge31cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJdm9pZCBiYXI0KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24sIE51bGxQb2ludGVyRXhjZXB0aW9uIHt9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJCXZvaWQgYmFyNSgpIHt9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIiAgICAgICB9O1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJ9IiAvLyROT04tTkxTLTEkCi0JCSk7Ci0JCVN0cmluZyBleHBlY3RlZFJlc3VsdCA9ICJwYWNrYWdlIHA7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCU9iamVjdCBiYXIzKCkge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbigpO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCXJldHVybiBuZXcgT2JqZWN0KCkge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiwgTnVsbFBvaW50ZXJFeGNlcHRpb24ge31cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJdm9pZCBiYXI1KCkge31cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJcHVibGljIHZvaWQgYmFyNigpIHt9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIiAgICAgICB9O1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJ9IjsgLy8kTk9OLU5MUy0xJAotCQlzb3J0VW5pdCh0aGlzLmdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL3AvWC5qYXZhIiksIGV4cGVjdGVkUmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlRmlsZSgiL1Avc3JjL3AvWC5qYXZhIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDA3KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvcC9YLmphdmEiLCAvLyROT04tTkxTLTEkCi0JCQkicGFja2FnZSBwO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglPYmplY3QgYmFyMygpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oKTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlyZXR1cm4gbmV3IE9iamVjdCgpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJcHVibGljIHN0YXRpYyB2b2lkIGJhcjYoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjUoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiwgTnVsbFBvaW50ZXJFeGNlcHRpb24ge31cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiICAgICAgIH07XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIn0iIC8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJU3RyaW5nIGV4cGVjdGVkUmVzdWx0ID0gInBhY2thZ2UgcDtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJT2JqZWN0IGJhcjMoKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKCk7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJcmV0dXJuIG5ldyBPYmplY3QoKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJCXB1YmxpYyBzdGF0aWMgdm9pZCBiYXI2KCkge31cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJdm9pZCBiYXI0KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24sIE51bGxQb2ludGVyRXhjZXB0aW9uIHt9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJCXZvaWQgYmFyNSgpIHt9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIiAgICAgICB9O1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJ9IjsgLy8kTk9OLU5MUy0xJAotCQlzb3J0VW5pdCh0aGlzLmdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL3AvWC5qYXZhIiksIGV4cGVjdGVkUmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlRmlsZSgiL1Avc3JjL3AvWC5qYXZhIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3QwMDgoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIi9QL3NyYy9wL1guamF2YSIsIC8vJE5PTi1OTFMtMSQKLQkJCSJwYWNrYWdlIHA7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCU9iamVjdCBiYXIzKCkge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbigpO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCXJldHVybiBuZXcgT2JqZWN0KCkge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQlwdWJsaWMgc3RhdGljIHZvaWQgYmFyNigpIHt9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJCXZvaWQgYmFyNSgpIHt9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJCXZvaWQgYmFyNCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhjZXB0aW9uLCBOdWxsUG9pbnRlckV4Y2VwdGlvbiB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIgICAgICAgfTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkifSIgLy8kTk9OLU5MUy0xJAotCQkpOwotCQlTdHJpbmcgZXhwZWN0ZWRSZXN1bHQgPSAicGFja2FnZSBwO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglPYmplY3QgYmFyMygpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oKTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlyZXR1cm4gbmV3IE9iamVjdCgpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJcHVibGljIHN0YXRpYyB2b2lkIGJhcjYoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiwgTnVsbFBvaW50ZXJFeGNlcHRpb24ge31cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJdm9pZCBiYXI1KCkge31cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiICAgICAgIH07XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIn0iOyAvLyROT04tTkxTLTEkCi0JCXNvcnRVbml0KHRoaXMuZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvcC9YLmphdmEiKSwgZXhwZWN0ZWRSZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVGaWxlKCIvUC9zcmMvcC9YLmphdmEiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KLS8qKgotICogQ2FsbHMgbWV0aG9kcyB0aGF0IGRvIG5vdGhpbmcgdG8gZW5zdXJlIGNvZGUgY292ZXJhZ2UKLSAqLwotcHVibGljIHZvaWQgdGVzdDAwOSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUZpbGUoCi0JCQkiL1Avc3JjL3AvWC5qYXZhIiwgLy8kTk9OLU5MUy0xJAotCQkJIi8qKlxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIgKlxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIgKi9cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicGFja2FnZSBwO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCXN0YXRpYyBjbGFzcyBEIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlTdHJpbmcgdG9TdHJpbmcoKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJCXJldHVybiBcIkhFTExPXCI7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJLy8gc3RhcnQgb2Ygc3RhdGljIGZpZWxkIGRlY2xhcmF0aW9uXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIlxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJc3RhdGljIGludCBpLCBqID0gMywgLyogICAgICovIGsgPSA0Oy8vIGVuZCBvZiBzdGF0aWMgZmllbGQgZGVjbGFyYXRpb25cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCXZvaWQgYmFyKGludCBpKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl2b2lkIGJhcigpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlcblxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCWNsYXNzIEUge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjcoKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjkoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjIoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlPYmplY3QgbyA9IG5ldyBFKCk7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKG8pO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCWNsYXNzIEMge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjYoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjQoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjUoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCX1cblxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJT2JqZWN0IGIxID0gbnVsbCwgYTEgPSBuZXcgT2JqZWN0KCkge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCXZvaWQgYmFyMigpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJdm9pZCBiYXIoKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCXZvaWQgYmFyNCgpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJU3lzdGVtLm91dC5wcmludGxuKCk7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCXZvaWQgYmFyMygpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl9LCBjMSA9IG51bGw7IC8vIGVuZCBvZiBtdWx0aXBsZSBmaWVsZCBkZWNsYXJhdGlvblxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJLy8gZW5kIG9mIGNsYXNzIFhcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiArICAvLyROT04tTkxTLTEkCi0JCQkiLy8gZW5kIG9mIGNvbXBpbGF0aW9uIHVuaXRcbiIgLy8kTk9OLU5MUy0xJAotCQkpOwotCQlTdHJpbmcgZXhwZWN0ZWRSZXN1bHQgPSAiLyoqXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIiAqXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIiAqL1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwYWNrYWdlIHA7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJc3RhdGljIGNsYXNzIEQge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCVN0cmluZyB0b1N0cmluZygpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJcmV0dXJuIFwiSEVMTE9cIjtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkvLyBzdGFydCBvZiBzdGF0aWMgZmllbGQgZGVjbGFyYXRpb25cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglzdGF0aWMgaW50IGksIGogPSAzLCAvKiAgICAgKi8gayA9IDQ7Ly8gZW5kIG9mIHN0YXRpYyBmaWVsZCBkZWNsYXJhdGlvblxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCU9iamVjdCBiMSA9IG51bGwsIGExID0gbmV3IE9iamVjdCgpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQl2b2lkIGJhcigpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJdm9pZCBiYXIyKCkge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQl2b2lkIGJhcjMoKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCXZvaWQgYmFyNCgpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJU3lzdGVtLm91dC5wcmludGxuKCk7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJfSwgYzEgPSBudWxsOyAvLyBlbmQgb2YgbXVsdGlwbGUgZmllbGQgZGVjbGFyYXRpb25cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCXZvaWQgYmFyKCkge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQljbGFzcyBFIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJdm9pZCBiYXIyKCkge31cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJdm9pZCBiYXI3KCkge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQkJU3lzdGVtLm91dC5wcmludGxuKCk7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJdm9pZCBiYXI5KCkge31cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJT2JqZWN0IG8gPSBuZXcgRSgpO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbihvKTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQljbGFzcyBDIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJdm9pZCBiYXI0KCkge31cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJdm9pZCBiYXI1KCkge31cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQkJdm9pZCBiYXI2KCkge31cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl2b2lkIGJhcihpbnQgaSkge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJLy8gZW5kIG9mIGNsYXNzIFhcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkifVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIvLyBlbmQgb2YgY29tcGlsYXRpb24gdW5pdFxuIjsgLy8kTk9OLU5MUy0xJAotCQlJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSB0aGlzLmdldENvbXBpbGF0aW9uVW5pdCgiL1Avc3JjL3AvWC5qYXZhIik7IC8vJE5PTi1OTFMtMSQKLQkJc29ydFVuaXQodW5pdCwgZXhwZWN0ZWRSZXN1bHQsIGZhbHNlKTsJCQotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlRmlsZSgiL1Avc3JjL3AvWC5qYXZhIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDEwKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvU3VwZXJSZWZlcmVuY2UuamF2YSIsIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgU3VwZXJSZWZlcmVuY2UgZXh0ZW5kcyBUaGlzUmVmZXJlbmNlIHtcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJXHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIFN1cGVyUmVmZXJlbmNlKGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCkge1xyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglzdXBlcihzb3VyY2VTdGFydCwgc291cmNlRW5kKTtcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIHN0YXRpYyBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCBpbXBsaWNpdFN1cGVyQ29uc3RydWN0b3JDYWxsKCkge1xyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglyZXR1cm4gbmV3IEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLkltcGxpY2l0U3VwZXIpO1xyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIn1cclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgYm9vbGVhbiBpc0ltcGxpY2l0VGhpcygpIHtcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJXHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCXJldHVybiBmYWxzZTtcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGJvb2xlYW4gaXNTdXBlcigpIHtcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJXHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCXJldHVybiB0cnVlO1xyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIn1cclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgYm9vbGVhbiBpc1RoaXMoKSB7XHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCVxyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglyZXR1cm4gZmFsc2UgO1xyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIn1cclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgVHlwZUJpbmRpbmcgcmVzb2x2ZVR5cGUoQmxvY2tTY29wZSBzY29wZSkge1xyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgljb25zdGFudCA9IE5vdEFDb25zdGFudDtcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJaWYgKCFjaGVja0FjY2VzcyhzY29wZS5tZXRob2RTY29wZSgpKSlcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCXJldHVybiBudWxsO1xyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglTb3VyY2VUeXBlQmluZGluZyBlbmNsb3NpbmdUYiA9IHNjb3BlLmVuY2xvc2luZ1NvdXJjZVR5cGUoKTtcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJaWYgKHNjb3BlLmlzSmF2YUxhbmdPYmplY3QoZW5jbG9zaW5nVGIpKSB7XHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlzY29wZS5wcm9ibGVtUmVwb3J0ZXIoKS5jYW5ub3RVc2VTdXBlckluSmF2YUxhbmdPYmplY3QodGhpcyk7XHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlyZXR1cm4gbnVsbDtcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJfVxyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglyZXR1cm4gdGhpcy5yZXNvbHZlZFR5cGUgPSBlbmNsb3NpbmdUYi5zdXBlcmNsYXNzO1xyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIn1cclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgU3RyaW5nIHRvU3RyaW5nRXhwcmVzc2lvbigpe1xyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIlxyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglyZXR1cm4gXCJzdXBlclwiOyAvLyROT04tTkxTLTEkXHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCVxyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIn1cclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgdm9pZCB0cmF2ZXJzZShJQWJzdHJhY3RTeW50YXhUcmVlVmlzaXRvciB2aXNpdG9yLCBCbG9ja1Njb3BlIGJsb2NrU2NvcGUpIHtcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJdmlzaXRvci52aXNpdCh0aGlzLCBibG9ja1Njb3BlKTtcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJdmlzaXRvci5lbmRWaXNpdCh0aGlzLCBibG9ja1Njb3BlKTtcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkifSIgLy8kTk9OLU5MUy0xJAotCQkpOwotCQlTdHJpbmcgZXhwZWN0ZWRSZXN1bHQgPSAicHVibGljIGNsYXNzIFN1cGVyUmVmZXJlbmNlIGV4dGVuZHMgVGhpc1JlZmVyZW5jZSB7XHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIHN0YXRpYyBFeHBsaWNpdENvbnN0cnVjdG9yQ2FsbCBpbXBsaWNpdFN1cGVyQ29uc3RydWN0b3JDYWxsKCkge1xyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglyZXR1cm4gbmV3IEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsKEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsLkltcGxpY2l0U3VwZXIpO1xyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIn1cclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJXHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIFN1cGVyUmVmZXJlbmNlKGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUVuZCkge1xyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglzdXBlcihzb3VyY2VTdGFydCwgc291cmNlRW5kKTtcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGJvb2xlYW4gaXNJbXBsaWNpdFRoaXMoKSB7XHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCVxyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglyZXR1cm4gZmFsc2U7XHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkifVxyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBib29sZWFuIGlzU3VwZXIoKSB7XHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCVxyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglyZXR1cm4gdHJ1ZTtcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGJvb2xlYW4gaXNUaGlzKCkge1xyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJcmV0dXJuIGZhbHNlIDtcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIFR5cGVCaW5kaW5nIHJlc29sdmVUeXBlKEJsb2NrU2NvcGUgc2NvcGUpIHtcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJY29uc3RhbnQgPSBOb3RBQ29uc3RhbnQ7XHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCWlmICghY2hlY2tBY2Nlc3Moc2NvcGUubWV0aG9kU2NvcGUoKSkpXHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlyZXR1cm4gbnVsbDtcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJU291cmNlVHlwZUJpbmRpbmcgZW5jbG9zaW5nVGIgPSBzY29wZS5lbmNsb3NpbmdTb3VyY2VUeXBlKCk7XHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCWlmIChzY29wZS5pc0phdmFMYW5nT2JqZWN0KGVuY2xvc2luZ1RiKSkge1xyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJc2NvcGUucHJvYmxlbVJlcG9ydGVyKCkuY2Fubm90VXNlU3VwZXJJbkphdmFMYW5nT2JqZWN0KHRoaXMpO1xyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJcmV0dXJuIG51bGw7XHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCX1cclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJcmV0dXJuIHRoaXMucmVzb2x2ZWRUeXBlID0gZW5jbG9zaW5nVGIuc3VwZXJjbGFzcztcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIFN0cmluZyB0b1N0cmluZ0V4cHJlc3Npb24oKXtcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJcmV0dXJuIFwic3VwZXJcIjsgLy8kTk9OLU5MUy0xJFxyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIHZvaWQgdHJhdmVyc2UoSUFic3RyYWN0U3ludGF4VHJlZVZpc2l0b3IgdmlzaXRvciwgQmxvY2tTY29wZSBibG9ja1Njb3BlKSB7XHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCXZpc2l0b3IudmlzaXQodGhpcywgYmxvY2tTY29wZSk7XHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCXZpc2l0b3IuZW5kVmlzaXQodGhpcywgYmxvY2tTY29wZSk7XHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkifVxyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIn0iOyAvLyROT04tTkxTLTEkCi0JCXNvcnRVbml0KHRoaXMuZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvU3VwZXJSZWZlcmVuY2UuamF2YSIpLCBleHBlY3RlZFJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZUZpbGUoIi9QL3NyYy9TdXBlclJlZmVyZW5jZS5qYXZhIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDExKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvcC9CYXNlVHlwZXMuamF2YSIsIC8vJE5PTi1OTFMtMSQKLQkJCSIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIiAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIGFuZCBvdGhlcnMuXHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNSBcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sXHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiICogXHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiICogQ29udHJpYnV0b3JzOlxyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIiAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJInBhY2thZ2UgcDtcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgaW50ZXJmYWNlIEJhc2VUeXBlcyB7XHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCWZpbmFsIEJhc2VUeXBlQmluZGluZyBJbnRCaW5kaW5nID0gbmV3IEJhc2VUeXBlQmluZGluZyhUeXBlSWRzLlRfaW50LCBcImludFwiLnRvQ2hhckFycmF5KCksIG5ldyBjaGFyW10geydJJ30pOyAvLyROT04tTkxTLTEkXHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCWZpbmFsIEJhc2VUeXBlQmluZGluZyBCeXRlQmluZGluZyA9IG5ldyBCYXNlVHlwZUJpbmRpbmcoVHlwZUlkcy5UX2J5dGUsIFwiYnl0ZVwiLnRvQ2hhckFycmF5KCksIG5ldyBjaGFyW10geydCJ30pOyAvLyROT04tTkxTLTEkXHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCWZpbmFsIEJhc2VUeXBlQmluZGluZyBTaG9ydEJpbmRpbmcgPSBuZXcgQmFzZVR5cGVCaW5kaW5nKFR5cGVJZHMuVF9zaG9ydCwgXCJzaG9ydFwiLnRvQ2hhckFycmF5KCksIG5ldyBjaGFyW10geydTJ30pOyAvLyROT04tTkxTLTEkXHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCWZpbmFsIEJhc2VUeXBlQmluZGluZyBDaGFyQmluZGluZyA9IG5ldyBCYXNlVHlwZUJpbmRpbmcoVHlwZUlkcy5UX2NoYXIsIFwiY2hhclwiLnRvQ2hhckFycmF5KCksIG5ldyBjaGFyW10geydDJ30pOyAvLyROT04tTkxTLTEkXHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCWZpbmFsIEJhc2VUeXBlQmluZGluZyBMb25nQmluZGluZyA9IG5ldyBCYXNlVHlwZUJpbmRpbmcoVHlwZUlkcy5UX2xvbmcsIFwibG9uZ1wiLnRvQ2hhckFycmF5KCksIG5ldyBjaGFyW10geydKJ30pOyAvLyROT04tTkxTLTEkXHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCWZpbmFsIEJhc2VUeXBlQmluZGluZyBGbG9hdEJpbmRpbmcgPSBuZXcgQmFzZVR5cGVCaW5kaW5nKFR5cGVJZHMuVF9mbG9hdCwgXCJmbG9hdFwiLnRvQ2hhckFycmF5KCksIG5ldyBjaGFyW10geydGJ30pOyAvLyROT04tTkxTLTEkXHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCWZpbmFsIEJhc2VUeXBlQmluZGluZyBEb3VibGVCaW5kaW5nID0gbmV3IEJhc2VUeXBlQmluZGluZyhUeXBlSWRzLlRfZG91YmxlLCBcImRvdWJsZVwiLnRvQ2hhckFycmF5KCksIG5ldyBjaGFyW10geydEJ30pOyAvLyROT04tTkxTLTEkXHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCWZpbmFsIEJhc2VUeXBlQmluZGluZyBCb29sZWFuQmluZGluZyA9IG5ldyBCYXNlVHlwZUJpbmRpbmcoVHlwZUlkcy5UX2Jvb2xlYW4sIFwiYm9vbGVhblwiLnRvQ2hhckFycmF5KCksIG5ldyBjaGFyW10geydaJ30pOyAvLyROT04tTkxTLTEkXHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCWZpbmFsIEJhc2VUeXBlQmluZGluZyBOdWxsQmluZGluZyA9IG5ldyBCYXNlVHlwZUJpbmRpbmcoVHlwZUlkcy5UX251bGwsIFwibnVsbFwiLnRvQ2hhckFycmF5KCksIG5ldyBjaGFyW10geydOJ30pOyAvL04gc3RhbmRzIGZvciBudWxsIGV2ZW4gaWYgaXQgaXMgbmV2ZXIgaW50ZXJuYWxseSB1c2VkIC8vJE5PTi1OTFMtMSRcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJZmluYWwgQmFzZVR5cGVCaW5kaW5nIFZvaWRCaW5kaW5nID0gbmV3IEJhc2VUeXBlQmluZGluZyhUeXBlSWRzLlRfdm9pZCwgXCJ2b2lkXCIudG9DaGFyQXJyYXkoKSwgbmV3IGNoYXJbXSB7J1YnfSk7IC8vJE5PTi1OTFMtMSRcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJ9XHJcbiIgLy8kTk9OLU5MUy0xJAotCQkpOwotCQlTdHJpbmcgZXhwZWN0ZWRSZXN1bHQgPSAiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiBhbmQgb3RoZXJzLlxyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgXHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUgXHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbFxyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIiAqIFxyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIiAqIENvbnRyaWJ1dG9yczpcclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwYWNrYWdlIHA7XHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiXHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkicHVibGljIGludGVyZmFjZSBCYXNlVHlwZXMge1xyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglmaW5hbCBCYXNlVHlwZUJpbmRpbmcgQm9vbGVhbkJpbmRpbmcgPSBuZXcgQmFzZVR5cGVCaW5kaW5nKFR5cGVJZHMuVF9ib29sZWFuLCBcImJvb2xlYW5cIi50b0NoYXJBcnJheSgpLCBuZXcgY2hhcltdIHsnWid9KTsgLy8kTk9OLU5MUy0xJFxyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglmaW5hbCBCYXNlVHlwZUJpbmRpbmcgQnl0ZUJpbmRpbmcgPSBuZXcgQmFzZVR5cGVCaW5kaW5nKFR5cGVJZHMuVF9ieXRlLCBcImJ5dGVcIi50b0NoYXJBcnJheSgpLCBuZXcgY2hhcltdIHsnQid9KTsgLy8kTk9OLU5MUy0xJFxyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglmaW5hbCBCYXNlVHlwZUJpbmRpbmcgQ2hhckJpbmRpbmcgPSBuZXcgQmFzZVR5cGVCaW5kaW5nKFR5cGVJZHMuVF9jaGFyLCBcImNoYXJcIi50b0NoYXJBcnJheSgpLCBuZXcgY2hhcltdIHsnQyd9KTsgLy8kTk9OLU5MUy0xJFxyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglmaW5hbCBCYXNlVHlwZUJpbmRpbmcgRG91YmxlQmluZGluZyA9IG5ldyBCYXNlVHlwZUJpbmRpbmcoVHlwZUlkcy5UX2RvdWJsZSwgXCJkb3VibGVcIi50b0NoYXJBcnJheSgpLCBuZXcgY2hhcltdIHsnRCd9KTsgLy8kTk9OLU5MUy0xJFxyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglmaW5hbCBCYXNlVHlwZUJpbmRpbmcgRmxvYXRCaW5kaW5nID0gbmV3IEJhc2VUeXBlQmluZGluZyhUeXBlSWRzLlRfZmxvYXQsIFwiZmxvYXRcIi50b0NoYXJBcnJheSgpLCBuZXcgY2hhcltdIHsnRid9KTsgLy8kTk9OLU5MUy0xJFxyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglmaW5hbCBCYXNlVHlwZUJpbmRpbmcgSW50QmluZGluZyA9IG5ldyBCYXNlVHlwZUJpbmRpbmcoVHlwZUlkcy5UX2ludCwgXCJpbnRcIi50b0NoYXJBcnJheSgpLCBuZXcgY2hhcltdIHsnSSd9KTsgLy8kTk9OLU5MUy0xJFxyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglmaW5hbCBCYXNlVHlwZUJpbmRpbmcgTG9uZ0JpbmRpbmcgPSBuZXcgQmFzZVR5cGVCaW5kaW5nKFR5cGVJZHMuVF9sb25nLCBcImxvbmdcIi50b0NoYXJBcnJheSgpLCBuZXcgY2hhcltdIHsnSid9KTsgLy8kTk9OLU5MUy0xJFxyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglmaW5hbCBCYXNlVHlwZUJpbmRpbmcgTnVsbEJpbmRpbmcgPSBuZXcgQmFzZVR5cGVCaW5kaW5nKFR5cGVJZHMuVF9udWxsLCBcIm51bGxcIi50b0NoYXJBcnJheSgpLCBuZXcgY2hhcltdIHsnTid9KTsgLy9OIHN0YW5kcyBmb3IgbnVsbCBldmVuIGlmIGl0IGlzIG5ldmVyIGludGVybmFsbHkgdXNlZCAvLyROT04tTkxTLTEkXHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCWZpbmFsIEJhc2VUeXBlQmluZGluZyBTaG9ydEJpbmRpbmcgPSBuZXcgQmFzZVR5cGVCaW5kaW5nKFR5cGVJZHMuVF9zaG9ydCwgXCJzaG9ydFwiLnRvQ2hhckFycmF5KCksIG5ldyBjaGFyW10geydTJ30pOyAvLyROT04tTkxTLTEkXHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCWZpbmFsIEJhc2VUeXBlQmluZGluZyBWb2lkQmluZGluZyA9IG5ldyBCYXNlVHlwZUJpbmRpbmcoVHlwZUlkcy5UX3ZvaWQsIFwidm9pZFwiLnRvQ2hhckFycmF5KCksIG5ldyBjaGFyW10geydWJ30pOyAvLyROT04tTkxTLTEkXHJcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkifVxyXG4iOyAvLyROT04tTkxTLTEkCi0JCXNvcnRVbml0KHRoaXMuZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvcC9CYXNlVHlwZXMuamF2YSIpLCBleHBlY3RlZFJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZUZpbGUoIi9QL3NyYy9wL0Jhc2VUeXBlcy5qYXZhIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDEyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlRmlsZSgKLQkJCSIvUC9zcmMvcC9YLmphdmEiLCAvLyROT04tTkxTLTEkCi0JCQkicGFja2FnZSBwO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIglcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCU9iamVjdCBiYXIzKCkge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCXJldHVybiBudWxsO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJYmFyKCkge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCVN5c3RlbS5vdXQucHJpbnRsbigpO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCU9iamVjdCBvID0gbmV3IE9iamVjdCgpIHsgICAgfTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4obyk7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJY2xhc3MgQyB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJCXZvaWQgYmFyNigpIHt9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJCXZvaWQgYmFyNCgpIHt9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJCXZvaWQgYmFyNSgpIHt9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCXJldHVybiBuZXcgQygpO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJfVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSJ9IiAvLyROT04tTkxTLTEkCi0JCSk7Ci0JCVN0cmluZyBleHBlY3RlZFNvdXJjZSA9ICJwYWNrYWdlIHA7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJInB1YmxpYyBjbGFzcyBYIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCWJhcigpIHtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oKTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlPYmplY3QgbyA9IG5ldyBPYmplY3QoKSB7ICAgIH07XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKG8pO1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCWNsYXNzIEMge1xuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjQoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjUoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCQl2b2lkIGJhcjYoKSB7fVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCQlyZXR1cm4gbmV3IEMoKTtcbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCX1cbiIgKyAvLyROT04tTkxTLTEkCi0JCQkiCVxuIiArIC8vJE5PTi1OTFMtMSQKLQkJCSIJT2JqZWN0IGJhcjMoKSB7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgkJcmV0dXJuIG51bGw7XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIgl9XG4iICsgLy8kTk9OLU5MUy0xJAotCQkJIn0iOyAvLyROT04tTkxTLTEkCi0JCXNvcnRVbml0KHRoaXMuZ2V0Q29tcGlsYXRpb25Vbml0KCIvUC9zcmMvcC9YLmphdmEiKSwgZXhwZWN0ZWRTb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVGaWxlKCIvUC9zcmMvcC9YLmphdmEiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9TdWl0ZU9mVGVzdENhc2VzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvU3VpdGVPZlRlc3RDYXNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjU4ZWM2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9TdWl0ZU9mVGVzdENhc2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlByb3RlY3RhYmxlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogQSB0ZXN0IGNhc2UgY2xhc3MgdGhhdCBjYW4gYmUgc2V0IHVwICh1c2luZyB0aGUgc2V0VXBTdWl0ZSgpIG1ldGhvZCkgYW5kIHRvcmUgZG93biAodXNpbmcgdGhlIHRlYXJkRG93blN1aXRlKCkgbWV0aG9kKQotICogb25jZSBmb3IgYWxsIHRlc3QgY2FzZXMgb2YgdGhpcyBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIFN1aXRlT2ZUZXN0Q2FzZXMgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5qdW5pdC5leHRlbnNpb24uVGVzdENhc2UgewotCQkKLQkvKgotCSAqIEEgdGVzdCBzdWl0ZSB0aGF0IGluaXRpYWxpemUgdGhlIHRlc3QgY2FzZSdzIGZpZWxkcyBvbmNlLCB0aGVuIHRoYXQgY29waWVzIHRoZSB2YWx1ZXMKLQkgKiBvZiB0aGVzZSBmaWVsZHMgaW50dG8gZWFjaCBzdWJzZXF1ZW50IHRlc3QgY2FzZS4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQkJcHVibGljIFN1aXRlT2ZUZXN0Q2FzZXMgY3VycmVudFRlc3RDYXNlOwotCQkKLQkJLyoKLQkJICogQ3JlYXRlcyBhIG5ldyBzdWl0ZSBvbiB0aGUgZ2l2ZW4gY2xhc3MuIFRoaXMgY2xhc3MgbXVzdCBiZSBhIHN1YmNsYXNzIG9mIFNldHVwYWJsZVRlc3RTdWl0ZS4KLQkJICovCi0JCXB1YmxpYyBTdWl0ZShDbGFzcyB0aGVDbGFzcykgewotCQkJc3VwZXIodGhlQ2xhc3MpOwotCQl9Ci0JCXB1YmxpYyBTdWl0ZShTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIobmFtZSk7Ci0JCX0KLQkJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoU3VpdGVPZlRlc3RDYXNlcyB0ZXN0KSB7Ci0JCQlDbGFzcyBjdXJyZW50Q2xhc3MgPSB0ZXN0LmdldENsYXNzKCk7Ci0JCQl3aGlsZSAoY3VycmVudENsYXNzICE9IG51bGwgJiYgIWN1cnJlbnRDbGFzcy5lcXVhbHMoU3VpdGVPZlRlc3RDYXNlcy5jbGFzcykpIHsKLQkJCQlGaWVsZFtdIGZpZWxkcyA9IGN1cnJlbnRDbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpOwotCQkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBmaWVsZHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJRmllbGQgZmllbGQgPSBmaWVsZHNbaV07Ci0JCQkJCQotCQkJCQkvLyBza2lwIHN0YXRpYyBmaWVsZHMKLQkJCQkJaWYgKE1vZGlmaWVyLmlzU3RhdGljKGZpZWxkLmdldE1vZGlmaWVycygpKSkgY29udGludWU7Ci0JCQkJCQotCQkJCQkvLyBtYWtlIHRoZSBmaWVsZCBhY2Nlc3NpYmxlCi0JCQkJCWZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCQkJCQotCQkJCQl0cnkgewotCQkJCQkJT2JqZWN0IHZhbHVlID0gZmllbGQuZ2V0KHRoaXMuY3VycmVudFRlc3RDYXNlKTsKLQkJCQkJCWZpZWxkLnNldCh0ZXN0LCB2YWx1ZSk7Ci0JCQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJCWN1cnJlbnRDbGFzcyA9IGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgcnVuKGZpbmFsIFRlc3RSZXN1bHQgcmVzdWx0KSB7Ci0JCQlQcm90ZWN0YWJsZSBwPSBuZXcgUHJvdGVjdGFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcHJvdGVjdCgpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQl0cnkgewotCQkJCQkJLy8gcnVuIHN1aXRlIChmaXJzdCB0ZXN0IHJ1biB3aWxsIHNldHVwIHRoZSBzdWl0ZSkKLQkJCQkJCXN1cGVyUnVuKHJlc3VsdCk7Ci0JCQkJCX0gZmluYWxseSB7CQotCQkJCQkJLy8gdGVhciBkb3duIHRoZSBzdWl0ZQotCQkJCQkJaWYgKFN1aXRlLnRoaXMuY3VycmVudFRlc3RDYXNlICE9IG51bGwpIHsgLy8gcHJvdGVjdCBhZ2FpbnN0IGVtcHR5IHRlc3Qgc3VpdGUKLQkJCQkJCQlTdWl0ZS50aGlzLmN1cnJlbnRUZXN0Q2FzZS50ZWFyRG93blN1aXRlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJcmVzdWx0LnJ1blByb3RlY3RlZCh0aGlzLCBwKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzdXBlclJ1bihUZXN0UmVzdWx0IHJlc3VsdCkgewotCQkJc3VwZXIucnVuKHJlc3VsdCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgcnVuVGVzdChUZXN0IHRlc3QsIFRlc3RSZXN1bHQgcmVzdWx0KSB7Ci0JCQlTdWl0ZU9mVGVzdENhc2VzIGN1cnJlbnQgPSAoU3VpdGVPZlRlc3RDYXNlcyl0ZXN0OwotCQkJaWYgKHRoaXMuY3VycmVudFRlc3RDYXNlID09IG51bGwpIHsKLQkJCQkvLyBzZXR1cCBzdWl0ZQotCQkJCXRyeSB7Ci0JCQkJCWN1cnJlbnQuc2V0VXBTdWl0ZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBjb3B5IHRoZSB2YWx1ZXMgb2YgdGhlIHByZXZpb3VzIGN1cnJlbnQgdGVzdCBjYXNlJ3MgZmllbGRzIGludG8gdGhlIGN1cnJlbnQgb25lCi0JCQkJdGhpcy5pbml0aWFsaXplKGN1cnJlbnQpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlzdXBlci5ydW5UZXN0KHRlc3QsIHJlc3VsdCk7Ci0JCQl9IGZpbmFsbHkgewkJCi0JCQkJLy8gbWFrZSBjdXJyZW50Ci0JCQkJdGhpcy5jdXJyZW50VGVzdENhc2UgPSBjdXJyZW50OwotCQkJfQotCQl9Ci0JfQotCQkJCi0JcHVibGljIFN1aXRlT2ZUZXN0Q2FzZXMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQkJCi0JLyoqCi0JICogU2V0dXAgdGhlIHRlc3Qgc3VpdGUgb25jZSBiZWZvcmUgYWxsIHRlc3QgY2FzZXMgcnVuLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVwU3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQl9Ci0JCi0JLyoqCi0JICogVGVhciBkb3duIHRoZSB0ZXN0IHN1aXRlIG9uY2UgYWZ0ZXIgYWxsIHRlc3QgY2FzZXMgaGF2ZSBydW4uCi0JICovCi0JcHVibGljIHZvaWQgdGVhckRvd25TdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9UZXN0UHJvZ3Jlc3NNb25pdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvVGVzdFByb2dyZXNzTW9uaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzcwZWVlLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9UZXN0UHJvZ3Jlc3NNb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0UHJvZ3Jlc3NNb25pdG9yIGltcGxlbWVudHMgSVByb2dyZXNzTW9uaXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBUZXN0UHJvZ3Jlc3NNb25pdG9yIHNpbmdsZXRvbiA9IG5ldyBUZXN0UHJvZ3Jlc3NNb25pdG9yKCk7Ci0JcHVibGljIGludCBpc0NhbmNlbGVkQ291bnRlcjsKLQotLyoqCi0gKiBAc2VlIElQcm9ncmVzc01vbml0b3IjYmVnaW5UYXNrCi0gKi8KLXB1YmxpYyB2b2lkIGJlZ2luVGFzayhTdHJpbmcgbmFtZSwgaW50IHRvdGFsV29yaykgewotfQotLyoqCi0gKiBAc2VlIElQcm9ncmVzc01vbml0b3IjZG9uZQotICovCi1wdWJsaWMgdm9pZCBkb25lKCkgewotfQotcHVibGljIHN0YXRpYyBUZXN0UHJvZ3Jlc3NNb25pdG9yIGdldEluc3RhbmNlKCkgewotCXJldHVybiBzaW5nbGV0b247Ci19Ci1wdWJsaWMgdm9pZCBpbnRlcm5hbFdvcmtlZChkb3VibGUgd29yaykgewotfQotLyoqCi0gKiBAc2VlIElQcm9ncmVzc01vbml0b3IjaXNDYW5jZWxlZAotICovCi1wdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGVkKCkgewotCXJldHVybiAtLXRoaXMuaXNDYW5jZWxlZENvdW50ZXIgPCAwOwotfQotcHVibGljIHZvaWQgcmVzZXQoKSB7Ci19Ci0vKioKLSAqIEBzZWUgSVByb2dyZXNzTW9uaXRvciNzZXRDYW5jZWxlZAotICovCi1wdWJsaWMgdm9pZCBzZXRDYW5jZWxlZChib29sZWFuIGIpIHsKLX0KLS8qCi0gKiBTZXRzIHRoZSBudW1iZXIgb2YgdGltZSBpc0NhbmNlbGVkKCkgY2FuIGJlIGNhbGxlZCBiZWZvcmUgaXQgcmV0dXJucyB0cnVlLgotICovIAotcHVibGljIHZvaWQgc2V0Q2FuY2VsbGVkQ291bnRlcihpbnQgY291bnRlcikgewotCXRoaXMuaXNDYW5jZWxlZENvdW50ZXIgPSBjb3VudGVyOwotfQotLyoqCi0gKiBAc2VlIElQcm9ncmVzc01vbml0b3Ijc2V0VGFza05hbWUKLSAqLwotcHVibGljIHZvaWQgc2V0VGFza05hbWUoU3RyaW5nIG5hbWUpIHsKLX0KLS8qKgotICogQHNlZSBJUHJvZ3Jlc3NNb25pdG9yI3N1YlRhc2sKLSAqLwotcHVibGljIHZvaWQgc3ViVGFzayhTdHJpbmcgbmFtZSkgewotfQotLyoqCi0gKiBAc2VlIElQcm9ncmVzc01vbml0b3Ijd29ya2VkCi0gKi8KLXB1YmxpYyB2b2lkIHdvcmtlZChpbnQgd29yaykgewotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL1RocmVhZFNhZmV0eVRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvVGhyZWFkU2FmZXR5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEyOTQyOS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvVGhyZWFkU2FmZXR5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhUHJvamVjdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi0vKioKLSAqIERPIE5PVCBSRUxFQVNFIEFTIFBBUlQgT0YgUkVHUkVTU0lPTiBURVNUIC0gaWYgZmFpbGluZywgY2FuIGNhdXNlIHRlc3RpbmcgaGFuZwotICovCi1wdWJsaWMgY2xhc3MgVGhyZWFkU2FmZXR5VGVzdHMgZXh0ZW5kcyBNb2RpZnlpbmdSZXNvdXJjZVRlc3RzIHsKLQotcHVibGljIFRocmVhZFNhZmV0eVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQotCWlmIChmYWxzZSl7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBTdWl0ZShUaHJlYWRTYWZldHlUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBDbGFzc3BhdGhUZXN0cygidGVzdERlYWRsb2NrMDEiKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JcmV0dXJuIG5ldyBTdWl0ZShUaHJlYWRTYWZldHlUZXN0cy5jbGFzcyk7CQotfQotLyoqCi0gKiAzMzIzMSAtIGRlYWRsb2NrZWQgaWYgYWN0aXZhdGluZyBpbml0aWFsaXplciB3aGlsZSBzb21lIGNvbmN1cnJlbnQgYWN0aW9uIGlzIHBvcHVsYXRpbmcgdGhlIEphdmFNb2RlbAotICovCi1wdWJsaWMgdm9pZCB0ZXN0RGVhZGxvY2swMSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCVN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBkZWFkbG9jayBzY2VuYXJpbyIpOwotCXRyeSB7Ci0JCWZpbmFsIElKYXZhUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgKLQkJCQkiUCIsIAotCQkJCW5ldyBTdHJpbmdbXSB7fSwgCi0JCQkJbmV3IFN0cmluZ1tdIHsib3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwuVEVTVF9DT05UQUlORVIifSwgCi0JCQkJIiIpOwotCQkKLQkJLy8gc2ltdWxhdGUgc3RhdGUgb24gc3RhcnR1cCAoZmx1c2ggY29udGFpbmVycywgYW5kIGRpc2NhcmQgdGhlaXIgcHJldmlvdXMgdmFsdWVzKQotCQlwcm9qZWN0LmdldEphdmFNb2RlbCgpLmNsb3NlKCk7Ci0JCUphdmFNb2RlbE1hbmFnZXIuUHJldmlvdXNTZXNzaW9uQ29udGFpbmVycyA9IG5ldyBIYXNoTWFwKDUpOwotCQlKYXZhTW9kZWxNYW5hZ2VyLkNvbnRhaW5lcnMgPSBuZXcgSGFzaE1hcCg1KTsKLQkJSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkucmVtb3ZlUGVyUHJvamVjdEluZm8oKEphdmFQcm9qZWN0KXByb2plY3QpOwotCi0JCS8vIHVzZSBhIHRocmVhZCB0byBob2xkIHRoZSBsb2NrLCBzbyBhcyB0byByZWNyZWF0ZSBwb3RlbnRpYWwgZGVhZGxvY2sgc2l0dWF0aW9uCi0JCWZpbmFsIFNlbWFwaG9yZSBzdGVwMSA9IG5ldyBTZW1hcGhvcmUoIjwxOnBlcm1pc3Npb24gdG8gcG9wdWxhdGUgSmF2YU1vZGVsIGluZHVjaW5nIGNvbnRhaW5lcnMgaW5pdHM+IiwgMCk7IC8vIGZpcnN0IGFjcXVpc2l0aW9uIHdpbGwgd2FpdAotCQlmaW5hbCBTZW1hcGhvcmUgc3RlcDIgPSBuZXcgU2VtYXBob3JlKCI8MjpwZXJtaXNzaW9uIHRvIHBlcmZvcm0gcmVzb3VyY2UgbW9kaWZpY2F0aW9uID4iLCAwKTsgLy8gZmlyc3QgYWNxdWlzaXRpb24gdG8gd2FpdAotCQlmaW5hbCBTZW1hcGhvcmUgaGFzQ29tcGxldGVkID0gbmV3IFNlbWFwaG9yZSgwKTsgCi0JCQotCQlDb250YWluZXJJbml0aWFsaXplci5zZXRJbml0aWFsaXplcihuZXcgQ2xhc3NwYXRoSW5pdGlhbGl6ZXJUZXN0cy5EZWZhdWx0Q29udGFpbmVySW5pdGlhbGl6ZXIobmV3IFN0cmluZ1tdIHsiUCIsICIifSl7Ci0JCQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKElQYXRoIGNvbnRhaW5lclBhdGgsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCXN0ZXAyLnJlbGVhc2UoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSArICIgaW5pdGlhbGl6ZXIgaGFzIHN0YXJ0ZWQ6IGF0dGVtcHRpbmcgdG8gYWNxdWlyZSB3b3Jrc3BhY2UgbG9jayIpOwotCQkJCXN1cGVyLmluaXRpYWxpemUoY29udGFpbmVyUGF0aCwgamF2YVByb2plY3QpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiBpbml0aWFsaXplciBoYXMgZmluaXNoZWQiKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gdHJpZ2dlciBzb21lIGRlbHRhIG5vdGlmaWNhdGlvbiBpbiBkaWZmZXJlbnQgdGhyZWFkCi0JCVRocmVhZCBwZXJmb3JtSmF2YU9wZXJhdGlvbkluc2lkZVdvcmtzcGFjZUxvY2sgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiBnb3Qgd29ya3NwYWNlIGxvY2siKTsKLQkJCQkJCQkJc3RlcDEucmVsZWFzZSgpOwotCQkJCQkJCQlzdGVwMi5hY3F1aXJlKCk7IC8vIGVuc3VyZSB0aGUgamF2YSBtb2RlbCBsb2NrIGlzIHRha2VuCi0JCQkJCQkJCVRocmVhZFNhZmV0eVRlc3RzLnRoaXMuY3JlYXRlRmlsZSgiL1AvWC5qYXZhIiwgInB1YmxpYyBjbGFzcyBYIHt9Iik7Ci0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiBjcmVhdGVkIGZpbGUgWC5qYXZhIik7Ci0JCQkJCQkJfQotCQkJCQkJfSwgbnVsbCk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJCWhhc0NvbXBsZXRlZC5yZWxlYXNlKCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpICsiIFJlc291cmNlTW9kaWZpY2F0aW9uIERPTkUiKTsKLQkJCQl9Ci0JCQl9LCJNb2RpZnlSZXNvdXJjZSIpOwotCQlwZXJmb3JtSmF2YU9wZXJhdGlvbkluc2lkZVdvcmtzcGFjZUxvY2suc2V0RGFlbW9uKHRydWUpOwotCQlwZXJmb3JtSmF2YU9wZXJhdGlvbkluc2lkZVdvcmtzcGFjZUxvY2suc3RhcnQoKTsKLQotCQlUaHJlYWQgYXR0ZW1wdFBvcHVsYXRlVGhlSmF2YU1vZGVsID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKXsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQkJc3RlcDEuYWNxdWlyZSgpOyAvLyBlbnN1cmUgd29ya3NwYWNlIGxvY2sgaXMgdGFrZW4gYWxyZWFkeQotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiBhYm91dCB0byBwb3B1bGF0ZSBKYXZhIG1vZGVsIik7Ci0JCQkJCQkJLy8gbmVlZHMgdGhlIEphdmFNb2RlbCBsb2NrIHRvIHBvcHVsYXRlIHRoZSBwcm9qZWN0Ci0JCQkJCQkJcHJvamVjdC5nZXRDaGlsZHJlbigpOyAvLyB0cmlnZ2VyIGNsYXNzcGF0aCBpbml0aWFsaXplciBhY3RpdmF0aW9uIChyZXF1aXJlcyB3b3Jrc3BhY2UgbG9jaykKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSArICIgZG9uZSBwb3B1bGF0aW5nIHRoZSBtb2RlbCIpOwotCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJCWhhc0NvbXBsZXRlZC5yZWxlYXNlKCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpICsiIFBvcHVsYXRlIEphdmFNb2RlbCBET05FIik7Ci0JCQkJfQotCQkJfSwiUG9wdWxhdGVNb2RlbCIpOwotCQlhdHRlbXB0UG9wdWxhdGVUaGVKYXZhTW9kZWwuc2V0RGFlbW9uKHRydWUpOwotCQlhdHRlbXB0UG9wdWxhdGVUaGVKYXZhTW9kZWwuc3RhcnQoKTsKLQotCQloYXNDb21wbGV0ZWQuYWNxdWlyZSgpOyAvLyBlbnN1cmUgYm90aCBhY3Rpb25zIGRpZCBjb21wbGV0ZQotCQloYXNDb21wbGV0ZWQuYWNxdWlyZSgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNVQ0NFU1MgLSBubyBkZWFkbG9jayBlbmNvdW50ZXJlZCIpOwotCX0gZmluYWxseSB7Ci0JCS8vIGNsZWFudXAgIAotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvblRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYjhlNWIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL1R5cGVIaWVyYXJjaHlOb3RpZmljYXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotCi1wdWJsaWMgY2xhc3MgVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvblRlc3RzIGV4dGVuZHMgTW9kaWZ5aW5nUmVzb3VyY2VUZXN0cyBpbXBsZW1lbnRzIElUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyIHsKLQkvKioKLQkgKiBXaGV0aGVyIHdlIHJlY2VpdmVkIG5vdGlmaWNhdGlvbiBvZiBjaGFuZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGFuZ2VSZWNlaXZlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGhpZXJhcmNoeSB3ZSByZWNlaXZlZCBjaGFuZ2UgZm9yCi0JICovCi0JcHJvdGVjdGVkIElUeXBlSGllcmFyY2h5IGhpZXJhcmNoeSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIG5vdGlmaWNhdGlvbnMKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IG5vdGlmaWNhdGlvbnMgPSAwOwotCi1wdWJsaWMgVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0vKioKLSAqIE1ha2Ugc3VyZSB0aGF0IG9uZSBjaGFuZ2UgaGFzIGJlZW4gcmVjZWl2ZWQgZm9yIHRoZSBnaXZlbiBoaWVyYXJjaHkuCi0gKi8KLXByaXZhdGUgdm9pZCBhc3NlcnRPbmVDaGFuZ2UoSVR5cGVIaWVyYXJjaHkgaCkgewotCWFzc2VydFRydWUoIlNob3VsZCByZWNlaXZlIGNoYW5nZSIsIHRoaXMuY2hhbmdlUmVjZWl2ZWQpOwotCWFzc2VydFRydWUoIkNoYW5nZSBzaG91bGQgYmUgZm9yIHRoaXMgaGllcmFyY2h5IiwgdGhpcy5oaWVyYXJjaHkgPT0gaCk7Ci0JYXNzZXJ0VHJ1ZSgiU2hvdWxkIGJlIG9uZSBub3RpZmljYXRpb24iLCB0aGlzLm5vdGlmaWNhdGlvbnMgPT0gMSk7Ci19Ci1wcml2YXRlIHZvaWQgYWRkU3VwZXIoSUNvbXBpbGF0aW9uVW5pdCB1bml0LCBTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBuZXdTdXBlcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjb3B5ID0gKElDb21waWxhdGlvblVuaXQpdW5pdC5nZXRXb3JraW5nQ29weSgpOwotCUlUeXBlIHR5cGUgPSBjb3B5LmdldFR5cGVzKClbMF07Ci0JU3RyaW5nIHNvdXJjZSA9IHR5cGUuZ2V0U291cmNlKCk7Ci0JaW50IHN1cGVySW5kZXggPSAtMTsKLQlTdHJpbmcgbmV3U291cmNlID0gCi0JCXNvdXJjZS5zdWJzdHJpbmcoMCwgKHN1cGVySW5kZXggPSBzb3VyY2UuaW5kZXhPZih0eXBlTmFtZSkgKyB0eXBlTmFtZS5sZW5ndGgoKSkpICsKLQkJIiBleHRlbmRzICIgKwotCQluZXdTdXBlciArCi0JCXNvdXJjZS5zdWJzdHJpbmcoc3VwZXJJbmRleCk7Ci0JdHlwZS5kZWxldGUodHJ1ZSwgbnVsbCk7Ci0JY29weS5jcmVhdGVUeXBlKG5ld1NvdXJjZSwgbnVsbCwgdHJ1ZSwgbnVsbCk7Ci0JY29weS5jb21taXQodHJ1ZSwgbnVsbCk7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBjaGFuZ2VTdXBlcihJQ29tcGlsYXRpb25Vbml0IHVuaXQsIFN0cmluZyBleGlzdGluZ1N1cGVyLCBTdHJpbmcgbmV3U3VwZXIpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlDb21waWxhdGlvblVuaXQgY29weSA9IChJQ29tcGlsYXRpb25Vbml0KXVuaXQuZ2V0V29ya2luZ0NvcHkoKTsKLQlJVHlwZSB0eXBlID0gY29weS5nZXRUeXBlcygpWzBdOwotCVN0cmluZyBzb3VyY2UgPSB0eXBlLmdldFNvdXJjZSgpOwotCWludCBzdXBlckluZGV4ID0gLTE7Ci0JU3RyaW5nIG5ld1NvdXJjZSA9IAotCQlzb3VyY2Uuc3Vic3RyaW5nKDAsIChzdXBlckluZGV4ID0gc291cmNlLmluZGV4T2YoIiAiICsgZXhpc3RpbmdTdXBlcikpKSArCi0JCSIgIiArCi0JCW5ld1N1cGVyICsKLQkJc291cmNlLnN1YnN0cmluZyhzdXBlckluZGV4ICsgZXhpc3RpbmdTdXBlci5sZW5ndGgoKSArIDEgLypzcGFjZSovKTsKLQl0eXBlLmRlbGV0ZSh0cnVlLCBudWxsKTsKLQljb3B5LmNyZWF0ZVR5cGUobmV3U291cmNlLCBudWxsLCB0cnVlLCBudWxsKTsKLQljb3B5LmNvbW1pdCh0cnVlLCBudWxsKTsKLX0KLXByb3RlY3RlZCB2b2lkIGNoYW5nZVZpc2liaWxpdHkoSUNvbXBpbGF0aW9uVW5pdCB1bml0LCBTdHJpbmcgZXhpc3RpbmdNb2RpZmllciwgU3RyaW5nIG5ld01vZGlmaWVyKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJQ29tcGlsYXRpb25Vbml0IGNvcHkgPSAoSUNvbXBpbGF0aW9uVW5pdCl1bml0LmdldFdvcmtpbmdDb3B5KCk7Ci0JSVR5cGUgdHlwZSA9IGNvcHkuZ2V0VHlwZXMoKVswXTsKLQlTdHJpbmcgc291cmNlID0gdHlwZS5nZXRTb3VyY2UoKTsKLQlpbnQgbW9kaWZpZXJJbmRleCA9IC0xOwotCVN0cmluZyBuZXdTb3VyY2UgPSAKLQkJc291cmNlLnN1YnN0cmluZygwLCAobW9kaWZpZXJJbmRleCA9IHNvdXJjZS5pbmRleE9mKGV4aXN0aW5nTW9kaWZpZXIpKSkgKwotCQkiICIgKwotCQluZXdNb2RpZmllciArCi0JCXNvdXJjZS5zdWJzdHJpbmcobW9kaWZpZXJJbmRleCArIGV4aXN0aW5nTW9kaWZpZXIubGVuZ3RoKCkpOwotCXR5cGUuZGVsZXRlKHRydWUsIG51bGwpOwotCWNvcHkuY3JlYXRlVHlwZShuZXdTb3VyY2UsIG51bGwsIHRydWUsIG51bGwpOwotCWNvcHkuY29tbWl0KHRydWUsIG51bGwpOwotfQotLyoqCi0gKiBSZXNldCB0aGUgZmxhZ3MgdGhhdCB3YXRjaCBub3RpZmljYXRpb24uCi0gKi8KLXByaXZhdGUgdm9pZCByZXNldCgpIHsKLQl0aGlzLmNoYW5nZVJlY2VpdmVkID0gZmFsc2U7Ci0JdGhpcy5oaWVyYXJjaHkgPSBudWxsOwotCXRoaXMubm90aWZpY2F0aW9ucyA9IDA7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCXN1cGVyLnNldFVwKCk7Ci0JdGhpcy5yZXNldCgpOwotCXRoaXMuc2V0VXBKYXZhUHJvamVjdCgiVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbiIpOwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCXJldHVybiBuZXcgU3VpdGUoVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvblRlc3RzLmNsYXNzKTsKLX0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JdGhpcy5kZWxldGVQcm9qZWN0KCJUeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uIik7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotLyoqCi0gKiBXaGVuIGEgQ1UgaXMgYWRkZWQgdGhlIHR5cGUgaGllcmFyY2h5IHNob3VsZCBjaGFuZ2UKLSAqIG9ubHkgaWYgb25lIG9mIHRoZSB0eXBlcyBvZiB0aGUgQ1UgaXMgcGFydCBvZiB0aGUgIAotICogdHlwZSBoaWVyYXJjaHkuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RBZGRDb21waWxhdGlvblVuaXQxKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBnZXRKYXZhUHJvamVjdCgiVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbiIpOwotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlR5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24iLCAic3JjIiwgInAiLCAiWC5qYXZhIik7Ci0JSVR5cGUgdHlwZT0gY3UuZ2V0VHlwZSgiWCIpOwotCUlUeXBlSGllcmFyY2h5IGggPSB0eXBlLm5ld1R5cGVIaWVyYXJjaHkoamF2YVByb2plY3QsIG51bGwpOwotCWguYWRkVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQotCS8vIGEgY3Ugd2l0aCBubyB0eXBlcyBwYXJ0IG9mIHRoZSBoaWVyYXJjaHkKLQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IGdldFBhY2thZ2VGcmFnbWVudCgiVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbiIsICJzcmMiLCAicCIpOwotCUlDb21waWxhdGlvblVuaXQgbmV3Q1UxID0gcGtnLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgKLQkJIloxLmphdmEiLCAKLQkJInBhY2thZ2UgcDtcbiIgKwotCQkiXG4iICsKLQkJInB1YmxpYyBjbGFzcyBaMSB7XG4iICsKLQkJIlxuIiArCi0JCSIJcHVibGljIHN0YXRpYyBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKwotCQkiCQlTeXN0ZW0ub3V0LnByaW50bG4oXCJIZWxsb1dvcmxkXCIpO1xuIiArCi0JCSIJfVxuIiArCi0JCSJ9XG4iLCAKLQkJZmFsc2UsIAotCQludWxsKTsKLQl0cnkgewotCQlhc3NlcnRDcmVhdGlvbihuZXdDVTEpOwotCQlhc3NlcnRUcnVlKCJTaG91bGQgbm90IHJlY2VpdmUgY2hhbmdlIiwgIXRoaXMuY2hhbmdlUmVjZWl2ZWQpOwotCX0gZmluYWxseSB7Ci0JCS8vIGNsZWFudXAJCi0JCWgucmVtb3ZlVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQl9Ci19CQotLyoqCi0gKiBXaGVuIGEgQ1UgaXMgYWRkZWQgdGhlIHR5cGUgaGllcmFyY2h5IHNob3VsZCBjaGFuZ2UKLSAqIG9ubHkgaWYgb25lIG9mIHRoZSB0eXBlcyBvZiB0aGUgQ1UgaXMgcGFydCBvZiB0aGUgIAotICogdHlwZSBoaWVyYXJjaHkuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RBZGRDb21waWxhdGlvblVuaXQyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBnZXRKYXZhUHJvamVjdCgiVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbiIpOwotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlR5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24iLCAic3JjIiwgInAiLCAiWC5qYXZhIik7Ci0JSVR5cGUgdHlwZT0gY3UuZ2V0VHlwZSgiWCIpOwotCUlUeXBlSGllcmFyY2h5IGggPSB0eXBlLm5ld1R5cGVIaWVyYXJjaHkoamF2YVByb2plY3QsIG51bGwpOwotCWguYWRkVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQotCS8vIGEgY3Ugd2l0aCBhIHRvcCBsZXZlbCB0eXBlIHdoaWNoIGlzIHBhcnQgb2YgdGhlIGhpZXJhcmNoeQotCUlQYWNrYWdlRnJhZ21lbnQgcGtnID0gZ2V0UGFja2FnZUZyYWdtZW50KCJUeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uIiwgInNyYyIsICJwIik7Ci0JSUNvbXBpbGF0aW9uVW5pdCBuZXdDVTIgPSBwa2cuY3JlYXRlQ29tcGlsYXRpb25Vbml0KAotCQkiWjIuamF2YSIsIAotCQkicGFja2FnZSBwO1xuIiArCi0JCSJcbiIgKwotCQkicHVibGljIGNsYXNzIFoyIGV4dGVuZHMgZS5FIHtcbiIgKwotCQkifVxuIiwgIAotCQlmYWxzZSwgCi0JCW51bGwpOwotCXRyeSB7Ci0JCWFzc2VydENyZWF0aW9uKG5ld0NVMik7Ci0JCXRoaXMuYXNzZXJ0T25lQ2hhbmdlKGgpOwotCQloLnJlZnJlc2gobnVsbCk7Ci0JCUlUeXBlIGVFID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJUeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uIiwgInNyYyIsICJlIiwgIkUuamF2YSIpLmdldFR5cGUoIkUiKTsKLQkJSVR5cGVbXSBzdWJ0eXBlcyA9IGguZ2V0U3VidHlwZXMoZUUpOwotCQlhc3NlcnRUcnVlKCJTaG91bGQgYmUgb25lIHN1YnR5cGUgb2YgZS5FIiwgc3VidHlwZXMubGVuZ3RoID09IDEpOwotCQlhc3NlcnRFcXVhbHMoIlN1YnR5cGUgb2YgZS5FIHNob3VsZCBiZSBwLloyIiwgbmV3Q1UyLmdldFR5cGUoIloyIiksIHN1YnR5cGVzWzBdKTsKLQl9IGZpbmFsbHkgewotCQkvLyBjbGVhbnVwCQotCQloLnJlbW92ZVR5cGVIaWVyYXJjaHlDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JfQotfQotLyoqCi0gKiBXaGVuIGEgQ1UgaXMgYWRkZWQgdGhlIHR5cGUgaGllcmFyY2h5IHNob3VsZCBjaGFuZ2UKLSAqIG9ubHkgaWYgb25lIG9mIHRoZSB0eXBlcyBvZiB0aGUgQ1UgaXMgcGFydCBvZiB0aGUgIAotICogdHlwZSBoaWVyYXJjaHkuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RBZGRDb21waWxhdGlvblVuaXQzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBnZXRKYXZhUHJvamVjdCgiVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbiIpOwotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlR5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24iLCAic3JjIiwgInAiLCAiWC5qYXZhIik7Ci0JSVR5cGUgdHlwZT0gY3UuZ2V0VHlwZSgiWCIpOwotCUlUeXBlSGllcmFyY2h5IGggPSB0eXBlLm5ld1R5cGVIaWVyYXJjaHkoamF2YVByb2plY3QsIG51bGwpOwotCWguYWRkVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQotCS8vIGEgY3Ugd2l0aCBhbiBpbm5lciB0eXBlIHdoaWNoIGlzIHBhcnQgb2YgdGhlIGhpZXJhcmNoeQotCUlQYWNrYWdlRnJhZ21lbnQgcGtnID0gZ2V0UGFja2FnZUZyYWdtZW50KCJUeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uIiwgInNyYyIsICJwIik7Ci0JSUNvbXBpbGF0aW9uVW5pdCBuZXdDVTMgPSBwa2cuY3JlYXRlQ29tcGlsYXRpb25Vbml0KAotCQkiWjMuamF2YSIsIAotCQkicGFja2FnZSBwO1xuIiArCi0JCSJcbiIgKwotCQkicHVibGljIGNsYXNzIFozIHtcbiIgKwotCQkiICBwdWJsaWMgY2xhc3MgSW5uZXJaIGV4dGVuZHMgZC5EIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn1cbiIsICAKLQkJZmFsc2UsIAotCQludWxsKTsKLQl0cnkgewotCQlhc3NlcnRDcmVhdGlvbihuZXdDVTMpOwotCQl0aGlzLmFzc2VydE9uZUNoYW5nZShoKTsKLQkJaC5yZWZyZXNoKG51bGwpOwotCQlJVHlwZSBkRCA9IGdldENvbXBpbGF0aW9uVW5pdCgiVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbiIsICJzcmMiLCAiZCIsICJELmphdmEiKS5nZXRUeXBlKCJEIik7Ci0JCUlUeXBlW10gc3VidHlwZXMgPSBoLmdldFN1YnR5cGVzKGREKTsKLQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIGJlIG9uZSBzdWJ0eXBlIG9mIGQuRCIsIHN1YnR5cGVzLmxlbmd0aCA9PSAxKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdWJ0eXBlIG9mIGQuRCBzaG91bGQgYmUgcC5aMy5Jbm5lcloiLCBuZXdDVTMuZ2V0VHlwZSgiWjMiKS5nZXRUeXBlKCJJbm5lcloiKSwgc3VidHlwZXNbMF0pOwotCX0gZmluYWxseSB7Ci0JCS8vIGNsZWFudXAJCi0JCWgucmVtb3ZlVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQl9Ci19Ci0vKioKLSAqIFdoZW4gYSBDVSBpcyBhZGRlZCwgaWYgdGhlIHR5cGUgaGllcmFyY2h5IGRvZXNuJ3QgaGF2ZSBhIGZvY3VzLCBpdCBzaG91bGQgY2hhbmdlCi0gKiBvbmx5IGlmIG9uZSBvZiB0aGUgdHlwZXMgb2YgdGhlIENVIGlzIHBhcnQgb2YgdGhlIHJlZ2lvbi4KLSAqLwotcHVibGljIHZvaWQgdGVzdEFkZENvbXBpbGF0aW9uVW5pdEluUmVnaW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IGdldEphdmFQcm9qZWN0KCJUeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uIik7Ci0JSVJlZ2lvbiByZWdpb24gPSBKYXZhQ29yZS5uZXdSZWdpb24oKTsKLQlyZWdpb24uYWRkKGphdmFQcm9qZWN0KTsKLQlJVHlwZUhpZXJhcmNoeSBoID0gamF2YVByb2plY3QubmV3VHlwZUhpZXJhcmNoeShyZWdpb24sIG51bGwpOwotCWguYWRkVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQotCXRyeSB7Ci0JCXNldFVwSmF2YVByb2plY3QoIlR5cGVIaWVyYXJjaHlEZXBlbmRlbnQiKTsKLQkJLy8gYSBjdSB3aXRoIG5vIHR5cGVzIHBhcnQgb2YgdGhlIHJlZ2lvbgotCQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IGdldFBhY2thZ2VGcmFnbWVudCgiVHlwZUhpZXJhcmNoeURlcGVuZGVudCIsICIiLCAiIik7Ci0JCUlDb21waWxhdGlvblVuaXQgbmV3Q1UxID0gcGtnLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgKLQkJCSJaMS5qYXZhIiwgCi0JCQkiXG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgWjEge1xuIiArCi0JCQkiXG4iICsKLQkJCSIJcHVibGljIHN0YXRpYyBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiIgKwotCQkJIgkJU3lzdGVtLm91dC5wcmludGxuKFwiSGVsbG9Xb3JsZFwiKTtcbiIgKwotCQkJIgl9XG4iICsKLQkJCSJ9XG4iLCAKLQkJCWZhbHNlLCAKLQkJCW51bGwpOwotCQl0cnkgewotCQkJYXNzZXJ0Q3JlYXRpb24obmV3Q1UxKTsKLQkJCWFzc2VydFRydWUoIlNob3VsZCBub3QgcmVjZWl2ZSBjaGFuZ2UiLCAhdGhpcy5jaGFuZ2VSZWNlaXZlZCk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyBjbGVhbnVwCQotCQkJZGVsZXRlUmVzb3VyY2UobmV3Q1UxLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpKTsKLQkJCXRoaXMucmVzZXQoKTsKLQkJfQotCQotCQkvLyBhIGN1IHdpdGggYSB0eXBlIHdoaWNoIGlzIHBhcnQgb2YgdGhlIHJlZ2lvbiBhbmQgaXMgYSBzdWJ0eXBlIG9mIGFuIGV4aXN0aW5nIHR5cGUgb2YgdGhlIHJlZ2lvbgotCQlwa2cgPSBnZXRQYWNrYWdlRnJhZ21lbnQoIlR5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24iLCAic3JjIiwgInAiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBuZXdDVTIgPSBwa2cuY3JlYXRlQ29tcGlsYXRpb25Vbml0KAotCQkJIloyLmphdmEiLCAKLQkJCSJwYWNrYWdlIHA7XG4iICsKLQkJCSJcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBaMiBleHRlbmRzIGUuRSB7XG4iICsKLQkJCSJ9XG4iLCAgCi0JCQlmYWxzZSwgCi0JCQludWxsKTsKLQkJdHJ5IHsKLQkJCWFzc2VydENyZWF0aW9uKG5ld0NVMik7Ci0JCQl0aGlzLmFzc2VydE9uZUNoYW5nZShoKTsKLQkJCWgucmVmcmVzaChudWxsKTsKLQkJCUlUeXBlIGVFID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJUeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uIiwgInNyYyIsICJlIiwgIkUuamF2YSIpLmdldFR5cGUoIkUiKTsKLQkJCUlUeXBlW10gc3VidHlwZXMgPSBoLmdldFN1YnR5cGVzKGVFKTsKLQkJCWFzc2VydFRydWUoIlNob3VsZCBiZSBvbmUgc3VidHlwZSBvZiBlLkUiLCBzdWJ0eXBlcy5sZW5ndGggPT0gMSk7Ci0JCQlhc3NlcnRFcXVhbHMoIlN1YnR5cGUgb2YgZS5FIHNob3VsZCBiZSBwLloyIiwgbmV3Q1UyLmdldFR5cGUoIloyIiksIHN1YnR5cGVzWzBdKTsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vIGNsZWFudXAJCi0JCQlkZWxldGVSZXNvdXJjZShuZXdDVTIuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkpOwotCQkJdGhpcy5yZXNldCgpOwotCQl9Ci0JCi0JCS8vIGEgY3Ugd2l0aCBhIHR5cGUgd2hpY2ggaXMgcGFydCBvZiB0aGUgcmVnaW9uIGFuZCBpcyBub3QgYSBzdWIgdHlwZSBvZiBhbiBleGlzdGluZyB0eXBlIG9mIHRoZSByZWdpb24KLQkJSUNvbXBpbGF0aW9uVW5pdCBuZXdDVTMgPSBwa2cuY3JlYXRlQ29tcGlsYXRpb25Vbml0KAotCQkJIlozLmphdmEiLCAKLQkJCSJwYWNrYWdlIHA7XG4iICsKLQkJCSJcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBaMyBleHRlbmRzIFRocm93YWJsZSB7XG4iICsKLQkJCSJ9XG4iLCAgCi0JCQlmYWxzZSwgCi0JCQludWxsKTsKLQkJdHJ5IHsKLQkJCWFzc2VydENyZWF0aW9uKG5ld0NVMyk7Ci0JCQl0aGlzLmFzc2VydE9uZUNoYW5nZShoKTsKLQkJCWgucmVmcmVzaChudWxsKTsKLQkJCUlUeXBlIHRocm93YWJsZUNsYXNzID0gZ2V0Q2xhc3NGaWxlKCJUeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uIiwgZ2V0RXh0ZXJuYWxKQ0xQYXRoU3RyaW5nKCksICJqYXZhLmxhbmciLCAiVGhyb3dhYmxlLmNsYXNzIikuZ2V0VHlwZSgpOwotCQkJYXNzZXJ0RXF1YWxzKCJTdXBlcmNsYXNzIG9mIFozIHNob3VsZCBiZSBqYXZhLmxhbmcuVGhyb3dhYmxlIiwgdGhyb3dhYmxlQ2xhc3MsIGguZ2V0U3VwZXJjbGFzcyhuZXdDVTMuZ2V0VHlwZSgiWjMiKSkpOwotCQl9IGZpbmFsbHkgewotCQkJLy8gY2xlYW51cAkKLQkJCWRlbGV0ZVJlc291cmNlKG5ld0NVMy5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKSk7Ci0JCQl0aGlzLnJlc2V0KCk7Ci0JCX0KLQl9IGZpbmFsbHkgewotCQloLnJlbW92ZVR5cGVIaWVyYXJjaHlDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiVHlwZUhpZXJhcmNoeURlcGVuZGVudCIpOwotCX0KLX0KLS8qKgotICogV2hlbiBhIENVIGlzIGFkZGVkIGlmIHRoZSBDVSBkb2VzIG5vdCBpbnRlcnNlY3RzIHBhY2thZ2UgZnJhZ21lbnRzIGluIHRoZSB0eXBlIGhpZXJhcmNoeSwgCi0gKiB0aGUgdHlwZWhpZXJhcmNoeSBoYXMgbm90IGNoYW5nZWQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RBZGRFeHRlcm5hbENvbXBpbGF0aW9uVW5pdCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBnZXRKYXZhUHJvamVjdCgiVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbiIpOwotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlR5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24iLCAic3JjIiwgInAiLCAiWC5qYXZhIik7Ci0JSVR5cGUgdHlwZT0gY3UuZ2V0VHlwZSgiWCIpOwotCUlUeXBlSGllcmFyY2h5IGggPSB0eXBlLm5ld1R5cGVIaWVyYXJjaHkoamF2YVByb2plY3QsIG51bGwpOwotCWguYWRkVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkKLQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IGdldFBhY2thZ2VGcmFnbWVudCgiVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbiIsICJzcmMiLCAicC5vdGhlciIpOwotCUlDb21waWxhdGlvblVuaXQgbmV3Q1U9IHBrZy5jcmVhdGVDb21waWxhdGlvblVuaXQoCi0JCSJaLmphdmEiLCAKLQkJInBhY2thZ2UgcC5vdGhlcjtcbiIgKwotCQkiXG4iICsKLQkJInB1YmxpYyBjbGFzcyBaIHtcbiIgKwotCQkiXG4iICsKLQkJIglwdWJsaWMgc3RhdGljIG1haW4oU3RyaW5nW10gYXJncykge1xuIiArCi0JCSIJCVN5c3RlbS5vdXQucHJpbnRsbihcIkhlbGxvV29ybGRcIik7XG4iICsKLQkJIgl9XG4iICsKLQkJIn1cbiIsIAotCQlmYWxzZSwgCi0JCW51bGwpOwotCXRyeSB7Ci0JCWFzc2VydENyZWF0aW9uKG5ld0NVKTsKLQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIG5vdCByZWNlaXZlIGNoYW5nZXMiLCAhdGhpcy5jaGFuZ2VSZWNlaXZlZCk7Ci0JfSBmaW5hbGx5IHsKLQkJLy8gY2xlYW51cAkKLQkJZGVsZXRlUmVzb3VyY2UobmV3Q1UuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkpOwotCQloLnJlbW92ZVR5cGVIaWVyYXJjaHlDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JfQotfQotLyoqCi0gKiBXaGVuIGEgcGFja2FnZSBpcyBhZGRlZCBpbiBhbiBleHRlcm5hbCBwcm9qZWN0LCB0aGUgdHlwZSBoaWVyYXJjaHkgc2hvdWxkIG5vdCBjaGFuZ2UKLSAqLwotcHVibGljIHZvaWQgdGVzdEFkZEV4dGVybmFsUGFja2FnZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBnZXRKYXZhUHJvamVjdCgiVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbiIpOwotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlR5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24iLCAic3JjIiwgInAiLCAiWC5qYXZhIik7Ci0JSVR5cGUgdHlwZT0gY3UuZ2V0VHlwZSgiWCIpOwotCUlUeXBlSGllcmFyY2h5IGggPSB0eXBlLm5ld1R5cGVIaWVyYXJjaHkoamF2YVByb2plY3QsIG51bGwpOwotCi0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiT3RoZXIiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQotCQloLmFkZFR5cGVIaWVyYXJjaHlDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCi0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3Q9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoIk90aGVyIiwgInNyYyIpOwotCQlJUGFja2FnZUZyYWdtZW50IGZyYWc9IHJvb3QuY3JlYXRlUGFja2FnZUZyYWdtZW50KCJhLmRheS5pbi5zcGFpbiIsIGZhbHNlLCBudWxsKTsKLQkJdHJ5IHsKLQkJCWFzc2VydENyZWF0aW9uKGZyYWcpOwotCQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIG5vdCByZWNlaXZlIGNoYW5nZXMiLCAhdGhpcy5jaGFuZ2VSZWNlaXZlZCk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyBjbGVhbnVwCQotCQkJZnJhZy5kZWxldGUodHJ1ZSwgbnVsbCk7Ci0JCQl0aGlzLnJlc2V0KCk7Ci0JIAl9Ci0JfSBmaW5hbGx5IHsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJPdGhlciIpOwkKLQkJaC5yZW1vdmVUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCX0KLX0KLS8qKgotICogV2hlbiBhIHByb2plY3QgaXMgYWRkZWQgdGhhdCBpcyBub3Qgb24gdGhlIGNsYXNzIHBhdGggb2YgdGhlIHR5cGUgaGllcmFyY2h5IHByb2plY3QsCi0gKiB0aGUgdHlwZSBoaWVyYXJjaHkgc2hvdWxkIG5vdCBjaGFuZ2UuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RBZGRFeHRlcm5hbFByb2plY3QoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JSUphdmFQcm9qZWN0IHByb2plY3Q9IGdldEphdmFQcm9qZWN0KCJUeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uIik7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbiIsICJzcmMiLCAicCIsICJYLmphdmEiKTsKLQlJVHlwZSB0eXBlID0gY3UuZ2V0VHlwZSgiWCIpOwotCUlUeXBlSGllcmFyY2h5IGggPSB0eXBlLm5ld1R5cGVIaWVyYXJjaHkocHJvamVjdCwgbnVsbCk7Ci0JaC5hZGRUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCi0JcHJvamVjdC5nZXRKYXZhTW9kZWwoKS5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCgiTmV3UHJvamVjdCIpLmNyZWF0ZShudWxsKTsKLQl0cnkgewotCQlhc3NlcnRUcnVlKCJTaG91bGQgbm90IHJlY2VpdmUgY2hhbmdlIiwgIXRoaXMuY2hhbmdlUmVjZWl2ZWQpOwotCX0gZmluYWxseSB7Ci0JCS8vIGNsZWFudXAKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJOZXdQcm9qZWN0Iik7Ci0JCWgucmVtb3ZlVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQl9Ci19Ci0vKioKLSAqIFRlc3QgYWRkaW5nIHRoZSBzYW1lIGxpc3RlbmVyIHR3aWNlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0QWRkTGlzdGVuZXJUd2ljZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQlJSmF2YVByb2plY3QgcHJvamVjdCA9IGdldEphdmFQcm9qZWN0KCJUeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uIik7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbiIsICJzcmMiLCAicCIsICJYLmphdmEiKTsKLQlJQ29tcGlsYXRpb25Vbml0IHN1cGVyQ1UgPSBnZXRDb21waWxhdGlvblVuaXQoIlR5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24iLCAic3JjIiwgImIiLCAiQi5qYXZhIik7Ci0JSVR5cGUgdHlwZSA9IGN1LmdldFR5cGUoIlgiKTsKLQlJVHlwZUhpZXJhcmNoeSBoID0gdHlwZS5uZXdUeXBlSGllcmFyY2h5KHByb2plY3QsIG51bGwpOwotCi0JLy8gYWRkIGxpc3RlbmVyIHR3aWNlCi0JaC5hZGRUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCWguYWRkVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkKLQlJRmlsZSBmaWxlID0gKElGaWxlKSBzdXBlckNVLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCXRyeSB7Ci0JCWRlbGV0ZVJlc291cmNlKGZpbGUpOwotCQl0aGlzLmFzc2VydE9uZUNoYW5nZShoKTsKLQl9IGZpbmFsbHkgewotCQloLnJlbW92ZVR5cGVIaWVyYXJjaHlDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JfQotfQotLyoqCi0gKiBXaGVuIGEgcGFja2FnZSBpcyBhZGRlZCwgdGhlIHR5cGUgaGllcmFyY2h5IHNob3VsZCBjaGFuZ2UKLSAqLwotcHVibGljIHZvaWQgdGVzdEFkZFBhY2thZ2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QoIlR5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24iKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJUeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uIiwgInNyYyIsICJwIiwgIlguamF2YSIpOwotCUlUeXBlIHR5cGU9IGN1LmdldFR5cGUoIlgiKTsKLQlJVHlwZUhpZXJhcmNoeSBoID0gdHlwZS5uZXdUeXBlSGllcmFyY2h5KGphdmFQcm9qZWN0LCBudWxsKTsKLQloLmFkZFR5cGVIaWVyYXJjaHlDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0KLQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290PSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCJUeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uIiwgInNyYyIpOwotCUlQYWNrYWdlRnJhZ21lbnQgZnJhZz0gcm9vdC5jcmVhdGVQYWNrYWdlRnJhZ21lbnQoIm9uZS50d28udGhyZWUiLCBmYWxzZSwgbnVsbCk7Ci0JdHJ5IHsKLQkJYXNzZXJ0Q3JlYXRpb24oZnJhZyk7Ci0JCXRoaXMuYXNzZXJ0T25lQ2hhbmdlKGgpOwotCX0gZmluYWxseSB7Ci0JCS8vIGNsZWFudXAJCi0JCWgucmVtb3ZlVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQl9Ci19Ci0vKioKLSAqIFdoZW4gYSBwYWNrYWdlIGZyYWdtZW50IHJvb3QgaXMgYWRkZWQsIHRoZSB0eXBlIGhpZXJhcmNoeSBzaG91bGQgY2hhbmdlCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RBZGRQYWNrYWdlRnJhZ21lbnRSb290KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QoIlR5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24iKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJUeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uIiwgInNyYyIsICJwIiwgIlguamF2YSIpOwotCUlUeXBlIHR5cGU9IGN1LmdldFR5cGUoIlgiKTsKLQlJVHlwZUhpZXJhcmNoeSBoID0gdHlwZS5uZXdUeXBlSGllcmFyY2h5KHByb2plY3QsIG51bGwpOwotCWguYWRkVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQotCS8vIHByZXBhcmUgYSBjbGFzc3BhdGggZW50cnkgZm9yIHRoZSBuZXcgcm9vdAotCUlDbGFzc3BhdGhFbnRyeVtdIG9yaWdpbmFsQ1A9IHByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JSUNsYXNzcGF0aEVudHJ5IG5ld0VudHJ5PSBKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShwcm9qZWN0LmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpLmFwcGVuZCgiZXh0cmEiKSk7Ci0JSUNsYXNzcGF0aEVudHJ5W10gbmV3Q1A9IG5ldyBJQ2xhc3NwYXRoRW50cnlbb3JpZ2luYWxDUC5sZW5ndGggKyAxXTsKLQlTeXN0ZW0uYXJyYXljb3B5KG9yaWdpbmFsQ1AsIDAgLCBuZXdDUCwgMCwgb3JpZ2luYWxDUC5sZW5ndGgpOwotCW5ld0NQW29yaWdpbmFsQ1AubGVuZ3RoXT0gbmV3RW50cnk7Ci0KLQl0cnkgewotCQkvLyBzZXQgbmV3IGNsYXNzcGF0aAotCQlwcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXdDUCwgbnVsbCk7Ci0KLQkJLy8gbm93IGNyZWF0ZSB0aGUgYWN0dWFsIHJlc291cmNlIGZvciB0aGUgcm9vdCBhbmQgcG9wdWxhdGUgaXQKLQkJdGhpcy5yZXNldCgpOwotCQlwcm9qZWN0LmdldFByb2plY3QoKS5nZXRGb2xkZXIoImV4dHJhIikuY3JlYXRlKGZhbHNlLCB0cnVlLCBudWxsKTsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3QgbmV3Um9vdD0gZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgiVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbiIsICJleHRyYSIpOwotCQlhc3NlcnRUcnVlKCJOZXcgcm9vdCBzaG91bGQgbm93IGJlIHZpc2libGUiLCBuZXdSb290ICE9IG51bGwpOwotCQl0aGlzLmFzc2VydE9uZUNoYW5nZShoKTsKLQl9IGZpbmFsbHkgewotCQloLnJlbW92ZVR5cGVIaWVyYXJjaHlDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JfQotfQotLyoqCi0gKiBXaGVuIGEgcHJvamVjdCBpcyBhZGRlZCB0aGF0IGlzIG9uIHRoZSBjbGFzcyBwYXRoIG9mIHRoZSB0eXBlIGhpZXJhcmNoeSBwcm9qZWN0LAotICogdGhlIHR5cGUgaGllcmFyY2h5IHNob3VsZCBjaGFuZ2UuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RBZGRQcm9qZWN0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCUlKYXZhUHJvamVjdCBwcm9qZWN0PSBnZXRKYXZhUHJvamVjdCgiVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbiIpOwotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlR5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24iLCAic3JjIiwgInAiLCAiWC5qYXZhIik7Ci0JSVR5cGUgdHlwZSA9IGN1LmdldFR5cGUoIlgiKTsKLQlJVHlwZUhpZXJhcmNoeSBoID0gdHlwZS5uZXdUeXBlSGllcmFyY2h5KHByb2plY3QsIG51bGwpOwotCWguYWRkVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQotCS8vIHByZXBhcmUgYSBuZXcgY2xhc3NwYXRoIGVudHJ5IGZvciB0aGUgbmV3IHByb2plY3QKLQlJQ2xhc3NwYXRoRW50cnlbXSBvcmlnaW5hbENQPSBwcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCUlDbGFzc3BhdGhFbnRyeSBuZXdFbnRyeT0gSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KG5ldyBQYXRoKCIvTmV3UHJvamVjdCIpLCBmYWxzZSk7Ci0JSUNsYXNzcGF0aEVudHJ5W10gbmV3Q1A9IG5ldyBJQ2xhc3NwYXRoRW50cnlbb3JpZ2luYWxDUC5sZW5ndGggKyAxXTsKLQlTeXN0ZW0uYXJyYXljb3B5KG9yaWdpbmFsQ1AsIDAgLCBuZXdDUCwgMCwgb3JpZ2luYWxDUC5sZW5ndGgpOwotCW5ld0NQW29yaWdpbmFsQ1AubGVuZ3RoXT0gbmV3RW50cnk7Ci0KLQlJUHJvamVjdCBuZXdQcm9qZWN0ID0gbnVsbDsKLQl0cnkgewotCQkvLyBzZXQgdGhlIG5ldyBjbGFzc3BhdGgKLQkJcHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q1AsIG51bGwpOwotCi0JCS8vIG5vdyBjcmVhdGUgdGhlIGFjdHVhbCByZXNvdXJjZSBmb3IgdGhlIHJvb3QgYW5kIHBvcHVsYXRlIGl0Ci0JCXRoaXMucmVzZXQoKTsKLQkJbmV3UHJvamVjdCA9IHByb2plY3QuZ2V0SmF2YU1vZGVsKCkuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoIk5ld1Byb2plY3QiKTsKLQkJbmV3UHJvamVjdC5jcmVhdGUobnVsbCk7Ci0JCW5ld1Byb2plY3Qub3BlbihudWxsKTsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IG5ld1Byb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ldyBTdHJpbmdbXSB7SmF2YUNvcmUuTkFUVVJFX0lEfSk7Ci0JCW5ld1Byb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotCQl0aGlzLmFzc2VydE9uZUNoYW5nZShoKTsKLQl9IGZpbmFsbHkgewotCQl0aGlzLmRlbGV0ZVByb2plY3QoIk5ld1Byb2plY3QiKTsKLQkJaC5yZW1vdmVUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCX0KLX0KLS8qKgotICogV2hlbiBhIGNsYXNzIGZpbGUgaXMgYWRkZWQgb3IgcmVtb3ZlZCBpZiB0aGUgY2xhc3MgZmlsZSBpbnRlcnNlY3RzIHBhY2thZ2UgZnJhZ21lbnRzIGluIHRoZSB0eXBlIGhpZXJhcmNoeSwKLSAqIHRoZSB0eXBlIGhpZXJhcmNoeSBoYXMgcG9zc2libHkgY2hhbmdlZCAocG9zc2libHkgaW50cm9kdWNlIGEgc3VwZXJ0eXBlKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlQ2xhc3NGaWxlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCS8vIENyZWF0ZSB0eXBlIGhpZXJhcmNoeSBvbiAnamF2YS5sYW5nLkxpbmthZ2VFcnJvcicgaW4gJ01pbmltYWwuemlwJwotCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QoIlR5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24iKTsKLQlJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIlR5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24iLCAic3JjIiwgInAiLCAiTXlFcnJvci5qYXZhIik7Ci0JSVR5cGUgdHlwZSA9IHVuaXQuZ2V0VHlwZSgiTXlFcnJvciIpOwotCUlUeXBlSGllcmFyY2h5IGggPSB0eXBlLm5ld1R5cGVIaWVyYXJjaHkocHJvamVjdCwgbnVsbCk7Ci0JaC5hZGRUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCi0JLy8gQ3JlYXRlICdwYXRjaCcgZm9sZGVyIGFuZCBhZGQgaXQgdG8gY2xhc3NwYXRoCi0JSUZvbGRlciBwYXRoRm9sZGVyID0gcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJwYXRjaCIpOwotCXBhdGhGb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOwotCUlDbGFzc3BhdGhFbnRyeSBuZXdFbnRyeSA9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShwYXRoRm9sZGVyLmdldEZ1bGxQYXRoKCksIG51bGwsIG51bGwsIGZhbHNlKTsKLQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGggPSBwcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0NsYXNzUGF0aCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbY2xhc3NwYXRoLmxlbmd0aCsxXTsKLQluZXdDbGFzc1BhdGhbMF0gPSBuZXdFbnRyeTsKLQlTeXN0ZW0uYXJyYXljb3B5KGNsYXNzcGF0aCwgMCwgbmV3Q2xhc3NQYXRoLCAxLCBjbGFzc3BhdGgubGVuZ3RoKTsKLQotCXRyeSB7Ci0JCS8vIFNldCBuZXcgY2xhc3NwYXRoCi0JCXNldENsYXNzcGF0aChwcm9qZWN0LCBuZXdDbGFzc1BhdGgpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlICdqYXZhLmxhbmcnIGluICdwYXRjaCcKLQkJSVBhY2thZ2VGcmFnbWVudCBwZiA9IHByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKVswXS5jcmVhdGVQYWNrYWdlRnJhZ21lbnQoImphdmEubGFuZyIsIGZhbHNlLCBudWxsKTsKLQkJaC5yZWZyZXNoKG51bGwpOwotCi0JCS8vIFRlc3QgYWRkaXRpb24gb2YgJ0Vycm9yLmNsYXNzJyBpbiAnamF2YS5sYW5nJyAoaXQgc2hvdWxkIHJlcGxhY2UgdGhlICdFcnJvci5jbGFzcycgb2YgdGhlIEpDTCBpbiB0aGUgaGllcmFyY2h5KQotCQl0aGlzLnJlc2V0KCk7Ci0JCUlGaWxlIGZpbGUgPSBnZXRQcm9qZWN0KCJUeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uIikuZ2V0RmlsZSgiRXJyb3IuY2xhc3MiKTsKLQkJKChJRm9sZGVyKSBwZi5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKSkuZ2V0RmlsZSgiRXJyb3IuY2xhc3MiKS5jcmVhdGUoZmlsZS5nZXRDb250ZW50cyhmYWxzZSksIGZhbHNlLCBudWxsKTsKLQkJdGhpcy5hc3NlcnRPbmVDaGFuZ2UoaCk7Ci0JCWgucmVmcmVzaChudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdXBlcmNsYXNzIG9mIE15RXJyb3Igc2hvdWxkIGJlIEVycm9yIGluIHBhdGNoIiwgcGYuZ2V0Q2xhc3NGaWxlKCJFcnJvci5jbGFzcyIpLmdldFR5cGUoKSwgaC5nZXRTdXBlcmNsYXNzKHR5cGUpKTsKLQotCQkvLyBUZXN0IHJlbW92YWwgb2YgJ0Vycm9yLmNsYXNzJwotCQl0aGlzLnJlc2V0KCk7Ci0JCWRlbGV0ZVJlc291cmNlKHBmLmdldENsYXNzRmlsZSgiRXJyb3IuY2xhc3MiKS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKSk7Ci0JCXRoaXMuYXNzZXJ0T25lQ2hhbmdlKGgpOwotCX0gZmluYWxseSB7Ci0JCWgucmVtb3ZlVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIFR5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24gaXMgbWFkZSBpbnZhbGlkIHdoZW4gdGhlIHByb2plY3QgaXMgY2xvc2VkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q2xvc2VQcm9qZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QoIlR5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24iKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJUeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uIiwgInNyYyIsICJwIiwgIlguamF2YSIpOwotCUlUeXBlIHR5cGU9IGN1LmdldFR5cGUoIlgiKTsKLQlJVHlwZUhpZXJhcmNoeSBoID0gdHlwZS5uZXdUeXBlSGllcmFyY2h5KGphdmFQcm9qZWN0LCBudWxsKTsKLQloLmFkZFR5cGVIaWVyYXJjaHlDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0KLQl0cnkgewotCQlhc3NlcnRUcnVlKGguZXhpc3RzKCkpOwotCQlqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuY2xvc2UobnVsbCk7Ci0JCWFzc2VydFRydWUoIlNob3VsZCBoYXZlIGJlZW4gaW52YWxpZGF0ZWQiLCAhaC5leGlzdHMoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJaC5yZW1vdmVUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCX0KLX0KLS8qKgotICogV2hlbiBlZGl0aW5nIHRoZSBleHRlbmRzIGNsYXVzZSBvZiBhIHNvdXJjZSB0eXBlIGluIGEgaGllcmFyY2h5LCB3ZSBzaG91bGQgYmUgbm90aWZpZWQgb2YgY2hhbmdlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0RWRpdEV4dGVuZHNTb3VyY2VUeXBlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IGdldEphdmFQcm9qZWN0KCJUeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uIik7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbiIsICJzcmMiLCAicCIsICJYLmphdmEiKTsKLQlJVHlwZSB0eXBlPSBjdS5nZXRUeXBlKCJYIik7Ci0JSVR5cGVIaWVyYXJjaHkgaCA9IHR5cGUubmV3VHlwZUhpZXJhcmNoeShqYXZhUHJvamVjdCwgbnVsbCk7Ci0JaC5hZGRUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCi0JdHJ5IHsKLQkJLy8gY2hhbmdlIHRoZSBzdXBlcmNsYXNzIHRvIGEuQQotCQljaGFuZ2VTdXBlcihjdSwgIkIiLCAiYS5BIik7Ci0JCXRoaXMuYXNzZXJ0T25lQ2hhbmdlKGgpOwotCQloLnJlZnJlc2gobnVsbCk7Ci0JCQotCQkvLyBjaGFuZ2UgdGhlIHN1cGVyY2xhc3MgYmFjayB0byBCCi0JCXRoaXMucmVzZXQoKTsKLQkJY2hhbmdlU3VwZXIoY3UsICJhLkEiLCAiQiIpOwotCQl0aGlzLmFzc2VydE9uZUNoYW5nZShoKTsKLQl9IGZpbmFsbHkgewotCQloLnJlbW92ZVR5cGVIaWVyYXJjaHlDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JfQotfQotLyoqCi0gKiBXaGVuIGFkZGluZyBhbiBleHRlbmRzIGNsYXVzZSBvZiBhIHNvdXJjZSB0eXBlIGluIGEgaGllcmFyY2h5LCB3ZSBzaG91bGQgYmUgbm90aWZpZWQgb2YgY2hhbmdlLgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDQ5MTcgTGF0ZXN0IGJ1aWxkIGZhaWxzIHVwZGF0aW5nIFR5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24pCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RBZGRFeHRlbmRzU291cmNlVHlwZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBnZXRKYXZhUHJvamVjdCgiVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbiIpOwotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlR5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24iLCAic3JjIiwgInAyIiwgIkEuamF2YSIpOwotCUlUeXBlIHR5cGU9IGN1LmdldFR5cGUoIkEiKTsKLQlJVHlwZUhpZXJhcmNoeSBoID0gdHlwZS5uZXdUeXBlSGllcmFyY2h5KGphdmFQcm9qZWN0LCBudWxsKTsKLQloLmFkZFR5cGVIaWVyYXJjaHlDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0KLQl0cnkgewotCQkvLyBhZGQgcDIuQiBhcyB0aGUgc3VwZXJjbGFzcyBvZiBwMi5BCi0JCWFkZFN1cGVyKGN1LCAiQSIsICJwMi5CIik7Ci0JCXRoaXMuYXNzZXJ0T25lQ2hhbmdlKGgpOwotCX0gZmluYWxseSB7Ci0JCWgucmVtb3ZlVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0JCi19Ci0vKioKLSAqIFdoZW4gZWRpdGluZyBhIHNvdXJjZSB0eXBlIE5PVCBpbiBhIGhpZXJhcmNoeSwgd2Ugc2hvdWxkIHJlY2VpdmUgTk8gQ0hBTkdFUy4KLSAqLwotcHVibGljIHZvaWQgdGVzdEVkaXRFeHRlcm5hbFNvdXJjZVR5cGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QoIlR5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24iKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJUeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uIiwgInNyYyIsICJwIiwgIlguamF2YSIpOwotCUlUeXBlIHR5cGU9IGN1LmdldFR5cGUoIlgiKTsKLQlJVHlwZUhpZXJhcmNoeSBoID0gdHlwZS5uZXdUeXBlSGllcmFyY2h5KGphdmFQcm9qZWN0LCBudWxsKTsKLQloLmFkZFR5cGVIaWVyYXJjaHlDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0KLQlJQ29tcGlsYXRpb25Vbml0IGN1Mj0gZ2V0Q29tcGlsYXRpb25Vbml0KCJUeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uIiwgInNyYyIsICJwIiwgIkV4dGVybmFsLmphdmEiKTsKLQlJRmllbGQgZmllbGQ9IGN1Mi5nZXRUeXBlKCJFeHRlcm5hbCIpLmdldEZpZWxkKCJmaWVsZCIpOwotCXRyeSB7Ci0JCWZpZWxkLmRlbGV0ZShmYWxzZSwgbnVsbCk7Ci0JCWFzc2VydFRydWUoIlNob3VsZCByZWNlaXZlIE5PIGNoYW5nZSIsICF0aGlzLmNoYW5nZVJlY2VpdmVkKTsKLQl9IGZpbmFsbHkgewotCQloLnJlbW92ZVR5cGVIaWVyYXJjaHlDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JfQotfQotLyoqCi0gKiBXaGVuIGVkaXRpbmcgdGhlIGZpZWxkIG9mIGEgc291cmNlIHR5cGUgaW4gYSBoaWVyYXJjaHksIAotICogd2Ugc2hvdWxkIE5PVCBiZSBub3RpZmllZCBvZiBhIGNoYW5nZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdEVkaXRGaWVsZFNvdXJjZVR5cGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QoIlR5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24iKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJUeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uIiwgInNyYyIsICJwIiwgIlguamF2YSIpOwotCUlUeXBlIHR5cGU9IGN1LmdldFR5cGUoIlgiKTsKLQlJVHlwZUhpZXJhcmNoeSBoID0gdHlwZS5uZXdUeXBlSGllcmFyY2h5KGphdmFQcm9qZWN0LCBudWxsKTsKLQloLmFkZFR5cGVIaWVyYXJjaHlDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0KLQl0cnkgewotCQkvLyByZW1vdmUgYSBmaWVsZCBhbiBtYWtlIHN1cmUgd2UgZG9uJ3QgZ2V0IGFueSBub3RpZmljYXRpb24KLQkJSUZpZWxkIGZpZWxkPSB0eXBlLmdldEZpZWxkKCJmaWVsZCIpOwotCQlTdHJpbmcgc291cmNlPSBmaWVsZC5nZXRTb3VyY2UoKTsKLQkJZmllbGQuZGVsZXRlKGZhbHNlLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIG5vdCByZWNlaXZlIGNoYW5nZSIsICF0aGlzLmNoYW5nZVJlY2VpdmVkKTsKLQkJCi0JCS8vIGFkZCB0aGUgZmllbGQgYmFjayBpbiBhbmQgbWFrZSBzdXJlIHdlIGRvbid0IGdldCBhbnkgbm90aWZpY2F0aW9uCi0JCXR5cGUuY3JlYXRlRmllbGQoc291cmNlLCBudWxsLCBmYWxzZSwgbnVsbCk7Ci0JCWFzc2VydFRydWUoIlNob3VsZCByZWNlaXZlIGNoYW5nZSIsICF0aGlzLmNoYW5nZVJlY2VpdmVkKTsKLQl9IGZpbmFsbHkgewotCQloLnJlbW92ZVR5cGVIaWVyYXJjaHlDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0gCX0KLX0KLS8qKgotICogV2hlbiBlZGl0aW5nIHRoZSBpbXBvcnRzIG9mIGEgc291cmNlIHR5cGUgaW4gYSBoaWVyYXJjaHksIAotICogd2Ugc2hvdWxkIGJlIG5vdGlmaWVkIG9mIGEgY2hhbmdlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0RWRpdEltcG9ydFNvdXJjZVR5cGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QoIlR5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24iKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJUeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uIiwgInNyYyIsICJwIiwgIlguamF2YSIpOwotCUlUeXBlIHR5cGUgPSBjdS5nZXRUeXBlKCJYIik7Ci0JSVR5cGVIaWVyYXJjaHkgaCA9IHR5cGUubmV3VHlwZUhpZXJhcmNoeShqYXZhUHJvamVjdCwgbnVsbCk7Ci0JaC5hZGRUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCi0JdHJ5IHsKLQkJLy8gcmVtb3ZlIGFuIGltcG9ydCBkZWNsYXJhdGlvbgotCQlJSW1wb3J0RGVjbGFyYXRpb24gaW1wb3J0RGVjbCA9IGN1LmdldEltcG9ydCgiYi4qIik7Ci0JCWltcG9ydERlY2wuZGVsZXRlKGZhbHNlLCBudWxsKTsKLQkJdGhpcy5hc3NlcnRPbmVDaGFuZ2UoaCk7Ci0JCQotCQkvLyByZW1vdmUgYWxsIHJlbWFpbmluZyBpbXBvcnQgZGVjbGFyYXRpb25zCi0JCXRoaXMucmVzZXQoKTsKLQkJaW1wb3J0RGVjbCA9IGN1LmdldEltcG9ydCgiaS4qIik7Ci0JCWltcG9ydERlY2wuZGVsZXRlKGZhbHNlLCBudWxsKTsKLQkJdGhpcy5hc3NlcnRPbmVDaGFuZ2UoaCk7Ci0JCQotCQkvLyBhZGQgYW4gaW1wb3J0IGJhY2sgaW4gCi0JCXRoaXMucmVzZXQoKTsKLQkJY3UuY3JlYXRlSW1wb3J0KCJiLkIiLCBudWxsLCBudWxsKTsKLQkJdGhpcy5hc3NlcnRPbmVDaGFuZ2UoaCk7Ci0JCQotCQkvLyBhZGQgYSBzZWNvbmQgaW1wb3J0IGJhY2sgaW4gCi0JCXRoaXMucmVzZXQoKTsKLQkJY3UuY3JlYXRlSW1wb3J0KCJpLioiLCBudWxsLCBudWxsKTsKLQkJdGhpcy5hc3NlcnRPbmVDaGFuZ2UoaCk7Ci0JfSBmaW5hbGx5IHsKLQkJaC5yZW1vdmVUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyKHRoaXMpOwotIAl9Ci19Ci0vKioKLSAqIFdoZW4gZWRpdGluZyA+IDEgc291cmNlIHR5cGUgaW4gYSBoaWVyYXJjaHkgdXNpbmcgYSBNdWx0aU9wZXJhdGlvbiwgCi0gKiB3ZSBzaG91bGQgYmUgbm90aWZpZWQgb2YgT05FIGNoYW5nZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdEVkaXRTb3VyY2VUeXBlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkvLyBUQkQ6IEZpbmQgYSB3YXkgdG8gZG8gMiBjaGFuZ2VzIGluIDIgZGlmZmVyZW50IENVcyBhdCBvbmNlCi0JCi0JSUphdmFQcm9qZWN0IHByb2plY3Q9IGdldEphdmFQcm9qZWN0KCJUeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uIik7Ci0JZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbiIsICJzcmMiLCAicCIsICJYLmphdmEiKTsKLQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IHN1cGVyQ1UgPSBnZXRDb21waWxhdGlvblVuaXQoIlR5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24iLCAic3JjIiwgImIiLCAiQi5qYXZhIik7Ci0JSVR5cGUgdHlwZSA9IGN1LmdldFR5cGUoIlgiKTsKLQlJVHlwZUhpZXJhcmNoeSBoID0gdHlwZS5uZXdUeXBlSGllcmFyY2h5KHByb2plY3QsIG51bGwpOwotCWguYWRkVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQotCXRyeSB7Ci0JCS8vIGNoYW5nZSB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgc3VwZXIgY2xhc3MgYW5kIHRoZSAnZXh0ZW5kcycgb2YgdGhlIHR5cGUgd2UncmUgbG9va2luZyBhdAotCQkvLyBpbiBhIGJhdGNoIG9wZXJhdGlvbgotCQlKYXZhQ29yZS5ydW4oCi0JCQluZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWNoYW5nZVZpc2liaWxpdHkoc3VwZXJDVSwgInB1YmxpYyIsICJwcml2YXRlIik7Ci0JCQkJCQljaGFuZ2VTdXBlcihjdSwgIlgiLCAiYS5BIik7Ci0JCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlhc3NlcnRUcnVlKCJObyBleGNlcHRpb24iLCBmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9LAotCQkJbnVsbAotCQkpOwotCi0JCWFzc2VydFRydWUoIlNob3VsZCByZWNlaXZlIGNoYW5nZSIsIHRoaXMuY2hhbmdlUmVjZWl2ZWQpOwotCQlhc3NlcnRUcnVlKCJDaGFuZ2Ugc2hvdWxkIGJlIGZvciB0aGlzIGhpZXJhcmNoeSIsIHRoaXMuaGllcmFyY2h5ID09IGgpOwotCQlhc3NlcnRUcnVlKCJTaG91bGQgYmUgb25lIG5vdGlmaWNhdGlvbiIsIHRoaXMubm90aWZpY2F0aW9ucyA9PSAxKTsKLQl9IGZpbmFsbHkgewotCQloLnJlbW92ZVR5cGVIaWVyYXJjaHlDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JfQotfQotLyoqCi0gKiBXaGVuIGVkaXRpbmcgYSBzdXBlciBzb3VyY2UgdHlwZSBpbiBhIGhpZXJhcmNoeSwgd2Ugc2hvdWxkIGJlIG5vdGlmaWVkIG9mIGNoYW5nZSBvbmx5IGlmCi0gKiB0aGUgY2hhbmdlIGFmZmVjdHMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIHR5cGUuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RFZGl0U3VwZXJUeXBlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCUlKYXZhUHJvamVjdCBwcm9qZWN0PSBnZXRKYXZhUHJvamVjdCgiVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbiIpOwotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlR5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24iLCAic3JjIiwgInAiLCAiWC5qYXZhIik7Ci0JSUNvbXBpbGF0aW9uVW5pdCBzdXBlckNVID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJUeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uIiwgInNyYyIsICJiIiwgIkIuamF2YSIpOwotCUlUeXBlIHR5cGUgPSBjdS5nZXRUeXBlKCJYIik7Ci0JSVR5cGUgc3VwZXJUeXBlPSBzdXBlckNVLmdldFR5cGUoIkIiKTsKLQlJVHlwZUhpZXJhcmNoeSBoID0gdHlwZS5uZXdUeXBlSGllcmFyY2h5KHByb2plY3QsIG51bGwpOwotCWguYWRkVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQotCXRyeSB7Ci0JCS8vIGRlbGV0ZSBhIGZpZWxkLCB0aGVyZSBzaG91bGQgYmUgbm8gY2hhbmdlCi0JCUlGaWVsZCBzdXBlckZpZWxkPSBzdXBlclR5cGUuZ2V0RmllbGQoInZhbHVlIik7Ci0JCXN1cGVyRmllbGQuZGVsZXRlKGZhbHNlLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIHJlY2VpdmUgbm8gY2hhbmdlIiwgIXRoaXMuY2hhbmdlUmVjZWl2ZWQpOwotCi0JCS8vIGNoYW5nZSB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgc3VwZXIgY2xhc3MsIHRoZXJlIHNob3VsZCBiZSBvbmUgY2hhbmdlCi0JCWNoYW5nZVZpc2liaWxpdHkoc3VwZXJDVSwgInB1YmxpYyIsICJwcml2YXRlIik7Ci0JCXRoaXMuYXNzZXJ0T25lQ2hhbmdlKGgpOwotCX0gZmluYWxseSB7Ci0JCWgucmVtb3ZlVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQl9Ci19Ci0vKioKLSAqIFdoZW4gYW4gaW52b2x2ZWQgY29tcGlsYXRpb24gdW5pdCBpcyBkZWxldGVkLCB0aGUgdHlwZSBoaWVyYXJjaHkgc2hvdWxkIGNoYW5nZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ29tcGlsYXRpb25Vbml0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QoIlR5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24iKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJUeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uIiwgInNyYyIsICJwIiwgIlguamF2YSIpOwotCUlDb21waWxhdGlvblVuaXQgc3VwZXJDVSA9IGdldENvbXBpbGF0aW9uVW5pdCgiVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbiIsICJzcmMiLCAiYiIsICJCLmphdmEiKTsKLQlJVHlwZSB0eXBlID0gY3UuZ2V0VHlwZSgiWCIpOwotCUlUeXBlSGllcmFyY2h5IGggPSB0eXBlLm5ld1R5cGVIaWVyYXJjaHkocHJvamVjdCwgbnVsbCk7Ci0JaC5hZGRUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQotCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHN1cGVyQ1UuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7Ci0JdHJ5IHsKLQkJZGVsZXRlUmVzb3VyY2UoZmlsZSk7Ci0JCXRoaXMuYXNzZXJ0T25lQ2hhbmdlKGgpOwotCX0gZmluYWxseSB7Ci0JCWgucmVtb3ZlVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQl9Ci19Ci0vKioKLSAqIFdoZW4gYW4gdW5pbnZvbHZlZCBjb21waWxhdGlvbiB1bml0IGlzIGRlbGV0ZWQsIHRoZSB0eXBlIGhpZXJhcmNoeSBzaG91bGQgbm90IGNoYW5nZQotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRXh0ZXJuYWxDb21waWxhdGlvblVuaXQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JSUphdmFQcm9qZWN0IHByb2plY3QgPSBnZXRKYXZhUHJvamVjdCgiVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbiIpOwotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlR5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24iLCAic3JjIiwgInAiLCAiWC5qYXZhIik7Ci0JSUNvbXBpbGF0aW9uVW5pdCBvdGhlckNVID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJUeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uIiwgInNyYyIsICJwIiwgIkV4dGVybmFsLmphdmEiKTsKLQlJVHlwZSB0eXBlID0gY3UuZ2V0VHlwZSgiWCIpOwotCUlUeXBlSGllcmFyY2h5IGggPSB0eXBlLm5ld1R5cGVIaWVyYXJjaHkocHJvamVjdCwgbnVsbCk7Ci0JaC5hZGRUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQotCUlGaWxlIGZpbGUgPSAoSUZpbGUpIG90aGVyQ1UuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7Ci0JdHJ5IHsKLQkJZGVsZXRlUmVzb3VyY2UoZmlsZSk7Ci0JCWFzc2VydFRydWUoIlNob3VsZCBub3QgcmVjZWl2ZSBjaGFuZ2VzIiwgIXRoaXMuY2hhbmdlUmVjZWl2ZWQpOwotCX0gZmluYWxseSB7Ci0JCWgucmVtb3ZlVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQl9Ci19Ci0vKioKLSAqIFdoZW4gYSB1bmludm9sdmVkIHBhY2thZ2UgaXMgZGVsZXRlZCwgdGhlIHR5cGUgaGllcmFyY2h5IHNob3VsZCBOT1QgY2hhbmdlCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFeHRlcm5hbFBhY2thZ2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JSUphdmFQcm9qZWN0IHByb2plY3QgPSBnZXRKYXZhUHJvamVjdCgiVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbiIpOwotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlR5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24iLCAic3JjIiwgInAiLCAiWC5qYXZhIik7Ci0JSVR5cGUgdHlwZSA9IGN1LmdldFR5cGUoIlgiKTsKLQlJVHlwZUhpZXJhcmNoeSBoID0gdHlwZS5uZXdUeXBlSGllcmFyY2h5KHByb2plY3QsIG51bGwpOwotCWguYWRkVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkKLQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IGdldFBhY2thZ2VGcmFnbWVudCgiVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbiIsICJzcmMiLCAicC5vdGhlciIpOwotCUlGb2xkZXIgZm9sZGVyID0gKElGb2xkZXIpIHBrZy5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQl0cnkgewotCQlkZWxldGVSZXNvdXJjZShmb2xkZXIpOwotCQlhc3NlcnRUcnVlKCJTaG91bGQgcmVjZWl2ZSBOTyBjaGFuZ2UiLCAhdGhpcy5jaGFuZ2VSZWNlaXZlZCk7Ci0JfSBmaW5hbGx5IHsKLQkJaC5yZW1vdmVUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCX0KLX0KLS8qKgotICogV2hlbiBhIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCBpcyByZW1vdmVkIGZyb20gdGhlIGNsYXNzcGF0aCwgYnV0IGRvZXMgbm90IGltcGFjdCB0aGUKLSAqIHBhY2thZ2UgZnJhZ21lbnRzLCB0aGUgdHlwZSBoaWVyYXJjaHkgc2hvdWxkIG5vdCBjaGFuZ2UuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFeHRlcm5hbFBhY2thZ2VGcmFnbWVudFJvb3QoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JSUphdmFQcm9qZWN0IHByb2plY3Q9IGdldEphdmFQcm9qZWN0KCJUeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uIik7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbiIsICJzcmMiLCAicCIsICJYLmphdmEiKTsKLQlJVHlwZSB0eXBlID0gY3UuZ2V0VHlwZSgiWCIpOwotCUlUeXBlSGllcmFyY2h5IGggPSB0eXBlLm5ld1R5cGVIaWVyYXJjaHkocHJvamVjdCwgbnVsbCk7Ci0JaC5hZGRUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCi0JLy8gYWRkIGEgY2xhc3NwYXRoIGVudHJ5IGZvciB0aGUgbmV3IHJvb3QKLQlJQ2xhc3NwYXRoRW50cnlbXSBvcmlnaW5hbENQPSBwcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCUlDbGFzc3BhdGhFbnRyeSBuZXdFbnRyeT0gSmF2YUNvcmUubmV3U291cmNlRW50cnkocHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKS5hcHBlbmQoImV4dHJhIikpOwotCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0NQPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29yaWdpbmFsQ1AubGVuZ3RoICsgMV07Ci0JU3lzdGVtLmFycmF5Y29weShvcmlnaW5hbENQLCAwICwgbmV3Q1AsIDAsIG9yaWdpbmFsQ1AubGVuZ3RoKTsKLQluZXdDUFtvcmlnaW5hbENQLmxlbmd0aF09IG5ld0VudHJ5OwotCQotCXRyeSB7Ci0JCS8vIHNldCBjbGFzc3BhdGgKLQkJcHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q1AsIG51bGwpOwotCi0JCS8vIG5vdyBjcmVhdGUgdGhlIGFjdHVhbCByZXNvdXJjZSBmb3IgdGhlIHJvb3QgYW5kIHBvcHVsYXRlIGl0Ci0JCXRoaXMucmVzZXQoKTsKLQkJcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJleHRyYSIpLmNyZWF0ZShmYWxzZSwgdHJ1ZSwgbnVsbCk7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290IG5ld1Jvb3Q9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoIlR5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24iLCAiZXh0cmEiKTsKLQkJYXNzZXJ0VHJ1ZSgiTmV3IHJvb3Qgc2hvdWxkIG5vdyBiZSB2aXNpYmxlIiwgbmV3Um9vdCAhPSBudWxsKTsKLQkJdGhpcy5hc3NlcnRPbmVDaGFuZ2UoaCk7Ci0KLQkJLy8gcmVtb3ZlIGEgY2xhc3NwYXRoIGVudHJ5IHRoYXQgZG9lcyBub3QgaW1wYWN0IHRoZSB0eXBlIGhpZXJhcmNoeQotCQl0aGlzLnJlc2V0KCk7Ci0JCXByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG9yaWdpbmFsQ1AsIG51bGwpOwotCQlhc3NlcnRUcnVlKCJTaG91bGQgbm90IHJlY2VpdmUgY2hhbmdlIiwgIXRoaXMuY2hhbmdlUmVjZWl2ZWQpOwotCX0gZmluYWxseSB7Ci0JCWgucmVtb3ZlVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQl9Ci19Ci0vKioKLSAqIFdoZW4gYSBwcm9qZWN0IGlzIGRlbGV0ZWQgdGhhdCBjb250YWlucyBwYWNrYWdlIGZyYWdtZW50cyB0aGF0IGltcGFjdCB0aGUgCi0gKiB0eXBlIGhpZXJhcmNoeSwgdGhlIHR5cGUgaGllcmFyY2h5IHNob3VsZCBjaGFuZ2UKLSAqLwotcHVibGljIHZvaWQgdGVzdFJlbW92ZUV4dGVybmFsUHJvamVjdCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZUphdmFQcm9qZWN0KCJFeHRlcm5hbCIsIG5ldyBTdHJpbmdbXSB7IiJ9LCBuZXcgU3RyaW5nW10geyJKQ0xfTElCIn0sIG5ldyBTdHJpbmdbXXsiL1R5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24ifSwgIiIpOwotCQl0aGlzLmNyZWF0ZUZvbGRlcigiL0V4dGVybmFsL3AiKTsKLQkJdGhpcy5jcmVhdGVGaWxlKCIvRXh0ZXJuYWwvcC9ZLmphdmEiLCAicGFja2FnZSBwOyBwdWJsaWMgY2xhc3MgWSBleHRlbmRzIFgge30iKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbiIsICJzcmMiLCAicCIsICJYLmphdmEiKTsKLQkJSVR5cGUgdHlwZSA9IGN1LmdldFR5cGUoIlgiKTsKLQkJSVR5cGVIaWVyYXJjaHkgaCA9IHR5cGUubmV3VHlwZUhpZXJhcmNoeShudWxsKTsKLQkJaC5hZGRUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQkKLQkJdHJ5IHsKLQkJCXRoaXMuZGVsZXRlUHJvamVjdCgiRXh0ZXJuYWwiKTsKLQkJCWFzc2VydFRydWUoIlNob3VsZCBub3QgcmVjZWl2ZSBjaGFuZ2UiLCB0aGlzLmNoYW5nZVJlY2VpdmVkKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWgucmVtb3ZlVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiRXh0ZXJuYWwiKTsKLQl9Ci19Ci0vKioKLSAqIFRlc3QgcmVtb3ZpbmcgYSBsaXN0ZW5lciB3aGlsZSB0aGUgdHlwZSBoaWVyYXJjaHkgaXMgbm90aWZ5aW5nIGxpc3RlbmVycy4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJlbW92ZUxpc3RlbmVyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCUlKYXZhUHJvamVjdCBwcm9qZWN0PSBnZXRKYXZhUHJvamVjdCgiVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbiIpOwotCWZpbmFsIElDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlR5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24iLCAic3JjIiwgInAiLCAiWC5qYXZhIik7Ci0JZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBzdXBlckNVID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJUeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uIiwgInNyYyIsICJiIiwgIkIuamF2YSIpOwotCUlUeXBlIHR5cGUgPSBjdS5nZXRUeXBlKCJYIik7Ci0JSVR5cGVIaWVyYXJjaHkgaCA9IHR5cGUubmV3VHlwZUhpZXJhcmNoeShwcm9qZWN0LCBudWxsKTsKLQlJVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcj0gbmV3IElUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB0eXBlSGllcmFyY2h5Q2hhbmdlZChJVHlwZUhpZXJhcmNoeSB0aCkgewotCQkJY2hhbmdlUmVjZWl2ZWQ9IHRydWU7Ci0JCQloaWVyYXJjaHk9IHRoOwotCQkJbm90aWZpY2F0aW9ucysrOwotCQkJdGgucmVtb3ZlVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCX07Ci0JaC5hZGRUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQotCXRyeSB7Ci0JCS8vIGNoYW5nZSB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgc3VwZXIgY2xhc3MgYW5kIHRoZSAnZXh0ZW5kcycgb2YgdGhlIHR5cGUgd2UncmUgbG9va2luZyBhdAotCQkvLyBpbiBhIGJhdGNoIG9wZXJhdGlvbgotCQlnZXRXb3Jrc3BhY2UoKS5ydW4oCi0JCQluZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWNoYW5nZVZpc2liaWxpdHkoc3VwZXJDVSwgInB1YmxpYyIsICJwcml2YXRlIik7Ci0JCQkJCQljaGFuZ2VTdXBlcihjdSwgIkIiLCAiYS5BIik7Ci0JCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlhc3NlcnRUcnVlKCJObyBleGNlcHRpb24iLCBmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9LAotCQkJbnVsbAotCQkpOwotCi0JCXRoaXMuYXNzZXJ0T25lQ2hhbmdlKGgpOwotCX0gZmluYWxseSB7Ci0JCWgucmVtb3ZlVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQl9Ci19Ci0vKioKLSAqIFdoZW4gYSBwYWNrYWdlIGlzIGRlbGV0ZWQsIHRoZSB0eXBlIGhpZXJhcmNoeSBzaG91bGQgY2hhbmdlCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVQYWNrYWdlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QoIlR5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24iKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJUeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uIiwgInNyYyIsICJwIiwgIlguamF2YSIpOwotCUlUeXBlIHR5cGUgPSBjdS5nZXRUeXBlKCJYIik7Ci0JSVR5cGVIaWVyYXJjaHkgaCA9IHR5cGUubmV3VHlwZUhpZXJhcmNoeShwcm9qZWN0LCBudWxsKTsKLQloLmFkZFR5cGVIaWVyYXJjaHlDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCi0JSVBhY2thZ2VGcmFnbWVudCBwa2cgPSB0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpOwotCXRyeSB7Ci0JCWRlbGV0ZVJlc291cmNlKHBrZy5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKSk7Ci0JCXRoaXMuYXNzZXJ0T25lQ2hhbmdlKGgpOwotCX0gZmluYWxseSB7Ci0JCWgucmVtb3ZlVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQl9Ci19Ci0vKioKLSAqIFdoZW4gYSBwYWNrYWdlIGZyYWdtZW50IHJvb3QgaXMgcmVtb3ZlZCBmcm9tIHRoZSBjbGFzc3BhdGgsIHRoZSB0eXBlIGhpZXJhcmNoeSBzaG91bGQgY2hhbmdlCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVQYWNrYWdlRnJhZ21lbnRSb290cygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQlJSmF2YVByb2plY3QgcHJvamVjdCA9IGdldEphdmFQcm9qZWN0KCJUeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uIik7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbiIsICJzcmMiLCAicCIsICJYLmphdmEiKTsKLQlJVHlwZSB0eXBlID0gY3UuZ2V0VHlwZSgiWCIpOwotCUlUeXBlSGllcmFyY2h5IGggPSB0eXBlLm5ld1R5cGVIaWVyYXJjaHkocHJvamVjdCwgbnVsbCk7Ci0JaC5hZGRUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQotCXRyeSB7Ci0JCXByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG51bGwsIG51bGwpOwotCQl0aGlzLmFzc2VydE9uZUNoYW5nZShoKTsKLQl9IGZpbmFsbHkgewotCQloLnJlbW92ZVR5cGVIaWVyYXJjaHlDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JfQotfQotLyoqCi0gKiBXaGVuIGEgcHJvamVjdCBpcyBkZWxldGVkIHRoYXQgY29udGFpbnMgcGFja2FnZSBmcmFnbWVudHMgdGhhdCBpbXBhY3QgdGhlIAotICogdHlwZSBoaWVyYXJjaHksIHRoZSB0eXBlIGhpZXJhcmNoeSBzaG91bGQgY2hhbmdlIChhbmQgYmUgbWFkZSBpbnZhbGlkKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUHJvamVjdCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQlJVHlwZUhpZXJhcmNoeSBoID0gbnVsbDsKLQl0cnkgewotCQlzZXRVcEphdmFQcm9qZWN0KCJUeXBlSGllcmFyY2h5RGVwZW5kZW50Iik7Ci0JCUlKYXZhUHJvamVjdCBwcm9qZWN0PSBnZXRKYXZhUHJvamVjdCgiVHlwZUhpZXJhcmNoeURlcGVuZGVudCIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJUeXBlSGllcmFyY2h5RGVwZW5kZW50IiwgIiIsICIiLCAiRGVwZW5kZW50LmphdmEiKTsKLQkJSVR5cGUgdHlwZSA9IGN1LmdldFR5cGUoIkRlcGVuZGVudCIpOwotCQloID0gdHlwZS5uZXdUeXBlSGllcmFyY2h5KHByb2plY3QsIG51bGwpOwotCQloLmFkZFR5cGVIaWVyYXJjaHlDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCi0JCS8vIFNhbml0eSBjaGVjawotCQlhc3NlcnRFcXVhbHMoIlN1cGVyY2xhc3Mgb2YgRGVwZW5kZW50IGlzIGEuQSIsICJhLkEiLCBoLmdldFN1cGVyY2xhc3ModHlwZSkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQotCQkvLyBEZWxldGUgYSByZWxhdGVkIHByb2plY3QKLQkJSVJlc291cmNlIGZvbGRlciA9IGdldEphdmFQcm9qZWN0KCJUeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uIikuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7Ci0JCWRlbGV0ZVJlc291cmNlKGZvbGRlcik7Ci0JCXRoaXMuYXNzZXJ0T25lQ2hhbmdlKGgpOwotCQlhc3NlcnRUcnVlKCJTaG91bGQgc3RpbGwgZXhpc3QiLCBoLmV4aXN0cygpKTsKLQkJaC5yZWZyZXNoKG51bGwpOwotCQlJVHlwZSBzdXBlclR5cGUgPSBoLmdldFN1cGVyY2xhc3ModHlwZSk7Ci0JCWFzc2VydFRydWUoIlN1cGVyY2xhc3Mgb2YgRGVwZW5kZW50IHNob3VsZCBiZSBudWxsIiwgc3VwZXJUeXBlID09IG51bGwpOwotCQotCQkvLyBEZWxldGUgdGhlIHByb2plY3QgdHlwZSBsaXZlcyBpbi4KLQkJZm9sZGVyID0gZ2V0SmF2YVByb2plY3QoIlR5cGVIaWVyYXJjaHlEZXBlbmRlbnQiKS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQkJZGVsZXRlUmVzb3VyY2UoZm9sZGVyKTsKLQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIGhhdmUgYmVlbiBpbnZhbGlkYXRlZCIsICEgaC5leGlzdHMoKSk7CQotCX0gZmluYWxseSB7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiVHlwZUhpZXJhcmNoeURlcGVuZGVudCIpOwotCQlpZiAoaCAhPSBudWxsKSBoLnJlbW92ZVR5cGVIaWVyYXJjaHlDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JfQotfQotLyoqCi0gKiBXaGVuIHR5cGUgdXNlZCB0byBjcmVhdGUgYSBUeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uIGlzIGRlbGV0ZWQsCi0gKiB0aGUgaGllcmFyY2h5IHNob3VsZCBiZSBtYWRlIGludmFsaWQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVUeXBlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCUlKYXZhUHJvamVjdCBwcm9qZWN0PSBnZXRKYXZhUHJvamVjdCgiVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbiIpOwotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlR5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24iLCAic3JjIiwgInAiLCAiWC5qYXZhIik7Ci0JSVR5cGUgdHlwZSA9IGN1LmdldFR5cGUoIlgiKTsKLQlJVHlwZUhpZXJhcmNoeSBoID0gdHlwZS5uZXdUeXBlSGllcmFyY2h5KHByb2plY3QsIG51bGwpOwotCWguYWRkVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQotCXRyeSB7Ci0JCXR5cGUuZGVsZXRlKHRydWUsIG51bGwpOwotCQlhc3NlcnRUcnVlKCJTaG91bGQgaGF2ZSBiZWVuIGludmFsaWRhdGVkIiwgIWguZXhpc3RzKCkpOwotCX0gZmluYWxseSB7Ci0JCWgucmVtb3ZlVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQl9Ci19Ci0vKioKLSAqIFdoZW4gYW4gaW52b2x2ZWQgY29tcGlsYXRpb24gdW5pdCBpcyByZW5hbWVkLCB0aGUgdHlwZSBoaWVyYXJjaHkgbWF5IGNoYW5nZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJlbmFtZUNvbXBpbGF0aW9uVW5pdCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBnZXRKYXZhUHJvamVjdCgiVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbiIpOwotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlR5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24iLCAic3JjIiwgInAiLCAiWC5qYXZhIik7Ci0JSVR5cGUgdHlwZT0gY3UuZ2V0VHlwZSgiWCIpOwotCUlUeXBlSGllcmFyY2h5IGggPSB0eXBlLm5ld1R5cGVIaWVyYXJjaHkoamF2YVByb2plY3QsIG51bGwpOwotCWguYWRkVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQotCXRyeSB7Ci0JCWN1LnJlbmFtZSgiWDIuamF2YSIsIGZhbHNlLCBudWxsKTsKLQkJdGhpcy5hc3NlcnRPbmVDaGFuZ2UoaCk7Ci0JfSBmaW5hbGx5IHsKLQkJaC5yZW1vdmVUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCX0KLX0KLS8qKgotICogV2hlbiBhbiB1bmludm9sdmVkIGNvbXBpbGF0aW9uIHVuaXQgaXMgcmVuYW1lZCwgdGhlIHR5cGUgaGllcmFyY2h5IGRvZXMgbm90IGNoYW5nZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJlbmFtZUV4dGVybmFsQ29tcGlsYXRpb25Vbml0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IGdldEphdmFQcm9qZWN0KCJUeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uIik7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbiIsICJzcmMiLCAicCIsICJYLmphdmEiKTsKLQlJVHlwZSB0eXBlPSBjdS5nZXRUeXBlKCJYIik7Ci0JSVR5cGVIaWVyYXJjaHkgaCA9IHR5cGUubmV3VHlwZUhpZXJhcmNoeShqYXZhUHJvamVjdCwgbnVsbCk7Ci0JaC5hZGRUeXBlSGllcmFyY2h5Q2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCi0JSUNvbXBpbGF0aW9uVW5pdCBjdTI9IGdldENvbXBpbGF0aW9uVW5pdCgiVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbiIsICJzcmMiLCAicCIsICJFeHRlcm5hbC5qYXZhIik7Ci0JdHJ5IHsKLQkJY3UyLnJlbmFtZSgiRXh0ZXJuYWwyLmphdmEiLCBmYWxzZSwgbnVsbCk7Ci0JCWFzc2VydFRydWUoIlNob3VsZCBub3QgcmVjZWl2ZSBjaGFuZ2VzIiwgIXRoaXMuY2hhbmdlUmVjZWl2ZWQpOwotCX0gZmluYWxseSB7Ci0JCWgucmVtb3ZlVHlwZUhpZXJhcmNoeUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQl9Ci19Ci0vKioKLSAqIE1ha2UgYSBub3RlIG9mIHRoZSBjaGFuZ2UKLSAqLwotcHVibGljIHZvaWQgdHlwZUhpZXJhcmNoeUNoYW5nZWQoSVR5cGVIaWVyYXJjaHkgdHlwZUhpZXJhcmNoeSkgewotCXRoaXMuY2hhbmdlUmVjZWl2ZWQ9IHRydWU7Ci0JdGhpcy5oaWVyYXJjaHk9IHR5cGVIaWVyYXJjaHk7Ci0JdGhpcy5ub3RpZmljYXRpb25zKys7Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvVHlwZUhpZXJhcmNoeVNlcmlhbGl6YXRpb25UZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL1R5cGVIaWVyYXJjaHlTZXJpYWxpemF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdjNTNhZi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvVHlwZUhpZXJhcmNoeVNlcmlhbGl6YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5oaWVyYXJjaHkuUmVnaW9uQmFzZWRUeXBlSGllcmFyY2h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmhpZXJhcmNoeS5UeXBlSGllcmFyY2h5OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBUeXBlSGllcmFyY2h5U2VyaWFsaXphdGlvblRlc3RzIGV4dGVuZHMgQWJzdHJhY3RKYXZhTW9kZWxUZXN0cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1ROQU1FID0gIlR5cGVIaWVyYXJjaHlTZXJpYWxpemF0aW9uIjsKLQkKLQlJSmF2YVByb2plY3QgcHJvamVjdDsKLQotcHVibGljIFR5cGVIaWVyYXJjaHlTZXJpYWxpemF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlyZXR1cm4gbmV3IFN1aXRlKFR5cGVIaWVyYXJjaHlTZXJpYWxpemF0aW9uVGVzdHMuY2xhc3MpOwotfQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb21wYXJlKFN0cmluZyBmb2N1cywgSVR5cGVIaWVyYXJjaHkgc3RvcmVkLCBJVHlwZUhpZXJhcmNoeSBsb2FkZWQpewotCWlmKHN0b3JlZCBpbnN0YW5jZW9mIFJlZ2lvbkJhc2VkVHlwZUhpZXJhcmNoeSkgewotCQlhc3NlcnRUcnVlKCJbIitmb2N1cysiXSBoaWVyYXJjaGllcyBhcmUgbm90IHRoZSBzYW1lIiwgbG9hZGVkIGluc3RhbmNlb2YgUmVnaW9uQmFzZWRUeXBlSGllcmFyY2h5KTsKLQkJY29tcGFyZVJlZ2lvbkJhc2VkVHlwZUhpZXJhcmNoeShmb2N1cywgKFJlZ2lvbkJhc2VkVHlwZUhpZXJhcmNoeSlzdG9yZWQsKFJlZ2lvbkJhc2VkVHlwZUhpZXJhcmNoeSlsb2FkZWQpOwotCX0gZWxzZSBpZihzdG9yZWQgaW5zdGFuY2VvZiBUeXBlSGllcmFyY2h5KSB7Ci0JCWFzc2VydFRydWUoIlsiK2ZvY3VzKyJdIGhpZXJhcmNoaWVzIGFyZSBub3QgdGhlIHNhbWUiLCBsb2FkZWQgaW5zdGFuY2VvZiBUeXBlSGllcmFyY2h5KTsKLQkJY29tcGFyZVR5cGVIaWVyYXJjaHkoZm9jdXMsIChUeXBlSGllcmFyY2h5KXN0b3JlZCwoVHlwZUhpZXJhcmNoeSlsb2FkZWQpOwotCX0KLX0KLXByaXZhdGUgc3RhdGljIHZvaWQgY29tcGFyZVJlZ2lvbkJhc2VkVHlwZUhpZXJhcmNoeShTdHJpbmcgZm9jdXMsIFJlZ2lvbkJhc2VkVHlwZUhpZXJhcmNoeSBzdG9yZWQsIFJlZ2lvbkJhc2VkVHlwZUhpZXJhcmNoeSBsb2FkZWQpewotCWNvbXBhcmVUeXBlSGllcmFyY2h5KGZvY3VzLCBzdG9yZWQsIGxvYWRlZCk7Ci19Ci1wcml2YXRlIHN0YXRpYyB2b2lkIGNvbXBhcmVUeXBlSGllcmFyY2h5KFN0cmluZyBmb2N1cywgVHlwZUhpZXJhcmNoeSBzdG9yZWQsIFR5cGVIaWVyYXJjaHkgbG9hZGVkKXsKLQkvL1N5c3RlbS5vdXQucHJpbnRsbihzdG9yZWQudG9TdHJpbmcoKSk7Ci0JCi0JSVR5cGUgdHlwZTEgPSBzdG9yZWQuZ2V0VHlwZSgpOwotCUlUeXBlIHR5cGUyID0gbG9hZGVkLmdldFR5cGUoKTsKLQlhc3NlcnRFcXVhbHMoIlsiK2ZvY3VzKyJdIGZvY3VzIGFyZSBub3QgdGhlIHNhbWUiLCB0eXBlMSwgdHlwZTIpOwotCQotCUlUeXBlW10gYWxsVHlwZXMxID0gc3RvcmVkLmdldEFsbFR5cGVzKCk7Ci0JSVR5cGVbXSBhbGxUeXBlczIgPSBsb2FkZWQuZ2V0QWxsVHlwZXMoKTsKLQljb21wYXJlKCJbIitmb2N1cysiXSBhbGwgdHlwZXMgYXJlIG5vdCB0aGUgc2FtZSIsIGFsbFR5cGVzMSwgYWxsVHlwZXMyKTsKLQkKLQlJVHlwZVtdIGFsbENsYXNzZXMxID0gc3RvcmVkLmdldEFsbENsYXNzZXMoKTsKLQlJVHlwZVtdIGFsbENsYXNzZXMyID0gbG9hZGVkLmdldEFsbENsYXNzZXMoKTsKLQljb21wYXJlKCJbIitmb2N1cysiXSBhbGwgY2xhc3NlcyBhcmUgbm90IHRoZSBzYW1lIiwgYWxsQ2xhc3NlczEsIGFsbENsYXNzZXMyKTsKLQkKLQlJVHlwZVtdIGFsbEludGVyZmFjZXMxID0gc3RvcmVkLmdldEFsbEludGVyZmFjZXMoKTsKLQlJVHlwZVtdIGFsbEludGVyZmFjZXMyID0gbG9hZGVkLmdldEFsbEludGVyZmFjZXMoKTsKLQljb21wYXJlKCJbIitmb2N1cysiXSBhbGwgaW50ZXJmYWNlcyBhcmUgbm90IHRoZSBzYW1lIiwgYWxsSW50ZXJmYWNlczEsIGFsbEludGVyZmFjZXMyKTsKLQkKLQlJVHlwZVtdIHJvb3RDbGFzc2VzMSA9IHN0b3JlZC5nZXRSb290Q2xhc3NlcygpOwotCUlUeXBlW10gcm9vdENsYXNzZXMyID0gbG9hZGVkLmdldFJvb3RDbGFzc2VzKCk7Ci0JY29tcGFyZSgiWyIrZm9jdXMrIl0gYWxsIHJvb3RzIGFyZSBub3QgdGhlIHNhbWUiLCByb290Q2xhc3NlczEsIHJvb3RDbGFzc2VzMik7Ci0JCi0JSVR5cGVbXSByb290SW50ZXJmYWNlczEgPSBzdG9yZWQuZ2V0Um9vdEludGVyZmFjZXMoKTsKLQlJVHlwZVtdIHJvb3RJbnRlcmZhY2VzMiA9IGxvYWRlZC5nZXRSb290SW50ZXJmYWNlcygpOwotCWNvbXBhcmUoIlsiK2ZvY3VzKyJdIGFsbCByb290cyBhcmUgbm90IHRoZSBzYW1lIiwgcm9vdEludGVyZmFjZXMxLCByb290SW50ZXJmYWNlczIpOwotCQotCU9iamVjdFtdIG1pc3NpbmdUeXBlczEgPSBzdG9yZWQubWlzc2luZ1R5cGVzLnRvQXJyYXkoKTsKLQlPYmplY3RbXSBtaXNzaW5nVHlwZXMyID0gbG9hZGVkLm1pc3NpbmdUeXBlcy50b0FycmF5KCk7Ci0JY29tcGFyZSgiWyIrZm9jdXMrIl0gYWxsIG1pc3NpbmcgdHlwZXMgYXJlIG5vdCB0aGUgc2FtZSIsIG1pc3NpbmdUeXBlczEsIG1pc3NpbmdUeXBlczIpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsVHlwZXMxLmxlbmd0aDsgaSsrKSB7Ci0JCUlUeXBlIGFUeXBlID0gYWxsVHlwZXMxW2ldOwotCQkKLQkJaW50IGNhY2hlZEZsYWdzMSA9IHN0b3JlZC5nZXRDYWNoZWRGbGFncyhhVHlwZSk7Ci0JCWludCBjYWNoZWRGbGFnczIgPSBsb2FkZWQuZ2V0Q2FjaGVkRmxhZ3MoYVR5cGUpOwotCQlhc3NlcnRFcXVhbHMoIlsiK2ZvY3VzKyJdIGZsYWdzIGFyZSBub3QgdGhlIHNhbWUgZm9yICIrYVR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksIGNhY2hlZEZsYWdzMSwgY2FjaGVkRmxhZ3MyKTsKLQkJCi0JCUlUeXBlIHN1cGVyY2xhc3MxID0gc3RvcmVkLmdldFN1cGVyY2xhc3MoYVR5cGUpOwotCQlJVHlwZSBzdXBlcmNsYXNzMiA9IGxvYWRlZC5nZXRTdXBlcmNsYXNzKGFUeXBlKTsKLQkJYXNzZXJ0RXF1YWxzKCJbIitmb2N1cysiXSBzdXBlcmNsYXNzIGFyZSBub3QgdGhlIHNhbWUgZm9yICIrYVR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksIHN1cGVyY2xhc3MxLCBzdXBlcmNsYXNzMik7Ci0JCQotCQlJVHlwZVtdIHN1cGVySW50ZXJmYWNlczEgPSBzdG9yZWQuZ2V0U3VwZXJJbnRlcmZhY2VzKGFUeXBlKTsKLQkJSVR5cGVbXSBzdXBlckludGVyZmFjZXMyID0gbG9hZGVkLmdldFN1cGVySW50ZXJmYWNlcyhhVHlwZSk7Ci0JCWNvbXBhcmUoIlsiK2ZvY3VzKyJdIGFsbCBzdXBlciBpbnRlcmZhY2VzIGFyZSBub3QgdGhlIHNhbWUgZm9yICIrYVR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksIHN1cGVySW50ZXJmYWNlczEsIHN1cGVySW50ZXJmYWNlczIpOwotCQkKLQkJSVR5cGVbXSBzdXBlclR5cGVzMSA9IHN0b3JlZC5nZXRTdXBlcnR5cGVzKGFUeXBlKTsKLQkJSVR5cGVbXSBzdXBlclR5cGVzMiA9IGxvYWRlZC5nZXRTdXBlcnR5cGVzKGFUeXBlKTsKLQkJY29tcGFyZSgiWyIrZm9jdXMrIl0gYWxsIHN1cGVyIHR5cGVzIGFyZSBub3QgdGhlIHNhbWUgZm9yICIrYVR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksIHN1cGVyVHlwZXMxLCBzdXBlclR5cGVzMik7Ci0JCQotCQlJVHlwZVtdIHN1YmNsYXNzZXMxID0gc3RvcmVkLmdldFN1YmNsYXNzZXMoYVR5cGUpOwotCQlJVHlwZVtdIHN1YmNsYXNzZXMyID0gbG9hZGVkLmdldFN1YmNsYXNzZXMoYVR5cGUpOwotCQljb21wYXJlKCJbIitmb2N1cysiXSBhbGwgc3ViY2xhc3NlcyBhcmUgbm90IHRoZSBzYW1lIGZvciAiK2FUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLCBzdWJjbGFzc2VzMSwgc3ViY2xhc3NlczIpOwotCQkKLQkJSVR5cGVbXSBzdWJ0eXBlczEgPSBzdG9yZWQuZ2V0U3VidHlwZXMoYVR5cGUpOwotCQlJVHlwZVtdIHN1YnR5cGVzMiA9IGxvYWRlZC5nZXRTdWJ0eXBlcyhhVHlwZSk7Ci0JCWNvbXBhcmUoIlsiK2ZvY3VzKyJdIGFsbCBzdWJ0eXBlcyBhcmUgbm90IHRoZSBzYW1lIGZvciAiK2FUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLCBzdWJ0eXBlczEsIHN1YnR5cGVzMik7Ci0JCQotCQlJVHlwZVtdIGV4dGVuZGluZ0ludGVyZmFjZXMxID0gc3RvcmVkLmdldEV4dGVuZGluZ0ludGVyZmFjZXMoYVR5cGUpOwotCQlJVHlwZVtdIGV4dGVuZGluZ0ludGVyZmFjZXMyID0gbG9hZGVkLmdldEV4dGVuZGluZ0ludGVyZmFjZXMoYVR5cGUpOwotCQljb21wYXJlKCJbIitmb2N1cysiXSBhbGwgZXh0ZW5kaW5nIGludGVyZmFjZXMgYXJlIG5vdCB0aGUgc2FtZSBmb3IgIithVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSwgZXh0ZW5kaW5nSW50ZXJmYWNlczEsIGV4dGVuZGluZ0ludGVyZmFjZXMyKTsKLQkJCi0JCUlUeXBlW10gaW1wbGVtZW50aW5nQ2xhc3NlczEgPSBzdG9yZWQuZ2V0SW1wbGVtZW50aW5nQ2xhc3NlcyhhVHlwZSk7Ci0JCUlUeXBlW10gaW1wbGVtZW50aW5nQ2xhc3NlczIgPSBsb2FkZWQuZ2V0SW1wbGVtZW50aW5nQ2xhc3NlcyhhVHlwZSk7Ci0JCWNvbXBhcmUoIlsiK2ZvY3VzKyJdIGFsbCBpbXBsZW1ldGluZyBjbGFzc2VzIGFyZSBub3QgdGhlIHNhbWUgZm9yICIrYVR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksIGltcGxlbWVudGluZ0NsYXNzZXMxLCBpbXBsZW1lbnRpbmdDbGFzc2VzMik7Ci0JCQotCX0KLX0KLXByaXZhdGUgc3RhdGljIHZvaWQgY29tcGFyZShTdHJpbmcgbXNnLCBPYmplY3RbXSB0eXBlczEsIE9iamVjdFtdIHR5cGVzMikgewotCWlmKHR5cGVzMSA9PSBudWxsKSB7Ci0JCWFzc2VydFRydWUobXNnLCB0eXBlczIgPT0gbnVsbCk7Ci0JfSBlbHNlIHsKLQkJYXNzZXJ0VHJ1ZShtc2csIHR5cGVzMiAhPSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZShtc2csIHR5cGVzMS5sZW5ndGggPT0gdHlwZXMyLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMxLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHR5cGVzMi5sZW5ndGg7IGorKykgewotCQkJCWlmKHR5cGVzMVtpXSA9PSBudWxsICYmIHR5cGVzMVtqXSA9PSBudWxsKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYodHlwZXMxW2ldICE9IG51bGwgJiYgdHlwZXMxW2ldLmVxdWFscyh0eXBlczJbal0pKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKG1zZywgZm91bmQpOwotCQl9Ci0JfQotfQotcHVibGljIHZvaWQgc2V0VXBTdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCXN1cGVyLnNldFVwU3VpdGUoKTsKLQotCXByb2plY3QgPSBzZXRVcEphdmFQcm9qZWN0KFBST0pFQ1ROQU1FKTsKLX0KLQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC5TdWl0ZU9mVGVzdENhc2VzI3RlYXJEb3duU3VpdGUoKQotICovCi1wdWJsaWMgdm9pZCB0ZWFyRG93blN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JZGVsZXRlUHJvamVjdChQUk9KRUNUTkFNRSk7Ci0JCi0Jc3VwZXIudGVhckRvd25TdWl0ZSgpOwotfQotcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0Rm9jdXNIaWVyYXJjaHkoSVR5cGUgdHlwZSwgSUphdmFQcm9qZWN0IHByb2plY3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb257Ci0JSVR5cGVIaWVyYXJjaHkgaDEgPSB0eXBlLm5ld1R5cGVIaWVyYXJjaHkocHJvamVjdCwgbnVsbCk7Ci0KLQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCWgxLnN0b3JlKG91dHB1dFN0cmVhbSwgbnVsbCk7Ci0KLQlieXRlW10gYnl0ZXMgPSBvdXRwdXRTdHJlYW0udG9CeXRlQXJyYXkoKTsKLQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7Ci0JSVR5cGVIaWVyYXJjaHkgaDIgPSB0eXBlLmxvYWRUeXBlSGllcmFjaHkoaW5wdXRTdHJlYW0sIG51bGwpOwotCQotCWNvbXBhcmUodHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSwgaDEsIGgyKTsKLQkKLQloMi5yZWZyZXNoKG51bGwpOwotCWNvbXBhcmUodHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSwgaDEsIGgyKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QwMDEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KFBST0pFQ1ROQU1FLCAic3JjIiwgInAxIiwgIlguamF2YSIpOwotCUlUeXBlIHR5cGUgPSBjdS5nZXRUeXBlKCJYIik7Ci0JdGVzdEZvY3VzSGllcmFyY2h5KHR5cGUsIHByb2plY3QpOwotfQotcHVibGljIHZvaWQgdGVzdDAwMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoUFJPSkVDVE5BTUUsICJzcmMiLCAicDEiLCAiWS5qYXZhIik7Ci0JSVR5cGUgdHlwZSA9IGN1LmdldFR5cGUoIlkiKTsKLQl0ZXN0Rm9jdXNIaWVyYXJjaHkodHlwZSwgcHJvamVjdCk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDAzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdChQUk9KRUNUTkFNRSwgInNyYyIsICJwMSIsICJaLmphdmEiKTsKLQlJVHlwZSB0eXBlID0gY3UuZ2V0VHlwZSgiWiIpOwotCXRlc3RGb2N1c0hpZXJhcmNoeSh0eXBlLCBwcm9qZWN0KTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QwMDQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KFBST0pFQ1ROQU1FLCAic3JjIiwgInAxIiwgIkkxLmphdmEiKTsKLQlJVHlwZSB0eXBlID0gY3UuZ2V0VHlwZSgiSTEiKTsKLQl0ZXN0Rm9jdXNIaWVyYXJjaHkodHlwZSwgcHJvamVjdCk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDA1KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdChQUk9KRUNUTkFNRSwgInNyYyIsICJwMSIsICJJMi5qYXZhIik7Ci0JSVR5cGUgdHlwZSA9IGN1LmdldFR5cGUoIkkyIik7Ci0JdGVzdEZvY3VzSGllcmFyY2h5KHR5cGUsIHByb2plY3QpOwotfQotcHVibGljIHZvaWQgdGVzdDAwNigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoUFJPSkVDVE5BTUUsICJzcmMiLCAicDEiLCAiSTMuamF2YSIpOwotCUlUeXBlIHR5cGUgPSBjdS5nZXRUeXBlKCJJMyIpOwotCXRlc3RGb2N1c0hpZXJhcmNoeSh0eXBlLCBwcm9qZWN0KTsKLX0KLXB1YmxpYyB2b2lkIHRlc3QwMDcoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KFBST0pFQ1ROQU1FLCAic3JjIiwgInAxIiwgIkk0LmphdmEiKTsKLQlJVHlwZSB0eXBlID0gY3UuZ2V0VHlwZSgiSTQiKTsKLQl0ZXN0Rm9jdXNIaWVyYXJjaHkodHlwZSwgcHJvamVjdCk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0MDA4KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdChQUk9KRUNUTkFNRSwgInNyYyIsICJwMSIsICJJNS5qYXZhIik7Ci0JSVR5cGUgdHlwZSA9IGN1LmdldFR5cGUoIkk1Iik7Ci0JdGVzdEZvY3VzSGllcmFyY2h5KHR5cGUsIHByb2plY3QpOwotfQotcHVibGljIHZvaWQgdGVzdDAwOSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoUFJPSkVDVE5BTUUsICJzcmMiLCAicDEiLCAiSTYuamF2YSIpOwotCUlUeXBlIHR5cGUgPSBjdS5nZXRUeXBlKCJJNiIpOwotCXRlc3RGb2N1c0hpZXJhcmNoeSh0eXBlLCBwcm9qZWN0KTsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9UeXBlSGllcmFyY2h5VGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9UeXBlSGllcmFyY2h5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIzNGYxNy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvVHlwZUhpZXJhcmNoeVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLQotcHVibGljIGNsYXNzIFR5cGVIaWVyYXJjaHlUZXN0cyBleHRlbmRzIEFic3RyYWN0SmF2YU1vZGVsVGVzdHMgewotCS8qKgotCSAqIEEgcGxhY2Vob2xkZXIgZm9yIGEgdHlwZSBoaWVyYXJjaHkgdXNlZCBpbiBzb21lIHRlc3QgY2FzZXMuCi0JICovCi0JSVR5cGVIaWVyYXJjaHkgdHlwZUhpZXJhcmNoeTsKLQotcHVibGljIFR5cGVIaWVyYXJjaHlUZXN0cyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCXJldHVybiBuZXcgU3VpdGUoVHlwZUhpZXJhcmNoeVRlc3RzLmNsYXNzKTsKLX0KLQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC5BYnN0cmFjdEphdmFNb2RlbFRlc3RzI3NldFVwU3VpdGUoKQotICovCi1wdWJsaWMgdm9pZCBzZXRVcFN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0Jc3VwZXIuc2V0VXBTdWl0ZSgpOwotCi0Jc2V0VXBKYXZhUHJvamVjdCgiVHlwZUhpZXJhcmNoeSIpOwotCQotCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5nZXRKYXZhUHJvamVjdCgiVHlwZUhpZXJhcmNoeSIpOwotCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QocHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RmlsZSgibGliLmphciIpKTsKLQlJUmVnaW9uIHJlZ2lvbiA9IEphdmFDb3JlLm5ld1JlZ2lvbigpOwotCXJlZ2lvbi5hZGQocm9vdCk7Ci0JdGhpcy50eXBlSGllcmFyY2h5ID0gcHJvamVjdC5uZXdUeXBlSGllcmFyY2h5KHJlZ2lvbiwgbnVsbCk7Ci19Ci0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwuU3VpdGVPZlRlc3RDYXNlcyN0ZWFyRG93blN1aXRlKCkKLSAqLwotcHVibGljIHZvaWQgdGVhckRvd25TdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCXRoaXMudHlwZUhpZXJhcmNoeSA9IG51bGw7Ci0JZGVsZXRlUHJvamVjdCgiVHlwZUhpZXJhcmNoeSIpOwotCQotCXN1cGVyLnRlYXJEb3duU3VpdGUoKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IHRoZSBzdXBlcmNsYXNzIGNhbiBiZSByZXRyaWV2ZWQgZm9yIGEgYmluYXJ5IGlubmVyIHR5cGUuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RCaW5hcnlJbm5lclR5cGVHZXRTdXBlcmNsYXNzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNsYXNzRmlsZSBjZiA9IGdldENsYXNzRmlsZSgiVHlwZUhpZXJhcmNoeSIsICJsaWIuamFyIiwgImJpbmFyeSIsICJZJElubmVyLmNsYXNzIik7Ci0JSVR5cGUgdHlwZSA9IGNmLmdldFR5cGUoKTsKLQlJVHlwZUhpZXJhcmNoeSBoID0gdHlwZS5uZXdTdXBlcnR5cGVIaWVyYXJjaHkobnVsbCk7Ci0JSVR5cGUgc3VwZXJjbGFzcyA9IGguZ2V0U3VwZXJjbGFzcyh0eXBlKTsKLQlhc3NlcnRUcnVlKCJTdXBlcmNsYXNzIG5vdCBmb3VuZCBmb3IgWSRJbm5lciIsIHN1cGVyY2xhc3MgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHN1cGVyIGNsYXNzIiwgIloiLCBzdXBlcmNsYXNzLmdldEVsZW1lbnROYW1lKCkpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgdGhlIHN1cGVyaW50ZXJmYWNlcyBjYW4gYmUgcmV0cmlldmVkIGZvciBhIGJpbmFyeSBpbm5lciB0eXBlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0QmluYXJ5SW5uZXJUeXBlR2V0U3VwZXJJbnRlcmZhY2VzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNsYXNzRmlsZSBjZiA9IGdldENsYXNzRmlsZSgiVHlwZUhpZXJhcmNoeSIsICJsaWIuamFyIiwgImJpbmFyeSIsICJZJElubmVyLmNsYXNzIik7Ci0JSVR5cGUgdHlwZSA9IGNmLmdldFR5cGUoKTsKLQlJVHlwZUhpZXJhcmNoeSBoID0gdHlwZS5uZXdTdXBlcnR5cGVIaWVyYXJjaHkobnVsbCk7Ci0JYXNzZXJ0VHlwZXNFcXVhbCgKLQkJIlVuZXhwZWN0ZWQgc3VwZXIgaW50ZXJmYWNlcyIsIAotCQkiYmluYXJ5LklcbiIsIAotCQloLmdldFN1cGVySW50ZXJmYWNlcyh0eXBlKSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCB0aGUgc3VwZXJjbGFzcyBjYW4gYmUgcmV0cmlldmVkIGZvciBhIGJpbmFyeSB0eXBlJ3Mgc3VwZXJjbGFzcy4KLSAqLwotcHVibGljIHZvaWQgdGVzdEJpbmFyeVR5cGVHZXRTdXBlcmNsYXNzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNsYXNzRmlsZSBjZiA9IGdldENsYXNzRmlsZSgiVHlwZUhpZXJhcmNoeSIsICJsaWIuamFyIiwgImJpbmFyeSIsICJZLmNsYXNzIik7Ci0JSVR5cGUgdHlwZSA9IGNmLmdldFR5cGUoKTsKLQlJVHlwZUhpZXJhcmNoeSBoPSB0eXBlLm5ld1N1cGVydHlwZUhpZXJhcmNoeShudWxsKTsKLQlJVHlwZSBzdXBlcmNsYXNzPSBoLmdldFN1cGVyY2xhc3ModHlwZSk7Ci0JYXNzZXJ0VHJ1ZSgiU3VwZXJjbGFzcyBub3QgZm91bmQgZm9yWSIsIHN1cGVyY2xhc3MgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHN1cGVyY2xhc3Mgb2YgWSIsICJYIiwgc3VwZXJjbGFzcy5nZXRFbGVtZW50TmFtZSgpKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IHRoZSBzdXBlcmNsYXNzIGNhbiBiZSByZXRyaWV2ZWQgZm9yIGEgYmluYXJ5IHR5cGUncyBzdXBlcmNsYXNzLgotICogVGhpcyBpcyBhIHJlbGF0aXZlbHkgZGVlcCB0eXBlIGhpZXJhcmNoeS4KLSAqLwotcHVibGljIHZvaWQgdGVzdEJpbmFyeVR5cGVHZXRTdXBlcmNsYXNzMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlDbGFzc0ZpbGUgY2YgPSBnZXRDbGFzc0ZpbGUoIlR5cGVIaWVyYXJjaHkiLCAibGliLmphciIsICJiaW5hcnkiLCAiRGVlcC5jbGFzcyIpOwotCUlUeXBlIHR5cGUgPSBjZi5nZXRUeXBlKCk7Ci0JSVR5cGVIaWVyYXJjaHkgaD0gdHlwZS5uZXdTdXBlcnR5cGVIaWVyYXJjaHkobnVsbCk7Ci0JSVR5cGUgc3VwZXJjbGFzcz0gaC5nZXRTdXBlcmNsYXNzKHR5cGUpOwotCWFzc2VydFRydWUoIlN1cGVyY2xhc3Mgbm90IGZvdW5kIGZvciBEZWVwIiwgc3VwZXJjbGFzcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgc3VwZXJjbGFzcyBvZiBEZWVwIiwgIloiLCBzdXBlcmNsYXNzLmdldEVsZW1lbnROYW1lKCkpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgdGhlIHN1cGVyaW50ZXJmYWNlcyBjYW4gYmUgcmV0cmlldmVkIGZvciBhIGJpbmFyeSB0eXBlJ3Mgc3VwZXJpbnRlcmZhY2VzLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0QmluYXJ5VHlwZUdldFN1cGVySW50ZXJmYWNlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlDbGFzc0ZpbGUgY2YgPSBnZXRDbGFzc0ZpbGUoIlR5cGVIaWVyYXJjaHkiLCAibGliLmphciIsICJiaW5hcnkiLCAiWC5jbGFzcyIpOwotCUlUeXBlIHR5cGUgPSBjZi5nZXRUeXBlKCk7Ci0JSVR5cGVIaWVyYXJjaHkgaCA9IHR5cGUubmV3U3VwZXJ0eXBlSGllcmFyY2h5KG51bGwpOwotCUlUeXBlW10gc3VwZXJJbnRlcmZhY2VzID0gaC5nZXRTdXBlckludGVyZmFjZXModHlwZSk7Ci0JYXNzZXJ0VHlwZXNFcXVhbCgKLQkJIlVuZXhwZWN0ZWQgc3VwZXIgaW50ZXJmYWNlcyBvZiBYIiwgCi0JCSJiaW5hcnkuSVxuIiwgCi0JCXN1cGVySW50ZXJmYWNlcyk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCB0aGUgc3VwZXJpbnRlcmZhY2VzIGNhbiBiZSByZXRyaWV2ZWQgZm9yIGEgYmluYXJ5IHR5cGUncyBzdXBlcmludGVyZmFjZXMuCi0gKiBUZXN0IHdpdGggdHlwZSB0aGF0IGhhcyBhICJyaWNoIiBzdXBlciBoaWVyYXJjaHkKLSAqLwotcHVibGljIHZvaWQgdGVzdEJpbmFyeVR5cGVHZXRTdXBlckludGVyZmFjZXMyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNsYXNzRmlsZSBjZiA9IGdldENsYXNzRmlsZSgiVHlwZUhpZXJhcmNoeSIsICJsaWIuamFyIiwgInJpY2giLCAiQy5jbGFzcyIpOwotCUlUeXBlIHR5cGUgPSBjZi5nZXRUeXBlKCk7Ci0JSVR5cGVIaWVyYXJjaHkgaCA9IHR5cGUubmV3U3VwZXJ0eXBlSGllcmFyY2h5KG51bGwpOwotCUlUeXBlW10gc3VwZXJJbnRlcmZhY2VzID0gaC5nZXRTdXBlckludGVyZmFjZXModHlwZSk7Ci0JYXNzZXJ0VHlwZXNFcXVhbCgKLQkJIlVuZXhwZWN0ZWQgc3VwZXIgaW50ZXJmYWNlcyBvZiBDIiwgCi0JCSJyaWNoLklcbiIgKwotCQkicmljaC5JM1xuIiwgCi0JCXN1cGVySW50ZXJmYWNlcyk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBjb250YWlucyguLi4pIHJldHVybnMgdHJ1ZSBmb3IgYSB0eXBlIHRoYXQgaXMgcGFydCBvZiB0aGUKLSAqIGhpZXJhcmNoeSBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkvLyByZWd1bGFyIGNsYXNzCi0JSUNsYXNzRmlsZSBjZiA9IGdldENsYXNzRmlsZSgiVHlwZUhpZXJhcmNoeSIsICJsaWIuamFyIiwgImJpbmFyeSIsICJYLmNsYXNzIik7Ci0JSVR5cGUgdHlwZSA9IGNmLmdldFR5cGUoKTsKLQlhc3NlcnRUcnVlKCJYIG11c3QgYmUgaW5jbHVkZWQiLCB0aGlzLnR5cGVIaWVyYXJjaHkuY29udGFpbnModHlwZSkpOwotCi0JLy8gcm9vdCBjbGFzcwotCWNmID0gZ2V0Q2xhc3NGaWxlKCJUeXBlSGllcmFyY2h5IiwgZ2V0RXh0ZXJuYWxKQ0xQYXRoU3RyaW5nKCksICJqYXZhLmxhbmciLCAiT2JqZWN0LmNsYXNzIik7Ci0JdHlwZSA9IGNmLmdldFR5cGUoKTsKLQlhc3NlcnRUcnVlKCJPYmplY3QgbXVzdCBiZSBpbmNsdWRlZCIsIHRoaXMudHlwZUhpZXJhcmNoeS5jb250YWlucyh0eXBlKSk7Ci0KLQkvLyBpbnRlcmZhY2UKLQljZiA9IGdldENsYXNzRmlsZSgiVHlwZUhpZXJhcmNoeSIsICJsaWIuamFyIiwgImJpbmFyeSIsICJJLmNsYXNzIik7Ci0JYXNzZXJ0VHJ1ZSgiSSBtdXN0IGJlIGluY2x1ZGVkIiwgdGhpcy50eXBlSGllcmFyY2h5LmNvbnRhaW5zKHR5cGUpKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGdldFR5cGUoKSByZXR1cm5zIHRoZSB0eXBlIHRoZSBoaWVyYXJjaHkgd2FzIGNyZWF0ZWQgZm9yLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCS8vIGhpZXJhcmNoeSBjcmVhdGVkIG9uIGEgdHlwZQotCUlDbGFzc0ZpbGUgY2YgPSBnZXRDbGFzc0ZpbGUoIlR5cGVIaWVyYXJjaHkiLCAibGliLmphciIsICJiaW5hcnkiLCAiWS5jbGFzcyIpOwotCUlUeXBlIHR5cGUgPSBjZi5nZXRUeXBlKCk7Ci0JSVR5cGVIaWVyYXJjaHkgaGllcmFyY2h5ID0gbnVsbDsKLQl0cnkgewotCQloaWVyYXJjaHkgPSB0eXBlLm5ld1N1cGVydHlwZUhpZXJhcmNoeShudWxsKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0JCWFzc2VydFRydWUoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsIGZhbHNlKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGZvY3VzIHR5cGUiLCB0eXBlLCBoaWVyYXJjaHkuZ2V0VHlwZSgpKTsKLQotCS8vIGhpZXJhcmNoeSBjcmVhdGVkIG9uIGEgcmVnaW9uCi0JYXNzZXJ0VHJ1ZSgiVW5leHBlY3RlZCBmb2N1cyB0eXBlIGZvciBoaWVyYXJjaHkgb24gcmVnaW9uIiwgdGhpcy50eXBlSGllcmFyY2h5LmdldFR5cGUoKSA9PSBudWxsKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgaGllcmFyY2h5IG9uIGFuIGlubmVyIHR5cGUgaXMgY29ycmVjdGx5IHJvb3RlZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdElubmVyVHlwZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIlR5cGVIaWVyYXJjaHkiLCAic3JjIiwgInA1IiwgIlguamF2YSIpLmdldFR5cGUoIlgiKS5nZXRUeXBlKCJJbm5lciIpOwotCUlUeXBlSGllcmFyY2h5IGhpZXJhcmNoeSA9IG51bGw7Ci0JdHJ5IHsKLQkJaGllcmFyY2h5ID0gdHlwZS5uZXdUeXBlSGllcmFyY2h5KG51bGwpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwgZmFsc2UpOwotCX0KLQlhc3NlcnRFcXVhbHMoCi0JCSJVbmV4cGVjdGVkIGhpZXJhcmNoeSIsIAotCQkiRm9jdXM6IHA1LlgkSW5uZXJcbiIgKwotCQkiU3VwZXIgdHlwZXM6XG4iICsKLQkJIiAgSW5uZXIgW2luIFggW2luIFguamF2YSBbaW4gcDUgW2luIHNyYyBbaW4gVHlwZUhpZXJhcmNoeV1dXV1dXG4iICsKLQkJIiAgICBPYmplY3QgW2luIE9iamVjdC5jbGFzcyBbaW4gamF2YS5sYW5nIFtpbiAiICsgZ2V0RXh0ZXJuYWxKQ0xQYXRoKCkgKyAiIFtpbiBUeXBlSGllcmFyY2h5XV1dXVxuIiArCi0JCSJTdWIgdHlwZXM6XG4iICsKLQkJIiAgSW5uZXIgW2luIFggW2luIFguamF2YSBbaW4gcDUgW2luIHNyYyBbaW4gVHlwZUhpZXJhcmNoeV1dXV1dXG4iLAotCQloaWVyYXJjaHkudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBhIGhpZXJhcmNoeSBvbiBhIHR5cGUgdGhhdCBpbXBsZW1lbnRzIGEgbWlzc2luZyBpbnRlcmZhY2UgaXMgY29ycmVjdGx5IHJvb3RlZC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAyNDY5MSBNaXNzaW5nIGludGVyZmFjZSBtYWtlcyBoaWVyYXJjaHkgaW5jb21wbGV0ZSkKLSAqLwotcHVibGljIHZvaWQgdGVzdE1pc3NpbmdJbnRlcmZhY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJUeXBlSGllcmFyY2h5IiwgInNyYyIsICJwNCIsICJYLmphdmEiKS5nZXRUeXBlKCJYIik7Ci0JSVR5cGVIaWVyYXJjaHkgaGllcmFyY2h5ID0gbnVsbDsKLQl0cnkgewotCQloaWVyYXJjaHkgPSB0eXBlLm5ld1R5cGVIaWVyYXJjaHkobnVsbCk7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgewotCQlhc3NlcnRUcnVlKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLCBmYWxzZSk7Ci0JfQotCWFzc2VydEVxdWFscygKLQkJIlVuZXhwZWN0ZWQgaGllcmFyY2h5IiwgCi0JCSJGb2N1czogcDQuWFxuIiArCi0JCSJTdXBlciB0eXBlczpcbiIgKwotCQkiICBYIFtpbiBYLmphdmEgW2luIHA0IFtpbiBzcmMgW2luIFR5cGVIaWVyYXJjaHldXV1dXG4iICsKLQkJIiAgICBPYmplY3QgW2luIE9iamVjdC5jbGFzcyBbaW4gamF2YS5sYW5nIFtpbiAiICsgZ2V0RXh0ZXJuYWxKQ0xQYXRoKCkgKyAiIFtpbiBUeXBlSGllcmFyY2h5XV1dXVxuIiArCi0JCSJTdWIgdHlwZXM6XG4iICsKLQkJIiAgWCBbaW4gWC5qYXZhIFtpbiBwNCBbaW4gc3JjIFtpbiBUeXBlSGllcmFyY2h5XV1dXVxuIiwKLQkJaGllcmFyY2h5LnRvU3RyaW5nKCkpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSBwb3RlbnRpYWwgc3VidHlwZSB0aGF0IGlzIG5vdCBpbiB0aGUgY2xhc3NwdGggaXMgaGFuZGxlIGNvcnJlY3RseS4KLSAqIChSZWdyZXNzaW9uIHRlc3QgZm9yIFBSICMxRzRHTDlSKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0UG90ZW50aWFsU3VidHlwZU5vdEluQ2xhc3NwYXRoKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUphdmFQcm9qZWN0IHByb2plY3QgPSBnZXRKYXZhUHJvamVjdCgiVHlwZUhpZXJhcmNoeSIpOwotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlR5cGVIaWVyYXJjaHkiLCAic3JjIiwgInAxIiwgIlguamF2YSIpOwotCUlUeXBlIHR5cGUgPSBjdS5nZXRUeXBlKCJYIik7Ci0JSVR5cGVIaWVyYXJjaHkgaCA9IHR5cGUubmV3VHlwZUhpZXJhcmNoeShwcm9qZWN0LCBudWxsKTsKLQlJVHlwZVtdIHR5cGVzID0gaC5nZXRTdWJ0eXBlcyh0eXBlKTsKLQl0aGlzLmFzc2VydFR5cGVzRXF1YWwoCi0JCSJVbmV4cGVjdGVkIHN1YiB0eXBlcyBvZiBYIiwKLQkJInAxLllcbiIsCi0JCXR5cGVzCi0JKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IHRoZSBzdXBlcmNsYXNzIGNhbiBiZSByZXRyaWV2ZWQgZm9yIGEgc291cmNlIHR5cGUncyB1bnF1YWxpZmllZCBzdXBlcmNsYXNzLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0U291cmNlVHlwZUdldFN1cGVyY2xhc3MoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkvL3VucXVhbGlmaWVkIHN1cGVyY2xhc3MgaW4gYSBzb3VyY2UgdHlwZQotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlR5cGVIaWVyYXJjaHkiLCAic3JjIiwgInAxIiwgIlkuamF2YSIpOwotCUlUeXBlIHR5cGUgPSBjdS5nZXRUeXBlKCJZIik7Ci0JSVR5cGVIaWVyYXJjaHkgaCA9IHR5cGUubmV3U3VwZXJ0eXBlSGllcmFyY2h5KG51bGwpOwotCUlUeXBlIHN1cGVyY2xhc3MgPSBoLmdldFN1cGVyY2xhc3ModHlwZSk7Ci0JYXNzZXJ0VHJ1ZSgiU3VwZXJjbGFzcyBub3QgZm91bmQgZm9yIFkiLCBzdXBlcmNsYXNzICE9IG51bGwpOwotCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBzdXBlciBjbGFzcyBmb3IgWSIsICJYIiwgc3VwZXJjbGFzcy5nZXRFbGVtZW50TmFtZSgpKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IHRoZSBzdXBlcmNsYXNzIGNhbiBiZSByZXRyaWV2ZWQgZm9yIGEgc291cmNlIHR5cGUncyBzdXBlcmNsYXNzIHdoZW4gbm8gc3VwZXJjbGFzcyBpcyBzcGVjaWZpZWQKLSAqIGluIHRoZSBzb3VyY2UgdHlwZS4KLSAqLwotcHVibGljIHZvaWQgdGVzdFNvdXJjZVR5cGVHZXRTdXBlcmNsYXNzMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCS8vbm8gc3VwZXJjbGFzcyBzcGVjaWZpZWQgZm9yIGEgc291cmNlIHR5cGUKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJUeXBlSGllcmFyY2h5IiwgInNyYyIsICJwMSIsICJYLmphdmEiKTsKLQlJVHlwZSB0eXBlID0gY3UuZ2V0VHlwZSgiWCIpOwotCUlUeXBlSGllcmFyY2h5IGggPSB0eXBlLm5ld1N1cGVydHlwZUhpZXJhcmNoeShudWxsKTsKLQlJVHlwZSBzdXBlcmNsYXNzID0gaC5nZXRTdXBlcmNsYXNzKHR5cGUpOwotCWFzc2VydFRydWUoIlN1cGVyY2xhc3Mgbm90IGZvdW5kIGZvciBYIiwgc3VwZXJjbGFzcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgc3VwZXIgY2xhc3MgZm9yIFgiLCAiT2JqZWN0Iiwgc3VwZXJjbGFzcy5nZXRFbGVtZW50TmFtZSgpKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IHRoZSBzdXBlcmNsYXNzIGNhbiBiZSByZXRyaWV2ZWQgZm9yIGEgc291cmNlIHR5cGUncyBzdXBlcmNsYXNzLgotICogVGhpcyB0eXBlIGhpZXJhcmNoeSBpcyByZWxhdGl2ZWx5IGRlZXAuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTb3VyY2VUeXBlR2V0U3VwZXJjbGFzczMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkvL25vIHN1cGVyY2xhc3Mgc3BlY2lmaWVkIGZvciBhIHNvdXJjZSB0eXBlCi0JSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiVHlwZUhpZXJhcmNoeSIsICJzcmMiLCAicDEiLCAiRGVlcC5qYXZhIik7Ci0JSVR5cGUgdHlwZSA9IGN1LmdldFR5cGUoIkRlZXAiKTsKLQlJVHlwZUhpZXJhcmNoeSBoID0gdHlwZS5uZXdTdXBlcnR5cGVIaWVyYXJjaHkobnVsbCk7Ci0JSVR5cGUgc3VwZXJjbGFzcyA9IGguZ2V0U3VwZXJjbGFzcyh0eXBlKTsKLQlhc3NlcnRUcnVlKCJTdXBlcmNsYXNzIG5vdCBmb3VuZCBmb3IgRGVlcCIsIHN1cGVyY2xhc3MgIT0gbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHN1cGVyIGNsYXNzIGZvciBEZWVwIiwgIloiLCBzdXBlcmNsYXNzLmdldEVsZW1lbnROYW1lKCkpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgdGhlIHN1cGVyY2xhc3MgY2FuIGJlIHJldHJpZXZlZCB3aGVuIGl0IGlzIGRlZmluZWQKLSAqIGluIHRoZSBzYW1lIGNvbXBpbGF0aW9uIHVuaXQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTb3VyY2VUeXBlR2V0U3VwZXJjbGFzczQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJUeXBlSGllcmFyY2h5IiwgInNyYyIsICJwMSIsICJBLmphdmEiKTsKLQlJVHlwZSB0eXBlID0gY3UuZ2V0VHlwZSgiQSIpOwotCUlUeXBlSGllcmFyY2h5IGggPSB0eXBlLm5ld1N1cGVydHlwZUhpZXJhcmNoeShudWxsKTsKLQlJVHlwZSBzdXBlcmNsYXNzID0gaC5nZXRTdXBlcmNsYXNzKHR5cGUpOwotCWFzc2VydFRydWUoIlN1cGVyY2xhc3Mgbm90IGZvdW5kIGZvciBBIiwgc3VwZXJjbGFzcyAhPSBudWxsKTsKLQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgc3VwZXIgY2xhc3MgZm9yIEEiLCAiQiIsIHN1cGVyY2xhc3MuZ2V0RWxlbWVudE5hbWUoKSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCB0aGUgc3VwZXJpbnRlcmZhY2VzIGNhbiBiZSByZXRyaWV2ZWQgZm9yIGEgc291cmNlIHR5cGUncyBzdXBlcmludGVyZmFjZXMuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTb3VyY2VUeXBlR2V0U3VwZXJJbnRlcmZhY2VzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiVHlwZUhpZXJhcmNoeSIsICJzcmMiLCAicDEiLCAiWS5qYXZhIik7Ci0JSVR5cGUgdHlwZSA9IGN1LmdldFR5cGUoIlkiKTsKLQlJVHlwZUhpZXJhcmNoeSBoID0gdHlwZS5uZXdTdXBlcnR5cGVIaWVyYXJjaHkobnVsbCk7Ci0JSVR5cGVbXSBzdXBlckludGVyZmFjZXMgPSBoLmdldFN1cGVySW50ZXJmYWNlcyh0eXBlKTsKLQlhc3NlcnRUeXBlc0VxdWFsKCJVbmV4cGVjdGVkIHN1cGVyIGludGVyZmFjZXMgZm9yIFkiLCAKLQkJInAxLkkxXG4iICsKLQkJInAxLkkyXG4iLCAKLQkJc3VwZXJJbnRlcmZhY2VzKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IG5vIHN1YmNsYXNzZXMgZXhpc3QgaW4gYSBzdXBlciB0eXBlIGhpZXJhcmNoeSBmb3IgdGhlIGZvY3VzIHR5cGUuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTdXBlcnR5cGVIaWVyYXJjaHlHZXRTdWJjbGFzc2VzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENsYXNzRmlsZSgiVHlwZUhpZXJhcmNoeSIsIGdldEV4dGVybmFsSkNMUGF0aFN0cmluZygpLCAiamF2YS5sYW5nIiwgIk9iamVjdC5jbGFzcyIpLmdldFR5cGUoKTsKLQlJVHlwZUhpZXJhcmNoeSBoaWVyYXJjaHkgPSB0eXBlLm5ld1N1cGVydHlwZUhpZXJhcmNoeShudWxsKTsKLQlJVHlwZVtdIHR5cGVzID0gaGllcmFyY2h5LmdldFN1YmNsYXNzZXModHlwZSk7Ci0JYXNzZXJ0VHlwZXNFcXVhbCgKLQkJIlVuZXhwZWN0ZWQgc3ViY2xhc3NlcyBvZiBPYmplY3QiLCAKLQkJIiIsIAotCQl0eXBlcyk7Ci0JCi0JSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgiVHlwZUhpZXJhcmNoeSIsICJzcmMiLCAicDEiLCAiWS5qYXZhIik7Ci0JdHlwZSA9IGN1LmdldFR5cGUoIlkiKTsKLQloaWVyYXJjaHkgPSB0eXBlLm5ld1N1cGVydHlwZUhpZXJhcmNoeShudWxsKTsKLQl0eXBlcyA9IGhpZXJhcmNoeS5nZXRTdWJjbGFzc2VzKHR5cGUpOwotCWFzc2VydFR5cGVzRXF1YWwoCi0JCSJVbmV4cGVjdGVkIHN1YmNsYXNzZXMgb2YgWSIsIAotCQkiIiwgCi0JCXR5cGVzKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IG5vIHN1YnR5cGVzIGV4aXN0IGluIGEgc3VwZXIgdHlwZSBoaWVyYXJjaHkgZm9yIHRoZSBmb2N1cyB0eXBlLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0U3VwZXJ0eXBlSGllcmFyY2h5R2V0U3VidHlwZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q2xhc3NGaWxlKCJUeXBlSGllcmFyY2h5IiwgZ2V0RXh0ZXJuYWxKQ0xQYXRoU3RyaW5nKCksICJqYXZhLmxhbmciLCAiT2JqZWN0LmNsYXNzIikuZ2V0VHlwZSgpOwotCUlUeXBlSGllcmFyY2h5IGhpZXJhcmNoeSA9IHR5cGUubmV3U3VwZXJ0eXBlSGllcmFyY2h5KG51bGwpOwotCUlUeXBlW10gdHlwZXMgPSBoaWVyYXJjaHkuZ2V0U3VidHlwZXModHlwZSk7Ci0JYXNzZXJ0VHlwZXNFcXVhbCgKLQkJIlVuZXhwZWN0ZWQgc3VidHlwZXMgb2YgT2JqZWN0IiwgCi0JCSIiLCAKLQkJdHlwZXMpOwotCQotCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoIlR5cGVIaWVyYXJjaHkiLCAic3JjIiwgInAxIiwgIlkuamF2YSIpOwotCXR5cGUgPSBjdS5nZXRUeXBlKCJZIik7Ci0JaGllcmFyY2h5ID0gdHlwZS5uZXdTdXBlcnR5cGVIaWVyYXJjaHkobnVsbCk7Ci0JdHlwZXMgPSBoaWVyYXJjaHkuZ2V0U3VidHlwZXModHlwZSk7Ci0JYXNzZXJ0VHlwZXNFcXVhbCgKLQkJIlVuZXhwZWN0ZWQgc3VidHlwZXMgb2YgWSIsIAotCQkiIiwgCi0JCXR5cGVzKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGEgc3VwZXIgdHlwZSBoaWVyYXJjaHkgY2FuIGJlIGNyZWF0ZWQgb24gYSB3b3JraW5nIGNvcHkuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMzQ0NiB0eXBlIGhpZXJhcmNoeTogaW5jb3JyZWN0IGJlaGF2aW9yIHdydCB3b3JraW5nIGNvcGllcyAoMUdMREhPQSkpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTdXBlcnR5cGVIaWVyYXJjaHlPbldvcmtpbmdDb3B5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuZ2V0Q29tcGlsYXRpb25Vbml0KCJUeXBlSGllcmFyY2h5IiwgInNyYyIsICJ3YyIsICJYLmphdmEiKTsKLQlJQ29tcGlsYXRpb25Vbml0IHdvcmtpbmdDb3B5ID0gbnVsbDsKLQl0cnkgewotCQl3b3JraW5nQ29weSA9IChJQ29tcGlsYXRpb25Vbml0KWN1LmdldFdvcmtpbmdDb3B5KCk7Ci0JCXdvcmtpbmdDb3B5LmNyZWF0ZVR5cGUoCi0JCQkiY2xhc3MgQntcbiIgKwotCQkJIgl2b2lkIG0oKXtcbiIgKwotCQkJIgl9XG4iICsKLQkJCSIJdm9pZCBmKCl7XG4iICsKLQkJCSIJCW0oKTtcbiIgKwotCQkJIgl9XG4iICsKLQkJCSJ9XG4iLAotCQkJbnVsbCwKLQkJCXRydWUsCi0JCQludWxsKTsKLQkJd29ya2luZ0NvcHkuY3JlYXRlVHlwZSgKLQkJCSJjbGFzcyBBIGV4dGVuZHMgQntcbiIgKwotCQkJIgl2b2lkIG0oKXtcbiIgKwotCQkJIgl9XG4iICsKLQkJCSJ9IiwKLQkJCW51bGwsCi0JCQl0cnVlLAotCQkJbnVsbCk7Ci0JCUlUeXBlIHR5cGVBID0gd29ya2luZ0NvcHkuZ2V0VHlwZSgiQSIpOwotCQlJVHlwZUhpZXJhcmNoeSBoaWVyYXJjaHkgPSB0eXBlQS5uZXdTdXBlcnR5cGVIaWVyYXJjaHkobnVsbCk7Ci0JCUlUeXBlIHR5cGVCID0gd29ya2luZ0NvcHkuZ2V0VHlwZSgiQiIpOwotCQlhc3NlcnRUcnVlKCJoaWVyYXJjaHkgc2hvdWxkIGNvbnRhaW4gQiIsIGhpZXJhcmNoeS5jb250YWlucyh0eXBlQikpOwotCX0gZmluYWxseSB7Ci0JCWlmICh3b3JraW5nQ29weSAhPSBudWxsKSB7Ci0JCQl3b3JraW5nQ29weS5kZXN0cm95KCk7Ci0JCX0KLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCB0aGUgY3JlYXRpb24gb2YgYSB0eXBlIGhpZXJhcmNoeSBjYW4gYmUgY2FuY2VsbGVkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q2FuY2VsKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JYm9vbGVhbiBpc0NhbmNlbGVkID0gZmFsc2U7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiVHlwZUhpZXJhcmNoeSIsICJzcmMiLCAicDEiLCAiWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCUlSZWdpb24gcmVnaW9uID0gSmF2YUNvcmUubmV3UmVnaW9uKCk7Ci0JcmVnaW9uLmFkZChnZXRQYWNrYWdlRnJhZ21lbnRSb290KCJUeXBlSGllcmFyY2h5IiwgInNyYyIpKTsKLQl0cnkgewotCQlUZXN0UHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBUZXN0UHJvZ3Jlc3NNb25pdG9yLmdldEluc3RhbmNlKCk7Ci0JCW1vbml0b3Iuc2V0Q2FuY2VsbGVkQ291bnRlcigxKTsKLQkJdHlwZS5nZXRKYXZhUHJvamVjdCgpLm5ld1R5cGVIaWVyYXJjaHkodHlwZSwgcmVnaW9uLCBtb25pdG9yKTsKLQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCWlzQ2FuY2VsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJPcGVyYXRpb24gc2hvdWxkIGhhdmUgdGhyb3duIGFuIG9wZXJhdGlvbiBjYW5jZWxlZCBleGNlcHRpb24iLCBpc0NhbmNlbGVkKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGUgY29ycmVjdG5lc3Mgb2YgYWxsIGNsYXNzZXMgaW4gYSB0eXBlIGhpZXJhcmNoeSBiYXNlZCBvbiBhIHJlZ2lvbi4KLSAqLwotcHVibGljIHZvaWQgdGVzdEdldEFsbENsYXNzZXNJblJlZ2lvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlUeXBlW10gdHlwZXMgPSB0aGlzLnR5cGVIaWVyYXJjaHkuZ2V0QWxsQ2xhc3NlcygpOwotCWFzc2VydFR5cGVzRXF1YWwoCi0JCSJVbmV4cGVjdGVkIGFsbCBjbGFzc2VzIGluIGhpZXJhcmNoeSIsIAotCQkiYmluYXJ5LkRlZXBcbiIgKwotCQkiYmluYXJ5LlhcbiIgKwotCQkiYmluYXJ5LllcbiIgKwotCQkiYmluYXJ5LlkkSW5uZXJcbiIgKwotCQkiYmluYXJ5LlpcbiIgKwotCQkiamF2YS5sYW5nLk9iamVjdFxuIiArCi0JCSJyaWNoLkFcbiIgKwotCQkicmljaC5CXG4iICsKLQkJInJpY2guQ1xuIiwgCi0JCXR5cGVzKTsKLX0KLQotCi0vKioKLSAqIEVuc3VyZXMgdGhlIGNvcnJlY3RuZXNzIG9mIGFsbCBpbnRlcmZhY2VzIGluIGEgdHlwZSBoaWVyYXJjaHkgYmFzZWQgb24gYSByZWdpb24uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXRBbGxJbnRlcmZhY2VzSW5SZWdpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJVHlwZVtdIHR5cGVzID0gdGhpcy50eXBlSGllcmFyY2h5LmdldEFsbEludGVyZmFjZXMoKTsKLQlhc3NlcnRUeXBlc0VxdWFsKAotCQkiVW5leHBlY3RlZCBhbGwgaW50ZXJmYWNlcyBpbiBoaWVyYXJjaHkiLCAKLQkJImJpbmFyeS5JXG4iICsKLQkJInJpY2guSVxuIiArCi0JCSJyaWNoLkkyXG4iICsKLQkJInJpY2guSTNcbiIsIAotCQl0eXBlcyk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCB0aGUgY29ycmVjdCBzdWJ0eXBlcyBvZiBhIHR5cGUgZXhpc3QgaW4gdGhlIHR5cGUgCi0gKiBoaWVyYXJjaHkuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXRBbGxTdWJ0eXBlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDb21waWxhdGlvblVuaXQoIlR5cGVIaWVyYXJjaHkiLCAic3JjIiwgInAxIiwgIlguamF2YSIpLmdldFR5cGUoIlgiKTsKLQlJVHlwZUhpZXJhcmNoeSBoaWVyYXJjaHkgPSB0eXBlLm5ld1R5cGVIaWVyYXJjaHkobnVsbCk7Ci0JSVR5cGVbXSB0eXBlcyA9IGhpZXJhcmNoeS5nZXRBbGxTdWJ0eXBlcyh0eXBlKTsKLQl0aGlzLmFzc2VydFR5cGVzRXF1YWwoCi0JCSJVbmV4cGVjdGVkIHN1YiB0eXBlcyBvZiBYIiwKLQkJInAxLkRlZXBcbiIgKwotCQkicDEuWVxuIiArCi0JCSJwMS5aXG4iLAotCQl0eXBlcwotCSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCB0aGUgY29ycmVjdCBzdWJ0eXBlcyBvZiBhIGJpbmFyeSB0eXBlCi0gKiBleGl0IGluIHRoZSB0eXBlIGhpZXJhcmNoeSBjcmVhdGVkIG9uIGEgcmVnaW9uLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0R2V0QWxsU3VidHlwZXNGcm9tQmluYXJ5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENsYXNzRmlsZSgiVHlwZUhpZXJhcmNoeSIsICJsaWIuamFyIiwgImJpbmFyeSIsICJYLmNsYXNzIikuZ2V0VHlwZSgpOwotCUlSZWdpb24gcmVnaW9uID0gSmF2YUNvcmUubmV3UmVnaW9uKCk7Ci0JcmVnaW9uLmFkZCh0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpKTsKLQlJVHlwZUhpZXJhcmNoeSBoaWVyYXJjaHkgPSB0eXBlLmdldEphdmFQcm9qZWN0KCkubmV3VHlwZUhpZXJhcmNoeSh0eXBlLCByZWdpb24sIG51bGwpOwotCUlUeXBlW10gdHlwZXMgPSBoaWVyYXJjaHkuZ2V0QWxsU3VidHlwZXModHlwZSk7Ci0JYXNzZXJ0VHlwZXNFcXVhbCgKLQkJIlVuZXhwZWN0ZWQgYWxsIHN1YnR5cGVzIG9mIGJpbmFyeS5YIiwgCi0JCSJiaW5hcnkuRGVlcFxuIiArCi0JCSJiaW5hcnkuWVxuIiArCi0JCSJiaW5hcnkuWSRJbm5lclxuIiArCi0JCSJiaW5hcnkuWlxuIiwgCi0JCXR5cGVzKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IHRoZSBjb3JyZWN0IHN1cGVyY2xhc3NlcyBvZiBhIHR5cGUgZXhpc3QgaW4gdGhlIHR5cGUgCi0gKiBoaWVyYXJjaHkuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXRBbGxTdXBlcmNsYXNzZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJUeXBlSGllcmFyY2h5IiwgInNyYyIsICJwMSIsICJaLmphdmEiKS5nZXRUeXBlKCJaIik7Ci0JSVR5cGVIaWVyYXJjaHkgaGllcmFyY2h5ID0gdHlwZS5uZXdUeXBlSGllcmFyY2h5KG51bGwpOwotCUlUeXBlW10gdHlwZXMgPSBoaWVyYXJjaHkuZ2V0QWxsU3VwZXJjbGFzc2VzKHR5cGUpOwotCWFzc2VydFR5cGVzRXF1YWwoCi0JCSJVbmV4cGVjdGVkIGFsbCBzdXBlciBjbGFzc2VzIG9mIFoiLCAKLQkJImphdmEubGFuZy5PYmplY3RcbiIgKyAKLQkJInAxLlhcbiIgKyAKLQkJInAxLllcbiIsCi0JCXR5cGVzKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IHRoZSBjb3JyZWN0IHN1cGVyaW50ZXJmYWNlcyBvZiBhIHR5cGUgZXhpc3QgaW4gdGhlIHR5cGUgCi0gKiBoaWVyYXJjaHkuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXRBbGxTdXBlckludGVyZmFjZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJUeXBlSGllcmFyY2h5IiwgInNyYyIsICJwMSIsICJaLmphdmEiKS5nZXRUeXBlKCJaIik7Ci0JSVR5cGVIaWVyYXJjaHkgaGllcmFyY2h5ID0gdHlwZS5uZXdUeXBlSGllcmFyY2h5KG51bGwpOwotCUlUeXBlW10gdHlwZXMgPSBoaWVyYXJjaHkuZ2V0QWxsU3VwZXJJbnRlcmZhY2VzKHR5cGUpOwotCWFzc2VydFR5cGVzRXF1YWwoCi0JCSJVbmV4cGVjdGVkIHN1cGVyIGludGVyZmFjZXMgb2YgWiIsIAotCQkicDEuSTFcbiIgKyAKLQkJInAxLkkyXG4iLAotCQl0eXBlcyk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCB0aGUgY29ycmVjdCBzdXBlcnR5cGVzIG9mIGEgdHlwZSBleGlzdCBpbiB0aGUgdHlwZSAKLSAqIGhpZXJhcmNoeS4KLSAqLwotcHVibGljIHZvaWQgdGVzdEdldEFsbFN1cGVydHlwZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJUeXBlSGllcmFyY2h5IiwgInNyYyIsICJwMSIsICJaLmphdmEiKS5nZXRUeXBlKCJaIik7Ci0JSVR5cGVIaWVyYXJjaHkgaGllcmFyY2h5ID0gdHlwZS5uZXdUeXBlSGllcmFyY2h5KG51bGwpOwotCUlUeXBlW10gdHlwZXMgPSBoaWVyYXJjaHkuZ2V0QWxsU3VwZXJ0eXBlcyh0eXBlKTsKLQlhc3NlcnRUeXBlc0VxdWFsKAotCQkiVW5leHBlY3RlZCBhbGwgc3VwZXIgdHlwZXMgb2YgWiIsIAotCQkiamF2YS5sYW5nLk9iamVjdFxuIiArIAotCQkicDEuSTFcbiIgKyAKLQkJInAxLkkyXG4iICsgCi0JCSJwMS5YXG4iICsgCi0JCSJwMS5ZXG4iLAotCQl0eXBlcyk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCB0aGUgY29ycmVjdCBzdXBlcnR5cGVzIG9mIGEgdHlwZSBleGlzdCBpbiB0aGUgdHlwZSAKLSAqIGhpZXJhcmNoeS4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAyMzY0NCBoaWVyYXJjaHk6IGdldEFsbFN1cGVyVHlwZXMgZG9lcyBub3QgaW5jbHVkZSBhbGwgc3VwZXJpbnRlcmZhY2VzPykKLSAqLwotcHVibGljIHZvaWQgdGVzdEdldEFsbFN1cGVydHlwZXMyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiVHlwZUhpZXJhcmNoeSIsICJzcmMiLCAicDMiLCAiQi5qYXZhIikuZ2V0VHlwZSgiQiIpOwotCUlUeXBlSGllcmFyY2h5IGhpZXJhcmNoeSA9IHR5cGUubmV3VHlwZUhpZXJhcmNoeShudWxsKTsKLQlJVHlwZVtdIHR5cGVzID0gaGllcmFyY2h5LmdldEFsbFN1cGVydHlwZXModHlwZSk7Ci0JYXNzZXJ0VHlwZXNFcXVhbCgKLQkJIlVuZXhwZWN0ZWQgYWxsIHN1cGVyIHR5cGVzIG9mIEIiLCAKLQkJImphdmEubGFuZy5PYmplY3RcbiIgKwotCQkicDMuQVxuIiArCi0JCSJwMy5JXG4iICsKLQkJInAzLkkxXG4iLAotCQl0eXBlcyk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCB0aGUgY29ycmVjdCB0eXBlcyBleGlzdCBpbiB0aGUgdHlwZSAKLSAqIGhpZXJhcmNoeS4KLSAqLwotcHVibGljIHZvaWQgdGVzdEdldEFsbFR5cGVzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiVHlwZUhpZXJhcmNoeSIsICJzcmMiLCAicDEiLCAiWS5qYXZhIikuZ2V0VHlwZSgiWSIpOwotCUlUeXBlSGllcmFyY2h5IGhpZXJhcmNoeSA9IHR5cGUubmV3VHlwZUhpZXJhcmNoeShudWxsKTsKLQl0aGlzLmFzc2VydFR5cGVzRXF1YWwoCi0JCSJVbmV4cGVjdGVkIHR5cGVzIGluIGhpZXJhcmNoeSBvZiBZIiwKLQkJImphdmEubGFuZy5PYmplY3RcbiIgKyAKLQkJInAxLkRlZXBcbiIgKyAKLQkJInAxLkkxXG4iICsgCi0JCSJwMS5JMlxuIiArIAotCQkicDEuWFxuIiArIAotCQkicDEuWVxuIiArIAotCQkicDEuWlxuIiwKLQkJaGllcmFyY2h5LmdldEFsbFR5cGVzKCkKLQkpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgdGhlIGNvcnJlY3QgZXh0ZW5kaW5nIGludGVyZmFjZXMgZXhpc3QgaW4gdGhlIHR5cGUgCi0gKiBoaWVyYXJjaHkuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXRFeHRlbmRpbmdJbnRlcmZhY2VzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiVHlwZUhpZXJhcmNoeSIsICJzcmMiLCAicDIiLCAiSS5qYXZhIikuZ2V0VHlwZSgiSSIpOwotCUlUeXBlSGllcmFyY2h5IGhpZXJhcmNoeSA9IHR5cGUubmV3VHlwZUhpZXJhcmNoeShudWxsKTsKLQlJVHlwZVtdIHR5cGVzID0gaGllcmFyY2h5LmdldEV4dGVuZGluZ0ludGVyZmFjZXModHlwZSk7Ci0JdGhpcy5hc3NlcnRUeXBlc0VxdWFsKAotCQkiVW5leHBlY3RlZCBleHRlbmRpbmcgaW50ZXJmYWNlcyBvZiBJIiwKLQkJInAyLkkxXG4iICsgCi0JCSJwMi5JMlxuIiwKLQkJdHlwZXMKLQkpOwotCi0JdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiVHlwZUhpZXJhcmNoeSIsICJzcmMiLCAicDIiLCAiWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCWhpZXJhcmNoeSA9IHR5cGUubmV3VHlwZUhpZXJhcmNoeShudWxsKTsKLQl0eXBlcyA9IGhpZXJhcmNoeS5nZXRFeHRlbmRpbmdJbnRlcmZhY2VzKHR5cGUpOwotCXRoaXMuYXNzZXJ0VHlwZXNFcXVhbCgKLQkJIlVuZXhwZWN0ZWQgZXh0ZW5kaW5nIGludGVyZmFjZXMgb2YgWCIsCi0JCSIiLCAvLyBpbnRlcmZhY2VzIGNhbm5vdCBleHRlbmQgYSBjbGFzcwotCQl0eXBlcwotCSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCB0aGUgY29ycmVjdCBpbXBsZW1lbnRpbmcgaW50ZXJmYWNlcyBleGlzdCBpbiB0aGUgdHlwZSAKLSAqIGhpZXJhcmNoeS4KLSAqLwotcHVibGljIHZvaWQgdGVzdEdldEltcGxlbWVudGluZ0NsYXNzZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJUeXBlSGllcmFyY2h5IiwgInNyYyIsICJwMiIsICJJLmphdmEiKS5nZXRUeXBlKCJJIik7Ci0JSVR5cGVIaWVyYXJjaHkgaGllcmFyY2h5ID0gdHlwZS5uZXdUeXBlSGllcmFyY2h5KG51bGwpOwotCUlUeXBlW10gdHlwZXMgPSBoaWVyYXJjaHkuZ2V0SW1wbGVtZW50aW5nQ2xhc3Nlcyh0eXBlKTsKLQl0aGlzLmFzc2VydFR5cGVzRXF1YWwoCi0JCSJVbmV4cGVjdGVkIGltcGxlbWVudGluZyBjbGFzc2VzIG9mIEkiLAotCQkicDIuWFxuIiwKLQkJdHlwZXMKLQkpOwotCi0JdHlwZSA9IGdldENvbXBpbGF0aW9uVW5pdCgiVHlwZUhpZXJhcmNoeSIsICJzcmMiLCAicDIiLCAiWC5qYXZhIikuZ2V0VHlwZSgiWCIpOwotCWhpZXJhcmNoeSA9IHR5cGUubmV3VHlwZUhpZXJhcmNoeShudWxsKTsKLQl0eXBlcyA9IGhpZXJhcmNoeS5nZXRJbXBsZW1lbnRpbmdDbGFzc2VzKHR5cGUpOwotCXRoaXMuYXNzZXJ0VHlwZXNFcXVhbCgKLQkJIlVuZXhwZWN0ZWQgaW1wbGVtZW50aW5nIGNsYXNzZXMgb2YgWCIsCi0JCSIiLCAvLyBjbGFzc2VzIGNhbm5vdCBpbXBsZW1lbnQgYSBjbGFzcwotCQl0eXBlcwotCSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCB0aGUgY29ycmVjdCByb290IGNsYXNzZXMgZXhpc3QgaW4gdGhlIHR5cGUgCi0gKiBoaWVyYXJjaHkuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXRSb290Q2xhc3NlcygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlUeXBlW10gdHlwZXMgPSB0aGlzLnR5cGVIaWVyYXJjaHkuZ2V0Um9vdENsYXNzZXMoKTsKLQlhc3NlcnRUeXBlc0VxdWFsKAotCQkiVW5leHBlY3RlZCByb290IGNsYXNzZXMiLAotCQkiamF2YS5sYW5nLk9iamVjdFxuIiwKLQkJdHlwZXMpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgdGhlIGNvcnJlY3Qgcm9vdCBpbnRlcmZhY2VzIGV4aXN0IGluIHRoZSB0eXBlIAotICogaGllcmFyY2h5LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0R2V0Um9vdEludGVyZmFjZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJUeXBlSGllcmFyY2h5IiwgInNyYyIsICJwMiIsICJZLmphdmEiKS5nZXRUeXBlKCJZIik7Ci0JSVR5cGVIaWVyYXJjaHkgaGllcmFyY2h5ID0gdHlwZS5uZXdUeXBlSGllcmFyY2h5KG51bGwpOwotCUlUeXBlW10gdHlwZXMgPSBoaWVyYXJjaHkuZ2V0Um9vdEludGVyZmFjZXMoKTsKLQlhc3NlcnRUeXBlc0VxdWFsKAotCQkiVW5leHBlY3RlZCByb290IGNsYXNzZXMiLAotCQkicDIuSVxuIiwKLQkJdHlwZXMpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgZ2V0Um9vdEludGVyZmFjZXMoKSB3b3JrcyBvbiBhIElSZWdpb24uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXRSb290SW50ZXJmYWNlc0Zyb21SZWdpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJVHlwZVtdIHR5cGVzID0gdGhpcy50eXBlSGllcmFyY2h5LmdldFJvb3RJbnRlcmZhY2VzKCk7Ci0JYXNzZXJ0VHlwZXNFcXVhbCgKLQkJIlVuZXhwZWN0ZWQgcm9vdCBjbGFzc2VzIiwKLQkJImJpbmFyeS5JXG4iICsgCi0JCSJyaWNoLklcbiIgKyAKLQkJInJpY2guSTNcbiIsCi0JCXR5cGVzKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IHRoZSBjb3JyZWN0IG51bWJlciBvZiBzdWJjbGFzc2VzIGV4aXN0IGluIHRoZSB0eXBlIAotICogaGllcmFyY2h5IGNyZWF0ZWQgb24gYSByZWdpb24uCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXRTdWJjbGFzc2VzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IGdldENsYXNzRmlsZSgiVHlwZUhpZXJhcmNoeSIsICJsaWIuamFyIiwgImJpbmFyeSIsICJYLmNsYXNzIikuZ2V0VHlwZSgpOwotCUlUeXBlW10gdHlwZXMgPSB0aGlzLnR5cGVIaWVyYXJjaHkuZ2V0U3ViY2xhc3Nlcyh0eXBlKTsKLQl0aGlzLmFzc2VydFR5cGVzRXF1YWwoCi0JCSJVbmV4cGVjdGVkIHN1YmNsYXNzZXMgb2YgYmluYXJ5LlgiLAotCQkiYmluYXJ5LllcbiIsCi0JCXR5cGVzCi0JKTsKLQkKLQl0eXBlID0gZ2V0Q2xhc3NGaWxlKCJUeXBlSGllcmFyY2h5IiwgImxpYi5qYXIiLCAiYmluYXJ5IiwgIkkuY2xhc3MiKS5nZXRUeXBlKCk7Ci0JdHlwZXMgPSB0aGlzLnR5cGVIaWVyYXJjaHkuZ2V0U3ViY2xhc3Nlcyh0eXBlKTsKLQl0aGlzLmFzc2VydFR5cGVzRXF1YWwoCi0JCSJVbmV4cGVjdGVkIHN1YmNsYXNzZXMgb2YgYmluYXJ5LkkiLAotCQkiIiwgLy8gaW50ZXJmYWNlcyBjYW5ub3QgaGF2ZSBhIHN1YmNsYXNzCi0JCXR5cGVzCi0JKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IHRoZSBjb3JyZWN0IG51bWJlciBvZiBzdWJ0eXBlcyBleGlzdCBpbiB0aGUgdHlwZSAKLSAqIGhpZXJhcmNoeSBjcmVhdGVkIG9uIGEgcmVnaW9uLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0R2V0U3VidHlwZXMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gZ2V0Q2xhc3NGaWxlKCJUeXBlSGllcmFyY2h5IiwgImxpYi5qYXIiLCAiYmluYXJ5IiwgIlguY2xhc3MiKS5nZXRUeXBlKCk7Ci0JSVR5cGVbXSB0eXBlcyA9IHRoaXMudHlwZUhpZXJhcmNoeS5nZXRTdWJ0eXBlcyh0eXBlKTsKLQl0aGlzLmFzc2VydFR5cGVzRXF1YWwoCi0JCSJVbmV4cGVjdGVkIHN1YnR5cGVzIG9mIGJpbmFyeS5YIiwKLQkJImJpbmFyeS5ZXG4iLAotCQl0eXBlcwotCSk7Ci0JCi0JdHlwZSA9IGdldENsYXNzRmlsZSgiVHlwZUhpZXJhcmNoeSIsICJsaWIuamFyIiwgImJpbmFyeSIsICJJLmNsYXNzIikuZ2V0VHlwZSgpOwotCXR5cGVzID0gdGhpcy50eXBlSGllcmFyY2h5LmdldFN1YnR5cGVzKHR5cGUpOwotCXRoaXMuYXNzZXJ0VHlwZXNFcXVhbCgKLQkJIlVuZXhwZWN0ZWQgc3VidHlwZXMgb2YgYmluYXJ5LkkiLAotCQkiYmluYXJ5LlhcbiIgKyAKLQkJImJpbmFyeS5ZJElubmVyXG4iLAotCQl0eXBlcwotCSk7Ci19Ci0KLS8qKgotICogRW5zdXJlcyB0aGF0IHRoZSBzdXBlcmNsYXNzIGlzIGNvcnJlY3QgaW4gdGhlIHR5cGUgCi0gKiBoaWVyYXJjaHkgYSB0eXBlIGNyZWF0ZWQgb24gYSByZWdpb24gY29udGFpbmluZyBhIHBhY2thZ2UuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXRTdXBlcmNsYXNzSW5SZWdpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJUmVnaW9uIHIgPSBKYXZhQ29yZS5uZXdSZWdpb24oKTsKLQlJUGFja2FnZUZyYWdtZW50IHAgPSBnZXRQYWNrYWdlRnJhZ21lbnQoIlR5cGVIaWVyYXJjaHkiLCAic3JjIiwgInAxIik7Ci0Jci5hZGQocCk7Ci0JSVR5cGVIaWVyYXJjaHkgaGllcmFyY2h5ID0gcC5nZXRKYXZhUHJvamVjdCgpLm5ld1R5cGVIaWVyYXJjaHkociwgbnVsbCk7Ci0KLQlJVHlwZSB0eXBlID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJUeXBlSGllcmFyY2h5IiwgInNyYyIsICJwMSIsICJZLmphdmEiKS5nZXRUeXBlKCJZIik7Ci0JSVR5cGUgc3VwZXJjbGFzcz0gaGllcmFyY2h5LmdldFN1cGVyY2xhc3ModHlwZSk7Ci0JYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHN1cGVyIGNsYXNzIG9mIFkiLCAiWCIsIHN1cGVyY2xhc3MuZ2V0RWxlbWVudE5hbWUoKSk7Ci19Ci0KLS8qKgotICogRW5zdXJlcyB0aGF0IHRoZSBjb3JyZWN0IHN1cGVydHlwZXMgZXhpc3QgaW4gdGhlIHR5cGUgCi0gKiBoaWVyYXJjaHkgY3JlYXRlZCBvbiBhIHJlZ2lvbi4KLSAqLwotcHVibGljIHZvaWQgdGVzdEdldFN1cGVydHlwZXNJblJlZ2lvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSBnZXRDbGFzc0ZpbGUoIlR5cGVIaWVyYXJjaHkiLCAibGliLmphciIsICJiaW5hcnkiLCAiWS5jbGFzcyIpLmdldFR5cGUoKTsKLQlJVHlwZVtdIHN1cGVyVHlwZXMgPSB0aGlzLnR5cGVIaWVyYXJjaHkuZ2V0U3VwZXJ0eXBlcyh0eXBlKTsKLQlhc3NlcnRUeXBlc0VxdWFsKAotCQkiVW5leHBlY3RlZCBzdXBlciB0eXBlcyBvZiBZIiwKLQkJImJpbmFyeS5YXG4iLAotCQlzdXBlclR5cGVzKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IHRoZSBjb3JyZWN0IHN1cGVydHlwZXMgZXhpc3QgaW4gdGhlIHR5cGUgCi0gKiBoaWVyYXJjaHkgY3JlYXRlZCBvbiBhIHJlZ2lvbiBjb250YWluaW5nIGEgcHJvamVjdC4KLSAqLwotcHVibGljIHZvaWQgdGVzdEdldFN1cGVydHlwZXNXaXRoUHJvamVjdFJlZ2lvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QoIlR5cGVIaWVyYXJjaHkiKTsKLQlJUmVnaW9uIHJlZ2lvbj0gSmF2YUNvcmUubmV3UmVnaW9uKCk7Ci0JcmVnaW9uLmFkZChwcm9qZWN0KTsKLQlJVHlwZSB0eXBlID0gZ2V0Q2xhc3NGaWxlKCJUeXBlSGllcmFyY2h5IiwgImxpYi5qYXIiLCAiYmluYXJ5IiwgIlkuY2xhc3MiKS5nZXRUeXBlKCk7Ci0JSVR5cGVIaWVyYXJjaHkgaGllcmFyY2h5ID0gcHJvamVjdC5uZXdUeXBlSGllcmFyY2h5KHR5cGUsIHJlZ2lvbiwgbnVsbCk7Ci0JSVR5cGVbXSBzdXBlclR5cGVzID0gaGllcmFyY2h5LmdldFN1cGVydHlwZXModHlwZSk7Ci0JYXNzZXJ0VHlwZXNFcXVhbCgKLQkJIlVuZXhwZWN0ZWQgc3VwZXIgdHlwZXMgb2YgWSIsCi0JCSJiaW5hcnkuWFxuIiwKLQkJc3VwZXJUeXBlcyk7Ci19Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvVHlwZVJlc29sdmVUZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL1R5cGVSZXNvbHZlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVjMjA2Ni4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvVHlwZVJlc29sdmVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBUeXBlUmVzb2x2ZVRlc3RzIGV4dGVuZHMgTW9kaWZ5aW5nUmVzb3VyY2VUZXN0cyB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdTsKLXB1YmxpYyBUeXBlUmVzb2x2ZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wcml2YXRlIElUeXBlIGdldFR5cGUoSVR5cGVbXSB0eXBlcywgU3RyaW5nIHNvdXJjZVR5cGVOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCUlUeXBlIHNvdXJjZVR5cGUgPSB0eXBlc1tpXTsKLQkJaWYgKHNvdXJjZVR5cGUuZ2V0VHlwZVF1YWxpZmllZE5hbWUoKS5lcXVhbHMoc291cmNlVHlwZU5hbWUpKSB7Ci0JCQlyZXR1cm4gc291cmNlVHlwZTsKLQkJfSBlbHNlIGlmICgoc291cmNlVHlwZSA9IGdldFR5cGUoc291cmNlVHlwZS5nZXRUeXBlcygpLCBzb3VyY2VUeXBlTmFtZSkpICE9IG51bGwpIHsKLQkJCXJldHVybiBzb3VyY2VUeXBlOwotCQl9Ci0JfQotCXJldHVybiBudWxsOwotfQotcHJpdmF0ZSBJVHlwZSBnZXRUeXBlKFN0cmluZyBzb3VyY2VUeXBlTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JcmV0dXJuIGdldFR5cGUodGhpcy5jdS5nZXRUeXBlcygpLCBzb3VyY2VUeXBlTmFtZSk7Ci19Ci1wcml2YXRlIFN0cmluZ1tdW10gcmVzb2x2ZVR5cGUoU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgc291cmNlVHlwZU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlUeXBlIHNvdXJjZVR5cGUgPSB0aGlzLmdldFR5cGUoc291cmNlVHlwZU5hbWUpOwotCWFzc2VydFRydWUoIlR5cGUgIiArIHNvdXJjZVR5cGVOYW1lICsgIiB3YXMgbm90IGZvdW5kIiwgc291cmNlVHlwZSAhPSBudWxsKTsKLQlyZXR1cm4gc291cmNlVHlwZS5yZXNvbHZlVHlwZSh0eXBlTmFtZSk7Ci19Ci1wcml2YXRlIFN0cmluZyByZXN1bHRUb1N0cmluZyhTdHJpbmdbXVtdIHJlc3VsdCkgewotCVN0cmluZ0J1ZmZlciB0b1N0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlpZihyZXN1bHQgIT0gbnVsbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nW10gcXVhbGlmaWVkTmFtZSA9IHJlc3VsdFtpXTsKLQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IHF1YWxpZmllZE5hbWVbMF07Ci0JCQlpZiAocGFja2FnZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJdG9TdHJpbmcuYXBwZW5kKHBhY2thZ2VOYW1lKTsKLQkJCQl0b1N0cmluZy5hcHBlbmQoIi4iKTsKLQkJCX0KLQkJCXRvU3RyaW5nLmFwcGVuZChxdWFsaWZpZWROYW1lWzFdKTsKLQkJCWlmIChpIDwgcmVzdWx0Lmxlbmd0aC0xKSB7Ci0JCQkJdG9TdHJpbmcuYXBwZW5kKCJcbiIpOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiB0b1N0cmluZy50b1N0cmluZygpOwotfQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC5BYnN0cmFjdEphdmFNb2RlbFRlc3RzI3NldFVwU3VpdGUoKQotICovCi1wdWJsaWMgdm9pZCBzZXRVcFN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0Jc3VwZXIuc2V0VXBTdWl0ZSgpOwotCXRoaXMuc2V0VXBKYXZhUHJvamVjdCgiVHlwZVJlc29sdmUiKTsKLQl0aGlzLmN1ID0gdGhpcy5nZXRDb21waWxhdGlvblVuaXQoIlR5cGVSZXNvbHZlIiwgInNyYyIsICJwIiwgIlR5cGVSZXNvbHZlLmphdmEiKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlyZXR1cm4gbmV3IFN1aXRlKFR5cGVSZXNvbHZlVGVzdHMuY2xhc3MpOwotfQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC5TdWl0ZU9mVGVzdENhc2VzI3RlYXJEb3duU3VpdGUoKQotICovCi1wdWJsaWMgdm9pZCB0ZWFyRG93blN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JdGhpcy5kZWxldGVQcm9qZWN0KCJUeXBlUmVzb2x2ZSIpOwotCXN1cGVyLnRlYXJEb3duU3VpdGUoKTsKLX0KLS8qKgotICogUmVzb2x2ZSB0aGUgdHlwZSAiQiIgd2l0aGluIG9uZSBvZiB0aGUgc2Vjb25kYXJ5IHR5cGVzLgotICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDIzODI5IElUeXBlOjpyZXNvbHZlVHlwZSBpbmNvcnJlY3RseSByZXR1cm5zIG51bGwpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlSW5TZWNvbmRhcnlUeXBlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IHRoaXMuZ2V0Q29tcGlsYXRpb25Vbml0KCIvVHlwZVJlc29sdmUvc3JjL3AzL0IuamF2YSIpLmdldFR5cGUoIlRlc3QiKTsKLQlTdHJpbmdbXVtdIHR5cGVzID0gdHlwZS5yZXNvbHZlVHlwZSgiQiIpOwotCWFzc2VydEVxdWFscygKLQkJIlVuZXhwZWN0ZWQgcmVzdWx0IiwgCi0JCSJwMy5CIiwKLQkJdGhpcy5yZXN1bHRUb1N0cmluZyh0eXBlcykpOwkKLX0KLS8qKgotICogUmVzb2x2ZSB0aGUgdHlwZSAiQiIgd2l0aGluIG9uZSBvZiBpdHMgaW5uZXIgY2xhc3Nlcy4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJlc29sdmVNZW1iZXJUeXBlSW5Jbm5lcigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCVN0cmluZ1tdW10gdHlwZXMgPSB0aGlzLnJlc29sdmVUeXBlKCJCIiwgIlR5cGVSZXNvbHZlJEEkQiREIik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiVW5leHBlY3RlZCByZXN1bHQiLCAKLQkJInAuVHlwZVJlc29sdmUuQS5CIiwKLQkJdGhpcy5yZXN1bHRUb1N0cmluZyh0eXBlcykpOwkKLX0KLS8qKgotICogUmVzb2x2ZSB0aGUgdHlwZSAiQyIgd2l0aGluIG9uZSBvZiBpdHMgc2libGluZyBjbGFzc2VzLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZVNpYmxpbmdUeXBlSW5Jbm5lcigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCVN0cmluZ1tdW10gdHlwZXMgPSB0aGlzLnJlc29sdmVUeXBlKCJDIiwgIlR5cGVSZXNvbHZlJEEkQiIpOwotCWFzc2VydEVxdWFscygKLQkJIlVuZXhwZWN0ZWQgcmVzdWx0IiwgCi0JCSJwLlR5cGVSZXNvbHZlLkEuQyIsCi0JCXRoaXMucmVzdWx0VG9TdHJpbmcodHlwZXMpKTsJCi19Ci0vKioKLSAqIFJlc29sdmUgdGhlIHR5cGUgIlgiIHdpdGggYSB0eXBlIGltcG9ydCBmb3IgaXQKLSAqIHdpdGhpbiBhbiBpbm5lciBjbGFzcwotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZVR5cGVJbklubmVyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JU3RyaW5nW11bXSB0eXBlcyA9IHRoaXMucmVzb2x2ZVR5cGUoIlgiLCAiVHlwZVJlc29sdmUkQSIpOwotCWFzc2VydEVxdWFscygKLQkJIlVuZXhwZWN0ZWQgcmVzdWx0IiwgCi0JCSJwMS5YIiwKLQkJdGhpcy5yZXN1bHRUb1N0cmluZyh0eXBlcykpOwkKLX0KLS8qKgotICogUmVzb2x2ZSB0aGUgdHlwZSAiU3RyaW5nIi4KLSAqLwotcHVibGljIHZvaWQgdGVzdFJlc29sdmVUeXBlSW5KYXZhTGFuZygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCVN0cmluZ1tdW10gdHlwZXMgPSB0aGlzLnJlc29sdmVUeXBlKCJTdHJpbmciLCAiVHlwZVJlc29sdmUiKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJVbmV4cGVjdGVkIHJlc3VsdCIsIAotCQkiamF2YS5sYW5nLlN0cmluZyIsCi0JCXRoaXMucmVzdWx0VG9TdHJpbmcodHlwZXMpKTsJCi19Ci0vKioKLSAqIFJlc29sdmUgdGhlIHR5cGUgIlZlY3RvciIgd2l0aCBubyBpbXBvcnRzLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZVR5cGVXaXRoTm9JbXBvcnRzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JU3RyaW5nW11bXSB0eXBlcyA9IHRoaXMucmVzb2x2ZVR5cGUoIlZlY3RvciIsICJUeXBlUmVzb2x2ZSIpOwotCWFzc2VydEVxdWFscygKLQkJIlVuZXhwZWN0ZWQgcmVzdWx0IiwgCi0JCSIiLAotCQl0aGlzLnJlc3VsdFRvU3RyaW5nKHR5cGVzKSk7CQotfQotLyoqCi0gKiBSZXNvbHZlIHRoZSB0eXBlICJZIiB3aXRoIGFuIG9uLWRlbWFuZCBpbXBvcnQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlVHlwZVdpdGhPbkRlbWFuZEltcG9ydCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCVN0cmluZ1tdW10gdHlwZXMgPSB0aGlzLnJlc29sdmVUeXBlKCJZIiwgIlR5cGVSZXNvbHZlIik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiVW5leHBlY3RlZCByZXN1bHQiLCAKLQkJInAyLlkiLAotCQl0aGlzLnJlc3VsdFRvU3RyaW5nKHR5cGVzKSk7CQotfQotLyoqCi0gKiBSZXNvbHZlIHRoZSB0eXBlICJYIiB3aXRoIGEgdHlwZSBpbXBvcnQgZm9yIGl0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZVR5cGVXaXRoVHlwZUltcG9ydCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCVN0cmluZ1tdW10gdHlwZXMgPSB0aGlzLnJlc29sdmVUeXBlKCJYIiwgIlR5cGVSZXNvbHZlIik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiVW5leHBlY3RlZCByZXN1bHQiLCAKLQkJInAxLlgiLAotCQl0aGlzLnJlc3VsdFRvU3RyaW5nKHR5cGVzKSk7CQotfQotLyoqCi0gKiBSZXNvbHZlIHRoZSB0eXBlICJTdHJpbmciLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZVN0cmluZygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCVN0cmluZ1tdW10gdHlwZXMgPSB0aGlzLnJlc29sdmVUeXBlKCJTdHJpbmciLCAiVHlwZVJlc29sdmUiKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJVbmV4cGVjdGVkIHJlc3VsdCIsIAotCQkiamF2YS5sYW5nLlN0cmluZyIsCi0JCXRoaXMucmVzdWx0VG9TdHJpbmcodHlwZXMpKTsJCi19Ci0vKioKLSAqIFJlc29sdmUgdGhlIHR5cGUgIkEuSW5uZXIiLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZUlubmVyVHlwZTEoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gdGhpcy5nZXRDb21waWxhdGlvblVuaXQoIi9UeXBlUmVzb2x2ZS9zcmMvcDQvQi5qYXZhIikuZ2V0VHlwZSgiQiIpOwotCVN0cmluZ1tdW10gdHlwZXMgPSB0eXBlLnJlc29sdmVUeXBlKCJBLklubmVyIik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiVW5leHBlY3RlZCByZXN1bHQiLCAKLQkJInA0LkEuSW5uZXIiLAotCQl0aGlzLnJlc3VsdFRvU3RyaW5nKHR5cGVzKSk7CQkKLX0KLS8qKgotICogUmVzb2x2ZSB0aGUgdHlwZSAicDQuQS5Jbm5lciIuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlSW5uZXJUeXBlMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlUeXBlIHR5cGUgPSB0aGlzLmdldENvbXBpbGF0aW9uVW5pdCgiL1R5cGVSZXNvbHZlL3NyYy9wNC9CLmphdmEiKS5nZXRUeXBlKCJCIik7Ci0JU3RyaW5nW11bXSB0eXBlcyA9IHR5cGUucmVzb2x2ZVR5cGUoInA0LkEuSW5uZXIiKTsKLQlhc3NlcnRFcXVhbHMoCi0JCSJVbmV4cGVjdGVkIHJlc3VsdCIsIAotCQkicDQuQS5Jbm5lciIsCi0JCXRoaXMucmVzdWx0VG9TdHJpbmcodHlwZXMpKTsJCQotfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL2pkdC9jb3JlL3Rlc3RzL21vZGVsL1ZhcmlhYmxlc0luaXRpYWxpemVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvVmFyaWFibGVzSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY2ZDFjYS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvVmFyaWFibGVzSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ2xhc3NwYXRoVmFyaWFibGVJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBWYXJpYWJsZXNJbml0aWFsaXplciBleHRlbmRzIENsYXNzcGF0aFZhcmlhYmxlSW5pdGlhbGl6ZXIgewotCi0JcHVibGljIHN0YXRpYyBJVGVzdEluaXRpYWxpemVyIGluaXRpYWxpemVyOwotCQotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIElUZXN0SW5pdGlhbGl6ZXIgewotCQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFN0cmluZyB2YXJpYWJsZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0KCkgewotCQlpbml0aWFsaXplciA9IG51bGw7Ci0JCVN0cmluZ1tdIHZhck5hbWVzID0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoVmFyaWFibGVOYW1lcygpOwotCQl0cnkgewotCQkJSmF2YUNvcmUuc2V0Q2xhc3NwYXRoVmFyaWFibGVzKHZhck5hbWVzLCBuZXcgSVBhdGhbdmFyTmFtZXMubGVuZ3RoXSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEluaXRpYWxpemVyKElUZXN0SW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIpIHsKLQkJVmFyaWFibGVzSW5pdGlhbGl6ZXIuaW5pdGlhbGl6ZXIgPSBpbml0aWFsaXplcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShTdHJpbmcgdmFyaWFibGUpIHsKLQkJaWYgKGluaXRpYWxpemVyID09IG51bGwpIHJldHVybjsKLQkJdHJ5IHsKLQkJCWluaXRpYWxpemVyLmluaXRpYWxpemUodmFyaWFibGUpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9Xb3JraW5nQ29weU5vdEluQ2xhc3NwYXRoVGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9Xb3JraW5nQ29weU5vdEluQ2xhc3NwYXRoVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRiNGU4ZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvV29ya2luZ0NvcHlOb3RJbkNsYXNzcGF0aFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBXb3JraW5nQ29weU5vdEluQ2xhc3NwYXRoVGVzdHMgZXh0ZW5kcyBNb2RpZnlpbmdSZXNvdXJjZVRlc3RzIHsKLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCB3b3JraW5nQ29weTsKLQotcHVibGljIFdvcmtpbmdDb3B5Tm90SW5DbGFzc3BhdGhUZXN0cyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCXJldHVybiBuZXcgU3VpdGUoV29ya2luZ0NvcHlOb3RJbkNsYXNzcGF0aFRlc3RzLmNsYXNzKTsKLX0KLQotcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQlzdXBlci5zZXRVcCgpOwotCXRyeSB7Ci0JCXRoaXMuY3JlYXRlSmF2YVByb2plY3QoIlAiLCBuZXcgU3RyaW5nW10geyJzcmMifSwgImJpbiIpOwotCQl0aGlzLmNyZWF0ZUZvbGRlcigiUC90eHQiKTsKLQkJSUZpbGUgZmlsZSA9IHRoaXMuY3JlYXRlRmlsZSgiUC90eHQvWC5qYXZhIiwKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSJ9Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSAoSUNvbXBpbGF0aW9uVW5pdClKYXZhQ29yZS5jcmVhdGUoZmlsZSk7CQotCQl0aGlzLndvcmtpbmdDb3B5ID0gKElDb21waWxhdGlvblVuaXQpY3UuZ2V0V29ya2luZ0NvcHkoKTsKLQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JdHJ5IHsKLQkJaWYgKHRoaXMud29ya2luZ0NvcHkgIT0gbnVsbCkgewotCQkJdGhpcy53b3JraW5nQ29weS5kZXN0cm95KCk7Ci0JCQl0aGlzLndvcmtpbmdDb3B5ID0gbnVsbDsKLQkJfQotCQl0aGlzLmRlbGV0ZVByb2plY3QoIlAiKTsKLQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdENvbW1pdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlJQ29tcGlsYXRpb25Vbml0IG9yaWdpbmFsID0gKElDb21waWxhdGlvblVuaXQpdGhpcy53b3JraW5nQ29weS5nZXRPcmlnaW5hbEVsZW1lbnQoKTsKLQlhc3NlcnRUcnVlKCJPcmlnaW5hbCBlbGVtZW50IHNob3VsZCBub3QgYmUgbnVsbCIsIG9yaWdpbmFsICE9IG51bGwpOwotCi0JSUJ1ZmZlciB3b3JraW5nQ29weUJ1ZmZlciA9IHRoaXMud29ya2luZ0NvcHkuZ2V0QnVmZmVyKCk7Ci0JYXNzZXJ0VHJ1ZSgiV29ya2luZyBjb3B5IGJ1ZmZlciBzaG91bGQgbm90IGJlIG51bGwiLCB3b3JraW5nQ29weUJ1ZmZlciAhPSBudWxsKTsKLQotCVN0cmluZyBuZXdDb250ZW50cyA9IAotCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCSIgIHB1YmxpYyB2b2lkIGZvbygpIHtcbiIgKwotCQkiICB9XG4iICsKLQkJIn0iOwotCXdvcmtpbmdDb3B5QnVmZmVyLnNldENvbnRlbnRzKG5ld0NvbnRlbnRzKTsKLQl0aGlzLndvcmtpbmdDb3B5LmNvbW1pdChmYWxzZSwgbnVsbCk7Ci0JCi0JSUZpbGUgb3JpZ2luYWxGaWxlID0gKElGaWxlKW9yaWdpbmFsLmdldFJlc291cmNlKCk7Ci0JYXNzZXJ0U291cmNlRXF1YWxzKAotCQkiVW5leHBlY3RlZCBjb250ZW50cyIsIAotCQluZXdDb250ZW50cywgCi0JCW5ldyBTdHJpbmcoVXRpbC5nZXRSZXNvdXJjZUNvbnRlbnRzQXNDaGFyQXJyYXkob3JpZ2luYWxGaWxlKSkpOwotfQotCi0vKgotICogRW5zdXJlIHRoYXQgYSB3b3JraW5nIGNvcHkgb3V0c2lkZSB0aGUgY2xhc3NwYXRoIGRvZXMgbm90IGV4aXN0IAotICogKGJ1dCBjYW4gc3RpbGwgYmUgb3BlbmVkKS4KLSAqLwotcHVibGljIHZvaWQgdGVzdEV4aXN0ZW5jZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlhc3NlcnRUcnVlKCJXb3JraW5nIGNvcHkgc2hvdWxkIGV4aXN0IiwgdGhpcy53b3JraW5nQ29weS5leGlzdHMoKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0R2V0U291cmNlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUlDb21waWxhdGlvblVuaXQgY29weSA9IG51bGw7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgiUDEiLCBuZXcgU3RyaW5nW10ge30sICJiaW4iKTsKLQkJdGhpcy5jcmVhdGVGb2xkZXIoIi9QMS9zcmMvanVuaXQvdGVzdCIpOwotCQlTdHJpbmcgc291cmNlID0gCi0JCQkicGFja2FnZSBqdW5pdC50ZXN0O1xuIiArCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkifSI7Ci0JCUlGaWxlIGZpbGUgPSB0aGlzLmNyZWF0ZUZpbGUoIi9QMS9zcmMvanVuaXQvdGVzdC9YLmphdmEiLCBzb3VyY2UpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShmaWxlKTsKLQkJY29weSA9IChJQ29tcGlsYXRpb25Vbml0KSBjdS5nZXRXb3JraW5nQ29weSgpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVW5leHBlY3RlZCBzb3VyY2UiLAotCQkJc291cmNlLAotCQkJY29weS5nZXRTb3VyY2UoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJaWYgKGNvcHkgIT0gbnVsbCkgY29weS5kZXN0cm95KCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgiUDEiKTsKLQl9Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0UGFyZW50RXhpc3RlbmNlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCWFzc2VydFRydWUoIldvcmtpbmcgY29weSdzIHBhcmVudCBzaG91bGQgbm90IGV4aXN0IiwgIXRoaXMud29ya2luZ0NvcHkuZ2V0UGFyZW50KCkuZXhpc3RzKCkpOwotfQotLyoKLSAqIEVuc3VyZSB0aGF0IGEgd29ya2luZyBjb3B5IGNyZWF0ZWQgb24gYSAuamF2YSBmaWxlIGluIGEgc2ltcGxlIHByb2plY3QgY2FuIGJlIG9wZW5lZC4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAzMzc0OCBDYW5ub3Qgb3BlbiB3b3JraW5nIGNvcHkgb24gLmphdmEgZmlsZSBpbiBzaW1wbGUgcHJvamVjdCkKLSAqLwotcHVibGljIHZvaWQgdGVzdFNpbXBsZVByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSVBhcmVudCBjb3B5ID0gbnVsbDsKLQl0cnkgewotCQljcmVhdGVQcm9qZWN0KCJTaW1wbGVQcm9qZWN0Iik7Ci0JCUlGaWxlIGZpbGUgPSBjcmVhdGVGaWxlKAotCQkJIi9TaW1wbGVQcm9qZWN0L1guamF2YSIsCi0JCQkicHVibGljIGNsYXNzIFgge1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oZmlsZSk7Ci0JCWNvcHkgPSAoSVBhcmVudCljdS5nZXRXb3JraW5nQ29weSgpOwotCQl0cnkgewotCQkJY29weS5nZXRDaGlsZHJlbigpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIG5vdCBnZXQgSmF2YU1vZGVsRXhjZXB0aW9uIiwgZmFsc2UpOwotCQl9Ci0JfSBmaW5hbGx5IHsKLQkJaWYgKGNvcHkgIT0gbnVsbCkgewotCQkJKChJV29ya2luZ0NvcHkpY29weSkuZGVzdHJveSgpOwotCQl9Ci0JCWRlbGV0ZVByb2plY3QoIlNpbXBsZVByb2plY3QiKTsKLQl9Ci19Ci0KLS8qCi0gKiBFbnN1cmUgdGhhdCBhIG9yaWdpbmFsIGN1ICh3aGljaCBpcyBvdXRzaWRlIHRoZSBjbGFzc3BhdGgpIGRvZXMgbm90IGV4aXN0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0T3JpZ2luYWxFeGlzdGVuY2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBvcmlnaW5hbCA9IChJQ29tcGlsYXRpb25Vbml0KXRoaXMud29ya2luZ0NvcHkuZ2V0T3JpZ2luYWxFbGVtZW50KCk7Ci0JYXNzZXJ0VHJ1ZSgKLQkJIk9yaWdpbmFsIGNvbXBpbGF0aW9uIHVuaXQgc2hvdWxkIG5vdCBleGlzdCIsIAotCQkhb3JpZ2luYWwuZXhpc3RzKCkpOwotfQotcHVibGljIHZvaWQgdGVzdE9yaWdpbmFsUGFyZW50RXhpc3RlbmNlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCWFzc2VydFRydWUoCi0JCSJPcmlnaW5hbCBjb21waWxhdGlvbiB1bml0J3MgcGFyZW50IHNob3VsZCBub3QgZXhpc3QiLCAKLQkJIXRoaXMud29ya2luZ0NvcHkuZ2V0T3JpZ2luYWxFbGVtZW50KCkuZ2V0UGFyZW50KCkuZXhpc3RzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0SXNPcGVuKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCWFzc2VydFRydWUoIldvcmtpbmcgY29weSBzaG91bGQgYmUgb3BlbiIsIHRoaXMud29ya2luZ0NvcHkuaXNPcGVuKCkpOwotfQotLyoKLSAqIEVuc3VyZSB0aGF0IGEgb3JpZ2luYWwgY3UgKHdoaWNoIGlzIG91dHNpZGUgdGhlIGNsYXNzcGF0aCkgaXMgbm90IG9wZW5lZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdE9yaWdpbmFsSXNPcGVuKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUlDb21waWxhdGlvblVuaXQgb3JpZ2luYWwgPSAoSUNvbXBpbGF0aW9uVW5pdCl0aGlzLndvcmtpbmdDb3B5LmdldE9yaWdpbmFsRWxlbWVudCgpOwotCWFzc2VydFRydWUoCi0JCSJPcmlnaW5hbCBjb21waWxhdGlvbiBzaG91bGQgbm90IGJlIG9wZW5lZCIsIAotCQkhb3JpZ2luYWwuaXNPcGVuKCkpOwotfQotLy8gMzE3OTkgLSBhc2tpbmcgcHJvamVjdCBvcHRpb25zIG9uIG5vbi1KYXZhIHByb2plY3QgcG9wdWxhdGVzIHRoZSBwZXJQcm9qZWN0SW5mbyBjYWNoZSBpbmNvcnJlY3RseQotcHVibGljIHZvaWQgdGVzdElzT25DbGFzc3BhdGgoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjb3B5ID0gbnVsbDsKLQl0cnkgewotCQl0aGlzLmNyZWF0ZVByb2plY3QoIlNpbXBsZVByb2plY3QiKTsKLQkJdGhpcy5jcmVhdGVGb2xkZXIoIi9TaW1wbGVQcm9qZWN0L3NyYy9qdW5pdC90ZXN0Iik7Ci0JCVN0cmluZyBzb3VyY2UgPSAKLQkJCSJwYWNrYWdlIGp1bml0LnRlc3Q7XG4iICsKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSJ9IjsKLQkJSUZpbGUgZmlsZSA9IHRoaXMuY3JlYXRlRmlsZSgiL1NpbXBsZVByb2plY3Qvc3JjL2p1bml0L3Rlc3QvWC5qYXZhIiwgc291cmNlKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oZmlsZSk7Ci0JCWNvcHkgPSAoSUNvbXBpbGF0aW9uVW5pdCkgY3UuZ2V0V29ya2luZ0NvcHkoKTsKLQkJCi0JCS8vIHdvcmtpbmcgY3JlYXRpb24gd2lsbCBjYXVzZSBpdCB0byBvcGVuLCBhbmQgdGh1cyByZXF1ZXN0IHByb2plY3Qgb3B0aW9ucwotCQlib29sZWFuIGlzT25DbGFzc3BhdGggPSBjb3B5LmdldEphdmFQcm9qZWN0KCkuaXNPbkNsYXNzcGF0aChjb3B5KTsKLQkJYXNzZXJ0VHJ1ZSgid29ya2luZyBjb3B5IHNob3VsZG4ndCBhbnN3ZXIgdG8gaXNPbkNsYXNzcGF0aCIsICFpc09uQ2xhc3NwYXRoKTsKLQl9IGZpbmFsbHkgewotCQlpZiAoY29weSAhPSBudWxsKSBjb3B5LmRlc3Ryb3koKTsKLQkJdGhpcy5kZWxldGVQcm9qZWN0KCJTaW1wbGVQcm9qZWN0Iik7Ci0JfQotfQotCi0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9Xb3JraW5nQ29weVNlYXJjaFRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvV29ya2luZ0NvcHlTZWFyY2hUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGU2ODU1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9Xb3JraW5nQ29weVNlYXJjaFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1wdWJsaWMgY2xhc3MgV29ya2luZ0NvcHlTZWFyY2hUZXN0cyBleHRlbmRzIEphdmFTZWFyY2hUZXN0cyB7Ci0JSUNvbXBpbGF0aW9uVW5pdCB3b3JraW5nQ29weTsKLQkKLXB1YmxpYyBXb3JraW5nQ29weVNlYXJjaFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgU3VpdGUoV29ya2luZ0NvcHlTZWFyY2hUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQotCXN1aXRlLmFkZFRlc3QobmV3IFdvcmtpbmdDb3B5U2VhcmNoVGVzdHMoInRlc3RBZGROZXdUeXBlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IFdvcmtpbmdDb3B5U2VhcmNoVGVzdHMoInRlc3RSZW1vdmVUeXBlIikpOwotCXN1aXRlLmFkZFRlc3QobmV3IFdvcmtpbmdDb3B5U2VhcmNoVGVzdHMoInRlc3RNb3ZlVHlwZSIpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBXb3JraW5nQ29weVNlYXJjaFRlc3RzKCJ0ZXN0SGllcmFyY2h5U2NvcGVPbldvcmtpbmdDb3B5IikpOwotCXN1aXRlLmFkZFRlc3QobmV3IFdvcmtpbmdDb3B5U2VhcmNoVGVzdHMoInRlc3REZWNsYXJhdGlvbk9mUmVmZXJlbmNlZFR5cGVzIikpOwotCi0JcmV0dXJuIHN1aXRlOwotfQotLyoqCi0gKiBHZXQgYSBuZXcgd29ya2luZyBjb3B5LgotICovCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQl0cnkgewotCQl0aGlzLndvcmtpbmdDb3B5ID0gKElDb21waWxhdGlvblVuaXQpdGhpcy5nZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgIndjIiwgIlguamF2YSIpLmdldFdvcmtpbmdDb3B5KCk7Ci0JfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci19Ci0vKioKLSAqIERlc3Ryb3kgdGhlIHdvcmtpbmcgY29weS4KLSAqLwotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQl0aGlzLndvcmtpbmdDb3B5LmRlc3Ryb3koKTsKLQl0aGlzLndvcmtpbmdDb3B5ID0gbnVsbDsKLX0KLQotCi0vKioKLSAqIEhpZXJhcmNoeSBzY29wZSBvbiBhIHdvcmtpbmcgY29weSB0ZXN0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0SGllcmFyY2h5U2NvcGVPbldvcmtpbmdDb3B5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gdGhpcy4gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJhOSIsICJBLmphdmEiKTsKLQlJQ29tcGlsYXRpb25Vbml0IGNvcHkgPSAoSUNvbXBpbGF0aW9uVW5pdCl1bml0LmdldFdvcmtpbmdDb3B5KCk7Ci0JdHJ5IHsKLQkJSVR5cGUgdHlwZSA9IGNvcHkuZ2V0VHlwZSgiQSIpOwotCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0gU2VhcmNoRW5naW5lLmNyZWF0ZUhpZXJhcmNoeVNjb3BlKHR5cGUpOwotCQlhc3NlcnRUcnVlKCJhOS5BIHNob3VsZCBiZSBpbmNsdWRlZCBpbiBoaWVyYXJjaHkgc2NvcGUiLCBzY29wZS5lbmNsb3Nlcyh0eXBlKSk7Ci0JCWFzc2VydFRydWUoImE5LkMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGhpZXJhcmNoeSBzY29wZSIsIHNjb3BlLmVuY2xvc2VzKGNvcHkuZ2V0VHlwZSgiQyIpKSk7Ci0JCWFzc2VydFRydWUoImE5LkIgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGhpZXJhcmNoeSBzY29wZSIsIHNjb3BlLmVuY2xvc2VzKGNvcHkuZ2V0VHlwZSgiQiIpKSk7Ci0JCUlQYXRoIHBhdGggPSB1bml0LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCk7Ci0JCWFzc2VydFRydWUoImE5L0EuamF2YSBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIGhpZXJhcmNoeSBzY29wZSIsICFzY29wZS5lbmNsb3NlcyhwYXRoLnRvU3RyaW5nKCkpKTsKLQl9IGZpbmFsbHkgewotCQljb3B5LmRlc3Ryb3koKTsKLQl9Ci19Ci0KLQotLyoqCi0gKiBUeXBlIGRlY2xhcmF0aW9uIGluIGEgd29ya2luZyBjb3B5IHRlc3QuCi0gKiBBIG5ldyB0eXBlIGlzIGFkZGVkIGluIHRoZSB3b3JraW5nIGNvcHkgb25seS4KLSAqLwotcHVibGljIHZvaWQgdGVzdEFkZE5ld1R5cGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLndvcmtpbmdDb3B5LmNyZWF0ZVR5cGUoCi0JCSJjbGFzcyBOZXdUeXBlIHtcbiIgKwotCQkifSIsCi0JCW51bGwsCi0JCWZhbHNlLAotCQludWxsKTsKLQkKLQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0gCi0JCVNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoCi0JCQluZXcgSUphdmFFbGVtZW50W10ge3RoaXMud29ya2luZ0NvcHkuZ2V0UGFyZW50KCl9KTsKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZShuZXcgSVdvcmtpbmdDb3B5W10ge3RoaXMud29ya2luZ0NvcHl9KS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJIk5ld1R5cGUiLAotCQlUWVBFLAotCQlERUNMQVJBVElPTlMsIAotCQlzY29wZSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic3JjL3djL1guamF2YSB3Yy5OZXdUeXBlIFtOZXdUeXBlXSIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci19Ci0vKioKLSAqIERlY2xhcmF0aW9uIG9mIHJlZmVyZW5jZWQgdHlwZXMgdGVzdC4KLSAqIChSZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyA1MzU1IHNlYXJjaDogTlBFIGluIHNlYXJjaERlY2xhcmF0aW9uc09mUmVmZXJlbmNlZFR5cGVzICApCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3REZWNsYXJhdGlvbk9mUmVmZXJlbmNlZFR5cGVzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JSU1ldGhvZCBtZXRob2QgPSB0aGlzLndvcmtpbmdDb3B5LmdldFR5cGUoIlgiKS5jcmVhdGVNZXRob2QoCi0JCSJwdWJsaWMgdm9pZCBmb28oKSB7XG4iICsKLQkJIiAgWCB4ID0gbmV3IFgoKTtcbiIgKwotCQkifSIsCi0JCW51bGwsCi0JCXRydWUsCi0JCW51bGwpOwotCUphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IgcmVzdWx0Q29sbGVjdG9yID0gbmV3IEphdmFTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQluZXcgU2VhcmNoRW5naW5lKCkuc2VhcmNoRGVjbGFyYXRpb25zT2ZSZWZlcmVuY2VkVHlwZXMoCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJbWV0aG9kLAotCQlyZXN1bHRDb2xsZWN0b3IKLQkpOwotCWFzc2VydEVxdWFscygKLQkJInNyYy93Yy9YLmphdmEgd2MuWCBbWF0iLCAKLQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotfQotCi0KLS8qKgotICogVHlwZSBkZWNsYXJhdGlvbiBpbiBhIHdvcmtpbmcgY29weSB0ZXN0LgotICogQSB0eXBlIGlzIHJlbW92ZWQgZnJvbSB0aGUgd29ya2luZyBjb3B5IG9ubHkuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVUeXBlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JdGhpcy53b3JraW5nQ29weS5nZXRUeXBlKCJYIikuZGVsZXRlKHRydWUsIG51bGwpOwotCQotCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSAKLQkJU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZSgKLQkJCW5ldyBJSmF2YUVsZW1lbnRbXSB7dGhpcy53b3JraW5nQ29weS5nZXRQYXJlbnQoKX0pOwotCQotCS8vIHR5cGUgWCBzaG91bGQgbm90IGJlIHZpc2libGUgd2hlbiB3b3JraW5nIGNvcHkgaGlkZXMgaXQKLQlKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdENvbGxlY3RvciA9IG5ldyBKYXZhU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JbmV3IFNlYXJjaEVuZ2luZShuZXcgSVdvcmtpbmdDb3B5W10ge3RoaXMud29ya2luZ0NvcHl9KS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJIlgiLAotCQlUWVBFLAotCQlERUNMQVJBVElPTlMsIAotCQlzY29wZSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkiIiwgCi0JCXJlc3VsdENvbGxlY3Rvci50b1N0cmluZygpKTsKLQkJCi0JLy8gZW5zdXJlIHRoZSB0eXBlIGlzIHN0aWxsIHByZXNlbnQgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQKLQlyZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2goCi0JCWdldFdvcmtzcGFjZSgpLCAKLQkJIlgiLAotCQlUWVBFLAotCQlERUNMQVJBVElPTlMsIAotCQlzY29wZSwgCi0JCXJlc3VsdENvbGxlY3Rvcik7Ci0JYXNzZXJ0RXF1YWxzKAotCQkic3JjL3djL1guamF2YSB3Yy5YIFtYXSIsIAotCQlyZXN1bHRDb2xsZWN0b3IudG9TdHJpbmcoKSk7Ci0KLX0KLS8qKgotICogVHlwZSBkZWNsYXJhdGlvbiBpbiBhIHdvcmtpbmcgY29weSB0ZXN0LgotICogQSB0eXBlIGlzIG1vdmVkIGZyb20gb25lIHdvcmtpbmcgY29weSB0byBhbm90aGVyLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0TW92ZVR5cGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkKLQkvLyBtb3ZlIHR5cGUgWCBmcm9tIHdvcmtpbmcgY29weSBpbiBvbmUgcGFja2FnZSB0byBhIHdvcmtpbmcgY29weSBpbiBhbm90aGVyIHBhY2thZ2UKLQlJSmF2YUVsZW1lbnQgZWxlbWVudDEgPSBnZXRDb21waWxhdGlvblVuaXQoIkphdmFTZWFyY2giLCAic3JjIiwgIndjMSIsICJYLmphdmEiKS5nZXRXb3JraW5nQ29weSgpOwotCUlDb21waWxhdGlvblVuaXQgd29ya2luZ0NvcHkxID0gKElDb21waWxhdGlvblVuaXQpZWxlbWVudDE7Ci0JSUphdmFFbGVtZW50IGVsZW1lbnQyID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJKYXZhU2VhcmNoIiwgInNyYyIsICJ3YzIiLCAiWS5qYXZhIikuZ2V0V29ya2luZ0NvcHkoKTsKLQlJQ29tcGlsYXRpb25Vbml0IHdvcmtpbmdDb3B5MiA9IChJQ29tcGlsYXRpb25Vbml0KWVsZW1lbnQyOwotCQotCXRyeSB7Ci0JCXdvcmtpbmdDb3B5MS5nZXRUeXBlKCJYIikubW92ZSh3b3JraW5nQ29weTIsIG51bGwsIG51bGwsIHRydWUsIG51bGwpOwotCQkKLQkJU2VhcmNoRW5naW5lIHNlYXJjaEVuZ2luZSA9IG5ldyBTZWFyY2hFbmdpbmUobmV3IElXb3JraW5nQ29weVtdIHt3b3JraW5nQ29weTEsIHdvcmtpbmdDb3B5Mn0pOwotCQkKLQkJLy8gdHlwZSBYIHNob3VsZCBub3QgYmUgdmlzaWJsZSBpbiBvbGQgcGFja2FnZQotCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlMSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUobmV3IElKYXZhRWxlbWVudFtdIHt3b3JraW5nQ29weTEuZ2V0UGFyZW50KCl9KTsKLQkJSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCQlzZWFyY2hFbmdpbmUuc2VhcmNoKAotCQkJZ2V0V29ya3NwYWNlKCksIAotCQkJIlgiLAotCQkJVFlQRSwKLQkJCURFQ0xBUkFUSU9OUywgCi0JCQlzY29wZTEsIAotCQkJcmVzdWx0Q29sbGVjdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJIiIsIAotCQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotCQkKLQkJLy8gdHlwZSBYIHNob3VsZCBiZSB2aXNpYmxlIGluIG5ldyBwYWNrYWdlCi0JCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUyID0gU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShuZXcgSUphdmFFbGVtZW50W10ge3dvcmtpbmdDb3B5Mi5nZXRQYXJlbnQoKX0pOwotCQlyZXN1bHRDb2xsZWN0b3IgPSBuZXcgSmF2YVNlYXJjaFJlc3VsdENvbGxlY3RvcigpOwotCQlzZWFyY2hFbmdpbmUuc2VhcmNoKAotCQkJZ2V0V29ya3NwYWNlKCksIAotCQkJIlgiLAotCQkJVFlQRSwKLQkJCURFQ0xBUkFUSU9OUywgCi0JCQlzY29wZTIsIAotCQkJcmVzdWx0Q29sbGVjdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJInNyYy93YzIvWS5qYXZhIHdjMi5YIFtYXSIsIAotCQkJcmVzdWx0Q29sbGVjdG9yLnRvU3RyaW5nKCkpOwotCX0gZmluYWxseSB7Ci0JCXdvcmtpbmdDb3B5MS5kZXN0cm95KCk7Ci0JCXdvcmtpbmdDb3B5Mi5kZXN0cm95KCk7Ci0JfQotfQotCi0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9Xb3JraW5nQ29weVRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvamR0L2NvcmUvdGVzdHMvbW9kZWwvV29ya2luZ0NvcHlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjUyOTdjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9qZHQvY29yZS90ZXN0cy9tb2RlbC9Xb3JraW5nQ29weVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotCi0KLQotcHVibGljIGNsYXNzIFdvcmtpbmdDb3B5VGVzdHMgZXh0ZW5kcyBNb2RpZnlpbmdSZXNvdXJjZVRlc3RzIHsKLQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gbnVsbDsKLQlJQ29tcGlsYXRpb25Vbml0IGNvcHkgPSBudWxsOwotCQotCXB1YmxpYyBjbGFzcyBCdWZmZXJGYWN0b3J5IGltcGxlbWVudHMgSUJ1ZmZlckZhY3RvcnkgewotCQkvKgotCQkgKiBAc2VlIElCdWZmZXJGYWN0b3J5I2NyZWF0ZUJ1ZmZlcihJT3BlbmFibGUpCi0JCSAqLwotCQlwdWJsaWMgSUJ1ZmZlciBjcmVhdGVCdWZmZXIoSU9wZW5hYmxlIG93bmVyKSB7Ci0JCQlyZXR1cm4gbmV3IEJ1ZmZlcihvd25lcik7Ci0JCX0KLQotCX0KLQlwdWJsaWMgY2xhc3MgQnVmZmVyIGltcGxlbWVudHMgSUJ1ZmZlciB7Ci0JCUlPcGVuYWJsZSBvd25lcjsKLQkJQXJyYXlMaXN0IGNoYW5nZUxpc3RlbmVyczsKLQkJY2hhcltdIGNvbnRlbnRzID0gbnVsbDsKLQkJcHVibGljIEJ1ZmZlcihJT3BlbmFibGUgb3duZXIpIHsKLQkJCXRoaXMub3duZXIgPSBvd25lcjsJCi0JCX0KLQkJLyoKLQkJICogQHNlZSBJQnVmZmVyI2FkZEJ1ZmZlckNoYW5nZWRMaXN0ZW5lcihJQnVmZmVyQ2hhbmdlZExpc3RlbmVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRkQnVmZmVyQ2hhbmdlZExpc3RlbmVyKElCdWZmZXJDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCWlmICh0aGlzLmNoYW5nZUxpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQkJdGhpcy5jaGFuZ2VMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KDUpOwotCQkJfQotCQkJaWYgKCF0aGlzLmNoYW5nZUxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCQl0aGlzLmNoYW5nZUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQkJfQotCQl9Ci0KLQkJCS8qCi0JCSAqIEBzZWUgSUJ1ZmZlciNhcHBlbmQoY2hhcltdKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYXBwZW5kKGNoYXJbXSB0ZXh0KSB7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElCdWZmZXIjYXBwZW5kKFN0cmluZykKLQkJICovCi0JCXB1YmxpYyB2b2lkIGFwcGVuZChTdHJpbmcgdGV4dCkgewotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJQnVmZmVyI2Nsb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQkJdGhpcy5jb250ZW50cyA9IG51bGw7IC8vIG1hcmsgYXMgY2xvc2VkCi0JCQlpZiAodGhpcy5jaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCUJ1ZmZlckNoYW5nZWRFdmVudCBldmVudCA9IG51bGw7Ci0JCQkJZXZlbnQgPSBuZXcgQnVmZmVyQ2hhbmdlZEV2ZW50KHRoaXMsIDAsIDAsIG51bGwpOwotCQkJCWZvciAoaW50IGkgPSAwLCBzaXplID0gdGhpcy5jaGFuZ2VMaXN0ZW5lcnMuc2l6ZSgpOyBpIDwgc2l6ZTsgKytpKSB7Ci0JCQkJCUlCdWZmZXJDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSAoSUJ1ZmZlckNoYW5nZWRMaXN0ZW5lcikgdGhpcy5jaGFuZ2VMaXN0ZW5lcnMuZ2V0KGkpOwotCQkJCQlsaXN0ZW5lci5idWZmZXJDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQkJdGhpcy5jaGFuZ2VMaXN0ZW5lcnMgPSBudWxsOwotCQkJfQotCX0KLQotCQkvKgotCQkgKiBAc2VlIElCdWZmZXIjZ2V0Q2hhcihpbnQpCi0JCSAqLwotCQlwdWJsaWMgY2hhciBnZXRDaGFyKGludCBwb3NpdGlvbikgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElCdWZmZXIjZ2V0Q2hhcmFjdGVycygpCi0JCSAqLwotCQlwdWJsaWMgY2hhcltdIGdldENoYXJhY3RlcnMoKSB7Ci0JCQlyZXR1cm4gY29udGVudHM7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElCdWZmZXIjZ2V0Q29udGVudHMoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRDb250ZW50cygpIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nKGNvbnRlbnRzKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSUJ1ZmZlciNnZXRMZW5ndGgoKQotCQkgKi8KLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlyZXR1cm4gY29udGVudHMubGVuZ3RoOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJQnVmZmVyI2dldE93bmVyKCkKLQkJICovCi0JCXB1YmxpYyBJT3BlbmFibGUgZ2V0T3duZXIoKSB7Ci0JCQlyZXR1cm4gdGhpcy5vd25lcjsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSUJ1ZmZlciNnZXRUZXh0KGludCwgaW50KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJQnVmZmVyI2dldFVuZGVybHlpbmdSZXNvdXJjZSgpCi0JCSAqLwotCQlwdWJsaWMgSVJlc291cmNlIGdldFVuZGVybHlpbmdSZXNvdXJjZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJQnVmZmVyI2hhc1Vuc2F2ZWRDaGFuZ2VzKCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGhhc1Vuc2F2ZWRDaGFuZ2VzKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJQnVmZmVyI2lzQ2xvc2VkKCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgewotCQkJcmV0dXJuIHRoaXMuY29udGVudHMgPT0gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSUJ1ZmZlciNpc1JlYWRPbmx5KCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElCdWZmZXIjcmVtb3ZlQnVmZmVyQ2hhbmdlZExpc3RlbmVyKElCdWZmZXJDaGFuZ2VkTGlzdGVuZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZW1vdmVCdWZmZXJDaGFuZ2VkTGlzdGVuZXIoSUJ1ZmZlckNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJaWYgKHRoaXMuY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQl0aGlzLmNoYW5nZUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQkJCWlmICh0aGlzLmNoYW5nZUxpc3RlbmVycy5zaXplKCkgPT0gMCkgewotCQkJCQl0aGlzLmNoYW5nZUxpc3RlbmVycyA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJQnVmZmVyI3JlcGxhY2UoaW50LCBpbnQsIGNoYXJbXSkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlcGxhY2UoaW50IHBvc2l0aW9uLCBpbnQgbGVuZ3RoLCBjaGFyW10gdGV4dCkgewotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJQnVmZmVyI3JlcGxhY2UoaW50LCBpbnQsIFN0cmluZykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlcGxhY2UoaW50IHBvc2l0aW9uLCBpbnQgbGVuZ3RoLCBTdHJpbmcgdGV4dCkgewotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJQnVmZmVyI3NhdmUoSVByb2dyZXNzTW9uaXRvciwgYm9vbGVhbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNhdmUoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzcywgYm9vbGVhbiBmb3JjZSkKLQkJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJQnVmZmVyI3NldENvbnRlbnRzKGNoYXJbXSkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldENvbnRlbnRzKGNoYXJbXSBjaGFyYWN0ZXJzKSB7Ci0JCQljb250ZW50cyA9IGNoYXJhY3RlcnM7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElCdWZmZXIjc2V0Q29udGVudHMoU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0Q29udGVudHMoU3RyaW5nIGNoYXJhY3RlcnMpIHsKLQkJCWNvbnRlbnRzID0gY2hhcmFjdGVycy50b0NoYXJBcnJheSgpOwotCQl9Ci0KLX0KLQkKLXB1YmxpYyBXb3JraW5nQ29weVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlyZXR1cm4gbmV3IFN1aXRlKFdvcmtpbmdDb3B5VGVzdHMuY2xhc3MpOwotfQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVKYXZhUHJvamVjdCgKLQkJCSJQIiwgCi0JCQluZXcgU3RyaW5nW10geyJzcmMifSwgCi0JCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0RXh0ZXJuYWxKQ0xQYXRoU3RyaW5nKCksICJsaWIifSwgCi0JCQkiYmluIik7Ci0JCXRoaXMuY3JlYXRlRm9sZGVyKCJQL3NyYy94L3kiKTsKLQkJdGhpcy5jcmVhdGVGaWxlKCJQL3NyYy94L3kvQS5qYXZhIiwgCi0JCQkicGFja2FnZSB4Lnk7XG4iICsKLQkJCSJpbXBvcnQgamF2YS5pby5GaWxlO1xuIiArCi0JCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCQkiICBwdWJsaWMgY2xhc3MgSW5uZXIge1xuIiArCi0JCQkiICAgIHB1YmxpYyBjbGFzcyBJbm5lcklubmVyIHtcbiIgKwotCQkJIiAgICB9XG4iICsKLQkJCSIgICAgaW50IGlubmVyRmllbGQ7XG4iICsKLQkJCSIgICAgdm9pZCBpbm5lck1ldGhvZCgpIHtcbiIgKwotCQkJIiAgICB9XG4iICsKLQkJCSIgIH1cbiIgKwotCQkJIiAgc3RhdGljIFN0cmluZyBGSUVMRDtcbiIgKwotCQkJIiAge1xuIiArCi0JCQkiICAgIEZJRUxEID0gRmlsZS5wYXRoU2VwYXJhdG9yO1xuIiArCi0JCQkiICB9XG4iICsKLQkJCSIgIGludCBmaWVsZDE7XG4iICsKLQkJCSIgIGJvb2xlYW4gZmllbGQyO1xuIiArCi0JCQkiICBwdWJsaWMgdm9pZCBmb28oKSB7XG4iICsKLQkJCSIgIH1cbiIgKwotCQkJIn0iKTsKLQkJdGhpcy5jdSA9IHRoaXMuZ2V0Q29tcGlsYXRpb25Vbml0KCJQL3NyYy94L3kvQS5qYXZhIik7Ci0JCXRoaXMuY29weSA9IChJQ29tcGlsYXRpb25Vbml0KSBjdS5nZXRXb3JraW5nQ29weSgpOwotCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JfQotfQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQlpZiAodGhpcy5jb3B5ICE9IG51bGwpIHRoaXMuY29weS5kZXN0cm95KCk7Ci0JdGhpcy5kZWxldGVQcm9qZWN0KCJQIik7Ci19Ci0vKioKLSAqLwotcHVibGljIHZvaWQgdGVzdENoYW5nZUNvbnRlbnQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JU3RyaW5nIG5ld0NvbnRlbnRzID0KLQkJInBhY2thZ2UgeC55O1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgQSB7XG4iICsKLQkJIiAgcHVibGljIHZvaWQgYmFyKCkge1xuIiArCi0JCSIgIH1cbiIgKwotCQkifSI7Ci0JdGhpcy5jb3B5LmdldEJ1ZmZlcigpLnNldENvbnRlbnRzKG5ld0NvbnRlbnRzKTsKLQl0aGlzLmNvcHkucmVjb25jaWxlKCk7Ci0JYXNzZXJ0U291cmNlRXF1YWxzKAotCQkiVW5leHBlY3RlZCB3b3JraW5nIGNvcHkgY29udGVudHMiLAotCQluZXdDb250ZW50cywKLQkJdGhpcy5jb3B5LmdldEJ1ZmZlcigpLmdldENvbnRlbnRzKCkpOwotCQotCXRoaXMuY29weS5jb21taXQodHJ1ZSwgbnVsbCk7Ci0JYXNzZXJ0U291cmNlRXF1YWxzKAotCQkiVW5leHBlY3RlZCBvcmlnaW5hbCBjdSBjb250ZW50cyIsCi0JCW5ld0NvbnRlbnRzLAotCQl0aGlzLmN1LmdldEJ1ZmZlcigpLmdldENvbnRlbnRzKCkpOwotfQotLyoqCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VDb250ZW50T2ZSZWFkT25seUNVKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCUlSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuY3UuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7Ci0JYm9vbGVhbiByZWFkT25seUZsYWcgPSByZXNvdXJjZS5pc1JlYWRPbmx5KCk7Ci0JYm9vbGVhbiBkaWRDb21wbGFpbiA9IGZhbHNlOwotCXRyeSB7Ci0JCXJlc291cmNlLnNldFJlYWRPbmx5KHRydWUpOwotCQl0aGlzLmNvcHkuZ2V0QnVmZmVyKCkuc2V0Q29udGVudHMoImludmFsaWQiKTsKLQkJdGhpcy5jb3B5LmNvbW1pdCh0cnVlLCBudWxsKTsKLQl9IGNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBlKXsKLQkJZGlkQ29tcGxhaW4gPSB0cnVlOwotCX0gZmluYWxseSB7Ci0JCXJlc291cmNlLnNldFJlYWRPbmx5KHJlYWRPbmx5RmxhZyk7Ci0JfQotCWFzc2VydFRydWUoIlNob3VsZCBoYXZlIGNvbXBsYWluZWQgYWJvdXQgbW9kaWZ5aW5nIGEgcmVhZC1vbmx5IHVuaXQ6IiwgZGlkQ29tcGxhaW4pOwotCWFzc2VydFRydWUoIlJlYWRPbmx5IGJ1ZmZlciBnb3QgbW9kaWZpZWQ6IiwgIXRoaXMuY3UuZ2V0QnVmZmVyKCkuZ2V0Q29udGVudHMoKS5lcXVhbHMoImludmFsaWQiKSk7Ci19Ci0KLS8qKgotICogRW5zdXJlcyB0aGF0IHRoZSBzb3VyY2UgY29udGVudHMgb2YgYSB3b3JraW5nIGNvcHkgYXJlCi0gKiBub3QgYWx0ZXJlZCBieSBjaGFuZ2VzIHRvIHRoZSBzb3VyY2Ugb2YgdGhlIG9yaWdpbmFsIGNvbXBpbGF0aW9uCi0gKiB1bml0LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q29udGVudHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JU3RyaW5nIG9yaWdpbmFsU291cmNlID0gdGhpcy5jdS5nZXRTb3VyY2UoKTsKLQlJVHlwZSB0eXBlID0gdGhpcy5jdS5nZXRUeXBlKCJBIik7Ci0JYXNzZXJ0RGVsZXRpb24odHlwZSk7Ci0JYXNzZXJ0U291cmNlRXF1YWxzKCJzb3VyY2UgY29kZSBvZiBjb3B5IHNob3VsZCBzdGlsbCBiZSBvcmlnaW5hbCIsIG9yaWdpbmFsU291cmNlLCB0aGlzLmNvcHkuZ2V0U291cmNlKCkpOwotfQotCi0vKioKLSAqIFRlc3QgY3JlYXRpbmcgYSB3b3JraW5nIGNvcHkgb24gYSBjbGFzcyBmaWxlIHdpdGggYSBjdXN0b21pemVkIGJ1ZmZlci4KLSAqLwotcHVibGljIHZvaWQgdGVzdE9uQ2xhc3NGaWxlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JdGhpcy5hdHRhY2hTb3VyY2UodGhpcy5nZXRQYWNrYWdlRnJhZ21lbnRSb290KCJQIiwgdGhpcy5nZXRFeHRlcm5hbEpDTFBhdGhTdHJpbmcoKSksIHRoaXMuZ2V0RXh0ZXJuYWxKQ0xTb3VyY2VQYXRoKCkudG9PU1N0cmluZygpLCAic3JjIik7Ci0JSUNsYXNzRmlsZSBjbGFzc0ZpbGUgPSB0aGlzLmdldENsYXNzRmlsZSgiUCIsIHRoaXMuZ2V0RXh0ZXJuYWxKQ0xQYXRoU3RyaW5nKCksICJqYXZhLmxhbmciLCAiT2JqZWN0LmNsYXNzIik7Ci0JSUJ1ZmZlckZhY3RvcnkgZmFjdG9yeSA9IG5ldyBCdWZmZXJGYWN0b3J5KCk7Ci0JSUphdmFFbGVtZW50IGN1c3RvbWl6ZWRDb3B5ID0gY2xhc3NGaWxlLmdldFdvcmtpbmdDb3B5KG51bGwsIGZhY3RvcnkpOwotCXRyeSB7Ci0JCWFzc2VydFRydWUoIlNob3VsZCBiZSBhbiBJT3BlbmFibGUiLCBjdXN0b21pemVkQ29weSBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpOwotCQlJQnVmZmVyIGJ1ZmZlciA9ICgoSUNvbXBpbGF0aW9uVW5pdCljdXN0b21pemVkQ29weSkuZ2V0QnVmZmVyKCk7Ci0JCWFzc2VydFRydWUoIlVuZXhwZWN0ZWQgYnVmZmVyIiwgYnVmZmVyIGluc3RhbmNlb2YgQnVmZmVyKTsJCi0JCWFzc2VydFRydWUoIkJ1ZmZlciBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgd2l0aCBzb3VyY2UiLCBidWZmZXIuZ2V0Q2hhcmFjdGVycygpLmxlbmd0aCA+IDApOwotCX0gZmluYWxseSB7Ci0JCWlmIChjdXN0b21pemVkQ29weSBpbnN0YW5jZW9mIElXb3JraW5nQ29weSkgewotCQkJKChJV29ya2luZ0NvcHkpY3VzdG9taXplZENvcHkpLmRlc3Ryb3koKTsKLQkJfQotCX0KLX0KLS8qKgotICogQ3JlYXRlIHRoZSBjb21waWxhdGlvbiB1bml0IHBsYWNlIGhvbGRlciBmb3IgdGhlIHdvcmtpbmcgY29weSB0ZXN0cy4KLSAqLwotcHVibGljIHZvaWQgdGVzdENyZWF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIGNyZWF0ZSBYLmphdmEgY29tcGlsYXRpb24gdW5pdCIsIHRoaXMuY3UgIT0gbnVsbCAmJiB0aGlzLmN1LmV4aXN0cygpKTsKLQlhc3NlcnRUcnVlKCJGYWlsZWQgdG8gY3JlYXRlIHdvcmtpbmcgY29weSBvbiBYLmphdmEiLCB0aGlzLmNvcHkgIT0gbnVsbCAmJiB0aGlzLmNvcHkuZXhpc3RzKCkpOwotfQotCi0vKioKLSAqIFRlc3QgY3JlYXRpbmcgYSB3b3JraW5nIGNvcHkgd2l0aCBhIGN1c3RvbWl6ZWQgYnVmZmVyLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0Q3VzdG9taXplZEJ1ZmZlcigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlCdWZmZXJGYWN0b3J5IGZhY3RvcnkgPSBuZXcgQnVmZmVyRmFjdG9yeSgpOwotCUlXb3JraW5nQ29weSBjdXN0b21pemVkQ29weSA9IChJV29ya2luZ0NvcHkpdGhpcy5jdS5nZXRXb3JraW5nQ29weShudWxsLCBmYWN0b3J5LCBudWxsKTsKLQl0cnkgewotCQlhc3NlcnRUcnVlKCJTaG91bGQgYmUgYW4gSU9wZW5hYmxlIiwgY3VzdG9taXplZENvcHkgaW5zdGFuY2VvZiBJT3BlbmFibGUpOwotCQlhc3NlcnRUcnVlKCJVbmV4cGVjdGVkIGJ1ZmZlciIsICgoSU9wZW5hYmxlKWN1c3RvbWl6ZWRDb3B5KS5nZXRCdWZmZXIoKSBpbnN0YW5jZW9mIEJ1ZmZlcik7Ci0JfSBmaW5hbGx5IHsKLQkJY3VzdG9taXplZENvcHkuZGVzdHJveSgpOwotCX0KLX0KLS8qKgotICogVGVzdCBjbG9zaW5nIHRoZW4gcmVvcGVuaW5nIGEgd29ya2luZyBjb3B5IHdpdGggYSBjdXN0b21pemVkIGJ1ZmZlci4KLSAqLwotcHVibGljIHZvaWQgdGVzdEN1c3RvbWl6ZWRCdWZmZXIyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUJ1ZmZlckZhY3RvcnkgZmFjdG9yeSA9IG5ldyBCdWZmZXJGYWN0b3J5KCk7Ci0JSVdvcmtpbmdDb3B5IGN1c3RvbWl6ZWRDb3B5ID0gKElXb3JraW5nQ29weSl0aGlzLmN1LmdldFdvcmtpbmdDb3B5KG51bGwsIGZhY3RvcnksIG51bGwpOwotCXRyeSB7Ci0JCWFzc2VydFRydWUoIlNob3VsZCBiZSBhbiBJT3BlbmFibGUiLCBjdXN0b21pemVkQ29weSBpbnN0YW5jZW9mIElPcGVuYWJsZSk7Ci0JCUlPcGVuYWJsZSBvcGVuYWJsZUNvcHkgPSAoSU9wZW5hYmxlKWN1c3RvbWl6ZWRDb3B5OwotCQlvcGVuYWJsZUNvcHkuY2xvc2UoKTsKLQkJb3BlbmFibGVDb3B5Lm9wZW4obnVsbCk7Ci0JCWFzc2VydFRydWUoIlVuZXhwZWN0ZWQgYnVmZmVyIiwgb3BlbmFibGVDb3B5LmdldEJ1ZmZlcigpIGluc3RhbmNlb2YgQnVmZmVyKTsJCQotCX0gZmluYWxseSB7Ci0JCWN1c3RvbWl6ZWRDb3B5LmRlc3Ryb3koKTsKLQl9Ci19Ci0vKgotICogVGVzdCB0aGF0IGRlbGV0aW5nIDIgZmllbGRzIGluIGEgSmF2YUNvcmUucnVuKCkgb3BlcmF0aW9uIHJlcG9ydHMgdGhlIGNvcnJlY3QgZGVsdGEuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMzIyMjUgaW5jb3JyZWN0IGRlbHRhIGFmdGVyIGRlbGV0aW5nIDIgZmllbGRzKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0RGVsZXRlMkZpZWxkcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0cnkgewotCQlzdGFydERlbHRhcygpOwotCQlKYXZhQ29yZS5ydW4oCi0JCQluZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJSVR5cGUgdHlwZSA9IGNvcHkuZ2V0VHlwZSgiQSIpOwotCQkJCQlJRmllbGQgZmllbGQxID0gdHlwZS5nZXRGaWVsZCgiZmllbGQxIik7Ci0JCQkJCUlGaWVsZCBmaWVsZDIgPSB0eXBlLmdldEZpZWxkKCJmaWVsZDIiKTsKLQkJCQkJZmllbGQxLmRlbGV0ZShmYWxzZSwgbW9uaXRvcik7Ci0JCQkJCWZpZWxkMi5kZWxldGUoZmFsc2UsIG1vbml0b3IpOwotCQkJCX0KLQkJCX0sCi0JCQludWxsKTsKLQkJYXNzZXJ0RGVsdGFzKAotCQkJIlVuZXhwZWN0ZWQgZGVsdGEiLAotCQkJIkFbKl06IHtDSElMRFJFTiB8IEZJTkUgR1JBSU5FRH1cbiIgKyAKLQkJCSIJZmllbGQxWy1dOiB7fVxuIiArIAotCQkJIglmaWVsZDJbLV06IHt9IgotCQkpOwotCX0gZmluYWxseSB7Ci0JCXN0b3BEZWx0YXMoKTsKLQl9Ci19Ci0vKioKLSAqIFRlc3RzIHRoZSBnZW5lcmFsIGZ1bmN0aW9uYWxpdHkgb2YgYSB3b3JraW5nIGNvcHk6PHVsPgotICogPGxpPmVuc3VyZXMgdGhhdCB0aGUgY29weSBhbmQgb3JpZ2luYWwgY29tcGlsYXRpb24gdW5pdCBhcmUgbm90IGVxdWFsPC9saT4KLSAqIDxsaT5lbnN1cmVzIHRoZSBjb3JyZWN0IHJldHJpZXZhbCBvZiB0aGUgb3JpZ2luYWwgZWxlbWVudDwvbGk+Ci0gKiA8bGk+Y2xvc2luZyB0aGUgcGFja2FnZSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCBkb2VzIG5vdCBjbG9zZSB0aGUgY29weTwvbGk+Ci0gKiA8bGk+ZW5zdXJlcyB0aGF0IHdvcmtpbmcgY29waWVzIGFyZSB1bmlxdWUKLSAqIDxsaT5lbnN1cmVzIGNvbW1pdHRpbmcgY2hhbmdlcyBmcm9tIHdvcmtpbmcgY29waWVzIAotICovCi1wdWJsaWMgdm9pZCB0ZXN0R2VuZXJhbCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotCWFzc2VydFRydWUoImNvcHkgYW5kIGFjdHVhbCBzaG91bGQgbm90IGJlIGVxdWFsIiwgIXRoaXMuY29weS5lcXVhbHModGhpcy5jdSkpOwotCi0JSVR5cGUgY29weVR5cGU9IHRoaXMuY29weS5nZXRUeXBlKCJBIik7Ci0KLQlhc3NlcnRUcnVlKCJjYW4ndCBnZXQgb3JpZ2luYWwgZnJvbSBvcmlnaW5hbCIsIHRoaXMuY3UuZ2V0T3JpZ2luYWxFbGVtZW50KCkgPT0gbnVsbCk7Ci0KLQlhc3NlcnRUcnVlKCJnZXR0aW5nIHdvcmtpbmcgY29weSBmcm9tIGEgY29weSBzaG91bGQgeWllbGQgb3JpZ2luYWwgY29weSIsIHRoaXMuY29weS5nZXRXb3JraW5nQ29weSgpID09IHRoaXMuY29weSk7Ci0KLQlib29sZWFuIGV4PSBmYWxzZTsKLQlhc3NlcnREZWxldGlvbihjb3B5VHlwZSk7Ci0KLQkvLyBjbG9zaW5nIHRoZSBwYWNrYWdlIHNob3VsZCBub3QgY2xvc2UgdGhlIGNvcHkKLQkoKElPcGVuYWJsZSl0aGlzLmN1LmdldFBhcmVudCgpKS5jbG9zZSgpOwotCWFzc2VydFRydWUoImNvcHkgc2hvdWxkIHN0aWxsIGJlIG9wZW4iLCB0aGlzLmNvcHkuaXNPcGVuKCkpOwotCQotCS8vIHZlcmlmeSBvcmlnaW5hbCBzdGlsbCBwcmVzZW50Ci0JYXNzZXJ0VHJ1ZSgiYWN0dWFsIHR5cGUgc2hvdWxkIHN0aWxsIGJlIHByZXNlbnQiLCB0aGlzLmN1LmdldFR5cGUoIkEiKS5leGlzdHMoKSk7Ci0KLQkvLyBnZXRBbm90aGVyIHdvcmtpbmcgY29weQotCUlDb21waWxhdGlvblVuaXQgY29weTI9IChJQ29tcGlsYXRpb25Vbml0KXRoaXMuY3UuZ2V0V29ya2luZ0NvcHkoKTsKLQl0cnkgewotCQlhc3NlcnRUcnVlKCJ3b3JraW5nIGNvcGllcyBzaG91bGQgYmUgdW5pcXVlICIsICEodGhpcy5jb3B5LmVxdWFscyhjb3B5MikpKTsKLQkKLQkJLy8gZGVsZXRlIGEgbWV0aG9kIGZyb20gdGhlIDJuZCB3b3JraW5nIGNvcHkuCi0JCUlNZXRob2QgbWV0aG9kPSBjb3B5Mi5nZXRUeXBlKCJBIikuZ2V0TWV0aG9kKCJmb28iLCBudWxsKTsKLQkKLQkJYXNzZXJ0RGVsZXRpb24obWV0aG9kKTsKLQkJSU1ldGhvZCBvcmlnaW5hbE1ldGhvZD0gdGhpcy5jdS5nZXRUeXBlKCJBIikuZ2V0TWV0aG9kKCJmb28iLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSgibWV0aG9kIHNob3VsZCBzdGlsbCBiZSBwcmVzZW50IGluIG9yaWdpbmFsIiwgb3JpZ2luYWxNZXRob2QuZXhpc3RzKCkpOwotCQotCQkvLyBjb21taXQgdGhlIGNoYW5nZXMgZnJvbSB0aGUgMm5kIGNvcHkuCi0JCWNvcHkyLmNvbW1pdChmYWxzZSwgbnVsbCk7Ci0JCi0JCWFzc2VydFRydWUoImNvcHkgYWx3YXlzIGhhcyB1bnNhdmVkIGNoYW5nZXMiLCBjb3B5Mi5oYXNVbnNhdmVkQ2hhbmdlcygpKTsKLQkJCi0JCS8vIG9yaWdpbmFsIG1ldGhvZCBzaG91bGQgbm93IGJlIGdvbmUKLQkJYXNzZXJ0VHJ1ZSgibWV0aG9kIHNob3VsZCBubyBsb25nZXIgYmUgcHJlc2VudCBpbiBvcmlnaW5hbCBhZnRlciBjb21taXQiLCAhb3JpZ2luYWxNZXRob2QuZXhpc3RzKCkpOwotCQotCQkvLyBjb21taXQgdGhlIGNoYW5nZXMgZnJvbSB0aGUgMXN0IGNvcHkgLSBzaG91bGQgZmFpbAotCQl0cnkgewotCQkJdGhpcy5jb3B5LmNvbW1pdChmYWxzZSwgbnVsbCk7Ci0JCQlhc3NlcnRUcnVlKCJjb21taXQgc2hvdWxkIGhhdmUgZmFpbGVkIiwgZXgpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCX0KLQkJCi0JCi0JCS8vIG5vdyBmb3JjZSB0aGUgdXBkYXRlCi0JCXRyeSB7Ci0JCQl0aGlzLmNvcHkuY29tbWl0KHRydWUsIG51bGwpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCQlhc3NlcnRUcnVlKCJjb21taXQgc2hvdWxkIHdvcmsiLCBmYWxzZSk7Ci0JCX0KLQkKLQkJLy8gbm93IHRoZSB0eXBlIHNob3VsZCBiZSBnb25lLgotCQlhc3NlcnRUcnVlKCJvcmlnaW5hbCB0eXBlIHNob3VsZCBubyBsb25nZXIgYmUgcHJlc2VudCIsICF0aGlzLmN1LmdldFR5cGUoIkEiKS5leGlzdHMoKSk7Ci0JCi0JCi0JCXRoaXMuY29weS5jbG9zZSgpOwotCQlleD0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLmNvcHkub3BlbihudWxsKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCWV4PSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoInNob3VsZCBiZSBhYmxlIHRvIG9wZW4gd29ya2luZyBjb3B5IGEgMm5kIHRpbWUiLCAhZXgpOwotCQotCQkvLyBub3cgZGVzdHJveSB0aGUgaGFuZGxlCi0JCXRoaXMuY29weS5kZXN0cm95KCk7Ci0JCWV4PSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMuY29weS5vcGVuKG51bGwpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJZXg9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgic2hvdWxkIG5vdCBiZSBhYmxlIHRvIG9wZW4gd29ya2luZyBjb3B5IGFnYWluIiwgZXgpOwotCX0gZmluYWxseSB7Ci0JCWNvcHkyLmRlc3Ryb3koKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCBubyBvcmlnaW5hbCBlbGVtZW50IGNhbiBiZSByZXRyaWV2ZWQgb24gYSBiaW5hcnkgZWxlbWVudC4KLSAqIHVuaXQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXRPcmlnaW5hbEJpbmFyeUVsZW1lbnQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JLyogRXZhbHVhdGUgdGhlIGZvbGxvd2luZyBpbiBhIHNjcmFwYm9vazoKLQkgb3JnLmVjbGlwc2UuamR0LnRlc3RzLmNvcmUuTW9kaWZ5aW5nUmVzb3VyY2VUZXN0cy5nZW5lcmF0ZUNsYXNzRmlsZSgKLQkJIkEiLAotCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCSJ9IikKLQkqLwotCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW10gewotCQktNTQsIC0yLCAtNzAsIC02NiwgMCwgMywgMCwgNDUsIDAsIDEwLCAxLCAwLCAxLCA2NSwgNywgMCwgMSwgMSwgMCwgMTYsIDEwNiwgOTcsIDExOCwgOTcsIDQ3LCAxMDgsIDk3LCAxMTAsIDEwMywgNDcsIDc5LCA5OCwgMTA2LCAxMDEsIDk5LCAxMTYsIDcsIDAsIDMsIDEsIDAsIDYsIDYwLCAxMDUsIDExMCwgMTA1LCAxMTYsIDYyLCAxLCAwLCAzLCA0MCwgNDEsIDg2LCAxLCAwLCA0LCA2NywgMTExLCAxMDAsIDEwMSwgMTIsIDAsIDUsIDAsIDYsIDEwLCAwLCA0LCAwLCA4LCAwLCAzMywgMCwgMiwgMCwgNCwgMCwgMCwgMCwgCi0JCTAsIDAsIDEsIDAsIDEsIDAsIDUsIDAsIDYsIDAsIDEsIDAsIDcsIDAsIDAsIDAsIDE3LCAwLCAxLCAwLCAxLCAwLCAwLCAwLCA1LCA0MiwgLTczLCAwLCA5LCAtNzksIDAsIDAsIDAsIDAsIDAsIDAsIAotCX07Ci0JdGhpcy5jcmVhdGVGaWxlKCJQL2xpYi9BLmNsYXNzIiwgbmV3IFN0cmluZyhieXRlcykpOwotCUlDbGFzc0ZpbGUgY2YgPSB0aGlzLmdldENsYXNzRmlsZSgiUC9saWIvQS5jbGFzcyIpOwotCUlKYXZhRWxlbWVudCBvcmlnaW5hbD0gdGhpcy5jb3B5LmdldE9yaWdpbmFsKGNmKTsKLQlhc3NlcnRUcnVlKCJFbGVtZW50IHNob3VsZCBub3QgYmUgZm91bmQiLCBvcmlnaW5hbCA9PSBudWxsKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IHRoZSBvcmlnaW5hbCBjdSBjYW4gYmUgcmV0cmlldmVkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0R2V0T3JpZ2luYWxDVSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlKYXZhRWxlbWVudCBvcmlnaW5hbD0gdGhpcy5jb3B5LmdldE9yaWdpbmFsKGNvcHkpOwotCWFzc2VydFRydWUoIkVsZW1lbnQgaXMgbm90IGEgY3UiLCBvcmlnaW5hbCBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQgJiYgISgoSUNvbXBpbGF0aW9uVW5pdClvcmlnaW5hbCkuaXNXb3JraW5nQ29weSgpKTsKLQlhc3NlcnRUcnVlKCJFbGVtZW50IHNob3VsZCBleGlzdCIsIG9yaWdpbmFsLmV4aXN0cygpKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IGdldHRpbmcgdGhlIG9yaWdpbmFsIGVsZW1lbnQgZnJvbSBhIGRpZmZlcmVudCBjb21waWxhdGlvbiB1bml0IHJldHVybnMgbnVsbC4KLSAqLwotcHVibGljIHZvaWQgdGVzdEdldE9yaWdpbmFsRWxlbWVudE5vdEluV29ya2luZ0NvcHkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjb3B5MiA9IG51bGw7Ci0JdHJ5IHsKLQkJdGhpcy5jcmVhdGVGaWxlKAotCQkJIlAvc3JjL3gveS9CLmphdmEiLCAKLQkJCSJwYWNrYWdlIHgueTtcbiIgKwotCQkJInB1YmxpYyBjbGFzcyBCIHtcbiIgKwotCQkJIn0iKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdTIgPSB0aGlzLmdldENvbXBpbGF0aW9uVW5pdCgiUC9zcmMveC95L0IuamF2YSIpOwotCQljb3B5MiA9IChJQ29tcGlsYXRpb25Vbml0KWN1Mi5nZXRXb3JraW5nQ29weSgpOwotCQotCQlJUGFja2FnZURlY2xhcmF0aW9uIHBrZz0gY29weTIuZ2V0UGFja2FnZURlY2xhcmF0aW9uKCJ4LnkiKTsKLQkJSUphdmFFbGVtZW50IG9yaWdpbmFsPSB0aGlzLmNvcHkuZ2V0T3JpZ2luYWwocGtnKTsKLQkJYXNzZXJ0VHJ1ZSgiRWxlbWVudCBzaG91bGQgbm90IGJlIGZvdW5kIGFzIGZyb20gYSBkaWZmZXJlbnQgd29ya2luZyBjb3B5Iiwgb3JpZ2luYWwgPT0gbnVsbCk7Ci0JfSBmaW5hbGx5IHsKLQkJaWYgKGNvcHkyICE9IG51bGwpIGNvcHkyLmRlc3Ryb3koKTsKLQl9Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCB0aGUgb3JpZ2luYWwgZmllbGQgY2FuIGJlIHJldHJpZXZlZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdEdldE9yaWdpbmFsRmllbGQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gdGhpcy5jb3B5LmdldFR5cGUoIkEiKTsKLQlJSmF2YUVsZW1lbnQgb3JpZ2luYWwgPSB0aGlzLmNvcHkuZ2V0T3JpZ2luYWwodHlwZS5nZXRGaWVsZCgiRklFTEQiKSk7Ci0JYXNzZXJ0VHJ1ZSgiRWxlbWVudCBpcyBub3QgYSBtZXRob2QiLCBvcmlnaW5hbCBpbnN0YW5jZW9mIElGaWVsZCAmJiAhKChJQ29tcGlsYXRpb25Vbml0KW9yaWdpbmFsLmdldFBhcmVudCgpLmdldFBhcmVudCgpKS5pc1dvcmtpbmdDb3B5KCkpOwotCWFzc2VydFRydWUoIkVsZW1lbnQgc2hvdWxkIGV4aXN0Iiwgb3JpZ2luYWwuZXhpc3RzKCkpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgdGhlIG9yaWdpbmFsIGltcG9ydCBkZWNsYXJhdGlvbiBjYW4gYmUgcmV0cmlldmVkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0R2V0T3JpZ2luYWxJbXBvcnREZWNsYXJhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlJbXBvcnREZWNsYXJhdGlvbiBpbXBydCA9IGNvcHkuZ2V0SW1wb3J0KCJqYXZhLmlvLkZpbGUiKTsKLQlJSmF2YUVsZW1lbnQgb3JpZ2luYWw9IHRoaXMuY29weS5nZXRPcmlnaW5hbChpbXBydCk7Ci0JYXNzZXJ0VHJ1ZSgiRWxlbWVudCBzaG91bGQgZXhpc3QiLCBvcmlnaW5hbC5leGlzdHMoKSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCB0aGUgb3JpZ2luYWwgaW1wb3J0IGNvbnRhaW5lciBjYW4gYmUgcmV0cmlldmVkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0R2V0T3JpZ2luYWxJbXBvcnRDb250YWluZXIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJSW1wb3J0Q29udGFpbmVyIGNvbnRhaW5lciA9IHRoaXMuY29weS5nZXRJbXBvcnRDb250YWluZXIoKTsKLQlJSmF2YUVsZW1lbnQgb3JpZ2luYWwgPSB0aGlzLmNvcHkuZ2V0T3JpZ2luYWwoY29udGFpbmVyKTsKLQlhc3NlcnRUcnVlKCJFbGVtZW50IHNob3VsZCBub3QgYmUgbnVsbCIsIG9yaWdpbmFsICE9IG51bGwpOwotCWFzc2VydFRydWUoIkVsZW1lbnQgc2hvdWxkIGV4aXN0Iiwgb3JpZ2luYWwuZXhpc3RzKCkpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgdGhlIG9yaWdpbmFsIGluaXRpYWxpemVyIGNhbiBiZSByZXRyaWV2ZWQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXRPcmlnaW5hbEluaXRpYWxpemVyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZT0gY29weS5nZXRUeXBlKCJBIik7Ci0JSUphdmFFbGVtZW50IG9yaWdpbmFsPSBjb3B5LmdldE9yaWdpbmFsKHR5cGUuZ2V0SW5pdGlhbGl6ZXIoMSkpOwotCWFzc2VydFRydWUoIkVsZW1lbnQgc2hvdWxkIGV4aXN0Iiwgb3JpZ2luYWwuZXhpc3RzKCkpOwotfQotLyoqCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXRPcmlnaW5hbElubmVyRmllbGQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJVHlwZSBpbm5lclR5cGUgPSB0aGlzLmNvcHkuZ2V0VHlwZSgiQSIpLmdldFR5cGUoIklubmVyIik7Ci0JSUphdmFFbGVtZW50IG9yaWdpbmFsID0gdGhpcy5jb3B5LmdldE9yaWdpbmFsKGlubmVyVHlwZS5nZXRGaWVsZCgiaW5uZXJGaWVsZCIpKTsKLQlhc3NlcnRUcnVlKCJFbGVtZW50IGlzIG5vdCBhIGZpZWxkIiwgb3JpZ2luYWwgaW5zdGFuY2VvZiBJRmllbGQpOwotCWFzc2VydFRydWUoIkVsZW1lbnQgc2hvdWxkIGV4aXN0Iiwgb3JpZ2luYWwuZXhpc3RzKCkpOwotfQotLyoqCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXRPcmlnaW5hbElubmVyTWV0aG9kKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSVR5cGUgaW5uZXJUeXBlID0gdGhpcy5jb3B5LmdldFR5cGUoIkEiKS5nZXRUeXBlKCJJbm5lciIpOwotCUlKYXZhRWxlbWVudCBvcmlnaW5hbCA9IGNvcHkuZ2V0T3JpZ2luYWwoaW5uZXJUeXBlLmdldE1ldGhvZHMoKVswXSk7Ci0JYXNzZXJ0VHJ1ZSgiRWxlbWVudCBpcyBub3QgYSBtZXRob2QiLCBvcmlnaW5hbCBpbnN0YW5jZW9mIElNZXRob2QpOwotCWFzc2VydFRydWUoIkVsZW1lbnQgc2hvdWxkIGV4aXN0Iiwgb3JpZ2luYWwuZXhpc3RzKCkpOwotfQotLyoqCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXRPcmlnaW5hbElubmVyVHlwZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlUeXBlIGlubmVySW5uZXJUeXBlID0gdGhpcy5jb3B5LmdldFR5cGUoIkEiKS5nZXRUeXBlKCJJbm5lciIpLmdldFR5cGUoIklubmVySW5uZXIiKTsKLQlJSmF2YUVsZW1lbnQgb3JpZ2luYWwgPSB0aGlzLmNvcHkuZ2V0T3JpZ2luYWwoaW5uZXJJbm5lclR5cGUpOwotCWFzc2VydFRydWUoIkVsZW1lbnQgaXMgbm90IGEgbWV0aG9kIiwgb3JpZ2luYWwgaW5zdGFuY2VvZiBJVHlwZSk7Ci0JYXNzZXJ0VHJ1ZSgiRWxlbWVudCBzaG91bGQgZXhpc3QiLCBvcmlnaW5hbC5leGlzdHMoKSk7Ci0KLQlWZWN0b3IgaGllcmFyY2h5ID0gbmV3IFZlY3Rvcig1KTsKLQlJSmF2YUVsZW1lbnQgcGFyZW50PSBvcmlnaW5hbC5nZXRQYXJlbnQoKTsKLQl3aGlsZSAocGFyZW50LmdldEVsZW1lbnRUeXBlKCkgPiBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCkgewotCQloaWVyYXJjaHkuYWRkRWxlbWVudChwYXJlbnQpOwotCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7Ci0JfQotCWhpZXJhcmNoeS5hZGRFbGVtZW50KHBhcmVudCk7Ci0JYXNzZXJ0VHJ1ZSgiQ29tcGlsYXRpb24gVW5pdCBzaG91bGQgbm90IGJlIGEgd29ya2luZyBjb3B5IiwgISgoSUNvbXBpbGF0aW9uVW5pdCloaWVyYXJjaHkubGFzdEVsZW1lbnQoKSkuaXNXb3JraW5nQ29weSgpKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IHRoZSBvcmlnaW5hbCBtZXRob2QgY2FuIGJlIHJldHJpZXZlZC4KLSAqLwotcHVibGljIHZvaWQgdGVzdEdldE9yaWdpbmFsTWV0aG9kKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IHRoaXMuY29weS5nZXRUeXBlKCJBIik7Ci0JSUphdmFFbGVtZW50IG9yaWdpbmFsPSBjb3B5LmdldE9yaWdpbmFsKHR5cGUuZ2V0TWV0aG9kcygpWzBdKTsKLQlhc3NlcnRUcnVlKCJFbGVtZW50IGlzIG5vdCBhIG1ldGhvZCIsIG9yaWdpbmFsIGluc3RhbmNlb2YgSU1ldGhvZCk7Ci0JYXNzZXJ0VHJ1ZSgiRWxlbWVudCBzaG91bGQgZXhpc3QiLCBvcmlnaW5hbC5leGlzdHMoKSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCByZW5hbWluZyBhIG1ldGhvZCBvZiBhIHdvcmtpbmcgY29weSBkb2VzCi0gKiBub3QgYWx0ZXIgdGhlIHNvdXJjZSBvZiB0aGUgb3JpZ2luYWwgY29tcGlsYXRpb24KLSAqIHVuaXQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RSZW5hbWVNZXRob2QoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQlJVHlwZSB0eXBlID0gdGhpcy5jb3B5LmdldFR5cGUoIkEiKTsKLQlJTWV0aG9kIG1ldGhvZCA9IHR5cGUuZ2V0TWV0aG9kcygpWzBdOwotCUlKYXZhRWxlbWVudCBvcmlnaW5hbD0gY29weS5nZXRPcmlnaW5hbChtZXRob2QpOwotCW1ldGhvZC5yZW5hbWUoImJhciIsIGZhbHNlLCBudWxsKTsKLQlhc3NlcnRFcXVhbHMoIkludmFsaWQgbmFtZSBvZiB3b3JraW5nIGNvcHkgbWV0aG9kIiwgImJhciIsIHR5cGUuZ2V0TWV0aG9kcygpWzBdLmdldEVsZW1lbnROYW1lKCkpOwotCWFzc2VydEVxdWFscygiSW52YWxpZCBuYW1lIG9mIG9yaWdpbmFsIG1ldGhvZCIsICJmb28iLCBvcmlnaW5hbC5nZXRFbGVtZW50TmFtZSgpKTsKLX0KLS8qKgotICogRW5zdXJlcyB0aGF0IHRoZSBvcmlnaW5hbCBwYWNrYWdlIGRlY2xhcmF0aW9uIGNhbiBiZSByZXRyaWV2ZWQuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RHZXRPcmlnaW5hbFBhY2thZ2VEZWNsYXJhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlQYWNrYWdlRGVjbGFyYXRpb24gcGtnID0gdGhpcy5jb3B5LmdldFBhY2thZ2VEZWNsYXJhdGlvbigieC55Iik7Ci0JSUphdmFFbGVtZW50IG9yaWdpbmFsID0gdGhpcy5jb3B5LmdldE9yaWdpbmFsKHBrZyk7Ci0JYXNzZXJ0VHJ1ZSgiRWxlbWVudCBzaG91bGQgZXhpc3QiLCBvcmlnaW5hbC5leGlzdHMoKSk7Ci19Ci0vKioKLSAqIEVuc3VyZXMgdGhhdCB0aGUgb3JpZ2luYWwgdHlwZSBjYW4gYmUgcmV0cmlldmVkLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0R2V0T3JpZ2luYWxUeXBlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSVR5cGUgdHlwZSA9IHRoaXMuY29weS5nZXRUeXBlKCJBIik7Ci0JSUphdmFFbGVtZW50IG9yaWdpbmFsPSBjb3B5LmdldE9yaWdpbmFsKHR5cGUpOwotCWFzc2VydFRydWUoIkVsZW1lbnQgc2hvdWxkIGV4aXN0Iiwgb3JpZ2luYWwuZXhpc3RzKCkpOwotfQotLyoqCi0gKiBFbnN1cmVzIHRoYXQgYSB0eXBlIGNhbiBiZSBtb3ZlZCB0byBhbm90aGVyIHdvcmtpbmcgY29weS4KLSAqIChyZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyA3ODgxIElUeXBlLm1vdmUoKSBjbG9iYmVycyBlZGl0aW5nIGJ1ZmZlciBvZiBkZXN0aW5hdGlvbiBlbGVtZW50KQotICovCi1wdWJsaWMgdm9pZCB0ZXN0TW92ZVR5cGVUb0Fub3RoZXJXb3JraW5nQ29weSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl0aGlzLmNyZWF0ZUZpbGUoCi0JCSJQL3NyYy94L3kvQi5qYXZhIiwKLQkJInBhY2thZ2UgeC55O1xuIiArCi0JCSJwdWJsaWMgY2xhc3MgQiB7XG4iICsKLQkJIn0iKTsKLQlJQ29tcGlsYXRpb25Vbml0IGN1MiA9IHRoaXMuZ2V0Q29tcGlsYXRpb25Vbml0KCJQL3NyYy94L3kvQi5qYXZhIik7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjb3B5MiA9IChJQ29tcGlsYXRpb25Vbml0KWN1Mi5nZXRXb3JraW5nQ29weSgpOwotCXRyeSB7Ci0JCUlUeXBlIGNsYXNzQSA9IHRoaXMuY29weS5nZXRUeXBlKCJBIik7Ci0JCUlUeXBlIGNsYXNzQiA9IGNvcHkyLmdldFR5cGUoIkIiKTsKLQkJY2xhc3NBLm1vdmUoY2xhc3NCLCBudWxsLCBudWxsLCBmYWxzZSwgbnVsbCk7Ci0JCWFzc2VydFRydWUoIkEgc2hvdWxkIG5vdCBleGlzdCIsICFjbGFzc0EuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKCJCLkEgc2hvdWxkIGV4aXN0IiwgY2xhc3NCLmdldFR5cGUoIkEiKS5leGlzdHMoKSk7Ci0JCWFzc2VydFRydWUoIkJ1ZmZlciBmb3IgQSBzaG91bGQgbm90IGJlIG51bGwiLCB0aGlzLmNvcHkuZ2V0QnVmZmVyKCkgIT0gbnVsbCk7Ci0JCWFzc2VydFNvdXJjZUVxdWFscygiSW52YWxpZCBjb250ZW50IGZvciBBIiwgCi0JCQkicGFja2FnZSB4Lnk7XG4iICsKLQkJCSJpbXBvcnQgamF2YS5pby5GaWxlO1xuIiwKLQkJCXRoaXMuY29weS5nZXRCdWZmZXIoKS5nZXRDb250ZW50cygpKTsKLQkJYXNzZXJ0VHJ1ZSgiQnVmZmVyIGZvciBCIHNob3VsZCBub3QgYmUgbnVsbCIsIGNvcHkyLmdldEJ1ZmZlcigpICE9IG51bGwpOwotCQlhc3NlcnRTb3VyY2VFcXVhbHMoIkludmFsaWQgY29udGVudCBmb3IgQiIsIAotCQkJInBhY2thZ2UgeC55O1xuIiArCi0JCQkicHVibGljIGNsYXNzIEIge1xuIiArCi0JCQkicHVibGljIGNsYXNzIEEge1xuIiArCi0JCQkiICBwdWJsaWMgY2xhc3MgSW5uZXIge1xuIiArCi0JCQkiICAgIHB1YmxpYyBjbGFzcyBJbm5lcklubmVyIHtcbiIgKwotCQkJIiAgICB9XG4iICsKLQkJCSIgICAgaW50IGlubmVyRmllbGQ7XG4iICsKLQkJCSIgICAgdm9pZCBpbm5lck1ldGhvZCgpIHtcbiIgKwotCQkJIiAgICB9XG4iICsKLQkJCSIgIH1cbiIgKwotCQkJIiAgc3RhdGljIFN0cmluZyBGSUVMRDtcbiIgKwotCQkJIiAge1xuIiArCi0JCQkiICAgIEZJRUxEID0gRmlsZS5wYXRoU2VwYXJhdG9yO1xuIiArCi0JCQkiICB9XG4iICsKLQkJCSIgIGludCBmaWVsZDE7XG4iICsKLQkJCSIgIGJvb2xlYW4gZmllbGQyO1xuIiArCi0JCQkiICBwdWJsaWMgdm9pZCBmb28oKSB7XG4iICsKLQkJCSIgIH1cbiIgKwotCQkJIn1cbiIgKwotCQkJIn0iLAotCQkJY29weTIuZ2V0QnVmZmVyKCkuZ2V0Q29udGVudHMoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJY29weTIuZGVzdHJveSgpOwotCX0KLX0KLS8qKgotICogVGVzdCBjcmVhdGluZyBhIHNoYXJlZCB3b3JraW5nIGNvcHkuCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RTaGFyZWQxKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUphdmFFbGVtZW50IHNoYXJlZCA9IHRoaXMuY3UuZ2V0U2hhcmVkV29ya2luZ0NvcHkobnVsbCwgbnVsbCwgbnVsbCk7Ci0JdHJ5IHsKLQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIGJlIGFuIElXb3JraW5nQ29weSIsIHNoYXJlZCBpbnN0YW5jZW9mIElXb3JraW5nQ29weSk7Ci0JCWFzc2VydFRydWUoIk9yaWdpbmFsIGVsZW1lbnQgc2hvdWxkIGhhdmUgc2hhcmVkIHdvcmtpbmcgY29weSIsIHRoaXMuY3UuZmluZFNoYXJlZFdvcmtpbmdDb3B5KG51bGwpID09IHNoYXJlZCk7Ci0JfSBmaW5hbGx5IHsKLQkJaWYgKHNoYXJlZCBpbnN0YW5jZW9mIElXb3JraW5nQ29weSkgewotCQkJKChJV29ya2luZ0NvcHkpc2hhcmVkKS5kZXN0cm95KCk7Ci0JCX0KLQl9Ci0JYXNzZXJ0VHJ1ZSgiT3JpZ2luYWwgZWxlbWVudCBzaG91bGQgbm90IGhhdmUgc2hhcmVkIHdvcmtpbmcgY29weSIsIHRoaXMuY3UuZmluZFNoYXJlZFdvcmtpbmdDb3B5KG51bGwpID09IG51bGwpOwotfQotLyoqCi0gKiBUZXN0IHNldmVyYWwgY2FsbCB0byBjcmVhdGluZyBzaGFyZWQgd29ya2luZyBjb3B5LgotICovCi1wdWJsaWMgdm9pZCB0ZXN0U2hhcmVkMigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCUlXb3JraW5nQ29weSBzaGFyZWQgPSAoSVdvcmtpbmdDb3B5KXRoaXMuY3UuZ2V0U2hhcmVkV29ya2luZ0NvcHkobnVsbCwgbnVsbCwgbnVsbCk7Ci0JdHJ5IHsKLQkJSVdvcmtpbmdDb3B5IHNoYXJlZDIgPSAoSVdvcmtpbmdDb3B5KXRoaXMuY3UuZ2V0U2hhcmVkV29ya2luZ0NvcHkobnVsbCwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydFRydWUoIlNlY29uZCB3b3JraW5nIGNvcHkgc2hvdWxkIGJlIGlkZW50aWNhbCB0byBmaXJzdCBvbmUiLCBzaGFyZWQyID09IHNoYXJlZCk7Ci0JfSBmaW5hbGx5IHsKLQkJc2hhcmVkLmRlc3Ryb3koKTsKLQkJdHJ5IHsKLQkJCWFzc2VydFRydWUoIk9yaWdpbmFsIGVsZW1lbnQgc2hvdWxkIHN0aWxsIGhhdmUgc2hhcmVkIHdvcmtpbmcgY29weSIsIHRoaXMuY3UuZmluZFNoYXJlZFdvcmtpbmdDb3B5KG51bGwpID09IHNoYXJlZCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzaGFyZWQuZGVzdHJveSgpOwotCQl9Ci0JfQotCWFzc2VydFRydWUoIk9yaWdpbmFsIGVsZW1lbnQgc2hvdWxkIG5vdCBoYXZlIHNoYXJlZCB3b3JraW5nIGNvcHkiLCB0aGlzLmN1LmZpbmRTaGFyZWRXb3JraW5nQ29weShudWxsKSA9PSBudWxsKTsKLX0KLS8qKgotICogVGVzdHMgdGhhdCBtdWx0aXBsZSBjb21taXRzIGFyZSBwb3NzaWJsZSB3aXRoIHRoZSBzYW1lIHdvcmtpbmcgY29weS4KLSAqLwotcHVibGljIHZvaWQgdGVzdE11bHRpcGxlQ29tbWl0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCi0JLy8gQWRkIGEgbWV0aG9kIHRvIHRoZSB3b3JraW5nIGNvcHkKLQlJVHlwZSBncCA9IHRoaXMuY29weS5nZXRUeXBlKCJBIik7Ci0JdHJ5IHsKLQkJZ3AuY3JlYXRlTWV0aG9kKCJwdWJsaWMgdm9pZCBhbm90aGVyTWV0aG9kKCkge31cbiIsbnVsbCwgZmFsc2UsIG51bGwpOwotCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJYXNzZXJ0VHJ1ZSgiY3JlYXRpb24gZmFpbGVkIiwgZmFsc2UpOwotCX0KLQkKLQkvLyBjb21taXQgdGhlIGNoYW5nZXMgZnJvbSB0aGUgY29weS4KLQl0cnkgewotCQl0aGlzLmNvcHkuY29tbWl0KGZhbHNlLCBudWxsKTsKLQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gdCkgewotCQlhc3NlcnRUcnVlKCJjb21taXQgZmFpbGVkIiwgZmFsc2UpOwotCX0KLQkKLQkvLyBuZXcgbWV0aG9kIGFkZGVkCi0JYXNzZXJ0VHJ1ZSgibWV0aG9kIHNob3VsZCBleGlzdCBhZnRlciBjb21taXQiLCAKLQkJdGhpcy5jdS5nZXRUeXBlKCJBIikuZ2V0TWV0aG9kKCJhbm90aGVyTWV0aG9kIiwgbmV3IFN0cmluZ1tde30pLmV4aXN0cygpKTsKLQotCS8vYWRkIGFub3RoZXIgbWV0aG9kCi0JdHJ5IHsKLQkJZ3AuY3JlYXRlTWV0aG9kKCJwdWJsaWMgdm9pZCBhbm90aGVyQW5vdGhlck1ldGhvZCgpIHt9XG4iLCBudWxsLCBmYWxzZSwgbnVsbCk7Ci0JfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIHgpIHsKLQkJYXNzZXJ0VHJ1ZSgiQ3JlYXRpb24gZmFpbGVkIDIiLCBmYWxzZSk7Ci0JfQotCi0JLy9jb21taXQgdGhlIG5ldyBtZXRob2QKLQl0cnkgewotCQl0aGlzLmNvcHkuY29tbWl0KGZhbHNlLCBudWxsKTsKLQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gdCkgewotCQlhc3NlcnRUcnVlKCJjb21taXQyIGZhaWxlZCIsIGZhbHNlKTsKLQl9Ci0KLQkvLyBuZXcgbWV0aG9kIGFkZGVkCi0JYXNzZXJ0VHJ1ZSgic2Vjb25kIG1ldGhvZCBhZGRlZCBzaG91bGQgZXhpc3QgYWZ0ZXIgY29tbWl0IiwgCi0JCXRoaXMuY3UuZ2V0VHlwZSgiQSIpLmdldE1ldGhvZCgiYW5vdGhlckFub3RoZXJNZXRob2QiLCBuZXcgU3RyaW5nW117fSkuZXhpc3RzKCkpOwotfQotLyoqCi0gKiBDcmVhdGVzIGEgd29ya2luZyBjb3B5IG9uIGEgbm9uLWV4aXN0aW5nIGNvbXBpbGF0aW9uIHVuaXQuCi0gKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgODkyMSAgRENSIC0gTmVlZCBhIHdheSB0byBjcmVhdGUgYSB3b3JraW5nIGNvcHkgaWdub3JpbmcgZXhpc3RpbmcgZmlsZXMpCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3ROb25FeGlzdGluZ0NVKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JSUNvbXBpbGF0aW9uVW5pdCBub25FeGlzdGluZ0NVID0gdGhpcy5nZXRDb21waWxhdGlvblVuaXQoIlAvc3JjL3gveS9Ob25FeGlzdGluZy5qYXZhIik7Ci0JSVdvcmtpbmdDb3B5IHdvcmtpbmdDb3B5ID0gbnVsbDsKLQl0cnkgewotCQkvLyBnZXRCdWZmZXIoKQotCQl3b3JraW5nQ29weSA9IChJV29ya2luZ0NvcHkpbm9uRXhpc3RpbmdDVS5nZXRXb3JraW5nQ29weSgpOwotCQlhc3NlcnRTb3VyY2VFcXVhbHMoIkJ1ZmZlciBzaG91bGQgYmUgZW1wdHkiLCAiIiwgKChJT3BlbmFibGUpd29ya2luZ0NvcHkpLmdldEJ1ZmZlcigpLmdldENvbnRlbnRzKCkpOwotCQkKLQkJLy8gZXhpc3RzKCkKLQkJYXNzZXJ0VHJ1ZSgiV29ya2luZyBjb3B5IHNob3VsZCBleGlzdHMiLCAoKElKYXZhRWxlbWVudCl3b3JraW5nQ29weSkuZXhpc3RzKCkpOwotCQkKLQkJLy8gZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCkKLQkJYXNzZXJ0RXF1YWxzKCJDb3JyZXNwb25kaW5nIHJlc291cmNlIHNob3VsZCBiZSBudWxsIiwgbnVsbCwgKChJSmF2YUVsZW1lbnQpd29ya2luZ0NvcHkpLmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpKTsKLQkJCi0JCS8vIGdldE9yaWdpbmFsRWxlbWVudCgpCi0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBvcmdpbmFsIGVsZW1lbnQiLCBub25FeGlzdGluZ0NVLCB3b3JraW5nQ29weS5nZXRPcmlnaW5hbEVsZW1lbnQoKSk7Ci0JCQotCQkvLyBnZXRQYXRoKCkKLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHBhdGgiLCBuZXcgUGF0aCgiL1Avc3JjL3gveS9Ob25FeGlzdGluZy5qYXZhIiksICgoSUphdmFFbGVtZW50KXdvcmtpbmdDb3B5KS5nZXRQYXRoKCkpOwotCQkKLQkJLy8gZ2V0UmVzb3VyY2UoKQotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgcmVzb3VyY2UiLCBudWxsLCAoKElKYXZhRWxlbWVudCl3b3JraW5nQ29weSkuZ2V0UmVzb3VyY2UoKSk7Ci0JCQotCQkvLyBpc0NvbnNpc3RlbnQoKQotCQlhc3NlcnRUcnVlKCJXb3JraW5nIGNvcHkgc2hvdWxkIGJlIGNvbnNpc3RlbnQiLCAoKElPcGVuYWJsZSl3b3JraW5nQ29weSkuaXNDb25zaXN0ZW50KCkpOwotCQkKLQkJLy8gcmVzdG9yZSgpCi0JCWJvb2xlYW4gZXhjZXB0aW9uID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl3b3JraW5nQ29weS5yZXN0b3JlKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlleGNlcHRpb24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIlNob3VsZCBub3QgYmUgYWJsZSB0byByZXN0b3JlIGZyb20gb3JpZ2luYWwgZWxlbWVudCIsIGV4Y2VwdGlvbik7Ci0JCQotCQkvLyBtYWtlQ29uc2lzdGVudCgpCi0JCSgoSU9wZW5hYmxlKXdvcmtpbmdDb3B5KS5nZXRCdWZmZXIoKS5zZXRDb250ZW50cygKLQkJCSJwdWJsaWMgY2xhc3MgWCB7XG4iICsKLQkJCSJ9Iik7Ci0JCWFzc2VydFRydWUoIldvcmtpbmcgY29weSBzaG91bGQgbm90IGJlIGNvbnNpc3RlbnQiLCAhKChJT3BlbmFibGUpd29ya2luZ0NvcHkpLmlzQ29uc2lzdGVudCgpKTsKLQkJKChJT3BlbmFibGUpd29ya2luZ0NvcHkpLm1ha2VDb25zaXN0ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKCJXb3JraW5nIGNvcHkgc2hvdWxkIGJlIGNvbnNpc3RlbnQiLCAoKElPcGVuYWJsZSl3b3JraW5nQ29weSkuaXNDb25zaXN0ZW50KCkpOwotCQkKLQkJLy8gc2F2ZSgpCi0JCSgoSU9wZW5hYmxlKXdvcmtpbmdDb3B5KS5nZXRCdWZmZXIoKS5zZXRDb250ZW50cygKLQkJCSJwdWJsaWMgY2xhc3MgWSB7XG4iICsKLQkJCSJ9Iik7Ci0JCSgoSU9wZW5hYmxlKXdvcmtpbmdDb3B5KS5zYXZlKG51bGwsIGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZSgiV29ya2luZyBjb3B5IHNob3VsZCBiZSBjb25zaXN0ZW50IGFmdGVyIHNhdmUiLCAoKElPcGVuYWJsZSl3b3JraW5nQ29weSkuaXNDb25zaXN0ZW50KCkpOwotCQlhc3NlcnRUcnVlKCJPcmlnaW5hbCBjdSBzaG91bGQgbm90IGV4aXN0IiwgIW5vbkV4aXN0aW5nQ1UuZXhpc3RzKCkpOwotCQkKLQkJLy8gY29tbWl0KCkKLQkJd29ya2luZ0NvcHkuY29tbWl0KGZhbHNlLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSgiT3JpZ2luYWwgY3Ugc2hvdWxkIGV4aXN0Iiwgbm9uRXhpc3RpbmdDVS5leGlzdHMoKSk7Ci0KLQkJLy8gaXNCYXNlZE9uKCkKLQkJYXNzZXJ0VHJ1ZSgiV29ya2luZyBjb3B5IHNob3VsZCBub3QgYmUgYmFzZWQgb24gb3JpZ2luYWwgcmVzb3VyY2UiLCAhd29ya2luZ0NvcHkuaXNCYXNlZE9uKG5vbkV4aXN0aW5nQ1UuZ2V0UmVzb3VyY2UoKSkpOwotCQkKLQl9IGZpbmFsbHkgewotCQlpZiAod29ya2luZ0NvcHkgIT0gbnVsbCkgewotCQkJd29ya2luZ0NvcHkuZGVzdHJveSgpOwotCQl9Ci0JCWlmIChub25FeGlzdGluZ0NVLmV4aXN0cygpKSB7Ci0JCQlub25FeGlzdGluZ0NVLmRlbGV0ZSh0cnVlLCBudWxsKTsKLQkJfQotCX0KLX0KLS8qKgotICogVGVzdHMgdGhlIGdlbmVyYWwgZnVuY3Rpb25hbGl0eSBvZiBhIG9wZXJhdGlvbnMgd29ya2luZyB3aXRoIHdvcmtpbmcgY29waWVzOjx1bD4KLSAqIDxsaT5lbnN1cmVzIHRoYXQgdGhlIGNvcHkgY2Fubm90IGJlIHJlbmFtZWQ8L2xpPgotICogPGxpPmVuc3VyZXMgdGhhdCB0aGUgY29weSBjYW5ub3QgYmUgbW92ZWQgdG8gdGhlIHNhbWUgbG9jYXRpb24gYXMgdGhlIG9yaWdpbmFsIGN1PC9saT4KLSAqIDxsaT5lbnN1cmVzIHRoYXQgdGhlIGNvcHkgY2FuIGJlIGNvcGllZCB0byBhIGRpZmZlcmVudCBsb2NhdGlvbiBhcyB0aGUgb3JpZ2luYWwgY3U8L2xpPgotICovCi1wdWJsaWMgdm9pZCB0ZXN0T3BlcmF0aW9ucygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCS8vIHJlbmFtZSB3b3JraW5nIGNvcHkKLQlib29sZWFuIGV4PSBmYWxzZTsKLQl0cnkgewotCQl0aGlzLmNvcHkucmVuYW1lKCJzb21lTmFtZS5qYXZhIiwgZmFsc2UsIG51bGwpOwotCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IHN0YXR1cyBjb2RlIGZvciBhdHRlbXB0aW5nIHRvIHJlbmFtZSB3b3JraW5nIGNvcHkiLCBqbWUuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpID09IElKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuSU5WQUxJRF9FTEVNRU5UX1RZUEVTKTsKLQkJZXg9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoInJlbmFtaW5nIGEgd29ya2luZyBjb3B5IHNob3VsZCBmYWlsIiwgZXgpOwotCQotCS8vIG1vdmUgdG8gc2FtZSBsb2NhdGlvbiBhcyBvcmlnaW5hbCBjdQotCWV4PSBmYWxzZTsKLQl0cnkgewotCQl0aGlzLmNvcHkubW92ZSgoSVBhY2thZ2VGcmFnbWVudCl0aGlzLmN1LmdldFBhcmVudCgpLCBudWxsLCAic29tZU5hbWUuamF2YSIsIGZhbHNlLCBudWxsKTsKLQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCWFzc2VydFRydWUoIkluY29ycmVjdCBzdGF0dXMgY29kZSBmb3IgYXR0ZW1wdGluZyB0byBtb3ZlIHdvcmtpbmcgY29weSIsIGptZS5nZXRTdGF0dXMoKS5nZXRDb2RlKCkgPT0gSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5JTlZBTElEX0VMRU1FTlRfVFlQRVMpOwotCQlleD0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgibW92aW5nIGEgd29ya2luZyBjb3B5IHNob3VsZCBmYWlsIiwgZXgpOwotCi0JLy8gY29weSB3b3JraW5nIGNvcHkgdG8gZGVmYXVsdCBwYWNrYWdlCi0JSVBhY2thZ2VGcmFnbWVudCBwa2c9IGdldFBhY2thZ2VGcmFnbWVudCgiUCIsICJzcmMiLCAiIik7Ci0JdGhpcy5jb3B5LmNvcHkocGtnLCBudWxsLCAic29tZU5hbWUuamF2YSIsIGZhbHNlLCBudWxsKTsKLQlhc3NlcnRDcmVhdGlvbih0aGlzLmNvcHkpOwkKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3Rlc3QueG1sIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NTg5NDQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPgotICA8IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgotICA8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotICA8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfVwuLlwuLiIvPgotCi0gIDwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBlY2xpcHNlLWhvbWUsIGFuZCBsaWJyYXJ5LWZpbGUgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LWZpbGUiCi0gICAgICAgICAgICB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvb3JnLmVjbGlwc2UudGVzdC9saWJyYXJ5LnhtbCIvPgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLSAgPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KLSAgPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgPHRzdGFtcC8+Ci0gICAgPGRlbGV0ZT4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtlY2xpcHNlLWhvbWV9IiBpbmNsdWRlcz0ib3JnKi54bWwiLz4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJzdWl0ZSI+Ci0gICAgPCEtLSBKYXZhIE1vZGVsIHRlc3RzIC0tPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJqZHQtbW9kZWwtZm9sZGVyIiAKLSAgICAgICAgICAgICAgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9qZHRfbW9kZWxfZm9sZGVyIi8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7amR0LW1vZGVsLWZvbGRlcn0iIHF1aWV0PSJ0cnVlIi8+Ci0gICAgPGFudCB0YXJnZXQ9ImNvcmUtdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke2pkdC1tb2RlbC1mb2xkZXJ9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgCi0gICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsLkFsbEphdmFNb2RlbFRlc3RzIi8+Ci0gICAgPC9hbnQ+Ci0KLSAgICA8IS0tIERPTSB0ZXN0cyAtLT4KLSAgICA8cHJvcGVydHkgbmFtZT0iamR0LWRvbS1mb2xkZXIiIAotICAgICAgICAgICAgICB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L2pkdF9kb21fZm9sZGVyIi8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7amR0LWRvbS1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIvPgotICAgIDxhbnQgdGFyZ2V0PSJjb3JlLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHtqZHQtZG9tLWZvbGRlcn0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiAKLSAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMuZG9tLlJ1bkFsbFRlc3RzIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotICA8IS0tIGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8gLS0+Ci0gIDwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIC0tPgotICA8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJpbml0LHN1aXRlLGNsZWFudXAiPgotICAgIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZyoueG1sIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9BdHRhY2hTb3VyY2VUZXN0cy8uY2xhc3NwYXRoIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0F0dGFjaFNvdXJjZVRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MzBiYjUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0F0dGFjaFNvdXJjZVRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJhdHRhY2guamFyIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0iYXR0YWNoMi5qYXIiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJ0ZXN0LmphciIvPiAgICAKLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJ1cGRhdGUuamFyIi8+ICAgIAotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9ImZ1bGwuamFyIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0idGVzdDIuamFyIi8+ICAgIAotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9InRlc3Q0LmphciIvPiAgICAKLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJsaWIiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJKQ0xfTElCIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9BdHRhY2hTb3VyY2VUZXN0cy8ucHJvamVjdCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9BdHRhY2hTb3VyY2VUZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA1Y2U3My4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQXR0YWNoU291cmNlVGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQXR0YWNoU291cmNlVGVzdHMvYXR0YWNoLmphciBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9BdHRhY2hTb3VyY2VUZXN0cy9hdHRhY2guamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTM0MTQ3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9BdHRhY2hTb3VyY2VUZXN0cy9hdHRhY2guamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0F0dGFjaFNvdXJjZVRlc3RzL2F0dGFjaDIuamFyIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0F0dGFjaFNvdXJjZVRlc3RzL2F0dGFjaDIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTRiOTg5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9BdHRhY2hTb3VyY2VUZXN0cy9hdHRhY2gyLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9BdHRhY2hTb3VyY2VUZXN0cy9hdHRhY2gyc3JjLnppcCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9BdHRhY2hTb3VyY2VUZXN0cy9hdHRhY2gyc3JjLnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZjYzczYy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQXR0YWNoU291cmNlVGVzdHMvYXR0YWNoMnNyYy56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQXR0YWNoU291cmNlVGVzdHMvYXR0YWNoc3JjLm5ldy56aXAgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQXR0YWNoU291cmNlVGVzdHMvYXR0YWNoc3JjLm5ldy56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMTdmNWEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0F0dGFjaFNvdXJjZVRlc3RzL2F0dGFjaHNyYy5uZXcuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0F0dGFjaFNvdXJjZVRlc3RzL2F0dGFjaHNyYy56aXAgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQXR0YWNoU291cmNlVGVzdHMvYXR0YWNoc3JjLnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJmMGQ1OC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQXR0YWNoU291cmNlVGVzdHMvYXR0YWNoc3JjLnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9BdHRhY2hTb3VyY2VUZXN0cy9mdWxsLmphciBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9BdHRhY2hTb3VyY2VUZXN0cy9mdWxsLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YzYmViYS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQXR0YWNoU291cmNlVGVzdHMvZnVsbC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQXR0YWNoU291cmNlVGVzdHMvZnVsbHNyYy56aXAgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQXR0YWNoU291cmNlVGVzdHMvZnVsbHNyYy56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMDM3MTUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0F0dGFjaFNvdXJjZVRlc3RzL2Z1bGxzcmMuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0F0dGFjaFNvdXJjZVRlc3RzL2xpYi9wL1guY2xhc3MgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQXR0YWNoU291cmNlVGVzdHMvbGliL3AvWC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1YTg4Ny4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQXR0YWNoU291cmNlVGVzdHMvbGliL3AvWC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9BdHRhY2hTb3VyY2VUZXN0cy9zcmMuemlwIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0F0dGFjaFNvdXJjZVRlc3RzL3NyYy56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxODQ0NDMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0F0dGFjaFNvdXJjZVRlc3RzL3NyYy56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQXR0YWNoU291cmNlVGVzdHMvc3JjTGliL3AvWC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0F0dGFjaFNvdXJjZVRlc3RzL3NyY0xpYi9wL1guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZmM2IyMy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQXR0YWNoU291cmNlVGVzdHMvc3JjTGliL3AvWC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIHA7Ci1wdWJsaWMgY2xhc3MgWCB7Ci0JcHVibGljIHZvaWQgZm9vKCkgewotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQXR0YWNoU291cmNlVGVzdHMvdGVzdC5qYXIgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQXR0YWNoU291cmNlVGVzdHMvdGVzdC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NTc1YzguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0F0dGFjaFNvdXJjZVRlc3RzL3Rlc3QuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0F0dGFjaFNvdXJjZVRlc3RzL3Rlc3QyLmphciBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9BdHRhY2hTb3VyY2VUZXN0cy90ZXN0Mi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZDRiMDAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0F0dGFjaFNvdXJjZVRlc3RzL3Rlc3QyLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9BdHRhY2hTb3VyY2VUZXN0cy90ZXN0NC5qYXIgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQXR0YWNoU291cmNlVGVzdHMvdGVzdDQuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGM4NDViLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9BdHRhY2hTb3VyY2VUZXN0cy90ZXN0NC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQXR0YWNoU291cmNlVGVzdHMvdGVzdDRfc3JjLnppcCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9BdHRhY2hTb3VyY2VUZXN0cy90ZXN0NF9zcmMuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU3MjUwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9BdHRhY2hTb3VyY2VUZXN0cy90ZXN0NF9zcmMuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0F0dGFjaFNvdXJjZVRlc3RzL3VwZGF0ZS5qYXIgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQXR0YWNoU291cmNlVGVzdHMvdXBkYXRlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUwZmVjMy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQXR0YWNoU291cmNlVGVzdHMvdXBkYXRlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db2RlQ29ycmVjdGlvbi8uY2xhc3NwYXRoIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvZGVDb3JyZWN0aW9uLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZTNhYTcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvZGVDb3JyZWN0aW9uLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IkpDTF9MSUIiIHNvdXJjZXBhdGg9IkpDTF9TUkMiIHJvb3RwYXRoPSJKQ0xfU1JDUk9PVCIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9ImxpYi5qYXIiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvZGVDb3JyZWN0aW9uLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvZGVDb3JyZWN0aW9uLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDVjZTczLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db2RlQ29ycmVjdGlvbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db2RlQ29ycmVjdGlvbi9saWIuamFyIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvZGVDb3JyZWN0aW9uL2xpYi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5OTgyNmIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvZGVDb3JyZWN0aW9uL2xpYi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29kZUNvcnJlY3Rpb24vbGliU3JjLnppcCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db2RlQ29ycmVjdGlvbi9saWJTcmMuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTMzNDM3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db2RlQ29ycmVjdGlvbi9saWJTcmMuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvZGVDb3JyZWN0aW9uL3NyYy9Db3JyZWN0QXJndW1lbnQxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29kZUNvcnJlY3Rpb24vc3JjL0NvcnJlY3RBcmd1bWVudDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZlMDQ3My4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29kZUNvcnJlY3Rpb24vc3JjL0NvcnJlY3RBcmd1bWVudDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIENvcnJlY3RBcmd1bWVudDEgewotCXZvaWQgZm9vKGludCBiYXIwKXsKLQkJYmFyID0gNTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvZGVDb3JyZWN0aW9uL3NyYy9Db3JyZWN0RXhjZXB0aW9uMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvZGVDb3JyZWN0aW9uL3NyYy9Db3JyZWN0RXhjZXB0aW9uMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmQ3NjhlLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db2RlQ29ycmVjdGlvbi9zcmMvQ29ycmVjdEV4Y2VwdGlvbjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIENvcnJlY3RFeGNlcHRpb24xICB7Ci0Jdm9pZCBmb28oKSB0aHJvd3MgYWFhLmJiYnouQW5FeGNlcHRpb24gewotCQkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvZGVDb3JyZWN0aW9uL3NyYy9Db3JyZWN0RXhjZXB0aW9uMi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvZGVDb3JyZWN0aW9uL3NyYy9Db3JyZWN0RXhjZXB0aW9uMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODVhODQ0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db2RlQ29ycmVjdGlvbi9zcmMvQ29ycmVjdEV4Y2VwdGlvbjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIENvcnJlY3RFeGNlcHRpb24yICB7Ci0Jdm9pZCBmb28oKSB0aHJvd3MgYWFhLmJiYi5BbkV4Y2VwdGlvbnogewotCQkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvZGVDb3JyZWN0aW9uL3NyYy9Db3JyZWN0RmllbGQxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29kZUNvcnJlY3Rpb24vc3JjL0NvcnJlY3RGaWVsZDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg3N2ZiOC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29kZUNvcnJlY3Rpb24vc3JjL0NvcnJlY3RGaWVsZDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcHVibGljIGNsYXNzIENvcnJlY3RGaWVsZDEgewotCXB1YmxpYyBpbnQgYmFyMDsKLQl2b2lkIGZvbygpewotCQliYXIgPSA1OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29kZUNvcnJlY3Rpb24vc3JjL0NvcnJlY3RGaWVsZDIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db2RlQ29ycmVjdGlvbi9zcmMvQ29ycmVjdEZpZWxkMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjVhYWEyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db2RlQ29ycmVjdGlvbi9zcmMvQ29ycmVjdEZpZWxkMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29ycmVjdEZpZWxkMiB7Ci0JcHVibGljIGludCBiYXIwOwotCXZvaWQgZm9vKCl7Ci0JCUNvcnJlY3RGaWVsZDIgY2YgPSBuZXcgQ29ycmVjdEZpZWxkMigpOwotCQljZi5iYXIgPSA1OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29kZUNvcnJlY3Rpb24vc3JjL0NvcnJlY3RGaWVsZFR5cGUxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29kZUNvcnJlY3Rpb24vc3JjL0NvcnJlY3RGaWVsZFR5cGUxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwODRmNjQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvZGVDb3JyZWN0aW9uL3NyYy9Db3JyZWN0RmllbGRUeXBlMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29ycmVjdEZpZWxkVHlwZTEgewotCWFhYS5kZGR6LkFDbGFzcyBmaWVsZDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29kZUNvcnJlY3Rpb24vc3JjL0NvcnJlY3RGaWVsZFR5cGUyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29kZUNvcnJlY3Rpb24vc3JjL0NvcnJlY3RGaWVsZFR5cGUyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxODExYWMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvZGVDb3JyZWN0aW9uL3NyYy9Db3JyZWN0RmllbGRUeXBlMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29ycmVjdEZpZWxkVHlwZTIgewotCWFhYS5kZGQuQUNsYXNzeiBmaWVsZDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29kZUNvcnJlY3Rpb24vc3JjL0NvcnJlY3RGaWVsZFR5cGUzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29kZUNvcnJlY3Rpb24vc3JjL0NvcnJlY3RGaWVsZFR5cGUzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYTBlYTEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvZGVDb3JyZWN0aW9uL3NyYy9Db3JyZWN0RmllbGRUeXBlMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1pbXBvcnQgYWFhLmRkZC4qOwotCi1wdWJsaWMgY2xhc3MgQ29ycmVjdEZpZWxkVHlwZTMgewotCUFDbGFzc3ogZmllbGQ7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvZGVDb3JyZWN0aW9uL3NyYy9Db3JyZWN0SW1wb3J0MS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvZGVDb3JyZWN0aW9uL3NyYy9Db3JyZWN0SW1wb3J0MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWU4ZDY3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db2RlQ29ycmVjdGlvbi9zcmMvQ29ycmVjdEltcG9ydDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotaW1wb3J0IGFhYS5kZGR6LkFDbGFzczsKLQotcHVibGljIGNsYXNzIENvcnJlY3RJbXBvcnQxIHsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db2RlQ29ycmVjdGlvbi9zcmMvQ29ycmVjdEltcG9ydDIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db2RlQ29ycmVjdGlvbi9zcmMvQ29ycmVjdEltcG9ydDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc1ZjY4Ni4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29kZUNvcnJlY3Rpb24vc3JjL0NvcnJlY3RJbXBvcnQyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWltcG9ydCBhYWEuZGRkei4qOwotCi1wdWJsaWMgY2xhc3MgQ29ycmVjdEltcG9ydDIgewotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvZGVDb3JyZWN0aW9uL3NyYy9Db3JyZWN0SW1wb3J0My5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvZGVDb3JyZWN0aW9uL3NyYy9Db3JyZWN0SW1wb3J0My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTE3YWYzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db2RlQ29ycmVjdGlvbi9zcmMvQ29ycmVjdEltcG9ydDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotaW1wb3J0IGFhYS5kZGQuQUNsYXNzejsKLQotcHVibGljIGNsYXNzIENvcnJlY3RJbXBvcnQzIHsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db2RlQ29ycmVjdGlvbi9zcmMvQ29ycmVjdExvY2FsVmFyaWFibGUxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29kZUNvcnJlY3Rpb24vc3JjL0NvcnJlY3RMb2NhbFZhcmlhYmxlMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDg3YmQ5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db2RlQ29ycmVjdGlvbi9zcmMvQ29ycmVjdExvY2FsVmFyaWFibGUxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb3JyZWN0TG9jYWxWYXJpYWJsZTEgewotCXZvaWQgZm9vKCl7Ci0JCWludCBiYXIwOwotCQliYXIgPSA1OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29kZUNvcnJlY3Rpb24vc3JjL0NvcnJlY3RMb2NhbFZhcmlhYmxlVHlwZTEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db2RlQ29ycmVjdGlvbi9zcmMvQ29ycmVjdExvY2FsVmFyaWFibGVUeXBlMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjY1NWM1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db2RlQ29ycmVjdGlvbi9zcmMvQ29ycmVjdExvY2FsVmFyaWFibGVUeXBlMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29ycmVjdExvY2FsVmFyaWFibGVUeXBlMSB7Ci0Jdm9pZCBmb28oKXsKLQkJYWFhLmRkZHouQUNsYXNzIGxvY2FsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29kZUNvcnJlY3Rpb24vc3JjL0NvcnJlY3RMb2NhbFZhcmlhYmxlVHlwZTIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db2RlQ29ycmVjdGlvbi9zcmMvQ29ycmVjdExvY2FsVmFyaWFibGVUeXBlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTMzZjBiLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db2RlQ29ycmVjdGlvbi9zcmMvQ29ycmVjdExvY2FsVmFyaWFibGVUeXBlMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29ycmVjdExvY2FsVmFyaWFibGVUeXBlMiB7Ci0Jdm9pZCBmb28oKXsKLQkJYWFhLmRkZC5BQ2xhc3N6IGxvY2FsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29kZUNvcnJlY3Rpb24vc3JjL0NvcnJlY3RNZXRob2QxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29kZUNvcnJlY3Rpb24vc3JjL0NvcnJlY3RNZXRob2QxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxN2ZjOGEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvZGVDb3JyZWN0aW9uL3NyYy9Db3JyZWN0TWV0aG9kMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29ycmVjdE1ldGhvZDEgewotCXB1YmxpYyB2b2lkIGJhcjAoKXsKLQkKLQl9Ci0JCi0Jdm9pZCBmb28oKXsKLQkJYmFyKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db2RlQ29ycmVjdGlvbi9zcmMvQ29ycmVjdE1ldGhvZDIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db2RlQ29ycmVjdGlvbi9zcmMvQ29ycmVjdE1ldGhvZDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFjMGM0Ni4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29kZUNvcnJlY3Rpb24vc3JjL0NvcnJlY3RNZXRob2QyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29ycmVjdE1ldGhvZDIgewotCXB1YmxpYyB2b2lkIGJhcjAoKXsKLQkKLQl9Ci0JCi0Jdm9pZCBmb28oKXsKLQkJQ29ycmVjdE1ldGhvZDIgY20gPSBuZXcgQ29ycmVjdE1ldGhvZDIoKTsKLQkJY20uYmFyKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db2RlQ29ycmVjdGlvbi9zcmMvQ29ycmVjdFJldHVyblR5cGUxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29kZUNvcnJlY3Rpb24vc3JjL0NvcnJlY3RSZXR1cm5UeXBlMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjQ5NWFjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db2RlQ29ycmVjdGlvbi9zcmMvQ29ycmVjdFJldHVyblR5cGUxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb3JyZWN0UmV0dXJuVHlwZTEgewotCXB1YmxpYyBhYWEuZGRkei5BQ2xhc3MgZm9vKCl7Ci0JCXJldHVybiBuZXcgYWFhLmRkZC5BQ2xhc3MoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvZGVDb3JyZWN0aW9uL3NyYy9Db3JyZWN0UmV0dXJuVHlwZTIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db2RlQ29ycmVjdGlvbi9zcmMvQ29ycmVjdFJldHVyblR5cGUyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MjNmMTIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvZGVDb3JyZWN0aW9uL3NyYy9Db3JyZWN0UmV0dXJuVHlwZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIENvcnJlY3RSZXR1cm5UeXBlMiB7Ci0JcHVibGljIGFhYS5kZGQuQUNsYXNzeiBmb28oKXsKLQkJcmV0dXJuIG5ldyBhYWEuZGRkLkFDbGFzcygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29kZUNvcnJlY3Rpb24vc3JjL0NvcnJlY3RTdXBlckNsYXNzMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvZGVDb3JyZWN0aW9uL3NyYy9Db3JyZWN0U3VwZXJDbGFzczEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNiNzk3Mi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29kZUNvcnJlY3Rpb24vc3JjL0NvcnJlY3RTdXBlckNsYXNzMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29ycmVjdFN1cGVyQ2xhc3MxIGV4dGVuZHMgYWFhLmRkZHouQUNsYXNzIHsKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29kZUNvcnJlY3Rpb24vc3JjL0NvcnJlY3RTdXBlckNsYXNzMi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvZGVDb3JyZWN0aW9uL3NyYy9Db3JyZWN0U3VwZXJDbGFzczIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg4OTliMi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29kZUNvcnJlY3Rpb24vc3JjL0NvcnJlY3RTdXBlckNsYXNzMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29ycmVjdFN1cGVyQ2xhc3MyIGV4dGVuZHMgYWFhLmRkZC5BQ2xhc3N6IHsKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29kZUNvcnJlY3Rpb24vc3JjL0NvcnJlY3RTdXBlckludGVyZmFjZTEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db2RlQ29ycmVjdGlvbi9zcmMvQ29ycmVjdFN1cGVySW50ZXJmYWNlMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDc2Mzc1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db2RlQ29ycmVjdGlvbi9zcmMvQ29ycmVjdFN1cGVySW50ZXJmYWNlMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29ycmVjdFN1cGVySW50ZXJmYWNlMSBpbXBsZW1lbnRzIGFhYS5iYmIuY2Njei5BTGlzdGVuZXIgewotCXB1YmxpYyB2b2lkIGZvbygpe30KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29kZUNvcnJlY3Rpb24vc3JjL0NvcnJlY3RTdXBlckludGVyZmFjZTIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db2RlQ29ycmVjdGlvbi9zcmMvQ29ycmVjdFN1cGVySW50ZXJmYWNlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzQ2NWFiLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db2RlQ29ycmVjdGlvbi9zcmMvQ29ycmVjdFN1cGVySW50ZXJmYWNlMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29ycmVjdFN1cGVySW50ZXJmYWNlMiBpbXBsZW1lbnRzIGFhYS5iYmIuY2NjLkFMaXN0ZW5lcnogewotCXB1YmxpYyB2b2lkIGZvbygpe30KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi8uY2xhc3NwYXRoIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNkMTA1ZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjMiIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IkpDTF9MSUIiIHNvdXJjZXBhdGg9IkpDTF9TUkMiIHJvb3RwYXRoPSJKQ0xfU1JDUk9PVCIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Inp6ei5qYXIiIHNvdXJjZXBhdGg9Ii9Db21wbGV0aW9uL3p6enNyYy56aXAiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJwYWNrLmphciIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9ImNsYXNzLWZvbGRlciIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi8ucHJvamVjdCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDVjZTczLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vY2xhc3MtZm9sZGVyL215cGFja2FnZS9NeUNsYXNzLmNsYXNzIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vY2xhc3MtZm9sZGVyL215cGFja2FnZS9NeUNsYXNzLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzQ1NzM1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL2NsYXNzLWZvbGRlci9teXBhY2thZ2UvTXlDbGFzcy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL2NsYXNzLWZvbGRlci9wYWNrMS9QWC5jbGFzcyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL2NsYXNzLWZvbGRlci9wYWNrMS9QWC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNiYzk2MC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9jbGFzcy1mb2xkZXIvcGFjazEvUFguY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9saWIuamFyIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vbGliLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBhYTNkNi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9saWIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vcGFjay5qYXIgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9wYWNrLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhjYmEzYi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9wYWNrLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmQzNTBmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBBIHsKLQlwdWJsaWMgaW50IGJhcjsKLQlwdWJsaWMgdm9pZCBiYXIoKXt9Ci0JcHVibGljIHZvaWQgZm9vYmFyKCl7fQotCXB1YmxpYyB2b2lkIGZvb2JhcihpbnQgaSl7fQotCXB1YmxpYyBzdGF0aWMgdm9pZCBmb28oKXt9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9CLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjM2NmYjcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcHVibGljIGludGVyZmFjZSBCIHsKLQlwdWJsaWMgdm9pZCBmb29iYXIoKTsKLQlwdWJsaWMgdm9pZCBmb29iYXIoaW50IGkpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9DVVdpdGhTZWNvbmRhcnlUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ1VXaXRoU2Vjb25kYXJ5VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWU3MjUxLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9DVVdpdGhTZWNvbmRhcnlUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDVVdpdGhTZWNvbmRhcnlUeXBlIHsKLQotfQotY2xhc3MgU2Vjb25kYXJ5VHlwZTIgewotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NsYXNzV2l0aENvbXBsZXhOYW1lLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ2xhc3NXaXRoQ29tcGxleE5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNlMjViOC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ2xhc3NXaXRoQ29tcGxleE5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotcHVibGljIGNsYXNzIENsYXNzV2l0aENvbXBsZXhOYW1lIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkFic3RyYWN0TWV0aG9kUmVsZXZhbmNlMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25BYnN0cmFjdE1ldGhvZFJlbGV2YW5jZTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdkZTc4Ny4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkFic3RyYWN0TWV0aG9kUmVsZXZhbmNlMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbkFic3RyYWN0TWV0aG9kUmVsZXZhbmNlMSBleHRlbmRzIENvbXBsZXRpb25BYnN0cmFjdFN1cGVyQ2xhc3MgewotCWZvbwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uQWJzdHJhY3RNZXRob2RSZWxldmFuY2UyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkFic3RyYWN0TWV0aG9kUmVsZXZhbmNlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2MyNDJiLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uQWJzdHJhY3RNZXRob2RSZWxldmFuY2UyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uQWJzdHJhY3RNZXRob2RSZWxldmFuY2UyIGltcGxlbWVudHMgQ29tcGxldGlvblN1cGVySW50ZXJmYWNlIHsKLQllcQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uQWJzdHJhY3RTdXBlckNsYXNzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkFic3RyYWN0U3VwZXJDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWQ3NWUzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uQWJzdHJhY3RTdXBlckNsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21wbGV0aW9uQWJzdHJhY3RTdXBlckNsYXNzIHsKLQlwdWJsaWMgdm9pZCBmb28xKCl7fQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGZvbzIoKTsKLQlwdWJsaWMgdm9pZCBmb28zKCl7fQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uQWZ0ZXJDYXNlMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25BZnRlckNhc2UxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YzI0MjguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25BZnRlckNhc2UxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uQWZ0ZXJDYXNlMSB7Ci0Jc3RhdGljIGZpbmFsIGludCB6enogPSA1OwotCXZvaWQgZm9vKCl7Ci0JCXN3aXRjaCgxKSB7Ci0JCQljYXNlIHp6Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25BZnRlckNhc2UyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkFmdGVyQ2FzZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM0YmJlOC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkFmdGVyQ2FzZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25BZnRlckNhc2UyIHsKLQlzdGF0aWMgZmluYWwgaW50IHp6eiA9IDU7Ci0Jdm9pZCBmb28oKXsKLQkJc3dpdGNoKDEpIHsKLQkJCWNhc2UgMjU6Ci0JCQljYXNlIHp6Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25BbGxvY2F0aW9uRXhwcmVzc2lvbklzUGFyZW50MS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25BbGxvY2F0aW9uRXhwcmVzc2lvbklzUGFyZW50MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDEyODE2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uQWxsb2NhdGlvbkV4cHJlc3Npb25Jc1BhcmVudDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uQWxsb2NhdGlvbkV4cHJlc3Npb25Jc1BhcmVudDEgewotCUNvbXBsZXRpb25BbGxvY2F0aW9uRXhwcmVzc2lvbklzUGFyZW50MShpbnQgaSwgbG9uZyBqKXtzdXBlcigpO30KLQlDb21wbGV0aW9uQWxsb2NhdGlvbkV4cHJlc3Npb25Jc1BhcmVudDEoaW50IGksIE9iamVjdCBqKXtzdXBlcigpO30KLQkKLQlsb25nIHp6bG9uZzsKLQlpbnQgenppbnQ7Ci0JZG91YmxlIHp6ZG91YmxlOwotCWJvb2xlYW4genpib29sZWFuOwotCU9iamVjdCB6ek9iamVjdDsKLQkKLQl2b2lkIGZvbygpIHsKLQkJbmV3IENvbXBsZXRpb25BbGxvY2F0aW9uRXhwcmVzc2lvbklzUGFyZW50MSgxLCB6egotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkFsbG9jYXRpb25FeHByZXNzaW9uSXNQYXJlbnQyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkFsbG9jYXRpb25FeHByZXNzaW9uSXNQYXJlbnQyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZGM0OGUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25BbGxvY2F0aW9uRXhwcmVzc2lvbklzUGFyZW50Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25BbGxvY2F0aW9uRXhwcmVzc2lvbklzUGFyZW50MiB7Ci0JcHVibGljIGNsYXNzIElubmVyIHsKLQkJcHVibGljIElubmVyKGxvbmcgaSwgbG9uZyBqKXtzdXBlcigpO30KLQkJcHVibGljIElubmVyKE9iamVjdCBpLCBPYmplY3Qgail7c3VwZXIoKTt9Ci0JCQotCX0KLQkKLQlsb25nIHp6bG9uZzsKLQlpbnQgenppbnQ7Ci0JZG91YmxlIHp6ZG91YmxlOwotCWJvb2xlYW4genpib29sZWFuOwotCU9iamVjdCB6ek9iamVjdDsKLQkKLQl2b2lkIGZvbygpIHsKLQkJdGhpcy5uZXcgSW5uZXIoMSwgenoKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25BbGxvY2F0aW9uRXhwcmVzc2lvbklzUGFyZW50My5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25BbGxvY2F0aW9uRXhwcmVzc2lvbklzUGFyZW50My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjYwYWUzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uQWxsb2NhdGlvbkV4cHJlc3Npb25Jc1BhcmVudDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uQWxsb2NhdGlvbkV4cHJlc3Npb25Jc1BhcmVudDMgewotCXB1YmxpYyBjbGFzcyBJbm5lciB7Ci0JCXB1YmxpYyBJbm5lcihsb25nIGksIGxvbmcgail7c3VwZXIoKTt9Ci0JCXB1YmxpYyBJbm5lcihPYmplY3QgaSwgT2JqZWN0IGope3N1cGVyKCk7fQotCQkKLQl9Ci0JCi0JbG9uZyB6emxvbmc7Ci0JaW50IHp6aW50OwotCWRvdWJsZSB6emRvdWJsZTsKLQlib29sZWFuIHp6Ym9vbGVhbjsKLQlPYmplY3QgenpPYmplY3Q7Ci0JCi0Jdm9pZCBmb28oKSB7Ci0JCW5ldyBDb21wbGV0aW9uQWxsb2NhdGlvbkV4cHJlc3Npb25Jc1BhcmVudDMoKS5uZXcgSW5uZXIoMSwgenoKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25BbGxvY2F0aW9uRXhwcmVzc2lvbklzUGFyZW50NC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25BbGxvY2F0aW9uRXhwcmVzc2lvbklzUGFyZW50NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDZjYjRhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uQWxsb2NhdGlvbkV4cHJlc3Npb25Jc1BhcmVudDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uQWxsb2NhdGlvbkV4cHJlc3Npb25Jc1BhcmVudDQgewotCUNvbXBsZXRpb25BbGxvY2F0aW9uRXhwcmVzc2lvbklzUGFyZW50NChsb25nIGksIGxvbmcgail7fQotCUNvbXBsZXRpb25BbGxvY2F0aW9uRXhwcmVzc2lvbklzUGFyZW50NChPYmplY3QgaSwgT2JqZWN0IGope30KLQkKLQlsb25nIHp6bG9uZzsKLQlpbnQgenppbnQ7Ci0JZG91YmxlIHp6ZG91YmxlOwotCWJvb2xlYW4genpib29sZWFuOwotCU9iamVjdCB6ek9iamVjdDsKLQkKLQl2b2lkIGZvbygpIHsKLQkJbmV3IENvbXBsZXRpb25BbGxvY2F0aW9uRXhwcmVzc2lvbklzUGFyZW50NCgxLCB6egotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkFsbG9jYXRpb25FeHByZXNzaW9uSXNQYXJlbnQ1LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkFsbG9jYXRpb25FeHByZXNzaW9uSXNQYXJlbnQ1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYWE2YzMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25BbGxvY2F0aW9uRXhwcmVzc2lvbklzUGFyZW50NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25BbGxvY2F0aW9uRXhwcmVzc2lvbklzUGFyZW50NSB7Ci0JQ29tcGxldGlvbkFsbG9jYXRpb25FeHByZXNzaW9uSXNQYXJlbnQ1KGludCBpKXt9Ci0JCi0JbG9uZyB6emxvbmc7Ci0JaW50IHp6aW50OwotCWRvdWJsZSB6emRvdWJsZTsKLQlib29sZWFuIHp6Ym9vbGVhbjsKLQlPYmplY3QgenpPYmplY3Q7Ci0JCi0Jdm9pZCBmb28oKSB7Ci0JCW5ldyBDb21wbGV0aW9uQWxsb2NhdGlvbkV4cHJlc3Npb25Jc1BhcmVudDUoMSwgenoKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25BbGxvY2F0aW9uRXhwcmVzc2lvbklzUGFyZW50Ni5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25BbGxvY2F0aW9uRXhwcmVzc2lvbklzUGFyZW50Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjY1ODhhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uQWxsb2NhdGlvbkV4cHJlc3Npb25Jc1BhcmVudDYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uQWxsb2NhdGlvbkV4cHJlc3Npb25Jc1BhcmVudDYgewotCQotCWxvbmcgenpsb25nOwotCWludCB6emludDsKLQlkb3VibGUgenpkb3VibGU7Ci0JYm9vbGVhbiB6emJvb2xlYW47Ci0JT2JqZWN0IHp6T2JqZWN0OwotCQotCXZvaWQgZm9vKCkgewotCQluZXcgQ29tcGxldGlvbkFsbG9jYXRpb25fRVJST1JfRXhwcmVzc2lvbklzUGFyZW50NlBsdXMoKS5uZXcgSW5uZXIoMSwgenoKLQl9Ci19Ci1jbGFzcyBDb21wbGV0aW9uQWxsb2NhdGlvbkV4cHJlc3Npb25Jc1BhcmVudDZQbHVzIHsKLQlwdWJsaWMgY2xhc3MgSW5uZXIgewotCQlwdWJsaWMgSW5uZXIobG9uZyBpLCBsb25nIGopewotCQkJCi0JCX0JCi0JfQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkFtYmlndW91c0ZpZWxkTmFtZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25BbWJpZ3VvdXNGaWVsZE5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA1ZDQxNi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkFtYmlndW91c0ZpZWxkTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbkFtYmlndW91c0ZpZWxkTmFtZSB7Ci0JaW50IHhCYXI7Ci0JcHVibGljIHZvaWQgZm9vKGludCB4QmFyKXsKLQkJeEJhCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uQW1iaWd1b3VzRmllbGROYW1lMi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25BbWJpZ3VvdXNGaWVsZE5hbWUyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YTQ0YWQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25BbWJpZ3VvdXNGaWVsZE5hbWUyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uQW1iaWd1b3VzRmllbGROYW1lMiB7Ci0JaW50IHhCYXI7Ci0JY2xhc3MgY2xhc3NGb28gewotCQlwdWJsaWMgdm9pZCBmb28oaW50IHhCYXIpewotCQkJeEJhCi0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25BbWJpZ3VvdXNGaWVsZE5hbWUzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkFtYmlndW91c0ZpZWxkTmFtZTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE3NTJkOS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkFtYmlndW91c0ZpZWxkTmFtZTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uQW1iaWd1b3VzRmllbGROYW1lMyB7Ci0JcHVibGljIHZvaWQgZm9vKCl7Ci0JCWNsYXNzIENsYXNzRm9vIHsKLQkJCWludCB4QmFyOwotCQkJY2xhc3MgQ2xhc3NGb28yewotCQkJCXB1YmxpYyB2b2lkIGZvbyhpbnQgeEJhcil7Ci0JCQkJCXhCYQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkFtYmlndW91c0ZpZWxkTmFtZTQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uQW1iaWd1b3VzRmllbGROYW1lNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2RiMWY0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uQW1iaWd1b3VzRmllbGROYW1lNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25BbWJpZ3VvdXNGaWVsZE5hbWU0IHsKLQlwdWJsaWMgdm9pZCBmb28oKXsKLQkJbmV3IE9iamVjdCgpIHsKLQkJCWludCB4QmFyOwotCQkJY2xhc3MgQ2xhc3NGb28gewotCQkJCXB1YmxpYyB2b2lkIGZvbyhpbnQgeEJhcil7Ci0JCQkJCXhCYQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkFtYmlndW91c1R5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uQW1iaWd1b3VzVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGEzZTdjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uQW1iaWd1b3VzVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1pbXBvcnQgcDEuKjsKLWltcG9ydCBwMi4qOwotCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbkFtYmlndW91c1R5cGUgewotCUFCQwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uQW1iaWd1b3VzVHlwZTIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uQW1iaWd1b3VzVHlwZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkyNTQyMi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkFtYmlndW91c1R5cGUyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWltcG9ydCBwMS5BQkM7Ci1pbXBvcnQgcDIuKjsKLQotcHVibGljIGNsYXNzIENvbXBsZXRpb25BbWJpZ3VvdXNUeXBlMiB7Ci0JQUJDCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25Bcmd1bWVudE5hbWUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uQXJndW1lbnROYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMmI2MTAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25Bcmd1bWVudE5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbkFyZ3VtZW50TmFtZSB7Ci0JcHVibGljIHZvaWQgZm9vKENsYXNzV2l0aENvbXBsZXhOYW1lIGNvbXBsZXhOYW1lLCBDbGFzc1dpdGhDb21wbGV4TmFtZSApewotCQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkFycmF5QWNjZXNzMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25BcnJheUFjY2VzczEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VlMDAwMy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkFycmF5QWNjZXNzMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbkFycmF5QWNjZXNzMSB7Ci0JU3RyaW5nIHp6ejE7Ci0JaW50IHp6ejI7Ci0Jdm9pZCBmb28oKXsKLQkJU3RyaW5nW10gczsKLQkJU3RyaW5nIHMyID0gc1t6enpdCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uQXNzaWdubWVudEluTWV0aG9kMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25Bc3NpZ25tZW50SW5NZXRob2QxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZGQ5ODUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25Bc3NpZ25tZW50SW5NZXRob2QxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbkFzc2lnbm1lbnRJbk1ldGhvZDEgewotCWxvbmcgenpsb25nOwotCWludCB6emludDsKLQlkb3VibGUgenpkb3VibGU7Ci0JYm9vbGVhbiB6emJvb2xlYW47Ci0JT2JqZWN0IHp6T2JqZWN0OwotCQotCXZvaWQgZm9vIHsKLQkJbG9uZyBvOwotCQlvID0genoKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25Bc3NpZ25tZW50SW5NZXRob2QyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkFzc2lnbm1lbnRJbk1ldGhvZDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE2NDAxNC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkFzc2lnbm1lbnRJbk1ldGhvZDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uQXNzaWdubWVudEluTWV0aG9kMiB7Ci0JbG9uZyB6emxvbmc7Ci0JaW50IHp6aW50OwotCWRvdWJsZSB6emRvdWJsZTsKLQlib29sZWFuIHp6Ym9vbGVhbjsKLQlPYmplY3QgenpPYmplY3Q7Ci0JCi0Jdm9pZCBmb28gewotCQlPYmplY3QgbzsKLQkJbyA9IHp6Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uQXNzaWdubWVudEluTWV0aG9kMy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25Bc3NpZ25tZW50SW5NZXRob2QzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NTg1NjkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25Bc3NpZ25tZW50SW5NZXRob2QzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uQXNzaWdubWVudEluTWV0aG9kMyB7Ci0Jdm9pZCBmb28gewotCQlPYmplY3QgbzsKLQkJbyA9IG5ldyBPYmplYwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkFzc2lnbm1lbnRJbk1ldGhvZDQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uQXNzaWdubWVudEluTWV0aG9kNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGU1ZDBiLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uQXNzaWdubWVudEluTWV0aG9kNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbkFzc2lnbm1lbnRJbk1ldGhvZDQgewotCXZvaWQgZm9vIHsKLQkJT2JqZWN0IG87Ci0JCW8gPSBuZXcgT2JqZWM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uQmluYXJ5T3BlcmF0b3IxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkJpbmFyeU9wZXJhdG9yMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmIyZmMyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uQmluYXJ5T3BlcmF0b3IxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbkJpbmFyeU9wZXJhdG9yMSB7Ci0JaW50IHZhcjE7Ci0JYm9vbGVhbiB2YXIyOwotCU9iamVjdCB2YXIzOwotCVN0cmluZyB2YXI0Ci0JCi0Jdm9pZCBmb28oKSB7Ci0JCWludCB4ID0gMSArIHZhcgotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkJpbmFyeU9wZXJhdG9yMi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25CaW5hcnlPcGVyYXRvcjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IwZDU1OS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkJpbmFyeU9wZXJhdG9yMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbkJpbmFyeU9wZXJhdG9yMiB7Ci0JaW50IHZhcjE7Ci0JYm9vbGVhbiB2YXIyOwotCU9iamVjdCB2YXIzOwotCQotCXZvaWQgZm9vKCkgewotCQlib29sZWFuIGIgPSB0cnVlIHx8IHZhcgotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkJpbmFyeU9wZXJhdG9yMy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25CaW5hcnlPcGVyYXRvcjMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJiMDUyZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkJpbmFyeU9wZXJhdG9yMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbkJpbmFyeU9wZXJhdG9yMyB7Ci0JaW50IHZhcjE7Ci0JYm9vbGVhbiB2YXIyOwotCU9iamVjdCB2YXIzOwotCQotCXZvaWQgZm9vKCkgewotCQlkb3VibGUgeCA9IDEgLyB2YXIKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25DYXNlSW5zZW5zaXRpdmUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uQ2FzZUluc2Vuc2l0aXZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYTVhNjEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25DYXNlSW5zZW5zaXRpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25DYXNlSW5zZW5zaXRpdmUgewotCWludCBmaWVsZDsKLQlwdWJsaWMgdm9pZCBmb28oKSB7Ci0JCXRoaXMuRmllbGQKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25DYXNlSW5zZW5zaXRpdmVQYWNrYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkNhc2VJbnNlbnNpdGl2ZVBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIzZGNlMy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkNhc2VJbnNlbnNpdGl2ZVBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25DYXNlSW5zZW5zaXRpdmVQYWNrYWdlIHsKLQlwdWJsaWMgdm9pZCBmb28oKSB7Ci0JCUphCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uQ2FzdElzUGFyZW50MS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25DYXN0SXNQYXJlbnQxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNDY4OWMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25DYXN0SXNQYXJlbnQxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbkNhc3RJc1BhcmVudDEgewotCU9iamVjdCB6ek9iOwotCVhYMDAgenowMDsKLQlYWDAxIHp6MDE7Ci0JWFgwMiB6ejAyOwotCVhYMTAgenoxMDsKLQlYWDExIHp6MTE7Ci0JWFgxMiB6ejEyOwotCVhYMjAgenoyMDsKLQlYWDIxIHp6MjE7Ci0JWFgyMiB6ejIyOwotCQotCU9iamVjdCB6ek9iTSgpe30KLQlYWDAwIHp6MDBNKCl7fQotCVhYMDEgenowMU0oKXt9Ci0JWFgwMiB6ejAyTSgpe30KLQlYWDEwIHp6MTBNKCl7fQotCVhYMTEgenoxMU0oKXt9Ci0JWFgxMiB6ejEyTSgpe30KLQlYWDIwIHp6MjBNKCl7fQotCVhYMjEgenoyMU0oKXt9Ci0JWFgyMiB6ejIyTSgpe30KLQkKLQlYWDExIGZvbygpIHsKLQkJcmV0dXJuIChYWDExKXp6Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uQ2FzdElzUGFyZW50Mi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25DYXN0SXNQYXJlbnQyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MmZlZjQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25DYXN0SXNQYXJlbnQyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uQ2FzdElzUGFyZW50MiB7Ci0JWFgxMSBmb28oKSB7Ci0JCXJldHVybiAoWFgxMSl4eAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkNhdGNoQXJndW1lbnROYW1lLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkNhdGNoQXJndW1lbnROYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NTgzODYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25DYXRjaEFyZ3VtZW50TmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbkNhdGNoQXJndW1lbnROYW1lIHsKLQlwdWJsaWMgdm9pZCBmb28oKXsKLQkJdHJ5ewotCQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25DYXRjaEFyZ3VtZW50TmFtZTIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uQ2F0Y2hBcmd1bWVudE5hbWUyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZTllMGIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25DYXRjaEFyZ3VtZW50TmFtZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25DYXRjaEFyZ3VtZW50TmFtZTIgewotCXB1YmxpYyB2b2lkIGZvbygpewotCQl0cnl7Ci0JCQkKLQkJfSBjYXRjaCAoRXhjZXB0aW9uICkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25Db25kaXRpb25hbEV4cHJlc3Npb24xLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkNvbmRpdGlvbmFsRXhwcmVzc2lvbjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI1MDE4Yy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkNvbmRpdGlvbmFsRXhwcmVzc2lvbjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uQ29uZGl0aW9uYWxFeHByZXNzaW9uMSB7Ci0JaW50IHZhcjE7Ci0JYm9vbGVhbiB2YXIyOwotCU9iamVjdCB2YXIzOwotCVN0cmluZyB2YXI0Ci0JCi0Jdm9pZCBmb28oKSB7Ci0JCWJvb2xlYW4gYSwgYjsKLQkJaW50IGM7Ci0JCWMgPSBhID09IGIgPyB2YXIKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25Db25kaXRpb25hbEV4cHJlc3Npb24yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkNvbmRpdGlvbmFsRXhwcmVzc2lvbjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMzOWNlZi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkNvbmRpdGlvbmFsRXhwcmVzc2lvbjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uQ29uZGl0aW9uYWxFeHByZXNzaW9uMiB7Ci0JaW50IHZhcjE7Ci0JYm9vbGVhbiB2YXIyOwotCU9iamVjdCB2YXIzOwotCVN0cmluZyB2YXI0Ci0JCi0Jdm9pZCBmb28oKSB7Ci0JCWJvb2xlYW4gYSwgYjsKLQkJaW50IGM7Ci0JCWMgPSBhID09IGIgPyB2YXIxIDogdmFyCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uQ29uZGl0aW9uYWxFeHByZXNzaW9uMy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25Db25kaXRpb25hbEV4cHJlc3Npb24zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYjk3ZWQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25Db25kaXRpb25hbEV4cHJlc3Npb24zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbkNvbmRpdGlvbmFsRXhwcmVzc2lvbjMgewotCWludCB2YXIxOwotCWJvb2xlYW4gdmFyMjsKLQlPYmplY3QgdmFyMzsKLQlTdHJpbmcgdmFyNAotCQotCXZvaWQgZm9vKCkgewotCQlib29sZWFuIGEsIGI7Ci0JCWludCBjOwotCQljID0gYSA9PSBiID8gdmFyMSA6ICh2YXIKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25Db25zdHJ1Y3RvckZvckFub255bW91c1R5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uQ29uc3RydWN0b3JGb3JBbm9ueW1vdXNUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNjE3MTUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25Db25zdHJ1Y3RvckZvckFub255bW91c1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25Db25zdHJ1Y3RvckZvckFub255bW91c1R5cGUgewotCXZvaWQgZm9vKCkgewotCQlUeXBlV2l0aENvbnN0cnVjdG9yIGEgPSBuZXcgVHlwZVdpdGhDb25zdHJ1Y3RvcigKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25EZWZhdWx0UGFja2FnZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25EZWZhdWx0UGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTRmZWZmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRGVmYXVsdFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25EZWZhdWx0UGFja2FnZSB7Ci0JcHVibGljIHZvaWQgZm9vKCkgewotCQlEZWZhdWx0LmZvbygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkVtcHR5VG9rZW4xLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkVtcHR5VG9rZW4xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YTE3ZWEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25FbXB0eVRva2VuMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbkVtcHR5VG9rZW4xIHsKLQlpbnQgenp5eTsKLQl2b2lkIGZvbygpIHsKLQkJenp5eQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkVtcHR5VHlwZU5hbWUxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkVtcHR5VHlwZU5hbWUxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNGFlNzQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25FbXB0eVR5cGVOYW1lMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbkVtcHR5VHlwZU5hbWUxIHsKLQl2b2lkIGZvbygpIHsKLQkJQSBhID0gbmV3IAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkVtcHR5VHlwZU5hbWUyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkVtcHR5VHlwZU5hbWUyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNjgxYmYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25FbXB0eVR5cGVOYW1lMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbkVtcHR5VHlwZU5hbWUyIHsKLQl2b2lkIGZvbygpIHsKLQkJQSBhID0gCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRW5kT2ZDb21waWxhdGlvblVuaXQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRW5kT2ZDb21waWxhdGlvblVuaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QyYWFmZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkVuZE9mQ29tcGlsYXRpb25Vbml0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uRW5kT2ZDb21waWxhdGlvblVuaXQgewotCXB1YmxpYyB2b2lkIGZvbygpIHsKLQl9Ci0JcHVibGljIHZvaWQgZm9vKGludCBpKSB7Ci0JCWZvbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRXhwZWN0ZWRUeXBlSXNOb3RWYWxpZC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25FeHBlY3RlZFR5cGVJc05vdFZhbGlkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMDA5NmEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25FeHBlY3RlZFR5cGVJc05vdFZhbGlkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uRXhwZWN0ZWRUeXBlSXNOb3RWYWxpZCB7Ci0JcHVibGljIHZvaWQgZm9vKCkgewotCQlVbmtub3duVHlwZSB2YXIgPSBuZXcgCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRmllbGRJbml0aWFsaXplcjEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRmllbGRJbml0aWFsaXplcjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM3ZGY2MS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkZpZWxkSW5pdGlhbGl6ZXIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uRmllbGRJbml0aWFsaXplcjEgewotCWxvbmcgenpsb25nOwotCWludCB6emludDsKLQlkb3VibGUgenpkb3VibGU7Ci0JYm9vbGVhbiB6emJvb2xlYW47Ci0JT2JqZWN0IHp6T2JqZWN0OwotCQotCWxvbmcgbyA9IHp6Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25GaWVsZEluaXRpYWxpemVyMi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25GaWVsZEluaXRpYWxpemVyMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2YyYWI0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRmllbGRJbml0aWFsaXplcjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25GaWVsZEluaXRpYWxpemVyMiB7Ci0JbG9uZyB6emxvbmc7Ci0JaW50IHp6aW50OwotCWRvdWJsZSB6emRvdWJsZTsKLQlib29sZWFuIHp6Ym9vbGVhbjsKLQlPYmplY3QgenpPYmplY3Q7Ci0JCi0JT2JqZWN0IG8gPSB6egotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRmllbGRJbml0aWFsaXplcjMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRmllbGRJbml0aWFsaXplcjMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE3NDIzYS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkZpZWxkSW5pdGlhbGl6ZXIzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uRmllbGRJbml0aWFsaXplcjMgewotCU9iamVjdCBvID0gbmV3IE9iamVjCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25GaWVsZEluaXRpYWxpemVyNC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25GaWVsZEluaXRpYWxpemVyNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGNhNDM5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRmllbGRJbml0aWFsaXplcjQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25GaWVsZEluaXRpYWxpemVyNCB7Ci0JT2JqZWN0IG8gPSBuZXcgT2JqZWM7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25GaWVsZE5hbWUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRmllbGROYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNWI1MzUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25GaWVsZE5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25GaWVsZE5hbWUgewotCUNsYXNzV2l0aENvbXBsZXhOYW1lIGNvbXBsZXhOYW1lOwotCUNsYXNzV2l0aENvbXBsZXhOYW1lIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRmluZENsYXNzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkZpbmRDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWRiZDExLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRmluZENsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uRmluZENsYXNzIHsKLQlwcml2YXRlICAgIEFbXSBhOwotCXB1YmxpYyBDb21wbGV0aW9uRmluZENsYXNzICgpIHsKLQkJdGhpcy5hID0gbmV3IEEKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25GaW5kQ2xhc3MyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkZpbmRDbGFzczIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJiNzBhYy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkZpbmRDbGFzczIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25GaW5kQ2xhc3MyIHsKLQlwdWJsaWMgdm9pZCBmb28oKXsKLQkJcGFjazEuUFgKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25GaW5kQ29uc3RydWN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRmluZENvbnN0cnVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZWNjZTQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25GaW5kQ29uc3RydWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25GaW5kQ29uc3RydWN0b3IgewotCXB1YmxpYyBDb21wbGV0aW9uRmluZENvbnN0cnVjdG9yIChpbnQgaSkgewotCX0KLQlwdWJsdWMgdm9pZCBmb28oKXsKLQkJaW50IHggPSA0NTsKLQkJbmV3IENvbXBsZXRpb25GaW5kQ29uc3RydWN0b3IoaSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRmluZEV4Y2VwdGlvbjEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRmluZEV4Y2VwdGlvbjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBkMmE0NS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkZpbmRFeGNlcHRpb24xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uRmluZEV4Y2VwdGlvbjEgewotCXZvaWQgZm9vKCl7Ci0JCXRyeXsKLQkJfSBjYXRjaChFeCBlKSB7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25GaW5kRXhjZXB0aW9uMi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25GaW5kRXhjZXB0aW9uMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDcxNzNhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRmluZEV4Y2VwdGlvbjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25GaW5kRXhjZXB0aW9uMiB7Ci0Jdm9pZCBmb28oKSB0aHJvd3MgRXggewotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkZpbmRGaWVsZDEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRmluZEZpZWxkMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzNmZWQwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRmluZEZpZWxkMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbkZpbmRGaWVsZDEgewotCWludCB2YXI7Ci0JcHVibGljIHZvaWQgZm9vKGludCBpKQotCXB1YmxpYyB2b2lkIGJhcihpbnQgdmFyKSB7Ci0JCWZvbyh2YXIpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25GaW5kRmllbGQyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkZpbmRGaWVsZDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg0YjZmZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkZpbmRGaWVsZDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25GaW5kRmllbGQyIHsKLQlpbnQgdmFyOwotCXB1YmxpYyB2b2lkIGZvbyhpbnQgaSkKLQlwdWJsaWMgdm9pZCBiYXIoaW50IHZhcikgewotCQl0aGlzLnZhcjsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRmluZEZpZWxkMy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25GaW5kRmllbGQzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNjIyYTcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25GaW5kRmllbGQzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1pbnRlcmZhY2UgQTMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGJhciA9ICJhIjsKLX0KLWludGVyZmFjZSBCMyBleHRlbmRzIEEzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBiYXIgPSAiYiI7Ci19Ci1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbkZpbmRGaWVsZDMgewotCXB1YmxpYyB2b2lkIGZvbygpIHsKLQkJQjMgYiA9IG51bGw7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihiLmJhKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRmluZEltcG9ydDEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRmluZEltcG9ydDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVkMjg0ZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkZpbmRJbXBvcnQxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWltcG9ydCBwYWMKLQotcHVibGljIGNsYXNzIENvbXBsZXRpb25GaW5kSW1wb3J0MSB7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkZpbmRJbXBvcnQyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkZpbmRJbXBvcnQyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2OGIzNmYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25GaW5kSW1wb3J0Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1pbXBvcnQgcGFjazEuUAotCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbkZpbmRJbXBvcnQyIHsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRmluZExvY2FsVmFyaWFibGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRmluZExvY2FsVmFyaWFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFkODk5Zi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkZpbmRMb2NhbFZhcmlhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uRmluZExvY2FsVmFyaWFibGUgewotCXB1YmxpYyB2b2lkIGZvbyhpbnQgaSkKLQlwdWJsaWMgdm9pZCBiYXIoKSB7Ci0JCWludCB2YXIKLQkJZm9vKHZhcik7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkZpbmRNZW1iZXJUeXBlMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25GaW5kTWVtYmVyVHlwZTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc2NTNhZi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkZpbmRNZW1iZXJUeXBlMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotaW50ZXJmYWNlIEExIHsKLQljbGFzcyBJbm5lcjEgewotCX0KLX0KLWludGVyZmFjZSBCMSBleHRlbmRzIEExIHsKLQljbGFzcyBJbm5lcjEgewotCX0KLX0KLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uRmluZE1lbWJlclR5cGUxIHsKLQlwdWJsaWMgdm9pZCBmb28oKSB7Ci0JCUIxLklubmVyCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRmluZE1lbWJlclR5cGUyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkZpbmRNZW1iZXJUeXBlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjQ1ZmM5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRmluZE1lbWJlclR5cGUyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1pbnRlcmZhY2UgQTIgewotCWNsYXNzIElubmVyMnsKLQl9Ci19Ci1pbnRlcmZhY2UgQjIgZXh0ZW5kcyBBMiB7Ci0JY2xhc3MgSW5uZXIyIHsKLQl9Ci19Ci1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbkZpbmRNZW1iZXJUeXBlMiBpbXBsZW1lbnRzIEIyewotCXB1YmxpYyB2b2lkIGZvbygpIHsKLQkJSW5uZXIKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25GaW5kTWV0aG9kMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25GaW5kTWV0aG9kMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2ZkMTA2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRmluZE1ldGhvZDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25GaW5kTWV0aG9kMSB7Ci0JQSBhOwotCXZvaWQgZm9vKCl7Ci0JCWEuZm9vYmEKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25GaW5kTWV0aG9kMi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25GaW5kTWV0aG9kMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjAxOTg2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRmluZE1ldGhvZDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25GaW5kTWV0aG9kMiB7Ci0Jdm9pZCBmb28oQiBiKXsKLQkJYi5mb29iYQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkZpbmRNZXRob2RJblByb2Nlc3MuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRmluZE1ldGhvZEluUHJvY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWI0NmRhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRmluZE1ldGhvZEluUHJvY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbkZpbmRNZXRob2RJblByb2Nlc3MgewotCXB1YmxpYyB2b2lkIGZvb2JhcigpewotCX0KLQlwdWJsaWMgaW50IGZvbyAoKSB7Ci0JCWZvb2JhCi0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25GaW5kTWV0aG9kSW5UaGlzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkZpbmRNZXRob2RJblRoaXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc1NGFmZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkZpbmRNZXRob2RJblRoaXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25GaW5kTWV0aG9kSW5UaGlzIHsKLQlwdWJsaWMgdm9pZCBmb29iYXIoaW50IGkpewotCX0KLQl2b2lkIGZvbygpewotCQlmb29iYXIoNDUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkZpbmRTZWNvbmRhcnlUeXBlMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25GaW5kU2Vjb25kYXJ5VHlwZTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRhMDEzYS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkZpbmRTZWNvbmRhcnlUeXBlMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbkZpbmRTZWNvbmRhcnlUeXBlMSB7Ci0JLyoqL1NlY29uZGFyeQotfQotY2xhc3MgU2Vjb25kYXJ5VHlwZTEgewotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25GaW5kU3VwZXJJbnRlcmZhY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRmluZFN1cGVySW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMmEwYzcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25GaW5kU3VwZXJJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25GaW5kU3VwZXJJbnRlcmZhY2UgaW1wbGVtZW50cyBTdXBlckludGVyZmFjZSB7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkZpbmRUaGlzRG90RmllbGQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRmluZFRoaXNEb3RGaWVsZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGQ4YjlhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uRmluZFRoaXNEb3RGaWVsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbkZpbmRUaGlzRG90RmllbGQgewotCXB1YmxpYyBpbnQgYmFyOwotCXZvaWQgZm9vKCkgewotCQl0aGlzLmJhciA9IDQ1OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uSW5zdGFuY2VvZk9wZXJhdG9yMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25JbnN0YW5jZW9mT3BlcmF0b3IxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5OTJmNzAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25JbnN0YW5jZW9mT3BlcmF0b3IxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbkluc3RhbmNlb2ZPcGVyYXRvcjEgewotCXZvaWQgZm9vKFdXV0NvbXBsZXRpb25JbnN0YW5jZW9mMiB4KSB7Ci0JCWlmKHggaW5zdGFuY2VvZiBXV1dDb21wbGV0aW9uSW5zdGFuY2VvZil7fQotCX0KLX0KLQotY2xhc3MgV1dXQ29tcGxldGlvbkluc3RhbmNlb2YxIHsKLQotfQotCi1jbGFzcyBXV1dDb21wbGV0aW9uSW5zdGFuY2VvZjIgZXh0ZW5kcyBXV1dDb21wbGV0aW9uSW5zdGFuY2VvZjEgewotCi19Ci0KLWNsYXNzIFdXV0NvbXBsZXRpb25JbnN0YW5jZW9mMyBleHRlbmRzIFdXV0NvbXBsZXRpb25JbnN0YW5jZW9mMiB7Ci0KLX0KLQotY2xhc3MgV1dXQ29tcGxldGlvbkluc3RhbmNlb2Y0IHsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uTG9jYWxOYW1lLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkxvY2FsTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjg5MTVlLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uTG9jYWxOYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uTG9jYWxOYW1lIHsKLQlwdWJsaWMgdm9pZCBmb28oKXsKLQkJQ2xhc3NXaXRoQ29tcGxleE5hbWUgY29tcGxleE5hbWU7Ci0JCUNsYXNzV2l0aENvbXBsZXhOYW1lIAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbkxvY2FsVHlwZTEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uTG9jYWxUeXBlMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTg0NjAyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uTG9jYWxUeXBlMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbkxvY2FsVHlwZTEgewotCXZvaWQgZm9vKCkgewotCQljbGFzcyBaWlpaIHsKLQkJCVpaWgotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uTWVtYmVyVHlwZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25NZW1iZXJUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNWRmNWMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25NZW1iZXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uTWVtYmVyVHlwZSB7Ci0JcHVibGljIGNsYXNzIFkgewotCQlwdWJsaWMgdm9pZCBmb28oKXsKLQkJCVkgdmFyID0gbmV3IAotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uTWVtYmVyVHlwZTIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uTWVtYmVyVHlwZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRlM2Y4MC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbk1lbWJlclR5cGUyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uTWVtYmVyVHlwZTIgewotCXB1YmxpYyBjbGFzcyBNZW1iZXJFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCX0KLQl2b2lkIGZvbygpIHsKLQkJdGhyb3cgbmV3IAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbk1lc3NhZ2VTZW5kSXNQYXJlbnQxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbk1lc3NhZ2VTZW5kSXNQYXJlbnQxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNGI3NDkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25NZXNzYWdlU2VuZElzUGFyZW50MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25NZXNzYWdlU2VuZElzUGFyZW50MSB7Ci0Jdm9pZCBiYXIoaW50IGksIGxvbmcgail7fQotCXZvaWQgYmFyKGludCBpLCBPYmplY3Qgail7fQotCQotCWxvbmcgenpsb25nOwotCWludCB6emludDsKLQlkb3VibGUgenpkb3VibGU7Ci0JYm9vbGVhbiB6emJvb2xlYW47Ci0JT2JqZWN0IHp6T2JqZWN0OwotCQotCXZvaWQgZm9vKCkgewotCQliYXIoMSwgenoKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25NZXNzYWdlU2VuZElzUGFyZW50Mi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25NZXNzYWdlU2VuZElzUGFyZW50Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2VhNjZjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uTWVzc2FnZVNlbmRJc1BhcmVudDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uTWVzc2FnZVNlbmRJc1BhcmVudDIgewotCWxvbmcgenpsb25nOwotCWludCB6emludDsKLQlkb3VibGUgenpkb3VibGU7Ci0JYm9vbGVhbiB6emJvb2xlYW47Ci0JT2JqZWN0IHp6T2JqZWN0OwotCQotCXZvaWQgZm9vKENvbXBsZXRpb25NZXNzYWdlU2VuZElzUGFyZW50MkludGVyZmFjZSBpKSB7Ci0JCWkuYmFyKDEsIHp6Ci0JfQotfQotCi1pbnRlcmZhY2UgQ29tcGxldGlvbk1lc3NhZ2VTZW5kSXNQYXJlbnQySW50ZXJmYWNlIHsKLQl2b2lkIGJhcihpbnQgaSwgbG9uZyBqKTsKLQl2b2lkIGJhcihpbnQgaSwgT2JqZWN0IGopOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uTWVzc2FnZVNlbmRJc1BhcmVudDMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uTWVzc2FnZVNlbmRJc1BhcmVudDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI4OWUzOS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbk1lc3NhZ2VTZW5kSXNQYXJlbnQzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbk1lc3NhZ2VTZW5kSXNQYXJlbnQzIGV4dGVuZHMgQ29tcGxldGlvbk1lc3NhZ2VTZW5kSXNQYXJlbnQzU3VwZXJDbGFzcyB7Ci0JbG9uZyB6emxvbmc7Ci0JaW50IHp6aW50OwotCWRvdWJsZSB6emRvdWJsZTsKLQlib29sZWFuIHp6Ym9vbGVhbjsKLQlPYmplY3QgenpPYmplY3Q7Ci0JCi0Jdm9pZCBmb28oKSB7Ci0JCWJhcigxLCB6egotCX0KLX0KLQotY2xhc3MgQ29tcGxldGlvbk1lc3NhZ2VTZW5kSXNQYXJlbnQzU3VwZXJDbGFzcyB7Ci0Jdm9pZCBiYXIoaW50IGksIGxvbmcgaik7Ci0Jdm9pZCBiYXIoaW50IGksIE9iamVjdCBqKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbk1lc3NhZ2VTZW5kSXNQYXJlbnQ0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbk1lc3NhZ2VTZW5kSXNQYXJlbnQ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MDRmZjIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25NZXNzYWdlU2VuZElzUGFyZW50NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25NZXNzYWdlU2VuZElzUGFyZW50NCB7Ci0Jdm9pZCBiYXIobG9uZyBpLCBsb25nIGope30KLQl2b2lkIGJhcihPYmplY3QgaSwgT2JqZWN0IGope30KLQkKLQlsb25nIHp6bG9uZzsKLQlpbnQgenppbnQ7Ci0JZG91YmxlIHp6ZG91YmxlOwotCWJvb2xlYW4genpib29sZWFuOwotCU9iamVjdCB6ek9iamVjdDsKLQkKLQl2b2lkIGZvbygpIHsKLQkJYmFyKDEsIHp6Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uTWVzc2FnZVNlbmRJc1BhcmVudDUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uTWVzc2FnZVNlbmRJc1BhcmVudDUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNmZjRiMy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbk1lc3NhZ2VTZW5kSXNQYXJlbnQ1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbk1lc3NhZ2VTZW5kSXNQYXJlbnQ1IHsKLQl2b2lkIGJhcihpbnQgaSl7fQotCQotCWxvbmcgenpsb25nOwotCWludCB6emludDsKLQlkb3VibGUgenpkb3VibGU7Ci0JYm9vbGVhbiB6emJvb2xlYW47Ci0JT2JqZWN0IHp6T2JqZWN0OwotCQotCXZvaWQgZm9vKCkgewotCQliYXIoMSwgenoKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25NZXNzYWdlU2VuZElzUGFyZW50Ni5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25NZXNzYWdlU2VuZElzUGFyZW50Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODM0MzdjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uTWVzc2FnZVNlbmRJc1BhcmVudDYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uTWVzc2FnZVNlbmRJc1BhcmVudDYgewotCWludCBiYXIoaW50IGksIGludCBqKXtyZXR1cm4gMDt9Ci0JCi0JbG9uZyB6emxvbmc7Ci0JaW50IHp6aW50OwotCWRvdWJsZSB6emRvdWJsZTsKLQlib29sZWFuIHp6Ym9vbGVhbjsKLQlPYmplY3QgenpPYmplY3Q7Ci0JCi0Jdm9pZCBmb28oKSB7Ci0JCWJhcihuZXcgQ29tcGxldGlvbk1lc3NhZ2VTZW5kSXNQYXJlbnQ2KCkuYmFyKDAsMCksIHp6Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uTWV0aG9kRGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uTWV0aG9kRGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEwOGZlMC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbk1ldGhvZERlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uTWV0aG9kRGVjbGFyYXRpb24gZXh0ZW5kcyBTdXBlckNsYXNzIHsKLQllcQotfQotCi1jbGFzcyBTdXBlckNsYXNzIHsKLQlwdWJsaWMgaW50IGVxRm9vKGludCBhLE9iamVjdCBiKXsKLQkJcmV0dXJuIDE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25NZXRob2REZWNsYXJhdGlvbjEwLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbk1ldGhvZERlY2xhcmF0aW9uMTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJmNWRmZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbk1ldGhvZERlY2xhcmF0aW9uMTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25NZXRob2REZWNsYXJhdGlvbjEwIHsKLQljbG9uCi0JZm9vKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25NZXRob2REZWNsYXJhdGlvbjIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uTWV0aG9kRGVjbGFyYXRpb24yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZDkxMWQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25NZXRob2REZWNsYXJhdGlvbjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25NZXRob2REZWNsYXJhdGlvbjIgZXh0ZW5kcyBDb21wbGV0aW9uU3VwZXJDbGFzcyB7Ci0JZXEKLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uTWV0aG9kRGVjbGFyYXRpb24zLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbk1ldGhvZERlY2xhcmF0aW9uMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTQwNGRkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uTWV0aG9kRGVjbGFyYXRpb24zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uTWV0aG9kRGVjbGFyYXRpb24zIGV4dGVuZHMgQ29tcGxldGlvblN1cGVyQ2xhc3MgewotCWVxCi0JCi0JcHVibGljIGludCBlcUZvbyhpbnQgYSxPYmplY3QgYil7Ci0JCXJldHVybiAxOwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uTWV0aG9kRGVjbGFyYXRpb240LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbk1ldGhvZERlY2xhcmF0aW9uNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzc0NmZlLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uTWV0aG9kRGVjbGFyYXRpb240LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21wbGV0aW9uTWV0aG9kRGVjbGFyYXRpb240IGltcGxlbWVudHMgQ29tcGxldGlvblN1cGVySW50ZXJmYWNlIHsKLQllcQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25NZXRob2REZWNsYXJhdGlvbjUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uTWV0aG9kRGVjbGFyYXRpb241LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNzBkYmUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25NZXRob2REZWNsYXJhdGlvbjUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25NZXRob2REZWNsYXJhdGlvbjUgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJbmV3IENvbXBsZXRpb25TdXBlckNsYXNzKCkgewotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uTWV0aG9kRGVjbGFyYXRpb242LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbk1ldGhvZERlY2xhcmF0aW9uNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGNjNTczLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uTWV0aG9kRGVjbGFyYXRpb242LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbk1ldGhvZERlY2xhcmF0aW9uNiB7Ci0Jdm9pZCBmb28oKSB7Ci0JCW5ldyBPYmplY3QoKXsKLQkJCXByb3RlY3RlZCBPYmplY3QgY2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gewotCQkJCXJldHVybiBzdXBlci5jbG9uZSgpOwotCQkJfQotCQkJY2xvbgotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbk1ldGhvZERlY2xhcmF0aW9uNy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25NZXRob2REZWNsYXJhdGlvbjcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVjMzYwYi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbk1ldGhvZERlY2xhcmF0aW9uNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbk1ldGhvZERlY2xhcmF0aW9uNyB7Ci0JY2xvbiB4Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25NZXRob2REZWNsYXJhdGlvbjguamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uTWV0aG9kRGVjbGFyYXRpb244LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5Njk4Y2MuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25NZXRob2REZWNsYXJhdGlvbjguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25NZXRob2REZWNsYXJhdGlvbjggewotCWNsb24KLQl4Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25NZXRob2REZWNsYXJhdGlvbjkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uTWV0aG9kRGVjbGFyYXRpb245LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMWY0OGYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25NZXRob2REZWNsYXJhdGlvbjkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25NZXRob2REZWNsYXJhdGlvbjkgewotCWNsb24gZm9vKCl7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uTWV0aG9kVGhyb3dzQ2xhdXNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbk1ldGhvZFRocm93c0NsYXVzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGI3ZmY4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uTWV0aG9kVGhyb3dzQ2xhdXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uTWV0aG9kVGhyb3dzQ2xhdXNlIHsKLQl2b2lkIGZvbygpIHRocm93cyBFeAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uTWV0aG9kVGhyb3dzQ2xhdXNlMi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25NZXRob2RUaHJvd3NDbGF1c2UyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YTNjMWEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25NZXRob2RUaHJvd3NDbGF1c2UyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uTWV0aG9kVGhyb3dzQ2xhdXNlMiB7Ci0Jdm9pZCBmb28oKSB0aHJvd3MgamF2YS5sYW5nLkV4Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25Ob25FbXB0eVRva2VuMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25Ob25FbXB0eVRva2VuMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjkyYTRmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uTm9uRW1wdHlUb2tlbjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25Ob25FbXB0eVRva2VuMSB7Ci0JaW50IHp6eXk7Ci0Jdm9pZCBmb28oKSB7Ci0JCXp6eXkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25OdWxsUmVxdWVzdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbk51bGxSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdkNjQwNy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbk51bGxSZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25OdWxsZXF1ZXN0b3IgewotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25PYmplY3RzTWV0aG9kV2l0aEludGVyZmFjZVJlY2VpdmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbk9iamVjdHNNZXRob2RXaXRoSW50ZXJmYWNlUmVjZWl2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA0NjMzMC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbk9iamVjdHNNZXRob2RXaXRoSW50ZXJmYWNlUmVjZWl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLWludGVyZmFjZSBBIHsKLQlpbnQgaGFzaENvZGUoKTsKLX0KLWludGVyZmFjZSBCIGV4dGVuZHMgQSB7Ci19Ci1jbGFzcyBDIGltcGxlbWVudHMgQiB7Ci0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7Ci0JfQotfQotcHVibGljIGNsYXNzIENvbXBsZXRpb25PYmplY3RzTWV0aG9kV2l0aEludGVyZmFjZVJlY2VpdmVyIHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd1bWVudHMpIHsKLQkJQyBjID0gbmV3IEMoKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCIoKEEpYykuaGFzaENvZGUoKSA6ICIgKyAoKEEpIGMpLmhhc2gKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25PblN0YXRpY01lbWJlcjEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uT25TdGF0aWNNZW1iZXIxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYjgwN2EuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25PblN0YXRpY01lbWJlcjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25PblN0YXRpY01lbWJlcjEgewotCXB1YmxpYyBzdGF0aWMgaW50IHZhcjE7Ci0JcHVibGljIGludCB2YXIyOwotCXZvaWQgZm9vKCkgewotCQl0aGlzLnZhcgotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbk9uU3RhdGljTWVtYmVyMi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25PblN0YXRpY01lbWJlcjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE0NGUzMi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbk9uU3RhdGljTWVtYmVyMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbk9uU3RhdGljTWVtYmVyMiB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1ldGhvZDEoKXt9Ci0JcHVibGljIHZvaWQgbWV0aG9kMigpe30KLQl2b2lkIGZvbygpewotCQl0aGlzLm1ldGhvZAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbk91dE9mQm91bmRzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbk91dE9mQm91bmRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNzJjNzcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25PdXRPZkJvdW5kcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbk91dE9mQm91bmRzIHsKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblByZWZpeEZpZWxkTmFtZTEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uUHJlZml4RmllbGROYW1lMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmZjZTc0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uUHJlZml4RmllbGROYW1lMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25QcmVmaXhGaWVsZE5hbWUxIHsKLQlpbnQgeEJhcjsKLQkKLQljbGFzcyBjbGFzc0ZvbyB7Ci0JCWludCB4QmFyOwotCQkKLQkJcHVibGljIHZvaWQgZm9vKCl7Ci0JCQl4QmEKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblByZWZpeEZpZWxkTmFtZTIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uUHJlZml4RmllbGROYW1lMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTQ1ZWEzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uUHJlZml4RmllbGROYW1lMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25QcmVmaXhGaWVsZE5hbWUyIHsKLQlpbnQgeEJhcjsKLQkKLQljbGFzcyBjbGFzc0ZvbyB7Ci0JCWludCB4QmFyOwotCQkKLQkJcHVibGljIHZvaWQgZm9vKCl7Ci0JCQluZXcgQ29tcGxldGlvblByZWZpeEZpZWxkTmFtZTIoKS54QmEKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblByZWZpeE1ldGhvZE5hbWUxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblByZWZpeE1ldGhvZE5hbWUxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMzlkMWEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25QcmVmaXhNZXRob2ROYW1lMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotdWJsaWMgY2xhc3MgQ29tcGxldGlvblByZWZpeE1ldGhvZE5hbWUxIHsKLQlpbnQgeEJhcigpe30KLQkKLQljbGFzcyBjbGFzc0ZvbyB7Ci0JCWludCB4QmFyKCl7fQotCQkKLQkJcHVibGljIHZvaWQgZm9vKCl7Ci0JCQl4QmEKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblByZWZpeE1ldGhvZE5hbWUyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblByZWZpeE1ldGhvZE5hbWUyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NGJmMWEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25QcmVmaXhNZXRob2ROYW1lMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25QcmVmaXhNZXRob2ROYW1lMiB7Ci0JaW50IHhCYXIoKXt9Ci0JCi0JY2xhc3MgY2xhc3NGb28gewotCQlpbnQgeEJhcigpe30KLQkJCi0JCXB1YmxpYyB2b2lkIGZvbygpewotCQkJbmV3IENvbXBsZXRpb25QcmVmaXhNZXRob2ROYW1lMigpLnhCYQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uUHJlZml4TWV0aG9kTmFtZTMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uUHJlZml4TWV0aG9kTmFtZTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJmNmI4Yy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblByZWZpeE1ldGhvZE5hbWUzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvblByZWZpeE1ldGhvZE5hbWUzIHsKLQlpbnQgeEJhcihpbnQgYSwgaW50IGIpe30KLQkKLQljbGFzcyBjbGFzc0ZvbyB7Ci0JCWludCB4QmFyKGludCBhLCBpbnQgYil7fQotCQkKLQkJcHVibGljIHZvaWQgZm9vKCl7Ci0JCQl4QmFyKDEsCi0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25RdWFsaWZpZWRBbGxvY2F0aW9uVHlwZTEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uUXVhbGlmaWVkQWxsb2NhdGlvblR5cGUxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ODY2MWUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25RdWFsaWZpZWRBbGxvY2F0aW9uVHlwZTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25RdWFsaWZpZWRBbGxvY2F0aW9uVHlwZTEgewotCXB1YmxpYyBjbGFzcyBZWVkgewotCX0KLQl2b2lkIGZvbygpewotCQl0aGlzLm5ldyBZWVkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25RdWFsaWZpZWRFeHBlY3RlZFR5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uUXVhbGlmaWVkRXhwZWN0ZWRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNzQ4MzYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25RdWFsaWZpZWRFeHBlY3RlZFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotaW1wb3J0IHBhY2sxLlBYOwotCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvblF1YWxpZmllZEV4cGVjdGVkVHlwZSB7Ci0Jdm9pZCBmb28oKSB7Ci0JCXBhY2syLlBYIHZhciA9IG5ldyAKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25SZXBlYXRlZFR5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uUmVwZWF0ZWRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzOTU4ZjcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25SZXBlYXRlZFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25SZXBlYXRlZFR5cGUgewotCXZvaWQgZm9vKCkgewotCQkvKiovQ29tcGxldGlvblJlcGVhdGVkCi0JfQotfQotCi1jbGFzcyBDb21wbGV0aW9uUmVwZWF0ZWRPdGhlclR5cGUgewotfQotCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uUmV0dXJuSW5Jbml0aWFsaXplci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25SZXR1cm5JbkluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YWMwNjUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25SZXR1cm5JbkluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uUmV0dXJuSW5Jbml0aWFsaXplciB7Ci0JewotCQlyZXR1cm4gZXEKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25SZXR1cm5TdGF0ZW1lbnRJc1BhcmVudDEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uUmV0dXJuU3RhdGVtZW50SXNQYXJlbnQxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2OWU0ZTAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25SZXR1cm5TdGF0ZW1lbnRJc1BhcmVudDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uUmV0dXJuU3RhdGVtZW50SXNQYXJlbnQxIHsKLQlPYmplY3QgenpPYjsKLQlYWDAwIHp6MDA7Ci0JWFgwMSB6ejAxOwotCVhYMDIgenowMjsKLQlYWDEwIHp6MTA7Ci0JWFgxMSB6ejExOwotCVhYMTIgenoxMjsKLQlYWDIwIHp6MjA7Ci0JWFgyMSB6ejIxOwotCVhYMjIgenoyMjsKLQkKLQlPYmplY3QgenpPYk0oKXt9Ci0JWFgwMCB6ejAwTSgpe30KLQlYWDAxIHp6MDFNKCl7fQotCVhYMDIgenowMk0oKXt9Ci0JWFgxMCB6ejEwTSgpe30KLQlYWDExIHp6MTFNKCl7fQotCVhYMTIgenoxMk0oKXt9Ci0JWFgyMCB6ejIwTSgpe30KLQlYWDIxIHp6MjFNKCl7fQotCVhYMjIgenoyMk0oKXt9Ci0JCi0JWFgxMSBmb28oKSB7Ci0JCXJldHVybiB6egotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblJldHVyblN0YXRlbWVudElzUGFyZW50Mi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25SZXR1cm5TdGF0ZW1lbnRJc1BhcmVudDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJjMzkxYS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblJldHVyblN0YXRlbWVudElzUGFyZW50Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvblJldHVyblN0YXRlbWVudElzUGFyZW50MiB7Ci0JWFgxMSBmb28oKSB7Ci0JCXJldHVybiB4eAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblNhbWVTdXBlckNsYXNzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblNhbWVTdXBlckNsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMzA5OTAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25TYW1lU3VwZXJDbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvblNhbWVTdXBlckNsYXNzIGV4dGVuZHMgQSB7Ci0JY2xhc3MgSW5uZXIgZXh0ZW5kcyBBIHsKLQkJdm9pZCBmb28oaW50IGJhcil7Ci0JCQliYXIKLQkJfQotCX0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25TdXBlckNsYXNzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblN1cGVyQ2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ0NTMxMS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblN1cGVyQ2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25TdXBlckNsYXNzewotCXB1YmxpYyBjbGFzcyBJbm5lciB7fQotCXB1YmxpYyBpbnQgZXFGb28oaW50IGEsT2JqZWN0IGIpewotCQlyZXR1cm4gMTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25TdXBlckNsYXNzMi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25TdXBlckNsYXNzMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWQxZjZjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uU3VwZXJDbGFzczIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25TdXBlckNsYXNzMiB7Ci0JcHVibGljIGNsYXNzIElubmVyQ2xhc3Mge30KLQlwdWJsaWMgaW50ZXJmYWNlIElubmVySW50ZXJmYWNlIHt9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25TdXBlckludGVyZmFjZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25TdXBlckludGVyZmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTA4ZWZhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uU3VwZXJJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGludGVyZmFjZSBDb21wbGV0aW9uU3VwZXJJbnRlcmZhY2V7Ci0JcHVibGljIGludCBlcUZvbyhpbnQgYSxPYmplY3QgYik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25TdXBlckludGVyZmFjZTIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uU3VwZXJJbnRlcmZhY2UyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMTc3ZWMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25TdXBlckludGVyZmFjZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcHVibGljIGludGVyZmFjZSBDb21wbGV0aW9uU3VwZXJJbnRlcmZhY2UyIHsKLQlwdWJsaWMgY2xhc3MgSW5uZXJDbGFzcyB7fQotCXB1YmxpYyBpbnRlcmZhY2UgSW5uZXJJbnRlcmZhY2Uge30KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblN1cGVyVHlwZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25TdXBlclR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIxNTEyYy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblN1cGVyVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25TdXBlclR5cGUgZXh0ZW5kcyBDb21wbGV0aW9uU3VwZXJDbGFzcy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblN1cGVyVHlwZTIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uU3VwZXJUeXBlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWE4NjI0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uU3VwZXJUeXBlMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25TdXBlclR5cGUyIGV4dGVuZHMgQ29tcGxldGlvblN1cGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25TdXBlclR5cGUzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblN1cGVyVHlwZTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y1YTRmNS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblN1cGVyVHlwZTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uU3VwZXJUeXBlMyBpbXBsZW1lbnRzIENvbXBsZXRpb25TdXBlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uU3VwZXJUeXBlNC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25TdXBlclR5cGU0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZTc3OTguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25TdXBlclR5cGU0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvblN1cGVyVHlwZTQgZXh0ZW5kcyBDb21wbGV0aW9uU3VwZXJDbGFzczIuSW5uZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblN1cGVyVHlwZTUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uU3VwZXJUeXBlNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDIwMjdiLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uU3VwZXJUeXBlNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25TdXBlclR5cGU1IGltcGxlbWVudHMgQ29tcGxldGlvblN1cGVySW50ZXJmYWNlMi5Jbm5lcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uU3VwZXJUeXBlNi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25TdXBlclR5cGU2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNDcxOWMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25TdXBlclR5cGU2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1wdWJsaWMgaW50ZXJmYWNlIENvbXBsZXRpb25TdXBlclR5cGU2IGV4dGVuZHMgQ29tcGxldGlvblN1cGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25TdXBlclR5cGU3LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblN1cGVyVHlwZTcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM0MWUyMi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblN1cGVyVHlwZTcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXB1YmxpYyBpbnRlcmZhY2UgQ29tcGxldGlvblN1cGVyVHlwZTcgZXh0ZW5kcyBDb21wbGV0aW9uU3VwZXJDbGFzczIuSW5uZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblN1cGVyVHlwZTguamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uU3VwZXJUeXBlOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2MyYjVhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uU3VwZXJUeXBlOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotcHVibGljIGludGVyZmFjZSBDb21wbGV0aW9uU3VwZXJUeXBlOCBleHRlbmRzIENvbXBsZXRpb25TdXBlckludGVyZmFjZTIuSW5uZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblRocm93U3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblRocm93U3RhdGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNzIzYWYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25UaHJvd1N0YXRlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvblRocm93U3RhdGVtZW50IHsKLQl2b2lkIGZvbygpewotCQl0aHJvdyBuZXcgRXgKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25UeXBlMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25UeXBlMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDYxOTM1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uVHlwZTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotaW1wb3J0IHExLio7Ci1pbXBvcnQgcTEuQ1QxOwotcHVibGljIGNsYXNzIENvbXBsZXRpb25UeXBlMSB7Ci0Jdm9pZCBmb28oKXsKLQkJQ1QxCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uVW5hcnlPcGVyYXRvcjEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uVW5hcnlPcGVyYXRvcjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZjOTJiNC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblVuYXJ5T3BlcmF0b3IxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uVW5hcnlPcGVyYXRvcjEgewotCWludCB2YXIxOwotCWJvb2xlYW4gdmFyMjsKLQlPYmplY3QgdmFyMzsKLQkKLQl2b2lkIGZvbygpIHsKLQkJaW50IGkgPSAtdmFyCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uVW5hcnlPcGVyYXRvcjIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uVW5hcnlPcGVyYXRvcjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdiM2MxMS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblVuYXJ5T3BlcmF0b3IyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uVW5hcnlPcGVyYXRvcjIgewotCWludCB2YXIxOwotCWJvb2xlYW4gdmFyMjsKLQlPYmplY3QgdmFyMzsKLQkKLQl2b2lkIGZvbygpIHsKLQkJaWYoIXZhcil7fQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblVucmVzb2x2ZWRFbmNsb3NpbmdUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblVucmVzb2x2ZWRFbmNsb3NpbmdUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3N2RiNWY0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uVW5yZXNvbHZlZEVuY2xvc2luZ1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25VbnJlc29sdmVkRW5jbG9zaW5nVHlwZSB7Ci0JcHVibGljIHZvaWQgZm9vKCl7Ci0JCXp6ei5uZXcgWlpaKAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblVucmVzb2x2ZWRGaWVsZFR5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uVW5yZXNvbHZlZEZpZWxkVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGQzMTEyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uVW5yZXNvbHZlZEZpZWxkVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvblVucmVzb2x2ZWRGaWVsZFR5cGUgZXh0ZW5kcyBwYWNrLkJpbjN7Ci0Jdm9pZCBmb28oKSB7Ci0JCXRoaXMuYmFyCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uVW5yZXNvbHZlZFBhcmFtZXRlclR5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uVW5yZXNvbHZlZFBhcmFtZXRlclR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFiN2EzOS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblVucmVzb2x2ZWRQYXJhbWV0ZXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uVW5yZXNvbHZlZFBhcmFtZXRlclR5cGUgZXh0ZW5kcyBwYWNrLkJpbjJ7Ci0Jdm9pZCBmb28oKSB7Ci0JCXRoaXMuYmFyCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uVW5yZXNvbHZlZFJldHVyblR5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uVW5yZXNvbHZlZFJldHVyblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IxMDEyZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblVucmVzb2x2ZWRSZXR1cm5UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uVW5yZXNvbHZlZFJldHVyblR5cGUgZXh0ZW5kcyBwYWNrLkJpbjF7Ci0Jdm9pZCBmb28oKSB7Ci0JCXRoaXMuYmFyCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uVmFyaWFibGVJbml0aWFsaXplckluSW5pdGlhbGl6ZXIxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblZhcmlhYmxlSW5pdGlhbGl6ZXJJbkluaXRpYWxpemVyMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWRjZTkwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uVmFyaWFibGVJbml0aWFsaXplckluSW5pdGlhbGl6ZXIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvblZhcmlhYmxlSW5pdGlhbGl6ZXJJbkluaXRpYWxpemVyMSB7Ci0JbG9uZyB6emxvbmc7Ci0JaW50IHp6aW50OwotCWRvdWJsZSB6emRvdWJsZTsKLQlib29sZWFuIHp6Ym9vbGVhbjsKLQlPYmplY3QgenpPYmplY3Q7Ci0JCi0JewotCQlsb25nIG8gPSB6egotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblZhcmlhYmxlSW5pdGlhbGl6ZXJJbkluaXRpYWxpemVyMi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25WYXJpYWJsZUluaXRpYWxpemVySW5Jbml0aWFsaXplcjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQwYmM3Yy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblZhcmlhYmxlSW5pdGlhbGl6ZXJJbkluaXRpYWxpemVyMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25WYXJpYWJsZUluaXRpYWxpemVySW5Jbml0aWFsaXplcjIgewotCWxvbmcgenpsb25nOwotCWludCB6emludDsKLQlkb3VibGUgenpkb3VibGU7Ci0JYm9vbGVhbiB6emJvb2xlYW47Ci0JT2JqZWN0IHp6T2JqZWN0OwotCQotCXsKLQkJT2JqZWN0IG8gPSB6egotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblZhcmlhYmxlSW5pdGlhbGl6ZXJJbkluaXRpYWxpemVyMy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25WYXJpYWJsZUluaXRpYWxpemVySW5Jbml0aWFsaXplcjMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUyZmNmOC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblZhcmlhYmxlSW5pdGlhbGl6ZXJJbkluaXRpYWxpemVyMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvblZhcmlhYmxlSW5pdGlhbGl6ZXJJbkluaXRpYWxpemVyMyB7Ci0JewotCQlPYmplY3QgbyA9IG5ldyBPYmplYwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblZhcmlhYmxlSW5pdGlhbGl6ZXJJbkluaXRpYWxpemVyNC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25WYXJpYWJsZUluaXRpYWxpemVySW5Jbml0aWFsaXplcjQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBkMzE0Mi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblZhcmlhYmxlSW5pdGlhbGl6ZXJJbkluaXRpYWxpemVyNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvblZhcmlhYmxlSW5pdGlhbGl6ZXJJbkluaXRpYWxpemVyNCB7Ci0JewotCQlPYmplY3QgbyA9IG5ldyBPYmplYzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25WYXJpYWJsZUluaXRpYWxpemVySW5NZXRob2QxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblZhcmlhYmxlSW5pdGlhbGl6ZXJJbk1ldGhvZDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNlNmVlMi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblZhcmlhYmxlSW5pdGlhbGl6ZXJJbk1ldGhvZDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uVmFyaWFibGVJbml0aWFsaXplckluTWV0aG9kMSB7Ci0JbG9uZyB6emxvbmc7Ci0JaW50IHp6aW50OwotCWRvdWJsZSB6emRvdWJsZTsKLQlib29sZWFuIHp6Ym9vbGVhbjsKLQlPYmplY3QgenpPYmplY3Q7Ci0JCi0Jdm9pZCBmb28gewotCQlsb25nIG8gPSB6egotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblZhcmlhYmxlSW5pdGlhbGl6ZXJJbk1ldGhvZDIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uVmFyaWFibGVJbml0aWFsaXplckluTWV0aG9kMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTI2NTgzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uVmFyaWFibGVJbml0aWFsaXplckluTWV0aG9kMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25WYXJpYWJsZUluaXRpYWxpemVySW5NZXRob2QyIHsKLQlsb25nIHp6bG9uZzsKLQlpbnQgenppbnQ7Ci0JZG91YmxlIHp6ZG91YmxlOwotCWJvb2xlYW4genpib29sZWFuOwotCU9iamVjdCB6ek9iamVjdDsKLQkKLQl2b2lkIGZvbyB7Ci0JCU9iamVjdCBvID0genoKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25WYXJpYWJsZUluaXRpYWxpemVySW5NZXRob2QzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblZhcmlhYmxlSW5pdGlhbGl6ZXJJbk1ldGhvZDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5ZmE3Zi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblZhcmlhYmxlSW5pdGlhbGl6ZXJJbk1ldGhvZDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25WYXJpYWJsZUluaXRpYWxpemVySW5NZXRob2QzIHsKLQl2b2lkIGZvbyB7Ci0JCU9iamVjdCBvID0gbmV3IE9iamVjCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uVmFyaWFibGVJbml0aWFsaXplckluTWV0aG9kNC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25WYXJpYWJsZUluaXRpYWxpemVySW5NZXRob2Q0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMWM5OWEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25WYXJpYWJsZUluaXRpYWxpemVySW5NZXRob2Q0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uVmFyaWFibGVJbml0aWFsaXplckluTWV0aG9kNCB7Ci0Jdm9pZCBmb28gewotCQlPYmplY3QgbyA9IG5ldyBPYmplYzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25WYXJpYWJsZU5hbWUxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblZhcmlhYmxlTmFtZTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDliMDNmNS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblZhcmlhYmxlTmFtZTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25WYXJpYWJsZU5hbWUxIHsKLQl2b2lkIGZvbygpIHsKLQkJVEVTVF9GT09fTXlDbGFzcyAKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25WYXJpYWJsZU5hbWUyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblZhcmlhYmxlTmFtZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ5NzlhZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblZhcmlhYmxlTmFtZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25WYXJpYWJsZU5hbWUyIHsKLQl2b2lkIGZvbygpIHsKLQkJVGVzdF9CYXJfTXlDbGFzcyAKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25WYXJpYWJsZU5hbWUzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblZhcmlhYmxlTmFtZTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEzZDM4YS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblZhcmlhYmxlTmFtZTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25WYXJpYWJsZU5hbWUzIHsKLQljbGFzcyBPbmVOYW1lIHt9Ci0Jdm9pZCBmb28oKSB7Ci0JCU9uZU5hbWUgCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uVmFyaWFibGVOYW1lT2ZBcnJheTEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uVmFyaWFibGVOYW1lT2ZBcnJheTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIxYjI3Yi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblZhcmlhYmxlTmFtZU9mQXJyYXkxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uVmFyaWFibGVOYW1lT2ZBcnJheTEgewotCU9iamVjdFtdIG9iCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25WYXJpYWJsZU5hbWVPZkFycmF5Mi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25WYXJpYWJsZU5hbWVPZkFycmF5Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzdjOWRjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uVmFyaWFibGVOYW1lT2ZBcnJheTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25WYXJpYWJsZU5hbWVPZkFycmF5MiB7Ci0JQ2xhc3NbXSBjbAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uVmFyaWFibGVOYW1lT2ZBcnJheTMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uVmFyaWFibGVOYW1lT2ZBcnJheTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzljNDVhYi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblZhcmlhYmxlTmFtZU9mQXJyYXkzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uVmFyaWFibGVOYW1lT2ZBcnJheTMgewotCU9iamVjdFtdW10gb2IKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblZhcmlhYmxlTmFtZU9mQXJyYXk0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblZhcmlhYmxlTmFtZU9mQXJyYXk0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyOTk1YTguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25WYXJpYWJsZU5hbWVPZkFycmF5NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvblZhcmlhYmxlTmFtZU9mQXJyYXk0IHsKLQlPYmplY3R6W10gb2IKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblZhcmlhYmxlTmFtZVVucmVzb2x2ZWRUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblZhcmlhYmxlTmFtZVVucmVzb2x2ZWRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNjdhZjkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25WYXJpYWJsZU5hbWVVbnJlc29sdmVkVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvblZhcmlhYmxlTmFtZVVucmVzb2x2ZWRUeXBlIHsKLQlPYmplY3R6IG9iCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25WaXNpYmlsaXR5Q2hlY2suamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9Db21wbGV0aW9uVmlzaWJpbGl0eUNoZWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MGJjNGMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25WaXNpYmlsaXR5Q2hlY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uVmlzaWJpbGl0eUNoZWNrIHsKLQlwdWJsaWMgdm9pZCBmb28oKXsKLQkJQ29tcGxldGlvblZpc2liaWxpdHlDaGVjazEgeCA9IG5ldyBDb21wbGV0aW9uVmlzaWJpbGl0eUNoZWNrMSgpOwotCQl4LnAKLQl9Ci19Ci0KLWNsYXNzIENvbXBsZXRpb25WaXNpYmlsaXR5Q2hlY2sxewotCXByaXZhdGUgdm9pZCBwcml2YXRlRm9vKCl7fQotCXByb3RlY3RlZCB2b2lkIHByb3RlY3RlZEZvbygpe30KLQlwdWJsaWMgdm9pZCBwdWJsaWNGb28oKXt9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25Wb2lkTWV0aG9kLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblZvaWRNZXRob2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY4NjYxNi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvblZvaWRNZXRob2QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25Wb2lkTWV0aG9kIHsKLQlpbnQgZm9vMSgpIHtyZXR1cm4gMDt9Ci0Jdm9pZCBmb28oKSB7fQotCU9iamVjdCBmb28zKCkge3JldHVybiBudWxsO30KLQl2b2lkIGJhcigpIHsKLQkJaW50IGkgPSBmb28KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL0NvbXBsZXRpb25XaXRoQmluYXJ5Rm9sZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbldpdGhCaW5hcnlGb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc2ZDc1MC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvQ29tcGxldGlvbldpdGhCaW5hcnlGb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotaW1wb3J0IG15cGFja2FnZS4qOwotCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbldpdGhCaW5hcnlGb2xkZXIgewotCU15CQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9EZWZhdWx0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvRGVmYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjMxZDAyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9EZWZhdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBEZWZhdWx0IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgZm9vKCl7fQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9TdXBlckNsYXNzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvU3VwZXJDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2Q2Mzk2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9TdXBlckNsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLXB1YmxpYyBjbGFzcyBTdXBlckNsYXNzIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvU3VwZXJJbnRlcmZhY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9TdXBlckludGVyZmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWE1MjYwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9TdXBlckludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1wdWJsaWMgaW50ZXJmYWNlIFN1cGVySW50ZXJmYWNlIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvVEVTVF9GT09fTXlDbGFzcy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL1RFU1RfRk9PX015Q2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhMDU2Mi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvVEVTVF9GT09fTXlDbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgVEVTVF9GT09fTXlDbGFzcyB7Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL1Rlc3RfQmFyX015Q2xhc3MuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9UZXN0X0Jhcl9NeUNsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZjQ3YTAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL1Rlc3RfQmFyX015Q2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIFRlc3RfQmFyX015Q2xhc3MgewotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9UeXBlV2l0aENvbnN0cnVjdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvVHlwZVdpdGhDb25zdHJ1Y3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTQ1NThlLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9UeXBlV2l0aENvbnN0cnVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUeXBlV2l0aENvbnN0cnVjdG9yIHsKLQlwcm90ZWN0ZWQgVHlwZVdpdGhDb25zdHJ1Y3RvcihpbnQgaSkgewotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvWFgwMC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL1hYMDAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMxYTJiMS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvWFgwMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLyoqCi0gKiBAYXV0aG9yIGRhdmlkCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjoKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4KLSAqIFRvIGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgY3JlYXRpb24gb2YgdHlwZSBjb21tZW50cyBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgWFgwMCB7Ci0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9YWDAxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvWFgwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2VhOTljLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9YWDAxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0vKioKLSAqIEBhdXRob3IgZGF2aWQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBlZGl0IHRoZSB0ZW1wbGF0ZSB2YXJpYWJsZSAidHlwZWNvbW1lbnQiOgotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+VGVtcGxhdGVzLgotICogVG8gZW5hYmxlIGFuZCBkaXNhYmxlIHRoZSBjcmVhdGlvbiBvZiB0eXBlIGNvbW1lbnRzIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBYWDAxIHsKLQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL1hYMDIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9YWDAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5Yjg5ZGQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL1hYMDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLS8qKgotICogQGF1dGhvciBkYXZpZAotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6Ci0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuCi0gKiBUbyBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIHR5cGUgY29tbWVudHMgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFhYMDIgewotCi19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvWFgxMC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL1hYMTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBlNjM4Zi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvWFgxMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLyoqCi0gKiBAYXV0aG9yIGRhdmlkCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjoKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4KLSAqIFRvIGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgY3JlYXRpb24gb2YgdHlwZSBjb21tZW50cyBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgWFgxMCBleHRlbmRzIFhYMDAgewotCi19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvWFgxMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL1hYMTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE3ZTg5Yi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvWFgxMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLyoqCi0gKiBAYXV0aG9yIGRhdmlkCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjoKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4KLSAqIFRvIGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgY3JlYXRpb24gb2YgdHlwZSBjb21tZW50cyBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgWFgxMSBleHRlbmRzIFhYMDEgewotCi19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvWFgxMi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL1hYMTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBjN2EyYS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvWFgxMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLyoqCi0gKiBAYXV0aG9yIGRhdmlkCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjoKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4KLSAqIFRvIGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgY3JlYXRpb24gb2YgdHlwZSBjb21tZW50cyBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgWFgxMiBleHRlbmRzIFhYMDIgewotCi19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvWFgyMC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL1hYMjAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFkNzQzMC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvWFgyMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLyoqCi0gKiBAYXV0aG9yIGRhdmlkCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjoKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4KLSAqIFRvIGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgY3JlYXRpb24gb2YgdHlwZSBjb21tZW50cyBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgWFgyMCAgZXh0ZW5kcyBYWDEwewotCi19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvWFgyMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL1hYMjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZjMmZhZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvWFgyMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLyoqCi0gKiBAYXV0aG9yIGRhdmlkCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjoKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4KLSAqIFRvIGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgY3JlYXRpb24gb2YgdHlwZSBjb21tZW50cyBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgWFgyMSBleHRlbmRzIFhYMTEgewotCi19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvWFgyMi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL1hYMjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYyNjdkMi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvWFgyMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLyoqCi0gKiBAYXV0aG9yIGRhdmlkCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjoKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4KLSAqIFRvIGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgY3JlYXRpb24gb2YgdHlwZSBjb21tZW50cyBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgWFgyMiBleHRlbmRzIFhYMTIgewotCi19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvcDEvQUJDLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvcDEvQUJDLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NWE4ZWMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL3AxL0FCQy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIHAxOwotCi1wdWJsaWMgY2xhc3MgQUJDIHsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9wMi9BQkMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9wMi9BQkMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhmMDMyMS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvcDIvQUJDLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2UgcDI7Ci0KLXB1YmxpYyBjbGFzcyBBQkMgewotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL3AzL0NvbXBsZXRpb25Ub3BsZXZlbFR5cGUxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvcDMvQ29tcGxldGlvblRvcGxldmVsVHlwZTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE0YzdmZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvcDMvQ29tcGxldGlvblRvcGxldmVsVHlwZTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcGFja2FnZSBwMzsKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uVG9wbGV2ZWxUeXBlMSB7Ci0JcDMuQ29tcGxldGlvblRvcGxldmVsVHlwZTEKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvcGFjazEvUFguamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9wYWNrMS9QWC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjZlMmFiLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9wYWNrMS9QWC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wYWNrYWdlIHBhY2sxOwotCi1wdWJsaWMgY2xhc3MgUFggewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9wYWNrMS9wYWNrMy9QWC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL3BhY2sxL3BhY2szL1BYLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NWQ3OTYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL3BhY2sxL3BhY2szL1BYLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXBhY2thZ2UgcGFjazEucGFjazM7Ci0KLXB1YmxpYyBjbGFzcyBQWCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL3BhY2syL1BYLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvcGFjazIvUFguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U5NDlkNC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvcGFjazIvUFguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcGFja2FnZSBwYWNrMjsKLQotcHVibGljIGNsYXNzIFBYIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvcTEvQ1QxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvcTEvQ1QxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyM2EyN2IuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjL3ExL0NUMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wYWNrYWdlIHExOwotcHVibGljIGNsYXNzIENUMSB7Ci0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9xMi9DVDEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYy9xMi9DVDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEwYTQ5MC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMvcTIvQ1QxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXBhY2thZ2UgcTI7Ci1wdWJsaWMgY2xhc3MgQ1QxIHsKLQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEFic3RyYWN0MS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEFic3RyYWN0MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzA1MTkyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWFicwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDEwLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3QxMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTQxM2NlLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDEwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMKLWZpbmFsIGFicwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDExLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3QxMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDE4NTdjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDExLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMKLWFicyBjbGFzcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDEyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3QxMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTAzY2UzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDEyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMKLXB1YmxpYyBhYnMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3QxMy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEFic3RyYWN0MTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhkNGU1Yy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3QxMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDEzIHsKLQlhYnMKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3QxNC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEFic3RyYWN0MTQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRkNGU0Yi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3QxNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDE0IHsKLQlmaW5hbCBhYnMKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3QxNS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEFic3RyYWN0MTUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE3OWNkNy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3QxNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDE1IHsKLQlhYnMgY2xhc3MKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3QxNi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEFic3RyYWN0MTYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUyODkxNy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3QxNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDE2IHsKLQlwdWJsaWMgYWJzCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEFic3RyYWN0Mi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEFic3RyYWN0Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjExOWFhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWZpbmFsIGFicwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI3NDE0OS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3QzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1hYnMgY2xhc3MKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3Q0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3Q0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNWFiMTQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEFic3RyYWN0NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotcHVibGljIGFicwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ1ZGJlZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3Q1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEFic3RyYWN0NSB7Ci0JYWJzCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEFic3RyYWN0Ni5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEFic3RyYWN0Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDQ1NzQ1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3Q2IHsKLQlmaW5hbCBhYnMKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3Q3LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3Q3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNDc3NjQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEFic3RyYWN0Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDcgewotCWFicyBjbGFzcwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDguamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQxOGFmOC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3Q4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEFic3RyYWN0OCB7Ci0JcHVibGljIGFicwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRBYnN0cmFjdDkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUzYTAwNi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQWJzdHJhY3Q5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMKLWFicwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRBc3NlcnQxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQXNzZXJ0MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGExNmIwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRBc3NlcnQxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEFzc2VydDEgewotCXZvaWQgZm9vKCkgewotCQlhcwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQXNzZXJ0Mi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEFzc2VydDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZkY2VjOC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQXNzZXJ0Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRBc3NlcnQyIHsKLQl2b2lkIGZvbygpIHsKLQkJaWYoYXMKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEFzc2VydDMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRBc3NlcnQzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZTA0YTUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEFzc2VydDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkQXNzZXJ0MyB7Ci0JYXMKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQXNzZXJ0NC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEFzc2VydDQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhMDVlYi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQXNzZXJ0NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRBc3NlcnQ0IHsKLQl2b2lkIGZvbygpIHsKLQkJIwotCQlhcwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQXNzZXJ0NS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEFzc2VydDUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYwYjZmNi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQXNzZXJ0NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRBc3NlcnQ1IHsKLQl2b2lkIGZvbygpIHsKLQkJIwotCQlpZihhcwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQXNzZXJ0Ni5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEFzc2VydDYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVkMTBjZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQXNzZXJ0Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRBc3NlcnQ2IHsKLQlhcwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRCcmVhazEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRCcmVhazEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZkNzFjZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQnJlYWsxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEJyZWFrMSB7Ci0Jdm9pZCBmb28oKSB7Ci0JCWZvcig7OykgewotCQkJewotCQkJCWJyZQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQnJlYWsyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQnJlYWsyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExM2IyYWUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEJyZWFrMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRCcmVhazIgewotCXZvaWQgZm9vKCkgewotCQlpZih0cnVlKSB7Ci0JCQlicmUKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEJyZWFrMy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEJyZWFrMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZThmMDAwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRCcmVhazMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkQnJlYWszIHsKLQl2b2lkIGZvbygpIHsKLQkJc3dpdGNoKDApIHsKLQkJCWNhc2UgMSA6Ci0JCQkJYnJlCi0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEJyZWFrNC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEJyZWFrNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDUwY2I4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRCcmVhazQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkQnJlYWs0IHsKLQl2b2lkIGZvbygpIHsKLQkJIwotCQlmb3IoOzspIHsKLQkJCXsKLQkJCQlicmUKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEJyZWFrNS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEJyZWFrNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjhmMDQ5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRCcmVhazUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkQnJlYWs1IHsKLQl2b2lkIGZvbygpIHsKLQkJIwotCQlpZih0cnVlKSB7Ci0JCQlicmUKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEJyZWFrNi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEJyZWFrNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGUzOTIzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRCcmVhazYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkQnJlYWs2IHsKLQl2b2lkIGZvbygpIHsKLQkJIwotCQlzd2l0Y2goMCkgewotCQkJY2FzZSAxIDoKLQkJCQlicmUKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2FzZTEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDYXNlMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTBlNGJlLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDYXNlMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRDYXNlMSB7Ci0Jdm9pZCBmb28oKXsKLQkJc3dpdGNoKDApewotCQkJY2FzCQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDYXNlMTAuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDYXNlMTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU4ODVjNS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2FzZTEwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZENhc2UxMCB7Ci0Jdm9pZCBmb28oKXsKLQkJIwotCQljYXMKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENhc2UyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2FzZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ2NTRjNC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2FzZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkQ2FzZTIgewotCXZvaWQgZm9vKCl7Ci0JCXN3aXRjaCgwKXsKLQkJCWNhc2UgMDoKLQkJCWNhcwkKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2FzZTMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDYXNlMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGJkODFlLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDYXNlMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRDYXNlMyB7Ci0Jdm9pZCBmb28oKXsKLQkJc3dpdGNoKDApewotCQkJZGVmYXVsdDoKLQkJCWNhcwkKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2FzZTQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDYXNlNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmYzODE0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDYXNlNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRDYXNlNCB7Ci0Jdm9pZCBmb28oKXsKLQkJc3dpdGNoKDApewotCQkJY2FzZSAwOgotCQkJCWJyZWFrOwotCQkJY2FzCQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDYXNlNS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENhc2U1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNGZmMzkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENhc2U1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZENhc2U1IHsKLQl2b2lkIGZvbygpewotCQljYXMKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENhc2U2LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2FzZTYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNmNjQ2NS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2FzZTYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkQ2FzZTYgewotCXZvaWQgZm9vKCl7Ci0JCSMKLQkJc3dpdGNoKDApewotCQkJY2FzCQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDYXNlNy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENhc2U3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOGU5NDkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENhc2U3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZENhc2U3IHsKLQl2b2lkIGZvbygpewotCQkjCi0JCXN3aXRjaCgwKXsKLQkJCWNhc2UgMDoKLQkJCWNhcwkKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2FzZTguamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDYXNlOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjA1OTE1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDYXNlOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRDYXNlOCB7Ci0Jdm9pZCBmb28oKXsKLQkJIwotCQlzd2l0Y2goMCl7Ci0JCQlkZWZhdWx0OgotCQkJY2FzCQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDYXNlOS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENhc2U5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyOWM0MjUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENhc2U5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRDYXNlOSB7Ci0Jdm9pZCBmb28oKXsKLQkJIwotCQlzd2l0Y2goMCl7Ci0JCQljYXNlIDA6Ci0JCQkJYnJlYWs7Ci0JCQljYXMJCi0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENhdGNoMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENhdGNoMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWVhMzk3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDYXRjaDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkQ2F0Y2gxIHsKLQlpbnQgY2F0Y2h6OwotCXZvaWQgZm9vKCkgewotCQl0cnkgewotCQkKLQkJfSBjYXQKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENhdGNoMTAuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDYXRjaDEwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YjBjYTMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENhdGNoMTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZENhdGNoMTAgewotCWludCBjYXRjaHo7Ci0Jdm9pZCBmb28oKSB7Ci0JCSMKLQkJdHJ5IHsKLQkJCi0JCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJfSBjYXQKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENhdGNoMi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENhdGNoMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Zjc4NTU4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDYXRjaDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkQ2F0Y2gyIHsKLQl2b2lkIGZvbygpIHsKLQkJY2F0Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDYXRjaDMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDYXRjaDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZjODQ4NC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2F0Y2gzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZENhdGNoMyB7Ci0JY2F0Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENhdGNoNC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENhdGNoNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjE0ODFjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDYXRjaDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkQ2F0Y2g0IHsKLQl2b2lkIGZvbygpIHsKLQkJaWYoY2F0Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDYXRjaDUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDYXRjaDUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E1ZTUxMi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2F0Y2g1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZENhdGNoNSB7Ci0JaW50IGNhdGNoejsKLQl2b2lkIGZvbygpIHsKLQkJdHJ5IHsKLQkJCi0JCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJfSBjYXQKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENhdGNoNi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENhdGNoNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWVmODYwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDYXRjaDYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkQ2F0Y2g2IHsKLQlpbnQgY2F0Y2h6OwotCXZvaWQgZm9vKCkgewotCQkjCi0JCXRyeSB7Ci0JCQotCQl9IGNhdAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2F0Y2g3LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2F0Y2g3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MzUwMTAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENhdGNoNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRDYXRjaDcgewotCXZvaWQgZm9vKCkgewotCQkjCi0JCWNhdAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2F0Y2g4LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2F0Y2g4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNWNjMDQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENhdGNoOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRDYXRoOCB7Ci0JY2F0Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENhdGNoOS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENhdGNoOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGM5NTYwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDYXRjaDkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkQ2F0Y2g5IHsKLQl2b2lkIGZvbygpIHsKLQkJIwotCQlpZihjYXQKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENsYXNzMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENsYXNzMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGY0M2Q0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDbGFzczEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWNsYQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDbGFzczEwLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2xhc3MxMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmI4NGE0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDbGFzczEwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZENsYXNzMTAgewotCXZvaWQgZm9vKCl7Ci0JCWNsYQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2xhc3MxMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENsYXNzMTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVjNWUxYS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2xhc3MxMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRDbGFzczExIHsKLQl2b2lkIGZvbygpewotCQlmaW5hbCBjbGEKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENsYXNzMTIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDbGFzczEyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMDM3OTguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENsYXNzMTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkQ2xhc3MxMiB7Ci0Jdm9pZCBmb28oKXsKLQkJZmluYWwgY2xhIFgKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENsYXNzMTMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDbGFzczEzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NmQ4NTMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENsYXNzMTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIwotY2xhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENsYXNzMTQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDbGFzczE0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMDdlYjcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENsYXNzMTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkQ2xhc3MxNCB7Ci0Jdm9pZCBmb28oKXsKLQkJIwotCQljbGEKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENsYXNzMTUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDbGFzczE1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YzkxZGYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENsYXNzMTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkQ2xhc3MxNSB7Ci0Jdm9pZCBmb28oKXsKLQkJIwotCQlmaW5hbCBjbGEKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENsYXNzMTYuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDbGFzczE2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YmIzMTcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENsYXNzMTYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkQ2xhc3MxNiB7Ci0Jdm9pZCBmb28oKXsKLQkJIwotCQlmaW5hbCBjbGEgWAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2xhc3MxNy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENsYXNzMTcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZkZTFhYS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2xhc3MxNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRDbGFzczE3IHsKLQkKLX0KLWNsYQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDbGFzczE4LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2xhc3MxOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGY0YmJjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDbGFzczE4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMKLXB1YmxpYyBjbGEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2xhc3MxOS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENsYXNzMTkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhjNTZlMi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2xhc3MxOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jCi1wdWJsaWMgYWJzdHJhY3QgY2xhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENsYXNzMi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENsYXNzMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTg2MjA1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDbGFzczIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkQ2xhc3MyIHsKLQkKLX0KLWNsYQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDbGFzczIwLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2xhc3MyMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGQwNmVkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDbGFzczIwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMKLXB1YmxpYyBjbGEgQ29tcGxldGlvbktleXdvcmRDbGFzczIwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENsYXNzMjEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDbGFzczIxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4Y2NmYjQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENsYXNzMjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIwotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkQ2xhc3MyMSB7Ci0JY2xhCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENsYXNzMjIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDbGFzczIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0M2M5MDMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENsYXNzMjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIwotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkQ2xhc3MyMiB7Ci0JcHVibGljIGNsYQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDbGFzczIzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2xhc3MyMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmQ5NDU5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDbGFzczIzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZENsYXNzMjMgewotCXB1YmxpYyBhYnN0cmFjdCBjbGEKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2xhc3MyNC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENsYXNzMjQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFkMjIwYi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2xhc3MyNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRDbGFzczI0IHsKLQlwdWJsaWMgY2xhIFgKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2xhc3MzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2xhc3MzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMTEyMjQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENsYXNzMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotcHVibGljIGNsYQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDbGFzczQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDbGFzczQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkODczYi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2xhc3M0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1wdWJsaWMgYWJzdHJhY3QgY2xhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENsYXNzNS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENsYXNzNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmU1ZWJhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDbGFzczUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXB1YmxpYyBjbGEgQ29tcGxldGlvbktleXdvcmRDbGFzczUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2xhc3M2LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2xhc3M2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMTU3N2YuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENsYXNzNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRDbGFzczYgewotCWNsYQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDbGFzczcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDbGFzczcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA0MWNhMy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2xhc3M3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZENsYXNzNyB7Ci0JcHVibGljIGNsYQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDbGFzczguamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDbGFzczguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI0MGE0MC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2xhc3M4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZENsYXNzOCB7Ci0JcHVibGljIGFic3RyYWN0IGNsYQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDbGFzczkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDbGFzczkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNkMzkxMC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ2xhc3M5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZENsYXNzOSB7Ci0JcHVibGljIGNsYSBYCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENvbnRpbnVlMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENvbnRpbnVlMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWRlZWMxLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDb250aW51ZTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkQ29udGludWUxIHsKLQl2b2lkIGZvbygpIHsKLQkJZm9yKDs7KSB7Ci0JCQl7Ci0JCQkJY29udAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ29udGludWUyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ29udGludWUyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNTkzYmMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENvbnRpbnVlMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRDb250aW51ZTIgewotCXZvaWQgZm9vKCkgewotCQlpZih0cnVlKSB7Ci0JCQljb250Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDb250aW51ZTMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRDb250aW51ZTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYyZjQ3OS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ29udGludWUzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZENvbnRpbnVlMyB7Ci0Jdm9pZCBmb28oKSB7Ci0JCSMKLQkJZm9yKDs7KSB7Ci0JCQl7Ci0JCQkJY29udAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ29udGludWU0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkQ29udGludWU0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMDAyNDQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZENvbnRpbnVlNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRDb250aW51ZTQgewotCXZvaWQgZm9vKCkgewotCQkjCi0JCWlmKHRydWUpIHsKLQkJCWNvbnQKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZERlZmF1bHQxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRGVmYXVsdDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVmMzAzZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRGVmYXVsdDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkRGVmYXVsdDEgewotCXZvaWQgZm9vKCl7Ci0JCXN3aXRjaCgwKXsKLQkJCWRlZgkKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRGVmYXVsdDEwLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRGVmYXVsdDEwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NGFmYWQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZERlZmF1bHQxMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmREZWZhdWx0MTAgewotCXZvaWQgZm9vKCl7Ci0JCSMKLQkJc3dpdGNoKDApewotCQkJZGVmYXVsdDoKLQkJCWRlZgkKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRGVmYXVsdDIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmREZWZhdWx0Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjYxNjE3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmREZWZhdWx0Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmREZWZhdWx0MiB7Ci0Jdm9pZCBmb28oKXsKLQkJc3dpdGNoKDApewotCQkJY2FzZSAwOgotCQkJZGVmCQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmREZWZhdWx0My5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZERlZmF1bHQzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MWVjMGIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZERlZmF1bHQzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZERlZmF1bHQzIHsKLQl2b2lkIGZvbygpewotCQlzd2l0Y2goMCl7Ci0JCQljYXNlIDA6Ci0JCQkJYnJlYWs7Ci0JCQlkZWYJCi0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZERlZmF1bHQ0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRGVmYXVsdDQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEwMjFkNi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRGVmYXVsdDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkRGVmYXVsdDQgewotCXZvaWQgZm9vKCl7Ci0JCWRlZgotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRGVmYXVsdDUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmREZWZhdWx0NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTliNDU3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmREZWZhdWx0NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmREZWZhdWx0NSB7Ci0Jdm9pZCBmb28oKXsKLQkJc3dpdGNoKDApewotCQkJZGVmYXVsdDoKLQkJCWRlZgkKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRGVmYXVsdDYuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmREZWZhdWx0Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTYzYTBkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmREZWZhdWx0Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmREZWZhdWx0NiB7Ci0Jdm9pZCBmb28oKXsKLQkJIwotCQlzd2l0Y2goMCl7Ci0JCQlkZWYJCi0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZERlZmF1bHQ3LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRGVmYXVsdDcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdjYzBmNy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRGVmYXVsdDcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkRGVmYXVsdDcgewotCXZvaWQgZm9vKCl7Ci0JCSMKLQkJc3dpdGNoKDApewotCQkJY2FzZSAwOgotCQkJZGVmCQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmREZWZhdWx0OC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZERlZmF1bHQ4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YzFmMjIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZERlZmF1bHQ4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmREZWZhdWx0OCB7Ci0Jdm9pZCBmb28oKXsKLQkJIwotCQlzd2l0Y2goMCl7Ci0JCQljYXNlIDA6Ci0JCQkJYnJlYWs7Ci0JCQlkZWYJCi0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZERlZmF1bHQ5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRGVmYXVsdDkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk2ZThmMy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRGVmYXVsdDkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkRGVmYXVsdDkgewotCXZvaWQgZm9vKCl7Ci0JCSMKLQkJZGVmCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmREbzEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmREbzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEzZDgwYS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRG8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZERvMSB7Ci0Jdm9pZCBmb28oKSB7Ci0JCWRvCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmREbzIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmREbzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU0MDcyNC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRG8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZERvMiB7Ci0Jdm9pZCBmb28oKSB7Ci0JCWlmKGRvCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmREbzMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmREbzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZjNGE3NC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRG8zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZERvMyB7Ci0JZG8KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRG80LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRG80LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMzk0MmUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZERvNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmREbzQgewotCXZvaWQgZm9vKCkgewotCQkjCi0JCWRvCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmREbzUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmREbzUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg0Zjk1Zi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRG81LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZERvNSB7Ci0Jdm9pZCBmb28oKSB7Ci0JCSMKLQkJaWYoZG8KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZERvNi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZERvNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDI1YzA5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmREbzYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIwotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkRG82IHsKLQlkbwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRFbHNlMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEVsc2UxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0N2E2N2UuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEVsc2UxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEVsc2UxIHsKLQl2b2lkIGZvbygpIHsKLQkJaWYodHJ1ZSkgewotCQkKLQkJfSBlbHMKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEVsc2UyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRWxzZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk2N2UxZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRWxzZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkRWxzZTIgewotCXZvaWQgZm9vKCkgewotCQllbHMKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEVsc2UzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRWxzZTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUwOTUwZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRWxzZTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkRWxzZTMgewotCWVscwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRFbHNlNC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEVsc2U0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZTk2ZTIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEVsc2U0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEVsc2U0IHsKLQl2b2lkIGZvbygpIHsKLQkJaWYoZWxzCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRFbHNlNS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEVsc2U1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYjM3NDIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEVsc2U1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEVsc2U1IHsKLQl2b2lkIGZvbygpIHsKLQkJIwotCQlpZih0cnVlKSB7Ci0JCQotCQl9IGVscwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRWxzZTYuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRFbHNlNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmIxNzk2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRFbHNlNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRFbHNlNiB7Ci0Jdm9pZCBmb28oKSB7Ci0JCSMKLQkJZWxzCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRFbHNlNy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEVsc2U3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MzMwNzQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEVsc2U3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEVsc2U3IHsKLQllbHMKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRWxzZTguamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRFbHNlOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDNhMmI4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRFbHNlOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRFbHNlOCB7Ci0Jdm9pZCBmb28oKSB7Ci0JCSMKLQkJaWYoZWxzCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRFeHRlbmRzMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEV4dGVuZHMxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MmFlY2QuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEV4dGVuZHMxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEV4dGVuZHMxIGV4dCB7Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEV4dGVuZHMxMC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEV4dGVuZHMxMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDA1Zjc1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRFeHRlbmRzMTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIwotcHVibGljIGludGVyZmFjZSBDb21wbGV0aW9uS2V5d29yZEV4dGVuZHMxMCBleHRlbmRzIFN1cGVySW50ZXJmYWNlIGV4dHsKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRXh0ZW5kczIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRFeHRlbmRzMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWIxMzNjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRFeHRlbmRzMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRFeHRlbmRzMiBleHRlbmRzIFN1cGVyQ2xhc3MgZXh0IHsKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRXh0ZW5kczMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRFeHRlbmRzMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTkwMzcxLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRFeHRlbmRzMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRFeHRlbmRzMyBpbXBsZW1lbnRzIFN1cGVySW50ZXJmYWNlIGV4dCB7Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEV4dGVuZHM0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRXh0ZW5kczQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZjNDk4Yy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRXh0ZW5kczQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGludGVyZmFjZSBDb21wbGV0aW9uS2V5d29yZEV4dGVuZHM0IGV4dCB7Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEV4dGVuZHM1LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRXh0ZW5kczUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA4OTgwZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRXh0ZW5kczUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGludGVyZmFjZSBDb21wbGV0aW9uS2V5d29yZEV4dGVuZHM1IGV4dGVuZHMgU3VwZXJJbnRlcmZhY2UgZXh0ewotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRFeHRlbmRzNi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEV4dGVuZHM2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYmQzYTAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEV4dGVuZHM2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEV4dGVuZHM2IGV4dCB7Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEV4dGVuZHM3LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRXh0ZW5kczcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc1OGNmNC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRXh0ZW5kczcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIwotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkRXh0ZW5kczcgZXh0ZW5kcyBTdXBlckNsYXNzIGV4dCB7Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEV4dGVuZHM4LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRXh0ZW5kczguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNjZmU0Ny4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRXh0ZW5kczguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIwotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkRXh0ZW5kczggaW1wbGVtZW50cyBTdXBlckludGVyZmFjZSBleHQgewotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRFeHRlbmRzOS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEV4dGVuZHM5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0Y2RiNmIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEV4dGVuZHM5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMKLXB1YmxpYyBpbnRlcmZhY2UgQ29tcGxldGlvbktleXdvcmRFeHRlbmRzOSBleHQgewotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGYWxzZTEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGYWxzZTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI5NGY3MC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmFsc2UxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEZhbHNlMSB7Ci0Jdm9pZCBmb28oKSB7Ci0JCWZhbAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmFsc2UyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmFsc2UyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYWU0NTIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZhbHNlMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRGYWxzZTIgewotCXZvaWQgZm9vKCkgewotCQlpZihmYWwKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZhbHNlMy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZhbHNlMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTI0MzQ3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGYWxzZTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkRmFsc2UzIHsKLQl2b2lkIGZvbygpIHsKLQkJIwotCQlmYWwKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZhbHNlNC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZhbHNlNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGY0NDllLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGYWxzZTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkRmFsc2U0IHsKLQl2b2lkIGZvbygpIHsKLQkJIwotCQlpZihmYWwKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZpbmFsMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZpbmFsMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWY3NTJiLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWZpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbDEwLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWwxMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGM3NjMwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbDEwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMKLWZpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbDExLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWwxMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzkyMzIyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbDExLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMKLWFic3RyYWN0IGZpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbDEyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWwxMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjQ5YjcyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbDEyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMKLWZpbiBjbGFzcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbDEzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWwxMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2ZkOTYxLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbDEzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMKLXB1YmxpYyBmaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWwxNC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZpbmFsMTQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM4ODkyNC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWwxNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRGaW5hbDE0IHsKLQlmaW4KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWwxNS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZpbmFsMTUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMzNDk2YS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWwxNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRGaW5hbDE1IHsKLQlhYnN0cmFjdCBmaW4KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWwxNi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZpbmFsMTYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc0NWNkOS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWwxNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRGaW5hbDE2IHsKLQlmaW4gY2xhc3MKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWwxNy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZpbmFsMTcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYzMTc4Mi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWwxNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRGaW5hbDE3IHsKLQlwdWJsaWMgZmluCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZpbmFsMTguamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbDE4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMGI5ODMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZpbmFsMTguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkRmluYWwxOCB7Ci0Jdm9pZCBmb28oKXsKLQkJIwotCQlmaW4KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZpbmFsMi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZpbmFsMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDRiZWUwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWFic3RyYWN0IGZpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbDMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMyOTRlMi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWwzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1maW4gY2xhc3MKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWw0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWw0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNjI2MjYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZpbmFsNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotcHVibGljIGZpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbDUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbDUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgwMmY4NS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWw1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEZpbmFsNSB7Ci0JZmluCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZpbmFsNi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZpbmFsNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzI4NjcwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbDYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkRmluYWw2IHsKLQlhYnN0cmFjdCBmaW4KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWw3LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWw3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NTZkNGMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZpbmFsNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRGaW5hbDcgewotCWZpbiBjbGFzcwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbDguamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbDguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFhZWJiYy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWw4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEZpbmFsOCB7Ci0JcHVibGljIGZpbgotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbDkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbDkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFhYmZiMi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWw5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEZpbmFsOSB7Ci0Jdm9pZCBmb28oKXsKLQkJZmluCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbGx5MS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZpbmFsbHkxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYjk0ZjQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZpbmFsbHkxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEZpbmFsbHkxIHsKLQlpbnQgZmluYWxseXo7Ci0Jdm9pZCBmb28oKSB7Ci0JCXRyeSB7Ci0JCQotCQl9IGZpbmFsbAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWxseTEwLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWxseTEwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MWY1MjQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZpbmFsbHkxMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRGaW5hbGx5MTAgewotCWZpbmFsbAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbGx5MTEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbGx5MTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAwMDA5MS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWxseTExLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEZpbmFsbHkxMSB7Ci0Jdm9pZCBmb28oKSB7Ci0JCSMKLQkJaWYoZmluYWxsCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbGx5MTIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbGx5MTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI2ZWNhOS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWxseTEyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRGaW5hbGx5MTIgewotCXZvaWQgZm9vKCkgewotCQkjCi0JCXRyeSB7Ci0JCQotCQl9IGNhdGNoKEUgZSl7Ci0JCQotCQl9IGZpbmFsbAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWxseTEzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWxseTEzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3OWI1YjEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZpbmFsbHkxMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkRmluYWxseTEzIHsKLQlpbnQgZmluYWxseXo7Ci0Jdm9pZCBmb28oKSB7Ci0JCSMKLQkJdHJ5IHsKLQkJCi0JCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJfSBmaW5hbGwKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZpbmFsbHkxNC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZpbmFsbHkxNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTgxODgwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbGx5MTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEZpbmFsbHkxNCB7Ci0JaW50IGZpbmFsbHl6OwotCXZvaWQgZm9vKCkgewotCQkjCi0JCXRyeSB7Ci0JCQotCQl9IGZpbmFsbHkgewotCQl9IGZpbmFsbAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWxseTIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbGx5Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjlmMjYwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbGx5Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRGaW5hbGx5MiB7Ci0Jdm9pZCBmb28oKSB7Ci0JCWZpbmFsbAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWxseTMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbGx5My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjdkMmYwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbGx5My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRGaW5hbGx5MyB7Ci0JZmluYWxsCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZpbmFsbHk0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWxseTQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc4MDgyNS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWxseTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkRmluYWxseTQgewotCXZvaWQgZm9vKCkgewotCQlpZihmaW5hbGwKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZpbmFsbHk1LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWxseTUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY1YmRhMi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWxseTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkRmluYWxseTUgewotCXZvaWQgZm9vKCkgewotCQl0cnkgewotCQkKLQkJfSBjYXRjaChFIGUpewotCQkKLQkJfSBmaW5hbGwKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZpbmFsbHk2LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWxseTYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNlOTM3Mi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWxseTYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkRmluYWxseTYgewotCWludCBmaW5hbGx5ejsKLQl2b2lkIGZvbygpIHsKLQkJdHJ5IHsKLQkJCi0JCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJfSBmaW5hbGwKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZpbmFsbHk3LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWxseTcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTExMmZkZi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRmluYWxseTcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkRmluYWxseTcgewotCWludCBmaW5hbGx5ejsKLQl2b2lkIGZvbygpIHsKLQkJdHJ5IHsKLQkJCi0JCX0gZmluYWxseSB7Ci0JCX0gZmluYWxsCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbGx5OC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZpbmFsbHk4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NWVhODAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZpbmFsbHk4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEZpbmFsbHk4IHsKLQlpbnQgZmluYWxseXo7Ci0Jdm9pZCBmb28oKSB7Ci0JCSMKLQkJdHJ5IHsKLQkJCi0JCX0gZmluYWxsCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGaW5hbGx5OS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZpbmFsbHk5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4OWRmMTMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZpbmFsbHk5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEZpbmFsbHk5IHsKLQl2b2lkIGZvbygpIHsKLQkJIwotCQlmaW5hbGwKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZvcjEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGb3IxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MTg0ODMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZvcjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkRm9yMSB7Ci0Jdm9pZCBmb28oKSB7Ci0JCWZvCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGb3IyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRm9yMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjc3NGY4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGb3IyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEZvcjIgewotCXZvaWQgZm9vKCkgewotCQlpZihmbwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRm9yMy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEZvcjMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkxYjZmOS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRm9yMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRGb3IzIHsKLQlmbwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGb3I0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRm9yNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDA4MjAzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGb3I0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEZvcjQgewotCXZvaWQgZm9vKCkgewotCQkjCi0JCWZvCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGb3I1LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRm9yNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWFkYTlmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGb3I1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEZvcjUgewotCXZvaWQgZm9vKCkgewotCQkjCi0JCWlmKGZvCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGb3I2LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkRm9yNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjQ0MzdkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRGb3I2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEZvcjYgewotCWZvCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZElmMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZElmMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWM2NGRmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJZjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkSWYxIHsKLQl2b2lkIGZvbygpIHsKLQkJaWYKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZElmMi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZElmMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzYzOTcwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJZjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkSWYyIHsKLQl2b2lkIGZvbygpIHsKLQkJaWYoaWYKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZElmMy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZElmMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTM0ZDE2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJZjMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkSWYzIHsKLQlpZgotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJZjQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJZjQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJiM2JkMy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSWY0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZElmNCB7Ci0Jdm9pZCBmb28oKSB7Ci0JCSMKLQkJaWYKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZElmNS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZElmNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzRjMTdjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJZjUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkSWY1IHsKLQl2b2lkIGZvbygpIHsKLQkJIwotCQlpZihpZgotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSWY2LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSWY2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NWYwYjUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZElmNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRJZjYgewotCWlmCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEltcGxlbWVudHMxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW1wbGVtZW50czEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJhYWVmMS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW1wbGVtZW50czEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkSW1wbGVtZW50czEgaW1wIHsKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW1wbGVtZW50czIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbXBsZW1lbnRzMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzUzODNkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbXBsZW1lbnRzMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRJbXBsZW1lbnRzMiBleHRlbmRzIFN1cGVyQ2xhc3MgaW1wIHsKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW1wbGVtZW50czMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbXBsZW1lbnRzMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjA1ZGZjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbXBsZW1lbnRzMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRJbXBsZW1lbnRzMyBpbXBsZW1lbnRzIFN1cGVySW50ZXJmYWNlIGltcCB7Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEltcGxlbWVudHM0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW1wbGVtZW50czQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUxMmYxOC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW1wbGVtZW50czQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIwotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkSW1wbGVtZW50czQgaW1wIHsKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW1wbGVtZW50czUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbXBsZW1lbnRzNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGEyMjI4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbXBsZW1lbnRzNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRJbXBsZW1lbnRzNSBleHRlbmRzIFN1cGVyQ2xhc3MgaW1wIHsKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW1wbGVtZW50czYuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbXBsZW1lbnRzNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTA2NTNlLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbXBsZW1lbnRzNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRJbXBsZW1lbnRzNiBpbXBsZW1lbnRzIFN1cGVySW50ZXJmYWNlIGltcCB7Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEltcG9ydDEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbXBvcnQxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNWNkMWQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEltcG9ydDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotaW1wCi0KLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEltcG9ydDEgewotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEltcG9ydDMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbXBvcnQzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZmE5NmUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEltcG9ydDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotaW1wb3J0IGphdmEubGFuZy5PYmplY3Q7Ci1pbXAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEltcG9ydDMgewotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEltcG9ydDQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbXBvcnQ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMDc0NWIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEltcG9ydDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkSW1wb3J0NCB7Ci0KLX0KLWltcApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbXBvcnQ1LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW1wb3J0NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzFkYTA1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbXBvcnQ1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWltcG9ydCBqYXZhLmxhbmcuT2JqZWN0OwotaW1wCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRJbXBvcnQ1IHsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbXBvcnQ2LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW1wb3J0Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDYxMzRhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbXBvcnQ2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEltcG9ydDYgewotCi19Ci1pbXAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW1wb3J0Ny5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEltcG9ydDcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FjNDk4ZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW1wb3J0Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jCi1pbXAKLQotcGFja2FnZSBiYmI7Ci1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRJbXBvcnQ3IHsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbnN0YW5jZW9mMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEluc3RhbmNlb2YxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmN2M3ZjUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEluc3RhbmNlb2YxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEluc3RhbmNlb2YxIHsKLQl2b2lkIGZvbygpIHsKLQkJaWYoenp6IGlucwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW5zdGFuY2VvZjIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbnN0YW5jZW9mMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzljNDdmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbnN0YW5jZW9mMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRJbnN0YW5jZW9mMSB7Ci0Jdm9pZCBmb28oKSB7Ci0JCWlucwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW5zdGFuY2VvZjMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbnN0YW5jZW9mMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODE2NjkyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbnN0YW5jZW9mMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRJbnN0YW5jZW9mMSB7Ci0Jdm9pZCBmb28oKSB7Ci0JCWlmKHp6eiB6enogaW5zCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbnN0YW5jZW9mNC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEluc3RhbmNlb2Y0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NDEwMWEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEluc3RhbmNlb2Y0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEluc3RhbmNlb2Y0IHsKLQl2b2lkIGZvbygpIHsKLQkJIwotCQlpZih6enogaW5zCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbnN0YW5jZW9mNS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEluc3RhbmNlb2Y1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0N2UzZDAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEluc3RhbmNlb2Y1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEluc3RhbmNlb2Y1IHsKLQl2b2lkIGZvbygpIHsKLQkJIwotCQlpbnMKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEluc3RhbmNlb2Y2LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW5zdGFuY2VvZjYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI4ODgwZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW5zdGFuY2VvZjYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkSW5zdGFuY2VvZjYgewotCXZvaWQgZm9vKCkgewotCQkjCi0JCWlmKHp6eiB6enogaW5zCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk1ZjIwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pbnRlcmYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlMTAuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UxMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDAxODc3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UxMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jCi1pbnRlcmYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlMTEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UxMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDhmNDBjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UxMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UxMSB7Ci19Ci1pbnRlcmYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlMTIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UxMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQ3MzgzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UxMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jCi1wdWJsaWMgaW50ZXJmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEludGVyZmFjZTEzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlMTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzExNTE3NC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlMTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIwotcHVibGljIGFic3RyYWN0IGludGVyZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UxNC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEludGVyZmFjZTE0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMzk2ZWEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEludGVyZmFjZTE0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMKLXB1YmxpYyBpbnRlcmYgQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UxNApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UxNS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEludGVyZmFjZTE1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYWQ3OTEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEludGVyZmFjZTE1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEludGVyZmFjZTE1IHsKLQlpbnRlcmYKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlMTYuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UxNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGViMjI3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UxNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UxNiB7Ci0JcHVibGljIGludGVyZgotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UxNy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEludGVyZmFjZTE3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNThhZTAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEludGVyZmFjZTE3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEludGVyZmFjZTE3IHsKLQlwdWJsaWMgYWJzdHJhY3QgaW50ZXJmCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEludGVyZmFjZTE4LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlMTguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY5NDhlNC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlMTguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIwotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlMTggewotCXB1YmxpYyBpbnRlcmYgWAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWY5Y2YxLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEludGVyZmFjZTIgewotfQotaW50ZXJmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEludGVyZmFjZTMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2UzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NmVkZjguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEludGVyZmFjZTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXB1YmxpYyBpbnRlcmYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlNC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEludGVyZmFjZTQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ViYTgxZi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotcHVibGljIGFic3RyYWN0IGludGVyZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2U1LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTg2NDU2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2U1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1wdWJsaWMgaW50ZXJmIENvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlNQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2U2LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmI0NmU5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2U2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEludGVyZmFjZTYgewotCWludGVyZgotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2U3LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGZjYjYwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2U3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZEludGVyZmFjZTcgewotCXB1YmxpYyBpbnRlcmYKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlOC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEludGVyZmFjZTguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODljYjU3NS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2U4IHsKLQlwdWJsaWMgYWJzdHJhY3QgaW50ZXJmCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEludGVyZmFjZTkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRJbnRlcmZhY2U5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiY2Y0YTAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZEludGVyZmFjZTkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkSW50ZXJmYWNlOSB7Ci0JcHVibGljIGludGVyZiBYCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZE5hdGl2ZTEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmROYXRpdmUxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MzUwZmQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZE5hdGl2ZTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkTmF0aXZlMSB7Ci0JbmF0Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZE5hdGl2ZTIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmROYXRpdmUyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1OTk2YmYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZE5hdGl2ZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkTmF0aXZlMiB7Ci0Jdm9sYXRpbGUgbmF0Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZE5hdGl2ZTMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmROYXRpdmUzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYmIyMjEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZE5hdGl2ZTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkTmF0aXZlMyB7Ci0JcHVibGljIG5hdAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmROYXRpdmU0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkTmF0aXZlNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzMzYjlkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmROYXRpdmU0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZE5hdGl2ZTQgewotCWFic3RyYWN0IG5hdAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmROYXRpdmU1LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkTmF0aXZlNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWU0YTRmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmROYXRpdmU1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZE5hdGl2ZTUgewotCW5hdAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmROYXRpdmU2LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkTmF0aXZlNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmE0MjU0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmROYXRpdmU2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZE5hdGl2ZTYgewotCXZvbGF0aWxlIG5hdAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmROYXRpdmU3LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkTmF0aXZlNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTRmODdjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmROYXRpdmU3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZE5hdGl2ZTcgewotCXB1YmxpYyBuYXQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkTmF0aXZlOC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZE5hdGl2ZTguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUyMTFhMy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkTmF0aXZlOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmROYXRpdmU4IHsKLQlhYnN0cmFjdCBuYXQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkTmV3MS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZE5ldzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMzOTk5Ny4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkTmV3MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmROZXcxIHsKLQl2b2lkIGZvbygpewotCQluZQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkTmV3MTAuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmROZXcxMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmQyMzQ2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmROZXcxMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmROZXcxMCB7Ci0Jdm9pZCBmb28oKXsKLQkJIwotCQluZSBYCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmROZXcxMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZE5ldzExLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YWFmOWIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZE5ldzExLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZE5ldzExIHsKLQl2b2lkIGZvbygpewotCQkjCi0JCW5lIFgoKQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkTmV3MTIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmROZXcxMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzdhMWNiLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmROZXcxMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmROZXcxMiB7Ci0Jdm9pZCBmb28oKXsKLQkJIwotCQlpZihuZQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkTmV3MTMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmROZXcxMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWFhOGQ0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmROZXcxMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmROZXcxMyB7Ci0JcHVibGljIGNsYXNzIFh7fQotCXZvaWQgZm9vKCl7Ci0JCSMKLQkJdGhpcy5uZQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkTmV3MTQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmROZXcxNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzQ4ODA3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmROZXcxNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmROZXcxNCB7Ci0JcHVibGljIGNsYXNzIFh7fQotCXZvaWQgZm9vKCl7Ci0JCSMKLQkJdGhpcy5uZSBYCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmROZXcxNS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZE5ldzE1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MWRlMzAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZE5ldzE1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZE5ldzE1IHsKLQlwdWJsaWMgY2xhc3MgWHt9Ci0Jdm9pZCBmb28oKXsKLQkJIwotCQl0aGlzLm5lIFgoKQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkTmV3MTYuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmROZXcxNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWI4MTljLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmROZXcxNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmROZXcxNiB7Ci0JcHVibGljIGNsYXNzIFh7fQotCXZvaWQgZm9vKCl7Ci0JCSMKLQkJaWYodGhpcy5uZQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkTmV3Mi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZE5ldzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk1NTZjMC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkTmV3Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmROZXcyIHsKLQl2b2lkIGZvbygpewotCQluZSBYCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmROZXczLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkTmV3My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjdhZWNkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmROZXczLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZE5ldzMgewotCXZvaWQgZm9vKCl7Ci0JCW5lIFgoKQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkTmV3NC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZE5ldzQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM1NzcxNy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkTmV3NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmROZXc0IHsKLQl2b2lkIGZvbygpewotCQlpZihuZQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkTmV3NS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZE5ldzUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFmYTQ3OC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkTmV3NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmROZXc1IHsKLQlwdWJsaWMgY2xhc3MgWHt9Ci0Jdm9pZCBmb28oKXsKLQkJdGhpcy5uZQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkTmV3Ni5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZE5ldzYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhMDk3Yi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkTmV3Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmROZXc2IHsKLQlwdWJsaWMgY2xhc3MgWHt9Ci0Jdm9pZCBmb28oKXsKLQkJdGhpcy5uZSBYCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmROZXc3LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkTmV3Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjMyMTY4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmROZXc3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZE5ldzcgewotCXB1YmxpYyBjbGFzcyBYe30KLQl2b2lkIGZvbygpewotCQl0aGlzLm5lIFgoKQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkTmV3OC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZE5ldzguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhkOTUzZi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkTmV3OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmROZXc4IHsKLQlwdWJsaWMgY2xhc3MgWHt9Ci0Jdm9pZCBmb28oKXsKLQkJaWYodGhpcy5uZQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkTmV3OS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZE5ldzkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYwMGYyYi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkTmV3OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmROZXc5IHsKLQl2b2lkIGZvbygpewotCQkjCi0JCW5lCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmROdWxsMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZE51bGwxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZmRlNDguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZE51bGwxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZE51bGwxIHsKLQl2b2lkIGZvbygpIHsKLQkJbnVsCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmROdWxsMi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZE51bGwyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5Nzk4MmIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZE51bGwyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZE51bGwyIHsKLQl2b2lkIGZvbygpIHsKLQkJaWYobnVsCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmROdWxsMy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZE51bGwzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlOGRiZGUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZE51bGwzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZE51bGwyIHsKLQl2b2lkIGZvbygpIHsKLQkJIwotCQludWwKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZE51bGw0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkTnVsbDQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE1NDQ1OS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkTnVsbDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkTnVsbDQgewotCXZvaWQgZm9vKCkgewotCQkjCi0JCWlmKG51bAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUGFja2FnZTEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQYWNrYWdlMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDY2NmJhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQYWNrYWdlMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWMKLQotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkUGFja2FnZTEgewotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFBhY2thZ2UzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUGFja2FnZTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc3NWEwZi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUGFja2FnZTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotaW1wb3J0IGphdmEubGFuZy5PYmplY3Q7Ci1wYWMKLQotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkUGFja2FnZTMgewotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFBhY2thZ2U0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUGFja2FnZTQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNkNzM3ZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUGFja2FnZTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkUGFja2FnZTQgewotCi19Ci1wYWMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUGFja2FnZTUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQYWNrYWdlNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2E5MjhkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQYWNrYWdlNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jCi1pbXBvcnQgamF2YS5sYW5nLk9iamVjdDsKLXBhYwotCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRQYWNrYWdlNSB7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUGFja2FnZTYuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQYWNrYWdlNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yjg2ZWQyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQYWNrYWdlNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRQYWNrYWdlNiB7Ci0KLX0KLXBhYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQYWNrYWdlNy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFBhY2thZ2U3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZDEzYzIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFBhY2thZ2U3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMKLXBhYwotCi1wYWNrYWdlIGJiYjsKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFBhY2thZ2U3IHsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQcml2YXRlMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFByaXZhdGUxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MGEzZGIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFByaXZhdGUxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFByaXZhdGUxIHsKLQlwcmkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHJpdmF0ZTEwLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHJpdmF0ZTEwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMGIyMWMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFByaXZhdGUxMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRQcml2YXRlMTAgewotCXB1YmxpYyBwcmkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHJpdmF0ZTIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQcml2YXRlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTg2OTI5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQcml2YXRlMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRQcml2YXRlMiB7Ci0JcHJpIGNsYXNzCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFByaXZhdGUzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHJpdmF0ZTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM0NDc3OS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHJpdmF0ZTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkUHJpdmF0ZTN7Ci0JZmluYWwgcHJpCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFByaXZhdGU0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHJpdmF0ZTQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA1MWRlYy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHJpdmF0ZTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkUHJpdmF0ZTQgewotCXByaXZhdGUgcHJpCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFByaXZhdGU1LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHJpdmF0ZTUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQwYzU4Mi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHJpdmF0ZTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkUHJpdmF0ZTUgewotCXB1YmxpYyBwcmkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHJpdmF0ZTYuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQcml2YXRlNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWE4MTZjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQcml2YXRlNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRQcml2YXRlNiB7Ci0JcHJpCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFByaXZhdGU3LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHJpdmF0ZTcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFlM2FlMi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHJpdmF0ZTcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIwotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkUHJpdmF0ZTcgewotCXByaSBjbGFzcwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQcml2YXRlOC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFByaXZhdGU4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NzMyZmMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFByaXZhdGU4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFByaXZhdGU4ewotCWZpbmFsIHByaQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQcml2YXRlOS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFByaXZhdGU5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3N2M3MDAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFByaXZhdGU5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFByaXZhdGU5IHsKLQlwcml2YXRlIHByaQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQcm90ZWN0ZWQxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHJvdGVjdGVkMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTMwYjBmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQcm90ZWN0ZWQxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFByb3RlY3RlZDEgewotCXBybwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQcm90ZWN0ZWQxMC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFByb3RlY3RlZDEwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZTQ0NzguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFByb3RlY3RlZDEwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFByb3RlY3RlZDEwIHsKLQlwdWJsaWMgcHJvCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFByb3RlY3RlZDIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQcm90ZWN0ZWQyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NGE1ZTUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFByb3RlY3RlZDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkUHJvdGVjdGVkMiB7Ci0JcHJvIGNsYXNzCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFByb3RlY3RlZDMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQcm90ZWN0ZWQzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZjhkMTkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFByb3RlY3RlZDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkUHJvdGVjdGVkM3sKLQlmaW5hbCBwcm8KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHJvdGVjdGVkNC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFByb3RlY3RlZDQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBmNDFiNy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHJvdGVjdGVkNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRQcm90ZWN0ZWQ0IHsKLQlwcm90ZWN0ZWQgcHJvCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFByb3RlY3RlZDUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQcm90ZWN0ZWQ1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NWU1ZGIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFByb3RlY3RlZDUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkUHJvdGVjdGVkNSB7Ci0JcHVibGljIHBybwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQcm90ZWN0ZWQ2LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHJvdGVjdGVkNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDJkNTVmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQcm90ZWN0ZWQ2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFByb3RlY3RlZDYgewotCXBybwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQcm90ZWN0ZWQ3LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHJvdGVjdGVkNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDBhYzhiLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQcm90ZWN0ZWQ3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFByb3RlY3RlZDcgewotCXBybyBjbGFzcwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQcm90ZWN0ZWQ4LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHJvdGVjdGVkOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODNjNjVkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQcm90ZWN0ZWQ4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFByb3RlY3RlZDh7Ci0JZmluYWwgcHJvCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFByb3RlY3RlZDkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQcm90ZWN0ZWQ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNjJjYTguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFByb3RlY3RlZDkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIwotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkUHJvdGVjdGVkOSB7Ci0JcHJvdGVjdGVkIHBybwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQdWJsaWMxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHVibGljMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjZiN2IyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQdWJsaWMxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1wdWIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHVibGljMTAuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQdWJsaWMxMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDdmZDYzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQdWJsaWMxMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRQdWJsaWMxMCB7Ci0JcHJpdmF0ZSBwdWIKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHVibGljMTEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQdWJsaWMxMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTRmNWNmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQdWJsaWMxMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jCi1wdWIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHVibGljMTIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQdWJsaWMxMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjZhNjA5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQdWJsaWMxMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRQdWJsaWMxMiB7Ci0JcHJpdmF0ZSBwdWIKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHVibGljMTMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQdWJsaWMxMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTUwZTBkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQdWJsaWMxMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWIgY2xhc3MgQ29tcGxldGlvbktleXdvcmRQdWJsaWMxMyB7Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFB1YmxpYzE0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHVibGljMTQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg5OTZiYi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHVibGljMTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIwotZmluYWwgcHViClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFB1YmxpYzE1LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHVibGljMTUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA5MTA2Ny4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHVibGljMTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIwotcHVibGljIHB1YgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQdWJsaWMxNi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFB1YmxpYzE2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYTZlMDYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFB1YmxpYzE2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFB1YmxpYzE2IHsKLQkKLX0KLXB1YgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQdWJsaWMxNy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFB1YmxpYzE3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNTFhYzkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFB1YmxpYzE3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFB1YmxpYzE3IHsKLQlwdWIKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHVibGljMTguamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQdWJsaWMxOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjI3MjM2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQdWJsaWMxOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRQdWJsaWMxOCB7Ci0JcHViIGNsYXNzCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFB1YmxpYzE5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHVibGljMTkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc5NTRhZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHVibGljMTkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIwotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkUHVibGljMTkgewotCWZpbmFsIHB1YgotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQdWJsaWMyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHVibGljMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWZjOTU3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQdWJsaWMyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YiBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFB1YmxpYzIgewotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQdWJsaWMyMC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFB1YmxpYzIwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NzI1MGUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFB1YmxpYzIwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFB1YmxpYzIwIHsKLQlwdWJsaWMgcHViCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFB1YmxpYzMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQdWJsaWMzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyODM2ZTkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFB1YmxpYzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWZpbmFsIHB1YgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQdWJsaWM0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHVibGljNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTYzM2E3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQdWJsaWM0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1wdWJsaWMgcHViClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFB1YmxpYzUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRQdWJsaWM1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYWEyZmQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFB1YmxpYzUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkUHVibGljNSB7Ci0JCi19Ci1wdWIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHVibGljNi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFB1YmxpYzYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY5ZjI2OC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHVibGljNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRQdWJsaWM2IHsKLQlwdWIKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHVibGljNy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFB1YmxpYzcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM1NGExOS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHVibGljNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRQdWJsaWM3IHsKLQlwdWIgY2xhc3MKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHVibGljOC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFB1YmxpYzguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFiNGM5NC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHVibGljOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRQdWJsaWM4IHsKLQlmaW5hbCBwdWIKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHVibGljOS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFB1YmxpYzkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NiNmMxOS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUHVibGljOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRQdWJsaWM5IHsKLQlwdWJsaWMgcHViCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFJldHVybjEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRSZXR1cm4xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ODQ0YzEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFJldHVybjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkUmV0dXJuMSB7Ci0Jdm9pZCBmb28oKSB7Ci0JCXJlCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRSZXR1cm4yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUmV0dXJuMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWNhZWQ4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRSZXR1cm4yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFJldHVybjIgewotCXZvaWQgZm9vKCkgewotCQlpZihyZQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUmV0dXJuMy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFJldHVybjMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI4ODQ5Mi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUmV0dXJuMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRSZXR1cm4zIHsKLQlyZQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRSZXR1cm40LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUmV0dXJuNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWFjZWZlLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRSZXR1cm40LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFJldHVybjQgewotCXZvaWQgZm9vKCkgewotCQkjCi0JCXJlCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRSZXR1cm41LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUmV0dXJuNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzc0YWFkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRSZXR1cm41LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFJldHVybjUgewotCXZvaWQgZm9vKCkgewotCQkjCi0JCWlmKHJlCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRSZXR1cm42LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkUmV0dXJuNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTc2NjVlLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRSZXR1cm42LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFJldHVybjYgewotCXJlCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN0YXRpYzEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdGF0aWMxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYWNjZTcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN0YXRpYzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkU3RhdGljMSB7Ci0Jc3RhCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN0YXRpYzEwLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3RhdGljMTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0Njg4Ny4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3RhdGljMTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIwotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkU3RhdGljMTAgewotCXB1YmxpYyBzdGEgZm9vCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN0YXRpYzIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdGF0aWMyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOWE2ZGMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN0YXRpYzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkU3RhdGljMiB7Ci0JcHVibGljIHN0YQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdGF0aWMzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3RhdGljMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjBjZDMxLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdGF0aWMzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFN0YXRpYzMgewotCXN0YSBmb28KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3RhdGljNC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN0YXRpYzQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRhZmI0My4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3RhdGljNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRTdGF0aWM0IHsKLQlhYnN0cmFjdCBzdGEKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3RhdGljNS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN0YXRpYzUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNjZTg2Yy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3RhdGljNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRTdGF0aWM1IHsKLQlwdWJsaWMgc3RhIGZvbwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdGF0aWM2LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3RhdGljNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjVhNDk2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdGF0aWM2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFN0YXRpYzYgewotCXN0YQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdGF0aWM3LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3RhdGljNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTg1MGU0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdGF0aWM3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFN0YXRpYzcgewotCXB1YmxpYyBzdGEKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3RhdGljOC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN0YXRpYzguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM4ZjVkZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3RhdGljOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRTdGF0aWM4IHsKLQlzdGEgZm9vCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN0YXRpYzkuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdGF0aWM5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMzNmMjguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN0YXRpYzkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIwotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkU3RhdGljOSB7Ci0JYWJzdHJhY3Qgc3RhCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN0cmljdGZwMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN0cmljdGZwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzUxMzVkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdHJpY3RmcDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkU3RyaWN0ZnAxIHsKLQlzdHJpYwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdHJpY3RmcDIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdHJpY3RmcDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ3NmRhYi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3RyaWN0ZnAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFN0cmljdGZwMiB7Ci0Jdm9sYXRpbGUgc3RyaWMKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3RyaWN0ZnAzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3RyaWN0ZnAzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MDE3ZWMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN0cmljdGZwMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRTdHJpY3RmcDMgewotCXB1YmxpYyBzdHJpYwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdHJpY3RmcDQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdHJpY3RmcDQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzljNzdhMy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3RyaWN0ZnA0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFN0cmljdGZwNCB7Ci0JYWJzdHJhY3Qgc3RyaWMKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3RyaWN0ZnA1LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3RyaWN0ZnA1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYjk2MjIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN0cmljdGZwNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRTdHJpY3RmcDUgewotCXN0cmljCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN0cmljdGZwNi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN0cmljdGZwNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTNlNTBmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdHJpY3RmcDYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIwotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkU3RyaWN0ZnA2IHsKLQl2b2xhdGlsZSBzdHJpYwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdHJpY3RmcDcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdHJpY3RmcDcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEwMDY5My4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3RyaWN0ZnA3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFN0cmljdGZwNyB7Ci0JcHVibGljIHN0cmljCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN0cmljdGZwOC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN0cmljdGZwOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDBlNzE3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdHJpY3RmcDguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIwotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkU3RyaWN0ZnA4IHsKLQlhYnN0cmFjdCBzdHJpYwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdXBlcjEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdXBlcjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWExNWU2NS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3VwZXIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFN1cGVyMSB7Ci0Jdm9pZCBmb28oKSB7Ci0JCXN1cAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3VwZXIxMC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN1cGVyMTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFhMWNhZi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3VwZXIxMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRTdXBlcjEwIHsKLQl7Ci0JCSMKLQkJc3VwCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdXBlcjExLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3VwZXIxMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTFiYTcyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdXBlcjExLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFN1cGVyMTEgewotCXN0YXRpYyB2b2lkIGZvbygpIHsKLQkJIwotCQlzdXAKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN1cGVyMTIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdXBlcjEyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYWEyYjkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN1cGVyMTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkU3VwZXIxMiB7Ci0JcHVibGljIENvbXBsZXRpb25LZXl3b3JkU3VwZXIxMigpIHsKLQkJIwotCQlzdXAKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN1cGVyMi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN1cGVyMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGRlNjEwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdXBlcjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkU3VwZXIyIHsKLQl2b2lkIGZvbygpIHsKLQkJaWYoc3VwCQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3VwZXIzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3VwZXIzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4Mjk0NjYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN1cGVyMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRTdXBlcjMgewotCXN1cAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdXBlcjQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdXBlcjQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc4NGM3ZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3VwZXI0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFN1cGVyNCB7Ci0JewotCQlzdXAKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN1cGVyNS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN1cGVyNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDc1ZjBjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdXBlcjUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkU3VwZXI1IHsKLQlzdGF0aWMgdm9pZCBmb28oKSB7Ci0JCXN1cAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3VwZXI2LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3VwZXI2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NTczZGEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN1cGVyNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRTdXBlcjYgewotCXB1YmxpYyBDb21wbGV0aW9uS2V5d29yZFN1cGVyNigpIHsKLQkJc3VwCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdXBlcjcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdXBlcjcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5MGExMS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3VwZXI3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFN1cGVyNyB7Ci0Jdm9pZCBmb28oKSB7Ci0JCSMKLQkJc3VwCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdXBlcjguamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTdXBlcjguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYzNjNkYy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3VwZXI4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFN1cGVyOCB7Ci0Jdm9pZCBmb28oKSB7Ci0JCSMKLQkJaWYoc3VwCQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3VwZXI5LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3VwZXI5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZGY5YjcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN1cGVyOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRTdXBlcjkgewotCXN1cAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTd2l0Y2gxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3dpdGNoMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTc3ZjQyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTd2l0Y2gxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFN3aXRjaDEgewotCXZvaWQgZm9vKCkgewotCQlzdwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3dpdGNoMi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN3aXRjaDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE2ZjAzMi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3dpdGNoMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRTd2l0Y2gyIHsKLQl2b2lkIGZvbygpIHsKLQkJaWYoc3cKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN3aXRjaDMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTd2l0Y2gzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1Mzg0YjcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN3aXRjaDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkU3dpdGNoMyB7Ci0Jc3cKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3dpdGNoNC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN3aXRjaDQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ1MTc4OS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3dpdGNoNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRTd2l0Y2g0IHsKLQl2b2lkIGZvbygpIHsKLQkJIwotCQlzdwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3dpdGNoNS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN3aXRjaDUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRiNzU5My4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3dpdGNoNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRTd2l0Y2g1IHsKLQl2b2lkIGZvbygpIHsKLQkJIwotCQlpZihzdwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3dpdGNoNi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN3aXRjaDYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUyZTg4ZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3dpdGNoNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRTd2l0Y2g2IHsKLQlzdwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTeW5jaHJvbml6ZWQxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3luY2hyb25pemVkMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmEwODUyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTeW5jaHJvbml6ZWQxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFN5bmNocm9uaXplZDEgewotCXN5bgotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTeW5jaHJvbml6ZWQxMC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN5bmNocm9uaXplZDEwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNTg2ODMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN5bmNocm9uaXplZDEwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFN5bmNocm9uaXplZDEwIHsKLQlhYnN0cmFjdCBzeW4KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3luY2hyb25pemVkMTEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTeW5jaHJvbml6ZWQxMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTljZDI0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTeW5jaHJvbml6ZWQxMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRTeW5jaHJvbml6ZWQxMSB7Ci0Jdm9pZCBmb28oKSB7Ci0JCSMKLQkJc3luCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTeW5jaHJvbml6ZWQxMi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN5bmNocm9uaXplZDEyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMTQ5ZGMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN5bmNocm9uaXplZDEyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFN5bmNocm9uaXplZDEyIHsKLQl2b2lkIGZvbygpIHsKLQkJIwotCQlpZihzeW4KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN5bmNocm9uaXplZDIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTeW5jaHJvbml6ZWQyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMzRmMTQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN5bmNocm9uaXplZDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkU3luY2hyb25pemVkMiB7Ci0Jdm9sYXRpbGUgc3luCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN5bmNocm9uaXplZDMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTeW5jaHJvbml6ZWQzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NWNiMDguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN5bmNocm9uaXplZDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkU3luY2hyb25pemVkMyB7Ci0JcHVibGljIHN5bgotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTeW5jaHJvbml6ZWQ0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3luY2hyb25pemVkNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWJhNDI4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTeW5jaHJvbml6ZWQ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFN5bmNocm9uaXplZDQgewotCWFic3RyYWN0IHN5bgotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTeW5jaHJvbml6ZWQ1LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3luY2hyb25pemVkNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmNhZWNiLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTeW5jaHJvbml6ZWQ1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFN5bmNocm9uaXplZDUgewotCXZvaWQgZm9vKCkgewotCQlzeW4KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN5bmNocm9uaXplZDYuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRTeW5jaHJvbml6ZWQ2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYWQ1ZGYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN5bmNocm9uaXplZDYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkU3luY2hyb25pemVkNiB7Ci0Jdm9pZCBmb28oKSB7Ci0JCWlmKHN5bgotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3luY2hyb25pemVkNy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN5bmNocm9uaXplZDcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgwM2FlNy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3luY2hyb25pemVkNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRTeW5jaHJvbml6ZWQ3IHsKLQlzeW4KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3luY2hyb25pemVkOC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN5bmNocm9uaXplZDguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk5N2YyZi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3luY2hyb25pemVkOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRTeW5jaHJvbml6ZWQ4IHsKLQl2b2xhdGlsZSBzeW4KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3luY2hyb25pemVkOS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFN5bmNocm9uaXplZDkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NjN2IyYi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkU3luY2hyb25pemVkOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRTeW5jaHJvbml6ZWQ5IHsKLQlwdWJsaWMgc3luCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRoaXMxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhpczEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM0YTY3Mi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhpczEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkVGhpczEgewotCXZvaWQgZm9vKCkgewotCQl0aGkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRoaXMxMC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRoaXMxMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTc3OTQ4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUaGlzMTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIwotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkVGhpczEwIHsKLQl0aGkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhpczExLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhpczExLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYjNhNDcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRoaXMxMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRUaGlzMTEgewotCXsKLQkJIwotCQl0aGkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRoaXMxMi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRoaXMxMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjkwNDE2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUaGlzMTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkVGhpczEyIHsKLQlzdGF0aWMgdm9pZCBmb28oKSB7Ci0JCSMKLQkJdGhpCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUaGlzMTMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUaGlzMTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcxMTI1MC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhpczEzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFRoaXMxMyB7Ci0Jdm9pZCBmb28oKSB7Ci0JCSMKLQkJQ29tcGxldGlvbktleXdvcmRUaGlzMTMudGhpCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUaGlzMTQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUaGlzMTQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJmMmFjNS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhpczE0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFRoaXMxNCB7Ci0Jc3RhdGljIHZvaWQgZm9vKCkgewotCQkjCi0JCUNvbXBsZXRpb25LZXl3b3JkVGhpczE0LnRoaQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhpczIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUaGlzMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTJmYmM2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUaGlzMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRUaGlzMiB7Ci0Jdm9pZCBmb28oKSB7Ci0JCWlmKHRoaQkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRoaXMzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhpczMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFkYzdiMC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhpczMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkVGhpczMgewotCXRoaQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUaGlzNC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRoaXM0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NzBjMWMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRoaXM0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFRoaXM0IHsKLQl7Ci0JCXRoaQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhpczUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUaGlzNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDNmNDg5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUaGlzNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRUaGlzNSB7Ci0Jc3RhdGljIHZvaWQgZm9vKCkgewotCQl0aGkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRoaXM2LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhpczYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhjNTNiZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhpczYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkVGhpczYgewotCXZvaWQgZm9vKCkgewotCQlDb21wbGV0aW9uS2V5d29yZFRoaXM2LnRoaQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhpczcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUaGlzNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzVkYzIwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUaGlzNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRUaGlzNyB7Ci0Jc3RhdGljIHZvaWQgZm9vKCkgewotCQlDb21wbGV0aW9uS2V5d29yZFRoaXM3LnRoaQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhpczguamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUaGlzOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDQzZGUyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUaGlzOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRUaGlzOCB7Ci0Jdm9pZCBmb28oKSB7Ci0JCSMKLQkJdGhpCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUaGlzOS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRoaXM5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNDQ3ODcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRoaXM5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFRoaXM5IHsKLQl2b2lkIGZvbygpIHsKLQkJIwotCQlpZih0aGkJCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUaHJvdzEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUaHJvdzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2ZjU1Yi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhyb3cxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFRocm93MSB7Ci0Jdm9pZCBmb28oKSB7Ci0JCXRocgotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhyb3cyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhyb3cyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNTI3OGQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRocm93Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRUaHJvdzIgewotCXZvaWQgZm9vKCkgewotCQlpZih0aHIKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRocm93My5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRocm93My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2U5ZDM5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUaHJvdzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkVGhyb3czIHsKLQl0aHIKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhyb3c0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhyb3c0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNjQxYTEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRocm93NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRUaHJvdzQgewotCXZvaWQgZm9vKCkgewotCQkjCi0JCXRocgotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhyb3c1LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhyb3c1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YTkyMDMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRocm93NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRUaHJvdzUgewotCXZvaWQgZm9vKCkgewotCQkjCi0JCWlmKHRocgotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhyb3c2LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhyb3c2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YWQ5ZjQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRocm93Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRUaHJvdzYgewotCXRocgotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUaHJvd3MxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhyb3dzMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGY0ZjBiLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUaHJvd3MxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFRocm93czEgewotCXZvaWQgZm9vKCkgdGhybyB7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUaHJvd3MyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhyb3dzMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmIwZDg5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUaHJvd3MyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFRocm93czIgewotCXZvaWQgZm9vKCkgdGhyb3cgRXhjZXB0aW9uIHRocm8gewotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhyb3dzMy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRocm93czMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQzYTA1ZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhyb3dzMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRUaHJvd3MzIHsKLQlpbnQgZm9vKClbXSB0aHJvIHsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRocm93czQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUaHJvd3M0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ODIzNDQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRocm93czQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkVGhyb3dzNCB7Ci0JcHVibGljIENvbXBsZXRpb25LZXl3b3JkVGhyb3dzNCgpIHRocm8gewotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhyb3dzNS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRocm93czUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIxZDEwMS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhyb3dzNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRUaHJvd3M1IHsKLQl2b2lkIGZvbygpIHRocm8gewotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhyb3dzNi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRocm93czYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JjYzdkYi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhyb3dzNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRUaHJvd3M2IHsKLQl2b2lkIGZvbygpIHRocm93IEV4Y2VwdGlvbiB0aHJvIHsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRocm93czcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUaHJvd3M3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MWU0NTMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRocm93czcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIwotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkVGhyb3dzNyB7Ci0JaW50IGZvbygpW10gdGhybyB7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUaHJvd3M4LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVGhyb3dzOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjI2MWQ2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUaHJvd3M4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFRocm93czggewotCXB1YmxpYyBDb21wbGV0aW9uS2V5d29yZFRocm93czgoKSB0aHJvIHsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRyYW5zaWVudDEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUcmFuc2llbnQxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYjgzZWEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRyYW5zaWVudDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkVHJhbnNpZW50MSB7Ci0JdHJhbgotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUcmFuc2llbnQyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVHJhbnNpZW50Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTcxOGM1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUcmFuc2llbnQyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFRyYW5zaWVudDIgewotCW5hdGl2ZSB0cmFuCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRyYW5zaWVudDMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUcmFuc2llbnQzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjM2I4NmMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRyYW5zaWVudDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkVHJhbnNpZW50MyB7Ci0JcHVibGljIHRyYW4KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVHJhbnNpZW50NC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRyYW5zaWVudDQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJiYmMwZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVHJhbnNpZW50NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRUcmFuc2llbnQ0IHsKLQlhYnN0cmFjdCB0cmFuCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRyYW5zaWVudDUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUcmFuc2llbnQ1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYWU2ZTcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRyYW5zaWVudDUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIwotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkVHJhbnNpZW50NSB7Ci0JdHJhbgotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUcmFuc2llbnQ2LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVHJhbnNpZW50Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTFjODY1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUcmFuc2llbnQ2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFRyYW5zaWVudDYgewotCW5hdGl2ZSB0cmFuCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRyYW5zaWVudDcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUcmFuc2llbnQ3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNmVmODMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRyYW5zaWVudDcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIwotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkVHJhbnNpZW50NyB7Ci0JcHVibGljIHRyYW4KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVHJhbnNpZW50OC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRyYW5zaWVudDguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFlMzc2ZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVHJhbnNpZW50OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRUcmFuc2llbnQ4IHsKLQlhYnN0cmFjdCB0cmFuCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRydWUxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVHJ1ZTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhMDVlYy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVHJ1ZTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkVHJ1ZTEgewotCXZvaWQgZm9vKCkgewotCQl0cnUKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRydWUyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVHJ1ZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlkYmZkYi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVHJ1ZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkVHJ1ZTIgewotCXZvaWQgZm9vKCkgewotCQlpZih0cnUKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRydWUzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVHJ1ZTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU5N2JhMi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVHJ1ZTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkVHJ1ZTMgewotCXZvaWQgZm9vKCkgewotCQkjCi0JCXRydQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVHJ1ZTQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUcnVlNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTk0NjQ1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUcnVlNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRUcnVlNCB7Ci0Jdm9pZCBmb28oKSB7Ci0JCSMKLQkJaWYodHJ1Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUcnkxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVHJ5MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDlmOWUyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUcnkxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFRyeTEgewotCXZvaWQgZm9vKCkgewotCQl0cgotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVHJ5Mi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRyeTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY1MTM1MS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVHJ5Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRUcnkyIHsKLQl2b2lkIGZvbygpIHsKLQkJaWYodHIKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRyeTMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUcnkzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxN2IyYzQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRyeTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkVHJ5MyB7Ci0JdHJ5Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRyeTQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUcnk0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4OGE0YjUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRyeTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkVHJ5NCB7Ci0Jdm9pZCBmb28oKSB7Ci0JCSMKLQkJdHIKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRyeTUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUcnk1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NWM0MmYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRyeTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkVHJ5NSB7Ci0Jdm9pZCBmb28oKSB7Ci0JCSMKLQkJaWYodHIKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRyeTYuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRUcnk2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNTU4ZTQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFRyeTYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIwotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkVHJ5NiB7Ci0JdHJ5Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFZvbGF0aWxlMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFZvbGF0aWxlMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjkwNWU3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRWb2xhdGlsZTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkVm9sYXRpbGUxIHsKLQl2b2wKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVm9sYXRpbGUyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVm9sYXRpbGUyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZTNkYjEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFZvbGF0aWxlMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRWb2xhdGlsZTIgewotCW5hdGl2ZSB2b2wKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVm9sYXRpbGUzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVm9sYXRpbGUzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMDViMzcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFZvbGF0aWxlMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRWb2xhdGlsZTMgewotCXB1YmxpYyB2b2wKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVm9sYXRpbGU0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVm9sYXRpbGU0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNWMxY2IuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFZvbGF0aWxlNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRWb2xhdGlsZTQgewotCWFic3RyYWN0IHZvbAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRWb2xhdGlsZTUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRWb2xhdGlsZTUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0NDQ4My4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkVm9sYXRpbGU1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFZvbGF0aWxlNSB7Ci0Jdm9sCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFZvbGF0aWxlNi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFZvbGF0aWxlNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWYyMzc5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRWb2xhdGlsZTYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIwotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkVm9sYXRpbGU2IHsKLQluYXRpdmUgdm9sCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFZvbGF0aWxlNy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFZvbGF0aWxlNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGZmOWZjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRWb2xhdGlsZTcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIwotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkVm9sYXRpbGU3IHsKLQlwdWJsaWMgdm9sCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFZvbGF0aWxlOC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFZvbGF0aWxlOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWJmZDI1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRWb2xhdGlsZTguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIwotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkVm9sYXRpbGU4IHsKLQlhYnN0cmFjdCB2b2wKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkV2hpbGUxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkV2hpbGUxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMWY5NWMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFdoaWxlMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRXaGlsZTEgewotCXZvaWQgZm9vKCkgewotCQl3aAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkV2hpbGUxMC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFdoaWxlMTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTViMzlkYS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkV2hpbGUxMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRXaGlsZTEwIHsKLQlpbnQgd2hpbGV6OwotCXZvaWQgZm9vKCl7Ci0JCSMKLQkJZG8gewotCQl9IHdoCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRXaGlsZTIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRXaGlsZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M3Y2QxMC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkV2hpbGUyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFdoaWxlMiB7Ci0Jdm9pZCBmb28oKSB7Ci0JCWlmKHdoCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRXaGlsZTMuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRXaGlsZTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIwZDBjMS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkV2hpbGUzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFdoaWxlMyB7Ci0Jd2gKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkV2hpbGU0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkV2hpbGU0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMzIyZWQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFdoaWxlNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRXaGlsZTQgewotCXZvaWQgZm9vKCl7Ci0JCWRvIHsKLQkJfSB3aAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkV2hpbGU1LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkV2hpbGU1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYmQ4ZWEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFdoaWxlNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRXaGlsZTUgewotCWludCB3aGlsZXo7Ci0Jdm9pZCBmb28oKXsKLQkJZG8gewotCQl9IHdoCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRXaGlsZTYuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRXaGlsZTYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ1ODRlMC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkV2hpbGU2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFdoaWxlNiB7Ci0Jdm9pZCBmb28oKSB7Ci0JCSMKLQkJd2gKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFdoaWxlNy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFdoaWxlNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzQ4YzRiLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRXaGlsZTcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkV2hpbGU3IHsKLQl2b2lkIGZvbygpIHsKLQkJIwotCQlpZih3aAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkV2hpbGU4LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL0NvbXBsZXRpb25LZXl3b3JkV2hpbGU4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMzBmNTYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFdoaWxlOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jCi1wdWJsaWMgY2xhc3MgQ29tcGxldGlvbktleXdvcmRXaGlsZTggewotCXdoCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFdoaWxlOS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9Db21wbGV0aW9uS2V5d29yZFdoaWxlOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjE1Mjc3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvQ29tcGxldGlvbktleXdvcmRXaGlsZTkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkV2hpbGU5IHsKLQl2b2lkIGZvbygpewotCQkjCi0JCWRvIHsKLQkJfSB3aAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL3AvQ29tcGxldGlvbktleXdvcmRJbXBvcnQyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL3AvQ29tcGxldGlvbktleXdvcmRJbXBvcnQyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYWEyNGIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9wL0NvbXBsZXRpb25LZXl3b3JkSW1wb3J0Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wYWNrYWdlIHA7Ci1pbXAKLQotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkSW1wb3J0MiB7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL3AvQ29tcGxldGlvbktleXdvcmRJbXBvcnQ4LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL3AvQ29tcGxldGlvbktleXdvcmRJbXBvcnQ4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZmZiMTguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9wL0NvbXBsZXRpb25LZXl3b3JkSW1wb3J0OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jCi1wYWNrYWdlIHA7Ci1pbXAKLQotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkSW1wb3J0OCB7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL3AvQ29tcGxldGlvbktleXdvcmRQYWNrYWdlMi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24vc3JjMi9wL0NvbXBsZXRpb25LZXl3b3JkUGFja2FnZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY0NzM2ZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL3AvQ29tcGxldGlvbktleXdvcmRQYWNrYWdlMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIHA7Ci1wYWMKLXB1YmxpYyBjbGFzcyBDb21wbGV0aW9uS2V5d29yZFBhY2thZ2UyIHsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvcC9Db21wbGV0aW9uS2V5d29yZFBhY2thZ2U4LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi9zcmMyL3AvQ29tcGxldGlvbktleXdvcmRQYWNrYWdlOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZThkODk4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3NyYzIvcC9Db21wbGV0aW9uS2V5d29yZFBhY2thZ2U4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMKLXBhY2thZ2UgcDsKLXBhYwotcHVibGljIGNsYXNzIENvbXBsZXRpb25LZXl3b3JkUGFja2FnZTggewotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24venp6LmphciBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3p6ei5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhY2E1YjEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbXBsZXRpb24venp6LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3p6enNyYy56aXAgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29tcGxldGlvbi96enpzcmMuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTA4Y2NiLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db21wbGV0aW9uL3p6enNyYy56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyLy5jbGFzc3BhdGggYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MzIzNmMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJKQ0xfTElCIiBzb3VyY2VwYXRoPSJKQ0xfU1JDIiByb290cGF0aD0iSkNMX1NSQ1JPT1QiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJDT05WRVJURVJfSkNMX0xJQiIgc291cmNlcGF0aD0iQ09OVkVSVEVSX0pDTF9TUkMiIHJvb3RwYXRoPSJDT05WRVJURVJfSkNMX1NSQ1JPT1QiLz4gICAgCi0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDVjZTczLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL0hlbGxvLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL0hlbGxvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMWFkMDcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9IZWxsby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotdm9pZCBfX19ldmFsKCkgewotCW5ldyBSdW5uYWJsZSgpIHsKLQkJdm9pZCBfX19ydW4oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJCXJldHVybiBibGFoOwotCQl9Ci0JCXByaXZhdGUgU3RyaW5nIGJsYXJnOwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCX0KLQl9OwotfQotcHVibGljIGNsYXNzIEhlbGxvIHsKLQlwcml2YXRlIHN0YXRpYyBpbnQgeDsKLQlwcml2YXRlIFN0cmluZyBibGFoOwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQl9Ci0JcHVibGljIHZvaWQgaGVsbG8oKSB7Ci0JfQotCXB1YmxpYyBib29sZWFuIGJsYWgoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcHVibGljIHZvaWQgZm9vKCkgewotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL05PX1dPUktJTkcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvTk9fV09SS0lORy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjUxNmFmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvTk9fV09SS0lORy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wdWJsaWMgY2xhc3MgTk9fV09SS0lORyB7Ci0KLSAgICBwdWJsaWMgdm9pZCBtZXRob2QoKSB7IH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL1Rlc3QwMTU3LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL1Rlc3QwMTU3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNWExZDIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9UZXN0MDE1Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1pbXBvcnQgamF2YS51dGlsLio7Ci1jbGFzcyBUZXN0MDE1NyB7Ci0JaW50W10gdGFiOwotCVN0cmluZ1tdIHQ7Ci0JVGVzdDAxNTdbXSB0MjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL1Rlc3QwMTU4LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL1Rlc3QwMTU4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNzIxMzEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9UZXN0MDE1OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1pbXBvcnQgamF2YS51dGlsLio7Ci1jbGFzcyBUZXN0MDE1OCB7Ci0JVGVzdDAxNThbXSB0MjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL1Rlc3QwMTcwLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL1Rlc3QwMTcwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMDEyODMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9UZXN0MDE3MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1pbXBvcnQgamF2YS51dGlsLio7Ci1jbGFzcyBUZXN0MDE3MCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9UZXN0NDYyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL1Rlc3Q0NjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdiYTEzMi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL1Rlc3Q0NjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotcHVibGljIGludGVyZmFjZSBUZXN0NDYyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2NvZGVNYW5pcHVsYXRpb24vYnVnLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2NvZGVNYW5pcHVsYXRpb24vYnVnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYzY1MWYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9jb2RlTWFuaXB1bGF0aW9uL2J1Zy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotcGFja2FnZSBjb2RlTWFuaXB1bGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgYnVnIHsKLQlzdGF0aWMgcHJpdmF0ZSBpbnQgZHVtbXlGY3QzKCkgewotCQlyZXR1cm4gMzsJCi0JfQkKLQlzdGF0aWMgcHJpdmF0ZSBpbnQgZHVtbXlGY3QyKCkgewotCQlyZXR1cm4gMzsJCi0JfQkJCi0Jc3RhdGljIHByaXZhdGUgdm9pZCBwaXBvICgpIHsKLQkJaW50IHogPSBidWcuZHVtbXlGY3QzKCkseT1idWcuZHVtbXlGY3QyKCk7Ci0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9leGFtcGxlcy5vbmVvZmVhY2gvQVNUUG9zdGVyQ2hpbGQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvZXhhbXBsZXMub25lb2ZlYWNoL0FTVFBvc3RlckNoaWxkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNTVhYTguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9leGFtcGxlcy5vbmVvZmVhY2gvQVNUUG9zdGVyQ2hpbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3JwLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIFN5bnRhY3RpY2FsbHkgY29ycmVjdCBKYXZhIHByb2dyYW0gY29udGFpbmluZyBhdCBsZWFzdCBhbiBpbnN0YW5jZSBvZiAKLSAqIGVhY2ggZGlmZmVyZW50IGtpbmQgb2YgY29uc3RydWN0IGluIHRoZSBKYXZhIGxhbmd1YWdlICgxLjQpLgotICovCi0vLyBQYWNrYWdlRGVjbGFyYXRpb24KLXBhY2thZ2UgZXhhbXBsZXMub25lb2ZlYWNoOwotCi0vLyBJbXBvcnREZWNsYXJhdGlvbiAoc2luZ2xlLXR5cGUpCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0vLyBJbXBvcnREZWNsYXJhdGlvbiAob24tZGVtYW5kKQotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIFR5cGVEZWNsYXJhdGlvbiAoY2xhc3MpCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBU1RQb3N0ZXJDaGlsZCBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgCi0JaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIEFTVFBvc3RlckludGVyZmFjZSB7Ci0KLQkvKioKLQkgKiBGaWVsZERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIHRyYW5zaWVudCBib29sZWFuW10gZjEgPSB7dHJ1ZSwgZmFsc2V9OwotCQotCS8vIEluaXRpYWxpemVyCi0JewotCQlmMSA9IG51bGw7Ci0JfQkKLQkKLQkvKioKLQkgKiBNZXRob2REZWNsYXJhdGlvbiAoY29uc3RydWN0b3IpCi0JICovCi0JQVNUUG9zdGVyQ2hpbGQoKSB7Ci0JCS8vIENvbnN0cnVjdG9ySW52b2NhdGlvbgotCQl0aGlzKHRydWUpOwotCX0JCi0KLQkvKioKLQkgKiBNZXRob2REZWNsYXJhdGlvbiAoY29uc3RydWN0b3IpCi0JICovCi0JQVNUUG9zdGVyQ2hpbGQoYm9vbGVhbiBmbGFnKSB7Ci0JCS8vIFN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uCi0JCXN1cGVyKCk7Ci0JfQkKLQotCS8qKgotCSAqIE1ldGhvZERlY2xhcmF0aW9uIChtZXRob2QpCi0JICovCi0JcHVibGljIHZvaWQgb3AoKSB7Ci0KLQkJLy8gUHJpbWl0aXZlVHlwZSwgTnVtYmVyTGl0ZXJhbAotCQlieXRlIGEgPSAwOwotCQkvLyBCb29sZWFuTGl0ZXJhbAotCQlib29sZWFuIGIgPSB0cnVlOwotCQkvLyBDaGFyYWN0ZXJMaXRlcmFsCi0JCWNoYXIgYyA9ICd4JzsKLQkJc2hvcnQgcyA9IDE7Ci0JCWxvbmcgbCA9IDFMOwotCQlmbG9hdCBmID0gMS4wZjsKLQkJZG91YmxlIGQgPSAxZTY7Ci0JCS8vIFNpbXBsZVR5cGUsIFN0cmluZ0xpdGVyYWwKLQkJU3RyaW5nIHogPSAiaGVsbG8iOy8vJE5PTi1OTFMtMSQKLQkJLy8gTnVsbExpdGVyYWwKLQkJVmVjdG9yIG8xID0gbnVsbDsKLQkJLy8gQXJyYXlUeXBlLCBBcnJheUluaXRpYWxpemVyCi0JCWludFtdIHQxID0gezF9OwotCQlpbnRbXVtdIHQyID0ge3sxLDJ9LCB7Myw0fX07Ci0JCWludFtdW11bXSB0MyA9IG51bGw7Ci0JCS8vIENsYXNzSW5zdGFuY2VDcmVhdGlvbgotCQlqYXZhLmxhbmcuT2JqZWN0IG8gPSBuZXcgT2JqZWN0KCk7Ci0JCS8vIEFycmF5Q3JlYXRpb24gKGluaXRpYWxpemVyKQotCQlPYmplY3RbXSBvMiA9IG5ldyBPYmplY3RbXXsiMCIsICIxIn07Ly8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJLy8gQXJyYXlDcmVhdGlvbiAoZGltZW5zaW9ucykKLQkJT2JqZWN0W11bXSBvMyA9IG5ldyBPYmplY3RbM11bXTsKLQkJLy8gQXNzaWdtZW50Ci0JCW8zID0gbnVsbDsKLQkJLy8gQXJyYXlBY2Nlc3MKLQkJT2JqZWN0IHgxID0gbzNbMF07Ci0JCS8vIENhc3RFeHByZXNzaW9uCi0JCU9iamVjdCB4MiA9IChPYmplY3QpIG8zOwotCQkvLyBDb25kaXRpb25hbEV4cHJlc3Npb24JCQkJCi0JCWludCB4MyA9IGIgPyAxIDogMjsKLQkJLy8gRmllbGRBY2Nlc3MKLQkJT2JqZWN0IHg0ID0gU3lzdGVtLm91dDsKLQkJLy8gSW5maXhFeHByZXNzaW9uCi0JCVN0cmluZyB4NSA9ICJhIiArICJiIjsvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkvLyBJbmZpeEV4cHJlc3Npb24gKGV4dGVuZGVkIG9wZXJhbmRzKQotCQlTdHJpbmcgeDYgPSAiYSIgKyAiYiIgKyAiYyIgKyAiZCI7Ly8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy00JAotCQkvLyBNZXRob2RJbnZvY2F0aW9uCi0JCW5vdGlmeUFsbCgpOwotCQkvLyBQYXJlbnRoZXNpemVkRXhwcmVzc2lvbgotCQlPYmplY3QgeDcgPSAoKG8pKTsKLQkJLy8gUG9zdGZpeEV4cHJlc3Npb24KLQkJbCsrOwotCQkvLyBQcmVmaXhFeHByZXNzaW9uCi0JCS0tbDsKLQkJLy8gVGhpc0V4cHJlc3Npb24KLQkJT2JqZWN0IHg4ID0gQVNUUG9zdGVyQ2hpbGQudGhpczsKLQkJLy8gVHlwZUxpdGVyYWwKLQkJT2JqZWN0IHg5ID0gdm9pZC5jbGFzczsKLQotCQkvLyBBc3NlcnRTdGF0ZW1lbnQKLQkJLy8gYXNzZXJ0IHRydWU6ICJ1bmhhcHB5IjsvLyROT04tTkxTLTEkCi0JCS8vIEJsb2NrCi0JCXt9Ci0JCS8vIERvU3RhdGVtZW50Ci0JCWRvIHsKLQkJfSB3aGlsZSAoZmFsc2UpOwotCQkvLyBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50Ci0JCWludCBpOwotCQkvLyBFeHByZXNzaW9uU3RhdGVtZW50Ci0JCWkgPSAxOwotCQkvLyBMYWJlbGVkU3RhdGVtZW50Ci0JCWxvb3Bpbmc6Ci0JCQkvLyBGb3JTdGF0ZW1lbnQsIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uCi0JCQlmb3IgKGludCBqPTA7IGo8MTA7IGorKykgewotCQkJCS8vIENvbnRpbnVlU3RhdGVtZW50Ci0JCQkJY29udGludWUgbG9vcGluZzsKLQkJCX0KLQkJLy8gSWZTdGF0ZW1lbnQKLQkJaWYgKGZhbHNlKSAKLQkJCVN5c3RlbS5leGl0KDApOwotCQllbHNlIAotCQkJaSsrOwotCQkvLyBTd2l0Y2hTdGF0ZW1lbnQKLQkJc3dpdGNoICgyKSB7Ci0JCQkvLyBTd2l0Y2hDYXNlCi0JCQljYXNlIDI6Ci0JCQkJLy8gQnJlYWtTdGF0ZW1lbnQKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJLy8gRW1wdHlTdGF0ZW1lbnQKLQkJCQk7Ci0JCX0KLQkJLy8gU3luY2hyb25pemVkU3RhdGVtZW50Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQl9Ci0JCS8vIFRyeVN0YXRlbWVudAotCQl0cnkgewotCQkJLy8gVGhyb3dTdGF0ZW1lbnQKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSAvLyBDYXRjaENsYXVzZQotCQl7Ci0JCX0gZmluYWxseSB7Ci0JCX0KLQotCQkvLyBUeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQKLQkJYWJzdHJhY3QgY2xhc3MgWCB7Ci0JCQlpbnQgZjsKLQkJCXZvaWQgbSgpIHsKLQkJCX0KLQkJfQotCQkvLyBDbGFzc0luc3RhbmNlQ3JlYXRpb24gKHdpdGggYm9keSBkZWNsYXJhdGlvbnMpCi0JCU9iamVjdCBhbm9uID0gbmV3IFgoKSB7Ci0JCQl2b2lkIG0oKSB7Ci0JCQkJLy8gU3VwZXJNZXRob2RJbnZvY2F0aW9uCi0JCQkJc3VwZXIubSgpOwotCQkJCS8vIFN1cGVyRmllbGRBY2Nlc3MKLQkJCQlzdXBlci5mID0gMTsKLQkJCX0KLQkJfTsKLQkJLy8gV2hpbGVTdGF0ZW1lbnQKLQkJYm9vbGVhbiBiMSA9IHRydWU7Ci0JCXdoaWxlIChiMSk7Ci0JCS8vIFJldHVyblN0YXRlbWVudDsKLQkJcmV0dXJuOwotCX0JCi0KLX0KLQotLyoqCi0gKiBUeXBlRGVjbGFyYXRpb24gKGludGVyZmFjZSkKLSAqLwotaW50ZXJmYWNlIEFTVFBvc3RlckludGVyZmFjZSB7Ci0KLQlTdHJpbmcgRk9PID0gImhpIjsvLyROT04tTkxTLTEkCi0Jdm9pZCBvcCgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9hd3R1aS9BYm91dERpYWxvZy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9hd3R1aS9BYm91dERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWU0NDEwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvYXd0dWkvQWJvdXREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLXBhY2thZ2UganVuaXQuYXd0dWk7Ci0KLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lio7Ci0KLWltcG9ydCBqdW5pdC5ydW5uZXIuVmVyc2lvbjsKLQotY2xhc3MgQWJvdXREaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCXB1YmxpYyBBYm91dERpYWxvZyhGcmFtZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJCi0JCXNldFJlc2l6YWJsZShmYWxzZSk7Ci0JCXNldExheW91dChuZXcgR3JpZEJhZ0xheW91dCgpKTsKLQkJc2V0U2l6ZSgzMzAsIDEzOCk7Ci0JCXNldFRpdGxlKCJBYm91dCIpOwotCQkKLQkJQnV0dG9uIGJ1dHRvbj0gbmV3IEJ1dHRvbigiQ2xvc2UiKTsKLQkJYnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKAotCQkJbmV3IEFjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JCQotCQlMYWJlbCBsYWJlbDE9IG5ldyBMYWJlbCgiSlVuaXQiKTsKLQkJbGFiZWwxLnNldEZvbnQobmV3IEZvbnQoImRpYWxvZyIsIEZvbnQuUExBSU4sIDM2KSk7Ci0JCQotCQlMYWJlbCBsYWJlbDI9IG5ldyBMYWJlbCgiSlVuaXQgIitWZXJzaW9uLmlkKCkrICIgYnkgS2VudCBCZWNrIGFuZCBFcmljaCBHYW1tYSIpOwotCQlsYWJlbDIuc2V0Rm9udChuZXcgRm9udCgiZGlhbG9nIiwgRm9udC5QTEFJTiwgMTQpKTsKLQkJCi0JCUxvZ28gbG9nbz0gbmV3IExvZ28oKTsKLQotCQlHcmlkQmFnQ29uc3RyYWludHMgY29uc3RyYWludHNMYWJlbDE9IG5ldyBHcmlkQmFnQ29uc3RyYWludHMoKTsKLQkJY29uc3RyYWludHNMYWJlbDEuZ3JpZHggPSAzOyBjb25zdHJhaW50c0xhYmVsMS5ncmlkeSA9IDA7Ci0JCWNvbnN0cmFpbnRzTGFiZWwxLmdyaWR3aWR0aCA9IDE7IGNvbnN0cmFpbnRzTGFiZWwxLmdyaWRoZWlnaHQgPSAxOwotCQljb25zdHJhaW50c0xhYmVsMS5hbmNob3IgPSBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSOwotCQlhZGQobGFiZWwxLCBjb25zdHJhaW50c0xhYmVsMSk7Ci0KLQkJR3JpZEJhZ0NvbnN0cmFpbnRzIGNvbnN0cmFpbnRzTGFiZWwyPSBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKCk7Ci0JCWNvbnN0cmFpbnRzTGFiZWwyLmdyaWR4ID0gMjsgY29uc3RyYWludHNMYWJlbDIuZ3JpZHkgPSAxOwotCQljb25zdHJhaW50c0xhYmVsMi5ncmlkd2lkdGggPSAyOyBjb25zdHJhaW50c0xhYmVsMi5ncmlkaGVpZ2h0ID0gMTsKLQkJY29uc3RyYWludHNMYWJlbDIuYW5jaG9yID0gR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUjsKLQkJYWRkKGxhYmVsMiwgY29uc3RyYWludHNMYWJlbDIpOwotCi0JCUdyaWRCYWdDb25zdHJhaW50cyBjb25zdHJhaW50c0J1dHRvbjE9IG5ldyBHcmlkQmFnQ29uc3RyYWludHMoKTsKLQkJY29uc3RyYWludHNCdXR0b24xLmdyaWR4ID0gMjsgY29uc3RyYWludHNCdXR0b24xLmdyaWR5ID0gMjsKLQkJY29uc3RyYWludHNCdXR0b24xLmdyaWR3aWR0aCA9IDI7IGNvbnN0cmFpbnRzQnV0dG9uMS5ncmlkaGVpZ2h0ID0gMTsKLQkJY29uc3RyYWludHNCdXR0b24xLmFuY2hvciA9IEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVI7Ci0JCWNvbnN0cmFpbnRzQnV0dG9uMS5pbnNldHM9IG5ldyBJbnNldHMoOCwgMCwgOCwgMCk7Ci0JCWFkZChidXR0b24sIGNvbnN0cmFpbnRzQnV0dG9uMSk7Ci0KLQkJR3JpZEJhZ0NvbnN0cmFpbnRzIGNvbnN0cmFpbnRzTG9nbzE9IG5ldyBHcmlkQmFnQ29uc3RyYWludHMoKTsKLQkJY29uc3RyYWludHNMb2dvMS5ncmlkeCA9IDI7IGNvbnN0cmFpbnRzTG9nbzEuZ3JpZHkgPSAwOwotCQljb25zdHJhaW50c0xvZ28xLmdyaWR3aWR0aCA9IDE7IGNvbnN0cmFpbnRzTG9nbzEuZ3JpZGhlaWdodCA9IDE7Ci0JCWNvbnN0cmFpbnRzTG9nbzEuYW5jaG9yID0gR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUjsKLQkJYWRkKGxvZ28sIGNvbnN0cmFpbnRzTG9nbzEpOwotCi0JCWFkZFdpbmRvd0xpc3RlbmVyKAotCQkJbmV3IFdpbmRvd0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7Ci0JCQkJCWRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvYXd0dWkvTG9nby5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9hd3R1aS9Mb2dvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1Y2FmYzguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9hd3R1aS9Mb2dvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi1wYWNrYWdlIGp1bml0LmF3dHVpOwotCi1pbXBvcnQgamF2YS5hd3QuKjsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS4qOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IGp1bml0LnJ1bm5lci5CYXNlVGVzdFJ1bm5lcjsKLQotcHVibGljIGNsYXNzIExvZ28gZXh0ZW5kcyBDYW52YXMgewotCXByaXZhdGUgSW1hZ2UgZkltYWdlOwotCXByaXZhdGUgaW50IGZXaWR0aDsKLQlwcml2YXRlIGludCBmSGVpZ2h0OwotCQotCXB1YmxpYyBMb2dvKCkgewotCQlmSW1hZ2U9IGxvYWRJbWFnZSgibG9nby5naWYiKTsKLQkJTWVkaWFUcmFja2VyIHRyYWNrZXI9IG5ldyBNZWRpYVRyYWNrZXIodGhpcyk7Ci0JICAJdHJhY2tlci5hZGRJbWFnZShmSW1hZ2UsIDApOwotCQl0cnkgewotCQkJdHJhY2tlci53YWl0Rm9yQWxsKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCQlpZiAoZkltYWdlICE9IG51bGwpIHsKLQkJCWZXaWR0aD0gZkltYWdlLmdldFdpZHRoKHRoaXMpOwotCQkJZkhlaWdodD0gZkltYWdlLmdldEhlaWdodCh0aGlzKTsKLQkJfSBlbHNlIHsKLQkJCWZXaWR0aD0gMjA7Ci0JCQlmSGVpZ2h0PSAyMDsKLQkJfQotCQlzZXRTaXplKGZXaWR0aCwgZkhlaWdodCk7Ci0JfQotCQotCXB1YmxpYyBJbWFnZSBsb2FkSW1hZ2UoU3RyaW5nIG5hbWUpIHsKLQkJVG9vbGtpdCB0b29sa2l0PSBUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCk7Ci0JCXRyeSB7Ci0JCQlVUkwgdXJsPSBCYXNlVGVzdFJ1bm5lci5jbGFzcy5nZXRSZXNvdXJjZShuYW1lKTsKLQkJCXJldHVybiB0b29sa2l0LmNyZWF0ZUltYWdlKChJbWFnZVByb2R1Y2VyKSB1cmwuZ2V0Q29udGVudCgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHBhaW50KEdyYXBoaWNzIGcpIHsKLQkJcGFpbnRCYWNrZ3JvdW5kKGcpOwotCQlpZiAoZkltYWdlICE9IG51bGwpCi0JCQlnLmRyYXdJbWFnZShmSW1hZ2UsIDAsIDAsIGZXaWR0aCwgZkhlaWdodCwgdGhpcyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHBhaW50QmFja2dyb3VuZCggamF2YS5hd3QuR3JhcGhpY3MgZykgewotCQlnLnNldENvbG9yKFN5c3RlbUNvbG9yLmNvbnRyb2wpOwotCQlnLmZpbGxSZWN0KDAsIDAsIGdldEJvdW5kcygpLndpZHRoLCBnZXRCb3VuZHMoKS5oZWlnaHQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L2F3dHVpL1Byb2dyZXNzQmFyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L2F3dHVpL1Byb2dyZXNzQmFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNzQyOTguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9hd3R1aS9Qcm9ncmVzc0Jhci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotcGFja2FnZSBqdW5pdC5hd3R1aTsKLQotaW1wb3J0IGphdmEuYXd0Lio7Ci0KLXB1YmxpYyBjbGFzcyBQcm9ncmVzc0JhciBleHRlbmRzIENhbnZhcyB7Ci0JcHVibGljIGJvb2xlYW4gZkVycm9yPSBmYWxzZTsKLQlwdWJsaWMgaW50IGZUb3RhbD0gMDsKLQlwdWJsaWMgaW50IGZQcm9ncmVzcz0gMDsKLQlwdWJsaWMgaW50IGZQcm9ncmVzc1g9IDA7Ci0KLQlwdWJsaWMgUHJvZ3Jlc3NCYXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFNpemUoMjAsIDMwKTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb2xvciBnZXRTdGF0dXNDb2xvcigpIHsKLQkJaWYgKGZFcnJvcikKLQkJCXJldHVybiBDb2xvci5yZWQ7Ci0JCXJldHVybiBDb2xvci5ncmVlbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZykgewotCQlwYWludEJhY2tncm91bmQoZyk7Ci0JCXBhaW50U3RhdHVzKGcpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwYWludEJhY2tncm91bmQoR3JhcGhpY3MgZykgewotCQlnLnNldENvbG9yKFN5c3RlbUNvbG9yLmNvbnRyb2wpOwotCQlSZWN0YW5nbGUgcj0gZ2V0Qm91bmRzKCk7Ci0JCWcuZmlsbFJlY3QoMCwgMCwgci53aWR0aCwgci5oZWlnaHQpOwotCQlnLnNldENvbG9yKENvbG9yLmRhcmtHcmF5KTsKLQkJZy5kcmF3TGluZSgwLCAwLCByLndpZHRoLTEsIDApOwotCQlnLmRyYXdMaW5lKDAsIDAsIDAsIHIuaGVpZ2h0LTEpOwotCQlnLnNldENvbG9yKENvbG9yLndoaXRlKTsKLQkJZy5kcmF3TGluZShyLndpZHRoLTEsIDAsIHIud2lkdGgtMSwgci5oZWlnaHQtMSk7Ci0JCWcuZHJhd0xpbmUoMCwgci5oZWlnaHQtMSwgci53aWR0aC0xLCByLmhlaWdodC0xKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcGFpbnRTdGF0dXMoR3JhcGhpY3MgZykgewotCQlnLnNldENvbG9yKGdldFN0YXR1c0NvbG9yKCkpOwotCQlSZWN0YW5nbGUgcj0gbmV3IFJlY3RhbmdsZSgwLCAwLCBmUHJvZ3Jlc3NYLCBnZXRCb3VuZHMoKS5oZWlnaHQpOwotCQlnLmZpbGxSZWN0KDEsIDEsIHIud2lkdGgtMSwgci5oZWlnaHQtMik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwYWludFN0ZXAoaW50IHN0YXJ0WCwgaW50IGVuZFgpIHsKLQkJcmVwYWludChzdGFydFgsIDEsIGVuZFgtc3RhcnRYLCBnZXRCb3VuZHMoKS5oZWlnaHQtMik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQlmUHJvZ3Jlc3NYPSAxOwotCQlmUHJvZ3Jlc3M9IDA7Ci0JCWZFcnJvcj0gZmFsc2U7Ci0JCXBhaW50KGdldEdyYXBoaWNzKCkpOwotCX0KLQkKLQlwdWJsaWMgaW50IHNjYWxlKGludCB2YWx1ZSkgewotCQlpZiAoZlRvdGFsID4gMCkKLQkJCXJldHVybiBNYXRoLm1heCgxLCB2YWx1ZSooZ2V0Qm91bmRzKCkud2lkdGgtMSkvZlRvdGFsKTsKLQkJcmV0dXJuIHZhbHVlOyAKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Qm91bmRzKGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKSB7Ci0JCXN1cGVyLnNldEJvdW5kcyh4LCB5LCB3LCBoKTsKLQkJZlByb2dyZXNzWD0gc2NhbGUoZlByb2dyZXNzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc3RhcnQoaW50IHRvdGFsKSB7Ci0JCWZUb3RhbD0gdG90YWw7Ci0JCXJlc2V0KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN0ZXAoYm9vbGVhbiBzdWNjZXNzZnVsKSB7Ci0JCWZQcm9ncmVzcysrOwotCQlpbnQgeD0gZlByb2dyZXNzWDsKLQotCQlmUHJvZ3Jlc3NYPSBzY2FsZShmUHJvZ3Jlc3MpOwotCi0JCWlmICghZkVycm9yICYmICFzdWNjZXNzZnVsKSB7Ci0JCQlmRXJyb3I9IHRydWU7Ci0JCQl4PSAxOwotCQl9Ci0JCXBhaW50U3RlcCh4LCBmUHJvZ3Jlc3NYKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9hd3R1aS9UZXN0UnVubmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L2F3dHVpL1Rlc3RSdW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFiOTQ5OS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L2F3dHVpL1Rlc3RSdW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4MSArMCwwIEBACi1wYWNrYWdlIGp1bml0LmF3dHVpOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQucnVubmVyLio7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS5hd3QuKjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC4qOwotaW1wb3J0IGphdmEuYXd0LmltYWdlLio7Ci1pbXBvcnQgamF2YS5pby4qOwotIAotLyoqCi0gKiBBbiBBV1QgYmFzZWQgdXNlciBpbnRlcmZhY2UgdG8gcnVuIHRlc3RzLgotICogRW50ZXIgdGhlIG5hbWUgb2YgYSBjbGFzcyB3aGljaCBlaXRoZXIgcHJvdmlkZXMgYSBzdGF0aWMKLSAqIHN1aXRlIG1ldGhvZCBvciBpcyBhIHN1YmNsYXNzIG9mIFRlc3RDYXNlLgotICogPHByZT4KLSAqIFN5bm9wc2lzOiBqYXZhIGp1bml0LmF3dHVpLlRlc3RSdW5uZXIgWy1ub2xvYWRpbmddIFtUZXN0Q2FzZV0KLSAqIDwvcHJlPgotICogVGVzdFJ1bm5lciB0YWtlcyBhcyBhbiBvcHRpb25hbCBhcmd1bWVudCB0aGUgbmFtZSBvZiB0aGUgdGVzdGNhc2UgY2xhc3MgdG8gYmUgcnVuLgotICovCi0gcHVibGljIGNsYXNzIFRlc3RSdW5uZXIgZXh0ZW5kcyBCYXNlVGVzdFJ1bm5lciB7Ci0JcHJvdGVjdGVkIEZyYW1lIGZGcmFtZTsKLQlwcm90ZWN0ZWQgVmVjdG9yIGZFeGNlcHRpb25zOwotCXByb3RlY3RlZCBWZWN0b3IgZkZhaWxlZFRlc3RzOwotCXByb3RlY3RlZCBUaHJlYWQgZlJ1bm5lcjsKLQlwcm90ZWN0ZWQgVGVzdFJlc3VsdCBmVGVzdFJlc3VsdDsKLQkKLQlwcm90ZWN0ZWQgVGV4dEFyZWEgZlRyYWNlQXJlYTsKLQlwcm90ZWN0ZWQgVGV4dEZpZWxkIGZTdWl0ZUZpZWxkOwotCXByb3RlY3RlZCBCdXR0b24gZlJ1bjsKLQlwcm90ZWN0ZWQgUHJvZ3Jlc3NCYXIgZlByb2dyZXNzSW5kaWNhdG9yOwotCXByb3RlY3RlZCBMaXN0IGZGYWlsdXJlTGlzdDsKLQlwcm90ZWN0ZWQgTG9nbyBmTG9nbzsKLQlwcm90ZWN0ZWQgTGFiZWwgZk51bWJlck9mRXJyb3JzOwotCXByb3RlY3RlZCBMYWJlbCBmTnVtYmVyT2ZGYWlsdXJlczsKLQlwcm90ZWN0ZWQgTGFiZWwgZk51bWJlck9mUnVuczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZRdWl0QnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZlJlcnVuQnV0dG9uOwotCXByb3RlY3RlZCBUZXh0RmllbGQgZlN0YXR1c0xpbmU7Ci0JcHJvdGVjdGVkIENoZWNrYm94IGZVc2VMb2FkaW5nUnVubmVyOwotCQotCXByb3RlY3RlZCBzdGF0aWMgRm9udCBQTEFJTl9GT05UPSBuZXcgRm9udCgiZGlhbG9nIiwgRm9udC5QTEFJTiwgMTIpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHQVA9IDQ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVSVRFX01FVEhPRE5BTUU9ICJzdWl0ZSI7Ci0JCi0JcHVibGljIFRlc3RSdW5uZXIoKSB7Ci0JfQotCSAKLQlwcml2YXRlIHZvaWQgYWJvdXQoKSB7Ci0JCUFib3V0RGlhbG9nIGFib3V0PSBuZXcgQWJvdXREaWFsb2coZkZyYW1lKTsKLQkJYWJvdXQuc2V0TW9kYWwodHJ1ZSk7Ci0JCWFib3V0LnNldExvY2F0aW9uKDMwMCwgMzAwKTsKLQkJYWJvdXQuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkRXJyb3IoVGVzdCB0ZXN0LCBUaHJvd2FibGUgdCkgewotCQlmTnVtYmVyT2ZFcnJvcnMuc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKGZUZXN0UmVzdWx0LmVycm9yQ291bnQoKSkpOwotCQlhcHBlbmRGYWlsdXJlKCJFcnJvciIsIHRlc3QsIHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEZhaWx1cmUoVGVzdCB0ZXN0LCBBc3NlcnRpb25GYWlsZWRFcnJvciB0KSB7Ci0JCWZOdW1iZXJPZkZhaWx1cmVzLnNldFRleHQoSW50ZWdlci50b1N0cmluZyhmVGVzdFJlc3VsdC5mYWlsdXJlQ291bnQoKSkpOwotCQlhcHBlbmRGYWlsdXJlKCJGYWlsdXJlIiwgdGVzdCwgdCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEdyaWQoUGFuZWwgcCwgQ29tcG9uZW50IGNvLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgZmlsbCwgZG91YmxlIHd4LCBpbnQgYW5jaG9yKSB7Ci0JCUdyaWRCYWdDb25zdHJhaW50cyBjPSBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKCk7Ci0JCWMuZ3JpZHg9IHg7IGMuZ3JpZHk9IHk7Ci0JCWMuZ3JpZHdpZHRoPSB3OwotCQljLmFuY2hvcj0gYW5jaG9yOwotCQljLndlaWdodHg9IHd4OwotCQljLmZpbGw9IGZpbGw7Ci0JCWlmIChmaWxsID09IEdyaWRCYWdDb25zdHJhaW50cy5CT1RIIHx8IGZpbGwgPT0gR3JpZEJhZ0NvbnN0cmFpbnRzLlZFUlRJQ0FMKQotCQkJYy53ZWlnaHR5PSAxLjA7Ci0JCWMuaW5zZXRzPSBuZXcgSW5zZXRzKHkgPT0gMCA/IEdBUCA6IDAsIHggPT0gMCA/IEdBUCA6IDAsIEdBUCwgR0FQKTsKLQkJcC5hZGQoY28sIGMpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYXBwZW5kRmFpbHVyZShTdHJpbmcga2luZCwgVGVzdCB0ZXN0LCBUaHJvd2FibGUgdCkgewotCQlraW5kKz0gIjogIiArIHRlc3Q7Ci0JCVN0cmluZyBtc2c9IHQuZ2V0TWVzc2FnZSgpOwotCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCWtpbmQrPSAiOiIgKyB0cnVuY2F0ZShtc2cpOyAKLQkJfQotCQlmRmFpbHVyZUxpc3QuYWRkKGtpbmQpOwotCQlmRXhjZXB0aW9ucy5hZGRFbGVtZW50KHQpOwotCQlmRmFpbGVkVGVzdHMuYWRkRWxlbWVudCh0ZXN0KTsKLQkJaWYgKGZGYWlsdXJlTGlzdC5nZXRJdGVtQ291bnQoKSA9PSAxKSB7Ci0JCQlmRmFpbHVyZUxpc3Quc2VsZWN0KDApOwotCQkJZmFpbHVyZVNlbGVjdGVkKCk7CQotCQl9Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIEpVbml0IG1lbnUuIENsaWVudHMgb3ZlcnJpZGUgdGhpcwotCSAqIG1ldGhvZCB0byBhZGQgYWRkaXRpb25hbCBtZW51IGl0ZW1zLgotCSAqLwotCXByb3RlY3RlZCBNZW51IGNyZWF0ZUpVbml0TWVudSgpIHsKLQkJTWVudSBtZW51PSBuZXcgTWVudSgiSlVuaXQiKTsKLQkJTWVudUl0ZW0gbWk9IG5ldyBNZW51SXRlbSgiQWJvdXQuLi4iKTsKLQkJbWkuYWRkQWN0aW9uTGlzdGVuZXIoCi0JCSAgICBuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0JCSAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCSAgICAgICAgICAgIGFib3V0KCk7Ci0JCSAgICAgICAgfQotCQkgICAgfQotCQkpOwotCQltZW51LmFkZChtaSk7Ci0JCQotCQltZW51LmFkZFNlcGFyYXRvcigpOwotCQltaT0gbmV3IE1lbnVJdGVtKCJFeGl0Iik7Ci0JCW1pLmFkZEFjdGlvbkxpc3RlbmVyKAotCQkgICAgbmV3IEFjdGlvbkxpc3RlbmVyKCkgewotCQkgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKLQkJICAgICAgICB9Ci0JCSAgICB9Ci0JCSk7Ci0JCW1lbnUuYWRkKG1pKTsKLQkJcmV0dXJuIG1lbnU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU1lbnVzKE1lbnVCYXIgbWIpIHsKLQkJbWIuYWRkKGNyZWF0ZUpVbml0TWVudSgpKTsKLQl9Ci0JcHJvdGVjdGVkIFRlc3RSZXN1bHQgY3JlYXRlVGVzdFJlc3VsdCgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0UmVzdWx0KCk7Ci0JfQotCQotCXByb3RlY3RlZCBGcmFtZSBjcmVhdGVVSShTdHJpbmcgc3VpdGVOYW1lKSB7CQotCQlGcmFtZSBmcmFtZT0gbmV3IEZyYW1lKCJKVW5pdCIpOwotCQlJbWFnZSBpY29uPSBsb2FkRnJhbWVJY29uKCk7CQotCQlpZiAoaWNvbiAhPSBudWxsKQotCQkJZnJhbWUuc2V0SWNvbkltYWdlKGljb24pOwotCi0JCWZyYW1lLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KDAsIDApKTsKLQkJZnJhbWUuc2V0QmFja2dyb3VuZChTeXN0ZW1Db2xvci5jb250cm9sKTsKLQkJZmluYWwgRnJhbWUgZmluYWxGcmFtZT0gZnJhbWU7Ci0JCQotCQlmcmFtZS5hZGRXaW5kb3dMaXN0ZW5lcigKLQkJCW5ldyBXaW5kb3dBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZSkgewotCQkJCQlmaW5hbEZyYW1lLmRpc3Bvc2UoKTsKLQkJCQkJU3lzdGVtLmV4aXQoMCk7Ci0JCQkJfQotCQkJfQotCQkpOyAKLQotCQlNZW51QmFyIG1iID0gbmV3IE1lbnVCYXIoKTsKLQkJY3JlYXRlTWVudXMobWIpOwotCQlmcmFtZS5zZXRNZW51QmFyKG1iKTsKLQkJCi0JCS8vLS0tLSBmaXJzdCBzZWN0aW9uCi0JCUxhYmVsIHN1aXRlTGFiZWw9IG5ldyBMYWJlbCgiVGVzdCBjbGFzcyBuYW1lOiIpOwotCi0JCWZTdWl0ZUZpZWxkPSBuZXcgVGV4dEZpZWxkKHN1aXRlTmFtZSAhPSBudWxsID8gc3VpdGVOYW1lIDogIiIpOwotCQlmU3VpdGVGaWVsZC5zZWxlY3RBbGwoKTsKLQkJZlN1aXRlRmllbGQucmVxdWVzdEZvY3VzKCk7Ci0JCWZTdWl0ZUZpZWxkLnNldEZvbnQoUExBSU5fRk9OVCk7Ci0JCWZTdWl0ZUZpZWxkLnNldENvbHVtbnMoNDApOwotCQlmU3VpdGVGaWVsZC5hZGRBY3Rpb25MaXN0ZW5lcigKLQkJCW5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotCQkJCQlydW5TdWl0ZSgpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQkJZlN1aXRlRmllbGQuYWRkVGV4dExpc3RlbmVyKAotCQkJbmV3IFRleHRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB0ZXh0VmFsdWVDaGFuZ2VkKFRleHRFdmVudCBlKSB7Ci0JCQkJCWZSdW4uc2V0RW5hYmxlZChmU3VpdGVGaWVsZC5nZXRUZXh0KCkubGVuZ3RoKCkgPiAwKTsKLQkJCQkJZlN0YXR1c0xpbmUuc2V0VGV4dCgiIik7Ci0JCQkJfQotCQkJfQotCQkpOwotCQlmUnVuPSBuZXcgQnV0dG9uKCJSdW4iKTsKLQkJZlJ1bi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZlJ1bi5hZGRBY3Rpb25MaXN0ZW5lcigKLQkJCW5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotCQkJCQlydW5TdWl0ZSgpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQkJYm9vbGVhbiB1c2VMb2FkZXI9IHVzZVJlbG9hZGluZ1Rlc3RTdWl0ZUxvYWRlcigpOwotCQlmVXNlTG9hZGluZ1J1bm5lcj0gbmV3IENoZWNrYm94KCJSZWxvYWQgY2xhc3NlcyBldmVyeSBydW4iLCB1c2VMb2FkZXIpOwotCQlpZiAoaW5WQUphdmEoKSkKLQkJCWZVc2VMb2FkaW5nUnVubmVyLnNldFZpc2libGUoZmFsc2UpOwotCQkJCi0JCS8vLS0tLSBzZWNvbmQgc2VjdGlvbgotCQlmUHJvZ3Jlc3NJbmRpY2F0b3I9IG5ldyBQcm9ncmVzc0JhcigpOwkKLQotCQkvLy0tLS0gdGhpcmQgc2VjdGlvbiAKLQkJZk51bWJlck9mRXJyb3JzPSBuZXcgTGFiZWwoIjAwMDAiLCBMYWJlbC5SSUdIVCk7Ci0JCWZOdW1iZXJPZkVycm9ycy5zZXRUZXh0KCIwIik7Ci0JCWZOdW1iZXJPZkVycm9ycy5zZXRGb250KFBMQUlOX0ZPTlQpOwotCQotCQlmTnVtYmVyT2ZGYWlsdXJlcz0gbmV3IExhYmVsKCIwMDAwIiwgTGFiZWwuUklHSFQpOwotCQlmTnVtYmVyT2ZGYWlsdXJlcy5zZXRUZXh0KCIwIik7Ci0JCWZOdW1iZXJPZkZhaWx1cmVzLnNldEZvbnQoUExBSU5fRk9OVCk7Ci0JCi0JCWZOdW1iZXJPZlJ1bnM9IG5ldyBMYWJlbCgiMDAwMCIsIExhYmVsLlJJR0hUKTsKLQkJZk51bWJlck9mUnVucy5zZXRUZXh0KCIwIik7Ci0JCWZOdW1iZXJPZlJ1bnMuc2V0Rm9udChQTEFJTl9GT05UKTsKLQkKLQkJUGFuZWwgbnVtYmVyc1BhbmVsPSBuZXcgUGFuZWwobmV3IEZsb3dMYXlvdXQoKSk7Ci0JCW51bWJlcnNQYW5lbC5hZGQobmV3IExhYmVsKCJSdW5zOiIpKTsJCQludW1iZXJzUGFuZWwuYWRkKGZOdW1iZXJPZlJ1bnMpOwotCQludW1iZXJzUGFuZWwuYWRkKG5ldyBMYWJlbCgiICAgRXJyb3JzOiIpKTsJCW51bWJlcnNQYW5lbC5hZGQoZk51bWJlck9mRXJyb3JzKTsKLQkJbnVtYmVyc1BhbmVsLmFkZChuZXcgTGFiZWwoIiAgIEZhaWx1cmVzOiIpKTsJbnVtYmVyc1BhbmVsLmFkZChmTnVtYmVyT2ZGYWlsdXJlcyk7Ci0KLQkKLQkJLy8tLS0tIGZvdXJ0aCBzZWN0aW9uCi0JCUxhYmVsIGZhaWx1cmVMYWJlbD0gbmV3IExhYmVsKCJFcnJvcnMgYW5kIEZhaWx1cmVzOiIpOwotCQkKLQkJZkZhaWx1cmVMaXN0PSBuZXcgTGlzdCg1KTsKLQkJZkZhaWx1cmVMaXN0LmFkZEl0ZW1MaXN0ZW5lcigKLQkJCW5ldyBJdGVtTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaXRlbVN0YXRlQ2hhbmdlZChJdGVtRXZlbnQgZSkgewotCQkJCQlmYWlsdXJlU2VsZWN0ZWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JCWZSZXJ1bkJ1dHRvbj0gbmV3IEJ1dHRvbigiUnVuIik7Ci0JCWZSZXJ1bkJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZlJlcnVuQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKAotCQkJbmV3IEFjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXJlcnVuKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCi0JCVBhbmVsIGZhaWxlZFBhbmVsPSBuZXcgUGFuZWwobmV3IEdyaWRMYXlvdXQoMCwgMSwgMCwgMikpOwotCQlmYWlsZWRQYW5lbC5hZGQoZlJlcnVuQnV0dG9uKTsKLQkJCi0JCWZUcmFjZUFyZWE9IG5ldyBUZXh0QXJlYSgpOwotCQlmVHJhY2VBcmVhLnNldFJvd3MoNSk7Ci0JCWZUcmFjZUFyZWEuc2V0Q29sdW1ucyg2MCk7Ci0KLQkJLy8tLS0tIGZpZnRoIHNlY3Rpb24KLQkJZlN0YXR1c0xpbmU9IG5ldyBUZXh0RmllbGQoKTsKLQkJZlN0YXR1c0xpbmUuc2V0Rm9udChQTEFJTl9GT05UKTsKLQkJZlN0YXR1c0xpbmUuc2V0RWRpdGFibGUoZmFsc2UpOwotCQlmU3RhdHVzTGluZS5zZXRGb3JlZ3JvdW5kKENvbG9yLnJlZCk7Ci0KLQkJZlF1aXRCdXR0b249IG5ldyBCdXR0b24oIkV4aXQiKTsKLQkJZlF1aXRCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIoCi0JCQluZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLQkJCQkJU3lzdGVtLmV4aXQoMCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCQotCQkvLyAtLS0tLS0tLS0KLQkJZkxvZ289IG5ldyBMb2dvKCk7Ci0JCi0JCS8vLS0tLSBvdmVyYWxsIGxheW91dAotCQlQYW5lbCBwYW5lbD0gbmV3IFBhbmVsKG5ldyBHcmlkQmFnTGF5b3V0KCkpOwotCQotCQlhZGRHcmlkKHBhbmVsLCBzdWl0ZUxhYmVsLAkJIDAsIDAsIDIsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMLCAJMS4wLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCk7Ci0JCQotCQlhZGRHcmlkKHBhbmVsLCBmU3VpdGVGaWVsZCwgCSAwLCAxLCAyLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTCwgCTEuMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QpOwotCQlhZGRHcmlkKHBhbmVsLCBmUnVuLCAJCQkgMiwgMSwgMSwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwsIAkwLjAsIEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVIpOwotCQlhZGRHcmlkKHBhbmVsLCBmVXNlTG9hZGluZ1J1bm5lciwgMCwgMiwgMiwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwsIAkxLjAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUKTsKLQkJYWRkR3JpZChwYW5lbCwgZlByb2dyZXNzSW5kaWNhdG9yLCAwLCAzLCAyLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTCwgCTEuMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QpOwotCQlhZGRHcmlkKHBhbmVsLCBmTG9nbywgCQkJIDIsIDMsIDEsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FLCAJCQkwLjAsIEdyaWRCYWdDb25zdHJhaW50cy5OT1JUSCk7Ci0KLQkJYWRkR3JpZChwYW5lbCwgbnVtYmVyc1BhbmVsLAkgMCwgNCwgMiwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUsIAkJCTAuMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUik7Ci0KLQkJYWRkR3JpZChwYW5lbCwgZmFpbHVyZUxhYmVsLCAJIDAsIDUsIDIsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMLCAJMS4wLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCk7Ci0JCWFkZEdyaWQocGFuZWwsIGZGYWlsdXJlTGlzdCwgCSAwLCA2LCAyLCBHcmlkQmFnQ29uc3RyYWludHMuQk9USCwgCQkJMS4wLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCk7Ci0JCWFkZEdyaWQocGFuZWwsIGZhaWxlZFBhbmVsLCAJIDIsIDYsIDEsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMLCAJMC4wLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSKTsKLQkJYWRkR3JpZChwYW5lbCwgZlRyYWNlQXJlYSwgCSAgICAgMCwgNywgMiwgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgsIAkJCTEuMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QpOwotCQkKLQkJYWRkR3JpZChwYW5lbCwgZlN0YXR1c0xpbmUsIAkgMCwgOCwgMiwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwsIAkxLjAsIEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVIpOwotCQlhZGRHcmlkKHBhbmVsLCBmUXVpdEJ1dHRvbiwgCSAyLCA4LCAxLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTCwgCTAuMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUik7Ci0JCQotCQlmcmFtZS5hZGQocGFuZWwsIEJvcmRlckxheW91dC5DRU5URVIpOwotCQlmcmFtZS5wYWNrKCk7Ci0JCXJldHVybiBmcmFtZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZmFpbHVyZVNlbGVjdGVkKCkgewotCQlmUmVydW5CdXR0b24uc2V0RW5hYmxlZChpc0Vycm9yU2VsZWN0ZWQoKSk7Ci0JCXNob3dFcnJvclRyYWNlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZW5kVGVzdChUZXN0IHRlc3QpIHsKLQkJc2V0TGFiZWxWYWx1ZShmTnVtYmVyT2ZSdW5zLCBmVGVzdFJlc3VsdC5ydW5Db3VudCgpKTsKLQkJc3luY2hyb25pemVkKHRoaXMpIHsKLQkJCWZQcm9ncmVzc0luZGljYXRvci5zdGVwKGZUZXN0UmVzdWx0Lndhc1N1Y2Nlc3NmdWwoKSk7Ci0JCX0KLQl9Ci0JCQotCXByaXZhdGUgYm9vbGVhbiBpc0Vycm9yU2VsZWN0ZWQoKSB7Ci0JCXJldHVybiBmRmFpbHVyZUxpc3QuZ2V0U2VsZWN0ZWRJbmRleCgpICE9IC0xOwotCX0KLQkKLQlwcml2YXRlIEltYWdlIGxvYWRGcmFtZUljb24oKSB7Ci0JCVRvb2xraXQgdG9vbGtpdD0gVG9vbGtpdC5nZXREZWZhdWx0VG9vbGtpdCgpOwotCQl0cnkgewotCQkJamF2YS5uZXQuVVJMIHVybD0gQmFzZVRlc3RSdW5uZXIuY2xhc3MuZ2V0UmVzb3VyY2UoInNtYWxsbG9nby5naWYiKTsKLQkJCXJldHVybiB0b29sa2l0LmNyZWF0ZUltYWdlKChJbWFnZVByb2R1Y2VyKSB1cmwuZ2V0Q29udGVudCgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBUaHJlYWQgZ2V0UnVubmVyKCkgewotCQlyZXR1cm4gZlJ1bm5lcjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQluZXcgVGVzdFJ1bm5lcigpLnN0YXJ0KGFyZ3MpOwotCX0KLQkgCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1bihDbGFzcyB0ZXN0KSB7Ci0JCVN0cmluZyBhcmdzW109IHsgdGVzdC5nZXROYW1lKCkgfTsJCi0JCW1haW4oYXJncyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlcnVuKCkgewotCQlpbnQgaW5kZXg9IGZGYWlsdXJlTGlzdC5nZXRTZWxlY3RlZEluZGV4KCk7Ci0JCWlmIChpbmRleCA9PSAtMSkKLQkJCXJldHVybjsKLQkKLQkJVGVzdCB0ZXN0PSAoVGVzdClmRmFpbGVkVGVzdHMuZWxlbWVudEF0KGluZGV4KTsKLQkJaWYgKCEodGVzdCBpbnN0YW5jZW9mIFRlc3RDYXNlKSkgewotCQkJc2hvd0luZm8oIkNvdWxkIG5vdCByZWxvYWQgIisgdGVzdC50b1N0cmluZygpKTsKLQkJCXJldHVybjsKLQkJfQotCQlUZXN0IHJlbG9hZGVkVGVzdD0gbnVsbDsKLQkJdHJ5IHsKLQkJCUNsYXNzIHJlbG9hZGVkVGVzdENsYXNzPSBnZXRMb2FkZXIoKS5yZWxvYWQodGVzdC5nZXRDbGFzcygpKTsKLQkJCUNsYXNzW10gY2xhc3NBcmdzPSB7IFN0cmluZy5jbGFzcyB9OwotCQkJQ29uc3RydWN0b3IgY29uc3RydWN0b3I9IHJlbG9hZGVkVGVzdENsYXNzLmdldENvbnN0cnVjdG9yKGNsYXNzQXJncyk7Ci0JCQlPYmplY3RbXSBhcmdzPSBuZXcgT2JqZWN0W117KChUZXN0Q2FzZSl0ZXN0KS5nZXROYW1lKCl9OwotCQkJcmVsb2FkZWRUZXN0PShUZXN0KWNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKGFyZ3MpOwotCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQlzaG93SW5mbygiQ291bGQgbm90IHJlbG9hZCAiKyB0ZXN0LnRvU3RyaW5nKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVRlc3RSZXN1bHQgcmVzdWx0PSBuZXcgVGVzdFJlc3VsdCgpOwotCQlyZWxvYWRlZFRlc3QucnVuKHJlc3VsdCk7Ci0JCQotCQlTdHJpbmcgbWVzc2FnZT0gcmVsb2FkZWRUZXN0LnRvU3RyaW5nKCk7Ci0JCWlmKHJlc3VsdC53YXNTdWNjZXNzZnVsKCkpCi0JCQlzaG93SW5mbyhtZXNzYWdlKyIgd2FzIHN1Y2Nlc3NmdWwiKTsKLQkJZWxzZSBpZiAocmVzdWx0LmVycm9yQ291bnQoKSA9PSAxKQotCQkJc2hvd1N0YXR1cyhtZXNzYWdlKyIgaGFkIGFuIGVycm9yIik7Ci0JCWVsc2UKLQkJCXNob3dTdGF0dXMobWVzc2FnZSsiIGhhZCBhIGZhaWx1cmUiKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7Ci0JCXNldExhYmVsVmFsdWUoZk51bWJlck9mRXJyb3JzLCAwKTsKLQkJc2V0TGFiZWxWYWx1ZShmTnVtYmVyT2ZGYWlsdXJlcywgMCk7Ci0JCXNldExhYmVsVmFsdWUoZk51bWJlck9mUnVucywgMCk7Ci0JCWZQcm9ncmVzc0luZGljYXRvci5yZXNldCgpOwotCQlmUmVydW5CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWZGYWlsdXJlTGlzdC5yZW1vdmVBbGwoKTsKLQkJZkV4Y2VwdGlvbnM9IG5ldyBWZWN0b3IoMTApOwotCQlmRmFpbGVkVGVzdHM9IG5ldyBWZWN0b3IoMTApOwotCQlmVHJhY2VBcmVhLnNldFRleHQoIiIpOwotCi0JfQotCS8qKgotCSAqIHJ1bnMgYSBzdWl0ZS4KLQkgKiBAZGVwcmVjYXRlZCB1c2UgcnVuU3VpdGUoKSBpbnN0ZWFkCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlydW5TdWl0ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBydW5GYWlsZWQoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc2hvd1N0YXR1cyhtZXNzYWdlKTsKLQkJZlJ1bi5zZXRMYWJlbCgiUnVuIik7Ci0JCWZSdW5uZXI9IG51bGw7Ci0JfQotCQotCXN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCBydW5TdWl0ZSgpIHsKLQkJaWYgKGZSdW5uZXIgIT0gbnVsbCkgewotCQkJZlRlc3RSZXN1bHQuc3RvcCgpOwotCQl9IGVsc2UgewotCQkJc2V0TG9hZGluZyhzaG91bGRSZWxvYWQoKSk7Ci0JCQlmUnVuLnNldExhYmVsKCJTdG9wIik7Ci0JCQlzaG93SW5mbygiSW5pdGlhbGl6aW5nLi4uIik7Ci0JCQlyZXNldCgpOwotCQkJCi0JCQlzaG93SW5mbygiTG9hZCBUZXN0IENhc2UuLi4iKTsKLQotCQkJZmluYWwgVGVzdCB0ZXN0U3VpdGU9IGdldFRlc3QoZlN1aXRlRmllbGQuZ2V0VGV4dCgpKTsKLQkJCWlmICh0ZXN0U3VpdGUgIT0gbnVsbCkgewotCQkJCWZSdW5uZXI9IG5ldyBUaHJlYWQoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWZUZXN0UmVzdWx0PSBjcmVhdGVUZXN0UmVzdWx0KCk7Ci0JCQkJCQlmVGVzdFJlc3VsdC5hZGRMaXN0ZW5lcihUZXN0UnVubmVyLnRoaXMpOwotCQkJCQkJZlByb2dyZXNzSW5kaWNhdG9yLnN0YXJ0KHRlc3RTdWl0ZS5jb3VudFRlc3RDYXNlcygpKTsKLQkJCQkJCXNob3dJbmZvKCJSdW5uaW5nLi4uIik7Ci0JCQkJCQotCQkJCQkJbG9uZyBzdGFydFRpbWU9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQkJdGVzdFN1aXRlLnJ1bihmVGVzdFJlc3VsdCk7Ci0JCQkJCQkKLQkJCQkJCWlmIChmVGVzdFJlc3VsdC5zaG91bGRTdG9wKCkpIHsKLQkJCQkJCQlzaG93U3RhdHVzKCJTdG9wcGVkIik7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWxvbmcgZW5kVGltZT0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCQkJbG9uZyBydW5UaW1lPSBlbmRUaW1lLXN0YXJ0VGltZTsKLQkJCQkJCQlzaG93SW5mbygiRmluaXNoZWQ6ICIgKyBlbGFwc2VkVGltZUFzU3RyaW5nKHJ1blRpbWUpICsgIiBzZWNvbmRzIik7Ci0JCQkJCQl9Ci0JCQkJCQlmVGVzdFJlc3VsdD0gbnVsbDsKLQkJCQkJCWZSdW4uc2V0TGFiZWwoIlJ1biIpOwotCQkJCQkJZlJ1bm5lcj0gbnVsbDsKLQkJCQkJCVN5c3RlbS5nYygpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlmUnVubmVyLnN0YXJ0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZFJlbG9hZCgpIHsKLQkJcmV0dXJuICFpblZBSmF2YSgpICYmIGZVc2VMb2FkaW5nUnVubmVyLmdldFN0YXRlKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRMYWJlbFZhbHVlKExhYmVsIGxhYmVsLCBpbnQgdmFsdWUpIHsKLQkJbGFiZWwuc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKHZhbHVlKSk7Ci0JCWxhYmVsLmludmFsaWRhdGUoKTsKLQkJbGFiZWwuZ2V0UGFyZW50KCkudmFsaWRhdGUoKTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTdWl0ZU5hbWUoU3RyaW5nIHN1aXRlKSB7Ci0JCWZTdWl0ZUZpZWxkLnNldFRleHQoc3VpdGUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2hvd0Vycm9yVHJhY2UoKSB7Ci0JCWludCBpbmRleD0gZkZhaWx1cmVMaXN0LmdldFNlbGVjdGVkSW5kZXgoKTsKLQkJaWYgKGluZGV4ID09IC0xKQotCQkJcmV0dXJuOwotCQotCQlUaHJvd2FibGUgdD0gKFRocm93YWJsZSkgZkV4Y2VwdGlvbnMuZWxlbWVudEF0KGluZGV4KTsKLQkJZlRyYWNlQXJlYS5zZXRUZXh0KGdldEZpbHRlcmVkVHJhY2UodCkpOwotCX0KLQkKLQotCXByaXZhdGUgdm9pZCBzaG93SW5mbyhTdHJpbmcgbWVzc2FnZSkgewotCQlmU3RhdHVzTGluZS5zZXRGb250KFBMQUlOX0ZPTlQpOwotCQlmU3RhdHVzTGluZS5zZXRGb3JlZ3JvdW5kKENvbG9yLmJsYWNrKTsKLQkJZlN0YXR1c0xpbmUuc2V0VGV4dChtZXNzYWdlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJTdGF0dXMoKSB7Ci0JCXNob3dTdGF0dXMoIiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzaG93U3RhdHVzKFN0cmluZyBzdGF0dXMpIHsKLQkJZlN0YXR1c0xpbmUuc2V0Rm9udChQTEFJTl9GT05UKTsKLQkJZlN0YXR1c0xpbmUuc2V0Rm9yZWdyb3VuZChDb2xvci5yZWQpOwotCQlmU3RhdHVzTGluZS5zZXRUZXh0KHN0YXR1cyk7Ci0JfQotCS8qKgotCSAqIFN0YXJ0cyB0aGUgVGVzdFJ1bm5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KFN0cmluZ1tdIGFyZ3MpIHsKLQkJU3RyaW5nIHN1aXRlTmFtZT0gcHJvY2Vzc0FyZ3VtZW50cyhhcmdzKTsJCQkKLQkJZkZyYW1lPSBjcmVhdGVVSShzdWl0ZU5hbWUpOwotCQlmRnJhbWUuc2V0TG9jYXRpb24oMjAwLCAyMDApOwotCQlmRnJhbWUuc2V0VmlzaWJsZSh0cnVlKTsKLQkKLQkJaWYgKHN1aXRlTmFtZSAhPSBudWxsKSB7Ci0JCQlzZXRTdWl0ZU5hbWUoc3VpdGVOYW1lKTsKLQkJCXJ1blN1aXRlKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc3RhcnRUZXN0KFRlc3QgdGVzdCkgewotCQlzaG93SW5mbygiUnVubmluZzogIit0ZXN0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9leHRlbnNpb25zL0FjdGl2ZVRlc3RTdWl0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9leHRlbnNpb25zL0FjdGl2ZVRlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmI1OTE4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvZXh0ZW5zaW9ucy9BY3RpdmVUZXN0U3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLXBhY2thZ2UganVuaXQuZXh0ZW5zaW9uczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi0vKioKLSAqIEEgVGVzdFN1aXRlIGZvciBhY3RpdmUgVGVzdHMuIEl0IHJ1bnMgZWFjaAotICogdGVzdCBpbiBhIHNlcGFyYXRlIHRocmVhZCBhbmQgd2FpdHMgdW50aWwgYWxsCi0gKiB0aHJlYWRzIGhhdmUgdGVybWluYXRlZC4KLSAqIC0tIEFhcmh1cyBSYWRpc3NvbiBTY2FuZGluYXZpYW4gQ2VudGVyIDExdGggZmxvb3IKLSAqLyAKLXB1YmxpYyBjbGFzcyBBY3RpdmVUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCXByaXZhdGUgdm9sYXRpbGUgaW50IGZBY3RpdmVUZXN0RGVhdGhDb3VudDsKLQkKLQlwdWJsaWMgdm9pZCBydW4oVGVzdFJlc3VsdCByZXN1bHQpIHsKLQkJZkFjdGl2ZVRlc3REZWF0aENvdW50PSAwOwotCQlzdXBlci5ydW4ocmVzdWx0KTsKLQkJd2FpdFVudGlsRmluaXNoZWQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuVGVzdChmaW5hbCBUZXN0IHRlc3QsIGZpbmFsIFRlc3RSZXN1bHQgcmVzdWx0KSB7Ci0JCVRocmVhZCB0PSBuZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCS8vIGlubGluZWQgZHVlIHRvIGxpbWl0YXRpb24gaW4gVkEvSmF2YSAKLQkJCQkJLy9BY3RpdmVUZXN0U3VpdGUuc3VwZXIucnVuVGVzdCh0ZXN0LCByZXN1bHQpOwotCQkJCQl0ZXN0LnJ1bihyZXN1bHQpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCUFjdGl2ZVRlc3RTdWl0ZS50aGlzLnJ1bkZpbmlzaGVkKHRlc3QpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdC5zdGFydCgpOwotCX0KLQotCXN5bmNocm9uaXplZCB2b2lkIHdhaXRVbnRpbEZpbmlzaGVkKCkgewotCQl3aGlsZSAoZkFjdGl2ZVRlc3REZWF0aENvdW50IDwgdGVzdENvdW50KCkpIHsKLQkJCXRyeSB7Ci0JCQkJd2FpdCgpOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCXJldHVybjsgLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci0JCi0Jc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIHJ1bkZpbmlzaGVkKFRlc3QgdGVzdCkgewotCQlmQWN0aXZlVGVzdERlYXRoQ291bnQrKzsKLQkJbm90aWZ5QWxsKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvZXh0ZW5zaW9ucy9FeGNlcHRpb25UZXN0Q2FzZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9leHRlbnNpb25zL0V4Y2VwdGlvblRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNzE0MjQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9leHRlbnNpb25zL0V4Y2VwdGlvblRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi1wYWNrYWdlIGp1bml0LmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBBIFRlc3RDYXNlIHRoYXQgZXhwZWN0cyBhbiBFeGNlcHRpb24gb2YgY2xhc3MgZkV4cGVjdGVkIHRvIGJlIHRocm93bi4KLSAqIFRoZSBvdGhlciB3YXkgdG8gY2hlY2sgdGhhdCBhbiBleHBlY3RlZCBleGNlcHRpb24gaXMgdGhyb3duIGlzOgotICogPHByZT4KLSAqIHRyeSB7Ci0gKiAgIHNob3VsZFRocm93KCk7Ci0gKiB9Ci0gKiBjYXRjaCAoU3BlY2lhbEV4Y2VwdGlvbiBlKSB7Ci0gKiAgIHJldHVybjsKLSAqIH0KLSAqIGZhaWwoIkV4cGVjdGVkIFNwZWNpYWxFeGNlcHRpb24iKTsKLSAqIDwvcHJlPgotICoKLSAqIFRvIHVzZSBFeGNlcHRpb25UZXN0Q2FzZSwgY3JlYXRlIGEgVGVzdENhc2UgbGlrZToKLSAqIDxwcmU+Ci0gKiBuZXcgRXhjZXB0aW9uVGVzdENhc2UoInRlc3RTaG91bGRUaHJvdyIsIFNwZWNpYWxFeGNlcHRpb24uY2xhc3MpOwotICogPC9wcmU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb25UZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLQlDbGFzcyBmRXhwZWN0ZWQ7Ci0KLQlwdWJsaWMgRXhjZXB0aW9uVGVzdENhc2UoU3RyaW5nIG5hbWUsIENsYXNzIGV4Y2VwdGlvbikgewotCQlzdXBlcihuYW1lKTsKLQkJZkV4cGVjdGVkPSBleGNlcHRpb247Ci0JfQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIHRlc3QgbWV0aG9kIGV4cGVjdGluZyB0aGF0IGFuIEV4Y2VwdGlvbiBvZgotCSAqIGNsYXNzIGZFeHBlY3RlZCBvciBvbmUgb2YgaXRzIHN1YmNsYXNzZXMgd2lsbCBiZSB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRyeSB7Ci0JCQlzdXBlci5ydW5UZXN0KCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZkV4cGVjdGVkLmlzQXNzaWduYWJsZUZyb20oZS5nZXRDbGFzcygpKSkKLQkJCQlyZXR1cm47Ci0JCQllbHNlCi0JCQkJdGhyb3cgZTsKLQkJfQotCQlmYWlsKCJFeHBlY3RlZCBleGNlcHRpb24gIiArIGZFeHBlY3RlZCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvZXh0ZW5zaW9ucy9SZXBlYXRlZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvZXh0ZW5zaW9ucy9SZXBlYXRlZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE2ZTM1MC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L2V4dGVuc2lvbnMvUmVwZWF0ZWRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1wYWNrYWdlIGp1bml0LmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBBIERlY29yYXRvciB0aGF0IHJ1bnMgYSB0ZXN0IHJlcGVhdGVkbHkuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUmVwZWF0ZWRUZXN0IGV4dGVuZHMgIFRlc3REZWNvcmF0b3IgewotCXByaXZhdGUgaW50IGZUaW1lc1JlcGVhdDsKLQotCXB1YmxpYyBSZXBlYXRlZFRlc3QoVGVzdCB0ZXN0LCBpbnQgcmVwZWF0KSB7Ci0JCXN1cGVyKHRlc3QpOwotCQlpZiAocmVwZWF0IDwgMCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlcGV0aXRpb24gY291bnQgbXVzdCBiZSA+IDAiKTsKLQkJZlRpbWVzUmVwZWF0PSByZXBlYXQ7Ci0JfQotCXB1YmxpYyBpbnQgY291bnRUZXN0Q2FzZXMoKSB7Ci0JCXJldHVybiBzdXBlci5jb3VudFRlc3RDYXNlcygpKmZUaW1lc1JlcGVhdDsKLQl9Ci0JcHVibGljIHZvaWQgcnVuKFRlc3RSZXN1bHQgcmVzdWx0KSB7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBmVGltZXNSZXBlYXQ7IGkrKykgewotCQkJaWYgKHJlc3VsdC5zaG91bGRTdG9wKCkpCi0JCQkJYnJlYWs7Ci0JCQlzdXBlci5ydW4ocmVzdWx0KTsKLQkJfQotCX0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKSsiKHJlcGVhdGVkKSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvZXh0ZW5zaW9ucy9UZXN0RGVjb3JhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L2V4dGVuc2lvbnMvVGVzdERlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yjk4YzRmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvZXh0ZW5zaW9ucy9UZXN0RGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi1wYWNrYWdlIGp1bml0LmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBBIERlY29yYXRvciBmb3IgVGVzdHMuIFVzZSBUZXN0RGVjb3JhdG9yIGFzIHRoZSBiYXNlIGNsYXNzCi0gKiBmb3IgZGVmaW5pbmcgbmV3IHRlc3QgZGVjb3JhdG9ycy4gVGVzdCBkZWNvcmF0b3Igc3ViY2xhc3NlcwotICogY2FuIGJlIGludHJvZHVjZWQgdG8gYWRkIGJlaGF2aW91ciBiZWZvcmUgb3IgYWZ0ZXIgYSB0ZXN0Ci0gKiBpcyBydW4uCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVGVzdERlY29yYXRvciBleHRlbmRzIEFzc2VydCBpbXBsZW1lbnRzIFRlc3QgewotCXByb3RlY3RlZCBUZXN0IGZUZXN0OwotCi0JcHVibGljIFRlc3REZWNvcmF0b3IoVGVzdCB0ZXN0KSB7Ci0JCWZUZXN0PSB0ZXN0OwotCX0KLQkvKioKLQkgKiBUaGUgYmFzaWMgcnVuIGJlaGF2aW91ci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBiYXNpY1J1bihUZXN0UmVzdWx0IHJlc3VsdCkgewotCQlmVGVzdC5ydW4ocmVzdWx0KTsKLQl9Ci0JcHVibGljIGludCBjb3VudFRlc3RDYXNlcygpIHsKLQkJcmV0dXJuIGZUZXN0LmNvdW50VGVzdENhc2VzKCk7Ci0JfQotCXB1YmxpYyB2b2lkIHJ1bihUZXN0UmVzdWx0IHJlc3VsdCkgewotCQliYXNpY1J1bihyZXN1bHQpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZlRlc3QudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFRlc3QgZ2V0VGVzdCgpIHsKLQkJcmV0dXJuIGZUZXN0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L2V4dGVuc2lvbnMvVGVzdFNldHVwLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L2V4dGVuc2lvbnMvVGVzdFNldHVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzN2UxYTIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9leHRlbnNpb25zL1Rlc3RTZXR1cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotcGFja2FnZSBqdW5pdC5leHRlbnNpb25zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogQSBEZWNvcmF0b3IgdG8gc2V0IHVwIGFuZCB0ZWFyIGRvd24gYWRkaXRpb25hbCBmaXh0dXJlIHN0YXRlLgotICogU3ViY2xhc3MgVGVzdFNldHVwIGFuZCBpbnNlcnQgaXQgaW50byB5b3VyIHRlc3RzIHdoZW4geW91IHdhbnQKLSAqIHRvIHNldCB1cCBhZGRpdGlvbmFsIHN0YXRlIG9uY2UgYmVmb3JlIHRoZSB0ZXN0cyBhcmUgcnVuLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdFNldHVwIGV4dGVuZHMgVGVzdERlY29yYXRvciB7Ci0KLQlwdWJsaWMgVGVzdFNldHVwKFRlc3QgdGVzdCkgewotCQlzdXBlcih0ZXN0KTsKLQl9Ci0JcHVibGljIHZvaWQgcnVuKGZpbmFsIFRlc3RSZXN1bHQgcmVzdWx0KSB7Ci0JCVByb3RlY3RhYmxlIHA9IG5ldyBQcm90ZWN0YWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3RlY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQlzZXRVcCgpOwotCQkJCWJhc2ljUnVuKHJlc3VsdCk7Ci0JCQkJdGVhckRvd24oKTsKLQkJCX0KLQkJfTsKLQkJcmVzdWx0LnJ1blByb3RlY3RlZCh0aGlzLCBwKTsKLQl9Ci0JLyoqCi0JICogU2V0cyB1cCB0aGUgZml4dHVyZS4gT3ZlcnJpZGUgdG8gc2V0IHVwIGFkZGl0aW9uYWwgZml4dHVyZQotCSAqIHN0YXRlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JfQotCS8qKgotCSAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUuIE92ZXJyaWRlIHRvIHRlYXIgZG93biB0aGUgYWRkaXRpb25hbAotCSAqIGZpeHR1cmUgc3RhdGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9mcmFtZXdvcmsvQXNzZXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L2ZyYW1ld29yay9Bc3NlcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAzOGZkYi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L2ZyYW1ld29yay9Bc3NlcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi1wYWNrYWdlIGp1bml0LmZyYW1ld29yazsKLQotLyoqCi0gKiBBIHNldCBvZiBhc3NlcnQgbWV0aG9kcy4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQXNzZXJ0IHsKLQkvKioKLQkgKiBQcm90ZWN0IGNvbnN0cnVjdG9yIHNpbmNlIGl0IGlzIGEgc3RhdGljIG9ubHkgY2xhc3MKLQkgKi8KLQlwcm90ZWN0ZWQgQXNzZXJ0KCkgewotCX0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgYSBjb25kaXRpb24gaXMgdHJ1ZS4gSWYgaXQgaXNuJ3QgaXQgdGhyb3dzCi0JICogYW4gQXNzZXJ0aW9uRmFpbGVkRXJyb3Igd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS4KLQkgKiBAZGVwcmVjYXRlZCB1c2UgYXNzZXJ0VHJ1ZQotCSAqLwotCXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnQoU3RyaW5nIG1lc3NhZ2UsIGJvb2xlYW4gY29uZGl0aW9uKSB7Ci0JCWlmICghY29uZGl0aW9uKQotCQkJZmFpbChtZXNzYWdlKTsKLQl9Ci0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IGEgY29uZGl0aW9uIGlzIHRydWUuIElmIGl0IGlzbid0IGl0IHRocm93cwotCSAqIGFuIEFzc2VydGlvbkZhaWxlZEVycm9yLgotCSAqIEBkZXByZWNhdGVkIHVzZSBhc3NlcnRUcnVlCi0JICoKLQkgKi8KLQlzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0KGJvb2xlYW4gY29uZGl0aW9uKSB7Ci0JCWFzc2VydChudWxsLCBjb25kaXRpb24pOwotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCBhIGNvbmRpdGlvbiBpcyB0cnVlLiBJZiBpdCBpc24ndCBpdCB0aHJvd3MKLQkgKiBhbiBBc3NlcnRpb25GYWlsZWRFcnJvciB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRUcnVlKFN0cmluZyBtZXNzYWdlLCBib29sZWFuIGNvbmRpdGlvbikgewotCQlpZiAoIWNvbmRpdGlvbikKLQkJCWZhaWwobWVzc2FnZSk7Ci0JfQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCBhIGNvbmRpdGlvbiBpcyB0cnVlLiBJZiBpdCBpc24ndCBpdCB0aHJvd3MKLQkgKiBhbiBBc3NlcnRpb25GYWlsZWRFcnJvci4KLQkgKi8KLQlzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0VHJ1ZShib29sZWFuIGNvbmRpdGlvbikgewotCQlhc3NlcnRUcnVlKG51bGwsIGNvbmRpdGlvbik7Ci0JfQotCS8qKgotCSAqIEZhaWxzIGEgdGVzdCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLiAKLQkgKi8KLQlzdGF0aWMgcHVibGljIHZvaWQgZmFpbChTdHJpbmcgbWVzc2FnZSkgewotCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXJyb3IobWVzc2FnZSk7Ci0JfQotCS8qKgotCSAqIEZhaWxzIGEgdGVzdCB3aXRoIG5vIG1lc3NhZ2UuIAotCSAqLwotCXN0YXRpYyBwdWJsaWMgdm9pZCBmYWlsKCkgewotCQlmYWlsKG51bGwpOwotCX0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdHdvIG9iamVjdHMgYXJlIGVxdWFsLiBJZiB0aGV5IGFyZSBub3QKLQkgKiBhbiBBc3NlcnRpb25GYWlsZWRFcnJvciBpcyB0aHJvd24uCi0JICovCi0Jc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGV4cGVjdGVkLCBPYmplY3QgYWN0dWFsKSB7Ci0JCWlmIChleHBlY3RlZCA9PSBudWxsICYmIGFjdHVhbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZXhwZWN0ZWQgIT0gbnVsbCAmJiBleHBlY3RlZC5lcXVhbHMoYWN0dWFsKSkKLQkJCXJldHVybjsKLQkJZmFpbE5vdEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHR3byBvYmplY3RzIGFyZSBlcXVhbC4gSWYgdGhleSBhcmUgbm90Ci0JICogYW4gQXNzZXJ0aW9uRmFpbGVkRXJyb3IgaXMgdGhyb3duLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoT2JqZWN0IGV4cGVjdGVkLCBPYmplY3QgYWN0dWFsKSB7Ci0JICAgIGFzc2VydEVxdWFscyhudWxsLCBleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHR3byBkb3VibGVzIGFyZSBlcXVhbCBjb25jZXJuaW5nIGEgZGVsdGEuIElmIHRoZSBleHBlY3RlZAotCSAqIHZhbHVlIGlzIGluZmluaXR5IHRoZW4gdGhlIGRlbHRhIHZhbHVlIGlzIGlnbm9yZWQuCi0JICovCi0Jc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhTdHJpbmcgbWVzc2FnZSwgZG91YmxlIGV4cGVjdGVkLCBkb3VibGUgYWN0dWFsLCBkb3VibGUgZGVsdGEpIHsKLQkJLy8gaGFuZGxlIGluZmluaXR5IHNwZWNpYWxseSBzaW5jZSBzdWJ0cmFjdGluZyB0byBpbmZpbml0ZSB2YWx1ZXMgZ2l2ZXMgTmFOIGFuZCB0aGUKLQkJLy8gdGhlIGZvbGxvd2luZyB0ZXN0IGZhaWxzCi0JCWlmIChEb3VibGUuaXNJbmZpbml0ZShleHBlY3RlZCkpIHsKLQkJCWlmICghKGV4cGVjdGVkID09IGFjdHVhbCkpCi0JCQkJZmFpbE5vdEVxdWFscyhtZXNzYWdlLCBuZXcgRG91YmxlKGV4cGVjdGVkKSwgbmV3IERvdWJsZShhY3R1YWwpKTsKLQkJfSBlbHNlIGlmICghKE1hdGguYWJzKGV4cGVjdGVkLWFjdHVhbCkgPD0gZGVsdGEpKSAvLyBCZWNhdXNlIGNvbXBhcmlzb24gd2l0aCBOYU4gYWx3YXlzIHJldHVybnMgZmFsc2UKLQkJCWZhaWxOb3RFcXVhbHMobWVzc2FnZSwgbmV3IERvdWJsZShleHBlY3RlZCksIG5ldyBEb3VibGUoYWN0dWFsKSk7Ci0JfQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0d28gZG91YmxlcyBhcmUgZXF1YWwgY29uY2VybmluZyBhIGRlbHRhLiBJZiB0aGUgZXhwZWN0ZWQKLQkgKiB2YWx1ZSBpcyBpbmZpbml0eSB0aGVuIHRoZSBkZWx0YSB2YWx1ZSBpcyBpZ25vcmVkLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoZG91YmxlIGV4cGVjdGVkLCBkb3VibGUgYWN0dWFsLCBkb3VibGUgZGVsdGEpIHsKLQkgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGV4cGVjdGVkLCBhY3R1YWwsIGRlbHRhKTsKLQl9Ci0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHR3byBmbG9hdHMgYXJlIGVxdWFsIGNvbmNlcm5pbmcgYSBkZWx0YS4gSWYgdGhlIGV4cGVjdGVkCi0JICogdmFsdWUgaXMgaW5maW5pdHkgdGhlbiB0aGUgZGVsdGEgdmFsdWUgaXMgaWdub3JlZC4KLQkgKi8KLQlzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKFN0cmluZyBtZXNzYWdlLCBmbG9hdCBleHBlY3RlZCwgZmxvYXQgYWN0dWFsLCBmbG9hdCBkZWx0YSkgewotIAkJLy8gaGFuZGxlIGluZmluaXR5IHNwZWNpYWxseSBzaW5jZSBzdWJ0cmFjdGluZyB0byBpbmZpbml0ZSB2YWx1ZXMgZ2l2ZXMgTmFOIGFuZCB0aGUKLQkJLy8gdGhlIGZvbGxvd2luZyB0ZXN0IGZhaWxzCi0JCWlmIChGbG9hdC5pc0luZmluaXRlKGV4cGVjdGVkKSkgewotCQkJaWYgKCEoZXhwZWN0ZWQgPT0gYWN0dWFsKSkKLQkJCQlmYWlsTm90RXF1YWxzKG1lc3NhZ2UsIG5ldyBGbG9hdChleHBlY3RlZCksIG5ldyBGbG9hdChhY3R1YWwpKTsKLQkJfSBlbHNlIGlmICghKE1hdGguYWJzKGV4cGVjdGVkLWFjdHVhbCkgPD0gZGVsdGEpKQotICAgICAgCQlmYWlsTm90RXF1YWxzKG1lc3NhZ2UsIG5ldyBGbG9hdChleHBlY3RlZCksIG5ldyBGbG9hdChhY3R1YWwpKTsKLQl9Ci0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHR3byBmbG9hdHMgYXJlIGVxdWFsIGNvbmNlcm5pbmcgYSBkZWx0YS4gSWYgdGhlIGV4cGVjdGVkCi0JICogdmFsdWUgaXMgaW5maW5pdHkgdGhlbiB0aGUgZGVsdGEgdmFsdWUgaXMgaWdub3JlZC4KLQkgKi8KLQlzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKGZsb2F0IGV4cGVjdGVkLCBmbG9hdCBhY3R1YWwsIGZsb2F0IGRlbHRhKSB7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBleHBlY3RlZCwgYWN0dWFsLCBkZWx0YSk7Ci0JfQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0d28gbG9uZ3MgYXJlIGVxdWFsLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIGxvbmcgZXhwZWN0ZWQsIGxvbmcgYWN0dWFsKSB7Ci0JICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLCBuZXcgTG9uZyhleHBlY3RlZCksIG5ldyBMb25nKGFjdHVhbCkpOwotCX0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdHdvIGxvbmdzIGFyZSBlcXVhbC4KLQkgKi8KLQlzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKGxvbmcgZXhwZWN0ZWQsIGxvbmcgYWN0dWFsKSB7Ci0JICAgIGFzc2VydEVxdWFscyhudWxsLCBleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHR3byBib29sZWFucyBhcmUgZXF1YWwuCi0JICovCi0Jc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhTdHJpbmcgbWVzc2FnZSwgYm9vbGVhbiBleHBlY3RlZCwgYm9vbGVhbiBhY3R1YWwpIHsKLSAgICAJCWFzc2VydEVxdWFscyhtZXNzYWdlLCBuZXcgQm9vbGVhbihleHBlY3RlZCksIG5ldyBCb29sZWFuKGFjdHVhbCkpOwotICAJfQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0d28gYm9vbGVhbnMgYXJlIGVxdWFsLgotIAkgKi8KLQlzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKGJvb2xlYW4gZXhwZWN0ZWQsIGJvb2xlYW4gYWN0dWFsKSB7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHR3byBieXRlcyBhcmUgZXF1YWwuCi0JICovCi0gIAlzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKFN0cmluZyBtZXNzYWdlLCBieXRlIGV4cGVjdGVkLCBieXRlIGFjdHVhbCkgewotCQlhc3NlcnRFcXVhbHMobWVzc2FnZSwgbmV3IEJ5dGUoZXhwZWN0ZWQpLCBuZXcgQnl0ZShhY3R1YWwpKTsKLQl9Ci0JLyoqCi0gICAJICogQXNzZXJ0cyB0aGF0IHR3byBieXRlcyBhcmUgZXF1YWwuCi0JICovCi0Jc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhieXRlIGV4cGVjdGVkLCBieXRlIGFjdHVhbCkgewotCQlhc3NlcnRFcXVhbHMobnVsbCwgZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0d28gY2hhcnMgYXJlIGVxdWFsLgotCSAqLwotICAJc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhTdHJpbmcgbWVzc2FnZSwgY2hhciBleHBlY3RlZCwgY2hhciBhY3R1YWwpIHsKLSAgICAJCWFzc2VydEVxdWFscyhtZXNzYWdlLCBuZXcgQ2hhcmFjdGVyKGV4cGVjdGVkKSwgbmV3IENoYXJhY3RlcihhY3R1YWwpKTsKLSAgCX0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdHdvIGNoYXJzIGFyZSBlcXVhbC4KLQkgKi8KLSAgCXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoY2hhciBleHBlY3RlZCwgY2hhciBhY3R1YWwpIHsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGV4cGVjdGVkLCBhY3R1YWwpOwotCX0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdHdvIHNob3J0cyBhcmUgZXF1YWwuCi0JICovCi0Jc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhTdHJpbmcgbWVzc2FnZSwgc2hvcnQgZXhwZWN0ZWQsIHNob3J0IGFjdHVhbCkgewotICAgIAkJYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIG5ldyBTaG9ydChleHBlY3RlZCksIG5ldyBTaG9ydChhY3R1YWwpKTsKLQl9Ci0gIAkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdHdvIHNob3J0cyBhcmUgZXF1YWwuCi0JICovCi0Jc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFscyhzaG9ydCBleHBlY3RlZCwgc2hvcnQgYWN0dWFsKSB7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHR3byBpbnRzIGFyZSBlcXVhbC4KLQkgKi8KLSAgCXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIGludCBleHBlY3RlZCwgaW50IGFjdHVhbCkgewotCQlhc3NlcnRFcXVhbHMobWVzc2FnZSwgbmV3IEludGVnZXIoZXhwZWN0ZWQpLCBuZXcgSW50ZWdlcihhY3R1YWwpKTsKLSAgCX0KLSAgCS8qKgotICAgCSAqIEFzc2VydHMgdGhhdCB0d28gaW50cyBhcmUgZXF1YWwuCi0JICovCi0gIAlzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxzKGludCBleHBlY3RlZCwgaW50IGFjdHVhbCkgewotICAJCWFzc2VydEVxdWFscyhudWxsLCBleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IGFuIG9iamVjdCBpc24ndCBudWxsLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnROb3ROdWxsKE9iamVjdCBvYmplY3QpIHsKLQkJYXNzZXJ0Tm90TnVsbChudWxsLCBvYmplY3QpOwotCX0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgYW4gb2JqZWN0IGlzbid0IG51bGwuCi0JICovCi0Jc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydE5vdE51bGwoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBvYmplY3QpIHsKLQkJYXNzZXJ0VHJ1ZShtZXNzYWdlLCBvYmplY3QgIT0gbnVsbCk7IAotCX0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgYW4gb2JqZWN0IGlzIG51bGwuCi0JICovCi0Jc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydE51bGwoT2JqZWN0IG9iamVjdCkgewotCQlhc3NlcnROdWxsKG51bGwsIG9iamVjdCk7Ci0JfQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCBhbiBvYmplY3QgaXMgbnVsbC4KLQkgKi8KLQlzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0TnVsbChTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IG9iamVjdCkgewotCQlhc3NlcnRUcnVlKG1lc3NhZ2UsIG9iamVjdCA9PSBudWxsKTsgCi0JfQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0d28gb2JqZWN0cyByZWZlciB0byB0aGUgc2FtZSBvYmplY3QuIElmIHRoZXkgYXJlIG5vdAotCSAqIGFuIEFzc2VydGlvbkZhaWxlZEVycm9yIGlzIHRocm93bi4KLQkgKi8KLQlzdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0U2FtZShTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGV4cGVjdGVkLCBPYmplY3QgYWN0dWFsKSB7Ci0JCWlmIChleHBlY3RlZCA9PSBhY3R1YWwpCi0JCQlyZXR1cm47Ci0JCWZhaWxOb3RTYW1lKG1lc3NhZ2UsIGV4cGVjdGVkLCBhY3R1YWwpOwotCX0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdHdvIG9iamVjdHMgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0LiBJZiB0aGV5IGFyZSBub3QKLQkgKiB0aGUgc2FtZSBhbiBBc3NlcnRpb25GYWlsZWRFcnJvciBpcyB0aHJvd24uCi0JICovCi0Jc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydFNhbWUoT2JqZWN0IGV4cGVjdGVkLCBPYmplY3QgYWN0dWFsKSB7Ci0JICAgIGFzc2VydFNhbWUobnVsbCwgZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotCQotCXN0YXRpYyBwcml2YXRlIHZvaWQgZmFpbE5vdEVxdWFscyhTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGV4cGVjdGVkLCBPYmplY3QgYWN0dWFsKSB7Ci0JCVN0cmluZyBmb3JtYXR0ZWQ9ICIiOwotCQlpZiAobWVzc2FnZSAhPSBudWxsKQotCQkJZm9ybWF0dGVkPSBtZXNzYWdlKyIgIjsKLQkJZmFpbChmb3JtYXR0ZWQrImV4cGVjdGVkOjwiK2V4cGVjdGVkKyI+IGJ1dCB3YXM6PCIrYWN0dWFsKyI+Iik7Ci0JfQotCQotCXN0YXRpYyBwcml2YXRlIHZvaWQgZmFpbE5vdFNhbWUoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBleHBlY3RlZCwgT2JqZWN0IGFjdHVhbCkgewotCQlTdHJpbmcgZm9ybWF0dGVkPSAiIjsKLQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkKLQkJCWZvcm1hdHRlZD0gbWVzc2FnZSsiICI7Ci0JCWZhaWwoZm9ybWF0dGVkKyJleHBlY3RlZCBzYW1lIik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvZnJhbWV3b3JrL0Fzc2VydGlvbkZhaWxlZEVycm9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L2ZyYW1ld29yay9Bc3NlcnRpb25GYWlsZWRFcnJvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Njc5YTg5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvZnJhbWV3b3JrL0Fzc2VydGlvbkZhaWxlZEVycm9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1wYWNrYWdlIGp1bml0LmZyYW1ld29yazsKLQotLyoqCi0gKiBUaHJvd24gd2hlbiBhbiBhc3NlcnRpb24gZmFpbGVkLgotICovCi1wdWJsaWMgY2xhc3MgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7Ci0KLQlwdWJsaWMgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgKCkgewotCX0KLQlwdWJsaWMgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXN1cGVyIChtZXNzYWdlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9mcmFtZXdvcmsvUHJvdGVjdGFibGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvZnJhbWV3b3JrL1Byb3RlY3RhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNDMyMzcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9mcmFtZXdvcmsvUHJvdGVjdGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXBhY2thZ2UganVuaXQuZnJhbWV3b3JrOwotCi0vKioKLSAqIEEgPGVtPlByb3RlY3RhYmxlPC9lbT4gY2FuIGJlIHJ1biBhbmQgY2FuIHRocm93IGEgVGhyb3dhYmxlLgotICoKLSAqIEBzZWUgVGVzdFJlc3VsdAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb3RlY3RhYmxlIHsKLQotCS8qKgotCSAqIFJ1biB0aGUgdGhlIGZvbGxvd2luZyBtZXRob2QgcHJvdGVjdGVkLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHByb3RlY3QoKSB0aHJvd3MgVGhyb3dhYmxlOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvZnJhbWV3b3JrL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvZnJhbWV3b3JrL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAxNmVlOC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L2ZyYW1ld29yay9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1wYWNrYWdlIGp1bml0LmZyYW1ld29yazsKLQotLyoqCi0gKiBBIDxlbT5UZXN0PC9lbT4gY2FuIGJlIHJ1biBhbmQgY29sbGVjdCBpdHMgcmVzdWx0cy4KLSAqCi0gKiBAc2VlIFRlc3RSZXN1bHQKLSAqLwotcHVibGljIGludGVyZmFjZSBUZXN0IHsKLQkvKioKLQkgKiBDb3VudHMgdGhlIG51bWJlciBvZiB0ZXN0IGNhc2VzIHRoYXQgd2lsbCBiZSBydW4gYnkgdGhpcyB0ZXN0LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBpbnQgY291bnRUZXN0Q2FzZXMoKTsKLQkvKioKLQkgKiBSdW5zIGEgdGVzdCBhbmQgY29sbGVjdHMgaXRzIHJlc3VsdCBpbiBhIFRlc3RSZXN1bHQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcnVuKFRlc3RSZXN1bHQgcmVzdWx0KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L2ZyYW1ld29yay9UZXN0Q2FzZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9mcmFtZXdvcmsvVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhkNjhlNy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L2ZyYW1ld29yay9UZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLXBhY2thZ2UganVuaXQuZnJhbWV3b3JrOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLQotLyoqCi0gKiBBIHRlc3QgY2FzZSBkZWZpbmVzIHRoZSBmaXh0dXJlIHRvIHJ1biBtdWx0aXBsZSB0ZXN0cy4gVG8gZGVmaW5lIGEgdGVzdCBjYXNlPGJyPgotICogMSkgaW1wbGVtZW50IGEgc3ViY2xhc3Mgb2YgVGVzdENhc2U8YnI+Ci0gKiAyKSBkZWZpbmUgaW5zdGFuY2UgdmFyaWFibGVzIHRoYXQgc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSBmaXh0dXJlPGJyPgotICogMykgaW5pdGlhbGl6ZSB0aGUgZml4dHVyZSBzdGF0ZSBieSBvdmVycmlkaW5nIDxjb2RlPnNldFVwPC9jb2RlPjxicj4KLSAqIDQpIGNsZWFuLXVwIGFmdGVyIGEgdGVzdCBieSBvdmVycmlkaW5nIDxjb2RlPnRlYXJEb3duPC9jb2RlPi48YnI+Ci0gKiBFYWNoIHRlc3QgcnVucyBpbiBpdHMgb3duIGZpeHR1cmUgc28gdGhlcmUKLSAqIGNhbiBiZSBubyBzaWRlIGVmZmVjdHMgYW1vbmcgdGVzdCBydW5zLgotICogSGVyZSBpcyBhbiBleGFtcGxlOgotICogPHByZT4KLSAqIHB1YmxpYyBjbGFzcyBNYXRoVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAqICAgICBwcm90ZWN0ZWQgZG91YmxlIGZWYWx1ZTE7Ci0gKiAgICAgcHJvdGVjdGVkIGRvdWJsZSBmVmFsdWUyOwotICoKLSAqICAgICBwdWJsaWMgTWF0aFRlc3QoU3RyaW5nIG5hbWUpIHsKLSAqICAgICAgICAgc3VwZXIobmFtZSk7Ci0gKiAgICAgfQotICoKLSAqICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotICogICAgICAgICBmVmFsdWUxPSAyLjA7Ci0gKiAgICAgICAgIGZWYWx1ZTI9IDMuMDsKLSAqICAgICB9Ci0gKiB9Ci0gKiA8L3ByZT4KLSAqCi0gKiBGb3IgZWFjaCB0ZXN0IGltcGxlbWVudCBhIG1ldGhvZCB3aGljaCBpbnRlcmFjdHMKLSAqIHdpdGggdGhlIGZpeHR1cmUuIFZlcmlmeSB0aGUgZXhwZWN0ZWQgcmVzdWx0cyB3aXRoIGFzc2VydGlvbnMgc3BlY2lmaWVkCi0gKiBieSBjYWxsaW5nIDxjb2RlPmFzc2VydDwvY29kZT4gd2l0aCBhIGJvb2xlYW4uCi0gKiA8cHJlPgotICogICAgcHJvdGVjdGVkIHZvaWQgdGVzdEFkZCgpIHsKLSAqICAgICAgICBkb3VibGUgcmVzdWx0PSBmVmFsdWUxICsgZlZhbHVlMjsKLSAqICAgICAgICBhc3NlcnQocmVzdWx0ID09IDUuMCk7Ci0gKiAgICB9Ci0gKiA8L3ByZT4KLSAqIE9uY2UgdGhlIG1ldGhvZHMgYXJlIGRlZmluZWQgeW91IGNhbiBydW4gdGhlbS4gVGhlIGZyYW1ld29yayBzdXBwb3J0cwotICogYm90aCBhIHN0YXRpYyB0eXBlIHNhZmUgYW5kIG1vcmUgZHluYW1pYyB3YXkgdG8gcnVuIGEgdGVzdC4KLSAqIEluIHRoZSBzdGF0aWMgd2F5IHlvdSBvdmVycmlkZSB0aGUgcnVuVGVzdCBtZXRob2QgYW5kIGRlZmluZSB0aGUgbWV0aG9kIHRvCi0gKiBiZSBpbnZva2VkLiBBIGNvbnZlbmllbnQgd2F5IHRvIGRvIHNvIGlzIHdpdGggYW4gYW5vbnltb3VzIGlubmVyIGNsYXNzLgotICogPHByZT4KLSAqIFRlc3QgdGVzdD0gbmV3IE1hdGhUZXN0KCJhZGQiKSB7Ci0gKiAgICAgICAgcHVibGljIHZvaWQgcnVuVGVzdCgpIHsKLSAqICAgICAgICAgICAgdGVzdEFkZCgpOwotICogICAgICAgIH0KLSAqIH07Ci0gKiB0ZXN0LnJ1bigpOwotICogPC9wcmU+Ci0gKiBUaGUgZHluYW1pYyB3YXkgdXNlcyByZWZsZWN0aW9uIHRvIGltcGxlbWVudCA8Y29kZT5ydW5UZXN0PC9jb2RlPi4gSXQgZHluYW1pY2FsbHkgZmluZHMKLSAqIGFuZCBpbnZva2VzIGEgbWV0aG9kLgotICogSW4gdGhpcyBjYXNlIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UgaGFzIHRvIGNvcnJlc3BvbmQgdG8gdGhlIHRlc3QgbWV0aG9kCi0gKiB0byBiZSBydW4uCi0gKiA8cHJlPgotICogVGVzdD0gbmV3IE1hdGhUZXN0KCJ0ZXN0QWRkIik7Ci0gKiB0ZXN0LnJ1bigpOwotICogPC9wcmU+Ci0gKiBUaGUgdGVzdHMgdG8gYmUgcnVuIGNhbiBiZSBjb2xsZWN0ZWQgaW50byBhIFRlc3RTdWl0ZS4gSlVuaXQgcHJvdmlkZXMKLSAqIGRpZmZlcmVudCA8aT50ZXN0IHJ1bm5lcnM8L2k+IHdoaWNoIGNhbiBydW4gYSB0ZXN0IHN1aXRlIGFuZCBjb2xsZWN0IHRoZSByZXN1bHRzLgotICogQSB0ZXN0IHJ1bm5lciBlaXRoZXIgZXhwZWN0cyBhIHN0YXRpYyBtZXRob2QgPGNvZGU+c3VpdGU8L2NvZGU+IGFzIHRoZSBlbnRyeQotICogcG9pbnQgdG8gZ2V0IGEgdGVzdCB0byBydW4gb3IgaXQgd2lsbCBleHRyYWN0IHRoZSBzdWl0ZSBhdXRvbWF0aWNhbGx5LgotICogPHByZT4KLSAqIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAqICAgICAgc3VpdGUuYWRkVGVzdChuZXcgTWF0aFRlc3QoInRlc3RBZGQiKSk7Ci0gKiAgICAgIHN1aXRlLmFkZFRlc3QobmV3IE1hdGhUZXN0KCJ0ZXN0RGl2aWRlQnlaZXJvIikpOwotICogICAgICByZXR1cm4gc3VpdGU7Ci0gKiAgfQotICogPC9wcmU+Ci0gKiBAc2VlIFRlc3RSZXN1bHQKLSAqIEBzZWUgVGVzdFN1aXRlCi0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFRlc3RDYXNlIGV4dGVuZHMgQXNzZXJ0IGltcGxlbWVudHMgVGVzdCB7Ci0JLyoqCi0JICogdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZOYW1lOwotCQotCS8qKgotCSAqIE5vLWFyZyBjb25zdHJ1Y3RvciB0byBlbmFibGUgc2VyaWFsaXphdGlvbi4gVGhpcyBtZXRob2QKLQkgKiBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBtZXJlIG1vcnRhbHMuCi0JICovCi0JVGVzdENhc2UoKSB7Ci0JCWZOYW1lPSBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICovCi0JcHVibGljIFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCWZOYW1lPSBuYW1lOwotCX0KLQkKLQkvKioKLQkgKiBDb3VudHMgdGhlIG51bWJlciBvZiB0ZXN0IGNhc2VzIGV4ZWN1dGVkIGJ5IHJ1bihUZXN0UmVzdWx0IHJlc3VsdCkuCi0JICovCi0JcHVibGljIGludCBjb3VudFRlc3RDYXNlcygpIHsKLQkJcmV0dXJuIDE7Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgYSBkZWZhdWx0IFRlc3RSZXN1bHQgb2JqZWN0Ci0JICoKLQkgKiBAc2VlIFRlc3RSZXN1bHQKLQkgKi8KLQlwcm90ZWN0ZWQgVGVzdFJlc3VsdCBjcmVhdGVSZXN1bHQoKSB7Ci0JICAgIHJldHVybiBuZXcgVGVzdFJlc3VsdCgpOwotCX0KLQkvKioKLQkgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UuCi0JICogQGRlcHJlY2F0ZWQgdXNlIGdldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgbmFtZSgpIHsKLQkJcmV0dXJuIGZOYW1lOwotCX0KLQkvKioKLQkgKiBBIGNvbnZlbmllbmNlIG1ldGhvZCB0byBydW4gdGhpcyB0ZXN0LCBjb2xsZWN0aW5nIHRoZSByZXN1bHRzIHdpdGggYQotCSAqIGRlZmF1bHQgVGVzdFJlc3VsdCBvYmplY3QuCi0JICoKLQkgKiBAc2VlIFRlc3RSZXN1bHQKLQkgKi8KLQlwdWJsaWMgVGVzdFJlc3VsdCBydW4oKSB7Ci0JCVRlc3RSZXN1bHQgcmVzdWx0PSBjcmVhdGVSZXN1bHQoKTsKLQkJcnVuKHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCS8qKgotCSAqIFJ1bnMgdGhlIHRlc3QgY2FzZSBhbmQgY29sbGVjdHMgdGhlIHJlc3VsdHMgaW4gVGVzdFJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oVGVzdFJlc3VsdCByZXN1bHQpIHsKLQkJcmVzdWx0LnJ1bih0aGlzKTsKLQl9Ci0JLyoqCi0JICogUnVucyB0aGUgYmFyZSB0ZXN0IHNlcXVlbmNlLgotCSAqIEBleGNlcHRpb24gVGhyb3dhYmxlIGlmIGFueSBleGNlcHRpb24gaXMgdGhyb3duCi0JICovCi0JcHVibGljIHZvaWQgcnVuQmFyZSgpIHRocm93cyBUaHJvd2FibGUgewotCQlzZXRVcCgpOwotCQl0cnkgewotCQkJcnVuVGVzdCgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdGVhckRvd24oKTsKLQkJfQotCX0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBydW4gdGhlIHRlc3QgYW5kIGFzc2VydCBpdHMgc3RhdGUuCi0JICogQGV4Y2VwdGlvbiBUaHJvd2FibGUgaWYgYW55IGV4Y2VwdGlvbiBpcyB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCU1ldGhvZCBydW5NZXRob2Q9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyB1c2UgZ2V0TWV0aG9kIHRvIGdldCBhbGwgcHVibGljIGluaGVyaXRlZAotCQkJLy8gbWV0aG9kcy4gZ2V0RGVjbGFyZWRNZXRob2RzIHJldHVybnMgYWxsCi0JCQkvLyBtZXRob2RzIG9mIHRoaXMgY2xhc3MgYnV0IGV4Y2x1ZGVzIHRoZQotCQkJLy8gaW5oZXJpdGVkIG9uZXMuCi0JCQlydW5NZXRob2Q9IGdldENsYXNzKCkuZ2V0TWV0aG9kKGZOYW1lLCBudWxsKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIk1ldGhvZCBcIiIrZk5hbWUrIlwiIG5vdCBmb3VuZCIpOwotCQl9Ci0JCWlmICghTW9kaWZpZXIuaXNQdWJsaWMocnVuTWV0aG9kLmdldE1vZGlmaWVycygpKSkgewotCQkJZmFpbCgiTWV0aG9kIFwiIitmTmFtZSsiXCIgc2hvdWxkIGJlIHB1YmxpYyIpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXJ1bk1ldGhvZC5pbnZva2UodGhpcywgbmV3IENsYXNzWzBdKTsKLQkJfQotCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQllLmZpbGxJblN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJZS5maWxsSW5TdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCS8qKgotCSAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JfQotCS8qKgotCSAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRlc3QgY2FzZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JICAgIHJldHVybiBuYW1lKCkrIigiK2dldENsYXNzKCkuZ2V0TmFtZSgpKyIpIjsKLQl9Ci0JLyoqCi0JICogR2V0cyB0aGUgbmFtZSBvZiBhIFRlc3RDYXNlCi0JICogQHJldHVybiByZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZk5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbmFtZSBvZiBhIFRlc3RDYXNlCi0JICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlmTmFtZT0gbmFtZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L2ZyYW1ld29yay9UZXN0RmFpbHVyZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9mcmFtZXdvcmsvVGVzdEZhaWx1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE3NWRjNy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L2ZyYW1ld29yay9UZXN0RmFpbHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotcGFja2FnZSBqdW5pdC5mcmFtZXdvcms7Ci0KLS8qKgotICogQSA8Y29kZT5UZXN0RmFpbHVyZTwvY29kZT4gY29sbGVjdHMgYSBmYWlsZWQgdGVzdCB0b2dldGhlciB3aXRoCi0gKiB0aGUgY2F1Z2h0IGV4Y2VwdGlvbi4KLSAqIEBzZWUgVGVzdFJlc3VsdAotICovCi1wdWJsaWMgY2xhc3MgVGVzdEZhaWx1cmUgZXh0ZW5kcyBPYmplY3QgewotCXByb3RlY3RlZCBUZXN0IGZGYWlsZWRUZXN0OwotCXByb3RlY3RlZCBUaHJvd2FibGUgZlRocm93bkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBUZXN0RmFpbHVyZSB3aXRoIHRoZSBnaXZlbiB0ZXN0IGFuZCBleGNlcHRpb24uCi0JICovCi0JcHVibGljIFRlc3RGYWlsdXJlKFRlc3QgZmFpbGVkVGVzdCwgVGhyb3dhYmxlIHRocm93bkV4Y2VwdGlvbikgewotCQlmRmFpbGVkVGVzdD0gZmFpbGVkVGVzdDsKLQkJZlRocm93bkV4Y2VwdGlvbj0gdGhyb3duRXhjZXB0aW9uOwotCX0KLQkvKioKLQkgKiBHZXRzIHRoZSBmYWlsZWQgdGVzdC4KLQkgKi8KLQlwdWJsaWMgVGVzdCBmYWlsZWRUZXN0KCkgewotCSAgICByZXR1cm4gZkZhaWxlZFRlc3Q7Ci0JfQotCS8qKgotCSAqIEdldHMgdGhlIHRocm93biBleGNlcHRpb24uCi0JICovCi0JcHVibGljIFRocm93YWJsZSB0aHJvd25FeGNlcHRpb24oKSB7Ci0JICAgIHJldHVybiBmVGhyb3duRXhjZXB0aW9uOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlIGZhaWx1cmUuCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlcj0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCSAgICBidWZmZXIuYXBwZW5kKGZGYWlsZWRUZXN0KyI6ICIrZlRocm93bkV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOwotCSAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvZnJhbWV3b3JrL1Rlc3RMaXN0ZW5lci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9mcmFtZXdvcmsvVGVzdExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNjk0NDMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9mcmFtZXdvcmsvVGVzdExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1wYWNrYWdlIGp1bml0LmZyYW1ld29yazsKLQotLyoqCi0gKiBBIExpc3RlbmVyIGZvciB0ZXN0IHByb2dyZXNzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGVzdExpc3RlbmVyIHsKLQkvKioKLSAJICogQW4gZXJyb3Igb2NjdXJyZWQuCi0gCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVycm9yKFRlc3QgdGVzdCwgVGhyb3dhYmxlIHQpOwotCS8qKgotIAkgKiBBIGZhaWx1cmUgb2NjdXJyZWQuCi0gCSAqLwotIAlwdWJsaWMgdm9pZCBhZGRGYWlsdXJlKFRlc3QgdGVzdCwgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgdCk7ICAKLQkvKioKLQkgKiBBIHRlc3QgZW5kZWQuCi0JICovCi0gCXB1YmxpYyB2b2lkIGVuZFRlc3QoVGVzdCB0ZXN0KTsgCi0JLyoqCi0JICogQSB0ZXN0IHN0YXJ0ZWQuCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRUZXN0KFRlc3QgdGVzdCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9mcmFtZXdvcmsvVGVzdFJlc3VsdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9mcmFtZXdvcmsvVGVzdFJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODYyNWM3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvZnJhbWV3b3JrL1Rlc3RSZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi1wYWNrYWdlIGp1bml0LmZyYW1ld29yazsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi0vKioKLSAqIEEgPGNvZGU+VGVzdFJlc3VsdDwvY29kZT4gY29sbGVjdHMgdGhlIHJlc3VsdHMgb2YgZXhlY3V0aW5nCi0gKiBhIHRlc3QgY2FzZS4gSXQgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIENvbGxlY3RpbmcgUGFyYW1ldGVyIHBhdHRlcm4uCi0gKiBUaGUgdGVzdCBmcmFtZXdvcmsgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIDxpPmZhaWx1cmVzPC9pPiBhbmQgPGk+ZXJyb3JzPC9pPi4KLSAqIEEgZmFpbHVyZSBpcyBhbnRpY2lwYXRlZCBhbmQgY2hlY2tlZCBmb3Igd2l0aCBhc3NlcnRpb25zLiBFcnJvcnMgYXJlCi0gKiB1bmFudGljaXBhdGVkIHByb2JsZW1zIGxpa2UgYW4gPGNvZGU+QXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uPC9jb2RlPi4KLSAqCi0gKiBAc2VlIFRlc3QKLSAqLwotcHVibGljIGNsYXNzIFRlc3RSZXN1bHQgZXh0ZW5kcyBPYmplY3QgewotCXByb3RlY3RlZCBWZWN0b3IgZkZhaWx1cmVzOwotCXByb3RlY3RlZCBWZWN0b3IgZkVycm9yczsKLQlwcm90ZWN0ZWQgVmVjdG9yIGZMaXN0ZW5lcnM7Ci0JcHJvdGVjdGVkIGludCBmUnVuVGVzdHM7Ci0JcHJpdmF0ZSBib29sZWFuIGZTdG9wOwotCQotCXB1YmxpYyBUZXN0UmVzdWx0KCkgewotCQlmRmFpbHVyZXM9IG5ldyBWZWN0b3IoKTsKLQkJZkVycm9ycz0gbmV3IFZlY3RvcigpOwotCQlmTGlzdGVuZXJzPSBuZXcgVmVjdG9yKCk7Ci0JCWZSdW5UZXN0cz0gMDsKLQkJZlN0b3A9IGZhbHNlOwotCX0KLQkvKioKLQkgKiBBZGRzIGFuIGVycm9yIHRvIHRoZSBsaXN0IG9mIGVycm9ycy4gVGhlIHBhc3NlZCBpbiBleGNlcHRpb24KLQkgKiBjYXVzZWQgdGhlIGVycm9yLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRFcnJvcihUZXN0IHRlc3QsIFRocm93YWJsZSB0KSB7Ci0JCWZFcnJvcnMuYWRkRWxlbWVudChuZXcgVGVzdEZhaWx1cmUodGVzdCwgdCkpOwotCQlmb3IgKEVudW1lcmF0aW9uIGU9IGNsb25lTGlzdGVuZXJzKCkuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTsgKSB7Ci0JCQkoKFRlc3RMaXN0ZW5lcillLm5leHRFbGVtZW50KCkpLmFkZEVycm9yKHRlc3QsIHQpOwotCQl9Ci0JfQotCS8qKgotCSAqIEFkZHMgYSBmYWlsdXJlIHRvIHRoZSBsaXN0IG9mIGZhaWx1cmVzLiBUaGUgcGFzc2VkIGluIGV4Y2VwdGlvbgotCSAqIGNhdXNlZCB0aGUgZmFpbHVyZS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkRmFpbHVyZShUZXN0IHRlc3QsIEFzc2VydGlvbkZhaWxlZEVycm9yIHQpIHsKLQkJZkZhaWx1cmVzLmFkZEVsZW1lbnQobmV3IFRlc3RGYWlsdXJlKHRlc3QsIHQpKTsKLQkJZm9yIChFbnVtZXJhdGlvbiBlPSBjbG9uZUxpc3RlbmVycygpLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7ICkgewotCQkJKChUZXN0TGlzdGVuZXIpZS5uZXh0RWxlbWVudCgpKS5hZGRGYWlsdXJlKHRlc3QsIHQpOwotCQl9Ci0JfQotCS8qKgotCSAqIFJlZ2lzdGVycyBhIFRlc3RMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRMaXN0ZW5lcihUZXN0TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZkxpc3RlbmVycy5hZGRFbGVtZW50KGxpc3RlbmVyKTsKLQl9Ci0JLyoqCi0JICogVW5yZWdpc3RlcnMgYSBUZXN0TGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlTGlzdGVuZXIoVGVzdExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWZMaXN0ZW5lcnMucmVtb3ZlRWxlbWVudChsaXN0ZW5lcik7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgVmVjdG9yIGNsb25lTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gKFZlY3RvcilmTGlzdGVuZXJzLmNsb25lKCk7Ci0JfQotCS8qKgotCSAqIEluZm9ybXMgdGhlIHJlc3VsdCB0aGF0IGEgdGVzdCB3YXMgY29tcGxldGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFRlc3QoVGVzdCB0ZXN0KSB7Ci0JCWZvciAoRW51bWVyYXRpb24gZT0gY2xvbmVMaXN0ZW5lcnMoKS5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyApIHsKLQkJCSgoVGVzdExpc3RlbmVyKWUubmV4dEVsZW1lbnQoKSkuZW5kVGVzdCh0ZXN0KTsKLQkJfQotCX0KLQkvKioKLQkgKiBHZXRzIHRoZSBudW1iZXIgb2YgZGV0ZWN0ZWQgZXJyb3JzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGVycm9yQ291bnQoKSB7Ci0JCXJldHVybiBmRXJyb3JzLnNpemUoKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyBhbiBFbnVtZXJhdGlvbiBmb3IgdGhlIGVycm9ycwotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgRW51bWVyYXRpb24gZXJyb3JzKCkgewotCQlyZXR1cm4gZkVycm9ycy5lbGVtZW50cygpOwotCX0KLQkvKioKLQkgKiBHZXRzIHRoZSBudW1iZXIgb2YgZGV0ZWN0ZWQgZmFpbHVyZXMuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgZmFpbHVyZUNvdW50KCkgewotCQlyZXR1cm4gZkZhaWx1cmVzLnNpemUoKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyBhbiBFbnVtZXJhdGlvbiBmb3IgdGhlIGZhaWx1cmVzCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBFbnVtZXJhdGlvbiBmYWlsdXJlcygpIHsKLQkJcmV0dXJuIGZGYWlsdXJlcy5lbGVtZW50cygpOwotCX0KLQkvKioKLQkgKiBSdW5zIGEgVGVzdENhc2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcnVuKGZpbmFsIFRlc3RDYXNlIHRlc3QpIHsKLQkJc3RhcnRUZXN0KHRlc3QpOwotCQlQcm90ZWN0YWJsZSBwPSBuZXcgUHJvdGVjdGFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm90ZWN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCQkJdGVzdC5ydW5CYXJlKCk7Ci0JCQl9Ci0JCX07Ci0JCXJ1blByb3RlY3RlZCh0ZXN0LCBwKTsKLQotCQllbmRUZXN0KHRlc3QpOwotCX0KLQkvKioKLQkgKiBHZXRzIHRoZSBudW1iZXIgb2YgcnVuIHRlc3RzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHJ1bkNvdW50KCkgewotCQlyZXR1cm4gZlJ1blRlc3RzOwotCX0KLQkvKioKLQkgKiBSdW5zIGEgVGVzdENhc2UuCi0JICovCi0JcHVibGljIHZvaWQgcnVuUHJvdGVjdGVkKGZpbmFsIFRlc3QgdGVzdCwgUHJvdGVjdGFibGUgcCkgewotCQl0cnkgewotCQkJcC5wcm90ZWN0KCk7Ci0JCX0gCi0JCWNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBlKSB7Ci0JCQlhZGRGYWlsdXJlKHRlc3QsIGUpOwotCQl9Ci0JCWNhdGNoIChUaHJlYWREZWF0aCBlKSB7IC8vIGRvbid0IGNhdGNoIFRocmVhZERlYXRoIGJ5IGFjY2lkZW50Ci0JCQl0aHJvdyBlOwotCQl9Ci0JCWNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJYWRkRXJyb3IodGVzdCwgZSk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogR2V0cyB0aGUgbnVtYmVyIG9mIHJ1biB0ZXN0cy4KLQkgKiBAZGVwcmVjYXRlZCB1c2UgPGNvZGU+cnVuQ291bnQ8L2NvZGU+IGluc3RlYWQKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBydW5UZXN0cygpIHsKLQkJcmV0dXJuIHJ1bkNvdW50KCk7Ci0JfQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSB0ZXN0IHJ1biBzaG91bGQgc3RvcAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzaG91bGRTdG9wKCkgewotCQlyZXR1cm4gZlN0b3A7Ci0JfQotCS8qKgotCSAqIEluZm9ybXMgdGhlIHJlc3VsdCB0aGF0IGEgdGVzdCB3aWxsIGJlIHN0YXJ0ZWQuCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRUZXN0KFRlc3QgdGVzdCkgewotCQlmaW5hbCBpbnQgY291bnQ9IHRlc3QuY291bnRUZXN0Q2FzZXMoKTsKLQkJc3luY2hyb25pemVkKHRoaXMpIHsKLQkJCWZSdW5UZXN0cys9IGNvdW50OwotCQl9Ci0JCWZvciAoRW51bWVyYXRpb24gZT0gY2xvbmVMaXN0ZW5lcnMoKS5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyApIHsKLQkJCSgoVGVzdExpc3RlbmVyKWUubmV4dEVsZW1lbnQoKSkuc3RhcnRUZXN0KHRlc3QpOwotCQl9Ci0JfQotCS8qKgotCSAqIE1hcmtzIHRoYXQgdGhlIHRlc3QgcnVuIHNob3VsZCBzdG9wLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgewotCQlmU3RvcD0gdHJ1ZTsKLQl9Ci0JLyoqCi0JICogR2V0cyB0aGUgbnVtYmVyIG9mIGRldGVjdGVkIGVycm9ycy4KLQkgKiBAZGVwcmVjYXRlZCB1c2UgPGNvZGU+ZXJyb3JDb3VudDwvY29kZT4gaW5zdGVhZAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHRlc3RFcnJvcnMoKSB7Ci0JCXJldHVybiBlcnJvckNvdW50KCk7Ci0JfQotCS8qKgotCSAqIEdldHMgdGhlIG51bWJlciBvZiBkZXRlY3RlZCBmYWlsdXJlcy4KLQkgKiBAZGVwcmVjYXRlZCB1c2UgPGNvZGU+ZmFpbHVyZUNvdW50PC9jb2RlPiBpbnN0ZWFkCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgdGVzdEZhaWx1cmVzKCkgewotCQlyZXR1cm4gZmFpbHVyZUNvdW50KCk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgZW50aXJlIHRlc3Qgd2FzIHN1Y2Nlc3NmdWwgb3Igbm90LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiB3YXNTdWNjZXNzZnVsKCkgewotCQlyZXR1cm4gdGVzdEZhaWx1cmVzKCkgPT0gMCAmJiB0ZXN0RXJyb3JzKCkgPT0gMDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9mcmFtZXdvcmsvVGVzdFN1aXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L2ZyYW1ld29yay9UZXN0U3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIwNDc0Mi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L2ZyYW1ld29yay9UZXN0U3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi1wYWNrYWdlIGp1bml0LmZyYW1ld29yazsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLQotLyoqCi0gKiBBIDxjb2RlPlRlc3RTdWl0ZTwvY29kZT4gaXMgYSA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IG9mIFRlc3RzLgotICogSXQgcnVucyBhIGNvbGxlY3Rpb24gb2YgdGVzdCBjYXNlcy4gSGVyZSBpcyBhbiBleGFtcGxlIHVzaW5nCi0gKiB0aGUgZHluYW1pYyB0ZXN0IGRlZmluaXRpb24uCi0gKiA8cHJlPgotICogVGVzdFN1aXRlIHN1aXRlPSBuZXcgVGVzdFN1aXRlKCk7Ci0gKiBzdWl0ZS5hZGRUZXN0KG5ldyBNYXRoVGVzdCgidGVzdEFkZCIpKTsKLSAqIHN1aXRlLmFkZFRlc3QobmV3IE1hdGhUZXN0KCJ0ZXN0RGl2aWRlQnlaZXJvIikpOwotICogPC9wcmU+Ci0gKiBBbHRlcm5hdGl2ZWx5LCBhIFRlc3RTdWl0ZSBjYW4gZXh0cmFjdCB0aGUgdGVzdHMgdG8gYmUgcnVuIGF1dG9tYXRpY2FsbHkuCi0gKiBUbyBkbyBzbyB5b3UgcGFzcyB0aGUgY2xhc3Mgb2YgeW91ciBUZXN0Q2FzZSBjbGFzcyB0byB0aGUKLSAqIFRlc3RTdWl0ZSBjb25zdHJ1Y3Rvci4KLSAqIDxwcmU+Ci0gKiBUZXN0U3VpdGUgc3VpdGU9IG5ldyBUZXN0U3VpdGUoTWF0aFRlc3QuY2xhc3MpOwotICogPC9wcmU+Ci0gKiBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBzdWl0ZSB3aXRoIGFsbCB0aGUgbWV0aG9kcwotICogc3RhcnRpbmcgd2l0aCAidGVzdCIgdGhhdCB0YWtlIG5vIGFyZ3VtZW50cy4KLSAqCi0gKiBAc2VlIFRlc3QKLSAqLwotcHVibGljIGNsYXNzIFRlc3RTdWl0ZSBpbXBsZW1lbnRzIFRlc3QgewotCi0JcHJpdmF0ZSBWZWN0b3IgZlRlc3RzPSBuZXcgVmVjdG9yKDEwKTsKLQlwcml2YXRlIFN0cmluZyBmTmFtZTsKLQotICAgLyoqCi0JICogQ29uc3RydWN0cyBhbiBlbXB0eSBUZXN0U3VpdGUuCi0JICovCi0JcHVibGljIFRlc3RTdWl0ZSgpIHsKLQl9Ci0JLyoqCi0JICogQ29uc3RydWN0cyBhIFRlc3RTdWl0ZSBmcm9tIHRoZSBnaXZlbiBjbGFzcy4gQWRkcyBhbGwgdGhlIG1ldGhvZHMKLQkgKiBzdGFydGluZyB3aXRoICJ0ZXN0IiBhcyB0ZXN0IGNhc2VzIHRvIHRoZSBzdWl0ZS4KLQkgKiBQYXJ0cyBvZiB0aGlzIG1ldGhvZCB3YXMgd3JpdHRlbiBhdCAyMzM3IG1ldGVycyBpbiB0aGUgSPxmZmlo/HR0ZSwKLQkgKiBLYW50b24gVXJpCi0JICovCi0KLQkgcHVibGljIFRlc3RTdWl0ZShmaW5hbCBDbGFzcyB0aGVDbGFzcykgewotCQlmTmFtZT0gdGhlQ2xhc3MuZ2V0TmFtZSgpOwotCQlDb25zdHJ1Y3RvciBjb25zdHJ1Y3Rvcj0gbnVsbDsKLQkJdHJ5IHsJCi0JCQljb25zdHJ1Y3Rvcj0gZ2V0Q29uc3RydWN0b3IodGhlQ2xhc3MpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJYWRkVGVzdCh3YXJuaW5nKCJDbGFzcyAiK3RoZUNsYXNzLmdldE5hbWUoKSsiIGhhcyBubyBwdWJsaWMgY29uc3RydWN0b3IgVGVzdENhc2UoU3RyaW5nIG5hbWUpIikpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKCFNb2RpZmllci5pc1B1YmxpYyh0aGVDbGFzcy5nZXRNb2RpZmllcnMoKSkpIHsKLQkJCWFkZFRlc3Qod2FybmluZygiQ2xhc3MgIit0aGVDbGFzcy5nZXROYW1lKCkrIiBpcyBub3QgcHVibGljIikpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJQ2xhc3Mgc3VwZXJDbGFzcz0gdGhlQ2xhc3M7Ci0JCVZlY3RvciBuYW1lcz0gbmV3IFZlY3RvcigpOwotCQl3aGlsZSAoVGVzdC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHN1cGVyQ2xhc3MpKSB7Ci0JCQlNZXRob2RbXSBtZXRob2RzPSBzdXBlckNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpOwotCQkJZm9yIChpbnQgaT0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlhZGRUZXN0TWV0aG9kKG1ldGhvZHNbaV0sIG5hbWVzLCBjb25zdHJ1Y3Rvcik7Ci0JCQl9Ci0JCQlzdXBlckNsYXNzPSBzdXBlckNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLQkJfQotCQlpZiAoZlRlc3RzLnNpemUoKSA9PSAwKQotCQkJYWRkVGVzdCh3YXJuaW5nKCJObyB0ZXN0cyBmb3VuZCBpbiAiK3RoZUNsYXNzLmdldE5hbWUoKSkpOwotCX0KLSAgIAkvKioKLQkgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IFRlc3RTdWl0ZS4KLQkgKi8KLQlwdWJsaWMgVGVzdFN1aXRlKFN0cmluZyBuYW1lKSB7Ci0JCWZOYW1lPSBuYW1lOwotCX0KLQkvKioKLQkgKiBBZGRzIGEgdGVzdCB0byB0aGUgc3VpdGUuCi0JICovCi0JcHVibGljIHZvaWQgYWRkVGVzdChUZXN0IHRlc3QpIHsKLQkJZlRlc3RzLmFkZEVsZW1lbnQodGVzdCk7Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgdGhlIHRlc3RzIGZyb20gdGhlIGdpdmVuIGNsYXNzIHRvIHRoZSBzdWl0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRlc3RTdWl0ZShDbGFzcyB0ZXN0Q2xhc3MpIHsKLQkJYWRkVGVzdChuZXcgVGVzdFN1aXRlKHRlc3RDbGFzcykpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRUZXN0TWV0aG9kKE1ldGhvZCBtLCBWZWN0b3IgbmFtZXMsIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yKSB7Ci0JCVN0cmluZyBuYW1lPSBtLmdldE5hbWUoKTsKLQkJaWYgKG5hbWVzLmNvbnRhaW5zKG5hbWUpKSAKLQkJCXJldHVybjsKLQkJaWYgKGlzUHVibGljVGVzdE1ldGhvZChtKSkgewotCQkJbmFtZXMuYWRkRWxlbWVudChuYW1lKTsKLQotCQkJT2JqZWN0W10gYXJncz0gbmV3IE9iamVjdFtde25hbWV9OwotCQkJdHJ5IHsKLQkJCQlhZGRUZXN0KChUZXN0KWNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKGFyZ3MpKTsKLQkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJCWFkZFRlc3Qod2FybmluZygiQ2Fubm90IGluc3RhbnRpYXRlIHRlc3QgY2FzZTogIituYW1lKyIgKCIrZXhjZXB0aW9uVG9TdHJpbmcoZSkrIikiKSk7Ci0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQlhZGRUZXN0KHdhcm5pbmcoIkV4Y2VwdGlvbiBpbiBjb25zdHJ1Y3RvcjogIituYW1lKyIgKCIrZXhjZXB0aW9uVG9TdHJpbmcoZS5nZXRUYXJnZXRFeGNlcHRpb24oKSkrIikiKSk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCQlhZGRUZXN0KHdhcm5pbmcoIkNhbm5vdCBhY2Nlc3MgdGVzdCBjYXNlOiAiK25hbWUrIiAoIitleGNlcHRpb25Ub1N0cmluZyhlKSsiKSIpKTsKLQkJCX0KLQotCQl9IGVsc2UgeyAvLyBhbG1vc3QgYSB0ZXN0IG1ldGhvZAotCQkJaWYgKGlzVGVzdE1ldGhvZChtKSkgCi0JCQkJYWRkVGVzdCh3YXJuaW5nKCJUZXN0IG1ldGhvZCBpc24ndCBwdWJsaWM6ICIrbS5nZXROYW1lKCkpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0cyB0aGUgc3RhY2sgdHJhY2UgaW50byBhIHN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGV4Y2VwdGlvblRvU3RyaW5nKFRocm93YWJsZSB0KSB7Ci0JCVN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXI9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJUHJpbnRXcml0ZXIgd3JpdGVyPSBuZXcgUHJpbnRXcml0ZXIoc3RyaW5nV3JpdGVyKTsKLQkJdC5wcmludFN0YWNrVHJhY2Uod3JpdGVyKTsKLQkJcmV0dXJuIHN0cmluZ1dyaXRlci50b1N0cmluZygpOwotCQkKLQl9Ci0JLyoqCi0JICogQ291bnRzIHRoZSBudW1iZXIgb2YgdGVzdCBjYXNlcyB0aGF0IHdpbGwgYmUgcnVuIGJ5IHRoaXMgdGVzdC4KLQkgKi8KLQlwdWJsaWMgaW50IGNvdW50VGVzdENhc2VzKCkgewotCQlpbnQgY291bnQ9IDA7Ci0JCWZvciAoRW51bWVyYXRpb24gZT0gdGVzdHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTsgKSB7Ci0JCQlUZXN0IHRlc3Q9IChUZXN0KWUubmV4dEVsZW1lbnQoKTsKLQkJCWNvdW50PSBjb3VudCArIHRlc3QuY291bnRUZXN0Q2FzZXMoKTsKLQkJfQotCQlyZXR1cm4gY291bnQ7Ci0JfQotCS8qKgotCSAqIEdldHMgYSBjb25zdHJ1Y3RvciB3aGljaCB0YWtlcyBhIHNpbmdsZSBTdHJpbmcgYXMKLQkgKiBpdHMgYXJndW1lbnQuCi0JICovCi0JcHJpdmF0ZSBDb25zdHJ1Y3RvciBnZXRDb25zdHJ1Y3RvcihDbGFzcyB0aGVDbGFzcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCUNsYXNzW10gYXJncz0geyBTdHJpbmcuY2xhc3MgfTsKLQkJcmV0dXJuIHRoZUNsYXNzLmdldENvbnN0cnVjdG9yKGFyZ3MpOwotCX0KLQkKLQkvKioKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNQdWJsaWNUZXN0TWV0aG9kKE1ldGhvZCBtKSB7Ci0JCXJldHVybiBpc1Rlc3RNZXRob2QobSkgJiYgTW9kaWZpZXIuaXNQdWJsaWMobS5nZXRNb2RpZmllcnMoKSk7Ci0JIH0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNUZXN0TWV0aG9kKE1ldGhvZCBtKSB7Ci0JCVN0cmluZyBuYW1lPSBtLmdldE5hbWUoKTsKLQkJQ2xhc3NbXSBwYXJhbWV0ZXJzPSBtLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCUNsYXNzIHJldHVyblR5cGU9IG0uZ2V0UmV0dXJuVHlwZSgpOwotCQlyZXR1cm4gcGFyYW1ldGVycy5sZW5ndGggPT0gMCAmJiBuYW1lLnN0YXJ0c1dpdGgoInRlc3QiKSAmJiByZXR1cm5UeXBlLmVxdWFscyhWb2lkLlRZUEUpOwotCSB9Ci0JLyoqCi0JICogUnVucyB0aGUgdGVzdHMgYW5kIGNvbGxlY3RzIHRoZWlyIHJlc3VsdCBpbiBhIFRlc3RSZXN1bHQuCi0JICovCi0JcHVibGljIHZvaWQgcnVuKFRlc3RSZXN1bHQgcmVzdWx0KSB7Ci0JCWZvciAoRW51bWVyYXRpb24gZT0gdGVzdHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTsgKSB7Ci0JICAJCWlmIChyZXN1bHQuc2hvdWxkU3RvcCgpICkKLQkgIAkJCWJyZWFrOwotCQkJVGVzdCB0ZXN0PSAoVGVzdCllLm5leHRFbGVtZW50KCk7Ci0JCQlydW5UZXN0KHRlc3QsIHJlc3VsdCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuVGVzdChUZXN0IHRlc3QsIFRlc3RSZXN1bHQgcmVzdWx0KSB7Ci0JCXRlc3QucnVuKHJlc3VsdCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRlc3QgYXQgdGhlIGdpdmVuIGluZGV4IAotCSAqLwotCXB1YmxpYyBUZXN0IHRlc3RBdChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChUZXN0KWZUZXN0cy5lbGVtZW50QXQoaW5kZXgpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGVzdHMgaW4gdGhpcyBzdWl0ZSAKLQkgKi8KLQlwdWJsaWMgaW50IHRlc3RDb3VudCgpIHsKLQkJcmV0dXJuIGZUZXN0cy5zaXplKCk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRlc3RzIGFzIGFuIGVudW1lcmF0aW9uCi0JICovCi0JcHVibGljIEVudW1lcmF0aW9uIHRlc3RzKCkgewotCQlyZXR1cm4gZlRlc3RzLmVsZW1lbnRzKCk7Ci0JfQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChnZXROYW1lKCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCSB9Ci0JCSAKLQkvKioKLQkgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBzdWl0ZS4KLQkgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZOYW1lPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHN1aXRlLiBOb3QgYWxsCi0JICogdGVzdCBzdWl0ZXMgaGF2ZSBhIG5hbWUgYW5kIHRoaXMgbWV0aG9kCi0JICogY2FuIHJldHVybiBudWxsLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGZOYW1lOwotCX0KLQkgCi0JLyoqCi0JICogUmV0dXJucyBhIHRlc3Qgd2hpY2ggd2lsbCBmYWlsIGFuZCBsb2cgYSB3YXJuaW5nIG1lc3NhZ2UuCi0JICovCi0JIHByaXZhdGUgVGVzdCB3YXJuaW5nKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBuZXcgVGVzdENhc2UoIndhcm5pbmciKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgewotCQkJCWZhaWwobWVzc2FnZSk7Ci0JCQl9Ci0JCX07CQkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9ydW5uZXIvQmFzZVRlc3RSdW5uZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvcnVubmVyL0Jhc2VUZXN0UnVubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxODAyMWIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9ydW5uZXIvQmFzZVRlc3RSdW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi1wYWNrYWdlIGp1bml0LnJ1bm5lcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS50ZXh0Lk51bWJlckZvcm1hdDsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgYWxsIHRlc3QgcnVubmVycy4KLSAqIFRoaXMgY2xhc3Mgd2FzIGJvcm4gbGl2ZSBvbiBzdGFnZSBpbiBTYXJkaW5pYSBkdXJpbmcgWFAyMDAwLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVRlc3RSdW5uZXIgaW1wbGVtZW50cyBUZXN0TGlzdGVuZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVSVRFX01FVEhPRE5BTUU9ICJzdWl0ZSI7Ci0JCi0Jc3RhdGljIFByb3BlcnRpZXMgZlByZWZlcmVuY2VzOwotCXN0YXRpYyBpbnQgZmdNYXhNZXNzYWdlTGVuZ3RoPSA1MDA7Ci0Jc3RhdGljIGJvb2xlYW4gZmdGaWx0ZXJTdGFjaz0gdHJ1ZTsKLQlib29sZWFuIGZMb2FkaW5nPSB0cnVlOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIFRlc3QgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gc3VpdGUuIFRoaXMgaXMKLQkgKiBhIHRlbXBsYXRlIG1ldGhvZCwgc3ViY2xhc3NlcyBvdmVycmlkZSBydW5GYWlsZWQoKSwgY2xlYXJTdGF0dXMoKS4KLQkgKi8KLQlwdWJsaWMgVGVzdCBnZXRUZXN0KFN0cmluZyBzdWl0ZUNsYXNzTmFtZSkgewotCQlpZiAoc3VpdGVDbGFzc05hbWUubGVuZ3RoKCkgPD0gMCkgewotCQkJY2xlYXJTdGF0dXMoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUNsYXNzIHRlc3RDbGFzcz0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRlc3RDbGFzcz0gbG9hZFN1aXRlQ2xhc3Moc3VpdGVDbGFzc05hbWUpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBjbGF6ej0gZS5nZXRNZXNzYWdlKCk7Ci0JCQlpZiAoY2xhenogPT0gbnVsbCkgCi0JCQkJY2xheno9IHN1aXRlQ2xhc3NOYW1lOwotCQkJcnVuRmFpbGVkKCJDbGFzcyBub3QgZm91bmQgXCIiK2NsYXp6KyJcIiIpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCXJ1bkZhaWxlZCgiRXJyb3I6ICIrZS50b1N0cmluZygpKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCU1ldGhvZCBzdWl0ZU1ldGhvZD0gbnVsbDsKLQkJdHJ5IHsKLQkJCXN1aXRlTWV0aG9kPSB0ZXN0Q2xhc3MuZ2V0TWV0aG9kKFNVSVRFX01FVEhPRE5BTUUsIG5ldyBDbGFzc1swXSk7Ci0JIAl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JIAkJLy8gdHJ5IHRvIGV4dHJhY3QgYSB0ZXN0IHN1aXRlIGF1dG9tYXRpY2FsbHkKLQkJCWNsZWFyU3RhdHVzKCk7CQkJCi0JCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZSh0ZXN0Q2xhc3MpOwotCQl9Ci0JCVRlc3QgdGVzdD0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRlc3Q9IChUZXN0KXN1aXRlTWV0aG9kLmludm9rZShudWxsLCBuZXcgQ2xhc3NbMF0pOyAvLyBzdGF0aWMgbWV0aG9kCi0JCQlpZiAodGVzdCA9PSBudWxsKQotCQkJCXJldHVybiB0ZXN0OwotCQl9IAotCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlydW5GYWlsZWQoIkZhaWxlZCB0byBpbnZva2Ugc3VpdGUoKToiICsgZS5nZXRUYXJnZXRFeGNlcHRpb24oKS50b1N0cmluZygpKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCXJ1bkZhaWxlZCgiRmFpbGVkIHRvIGludm9rZSBzdWl0ZSgpOiIgKyBlLnRvU3RyaW5nKCkpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCWNsZWFyU3RhdHVzKCk7Ci0JCXJldHVybiB0ZXN0OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgc3RyaW5nIG9mIHRoZSBlbGFwc2VkIHRpbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBlbGFwc2VkVGltZUFzU3RyaW5nKGxvbmcgcnVuVGltZSkgewotCQlyZXR1cm4gTnVtYmVyRm9ybWF0LmdldEluc3RhbmNlKCkuZm9ybWF0KChkb3VibGUpcnVuVGltZS8xMDAwKTsKLQl9Ci0JCi0JLyoqCi0JICogUHJvY2Vzc2VzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGFuZAotCSAqIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHN1aXRlIGNsYXNzIHRvIHJ1biBvciBudWxsCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcm9jZXNzQXJndW1lbnRzKFN0cmluZ1tdIGFyZ3MpIHsKLQkJU3RyaW5nIHN1aXRlTmFtZT0gbnVsbDsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChhcmdzW2ldLmVxdWFscygiLW5vbG9hZGluZyIpKSB7Ci0JCQkJc2V0TG9hZGluZyhmYWxzZSk7Ci0JCQl9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItbm9maWx0ZXJzdGFjayIpKSB7Ci0JCQkJZmdGaWx0ZXJTdGFjaz0gZmFsc2U7Ci0JCQl9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItYyIpKSB7Ci0JCQkJaWYgKGFyZ3MubGVuZ3RoID4gaSsxKQotCQkJCQlzdWl0ZU5hbWU9IGV4dHJhY3RDbGFzc05hbWUoYXJnc1tpKzFdKTsKLQkJCQllbHNlCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTWlzc2luZyBUZXN0IGNsYXNzIG5hbWUiKTsKLQkJCQlpKys7Ci0JCQl9IGVsc2UgewotCQkJCXN1aXRlTmFtZT0gYXJnc1tpXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VpdGVOYW1lOwkJCi0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbG9hZGluZyBiZWhhdmlvdXIgb2YgdGhlIHRlc3QgcnVubmVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9hZGluZyhib29sZWFuIGVuYWJsZSkgewotCQlmTG9hZGluZz0gZW5hYmxlOwotCX0KLQkvKioKLQkgKiBFeHRyYWN0IHRoZSBjbGFzcyBuYW1lIGZyb20gYSBTdHJpbmcgaW4gVkEvSmF2YSBzdHlsZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmKGNsYXNzTmFtZS5zdGFydHNXaXRoKCJEZWZhdWx0IHBhY2thZ2UgZm9yIikpIAotCQkJcmV0dXJuIGNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikrMSk7Ci0JCXJldHVybiBjbGFzc05hbWU7Ci0JfQotCQotCS8qKgotCSAqIFRydW5jYXRlcyBhIFN0cmluZyB0byB0aGUgbWF4aW11bSBsZW5ndGguCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHJ1bmNhdGUoU3RyaW5nIHMpIHsKLQkJaWYgKGZnTWF4TWVzc2FnZUxlbmd0aCAhPSAtMSAmJiBzLmxlbmd0aCgpID4gZmdNYXhNZXNzYWdlTGVuZ3RoKQotCQkJcz0gcy5zdWJzdHJpbmcoMCwgZmdNYXhNZXNzYWdlTGVuZ3RoKSsiLi4uIjsKLQkJcmV0dXJuIHM7Ci0JfQotCQotCS8qKgotCSAqIE92ZXJyaWRlIHRvIGRlZmluZSBob3cgdG8gaGFuZGxlIGEgZmFpbGVkIGxvYWRpbmcgb2YKLQkgKiBhIHRlc3Qgc3VpdGUuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcnVuRmFpbGVkKFN0cmluZyBtZXNzYWdlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2FkZWQgQ2xhc3MgZm9yIGEgc3VpdGUgbmFtZS4gCi0JICovCi0JcHJvdGVjdGVkIENsYXNzIGxvYWRTdWl0ZUNsYXNzKFN0cmluZyBzdWl0ZUNsYXNzTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0TG9hZGVyKCkubG9hZChzdWl0ZUNsYXNzTmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIENsZWFycyB0aGUgc3RhdHVzIG1lc3NhZ2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJTdGF0dXMoKSB7IC8vIEJlbG9uZ3MgaW4gdGhlIEdVSSBUZXN0UnVubmVyIGNsYXNzCi0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvYWRlciB0byBiZSB1c2VkLgotCSAqLwotCXB1YmxpYyBUZXN0U3VpdGVMb2FkZXIgZ2V0TG9hZGVyKCkgewotCQlpZiAodXNlUmVsb2FkaW5nVGVzdFN1aXRlTG9hZGVyKCkpCi0JCQlyZXR1cm4gbmV3IFJlbG9hZGluZ1Rlc3RTdWl0ZUxvYWRlcigpOwotCQlyZXR1cm4gbmV3IFN0YW5kYXJkVGVzdFN1aXRlTG9hZGVyKCk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHVzZVJlbG9hZGluZ1Rlc3RTdWl0ZUxvYWRlcigpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2UoImxvYWRpbmciKS5lcXVhbHMoInRydWUiKSAmJiAhaW5WQUphdmEoKSAmJiBmTG9hZGluZzsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZSBnZXRQcmVmZXJlbmNlc0ZpbGUoKSB7Ci0JIAlTdHJpbmcgaG9tZT0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsKLSAJCXJldHVybiBuZXcgRmlsZShob21lLCAianVuaXQucHJvcGVydGllcyIpOwotIAl9Ci0gCQotIAlwcml2YXRlIHN0YXRpYyB2b2lkIHJlYWRQcmVmZXJlbmNlcygpIHsKLSAJCUlucHV0U3RyZWFtIGlzPSBudWxsOwotIAkJdHJ5IHsKLSAJCQlpcz0gbmV3IEZpbGVJbnB1dFN0cmVhbShnZXRQcmVmZXJlbmNlc0ZpbGUoKSk7Ci0gCQkJZlByZWZlcmVuY2VzPSBuZXcgUHJvcGVydGllcyhmUHJlZmVyZW5jZXMpOwotCQkJZlByZWZlcmVuY2VzLmxvYWQoaXMpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0cnkgewotCQkJCWlmIChpcyAhPSBudWxsKQotCQkJCQlpcy5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCX0KLQkJfQotIAl9Ci0gCQotIAlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcmVmZXJlbmNlKFN0cmluZyBrZXkpIHsKLSAJCXJldHVybiBmUHJlZmVyZW5jZXMuZ2V0UHJvcGVydHkoa2V5KTsKLSAJfQotIAkKLSAJcHVibGljIHN0YXRpYyBpbnQgZ2V0UHJlZmVyZW5jZShTdHJpbmcga2V5LCBpbnQgZGZsdCkgewotIAkJU3RyaW5nIHZhbHVlPSBnZXRQcmVmZXJlbmNlKGtleSk7Ci0gCQlpbnQgaW50VmFsdWU9IGRmbHQ7Ci0gCQlpZiAodmFsdWUgPT0gbnVsbCkKLSAJCQlyZXR1cm4gaW50VmFsdWU7Ci0gCQl0cnkgewotIAkJCWludFZhbHVlPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKLSAJIAl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmUpIHsKLSAJCX0KLSAJCXJldHVybiBpbnRWYWx1ZTsKLSAJfQotCi0gCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpblZBSmF2YSgpIHsKLQkJdHJ5IHsKLQkJCUNsYXNzLmZvck5hbWUoImNvbS5pYm0udXZtLnRvb2xzLkRlYnVnU3VwcG9ydCIpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyBhIGZpbHRlcmVkIHN0YWNrIHRyYWNlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsdGVyZWRUcmFjZShUaHJvd2FibGUgdCkgeyAKLQkJU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlcj0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlQcmludFdyaXRlciB3cml0ZXI9IG5ldyBQcmludFdyaXRlcihzdHJpbmdXcml0ZXIpOwotCQl0LnByaW50U3RhY2tUcmFjZSh3cml0ZXIpOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyPSBzdHJpbmdXcml0ZXIuZ2V0QnVmZmVyKCk7Ci0JCVN0cmluZyB0cmFjZT0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBCYXNlVGVzdFJ1bm5lci5maWx0ZXJTdGFjayh0cmFjZSk7Ci0JfQotCi0JLyoqCi0JICogRmlsdGVycyBzdGFjayBmcmFtZXMgZnJvbSBpbnRlcm5hbCBKVW5pdCBjbGFzc2VzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsdGVyU3RhY2soU3RyaW5nIHN0YWNrKSB7Ci0JCWlmICghZ2V0UHJlZmVyZW5jZSgiZmlsdGVyc3RhY2siKS5lcXVhbHMoInRydWUiKSB8fCBmZ0ZpbHRlclN0YWNrID09IGZhbHNlKQotCQkJcmV0dXJuIHN0YWNrOwotCQkJCi0JCVN0cmluZ1dyaXRlciBzdz0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlQcmludFdyaXRlciBwdz0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQkJU3RyaW5nUmVhZGVyIHNyPSBuZXcgU3RyaW5nUmVhZGVyKHN0YWNrKTsKLQkJQnVmZmVyZWRSZWFkZXIgYnI9IG5ldyBCdWZmZXJlZFJlYWRlcihzcik7Ci0JCQotCQlTdHJpbmcgbGluZTsKLQkJdHJ5IHsJCi0JCQl3aGlsZSAoKGxpbmU9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLQkJCQlpZiAoIWZpbHRlckxpbmUobGluZSkpCi0JCQkJCXB3LnByaW50bG4obGluZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBJT0V4Y2VwdGlvbikgewotCQkJcmV0dXJuIHN0YWNrOyAvLyByZXR1cm4gdGhlIHN0YWNrIHVuZmlsdGVyZWQKLQkJfQotCQlyZXR1cm4gc3cudG9TdHJpbmcoKTsKLQl9Ci0JCi0Jc3RhdGljIGJvb2xlYW4gZmlsdGVyTGluZShTdHJpbmcgbGluZSkgewotCQlTdHJpbmdbXSBwYXR0ZXJucz0gbmV3IFN0cmluZ1tdIHsKLQkJCSJqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UiLAotCQkJImp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0IiwKLQkJCSJqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlIiwKLQkJCSJqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LiIsIC8vIGRvbid0IGZpbHRlciBBc3NlcnRpb25GYWlsdXJlCi0JCQkianVuaXQuc3dpbmd1aS5UZXN0UnVubmVyIiwKLQkJCSJqdW5pdC5hd3R1aS5UZXN0UnVubmVyIiwKLQkJCSJqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lciIsCi0JCQkiamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLmludm9rZSgiCi0JCX07Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBwYXR0ZXJucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGxpbmUuaW5kZXhPZihwYXR0ZXJuc1tpXSkgPiAwKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLSAJewotIAkJZlByZWZlcmVuY2VzPSBuZXcgUHJvcGVydGllcygpOwotIAkJLy9KREsgMS4yIGZlYXR1cmUKLSAJCS8vZlByZWZlcmVuY2VzLnNldFByb3BlcnR5KCJsb2FkaW5nIiwgInRydWUiKTsKLSAJCWZQcmVmZXJlbmNlcy5wdXQoImxvYWRpbmciLCAidHJ1ZSIpOwotIAkJZlByZWZlcmVuY2VzLnB1dCgiZmlsdGVyc3RhY2siLCAidHJ1ZSIpOwotICAJCXJlYWRQcmVmZXJlbmNlcygpOwotIAkJZmdNYXhNZXNzYWdlTGVuZ3RoPSBnZXRQcmVmZXJlbmNlKCJtYXhtZXNzYWdlIiwgZmdNYXhNZXNzYWdlTGVuZ3RoKTsKLSAJfQotIAkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3J1bm5lci9DbGFzc1BhdGhUZXN0Q29sbGVjdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3J1bm5lci9DbGFzc1BhdGhUZXN0Q29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNjE0YTguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9ydW5uZXIvQ2xhc3NQYXRoVGVzdENvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotcGFja2FnZSBqdW5pdC5ydW5uZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgYSBUZXN0Q29sbGVjdG9yIHRoYXQgY29uc3VsdHMgdGhlCi0gKiBjbGFzcyBwYXRoLiBJdCBjb25zaWRlcnMgYWxsIGNsYXNzZXMgb24gdGhlIGNsYXNzIHBhdGgKLSAqIGV4Y2x1ZGluZyBjbGFzc2VzIGluIEpBUnMuIEl0IGxlYXZlcyBpdCB1cCB0byBzdWJjbGFzc2VzCi0gKiB0byBkZWNpZGUgd2hldGhlciBhIGNsYXNzIGlzIGEgcnVubmFibGUgVGVzdC4KLSAqCi0gKiBAc2VlIFRlc3RDb2xsZWN0b3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENsYXNzUGF0aFRlc3RDb2xsZWN0b3IgaW1wbGVtZW50cyBUZXN0Q29sbGVjdG9yIHsKLQkKLQlzdGF0aWMgZmluYWwgaW50IFNVRkZJWF9MRU5HVEg9ICIuY2xhc3MiLmxlbmd0aCgpOwotCQotCXB1YmxpYyBDbGFzc1BhdGhUZXN0Q29sbGVjdG9yKCkgewotCX0KLQkKLQlwdWJsaWMgRW51bWVyYXRpb24gY29sbGVjdFRlc3RzKCkgewotCQlTdHJpbmcgY2xhc3NQYXRoPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuY2xhc3MucGF0aCIpOwotCQlTdHJpbmcgc2VwYXJhdG9yPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInBhdGguc2VwYXJhdG9yIik7Ci0JCUhhc2h0YWJsZSByZXN1bHQ9IG5ldyBIYXNodGFibGUoMTAwKTsKLQkJY29sbGVjdEZpbGVzSW5Sb290cyhzcGxpdENsYXNzUGF0aChjbGFzc1BhdGgsIHNlcGFyYXRvciksIHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQuZWxlbWVudHMoKTsKLQl9Ci0JCi0Jdm9pZCBjb2xsZWN0RmlsZXNJblJvb3RzKFZlY3RvciByb290cywgSGFzaHRhYmxlIHJlc3VsdCkgewotCQlFbnVtZXJhdGlvbiBlPSByb290cy5lbGVtZW50cygpOwotCQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgCi0JCQlnYXRoZXJGaWxlcyhuZXcgRmlsZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSksICIiLCByZXN1bHQpOwotCX0KLQotCXZvaWQgZ2F0aGVyRmlsZXMoRmlsZSBjbGFzc1Jvb3QsIFN0cmluZyBjbGFzc0ZpbGVOYW1lLCBIYXNodGFibGUgcmVzdWx0KSB7Ci0JCUZpbGUgdGhpc1Jvb3Q9IG5ldyBGaWxlKGNsYXNzUm9vdCwgY2xhc3NGaWxlTmFtZSk7Ci0JCWlmICh0aGlzUm9vdC5pc0ZpbGUoKSkgewotCQkJaWYgKGlzVGVzdENsYXNzKGNsYXNzRmlsZU5hbWUpKSB7Ci0JCQkJU3RyaW5nIGNsYXNzTmFtZT0gY2xhc3NOYW1lRnJvbUZpbGUoY2xhc3NGaWxlTmFtZSk7Ci0JCQkJcmVzdWx0LnB1dChjbGFzc05hbWUsIGNsYXNzTmFtZSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0JCQotCQlTdHJpbmdbXSBjb250ZW50cz0gdGhpc1Jvb3QubGlzdCgpOwotCQlpZiAoY29udGVudHMgIT0gbnVsbCkgeyAKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBjb250ZW50cy5sZW5ndGg7IGkrKykgCi0JCQkJZ2F0aGVyRmlsZXMoY2xhc3NSb290LCBjbGFzc0ZpbGVOYW1lK0ZpbGUuc2VwYXJhdG9yQ2hhcitjb250ZW50c1tpXSwgcmVzdWx0KTsJCQotCQl9Ci0JfQotCQotCVZlY3RvciBzcGxpdENsYXNzUGF0aChTdHJpbmcgY2xhc3NQYXRoLCBTdHJpbmcgc2VwYXJhdG9yKSB7Ci0JCVZlY3RvciByZXN1bHQ9IG5ldyBWZWN0b3IoKTsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplcj0gbmV3IFN0cmluZ1Rva2VuaXplcihjbGFzc1BhdGgsIHNlcGFyYXRvcik7Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSAKLQkJCXJlc3VsdC5hZGRFbGVtZW50KHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzVGVzdENsYXNzKFN0cmluZyBjbGFzc0ZpbGVOYW1lKSB7Ci0JCXJldHVybiAKLQkJCWNsYXNzRmlsZU5hbWUuZW5kc1dpdGgoIi5jbGFzcyIpICYmIAotCQkJY2xhc3NGaWxlTmFtZS5pbmRleE9mKCckJykgPCAwICYmCi0JCQljbGFzc0ZpbGVOYW1lLmluZGV4T2YoIlRlc3QiKSA+IDA7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgY2xhc3NOYW1lRnJvbUZpbGUoU3RyaW5nIGNsYXNzRmlsZU5hbWUpIHsKLQkJLy8gY29udmVydCAvYS9iLmNsYXNzIHRvIGEuYgotCQlTdHJpbmcgcz0gY2xhc3NGaWxlTmFtZS5zdWJzdHJpbmcoMCwgY2xhc3NGaWxlTmFtZS5sZW5ndGgoKS1TVUZGSVhfTEVOR1RIKTsKLQkJU3RyaW5nIHMyPSBzLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLicpOwotCQlpZiAoczIuc3RhcnRzV2l0aCgiLiIpKQotCQkJcmV0dXJuIHMyLnN1YnN0cmluZygxKTsKLQkJcmV0dXJuIHMyOwotCX0JCi19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3J1bm5lci9GYWlsdXJlRGV0YWlsVmlldy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9ydW5uZXIvRmFpbHVyZURldGFpbFZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ1NjJhZi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3J1bm5lci9GYWlsdXJlRGV0YWlsVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotcGFja2FnZSBqdW5pdC5ydW5uZXI7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7IAotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogQSB2aWV3IHRvIHNob3cgYSBkZXRhaWxzIGFib3V0IGEgZmFpbHVyZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZhaWx1cmVEZXRhaWxWaWV3IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb21wb25lbnQgdXNlZCB0byBwcmVzZW50IHRoZSBUcmFjZVZpZXcKLQkgKi8KLQlwdWJsaWMgQ29tcG9uZW50IGdldENvbXBvbmVudCgpOwotCS8qKgotCSAqIFNob3dzIGRldGFpbHMgb2YgYSBUZXN0RmFpbHVyZQotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dGYWlsdXJlKFRlc3RGYWlsdXJlIGZhaWx1cmUpOwotCS8qKgotCSAqIENsZWFycyB0aGUgdmlldwotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9ydW5uZXIvTG9hZGluZ1Rlc3RDb2xsZWN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvcnVubmVyL0xvYWRpbmdUZXN0Q29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YjdhZTQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9ydW5uZXIvTG9hZGluZ1Rlc3RDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLXBhY2thZ2UganVuaXQucnVubmVyOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqdW5pdC5ydW5uZXIuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBhIFRlc3RDb2xsZWN0b3IgdGhhdCBsb2FkcwotICogYWxsIGNsYXNzZXMgb24gdGhlIGNsYXNzIHBhdGggYW5kIHRlc3RzIHdoZXRoZXIKLSAqIGl0IGlzIGFzc2lnbmFibGUgZnJvbSBUZXN0IG9yIHByb3ZpZGVzIGEgc3RhdGljIHN1aXRlIG1ldGhvZC4KLSAqIEBzZWUgVGVzdENvbGxlY3RvcgotICovCi1wdWJsaWMgY2xhc3MgTG9hZGluZ1Rlc3RDb2xsZWN0b3IgZXh0ZW5kcyBDbGFzc1BhdGhUZXN0Q29sbGVjdG9yIHsKLQkKLQlUZXN0Q2FzZUNsYXNzTG9hZGVyIGZMb2FkZXI7Ci0JCi0JcHVibGljIExvYWRpbmdUZXN0Q29sbGVjdG9yKCkgewotCQlmTG9hZGVyPSBuZXcgVGVzdENhc2VDbGFzc0xvYWRlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Rlc3RDbGFzcyhTdHJpbmcgY2xhc3NGaWxlTmFtZSkgewkKLQkJdHJ5IHsKLQkJCWlmIChjbGFzc0ZpbGVOYW1lLmVuZHNXaXRoKCIuY2xhc3MiKSkgewotCQkJCUNsYXNzIHRlc3RDbGFzcz0gY2xhc3NGcm9tRmlsZShjbGFzc0ZpbGVOYW1lKTsKLQkJCQlyZXR1cm4gKHRlc3RDbGFzcyAhPSBudWxsKSAmJiBpc1Rlc3RDbGFzcyh0ZXN0Q2xhc3MpOwotCQkJfQotCQl9IAotCQljYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleHBlY3RlZCkgewotCQl9Ci0JCWNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBub3RGYXRhbCkgewotCQl9IAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCUNsYXNzIGNsYXNzRnJvbUZpbGUoU3RyaW5nIGNsYXNzRmlsZU5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNsYXNzTmFtZT0gY2xhc3NOYW1lRnJvbUZpbGUoY2xhc3NGaWxlTmFtZSk7Ci0JCWlmICghZkxvYWRlci5pc0V4Y2x1ZGVkKGNsYXNzTmFtZSkpCi0JCQlyZXR1cm4gZkxvYWRlci5sb2FkQ2xhc3MoY2xhc3NOYW1lLCBmYWxzZSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlib29sZWFuIGlzVGVzdENsYXNzKENsYXNzIHRlc3RDbGFzcykgewotCQlpZiAoaGFzU3VpdGVNZXRob2QodGVzdENsYXNzKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoVGVzdC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRlc3RDbGFzcykgJiYKLQkJCU1vZGlmaWVyLmlzUHVibGljKHRlc3RDbGFzcy5nZXRNb2RpZmllcnMoKSkgJiYKLQkJCWhhc1B1YmxpY0NvbnN0cnVjdG9yKHRlc3RDbGFzcykpIAotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JYm9vbGVhbiBoYXNTdWl0ZU1ldGhvZChDbGFzcyB0ZXN0Q2xhc3MpIHsKLQkJdHJ5IHsKLQkJCU1ldGhvZCBzdWl0ZU1ldGhvZD0gdGVzdENsYXNzLmdldE1ldGhvZChCYXNlVGVzdFJ1bm5lci5TVUlURV9NRVRIT0ROQU1FLCBuZXcgQ2xhc3NbMF0pOwotCSAJfSBjYXRjaChFeGNlcHRpb24gZSkgewotCSAJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JYm9vbGVhbiBoYXNQdWJsaWNDb25zdHJ1Y3RvcihDbGFzcyB0ZXN0Q2xhc3MpIHsKLQkJQ2xhc3NbXSBhcmdzPSB7IFN0cmluZy5jbGFzcyB9OwotCQlDb25zdHJ1Y3RvciBjPSBudWxsOwotCQl0cnkgewotCQkJYz0gdGVzdENsYXNzLmdldENvbnN0cnVjdG9yKGFyZ3MpOwotCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3J1bm5lci9SZWxvYWRpbmdUZXN0U3VpdGVMb2FkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvcnVubmVyL1JlbG9hZGluZ1Rlc3RTdWl0ZUxvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzMzYmZhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvcnVubmVyL1JlbG9hZGluZ1Rlc3RTdWl0ZUxvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotcGFja2FnZSBqdW5pdC5ydW5uZXI7Ci0KLS8qKgotICogQSBUZXN0U3VpdGUgbG9hZGVyIHRoYXQgY2FuIHJlbG9hZCBjbGFzc2VzLgotICovCi1wdWJsaWMgY2xhc3MgUmVsb2FkaW5nVGVzdFN1aXRlTG9hZGVyIGltcGxlbWVudHMgVGVzdFN1aXRlTG9hZGVyIHsKLQlwdWJsaWMgQ2xhc3MgbG9hZChTdHJpbmcgc3VpdGVDbGFzc05hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJVGVzdENhc2VDbGFzc0xvYWRlciBsb2FkZXI9IG5ldyBUZXN0Q2FzZUNsYXNzTG9hZGVyKCk7Ci0JCXJldHVybiBsb2FkZXIubG9hZENsYXNzKHN1aXRlQ2xhc3NOYW1lLCB0cnVlKTsKLQl9Ci0JcHVibGljIENsYXNzIHJlbG9hZChDbGFzcyBhQ2xhc3MpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJVGVzdENhc2VDbGFzc0xvYWRlciBsb2FkZXI9IG5ldyBUZXN0Q2FzZUNsYXNzTG9hZGVyKCk7Ci0JCXJldHVybiBsb2FkZXIubG9hZENsYXNzKGFDbGFzcy5nZXROYW1lKCksIHRydWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3J1bm5lci9TaW1wbGVUZXN0Q29sbGVjdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3J1bm5lci9TaW1wbGVUZXN0Q29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMTk1NmEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9ydW5uZXIvU2ltcGxlVGVzdENvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotcGFja2FnZSBqdW5pdC5ydW5uZXI7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgYSBUZXN0Q29sbGVjdG9yIHRoYXQgY29uc2lkZXJzCi0gKiBhIGNsYXNzIHRvIGJlIGEgdGVzdCBjbGFzcyB3aGVuIGl0IGNvbnRhaW5zIHRoZQotICogcGF0dGVybiAiVGVzdCIgaW4gaXRzIG5hbWUKLSAqIEBzZWUgVGVzdENvbGxlY3RvcgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlVGVzdENvbGxlY3RvciBleHRlbmRzIENsYXNzUGF0aFRlc3RDb2xsZWN0b3IgewotCQotCXB1YmxpYyBTaW1wbGVUZXN0Q29sbGVjdG9yKCkgewotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Rlc3RDbGFzcyhTdHJpbmcgY2xhc3NGaWxlTmFtZSkgewotCQlyZXR1cm4gCi0JCQljbGFzc0ZpbGVOYW1lLmVuZHNXaXRoKCIuY2xhc3MiKSAmJiAKLQkJCWNsYXNzRmlsZU5hbWUuaW5kZXhPZignJCcpIDwgMCAmJgotCQkJY2xhc3NGaWxlTmFtZS5pbmRleE9mKCJUZXN0IikgPiAwOwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvcnVubmVyL1NvcnRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9ydW5uZXIvU29ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4Mjk2OTkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9ydW5uZXIvU29ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1wYWNrYWdlIGp1bml0LnJ1bm5lcjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQucnVubmVyLio7Ci0KLS8qKgotICogQSBjdXN0b20gcXVpY2sgc29ydCB3aXRoIHN1cHBvcnQgdG8gY3VzdG9taXplIHRoZSBzd2FwIGJlaGF2aW91ci4KLSAqIE5PVElDRTogV2UgY2FuJ3QgdXNlIHRoZSB0aGUgc29ydGluZyBzdXBwb3J0IGZyb20gdGhlIEpESyAxLjIgY29sbGVjdGlvbgotICogY2xhc3NlcyBiZWNhdXNlIG9mIHRoZSBKREsgMS4xLjcgY29tcGF0aWJpbGl0eS4KLSAqLwotcHVibGljIGNsYXNzIFNvcnRlciB7Ci0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgU3dhcHBlciB7Ci0JCXB1YmxpYyB2b2lkIHN3YXAoVmVjdG9yIHZhbHVlcywgaW50IGxlZnQsIGludCByaWdodCk7Ci0JfQotCQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc29ydFN0cmluZ3MoVmVjdG9yIHZhbHVlcyAsIGludCBsZWZ0LCBpbnQgcmlnaHQsIFN3YXBwZXIgc3dhcHBlcikgeyAKLQkJaW50IG9sZWZ0PSBsZWZ0OwotCQlpbnQgb3JpZ2h0PSByaWdodDsKLQkJU3RyaW5nIG1pZD0gKFN0cmluZyl2YWx1ZXMuZWxlbWVudEF0KChsZWZ0ICsgcmlnaHQpIC8gMik7IAotCQlkbyB7IAotCQkJd2hpbGUgKCgoU3RyaW5nKSh2YWx1ZXMuZWxlbWVudEF0KGxlZnQpKSkuY29tcGFyZVRvKG1pZCkgPCAwKSAgCi0JCQkJbGVmdCsrOyAKLQkJCXdoaWxlIChtaWQuY29tcGFyZVRvKChTdHJpbmcpKHZhbHVlcy5lbGVtZW50QXQocmlnaHQpKSkgPCAwKSAgCi0JCQkJcmlnaHQtLTsgCi0JCQlpZiAobGVmdCA8PSByaWdodCkgewotCQkJCXN3YXBwZXIuc3dhcCh2YWx1ZXMsIGxlZnQsIHJpZ2h0KTsgCi0JCQkJbGVmdCsrOyAKLQkJCQlyaWdodC0tOyAKLQkJCX0gCi0JCX0gd2hpbGUgKGxlZnQgPD0gcmlnaHQpOwotCQkKLQkJaWYgKG9sZWZ0IDwgcmlnaHQpIAotCQkJc29ydFN0cmluZ3ModmFsdWVzLCBvbGVmdCwgcmlnaHQsIHN3YXBwZXIpOyAKLQkJaWYgKGxlZnQgPCBvcmlnaHQpIAotCQkJIHNvcnRTdHJpbmdzKHZhbHVlcywgbGVmdCwgb3JpZ2h0LCBzd2FwcGVyKTsgCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvcnVubmVyL1N0YW5kYXJkVGVzdFN1aXRlTG9hZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3J1bm5lci9TdGFuZGFyZFRlc3RTdWl0ZUxvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGYyOWMxLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvcnVubmVyL1N0YW5kYXJkVGVzdFN1aXRlTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1wYWNrYWdlIGp1bml0LnJ1bm5lcjsKLQotLyoqCi0gKiBUaGUgc3RhbmRhcmQgdGVzdCBzdWl0ZSBsb2FkZXIuIEl0IGNhbiBvbmx5IGxvYWQgdGhlIHNhbWUgY2xhc3Mgb25jZS4KLSAqLwotcHVibGljIGNsYXNzIFN0YW5kYXJkVGVzdFN1aXRlTG9hZGVyIGltcGxlbWVudHMgVGVzdFN1aXRlTG9hZGVyIHsKLQkvKioKLQkgKiBVc2VzIHRoZSBzeXN0ZW0gY2xhc3MgbG9hZGVyIHRvIGxvYWQgdGhlIHRlc3QgY2xhc3MKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgbG9hZChTdHJpbmcgc3VpdGVDbGFzc05hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIENsYXNzLmZvck5hbWUoc3VpdGVDbGFzc05hbWUpOwotCX0KLQkvKioKLQkgKiBVc2VzIHRoZSBzeXN0ZW0gY2xhc3MgbG9hZGVyIHRvIGxvYWQgdGhlIHRlc3QgY2xhc3MKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgcmVsb2FkKENsYXNzIGFDbGFzcykgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gYUNsYXNzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3J1bm5lci9UZXN0Q2FzZUNsYXNzTG9hZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3J1bm5lci9UZXN0Q2FzZUNsYXNzTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMWQ2OTUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9ydW5uZXIvVGVzdENhc2VDbGFzc0xvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLXBhY2thZ2UganVuaXQucnVubmVyOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLio7Ci0KLS8qKgotICogQSBjdXN0b20gY2xhc3MgbG9hZGVyIHdoaWNoIGVuYWJsZXMgdGhlIHJlbG9hZGluZwotICogb2YgY2xhc3NlcyBmb3IgZWFjaCB0ZXN0IHJ1bi4gVGhlIGNsYXNzIGxvYWRlcgotICogY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aCBhIGxpc3Qgb2YgcGFja2FnZSBwYXRocyB0aGF0Ci0gKiBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSBsb2FkaW5nLiBUaGUgbG9hZGluZwotICogb2YgdGhlc2UgcGFja2FnZXMgaXMgZGVsZWdhdGVkIHRvIHRoZSBzeXN0ZW0gY2xhc3MKLSAqIGxvYWRlci4gVGhleSB3aWxsIGJlIHNoYXJlZCBhY3Jvc3MgdGVzdCBydW5zLgotICogPHA+Ci0gKiBUaGUgbGlzdCBvZiBleGNsdWRlZCBwYWNrYWdlIHBhdGhzIGlzIHNwZWNpZmllZCBpbgotICogYSBwcm9wZXJ0aWVzIGZpbGUgImV4Y2x1ZGVkLnByb3BlcnRpZXMiIHRoYXQgaXMgbG9jYXRlZCBpbiAKLSAqIHRoZSBzYW1lIHBsYWNlIGFzIHRoZSBUZXN0Q2FzZUNsYXNzTG9hZGVyIGNsYXNzLgotICogPHA+Ci0gKiA8Yj5Lbm93biBsaW1pdGF0aW9uOjwvYj4gdGhlIFRlc3RDYXNlQ2xhc3NMb2FkZXIgY2Fubm90IGxvYWQgY2xhc3NlcwotICogZnJvbSBqYXIgZmlsZXMuCi0gKi8KLQotCi1wdWJsaWMgY2xhc3MgVGVzdENhc2VDbGFzc0xvYWRlciBleHRlbmRzIENsYXNzTG9hZGVyIHsKLQkvKiogc2Nhbm5lZCBjbGFzcyBwYXRoICovCi0JcHJpdmF0ZSBWZWN0b3IgZlBhdGhJdGVtczsKLQkvKiogZGVmYXVsdCBleGNsdWRlZCBwYXRocyAqLwotCXByaXZhdGUgU3RyaW5nW10gZGVmYXVsdEV4Y2x1c2lvbnM9IHsKLQkJImp1bml0LmZyYW1ld29yay4iLCAKLQkJImp1bml0LmV4dGVuc2lvbnMuIiwgCi0JCSJqdW5pdC5ydW5uZXIuIgotCX07Ci0JLyoqIG5hbWUgb2YgZXhjbHVkZWQgcHJvcGVydGllcyBmaWxlICovCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFWENMVURFRF9GSUxFPSAiZXhjbHVkZWQucHJvcGVydGllcyI7Ci0JLyoqIGV4Y2x1ZGVkIHBhdGhzICovCi0JcHJpdmF0ZSBWZWN0b3IgZkV4Y2x1ZGVkOwotCSAKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgVGVzdENhc2VMb2FkZXIuIEl0IHNjYW5zIHRoZSBjbGFzcyBwYXRoCi0JICogYW5kIHRoZSBleGNsdWRlZCBwYWNrYWdlIHBhdGhzCi0JICovCi0JcHVibGljIFRlc3RDYXNlQ2xhc3NMb2FkZXIoKSB7Ci0JCXRoaXMoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBUZXN0Q2FzZUxvYWRlci4gSXQgc2NhbnMgdGhlIGNsYXNzIHBhdGgKLQkgKiBhbmQgdGhlIGV4Y2x1ZGVkIHBhY2thZ2UgcGF0aHMKLQkgKi8KLQlwdWJsaWMgVGVzdENhc2VDbGFzc0xvYWRlcihTdHJpbmcgY2xhc3NQYXRoKSB7Ci0JCXNjYW5QYXRoKGNsYXNzUGF0aCk7Ci0JCXJlYWRFeGNsdWRlZFBhY2thZ2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNjYW5QYXRoKFN0cmluZyBjbGFzc1BhdGgpIHsKLQkJU3RyaW5nIHNlcGFyYXRvcj0gU3lzdGVtLmdldFByb3BlcnR5KCJwYXRoLnNlcGFyYXRvciIpOwotCQlmUGF0aEl0ZW1zPSBuZXcgVmVjdG9yKDEwKTsKLQkJU3RyaW5nVG9rZW5pemVyIHN0PSBuZXcgU3RyaW5nVG9rZW5pemVyKGNsYXNzUGF0aCwgc2VwYXJhdG9yKTsKLQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJZlBhdGhJdGVtcy5hZGRFbGVtZW50KHN0Lm5leHRUb2tlbigpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgVVJMIGdldFJlc291cmNlKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBDbGFzc0xvYWRlci5nZXRTeXN0ZW1SZXNvdXJjZShuYW1lKTsKLQl9Ci0JCi0JcHVibGljIElucHV0U3RyZWFtIGdldFJlc291cmNlQXNTdHJlYW0oU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlQXNTdHJlYW0obmFtZSk7Ci0JfSAKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0V4Y2x1ZGVkKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBmRXhjbHVkZWQuc2l6ZSgpOyBpKyspIHsKLQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoKFN0cmluZykgZkV4Y2x1ZGVkLmVsZW1lbnRBdChpKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7CQotCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgbmFtZSwgYm9vbGVhbiByZXNvbHZlKQotCQl0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCQkKLQkJQ2xhc3MgYz0gZmluZExvYWRlZENsYXNzKG5hbWUpOwotCQlpZiAoYyAhPSBudWxsKQotCQkJcmV0dXJuIGM7Ci0JCS8vCi0JCS8vIERlbGVnYXRlIHRoZSBsb2FkaW5nIG9mIGV4Y2x1ZGVkIGNsYXNzZXMgdG8gdGhlCi0JCS8vIHN0YW5kYXJkIGNsYXNzIGxvYWRlci4KLQkJLy8KLQkJaWYgKGlzRXhjbHVkZWQobmFtZSkpIHsKLQkJCXRyeSB7Ci0JCQkJYz0gZmluZFN5c3RlbUNsYXNzKG5hbWUpOwotCQkJCXJldHVybiBjOwotCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8ga2VlcCBzZWFyY2hpbmcKLQkJCX0KLQkJfQotCQlpZiAoYyA9PSBudWxsKSB7Ci0JCQlieXRlW10gZGF0YT0gbG9va3VwQ2xhc3NEYXRhKG5hbWUpOwotCQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigpOwotCQkJYz0gZGVmaW5lQ2xhc3MobmFtZSwgZGF0YSwgMCwgZGF0YS5sZW5ndGgpOwotCQl9Ci0JCWlmIChyZXNvbHZlKSAKLQkJCXJlc29sdmVDbGFzcyhjKTsKLQkJcmV0dXJuIGM7Ci0JfQotCQotCXByaXZhdGUgYnl0ZVtdIGxvb2t1cENsYXNzRGF0YShTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCWJ5dGVbXSBkYXRhPSBudWxsOwotCQlmb3IgKGludCBpPSAwOyBpIDwgZlBhdGhJdGVtcy5zaXplKCk7IGkrKykgewotCQkJU3RyaW5nIHBhdGg9IChTdHJpbmcpIGZQYXRoSXRlbXMuZWxlbWVudEF0KGkpOwotCQkJU3RyaW5nIGZpbGVOYW1lPSBjbGFzc05hbWUucmVwbGFjZSgnLicsICcvJykrIi5jbGFzcyI7Ci0JCQlpZiAoaXNKYXIocGF0aCkpIHsKLQkJCQlkYXRhPSBsb2FkSmFyRGF0YShwYXRoLCBmaWxlTmFtZSk7Ci0JCQl9IGVsc2UgewotCQkJCWRhdGE9IGxvYWRGaWxlRGF0YShwYXRoLCBmaWxlTmFtZSk7Ci0JCQl9Ci0JCQlpZiAoZGF0YSAhPSBudWxsKQotCQkJCXJldHVybiBkYXRhOwotCQl9Ci0JCXRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKGNsYXNzTmFtZSk7Ci0JfQotCQkKLQlib29sZWFuIGlzSmFyKFN0cmluZyBwYXRoRW50cnkpIHsKLQkJcmV0dXJuIHBhdGhFbnRyeS5lbmRzV2l0aCgiLmphciIpIHx8IHBhdGhFbnRyeS5lbmRzV2l0aCgiLnppcCIpOwotCX0KLQotCXByaXZhdGUgYnl0ZVtdIGxvYWRGaWxlRGF0YShTdHJpbmcgcGF0aCwgU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCUZpbGUgZmlsZT0gbmV3IEZpbGUocGF0aCwgZmlsZU5hbWUpOwotCQlpZiAoZmlsZS5leGlzdHMoKSkgeyAKLQkJCXJldHVybiBnZXRDbGFzc0RhdGEoZmlsZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgYnl0ZVtdIGdldENsYXNzRGF0YShGaWxlIGYpIHsKLQkJdHJ5IHsKLQkJCUZpbGVJbnB1dFN0cmVhbSBzdHJlYW09IG5ldyBGaWxlSW5wdXRTdHJlYW0oZik7Ci0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0PSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDEwMDApOwotCQkJYnl0ZVtdIGI9IG5ldyBieXRlWzEwMDBdOwotCQkJaW50IG47Ci0JCQl3aGlsZSAoKG49IHN0cmVhbS5yZWFkKGIpKSAhPSAtMSkgCi0JCQkJb3V0LndyaXRlKGIsIDAsIG4pOwotCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQlvdXQuY2xvc2UoKTsKLQkJCXJldHVybiBvdXQudG9CeXRlQXJyYXkoKTsKLQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBieXRlW10gbG9hZEphckRhdGEoU3RyaW5nIHBhdGgsIFN0cmluZyBmaWxlTmFtZSkgewotCQlaaXBGaWxlIHppcEZpbGU9IG51bGw7Ci0JCUlucHV0U3RyZWFtIHN0cmVhbT0gbnVsbDsKLQkJRmlsZSBhcmNoaXZlPSBuZXcgRmlsZShwYXRoKTsKLQkJaWYgKCFhcmNoaXZlLmV4aXN0cygpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXRyeSB7Ci0JCQl6aXBGaWxlPSBuZXcgWmlwRmlsZShhcmNoaXZlKTsKLQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBpbykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJWmlwRW50cnkgZW50cnk9IHppcEZpbGUuZ2V0RW50cnkoZmlsZU5hbWUpOwotCQlpZiAoZW50cnkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgc2l6ZT0gKGludCkgZW50cnkuZ2V0U2l6ZSgpOwotCQl0cnkgewotCQkJc3RyZWFtPSB6aXBGaWxlLmdldElucHV0U3RyZWFtKGVudHJ5KTsKLQkJCWJ5dGVbXSBkYXRhPSBuZXcgYnl0ZVtzaXplXTsKLQkJCWludCBwb3M9IDA7Ci0JCQl3aGlsZSAocG9zIDwgc2l6ZSkgewotCQkJCWludCBuPSBzdHJlYW0ucmVhZChkYXRhLCBwb3MsIGRhdGEubGVuZ3RoIC0gcG9zKTsKLQkJCQlwb3MgKz0gbjsKLQkJCX0KLQkJCXppcEZpbGUuY2xvc2UoKTsKLQkJCXJldHVybiBkYXRhOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChzdHJlYW0gIT0gbnVsbCkKLQkJCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZWFkRXhjbHVkZWRQYWNrYWdlcygpIHsJCQotCQlmRXhjbHVkZWQ9IG5ldyBWZWN0b3IoMTApOwotCQlmb3IgKGludCBpPSAwOyBpIDwgZGVmYXVsdEV4Y2x1c2lvbnMubGVuZ3RoOyBpKyspCi0JCQlmRXhjbHVkZWQuYWRkRWxlbWVudChkZWZhdWx0RXhjbHVzaW9uc1tpXSk7Ci0JCQkKLQkJSW5wdXRTdHJlYW0gaXM9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShFWENMVURFRF9GSUxFKTsKLQkJaWYgKGlzID09IG51bGwpIAotCQkJcmV0dXJuOwotCQlQcm9wZXJ0aWVzIHA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCXRyeSB7Ci0JCQlwLmxvYWQoaXMpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlzLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJZm9yIChFbnVtZXJhdGlvbiBlPSBwLnByb3BlcnR5TmFtZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTsgKSB7Ci0JCQlTdHJpbmcga2V5PSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKLQkJCWlmIChrZXkuc3RhcnRzV2l0aCgiZXhjbHVkZWQuIikpIHsKLQkJCQlTdHJpbmcgcGF0aD0gcC5nZXRQcm9wZXJ0eShrZXkpOwotCQkJCXBhdGg9IHBhdGgudHJpbSgpOwotCQkJCWlmIChwYXRoLmVuZHNXaXRoKCIqIikpCi0JCQkJCXBhdGg9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCktMSk7Ci0JCQkJaWYgKHBhdGgubGVuZ3RoKCkgPiAwKSAKLQkJCQkJZkV4Y2x1ZGVkLmFkZEVsZW1lbnQocGF0aCk7CQkJCQotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvcnVubmVyL1Rlc3RDb2xsZWN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvcnVubmVyL1Rlc3RDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgwZDQ2MC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3J1bm5lci9UZXN0Q29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1wYWNrYWdlIGp1bml0LnJ1bm5lcjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogQ29sbGVjdHMgVGVzdCBjbGFzcyBuYW1lcyB0byBiZSBwcmVzZW50ZWQKLSAqIGJ5IHRoZSBUZXN0U2VsZWN0b3IuIAotICogQHNlZSBUZXN0U2VsZWN0b3IKLSAqLwotcHVibGljIGludGVyZmFjZSBUZXN0Q29sbGVjdG9yIHsKLQkvKioKLQkgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIG9mIFN0cmluZ3Mgd2l0aCBxdWFsaWZpZWQgY2xhc3MgbmFtZXMKLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb24gY29sbGVjdFRlc3RzKCk7Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3J1bm5lci9UZXN0U3VpdGVMb2FkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvcnVubmVyL1Rlc3RTdWl0ZUxvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGI1ODllLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvcnVubmVyL1Rlc3RTdWl0ZUxvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1wYWNrYWdlIGp1bml0LnJ1bm5lcjsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgdG8gZGVmaW5lIGhvdyBhIHRlc3Qgc3VpdGUgc2hvdWxkIGJlIGxvYWRlZC4KLSAqLwotcHVibGljIGludGVyZmFjZSBUZXN0U3VpdGVMb2FkZXIgewotCWFic3RyYWN0IHB1YmxpYyBDbGFzcyBsb2FkKFN0cmluZyBzdWl0ZUNsYXNzTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb247Ci0JYWJzdHJhY3QgcHVibGljIENsYXNzIHJlbG9hZChDbGFzcyBhQ2xhc3MpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvcnVubmVyL1ZlcnNpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvcnVubmVyL1ZlcnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMjA4MC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3J1bm5lci9WZXJzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1wYWNrYWdlIGp1bml0LnJ1bm5lcjsgICAKLSAgICAKLS8qKiAgIAotICogVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgSlVuaXQgICAKLSAqLyAgIAotcHVibGljIGNsYXNzIFZlcnNpb24geyAgIAotCXByaXZhdGUgVmVyc2lvbigpIHsgICAKLQkJLy8gZG9uJ3QgaW5zdGFudGlhdGUgICAKLQl9ICAgCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpZCgpIHsgICAKLQkJcmV0dXJuICIzLjciOyAgIAotCX0gICAKLX0gCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3N3aW5ndWkvQWJvdXREaWFsb2cuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvc3dpbmd1aS9BYm91dERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDZiMDJjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvc3dpbmd1aS9BYm91dERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotcGFja2FnZSBqdW5pdC5zd2luZ3VpOwotCi1pbXBvcnQgamF2YS5hd3QuKjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC4qOwotaW1wb3J0IGphdmF4LnN3aW5nLio7Ci0KLWltcG9ydCBqdW5pdC5ydW5uZXIuKjsKLQotLyoqCi0gKiBUaGUgQWJvdXREaWFsb2cuCi0gKi8KLWNsYXNzIEFib3V0RGlhbG9nIGV4dGVuZHMgSkRpYWxvZyB7Ci0JcHVibGljIEFib3V0RGlhbG9nKEpGcmFtZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50LCB0cnVlKTsKLQkJIAotCQlzZXRSZXNpemFibGUoZmFsc2UpOwotCQlnZXRDb250ZW50UGFuZSgpLnNldExheW91dChuZXcgR3JpZEJhZ0xheW91dCgpKTsKLQkJc2V0U2l6ZSgzMzAsIDEzOCk7Ci0JCXNldFRpdGxlKCJBYm91dCIpOwotCQlzZXRMb2NhdGlvblJlbGF0aXZlVG8ocGFyZW50KTsKLQotCQlKQnV0dG9uIGJ1dHRvbj0gbmV3IEpCdXR0b24oIkNsb3NlIik7Ci0JCWJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcigKLQkJCW5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotCQkJCQlkaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCQkKLQkJSkxhYmVsIGxhYmVsMT0gbmV3IEpMYWJlbCgiSlVuaXQiKTsKLQkJbGFiZWwxLnNldEZvbnQobmV3IEZvbnQoImRpYWxvZyIsIEZvbnQuUExBSU4sIDM2KSk7Ci0JCQotCQlKTGFiZWwgbGFiZWwyPSBuZXcgSkxhYmVsKCJKVW5pdCAiK1ZlcnNpb24uaWQoKSsiIGJ5IEtlbnQgQmVjayBhbmQgRXJpY2ggR2FtbWEiKTsKLQkJbGFiZWwyLnNldEZvbnQobmV3IEZvbnQoImRpYWxvZyIsIEZvbnQuUExBSU4sIDE0KSk7Ci0JCQotCQlKTGFiZWwgbG9nbz0gY3JlYXRlTG9nbygpOwotCi0JCUdyaWRCYWdDb25zdHJhaW50cyBjb25zdHJhaW50c0xhYmVsMT0gbmV3IEdyaWRCYWdDb25zdHJhaW50cygpOwotCQljb25zdHJhaW50c0xhYmVsMS5ncmlkeCA9IDM7IGNvbnN0cmFpbnRzTGFiZWwxLmdyaWR5ID0gMDsKLQkJY29uc3RyYWludHNMYWJlbDEuZ3JpZHdpZHRoID0gMTsgY29uc3RyYWludHNMYWJlbDEuZ3JpZGhlaWdodCA9IDE7Ci0JCWNvbnN0cmFpbnRzTGFiZWwxLmFuY2hvciA9IEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVI7Ci0JCWdldENvbnRlbnRQYW5lKCkuYWRkKGxhYmVsMSwgY29uc3RyYWludHNMYWJlbDEpOwotCi0JCUdyaWRCYWdDb25zdHJhaW50cyBjb25zdHJhaW50c0xhYmVsMj0gbmV3IEdyaWRCYWdDb25zdHJhaW50cygpOwotCQljb25zdHJhaW50c0xhYmVsMi5ncmlkeCA9IDI7IGNvbnN0cmFpbnRzTGFiZWwyLmdyaWR5ID0gMTsKLQkJY29uc3RyYWludHNMYWJlbDIuZ3JpZHdpZHRoID0gMjsgY29uc3RyYWludHNMYWJlbDIuZ3JpZGhlaWdodCA9IDE7Ci0JCWNvbnN0cmFpbnRzTGFiZWwyLmFuY2hvciA9IEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVI7Ci0JCWdldENvbnRlbnRQYW5lKCkuYWRkKGxhYmVsMiwgY29uc3RyYWludHNMYWJlbDIpOwotCi0JCUdyaWRCYWdDb25zdHJhaW50cyBjb25zdHJhaW50c0J1dHRvbjE9IG5ldyBHcmlkQmFnQ29uc3RyYWludHMoKTsKLQkJY29uc3RyYWludHNCdXR0b24xLmdyaWR4ID0gMjsgY29uc3RyYWludHNCdXR0b24xLmdyaWR5ID0gMjsKLQkJY29uc3RyYWludHNCdXR0b24xLmdyaWR3aWR0aCA9IDI7IGNvbnN0cmFpbnRzQnV0dG9uMS5ncmlkaGVpZ2h0ID0gMTsKLQkJY29uc3RyYWludHNCdXR0b24xLmFuY2hvciA9IEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVI7Ci0JCWNvbnN0cmFpbnRzQnV0dG9uMS5pbnNldHM9IG5ldyBJbnNldHMoOCwgMCwgOCwgMCk7Ci0JCWdldENvbnRlbnRQYW5lKCkuYWRkKGJ1dHRvbiwgY29uc3RyYWludHNCdXR0b24xKTsKLQotCQlHcmlkQmFnQ29uc3RyYWludHMgY29uc3RyYWludHNMb2dvMT0gbmV3IEdyaWRCYWdDb25zdHJhaW50cygpOwotCQljb25zdHJhaW50c0xvZ28xLmdyaWR4ID0gMjsgY29uc3RyYWludHNMb2dvMS5ncmlkeSA9IDA7Ci0JCWNvbnN0cmFpbnRzTG9nbzEuZ3JpZHdpZHRoID0gMTsgY29uc3RyYWludHNMb2dvMS5ncmlkaGVpZ2h0ID0gMTsKLQkJY29uc3RyYWludHNMb2dvMS5hbmNob3IgPSBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSOwotCQlnZXRDb250ZW50UGFuZSgpLmFkZChsb2dvLCBjb25zdHJhaW50c0xvZ28xKTsKLQotCQlhZGRXaW5kb3dMaXN0ZW5lcigKLQkJCW5ldyBXaW5kb3dBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZSkgewotCQkJCQlkaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQlwcm90ZWN0ZWQgSkxhYmVsIGNyZWF0ZUxvZ28oKSB7Ci0JCUljb24gaWNvbj0gVGVzdFJ1bm5lci5nZXRJY29uUmVzb3VyY2UoQmFzZVRlc3RSdW5uZXIuY2xhc3MsICJsb2dvLmdpZiIpOwotCQlyZXR1cm4gbmV3IEpMYWJlbChpY29uKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9zd2luZ3VpL0NvdW50ZXJQYW5lbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9zd2luZ3VpL0NvdW50ZXJQYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDg4ZWI3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvc3dpbmd1aS9Db3VudGVyUGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLXBhY2thZ2UganVuaXQuc3dpbmd1aTsKLQotaW1wb3J0IGphdmF4LnN3aW5nLio7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuKjsKLWltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuKjsKLWltcG9ydCBqYXZhLmF3dC4qOwotCi0vKioKLSAqIEEgcGFuZWwgd2l0aCB0ZXN0IHJ1biBjb3VudGVycwotICovCi1wdWJsaWMgY2xhc3MgQ291bnRlclBhbmVsIGV4dGVuZHMgUGFuZWwgewotCXByaXZhdGUgSlRleHRGaWVsZCBmTnVtYmVyT2ZFcnJvcnM7Ci0JcHJpdmF0ZSBKVGV4dEZpZWxkIGZOdW1iZXJPZkZhaWx1cmVzOwotCXByaXZhdGUgSlRleHRGaWVsZCBmTnVtYmVyT2ZSdW5zOwotCXByaXZhdGUgaW50IGZUb3RhbDsKLQkKLQlwdWJsaWMgQ291bnRlclBhbmVsKCkgewotCQlzdXBlcihuZXcgR3JpZExheW91dCgyLCAzKSk7CQotCQlhZGQobmV3IEpMYWJlbCgiUnVuczoiKSk7CQkKLQkJYWRkKG5ldyBKTGFiZWwoIkVycm9yczoiKSk7CQotCQlhZGQobmV3IEpMYWJlbCgiRmFpbHVyZXM6ICIpKTsJCi0JCWZOdW1iZXJPZkVycm9ycz0gY3JlYXRlT3V0cHV0RmllbGQoKTsKLQkJZk51bWJlck9mRmFpbHVyZXM9IGNyZWF0ZU91dHB1dEZpZWxkKCk7Ci0JCWZOdW1iZXJPZlJ1bnM9IGNyZWF0ZU91dHB1dEZpZWxkKCk7Ci0JCWFkZChmTnVtYmVyT2ZSdW5zKTsKLQkJYWRkKGZOdW1iZXJPZkVycm9ycyk7Ci0JCWFkZChmTnVtYmVyT2ZGYWlsdXJlcyk7Ci0JfSAKLQkKLQlwcml2YXRlIEpUZXh0RmllbGQgY3JlYXRlT3V0cHV0RmllbGQoKSB7Ci0JCUpUZXh0RmllbGQgZmllbGQ9IG5ldyBKVGV4dEZpZWxkKCIwIiwgNCk7Ci0JCWZpZWxkLnNldEhvcml6b250YWxBbGlnbm1lbnQoSlRleHRGaWVsZC5MRUZUKTsKLQkJZmllbGQuc2V0Rm9udChTdGF0dXNMaW5lLkJPTERfRk9OVCk7Ci0JCWZpZWxkLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJZmllbGQuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoKSk7Ci0JCXJldHVybiBmaWVsZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCXNldExhYmVsVmFsdWUoZk51bWJlck9mRXJyb3JzLCAwKTsKLQkJc2V0TGFiZWxWYWx1ZShmTnVtYmVyT2ZGYWlsdXJlcywgMCk7Ci0JCXNldExhYmVsVmFsdWUoZk51bWJlck9mUnVucywgMCk7Ci0JCWZUb3RhbD0gMDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VG90YWwoaW50IHZhbHVlKSB7Ci0JCWZUb3RhbD0gdmFsdWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFJ1blZhbHVlKGludCB2YWx1ZSkgewotCQlmTnVtYmVyT2ZSdW5zLnNldFRleHQoSW50ZWdlci50b1N0cmluZyh2YWx1ZSkgKyAiLyIgKyBmVG90YWwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRFcnJvclZhbHVlKGludCB2YWx1ZSkgewotCQlzZXRMYWJlbFZhbHVlKGZOdW1iZXJPZkVycm9ycywgdmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRGYWlsdXJlVmFsdWUoaW50IHZhbHVlKSB7Ci0JCXNldExhYmVsVmFsdWUoZk51bWJlck9mRmFpbHVyZXMsIHZhbHVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYXNTdHJpbmcoaW50IHZhbHVlKSB7Ci0JCXJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKHZhbHVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldExhYmVsVmFsdWUoSlRleHRGaWVsZCBsYWJlbCwgaW50IHZhbHVlKSB7Ci0JCWxhYmVsLnNldFRleHQoSW50ZWdlci50b1N0cmluZyh2YWx1ZSkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3N3aW5ndWkvRGVmYXVsdEZhaWx1cmVEZXRhaWxWaWV3LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3N3aW5ndWkvRGVmYXVsdEZhaWx1cmVEZXRhaWxWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwODE3MDYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9zd2luZ3VpL0RlZmF1bHRGYWlsdXJlRGV0YWlsVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotcGFja2FnZSBqdW5pdC5zd2luZ3VpOwotCi1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLkpUZXh0QXJlYTsKLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBqdW5pdC5ydW5uZXIuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBBIHZpZXcgdGhhdCBzaG93cyBhIHN0YWNrIHRyYWNlIG9mIGEgZmFpbHVyZQotICovCi1jbGFzcyBEZWZhdWx0RmFpbHVyZURldGFpbFZpZXcgaW1wbGVtZW50cyBGYWlsdXJlRGV0YWlsVmlldyB7Ci0JSlRleHRBcmVhIGZUZXh0QXJlYTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb21wb25lbnQgdXNlZCB0byBwcmVzZW50IHRoZSB0cmFjZQotCSAqLwotCXB1YmxpYyBDb21wb25lbnQgZ2V0Q29tcG9uZW50KCkgewotCQlpZiAoZlRleHRBcmVhID09IG51bGwpIHsKLQkJCWZUZXh0QXJlYT0gbmV3IEpUZXh0QXJlYSgpOwotCQkJZlRleHRBcmVhLnNldFJvd3MoNSk7Ci0JCQlmVGV4dEFyZWEuc2V0VGFiU2l6ZSgwKTsKLQkJCWZUZXh0QXJlYS5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCX0KLQkJcmV0dXJuIGZUZXh0QXJlYTsKLQl9Ci0JCi0JLyoqCi0JICogU2hvd3MgYSBUZXN0RmFpbHVyZQotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dGYWlsdXJlKFRlc3RGYWlsdXJlIGZhaWx1cmUpIHsKLQkJZlRleHRBcmVhLnNldFRleHQoQmFzZVRlc3RSdW5uZXIuZ2V0RmlsdGVyZWRUcmFjZShmYWlsdXJlLnRocm93bkV4Y2VwdGlvbigpKSk7Ci0JCWZUZXh0QXJlYS5zZWxlY3QoMCwgMCk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJZlRleHRBcmVhLnNldFRleHQoIiIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3N3aW5ndWkvRmFpbHVyZVJ1blZpZXcuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvc3dpbmd1aS9GYWlsdXJlUnVuVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDk1NGM2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvc3dpbmd1aS9GYWlsdXJlUnVuVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLXBhY2thZ2UganVuaXQuc3dpbmd1aTsKLQotaW1wb3J0IGphdmF4LnN3aW5nLio7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuKjsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC5ydW5uZXIuQmFzZVRlc3RSdW5uZXI7Ci0KLS8qKgotICogQSB2aWV3IHByZXNlbnRpbmcgdGhlIHRlc3QgZmFpbHVyZXMgYXMgYSBsaXN0LgotICovCi1jbGFzcyBGYWlsdXJlUnVuVmlldyBpbXBsZW1lbnRzIFRlc3RSdW5WaWV3IHsKLQlKTGlzdCBmRmFpbHVyZUxpc3Q7Ci0JVGVzdFJ1bkNvbnRleHQgZlJ1bkNvbnRleHQ7Ci0JCi0JLyoqCi0JICogUmVuZGVycyBUZXN0RmFpbHVyZXMgaW4gYSBKTGlzdAotCSAqLwotCXN0YXRpYyBjbGFzcyBGYWlsdXJlTGlzdENlbGxSZW5kZXJlciBleHRlbmRzIERlZmF1bHRMaXN0Q2VsbFJlbmRlcmVyIHsKLQkJcHJpdmF0ZSBJY29uIGZGYWlsdXJlSWNvbjsKLQkJcHJpdmF0ZSBJY29uIGZFcnJvckljb247Ci0JCQotCQlGYWlsdXJlTGlzdENlbGxSZW5kZXJlcigpIHsKLQkgICAgCQlzdXBlcigpOwotCSAgICAJCWxvYWRJY29ucygpOwotCQl9Ci0JCi0JCXZvaWQgbG9hZEljb25zKCkgewotCQkJZkZhaWx1cmVJY29uPSBUZXN0UnVubmVyLmdldEljb25SZXNvdXJjZShnZXRDbGFzcygpLCAiaWNvbnMvZmFpbHVyZS5naWYiKTsKLQkJCWZFcnJvckljb249IFRlc3RSdW5uZXIuZ2V0SWNvblJlc291cmNlKGdldENsYXNzKCksICJpY29ucy9lcnJvci5naWYiKTsJCQotCQl9Ci0JCQkJCQkKLQkJcHVibGljIENvbXBvbmVudCBnZXRMaXN0Q2VsbFJlbmRlcmVyQ29tcG9uZW50KAotCQkJSkxpc3QgbGlzdCwgT2JqZWN0IHZhbHVlLCBpbnQgbW9kZWxJbmRleCwgCi0JCQlib29sZWFuIGlzU2VsZWN0ZWQsIGJvb2xlYW4gY2VsbEhhc0ZvY3VzKSB7Ci0JCi0JCQlUZXN0RmFpbHVyZSBmYWlsdXJlPSAoVGVzdEZhaWx1cmUpdmFsdWU7Ci0JCQlTdHJpbmcgdGV4dD0gZmFpbHVyZS5mYWlsZWRUZXN0KCkudG9TdHJpbmcoKTsKLQkJCVN0cmluZyBtc2c9IGZhaWx1cmUudGhyb3duRXhjZXB0aW9uKCkuZ2V0TWVzc2FnZSgpOwotCQkJaWYgKG1zZyAhPSBudWxsKSAKLQkJCQl0ZXh0Kz0gIjoiICsgQmFzZVRlc3RSdW5uZXIudHJ1bmNhdGUobXNnKTsgCi0JIAotCQkJaWYgKGZhaWx1cmUudGhyb3duRXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBBc3NlcnRpb25GYWlsZWRFcnJvcikgeyAKLQkJCQlpZiAoZkZhaWx1cmVJY29uICE9IG51bGwpCi0JCSAgICAJCQlzZXRJY29uKGZGYWlsdXJlSWNvbik7Ci0JCQl9IGVsc2UgewotCQkgICAgCQlpZiAoZkVycm9ySWNvbiAhPSBudWxsKQotCQkgICAgCQkJc2V0SWNvbihmRXJyb3JJY29uKTsKLQkJICAgIAl9Ci0JCSAgICAJQ29tcG9uZW50IGM9IHN1cGVyLmdldExpc3RDZWxsUmVuZGVyZXJDb21wb25lbnQobGlzdCwgdGV4dCwgbW9kZWxJbmRleCwgaXNTZWxlY3RlZCwgY2VsbEhhc0ZvY3VzKTsKLQkJCXNldFRleHQodGV4dCk7Ci0JCQlzZXRUb29sVGlwVGV4dCh0ZXh0KTsKLQkJCXJldHVybiBjOwotCQl9Ci0JfQotCQotCXB1YmxpYyBGYWlsdXJlUnVuVmlldyhUZXN0UnVuQ29udGV4dCBjb250ZXh0KSB7Ci0JCWZSdW5Db250ZXh0PSBjb250ZXh0OwotCQlmRmFpbHVyZUxpc3Q9IG5ldyBKTGlzdChmUnVuQ29udGV4dC5nZXRGYWlsdXJlcygpKTsKLQkJZkZhaWx1cmVMaXN0LnNldFByb3RvdHlwZUNlbGxWYWx1ZSgKLQkJCW5ldyBUZXN0RmFpbHVyZShuZXcgVGVzdENhc2UoImR1bW15IikgewotCQkJCXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB7fQotCQkJfSwgCi0JCQluZXcgQXNzZXJ0aW9uRmFpbGVkRXJyb3IoIm1lc3NhZ2UiKSkKLQkJKTsJCi0JCWZGYWlsdXJlTGlzdC5zZXRTZWxlY3Rpb25Nb2RlKExpc3RTZWxlY3Rpb25Nb2RlbC5TSU5HTEVfU0VMRUNUSU9OKTsKLQkJZkZhaWx1cmVMaXN0LnNldENlbGxSZW5kZXJlcihuZXcgRmFpbHVyZUxpc3RDZWxsUmVuZGVyZXIoKSk7Ci0JCWZGYWlsdXJlTGlzdC5zZXRUb29sVGlwVGV4dCgiRmFpbHVyZSAtIGdyZXkgWDsgRXJyb3IgLSByZWQgWCIpOwotCQlmRmFpbHVyZUxpc3Quc2V0VmlzaWJsZVJvd0NvdW50KDUpOwotCi0JCWZGYWlsdXJlTGlzdC5hZGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIoCi0JCQluZXcgTGlzdFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChMaXN0U2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl0ZXN0U2VsZWN0ZWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCQotCXB1YmxpYyBUZXN0IGdldFNlbGVjdGVkVGVzdCgpIHsKLQkJaW50IGluZGV4PSBmRmFpbHVyZUxpc3QuZ2V0U2VsZWN0ZWRJbmRleCgpOwotCQlpZiAoaW5kZXggPT0gLTEpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCQotCQlMaXN0TW9kZWwgbW9kZWw9IGZGYWlsdXJlTGlzdC5nZXRNb2RlbCgpOwotCQlUZXN0RmFpbHVyZSBmYWlsdXJlPSAoVGVzdEZhaWx1cmUpbW9kZWwuZ2V0RWxlbWVudEF0KGluZGV4KTsKLQkJcmV0dXJuIGZhaWx1cmUuZmFpbGVkVGVzdCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJdGVzdFNlbGVjdGVkKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFRhYihKVGFiYmVkUGFuZSBwYW5lKSB7Ci0JCUpTY3JvbGxQYW5lIHNsPSBuZXcgSlNjcm9sbFBhbmUoZkZhaWx1cmVMaXN0LCBKU2Nyb2xsUGFuZS5WRVJUSUNBTF9TQ1JPTExCQVJfQUxXQVlTLCBKU2Nyb2xsUGFuZS5IT1JJWk9OVEFMX1NDUk9MTEJBUl9BTFdBWVMpOwotCQlJY29uIGVycm9ySWNvbj0gVGVzdFJ1bm5lci5nZXRJY29uUmVzb3VyY2UoZ2V0Q2xhc3MoKSwgImljb25zL2Vycm9yLmdpZiIpOwotCQlwYW5lLmFkZFRhYigiRmFpbHVyZXMiLCBlcnJvckljb24sIHNsLCAiVGhlIGxpc3Qgb2YgZmFpbGVkIHRlc3RzIik7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCByZXZlYWxGYWlsdXJlKFRlc3QgZmFpbHVyZSkgewotCQlmRmFpbHVyZUxpc3Quc2V0U2VsZWN0ZWRJbmRleCgwKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWJvdXRUb1N0YXJ0KFRlc3Qgc3VpdGUsIFRlc3RSZXN1bHQgcmVzdWx0KSB7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuRmluaXNoZWQoVGVzdCBzdWl0ZSwgVGVzdFJlc3VsdCByZXN1bHQpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZXN0U2VsZWN0ZWQoKSB7Ci0JCWZSdW5Db250ZXh0LmhhbmRsZVRlc3RTZWxlY3RlZChnZXRTZWxlY3RlZFRlc3QoKSk7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvc3dpbmd1aS9Qcm9ncmVzc0Jhci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9zd2luZ3VpL1Byb2dyZXNzQmFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NmY0M2QuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9zd2luZ3VpL1Byb2dyZXNzQmFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi1wYWNrYWdlIGp1bml0LnN3aW5ndWk7Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci4qOwotaW1wb3J0IGphdmEuYXd0Lio7Ci0KLS8qKgotICogQSBzaW1wbGUgcHJvZ3Jlc3MgYmFyIHNob3dpbmcgdGhlIGdyZWVuL3JlZCBzdGF0dXMKLSAqLwotY2xhc3MgUHJvZ3Jlc3NCYXIgZXh0ZW5kcyBKUGFuZWwgewotCWJvb2xlYW4gZkVycm9yPSBmYWxzZTsKLQlpbnQgZlRvdGFsPSAwOwotCWludCBmUHJvZ3Jlc3M9IDA7Ci0JaW50IGZQcm9ncmVzc1g9IDA7Ci0JCi0JcHVibGljIFByb2dyZXNzQmFyKCkgewotCQlzdXBlcigpOwotCQlzZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVCZXZlbEJvcmRlcihCZXZlbEJvcmRlci5MT1dFUkVEKSk7Ci0JfQotCQotCXByaXZhdGUgQ29sb3IgZ2V0U3RhdHVzQ29sb3IoKSB7Ci0JCWlmIChmRXJyb3IpCi0JCQlyZXR1cm4gQ29sb3IucmVkOwotCQlyZXR1cm4gQ29sb3IuZ3JlZW47Ci0JfQotCQotCXB1YmxpYyB2b2lkIHBhaW50QmFja2dyb3VuZChHcmFwaGljcyBnKSB7Ci0JCWcuc2V0Q29sb3IoZ2V0QmFja2dyb3VuZCgpKTsKLQkJZy5maWxsUmVjdCgwLDAsZ2V0V2lkdGgoKSxnZXRIZWlnaHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHBhaW50Q29tcG9uZW50KEdyYXBoaWNzIGcpIHsKLQkJcGFpbnRCYWNrZ3JvdW5kKGcpOwotCQlwYWludFN0YXR1cyhnKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcGFpbnRTdGF0dXMoR3JhcGhpY3MgZykgewotCQlnLnNldENvbG9yKGdldFN0YXR1c0NvbG9yKCkpOwotCQlSZWN0YW5nbGUgcj0gbmV3IFJlY3RhbmdsZSgwLCAwLCBmUHJvZ3Jlc3NYLCBnZXRCb3VuZHMoKS5oZWlnaHQpOwotCQlnLmZpbGxSZWN0KDEsIDEsIHIud2lkdGgtMSwgci5oZWlnaHQtMik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwYWludFN0ZXAoaW50IHN0YXJ0WCwgaW50IGVuZFgpIHsKLQkJcmVwYWludChzdGFydFgsIDEsIGVuZFgtc3RhcnRYLCBnZXRCb3VuZHMoKS5oZWlnaHQtMik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQlmUHJvZ3Jlc3NYPSAxOwotCQlmUHJvZ3Jlc3M9IDA7Ci0JCWZFcnJvcj0gZmFsc2U7Ci0JCXJlcGFpbnQoKTsKLQl9Ci0JCi0JcHVibGljIGludCBzY2FsZShpbnQgdmFsdWUpIHsKLQkJaWYgKGZUb3RhbCA+IDApCi0JCQlyZXR1cm4gTWF0aC5tYXgoMSwgdmFsdWUqKGdldEJvdW5kcygpLndpZHRoLTEpL2ZUb3RhbCk7Ci0JCXJldHVybiB2YWx1ZTsgCi0JfQotCQotCXB1YmxpYyB2b2lkIHNldEJvdW5kcyhpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkgewotCQlzdXBlci5zZXRCb3VuZHMoeCwgeSwgdywgaCk7Ci0JCWZQcm9ncmVzc1g9IHNjYWxlKGZQcm9ncmVzcyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN0YXJ0KGludCB0b3RhbCkgewotCQlmVG90YWw9IHRvdGFsOwotCQlyZXNldCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzdGVwKGJvb2xlYW4gc3VjY2Vzc2Z1bCkgewotCQlmUHJvZ3Jlc3MrKzsKLQkJaW50IHg9IGZQcm9ncmVzc1g7Ci0KLQkJZlByb2dyZXNzWD0gc2NhbGUoZlByb2dyZXNzKTsKLQotCQlpZiAoIWZFcnJvciAmJiAhc3VjY2Vzc2Z1bCkgewotCQkJZkVycm9yPSB0cnVlOwotCQkJeD0gMTsKLQkJfQotCQlwYWludFN0ZXAoeCwgZlByb2dyZXNzWCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvc3dpbmd1aS9TdGF0dXNMaW5lLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3N3aW5ndWkvU3RhdHVzTGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGIyMDFjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvc3dpbmd1aS9TdGF0dXNMaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi1wYWNrYWdlIGp1bml0LnN3aW5ndWk7Ci0KLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmF4LnN3aW5nLio7Ci1pbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLio7Ci0KLS8qKgotICogQSBzdGF0dXMgbGluZSBjb21wb25lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0dXNMaW5lIGV4dGVuZHMgSlRleHRGaWVsZCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBGb250IFBMQUlOX0ZPTlQ9IG5ldyBGb250KCJkaWFsb2ciLCBGb250LlBMQUlOLCAxMik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBGb250IEJPTERfRk9OVD0gbmV3IEZvbnQoImRpYWxvZyIsIEZvbnQuQk9MRCwgMTIpOwotCi0JcHVibGljIFN0YXR1c0xpbmUoaW50IHByZWZlcnJlZFdpZHRoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldEZvbnQoQk9MRF9GT05UKTsKLQkJc2V0RWRpdGFibGUoZmFsc2UpOwotCQlzZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVCZXZlbEJvcmRlcihCZXZlbEJvcmRlci5MT1dFUkVEKSk7Ci0JCURpbWVuc2lvbiBkPSBnZXRQcmVmZXJyZWRTaXplKCk7Ci0JCWQud2lkdGg9IHByZWZlcnJlZFdpZHRoOwotCQlzZXRQcmVmZXJyZWRTaXplKGQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzaG93SW5mbyhTdHJpbmcgbWVzc2FnZSkgewotCQlzZXRGb250KFBMQUlOX0ZPTlQpOwotCQlzZXRGb3JlZ3JvdW5kKENvbG9yLmJsYWNrKTsKLQkJc2V0VGV4dChtZXNzYWdlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2hvd0Vycm9yKFN0cmluZyBzdGF0dXMpIHsKLQkJc2V0Rm9udChCT0xEX0ZPTlQpOwotCQlzZXRGb3JlZ3JvdW5kKENvbG9yLnJlZCk7Ci0JCXNldFRleHQoc3RhdHVzKTsKLQkJc2V0VG9vbFRpcFRleHQoc3RhdHVzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXNldFRleHQoIiIpOwotCQlzZXRUb29sVGlwVGV4dChudWxsKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9zd2luZ3VpL1Rlc3RIaWVyYXJjaHlSdW5WaWV3LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3N3aW5ndWkvVGVzdEhpZXJhcmNoeVJ1blZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ3YmY5OS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3N3aW5ndWkvVGVzdEhpZXJhcmNoeVJ1blZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLXBhY2thZ2UganVuaXQuc3dpbmd1aTsKLQotaW1wb3J0IGphdmF4LnN3aW5nLio7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuKjsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLlRyZWVQYXRoOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBBIGhpZXJhcmNoaWNhbCB2aWV3IG9mIGEgdGVzdCBydW4uCi0gKiBUaGUgY29udGVudHMgb2YgYSB0ZXN0IHN1aXRlIGlzIHNob3duCi0gKiBhcyBhIHRyZWUuCi0gKi8KLWNsYXNzIFRlc3RIaWVyYXJjaHlSdW5WaWV3IGltcGxlbWVudHMgVGVzdFJ1blZpZXcgewotCVRlc3RTdWl0ZVBhbmVsIGZUcmVlQnJvd3NlcjsKLQlUZXN0UnVuQ29udGV4dCBmVGVzdENvbnRleHQ7Ci0JCi0JcHVibGljIFRlc3RIaWVyYXJjaHlSdW5WaWV3KFRlc3RSdW5Db250ZXh0IGNvbnRleHQpIHsKLQkJZlRlc3RDb250ZXh0PSBjb250ZXh0OwotCQlmVHJlZUJyb3dzZXI9IG5ldyBUZXN0U3VpdGVQYW5lbCgpOwotCQlmVHJlZUJyb3dzZXIuZ2V0VHJlZSgpLmFkZFRyZWVTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCW5ldyBUcmVlU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKFRyZWVTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXRlc3RTZWxlY3RlZCgpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkVGFiKEpUYWJiZWRQYW5lIHBhbmUpIHsgCi0JCUljb24gdHJlZUljb249IFRlc3RSdW5uZXIuZ2V0SWNvblJlc291cmNlKGdldENsYXNzKCksICJpY29ucy9oaWVyYXJjaHkuZ2lmIik7Ci0JCXBhbmUuYWRkVGFiKCJUZXN0IEhpZXJhcmNoeSIsIHRyZWVJY29uLCBmVHJlZUJyb3dzZXIsICJUaGUgdGVzdCBoaWVyYXJjaHkiKTsKLQl9Ci0JCi0JcHVibGljIFRlc3QgZ2V0U2VsZWN0ZWRUZXN0KCkgewotCQlyZXR1cm4gZlRyZWVCcm93c2VyLmdldFNlbGVjdGVkVGVzdCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJdGVzdFNlbGVjdGVkKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJldmVhbEZhaWx1cmUoVGVzdCBmYWlsdXJlKSB7Ci0JCUpUcmVlIHRyZWU9IGZUcmVlQnJvd3Nlci5nZXRUcmVlKCk7Ci0JCVRlc3RUcmVlTW9kZWwgbW9kZWw9IChUZXN0VHJlZU1vZGVsKXRyZWUuZ2V0TW9kZWwoKTsKLQkJVmVjdG9yIHZwYXRoPSBuZXcgVmVjdG9yKCk7Ci0JCWludCBpbmRleD0gbW9kZWwuZmluZFRlc3QoZmFpbHVyZSwgKFRlc3QpbW9kZWwuZ2V0Um9vdCgpLCB2cGF0aCk7Ci0JCWlmIChpbmRleCA+PSAwKSB7Ci0JCQlPYmplY3RbXSBwYXRoPSBuZXcgT2JqZWN0W3ZwYXRoLnNpemUoKSsxXTsKLQkJCXZwYXRoLmNvcHlJbnRvKHBhdGgpOwotCQkJT2JqZWN0IGxhc3Q9IHBhdGhbdnBhdGguc2l6ZSgpLTFdOwotCQkJcGF0aFt2cGF0aC5zaXplKCldPSBtb2RlbC5nZXRDaGlsZChsYXN0LCBpbmRleCk7Ci0JCQlUcmVlUGF0aCBzZWxlY3Rpb25QYXRoPSBuZXcgVHJlZVBhdGgocGF0aCk7Ci0JCQl0cmVlLnNldFNlbGVjdGlvblBhdGgoc2VsZWN0aW9uUGF0aCk7Ci0JCQl0cmVlLm1ha2VWaXNpYmxlKHNlbGVjdGlvblBhdGgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFib3V0VG9TdGFydChUZXN0IHN1aXRlLCBUZXN0UmVzdWx0IHJlc3VsdCkgewotCQlmVHJlZUJyb3dzZXIuc2hvd1Rlc3RUcmVlKHN1aXRlKTsKLQkJcmVzdWx0LmFkZExpc3RlbmVyKGZUcmVlQnJvd3Nlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuRmluaXNoZWQoVGVzdCBzdWl0ZSwgVGVzdFJlc3VsdCByZXN1bHQpIHsKLQkJcmVzdWx0LnJlbW92ZUxpc3RlbmVyKGZUcmVlQnJvd3Nlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVzdFNlbGVjdGVkKCkgewotCQlmVGVzdENvbnRleHQuaGFuZGxlVGVzdFNlbGVjdGVkKGdldFNlbGVjdGVkVGVzdCgpKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3N3aW5ndWkvVGVzdFJ1bkNvbnRleHQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvc3dpbmd1aS9UZXN0UnVuQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzhlM2M0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvc3dpbmd1aS9UZXN0UnVuQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotcGFja2FnZSBqdW5pdC5zd2luZ3VpOwotCi1pbXBvcnQgamF2YXguc3dpbmcuTGlzdE1vZGVsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYWNjZXNzaW5nIHRoZSBUZXN0IHJ1biBjb250ZXh0LiBUZXN0IHJ1biB2aWV3cwotICogc2hvdWxkIHVzZSB0aGlzIGludGVyZmFjZSByYXRoZXIgdGhhbiBhY2Nlc3NpbmcgdGhlIFRlc3RSdW5uZXIKLSAqIGRpcmVjdGx5LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRlc3RSdW5Db250ZXh0IHsKLQkvKioKLQkgKiBIYW5kbGVzIHRoZSBzZWxlY3Rpb24gb2YgYSBUZXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZVRlc3RTZWxlY3RlZChUZXN0IHRlc3QpOwotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhaWx1cmUgbW9kZWwKLQkgKi8KLQlwdWJsaWMgTGlzdE1vZGVsIGdldEZhaWx1cmVzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9zd2luZ3VpL1Rlc3RSdW5WaWV3LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3N3aW5ndWkvVGVzdFJ1blZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZlNzA0OC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3N3aW5ndWkvVGVzdFJ1blZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLXBhY2thZ2UganVuaXQuc3dpbmd1aTsKLQotaW1wb3J0IGphdmF4LnN3aW5nLio7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBBIFRlc3RSdW5WaWV3IGlzIHNob3duIGFzIGEgcGFnZSBpbiBhIHRhYmJlZCBmb2xkZXIuCi0gKiBJdCBjb250cmlidXRlcyB0aGUgcGFnZSBjb250ZW50cyBhbmQgY2FuIHJldHVybgotICogdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0ZXN0cy4gQSBUZXN0UnVuVmlldyBpcyAKLSAqIG5vdGlmaWVkIGFib3V0IHRoZSBzdGFydCBhbmQgZmluaXNoIG9mIGEgcnVuLgotICovCi1pbnRlcmZhY2UgVGVzdFJ1blZpZXcgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBUZXN0IGluIHRoZSBWaWV3Ci0JICovCi0JcHVibGljIFRlc3QgZ2V0U2VsZWN0ZWRUZXN0KCk7Ci0JLyoqCi0JICogQWN0aXZhdGVzIHRoZSBUZXN0UnVuVmlldwotCSAqLwotCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCk7Ci0JLyoqCi0JICogUmV2ZWFscyB0aGUgZ2l2ZW4gZmFpbHVyZQotCSAqLwotCXB1YmxpYyB2b2lkIHJldmVhbEZhaWx1cmUoVGVzdCBmYWlsdXJlKTsKLQkvKioKLQkgKiBBZGRzIHRoZSBUZXN0UnVuVmlldyB0byB0aGUgdGVzdCBydW4gdmlld3MgdGFiCi0JICovCi0JcHVibGljIHZvaWQgYWRkVGFiKEpUYWJiZWRQYW5lIHBhbmUpOwotCS8qKgotCSAqIEluZm9ybXMgdGhhdCB0aGUgc3VpdGUgaXMgYWJvdXQgdG8gc3RhcnQgCi0JICovCi0JcHVibGljIHZvaWQgYWJvdXRUb1N0YXJ0KFRlc3Qgc3VpdGUsIFRlc3RSZXN1bHQgcmVzdWx0KTsKLQkvKioKLQkgKiBJbmZvcm1zIHRoYXQgdGhlIHJ1biBvZiB0aGUgdGVzdCBzdWl0ZSBoYXMgZmluaXNoZWQgCi0JICovCi0JcHVibGljIHZvaWQgcnVuRmluaXNoZWQoVGVzdCBzdWl0ZSwgVGVzdFJlc3VsdCByZXN1bHQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvc3dpbmd1aS9UZXN0UnVubmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3N3aW5ndWkvVGVzdFJ1bm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzliNTFiLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvc3dpbmd1aS9UZXN0UnVubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MDcgKzAsMCBAQAotcGFja2FnZSBqdW5pdC5zd2luZ3VpOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQucnVubmVyLio7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotaW1wb3J0IGphdmEudGV4dC5OdW1iZXJGb3JtYXQ7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLio7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuKjsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0Lio7Ci1pbXBvcnQgamF2YS5hd3QuKjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC4qOwotaW1wb3J0IGphdmEuYXd0LmltYWdlLio7Ci0KLS8qKgotICogQSBTd2luZyBiYXNlZCB1c2VyIGludGVyZmFjZSB0byBydW4gdGVzdHMuCi0gKiBFbnRlciB0aGUgbmFtZSBvZiBhIGNsYXNzIHdoaWNoIGVpdGhlciBwcm92aWRlcyBhIHN0YXRpYwotICogc3VpdGUgbWV0aG9kIG9yIGlzIGEgc3ViY2xhc3Mgb2YgVGVzdENhc2UuCi0gKiA8cHJlPgotICogU3lub3BzaXM6IGphdmEganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyIFstbm9sb2FkaW5nXSBbVGVzdENhc2VdCi0gKiA8L3ByZT4KLSAqIFRlc3RSdW5uZXIgdGFrZXMgYXMgYW4gb3B0aW9uYWwgYXJndW1lbnQgdGhlIG5hbWUgb2YgdGhlIHRlc3RjYXNlIGNsYXNzIHRvIGJlIHJ1bi4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RSdW5uZXIgZXh0ZW5kcyBCYXNlVGVzdFJ1bm5lciBpbXBsZW1lbnRzIFRlc3RSdW5Db250ZXh0IHsKLQlwcm90ZWN0ZWQgSkZyYW1lIGZGcmFtZTsKLQlwcml2YXRlIFRocmVhZCBmUnVubmVyOwotCXByaXZhdGUgVGVzdFJlc3VsdCBmVGVzdFJlc3VsdDsKLQkKLQlwcml2YXRlIEpDb21ib0JveCBmU3VpdGVDb21ibzsKLQlwcml2YXRlIFByb2dyZXNzQmFyIGZQcm9ncmVzc0luZGljYXRvcjsKLQlwcml2YXRlIERlZmF1bHRMaXN0TW9kZWwgZkZhaWx1cmVzOwotCXByaXZhdGUgSkxhYmVsIGZMb2dvOwotCXByaXZhdGUgQ291bnRlclBhbmVsIGZDb3VudGVyUGFuZWw7Ci0JcHJpdmF0ZSBKQnV0dG9uIGZSdW47Ci0JcHJpdmF0ZSBKQnV0dG9uIGZRdWl0QnV0dG9uOwotCXByaXZhdGUgSkJ1dHRvbiBmUmVydW5CdXR0b247Ci0JcHJpdmF0ZSBTdGF0dXNMaW5lIGZTdGF0dXNMaW5lOwotCXByaXZhdGUgRmFpbHVyZURldGFpbFZpZXcgZkZhaWx1cmVWaWV3OwotCXByaXZhdGUgSlRhYmJlZFBhbmUgZlRlc3RWaWV3VGFiOwotCXByaXZhdGUgSkNoZWNrQm94IGZVc2VMb2FkaW5nUnVubmVyOwotCXByaXZhdGUgVmVjdG9yIGZUZXN0UnVuVmlld3M9IG5ldyBWZWN0b3IoKTsgLy8gdmlldyBhc3NvY2lhdGVkIHdpdGggdGFiIGluIHRhYmJlZCBwYW5lCi0JcHJpdmF0ZSBzdGF0aWMgRm9udCBQTEFJTl9GT05UPSBTdGF0dXNMaW5lLlBMQUlOX0ZPTlQ7Ci0JcHJpdmF0ZSBzdGF0aWMgRm9udCBCT0xEX0ZPTlQ9IFN0YXR1c0xpbmUuQk9MRF9GT05UOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHQVA9IDQ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhJU1RPUllfTEVOR1RIPSA1OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RDT0xMRUNUT1JfS0VZPSAiVGVzdENvbGxlY3RvckNsYXNzIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFJTFVSRURFVEFJTFZJRVdfS0VZPSAiRmFpbHVyZVZpZXdDbGFzcyI7Ci0JCQotCXB1YmxpYyBUZXN0UnVubmVyKCkgewotCX0gCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQluZXcgVGVzdFJ1bm5lcigpLnN0YXJ0KGFyZ3MpOwotCX0KLQkgCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1bihDbGFzcyB0ZXN0KSB7Ci0JCVN0cmluZyBhcmdzW109IHsgdGVzdC5nZXROYW1lKCkgfTsKLQkJbWFpbihhcmdzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkRXJyb3IoZmluYWwgVGVzdCB0ZXN0LCBmaW5hbCBUaHJvd2FibGUgdCkgewotCQlTd2luZ1V0aWxpdGllcy5pbnZva2VMYXRlcigKLQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWZDb3VudGVyUGFuZWwuc2V0RXJyb3JWYWx1ZShmVGVzdFJlc3VsdC5lcnJvckNvdW50KCkpOwotCQkJCQlhcHBlbmRGYWlsdXJlKCJFcnJvciIsIHRlc3QsIHQpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkRmFpbHVyZShmaW5hbCBUZXN0IHRlc3QsIGZpbmFsIEFzc2VydGlvbkZhaWxlZEVycm9yIHQpIHsKLQkJU3dpbmdVdGlsaXRpZXMuaW52b2tlTGF0ZXIoCi0JCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlmQ291bnRlclBhbmVsLnNldEZhaWx1cmVWYWx1ZShmVGVzdFJlc3VsdC5mYWlsdXJlQ291bnQoKSk7Ci0JCQkJCWFwcGVuZEZhaWx1cmUoIkZhaWx1cmUiLCB0ZXN0LCB0KTsKLQkJCQl9Ci0JCQl9CQkKLQkJKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc3RhcnRUZXN0KFRlc3QgdGVzdCkgewotCQlwb3N0SW5mbygiUnVubmluZzogIit0ZXN0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZW5kVGVzdChUZXN0IHRlc3QpIHsKLQkJcG9zdEVuZFRlc3QodGVzdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvc3RFbmRUZXN0KGZpbmFsIFRlc3QgdGVzdCkgewotCQlzeW5jaFVJKCk7Ci0JCVN3aW5nVXRpbGl0aWVzLmludm9rZUxhdGVyKAotCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGZUZXN0UmVzdWx0ICE9IG51bGwpIHsKLQkJCQkJCWZDb3VudGVyUGFuZWwuc2V0UnVuVmFsdWUoZlRlc3RSZXN1bHQucnVuQ291bnQoKSk7Ci0JCQkJCQlmUHJvZ3Jlc3NJbmRpY2F0b3Iuc3RlcChmVGVzdFJlc3VsdC53YXNTdWNjZXNzZnVsKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN1aXRlKFN0cmluZyBzdWl0ZU5hbWUpIHsKLQkJZlN1aXRlQ29tYm8uZ2V0RWRpdG9yKCkuc2V0SXRlbShzdWl0ZU5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRUb0hpc3RvcnkoZmluYWwgU3RyaW5nIHN1aXRlKSB7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBmU3VpdGVDb21iby5nZXRJdGVtQ291bnQoKTsgaSsrKSB7Ci0JCQlpZiAoc3VpdGUuZXF1YWxzKGZTdWl0ZUNvbWJvLmdldEl0ZW1BdChpKSkpIHsKLQkJCQlmU3VpdGVDb21iby5yZW1vdmVJdGVtQXQoaSk7Ci0JCQkJZlN1aXRlQ29tYm8uaW5zZXJ0SXRlbUF0KHN1aXRlLCAwKTsKLQkJCQlmU3VpdGVDb21iby5zZXRTZWxlY3RlZEluZGV4KDApOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlmU3VpdGVDb21iby5pbnNlcnRJdGVtQXQoc3VpdGUsIDApOwotCQlmU3VpdGVDb21iby5zZXRTZWxlY3RlZEluZGV4KDApOwotCQlwcnVuZUhpc3RvcnkoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBydW5lSGlzdG9yeSgpIHsKLQkJaW50IGhpc3RvcnlMZW5ndGg9IGdldFByZWZlcmVuY2UoIm1heGhpc3RvcnkiLCBISVNUT1JZX0xFTkdUSCk7Ci0JCWlmIChoaXN0b3J5TGVuZ3RoIDwgMSkKLQkJCWhpc3RvcnlMZW5ndGg9IDE7Ci0JCWZvciAoaW50IGk9IGZTdWl0ZUNvbWJvLmdldEl0ZW1Db3VudCgpLTE7IGkgPiBoaXN0b3J5TGVuZ3RoLTE7IGktLSkgCi0JCQlmU3VpdGVDb21iby5yZW1vdmVJdGVtQXQoaSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhcHBlbmRGYWlsdXJlKFN0cmluZyBraW5kLCBUZXN0IHRlc3QsIFRocm93YWJsZSB0KSB7Ci0JCWZGYWlsdXJlcy5hZGRFbGVtZW50KG5ldyBUZXN0RmFpbHVyZSh0ZXN0LCB0KSk7Ci0JCWlmIChmRmFpbHVyZXMuc2l6ZSgpID09IDEpIAotCQkJcmV2ZWFsRmFpbHVyZSh0ZXN0KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJldmVhbEZhaWx1cmUoVGVzdCB0ZXN0KSB7Ci0JCWZvciAoRW51bWVyYXRpb24gZT0gZlRlc3RSdW5WaWV3cy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyApIHsKLQkJCVRlc3RSdW5WaWV3IHY9IChUZXN0UnVuVmlldykgZS5uZXh0RWxlbWVudCgpOwotCQkJdi5yZXZlYWxGYWlsdXJlKHRlc3QpOwotCQl9Ci0JfQotCQkKLQlwcm90ZWN0ZWQgdm9pZCBhYm91dFRvU3RhcnQoZmluYWwgVGVzdCB0ZXN0U3VpdGUpIHsKLQkJZm9yIChFbnVtZXJhdGlvbiBlPSBmVGVzdFJ1blZpZXdzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7ICkgewotCQkJVGVzdFJ1blZpZXcgdj0gKFRlc3RSdW5WaWV3KSBlLm5leHRFbGVtZW50KCk7Ci0JCQl2LmFib3V0VG9TdGFydCh0ZXN0U3VpdGUsIGZUZXN0UmVzdWx0KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBydW5GaW5pc2hlZChmaW5hbCBUZXN0IHRlc3RTdWl0ZSkgewotCQlTd2luZ1V0aWxpdGllcy5pbnZva2VMYXRlcigKLQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWZvciAoRW51bWVyYXRpb24gZT0gZlRlc3RSdW5WaWV3cy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyApIHsKLQkJCQkJCVRlc3RSdW5WaWV3IHY9IChUZXN0UnVuVmlldykgZS5uZXh0RWxlbWVudCgpOwotCQkJCQkJdi5ydW5GaW5pc2hlZCh0ZXN0U3VpdGUsIGZUZXN0UmVzdWx0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ291bnRlclBhbmVsIGNyZWF0ZUNvdW50ZXJQYW5lbCgpIHsKLQkJcmV0dXJuIG5ldyBDb3VudGVyUGFuZWwoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpQYW5lbCBjcmVhdGVGYWlsZWRQYW5lbCgpIHsKLQkJSlBhbmVsIGZhaWxlZFBhbmVsPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDAsIDEsIDAsIDIpKTsKLQkJZlJlcnVuQnV0dG9uPSBuZXcgSkJ1dHRvbigiUnVuIik7Ci0JCWZSZXJ1bkJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZlJlcnVuQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKAotCQkJbmV3IEFjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXJlcnVuKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCQlmYWlsZWRQYW5lbC5hZGQoZlJlcnVuQnV0dG9uKTsKLQkJcmV0dXJuIGZhaWxlZFBhbmVsOwotCX0KLQkJCQotCXByb3RlY3RlZCBGYWlsdXJlRGV0YWlsVmlldyBjcmVhdGVGYWlsdXJlRGV0YWlsVmlldygpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZT0gQmFzZVRlc3RSdW5uZXIuZ2V0UHJlZmVyZW5jZShGQUlMVVJFREVUQUlMVklFV19LRVkpOwotCQlpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsJCQkKLQkJCUNsYXNzIHZpZXdDbGFzcz0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJdmlld0NsYXNzPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0JCQkJcmV0dXJuIChGYWlsdXJlRGV0YWlsVmlldyl2aWV3Q2xhc3MubmV3SW5zdGFuY2UoKTsKLQkJCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhmRnJhbWUsICJDb3VsZCBub3QgY3JlYXRlIEZhaWx1cmUgRGV0YWlsVmlldyAtIHVzaW5nIGRlZmF1bHQgdmlldyIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgRGVmYXVsdEZhaWx1cmVEZXRhaWxWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgSlVuaXQgbWVudS4gQ2xpZW50cyBvdmVycmlkZSB0aGlzCi0JICogbWV0aG9kIHRvIGFkZCBhZGRpdGlvbmFsIG1lbnUgaXRlbXMuCi0JICovCi0JcHJvdGVjdGVkIEpNZW51IGNyZWF0ZUpVbml0TWVudSgpIHsKLQkJSk1lbnUgbWVudT0gbmV3IEpNZW51KCJKVW5pdCIpOwotCQltZW51LnNldE1uZW1vbmljKCdKJyk7Ci0JCUpNZW51SXRlbSBtaTE9IG5ldyBKTWVudUl0ZW0oIkFib3V0Li4uIik7Ci0JCW1pMS5hZGRBY3Rpb25MaXN0ZW5lcigKLQkJICAgIG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLQkJICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJICAgICAgICAgICAgYWJvdXQoKTsKLQkJICAgICAgICB9Ci0JCSAgICB9Ci0JCSk7Ci0JCW1pMS5zZXRNbmVtb25pYygnQScpOwotCQltZW51LmFkZChtaTEpOwotCQkKLQkJbWVudS5hZGRTZXBhcmF0b3IoKTsKLQkJSk1lbnVJdGVtIG1pMj0gbmV3IEpNZW51SXRlbSgiIEV4aXQgIik7Ci0JCW1pMi5hZGRBY3Rpb25MaXN0ZW5lcigKLQkJICAgIG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLQkJICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJICAgICAgICAgICAgdGVybWluYXRlKCk7Ci0JCSAgICAgICAgfQotCQkgICAgfQotCQkpOwotCQltaTIuc2V0TW5lbW9uaWMoJ3gnKTsKLQkJbWVudS5hZGQobWkyKTsKLQotCQlyZXR1cm4gbWVudTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpGcmFtZSBjcmVhdGVGcmFtZShTdHJpbmcgdGl0bGUpIHsKLQkJSkZyYW1lIGZyYW1lPSBuZXcgSkZyYW1lKCJKVW5pdCIpOwotCQlJbWFnZSBpY29uPSBsb2FkRnJhbWVJY29uKCk7CQotCQlpZiAoaWNvbiAhPSBudWxsKQotCQkJZnJhbWUuc2V0SWNvbkltYWdlKGljb24pOwotCQlmcmFtZS5nZXRDb250ZW50UGFuZSgpLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KDAsIDApKTsKLQkJCi0JCWZyYW1lLmFkZFdpbmRvd0xpc3RlbmVyKAotCQkJbmV3IFdpbmRvd0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7Ci0JCQkJCXRlcm1pbmF0ZSgpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQkJcmV0dXJuIGZyYW1lOwotCX0KLQkKLQlwcm90ZWN0ZWQgSkxhYmVsIGNyZWF0ZUxvZ28oKSB7Ci0JCUpMYWJlbCBsYWJlbDsKLQkJSWNvbiBpY29uPSBnZXRJY29uUmVzb3VyY2UoQmFzZVRlc3RSdW5uZXIuY2xhc3MsICJsb2dvLmdpZiIpOwotCQlpZiAoaWNvbiAhPSBudWxsKSAKLQkJCWxhYmVsPSBuZXcgSkxhYmVsKGljb24pOwotCQllbHNlCi0JCQlsYWJlbD0gbmV3IEpMYWJlbCgiSlYiKTsKLQkJbGFiZWwuc2V0VG9vbFRpcFRleHQoIkpVbml0IFZlcnNpb24gIitWZXJzaW9uLmlkKCkpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU1lbnVzKEpNZW51QmFyIG1iKSB7Ci0JCW1iLmFkZChjcmVhdGVKVW5pdE1lbnUoKSk7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgSkNoZWNrQm94IGNyZWF0ZVVzZUxvYWRlckNoZWNrQm94KCkgewotCQlib29sZWFuIHVzZUxvYWRlcj0gdXNlUmVsb2FkaW5nVGVzdFN1aXRlTG9hZGVyKCk7Ci0JCUpDaGVja0JveCBib3g9IG5ldyBKQ2hlY2tCb3goIlJlbG9hZCBjbGFzc2VzIGV2ZXJ5IHJ1biIsIHVzZUxvYWRlcik7Ci0JCWJveC5zZXRUb29sVGlwVGV4dCgiVXNlIGEgY3VzdG9tIGNsYXNzIGxvYWRlciB0byByZWxvYWQgdGhlIGNsYXNzZXMgZm9yIGV2ZXJ5IHJ1biIpOwotCQlpZiAoaW5WQUphdmEoKSkKLQkJCWJveC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJcmV0dXJuIGJveDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpCdXR0b24gY3JlYXRlUXVpdEJ1dHRvbigpIHsKLQkJIC8vIHNwYWNlcyByZXF1aXJlZCB0byBhdm9pZCBsYXlvdXQgZmxpY2tlcgotCQkgLy8gRXhpdCBpcyBzaG9ydGVyIHRoYW4gU3RvcCB0aGF0IHNob3dzIGluIHRoZSBzYW1lIGNvbHVtbgotCQlKQnV0dG9uIHF1aXQ9IG5ldyBKQnV0dG9uKCIgRXhpdCAiKTsgCi0JCXF1aXQuYWRkQWN0aW9uTGlzdGVuZXIoCi0JCQluZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLQkJCQkJdGVybWluYXRlKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCQlyZXR1cm4gcXVpdDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpCdXR0b24gY3JlYXRlUnVuQnV0dG9uKCkgewotCQlKQnV0dG9uIHJ1bj0gbmV3IEpCdXR0b24oIlJ1biIpOwotCQlydW4uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcnVuLmFkZEFjdGlvbkxpc3RlbmVyKAotCQkJbmV3IEFjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXJ1blN1aXRlKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCQlyZXR1cm4gcnVuOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29tcG9uZW50IGNyZWF0ZUJyb3dzZUJ1dHRvbigpIHsKLQkJSkJ1dHRvbiBicm93c2U9IG5ldyBKQnV0dG9uKCIuLi4iKTsKLQkJYnJvd3NlLnNldFRvb2xUaXBUZXh0KCJTZWxlY3QgYSBUZXN0IGNsYXNzIik7Ci0JCWJyb3dzZS5hZGRBY3Rpb25MaXN0ZW5lcigKLQkJCW5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotCQkJCQlicm93c2VUZXN0Q2xhc3NlcygpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQkJcmV0dXJuIGJyb3dzZTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgU3RhdHVzTGluZSBjcmVhdGVTdGF0dXNMaW5lKCkgewotCQlyZXR1cm4gbmV3IFN0YXR1c0xpbmUoNDIwKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpDb21ib0JveCBjcmVhdGVTdWl0ZUNvbWJvKCkgewotCQlKQ29tYm9Cb3ggY29tYm89IG5ldyBKQ29tYm9Cb3goKTsKLQkJY29tYm8uc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCWNvbWJvLnNldExpZ2h0V2VpZ2h0UG9wdXBFbmFibGVkKGZhbHNlKTsKLQkJCi0JCWNvbWJvLmdldEVkaXRvcigpLmdldEVkaXRvckNvbXBvbmVudCgpLmFkZEtleUxpc3RlbmVyKAotCQkJbmV3IEtleUFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQga2V5VHlwZWQoS2V5RXZlbnQgZSkgewotCQkJCQl0ZXh0Q2hhbmdlZCgpOwotCQkJCQlpZiAoZS5nZXRLZXlDaGFyKCkgPT0gS2V5RXZlbnQuVktfRU5URVIpCi0JCQkJCQlydW5TdWl0ZSgpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQkJdHJ5IHsKLQkJCWxvYWRIaXN0b3J5KGNvbWJvKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gZmFpbHMgdGhlIGZpcnN0IHRpbWUKLQkJfQotCQljb21iby5hZGRJdGVtTGlzdGVuZXIoCi0JCQluZXcgSXRlbUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGl0ZW1TdGF0ZUNoYW5nZWQoSXRlbUV2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChldmVudC5nZXRTdGF0ZUNoYW5nZSgpID09IEl0ZW1FdmVudC5TRUxFQ1RFRCkgewotCQkJCQkJdGV4dENoYW5nZWQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQkKLQlwcm90ZWN0ZWQgSlRhYmJlZFBhbmUgY3JlYXRlVGVzdFJ1blZpZXdzKCkgewotCQlKVGFiYmVkUGFuZSBwYW5lPSBuZXcgSlRhYmJlZFBhbmUoSlRhYmJlZFBhbmUuQk9UVE9NKTsKLQotCQlGYWlsdXJlUnVuVmlldyBsdj0gbmV3IEZhaWx1cmVSdW5WaWV3KHRoaXMpOwotCQlmVGVzdFJ1blZpZXdzLmFkZEVsZW1lbnQobHYpOwotCQlsdi5hZGRUYWIocGFuZSk7Ci0JCQotCQlUZXN0SGllcmFyY2h5UnVuVmlldyB0dj0gbmV3IFRlc3RIaWVyYXJjaHlSdW5WaWV3KHRoaXMpOwotCQlmVGVzdFJ1blZpZXdzLmFkZEVsZW1lbnQodHYpOwotCQl0di5hZGRUYWIocGFuZSk7Ci0JCQotCQlwYW5lLmFkZENoYW5nZUxpc3RlbmVyKAotCQkJbmV3IENoYW5nZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJCXRlc3RWaWV3Q2hhbmdlZCgpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQkJcmV0dXJuIHBhbmU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaWV3Q2hhbmdlZCgpIHsKLQkJVGVzdFJ1blZpZXcgdmlldz0gKFRlc3RSdW5WaWV3KWZUZXN0UnVuVmlld3MuZWxlbWVudEF0KGZUZXN0Vmlld1RhYi5nZXRTZWxlY3RlZEluZGV4KCkpOwotCQl2aWV3LmFjdGl2YXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBUZXN0UmVzdWx0IGNyZWF0ZVRlc3RSZXN1bHQoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFJlc3VsdCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSkZyYW1lIGNyZWF0ZVVJKFN0cmluZyBzdWl0ZU5hbWUpIHsJCi0JCUpGcmFtZSBmcmFtZT0gY3JlYXRlRnJhbWUoIkpVbml0Iik7CQotCQlKTWVudUJhciBtYj0gbmV3IEpNZW51QmFyKCk7Ci0JCWNyZWF0ZU1lbnVzKG1iKTsKLQkJZnJhbWUuc2V0Sk1lbnVCYXIobWIpOwotCQotCQlKTGFiZWwgc3VpdGVMYWJlbD0gbmV3IEpMYWJlbCgiVGVzdCBjbGFzcyBuYW1lOiIpOwotCQlmU3VpdGVDb21ibz0gY3JlYXRlU3VpdGVDb21ibygpOwotCQlmUnVuPSBjcmVhdGVSdW5CdXR0b24oKTsKLQkJZnJhbWUuZ2V0Um9vdFBhbmUoKS5zZXREZWZhdWx0QnV0dG9uKGZSdW4pOwotCQlDb21wb25lbnQgYnJvd3NlQnV0dG9uPSBjcmVhdGVCcm93c2VCdXR0b24oKTsKLQkJCi0JCWZVc2VMb2FkaW5nUnVubmVyPSBjcmVhdGVVc2VMb2FkZXJDaGVja0JveCgpOwotCQlmUHJvZ3Jlc3NJbmRpY2F0b3I9IG5ldyBQcm9ncmVzc0JhcigpOwotCQlmQ291bnRlclBhbmVsPSBjcmVhdGVDb3VudGVyUGFuZWwoKTsKLQkJCi0JCUpMYWJlbCBmYWlsdXJlTGFiZWw9IG5ldyBKTGFiZWwoIkVycm9ycyBhbmQgRmFpbHVyZXM6Iik7Ci0JCWZGYWlsdXJlcz0gbmV3IERlZmF1bHRMaXN0TW9kZWwoKTsKLQkJCi0JCWZUZXN0Vmlld1RhYj0gY3JlYXRlVGVzdFJ1blZpZXdzKCk7CQotCQlKUGFuZWwgZmFpbGVkUGFuZWw9IGNyZWF0ZUZhaWxlZFBhbmVsKCk7Ci0JCQotCQlmRmFpbHVyZVZpZXc9IGNyZWF0ZUZhaWx1cmVEZXRhaWxWaWV3KCk7Ci0JCUpTY3JvbGxQYW5lIHRyYWNlUGFuZT0gbmV3IEpTY3JvbGxQYW5lKGZGYWlsdXJlVmlldy5nZXRDb21wb25lbnQoKSwgSlNjcm9sbFBhbmUuVkVSVElDQUxfU0NST0xMQkFSX0FMV0FZUywgSlNjcm9sbFBhbmUuSE9SSVpPTlRBTF9TQ1JPTExCQVJfQUxXQVlTKTsKLQotCQlmU3RhdHVzTGluZT0gY3JlYXRlU3RhdHVzTGluZSgpOwotCQlmUXVpdEJ1dHRvbj0gY3JlYXRlUXVpdEJ1dHRvbigpOwotCQlmTG9nbz0gY3JlYXRlTG9nbygpOwotCQkJCQkKLQkJSlBhbmVsIHBhbmVsPSBuZXcgSlBhbmVsKG5ldyBHcmlkQmFnTGF5b3V0KCkpOwotCQotCQlhZGRHcmlkKHBhbmVsLCBzdWl0ZUxhYmVsLAkwLCAwLCAyLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTCwgCTEuMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QpOwotCQlhZGRHcmlkKHBhbmVsLCBmU3VpdGVDb21ibywgCTAsIDEsIDEsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMLCAJMS4wLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCk7Ci0JCWFkZEdyaWQocGFuZWwsIGJyb3dzZUJ1dHRvbiwgCTEsIDEsIDEsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FLCAJCQkwLjAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUKTsKLQkJYWRkR3JpZChwYW5lbCwgZlJ1biwgCQkyLCAxLCAxLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTCwgCTAuMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUik7Ci0KLQkJYWRkR3JpZChwYW5lbCwgZlVzZUxvYWRpbmdSdW5uZXIsICAJMCwgMiwgMywgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwsIDEuMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QpOwotCQlhZGRHcmlkKHBhbmVsLCBuZXcgSlNlcGFyYXRvcigpLCAJMCwgMywgMywgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwsIDEuMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QpOwotCi0JCQotCQlhZGRHcmlkKHBhbmVsLCBmUHJvZ3Jlc3NJbmRpY2F0b3IsIAkwLCA0LCAyLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTCwgCTEuMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QpOwotCQlhZGRHcmlkKHBhbmVsLCBmTG9nbywgCQkJMiwgNCwgMSwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUsIAkJCTAuMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIKTsKLQotCQlhZGRHcmlkKHBhbmVsLCBmQ291bnRlclBhbmVsLAkgMCwgNSwgMiwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUsIAkJCTAuMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUik7Ci0KLQkJSlNwbGl0UGFuZSBzcGxpdHRlcj0gbmV3IEpTcGxpdFBhbmUoSlNwbGl0UGFuZS5WRVJUSUNBTF9TUExJVCwgZlRlc3RWaWV3VGFiLCB0cmFjZVBhbmUpOwotCQlhZGRHcmlkKHBhbmVsLCBzcGxpdHRlciwgCSAwLCA2LCAyLCBHcmlkQmFnQ29uc3RyYWludHMuQk9USCwgCQkJMS4wLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCk7CQkJCQotCi0JCWFkZEdyaWQocGFuZWwsIGZhaWxlZFBhbmVsLCAJIDIsIDYsIDEsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMLCAJMC4wLCBHcmlkQmFnQ29uc3RyYWludHMuTk9SVEgvKkNFTlRFUiovKTsKLQkJCi0JCWFkZEdyaWQocGFuZWwsIGZTdGF0dXNMaW5lLCAJIDAsIDgsIDIsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMLCAJMS4wLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSKTsKLQkJYWRkR3JpZChwYW5lbCwgZlF1aXRCdXR0b24sIAkgMiwgOCwgMSwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwsIAkwLjAsIEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVIpOwotCQkKLQkJZnJhbWUuc2V0Q29udGVudFBhbmUocGFuZWwpOwotCQlmcmFtZS5wYWNrKCk7Ci0JCWZyYW1lLnNldExvY2F0aW9uKDIwMCwgMjAwKTsKLQkJcmV0dXJuIGZyYW1lOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRHcmlkKEpQYW5lbCBwLCBDb21wb25lbnQgY28sIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBmaWxsLCBkb3VibGUgd3gsIGludCBhbmNob3IpIHsKLQkJR3JpZEJhZ0NvbnN0cmFpbnRzIGM9IG5ldyBHcmlkQmFnQ29uc3RyYWludHMoKTsKLQkJYy5ncmlkeD0geDsgYy5ncmlkeT0geTsKLQkJYy5ncmlkd2lkdGg9IHc7Ci0JCWMuYW5jaG9yPSBhbmNob3I7Ci0JCWMud2VpZ2h0eD0gd3g7Ci0JCWMuZmlsbD0gZmlsbDsKLQkJaWYgKGZpbGwgPT0gR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEggfHwgZmlsbCA9PSBHcmlkQmFnQ29uc3RyYWludHMuVkVSVElDQUwpCi0JCQljLndlaWdodHk9IDEuMDsKLQkJYy5pbnNldHM9IG5ldyBJbnNldHMoeSA9PSAwID8gR0FQIDogMCwgeCA9PSAwID8gR0FQIDogMCwgR0FQLCBHQVApOwotCQlwLmFkZChjbywgYyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdWl0ZVRleHQoKSB7Ci0JCWlmIChmU3VpdGVDb21ibyA9PSBudWxsKQotCQkJcmV0dXJuICIiOwotCQlyZXR1cm4gKFN0cmluZylmU3VpdGVDb21iby5nZXRFZGl0b3IoKS5nZXRJdGVtKCk7Ci0JfQotCQotCXB1YmxpYyBMaXN0TW9kZWwgZ2V0RmFpbHVyZXMoKSB7Ci0JCXJldHVybiBmRmFpbHVyZXM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluc2VydFVwZGF0ZShEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCXRleHRDaGFuZ2VkKCk7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCBicm93c2VUZXN0Q2xhc3NlcygpIHsKLQkJVGVzdENvbGxlY3RvciBjb2xsZWN0b3I9IGNyZWF0ZVRlc3RDb2xsZWN0b3IoKTsJCQotCQlUZXN0U2VsZWN0b3Igc2VsZWN0b3I9IG5ldyBUZXN0U2VsZWN0b3IoZkZyYW1lLCBjb2xsZWN0b3IpOwotCQlpZiAoc2VsZWN0b3IuaXNFbXB0eSgpKSB7Ci0JCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhmRnJhbWUsICJObyBUZXN0IENhc2VzIGZvdW5kLlxuQ2hlY2sgdGhhdCB0aGUgY29uZmlndXJlZCBcJ1Rlc3RDb2xsZWN0b3JcJyBpcyBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybS4iKTsKLQkJCXJldHVybjsKLQkJfQotCQlzZWxlY3Rvci5zaG93KCk7Ci0JCVN0cmluZyBjbGFzc05hbWU9IHNlbGVjdG9yLmdldFNlbGVjdGVkSXRlbSgpOwotCQlpZiAoY2xhc3NOYW1lICE9IG51bGwpCi0JCQlzZXRTdWl0ZShjbGFzc05hbWUpOwotCX0KLQotCVRlc3RDb2xsZWN0b3IgY3JlYXRlVGVzdENvbGxlY3RvcigpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZT0gQmFzZVRlc3RSdW5uZXIuZ2V0UHJlZmVyZW5jZShURVNUQ09MTEVDVE9SX0tFWSk7Ci0JCWlmIChjbGFzc05hbWUgIT0gbnVsbCkgewkJCQotCQkJQ2xhc3MgY29sbGVjdG9yQ2xhc3M9IG51bGw7Ci0JCQl0cnkgewotCQkJCWNvbGxlY3RvckNsYXNzPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0JCQkJcmV0dXJuIChUZXN0Q29sbGVjdG9yKWNvbGxlY3RvckNsYXNzLm5ld0luc3RhbmNlKCk7Ci0JCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2coZkZyYW1lLCAiQ291bGQgbm90IGNyZWF0ZSBUZXN0Q29sbGVjdG9yIC0gdXNpbmcgZGVmYXVsdCBjb2xsZWN0b3IiKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IFNpbXBsZVRlc3RDb2xsZWN0b3IoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJbWFnZSBsb2FkRnJhbWVJY29uKCkgewotCQlJbWFnZUljb24gaWNvbj0gKEltYWdlSWNvbilnZXRJY29uUmVzb3VyY2UoQmFzZVRlc3RSdW5uZXIuY2xhc3MsICJzbWFsbGxvZ28uZ2lmIik7Ci0JCWlmIChpY29uICE9IG51bGwpCi0JCQlyZXR1cm4gaWNvbi5nZXRJbWFnZSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvYWRIaXN0b3J5KEpDb21ib0JveCBjb21ibykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQnVmZmVyZWRSZWFkZXIgYnI9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihnZXRTZXR0aW5nc0ZpbGUoKSkpOwotCQlpbnQgaXRlbUNvdW50PSAwOwotCQl0cnkgewotCQkJU3RyaW5nIGxpbmU7Ci0JCQl3aGlsZSAoKGxpbmU9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLQkJCQljb21iby5hZGRJdGVtKGxpbmUpOwotCQkJCWl0ZW1Db3VudCsrOwotCQkJfQotCQkJaWYgKGl0ZW1Db3VudCA+IDApCi0JCQkJY29tYm8uc2V0U2VsZWN0ZWRJbmRleCgwKTsKLQotCQl9IGZpbmFsbHkgewotCQkJYnIuY2xvc2UoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIEZpbGUgZ2V0U2V0dGluZ3NGaWxlKCkgewotCSAJU3RyaW5nIGhvbWU9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIik7Ci0gCQlyZXR1cm4gbmV3IEZpbGUoaG9tZSwiLmp1bml0c2Vzc2lvbiIpOwotIAl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBvc3RJbmZvKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCVN3aW5nVXRpbGl0aWVzLmludm9rZUxhdGVyKAotCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJc2hvd0luZm8obWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcG9zdFN0YXR1cyhmaW5hbCBTdHJpbmcgc3RhdHVzKSB7Ci0JCVN3aW5nVXRpbGl0aWVzLmludm9rZUxhdGVyKAotCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJc2hvd1N0YXR1cyhzdGF0dXMpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlVXBkYXRlKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJdGV4dENoYW5nZWQoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlcnVuKCkgewotCQlUZXN0UnVuVmlldyB2aWV3PSAoVGVzdFJ1blZpZXcpZlRlc3RSdW5WaWV3cy5lbGVtZW50QXQoZlRlc3RWaWV3VGFiLmdldFNlbGVjdGVkSW5kZXgoKSk7Ci0JCVRlc3QgcmVydW5UZXN0PSB2aWV3LmdldFNlbGVjdGVkVGVzdCgpOwotCQlpZiAocmVydW5UZXN0ICE9IG51bGwpCi0JCQlyZXJ1blRlc3QocmVydW5UZXN0KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlcnVuVGVzdChUZXN0IHRlc3QpIHsKLQkJaWYgKCEodGVzdCBpbnN0YW5jZW9mIFRlc3RDYXNlKSkgewotCQkJc2hvd0luZm8oIkNvdWxkIG5vdCByZWxvYWQgIisgdGVzdC50b1N0cmluZygpKTsKLQkJCXJldHVybjsKLQkJfQotCQlUZXN0IHJlbG9hZGVkVGVzdD0gbnVsbDsKLQkJdHJ5IHsKLQkJCUNsYXNzIHJlbG9hZGVkVGVzdENsYXNzPSBnZXRMb2FkZXIoKS5yZWxvYWQodGVzdC5nZXRDbGFzcygpKTsKLQkJCUNsYXNzW10gY2xhc3NBcmdzPSB7IFN0cmluZy5jbGFzcyB9OwotCQkJT2JqZWN0W10gYXJncz0gbmV3IE9iamVjdFtdeygoVGVzdENhc2UpdGVzdCkuZ2V0TmFtZSgpfTsKLQkJCUNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yPSByZWxvYWRlZFRlc3RDbGFzcy5nZXRDb25zdHJ1Y3RvcihjbGFzc0FyZ3MpOwotCQkJcmVsb2FkZWRUZXN0PShUZXN0KWNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKGFyZ3MpOwotCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQlzaG93SW5mbygiQ291bGQgbm90IHJlbG9hZCAiKyB0ZXN0LnRvU3RyaW5nKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVRlc3RSZXN1bHQgcmVzdWx0PSBuZXcgVGVzdFJlc3VsdCgpOwotCQlyZWxvYWRlZFRlc3QucnVuKHJlc3VsdCk7Ci0JCQotCQlTdHJpbmcgbWVzc2FnZT0gcmVsb2FkZWRUZXN0LnRvU3RyaW5nKCk7Ci0JCWlmKHJlc3VsdC53YXNTdWNjZXNzZnVsKCkpCi0JCQlzaG93SW5mbyhtZXNzYWdlKyIgd2FzIHN1Y2Nlc3NmdWwiKTsKLQkJZWxzZSBpZiAocmVzdWx0LmVycm9yQ291bnQoKSA9PSAxKSAKLQkJCXNob3dTdGF0dXMobWVzc2FnZSsiIGhhZCBhbiBlcnJvciIpOyAKLQkJZWxzZSAKLQkJCXNob3dTdGF0dXMobWVzc2FnZSsiIGhhZCBhIGZhaWx1cmUiKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXNldCgpIHsKLQkJZkNvdW50ZXJQYW5lbC5yZXNldCgpOwotCQlmUHJvZ3Jlc3NJbmRpY2F0b3IucmVzZXQoKTsKLQkJZlJlcnVuQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlmRmFpbHVyZVZpZXcuY2xlYXIoKTsKLQkJZkZhaWx1cmVzLmNsZWFyKCk7Ci0JfQotCQotCS8qKgotCSAqIHJ1bnMgYSBzdWl0ZS4KLQkgKiBAZGVwcmVjYXRlZCB1c2UgcnVuU3VpdGUoKSBpbnN0ZWFkCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlydW5TdWl0ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBydW5GYWlsZWQoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc2hvd1N0YXR1cyhtZXNzYWdlKTsKLQkJZlJ1bi5zZXRUZXh0KCJSdW4iKTsKLQkJZlJ1bm5lcj0gbnVsbDsKLQl9Ci0JCi0Jc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIHJ1blN1aXRlKCkgewotCQlpZiAoZlJ1bm5lciAhPSBudWxsKSB7Ci0JCQlmVGVzdFJlc3VsdC5zdG9wKCk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXRMb2FkaW5nKHNob3VsZFJlbG9hZCgpKTsKLQkJCXJlc2V0KCk7Ci0JCQlzaG93SW5mbygiTG9hZCBUZXN0IENhc2UuLi4iKTsKLQkJCWZpbmFsIFN0cmluZyBzdWl0ZU5hbWU9IGdldFN1aXRlVGV4dCgpOwotCQkJZmluYWwgVGVzdCB0ZXN0U3VpdGU9IGdldFRlc3Qoc3VpdGVOYW1lKTsJCQotCQkJaWYgKHRlc3RTdWl0ZSAhPSBudWxsKSB7Ci0JCQkJYWRkVG9IaXN0b3J5KHN1aXRlTmFtZSk7Ci0JCQkJZG9SdW5UZXN0KHRlc3RTdWl0ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZFJlbG9hZCgpIHsKLQkJcmV0dXJuICFpblZBSmF2YSgpICYmIGZVc2VMb2FkaW5nUnVubmVyLmlzU2VsZWN0ZWQoKTsKLQl9Ci0JCi0KLQlzeW5jaHJvbml6ZWQgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdChmaW5hbCBUZXN0IHRlc3RTdWl0ZSkgewotCQlpZiAoZlJ1bm5lciAhPSBudWxsKSB7Ci0JCQlmVGVzdFJlc3VsdC5zdG9wKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXNldCgpOwkKLQkJCWlmICh0ZXN0U3VpdGUgIT0gbnVsbCkgewotCQkJCWRvUnVuVGVzdCh0ZXN0U3VpdGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkb1J1blRlc3QoZmluYWwgVGVzdCB0ZXN0U3VpdGUpIHsKLQkJc2V0QnV0dG9uTGFiZWwoZlJ1biwgIlN0b3AiKTsKLQkJZlJ1bm5lcj0gbmV3IFRocmVhZCgiVGVzdFJ1bm5lci1UaHJlYWQiKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVGVzdFJ1bm5lci50aGlzLnN0YXJ0KHRlc3RTdWl0ZSk7IAotCQkJCXBvc3RJbmZvKCJSdW5uaW5nLi4uIik7Ci0JCQkJCi0JCQkJbG9uZyBzdGFydFRpbWU9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCXRlc3RTdWl0ZS5ydW4oZlRlc3RSZXN1bHQpOwotCQkJCQkKLQkJCQlpZiAoZlRlc3RSZXN1bHQuc2hvdWxkU3RvcCgpKSB7Ci0JCQkJCXBvc3RTdGF0dXMoIlN0b3BwZWQiKTsKLQkJCQl9IGVsc2UgewotCQkJCQlsb25nIGVuZFRpbWU9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQlsb25nIHJ1blRpbWU9IGVuZFRpbWUtc3RhcnRUaW1lOwotCQkJCQlwb3N0SW5mbygiRmluaXNoZWQ6ICIgKyBlbGFwc2VkVGltZUFzU3RyaW5nKHJ1blRpbWUpICsgIiBzZWNvbmRzIik7Ci0JCQkJfQotCQkJCXJ1bkZpbmlzaGVkKHRlc3RTdWl0ZSk7Ci0JCQkJc2V0QnV0dG9uTGFiZWwoZlJ1biwgIlJ1biIpOwotCQkJCWZSdW5uZXI9IG51bGw7Ci0JCQkJU3lzdGVtLmdjKCk7Ci0JCQl9Ci0JCX07Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHRoZSB0ZXN0IHJlc3VsdCBpcyBjcmVhdGVkIGJlZm9yZSB3ZSBzdGFydCB0aGUKLQkJLy8gdGVzdCBydW5uZXIgdGhyZWFkIHNvIHRoYXQgbGlzdGVuZXJzIGNhbiByZWdpc3RlciBmb3IgaXQuCi0JCWZUZXN0UmVzdWx0PSBjcmVhdGVUZXN0UmVzdWx0KCk7Ci0JCWZUZXN0UmVzdWx0LmFkZExpc3RlbmVyKFRlc3RSdW5uZXIudGhpcyk7Ci0JCWFib3V0VG9TdGFydCh0ZXN0U3VpdGUpOwotCi0JCWZSdW5uZXIuc3RhcnQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2F2ZUhpc3RvcnkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlCdWZmZXJlZFdyaXRlciBidz0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKGdldFNldHRpbmdzRmlsZSgpKSk7Ci0JCXRyeSB7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgZlN1aXRlQ29tYm8uZ2V0SXRlbUNvdW50KCk7IGkrKykgewotCQkJCVN0cmluZyB0ZXN0c3VpdGU9IGZTdWl0ZUNvbWJvLmdldEl0ZW1BdChpKS50b1N0cmluZygpOwotCQkJCWJ3LndyaXRlKHRlc3RzdWl0ZSwgMCwgdGVzdHN1aXRlLmxlbmd0aCgpKTsKLQkJCQlidy5uZXdMaW5lKCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlidy5jbG9zZSgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRCdXR0b25MYWJlbChmaW5hbCBKQnV0dG9uIGJ1dHRvbiwgZmluYWwgU3RyaW5nIGxhYmVsKSB7Ci0JCVN3aW5nVXRpbGl0aWVzLmludm9rZUxhdGVyKAotCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJYnV0dG9uLnNldFRleHQobGFiZWwpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldExhYmVsVmFsdWUoZmluYWwgSlRleHRGaWVsZCBsYWJlbCwgZmluYWwgaW50IHZhbHVlKSB7Ci0JCVN3aW5nVXRpbGl0aWVzLmludm9rZUxhdGVyKAotCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJbGFiZWwuc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKHZhbHVlKSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgaGFuZGxlVGVzdFNlbGVjdGVkKFRlc3QgdGVzdCkgewotCQlmUmVydW5CdXR0b24uc2V0RW5hYmxlZCh0ZXN0ICE9IG51bGwgJiYgKHRlc3QgaW5zdGFuY2VvZiBUZXN0Q2FzZSkpOwotCQlzaG93RmFpbHVyZURldGFpbCh0ZXN0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2hvd0ZhaWx1cmVEZXRhaWwoVGVzdCB0ZXN0KSB7Ci0JCWlmICh0ZXN0ICE9IG51bGwpIHsKLQkJCUxpc3RNb2RlbCBmYWlsdXJlcz0gZ2V0RmFpbHVyZXMoKTsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBmYWlsdXJlcy5nZXRTaXplKCk7IGkrKykgewotCQkJCVRlc3RGYWlsdXJlIGZhaWx1cmU9IChUZXN0RmFpbHVyZSlmYWlsdXJlcy5nZXRFbGVtZW50QXQoaSk7Ci0JCQkJaWYgKGZhaWx1cmUuZmFpbGVkVGVzdCgpID09IHRlc3QpIHsKLQkJCQkJZkZhaWx1cmVWaWV3LnNob3dGYWlsdXJlKGZhaWx1cmUpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZGYWlsdXJlVmlldy5jbGVhcigpOwotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIHNob3dJbmZvKFN0cmluZyBtZXNzYWdlKSB7Ci0JCWZTdGF0dXNMaW5lLnNob3dJbmZvKG1lc3NhZ2UpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2hvd1N0YXR1cyhTdHJpbmcgc3RhdHVzKSB7Ci0JCWZTdGF0dXNMaW5lLnNob3dFcnJvcihzdGF0dXMpOwotCX0KLQkKLQkvKioKLQkgKiBTdGFydHMgdGhlIFRlc3RSdW5uZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChTdHJpbmdbXSBhcmdzKSB7CQkKLQkJU3RyaW5nIHN1aXRlTmFtZT0gcHJvY2Vzc0FyZ3VtZW50cyhhcmdzKTsKLQkJZkZyYW1lPSBjcmVhdGVVSShzdWl0ZU5hbWUpOwotCQlmRnJhbWUucGFjaygpOyAKLQkJZkZyYW1lLnNldFZpc2libGUodHJ1ZSk7Ci0KLQkJaWYgKHN1aXRlTmFtZSAhPSBudWxsKSB7Ci0JCQlzZXRTdWl0ZShzdWl0ZU5hbWUpOwotCQkJcnVuU3VpdGUoKTsKLQkJfQotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0KGZpbmFsIFRlc3QgdGVzdCkgewotCQlTd2luZ1V0aWxpdGllcy5pbnZva2VMYXRlcigKLQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWludCB0b3RhbD0gdGVzdC5jb3VudFRlc3RDYXNlcygpOwotCQkJCQlmUHJvZ3Jlc3NJbmRpY2F0b3Iuc3RhcnQodG90YWwpOwotCQkJCQlmQ291bnRlclBhbmVsLnNldFRvdGFsKHRvdGFsKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCQotCS8qKgotCSAqIFdhaXQgdW50aWwgYWxsIHRoZSBldmVudHMgYXJlIHByb2Nlc3NlZCBpbiB0aGUgZXZlbnQgdGhyZWFkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN5bmNoVUkoKSB7Ci0JCXRyeSB7Ci0JCQlTd2luZ1V0aWxpdGllcy5pbnZva2VBbmRXYWl0KAotCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkge30KLQkJCQl9CQkKLQkJCSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGVybWluYXRlcyB0aGUgVGVzdFJ1bm5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHRlcm1pbmF0ZSgpIHsKLQkJZkZyYW1lLmRpc3Bvc2UoKTsKLQkJdHJ5IHsKLQkJCXNhdmVIaXN0b3J5KCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ291bGRuJ3Qgc2F2ZSB0ZXN0IHJ1biBoaXN0b3J5Iik7Ci0JCX0KLQkJU3lzdGVtLmV4aXQoMCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRleHRDaGFuZ2VkKCkgewotCQlmUnVuLnNldEVuYWJsZWQoZ2V0U3VpdGVUZXh0KCkubGVuZ3RoKCkgPiAwKTsKLQkJY2xlYXJTdGF0dXMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJTdGF0dXMoKSB7Ci0JCWZTdGF0dXNMaW5lLmNsZWFyKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSWNvbiBnZXRJY29uUmVzb3VyY2UoQ2xhc3MgY2xhenosIFN0cmluZyBuYW1lKSB7Ci0JCVVSTCB1cmw9IGNsYXp6LmdldFJlc291cmNlKG5hbWUpOwotCQlpZiAodXJsID09IG51bGwpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiV2FybmluZzogY291bGQgbm90IGxvYWQgXCIiK25hbWUrIlwiIGljb24iKTsKLQkJCXJldHVybiBudWxsOwotCQl9IAotCQlyZXR1cm4gbmV3IEltYWdlSWNvbih1cmwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWJvdXQoKSB7Ci0JCUFib3V0RGlhbG9nIGFib3V0PSBuZXcgQWJvdXREaWFsb2coZkZyYW1lKTsgCi0JCWFib3V0LnNob3coKTsKLQl9Ci0JCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3N3aW5ndWkvVGVzdFNlbGVjdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3N3aW5ndWkvVGVzdFNlbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YWRkZTQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9zd2luZ3VpL1Rlc3RTZWxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLXBhY2thZ2UganVuaXQuc3dpbmd1aTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEuYXd0Lio7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuKjsKLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lio7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC5ydW5uZXIuKjsKLQotLyoqCi0gKiBBIHRlc3QgY2xhc3Mgc2VsZWN0b3IuIEEgc2ltcGxlIGRpYWxvZyB0byBwaWNrIHRoZSBuYW1lIG9mIGEgdGVzdCBzdWl0ZS4KLSAqLwotY2xhc3MgVGVzdFNlbGVjdG9yIGV4dGVuZHMgSkRpYWxvZyB7Ci0JcHJpdmF0ZSBKQnV0dG9uIGZDYW5jZWw7Ci0JcHJpdmF0ZSBKQnV0dG9uIGZPazsKLQlwcml2YXRlIEpMaXN0IGZMaXN0OwotCXByaXZhdGUgSlNjcm9sbFBhbmUgZlNjcm9sbGVkTGlzdDsKLQlwcml2YXRlIEpMYWJlbCBmRGVzY3JpcHRpb247Ci0JcHJpdmF0ZSBTdHJpbmcgZlNlbGVjdGVkSXRlbTsKLQkKLQkvKioKLQkgKiBSZW5kZXJzIFRlc3RGYWlsdXJlcyBpbiBhIEpMaXN0Ci0JICovCi0Jc3RhdGljIGNsYXNzIFRlc3RDZWxsUmVuZGVyZXIgZXh0ZW5kcyBEZWZhdWx0TGlzdENlbGxSZW5kZXJlciB7Ci0JCUljb24gZkxlYWZJY29uOwotCQlJY29uIGZTdWl0ZUljb247Ci0JCQotCQlwdWJsaWMgVGVzdENlbGxSZW5kZXJlcigpIHsKLQkJCWZMZWFmSWNvbj0gVUlNYW5hZ2VyLmdldEljb24oIlRyZWUubGVhZkljb24iKTsKLQkJCWZTdWl0ZUljb249IFVJTWFuYWdlci5nZXRJY29uKCJUcmVlLmNsb3NlZEljb24iKTsKLQkJfQotCQkKLQkJcHVibGljIENvbXBvbmVudCBnZXRMaXN0Q2VsbFJlbmRlcmVyQ29tcG9uZW50KAotCQkJCUpMaXN0IGxpc3QsIE9iamVjdCB2YWx1ZSwgaW50IG1vZGVsSW5kZXgsIAotCQkJCWJvb2xlYW4gaXNTZWxlY3RlZCwgYm9vbGVhbiBjZWxsSGFzRm9jdXMpIHsKLQkJCUNvbXBvbmVudCBjPSBzdXBlci5nZXRMaXN0Q2VsbFJlbmRlcmVyQ29tcG9uZW50KGxpc3QsIHZhbHVlLCBtb2RlbEluZGV4LCBpc1NlbGVjdGVkLCBjZWxsSGFzRm9jdXMpOwotCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmc9IGRpc3BsYXlTdHJpbmcoKFN0cmluZyl2YWx1ZSk7Ci0JCQkKLQkJCWlmIChkaXNwbGF5U3RyaW5nLnN0YXJ0c1dpdGgoIkFsbFRlc3RzIikpCi0JCQkJc2V0SWNvbihmU3VpdGVJY29uKTsKLQkJCWVsc2UKLQkJCQlzZXRJY29uKGZMZWFmSWNvbik7Ci0JCQkJCi0JCQlzZXRUZXh0KGRpc3BsYXlTdHJpbmcpOwotCQkgICAgCXJldHVybiBjOwotCQl9Ci0JCQotCQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJCWludCB0eXBlSW5kZXg9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOwotICAgIAkJCWlmICh0eXBlSW5kZXggPCAwKSAKLSAgICAJCQkJcmV0dXJuIGNsYXNzTmFtZTsKLSAgICAJCQlyZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZyh0eXBlSW5kZXgrMSkgKyAiIC0gIiArIGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgdHlwZUluZGV4KTsKLQkJfQotCQkKLQkJcHVibGljIHN0YXRpYyBib29sZWFuIG1hdGNoZXNLZXkoU3RyaW5nIHMsIGNoYXIgY2gpIHsKLSAgICAJCQlyZXR1cm4gY2ggPT0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHMuY2hhckF0KHR5cGVJbmRleChzKSkpOwotCQl9Ci0JCQotCQlwcml2YXRlIHN0YXRpYyBpbnQgdHlwZUluZGV4KFN0cmluZyBzKSB7Ci0JCQlpbnQgdHlwZUluZGV4PSBzLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQlpbnQgaT0gMDsKLSAgICAJCQlpZiAodHlwZUluZGV4ID4gMCkgCi0gICAgCQkJCWk9IHR5cGVJbmRleCsxOwotICAgIAkJCXJldHVybiBpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBjbGFzcyBEb3VibGVDbGlja0xpc3RlbmVyIGV4dGVuZHMgTW91c2VBZGFwdGVyIHsKLQkJcHVibGljIHZvaWQgbW91c2VDbGlja2VkKE1vdXNlRXZlbnQgZSkgewotCSAgICAJCWlmIChlLmdldENsaWNrQ291bnQoKSA9PSAyKSB7Ci0JICAgIAkJCW9rU2VsZWN0ZWQoKTsKLQkgICAgCQl9Ci0JICAgICAgfQotCX0KLQkKLQlwcm90ZWN0ZWQgY2xhc3MgS2V5U2VsZWN0TGlzdGVuZXIgZXh0ZW5kcyBLZXlBZGFwdGVyIHsKLQkJcHVibGljIHZvaWQga2V5VHlwZWQoS2V5RXZlbnQgZSkgewotCQkJa2V5U2VsZWN0VGVzdENsYXNzKGUuZ2V0S2V5Q2hhcigpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXN0U2VsZWN0b3IoRnJhbWUgcGFyZW50LCBUZXN0Q29sbGVjdG9yIHRlc3RDb2xsZWN0b3IpIHsKLQkJc3VwZXIocGFyZW50LCB0cnVlKTsKLQkJc2V0U2l6ZSgzNTAsIDMwMCk7Ci0JCXNldFJlc2l6YWJsZShmYWxzZSk7Ci0JCXNldExvY2F0aW9uUmVsYXRpdmVUbyhwYXJlbnQpOwotCQlzZXRUaXRsZSgiVGVzdCBTZWxlY3RvciIpOwotCQkKLQkJVmVjdG9yIGxpc3Q9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwYXJlbnQuc2V0Q3Vyc29yKEN1cnNvci5nZXRQcmVkZWZpbmVkQ3Vyc29yKEN1cnNvci5XQUlUX0NVUlNPUikpOwotCQkJbGlzdD0gY3JlYXRlVGVzdExpc3QodGVzdENvbGxlY3Rvcik7Ci0JCX0gZmluYWxseSB7Ci0JCQlwYXJlbnQuc2V0Q3Vyc29yKEN1cnNvci5nZXREZWZhdWx0Q3Vyc29yKCkpOwotCQl9Ci0JCWZMaXN0PSBuZXcgSkxpc3QobGlzdCk7Ci0JCWZMaXN0LnNldFNlbGVjdGlvbk1vZGUoTGlzdFNlbGVjdGlvbk1vZGVsLlNJTkdMRV9TRUxFQ1RJT04pOwotCQlmTGlzdC5zZXRDZWxsUmVuZGVyZXIobmV3IFRlc3RDZWxsUmVuZGVyZXIoKSk7Ci0JCWZTY3JvbGxlZExpc3Q9IG5ldyBKU2Nyb2xsUGFuZShmTGlzdCk7Ci0KLQkJZkNhbmNlbD0gbmV3IEpCdXR0b24oIkNhbmNlbCIpOwotCQlmRGVzY3JpcHRpb249IG5ldyBKTGFiZWwoIlNlbGVjdCB0aGUgVGVzdCBjbGFzczoiKTsKLQkJZk9rPSBuZXcgSkJ1dHRvbigiT0siKTsKLQkJZk9rLnNldEVuYWJsZWQoZmFsc2UpOwotCQlnZXRSb290UGFuZSgpLnNldERlZmF1bHRCdXR0b24oZk9rKTsKLQkJCi0JCWRlZmluZUxheW91dCgpOwotCQlhZGRMaXN0ZW5lcnMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJZkNhbmNlbC5hZGRBY3Rpb25MaXN0ZW5lcigKLQkJCW5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotCQkJCQlkaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCQkKLQkJZk9rLmFkZEFjdGlvbkxpc3RlbmVyKAotCQkJbmV3IEFjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0JCQkJCW9rU2VsZWN0ZWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0KLQkJZkxpc3QuYWRkTW91c2VMaXN0ZW5lcihuZXcgRG91YmxlQ2xpY2tMaXN0ZW5lcigpKTsKLQkJZkxpc3QuYWRkS2V5TGlzdGVuZXIobmV3IEtleVNlbGVjdExpc3RlbmVyKCkpOwotCQlmTGlzdC5hZGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIoCi0JCQluZXcgTGlzdFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChMaXN0U2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQljaGVja0VuYWJsZU9LKGUpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQotCQlhZGRXaW5kb3dMaXN0ZW5lcigKLQkJCW5ldyBXaW5kb3dBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZSkgewotCQkJCQlkaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGVmaW5lTGF5b3V0KCkgewotCQlnZXRDb250ZW50UGFuZSgpLnNldExheW91dChuZXcgR3JpZEJhZ0xheW91dCgpKTsKLQkJR3JpZEJhZ0NvbnN0cmFpbnRzIGxhYmVsQ29uc3RyYWludHMgPSBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKCk7Ci0JCWxhYmVsQ29uc3RyYWludHMuZ3JpZHg9IDA7IGxhYmVsQ29uc3RyYWludHMuZ3JpZHk9IDA7Ci0JCWxhYmVsQ29uc3RyYWludHMuZ3JpZHdpZHRoPSAxOyBsYWJlbENvbnN0cmFpbnRzLmdyaWRoZWlnaHQ9IDE7Ci0JCWxhYmVsQ29uc3RyYWludHMuZmlsbD0gR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEg7Ci0JCWxhYmVsQ29uc3RyYWludHMuYW5jaG9yPSBHcmlkQmFnQ29uc3RyYWludHMuV0VTVDsKLQkJbGFiZWxDb25zdHJhaW50cy53ZWlnaHR4PSAxLjA7Ci0JCWxhYmVsQ29uc3RyYWludHMud2VpZ2h0eT0gMC4wOwotCQlsYWJlbENvbnN0cmFpbnRzLmluc2V0cz0gbmV3IEluc2V0cyg4LCA4LCAwLCA4KTsKLQkJZ2V0Q29udGVudFBhbmUoKS5hZGQoZkRlc2NyaXB0aW9uLCBsYWJlbENvbnN0cmFpbnRzKTsKLQotCQlHcmlkQmFnQ29uc3RyYWludHMgbGlzdENvbnN0cmFpbnRzID0gbmV3IEdyaWRCYWdDb25zdHJhaW50cygpOwotCQlsaXN0Q29uc3RyYWludHMuZ3JpZHg9IDA7IGxpc3RDb25zdHJhaW50cy5ncmlkeT0gMTsKLQkJbGlzdENvbnN0cmFpbnRzLmdyaWR3aWR0aD0gNDsgbGlzdENvbnN0cmFpbnRzLmdyaWRoZWlnaHQ9IDE7Ci0JCWxpc3RDb25zdHJhaW50cy5maWxsPSBHcmlkQmFnQ29uc3RyYWludHMuQk9USDsKLQkJbGlzdENvbnN0cmFpbnRzLmFuY2hvcj0gR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUjsKLQkJbGlzdENvbnN0cmFpbnRzLndlaWdodHg9IDEuMDsKLQkJbGlzdENvbnN0cmFpbnRzLndlaWdodHk9IDEuMDsKLQkJbGlzdENvbnN0cmFpbnRzLmluc2V0cz0gbmV3IEluc2V0cyg4LCA4LCA4LCA4KTsKLQkJZ2V0Q29udGVudFBhbmUoKS5hZGQoZlNjcm9sbGVkTGlzdCwgbGlzdENvbnN0cmFpbnRzKTsKLQkJCi0JCUdyaWRCYWdDb25zdHJhaW50cyBva0NvbnN0cmFpbnRzPSBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKCk7Ci0JCW9rQ29uc3RyYWludHMuZ3JpZHg9IDI7IG9rQ29uc3RyYWludHMuZ3JpZHk9IDI7Ci0JCW9rQ29uc3RyYWludHMuZ3JpZHdpZHRoPSAxOyBva0NvbnN0cmFpbnRzLmdyaWRoZWlnaHQ9IDE7Ci0JCW9rQ29uc3RyYWludHMuYW5jaG9yPSBqYXZhLmF3dC5HcmlkQmFnQ29uc3RyYWludHMuRUFTVDsKLQkJb2tDb25zdHJhaW50cy5pbnNldHM9IG5ldyBJbnNldHMoMCwgOCwgOCwgOCk7Ci0JCWdldENvbnRlbnRQYW5lKCkuYWRkKGZPaywgb2tDb25zdHJhaW50cyk7Ci0KLQotCQlHcmlkQmFnQ29uc3RyYWludHMgY2FuY2VsQ29uc3RyYWludHMgPSBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKCk7Ci0JCWNhbmNlbENvbnN0cmFpbnRzLmdyaWR4PSAzOyBjYW5jZWxDb25zdHJhaW50cy5ncmlkeT0gMjsKLQkJY2FuY2VsQ29uc3RyYWludHMuZ3JpZHdpZHRoPSAxOyBjYW5jZWxDb25zdHJhaW50cy5ncmlkaGVpZ2h0PSAxOwotCQljYW5jZWxDb25zdHJhaW50cy5hbmNob3I9IGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50cy5FQVNUOwotCQljYW5jZWxDb25zdHJhaW50cy5pbnNldHM9IG5ldyBJbnNldHMoMCwgOCwgOCwgOCk7Ci0JCWdldENvbnRlbnRQYW5lKCkuYWRkKGZDYW5jZWwsIGNhbmNlbENvbnN0cmFpbnRzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2hlY2tFbmFibGVPSyhMaXN0U2VsZWN0aW9uRXZlbnQgZSkgewotCQlmT2suc2V0RW5hYmxlZChmTGlzdC5nZXRTZWxlY3RlZEluZGV4KCkgIT0gLTEpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBva1NlbGVjdGVkKCkgewotCQlmU2VsZWN0ZWRJdGVtPSAoU3RyaW5nKWZMaXN0LmdldFNlbGVjdGVkVmFsdWUoKTsKLQkJZGlzcG9zZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gZkxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkgPT0gMDsKLQl9Ci0JCi0JcHVibGljIHZvaWQga2V5U2VsZWN0VGVzdENsYXNzKGNoYXIgY2gpIHsKLQkJTGlzdE1vZGVsIG1vZGVsPSBmTGlzdC5nZXRNb2RlbCgpOwotCQlpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoY2gpKQotCQkJcmV0dXJuOwotCQlmb3IgKGludCBpPSAwOyBpIDwgbW9kZWwuZ2V0U2l6ZSgpOyBpKyspIHsKLQkJCVN0cmluZyBzPSAoU3RyaW5nKW1vZGVsLmdldEVsZW1lbnRBdChpKTsKLQkJCWlmIChUZXN0Q2VsbFJlbmRlcmVyLm1hdGNoZXNLZXkocywgQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoKSkpIHsKLQkJCQlmTGlzdC5zZXRTZWxlY3RlZEluZGV4KGkpOwotCQkJCWZMaXN0LmVuc3VyZUluZGV4SXNWaXNpYmxlKGkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCkuYmVlcCgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNlbGVjdGVkSXRlbSgpIHsKLQkJcmV0dXJuIGZTZWxlY3RlZEl0ZW07Ci0JfQotCi0JcHJpdmF0ZSBWZWN0b3IgY3JlYXRlVGVzdExpc3QoVGVzdENvbGxlY3RvciBjb2xsZWN0b3IpIHsKLSAgICAJCUVudW1lcmF0aW9uIGVhY2g9IGNvbGxlY3Rvci5jb2xsZWN0VGVzdHMoKTsKLSAgICAJCVZlY3RvciB2PSBuZXcgVmVjdG9yKDIwMCk7Ci0gICAgCQlWZWN0b3IgZGlzcGxheVZlY3Rvcj0gbmV3IFZlY3Rvcih2LnNpemUoKSk7Ci0gICAgCQl3aGlsZShlYWNoLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgCQkJU3RyaW5nIHM9IChTdHJpbmcpZWFjaC5uZXh0RWxlbWVudCgpOwotICAgIAkJCXYuYWRkRWxlbWVudChzKTsKLSAgICAJCQlkaXNwbGF5VmVjdG9yLmFkZEVsZW1lbnQoVGVzdENlbGxSZW5kZXJlci5kaXNwbGF5U3RyaW5nKHMpKTsKLSAgICAJCX0KLSAgICAJCWlmICh2LnNpemUoKSA+IDApCi0gICAgCQkJU29ydGVyLnNvcnRTdHJpbmdzKGRpc3BsYXlWZWN0b3IsIDAsIGRpc3BsYXlWZWN0b3Iuc2l6ZSgpLTEsIG5ldyBQYXJhbGxlbFN3YXBwZXIodikpOwotICAgIAkJcmV0dXJuIHY7Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgUGFyYWxsZWxTd2FwcGVyIGltcGxlbWVudHMgU29ydGVyLlN3YXBwZXIgewotCQlWZWN0b3IgZk90aGVyOwotCQkKLQkJUGFyYWxsZWxTd2FwcGVyKFZlY3RvciBvdGhlcikgewotCQkJZk90aGVyPSBvdGhlcjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzd2FwKFZlY3RvciB2YWx1ZXMsIGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKLQkJCU9iamVjdCB0bXA9IHZhbHVlcy5lbGVtZW50QXQobGVmdCk7IAotCQkJdmFsdWVzLnNldEVsZW1lbnRBdCh2YWx1ZXMuZWxlbWVudEF0KHJpZ2h0KSwgbGVmdCk7IAotCQkJdmFsdWVzLnNldEVsZW1lbnRBdCh0bXAsIHJpZ2h0KTsKLQkJCU9iamVjdCB0bXAyPSBmT3RoZXIuZWxlbWVudEF0KGxlZnQpOwotCQkJZk90aGVyLnNldEVsZW1lbnRBdChmT3RoZXIuZWxlbWVudEF0KHJpZ2h0KSwgbGVmdCk7Ci0JCQlmT3RoZXIuc2V0RWxlbWVudEF0KHRtcDIsIHJpZ2h0KTsKLQkJfQkJCQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3N3aW5ndWkvVGVzdFN1aXRlUGFuZWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvc3dpbmd1aS9UZXN0U3VpdGVQYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODE4YmMzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvc3dpbmd1aS9UZXN0U3VpdGVQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLXBhY2thZ2UganVuaXQuc3dpbmd1aTsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS5hd3QuKjsKLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuKjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnJ1bm5lci4qOwotCi0vKioKLSAqIEEgUGFuZWwgc2hvd2luZyBhIHRlc3Qgc3VpdGUgYXMgYSB0cmVlLiAKLSAqLwotY2xhc3MgVGVzdFN1aXRlUGFuZWwgZXh0ZW5kcyBKUGFuZWwgaW1wbGVtZW50cyBUZXN0TGlzdGVuZXIgewotCXByaXZhdGUgSlRyZWUgZlRyZWU7Ci0JcHJpdmF0ZSBKU2Nyb2xsUGFuZSBmU2Nyb2xsVHJlZTsKLQlwcml2YXRlIFRlc3RUcmVlTW9kZWwgZk1vZGVsOwotCi0Jc3RhdGljIGNsYXNzIFRlc3RUcmVlQ2VsbFJlbmRlcmVyIGV4dGVuZHMgRGVmYXVsdFRyZWVDZWxsUmVuZGVyZXIgewotCQlwcml2YXRlIEljb24gZkVycm9ySWNvbjsKLQkJcHJpdmF0ZSBJY29uIGZPa0ljb247Ci0JCXByaXZhdGUgSWNvbiBmRmFpbHVyZUljb247Ci0JCQotCQlUZXN0VHJlZUNlbGxSZW5kZXJlcigpIHsKLQkgICAgCQlzdXBlcigpOwotCSAgICAJCWxvYWRJY29ucygpOwotCQl9Ci0JCQotCQl2b2lkIGxvYWRJY29ucygpIHsKLQkJCWZFcnJvckljb249IFRlc3RSdW5uZXIuZ2V0SWNvblJlc291cmNlKGdldENsYXNzKCksICJpY29ucy9lcnJvci5naWYiKTsKLQkgICAgCQlmT2tJY29uPSBUZXN0UnVubmVyLmdldEljb25SZXNvdXJjZShnZXRDbGFzcygpLCAiaWNvbnMvb2suZ2lmIik7Ci0JICAgIAkJZkZhaWx1cmVJY29uPSBUZXN0UnVubmVyLmdldEljb25SZXNvdXJjZShnZXRDbGFzcygpLCAiaWNvbnMvZmFpbHVyZS5naWYiKTsKLQkJfQotCQkKLQkJU3RyaW5nIHN0cmlwUGFyZW50aGVzaXMoT2JqZWN0IG8pIHsKLQkJCVN0cmluZyB0ZXh0PSBvLnRvU3RyaW5nICgpOwotICAgIAkJCWludCBwb3M9IHRleHQuaW5kZXhPZignKCcpOwotICAgIAkJCWlmIChwb3MgPCAxKQotICAgIAkJCQlyZXR1cm4gdGV4dDsKLSAgICAJCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcgKDAsIHBvcyk7Ci0gIAkJfQotCi0JCXB1YmxpYyBDb21wb25lbnQgZ2V0VHJlZUNlbGxSZW5kZXJlckNvbXBvbmVudChKVHJlZSB0cmVlLCBPYmplY3QgdmFsdWUsCi0JCQkJYm9vbGVhbiBzZWwsIGJvb2xlYW4gZXhwYW5kZWQsIGJvb2xlYW4gbGVhZiwgaW50IHJvdywgYm9vbGVhbiBoYXNGb2N1cykgewotCQkJCi0JCQlDb21wb25lbnQgYz0gc3VwZXIuZ2V0VHJlZUNlbGxSZW5kZXJlckNvbXBvbmVudCh0cmVlLCB2YWx1ZSwgc2VsLCBleHBhbmRlZCwgbGVhZiwgcm93LCBoYXNGb2N1cyk7Ci0JICAJCVRyZWVNb2RlbCBtb2RlbD0gdHJlZS5nZXRNb2RlbCgpOwotCSAgCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBUZXN0VHJlZU1vZGVsKSB7CQotCQkJCVRlc3RUcmVlTW9kZWwgdGVzdE1vZGVsPSAoVGVzdFRyZWVNb2RlbCltb2RlbDsKLQkJCQlUZXN0IHQ9IChUZXN0KXZhbHVlOwotCQkJCVN0cmluZyBzPSAiIjsKLQkgICAgCQlpZiAodGVzdE1vZGVsLmlzRmFpbHVyZSh0KSkgewotCSAgICAJCQlpZiAoZkZhaWx1cmVJY29uICE9IG51bGwpCi0JICAgIAkJCQlzZXRJY29uKGZGYWlsdXJlSWNvbik7Ci0JICAgIAkJCXM9ICIgLSBGYWlsZWQiOwotCSAgICAJCX0KLQkgICAgCQllbHNlIGlmICh0ZXN0TW9kZWwuaXNFcnJvcih0KSkgewotCSAgICAJCQlpZiAoZkVycm9ySWNvbiAhPSBudWxsKQotCSAgICAJCQkJc2V0SWNvbihmRXJyb3JJY29uKTsKLQkgICAgCQkJcz0gIiAtIEVycm9yIjsKLQkgICAgCQl9Ci0JICAgIAkJZWxzZSBpZiAodGVzdE1vZGVsLndhc1J1bih0KSkgewotCSAgICAJCQlpZiAoZk9rSWNvbiAhPSBudWxsKQotCSAgICAJCQkJc2V0SWNvbihmT2tJY29uKTsKLQkgICAgCQkJcz0gIiAtIFBhc3NlZCI7Ci0JICAgIAkJfQotCSAgICAJCWlmIChjIGluc3RhbmNlb2YgSkNvbXBvbmVudCkKLQkgICAgCQkJKChKQ29tcG9uZW50KWMpLnNldFRvb2xUaXBUZXh0KGdldFRleHQoKStzKTsKLQkgIAkJfQotCSAgCQlzZXRUZXh0KHN0cmlwUGFyZW50aGVzaXModmFsdWUpKTsKLQkJCXJldHVybiBjOwotCQl9Ci0JfQotCQotCXB1YmxpYyBUZXN0U3VpdGVQYW5lbCgpIHsKLQkJc3VwZXIobmV3IEJvcmRlckxheW91dCgpKTsKLQkJc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKDMwMCwgMTAwKSk7Ci0JCWZUcmVlPSBuZXcgSlRyZWUoKTsKLQkJZlRyZWUuc2V0TW9kZWwobnVsbCk7Ci0JCWZUcmVlLnNldFJvd0hlaWdodCgyMCk7Ci0JCVRvb2xUaXBNYW5hZ2VyLnNoYXJlZEluc3RhbmNlKCkucmVnaXN0ZXJDb21wb25lbnQoZlRyZWUpOwkKLQkJZlRyZWUucHV0Q2xpZW50UHJvcGVydHkoIkpUcmVlLmxpbmVTdHlsZSIsICJBbmdsZWQiKTsKLQkJZlNjcm9sbFRyZWU9IG5ldyBKU2Nyb2xsUGFuZShmVHJlZSk7Ci0JCWFkZChmU2Nyb2xsVHJlZSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCBhZGRFcnJvcihmaW5hbCBUZXN0IHRlc3QsIGZpbmFsIFRocm93YWJsZSB0KSB7Ci0gCQlmTW9kZWwuYWRkRXJyb3IodGVzdCk7Ci0JCWZpcmVUZXN0Q2hhbmdlZCh0ZXN0LCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkRmFpbHVyZShmaW5hbCBUZXN0IHRlc3QsIGZpbmFsIEFzc2VydGlvbkZhaWxlZEVycm9yIHQpIHsKLSAJCWZNb2RlbC5hZGRGYWlsdXJlKHRlc3QpOwotCQlmaXJlVGVzdENoYW5nZWQodGVzdCwgdHJ1ZSk7Ci0JfQotCQotCS8qKgotIAkgKiBBIHRlc3QgZW5kZWQuCi0gCSAqLwotIAlwdWJsaWMgdm9pZCBlbmRUZXN0KFRlc3QgdGVzdCkgewotCQlmTW9kZWwuYWRkUnVuVGVzdCh0ZXN0KTsKLQkgCWZpcmVUZXN0Q2hhbmdlZCh0ZXN0LCBmYWxzZSk7Ci0gCX0KLQotCS8qKgotIAkgKiBBIHRlc3Qgc3RhcnRlZC4KLSAJICovCi0gCXB1YmxpYyB2b2lkIHN0YXJ0VGVzdChUZXN0IHRlc3QpIHsKLSAJfSAJICAKLSAJCQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCB0ZXN0IG9yIG51bGwgaWYgbXVsdGlwbGUgb3Igbm9uZSBpcyBzZWxlY3RlZAotCSAqLwotCXB1YmxpYyBUZXN0IGdldFNlbGVjdGVkVGVzdCgpIHsKLQkJVHJlZVBhdGhbXSBwYXRocz0gZlRyZWUuZ2V0U2VsZWN0aW9uUGF0aHMoKTsKLQkJaWYgKHBhdGhzICE9IG51bGwgJiYgcGF0aHMubGVuZ3RoID09IDEpCi0JCQlyZXR1cm4gKFRlc3QpcGF0aHNbMF0uZ2V0TGFzdFBhdGhDb21wb25lbnQoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVHJlZQotCSAqLwotCXB1YmxpYyBKVHJlZSBnZXRUcmVlKCkgewotCQlyZXR1cm4gZlRyZWU7Ci0JfQotCi0JLyoqCi0JICogU2hvd3MgdGhlIHRlc3QgaGllcmFyY2h5IHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiB0ZXN0Ci0JICovCi0JcHVibGljIHZvaWQgc2hvd1Rlc3RUcmVlKFRlc3Qgcm9vdCkgewotCQlmTW9kZWw9IG5ldyBUZXN0VHJlZU1vZGVsKHJvb3QpOwotCQlmVHJlZS5zZXRNb2RlbChmTW9kZWwpOwotCQlmVHJlZS5zZXRDZWxsUmVuZGVyZXIobmV3IFRlc3RUcmVlQ2VsbFJlbmRlcmVyKCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZmlyZVRlc3RDaGFuZ2VkKGZpbmFsIFRlc3QgdGVzdCwgZmluYWwgYm9vbGVhbiBleHBhbmQpIHsKLQkJU3dpbmdVdGlsaXRpZXMuaW52b2tlTGF0ZXIoCi0JCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlWZWN0b3IgdnBhdGg9IG5ldyBWZWN0b3IoKTsKLQkJCQkJaW50IGluZGV4PSBmTW9kZWwuZmluZFRlc3QodGVzdCwgKFRlc3QpZk1vZGVsLmdldFJvb3QoKSwgdnBhdGgpOwotCQkJCQlpZiAoaW5kZXggPj0gMCkgewotCQkJCQkJT2JqZWN0W10gcGF0aD0gbmV3IE9iamVjdFt2cGF0aC5zaXplKCldOwotCQkJCQkJdnBhdGguY29weUludG8ocGF0aCk7Ci0JCQkJCQlUcmVlUGF0aCB0cmVlUGF0aD0gbmV3IFRyZWVQYXRoKHBhdGgpOwotCQkJCQkJZk1vZGVsLmZpcmVOb2RlQ2hhbmdlZCh0cmVlUGF0aCwgaW5kZXgpOwotCQkJCQkJaWYgKGV4cGFuZCkgewotCQkJCQkJCU9iamVjdFtdIGZ1bGxQYXRoPSBuZXcgT2JqZWN0W3ZwYXRoLnNpemUoKSsxXTsKLQkJCQkJCQl2cGF0aC5jb3B5SW50byhmdWxsUGF0aCk7Ci0JCQkJCQkJZnVsbFBhdGhbdnBhdGguc2l6ZSgpXT0gZk1vZGVsLmdldENoaWxkKHRyZWVQYXRoLmdldExhc3RQYXRoQ29tcG9uZW50KCksIGluZGV4KTs7Ci0JCQkJCQkJVHJlZVBhdGggZnVsbFRyZWVQYXRoPSBuZXcgVHJlZVBhdGgoZnVsbFBhdGgpOwotCQkJCQkJCWZUcmVlLnNjcm9sbFBhdGhUb1Zpc2libGUoZnVsbFRyZWVQYXRoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9zd2luZ3VpL1Rlc3RUcmVlTW9kZWwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvanVuaXQvc3dpbmd1aS9UZXN0VHJlZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYzg1MDQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC9zd2luZ3VpL1Rlc3RUcmVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi1wYWNrYWdlIGp1bml0LnN3aW5ndWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC4qOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuKjsKLQotaW1wb3J0IGp1bml0LmV4dGVuc2lvbnMuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBBIHRyZWUgbW9kZWwgZm9yIGEgVGVzdC4KLSAqLwotY2xhc3MgVGVzdFRyZWVNb2RlbCBpbXBsZW1lbnRzIFRyZWVNb2RlbCB7Ci0JcHJpdmF0ZSBUZXN0IGZSb290OwotCXByaXZhdGUgVmVjdG9yIGZNb2RlbExpc3RlbmVycz0gbmV3IFZlY3RvcigpOwotCXByaXZhdGUgSGFzaHRhYmxlIGZGYWlsdXJlcz0gbmV3IEhhc2h0YWJsZSgpOwotCXByaXZhdGUgSGFzaHRhYmxlIGZFcnJvcnM9IG5ldyBIYXNodGFibGUoKTsKLQlwcml2YXRlIEhhc2h0YWJsZSBmUnVuVGVzdHM9IG5ldyBIYXNodGFibGUoKTsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgdHJlZSBtb2RlbCB3aXRoIHRoZSBnaXZlbiB0ZXN0IGFzIGl0cyByb290LgotCSAqLwotCXB1YmxpYyBUZXN0VHJlZU1vZGVsKFRlc3Qgcm9vdCkgewotCQlzdXBlcigpOwotCQlmUm9vdD0gcm9vdDsKLQl9Ci0JCi0JLyoqCi0JICogYWRkcyBhIFRyZWVNb2RlbExpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkVHJlZU1vZGVsTGlzdGVuZXIoVHJlZU1vZGVsTGlzdGVuZXIgbCkgewotCQlpZiAoIWZNb2RlbExpc3RlbmVycy5jb250YWlucyhsKSkKLQkJCWZNb2RlbExpc3RlbmVycy5hZGRFbGVtZW50KGwpOwotCX0KLQkvKioKLQkgKiBSZW1vdmVzIGEgVGVzdE1vZGVsTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVUcmVlTW9kZWxMaXN0ZW5lcihUcmVlTW9kZWxMaXN0ZW5lciBsKSB7Ci0JCWZNb2RlbExpc3RlbmVycy5yZW1vdmVFbGVtZW50KGwpOwotCX0KLQkvKioKLQkgKiBGaW5kcyB0aGUgcGF0aCB0byBhIHRlc3QuIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSB0ZXN0IGluIGl0cwotCSAqIHBhcmVudCB0ZXN0IHN1aXRlLgotCSAqLwotCXB1YmxpYyBpbnQgZmluZFRlc3QoVGVzdCB0YXJnZXQsIFRlc3Qgbm9kZSwgVmVjdG9yIHBhdGgpIHsKLQkJaWYgKHRhcmdldC5lcXVhbHMobm9kZSkpIAotCQkJcmV0dXJuIDA7Ci0JCQkKLQkJVGVzdFN1aXRlIHN1aXRlPSBpc1Rlc3RTdWl0ZShub2RlKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGdldENoaWxkQ291bnQobm9kZSk7IGkrKykgewotCQkJVGVzdCB0PSBzdWl0ZS50ZXN0QXQoaSk7IAotCQkJaW50IGluZGV4PSBmaW5kVGVzdCh0YXJnZXQsIHQsIHBhdGgpOwotCQkJaWYgKGluZGV4ID49IDApIHsKLQkJCQlwYXRoLmluc2VydEVsZW1lbnRBdChub2RlLCAwKTsKLQkJCQlpZiAocGF0aC5zaXplKCkgPT0gMSkKLQkJCQkJcmV0dXJuIGk7Ci0JCQkJcmV0dXJuIGluZGV4OwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0JLyoqCi0JICogRmlyZXMgYSBub2RlIGNoYW5nZWQgZXZlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTm9kZUNoYW5nZWQoVHJlZVBhdGggcGF0aCwgaW50IGluZGV4KSB7Ci0JCWludFtdIGluZGljZXM9IHtpbmRleH07Ci0JCU9iamVjdFtdIGNoYW5nZWRDaGlsZHJlbj0ge2dldENoaWxkKHBhdGguZ2V0TGFzdFBhdGhDb21wb25lbnQoKSwgaW5kZXgpfTsKLQkJVHJlZU1vZGVsRXZlbnQgZXZlbnQ9IG5ldyBUcmVlTW9kZWxFdmVudCh0aGlzLCBwYXRoLCBpbmRpY2VzLCBjaGFuZ2VkQ2hpbGRyZW4pOwotCQkKLQkJRW51bWVyYXRpb24gZT0gZk1vZGVsTGlzdGVuZXJzLmVsZW1lbnRzKCk7Ci0JCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7IAotCQkJVHJlZU1vZGVsTGlzdGVuZXIgbD0gKFRyZWVNb2RlbExpc3RlbmVyKSBlLm5leHRFbGVtZW50KCk7Ci0JCQlsLnRyZWVOb2Rlc0NoYW5nZWQoZXZlbnQpOwotCQl9CQotCX0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXN0IGF0IHRoZSBnaXZlbiBpbmRleAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q2hpbGQoT2JqZWN0IHBhcmVudCwgaW50IGluZGV4KSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZT0gaXNUZXN0U3VpdGUocGFyZW50KTsKLQkJaWYgKHN1aXRlICE9IG51bGwpIAotCQkJcmV0dXJuIHN1aXRlLnRlc3RBdChpbmRleCk7Ci0JCXJldHVybiBudWxsOyAKLQl9Ci0JLyoqCi0JICogR2V0cyB0aGUgbnVtYmVyIG9mIHRlc3RzLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRDb3VudChPYmplY3QgcGFyZW50KSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZT0gaXNUZXN0U3VpdGUocGFyZW50KTsKLQkJaWYgKHN1aXRlICE9IG51bGwpIAotCQkJcmV0dXJuIHN1aXRlLnRlc3RDb3VudCgpOwotCQlyZXR1cm4gMDsKLQl9Ci0JLyoqCi0JICogR2V0cyB0aGUgaW5kZXggb2YgYSB0ZXN0IGluIGEgdGVzdCBzdWl0ZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW5kZXhPZkNoaWxkKE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCkgewotCQlUZXN0U3VpdGUgc3VpdGU9IGlzVGVzdFN1aXRlKHBhcmVudCk7Ci0JCWlmIChzdWl0ZSAhPSBudWxsKSB7Ci0JCQlpbnQgaT0gMDsKLQkJCWZvciAoRW51bWVyYXRpb24gZT0gc3VpdGUudGVzdHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTsgaSsrKSB7Ci0JCQkJaWYgKGNoaWxkLmVxdWFscygoVGVzdCllLm5leHRFbGVtZW50KCkpKQotCQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7IAotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByb290IG9mIHRoZSB0cmVlCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSb290KCkgewotCQlyZXR1cm4gZlJvb3Q7Ci0JfQotCS8qKgotCSAqIFRlc3RzIGlmIHRoZSB0ZXN0IGlzIGEgbGVhZi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xlYWYoT2JqZWN0IG5vZGUpIHsKLQkJcmV0dXJuIGlzVGVzdFN1aXRlKG5vZGUpID09IG51bGw7Ci0JfQotCS8qKgotCSAqIFRlc3RzIGlmIHRoZSBub2RlIGlzIGEgVGVzdFN1aXRlLgotCSAqLwotCVRlc3RTdWl0ZSBpc1Rlc3RTdWl0ZShPYmplY3Qgbm9kZSkgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIFRlc3RTdWl0ZSkgCi0JCQlyZXR1cm4gKFRlc3RTdWl0ZSlub2RlOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIFRlc3REZWNvcmF0b3IpIHsgCi0JCQlUZXN0IGJhc2VUZXN0PSAoKFRlc3REZWNvcmF0b3Ipbm9kZSkuZ2V0VGVzdCgpOyAKLQkJCXJldHVybiBpc1Rlc3RTdWl0ZShiYXNlVGVzdCk7IAotCQl9IAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIHZhbHVlIG9mIHRoZSBtb2RlbCBvYmplY3Qgd2FzIGNoYW5nZWQgaW4gdGhlIHZpZXcKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWx1ZUZvclBhdGhDaGFuZ2VkKFRyZWVQYXRoIHBhdGgsIE9iamVjdCBuZXdWYWx1ZSkgewotCQkvLyB3ZSBkb24ndCBzdXBwb3J0IGRpcmVjdCBlZGl0aW5nIG9mIHRoZSBtb2RlbAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRyZWVNb2RlbC52YWx1ZUZvclBhdGhDaGFuZ2VkOiBub3QgaW1wbGVtZW50ZWQiKTsKLQl9Ci0JLyoqCi0JICogUmVtZW1iZXJzIGEgdGVzdCBmYWlsdXJlCi0JICovCi0Jdm9pZCBhZGRGYWlsdXJlKFRlc3QgdCkgewotCQlmRmFpbHVyZXMucHV0KHQsIHQpOwotCX0KLQkvKioKLQkgKiBSZW1lbWJlcnMgYSB0ZXN0IGVycm9yCi0JICovCi0Jdm9pZCBhZGRFcnJvcihUZXN0IHQpIHsKLQkJZkVycm9ycy5wdXQodCwgdCk7Ci0JfQotCS8qKgotCSAqIFJlbWVtYmVycyB0aGF0IGEgdGVzdCB3YXMgcnVuCi0JICovCi0Jdm9pZCBhZGRSdW5UZXN0KFRlc3QgdCkgewotCQlmUnVuVGVzdHMucHV0KHQsIHQpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgYSB0ZXN0IHdhcyBydW4KLQkgKi8KLQlib29sZWFuIHdhc1J1bihUZXN0IHQpIHsKLQkJcmV0dXJuIGZSdW5UZXN0cy5nZXQodCkgIT0gbnVsbDsKLQl9Ci0JLyoqCi0JICogVGVzdHMgd2hldGhlciBhIHRlc3Qgd2FzIGFuIGVycm9yCi0JICovCi0JYm9vbGVhbiBpc0Vycm9yKFRlc3QgdCkgewotCQlyZXR1cm4gKGZFcnJvcnMgIT0gbnVsbCkgJiYgZkVycm9ycy5nZXQodCkgIT0gbnVsbDsKLQl9Ci0JLyoqCi0JICogVGVzdHMgd2hldGhlciBhIHRlc3Qgd2FzIGEgZmFpbHVyZQotCSAqLwotCWJvb2xlYW4gaXNGYWlsdXJlKFRlc3QgdCkgewotCQlyZXR1cm4gKGZGYWlsdXJlcyAhPSBudWxsKSAmJiBmRmFpbHVyZXMuZ2V0KHQpICE9IG51bGw7Ci0JfQotCS8qKgotCSAqIFJlc2V0cyB0aGUgdGVzdCByZXN1bHRzCi0JICovCi0Jdm9pZCByZXNldFJlc3VsdHMoKSB7Ci0JCWZGYWlsdXJlcz0gbmV3IEhhc2h0YWJsZSgpOwotCQlmUnVuVGVzdHM9IG5ldyBIYXNodGFibGUoKTsKLQkJZkVycm9ycz0gbmV3IEhhc2h0YWJsZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3RleHR1aS9UZXN0UnVubmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3RleHR1aS9UZXN0UnVubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZTk1OTcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC90ZXh0dWkvVGVzdFJ1bm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLXBhY2thZ2UganVuaXQudGV4dHVpOwotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotaW1wb3J0IGphdmEudGV4dC5OdW1iZXJGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnJ1bm5lci4qOwotCi0vKioKLSAqIEEgY29tbWFuZCBsaW5lIGJhc2VkIHRvb2wgdG8gcnVuIHRlc3RzLgotICogPHByZT4KLSAqIGphdmEganVuaXQudGV4dHVpLlRlc3RSdW5uZXIgWy13YWl0XSBUZXN0Q2FzZUNsYXNzCi0gKiA8L3ByZT4KLSAqIFRlc3RSdW5uZXIgZXhwZWN0cyB0aGUgbmFtZSBvZiBhIFRlc3RDYXNlIGNsYXNzIGFzIGFyZ3VtZW50LgotICogSWYgdGhpcyBjbGFzcyBkZWZpbmVzIGEgc3RhdGljIDxjb2RlPnN1aXRlPC9jb2RlPiBtZXRob2QgaXQgCi0gKiB3aWxsIGJlIGludm9rZWQgYW5kIHRoZSByZXR1cm5lZCB0ZXN0IGlzIHJ1bi4gT3RoZXJ3aXNlIGFsbCAKLSAqIHRoZSBtZXRob2RzIHN0YXJ0aW5nIHdpdGggInRlc3QiIGhhdmluZyBubyBhcmd1bWVudHMgYXJlIHJ1bi4KLSAqIDxwPgotICogV2hlbiB0aGUgd2FpdCBjb21tYW5kIGxpbmUgYXJndW1lbnQgaXMgZ2l2ZW4gVGVzdFJ1bm5lcgotICogd2FpdHMgdW50aWwgdGhlIHVzZXJzIHR5cGVzIFJFVFVSTi4KLSAqIDxwPgotICogVGVzdFJ1bm5lciBwcmludHMgYSB0cmFjZSBhcyB0aGUgdGVzdHMgYXJlIGV4ZWN1dGVkIGZvbGxvd2VkIGJ5IGEKLSAqIHN1bW1hcnkgYXQgdGhlIGVuZC4gCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0UnVubmVyIGV4dGVuZHMgQmFzZVRlc3RSdW5uZXIgewotCVByaW50U3RyZWFtIGZXcml0ZXI9IFN5c3RlbS5vdXQ7Ci0JaW50IGZDb2x1bW49IDA7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgVGVzdFJ1bm5lci4KLQkgKi8KLQlwdWJsaWMgVGVzdFJ1bm5lcigpIHsKLQl9Ci0JLyoqCi0JICogQ29uc3RydWN0cyBhIFRlc3RSdW5uZXIgdXNpbmcgdGhlIGdpdmVuIHN0cmVhbSBmb3IgYWxsIHRoZSBvdXRwdXQKLQkgKi8KLQlwdWJsaWMgVGVzdFJ1bm5lcihQcmludFN0cmVhbSB3cml0ZXIpIHsKLQkJdGhpcygpOwotCQlpZiAod3JpdGVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJXcml0ZXIgY2FuJ3QgYmUgbnVsbCIpOwotCQlmV3JpdGVyPSB3cml0ZXI7Ci0JfQotCQotCS8qKgotCSAqIEFsd2F5cyB1c2UgdGhlIFN0YW5kYXJkVGVzdFN1aXRlTG9hZGVyLiBPdmVycmlkZGVuIGZyb20KLQkgKiBCYXNlVGVzdFJ1bm5lci4KLQkgKi8KLQlwdWJsaWMgVGVzdFN1aXRlTG9hZGVyIGdldExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBTdGFuZGFyZFRlc3RTdWl0ZUxvYWRlcigpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRFcnJvcihUZXN0IHRlc3QsIFRocm93YWJsZSB0KSB7Ci0JCXdyaXRlcigpLnByaW50KCJFIik7Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRGYWlsdXJlKFRlc3QgdGVzdCwgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgdCkgewotCQl3cml0ZXIoKS5wcmludCgiRiIpOwotCX0KLQkJCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRlc3RSZXN1bHQgdG8gYmUgdXNlZCBmb3IgdGhlIHRlc3QgcnVuLgotCSAqLwotCXByb3RlY3RlZCBUZXN0UmVzdWx0IGNyZWF0ZVRlc3RSZXN1bHQoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFJlc3VsdCgpOwotCX0KLQkKLQlwdWJsaWMgVGVzdFJlc3VsdCBkb1J1bihUZXN0IHN1aXRlLCBib29sZWFuIHdhaXQpIHsKLQkJVGVzdFJlc3VsdCByZXN1bHQ9IGNyZWF0ZVRlc3RSZXN1bHQoKTsKLQkJcmVzdWx0LmFkZExpc3RlbmVyKHRoaXMpOwotCQlsb25nIHN0YXJ0VGltZT0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCXN1aXRlLnJ1bihyZXN1bHQpOwotCQlsb25nIGVuZFRpbWU9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlsb25nIHJ1blRpbWU9IGVuZFRpbWUtc3RhcnRUaW1lOwotCQl3cml0ZXIoKS5wcmludGxuKCk7Ci0JCXdyaXRlcigpLnByaW50bG4oIlRpbWU6ICIrZWxhcHNlZFRpbWVBc1N0cmluZyhydW5UaW1lKSk7Ci0JCXByaW50KHJlc3VsdCk7Ci0KLQkJd3JpdGVyKCkucHJpbnRsbigpOwotCi0JCXBhdXNlKHdhaXQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBhdXNlKGJvb2xlYW4gd2FpdCkgewotCQlpZiAod2FpdCkgewotCQkJd3JpdGVyKCkucHJpbnRsbigiPFJFVFVSTj4gdG8gY29udGludWUiKTsKLQkJCXRyeSB7Ci0JCQkJU3lzdGVtLmluLnJlYWQoKTsKLQkJCX0KLQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0VGVzdChUZXN0IHRlc3QpIHsKLQkJd3JpdGVyKCkucHJpbnQoIi4iKTsKLQkJaWYgKGZDb2x1bW4rKyA+PSA0MCkgewotCQkJd3JpdGVyKCkucHJpbnRsbigpOwotCQkJZkNvbHVtbj0gMDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGVuZFRlc3QoVGVzdCB0ZXN0KSB7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKLQkJVGVzdFJ1bm5lciBhVGVzdFJ1bm5lcj0gbmV3IFRlc3RSdW5uZXIoKTsKLQkJdHJ5IHsKLQkJCVRlc3RSZXN1bHQgcj0gYVRlc3RSdW5uZXIuc3RhcnQoYXJncyk7Ci0JCQlpZiAoIXIud2FzU3VjY2Vzc2Z1bCgpKSAKLQkJCQlTeXN0ZW0uZXhpdCgtMSk7Ci0JCQlTeXN0ZW0uZXhpdCgwKTsKLQkJfSBjYXRjaChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCVN5c3RlbS5leGl0KC0yKTsKLQkJfQotCX0KLQkvKioKLQkgKiBQcmludHMgZmFpbHVyZXMgdG8gdGhlIHN0YW5kYXJkIG91dHB1dAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBwcmludChUZXN0UmVzdWx0IHJlc3VsdCkgewotCSAgICBwcmludEVycm9ycyhyZXN1bHQpOwotCSAgICBwcmludEZhaWx1cmVzKHJlc3VsdCk7Ci0JICAgIHByaW50SGVhZGVyKHJlc3VsdCk7Ci0JfQotCS8qKgotCSAqIFByaW50cyB0aGUgZXJyb3JzIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludEVycm9ycyhUZXN0UmVzdWx0IHJlc3VsdCkgewotCSAgICBpZiAocmVzdWx0LmVycm9yQ291bnQoKSAhPSAwKSB7Ci0JICAgICAgICBpZiAocmVzdWx0LmVycm9yQ291bnQoKSA9PSAxKQotCQkgICAgICAgIHdyaXRlcigpLnByaW50bG4oIlRoZXJlIHdhcyAiK3Jlc3VsdC5lcnJvckNvdW50KCkrIiBlcnJvcjoiKTsKLQkgICAgICAgIGVsc2UKLQkJICAgICAgICB3cml0ZXIoKS5wcmludGxuKCJUaGVyZSB3ZXJlICIrcmVzdWx0LmVycm9yQ291bnQoKSsiIGVycm9yczoiKTsKLQotCQkJaW50IGk9IDE7Ci0JCQlmb3IgKEVudW1lcmF0aW9uIGU9IHJlc3VsdC5lcnJvcnMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTsgaSsrKSB7Ci0JCQkgICAgVGVzdEZhaWx1cmUgZmFpbHVyZT0gKFRlc3RGYWlsdXJlKWUubmV4dEVsZW1lbnQoKTsKLQkJCQl3cml0ZXIoKS5wcmludGxuKGkrIikgIitmYWlsdXJlLmZhaWxlZFRlc3QoKSk7Ci0JCQkJd3JpdGVyKCkucHJpbnQoZ2V0RmlsdGVyZWRUcmFjZShmYWlsdXJlLnRocm93bkV4Y2VwdGlvbigpKSk7Ci0JCSAgICB9Ci0JCX0KLQl9Ci0JLyoqCi0JICogUHJpbnRzIGZhaWx1cmVzIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludEZhaWx1cmVzKFRlc3RSZXN1bHQgcmVzdWx0KSB7Ci0JCWlmIChyZXN1bHQuZmFpbHVyZUNvdW50KCkgIT0gMCkgewotCQkJaWYgKHJlc3VsdC5mYWlsdXJlQ291bnQoKSA9PSAxKQotCQkJCXdyaXRlcigpLnByaW50bG4oIlRoZXJlIHdhcyAiICsgcmVzdWx0LmZhaWx1cmVDb3VudCgpICsgIiBmYWlsdXJlOiIpOwotCQkJZWxzZQotCQkJCXdyaXRlcigpLnByaW50bG4oIlRoZXJlIHdlcmUgIiArIHJlc3VsdC5mYWlsdXJlQ291bnQoKSArICIgZmFpbHVyZXM6Iik7Ci0JCQlpbnQgaSA9IDE7Ci0JCQlmb3IgKEVudW1lcmF0aW9uIGU9IHJlc3VsdC5mYWlsdXJlcygpOyBlLmhhc01vcmVFbGVtZW50cygpOyBpKyspIHsKLQkJCQlUZXN0RmFpbHVyZSBmYWlsdXJlPSAoVGVzdEZhaWx1cmUpIGUubmV4dEVsZW1lbnQoKTsKLQkJCQl3cml0ZXIoKS5wcmludChpICsgIikgIiArIGZhaWx1cmUuZmFpbGVkVGVzdCgpKTsKLQkJCQlUaHJvd2FibGUgdD0gZmFpbHVyZS50aHJvd25FeGNlcHRpb24oKTsKLQkJCQl3cml0ZXIoKS5wcmludChnZXRGaWx0ZXJlZFRyYWNlKGZhaWx1cmUudGhyb3duRXhjZXB0aW9uKCkpKTsKLQkJCX0KLQkJfQotCX0KLQkvKioKLQkgKiBQcmludHMgdGhlIGhlYWRlciBvZiB0aGUgcmVwb3J0Ci0JICovCi0JcHVibGljIHZvaWQgcHJpbnRIZWFkZXIoVGVzdFJlc3VsdCByZXN1bHQpIHsKLQkJaWYgKHJlc3VsdC53YXNTdWNjZXNzZnVsKCkpIHsKLQkJCXdyaXRlcigpLnByaW50bG4oKTsKLQkJCXdyaXRlcigpLnByaW50KCJPSyIpOwotCQkJd3JpdGVyKCkucHJpbnRsbiAoIiAoIiArIHJlc3VsdC5ydW5Db3VudCgpICsgIiB0ZXN0cykiKTsKLQotCQl9IGVsc2UgewotCQkJd3JpdGVyKCkucHJpbnRsbigpOwotCQkJd3JpdGVyKCkucHJpbnRsbigiRkFJTFVSRVMhISEiKTsKLQkJCXdyaXRlcigpLnByaW50bG4oIlRlc3RzIHJ1bjogIityZXN1bHQucnVuQ291bnQoKSsgCi0JCQkJICAgICAgICAgIiwgIEZhaWx1cmVzOiAiK3Jlc3VsdC5mYWlsdXJlQ291bnQoKSsKLQkJCQkgICAgICAgICAiLCAgRXJyb3JzOiAiK3Jlc3VsdC5lcnJvckNvdW50KCkpOwotCQl9Ci0JfQotCS8qKgotCSAqIFJ1bnMgYSBzdWl0ZSBleHRyYWN0ZWQgZnJvbSBhIFRlc3RDYXNlIHN1YmNsYXNzLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgdm9pZCBydW4oQ2xhc3MgdGVzdENsYXNzKSB7Ci0JCXJ1bihuZXcgVGVzdFN1aXRlKHRlc3RDbGFzcykpOwotCX0KLQkvKioKLQkgKiBSdW5zIGEgc2luZ2xlIHRlc3QgYW5kIGNvbGxlY3RzIGl0cyByZXN1bHRzLgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHN0YXJ0IGEgdGVzdCBydW4KLQkgKiBmcm9tIHlvdXIgcHJvZ3JhbS4KLQkgKiA8cHJlPgotCSAqIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB7Ci0JICogICAgIHRlc3QudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotCSAqIH0KLQkgKiA8L3ByZT4KLQkgKi8KLQlzdGF0aWMgcHVibGljIHZvaWQgcnVuKFRlc3Qgc3VpdGUpIHsKLQkJVGVzdFJ1bm5lciBhVGVzdFJ1bm5lcj0gbmV3IFRlc3RSdW5uZXIoKTsKLQkJYVRlc3RSdW5uZXIuZG9SdW4oc3VpdGUsIGZhbHNlKTsKLQl9Ci0JLyoqCi0JICogUnVucyBhIHNpbmdsZSB0ZXN0IGFuZCB3YWl0cyB1bnRpbCB0aGUgdXNlcgotCSAqIHR5cGVzIFJFVFVSTi4KLQkgKi8KLQlzdGF0aWMgcHVibGljIHZvaWQgcnVuQW5kV2FpdChUZXN0IHN1aXRlKSB7Ci0JCVRlc3RSdW5uZXIgYVRlc3RSdW5uZXI9IG5ldyBUZXN0UnVubmVyKCk7Ci0JCWFUZXN0UnVubmVyLmRvUnVuKHN1aXRlLCB0cnVlKTsKLQl9Ci0JLyoqCi0JICogU3RhcnRzIGEgdGVzdCBydW4uIEFuYWx5emVzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCi0JICogYW5kIHJ1bnMgdGhlIGdpdmVuIHRlc3Qgc3VpdGUuCi0JICovCi0JcHJvdGVjdGVkIFRlc3RSZXN1bHQgc3RhcnQoU3RyaW5nIGFyZ3NbXSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0ZXN0Q2FzZT0gIiI7Ci0JCWJvb2xlYW4gd2FpdD0gZmFsc2U7Ci0JCQotCQlmb3IgKGludCBpPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGFyZ3NbaV0uZXF1YWxzKCItd2FpdCIpKQotCQkJCXdhaXQ9IHRydWU7Ci0JCQllbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLWMiKSkgCi0JCQkJdGVzdENhc2U9IGV4dHJhY3RDbGFzc05hbWUoYXJnc1srK2ldKTsKLQkJCWVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItdiIpKQotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiSlVuaXQgIitWZXJzaW9uLmlkKCkrIiBieSBLZW50IEJlY2sgYW5kIEVyaWNoIEdhbW1hIik7Ci0JCQllbHNlCi0JCQkJdGVzdENhc2U9IGFyZ3NbaV07Ci0JCX0KLQkJCi0JCWlmICh0ZXN0Q2FzZS5lcXVhbHMoIiIpKSAKLQkJCXRocm93IG5ldyBFeGNlcHRpb24oIlVzYWdlOiBUZXN0UnVubmVyIFstd2FpdF0gdGVzdENhc2VOYW1lLCB3aGVyZSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBUZXN0Q2FzZSBjbGFzcyIpOwotCi0JCXRyeSB7Ci0JCQlUZXN0IHN1aXRlPSBnZXRUZXN0KHRlc3RDYXNlKTsKLQkJCXJldHVybiBkb1J1bihzdWl0ZSwgd2FpdCk7Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBFeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgYW5kIHJ1biB0ZXN0IHN1aXRlOiAiK2UpOwotCQl9Ci0JfQotCQkKLQlwcm90ZWN0ZWQgdm9pZCBydW5GYWlsZWQoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJU3lzdGVtLmVyci5wcmludGxuKG1lc3NhZ2UpOwotCQlTeXN0ZW0uZXhpdCgtMSk7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgUHJpbnRTdHJlYW0gd3JpdGVyKCkgewotCQlyZXR1cm4gZldyaXRlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9qdW5pdC91aS9UZXN0UnVubmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3VpL1Rlc3RSdW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNhNWM5MS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL2p1bml0L3VpL1Rlc3RSdW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLXBhY2thZ2UganVuaXQudWk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC5ydW5uZXIuKjsKLSAKLS8qKgotICogQGRlcHJlY2F0ZWQgdXNlIGp1bml0LmF3dHVpLlRlc3RSdW5uZXIuCi0gKi8KLSBwdWJsaWMgY2xhc3MgVGVzdFJ1bm5lciBleHRlbmRzIGp1bml0LmF3dHVpLlRlc3RSdW5uZXIgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJbmV3IFRlc3RSdW5uZXIoKS5zdGFydChhcmdzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci9wMS9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3AxL0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ4NGUwZi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3AxL0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSBwMTsKLQotcHVibGljIGNsYXNzIEEgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIGZvbygpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3AyL0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvcDIvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTA3YWUzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvcDIvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wYWNrYWdlIHAyOwotCi1wdWJsaWMgY2xhc3MgQSB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIGZvbygpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3AzL0IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvcDMvQi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjE3NjhmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvcDMvQi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotcGFja2FnZSBwMzsKLQotaW1wb3J0IHAxLio7Ci0KLXB1YmxpYyBjbGFzcyBCIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBiYXIoKSB7Ci0JCXAyLkEuZm9vKCk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJQS5mb28oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDAxL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMDEvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDg3ZmRmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMDEvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIHRlc3QwMDAxOwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJIZWxsbyIgKyAiIHdvcmxkIik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMDIvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAwMi9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4N2RkNDkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAwMi9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwMDI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlTeXN0ZW0ub3V0LnByaW50bG4obmV3IE9iamVjdCgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAwMy9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDAzL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU0ZDgwMy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDAzL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDAwMzsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihuZXcgamF2YS5sYW5nLk9iamVjdCgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAwNC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDA0L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRkZjdkNS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDA0L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDAwNDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbigiRVJST1IiKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMDUvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAwNS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YjRmZTQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAwNS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwMDU7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlTeXN0ZW0ub3V0LnByaW50bG4obmV3IGphdmEubGFuZy5PYmplY3QoKSB7fSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMDYvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAwNi9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNWFkZmUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAwNi9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwMDY7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlTeXN0ZW0ub3V0LnByaW50bG4obmV3IGphdmEubGFuZy5SdW5uYWJsZSgpIHsgcHVibGljIHZvaWQgcnVuKCkge319KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAwNy9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDA3L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFjZGMzOS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDA3L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwMDc7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihuZXcgVGVzdCgpLm5ldyBEKCkpOwotCX0KLQljbGFzcyBEIHsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAwOC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDA4L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE4YTZkMi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDA4L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDAwODsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKG5ldyBpbnRbXSB7MSwgMiwgMywgNH0pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDA5L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMDkvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWEyYTE4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMDkvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMDA5OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlTeXN0ZW0ub3V0LnByaW50bG4obmV3IGludFtdW10ge3sxfSwgezJ9fSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMTAvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAxMC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxOTM1M2QuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAxMC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwMTA7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihuZXcgaW50WzNdKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAxMS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDExL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlhNjRjNy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDExL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDAxMTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKG5ldyBpbnRbM11bXSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMTIvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAxMi9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YTY2YmUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAxMi9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwMTI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihuZXcgaW50W11bXSB7e30sIHt9fSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMTMvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAxMy9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNDE4NDMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAxMy9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwMTM7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWludCBpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDE0L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMTQvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTI0NTU5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMTQvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMDE0OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlpbnQgaSA9IDA7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMTUvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAxNS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3OGNmMDEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAxNS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwMTU7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWludCBpID0gMDsKLQkJaSA9IDE7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMTYvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAxNi9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNTI5YmEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAxNi9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwMTY7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWludCBpID0gMDsKLQkJaSArPSAyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDE3L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMTcvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDMyOWYzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMTcvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1wYWNrYWdlIHRlc3QwMDE3OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlpbnQgaSA9IDA7Ci0JCWkgLT0gMjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAxOC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDE4L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE2YzI3Ny4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDE4L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDAxODsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJaW50IGkgPSAwOwotCQlpICo9IDI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMTkvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAxOS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNDRhMDQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAxOS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwMTk7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWludCBpID0gMDsKLQkJaSAvPSAyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDIwL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMjAvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDM0YjNjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMjAvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1wYWNrYWdlIHRlc3QwMDIwOwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlpbnQgaSA9IDA7Ci0JCWkgJj0gMjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAyMS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDIxL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZkMGIzYy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDIxL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDAyMTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJaW50IGkgPSAwOwotCQlpIHw9IDI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMjIvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAyMi9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MDczMzYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAyMi9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwMjI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWludCBpID0gMDsKLQkJaSBePSAyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDIzL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMjMvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTA2MmVlLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMjMvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1wYWNrYWdlIHRlc3QwMDIzOwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlpbnQgaSA9IDA7Ci0JCWkgJT0gMjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAyNC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDI0L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU3YjJhOS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDI0L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDAyNDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJaW50IGkgPSAwOwotCQlpIDw8PSAyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDI1L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMjUvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWE3YWNjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMjUvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1wYWNrYWdlIHRlc3QwMDI1OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlpbnQgaSA9IDA7Ci0JCWkgPj49IDI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMjYvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAyNi9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZGIwY2YuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAyNi9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwMjY7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWludCBpID0gMDsKLQkJaSA+Pj49IDI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMjcvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAyNy9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NTMyOTMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAyNy9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwMjc7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWludCBpID0gMDsKLQkJLS1pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDI4L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMjgvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjgyMWE1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMjgvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1wYWNrYWdlIHRlc3QwMDI4OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlpbnQgaSA9IDA7Ci0JCSsraTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAyOS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDI5L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZkOWY4MS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDI5L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDAyOTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJaW50IGkgPSAwOwotCQlpLS07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMzAvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAzMC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NTEyNGIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAzMC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwMzA7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWludCBpID0gMDsKLQkJaSsrOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDMxL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMzEvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGFkNjMxLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMzEvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1wYWNrYWdlIHRlc3QwMDMxOwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlPYmplY3QgbyA9ICJIZWxsbyI7Ci0JCVN0cmluZyBzID0gKFN0cmluZykgbzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAzMi9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDMyL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJhMmRmNy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDMyL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDAzMjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZG91YmxlIGQgPSAxLjA7Ci0JCWludCBpID0gKGludCkgZDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAzMy9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDMzL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVmZTIxYi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDMzL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDAzMzsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZG91YmxlIGQgPSAxLjA7Ci0JCWZsb2F0IGYgPSAoZmxvYXQpIGQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMzQvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAzNC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZmJiOGQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAzNC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwMzQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWRvdWJsZSBkID0gMS4wOwotCQlieXRlIGIgPSAoYnl0ZSkgZDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAzNS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDM1L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q2NmMxMC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDM1L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDAzNTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZG91YmxlIGQgPSAxLjA7Ci0JCXNob3J0IHMgPSAoc2hvcnQpIGQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwMzYvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAzNi9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmY2Y3ODMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAzNi9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwMzY7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWRvdWJsZSBkID0gMS4wOwotCQlsb25nIGwgPSAobG9uZykgZDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAzNy9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDM3L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQzNjQ1Ny4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDM3L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDAzNzsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJaW50IGkgPSAxOwotCQljaGFyIGMgPSAoY2hhcikgaTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAzOC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDM4L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EzZDY4MS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDM4L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDAzODsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJQ2xhc3MgYyA9IGludC5jbGFzczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDAzOS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDM5L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVkOTIwYS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDM5L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDAzOTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJQ2xhc3MgYyA9IHZvaWQuY2xhc3M7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNDAvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA0MC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YzgxNzMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA0MC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwNDA7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCUNsYXNzIGMgPSBkb3VibGUuY2xhc3M7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNDEvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA0MS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNDQ5YzYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA0MS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwNDE7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCUNsYXNzIGMgPSBsb25nLmNsYXNzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDQyL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNDIvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGYyODU0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNDIvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMDQyOwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oZmFsc2UpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDQzL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNDMvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzVjNzZiLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNDMvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMDQzOwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlTeXN0ZW0ub3V0LnByaW50bG4odHJ1ZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNDQvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA0NC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZjkzZGUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA0NC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwNDQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihudWxsKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA0NS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDQ1L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM1ZmJkZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDQ1L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDA0NTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCdjJyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNDYvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA0Ni9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNjY4MzMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA0Ni9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwNDY7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigxLjAwMDAxKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA0Ny9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDQ3L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FlMjJkYS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDQ3L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDA0NzsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKDEuMDAwMDFmKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA0OC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDQ4L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE1N2IxMC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDQ4L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDA0ODsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKDMwMDAwKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA0OS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDQ5L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E4Y2IyNS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDQ5L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDA0OTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigtMjE0NzQ4MzY0OCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA1MC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDUwL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk4MWEyMi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDUwL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDA1MDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigyMTQ3NDgzNjQ4TCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA1MS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDUxL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU2Y2VhYi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDUxL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDA1MTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigtMjE0NzQ4MzY0OEwpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNTIvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA1Mi9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YzEzZDAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA1Mi9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwNTI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oLTkyMjMzNzIwMzY4NTQ3NzU4MDhMKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDUzL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNTMvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmYzNTliLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNTMvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMDUzOwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJIZWxsbyIgKyAiIFdvcmxkIik7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA1NC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDU0L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI3ZWM0ZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDU0L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwNTQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWJvb2xlYW4gYiA9IHRydWU7Ci0JCWJvb2xlYW4gYjIgPSB0cnVlOwotCQlib29sZWFuIGIzID0gYiAmJiBiMjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA1NS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDU1L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY2ZTMyNC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDU1L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwNTU7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWJvb2xlYW4gYiA9IHRydWU7Ci0JCWJvb2xlYW4gYjIgPSB0cnVlOwotCQlib29sZWFuIGIzID0gYiB8fCBiMjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA1Ni9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDU2L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdkOWZkNS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDU2L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwNTY7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlib29sZWFuIGIgPSB0cnVlOwotCQlib29sZWFuIGIyID0gdHJ1ZTsKLQkJYm9vbGVhbiBiMyA9IGIgPT0gYjI7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA1Ny9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDU3L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNhMzk2OS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDU3L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwNTc7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlpbnQgaSA9IDI7Ci0JCWludCBqID0gMzsKLQkJaW50IG4gPSBpICsgajsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDU4L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNTgvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmY4ZTA3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNTgvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDA1ODsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWludCBpID0gMjsKLQkJaW50IGogPSAzOwotCQlpbnQgbiA9IGkgLSBqOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNTkvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA1OS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MjcxOGQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA1OS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMDU5OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJaW50IGkgPSAyOwotCQlpbnQgaiA9IDM7Ci0JCWludCBuID0gaSAqIGo7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA2MC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDYwL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMzNGQ0Yi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDYwL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwNjA7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWludCBpID0gMjsKLQkJaW50IGogPSAzOwotCQlpbnQgbiA9IGkgLyBqOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDYxL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNjEvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDczZTQ2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNjEvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDA2MTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWludCBpID0gMjsKLQkJaW50IGogPSAzOwotCQlpbnQgbiA9IGkgJSBqOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNjIvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA2Mi9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZjFkMjkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA2Mi9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMDYyOwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJaW50IGkgPSAyOwotCQlpbnQgaiA9IDM7Ci0JCWludCBuID0gaSBeIGo7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA2My9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDYzL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JkNTJiZi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDYzL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwNjM7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWludCBpID0gMjsKLQkJaW50IGogPSAzOwotCQlpbnQgbiA9IGkgJiBqOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDY0L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNjQvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzdlNGFhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNjQvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDA2NDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJaW50IGkgPSAyOwotCQlpbnQgaiA9IDM7Ci0JCWludCBuID0gaSB8IGo7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNjUvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA2NS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYjgxMTkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA2NS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMDY1OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlib29sZWFuIGIgPSB0cnVlOwotCQlib29sZWFuIGIxID0gdHJ1ZTsKLQkJYm9vbGVhbiBiMiA9IGIgPCBiMTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA2Ni9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDY2L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgyMjBmNS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDY2L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwNjY7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWJvb2xlYW4gYiA9IHRydWU7Ci0JCWJvb2xlYW4gYjEgPSB0cnVlOwotCQlib29sZWFuIGIyID0gYiA8PSBiMTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA2Ny9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDY3L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZjODcxMS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDY3L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwNjc7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlib29sZWFuIGIgPSB0cnVlOwotCQlib29sZWFuIGIxID0gdHJ1ZTsKLQkJYm9vbGVhbiBiMiA9IGIgPiBiMTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDY4L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNjgvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGUyNzkzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNjgvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDA2ODsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWJvb2xlYW4gYiA9IHRydWU7Ci0JCWJvb2xlYW4gYjEgPSB0cnVlOwotCQlib29sZWFuIGIyID0gYiA+PSBiMTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDY5L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNjkvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTk0ODRkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNjkvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDA2OTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJYm9vbGVhbiBiID0gdHJ1ZTsKLQkJYm9vbGVhbiBiMSA9IHRydWU7Ci0JCWJvb2xlYW4gYjIgPSBiICE9IGIxOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDcwL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNzAvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjk0YmNlLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNzAvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1wYWNrYWdlIHRlc3QwMDcwOwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJT2JqZWN0IG8gPSBuZXcgT2JqZWN0KCk7Ci0JCWJvb2xlYW4gYiA9IG8gaW5zdGFuY2VvZiBJbnRlZ2VyOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNzEvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA3MS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYmYyNTEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA3MS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwNzE7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlPYmplY3QgbyA9IG5ldyBPYmplY3QoKTsKLQkJYm9vbGVhbiBiID0gbyBpbnN0YW5jZW9mIGphdmEubGFuZy5JbnRlZ2VyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDcyL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNzIvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjRkNDE1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNzIvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1wYWNrYWdlIHRlc3QwMDcyOwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJYm9vbGVhbiBiID0gdHJ1ZTsKLQkJYm9vbGVhbiBiMSA9ICFiOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNzMvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA3My9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMjkzODUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA3My9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwNzM7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlpbnQgaSA9IDI7Ci0JCWludCBuID0gfmk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA3NC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDc0L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkMWFkNi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDc0L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDA3NDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWludCBpID0gKzI7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA3NS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDc1L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMwMGI4Mi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDc1L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDA3NTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWludCBpID0gLTI7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA3Ni9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDc2L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRiM2VjOS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDc2L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDA3NjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWJvb2xlYW4gYiA9IGFyZ3MgIT0gbnVsbCA/IHRydWUgOiBmYWxzZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDc3L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNzcvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTYyMWJmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNzcvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMDc3OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJaW50IGkgPSB0cnVlID8gYXJncy5sZW5ndGg6IDA7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA3OC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDc4L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk3ZGIzMy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDc4L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDA3ODsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgdm9pZCBmb28oKSB7Ci0JCXN1cGVyLmJhcigpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwNzkvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA3OS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YjcyZWUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA3OS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwNzk7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHZvaWQgZm9vKCkgewotCQlzdXBlci5iYXIoNCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA4MC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDgwL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRkYTcwYS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDgwL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDA4MDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgdm9pZCBmb28oKSB7Ci0JCWJhcig0KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDgxL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwODEvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDhiMjdhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwODEvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMDgxOwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyB2b2lkIGZvbygpIHsKLQkJdGhpcy5iYXIoNCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA4Mi9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDgyL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEyMWNjZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDgyL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDA4MjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgdm9pZCBmb28oKSB7Ci0JCWZvciAoOzspOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwODMvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA4My9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZWRiYzIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA4My9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwODM7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHZvaWQgZm9vKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHt9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA4NC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDg0L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZhMzg0Mi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDg0L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDA4NDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgdm9pZCBmb28oKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA4NS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDg1L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I4MmQxNi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDg1L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDA4NTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgdm9pZCBmb28oKSB7Ci0JCWZvciAoaW50IGkgPSAwOzsgaSsrKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDg2L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwODYvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjYwODE0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwODYvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMDg2OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyB2b2lkIGZvbygpIHsKLQkJZm9yICg7IGkgPCAxMDsgaSsrKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDg3L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwODcvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDZmZTk4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwODcvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMDg3OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyB2b2lkIGZvbygpIHsKLQkJZm9yICg7O2krKyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA4OC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDg4L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYwNTZiNi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDg4L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDA4ODsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgdm9pZCBmb28oKSB7Ci0JCWludCBpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwODkvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA4OS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1Y2ZmOWIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA4OS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwODk7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHZvaWQgZm9vKCkgewotCQlqYXZhLmxhbmcuU3RyaW5nIHM7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA5MC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDkwL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ1NDg1NS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDkwL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDA5MDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgdm9pZCBmb28oKSB7Ci0JCWludFtdIHRhYiA9IHsxLCAyfTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDkxL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwOTEvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODhkOTc1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwOTEvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIHRlc3QwMDkxOwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyB2b2lkIGZvbyhTdHJpbmcgcykgewotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwOTIvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA5Mi9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4Yjg5MTcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA5Mi9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwOTI7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgdm9pZCBmb28oZmluYWwgU3RyaW5nIHMpIHsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDkzL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwOTMvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2RjYTQ0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwOTMvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDA5MzsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgdm9pZCBmb28oU3RyaW5nIHMpIHsKLSAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JICAgICBicmVhazsKLQkgICB9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA5NC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDk0L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJmNWNhNS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDk0L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwOTQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHZvaWQgZm9vKFN0cmluZyBzKSB7Ci0gICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCSAgICAgY29udGludWU7Ci0JICAgfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwOTUvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA5NS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZDgyZDQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA5NS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMDk1OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyB2b2lkIGZvbyhTdHJpbmcgcykgewotICAgICBsYWJlbDogZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JICAgICBjb250aW51ZSBsYWJlbDsKLQkgICB9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA5Ni9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDk2L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFiN2YyZi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDk2L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXBhY2thZ2UgdGVzdDAwOTY7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLQlwdWJsaWMgdm9pZCBmb28oU3RyaW5nIHMpIHsKLSAgICAgbGFiZWw6IGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCSAgICAgYnJlYWsgbGFiZWw7Ci0JICAgfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDk3L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwOTcvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzA2NGJiLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwOTcvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDA5NzsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgdm9pZCBmb28oaW50IGkgKSB7Ci0JCXN3aXRjaChpKSB7Ci0JCQljYXNlIDE6IAotICAgICAgICAgICAgICBicmVhazsKLQkJCWNhc2UgMjoKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oMik7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJkZWZhdWx0Iik7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDA5OC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDk4L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFkYzM2ZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDk4L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDA5ODsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgdm9pZCBmb28oaW50IGkgKSB7Ci0JCTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMDk5L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwOTkvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDdiNmM3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAwOTkvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1wYWNrYWdlIHRlc3QwMDk5OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyB2b2lkIGZvbyhpbnQgaSApIHsKLQkJZG8gezsKLQkJfSB3aGlsZSh0cnVlKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTAwL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMDAvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDQyN2Q3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMDAvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMTAwOwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyB2b2lkIGZvbyhpbnQgaSApIHsKLQkJd2hpbGUodHJ1ZSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEwMS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTAxL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYxNzNhOC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTAxL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDEwMTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgdm9pZCBmb28oaW50IGkgKSB7Ci0JCXdoaWxlKHRydWUpIHt9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEwMi9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTAyL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUyNmI5ZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTAyL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDEwMjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiSGVsbG8iICsgIiBXb3JsZCIgKyAiISIpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMDMvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEwMy9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNGQ5MzEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEwMy9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxMDM7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkhlbGxvIiArICIgV29ybGQiICsgIiEiICsgIiEiKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTA0L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMDQvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTgwN2QxLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMDQvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMTA0OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJIZWxsbyIgKyAiIFdvcmxkIiArICIhIiArIDQpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMDUvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEwNS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YjRlYmQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEwNS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxMDU7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oNCArIDUgKyA2ICsgNCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEwNi9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTA2L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRkZmY2My4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTA2L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDEwNjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbig0IC0gNSArIDYgKyA0KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTA3L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMDcvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTg0MTM2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMDcvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMTA3OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKDQgLSA1IC0gNiAtIDQpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMDgvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEwOC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NzQ1ZjcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEwOC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxMDg7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIjQiICsgNSArIDYgKyA0KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTA5L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMDkvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzU2ZWU3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMDkvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMTA5OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCI0IiAtIDUgKyA2ICsgNCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDExMC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTEwL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI2OTExMS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTEwL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDExMDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgaW50IGZvbyhpbnQgaSApIHsKLQkJcmV0dXJuIDI7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDExMS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTExL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkyNWU0My4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTExL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDExMTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgaW50IGZvbyhpbnQgaSApIHsKLQkJcmV0dXJuIDJcdTAwM0IKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTEyL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMTIvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDhmZTU5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMTIvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1wYWNrYWdlIHRlc3QwMTEyOwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyBpbnQgZm9vKGludCBpICkgewotCQlzeW5jaHJvbml6ZWQodGhpcykgewotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDExMy9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTEzL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI2NGUyOS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTEzL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxMTM7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIGludCBmb28oaW50IGkgKSB7Ci0JCXRyeSB7Ci0JCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJfSBmaW5hbGx5IHsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMTQvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDExNC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZDY4NzQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDExNC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMTE0OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyBpbnQgZm9vKGludCBpICkgewotCQl0cnkgewotCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTE1L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMTUvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWQxZjg4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMTUvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDExNTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgaW50IGZvbyhpbnQgaSApIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAyOwotCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTE2L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMTYvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDZhYWFhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMTYvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMTE2OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyBpbnQgZm9vKEV4Y2VwdGlvbiBlKSB7Ci0JCXRocm93IGUgICBcdTAwM0IKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTE3L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMTcvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWViZmI2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMTcvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMTE3OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyBpbnQgZm9vKEV4Y2VwdGlvbiBlKSB7Ci0JCXRocm93IGUgLyogY29tbWVudCBpbiB0aGUgbWlkZGxlIG9mIGEgdGhyb3cgKi8gIFx1MDAzQgotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMTgvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDExOC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMDQzMjguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDExOC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxMTg7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIGludCBmb28oRXhjZXB0aW9uIGUpIHsKLQkJdGhyb3cgZSAvKiBjb21tZW50IGluIHRoZSBtaWRkbGUgb2YgYSB0aHJvdyAqLyAgXHUwMDNCLyoqICovCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMTkvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDExOS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNTA5NzEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDExOS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxMTk7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIGludCBmb28oRXhjZXB0aW9uIGUpIHsKLQkJaWYgKHRydWUpXHUwMDNCCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEyMC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTIwL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY3NmQ2NC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTIwL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDEyMDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgaW50IGZvbyhFeGNlcHRpb24gZSkgewotCQlpZiAodHJ1ZSlcdTAwM0IKLQkJZWxzZSA7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEyMS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTIxL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBjMDBiZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTIxL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDEyMTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgaW50IGZvbyhFeGNlcHRpb24gZSkgewotCQlpZiAodHJ1ZSkge30KLQkJZWxzZSA7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEyMi9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTIyL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAyNGQ3YS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTIyL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDEyMjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgaW50IGZvbyhFeGNlcHRpb24gZSkgewotCQlpZiAodHJ1ZSkgcmV0dXJuIDJcdTAwM0IKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTIzL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMjMvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjJkMTMwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMjMvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1wYWNrYWdlIHRlc3QwMTIzOwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyBpbnQgZm9vKEV4Y2VwdGlvbiBlKSB7Ci0JCWlmICh0cnVlKSByZXR1cm4gMjsKLQkJZWxzZSByZXR1cm4gMzsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTI0L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMjQvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjY2NmE5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMjQvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIHRlc3QwMTI0OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyBpbnQgZm9vKEV4Y2VwdGlvbiBlKSB7Ci0JCWludCB4PSAxMCwgeltdID0gbnVsbCwgaSwgaltdW107Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMjUvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEyNS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NDBmYzEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEyNS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxMjU7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIGludCBmb28oRXhjZXB0aW9uIGUpIHsKLQkJaW50W10geD0gMTAsIHpbXSA9IG51bGwsIGksIGpbXVtdOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMjYvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEyNi9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOWM1MjAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEyNi9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxMjY7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHZvaWQgZm9vKGludCBpKSB7Ci0JCWZvciAoU3RyaW5nW10gdGFiW10gPSBudWxsOzsgKytpKSB7fQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMjcvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEyNy9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNWE3ZTkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEyNy9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxMjc7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHZvaWQgZm9vKGludCBpKSB7Ci0JCWZvciAoU3RyaW5nIHRhYltdID0gbnVsbDs7ICsraSkge30KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTI4L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMjgvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjZjZjNhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMjgvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMTI4OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyB2b2lkIGZvbyhpbnQgaSkgewotCQlmb3IgKFN0cmluZyB0YWJbXSA9IG51bGw7OyBpKysvKiovKSB7fQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMjkvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEyOS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNDNmZjUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEyOS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxMjk7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0gIGludCBpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMzAvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEzMC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NGM4NjcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEzMC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxMzA7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0gIHB1YmxpYyBpbnQgeD0gMTAsIHlbXSA9IG51bGwsIGksIGpbXVtdOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMzEvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEzMS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlM2E3ZWYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEzMS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxMzE7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0gIHZvaWQgZm9vKGZpbmFsIGludCBpKSB7fQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEzMi9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTMyL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEwNzBkMS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTMyL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDEzMjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLSAgLyoqIEphdmFEb2MgQ29tbWVudCovCi0gIHZvaWQgZm9vKGZpbmFsIGludCBpKSB7fQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEzMy9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTMzL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM0ZGEyZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTMzL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDEzMzsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLSAgLyogTXVsdGlwbGUgbGluZSBDb21tZW50Ci0gICovCi0gIHZvaWQgZm9vKGZpbmFsIGludCBpKSB7fQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEzNC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTM0L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZjZmU5OS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTM0L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDEzNDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLSAgLy8gTGluZSBjb21tZW50Ci0gIHZvaWQgZm9vKGZpbmFsIGludCBpKSB7fQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEzNS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTM1L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQxMDRjNy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTM1L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDEzNTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLSAgLyoqIEphdmFEb2MgQ29tbWVudCovCi0gIGludCBpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEzNi9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTM2L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEyMTVmNS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTM2L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDEzNjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLSAgLyogTXVsdGlwbGUgbGluZXMgY29tbWVudAotICAqLwotICBpbnQgaTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMzcvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEzNy9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZDUzMjguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEzNy9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxMzc7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0gIC8vIExpbmUgY29tbWVudAotICBpbnQgaTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMzgvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEzOC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlODYzNzcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDEzOC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxMzg7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0gIC8vIExpbmUgY29tbWVudAotcHVibGljIGNsYXNzIFRlc3QgewotICBpbnQgaTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTM5L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMzkvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTE1ZmMwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxMzkvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIHRlc3QwMTM5OwotaW1wb3J0IGphdmEudXRpbC4qOwotLyogTGluZSBjb21tZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0IHsKLSAgaW50IGk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE0MC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTQwL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIwZDY5Ni4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTQwL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDE0MDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLS8qKiBKYXZhRG9jIENvbW1lbnQqLwotcHVibGljIGNsYXNzIFRlc3QgewotICBpbnQgaTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTQxL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNDEvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjcxOTU5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNDEvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wYWNrYWdlIHRlc3QwMTQxOwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCS8qKiBKYXZhRG9jIENvbW1lbnQqLwotICBjbGFzcyBCIHt9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE0Mi9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTQyL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI2ZGUxYi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTQyL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDE0MjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQkvKiBNdWx0aXBsZSBsaW5lcyBjb21tZW50Ci0JICovCi0gIGNsYXNzIEIge30KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNDMvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE0My9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NTNkZDIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE0My9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxNDM7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JLy8gTGluZSBjb21tZW50Ci0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgQiB7fQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE0NC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTQ0L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q0MWIzNS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTQ0L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDE0NDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLSAgcHVibGljIHN0YXRpYyBjbGFzcyBCIHt9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE0NS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTQ1L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlhZDQ4NC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTQ1L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDE0NTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQkgIHt9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE0Ni9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTQ2L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y2ZDFlZi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTQ2L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDE0NjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLSAgc3RhdGljIHt9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTQ3L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNDcvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjFhNDdhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNDcvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIHRlc3QwMTQ3OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCi0JLyoqIEphdmFEb2MgQ29tbWVudCovCi0gIHN0YXRpYyB7fQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNDgvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE0OC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMTAxMWIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE0OC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxNDg7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLQkvKiogSmF2YURvYyBDb21tZW50Ki8KLSAge30KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTQ5L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNDkvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2U5ODYzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNDkvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMTQ5OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCi0JLyogSmF2YURvYyBDb21tZW50Ci0JICovCi0gIHt9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE1MC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTUwL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZjZTNjYS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTUwL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDE1MAotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNTEvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE1MS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MmYzOTcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE1MS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxNTE7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE1Mi9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTUyL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NiMjBkMy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTUyL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDE1MjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLSBwdWJsaWNjY2Mgdm9pZGQgZm9vKCgpIHt9IAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNTMvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE1My9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ODU4NzcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE1My9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxNTM7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0gcHVibGljIHZvaWQgZm9vKCkgewotIAlpbnQgaQotIH0gCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE1NC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTU0L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVhNTJjNy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTU0L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDE1NDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWNsYXNzIFRlc3QgewotCWludFtdIHRhYjsKLQlTdHJpbmdbXSB0OwotCVRlc3RbXSB0MjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTU1L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNTUvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTliZjc1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNTUvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIHRlc3QwMTU1OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyB2b2lkIG0oaW50IGksIGZpbmFsIGJvb2xlYW4gYil7fQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNTYvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE1Ni9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNTM5OWEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE1Ni9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxNTY7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JaW50IGZvbyhpbnQgaSkgewotCQlpKys7Ci0JCXJldHVybiBpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTU5L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNTkvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWJhNmM1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNTkvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDE1OTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlUZXN0KGludCBpKXsKLQl9Ci0Jdm9pZCBuKCl7Ci0JCWZpbmFsIGludCB5PSAwOwotCQluZXcgVGVzdCh5KXsKLQkJCXZvaWQgZigpewotCQkJCWludCB5PSA5OwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTYwL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNjAvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTM3ZDExLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNjAvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wYWNrYWdlIHRlc3QwMTYwOwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCQotCVRlc3RbXSB0LCBnW10gPSBudWxsOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNjEvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE2MS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NzRlYjcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE2MS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxNjE7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0IGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTYyL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNjIvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTFhNGM4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNjIvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIHRlc3QwMTYyOwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGludGVyZmFjZSBUZXN0IHsKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTYzL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNjMvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGFiNDBhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNjMvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIHRlc3QwMTYzOwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKG5ldyBqYXZhLmxhbmcuT2JqZWN0KCkge30pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTY0L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNjQvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmQwMWFkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNjQvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIHRlc3QwMTY0OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXByaXZhdGUgY2xhc3MgQiB7fQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNjUvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE2NS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZDdlODAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE2NS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxNjU7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0Jdm9pZCBmb28oKSB7Ci0JCWNsYXNzIEMgewotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNjYvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE2Ni9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MGFhODMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE2Ni9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxNjY7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIGludCBmb28oRXhjZXB0aW9uIGUpIHsKLQkJaW50IHg9IDEwLCB6W10gPSBudWxsLCBpLCBqW11bXTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE2Ny9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTY3L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJmMjc4ZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTY3L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDE2NzsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLSAgICAgICAgdm9pZCBmKCkgewotICAgICAgICAgICAgICAgIGludCBmID0gbmV3IFRlc3RbMSsyXS5sZW5ndGg7Ci0gICAgICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTY4L3Rlc3QxL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNjgvdGVzdDEvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWY4ZTgyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNjgvdGVzdDEvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMTY4LnRlc3QxOwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNjkvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE2OS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyOTk5NDUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE2OS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxNjk7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE3MS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTcxL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzExYzg5OC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTcxL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDE3MTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotY2xhc3MgQSB7Ci19Ci0KLXB1YmxpYyBjbGFzcyBUZXN0IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTcyL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNzIvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTVjOGYyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNzIvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDE3MjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JCi0Jdm9pZCBmb28oaW50W10gaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGJhcihTdHJpbmcgcykgdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNzMvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE3My9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZGJjNzkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE3My9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxNzM7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JaW50IGZvbygpIHsKLQkJaW50IGkgPSAwOwotCQlpKys7Ci0JCXJldHVybiBpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTc0L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNzQvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGRhMTMwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNzQvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1wYWNrYWdlIHRlc3QwMTc0OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCWludCBpOwotCWludCBmb28oKSB7Ci0JCWkrKzsKLQkJcmV0dXJuIGk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNzUvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE3NS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MDFlYTEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE3NS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxNzU7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JaW50IGkgPSAwOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNzYvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE3Ni9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZTNkNjMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE3Ni9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxNzY7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JaW50IGkgPSAwOwotCWludCBmb28oKSB7Ci0JCXJldHVybiB0aGlzLmk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNzcvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE3Ny9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYWRmZDMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE3Ny9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMTc3OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXZvaWQgYmFyKCkgewotCQlkb3VibGUgaSA9IDEuMDsKLQkJU3lzdGVtLm91dC5wcmludGxuKGkpOwotCX0KLQkKLQlpbnQgZm9vKCkgewotCQlpbnQgaSA9IDA7Ci0JCWkrKzsKLQkJcmV0dXJuIGk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNzgvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE3OC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMjlkODEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE3OC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1wYWNrYWdlIHRlc3QwMTc4OwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1jbGFzcyBUb3AgewotCWludCBqOwotfQotCi1wdWJsaWMgY2xhc3MgVGVzdCBleHRlbmRzIFRvcCB7Ci0JaW50IGZvbygpIHsKLQkJcmV0dXJuIHN1cGVyLmo7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxNzkvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE3OS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNzFmZTUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE3OS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxNzk7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHZvaWQgZm9vKCkgewotCQlUZXN0IHQgPSBuZXcgVGVzdCgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4odCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxODAvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE4MC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NjA4YWQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE4MC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxODA7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHZvaWQgZm9vKCkgewotCQlUZXN0W10gdCA9IG5ldyBUZXN0WzBdOwotCQlTeXN0ZW0ub3V0LnByaW50bG4odCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxODEvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE4MS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MjZkODMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE4MS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxODE7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHZvaWQgZm9vKCkgewotCQlUZXN0W10gdCA9IHt9OwotCQlTeXN0ZW0ub3V0LnByaW50bG4odCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxODIvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE4Mi9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZTEyMTIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE4Mi9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxODI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHZvaWQgZm9vKCkgewotCQlpbnQgaT0gMTA7Ci0JCWlmICgvKl0qL2kgPCAxMC8qWyovKQotCQkJZm9vKCk7Ci0JfQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTgzL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxODMvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2E2ZDY3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxODMvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1wYWNrYWdlIHRlc3QwMTgzOwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyB2b2lkIGZvbygpIHsKLQkJaW50IGk9IDEwOwotCQlpZiAoLypdKi9pIDwgMTAgJiYgaSA8IDIwLypbKi8pCi0JCQlmb28oKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE4NC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTg0L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAyMDg5ZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTg0L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDE4NDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgdm9pZCBmb28oKSB7Ci0JCWludCBpPSAxMDsKLQkJaWYgKC8qXSovaSA8IDEwIHx8IGkgPCAyMC8qWyovKQotCQkJZm9vKCk7Ci0JfQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTg1L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxODUvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTg3NmI3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxODUvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1wYWNrYWdlIHRlc3QwMTg1OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyB2b2lkIGZvbygpIHsKLQkJaW50IGk9IDEwOwotCQlpZiAoLypdKi9pID09IDEwLypbKi8pCi0JCQlmb28oKTsKLQl9CQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxODYvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE4Ni9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4N2Y2YTQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE4Ni9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxODY7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHZvaWQgZm9vKCkgewotCQlPYmplY3Qgbz0gbnVsbDsKLQkJaWYgKC8qXSovbyA9PSBvLypbKi8pCi0JCQlmb28oKTsKLQl9CQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxODcvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE4Ny9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNGM2MWEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE4Ny9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMTg3OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyB2b2lkIGZvbygpIHsKLQkJaW50IGk9IDA7Ci0JCXdoaWxlICgvKl0qL2kgPD0gMTAvKlsqLykKLQkJCWZvbygpOwotCQlmb28oKTsJCi0JfQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTg4L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxODgvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDA3NWZkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxODgvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDE4ODsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgdm9pZCBmb28oKSB7Ci0JCWludCBpPSAwOwotCQlmb28oKTsKLQkJZG8gewotCQkJZm9vKCk7Ci0JCX0gd2hpbGUgKC8qXSovaSA8PSAxMC8qWyovKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE4OS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTg5L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFkZTMzYy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTg5L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDE4OTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgdm9pZCBmb28oKSB7Ci0JCWZvciAoaW50IGk9IDA7LypbKi8gaSA8IDEwLypdKi87IGkrKykKLQkJCWZvbygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTkwL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxOTAvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGYxYzA5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxOTAvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDE5MDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFNjYW5uZXIgewotCQlwdWJsaWMgaW50IHg7Ci0JCXB1YmxpYyBpbnQgeTsKLQl9Ci0JcHVibGljIHN0YXRpYyBjbGFzcyBTZWxlY3Rpb24gewotCQlwdWJsaWMgaW50IHN0YXJ0OwotCQlwdWJsaWMgaW50IGVuZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZm9vKFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJU2Nhbm5lciBzY2FubmVyPSBuZXcgU2Nhbm5lcigpOwotCQkKLQkJaWYgKC8qXSovc2Nhbm5lci54IDwgc2VsZWN0aW9uLnN0YXJ0ICYmIHNlbGVjdGlvbi5zdGFydCA8IHNjYW5uZXIueS8qWyovKSB7Ci0JCQlnKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZygpIHsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE5MS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTkxL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEzMDM5Zi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTkxL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDE5MTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgdm9pZCBmb28oKSB7Ci0JCWJvb2xlYW4gYjsKLQkJYj0gMSA8IDEwICYmIC8qXSovMiA8IDIwLypbKi87Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxOTIvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE5Mi9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YTg0Y2YuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE5Mi9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxOTI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHZvaWQgZm9vKCkgewotCQlpbnQgaT0gLypdKi8wLypbKi87Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxOTMvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE5My9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YjFjNjguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE5My9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxOTM7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JY2xhc3MgSW5uZXIgewotCX0KLQlwdWJsaWMgdm9pZCBmb28oKSB7Ci0JCUlubmVyIGlubmVyPSAvKl0qL25ldyBJbm5lcigpOy8qWyovCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxOTQvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE5NC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNWIzMjcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE5NC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxOTQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JY2xhc3MgSW5uZXIgewotCX0KLQlwdWJsaWMgdm9pZCBmb28oKSB7Ci0JCUlubmVyW10gaW5uZXI9IC8qXSovbmV3IElubmVyWzEwXTsvKlsqLwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTk1L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxOTUvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTNlM2UzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxOTUvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDE5NTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWNsYXNzIEEgewotCXB1YmxpYyBGaWxlIGdldEZpbGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgdm9pZCB1c2VGaWxlKEZpbGUgZmlsZSkgewotCX0KLX0KLQotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyB2b2lkIGZvbygpIHsKLQkJQSBhPSBudWxsOwotCQlhLnVzZUZpbGUoLypdKi9hLmdldEZpbGUoKS8qWyovKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDE5Ni9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTk2L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M3ODYyNS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTk2L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXBhY2thZ2UgdGVzdDAxOTY7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JY2xhc3MgSW5uZXIgewotCX0KLQlwdWJsaWMgdm9pZCBmb28oKSB7Ci0JCUlubmVyIGlubmVyPSBudWxsOwotCQlib29sZWFuIGI7Ci0JCWI9IC8qXSovaW5uZXIgaW5zdGFuY2VvZiBJbm5lci8qWyovOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTk3L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxOTcvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWEzZjY0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxOTcvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDE5NzsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1jbGFzcyBBIHsKLQlwdWJsaWMgRmlsZSBnZXRGaWxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIHZvaWQgdXNlRmlsZShGaWxlIGZpbGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgdm9pZCBmb28oKSB7Ci0JCUEgYT0gbnVsbDsKLQkJLypdKi9hLmdldEZpbGUoKS8qWyovLmdldE5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTk4L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxOTgvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGM4NzRmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxOTgvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIHRlc3QwMTk4OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyBpbnQgZm9vKCkgewotCQlyZXR1cm4gMTAgKyAvKl0qLzIwICogMzAvKlsqLyArIDEwOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMTk5L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxOTkvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2NmZjNhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAxOTkvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIHRlc3QwMTk5OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyB2b2lkIGZvbygpIHsKLQkJaW50IGk9IDIwICsgLypdKi8xMCAqIDMwLypbKi8gKyAxMDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIwMC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjAwL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTljYTZiOC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjAwL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyMDA7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1jbGFzcyBBIHsKLQlwdWJsaWMgRmlsZSBnZXRGaWxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIHZvaWQgdXNlRmlsZShGaWxlIGZpbGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgdm9pZCBmb28oKSB7Ci0JCWludCBmPSBuZXcgQVsvKl0qLzEgKyAyLypbKi9dLmxlbmd0aDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIwMS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjAxL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmZTc5OC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjAxL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyMDE7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGZvbygpIHsKLSAgICAgICAgICAgICAgICAvKl0qL2ZvbygpOy8qWyovCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0gMDsgaSA8IDEwOyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICBmb28oKTsgIAotICAgICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIwMi9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjAyL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdlYWE5MS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjAyL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDIwMjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlpbnQgZj0gKDIpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMDMvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIwMy9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NmNhOWEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIwMy9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyMDM7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JaW50IGY9ICgyKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjA0L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMDQvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWNmMjFkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMDQvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIHRlc3QwMjA0OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCWludCBmPSAoKDIpKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjA1L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMDUvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2M5NTExLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMDUvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIHRlc3QwMjA1OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXZvaWQgZigpewotCQkvKlsqL2NsYXNzIEFBIGV4dGVuZHMgVGVzdCB7fS8qXSovCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMDYvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIwNi9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWRlM2MuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIwNi9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMjA2OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyBUZXN0IGZpZWxkOwotCXB1YmxpYyBpbnQgaTsKLQotCXB1YmxpYyBpbnQgZm9vKCkgewotCQlyZXR1cm4gZmllbGQuZmllbGQuZmllbGQuZmllbGQuaTsKLQl9CQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMDcvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIwNy9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMDU1ZGQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIwNy9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyMDc7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0gIC8qKiBKYXZhRG9jIENvbW1lbnQqLwotICB2b2lkIGZvbyhmaW5hbCBpbnQgaSkge30vKiovCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjA4L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMDgvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmUxNDJhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMDgvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMjA4OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotICAvKiBNdWx0aXBsZSBsaW5lIENvbW1lbnQKLSAgKi8KLSAgdm9pZCBmb28oZmluYWwgaW50IGkpIHt9LyoqLwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIwOS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjA5L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJkMWRkNC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjA5L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDIwOTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLSAgLy8gTGluZSBjb21tZW50Ci0gIHZvaWQgZm9vKGZpbmFsIGludCBpKSB7fS8qKi8KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMTAvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIxMC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NWM3NmYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIxMC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyMTA7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0gIC8qKiBKYXZhRG9jIENvbW1lbnQqLwotICBpbnQgaTsvKiovCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjExL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMTEvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTg4M2E1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMTEvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMjExOwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotICAvKiBNdWx0aXBsZSBsaW5lcyBjb21tZW50Ci0gICovCi0gIGludCBpOy8qKi8KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMTIvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIxMi9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMWNhMTEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIxMi9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyMTI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0gIC8vIExpbmUgY29tbWVudAotICBpbnQgaTsvKiovCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjEzL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMTMvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzY4MzMyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMTMvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wYWNrYWdlIHRlc3QwMjEzOwotaW1wb3J0IGphdmEudXRpbC4qOwotICAvLyBMaW5lIGNvbW1lbnQKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLSAgaW50IGk7Ci19LyoqLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMTQvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIxNC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMzQ5NTQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIxNC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyMTQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0vKiBMaW5lIGNvbW1lbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3QgewotICBpbnQgaTsKLX0vKiovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIxNS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjE1L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNjNzVkYS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjE1L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDIxNTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLS8qKiBKYXZhRG9jIENvbW1lbnQqLwotcHVibGljIGNsYXNzIFRlc3QgewotICBpbnQgaTsKLX0vKiovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIxNi9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjE2L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ5NWY3OC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjE2L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDIxNjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQkvKiogSmF2YURvYyBDb21tZW50Ki8KLSAgY2xhc3MgQiB7fS8qKi8KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjE3L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMTcvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDhlMDM0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMTcvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMjE3OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCS8qIE11bHRpcGxlIGxpbmVzIGNvbW1lbnQKLQkgKi8KLSAgY2xhc3MgQiB7fS8qKi8KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMTgvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIxOC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMmY0MjMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIxOC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyMTg7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JLy8gTGluZSBjb21tZW50Ci0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgQiB7fS8qKi8KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMTkvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIxOS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NmVhNmMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIxOS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyMTk7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgQiB7fS8qKi8KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjIwL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMjAvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWRjOWY5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMjAvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIHRlc3QwMjIwOwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCSAge30vKiovCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIyMS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjIxL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEyZWExNy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjIxL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDIyMTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLSAgc3RhdGljIHt9LyoqLwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIyMi9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjIyL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc5OTQzMi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjIyL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDIyMjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQotCS8qKiBKYXZhRG9jIENvbW1lbnQqLwotICBzdGF0aWMge30vKiovCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIyMy9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjIzL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY4MDBmNi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjIzL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDIyMzsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQotCS8qKiBKYXZhRG9jIENvbW1lbnQqLwotICB7fS8qKi8KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjI0L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMjQvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjI2MWIxLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMjQvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMjI0OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCi0JLyogSmF2YURvYyBDb21tZW50Ci0JICovCi0gIHt9LyoqLwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMjUvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIyNS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNzkxMGUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIyNS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMjI1OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyB2b2lkIGZvbyhTdHJpbmcgcykgewotICAgICBsYWJlbDogZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JICAgICBjb250aW51ZSBsYWJlbDsKLQkgICB9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIyNi9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjI2L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQzMDFmNy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjI2L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyMjY7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLQlwdWJsaWMgdm9pZCBmb28oU3RyaW5nIHMpIHsKLSAgICAgbGFiZWw6IGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCSAgICAgYnJlYWsgbGFiZWw7Ci0JICAgfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjI3L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMjcvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2MwN2FmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMjcvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDIyNzsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWNsYXNzIEEgewotCWxvbmcgajsKLX0KLWNsYXNzIEIgewotCUEgZkE7Ci19Ci1jbGFzcyBDIHsKLQlCIGZCOwotfQotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyBDIGZpZWxkOwotCXB1YmxpYyBpbnQgaTsKLQotCXB1YmxpYyBpbnQgZm9vKCkgewotCQlyZXR1cm4gZmllbGQuZkIuZkEuajsKLQl9CQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMjgvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIyOC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZGY0ODUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIyOC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1wYWNrYWdlIHRlc3QwMjI4OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyBzdGF0aWMgaW50IGZvbygpIHsKLQkJcmV0dXJuICA0OwotCX0KLQkKLQlwdWJsaWMgaW50IGJhcigpIHsKLQkJcmV0dXJuIHRlc3QwMjI4LlRlc3QuZm9vKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMjkvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIyOS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZGIxMTAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIyOS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyMjk7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHZvaWQgZm9vKCkgewotCQlTeXN0ZW0uZXJyLnByaW50bG4oKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIzMC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjMwL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM3YWZhYS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjMwL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDIzMDsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotcHVibGljIGNsYXNzIFRlc3QgewotCVByaW50U3RyZWFtIGVyciA9IFN5c3RlbS5lcnI7Ci0JcHVibGljIHZvaWQgZm9vKCkgewotCQllcnIucHJpbnRsbigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjMxL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMzEvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzZmMzljLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMzEvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIHRlc3QwMjMxOwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyB2b2lkIGZvbygpIHsKLQkJU3lzdGVtLmVyci5wcmludGxuKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMzIvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIzMi9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4Yjg2YzEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIzMi9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyMzI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0Jdm9pZCBmb28oU3RyaW5nW10gYXJyYXkpIHsKLQkJaW50IGkgPSBhcnJheS5sZW5ndGg7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIzMy9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjMzL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE5MjkzZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjMzL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDIzMzsKLQotcHVibGljIGNsYXNzIFRlc3QgewotCVRvdG8gdDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjM0L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMzQvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjY0ZTg5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMzQvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMjM0OwotcHVibGljIGNsYXNzIFRlc3QgewotCUxpc3QgZmllbGQ7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIzNS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjM1L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI0OGMyNC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjM1L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDIzNTsKLQotaW1wb3J0IGphdmEuYXd0Lkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlMaXN0IGZpZWxkOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMzYvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIzNi9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhM2Y2OWYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIzNi9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyMzY7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JaW50IGk9IDAsIGsgPSAxOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyMzgvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIzOC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMzAzZmUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIzOC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1wYWNrYWdlIHRlc3QwMjM4OwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIGludCBmb28oKSB7Ci0JCWNsYXNzIFggewotCQkJaW50IGZvbygpIHsKLQkJCQlyZXR1cm4gVGVzdC50aGlzLmJhcigpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgWCgpLmZvbygpOwotCX0KLQkKLQlwdWJsaWMgaW50IGJhcigpIHsKLQkJcmV0dXJuIDA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDIzOS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjM5L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U1NDhmZi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjM5L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyMzk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWNsYXNzIFQgewotCWludCBiYXIoKSB7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotcHVibGljIGNsYXNzIFRlc3QgZXh0ZW5kcyBUIHsKLQlwdWJsaWMgaW50IGZvbygpIHsKLQkJY2xhc3MgWCB7Ci0JCQlpbnQgZm9vKCkgewotCQkJCXJldHVybiBUZXN0LnN1cGVyLmJhcigpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgWCgpLmZvbygpOwotCX0KLQkKLQlwdWJsaWMgaW50IGJhcigpIHsKLQkJcmV0dXJuIDA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI0MC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjQwL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhmMzJiMy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjQwL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyNDA7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIGludCBmb28oKSB7Ci0JCWNsYXNzIFggewotCQkJaW50IGZvbygpIHsKLQkJCQlyZXR1cm4gVGVzdC50aGlzLmY7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBYKCkuZm9vKCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZiA9IDA7Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjQxL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNDEvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjI5YzYxLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNDEvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDI0MTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQotCXB1YmxpYyBpbnQgaTsKLQkKLQlwdWJsaWMgdm9pZCBmb28oKSB7fQotCQotCWNsYXNzIEIgewotCX0KLQkKLQljbGFzcyBEIHsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYmFyKCkgewotCX0KLQkKLQlpbnQgajsKLQkKLQlwdWJsaWMgc3RhdGljIGludCBmb28zKCkgewotCQlyZXR1cm4gMzsKLQl9CQotCXB1YmxpYyBzdGF0aWMgaW50IGsgPSBmb28zKCk7Ci0JCi0JT2JqZWN0IGwsIG4sIG07Ci0JCi0JcHVibGljIHZvaWQgZm9vMigpIHsKLQl9Ci0JCi0JY2xhc3MgRCB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI0Mi9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjQyL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkzZjIwMC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjQyL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyNDI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1jbGFzcyBUIHsKLQlwdWJsaWMgaW50IGYgPSAwOwotfQotCi1wdWJsaWMgY2xhc3MgVGVzdCBleHRlbmRzIFQgewotCXB1YmxpYyBpbnQgZm9vKCkgewotCQljbGFzcyBYIHsKLQkJCWludCBmb28oKSB7Ci0JCQkJcmV0dXJuIFRlc3Quc3VwZXIuZjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IFgoKS5mb28oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjQzL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNDMvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGJmZDI2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNDMvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMjQzOwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXZvaWQgbSgpewotCQl0cnl7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXttKCk7fQotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNDQvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI0NC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNTRmMjQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI0NC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyNDQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0Jdm9pZCBtKCl7Ci0JCXRyeXsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKXttKCk7fQotCQljYXRjaChFeGNlcHRpb24gZSkge30KLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjQ1L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNDUvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQyZGJmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNDUvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMjQ1OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyBpbnQgYSgpIHsKLQkJaW50IGk9IDA7Ci0JCXJldHVybiBpOwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNDYvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI0Ni9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYjU3MjYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI0Ni9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyNDY7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNDcvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI0Ny9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZTczMzMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI0Ny9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyNDc7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNDgvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI0OC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5OTYzNTIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI0OC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyNDg7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JbmF0aXZlIHZvaWQgbShpbnQgaSk7Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjQ5L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNDkvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzcwMjJlLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNDkvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDI0OTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLSAgICAgICAgaW50IGs7Ci0gICAgICAgIHN0YXRpYyBjbGFzcyBqewotICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgazsKLSAgICAgICAgfQotICAgICAgICB2b2lkIG0oKXsKLSAgICAgICAgICAgICAgICBpbnQgeT0gMDsKLSAgICAgICAgICAgICAgICBqLms9IDA7Ci0gICAgICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjUwL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNTAvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZhZDExLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNTAvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIHRlc3QwMjUwOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW50ZXJmYWNlIFRlc3QgewotICAgICAgICAgdm9pZCBtKGludCBpLCBpbnQgaik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI1MS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjUxL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIzZmM1Yi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjUxL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDI1MTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQl2b2lkIGZvbygpIHsKLQkJamF2YS5sYW5nLlN5c3RlbS5vdXQucHJpbnRsbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNTIvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI1Mi9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZWRiMzYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI1Mi9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMjUyOwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCU9iamVjdCBmb28oKSB7Ci0JCWZpbmFsIGludCBqID0gNDsKLQkJCi0JCXJldHVybiBuZXcgT2JqZWN0KCkgewotCQkJaW50IGJhcigpIHsKLQkJCQlyZXR1cm4gajsKLQkJCX0KLQkJfTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNTMvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI1My9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlOGI1ODkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI1My9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyNTM7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIFN0cmluZ0J1ZmZlciBmb28oKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nQnVmZmVyKCIiKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjU0L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNTQvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjQ5YmIyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNTQvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDI1NDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQotCWNsYXNzIEMgewotCX0KLQotCU9iamVjdCBmb28oKSB7Ci0JCXJldHVybiBuZXcgVGVzdCgpLm5ldyBDKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI1NS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjU1L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFlNjFmMi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjU1L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyNTU7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHZvaWQgYmFyKCkgewotCQlmb28oKFN0cmluZ1tdKSBudWxsKTsKLQl9Ci0JCi0Jdm9pZCBmb28oU3RyaW5nW10gYXJnKSB7Ci0JfQotCQotCXZvaWQgZm9vKE9iamVjdCBhcmcpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjU2L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNTYvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWE4Y2FhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNTYvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDI1NjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgdm9pZCBiYXIoKSB7Ci0JCWZvbygoT2JqZWN0KSBudWxsKTsKLQl9Ci0JCi0Jdm9pZCBmb28oU3RyaW5nW10gYXJnKSB7Ci0JfQotCQotCXZvaWQgZm9vKE9iamVjdCBhcmcpIHsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNTcvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI1Ny9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYzEwMmMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI1Ny9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1wYWNrYWdlIHRlc3QwMjU3OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyB2b2lkIGJhcigpIHsKLQkJZm9vKChpbnQpIDApOwotCX0KLQkKLQl2b2lkIGZvbyhpbnQgYXJnKSB7Ci0JfQotCQotCXZvaWQgZm9vKGxvbmcgYXJnKSB7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNTgvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI1OC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxY2VjYzEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI1OC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMjU2OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyB2b2lkIGJhcigpIHsKLQkJZm9vKChqYXZhLmxhbmcuT2JqZWN0KSBudWxsKTsKLQl9Ci0JCi0Jdm9pZCBmb28oU3RyaW5nW10gYXJnKSB7Ci0JfQotCQotCXZvaWQgZm9vKE9iamVjdCBhcmcpIHsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNTkvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI1OS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4Njk3MWYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI1OS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLS8vY2Fubm90IHJlbmFtZSB0byBpLCBpCi1wYWNrYWdlIHRlc3QwMjU5OwotcHVibGljIGNsYXNzIFRlc3QgewotCWludCBtKCl7Ci0JCWludCBpLCAvKlsqL2ludCBqLypdKi87Ci0JCXJldHVybiAwOwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNjAvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI2MC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMzFkNGMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI2MC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyNjA7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgaW50ZXJmYWNlIFRlc3QgewotCSB2b2lkIG0oaW50IGksIGludCBqKTsKLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNjEvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI2MS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNmI5ODkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI2MS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyNjE7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0gIHB1YmxpYyBpbnQgZm9vKGludCB2YXJpYWJsZSkgewotICAgIHJldHVybiB2YXJibGU7IC8vIDwtLSBVbmFibGUgdG8gcmVzb2x2ZSBiaW5kaW5nIGhlcmUKLSAgfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI2Mi9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjYyL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIzNDlkMi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjYyL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDI2MjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbigiRVJST1IiKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI2My9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjYzL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc1OTI5Yi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjYzL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDI2MzsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQl2b2lkIG0oaW50IGkpewotCQltKGkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNjQvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI2NC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZjhjMGQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI2NC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1wYWNrYWdlIHRlc3QwMjY0OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXZvaWQgbShmaW5hbCBpbnQgaSl7Ci0JCVRlc3QgYT0gbmV3IFRlc3QoKXsKLQkJCXZvaWQgbShpbnQgayl7Ci0JCQkJaz0gaTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjY1L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNjUvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2U3NDYzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNjUvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIHRlc3QwMjY1OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyBpbnQgZm9vKCkgewotCQlyZXR1cm4gMTAgKyAvKl0qLzIwICogMzAvKlsqLyArIDEwOwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNjYvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI2Ni9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZmRkNTIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI2Ni9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyNjY7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHN0YXRpYyBjbGFzcyBJbm5lcnt9Ci0JcHVibGljIHN0YXRpYyB2b2lkIG0oKXsKLQkJSW5uZXJcdTAwNWJdIGk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNjcvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI2Ny9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZmQ4ODAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI2Ny9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyNjc7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHN0YXRpYyBjbGFzcyBJbm5lcnt9Ci0JcHVibGljIHN0YXRpYyB2b2lkIG0oKXsKLQkJSW5uZXJbXSBpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjY4L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNjgvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzc1M2M1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNjgvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMjY4OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW5uZXJ7fQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtKCl7Ci0JCXRlc3QwMjY4LlRlc3QuSW5uZXJbXSBpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjY5L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNjkvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWNhZTM0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNjkvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMjY5OwotaW1wb3J0IGphdmEudXRpbC4qOwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW5uZXJ7fQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtKCl7Ci0JCXRlc3QwMjY5LlRlc3QuSW5uZXJbLyoqL10gaTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI3MC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjcwL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk1OWJjOS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjcwL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDI3MDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgc3RhdGljIGNsYXNzIElubmVye30KLQlwdWJsaWMgc3RhdGljIHZvaWQgbSgpewotCQl0ZXN0MDI3MC5UZXN0LklubmVyIGlbXTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI3MS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjcxL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVhMTBmYi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjcxL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDI3MTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgc3RhdGljIGNsYXNzIElubmVye30KLQlwdWJsaWMgc3RhdGljIHZvaWQgbSgpewotCQl0ZXN0MDI3MS5UZXN0LklubmVyW10gaVtdOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjcyL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNzIvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmIxMjZhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNzIvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIHRlc3QwMjcyOwotCi1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHZvaWQgZm9vKCkgewotCQlmb3IgKGludCBpPSAwOyBpIDwgMTA7IGkrKykgZm9vKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI3My9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjczL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIxMmE0Mi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjczL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDI3MzsKLQotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyB2b2lkIGZvbygpIHsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IDEwOyBpKyspIHsgZm9vKCk7IH0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI3NC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjc0L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBiZDNjYS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjc0L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDI3NDsKLQotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyB2b2lkIGZvbyhpbnQgaikgewotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChpIDwgMTApIHsgZm9vKGkrKyk7IH0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI3NS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjc1L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFhYjY2MS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjc1L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDI3NTsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgdm9pZCBmb28oaW50IGopIHsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IDEwKSBmb28oaSsrKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI3Ni9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjc2L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJiMDM3Yi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjc2L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDI3NjsKLQotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyB2b2lkIGZvbygpIHsKLQkJZm9vKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI3Ny9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjc3L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk2ZmZhNi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjc3L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDI3NzsKLQotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyB2b2lkIGZvbygpIHsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNzgvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI3OC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ODY3OTMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI3OC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyNzg7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlDbGFzcyBjID0gamF2YS5sYW5nLlN0cmluZy5jbGFzczsKLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyNzkvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI3OS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMWEyNmQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI3OS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyNzk7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQl2b2lkIGZvbygpIHsKLQkJQ2xhc3MgYyA9IGphdmEubGFuZy5TdHJpbmcuY2xhc3M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI4MC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjgwL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc4MTdhMC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjgwL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDI4MDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI4MS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjgxL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFjZjg0MC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjgxL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDI4MTsKLQotcHVibGljIGNsYXNzIFRlc3QgewotCU9iamVjdCBvPSAvKl0qL25ldyBPYmplY3QoKS8qWyovOwotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI4Mi9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjgyL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA5MzQxMS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjgyL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDI4MjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlib29sZWFuIGIgPSAvKl0qL3RydWUvKlsqLzsKLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyODMvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI4My9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZjBiMjkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI4My9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyODM7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQljaGFyIGMgPSAvKl0qLydjJy8qWyovOwotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI4NC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjg0L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZhZGQ3OC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjg0L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDI4NDsKLQotcHVibGljIGNsYXNzIFRlc3QgewotCU9iamVjdCBvID0gLypdKi9udWxsLypbKi87Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjg1L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyODUvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTI5OTY4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyODUvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIHRlc3QwMjg1OwotCi1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JT2JqZWN0IG8gPSAvKl0qL09iamVjdC5jbGFzcy8qWyovOwotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI4Ni9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjg2L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDliMzUzMS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjg2L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDI4NjsKLQotcHVibGljIGNsYXNzIFRlc3QgewotCWludCBpID0gLyoqLygyKS8qKi87Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjg3L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyODcvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWI1YTExLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyODcvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIHRlc3QwMjg3OwotCi1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JU3RyaW5nW10gdGFiID0gLyoqL25ldyBTdHJpbmdbM10vKiovOwotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI4OC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjg4L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEzYmY3MC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjg4L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDI4ODsKLQotcHVibGljIGNsYXNzIFRlc3QgewotCVN0cmluZ1tdIHRhYiA9IC8qKi97IH0vKiovOwotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI4OS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjg5L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlmZDU4Mi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjg5L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDI4OTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlTdHJpbmdbXSB0YWIxID0gbmV3IFN0cmluZ1tdIHsgbnVsbH0gOwkJCi0JU3RyaW5nIHMgPSAvKiovdGFiMVswXS8qKi87Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjkwL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyOTAvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2E5MzM3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyOTAvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIHRlc3QwMjkwOwotCi1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JT2JqZWN0IG8gPSAvKl0qL25ldyBqYXZhLmxhbmcuT2JqZWN0KCkvKlsqLzsKLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyOTEvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI5MS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMWFiMDEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI5MS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyOTE7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQliYXIoKSB7fQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI5Mi9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjkyL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhNDYzMS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjkyL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDI5MjsKLQotcHVibGljIGNsYXNzIFRlc3QgewotICBpbnQgYmFyKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgcmV0dXJuIFRlc3QueDsKLSAgfQotICBzdGF0aWMgaW50IHg7Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjkzL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyOTMvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmRmZjYyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyOTMvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDI5MzsKLQotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyB2b2lkIGZvbygpIHsKLQkJUnVubmFibGUgcnVuPSBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJLypdKi9mb28oKTsvKlsqLwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjk0L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyOTQvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDJmNjM0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyOTQvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDI5NDsKLQotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyB2b2lkIGZhaWxzKCkgewotCQlmb28oKQotCX0KLQlwdWJsaWMgdm9pZCBmb28oKSB7Ci0JCWZvbygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyOTUvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI5NS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMDEzZGIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI5NS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMjk1OwotCi1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIExpc3QgZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyB2b2lkIGZvbygpIHsKLQkJZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyOTYvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI5Ni9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NWZjOGYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI5Ni9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMjk2OwotCi1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHZvaWQgZmFpbHMoKSB7Ci0JCWZvbygpCi0JfQotCXB1YmxpYyB2b2lkIGZvbygpIHsKLQkJZm9vKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI5Ny9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjk3L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UyNzgxNi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjk3L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyOTc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyBMaXN0IGZMaXN0OwotCQotCXB1YmxpYyB2b2lkIGZvbygpIHsKLQkJaW50IGk9IDEwOwotCQlzd2l0Y2ggKGkpIHsKLQkJCWNhc2UgMToKLQkJCQlMaXN0IGw9IG51bGw7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI5OC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjk4L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRlNmQxMy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMjk4L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyOTg7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JYm9vbGVhbiBtKCl7Ci0JCXJldHVybiAvKlsqL2EoKS5sZW5ndGggIT0gMy8qXSovOwotCX0KLQlpbnRbXSBhKCl7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAyOTkvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI5OS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMDJhMGMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDI5OS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAyOTk7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlpbnQgaSA9ICgvKiovMi8qKi8pOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzMDAvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMwMC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYmJhNDcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMwMC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAzMDA7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlib29sZWFuIGIgPSAvKiovdHJ1ZS8qKi87Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMwMS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzAxL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJhZGQ0Yi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzAxL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDMwMTsKLQotcHVibGljIGNsYXNzIFRlc3QgewotCU9iamVjdCBvID0gLyoqL251bGwvKiovOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzMDIvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMwMi9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMTk1ZDUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMwMi9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAzMDI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHZvaWQgZm9vKCkgewotCQkvKl0qL2RvCi0JCQlmb28oKTsKLQkJd2hpbGUoMSA8IDEwKTsvKlsqLwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzMDMvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMwMy9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNjU2ZDYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMwMy9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAzMDM7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0gIHZvaWQgZm9vKCkgewotICAgIGNoYXIgeDsKLSAgICB4ID0gKGNoYXIpMzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMwNC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzA0L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA2NjVmMy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzA0L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDMwNDsKLQotaW50ZXJmYWNlIFRlc3QgewotCXB1YmxpYyB2b2lkIGZvbyhpbnQgYXJnKTsKLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzMDcvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMwNy9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllOGU3ZDkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMwNy9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1wYWNrYWdlIHRlc3QwMzA3OwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0Jc3RhdGljIGNsYXNzIEEgewotCQlwdWJsaWMgQShpbnQgaSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgQiBleHRlbmRzIEEgewotCQlwdWJsaWMgQigpICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJCXN1cGVyKDEwKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzA4L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzMDgvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzQwY2ZhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzMDgvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDMwODsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFRlc3QgewotCXN0YXRpYyBjbGFzcyBBIHsKLQkJcHVibGljIEEoaW50IGkpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIEIgZXh0ZW5kcyBBIHsKLQkJcHVibGljIEIoKSB7Ci0JCQlzdXBlcigxMCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMwOS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzA5L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE3YmE4Mi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzA5L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDMwOTsKLQotcHVibGljIGNsYXNzIFRlc3QgewotCXZvaWQgZihpbnQgeSl7Ci0JCWludCBpPSAoeT09NykgPyAxIDogMiA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMxMC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzEwL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM5ODk0ZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzEwL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLXBhY2thZ2UgdGVzdDAzMTA7Ci0KLWNsYXNzIFRlc3QgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHID0gSS5HUjsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjKCl7Ci0JCU9iamVjdCBjcCA9IG51bGw7Ci0JfQotfQotCi1pbnRlcmZhY2UgSSB7Ci0JU3RyaW5nIEdSPSAibCI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMxMS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzExL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAzOWRlMi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzExL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLXBhY2thZ2UgdGVzdDAzMTE7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQl2b2lkIG0oKXsKLQkJZmluYWwgaW50IGo9IDA7Ci0JCVRlc3QgYT0gbmV3IFRlc3QoKXsKLQkJCXZvaWQgbShpbnQgail7Ci0JCQkJaW50IHU9IGo7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMxMi9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzEyL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA3MDcyMC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzEyL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLXBhY2thZ2UgdGVzdDAzMTI7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQl2b2lkIG0oKXsKLQkJZmluYWwgaW50IGo9IDA7Ci0JCUEgYT0gbmV3IEEoKXsKLQkJCXZvaWQgbShpbnQgail7Ci0JCQkJaW50IHU9IGo7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMxMy9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzEzL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQwZTk4Yi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzEzL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDMxMzsKLQotcHVibGljIGNsYXNzIFRlc3QgewotIAl2b2lkIG0oaW50IGksIGludCBqKXsKLSAJCWludCB1PSBpK2o7Ci0gCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzMTQvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMxNC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MzMzMGYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMxNC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXBhY2thZ2UgdGVzdDAzMTQ7Ci1wdWJsaWMgY2xhc3MgVGVzdCB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7IGludCB4PSAzO319ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMxNS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzE1L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYyZDA3Ny4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzE1L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDMxNTsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLSAgYm9vbGVhbiBmb28oKSB7Ci0gICAgcmV0dXJuICJhYmMiIGluc3RhbmNlb2YgamF2YS5pby5TZXJpYWxpemFibGU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzMTcvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMxNy9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZmExZGQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMxNy9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAzMTc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIGJvb2xlYW4gZm9vKE9iamVjdCB4KSB7Ci0JCXJldHVybiB4IGluc3RhbmNlb2YgVmVjdG9yOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzE4L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzMTgvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGNiNWY1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzMTgvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIHRlc3QwMzE4OwotCi1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0Jc3RhdGljIHZvaWQgX19fcnVuKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJcHJpdmF0ZSBpbnQgeDsKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzE5L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzMTkvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmQ1NDllLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzMTkvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIHRlc3QwMzE5OwotCi1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0Jc3RhdGljIHZvaWQgX19fcnVuKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJamF2YS5sYW5nLk9iamVjdFtdIG9iaj0gbmV3IE9iamVjdFsxMF07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMyMC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzIwL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc5MmUzMy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzIwL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDMyMDsKLQotcHVibGljIGNsYXNzIFRlc3QgewotCXN0YXRpYyB2b2lkIF9fX3J1bihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgdGhyb3dzIFRocm93YWJsZSB7Ci0JCWludFtdIHRhYiA9IG5ldyBpbnRbMTBdOwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzMjEvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMyMS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YTg4MzAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMyMS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAzMjE7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlzdGF0aWMgdm9pZCBfX19ydW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHRocm93cyBUaHJvd2FibGUgewotCQlqYXZhLmxhbmcuT2JqZWN0W11bXSBvYmo9IG5ldyBPYmplY3RbMTBdWzBdOwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzMjIvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMyMi9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjOGRjNzkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMyMi9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAzMjI7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlPYmplY3QgZkZpZWxkPSBudWxsOwotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMyMy9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzIzL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRlMmM1Yi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzIzL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDMyMzsKLQotcHVibGljIGNsYXNzIFRlc3QgewotICB2b2lkIGZvbygpIHsKLSAgICBTdHJpbmcgeDsKLSAgICB4ID0gKGphdmEubGFuZy5PYmplY3QpICJzIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMyNC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzI0L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY3M2U1Ny4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzI0L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDMyNDsKLQotcHVibGljIGNsYXNzIFRlc3QgewotICB2b2lkIGZvbygpIHsKLSAgICBPYmplY3QgeDsKLSAgICB4ID0gKGphdmEubGFuZy5PYmplY3RbXSkgbnVsbDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzMjUvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMyNS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZmIzNzcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMyNS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAzMjU7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0IHsKLSAgdm9pZCBmb28oKSB7Ci0gICAgT2JqZWN0IHg7Ci0gICAgeCA9IChpbnRbXSkgbnVsbDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzMjYvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMyNi9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZjdhYjAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMyNi9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAzMjY7Ci0KLXB1YmxpYyBjbGFzcyBBIHsKLQlBIGY7Ci0JcHVibGljIEEgYSgpIHsKLQkJYSgpLmY9IGEoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMyNy9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzI3L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRmZTA5YS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzI3L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDMyNzsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgZ29vKE9iamVjdCBvKSB7Ci0JCVZlY3RvciBzPSAoU3RyaW5nKSBvb287Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMyOC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzI4L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q5YjIwMy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzI4L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDMyODsKLQotcHVibGljIGNsYXNzIFRlc3QgewotCXN0YXRpYyB2b2lkIF9fX3J1bihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgdGhyb3dzIFRocm93YWJsZSB7Ci0JCWphdmEubGFuZy5PYmplY3RbXSBvYmo9IG5ldyBPYmplY3RbXSB7bnVsbCwgbmV3IE9iamVjdCgpfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzI5L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzMjkvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTU4YTI4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzMjkvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIHRlc3QwMzI5OwotCi1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0Jc3RhdGljIHZvaWQgX19fcnVuKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJamF2YS5sYW5nLk9iamVjdFtdIG9iaj0gbmV3IE9iamVjdFtdIHt9OwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzMzAvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMzMC9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwODQxOTYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMzMC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1wYWNrYWdlIHRlc3QwMzMwOwotCi1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIGZvbygpIHsKLSAJCXJldHVybiAwOwotCX0KLX0KLQotY2xhc3MgQSB7Ci0Jdm9pZCBiYXIoKSB7Ci0JCW5ldyBUZXN0KCkuZm9vKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMzMS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzMxL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzExNGMzMC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzMxL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDMzMTsKLQotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAJCWludCBpID0gYXJncy5sZW5ndGg7Ci0gICAgCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzMzIvTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMzMi9Mb2NhbFNlbGVjdGlvblRyYW5zZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NDdjMjQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMzMi9Mb2NhbFNlbGVjdGlvblRyYW5zZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKgotICogKGMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMCwgMjAwMS4KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKi8KLXBhY2thZ2UgdGVzdDAzMzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkJ5dGVBcnJheVRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5KYXZhUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuSmF2YVVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBMb2NhbFNlbGVjdGlvblRyYW5zZmVyIGV4dGVuZHMgQnl0ZUFycmF5VHJhbnNmZXIgewotCi0JLy8gRmlyc3QgYXR0ZW1wdCB0byBjcmVhdGUgYSBVVUlEIGZvciB0aGUgdHlwZSBuYW1lIHRvIG1ha2Ugc3VyZSB0aGF0Ci0JLy8gZGlmZmVyZW50IEVjbGlwc2UgYXBwbGljYXRpb25zIHVzZSBkaWZmZXJlbnQgInR5cGVzIiBvZgotCS8vIDxjb2RlPkxvY2FsU2VsZWN0aW9uVHJhbnNmZXI8L2NvZGU+Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTkFNRT0gImxvY2FsLXNlbGVjdGlvbi10cmFuc2Zlci1mb3JtYXQiICsgKG5ldyBMb25nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSkudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRUlEPSByZWdpc3RlclR5cGUoVFlQRV9OQU1FKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbFNlbGVjdGlvblRyYW5zZmVyIElOU1RBTkNFPSBuZXcgTG9jYWxTZWxlY3Rpb25UcmFuc2ZlcigpOwotCQotCXByaXZhdGUgSVNlbGVjdGlvbiBmU2VsZWN0aW9uOwotCXByaXZhdGUgaW50IGZUaW1lOwotCQotCXByaXZhdGUgTG9jYWxTZWxlY3Rpb25UcmFuc2ZlcigpIHsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTG9jYWxTZWxlY3Rpb25UcmFuc2ZlciBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB0cmFuc2ZlciBkYXRhIGZvciBsb2NhbCB1c2UuCi0JICovCQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHMpIHsKLQkJZlNlbGVjdGlvbj0gczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWwgdHJhbnNmZXIgZGF0YS4KLQkgKi8KLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBmU2VsZWN0aW9uOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBqYXZhVG9OYXRpdmUoT2JqZWN0IG9iamVjdCwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotCQlieXRlW10gY2hlY2s9IFRZUEVfTkFNRS5nZXRCeXRlcygpOwotCQlzdXBlci5qYXZhVG9OYXRpdmUoY2hlY2ssIHRyYW5zZmVyRGF0YSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBuYXRpdmVUb0phdmEoVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotCQlPYmplY3QgcmVzdWx0PSBzdXBlci5uYXRpdmVUb0phdmEodHJhbnNmZXJEYXRhKTsKLQkJaWYgKGlzSW52YWxpZE5hdGl2ZVR5cGUocmVzdWx0KSkgewotCQkJSmF2YVBsdWdpbi5sb2dFcnJvck1lc3NhZ2UoSmF2YVVJTWVzc2FnZXMuZ2V0U3RyaW5nKCJMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmVycm9yTWVzc2FnZSIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBmU2VsZWN0aW9uOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0ludmFsaWROYXRpdmVUeXBlKE9iamVjdCByZXN1bHQpIHsKLQkJcmV0dXJuICEocmVzdWx0IGluc3RhbmNlb2YgYnl0ZVtdKSB8fCAhVFlQRV9OQU1FLmVxdWFscyhuZXcgU3RyaW5nKChieXRlW10pcmVzdWx0KSk7Ci0JfQotCQotCS8qKgotCSAqIFRoZSB0eXBlIGlkIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyB0cmFuc2Zlci4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50W10gZ2V0VHlwZUlkcygpIHsKLQkJcmV0dXJuIG5ldyBpbnRbXSB7VFlQRUlEfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFR5cGVOYW1lcygpewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHtUWVBFX05BTUV9OwotCX0JCi0JCi0JcHVibGljIGludCBnZXRUaW1lKCkgewotCQlyZXR1cm4gZlRpbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGltZShpbnQgdGltZSkgewotCQlmVGltZT0gdGltZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzMzMvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMzMy9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYTkwMzIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMzMy9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAzMzM7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlzdGF0aWMgdm9pZCBfX19ydW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHRocm93cyBUaHJvd2FibGUgewotCQlqYXZhLmxhbmcuT2JqZWN0W11bXSBvYmo9IG5ldyBPYmplY3RbMTBdW107Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMzNC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzM0L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJlNjg2MS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzM0L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDMzNDsKLQotcHVibGljIGNsYXNzIFRlc3QgewotCXN0YXRpYyB2b2lkIF9fX3J1bihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgdGhyb3dzIFRocm93YWJsZSB7Ci0JCWphdmEubGFuZy5PYmplY3RbXVtdW10gb2JqPSBuZXcgT2JqZWN0WzEwXVtdW107Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMzNS9FeGNlcHRpb25UZXN0Q2FzZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzMzUvRXhjZXB0aW9uVGVzdENhc2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNTg1OGUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMzNS9FeGNlcHRpb25UZXN0Q2FzZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDMzNTsKLQotcHVibGljIGNsYXNzIEV4Y2VwdGlvblRlc3RDYXNlVGVzdCBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgRXhjZXB0aW9uVGVzdENhc2VUZXN0KFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzM2L1NvcnRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzMzYvU29ydGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OThiZGM5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzMzYvU29ydGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDMzNjsKLQotaW1wb3J0IGp1bml0LnJ1bm5lci5Tb3J0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotcHVibGljIGNsYXNzIFNvcnRlclRlc3QgIHsKLQlzdGF0aWMgY2xhc3MgU3dhcHBlciBpbXBsZW1lbnRzIFNvcnRlci5Td2FwcGVyIHsKLQkJcHVibGljIHZvaWQgc3dhcChWZWN0b3IgdmFsdWVzLCBpbnQgbGVmdCwgaW50IHJpZ2h0KSB7Ci0JCX0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMzNy9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzM3L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI3ZjdhYy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzM3L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDMzNzsKLQotcHVibGljIGNsYXNzIFRlc3QgewotIAlTdHJpbmcgbWVzc2FnZT0gVGVzdC5tKCJzIiwgbmV3IFN0cmluZ1tdeyJnIn0pOwotIAkKLSAJc3RhdGljIFN0cmluZyBtKFN0cmluZyBnLCBTdHJpbmdbXSBzKXsKLSAJCXJldHVybiBudWxsOwotIAl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMzOC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzM4L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMyMjdjNS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzM4L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDMzODsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgdm9pZCBmb28oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzMzkvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMzOS9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZThjNDAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDMzOS9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1wYWNrYWdlIHRlc3QwMzM5OwotCi1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgWCB7Ci0JCWludCBkb1F1ZXJ5KGJvb2xlYW4geCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0WChib29sZWFuIHgpIHsKLSAJCXsKLQkJegotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzQxL0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNDEvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWI5ODA2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNDEvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDM0MTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotcHVibGljIGNsYXNzIEEgewotCi0JcHJpdmF0ZSBWZWN0b3IgZmllbGQ7Ci0KLQlwdWJsaWMgdm9pZCBsKCkKLQkJdGhyb3dzCi0JCQlJT0V4Y2VwdGlvbiwKLQkJCU1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwKLQkJCUludGVycnVwdGVkSU9FeGNlcHRpb24sCi0JCQlVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQkJaWYgKGZpZWxkICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigpOwotCQl9IGVsc2UgaWYgKGZpZWxkID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBNYWxmb3JtZWRVUkxFeGNlcHRpb24oKTsKLQkJfSBlbHNlIGlmIChmaWVsZCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbigpOwotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24oKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzQyL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNDIvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDlhMzU0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNDIvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDM0MjsKLQotcHVibGljIGNsYXNzIFRlc3QgewotCi0JcHVibGljIGludCBqdW5rMShpbnQgaSkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBqdW5rMigpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIE9iamVjdCBqdW5rMygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCVRlc3QoaW50IGkpIHsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM0My9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzQzL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJkYjU3ZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzQzL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLXBhY2thZ2UgdGVzdDAzNDM7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQotCXB1YmxpYyB2b2xhdGlsZSBib29sZWFuIGZsYWc7Ci0KLQlwdWJsaWMgdm9pZCBmb28oKSB7Ci0JCWludCBpPSA1OwotCQkvKl0qL2lmIChmbGFnKQotCQkJaT0gMTA7LypbKi8KLQkJaS0tOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzQ0L1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNDQvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDk5MzYyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNDQvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDM0NDsKLQotcHVibGljIGNsYXNzIFRlc3QgewotCi0gICAgcHVibGljIHZvaWQgYnVnVGVzdCgpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJibGEiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJibHViYiIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjb250YWluc0Fzc2VydCgpIHsKLSAgICAgICAgYXNzZXJ0IHRydWU7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM0NS9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzQ1L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM4NjlkNy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzQ1L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAzNDU7Ci0KLXB1YmxpYyBjbGFzcyBBIHsKLQlCYXIuQltdIGZpZWxkPSBuZXcgQmFyLkJbXXsKLQkJbmV3IEJhci5CKCkKLQl9OwotCXZvaWQgZigpewotCQlpbnQgdGVtcDsKLQl9Ci19Ci0KLWNsYXNzIEJhcnsKLQlzdGF0aWMgY2xhc3MgQnt9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM0Ni9UZXN0Mi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM0Ni9UZXN0Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2M4ZTQwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNDYvVGVzdDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDM0NjsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0MiB7Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3VtZW50cykgewotICAgIFZlY3RvciBlZGl0b3JzW109IG51bGw7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzQ3L1Rlc3QyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzQ3L1Rlc3QyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNzczODkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM0Ny9UZXN0Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1wYWNrYWdlIHRlc3QwMzQ3OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotcHVibGljIGNsYXNzIFRlc3QyIHsKLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndW1lbnRzKSB7Ci0gICAgVmVjdG9yW10gZWRpdG9yc1tdPSBudWxsOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM0OC9UZXN0Mi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM0OC9UZXN0Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWZiOTE2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNDgvVGVzdDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDM0ODsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0MiB7Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3VtZW50cykgewotICAgIFZlY3RvcltdW10gZWRpdG9yc1tdPSBudWxsOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM0OS9UZXN0Mi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM0OS9UZXN0Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTVhNzE1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNDkvVGVzdDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDM0OTsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0MiB7Ci0JVmVjdG9yW11bXSBlZGl0b3JzW109IG51bGw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM1MC9UZXN0Mi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM1MC9UZXN0Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzhkMjBmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNTAvVGVzdDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDM1MDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0MiB7Ci0JVmVjdG9yIGVkaXRvcnNbXT0gbnVsbDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzUxL1Rlc3QyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzUxL1Rlc3QyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkY2RkNTMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM1MS9UZXN0Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wYWNrYWdlIHRlc3QwMzUxOwotCi1wdWJsaWMgY2xhc3MgVGVzdDIgewotCXZvaWQgbTEoaW50IGEsIGludFtdIGIpe30JCi0Jdm9pZCBtKGludCBhLCBpbnQgYltdKXt9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzUyL1Rlc3QyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzUyL1Rlc3QyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNjk4OTAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM1Mi9UZXN0Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wYWNrYWdlIHRlc3QwMzUyOwotCi1wdWJsaWMgY2xhc3MgVGVzdDIgewotCXZvaWQgbTEoZmluYWwgaW50IGEsIGZpbmFsIGludFtdIGIpe30JCi0Jdm9pZCBtKGZpbmFsIGludCBhLCBmaW5hbCBpbnQgYltdKXt9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzUzL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNTMvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGJlMGMxLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNTMvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDM1MzsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBUZXN0IHsKLSAgICAgICAgdm9pZCBmb28oKSB7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpOwotICAgICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM1NC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzU0L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMxM2QyOC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzU0L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLXBhY2thZ2UgdGVzdDAzNTQ7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQotCXByb3RlY3RlZCB2b2lkIHByaW1FeGVjdXRlKCkgewotCQl0aGlzLnRvU3RyaW5nKCk7Ci0JfQotCi0JaWYgKGltYWdlICE9IG51bGwpIHsKLQkJT2JqZWN0IGxvYyA9IG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNTUvRm9vLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzU1L0Zvby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2JlNDk3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNTUvRm9vLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMzU1OwotCi1wdWJsaWMgY2xhc3MgRm9vIHsKLQlwdWJsaWMgT2JqZWN0IGJhcigpIHsKLQkJaWYgKCAoKE9iamVjdCludWxsKS50b1N0cmluZygpID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gKE9iamVjdCludWxsOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNTYvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM1Ni9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZTA1YTIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM1Ni9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAzNTY7Ci0KLXB1YmxpYyBjbGFzcyBBIHsKLQkKLX0KLQotY2xhc3MgQWN0aW9uRmFjdG9yeSB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM1Ni9YLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzU2L1guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAzNjNiZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzU2L1guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDM1NjsKLQotcHVibGljIGNsYXNzIFggewotCXB1YmxpYyB2b2lkIGZvbygpIHsKLQkJQWN0aW9uRmFjdG9yeSBhZj1uZXcgTXlBY3Rpb25GYWN0b3J5KCk7CQkKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzU3L0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNTcvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzQxMGI1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNTcvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wYWNrYWdlIHRlc3QwMzU3OwotY2xhc3MgQXsKLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNTgvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM1OC9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZTA4MDMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM1OC9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAzNTg7Ci0KLWNsYXNzIEEgewotCXB1YmxpYyB2b2lkIG1kZChpbnQgeSl7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNTkvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM1OS9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxODAwYzEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM1OS9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAzNTk7Ci0KLWNsYXNzIEEgewotCXB1YmxpYyB2b2lkIG1kZChpbnQgeSkgdGhyb3dzIEV4Y2VwdGlvbnsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM2MC9YLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzYwL1guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIwMjA2NC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzYwL1guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDM2MDsKLQotcHVibGljIGNsYXNzIFggewotCXB1YmxpYyB2b2lkIGZvbygpIHsKLQkJZm9yIChpbnQgaT0wLCBqPTAsIGs9MDsgaTwxMCA7IGkrKyxqKyssaysrKSB7Ci0gIAkJCVN5c3RlbS5vdXQucHJpbnRsbigiTCIpOwotCSAgCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM2MS9YLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzYxL1guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcxYWU2OS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzYxL1guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDM2MTsKLQotcHVibGljIGNsYXNzIFggewotCXB1YmxpYyB2b2lkIGZvbygpIHsKLQkJZm9yIChpbnQgaT0wOyBpPDEwIDsgaSsrKSB7Ci0gIAkJCVN5c3RlbS5vdXQucHJpbnRsbigiTCIpOwotCSAgCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM2Mi9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzYyL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIxYTI0Mi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzYyL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDM2MjsKLS8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDIxOTE2ICovCi1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHZvaWQgZm9vKGludCBpKSB7Ci0JCWZvciAoaW50IGk9MCwgaj0wLCBrPTA7IGk8MTAgOyBpKyssIGorKywgaysrKSB7fQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNjMvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM2My9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMTNhMWQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM2My9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAzNjM7Ci0vKiBSZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAyMjkzOSAqLwotcHVibGljIGNsYXNzIEEgewotCXZvaWQgZigpewotCQlTdHJpbmcgeHh4eD0gInh4IjsKLQkJU3RyaW5nIHk9ICggeHh4eCApOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzY0L0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNjQvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTc3ZjI0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNjQvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1wYWNrYWdlIHRlc3QwMzY0OwotLyogUmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMTE1MjkgKi8KLXB1YmxpYyBjbGFzcyBBIHsKLQl2b2lkIHRoZU1ldGhvZCgpIHsKLQkJaW50IGxvY2FsOwotLyoJCWZvciAoaW50IGkgPSAwOyBpIDwgNTsgKytpKSB7Ci0JCX0qLwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzY1L0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNjUvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWRhOTdkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNjUvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1wYWNrYWdlIHRlc3QwMzY1Ci07Ci0vKiBSZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAxMTUyOSAqLwotcHVibGljIGNsYXNzIEEgewotCXZvaWQgdGhlTWV0aG9kKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgewotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNjYvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM2Ni9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YmYwMjUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM2Ni9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAzNjY7Ci0KLS8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDIzMDQ4ICovCi0KLXB1YmxpYyBjbGFzcyBBIHsKLQl2b2lkIHRoZU1ldGhvZCgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzY3L0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNjcvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGJlNzI1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNjcvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1wYWNrYWdlIHRlc3QwMzY3OwotCi0vKiBSZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAyMzA0OCAqLwotCi1wdWJsaWMgY2xhc3MgQSB7Ci0Jdm9pZCB0aGVNZXRob2QoaW50IGkpIHsKLQkJd2hpbGUoaSA9PSAyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM2OC9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzY4L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNmYzIxZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzY4L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDM2ODsKLQotLyogUmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMjMwNDggKi8KLQotcHVibGljIGNsYXNzIEEgewotCXZvaWQgZm9vKCkgewotCQl0ZXN0OjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM2OS9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzY5L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU2YTQxNy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzY5L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDM2OTsKLQotLyogUmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMjMwNDggKi8KLQotcHVibGljIGNsYXNzIEEgewotCXZvaWQgZm9vKCkgewotCQl0ZXN0Olx1MDAzQgotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzcwL1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNzAvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzViMWZiLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNzAvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMzcwOwotCi1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0JcHVibGljIHZvaWQgZm9vKCkgewotCQlkbyA7IHdoaWxlKHRydWUpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNzEvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM3MS9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMzE2NjAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM3MS9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAzNzE7Ci0KLS8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDIzMDQ4ICovCi0KLXB1YmxpYyBjbGFzcyBBIHsKLQl2b2lkIGZvbyhpbnQgaSkgewotCQlpZiAoaSA9PSA2KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM3Mi9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzcyL0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk3MzZhOS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzcyL0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDM3MjsKLQotLyogUmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMjMwNDggKi8KLQotcHVibGljIGNsYXNzIEEgewotCXZvaWQgZm9vKGludCBpKSB7Ci0JCWlmIChpID09IDYpIHt9IGVsc2UgOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzczL0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNzMvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzlhYWY5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNzMvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDM3MzsKLQotLyogUmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMjMxMTggKi8KLQotcHVibGljIGNsYXNzIEEgewotCXZvaWQgZm9vKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNzQvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM3NC9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MjM5M2MuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM3NC9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1wYWNrYWdlIHRlc3QwMzc0OwotCi0vKiBSZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAyMzExOCAqLwotCi1wdWJsaWMgY2xhc3MgQSB7Ci0Jdm9pZCBmb28oKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJY29udGludWU7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM3NS9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzc1L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIxMzAwZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzc1L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDM3NTsKLQotaW1wb3J0IHRlc3QwMzc1LkEuKjsKLQotLyogUmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMjMwNTIgKi8KLQotcHVibGljIGNsYXNzIEEgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzNzYvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM3Ni9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhOGFlYjUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM3Ni9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAzNzY7Ci0KLWNsYXNzIEEgewotCXZvaWQgZigpIHsKLQkJQSBhID0gKCBBICkgdGhpczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM3Ny9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzc3L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMzZGUzNi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzc3L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDM3NzsKLQotY2xhc3MgQSB7Ci0Jdm9pZCBmKCkgewotCQlmaW5hbCBpbnQgaTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM3OC9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzc4L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcyZDMxNi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzc4L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDM3ODsKLQotcHVibGljIGNsYXNzIEEgewotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQiB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGZvbygpIHsKLSAgICAgICAgfQkJCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM3OS9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzc5L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFjMzk3ZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzc5L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDAwNTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLXB1YmxpYyBjbGFzcyBUZXN0IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihuZXcgT2JqZWN0KCkge30pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzgwL0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzODAvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2E4MzJiLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzODAvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIHRlc3QwMzgwOwotCi1wdWJsaWMgY2xhc3MgQSB7Ci0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzODEvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM4MS9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyY2FkMDIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM4MS9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAzODE7Ci0KLXB1YmxpYyBjbGFzcyBBIHsKLQkvKiogTWV0aG9kIHRoZU1ldGhvZC4qLwotCXZvaWQgdGhlTWV0aG9kKCkgewotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzgyL0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzODIvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjJmMzk1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzODIvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMzgyOwotCi1wdWJsaWMgY2xhc3MgQSB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM4My9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzgzL0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UyYjgzNC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzgzL0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDM4MzsKLQotcHVibGljIGNsYXNzIEEgewotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQiB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGZvbygpIHsKLSAgICAgICAgfQkJCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM4NC9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzg0L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNmZGU1ZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzg0L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDM4NDsKLQotcHVibGljIGNsYXNzIEEgewotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQiB7Ci0gICAgICAgIHB1YmxpYyBjbGFzcyBEIHsKLSAgICAgICAgfQkJCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM4NS9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzg1L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc2NTcyYS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzg1L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSB0ZXN0MDM4NTsKLQotcHVibGljIGNsYXNzIEEgewotCi0JaW50IGdldENsYXNzKCkgewotCQlyZXR1cm4gMDsKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzg2L0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzODYvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTZlZjJmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzODYvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDM4NjsKLQotcHVibGljIGNsYXNzIEEgewotCi0Jdm9pZCBmb28oaW50IGkpIHsKLQkJc3dpdGNoKGkpIHsKLQkJCWNhc2UgMTogCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm47Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzg3L0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzODcvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGMyMDVjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzODcvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIHRlc3QwMzg3OwotCi1jbGFzcyBBIHsKLQl2b2lkIGYoKSB7Ci0JCUEgYSA9IChcdTAwMjBBXHUwMDIwKSB0aGlzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzg4L0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzODgvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTcyZDNjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzODgvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMzg4OwotCi1jbGFzcyBBIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzg5L0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzODkvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWQ4ZWI5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzODkvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wYWNrYWdlIHRlc3QwMzg5OwotCi1jbGFzcyBBIHsKLQljbGFzcyBCIHsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM5MC9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzkwL0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc3MzM0Ni4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzkwL0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDM5MDsKLQotY2xhc3MgQSB7Ci0JaW50IGZvbygpIHsKLQkJcmV0dXJuIDA7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzOTEvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM5MS9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhOGY1ZDguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM5MS9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAzOTE7Ci0KLWNsYXNzIEEgewotCWludFtdIGZvbygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzOTIvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM5Mi9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1OTBjYjEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM5Mi9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAzOTI7Ci0KLWNsYXNzIEEgewotCVN0cmluZ1tdIGZvbygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzOTMvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM5My9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzM2YwZWUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM5My9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAzOTM7Ci0KLWNsYXNzIEEgewotCVN0cmluZyBmb28oKVtdIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzOTQvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM5NC9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMDljN2MuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM5NC9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAzOTQ7Ci0KLWNsYXNzIEEgewotCVN0cmluZyBmb28oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzk1L0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzOTUvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWM1NTI1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzOTUvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIHRlc3QwMzk1OwotCi1jbGFzcyBBIHsKLQlTdHJpbmdbXSBmb28oKVtdIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzOTYvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM5Ni9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MTRmZjUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM5Ni9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAzOTY7Ci0KLXB1YmxpYyBjbGFzcyBBIHsKLQlwdWJsaWMgdm9pZCBmb28oZmluYWwgU3RyaW5nIHNbXSkgewotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzOTcvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM5Ny9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMDViNmIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM5Ny9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDAzOTc7Ci0KLXB1YmxpYyBjbGFzcyBBIHsKLQlwdWJsaWMgdm9pZCBmb28oZmluYWwgU3RyaW5nW10gXHUwMDczXHUwMDVCXVtdKSB7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDM5OC9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzk4L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdjNTY1YS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzk4L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDM5NzsKLQotcHVibGljIGNsYXNzIEEgewotCXB1YmxpYyB2b2lkIGZvbygpIHsKLSAgICAgICAgaW50IGk9ICgxICsgMikgKiAzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwMzk5L0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzOTkvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjEwOTA0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDAzOTkvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIHRlc3QwMzk5OwotCi1wdWJsaWMgY2xhc3MgQSB7Ci0JcHVibGljIEEoKSB7Ci0gICAJCWludCBpOwotICAgCQlpbnQgazsKLSAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDAwL0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MDAvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWE1YTZjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MDAvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDQwMDsKLQotcHVibGljIGNsYXNzIEEgewotCXB1YmxpYyBBKCkgewotICAgCQlzdXBlcigpOwotICAgCQlpbnQgaTsKLSAgIAkJaW50IGs7Ci0KLSAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDAxL0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MDEvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmExOTNhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MDEvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIHRlc3QwNDAxOwotCi1wdWJsaWMgY2xhc3MgQSB7Ci0JY29ycmVjdFRoaXMoKSB7Ci0JICAgIHJldHVybiAxOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDAyL0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MDIvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTM5NWNjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MDIvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDQwMjsKLQotY2xhc3MgQXsKLQljbGFzcyBJbm5lcnsKLQkJSW5uZXIoKXsKLQkJfQotCX0KLX0KLQotY2xhc3MgSTIgZXh0ZW5kcyBBLklubmVyewotCUkyKCl7Ci0JCW5ldyBBKCkuc3VwZXIoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQwMy9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDAzL0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE5ZjZlYi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDAzL0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLXBhY2thZ2UgdGVzdDA0MDM7Ci0KLWNsYXNzIFRlc3QgewotCXB1YmxpYyB2b2lkIGZvbygpe307Ci19Ci0KLXB1YmxpYyBjbGFzcyBBIHsKLQl2b2lkIHRlc3QxKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKLQkJVGVzdCB0ZXN0ID0gbmV3IFRlc3QoKTsKLQkJdGVzdC5jbG9uZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDA0L0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MDQvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGZkMTRkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MDQvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIHRlc3QwNDA0OwotCi1jbGFzcyBBewotICB2b2lkIGYoKSB7Ci0gICAgIEEgYT0gbmV3IEEoKTsKLSAgICAgYS5jbG9uZSgpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQwNS9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDA1L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMzMzRkZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDA1L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLXBhY2thZ2UgdGVzdDA0MDU7Ci0KLWNsYXNzIEEgewotCXB1YmxpYyB2b2lkIGZvbygpIHsKLQl9Ci19Ci0KLWNsYXNzIFRlc3QgewotCXZvaWQgdGVzdCgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7Ci0JCUEgYSA9IG5ldyBBKCk7Ci0JCWEuY2xvbmUoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQwNi9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDA2L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFhYzVlNi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDA2L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXBhY2thZ2UgdGVzdDA0MDY7Ci0KLWltcG9ydCB0ZXN0MDQwNl9hLkE7Ci0KLWNsYXNzIFRlc3QgewotCXZvaWQgdGVzdCgpIHsKLQkJQSBhID0gbmV3IEEoKTsKLQkJYS5mb28oIiIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDA2X2EvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQwNl9hL0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNiMmRmNS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDA2X2EvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wYWNrYWdlIHRlc3QwNDA2X2E7Ci0KLXB1YmxpYyBjbGFzcyBBIHsKLQlwcm90ZWN0ZWQgQSBmb28oU3RyaW5nIHMpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDA3L0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MDcvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjc3YjEzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MDcvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1wYWNrYWdlIHRlc3QwNDA3OwotCi1wdWJsaWMgY2xhc3MgQSB7Ci0Jdm9pZCBmb28oKSB7Ci0JfQotCXZvaWQgYmFyKCkgewotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MDgvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQwOC9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZmMyYzguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQwOC9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDA0MDg7Ci0KLXB1YmxpYyBjbGFzcyBBIHsKLQlqYXZhLmxhbmcuT2JqZWN0IGZvbygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MDkvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQwOS9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1N2JkOGUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQwOS9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi1wYWNrYWdlIHRlc3QwNDA5OwotCi1pbXBvcnQgamF2YS5sYW5nLio7Ci1pbXBvcnQgamF2YS5sYW5nLk9iamVjdDsKLQotY2xhc3MgU3VwZXIgZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0IHsKLQlpbnQgazsKLQkKLQlpbnQgZm9vMigpIHsKLQkJcmV0dXJuIDA7Ci0JfQotfQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQSBleHRlbmRzIFN1cGVyIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGkgPSAwOwotCi0JewotCQlpbnQgajsKLQl9Ci0JCi0JaW50W10gZm9vKGZsb2F0IGYpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnQgZiA+IDAgOiAiaXQgd29ya3MiOwotCQl7Ci0JCX0KLQkJdGVzdDogZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQlpZiAoZiA+IDApIHsKLQkJCQlicmVhayB0ZXN0OwotCQkJfSBlbHNlIHsKLQkJCQljb250aW51ZSB0ZXN0OwotCQkJfQotCQl9Ci0JCU9iamVjdCBvID0gbmV3IE9iamVjdCgpOwotCQlkbyB7Ci0JCQlvID0gbnVsbDsKLQkJfSB3aGlsZSAobyAhPSBudWxsKTsKLQkJOwotCQlpZiAobyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCk7Ci0JCX0KLQkJaW50IGogPSA5OwotCQlzd2l0Y2goaikgewotCQkJY2FzZSA0IDoKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOiAKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzeW5jaHJvbml6ZWQobykgewotCQl9Ci0JCXRyeSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJfSBjYXRjaChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlqID0gKGludCkgJ2MnOwotCQl9Ci0JCXdoaWxlIChqID4gMCkgewotCQkJLS1qOwotCQl9Ci0JCWludFtdIHRhYiA9IHsgMSwgMiwgMywgNH07Ci0JCWogPSB0YWJbM107Ci0JCWJvb2xlYW4gYiA9ICh0cnVlICYmIGZhbHNlKTsKLQkJCi0JCWogPSBvIGluc3RhbmNlb2YgT2JqZWN0ID8gNCA6IDUgKyA5OwotCQkKLQkJaiA9IGs7Ci0JCQotCQlqID0gZm9vMigpOwotCQkKLQkJbyA9IHRoaXMuYmFyKCk7Ci0JCQotCQlvID0gQS5jbGFzczsKLQkJCi0JCXJldHVybiBuZXcgaW50W10ge307Ci0JfQotCi0JT2JqZWN0IGJhcigpIHsKLQkJY2xhc3MgQyB7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDKCkge307Ci0JfQotCQkKLQlBKCkgewotCQl0aGlzKDApOwotCX0KLQkKLQlBKGludCBpKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCWNsYXNzIEIgewotCX0KLX0JClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQxMC9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDEwL0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU5ZmVjZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDEwL0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDQxMDsKLQotcHVibGljIGNsYXNzIEEgewotCWludCBmb28oKSB7Ci0JCXJldHVybiAxICsgMiArIDMgKyA0ICsgMzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQxMS9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDExL0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ViZWExZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDExL0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLXBhY2thZ2UgdGVzdDA0MTE7Ci0KLXB1YmxpYyBjbGFzcyBBIHsKLQkKLQlpbnQgYmFyKGludCBhLCBpbnQgYikgewotCQlyZXR1cm4gYSpiICsgMiArIGZvbygpOwotCX0KLQkKLQlpbnQgZm9vKCkgewotCQlyZXR1cm4gMDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQxMi9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDEyL0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YzZDlhOS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDEyL0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDQxMjsKLQotaW50ZXJmYWNlIEEgewotCXZvaWQgbSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MTMvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQxMy9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0N2MxN2MuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQxMy9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDA0MTM7Ci0KLWNsYXNzIEUgZXh0ZW5kcyBFeGNlcHRpb24gewotfQotCi1pbnRlcmZhY2UgQSB7Ci0Jdm9pZCBtKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBFOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MTQvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQxNC9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NWI0ZGUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQxNC9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1wYWNrYWdlIHRlc3QwNDE0OwotCi1wdWJsaWMgY2xhc3MgQSB7Ci0JQiBmb28oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUEgYmFyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQxNC9CLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDE0L0IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThiZGFjNS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDE0L0IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDQxNDsKLQotY2xhc3MgQiB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQxNS9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDE1L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUwNDJkOC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDE1L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLXBhY2thZ2UgdGVzdDA0MTU7Ci0KLXB1YmxpYyBjbGFzcyBBIHsKLQlwdWJsaWMgdm9pZCBmb28oaW50IGkpIHsKLQkJc3dpdGNoKGkpIHsKLQkJCWNhc2UgMjogCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MTYvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQxNi9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYTVkODQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQxNi9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1wYWNrYWdlIHRlc3QwNDE2OwotCi1pbnRlcmZhY2UgSSB7Ci0gICAgaW50IENPTlNUPSAxOwotfQotCi1wdWJsaWMgY2xhc3MgQSB7Ci0gIHZvaWQgZm9vKCkgewotICAgIGludCB4PSBJLkNPTlNUOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQxNy9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDE3L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEzMmY3Yi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDE3L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDQxNzsKLQotcHVibGljIGNsYXNzIEEgewotICB2b2lkIGZvbygpIHsKLSAgICBBLk5ld0NsYXNzIGM7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDE4L0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MTgvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWUwZGJkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MTgvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDQxODsKLQotcHVibGljIGNsYXNzIEEgewotICBwcml2YXRlIHZvaWQgZm9vKCkgewotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyB2b2lkIGdvbygpIHsKLSAgCWZvbygpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQxOS9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDE5L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE0MDkwYS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDE5L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXBhY2thZ2UgdGVzdDA0MTk7Ci0KLWNsYXNzIEMgewotICBwcml2YXRlIGludCBmQ29vOwotfQotCi1wdWJsaWMgY2xhc3MgQSB7Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCBnb28oQyBjKSB7Ci0gICAgZkNvbz0gMTsKLS8qICAgIHN1cGVyLmZDb289IDE7Ci0gICAgQy5mQ29vPSAxOwotICAgIGMuZkNvbz0gMTsqLwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQyMC9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDIwL0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY1ZGM5My4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDIwL0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDQyMDsKLQotcHVibGljIGNsYXNzIEF7Ci0gICAgdm9pZCBmKCl7Ci0gICAgICAgIGludCBpPSAxICsgKDIgKyAzKSArIDQ7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MjEvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQyMS9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYzc3ODkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQyMS9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDA0MjE7Ci0KLXB1YmxpYyBjbGFzcyBBewotICAgIHZvaWQgZigpewotICAgICAgICBpbnQgaT0gKDEgKyAyKSArIDM7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MjIvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQyMi9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNTQ0ZmYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQyMi9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDA0MjI7Ci0KLXB1YmxpYyBjbGFzcyBBewotICAgIHZvaWQgZigpewotICAgICAgICBpbnQgaT0gKCAxICsgMiApICsgMzsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQyMy9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDIzL0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMwODdmOC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDIzL0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDQyMzsKLQotcHVibGljIGNsYXNzIEF7Ci0gICAgdm9pZCBmKCl7Ci0gICAgICAgIGludCBpPSAxICsgKCAyICsgMyApICsgNDsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQyNC9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDI0L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ4MDBlYTFiLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MjQvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIHRlc3QwNDI0OwotCi1wdWJsaWMgY2xhc3MgQXsKLSAgICB2b2lkIGYoKXsKLSAgICAgICAgaW50IGk9IDEgKyA0ICsgKCAyICsgMyApOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDI1L0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MjUvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWMwYjY5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MjUvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIHRlc3QwNDI1OwotCi1wdWJsaWMgY2xhc3MgQXsKLSAgICB2b2lkIGYoKXsKLSAgICAgICAgaW50IGk9IDEgKyA0ICogKCAyICsgMyApOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDI2L0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MjYvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjkxNDQ5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MjYvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDQyNjsKLQotY2xhc3MgQyB7Ci0gIHByaXZhdGUgY2xhc3MgQ0lubmVyIHsKLSAgfQotfQotCi1wdWJsaWMgY2xhc3MgQSBleHRlbmRzIEMgewotICBwdWJsaWMgc3RhdGljIHZvaWQgZ29vKCkgewotICAgIENJbm5lciBjOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQyNy9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDI3L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNlZDgxZi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDI3L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLXBhY2thZ2UgdGVzdDA0Mjc7Ci0KLWNsYXNzIEMgewotICBwcml2YXRlIGludCBmQ29vOwotfQotCi1wdWJsaWMgY2xhc3MgQSBleHRlbmRzIEMgewotICBwdWJsaWMgc3RhdGljIHZvaWQgZ29vKEMgYykgewotICAgIHN1cGVyLmZDb289IDE7Ci0vKiAgICBDLmZDb289IDE7Ci0gICAgYy5mQ29vPSAxOyovCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDI4L0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MjgvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODMyNWY4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MjgvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDQyODsKLQotY2xhc3MgQyB7Ci0gIHByaXZhdGUgaW50IGZDb287Ci19Ci0KLXB1YmxpYyBjbGFzcyBBIGV4dGVuZHMgQyB7Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCBnb28oQyBjKSB7Ci0gICAgQy5mQ29vPSAxOwotLy8gICAgYy5mQ29vPSAxOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQyOS9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDI5L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YzYTYwMy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDI5L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXBhY2thZ2UgdGVzdDA0Mjk7Ci0KLWNsYXNzIEMgewotICBwcml2YXRlIGludCBmQ29vOwotfQotCi1wdWJsaWMgY2xhc3MgQSBleHRlbmRzIEMgewotICBwdWJsaWMgc3RhdGljIHZvaWQgZ29vKEMgYykgewotICAgIGMuZkNvbz0gMTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MzAvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQzMC9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NDUyMjMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQzMC9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1wYWNrYWdlIHRlc3QwNDMwOwotCi1wdWJsaWMgY2xhc3MgQSB7Ci0JcHJpdmF0ZSBBKCkgewotCQl0aGlzKGNvbzIoKSk7Ci0JfQotCQotCXByaXZhdGUgQShpbnQgaSkgewotCX0KLQotCXByaXZhdGUgaW50IGNvbzIoKSB7Ci0JCXJldHVybiA3OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDMxL0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MzEvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjg2YjhkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MzEvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDQzMTsKLQotcHVibGljIGNsYXNzIEEgewotCXByaXZhdGUgQSgpIHsKLQkJdGhpcyhmQ29vKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBKGludCBpKSB7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZkNvbz0gODsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDMyL0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MzIvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzE2ZTJhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MzIvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDQzMjsKLQotY2xhc3MgQyB7Ci0gIHByaXZhdGUgaW50IGZDb287Ci19Ci0KLXB1YmxpYyBjbGFzcyBBIGV4dGVuZHMgQyB7Ci0gIHB1YmxpYyB2b2lkIGdvbyhDIGMpIHsKLSAgICBmQ29vPSAxOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQzMy9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDMzL0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE1MzJjMy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDMzL0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXBhY2thZ2UgdGVzdDA0MzM7Ci0KLWNsYXNzIEMgewotICBwcml2YXRlIGludCBmQ29vOwotfQotCi1wdWJsaWMgY2xhc3MgQSBleHRlbmRzIEMgewotICBwdWJsaWMgdm9pZCBnb28oQyBjKSB7Ci0gICAgc3VwZXIuZkNvbz0gMTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MzQvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQzNC9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYThjYTMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQzNC9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1wYWNrYWdlIHRlc3QwNDM0OwotCi1jbGFzcyBDIHsKLSAgcHJpdmF0ZSBpbnQgZkNvbzsKLX0KLQotcHVibGljIGNsYXNzIEEgZXh0ZW5kcyBDIHsKLSAgcHVibGljIHZvaWQgZ29vKEMgYykgewotICAgIEMuZkNvbz0gMTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MzUvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQzNS9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMmFiMmUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQzNS9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1wYWNrYWdlIHRlc3QwNDM1OwotCi1jbGFzcyBDIHsKLSAgcHJpdmF0ZSBpbnQgZkNvbzsKLX0KLQotcHVibGljIGNsYXNzIEEgZXh0ZW5kcyBDIHsKLSAgcHVibGljIHZvaWQgZ29vKEMgYykgewotICAgIGMuZkNvbz0gMTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MzYvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQzNi9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NWJiYjcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQzNi9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1wYWNrYWdlIHRlc3QwNDM2OwotCi1jbGFzcyBBIHsKLSAgcHJpdmF0ZSBjbGFzcyBDSW5uZXIgewotICB9Ci19Ci0KLXB1YmxpYyBjbGFzcyBEIGV4dGVuZHMgQSB7Ci0gIHB1YmxpYyB2b2lkIGdvbygpIHsKLSAgICBBLkNJbm5lciBhOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQzNy9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDM3L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ2YjNhMi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDM3L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLXBhY2thZ2UgdGVzdDA0Mzc7Ci0KLWNsYXNzIEEgewotICBwcml2YXRlIGNsYXNzIENJbm5lciB7Ci0gIH0KLX0KLQotcHVibGljIGNsYXNzIEQgZXh0ZW5kcyBBIHsKLSAgcHVibGljIHZvaWQgZ29vKCkgewotICAgIENJbm5lciBhOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQzOC9ELmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDM4L0QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRhZWNiZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDM4L0QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDQzODsKLQotaW1wb3J0IHRlc3QwNDM4X2EuVzsKLQotY2xhc3MgRCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQzOF9hL1cuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MzhfYS9XLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NjZiZWUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQzOF9hL1cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDQzOF9hOwotCi1jbGFzcyBXIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDM5L0MuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MzkvQy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDRjZjU4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MzkvQy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wYWNrYWdlIHRlc3QwNDM5OwotCi1wdWJsaWMgY2xhc3MgQyB7Ci0gICAgcHJpdmF0ZSBjbGFzcyBDSW5uZXIgewotICAgIH0JCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0MzkvRS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQzOS9FLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNzkzYWIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQzOS9FLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDA0Mzk7Ci0KLXB1YmxpYyBjbGFzcyBFIGV4dGVuZHMgQyB7Ci0gICAgcHVibGljIHZvaWQgZm9vKCkgewotICAgICAgICAgQ0lubmVyIGM9IG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQ0MC9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDQwL0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY1M2Y2ZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDQwL0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDQ0MDsKLQotcHVibGljIGNsYXNzIEEgewotICAgIHZvaWQgdGVzdCgpIHsKLSAgICAgICAgU3RyaW5nIGk9IDIgKiAzICsgIiIgKyAodHJ1ZSk7Ci0gICAgfSAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQ0MS9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDQxL0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2MjlhYS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDQxL0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDQ0MTsKLQotcHVibGljIGNsYXNzIEEgewotICAgIHZvaWQgdGVzdCgpIHsKLSAgICAgICAgaW50IGk9ICgyICsgMikgKiAzICogMTsKLSAgICB9ICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDQyL0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0NDIvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzA5NGY2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0NDIvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIHRlc3QwNDQyOwotCi1wdWJsaWMgY2xhc3MgQSB7Ci0gICAgdm9pZCB0ZXN0KCkgewotICAgICAgICBpbnQgaT0gMiArICgyICogMykgKyAxOwotICAgIH0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0NDMvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQ0My9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MGM2MzUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQ0My9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDA0NDM7Ci0KLXB1YmxpYyBjbGFzcyBBIHsKLSAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGZvbygpIHsKLSAgIAkJcmV0dXJuOwotICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0NDQvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQ0NC9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MGIzYmQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQ0NC9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1wYWNrYWdlIHRlc3QwNDQ0OwotCi1wdWJsaWMgY2xhc3MgQSB7Ci0gICBwdWJsaWMgdm9pZCBmb28oKSB7Ci0gICAJCXJldHVybjsKLSAgIH0KLQotICAgcHVibGljIHZvaWQgZm9vKCkgewotICAgCQlyZXR1cm47Ci0gICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQ0NS9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDQ1L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVkODJmZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDQ1L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXBhY2thZ2UgdGVzdDA0NDU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCQotcHVibGljIGNsYXNzIEEgewotICAgIHB1YmxpYyB2b2lkIGdvbygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgfQkJCi0gICAgcHVibGljIHZvaWQgZm9vKCkgewotICAgICAgICBnb28oKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQ0Ni9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDQ2L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVmMGY4Yy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDQ2L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDQ0NjsKLQotcHVibGljIGNsYXNzIEEgewotCXZvaWQgZm9vYigpIHsKLQkJaW50IGIgPSBiOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDQ3L0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0NDcvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTEzYzQxLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0NDcvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDQ0NzsKLQotcHVibGljIGNsYXNzIEEgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb2xsZWN0Q29ycmVjdGlvbnMoKSB7Ci0JCXByb2Nlc3NvcnM9IG51bGw7Ci0JfQkJCi0JCXRyeSB7Ci0JCQlpbnQgaWQ9IDI7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0NDgvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQ0OC9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZTU3ZGMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQ0OC9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXBhY2thZ2UgdGVzdDA0NDg7Ci0KLXB1YmxpYyBjbGFzcyBBIHsKLQlBKCkgewotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDQ5L0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0NDkvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDE0MDQzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0NDkvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIHRlc3QwNDQ5OwotCi1wdWJsaWMgY2xhc3MgQSB7Ci0JQSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQ1MC9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDUwL0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ2M2U1YS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDUwL0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLXBhY2thZ2UgdGVzdDA0NTA7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBIHsKLQkKLQl2b2lkIG91dGVyTWV0aG9kKCkgewotCQkKLQkJbmV3IE9iamVjdCgpIHsKLQkJCQotCQkJY2xhc3MgU3Vicm91dGluZSB7Ci0JCQkJY2xhc3MgQiB7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlwcml2YXRlIHZvaWQgaW5uZXJNZXRob2QoKSB7Ci0JCQkJY2xhc3MgQiB7Ci0JCQkJfQotCQkJCVN1YnJvdXRpbmUgc3ViID0gbnVsbDsKLQkJCX0KLQkJCQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0NTEvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQ1MS9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZThhNWIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQ1MS9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXBhY2thZ2UgdGVzdDA0NTE7Ci0KLXB1YmxpYyBjbGFzcyBBIHsKLQlwcml2YXRlIGludCBBKClbXXsKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDUzL0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0NTMvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWJiZTYzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0NTMvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIHRlc3QwNDUzOwotCi1wdWJsaWMgY2xhc3MgQSB7Ci0JcHVibGljIFN0cmluZyBmb28oKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0NTQvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQ1NC9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZTA3MTcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQ1NC9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wYWNrYWdlIHRlc3QwNDU0OwotCi1wdWJsaWMgY2xhc3MgQSB7Ci0KLQlwdWJsaWMgQSgpIHsKLQkJaW50IGE9IDI7Ci0JCWludCBiPSAoaW50KSAoMy4xNGYgKiBhKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDU1L0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0NTUvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODljZGJmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0NTUvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDQ1NTsKLQotcHVibGljIGNsYXNzIEEgewotCi0JcHVibGljIHZvaWQgZm9vKCkgewotCSAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgIC8vIGZvciAxCi0JICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEwOyBqKyspICAvLyBmb3IgMgotCSAgICAgICAgICAgIGlmICh0cnVlKSB7IH0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQ1Ni9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDU2L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2MWIwZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDU2L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLXBhY2thZ2UgdGVzdDA0NTY7Ci0KLXB1YmxpYyBjbGFzcyBBIHsKLQlwdWJsaWMgdm9pZCBtYWluKCkgewotCQlmb3IgKGludCB4PSAxMDsgeCA8IDIwOyB4KyspCi0JCQltYWluKCk7Ci0JCS8qXSovZm9vKDEwKTsvKlsqLwotCX0KLQkKLQlwdWJsaWMgdm9pZCBmb28oaW50IHgpIHsKLQkJeD0gMjA7Ci0JCWJhcih4KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYmFyKGludCB6KSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQ1Ny9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDU3L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhkYmM0OC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDU3L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXBhY2thZ2UgdGVzdDA0NTc7Ci0KLXB1YmxpYyBjbGFzcyBBIHsKLQlwdWJsaWMgdm9pZCBmb28oKSB7Ci0JCWZvciAoaW50IGk9IDEwOyBpIDwgMTA7IGkrKykvKlsqLwotCQkJZm9yIChpbnQgej0gMTA7IHogPCAxMDsgeisrKQotCQkJCWZvbygpOwotCQkvKl0qL2ZvbygpOwkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQ1OC9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDU4L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ5OTdiMy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDU4L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXBhY2thZ2UgdGVzdDA0NTg7Ci0KLXB1YmxpYyBjbGFzcyBBIHsKLQlwdWJsaWMgdm9pZCBmb28oKSB7Ci0JCWZvciAoaW50IGk9IDEwOyBpIDwgMTA7IGkrKykvKlsqLwotCQkJZm9yIChpbnQgej0gMTA7IHogPCAxMDsgeisrKQotCQkJCTsKLQkJLypdKi9mb28oKTsJCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0NTkvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQ1OS9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0Y2M1ZmIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQ1OS9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wYWNrYWdlIHRlc3QwNDU5OwotCi1wdWJsaWMgY2xhc3MgQSB7Ci0JcHVibGljIHZvaWQgZm9vKCkgewotCQlmb3IgKGludCBpPSAxMDsgaSA8IDEwOyBpKyspLypbKi8KLQkJCWZvciAoaW50IHo9IDEwOyB6IDwgMTA7IHorKykKLQkJCQl7ICAgIH0KLQkJLypdKi9mb28oKTsJCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0NjAvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQ2MC9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYjQ2ZjEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQ2MC9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXBhY2thZ2UgdGVzdDA0NjA7Ci0KLXB1YmxpYyBjbGFzcyBBIHsKLQlwdWJsaWMgdm9pZCBmb28oKSB7Ci0JCWZpbmFsIGludCBiYXI7Ci0KLQkJYmFyID0gMTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQ2MS9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDYxL0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI0OTVlZi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDYxL0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDQ2MTsKLQotcHVibGljIGNsYXNzIEEgewotICAgIHB1YmxpYyB2b2lkIGZvbygpIHsKLSAgICAgICAgej0gZm9vKCkueS50b0xpc3QoKTsKLSAgICB9Ci19CQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQ2My9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDYzL0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNlMWMyYS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDYzL0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDQ2MzsKLQotcHVibGljIGNsYXNzIEEgewotICAgIHB1YmxpYyBTdHJpbmcgZm9vKCkgewotICAgICAgICByZXR1cm4gIlwwMTJcMDE1XHUwMDYxIjsKLSAgICB9Ci19CQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQ2NC9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDY0L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM3N2Y1Yy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDY0L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDQ2NDsKLQotcHVibGljIGNsYXNzIEEgewotCi0JcHVibGljIHN0YXRpYyBpbnQgZm9vKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDY1L0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0NjUvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTQ0ZWNlLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0NjUvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDQ2NTsKLQotcHVibGljIGNsYXNzIEEgewotCi0JaW50IGk7Ci0JCi0JcHVibGljIGludCBmb28oKSB7Ci0JCXJldHVybiB0aGlzLmk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQ2Ni9Bc3NlcnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0NjYvQXNzZXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMWUyNDkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQ2Ni9Bc3NlcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLXBhY2thZ2UgdGVzdDA0NjY7Ci0KLXB1YmxpYyBjbGFzcyBBc3NlcnQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBub3ROdWxsKE9iamVjdCByZWYsIFN0cmluZyBtZXNzYWdlKQotCXsKLQkJYXNzZXJ0IHJlZiAhPSBudWxsIDogbWVzc2FnZTsKLQl9Ci0JCi0Jdm9pZCBtZXRob2QoU3RyaW5nIHBhcmFtMSwgU3RyaW5nIHBhcmFtMiwgU3RyaW5nIHBhcmFtMykKLQl7Ci0JCUFzc2VydC5ub3ROdWxsKHBhcmFtMSwgInBhcmFtMSAhPSBudWxsIik7Ci0JCUFzc2VydC5ub3ROdWxsKHBhcmFtMiwgInBhcmFtMiAhPSBudWxsIik7Ci0JCUFzc2VydC5ub3ROdWxsKHBhcmFtMywgInBhcmFtMyAhPSBudWxsIik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0NjcvQXNzZXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDY3L0Fzc2VydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTMxYWI2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0NjcvQXNzZXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1wYWNrYWdlIHRlc3QwNDY3OwotCi1wdWJsaWMgY2xhc3MgQXNzZXJ0IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgbm90TnVsbChPYmplY3QgcmVmLCBTdHJpbmcgbWVzc2FnZSkKLQl7Ci0JCWFzc2VydCByZWYgIT0gbnVsbCA6IG1lc3NhZ2VcdTAwM0IKLQkJYXNzZXJ0IHJlZiAhPSBudWxsXHUwMDNCCi0JfQotCQotCXZvaWQgbWV0aG9kKFN0cmluZyBwYXJhbTEsIFN0cmluZyBwYXJhbTIsIFN0cmluZyBwYXJhbTMpCi0JewotCQlBc3NlcnQubm90TnVsbChwYXJhbTEsICJwYXJhbTEgIT0gbnVsbCIpOwotCQlBc3NlcnQubm90TnVsbChwYXJhbTIsICJwYXJhbTIgIT0gbnVsbCIpOwotCQlBc3NlcnQubm90TnVsbChwYXJhbTMsICJwYXJhbTMgIT0gbnVsbCIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDY4L0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0NjgvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTdiZWQ4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9Db252ZXJ0ZXIvdGVzdDA0NjgvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotcGFja2FnZSB0ZXN0MDQ2ODsKLQotcHVibGljIGNsYXNzIEEgewotCi0JaW50IGk7Ci0JCi0JcHVibGljIGludCBmb28oKSB7Ci0JCXJldHVybiB0aGlzLmk7Ci0JfQotCi0JcHVibGljIHZvaWQgYmFyKCkgewotCQlmb28oKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NvbnZlcnRlci90ZXN0MDQ3MC9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDcwL0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVjYTg3My4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ29udmVydGVyL3Rlc3QwNDcwL0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLXBhY2thZ2UgdGVzdDA0NzA7Ci0KLXB1YmxpYyBjbGFzcyBBIHsKLQotCXB1YmxpYyB2b2lkIGZvbygpIHsKLQkJZm9yIChpbnQgaT0gMCwgaj0gZ29vKDMpOyBpIDwgMDsgaSsrKSB7Ci0JCX0JCQotCX0KLQkKLQlpbnQgZ29vKGludCBpKSB7Ci0JCXJldHVybiAwOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ3JlYXRlTWVtYmVycy8uY2xhc3NwYXRoIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NyZWF0ZU1lbWJlcnMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDljYWJkZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ3JlYXRlTWVtYmVycy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJKQ0xfTElCIiBzb3VyY2VwYXRoPSJKQ0xfU1JDIiByb290cGF0aD0iSkNMX1NSQ1JPT1QiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0NyZWF0ZU1lbWJlcnMvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ3JlYXRlTWVtYmVycy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA1Y2U3My4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ3JlYXRlTWVtYmVycy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9DcmVhdGVNZW1iZXJzL3NyYy9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvQ3JlYXRlTWVtYmVycy9zcmMvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmMwMzg1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9DcmVhdGVNZW1iZXJzL3NyYy9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLXB1YmxpYyBjbGFzcyBBCi17fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhUHJvamVjdExpYlRlc3RzLy5jbGFzc3BhdGggYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVByb2plY3RMaWJUZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTU3Y2NmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhUHJvamVjdExpYlRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9ImxpYiIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVByb2plY3RMaWJUZXN0cy8ucHJvamVjdCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhUHJvamVjdExpYlRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWQ2NDM2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhUHJvamVjdExpYlRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+SmF2YVByb2plY3RMaWJUZXN0PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhUHJvamVjdExpYlRlc3RzL2xpYi9wL1kuY2xhc3MgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVByb2plY3RMaWJUZXN0cy9saWIvcC9ZLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjBlNjZmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhUHJvamVjdExpYlRlc3RzL2xpYi9wL1kuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVByb2plY3RTcmNUZXN0cy8uY2xhc3NwYXRoIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFQcm9qZWN0U3JjVGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDljYWJkZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVByb2plY3RTcmNUZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJKQ0xfTElCIiBzb3VyY2VwYXRoPSJKQ0xfU1JDIiByb290cGF0aD0iSkNMX1NSQ1JPT1QiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFQcm9qZWN0U3JjVGVzdHMvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVByb2plY3RTcmNUZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA1Y2U3My4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVByb2plY3RTcmNUZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhUHJvamVjdFNyY1Rlc3RzL3NyYy9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVByb2plY3RTcmNUZXN0cy9zcmMvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTg3ZmIyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhUHJvamVjdFNyY1Rlc3RzL3NyYy9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBBIHsKLQkKLQlwdWJsaWMgdm9pZCBmb28oKXsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFQcm9qZWN0VGVzdHMvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhUHJvamVjdFRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OGUxMTguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFQcm9qZWN0VGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iSkNMX0xJQiIgc291cmNlcGF0aD0iSkNMX1NSQyIgcm9vdHBhdGg9IkpDTF9TUkNST09UIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0ibGliLmphciIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVByb2plY3RUZXN0cy8ucHJvamVjdCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhUHJvamVjdFRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDVjZTczLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhUHJvamVjdFRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFQcm9qZWN0VGVzdHMvQi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFQcm9qZWN0VGVzdHMvQi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmJlNGRjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhUHJvamVjdFRlc3RzL0IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotcHVibGljIGNsYXNzIEIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhUHJvamVjdFRlc3RzL2Jpbi9kdW1teSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhUHJvamVjdFRlc3RzL2Jpbi9kdW1teQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVByb2plY3RUZXN0cy9iaW4vZHVtbXkKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFQcm9qZWN0VGVzdHMvbGliLmphciBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhUHJvamVjdFRlc3RzL2xpYi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYWFkZmQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFQcm9qZWN0VGVzdHMvbGliLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhUHJvamVjdFRlc3RzL3EvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFQcm9qZWN0VGVzdHMvcS9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ODdmYjIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFQcm9qZWN0VGVzdHMvcS9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBBIHsKLQkKLQlwdWJsaWMgdm9pZCBmb28oKXsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFQcm9qZWN0VGVzdHMvcS9yZWFkbWUudHh0IGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFQcm9qZWN0VGVzdHMvcS9yZWFkbWUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhUHJvamVjdFRlc3RzL3EvcmVhZG1lLnR4dAorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVByb2plY3RUZXN0cy94L3JlYWRtZS50eHQgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVByb2plY3RUZXN0cy94L3JlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFQcm9qZWN0VGVzdHMveC9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhUHJvamVjdFRlc3RzL3gvcmVhZG1lMi50eHQgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVByb2plY3RUZXN0cy94L3JlYWRtZTIudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhUHJvamVjdFRlc3RzL3gvcmVhZG1lMi50eHQKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFQcm9qZWN0VGVzdHMveC95L01haW4uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhUHJvamVjdFRlc3RzL3gveS9NYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNTkwMzYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFQcm9qZWN0VGVzdHMveC95L01haW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXBhY2thZ2UgeC55OwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0vKioKLSAqIEEgY2xhc3MgdGhhdCB1c2VzIHRoZSBtaW5pbWFsIGxpYnJhcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBNYWluIHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCW5ldyBNYWluKCkudG9TdHJpbmcoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMmFjODIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im90aGVyU3JjKCkiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJKQ0xfTElCIiBzb3VyY2VwYXRoPSJKQ0xfU1JDIiByb290cGF0aD0iSkNMX1NSQ1JPT1QiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJNeUphci5qYXIiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJ0ZXN0MjA2MzEuamFyIiBzb3VyY2VwYXRoPSIvSmF2YVNlYXJjaC90ZXN0MjA2MzEuemlwIiByb290cGF0aD0iIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0idGVzdDI0NzQxLmphciIgc291cmNlcGF0aD0iL0phdmFTZWFyY2gvdGVzdDI0NzQxLmphciIgcm9vdHBhdGg9IiIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC8ucHJvamVjdCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDVjZTczLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvQWJvcnRDb21waWxhdGlvbi5qYXIgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9BYm9ydENvbXBpbGF0aW9uLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ4MjdmOC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9BYm9ydENvbXBpbGF0aW9uLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL015SmFyLmphciBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL015SmFyLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIwN2M1MC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9NeUphci5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9Ob3RJbkNsYXNzcGF0aC9wL1kuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL05vdEluQ2xhc3NwYXRoL3AvWS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODIzYmM0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL05vdEluQ2xhc3NwYXRoL3AvWS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotcGFja2FnZSBwOwotcHVibGljIGNsYXNzIFkgZXh0ZW5kcyBYIHsKLQlwdWJsaWMgWSgpIHsKLQl9Ci0JcHVibGljIFkoaW50IGkpIHsKLQkJc3VwZXIoaSk7Ci0JfQotCXB1YmxpYyBZKGJvb2xlYW4gYikgewotCQlzdXBlcigxKTsKLSAJfQotCXB1YmxpYyBzdGF0aWMgdm9pZCBiYXIoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0ICJhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL290aGVyU3JjXDA1MFwwNTEvWDMxOTk3LmphdmEiICJiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL290aGVyU3JjXDA1MFwwNTEvWDMxOTk3LmphdmEiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2E2OGU4Li4wMDAwMDAwCi0tLSAiYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9vdGhlclNyY1wwNTBcMDUxL1gzMTk5Ny5qYXZhIgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotLyogVGVzdCBjYXNlIGZvciBidWcgMzE5OTcgUmVmYWN0b3JpbmcgZC5uLiB3b3JrIGZvciBwcm9qZWN0cyB3aXRoIGJyYWNrZXRzIGluIG5hbWUuICovCi1wdWJsaWMgY2xhc3MgWDMxOTk3IHsKLX0KZGlmZiAtLWdpdCAiYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9vdGhlclNyY1wwNTBcMDUxL1kzMTk5Ny5qYXZhIiAiYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9vdGhlclNyY1wwNTBcMDUxL1kzMTk5Ny5qYXZhIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI3ZWY1OC4uMDAwMDAwMAotLS0gImEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvb3RoZXJTcmNcMDUwXDA1MS9ZMzE5OTcuamF2YSIKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLS8qIFRlc3QgY2FzZSBmb3IgYnVnIDMxOTk3IFJlZmFjdG9yaW5nIGQubi4gd29yayBmb3IgcHJvamVjdHMgd2l0aCBicmFja2V0cyBpbiBuYW1lLiAqLwotcHVibGljIGNsYXNzIFkzMTk5NyBleHRlbmRzIFgzMTk5NyB7Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJjMDc5Yy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0vKiBUZXN0IGNhc2UgZm9yIDFHS1o4Vlo6IElUUEpDT1JFOldJTk5UIC0gU2VhcmNoIC0gZGlkIG5vdCBmaW5kIHJlZmVyZW5jZXMgdG8gbWVtYmVyIGNvbnN0cnVjdG9yICovCi1wdWJsaWMgY2xhc3MgQSB7Ci0JcHVibGljIGNsYXNzIElubmVyIHsKLQkJcHVibGljIElubmVyKGludCBpKSB7Ci0JCX0KLQl9Ci0JSW5uZXJbXSBmaWVsZCA9IG5ldyBJbm5lcltdIHtuZXcgSW5uZXIoMSksIG5ldyBJbm5lcigyKX07Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvQi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL0IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWViNmNkYS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvQi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0vKiBUZXN0IGNhc2UgZm9yIFBSIDFHS0VHNzM6IElUUEpDT1JFOldJTjIwMDAgLSBzZWFyY2ggKDEzNik6IG1pc3NpbmcgZmllbGQgZGVjbGFyYXRpb24gKi8KLXB1YmxpYyBjbGFzcyBCIHsKLQlwcml2YXRlIE9iamVjdFtdIG9wZW47Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL0NBLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvQ0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY4ODE4Ny4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvQ0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qIFRlc3QgY2FzZSBmb3IgMUdJSUJDMzogSVRQSkNPUkU6V0lOTlQgLSBzZWFyY2ggZm9yIG1ldGhvZCByZWZlcmVuY2VzIC0gbWlzc2luZyBtYXRjaGVzICovCi1wdWJsaWMgY2xhc3MgQ0EgewotCWNsYXNzIENCIHsKLQkJdm9pZCBmKCkgewotCQkJbSgpOwotCQl9Ci0JCWNsYXNzIENDIHsKLQkJCXZvaWQgZigpIHsKLQkJCQltKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0Jdm9pZCBtKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImEiKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL0QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9ELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZTQzZmUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL0QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgMUdMMTJYRTogSVRQSkNPUkU6V0lOMjAwMCAtIHNlYXJjaDogbWlzc2luZyBmaWVsZCByZWZlcmVuY2VzIGluIGlubmVyIGNsYXNzICovCi1wdWJsaWMgY2xhc3MgRCB7Ci0JaW50IGg7Ci0Jdm9pZCBnKCkgewotCQluZXcgT2JqZWN0KCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWludCB5ID0gMDsKLQkJCQloID0geTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL0UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9FLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NTA2ZjIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL0UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotLyogVGVzdCBjYXNlIGZvciAxR0hEQTJWOiBJVFBKQ09SRTpXSU5OVCAtIENsYXNzQ2FzdEV4Y2VwdGlvbiB3aGVuIGRvaW5nIGEgc2VhcmNoICovCi1wdWJsaWMgY2xhc3MgRSB7Ci0JcHVibGljIE9iamVjdCBmb28oKSB7Ci0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbMF07Ci0JCXJldHVybiByZXN1bHQuY2xvbmUoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL0ludGVyZmFjZUltcGxlbWVudG9ycy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL0ludGVyZmFjZUltcGxlbWVudG9ycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGJlOWMzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9JbnRlcmZhY2VJbXBsZW1lbnRvcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIEludGVyZmFjZUltcGxlbWVudG9ycyBleHRlbmRzIEkgaW1wbGVtZW50cyBwLkkgewotfQotCi1jbGFzcyBJIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvTWVtYmVyVHlwZVJlZmVyZW5jZS9BenouamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9NZW1iZXJUeXBlUmVmZXJlbmNlL0F6ei5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzc5ZTg1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9NZW1iZXJUeXBlUmVmZXJlbmNlL0F6ei5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotcGFja2FnZSBNZW1iZXJUeXBlUmVmZXJlbmNlOwotcHVibGljIGNsYXNzIEF6eiBleHRlbmRzIEIgewotCWNsYXNzIEF6ek1lbWJlciBleHRlbmRzIEJNZW1iZXIgewotCQljbGFzcyBCTWVtYmVyewotCQl9Ci0JfQotCXN0YXRpYyBpbnQgZkhlbGxvOwotCXZvaWQgcG9vKCkgewotCQlCLkJNZW1iZXIgc29tZVZhcjsKLQkJc3VwZXIucG9vKCk7Ci0JCWZIZWxsbz0gOTsKLQl9Ci19ICAKLQkKLWNsYXNzIEJNZW1iZXIgZXh0ZW5kcyBCIHt9Ci0JCi1jbGFzcyBYIHsKLQlBenouQXp6TWVtYmVyLkJNZW1iZXIgdmFsOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9NZW1iZXJUeXBlUmVmZXJlbmNlL0IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9NZW1iZXJUeXBlUmVmZXJlbmNlL0IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RhOWE2Ny4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvTWVtYmVyVHlwZVJlZmVyZW5jZS9CLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1wYWNrYWdlIE1lbWJlclR5cGVSZWZlcmVuY2U7Ci1wdWJsaWMgY2xhc3MgQiB7Ci0JcHJvdGVjdGVkIGNsYXNzIEJNZW1iZXJ7fQotCQotCXZvaWQgZm9vKCkgewotCQlBenouZkhlbGxvPSAxOwotCQlPYmplY3Qgc29tZVZhciA9IG51bGw7Ci0JCU9iamVjdCBvID0gKEF6ei5BenpNZW1iZXIuQk1lbWJlcikgc29tZVZhcjsKLQl9Ci0Jdm9pZCBwb28oKSB7fQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL05vUmVmZXJlbmNlL0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9Ob1JlZmVyZW5jZS9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMTA0NTQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL05vUmVmZXJlbmNlL0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcGFja2FnZSBOb1JlZmVyZW5jZTsKLXB1YmxpYyBjbGFzcyBBIHsKLQkvLyBUaGlzIGNsYXNzIHNob3VsZCBub3QgYmUgcmVmZXJlbmNlZAotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL08uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9PLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YThlMDIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL08uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotLyogUmVncmVzc2lvbiB0ZXN0IGZvciAxR0wxMUo2OiBJVFBKQ09SRTpXSU4yMDAwIC0gc2VhcmNoOiBtaXNzaW5nIGZpZWxkIHJlZmVyZW5jZXMgKG5lc3RlZCB0eXBlcykgKi8KLXB1YmxpYyBjbGFzcyBPIHsKLQlpbnQgeTsKLQljbGFzcyBJIHsKLQkJdm9pZCB5KCkgewotCQkJeSA9IDA7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL09iamVjdE1lbWJlclR5cGVSZWZlcmVuY2UvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL09iamVjdE1lbWJlclR5cGVSZWZlcmVuY2UvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGQyMzJiLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9PYmplY3RNZW1iZXJUeXBlUmVmZXJlbmNlL0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSBPYmplY3RNZW1iZXJUeXBlUmVmZXJlbmNlOwotcHVibGljIGNsYXNzIEEgewotCWNsYXNzIE9iamVjdCB7Ci0JfQotCXB1YmxpYyB2b2lkIGZvbygpIHsKLQkJbmV3IE9iamVjdCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9QUl8xR0dOT1RGLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvUFJfMUdHTk9URi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWJkNGJkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9QUl8xR0dOT1RGLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0vKiBUZXN0IGNhc2UgZm9yIFBSIDFHR05PVEY6IElUUEpDT1JFOldJTk5UIC0gU2VhcmNoIGRvZXNuJ3QgZmluZCBtZXRob2QgcmVmZXJlbmNlZCBpbiBhbm9ueW1vdXMgaW5uZXIgY2xhc3MgKi8KLXB1YmxpYyBjbGFzcyBQUl8xR0dOT1RGIHsKLQl2b2lkIG1ldGhvZCgpIHsKLQl9CQotCXZvaWQgbWV0aG9kMigpIHsKLQkJUnVubmFibGUgciA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQltZXRob2QoKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1BhY2thZ2VSZWZlcmVuY2UvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1BhY2thZ2VSZWZlcmVuY2UvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGQzODllLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9QYWNrYWdlUmVmZXJlbmNlL0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcGFja2FnZSBQYWNrYWdlUmVmZXJlbmNlOwotaW1wb3J0IHAzLnAyLnAuKjsKLXB1YmxpYyBjbGFzcyBBIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvUGFja2FnZVJlZmVyZW5jZS9CLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvUGFja2FnZVJlZmVyZW5jZS9CLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YTdkMjguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1BhY2thZ2VSZWZlcmVuY2UvQi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wYWNrYWdlIFBhY2thZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgcDMucDIucC5YOwotcHVibGljIGNsYXNzIEIgZXh0ZW5kcyBYIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvUGFja2FnZVJlZmVyZW5jZS9DLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvUGFja2FnZVJlZmVyZW5jZS9DLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYjkwZTcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1BhY2thZ2VSZWZlcmVuY2UvQy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wYWNrYWdlIFBhY2thZ2VSZWZlcmVuY2U7Ci1wdWJsaWMgY2xhc3MgQyBleHRlbmRzIHAzLnAyLnAuWCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1BhY2thZ2VSZWZlcmVuY2UvRC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1BhY2thZ2VSZWZlcmVuY2UvRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjM1ZDU2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9QYWNrYWdlUmVmZXJlbmNlL0QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcGFja2FnZSBQYWNrYWdlUmVmZXJlbmNlOwotcHVibGljIGNsYXNzIEQgewotCXAzLnAyLnAuWCB4OwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9QYWNrYWdlUmVmZXJlbmNlL0UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9QYWNrYWdlUmVmZXJlbmNlL0UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNkZWNjMC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvUGFja2FnZVJlZmVyZW5jZS9FLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXBhY2thZ2UgUGFja2FnZVJlZmVyZW5jZTsKLXB1YmxpYyBjbGFzcyBFIHsKLQlPYmplY3QgeCA9IG5ldyBwMy5wMi5wLlgoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvUGFja2FnZVJlZmVyZW5jZS9GLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvUGFja2FnZVJlZmVyZW5jZS9GLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NzYxMzMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1BhY2thZ2VSZWZlcmVuY2UvRi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wYWNrYWdlIFBhY2thZ2VSZWZlcmVuY2U7Ci1wdWJsaWMgY2xhc3MgRiB7Ci0JcDMucDIucC5YIGZvbygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9QYWNrYWdlUmVmZXJlbmNlL0cuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9QYWNrYWdlUmVmZXJlbmNlL0cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI1NWE2Mi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvUGFja2FnZVJlZmVyZW5jZS9HLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2UgUGFja2FnZVJlZmVyZW5jZTsKLXB1YmxpYyBjbGFzcyBHIHsKLQl2b2lkIGZvbyhwMy5wMi5wLlggeCkgewotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvUGFja2FnZVJlZmVyZW5jZS9ILmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvUGFja2FnZVJlZmVyZW5jZS9ILmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYzBhNzQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1BhY2thZ2VSZWZlcmVuY2UvSC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wYWNrYWdlIFBhY2thZ2VSZWZlcmVuY2U7Ci1wdWJsaWMgY2xhc3MgSCB7Ci0Jdm9pZCBmb28oKSB7Ci0JCXAzLnAyLnAuWCB4OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvUGFja2FnZVJlZmVyZW5jZS9JLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvUGFja2FnZVJlZmVyZW5jZS9JLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MTVmMmMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1BhY2thZ2VSZWZlcmVuY2UvSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wYWNrYWdlIFBhY2thZ2VSZWZlcmVuY2U7Ci1wdWJsaWMgY2xhc3MgSSB7Ci0Jdm9pZCBmb28oKSB7Ci0JCU9iamVjdCB4ID0gbmV3IHAzLnAyLnAuWCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvUGFja2FnZVJlZmVyZW5jZS9KLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvUGFja2FnZVJlZmVyZW5jZS9KLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjOWQ1MzkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1BhY2thZ2VSZWZlcmVuY2UvSi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wYWNrYWdlIFBhY2thZ2VSZWZlcmVuY2U7Ci1wdWJsaWMgY2xhc3MgSiB7Ci0Jdm9pZCBmb28oKSB7Ci0JCWludCBpID0gcDMucDIucC5YLmNvdW50OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvUGFja2FnZVJlZmVyZW5jZS9LLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvUGFja2FnZVJlZmVyZW5jZS9LLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMGMxNDcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1BhY2thZ2VSZWZlcmVuY2UvSy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wYWNrYWdlIFBhY2thZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgcDMucDIuKjsKLXB1YmxpYyBjbGFzcyBLIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvUGFja2FnZVJlZmVyZW5jZS9Ob1JlZmVyZW5jZUEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9QYWNrYWdlUmVmZXJlbmNlL05vUmVmZXJlbmNlQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmVmODAyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9QYWNrYWdlUmVmZXJlbmNlL05vUmVmZXJlbmNlQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wYWNrYWdlIFBhY2thZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgcDMuKjsKLXB1YmxpYyBjbGFzcyBOb1JlZmVyZW5jZUEgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9QYWNrYWdlUmVmZXJlbmNlL05vUmVmZXJlbmNlQi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1BhY2thZ2VSZWZlcmVuY2UvTm9SZWZlcmVuY2VCLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3OWNiNWUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1BhY2thZ2VSZWZlcmVuY2UvTm9SZWZlcmVuY2VCLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXBhY2thZ2UgUGFja2FnZVJlZmVyZW5jZTsKLWltcG9ydCBwMy5YOwotcHVibGljIGNsYXNzIE5vUmVmZXJlbmNlQiBleHRlbmRzIFggewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9QYWNrYWdlUmVmZXJlbmNlL05vUmVmZXJlbmNlQy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1BhY2thZ2VSZWZlcmVuY2UvTm9SZWZlcmVuY2VDLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhODJiZGQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1BhY2thZ2VSZWZlcmVuY2UvTm9SZWZlcmVuY2VDLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXBhY2thZ2UgUGFja2FnZVJlZmVyZW5jZTsKLXB1YmxpYyBjbGFzcyBOb1JlZmVyZW5jZUMgZXh0ZW5kcyBwMy5YIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvUGFja2FnZVJlZmVyZW5jZS9Ob1JlZmVyZW5jZUQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9QYWNrYWdlUmVmZXJlbmNlL05vUmVmZXJlbmNlRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGQ1ODAxLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9QYWNrYWdlUmVmZXJlbmNlL05vUmVmZXJlbmNlRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wYWNrYWdlIFBhY2thZ2VSZWZlcmVuY2U7Ci1wdWJsaWMgY2xhc3MgTm9SZWZlcmVuY2VEIHsKLQlwMy5YIHg7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1BhY2thZ2VSZWZlcmVuY2UvTm9SZWZlcmVuY2VFLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvUGFja2FnZVJlZmVyZW5jZS9Ob1JlZmVyZW5jZUUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YyNTJjYS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvUGFja2FnZVJlZmVyZW5jZS9Ob1JlZmVyZW5jZUUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcGFja2FnZSBQYWNrYWdlUmVmZXJlbmNlOwotcHVibGljIGNsYXNzIE5vUmVmZXJlbmNlRSB7Ci0JT2JqZWN0IHggPSBuZXcgcDMuWCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9QYWNrYWdlUmVmZXJlbmNlL05vUmVmZXJlbmNlRi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1BhY2thZ2VSZWZlcmVuY2UvTm9SZWZlcmVuY2VGLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MDA3ZjQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1BhY2thZ2VSZWZlcmVuY2UvTm9SZWZlcmVuY2VGLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXBhY2thZ2UgUGFja2FnZVJlZmVyZW5jZTsKLXB1YmxpYyBjbGFzcyBOb1JlZmVyZW5jZUYgewotCXAzLlggZm9vKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1BhY2thZ2VSZWZlcmVuY2UvTm9SZWZlcmVuY2VHLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvUGFja2FnZVJlZmVyZW5jZS9Ob1JlZmVyZW5jZUcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBhOTllZi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvUGFja2FnZVJlZmVyZW5jZS9Ob1JlZmVyZW5jZUcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcGFja2FnZSBQYWNrYWdlUmVmZXJlbmNlOwotcHVibGljIGNsYXNzIE5vUmVmZXJlbmNlRyB7Ci0Jdm9pZCBmb28ocDMuWCB4KSB7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9QYWNrYWdlUmVmZXJlbmNlL05vUmVmZXJlbmNlSC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1BhY2thZ2VSZWZlcmVuY2UvTm9SZWZlcmVuY2VILmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYTFjNTcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1BhY2thZ2VSZWZlcmVuY2UvTm9SZWZlcmVuY2VILmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXBhY2thZ2UgUGFja2FnZVJlZmVyZW5jZTsKLXB1YmxpYyBjbGFzcyBOb1JlZmVyZW5jZUggewotCXZvaWQgZm9vKCkgewotCQlwMy5YIHg7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9QYWNrYWdlUmVmZXJlbmNlL05vUmVmZXJlbmNlSS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1BhY2thZ2VSZWZlcmVuY2UvTm9SZWZlcmVuY2VJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNmQ1ZGQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1BhY2thZ2VSZWZlcmVuY2UvTm9SZWZlcmVuY2VJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXBhY2thZ2UgUGFja2FnZVJlZmVyZW5jZTsKLXB1YmxpYyBjbGFzcyBOb1JlZmVyZW5jZUkgewotCXZvaWQgZm9vKCkgewotCQlPYmplY3QgeCA9IG5ldyBwMy5YKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9QYWNrYWdlUmVmZXJlbmNlL05vUmVmZXJlbmNlSi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1BhY2thZ2VSZWZlcmVuY2UvTm9SZWZlcmVuY2VKLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyOGU5Y2YuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1BhY2thZ2VSZWZlcmVuY2UvTm9SZWZlcmVuY2VKLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXBhY2thZ2UgUGFja2FnZVJlZmVyZW5jZTsKLXB1YmxpYyBjbGFzcyBOb1JlZmVyZW5jZUogewotCXZvaWQgZm9vKCkgewotCQlpbnQgaSA9IHAzLlguY291bnQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWYxNDU5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1wdWJsaWMgY2xhc3MgVGVzdCB7Ci0KLXN0YXRpYyB7Ci0JVGVzdCB2YXIgPSBuZXcgVGVzdCgpOwotfQotCi17Ci0JVGVzdCB0ID0gbnVsbDsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCXAuWSB5ID0gbmV3IHAuWSgpOwotCXkuZm9vKDEsICJhIiwgeSk7Ci0JcC5ZLmJhcigpOwotCQotCXAuWiB6ID0gbmV3IHAuWigpOwotCXouZm9vKDEsICJhIiwgeik7Ci0JCi0JcC5BIGEgPSBuZXcgcC5BKHkpOwotCWEuZm9vKDEsICJhIiwgYS54KTsKLX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9UeXBlUmVmZXJlbmNlQXNTaW5nbGVOYW1lUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvVHlwZVJlZmVyZW5jZUFzU2luZ2xlTmFtZVJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDFhMTVhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9UeXBlUmVmZXJlbmNlQXNTaW5nbGVOYW1lUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1wdWJsaWMgY2xhc3MgVHlwZVJlZmVyZW5jZUFzU2luZ2xlTmFtZVJlZmVyZW5jZSB7Ci0KLXZvaWQgaGFzUmVmZXJlbmNlKCkgewotCVR5cGVSZWZlcmVuY2VBc1NpbmdsZU5hbWVSZWZlcmVuY2UgeCA9IG51bGw7Ci0JVHlwZVJlZmVyZW5jZUFzU2luZ2xlTmFtZVJlZmVyZW5jZSA9IG5ldyBPYmplY3QoKTsKLX0KLQotdm9pZCBoYXNOb1JlZmVyZW5jZSgpIHsKLQlPYmplY3QgVHlwZVJlZmVyZW5jZUFzU2luZ2xlTmFtZVJlZmVyZW5jZSA9IG51bGw7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9UeXBlUmVmZXJlbmNlSW5BcnJheS9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvVHlwZVJlZmVyZW5jZUluQXJyYXkvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTg2MTJhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9UeXBlUmVmZXJlbmNlSW5BcnJheS9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2UgVHlwZVJlZmVyZW5jZUluQXJyYXk7Ci1wdWJsaWMgY2xhc3MgQSB7Ci0JQVtdIGE7Ci0JVHlwZVJlZmVyZW5jZUluQXJyYXkuQVtdIGI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1R5cGVSZWZlcmVuY2VJbkltcG9ydC9YLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvVHlwZVJlZmVyZW5jZUluSW1wb3J0L1guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY2MDJhNi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvVHlwZVJlZmVyZW5jZUluSW1wb3J0L1guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcGFja2FnZSBUeXBlUmVmZXJlbmNlSW5JbXBvcnQ7Ci1pbXBvcnQgcC5ZOwotaW1wb3J0IHAyLlo7Ci1wdWJsaWMgY2xhc3MgWCB7Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvVmFyaW91c1R5cGVSZWZlcmVuY2VzL0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9WYXJpb3VzVHlwZVJlZmVyZW5jZXMvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTkwNzkzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9WYXJpb3VzVHlwZVJlZmVyZW5jZXMvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wYWNrYWdlIFZhcmlvdXNUeXBlUmVmZXJlbmNlczsKLXB1YmxpYyBjbGFzcyBBIHsKLX0gIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1ZhcmlvdXNUeXBlUmVmZXJlbmNlcy9CLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvVmFyaW91c1R5cGVSZWZlcmVuY2VzL0IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZiMTBiOS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvVmFyaW91c1R5cGVSZWZlcmVuY2VzL0IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcGFja2FnZSBWYXJpb3VzVHlwZVJlZmVyZW5jZXM7Ci1wdWJsaWMgY2xhc3MgQiB7Ci0Jdm9pZCBmb28oQSBhKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1ZhcmlvdXNUeXBlUmVmZXJlbmNlcy9DLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvVmFyaW91c1R5cGVSZWZlcmVuY2VzL0MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M5YzVmYi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvVmFyaW91c1R5cGVSZWZlcmVuY2VzL0MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcGFja2FnZSBWYXJpb3VzVHlwZVJlZmVyZW5jZXM7Ci1wdWJsaWMgY2xhc3MgQyB7Ci0JQSBmb28oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9WYXJpb3VzVHlwZVJlZmVyZW5jZXMvRC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1ZhcmlvdXNUeXBlUmVmZXJlbmNlcy9ELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MGJjM2YuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1ZhcmlvdXNUeXBlUmVmZXJlbmNlcy9ELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXBhY2thZ2UgVmFyaW91c1R5cGVSZWZlcmVuY2VzOwotcHVibGljIGNsYXNzIEQgewotCUEgZm9vOwotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1cuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9XLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYjkwZDMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotLyogUmVncmVzc2lvbiB0ZXN0IGZvciAxR0w5VU1IOiBJVFBKQ09SRTpXSU4yMDAwIC0gc2VhcmNoOiBtaXNzaW5nIHR5cGUgb2NjdXJyZW5jZXMgKi8KLXB1YmxpYyBjbGFzcyBXIHsKLQlzdGF0aWMgaW50IGxlbmd0aCA9IDE3OwotCWludCBtKCkgewotCQlpbnRbXSBSID0gbmV3IGludFsxXTsKLQkJcmV0dXJuIFcubGVuZ3RoOyAvKjEqLwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvWC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL1guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU0ZTU4MC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvWC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0vKiBUZXN0IGNhc2UgZm9yIFBSIDFHSzdLMTc6IElUUEpDT1JFOldJTjIwMDAgLSBzZWFyY2g6IG1pc3NpbmcgdHlwZSByZWZlcmVuY2UgKi8KLXB1YmxpYyBjbGFzcyBYewotICBzdGF0aWMgdm9pZCBzKCl7fTsKLX0KLWNsYXNzIEFBewotICAgQUEoKXsgCi0gICAgIFgucygpOyAgIC8vPDwgCi0gICB9OyAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9hL0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9hL0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI2ZjA2ZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYS9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1wYWNrYWdlIGE7Ci0vKiBUZXN0IGNhc2UgZm9yIDFHTDBNTjk6IElUUEpDT1JFOldJTjIwMDAgLSBzZWFyY2g6IG5vdCBjb25zaXN0ZW50IHJlc3VsdHMgZm9yIG5lc3RlZCB0eXBlcyAqLwotcHVibGljIGNsYXNzIEEgewotCWNsYXNzIFggewotCX0KLQotfTsKLWNsYXNzIFMgZXh0ZW5kcyBBIHsKLX0KLWNsYXNzIEIgewotCUEuWCBheDsgLyoxKi8KLQlTLlggc3g7IC8qMiovCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2EyL1guamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9hMi9YLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MmFkYjcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2EyL1guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXBhY2thZ2UgYTI7Ci0vKiBUZXN0IGNhc2UgZm9yIGJ1ZyA1OTIzIFNlYXJjaCBmb3IgImxlbmd0aCIgZmllbGQgcmVmcyBmaW5kcyBbXS5sZW5ndGggICovCi1wdWJsaWMgY2xhc3MgWCB7Ci0JaW50IGxlbmd0aCA9IDE7Ci0JcHVibGljIHZvaWQgZm9vKCkgewotCQlpbnRbXSBhcnJheSA9IG5ldyBpbnRbbGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCX0KLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9hMy9SZWZlcmVuY2VzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYTMvUmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTljNGJhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9hMy9SZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1wYWNrYWdlIGEzOwotaW1wb3J0IGEzLmIuQjsKLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VzIHsKLQlwdWJsaWMgdm9pZCBmb28oKSB7Ci0JCVggeDEgPSBuZXcgWigpOyAvLyBzaW5nbGUgdHlwZSByZWZlcmVuY2VzCi0JCWEzLmIuQSBhID0gbnVsbDsgLy8gcXVhbGlmaWVkIHR5cGUgcmVmZXJlbmNlCi0JCWEzLmIuQS5CLkMgaW5uZXIgPSBudWxsOyAvLyBxdWFsaWZpZWQgdHlwZSByZWZlcmVuY2VzIHdpdGggaW5uZXIgdHlwZQotCQlPYmplY3QgbyA9IGEzLlkuZmllbGQ7IC8vIGJpbmFyeSByZWZlcmVuY2UgKyBxdWFsaWZpZWQgbmFtZSByZWZlcmVuY2UKLQkJWCB4MiA9IChCKXgxOyAvLyBzaW5nbGUgbmFtZSByZWZlcmVuY2UKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2EzL1guamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9hMy9YLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYjliODguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2EzL1guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcGFja2FnZSBhMzsKLXB1YmxpYyBjbGFzcyBYIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYTMvWS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2EzL1kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQwM2RhYy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYTMvWS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wYWNrYWdlIGEzOwotcHVibGljIGNsYXNzIFkgZXh0ZW5kcyBYIHsKLQlwdWJsaWMgc3RhdGljIE9iamVjdCBmaWVsZCA9IG51bGw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2EzL1ouamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9hMy9aLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNzU5NTAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2EzL1ouamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcGFja2FnZSBhMzsgCi1wdWJsaWMgY2xhc3MgWiBleHRlbmRzIFkgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9hMy9iL0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9hMy9iL0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YxNjIxNS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYTMvYi9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2UgYTMuYjsKLXB1YmxpYyBjbGFzcyBBIHsKLQlwdWJsaWMgY2xhc3MgQiB7Ci0JCXB1YmxpYyBjbGFzcyBDIHsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9hMy9iL0IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9hMy9iL0IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM0NDIyZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYTMvYi9CLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXBhY2thZ2UgYTMuYjsKLXB1YmxpYyBjbGFzcyBCIGV4dGVuZHMgYTMuWCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2E0L1guamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9hNC9YLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MWU4OTAuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2E0L1guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSBhNDsKLS8qIFRlc3QgY2FzZSBmb3IgYnVnIDYxNTggU2VhcmNoIC0gUHJlZml4IGFuZCBwb3N0Zml4IGV4cHJlc3Npb24gbm90IGZvdW5kIGFzIHdyaXRlIHJlZmVyZW5jZSAqLwotcHVibGljIGNsYXNzIFggewotCWludCBmaWVsZDsKLQl2b2lkIGZvbygpIHsKLQkJZmllbGQrKzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2E1L0IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9hNS9CLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyODc0OGIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2E1L0IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLXBhY2thZ2UgYTU7Ci0vKiBUZXN0IGNhc2UgZm9yIGJ1ZyA2NTM4IHNlYXJjaERlY2xhcmF0aW9uc09mKiBpbmNvcnJlY3QgKi8KLQotY2xhc3MgQXsKLSAgICAgICAgaW50IGkoKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotfQotCi1jbGFzcyBCIHsKLSAgICAgICAgaW50IGY7Ci0gICAgICAgIHZvaWQgaSgpewotICAgICAgICAgICAgICAgIHkoKTsKLSAgICAgICAgICAgICAgICBPYmplY3QgbD0gbmV3IGJ5dGVbZl07Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHkoKXsKLSAgICAgICAgfQotCi19Ci0KLWNsYXNzIEMgZXh0ZW5kcyBBewotICAgICAgICBwdWJsaWMgIGludCBpKCl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYTYvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2E2L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUyOTFjMC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYTYvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotcGFja2FnZSBhNjsKLQotY2xhc3MgQSB7Ci19Ci0KLWNsYXNzIEIgZXh0ZW5kcyBBIHsKLSAgICAgICAgcHJpdmF0ZSBpbnQgZjsKLSAgICAgICAgcHJpdmF0ZSBjbGFzcyBQe30KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGEoKXt9Ci0gICAgICAgIHZvaWQgbSgpIHsgCi0gICAgICAgICAgICAgICAgZisrOwotICAgICAgICAgICAgICAgIFAgcD0gbmV3IFAoKTsKLSAgICAgICAgICAgICAgICBhKCk7Ci0gICAgICAgIH0gICAgICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2E3L1guamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9hNy9YLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOGRiYjQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2E3L1guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSBhNzsKLS8qIFRlc3QgY2FzZSBmb3IgYnVnIDY3Nzkgc2VhcmNoRGVjbGFyYXRpb25zT2ZSZWZlcmVuY2VkVHlwZWQgLSBtaXNzaW5nIGV4Y2VwdGlvbiB0eXBlcyAqLwotcHVibGljIGNsYXNzIFggewotCXB1YmxpYyB2b2lkIGZvbygpIHRocm93cyBNeUV4Y2VwdGlvbiB7Ci0JfQotfQotY2xhc3MgTXlFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2E4L0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9hOC9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYjVmMDMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2E4L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcGFja2FnZSBhODsKLS8qIFRlc3QgY2FzZSBmb3IgYnVnIDczNDQgU2VhcmNoIC0gd3JpdGUgYWNjZXMgZ2l2ZSB3cm9uZyByZXN1bHQgKi8KLXB1YmxpYyBjbGFzcyBBIHsKLSAgIHB1YmxpYyBBIGE7Ci0gICBwdWJsaWMgaW50IGk7Ci0gICBwdWJsaWMgdm9pZCBmb28oKXsKLSAgICAgIGEuaSA9IDI1OwotICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9hOS9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYTkvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmU0NGFlLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9hOS9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1wYWNrYWdlIGE5OwotY2xhc3MgQnsKLQlwcml2YXRlIHZvaWQgbSgpewotCX0KLX0KLWNsYXNzIEEgZXh0ZW5kcyBCewotCXZvaWQgbSgpewotCX0KLX0KLWNsYXNzIEMgZXh0ZW5kcyBBewotCXZvaWQgbSgpewotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9iMS9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYjEvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDMzMWM2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9iMS9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2UgYjE7Ci0vKiBUZXN0IGNhc2UgZm9yIGJ1ZyA3OTg3IEZpZWxkIHJlZmVyZW5jZSBzZWFyY2ggc2hvdWxkIGRvIGxvb2t1cCBpbiAxLjQgbW9kZSAqLwotcHVibGljIGNsYXNzIEEgewotICBpbnQgeDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYjEvQi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2IxL0IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRiNjEzOC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYjEvQi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIGIxOwotLyogVGVzdCBjYXNlIGZvciBidWcgNzk4NyBGaWVsZCByZWZlcmVuY2Ugc2VhcmNoIHNob3VsZCBkbyBsb29rdXAgaW4gMS40IG1vZGUgKi8KLXB1YmxpYyBjbGFzcyBCIGV4dGVuZHMgQSB7Ci0gIHZvaWQgZm9vKCkgewotICAgIHRoaXMueCsrOwotICB9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYjIvWC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2IyL1guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMwYjkyMy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYjIvWC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wYWNrYWdlIGIyOwotLyogVGVzdCBjYXNlIGZvciBidWcgODkyOCBVbmFibGUgdG8gZmluZCByZWZlcmVuY2VzIG9yIGRlY2xhcmF0aW9ucyBvZiBtZXRob2RzIHRoYXQgdXNlIHN0YXRpYyBpbm5lciBjbGFzc2VzIGluIHRoZSBzaWduYXR1cmUgKi8KLXB1YmxpYyBjbGFzcyBYIHsKLQlwdWJsaWMgc3RhdGljIGNsYXNzIElubmVyIHsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2IyL1kuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9iMi9ZLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNmRhZGUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2IyL1kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcGFja2FnZSBiMjsKLS8qIFRlc3QgY2FzZSBmb3IgYnVnIDg5MjggVW5hYmxlIHRvIGZpbmQgcmVmZXJlbmNlcyBvciBkZWNsYXJhdGlvbnMgb2YgbWV0aG9kcyB0aGF0IHVzZSBzdGF0aWMgaW5uZXIgY2xhc3NlcyBpbiB0aGUgc2lnbmF0dXJlICovCi1wdWJsaWMgY2xhc3MgWSB7Ci0JcHVibGljIHZvaWQgZm9vKFguSW5uZXIgaW5uZXIpIHsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2IyL1ouamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9iMi9aLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ODdmMTIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2IyL1ouamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSBiMjsKLS8qIFRlc3QgY2FzZSBmb3IgYnVnIDg5MjggVW5hYmxlIHRvIGZpbmQgcmVmZXJlbmNlcyBvciBkZWNsYXJhdGlvbnMgb2YgbWV0aG9kcyB0aGF0IHVzZSBzdGF0aWMgaW5uZXIgY2xhc3NlcyBpbiB0aGUgc2lnbmF0dXJlICovCi1wdWJsaWMgY2xhc3MgWiB7Ci0Jdm9pZCBiYXIoKSB7Ci0JCVguSW5uZXIgaW5uZXIgPSBuZXcgWC5Jbm5lcigpOwotCQluZXcgWSgpLmZvbyhpbm5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9iMy9YLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYjMvWC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDMyZjZjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9iMy9YLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1wYWNrYWdlIGIzOwotLyogVGVzdCBjYXNlIGZvciBidWcgOTA0MSBzZWFyY2g6IGNhbm5vdCBjcmVhdGUgYSBzdWItY3Ugc2NvcGUgKi8KLXB1YmxpYyBjbGFzcyBYIHsKLQlPYmplY3QgZmllbGQgPSBuZXcgWCgpOwotCU9iamVjdCBmb28oKSB7Ci0JCXJldHVybiBuZXcgWCgpOwotCX0KLQljbGFzcyBZIHsKLQkJT2JqZWN0IGZpZWxkMiA9IG5ldyBYKCk7Ci0JCU9iamVjdCBmb28yKCkgewotCQkJcmV0dXJuIG5ldyBYKCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2I0L0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9iNC9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0M2M0NjMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2I0L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcGFja2FnZSBiNDsKLS8qIFRlc3QgY2FzZSBmb3IgYnVnIDk5OTIgTWVtYmVyIGNsYXNzIGRlY2xhcmF0aW9uIG5vdCBmb3VuZCAqLwotcHVibGljIGNsYXNzIEEgewotCXB1YmxpYyBjbGFzcyBCIHsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2I1L0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9iNS9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYTVhNjIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2I1L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXBhY2thZ2UgYjU7Ci0vKiBUZXN0IGNhc2UgZm9yIGJ1ZyA5NjQyIFNlYXJjaCAtIG1pc3NpbmcgaW5hY2N1cmF0ZSB0eXBlIG1hdGNoZXMgKi8KLWltcG9ydCB4LnkuWm9yazsKLXB1YmxpYyBjbGFzcyBBIHsKLSAgewotICAgIFpvcmtbXSB6b3JrID0gbmV3IFpvcmtbMF07Ci0gICAgaW50IGkgPSBab3JrLmZvbzsKLSAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2I2L0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9iNi9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMTliMDQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2I2L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSBiNjsKLS8qIFRlc3QgY2FzZSBmb3IgYnVnIDEwMzg2IE5QRSBpbiBNYXRjaExvY2F0b3IubG9va3VwVHlwZSAqLwotcHVibGljIGNsYXNzIEEgewotCWludFtdIGZpZWxkOwotCWludCBmb28oKSB7Ci0JCXJldHVybiB0aGlzLmZpZWxkLmxlbmd0aDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2I3L1guamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9iNy9YLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjODFhMDEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2I3L1guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXBhY2thZ2UgYjc7Ci0vKiBUZXN0IGNhc2UgZm9yIGJ1ZyAxNjc1MSBSZW5hbWluZyBhIGNsYXNzIGRvZXNuJ3QgdXBkYXRlIGFsbCByZWZlcmVuY2VzICAqLwotY2xhc3MgU3VwZXJDbGFzcyB7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNUQU5UID0gInZhbHVlIjsKLX0KLQotY2xhc3MgU3ViQ2xhc3MgZXh0ZW5kcyBTdXBlckNsYXNzIHsKLX0KLQotY2xhc3MgVGVzdCB7Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3VtZW50cykgewotICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdWJDbGFzcy5DT05TVEFOVCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9iOC9UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYjgvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTMzNTJhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9iOC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXBhY2thZ2UgYjg7Ci0vKiBUZXN0IGNhc2UgZm9yIGJ1ZyAxNzkwNiBSZW5hbWUgcGFja2FnZSBmYWlscyB3aGVuIGlubmVyIGNsYXNzZXMgYXJlIGltcG9ydGVkICAqLwotcHVibGljIGNsYXNzIFRlc3QgewotICBwdWJsaWMgc3RhdGljIGNsYXNzIElubmVyVGVzdCB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9iOS9Gb28uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9iOS9Gb28uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY1NjRhNy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYjkvRm9vLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2UgYjk7Ci0vKiBUZXN0IGNhc2UgZm9yIGJ1ZyAxNzkwNiBSZW5hbWUgcGFja2FnZSBmYWlscyB3aGVuIGlubmVyIGNsYXNzZXMgYXJlIGltcG9ydGVkICAqLwotaW1wb3J0IGI4LlRlc3QuSW5uZXJUZXN0OwotcHVibGljIGNsYXNzIEZvbyB7Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYzEvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2MxL0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5YTcyYy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYzEvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIGMxOwotLyogVGVzdCBjYXNlIGZvciBidWcgMTI2NDkgTWlzc2luZyBpbXBvcnQgYWZ0ZXIgbW92ZSAgKi8KLWNsYXNzIEF7Ci0gaW50IGk9IEkuSUk7Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYzEvQi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2MxL0IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNkZTA1ZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYzEvQi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIGMxOwotLyogVGVzdCBjYXNlIGZvciBidWcgMTI2NDkgTWlzc2luZyBpbXBvcnQgYWZ0ZXIgbW92ZSAgKi8KLWNsYXNzIEJ7Ci0gaW50IGk9IEkuaTsKLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9jMS9JLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYzEvSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTU5NjAzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9jMS9JLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2UgYzE7Ci0vKiBUZXN0IGNhc2UgZm9yIGJ1ZyAxMjY0OSBNaXNzaW5nIGltcG9ydCBhZnRlciBtb3ZlICovCi1pbnRlcmZhY2UgSXsKLSBpbnQgaT0gMDsKLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9jMi9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYzIvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODQxY2Y4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9jMi9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgYzI7Ci0vKiBUZXN0IGNhc2UgZm9yIGJ1ZyAxODQxOCAgc2VhcmNoOiBzZWFyY2hEZWNsYXJhdGlvbnNPZlJlZmVyZW5jZWRUeXBlcyByZXBvcnRzIGltcG9ydCBkZWNsYXJhdGlvbnMgICovCi1pbXBvcnQgYzMuQzsKLXB1YmxpYyBjbGFzcyBBewotCUMgYzsKLQljMy5DIGMzYzsKLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9jMi9CLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYzIvQi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWU0NDQwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9jMi9CLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXBhY2thZ2UgYzI7Ci0vKiBUZXN0IGNhc2UgZm9yIGJ1ZyAxODQxOCBzZWFyY2g6IHNlYXJjaERlY2xhcmF0aW9uc09mUmVmZXJlbmNlZFR5cGVzIHJlcG9ydHMgaW1wb3J0IGRlY2xhcmF0aW9ucyAgKi8KLWltcG9ydCBjMy5DOwotcHVibGljIGNsYXNzIEJ7Ci0JQyBjOwotCWMzLkMgbShDIEMsIEEgQSl7Ci0JCXJldHVybiBDOwotCX0JCi19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYzMvQy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2MzL0MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMxYTVmNS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYzMvQy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotcGFja2FnZSBjMzsKLS8qIFRlc3QgY2FzZSBmb3IgYnVnIDE4NDE4ICBzZWFyY2g6IHNlYXJjaERlY2xhcmF0aW9uc09mUmVmZXJlbmNlZFR5cGVzIHJlcG9ydHMgaW1wb3J0IGRlY2xhcmF0aW9ucyAgKi8KLWltcG9ydCBjMi5BOwotaW1wb3J0IGMyLio7Ci1pbXBvcnQgYzIuQjsKLXB1YmxpYyBjbGFzcyBDewotCUEgYTsKLQljMi5BIGMyYTsKLQlCIGI7Ci0JYzIuQiBjMkI7Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYzQvWC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2M0L1guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRiNWNkZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYzQvWC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIGM0OwotLyogVGVzdCBjYXNlIGZvciBidWcgMjA2OTMgRmluZGluZyByZWZlcmVuY2VzIHRvIHZhcmlhYmxlcyBkb2VzIG5vdCBmaW5kIGFsbCBvY2N1cmFuY2VzICovCi1wdWJsaWMgY2xhc3MgWCB7Ci0JaW50IHg7Ci0JaW50IGZvbygpIHsKLQkJcmV0dXJuICh0aGlzLngpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYzUvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2M1L1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg1ZWNiNy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYzUvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIGM1OwotLyogVGVzdCBjYXNlIGZvciBidWcgMjE3NjMgUHJvYmxlbSBpbiBKYXZhIHNlYXJjaCBbc2VhcmNoXSAqLwotcHVibGljIGNsYXNzIFRlc3QgewotCXB1YmxpYyBTdHJpbmcgY2xhc3NfcGF0aDsKLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9jNi9YLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYzYvWC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzlhOWE4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9jNi9YLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wYWNrYWdlIGM2OwotLyogVGVzdCBjYXNlIGZvciBidWcgMjQzNDYgTWV0aG9kIGRlY2xhcmF0aW9uIG5vdCBmb3VuZCBpbiBmaWVsZCBpbml0aWFsaXplciovCi1wdWJsaWMgY2xhc3MgWCB7Ci0JcHVibGljIHZvaWQgYmFyKCkgewotCX0KLQlwdWJsaWMgT2JqZWN0IHggPSBuZXcgT2JqZWN0KCkgewotCQlwdWJsaWMgdm9pZCBmb28yNDM0NigpIHsKLQkJfQotCX07Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYzcvWC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2M3L1guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY0NmJmYy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYzcvWC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wYWNrYWdlIGM3OwotLyogVGVzdCBjYXNlIGZvciBidWcgMjMxMTIgc2VhcmNoOiBuZWVkIGEgd2F5IHRvIHNlYXJjaCBmb3IgcmVmZXJlbmNlcyB0byB0aGUgaW1wbGljaXQgbm9uLWFyZyBjb25zdHJ1Y3RvciAqLwotcHVibGljIGNsYXNzIFggewotCXB1YmxpYyBYKCkgewotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYzcvWS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2M3L1kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAzODNiNy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYzcvWS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wYWNrYWdlIGM3OwotLyogVGVzdCBjYXNlIGZvciBidWcgMjMxMTIgc2VhcmNoOiBuZWVkIGEgd2F5IHRvIHNlYXJjaCBmb3IgcmVmZXJlbmNlcyB0byB0aGUgaW1wbGljaXQgbm9uLWFyZyBjb25zdHJ1Y3RvciAqLwotcHVibGljIGNsYXNzIFkgZXh0ZW5kcyBYIHsKLQlwdWJsaWMgWSgpIHsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2M4L1guamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9jOC9YLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkODhjYTMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2M4L1guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcGFja2FnZSBjODsKLS8qIFRlc3QgY2FzZSBmb3IgYnVnIDIzMTEyIHNlYXJjaDogbmVlZCBhIHdheSB0byBzZWFyY2ggZm9yIHJlZmVyZW5jZXMgdG8gdGhlIGltcGxpY2l0IG5vbi1hcmcgY29uc3RydWN0b3IgKi8KLXB1YmxpYyBjbGFzcyBYIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYzgvWS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2M4L1kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRmYTNmYi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYzgvWS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wYWNrYWdlIGM4OwotLyogVGVzdCBjYXNlIGZvciBidWcgMjMxMTIgc2VhcmNoOiBuZWVkIGEgd2F5IHRvIHNlYXJjaCBmb3IgcmVmZXJlbmNlcyB0byB0aGUgaW1wbGljaXQgbm9uLWFyZyBjb25zdHJ1Y3RvciAqLwotcHVibGljIGNsYXNzIFkgZXh0ZW5kcyBYIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYzkvWC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2M5L1guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM1ZGY0OC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvYzkvWC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wYWNrYWdlIGM5OwotLyogVGVzdCBjYXNlIGZvciBidWcgMjU4NTkgRXJyb3IgZG9pbmcgSmF2YSBTZWFyY2ggKi8KLXB1YmxpYyBjbGFzcyBYIHsKLX0KLWNsYXNzIEFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogewotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2QxL1guamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9kMS9YLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5M2JkMGQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2QxL1guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXBhY2thZ2UgZDE7Ci0vKiBUZXN0IGNhc2UgZm9yIGJ1ZyAyNDkzNCBNb3ZlIHRvcCBsZXZlbCBkb2Vzbid0IG9wdGltaXplIHRoZSBpbXBvcnRzW3JlZmFjdG9yaW5nXSAqLwotaW1wb3J0IGQyLlk7Ci1pbXBvcnQgZDIuWjsKLXB1YmxpYyBjbGFzcyBYIHsKLQlwdWJsaWMgY2xhc3MgSW5uZXIgewotCQlZIHk7Ci0JfQotCVogejsKLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9kMi9ZLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvZDIvWS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWMyOGJmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9kMi9ZLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXBhY2thZ2UgZDI7Ci0vKiBUZXN0IGNhc2UgZm9yIGJ1ZyAyNDkzNCBNb3ZlIHRvcCBsZXZlbCBkb2Vzbid0IG9wdGltaXplIHRoZSBpbXBvcnRzW3JlZmFjdG9yaW5nXSAqLwotcHVibGljIGNsYXNzIFkgewotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2QyL1ouamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9kMi9aLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YjA0OGQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2QyL1ouamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcGFja2FnZSBkMjsKLS8qIFRlc3QgY2FzZSBmb3IgYnVnIDI0OTM0IE1vdmUgdG9wIGxldmVsIGRvZXNuJ3Qgb3B0aW1pemUgdGhlIGltcG9ydHNbcmVmYWN0b3JpbmddICovCi1wdWJsaWMgY2xhc3MgWiB7Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvZDMvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2QzL0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I2YWYzMS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvZDMvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIGQzOwotcHVibGljIGNsYXNzIEEgewotfQotY2xhc3MgQiB7Ci0Jdm9pZCBmb28oKSB7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9kNC9YLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvZDQvWC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTBhZTUyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9kNC9YLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXBhY2thZ2UgZDQ7Ci1wdWJsaWMgY2xhc3MgWCB7Ci0JT2JqZWN0IGZvbygpIHsKLQkJcmV0dXJuIG5ldyBkNC5ZLmJhcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvZDQvWS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2Q0L1kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJjNTRhMC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvZDQvWS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wYWNrYWdlIGQ0OwotcHVibGljIGNsYXNzIFkgewotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGJhcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9kNS9YLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvZDUvWC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWFmNTgzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9kNS9YLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXBhY2thZ2UgZDU7Ci1jbGFzcyBYIHsgLy8gbm9uLXB1YmxpYyBjbGFzcwotCXN0YXRpYyBTdHJpbmcgUzsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvZDUvWS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2Q1L1kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE3OWM2Ni4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvZDUvWS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wYWNrYWdlIGQ1OwotcHVibGljIGNsYXNzIFkgewotCVN0cmluZyBUID0gZDUuWC5TOwotCUNsYXNzIGMgPSBkNS5YLmNsYXNzOwotCU9iamVjdCBvID0gKGQ1LlgpIG51bGw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2Q2L1guamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9kNi9YLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMjUyYmRmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9kNi9YLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2UgZDY7Ci1wdWJsaWMgY2xhc3MgWCB7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIENPTlNUQU5UOwotCXByaXZhdGUgaW50IGZvbzsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvZDYvWS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2Q2L1kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYwYzgzNy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvZDYvWS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIGQ2OwotcHVibGljIGNsYXNzIFkgewotCVN0cmluZyBUID0gWC5DT05TVEFOVDsgCi0JaW50IGkgPSBuZXcgWCgpLmZvbzsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvZDcvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2Q3L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJkYjM5MC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvZDcvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotcGFja2FnZSBkNzsKLS8qIFRlc3QgY2FzZSBmb3IgYnVnIDI5NTE2ICBTZWFyY2hFbmdpbmUgcmVncmVzc2lvbnMgaW4gMjAwMzAxMTQgKi8KLWNsYXNzIEF7Ci0gICBBIEE7Ci0gICBBIEEoQSBBKXsKLQkgQToKLQkJZm9yICg7Oyl7Ci0JCSAgaWYgKEEuQShBKT09QSkKLQkJCSBicmVhayBBOwotCQl9Ci0JICByZXR1cm4gQTsKLSAgIH07Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2Q4L0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9kOC9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NmZlYmYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2Q4L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcGFja2FnZSBkODsKLS8qIFRlc3QgY2FzZSBmb3IgYnVnIDI5NTI0IFNlYXJjaCBmb3IgZGVjbGFyYXRpb24gdmlhIHBhdHRlcm5zIGFkZHMgJyIqIiAqLwotcHVibGljIGNsYXNzIEEgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9kOC9BQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2Q4L0FBLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMzQyNmEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2Q4L0FBLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXBhY2thZ2UgZDg7Ci0vKiBUZXN0IGNhc2UgZm9yIGJ1ZyAyOTUyNCBTZWFyY2ggZm9yIGRlY2xhcmF0aW9uIHZpYSBwYXR0ZXJucyBhZGRzICciKiIgKi8KLXB1YmxpYyBjbGFzcyBBQSB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2Q5L3AxL0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9kOS9wMS9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwM2Y4MmQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2Q5L3AxL0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcGFja2FnZSBkOS5wMTsKLS8qIFRlc3QgY2FzZSBmb3IgYnVnIDI4MjM2IFNlYXJjaCBmb3IgcmVmcyB0byBjbGFzcyBpbiBoaWVyYXJjaHkgbWF0Y2hlcyBjbGFzcyBvdXRzaWRlIGhpZXJhcmNoeSAqLwotcHVibGljIGNsYXNzIEEgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9kOS9wMi9CLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvZDkvcDIvQi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWJjODJjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9kOS9wMi9CLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXBhY2thZ2UgZDkucDI7Ci0vKiBUZXN0IGNhc2UgZm9yIGJ1ZyAyODIzNiBTZWFyY2ggZm9yIHJlZnMgdG8gY2xhc3MgaW4gaGllcmFyY2h5IG1hdGNoZXMgY2xhc3Mgb3V0c2lkZSBoaWVyYXJjaHkgKi8KLWltcG9ydCBkOS5wMS5BOwotcHVibGljIGNsYXNzIEIgewotCUEgYTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvZTEvQTI5MzY2LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvZTEvQTI5MzY2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlOGVmZGUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2UxL0EyOTM2Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotcGFja2FnZSBlMTsKLS8qIFRlc3QgY2FzZSBmb3IgYnVnIDI5MzY2IFNlYXJjaCByZXBvcnRpbmcgaW52YWxpZCBpbmFjY3VyYXRlIG1hdGNoICovCi1wdWJsaWMgY2xhc3MgQTI5MzY2ICB7Ci0JcHVibGljIHZvaWQgZm9vKCkgewotCQlBMjkzNjYgYTsKLQl9Ci0JcHVibGljIHZvaWQgYmFyKCkgewotCQluZXcgaW50W117IDEKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvZTMvWDMxOTg1LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvZTMvWDMxOTg1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YWRmYmIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2UzL1gzMTk4NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIGUzOwotLyogVGVzdCBjYXNlIGZvciBidWcgMzE5ODUgTlBFIHNlYXJjaGluZyBub24tcXVhbGlmaWVkIGFuZCBjYXNlIGluc2Vuc2l0aXZlIHR5cGUgcmVmICovCi1wdWJsaWMgY2xhc3MgWDMxOTg1IHsKLQlzdGF0aWMgWDMxOTg1IENPTlNUQU5UOwotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2UzL1kzMTk4NS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL2UzL1kzMTk4NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWYyMTRkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9lMy9ZMzE5ODUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSBlMzsKLS8qIFRlc3QgY2FzZSBmb3IgYnVnIDMxOTg1IE5QRSBzZWFyY2hpbmcgbm9uLXF1YWxpZmllZCBhbmQgY2FzZSBpbnNlbnNpdGl2ZSB0eXBlIHJlZiAqLwotcHVibGljIGNsYXNzIFkzMTk4NSB7Ci0JT2JqZWN0IGZvbygpIHsKLQkJcmV0dXJuIFgzMTk4NS5DT05TVEFOVDsKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcC9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcC9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNzU2MWEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3AvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotcGFja2FnZSBwOwotcHVibGljIGNsYXNzIEEgewotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCXB1YmxpYyBYIHg7Ci0JcHVibGljIEEoWCB4KSB7Ci0JCXRoaXMueCA9IHg7Ci0JfQotCXZvaWQgZm9vKCkgewotCQlBLkRFQlVHID0gdHJ1ZTsKLQl9Ci0JcHVibGljIHZvaWQgZm9vKGludCBpLCBTdHJpbmcgcywgWCB4KSB7Ci0JCXgubmV3IElubmVyKCkuZm9vKCk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcC9JLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcC9JLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNjc3NTcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3AvSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wYWNrYWdlIHA7Ci1wdWJsaWMgaW50ZXJmYWNlIEkgewotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3AvWC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3AvWC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWRiMmQ1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9wL1guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLXBhY2thZ2UgcDsKLXB1YmxpYyBjbGFzcyBYIGltcGxlbWVudHMgSSB7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JcHVibGljIEkgZmllbGQ7Ci0JcHVibGljIGNsYXNzIElubmVyIHsKLQkJcHVibGljIFN0cmluZyBmb28oKSB7Ci0JCQlyZXR1cm4gImZvbyI7Ci0JCX0KLQl9Ci0JcHVibGljIFgoKSB7Ci0JCVguREVCVUcgPSB0cnVlOwotCX0KLQlwdWJsaWMgWChpbnQgaSkgewotCX0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYmFyKCkgewotCX0KLQlwdWJsaWMgdm9pZCBmb28oaW50IGksIFN0cmluZyBzLCBYIHgpIHsKLQkJSW5uZXIgaW5uZXIgPSBuZXcgSW5uZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcC9ZLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcC9ZLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MjNiYzQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3AvWS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotcGFja2FnZSBwOwotcHVibGljIGNsYXNzIFkgZXh0ZW5kcyBYIHsKLQlwdWJsaWMgWSgpIHsKLQl9Ci0JcHVibGljIFkoaW50IGkpIHsKLQkJc3VwZXIoaSk7Ci0JfQotCXB1YmxpYyBZKGJvb2xlYW4gYikgewotCQlzdXBlcigxKTsKLSAJfQotCXB1YmxpYyBzdGF0aWMgdm9pZCBiYXIoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3AvWi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3AvWi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWIzMTE0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9wL1ouamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLXBhY2thZ2UgcDsKLXB1YmxpYyBjbGFzcyBaIGV4dGVuZHMgWSB7Ci0JcHVibGljIFooKSB7Ci0JfQotCXB1YmxpYyBaKGludCBpKSB7Ci0JCXN1cGVyKGkpOwotCX0KLQlwdWJsaWMgdm9pZCBmb28oaW50IGksIFN0cmluZyBzLCBYIHgpIHsKLQkJc3VwZXIuZm9vKGksIHMsIG5ldyBZKHRydWUpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9wMi9aLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcDIvWi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTQ1YWEyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9wMi9aLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXBhY2thZ2UgcDI7Ci1wdWJsaWMgY2xhc3MgWiB7Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcDMvWC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3AzL1guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc4ZWM5Ni4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcDMvWC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wYWNrYWdlIHAzOwotcHVibGljIGNsYXNzIFggewotCXB1YmxpYyBzdGF0aWMgaW50IGNvdW50OwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9wMy9wMi9wL1guamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9wMy9wMi9wL1guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNhZDhlZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcDMvcDIvcC9YLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXBhY2thZ2UgcDMucDIucDsKLXB1YmxpYyBjbGFzcyBYIHsKLQlwdWJsaWMgc3RhdGljIGludCBjb3VudDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcDQvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3A0L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgyMzMyNS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcDQvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotcGFja2FnZSBwNDsKLS8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgMUdMQlA2NTogSVRQSkNPUkU6V0lOMjAwMCAtIHNlYXJjaDogdHlwZSByZWZzIC0gaW5jb3JyZWN0IG1hdGNoICovCi1wdWJsaWMgY2xhc3MgQSB7Ci0Jc3RhdGljIEEgQTsKLX0KLWNsYXNzIFggZXh0ZW5kcyBwNC5BewotCXZvaWQgeCgpewotCQlwNC5BLkE9IEEuQTsgIC8qMSovCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9wNS9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcDUvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGFlYWE2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9wNS9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXBhY2thZ2UgcDU7Ci0vKiBSZWdyZXNzaW9uIHRlc3QgZm9yIDFHRDc5WE06IElUUEpDT1JFOldJTk5UIC0gU2VhcmNoIC0gc2VhcmNoIGZvciBmaWVsZCByZWZlcmVuY2VzIC0gbm90IGFsbCBmb3VuZCAqLwotcHVibGljIGNsYXNzIEF7Ci0JaW50IGY7Ci0JQSB4OwotCXZvaWQgaygpewotCQl4LngueC5mPSAwOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcDYvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3A2L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUzYzlmMy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcDYvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotcGFja2FnZSBwNjsKLS8qIFRlc3QgY2FzZSBmb3IgUFIgMUdLQjlZSDogSVRQSkNPUkU6V0lOMjAwMCAtIHNlYXJjaCBmb3IgZmllbGQgcmVmcyAtIGluY29ycmVjdCByZXN1bHRzICovCi1wdWJsaWMgY2xhc3MgQSB7Ci0JcHJvdGVjdGVkIGludCBmOwotCXZvaWQgbSgpIHsKLQkJZisrOwotCX0KLX0KLWNsYXNzIEFBIGV4dGVuZHMgQSB7Ci0JcHJvdGVjdGVkIGludCBmOwotfQotY2xhc3MgQiB7Ci0JQSBhOwotCUFBIGI7Ci0JQSBhYiA9IG5ldyBBQSgpOwotCXZvaWQgbSgpIHsKLQkJYS5mID0gMDsgLyoxKi8KLQkJYi5mID0gMDsgLyoyKi8KLQkJYWIuZiA9IDA7IC8qMyovCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9wNy9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcDcvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTI5ZTYzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9wNy9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1wYWNrYWdlIHA3OwotLyogVGVzdCBjYXNlIGZvciAxRzUyRjdQOiBJVFBKQ09SRTpXSU5OVCAtIFNlYXJjaCAtIGZpbmRzIGJvZ3VzIHJlZmVyZW5jZXMgdG8gY2xhc3MgKi8KLXB1YmxpYyBjbGFzcyBBIHsKLX0KLQotY2xhc3MgQyB7Ci0Jdm9pZCBtKCkgewotCQljbGFzcyBBIHsKLQkJfQotCQluZXcgQSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcDgvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3A4L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZjYjU0NC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcDgvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotcGFja2FnZSBwODsKLS8qIFRlc3QgY2FzZSBmb3IgYnVnICMzNDMzIHNlYXJjaDogbWlzc2luZyBmaWVsZCBvY2N1cnJlY25jZXMgKDFHS1o4SjYpICAqLwotcHVibGljIGNsYXNzIEF7Ci0JcHJvdGVjdGVkIGludCBnOwotCXZvaWQgbSgpewotCQlnKys7Ci0JfQotfQotY2xhc3MgQiBleHRlbmRzIEF7Ci0Jdm9pZCBtKCl7Ci0JCWc9IDA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3A5L1guamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9wOS9YLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YmRkZWQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3A5L1guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXBhY2thZ2UgcDk7Ci0vKiBUZXN0IGNhc2UgZm9yIFBSIDFHSzhUWEU6IElUUEpDT1JFOldJTjIwMDAgLSBzZWFyY2g6IG1pc3NpbmcgZmllbGQgcmVmZXJlbmNlICovCi1wdWJsaWMgY2xhc3MgWCB7Ci0JcHVibGljIFggZjsKLQlwdWJsaWMgaW50IGs7Ci0Jdm9pZCBtKCkgewotCQlmb3IgKGludCBnID0gMDsgZyA8IDEwOyBnKyspIHsKLQkJfQotCQlmLmsgPSAwOyAvLzw8Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9xMS9CLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcTEvQi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzU1ZWViLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9xMS9CLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wYWNrYWdlIHExOwotLyogVGVzdCBjYXNlIGZvciBQUiAxR0s5MEg0OiBJVFBKQ09SRTpXSU4yMDAwIC0gc2VhcmNoOiBtaXNzaW5nIHBhY2thZ2UgcmVmZXJlbmNlICovCi1wdWJsaWMgY2xhc3MgQnsKLQl2b2lkIG0oQUEgZnJlZCl7Ci0JCXEyLkEubGVuZ3RoKCk7IC8vPDw8Ci0JfQotfQotY2xhc3MgQUF7Ci0Jc3RhdGljIFN0cmluZyBBOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9xMi9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcTIvQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTk1YTVkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9xMi9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2UgcTI7Ci0vKiBUZXN0IGNhc2UgZm9yIDFHSzkwSDQ6IElUUEpDT1JFOldJTjIwMDAgLSBzZWFyY2g6IG1pc3NpbmcgcGFja2FnZSByZWZlcmVuY2UgKi8KLXB1YmxpYyBjbGFzcyBBewotCXB1YmxpYyBzdGF0aWMgaW50IGxlbmd0aCgpe3JldHVybiA0Mjt9OwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9xMy9BJEIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9xMy9BJEIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgwNjFkZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcTMvQSRCLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXBhY2thZ2UgcTM7Ci0vKiBUZXN0IGNhc2UgZm9yIGJ1ZyAzMzEwIFNtb2tlIDEyNDogQ29tcGlsZSBlcnJvcnMgaW50cm9kdWNlZCB3aXRoIHJlbmFtZSByZWZhY3RvcmluZyAoMUdGQksyRykgKi8KLXB1YmxpYyBjbGFzcyBBJEIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9xNC9DLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcTQvQy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjRmMTI3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9xNC9DLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2UgcTQ7Ci0vKiBUZXN0IGNhc2UgZm9yIDMzMTAgU21va2UgMTI0OiBDb21waWxlIGVycm9ycyBpbnRyb2R1Y2VkIHdpdGggcmVuYW1lIHJlZmFjdG9yaW5nICgxR0ZCSzJHKSAqLwotcHVibGljIGNsYXNzIEMgewotCU9iamVjdCBmb28oKSB7Ci0JCXJldHVybiBuZXcgcTMuQSRCKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9xNS9BUS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3E1L0FRLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNGY4NjYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3E1L0FRLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1wYWNrYWdlIHE1OwotLyogVGVzdCBjYXNlIGZvciBidWcgNTA2OCBzZWFyY2g6IG1pc3NpbmcgbWV0aG9kIHJlZmVyZW5jZSAqLwotaW50ZXJmYWNlIEl7Ci12b2lkIGsoKTsKLX0KLWNsYXNzIFR7Ci0Jdm9pZCBtKCl7Ci0JCWNsYXNzIFggaW1wbGVtZW50cyBJewotCQkJcHVibGljIHZvaWQgaygpe30KLQkJfTsKLQkJWCB4PSBuZXcgWCgpOwotCQl4LmsoKTsgLyoqLwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9xNi9DRC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3E2L0NELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzM2U4YzkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3E2L0NELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1wYWNrYWdlIHE2OwotLyogVGVzdCBjYXNlIGZvciBidWcgNTA2OSBzZWFyY2g6IG1ldGhvZCByZWZlcmVuY2UgaW4gc3VwZXIgbWlzc2luZyAqLwotY2xhc3MgQVEgewotCXB1YmxpYyB2b2lkIGsoKXt9Ci19Ci0KLWNsYXNzIEFRRSBleHRlbmRzIEFRewotCXB1YmxpYyB2b2lkIGsoKXsKLQkJc3VwZXIuaygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9xNy9BUS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3E3L0FRLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNzAyNDYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3E3L0FRLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1wYWNrYWdlIHE3OwotLyogVGVzdCBjYXNlIGZvciBidWcgNTA3MCBzZWFyY2g6IG1pc3NpbmcgaW50ZXJmYWNlIG1ldGhvZCByZWZlcmVuY2UgKi8KLWludGVyZmFjZSBJIHsKLXZvaWQgaygpOwotfQotY2xhc3MgQzEgaW1wbGVtZW50cyBJewotCXB1YmxpYyB2b2lkIGsoKXt9OwotfQotY2xhc3MgRHsKLQl2b2lkIGgoKXsKLQkJSSBhPSBuZXcgQzEoKTsKLQkJYS5rKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3E4L0VjbGlwc2VUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcTgvRWNsaXBzZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRlNmJlMS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcTgvRWNsaXBzZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXBhY2thZ2UgcTg7Ci0vKiBUZXN0IGNhc2UgZm9yIGJ1ZyA1ODIxIFJlZmFjdG9yID4gUmVuYW1lIHJlbmFtZXMgbG9jYWwgdmFyaWFibGUgaW5zdGVhZCBvZiBtZW1iZXIgaW4gY2FzZSBvZiBuYW1lIGNsYXNoICAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VUZXN0IHsKLSAgICBwdWJsaWMgaW50IHRlc3QgPSAwOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBFY2xpcHNlVGVzdCB0ZXN0ID0gbmV3IEVjbGlwc2VUZXN0KCk7Ci0KLSAgICAgICAgdGVzdC50ZXN0ID0gMTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcTkvSS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3E5L0kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFmMWM4Mi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcTkvSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotcGFja2FnZSBxOTsKLS8qIFRlc3QgY2FzZSBmb3IgYnVnIDU4NjIgc2VhcmNoIDogdG9vIG1hbnkgbWF0Y2hlcyBvbiBzZWFyY2ggd2l0aCBPclBhdHRlcm4gKi8KLWludGVyZmFjZSBJewotdm9pZCBtKCk7Ci19Ci0KLWNsYXNzIEExIGltcGxlbWVudHMgSXsKLXB1YmxpYyB2b2lkIG0oKXt9Ci19Ci1pbnRlcmZhY2UgSTF7Ci12b2lkIG0oKTsKLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9yL0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9yL0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcxYmZlNy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvci9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1wYWNrYWdlIHI7Ci0vKiBUZXN0IGNhc2UgZm9yIFBSIDFHS0FRSlM6IElUUEpDT1JFOldJTjIwMDAgLSBzZWFyY2g6IGluY29ycmVjdCByZXN1bHRzIGZvciBuZXN0ZWQgdHlwZXMgKi8KLXB1YmxpYyBjbGFzcyBBIHsKLQljbGFzcyBYIHsKLQkJWChYIFgpIHsKLQkJCW5ldyBYKG51bGwpOwotCQl9Ci0JfQotCUEoKSB7Ci0JfQotCUEoQSBBKSB7Ci0JfQotCUEgbSgpIHsKLQkJbmV3IFgobnVsbCk7Ci0JCXJldHVybiAoQSkgbmV3IEEoKTsKLQl9Ci19OwotY2xhc3MgQiB7Ci0JQS5YIGF4ID0gbmV3IEEoKS5uZXcgWChudWxsKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcjIvSS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3IyL0kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlkOTUyOS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcjIvSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wYWNrYWdlIHIyOwotLyogUmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMjIxMDIgTm90IGFsbCBpbXBsZW1lbnRvcnMgZm91bmQgZm9yIElQYXJ0TGlzdGVuZXIgKi8KLXB1YmxpYyBpbnRlcmZhY2UgSSB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3IyL1guamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9yMi9YLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMTEyOTMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3IyL1guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcGFja2FnZSByMjsKLS8qIFJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDIyMTAyIE5vdCBhbGwgaW1wbGVtZW50b3JzIGZvdW5kIGZvciBJUGFydExpc3RlbmVyICovCi1wdWJsaWMgY2xhc3MgWCB7Ci0JSSBmaWVsZCA9IG5ldyBJKCkgewotCX07Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3IzL0EyMTQ4NS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3IzL0EyMTQ4NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzA3ZjJkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9yMy9BMjE0ODUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcGFja2FnZSByMzsKLS8qIFRlc3QgY2FzZSBmb3IgYnVnIDIxNDg1IE5QRSB3aGVuIGRvaW5nIGEgcmVmZXJlbmNlIHNlYXJjaCB0byBhIHBhY2thZ2UgKi8KLWNsYXNzIEEyMTQ4NSB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3I0L0IyMTQ4NS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3I0L0IyMTQ4NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGRmOTNhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9yNC9CMjE0ODUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcGFja2FnZSByNDsKLS8qIFRlc3QgY2FzZSBmb3IgYnVnIDIxNDg1IE5QRSB3aGVuIGRvaW5nIGEgcmVmZXJlbmNlIHNlYXJjaCB0byBhIHBhY2thZ2UgKi8KLWltcG9ydCByMy5BMjE0ODU7Ci1wdWJsaWMgY2xhc3MgQjIxNDg1IGV4dGVuZHMgQTIxNDg1IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcjUvWFlaLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcjUvWFlaLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOWQ3ZjkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3I1L1hZWi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wYWNrYWdlIHI1OwotLyogVGVzdCBjYXNlIGZvciBidWcgMTcyMTAgTm8gbWF0Y2ggZm91bmQgd2hlbiBxdWVyeSBjb250YWlucyAnPycgICovCi1wdWJsaWMgY2xhc3MgWFlaIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcjYvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3I2L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIxMjhlYi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcjYvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wYWNrYWdlIHI2OwotLyogVGVzdCBjYXNlIGZvciBidWcgMjMwNzcgIHNlYXJjaDogZG9lcyBub3QgZmluZCB0eXBlIHJlZmVyZW5jZXMgaW4gc29tZSBpbXBvcnRzICAqLwotcHVibGljIGNsYXNzIEEgewotICBwdWJsaWMgY2xhc3MgSW5uZXJ7Ci0gICAgcHVibGljIGNsYXNzIElubmVySW5uZXJ7Ci0gICAgfSAgIAotICB9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcjYvQi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3I2L0IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAyMmE4ZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcjYvQi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotcGFja2FnZSByNjsKLS8qIFRlc3QgY2FzZSBmb3IgYnVnIDIzMDc3ICBzZWFyY2g6IGRvZXMgbm90IGZpbmQgdHlwZSByZWZlcmVuY2VzIGluIHNvbWUgaW1wb3J0cyAgKi8KLWltcG9ydCByNi5BOwotaW1wb3J0IHI2LkEuSW5uZXI7Ci1pbXBvcnQgcjYuQS5Jbm5lci5Jbm5lcklubmVyOwotaW1wb3J0IHI2LkEuKjsKLWltcG9ydCByNi5BLklubmVyLio7Ci1pbXBvcnQgcjYuQS5Jbm5lci5Jbm5lcklubmVyLio7Ci1wdWJsaWMgY2xhc3MgQiB7Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcjcvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3I3L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA2NjJhOC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcjcvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wYWNrYWdlIHI3OwotLyogVGVzdCBjYXNlIGZvciBidWcgMzc0Mzggc2VhcmNoZW5naW5nIE5QRSBpbiBzZWFyY2hEZWNsYXJhdGlvbnNPZlJlZmVyZW5jZWRUeXBlcyAqLwotcHVibGljIGNsYXNzIEEgewotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3I3L0IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9yNy9CLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NTVlNmQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3I3L0IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcGFja2FnZSByNzsKLS8qIFRlc3QgY2FzZSBmb3IgYnVnIDM3NDM4IHNlYXJjaGVuZ2luZyBOUEUgaW4gc2VhcmNoRGVjbGFyYXRpb25zT2ZSZWZlcmVuY2VkVHlwZXMgKi8KLXB1YmxpYyBjbGFzcyBCIHsKLQlBIGE7Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcjgvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3I4L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE1YjcwZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvcjgvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wYWNrYWdlIHI4OwotLyogVGVzdCBjYXNlIGZvciBidWcgMzcxNjYgTlBFIGluIFNlYXJjaEVuZ2luZSB3aGVuIG1hdGNoaW5nIHR5cGUgYWdhaW5zdCBQcm9ibGVtUmVmZXJlbmNlQmluZGluZyAqLwotaW1wb3J0IHI4LkI7Ci1wdWJsaWMgY2xhc3MgQSB7Ci0JQSBhOwotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3MxL1guamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9zMS9YLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkY2E2YTUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3MxL1guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcGFja2FnZSBzMTsKLS8qIFRlc3QgY2FzZSBmb3IgYnVnIDMyMzAgU2VhcmNoIC0gVG9vIG1hbnkgdHlwZSByZWZlcmVuY2VzIGZvciBxdWVyeSBlbmRpbmcgd2l0aCAqICgxR0FaVkdJKSAqLwotcHVibGljIGNsYXNzIFggewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9zMS9ZLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvczEvWS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDRjYmRiLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9zMS9ZLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2UgczE7Ci0vKiBUZXN0IGNhc2UgZm9yIGJ1ZyAzMjMwIFNlYXJjaCAtIFRvbyBtYW55IHR5cGUgcmVmZXJlbmNlcyBmb3IgcXVlcnkgZW5kaW5nIHdpdGggKiAoMUdBWlZHSSkgKi8KLXB1YmxpYyBjbGFzcyBZIHsKLQlYIGZbXTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvczIvWC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3MyL1guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1OTAzOC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvczIvWC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wYWNrYWdlIHMyOwotLyogVGVzdCBjYXNlIGZvciBidWcgMzIzMCBTZWFyY2ggLSBUb28gbWFueSB0eXBlIHJlZmVyZW5jZXMgZm9yIHF1ZXJ5IGVuZGluZyB3aXRoICogKDFHQVpWR0kpICovCi1wdWJsaWMgY2xhc3MgWCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3MyL1ouamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9zMi9aLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MmRkY2MuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3MyL1ouamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcGFja2FnZSBzMjsKLS8qIFRlc3QgY2FzZSBmb3IgYnVnIDMyMzAgU2VhcmNoIC0gVG9vIG1hbnkgdHlwZSByZWZlcmVuY2VzIGZvciBxdWVyeSBlbmRpbmcgd2l0aCAqICgxR0FaVkdJKSAqLwotcHVibGljIGNsYXNzIFogewotCVggZltdOwotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3MzL0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9zMy9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5Nzk4NzcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3MzL0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLXBhY2thZ2UgczM7Ci0vKiBSZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyAyMzMyOSBzZWFyY2g6IGluY29ycmVjdCByYW5nZSBmb3IgdHlwZSByZWZlcmVuY2VzIGluIGJyYWNrZXRzICovCi1wdWJsaWMgY2xhc3MgQSB7Ci0JaW50IGZpZWxkOwotCU9iamVjdCBmb28oKSB7Ci0JCXJldHVybiAoIEIgICl0aGlzOwotCX0KLQlpbnQgYmFyKCkgewotCQlyZXR1cm4gKCBmaWVsZCAgKTsKLQl9Ci19Ci1jbGFzcyBCIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvc2QvQVEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9zZC9BUS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjZhZTA4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy9zZC9BUS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotcGFja2FnZSBzZDsKLQotLyogVGVzdCBjYXNlIGZvciBQUiAxR0tDSDNOOiBJVFBKQ09SRTpXSU4yMDAwIC0gc2VhcmNoOiBtZXRob2QgcmVmcyAtIHN1cGVyIGNhbGwgbm90IGZvdW5kICovCi1wdWJsaWMgY2xhc3MgQVF7Ci0JcHVibGljIHZvaWQgaygpe30KLX0KLQotY2xhc3MgQVFFIGV4dGVuZHMgQVF7Ci0JcHVibGljIHZvaWQgaygpewotCQlzdXBlci5rKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy93Yy9YLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvd2MvWC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDgwNTBhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3NyYy93Yy9YLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXBhY2thZ2Ugd2M7Ci1wdWJsaWMgY2xhc3MgWCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3djMS9YLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvd2MxL1guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JjMGQwOS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvd2MxL1guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcGFja2FnZSB3YzE7Ci1wdWJsaWMgY2xhc3MgWCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvc3JjL3djMi9ZLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvd2MyL1kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E1ZmI3My4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC9zcmMvd2MyL1kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcGFja2FnZSB3YzI7Ci1wdWJsaWMgY2xhc3MgWSB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvdGVzdDIwNjMxLmphciBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3Rlc3QyMDYzMS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MzE2NGUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvdGVzdDIwNjMxLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3Rlc3QyMDYzMS56aXAgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC90ZXN0MjA2MzEuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODIwZjNkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9KYXZhU2VhcmNoL3Rlc3QyMDYzMS56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC90ZXN0MjQ3NDEuamFyIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL0phdmFTZWFyY2gvdGVzdDI0NzQxLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUzNWZhMC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvSmF2YVNlYXJjaC90ZXN0MjQ3NDEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OTE3MDQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IkpDTF9MSUIiIHNvdXJjZXBhdGg9IkpDTF9TUkMiIHJvb3RwYXRoPSJKQ0xfU1JDUk9PVCIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Inp6ei5qYXIiIHNvdXJjZXBhdGg9Ii9SZXNvbHZlL3p6enNyYy56aXAiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJwMy5qYXIiIHNvdXJjZXBhdGg9Ii9SZXNvbHZlL3Azc3JjLnppcCIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9InRlc3QyNTg4OC5qYXIiIHNvdXJjZXBhdGg9Ii9SZXNvbHZlL3Rlc3QyNTg4OHNyYy56aXAiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJwNC5qYXIiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJjbGFzcy1mb2xkZXIiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA1Y2U3My4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL2NsYXNzLWZvbGRlci9SZXNvbHZlQ29uc3RydWN0b3JDYWxsT2ZNZW1iZXJUeXBlJElubmVyLmNsYXNzIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvY2xhc3MtZm9sZGVyL1Jlc29sdmVDb25zdHJ1Y3RvckNhbGxPZk1lbWJlclR5cGUkSW5uZXIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YzlkNWUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvY2xhc3MtZm9sZGVyL1Jlc29sdmVDb25zdHJ1Y3RvckNhbGxPZk1lbWJlclR5cGUkSW5uZXIuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9jbGFzcy1mb2xkZXIvUmVzb2x2ZUNvbnN0cnVjdG9yQ2FsbE9mTWVtYmVyVHlwZS5jbGFzcyBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL2NsYXNzLWZvbGRlci9SZXNvbHZlQ29uc3RydWN0b3JDYWxsT2ZNZW1iZXJUeXBlLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjllZGFjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL2NsYXNzLWZvbGRlci9SZXNvbHZlQ29uc3RydWN0b3JDYWxsT2ZNZW1iZXJUeXBlLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvY2xhc3MtZm9sZGVyL1Jlc29sdmVDb25zdHJ1Y3RvckNhbGxPZk1lbWJlclR5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL2NsYXNzLWZvbGRlci9SZXNvbHZlQ29uc3RydWN0b3JDYWxsT2ZNZW1iZXJUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNzJiNTMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvY2xhc3MtZm9sZGVyL1Jlc29sdmVDb25zdHJ1Y3RvckNhbGxPZk1lbWJlclR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcHVibGljIGNsYXNzIFJlc29sdmVDb25zdHJ1Y3RvckNhbGxPZk1lbWJlclR5cGUgewotCWNsYXNzIElubmVyIHt9Ci0Jdm9pZCBmb28oKXsKLQkJbmV3IElubmVyKCk7CQotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3AzLmphciBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3AzLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZkNTJiZi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9wMy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9wM3NyYy56aXAgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9wM3NyYy56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4N2UyYzcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvcDNzcmMuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvcDQuamFyIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvcDQuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmY0NzRhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3A0LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3A0c3JjLnppcCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3A0c3JjLnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYxMTJjMC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9wNHNyYy56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvUmVzb2x2ZUFic3RyYWN0TWV0aG9kLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvUmVzb2x2ZUFic3RyYWN0TWV0aG9kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MGQ1MzYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVBYnN0cmFjdE1ldGhvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wdWJsaWMgY2xhc3MgUmVzb2x2ZUFic3RyYWN0TWV0aG9kIHsKLQl2b2lkIHRlc3QoQWJzdHJhY3RDbGFzcyBhKXsKLQkJYS5mb28oKTsKLQl9Ci19Ci1hYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENsYXNzIGltcGxlbWVudHMgU3VwZXJJbnRlcmZhY2UgewotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVBcmd1bWVudE5hbWUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlQXJndW1lbnROYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMjY2NGMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVBcmd1bWVudE5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIFJlc29sdmVBcmd1bWVudE5hbWUgewotCXB1YmxpYyB2b2lkIGZvbyhPYmplY3QgdmFyMSwgaW50IHZhcjIpewotCQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvUmVzb2x2ZUFycmF5TGVuZ3RoLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvUmVzb2x2ZUFycmF5TGVuZ3RoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZDMxM2IuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVBcnJheUxlbmd0aC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgUmVzb2x2ZUFycmF5TGVuZ3RoIHsKLQlwdWJsaWMgaW50IGZvbygpIHsKLQkJT2JqZWN0W10gYXJyYXkgPSBuZXcgT2JqZWN0WzBdOwotCQlyZXR1cm4gYXJyYXkubGVuZ3RoOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvUmVzb2x2ZUNhdGNoQXJndW1lbnROYW1lLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvUmVzb2x2ZUNhdGNoQXJndW1lbnROYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMTU0NGMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVDYXRjaEFyZ3VtZW50TmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1wdWJsaWMgY2xhc3MgUmVzb2x2ZUNhdGNoQXJndW1lbnROYW1lIHsKLQlwdWJsaWMgdm9pZCBmb28oKXsKLQkJdHJ5ewotCQl9IGNhdGNoKE9iamVjdAl2YXIxKXsKLQkJfSBjYXRjaChpbnQgdmFyMil7Ci0JCX0KLQl9CQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlQ2F0Y2hBcmd1bWVudFR5cGUxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvUmVzb2x2ZUNhdGNoQXJndW1lbnRUeXBlMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjg5MDA2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlQ2F0Y2hBcmd1bWVudFR5cGUxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBSZXNvbHZlQ2F0Y2hBcmd1bWVudFR5cGUxIHsKLQl2b2lkIGZvbygpIHsKLQkJdHJ5IHsKLQkJfSBjYXRjaCAoWDEuWTEgZSkgewotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlQ2F0Y2hBcmd1bWVudFR5cGUyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvUmVzb2x2ZUNhdGNoQXJndW1lbnRUeXBlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDgxMThjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlQ2F0Y2hBcmd1bWVudFR5cGUyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBSZXNvbHZlQ2F0Y2hBcmd1bWVudFR5cGUyIHsKLQl2b2lkIGZvbygpIHsKLQkJdHJ5IHsKLQkJfSBjYXRjaCAoWDEuWTEgZSkgewotCQl9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVDbGFzczEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlQ2xhc3MxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwOGQ4NGMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVDbGFzczEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotaW1wb3J0IHAxLio7Ci0KLXB1YmxpYyBjbGFzcyBSZXNvbHZlQ2xhc3MxewotCXByaXZhdGUgWFtdIHg7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVDbGFzczIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlQ2xhc3MyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NDMxNmYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVDbGFzczIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotaW1wb3J0IHAxLio7Ci0KLXB1YmxpYyBjbGFzcyBSZXNvbHZlQ2xhc3MyewotCXB1YmxpYyB2b2lkIGZvbygpIHsKLQkJWCB4ID0gbnVsbDsJCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlQ2xhc3MzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvUmVzb2x2ZUNsYXNzMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGQyYmFjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlQ2xhc3MzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWltcG9ydCBwMS4qOwotCi1wdWJsaWMgY2xhc3MgUmVzb2x2ZUNsYXNzM3sKLQlYW10geCA9IG5ldyBYW117fTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvUmVzb2x2ZUNsYXNzNC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVDbGFzczQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgzZWMzZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvUmVzb2x2ZUNsYXNzNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1pbXBvcnQgcDEuKjsKLQotcHVibGljIGNsYXNzIFJlc29sdmVDbGFzczR7Ci0JcHVibGljIFggZm9vKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVDbGFzczUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlQ2xhc3M1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MGRlMjguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVDbGFzczUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotaW1wb3J0IHAxLio7Ci0KLXB1YmxpYyBjbGFzcyBSZXNvbHZlQ2xhc3M1ewotCXB1YmxpYyB2b2lkIGZvbyhYIHgpIHsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVDbGFzczYuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlQ2xhc3M2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ODllMGEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVDbGFzczYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIFJlc29sdmVDbGFzczYgZXh0ZW5kcyBwMS5YIHsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlQ29uc3RydWN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlQ29uc3RydWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWExMmZhNS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvUmVzb2x2ZUNvbnN0cnVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBSZXNvbHZlQ29uc3RydWN0b3IgewotCXB1YmxpYyBSZXNvbHZlQ29uc3RydWN0b3IoaW50IGkpIHsKLQl9Ci0JcHVibGljCVJlc29sdmVDb25zdHJ1Y3RvcihTdHJpbmcgcykgewotCX0KLQlwdWJsaWMgdm9pZCBmb28oKSB7Ci0JCVJlc29sdmVDb25zdHJ1Y3RvciBjID0gbmV3IFJlc29sdmVDb25zdHJ1Y3RvcigiIik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlQ29uc3RydWN0b3JEZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMWI4ZmYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBSZXNvbHZlQ29uc3RydWN0b3JEZWNsYXJhdGlvbiB7Ci0JcHVibGljIFJlc29sdmVDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKGludCBpKSB7Ci0JfQotCXB1YmxpYwlSZXNvbHZlQ29uc3RydWN0b3JEZWNsYXJhdGlvbihTdHJpbmcgcykgewotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvUmVzb2x2ZUVtcHR5U2VsZWN0aW9uT25NZXRob2QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlRW1wdHlTZWxlY3Rpb25Pbk1ldGhvZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDQ5ZGE5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlRW1wdHlTZWxlY3Rpb25Pbk1ldGhvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wdWJsaWMgY2xhc3MgUmVzb2x2ZUVtcHR5U2VsZWN0aW9uT25NZXRob2QgewotCXZvaWQgZm9vKCl7Ci0JfQotCXZvaWQgYmFyKCl7Ci0JCWZvbygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlRXhwbGljaXRTdXBlckNvbnN0cnVjdG9yQ2FsbC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVFeHBsaWNpdFN1cGVyQ29uc3RydWN0b3JDYWxsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMWJiM2EuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVFeHBsaWNpdFN1cGVyQ29uc3RydWN0b3JDYWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBSZXNvbHZlRXhwbGljaXRTdXBlckNvbnN0cnVjdG9yQ2FsbCBleHRlbmRzIFN1cGVyQ2xhc3MgewotCXB1YmxpYyBSZXNvbHZlRXhwbGljaXRTdXBlckNvbnN0cnVjdG9yQ2FsbChpbnQgeCl7Ci0JCXN1cGVyKHgpOwkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVFeHBsaWNpdFRoaXNDb25zdHJ1Y3RvckNhbGwuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlRXhwbGljaXRUaGlzQ29uc3RydWN0b3JDYWxsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZDgyZmQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVFeHBsaWNpdFRoaXNDb25zdHJ1Y3RvckNhbGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotcHVibGljIGNsYXNzIFJlc29sdmVFeHBsaWNpdFRoaXNDb25zdHJ1Y3RvckNhbGwgewotCXB1YmxpYyBSZXNvbHZlRXhwbGljaXRUaGlzQ29uc3RydWN0b3JDYWxsKCl7Ci0JCi0JfQotCQotCXB1YmxpYyBSZXNvbHZlRXhwbGljaXRUaGlzQ29uc3RydWN0b3JDYWxsKGludCB4KXsKLQkJdGhpcygpOwkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVGaWVsZC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVGaWVsZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjcyMjg4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlRmllbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcHVibGljIGNsYXNzIFJlc29sdmVGaWVsZCB7Ci0JcHVibGljIGludCBmb287Ci0JcHVibGljIHZvaWQgYmFyKCkgewotCQl0aGlzLmZvbyA9IDA7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlRmllbGREZWNsYXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVGaWVsZERlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYmQxZjIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVGaWVsZERlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBSZXNvbHZlRmllbGREZWNsYXJhdGlvbiB7Ci0JcHVibGljIGludCBmb287Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVJbXBvcnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlSW1wb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3OTc4MGUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVJbXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotaW1wb3J0IGEuYi5JbXBvcnRlZENsYXNzOwotCi1wdWJsaWMgY2xhc3MgUmVzb2x2ZUltcG9ydCB7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvUmVzb2x2ZUlubmVyQ2xhc3NBc1BhcmFtYXRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVJbm5lckNsYXNzQXNQYXJhbWF0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNiYWVjNS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvUmVzb2x2ZUlubmVyQ2xhc3NBc1BhcmFtYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotcHVibGljIGNsYXNzIFJlc29sdmVJbm5lckNsYXNzQXNQYXJhbWF0ZXIgewotCWNsYXNzIElubmVyIHsKLQl9Ci0Jdm9pZCBmb28oU3RyaW5nIHMpIHsKLQl9Ci0Jdm9pZCBmb28oSW5uZXIgaSkgewotCX0KLQl2b2lkIGJhcihJbm5lciBpKSB7Ci0JCWZvbyhpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVJbnRlcmZhY2UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlSW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNTYzOTUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIFJlc29sdmVJbnRlcmZhY2UgaW1wbGVtZW50cyBwMS5ZIHsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlTG9jYWxOYW1lLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvUmVzb2x2ZUxvY2FsTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjVkNDRmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlTG9jYWxOYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBSZXNvbHZlTG9jYWxOYW1lIHsKLQlwdWJsaWMgdm9pZCBmb28oKXsKLQkJT2JqZWN0IHZhcjE7Ci0JCWludCB2YXIyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvUmVzb2x2ZU1lbWJlclR5cGVEZWNsYXJhdGlvbjEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlTWVtYmVyVHlwZURlY2xhcmF0aW9uMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGZhNzM5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlTWVtYmVyVHlwZURlY2xhcmF0aW9uMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wdWJsaWMgY2xhc3MgUmVzb2x2ZU1lbWJlclR5cGVEZWNsYXJhdGlvbjEgewotCXB1YmxpYyBpbnRlcmZhY2UgTWVtYmVySW50ZXJmYWNlIHsJCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlTWVtYmVyVHlwZURlY2xhcmF0aW9uMi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVNZW1iZXJUeXBlRGVjbGFyYXRpb24yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ODE5ODQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVNZW1iZXJUeXBlRGVjbGFyYXRpb24yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBSZXNvbHZlTWVtYmVyVHlwZURlY2xhcmF0aW9uMiB7Ci0JY2xhc3MgTWVtYmVyIHsKLQkJY2xhc3MgTWVtYmVyT2ZNZW1iZXIgewotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlTWVzc2FnZVNlbmRPbkJhc2VUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvUmVzb2x2ZU1lc3NhZ2VTZW5kT25CYXNlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmU1MWVlLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlTWVzc2FnZVNlbmRPbkJhc2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBSZXNvbHZlTWVzc2FnZVNlbmRPbkJhc2VUeXBlIHsKLQlib29sZWFuIGZvbzsKLQlwdWJsaWMgaW50IGJvbygpIHsKLQkJZm9vLmhlbGxvKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlTWV0aG9kLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvUmVzb2x2ZU1ldGhvZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDAwZTY5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlTWV0aG9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBSZXNvbHZlTWV0aG9kIHsKLQlwdWJsaWMgdm9pZCBmb28oaW50IGkpIHsKLQl9Ci0JcHVibGljIHZvaWQgZm9vKFN0cmluZyBzKSB7Ci0JfQotCXB1YmxpYyB2b2lkIGJhcigpIHsKLQkJbmV3IFJlc29sdmVNZXRob2QoKS5mb28oIiIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvUmVzb2x2ZU1ldGhvZERlY2xhcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvUmVzb2x2ZU1ldGhvZERlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MTY1NzQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVNZXRob2REZWNsYXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wdWJsaWMgY2xhc3MgUmVzb2x2ZU1ldGhvZERlY2xhcmF0aW9uIHsKLQlwdWJsaWMgdm9pZCBmb28oaW50IGkpIHsKLQl9Ci0JcHVibGljIHZvaWQgZm9vKFN0cmluZyBzKSB7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlTWV0aG9kV2l0aEluY29ycmVjdFBhcmFtZXRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVNZXRob2RXaXRoSW5jb3JyZWN0UGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NzY2MjcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVNZXRob2RXaXRoSW5jb3JyZWN0UGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBSZXNvbHZlTWV0aG9kV2l0aEluY29ycmVjdFBhcmFtZXRlciB7Ci0JcHVibGljIHZvaWQgZm9vKGludCB4KSB7Ci0JfQotCXB1YmxpYyB2b2lkIGJhcigpIHsKLQkJZm9vKCJTdHJpbmciKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVQYWNrYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvUmVzb2x2ZVBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRlMGFiMS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvUmVzb2x2ZVBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotaW1wb3J0IGphdmEubGFuZy4qOwotCi1wdWJsaWMgY2xhc3MgUmVzb2x2ZVBhY2thZ2UgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlUGFydGlhbGx5UXVhbGlmaWVkVHlwZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVQYXJ0aWFsbHlRdWFsaWZpZWRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZmE2NDkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVQYXJ0aWFsbHlRdWFsaWZpZWRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBSZXNvbHZlUGFydGlhbGx5UXVhbGlmaWVkVHlwZSB7Ci0Jdm9pZCBmb28oKSB7Ci0JCWphdmEubGFuZy5PYmplY3QgbzsKLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvUmVzb2x2ZVF1YWxpZmllZFR5cGUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlUXVhbGlmaWVkVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDI3NGUxLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlUXVhbGlmaWVkVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wdWJsaWMgY2xhc3MgUmVzb2x2ZVF1YWxpZmllZFR5cGUgewotCXZvaWQgZm9vKCkgewotCQlqYXZhLmxhbmcuT2JqZWN0IG87Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVUeXBlRGVjbGFyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlVHlwZURlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YmRlNGQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVUeXBlRGVjbGFyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcHVibGljIGNsYXNzIFJlc29sdmVUeXBlRGVjbGFyYXRpb24gewotCQotfQotY2xhc3MgT3RoZXJUeXBlIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvUmVzb2x2ZVR5cGVFbXB0eVNlbGVjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVUeXBlRW1wdHlTZWxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY2MDQ2ZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvUmVzb2x2ZVR5cGVFbXB0eVNlbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wdWJsaWMgY2xhc3MgUmVzb2x2ZVR5cGVFbXB0eVNlbGVjdGlvbiB7Ci0JT2JqZWN0IG87Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVUeXBlRW1wdHlTZWxlY3Rpb24yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvUmVzb2x2ZVR5cGVFbXB0eVNlbGVjdGlvbjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI3MzJmZi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvUmVzb2x2ZVR5cGVFbXB0eVNlbGVjdGlvbjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcHVibGljIGNsYXNzIFJlc29sdmVUeXBlRW1wdHlTZWxlY3Rpb24yIHsKLQlPYmplY3QgbzsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvUmVzb2x2ZVR5cGVJbkNvbW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlVHlwZUluQ29tbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmJlMmI0Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlVHlwZUluQ29tbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1pbXBvcnQgcDIuWDsKLXB1YmxpYyBjbGFzcyBSZXNvbHZlVHlwZUluQ29tbWVudHsKLQkvKiByZXR1cm4gWCAqLwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9SZXNvbHZlVW5pY29kZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVVbmljb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YjY2MmEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1Jlc29sdmVVbmljb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBjbGFzcyBSZXNvbHZlVW5pY29kZSB7Ci0JcHVibGljIGphdmEubGFuZy5cdTAwNTN0cmluZyBzOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9TdXBlckNsYXNzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvU3VwZXJDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTQ0NDMzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9TdXBlckNsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXB1YmxpYyBjbGFzcyBTdXBlckNsYXNzIHsKLQlwdWJsaWMgU3VwZXJDbGFzcyhpbnQgeCl7Ci0JCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9TdXBlckludGVyZmFjZS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1N1cGVySW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwODNlNDguLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1N1cGVySW50ZXJmYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXB1YmxpYyBpbnRlcmZhY2UgU3VwZXJJbnRlcmZhY2UgewotCXZvaWQgZm9vKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL1gxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvWDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE2OTlkMi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvWDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcHVibGljIGNsYXNzIFgxIGV4dGVuZHMgRXhjZXB0aW9uIHsKLSAgIHB1YmxpYyBjbGFzcyBZMSBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0gICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL2EvYi9JbXBvcnRlZENsYXNzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvYS9iL0ltcG9ydGVkQ2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkzODZlNy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvYS9iL0ltcG9ydGVkQ2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotcGFja2FnZSBhLmI7Ci0KLXB1YmxpYyBjbGFzcyBJbXBvcnRlZENsYXNzIHsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9wMS9YLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvcDEvWC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGRiNDMzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9wMS9YLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2UgcDE7Ci0KLXB1YmxpYyBjbGFzcyBYIHsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9wMS9ZLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvcDEvWS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWYxYzhiLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3NyYy9wMS9ZLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2UgcDE7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgWSB7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvcDIvWC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvc3JjL3AyL1guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIxNDkzNi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS9zcmMvcDIvWC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIHAyOwotCi1wdWJsaWMgY2xhc3MgWCB7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS90ZXN0MjU4ODguamFyIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvdGVzdDI1ODg4LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ1YjA3Yy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS90ZXN0MjU4ODguamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvdGVzdDI1ODg4c3JjLnppcCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3Rlc3QyNTg4OHNyYy56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NmY2MDQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvdGVzdDI1ODg4c3JjLnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3p6ei5qYXIgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS96enouamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmQ2NzE5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9SZXNvbHZlL3p6ei5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS96enpzcmMuemlwIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1Jlc29sdmUvenp6c3JjLnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ3NTZlMi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvUmVzb2x2ZS96enpzcmMuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1NuaXBwZXRDb21wbGV0aW9uLy5jbGFzc3BhdGggYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvU25pcHBldENvbXBsZXRpb24vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFiYzVjNi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvU25pcHBldENvbXBsZXRpb24vLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iSkNMX0xJQiIgc291cmNlcGF0aD0iSkNMX1NSQyIgcm9vdHBhdGg9IkpDTF9TUkNST09UIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0iY2xhc3MtZm9sZGVyIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9TbmlwcGV0Q29tcGxldGlvbi8ucHJvamVjdCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9TbmlwcGV0Q29tcGxldGlvbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA1Y2U3My4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvU25pcHBldENvbXBsZXRpb24vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvU25pcHBldENvbXBsZXRpb24vY2xhc3MtZm9sZGVyL2FhL2JiL2NjL0FDbGFzcyQxJFZpY3RvcnkuY2xhc3MgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvU25pcHBldENvbXBsZXRpb24vY2xhc3MtZm9sZGVyL2FhL2JiL2NjL0FDbGFzcyQxJFZpY3RvcnkuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjY2YxMWIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1NuaXBwZXRDb21wbGV0aW9uL2NsYXNzLWZvbGRlci9hYS9iYi9jYy9BQ2xhc3MkMSRWaWN0b3J5LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1NuaXBwZXRDb21wbGV0aW9uL2NsYXNzLWZvbGRlci9hYS9iYi9jYy9BQ2xhc3MkSW5uZXIuY2xhc3MgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvU25pcHBldENvbXBsZXRpb24vY2xhc3MtZm9sZGVyL2FhL2JiL2NjL0FDbGFzcyRJbm5lci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIyOTM4Mi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvU25pcHBldENvbXBsZXRpb24vY2xhc3MtZm9sZGVyL2FhL2JiL2NjL0FDbGFzcyRJbm5lci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9TbmlwcGV0Q29tcGxldGlvbi9jbGFzcy1mb2xkZXIvYWEvYmIvY2MvQUNsYXNzLmNsYXNzIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1NuaXBwZXRDb21wbGV0aW9uL2NsYXNzLWZvbGRlci9hYS9iYi9jYy9BQ2xhc3MuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOTUxMTMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1NuaXBwZXRDb21wbGV0aW9uL2NsYXNzLWZvbGRlci9hYS9iYi9jYy9BQ2xhc3MuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvU25pcHBldENvbXBsZXRpb24vY2xhc3MtZm9sZGVyL2FhL2JiL2NjL0NDbGFzcyQxJFZpY3RvcnkuY2xhc3MgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvU25pcHBldENvbXBsZXRpb24vY2xhc3MtZm9sZGVyL2FhL2JiL2NjL0NDbGFzcyQxJFZpY3RvcnkuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NzJmY2EuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1NuaXBwZXRDb21wbGV0aW9uL2NsYXNzLWZvbGRlci9hYS9iYi9jYy9DQ2xhc3MkMSRWaWN0b3J5LmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1NuaXBwZXRDb21wbGV0aW9uL2NsYXNzLWZvbGRlci9hYS9iYi9jYy9DQ2xhc3MkSW5uZXIuY2xhc3MgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvU25pcHBldENvbXBsZXRpb24vY2xhc3MtZm9sZGVyL2FhL2JiL2NjL0NDbGFzcyRJbm5lci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY1ZDRiYS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvU25pcHBldENvbXBsZXRpb24vY2xhc3MtZm9sZGVyL2FhL2JiL2NjL0NDbGFzcyRJbm5lci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9TbmlwcGV0Q29tcGxldGlvbi9jbGFzcy1mb2xkZXIvYWEvYmIvY2MvQ0NsYXNzLmNsYXNzIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1NuaXBwZXRDb21wbGV0aW9uL2NsYXNzLWZvbGRlci9hYS9iYi9jYy9DQ2xhc3MuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MWRhMjkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1NuaXBwZXRDb21wbGV0aW9uL2NsYXNzLWZvbGRlci9hYS9iYi9jYy9DQ2xhc3MuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvU25pcHBldENvbXBsZXRpb24vY2xhc3MtZm9sZGVyL2FhL2JiL2NjL0NDbGFzcy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1NuaXBwZXRDb21wbGV0aW9uL2NsYXNzLWZvbGRlci9hYS9iYi9jYy9DQ2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM1NmM2YS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvU25pcHBldENvbXBsZXRpb24vY2xhc3MtZm9sZGVyL2FhL2JiL2NjL0NDbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotcGFja2FnZSBhYS5iYi5jYzsKLQotcHVibGljIGNsYXNzIENDbGFzcyBleHRlbmRzIFN1cGVyQ2xhc3MgewotCXB1YmxpYyBjbGFzcyBJbm5lciBleHRlbmRzIFN1cGVySW5uZXJDbGFzcyB7Ci0JCXB1YmxpYyBJbm5lcigpIHRocm93cyBFeGNlcHRpb24gewotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGZvbyhTdXBlckNsYXNzIHZhcnNjLCBmaW5hbCBpbnQgdmFyKXsKLQkJY2xhc3MgVmljdG9yeXt9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGJhcihpbnQgeCwgaW50IHkpewotCQkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1NuaXBwZXRDb21wbGV0aW9uL2NsYXNzLWZvbGRlci9hYS9iYi9jYy9TdXBlckNsYXNzLmNsYXNzIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1NuaXBwZXRDb21wbGV0aW9uL2NsYXNzLWZvbGRlci9hYS9iYi9jYy9TdXBlckNsYXNzLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDg5MzYxLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9TbmlwcGV0Q29tcGxldGlvbi9jbGFzcy1mb2xkZXIvYWEvYmIvY2MvU3VwZXJDbGFzcy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9TbmlwcGV0Q29tcGxldGlvbi9jbGFzcy1mb2xkZXIvYWEvYmIvY2MvU3VwZXJJbm5lckNsYXNzLmNsYXNzIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1NuaXBwZXRDb21wbGV0aW9uL2NsYXNzLWZvbGRlci9hYS9iYi9jYy9TdXBlcklubmVyQ2xhc3MuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMmNjMzkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1NuaXBwZXRDb21wbGV0aW9uL2NsYXNzLWZvbGRlci9hYS9iYi9jYy9TdXBlcklubmVyQ2xhc3MuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvU25pcHBldENvbXBsZXRpb24vc3JjL2FhL2JiL2NjL0JDbGFzcy5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1NuaXBwZXRDb21wbGV0aW9uL3NyYy9hYS9iYi9jYy9CQ2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIxNTY1Zi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvU25pcHBldENvbXBsZXRpb24vc3JjL2FhL2JiL2NjL0JDbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotcGFja2FnZSBhYS5iYi5jYzsKLQotcHVibGljIGNsYXNzIEJDbGFzcyBleHRlbmRzIFN1cGVyQ2xhc3MgewotCXB1YmxpYyBjbGFzcyBJbm5lciBleHRlbmRzIFN1cGVySW5uZXJDbGFzcyB7Ci0JCXB1YmxpYyBJbm5lcigpIHRocm93cyBFeGNlcHRpb24gewotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGZvbyhTdXBlckNsYXNzIHZhcnNjLCBmaW5hbCBpbnQgdmFyKXsKLQkJY2xhc3MgVmljdG9yeXt9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGJhcihpbnQgeCwgaW50IHkpewotCQkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHkvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZTNhYTcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iSkNMX0xJQiIgc291cmNlcGF0aD0iSkNMX1NSQyIgcm9vdHBhdGg9IkpDTF9TUkNST09UIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0ibGliLmphciIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeS8ucHJvamVjdCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDVjZTczLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHkvTm90SW5DbGFzc3BhdGgvZS9FLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeS9Ob3RJbkNsYXNzcGF0aC9lL0UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ4N2NjMi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeS9Ob3RJbkNsYXNzcGF0aC9lL0UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcGFja2FnZSBlOwotaW1wb3J0IHAxLio7Ci1wdWJsaWMgY2xhc3MgRSBleHRlbmRzIFggewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5L2xpYi5qYXIgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeS9saWIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDc1NDQ2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5L2xpYi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeS9zcmMvcDEvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHkvc3JjL3AxL0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMyZGVhZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeS9zcmMvcDEvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIHAxOwotcHVibGljIGNsYXNzIEEgZXh0ZW5kcyBCIHsKLX0KLWNsYXNzIEIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5L3NyYy9wMS9EZWVwLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeS9zcmMvcDEvRGVlcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2IyZTc3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5L3NyYy9wMS9EZWVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXBhY2thZ2UgcDE7Ci1wdWJsaWMgY2xhc3MgRGVlcCBleHRlbmRzIFogewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5L3NyYy9wMS9JMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHkvc3JjL3AxL0kxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNTVmZDYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHkvc3JjL3AxL0kxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXBhY2thZ2UgcDE7Ci1wdWJsaWMgaW50ZXJmYWNlIEkxIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeS9zcmMvcDEvSTIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5L3NyYy9wMS9JMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGJhZjg4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5L3NyYy9wMS9JMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wYWNrYWdlIHAxOwotcHVibGljIGludGVyZmFjZSBJMiB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHkvc3JjL3AxL1guamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5L3NyYy9wMS9YLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMGVlYTYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHkvc3JjL3AxL1guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcGFja2FnZSBwMTsKLXB1YmxpYyBjbGFzcyBYIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeS9zcmMvcDEvWS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHkvc3JjL3AxL1kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMzYmRkOC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeS9zcmMvcDEvWS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wYWNrYWdlIHAxOwotcHVibGljIGNsYXNzIFkgZXh0ZW5kcyBYIGltcGxlbWVudHMgSTEsIEkyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeS9zcmMvcDEvWi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHkvc3JjL3AxL1ouamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg1MjExNi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeS9zcmMvcDEvWi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wYWNrYWdlIHAxOwotcHVibGljIGNsYXNzIFogZXh0ZW5kcyBZIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeS9zcmMvcDIvSS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHkvc3JjL3AyL0kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE4YTk4Ny4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeS9zcmMvcDIvSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wYWNrYWdlIHAyOwotcHVibGljIGludGVyZmFjZSBJIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeS9zcmMvcDIvSTEuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5L3NyYy9wMi9JMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDNiODA1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5L3NyYy9wMi9JMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wYWNrYWdlIHAyOwotcHVibGljIGludGVyZmFjZSBJMSBleHRlbmRzIEkgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5L3NyYy9wMi9JMi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHkvc3JjL3AyL0kyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNGI1OGMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHkvc3JjL3AyL0kyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXBhY2thZ2UgcDI7Ci1wdWJsaWMgaW50ZXJmYWNlIEkyIGV4dGVuZHMgSSB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHkvc3JjL3AyL0kzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeS9zcmMvcDIvSTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDczMjI1Ni4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeS9zcmMvcDIvSTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcGFja2FnZSBwMjsKLXB1YmxpYyBpbnRlcmZhY2UgSTMgZXh0ZW5kcyBJMSB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHkvc3JjL3AyL1guamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5L3NyYy9wMi9YLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYmJjMGUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHkvc3JjL3AyL1guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcGFja2FnZSBwMjsKLXB1YmxpYyBjbGFzcyBYIGltcGxlbWVudHMgSSB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHkvc3JjL3AyL1kuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5L3NyYy9wMi9ZLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMWJlNmIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHkvc3JjL3AyL1kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcGFja2FnZSBwMjsKLXB1YmxpYyBjbGFzcyBZIGV4dGVuZHMgWCBpbXBsZW1lbnRzIEkzIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeS9zcmMvcDMvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHkvc3JjL3AzL0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAwYzc3ZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeS9zcmMvcDMvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wYWNrYWdlIHAzOwotLyogVGVzdCBjYXNlIGZvciBidWcgMjM2NDQgaGllcmFyY2h5OiBnZXRBbGxTdXBlclR5cGVzIGRvZXMgbm90IGluY2x1ZGUgYWxsIHN1cGVyaW50ZXJmYWNlcz8gICovCi1wdWJsaWMgY2xhc3MgQSBpbXBsZW1lbnRzIEkgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5L3NyYy9wMy9CLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeS9zcmMvcDMvQi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTA5OTcwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5L3NyYy9wMy9CLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXBhY2thZ2UgcDM7Ci0vKiBUZXN0IGNhc2UgZm9yIGJ1ZyAyMzY0NCBoaWVyYXJjaHk6IGdldEFsbFN1cGVyVHlwZXMgZG9lcyBub3QgaW5jbHVkZSBhbGwgc3VwZXJpbnRlcmZhY2VzPyAgKi8KLXB1YmxpYyBjbGFzcyBCIGV4dGVuZHMgQSBpbXBsZW1lbnRzIEkxIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeS9zcmMvcDMvSS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHkvc3JjL3AzL0kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ3OTIwOS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeS9zcmMvcDMvSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wYWNrYWdlIHAzOwotLyogVGVzdCBjYXNlIGZvciBidWcgMjM2NDQgaGllcmFyY2h5OiBnZXRBbGxTdXBlclR5cGVzIGRvZXMgbm90IGluY2x1ZGUgYWxsIHN1cGVyaW50ZXJmYWNlcz8gICovCi1wdWJsaWMgaW50ZXJmYWNlIEkgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5L3NyYy9wMy9JMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHkvc3JjL3AzL0kxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4OGUzMTkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHkvc3JjL3AzL0kxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXBhY2thZ2UgcDM7Ci0vKiBUZXN0IGNhc2UgZm9yIGJ1ZyAyMzY0NCBoaWVyYXJjaHk6IGdldEFsbFN1cGVyVHlwZXMgZG9lcyBub3QgaW5jbHVkZSBhbGwgc3VwZXJpbnRlcmZhY2VzPyAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgSTEgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5L3NyYy9wNC9YLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeS9zcmMvcDQvWC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTBhZThkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5L3NyYy9wNC9YLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXBhY2thZ2UgcDQ7Ci0vKiBUZXN0IGNhc2UgZm9yIGJ1ZyAyNDY5MSBNaXNzaW5nIGludGVyZmFjZSBtYWtlcyBoaWVyYXJjaHkgaW5jb21wbGV0ZSAqLwotcHVibGljIGNsYXNzIFggaW1wbGVtZW50cyBNaXNzaW5nIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeS9zcmMvcDUvWC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHkvc3JjL3A1L1guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBhODFiZi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeS9zcmMvcDUvWC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIHA1OwotcHVibGljIGNsYXNzIFggewotCXB1YmxpYyBjbGFzcyBJbm5lciB7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5L3NyYy93Yy9YLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeS9zcmMvd2MvWC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDgwNTBhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5L3NyYy93Yy9YLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXBhY2thZ2Ugd2M7Ci1wdWJsaWMgY2xhc3MgWCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHlEZXBlbmRlbnQvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5RGVwZW5kZW50Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ODhjZDQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHlEZXBlbmRlbnQvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL1R5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24iLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJKQ0xfTElCIiBzb3VyY2VwYXRoPSJKQ0xfU1JDIiByb290cGF0aD0iSkNMX1NSQ1JPT1QiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSIiLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHlEZXBlbmRlbnQvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeURlcGVuZGVudC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThkNTM3Ny4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeURlcGVuZGVudC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0PlR5cGVIaWVyYXJjaHlOb3RpZmljYXRpb248L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5RGVwZW5kZW50L0RlcGVuZGVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHlEZXBlbmRlbnQvRGVwZW5kZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYzRhZDEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHlEZXBlbmRlbnQvRGVwZW5kZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWltcG9ydCBhLio7Ci1wdWJsaWMgY2xhc3MgRGVwZW5kZW50IGV4dGVuZHMgQSB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24vLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZTNhYTcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24vLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iSkNMX0xJQiIgc291cmNlcGF0aD0iSkNMX1NSQyIgcm9vdHBhdGg9IkpDTF9TUkNST09UIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0ibGliLmphciIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbi8ucHJvamVjdCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDVjZTczLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24vRXJyb3IuY2xhc3MgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbi9FcnJvci5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZkMWUwOS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbi9FcnJvci5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uL3NyYy9hL0EuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uL3NyYy9hL0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U4NDMxMS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbi9zcmMvYS9BLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXBhY2thZ2UgYTsKLXB1YmxpYyBjbGFzcyBBIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbi9zcmMvYi9CLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbi9zcmMvYi9CLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MGM0OGEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24vc3JjL2IvQi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIGI7Ci1pbXBvcnQgYS4qOwotcHVibGljIGNsYXNzIEIgZXh0ZW5kcyBBIHsKLQlwdWJsaWMgT2JqZWN0IHZhbHVlOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uL3NyYy9jL0MuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uL3NyYy9jL0MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZiMTRhOC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbi9zcmMvYy9DLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2UgYzsKLWltcG9ydCBwLio7Ci1pbXBvcnQgaS4qOwotcHVibGljIGNsYXNzIEMgZXh0ZW5kcyBYIGltcGxlbWVudHMgSTIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uL3NyYy9kL0QuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uL3NyYy9kL0QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYzODk5OS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbi9zcmMvZC9ELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXBhY2thZ2UgZDsKLWltcG9ydCBjLio7Ci1wdWJsaWMgY2xhc3MgRCBleHRlbmRzIEMgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uL3NyYy9lL0UuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uL3NyYy9lL0UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVmNTZmYy4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbi9zcmMvZS9FLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXBhY2thZ2UgZTsKLWltcG9ydCBwLio7Ci1wdWJsaWMgY2xhc3MgRSBleHRlbmRzIFggewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uL3NyYy9pL0kxLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbi9zcmMvaS9JMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODIzMmM3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uL3NyYy9pL0kxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXBhY2thZ2UgaTsKLXB1YmxpYyBpbnRlcmZhY2UgSTEgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uL3NyYy9pL0kyLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbi9zcmMvaS9JMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjdhNjFmLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uL3NyYy9pL0kyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXBhY2thZ2UgaTsKLXB1YmxpYyBpbnRlcmZhY2UgSTIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uL3NyYy9wL0V4dGVybmFsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbi9zcmMvcC9FeHRlcm5hbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGMxZWZlLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uL3NyYy9wL0V4dGVybmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXBhY2thZ2UgcDsKLXB1YmxpYyBjbGFzcyBFeHRlcm5hbCB7Ci0JcHVibGljIE9iamVjdCBmaWVsZDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbi9zcmMvcC9NeUVycm9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbi9zcmMvcC9NeUVycm9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZTg5ZjkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24vc3JjL3AvTXlFcnJvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1wYWNrYWdlIHA7Ci1wdWJsaWMgY2xhc3MgTXlFcnJvciBleHRlbmRzIEVycm9yIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbi9zcmMvcC9YLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbi9zcmMvcC9YLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YTI3YmUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24vc3JjL3AvWC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wYWNrYWdlIHA7Ci1pbXBvcnQgYi4qOwotaW1wb3J0IGkuKjsKLXB1YmxpYyBjbGFzcyBYIGV4dGVuZHMgQiBpbXBsZW1lbnRzIEkxIHsKLQlwdWJsaWMgT2JqZWN0IGZpZWxkOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uL3NyYy9wL290aGVyL0V4dGVybmFsLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbi9zcmMvcC9vdGhlci9FeHRlcm5hbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTgzODM5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uL3NyYy9wL290aGVyL0V4dGVybmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXBhY2thZ2UgcC5vdGhlcjsKLXB1YmxpYyBjbGFzcyBFeHRlcm5hbCB7Ci0JcHVibGljIE9iamVjdCBmaWVsZDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbi9zcmMvcDIvQS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHlOb3RpZmljYXRpb24vc3JjL3AyL0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM4NmFkZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbi9zcmMvcDIvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wYWNrYWdlIHAyOwotLyogVGVzdCBjYXNlIGZvciBidWcgNDkxNyBMYXRlc3QgYnVpbGQgZmFpbHMgdXBkYXRpbmcgVHlwZUhpZXJhcmNoeSAqLwotcHVibGljIGNsYXNzIEEgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uL3NyYy9wMi9CLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeU5vdGlmaWNhdGlvbi9zcmMvcDIvQi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjU0NDcxLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5Tm90aWZpY2F0aW9uL3NyYy9wMi9CLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXBhY2thZ2UgcDI7Ci0vKiBUZXN0IGNhc2UgZm9yIGJ1ZyA0OTE3IExhdGVzdCBidWlsZCBmYWlscyB1cGRhdGluZyBUeXBlSGllcmFyY2h5ICovCi1wdWJsaWMgY2xhc3MgQiB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHlTZXJpYWxpemF0aW9uLy5jbGFzc3BhdGggYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeVNlcmlhbGl6YXRpb24vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdhNDdkOS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeVNlcmlhbGl6YXRpb24vLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0gICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IkpDTF9MSUIiIHNvdXJjZXBhdGg9IkpDTF9TUkMiIHJvb3RwYXRoPSJKQ0xfU1JDUk9PVCIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeVNlcmlhbGl6YXRpb24vLnByb2plY3QgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeVNlcmlhbGl6YXRpb24vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNWNlNzMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHlTZXJpYWxpemF0aW9uLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHlTZXJpYWxpemF0aW9uL3NyYy9wMS9JMS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHlTZXJpYWxpemF0aW9uL3NyYy9wMS9JMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzRlYzcyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5U2VyaWFsaXphdGlvbi9zcmMvcDEvSTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcGFja2FnZSBwMTsKLXB1YmxpYyBpbnRlcmZhY2UgSTEgewotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHlTZXJpYWxpemF0aW9uL3NyYy9wMS9JMi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHlTZXJpYWxpemF0aW9uL3NyYy9wMS9JMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2UxNTE5Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5U2VyaWFsaXphdGlvbi9zcmMvcDEvSTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcGFja2FnZSBwMTsKLXB1YmxpYyBpbnRlcmZhY2UgSTIgZXh0ZW5kcyBJNiB7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeVNlcmlhbGl6YXRpb24vc3JjL3AxL0kzLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeVNlcmlhbGl6YXRpb24vc3JjL3AxL0kzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NDQ3YjEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHlTZXJpYWxpemF0aW9uL3NyYy9wMS9JMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wYWNrYWdlIHAxOwotcHVibGljIGludGVyZmFjZSBJMyB7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeVNlcmlhbGl6YXRpb24vc3JjL3AxL0k0LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeVNlcmlhbGl6YXRpb24vc3JjL3AxL0k0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2OGJjYzcuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHlTZXJpYWxpemF0aW9uL3NyYy9wMS9JNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wYWNrYWdlIHAxOwotcHVibGljIGludGVyZmFjZSBJNCB7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeVNlcmlhbGl6YXRpb24vc3JjL3AxL0k1LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeVNlcmlhbGl6YXRpb24vc3JjL3AxL0k1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZmUxMGMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHlTZXJpYWxpemF0aW9uL3NyYy9wMS9JNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wYWNrYWdlIHAxOwotcHVibGljIGludGVyZmFjZSBJNSB7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeVNlcmlhbGl6YXRpb24vc3JjL3AxL0k2LmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeVNlcmlhbGl6YXRpb24vc3JjL3AxL0k2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OGQ5MDMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHlTZXJpYWxpemF0aW9uL3NyYy9wMS9JNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wYWNrYWdlIHAxOwotcHVibGljIGludGVyZmFjZSBJNiB7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZUhpZXJhcmNoeVNlcmlhbGl6YXRpb24vc3JjL3AxL1guamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5U2VyaWFsaXphdGlvbi9zcmMvcDEvWC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGI3ZDJjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5U2VyaWFsaXphdGlvbi9zcmMvcDEvWC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1wYWNrYWdlIHAxOwotcHVibGljIGNsYXNzIFggaW1wbGVtZW50cyBJNSB7Ci0JCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5U2VyaWFsaXphdGlvbi9zcmMvcDEvWS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHlTZXJpYWxpemF0aW9uL3NyYy9wMS9ZLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NTNlOTMuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHlTZXJpYWxpemF0aW9uL3NyYy9wMS9ZLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXBhY2thZ2UgcDE7Ci1wdWJsaWMgY2xhc3MgWSBleHRlbmRzIFggaW1wbGVtZW50cyBJMSwgSTIsIElBLCBJQiB7Ci0JCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlSGllcmFyY2h5U2VyaWFsaXphdGlvbi9zcmMvcDEvWi5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHlTZXJpYWxpemF0aW9uL3NyYy9wMS9aLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MzgyNjIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVIaWVyYXJjaHlTZXJpYWxpemF0aW9uL3NyYy9wMS9aLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXBhY2thZ2UgcDE7Ci1wdWJsaWMgY2xhc3MgWiBleHRlbmRzIFkgaW1wbGVtZW50cyBJMywgSTQsIElDIHsKLQkJCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVSZXNvbHZlLy5jbGFzc3BhdGggYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZVJlc29sdmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDljYWJkZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZVJlc29sdmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iSkNMX0xJQiIgc291cmNlcGF0aD0iSkNMX1NSQyIgcm9vdHBhdGg9IkpDTF9TUkNST09UIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlUmVzb2x2ZS8ucHJvamVjdCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlUmVzb2x2ZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA1Y2U3My4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZVJlc29sdmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZVJlc29sdmUvc3JjL3AvVHlwZVJlc29sdmUuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlUmVzb2x2ZS9zcmMvcC9UeXBlUmVzb2x2ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODVjYzNjLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlUmVzb2x2ZS9zcmMvcC9UeXBlUmVzb2x2ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotcGFja2FnZSBwOwotaW1wb3J0IHAxLlg7Ci1pbXBvcnQgcDIuKjsKLXB1YmxpYyBjbGFzcyBUeXBlUmVzb2x2ZSB7Ci0JY2xhc3MgQSB7Ci0JCWNsYXNzIEIgewotCQkJY2xhc3MgRCB7Ci0JCQl9Ci0JCX0KLQkJY2xhc3MgQyB7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVSZXNvbHZlL3NyYy9wMS9YLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZVJlc29sdmUvc3JjL3AxL1guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQxNTBmNS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZVJlc29sdmUvc3JjL3AxL1guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcGFja2FnZSBwMTsKLXB1YmxpYyBjbGFzcyBYIHsKLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlUmVzb2x2ZS9zcmMvcDIvWS5qYXZhIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVSZXNvbHZlL3NyYy9wMi9ZLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZTdhODIuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVSZXNvbHZlL3NyYy9wMi9ZLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLXBhY2thZ2UgcDI7Ci1wdWJsaWMgY2xhc3MgWSB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVSZXNvbHZlL3NyYy9wMy9CLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZVJlc29sdmUvc3JjL3AzL0IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNiYjlhZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZVJlc29sdmUvc3JjL3AzL0IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXBhY2thZ2UgcDM7Ci0vKiBUZXN0IGNhc2UgZm9yIGJ1ZyAyMzgyOSBJVHlwZTo6cmVzb2x2ZVR5cGUgaW5jb3JyZWN0bHkgcmV0dXJucyBudWxsICAqLwotcHVibGljIGNsYXNzIEJ7fQotY2xhc3MgQSBleHRlbmRzIEJ7Ci19Ci0KLWNsYXNzIFRlc3R7Ci0Jdm9pZCBmKCl7Ci0JCUEgYT0gbmV3IEEoKTsKLQkJZihhKTsKLQl9Ci0Jdm9pZCBmKEIgYil7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUudGVzdHMubW9kZWwvd29ya3NwYWNlL1R5cGVSZXNvbHZlL3NyYy9wNC9BLmphdmEgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZVJlc29sdmUvc3JjL3A0L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM3NGRmNi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZVJlc29sdmUvc3JjL3A0L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotcGFja2FnZSBwNDsKLXB1YmxpYyBjbGFzcyBBIHsKLQljbGFzcyBJbm5lciB7Ci0JCXB1YmxpYyBpbnQgYW1vdW50KCkgewotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZHQuY29yZS50ZXN0cy5tb2RlbC93b3Jrc3BhY2UvVHlwZVJlc29sdmUvc3JjL3A0L0IuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlUmVzb2x2ZS9zcmMvcDQvQi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGYyNjhkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpkdC5jb3JlLnRlc3RzLm1vZGVsL3dvcmtzcGFjZS9UeXBlUmVzb2x2ZS9zcmMvcDQvQi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wYWNrYWdlIHA0OwotcHVibGljIGNsYXNzIEIgewotCUIoaW50IHQsIEEuSW5uZXIgYSkgewotCQlhLmFtb3VudCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2JhdGNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb21waWxlci9iYXRjaC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL21lc3NhZ2VzLnByb3BlcnRpZXMKaW5kZXggNjI3ZjM5YS4uZWNkMDU3NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYmF0Y2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvbXBpbGVyL2JhdGNoL21lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTEyLDcgKzEyLDcgQEAKIAogIyMjIGNvbXBpbGVyIAogY29tcGlsZXIubmFtZSA9IEVjbGlwc2UgSmF2YSBDb21waWxlcgotY29tcGlsZXIudmVyc2lvbiA9IDAuMzU2Citjb21waWxlci52ZXJzaW9uID0gMC4zNTkKIGNvbXBpbGVyLmNvcHlyaWdodCA9IENvcHlyaWdodCBJQk0gQ29ycCAyMDAwLCAyMDAzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAjIyMgc2Nhbm5pbmcKQEAgLTc3LDYwICs3Nyw3NCBAQAogb3V0cHV0Lm5vQ2xhc3NGaWxlQ3JlYXRlZCA9IE5vIC5jbGFzcyBmaWxlIGNyZWF0ZWQgZm9yIGZpbGUgbmFtZWQgezB9IGJlY2F1c2Ugb2YgYW4gSU9FeGNlcHRpb24uCiAKICMjIyBtaXNjZWxsYW5lb3VzCi0gICMjIyB7MD1jb21waWxlci5uYW1lfSB7MT1jb21waWxlci52ZXJzaW9ufSwgezI9Y29tcGlsZXIuY29weXJpZ2h0fQotbWlzYy52ZXJzaW9uID0gezB9IHsxfSwgezJ9Ci0gICMjIyB7MD1jb21waWxlci5uYW1lfSB7MT1jb21waWxlci52ZXJzaW9ufSwgezI9Y29tcGlsZXIuY29weXJpZ2h0fQotbWlzYy51c2FnZSA9IHswfSB7MX1cblwKLQkJezJ9XG5cblwKLQkJVXNhZ2U6IDxvcHRpb25zPiA8c291cmNlIGZpbGVzIHwgZGlyZWN0b3JpZXM+XG5cblwKLQkJd2hlcmUgb3B0aW9ucyBpbmNsdWRlOlxuXAotCQktaGVscAkJCQlkaXNwbGF5IHRoaXMgaGVscCBtZXNzYWdlXG5cCi0JCS12ZXJzaW9uCQkJb25seSBkaXNwbGF5IGNvbXBpbGVyIHZlcnNpb24gbnVtYmVyXG5cCi0JCS1jbGFzc3BhdGggb3IgLWNwCQkJPGRpciAxPjs8ZGlyIDI+Oy4uLjs8ZGlyIFA+XG5cCi0JCS1ib290Y2xhc3NwYXRoCQk8ZGlyIDE+OzxkaXIgMj47Li4uOzxkaXIgUD5cblwKLQkJLWQgPGRpcj4JCQlkZXN0aW5hdGlvbiBkaXJlY3RvcnkgKGlmIG9taXR0ZWQsIG5vIGRpcmVjdG9yeSBpcyBjcmVhdGVkKVxuXAotCQkgICBcdC1kIG5vbmUJCQlubyBjbGFzc2ZpbGUgaXMgZ2VuZXJhdGVkXG5cCi0JCS10YXJnZXQgPHZlcj4JCXNldCBjbGFzc2ZpbGUgdGFyZ2V0ICgxLjEgdG8gMS40LCBkZWZhdWx0IGlzICcnMS4xJycpXG5cCi0JCS0xLjMgCQkJCXVzZSAxLjMgY29tcGxpYW5jZSBsZXZlbCAoZGVmYXVsdClcblwKLQkJLTEuNCAJCQkJdXNlIDEuNCBjb21wbGlhbmNlIGxldmVsXG5cCi0JCS1zb3VyY2UgPHZlcj4JCXNldCBzb3VyY2UgbGV2ZWwgKDEuMyBvciAxLjQsIGRlZmF1bHQgbWF0Y2hlcyBjb21wbGlhbmNlIGxldmVsKVxuXAotCQktbm93YXJuCQkJCW5vIHdhcm5pbmcgKGVxdWl2YWxlbnQgdG8gJyctd2Fybjpub25lJycpXG5cCi0JCS13YXJuOiA8bGV2ZWw+CQlzZXQgd2FybmluZyBsZXZlbCAoZS5nLiAnJy13YXJuOnVudXNlZExvY2FscyxkZXByZWNhdGlvbicnKVxuXAotCQlcdGFsbERlcHJlY2F0aW9uCQkJIGRlcHJlY2F0aW9uIChpbmNsdWRpbmcgaW4gZGVwcmVjYXRlZCBjb2RlKVxuXAotCQlcdGFzc2VydElkZW50aWZpZXIJCSAnJ2Fzc2VydCcnIHVzZWQgYXMgaWRlbnRpZmllclxuXAotCQlcdGNvbnN0cnVjdG9yTmFtZQkJCSBtZXRob2Qgd2l0aCBjb25zdHJ1Y3RvciBuYW1lIFx0XHRcdFx0ICAoZGVmYXVsdCkgXG5cCi0JCVx0ZGVwcmVjYXRpb24JCQkJIGRlcHJlY2F0aW9uIChvdXRzaWRlIGRlcHJlY2F0ZWQgY29kZSkgXHRcdCAgKGRlZmF1bHQpXG5cCi0JCVx0bWFza2VkQ2F0Y2hCbG9jawkJIGhpZGRlbiBjYXRjaCBibG9jayBcdFx0XHRcdFx0XHQgIChkZWZhdWx0KVxuXAotCQlcdG5scwkJCQkJCSBzdHJpbmcgbGl0ZXJhbCBsYWNraW5nIG5vbi1ubHMgdGFnIC8vJE5PTi1OTFMtPG4+JFxuXAotCQlcdHBhY2thZ2VEZWZhdWx0TWV0aG9kCSBhdHRlbXB0IHRvIG92ZXJyaWRlIHBhY2thZ2UtZGVmYXVsdCBtZXRob2QgICAoZGVmYXVsdClcblwKLQkJXHR1bnVzZWRBcmd1bWVudAkJCSB1bnVzZWQgbWV0aG9kIGFyZ3VtZW50IChuZXZlciByZWFkKVxuXAotCQlcdHVudXNlZEltcG9ydAkJCSB1bnVzZWQgaW1wb3J0IGRlY2xhcmF0aW9uIFx0XHRcdFx0XHQgIChkZWZhdWx0KVxuXAotCQlcdHVudXNlZExvY2FsCQkJCSB1bnVzZWQgbG9jYWwgdmFyaWFibGUgKG5ldmVyIHJlYWQpXG5cCi0JCVx0dW51c2VkUHJpdmF0ZQkJCSB1bnVzZWQgcHJpdmF0ZSBtZW1iZXIgZGVjbGFyYXRpb25cblwKLQkJXHRzdGF0aWNSZWNlaXZlcgkJCSBub24tc3RhdGljIHJlZmVyZW5jZSB0byBzdGF0aWMgbWVtYmVyIFx0XHQgIChkZWZhdWx0KVxuXAotCQlcdG5vRWZmZWN0QXNzaWduCQkJIGFzc2lnbm1lbnQgd2l0aG91dCBlZmZlY3QgXHRcdFx0XHRcdCAgKGRlZmF1bHQpXG5cCi0JCVx0Y29uZGl0aW9uQXNzaWduCQkJIHBvc3NpYmxlIGFjY2lkZW50YWwgYm9vbGVhbiBhc3NpZ25tZW50XG5cCi0JCVx0c3ludGhldGljQWNjZXNzCQkJIHN5bnRoZXRpYyBhY2Nlc3MgZm9yIGlubmVyY2xhc3NcblwKLQkJXHRpbnRlcmZhY2VOb25Jbmhlcml0ZWQJIGludGVyZmFjZSBub24taW5oZXJpdGVkIG1ldGhvZCBjb21wYXRpYmlsaXR5IChkZWZhdWx0KVxuXAotCQlcdGxvY2FsSGlkaW5nCQkJCSBsb2NhbCB2YXJpYWJsZSBoaWRpbmcgYW5vdGhlciB2YXJpYWJsZVxuXAotCQlcdGZpZWxkSGlkaW5nCQkJCSBmaWVsZCBoaWRpbmcgYW5vdGhlciB2YXJpYWJsZVxuXAotCQlcdHNwZWNpYWxQYXJhbUhpZGluZwkgCSBjb25zdHJ1Y3RvciBvciBzZXR0ZXIgcGFyYW1ldGVyIGhpZGluZyBhbm90aGVyIGZpZWxkXG5cCi0JCVx0bm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb24gY2hhcltdIGluIFN0cmluZyBjb25jYXRcdFx0XHRcdFx0ICAoZGVmYXVsdClcblwKLQkJXHR0YXNrcyg8dGFnMT58Li4ufDx0YWdOPikgdGFza3MgaWRlbnRpZmllZCBieSB0YWdzIGluc2lkZSBjb21tZW50c1xuXAotCQktZGVwcmVjYXRpb24JCWVxdWl2YWxlbnQgdG8gJyctd2FybjpkZXByZWNhdGlvbicnIChkZWZhdWx0KVxuXAotCQktZ1s6PGxldmVsPl0JCWRlYnVnIGF0dHJpYnV0ZXMgbGV2ZWwgKGRlZmF1bHQgJyctZzpsaW5lcyxzb3VyY2UnJylcblwKLQkJCVx0LWcJCQkJYWxsIGRlYnVnIGluZm8gKCcnLWc6bGluZXMsdmFycyxzb3VyY2UnJylcblwKLQkJCVx0LWc6bm9uZQkJCW5vIGRlYnVnIGluZm9cblwKLQkJCVx0LWc6W2xpbmVzLHZhcnMsc291cmNlXQlzZWxlY3RpdmUgZGVidWcgaW5mb1xuXAotCQktcHJlc2VydmVBbGxMb2NhbHMJcHJlc2VydmUgdW51c2VkIGxvY2FsIHZhcnMgZm9yIGRlYnVnIHB1cnBvc2UgKGRlZmF1bHQgaXMgb3B0aW1pemUgb3V0KVxuXAotCQktbm9JbXBvcnRFcnJvcgkJbm8gZXJyb3JzIGZvciB1bnJlc29sdmVkIGltcG9ydHMgKGRlZmF1bHQgaXMgZXJyb3IpXG5cCi0JCS1lbmNvZGluZyA8ZW5jPgkJc3BlY2lmeSBhIGRpZmZlcmVudCBkZWZhdWx0IHNvdXJjZSBlbmNvZGluZyBmb3JtYXQgKGN1c3RvbSBlbmNvZGluZyBjYW4gYmUgc3BlY2lmaWVkIG9uXG5cCi0JCVx0XHRcdFx0XHRhIHBlciBmaWxlIGJhc2lzIGJ5IGFkZGluZyBzdWZmaXggJydbPGVuYz5dJycgdG8gZmlsZS9mb2xkZXIgbmFtZXNcblwKLQkJLWxvZyA8ZmlsZW5hbWU+CQlzcGVjaWZ5IGEgbG9nIGZpbGVcblwKLQkJLXByb2NlZWRPbkVycm9yCQlrZWVwIGNvbXBpbGluZyB3aGVuIGVycm9yLCBkdW1waW5nIGNsYXNzIGZpbGVzIHdpdGggcHJvYmxlbSBtZXRob2RzIChkZWZhdWx0IGlzIG9mZilcblwKLQkJLXZlcmJvc2UJCQlwcmludCBhY2Nlc3NlZC9wcm9jZXNzZWQgY29tcGlsYXRpb24gdW5pdHNcblwKLQkJLXJlZmVyZW5jZUluZm8JCWNvbXB1dGUgcmVmZXJlbmNlIGluZm9cblwKLQkJLXByb2dyZXNzCQkJc2hvdyBwcm9ncmVzcyAob25seSBpbiAtbG9nIG1vZGUpXG5cCi0JCS10aW1lCQkJCWRpc3BsYXkgc3BlZWQgaW5mb3JtYXRpb24gXG5cCi0JCS1ub0V4aXQJCQkJZG8gbm90IGNhbGwgU3lzdGVtLmV4aXQobikgYXQgZW5kIG9mIGNvbXBpbGF0aW9uIChuPTAgaWYgbm8gZXJyb3IpXG5cCi0JCS1yZXBlYXQgPG4+CQkJcmVwZWF0IGNvbXBpbGF0aW9uIHByb2Nlc3MgPG4+IHRpbWVzIChwZXJmIGFuYWx5c2lzKVxuCittaXNjLnZlcnNpb24gPSB7Y29tcGlsZXIubmFtZX0ge2NvbXBpbGVyLnZlcnNpb259LCB7Y29tcGlsZXIuY29weXJpZ2h0fQorbWlzYy51c2FnZSA9IHtjb21waWxlci5uYW1lfSB7Y29tcGlsZXIudmVyc2lvbn0sIHtjb21waWxlci5jb3B5cmlnaHR9XG5cCitcIFxuXAorXFVzYWdlOiA8b3B0aW9ucz4gPHNvdXJjZSBmaWxlcyB8IGRpcmVjdG9yaWVzPlxuXAorXCBJZiBkaXJlY3RvcmllcyBhcmUgc3BlY2lmaWVkLCB0aGVuIHRoZWlyIHNvdXJjZSBjb250ZW50cyBhcmUgY29tcGlsZWQuXG5cCitcIFBvc3NpYmxlIG9wdGlvbnMgYXJlIGxpc3RlZCBiZWxvdy4gVGhvc2UgZW5hYmxlZCBieSBkZWZhdWx0IGFyZSBwcmVmaXhlZCB3aXRoICcnKycnXG5cCitcIFxuXAorXCBDbGFzc3BhdGggb3B0aW9uczpcblwKK1wgICAgLWNwIC1jbGFzc3BhdGggPGRpcmVjdG9yaWVzIGFuZCB6aXAvamFyIGZpbGVzIHNlcGFyYXRlZCBieSA7PlxuXAorXCAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmeSBsb2NhdGlvbiBmb3IgYXBwbGljYXRpb24gY2xhc3NlcyBhbmQgc291cmNlc1xuXAorXCAgICAtYm9vdGNsYXNzcGF0aCA8ZGlyZWN0b3JpZXMgYW5kIHppcC9qYXIgZmlsZXMgc2VwYXJhdGVkIGJ5IDs+XG5cCitcICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZ5IGxvY2F0aW9uIGZvciBzeXN0ZW0gY2xhc3Nlc1xuXAorXCAgICAtZCA8ZGlyPiAgICAgICAgICAgZGVzdGluYXRpb24gZGlyZWN0b3J5IChpZiBvbWl0dGVkLCBubyBkaXJlY3RvcnkgaXMgY3JlYXRlZClcblwKK1wgICAgLWQgbm9uZSAgICAgICAgICAgIGdlbmVyYXRlIG5vIC5jbGFzcyBmaWxlc1xuXAorXCAgICAtZW5jb2RpbmcgPGVuYz4gICAgc3BlY2lmeSBjdXN0b20gZW5jb2RpbmcgZm9yIGFsbCBzb3VyY2VzLiBFYWNoIGZpbGUvZGlyZWN0b3J5IGNhbiBvdmVycmlkZSBpdFxuXAorXCAgICAgICAgICAgICAgICAgICAgICAgd2hlbiBzdWZmaXhlZCB3aXRoICcnWycnPGVuYz4nJ10nJyAoZS5nLiBYLmphdmFbdXRmOF0pXG5cCitcIFxuXAorXCBDb21wbGlhbmNlIG9wdGlvbnM6XG5cCitcICAgIC0xLjMgICAgICAgICAgICAgKyB1c2UgMS4zIGNvbXBsaWFuY2UgbGV2ZWxcblwKK1wgICAgLTEuNCAgICAgICAgICAgICAgIHVzZSAxLjQgY29tcGxpYW5jZSBsZXZlbFxuXAorXCAgICAtc291cmNlIDx2ZXJzaW9uPiAgc2V0IHNvdXJjZSBsZXZlbCAoMS4zIG9yIDEuNCwgZGVmYXVsdCBtYXRjaGVzIGNvbXBsaWFuY2UgbGV2ZWwpXG5cCitcICAgIC10YXJnZXQgPHZlcnNpb24+ICBzZXQgY2xhc3NmaWxlIHRhcmdldCAoMS4xIHRvIDEuNCwgZGVmYXVsdCBtYXRjaGVzIGNvbXBsaWFuY2UgbGV2ZWwpXG5cCitcIFxuXAorXCBFcnJvci9XYXJuaW5nIG9wdGlvbnM6XG5cCitcICAgIC1kZXByZWNhdGlvbiAgICAgKyBkZXByZWNhdGlvbiBvdXRzaWRlIGRlcHJlY2F0ZWQgY29kZVxuXAorXCAgICAtbm9JbXBvcnRFcnJvciAgICAgbm8gZXJyb3JzIGZvciB1bnJlc29sdmVkIGltcG9ydHNcblwKK1wgICAgLW5vd2FybiAgICAgICAgICAgIGRpc2FibGUgYWxsIHdhcm5pbmdzXG5cCitcICAgIC13YXJuOiA8d2FybmluZ3Mgc2VwYXJhdGVkIGJ5ICw+IHdoZXJlIHdhcm5pbmdzIGluY2x1ZGU6XG5cCitcICAgICAgbm9uZSAgICAgICAgICAgICAgICAgZGlzYWJsZSBhbGwgd2FybmluZ3NcblwKK1wgICAgICBhbGxEZXByZWNhdGlvbiAgICAgICBkZXByZWNhdGlvbiBpbmNsdWRpbmcgaW5zaWRlIGRlcHJlY2F0ZWQgY29kZVxuXAorXCAgICAgIGFzc2VydElkZW50aWZpZXIgICAgICcnYXNzZXJ0JycgdXNlZCBhcyBpZGVudGlmaWVyXG5cCitcICAgICAgY29uZGl0aW9uQXNzaWduICAgICAgcG9zc2libGUgYWNjaWRlbnRhbCBib29sZWFuIGFzc2lnbm1lbnRcblwKK1wgICAgICBjb25zdHJ1Y3Rvck5hbWUgICAgKyBtZXRob2Qgd2l0aCBjb25zdHJ1Y3RvciBuYW1lXG5cCitcICAgICAgZGVwcmVjYXRpb24gICAgICAgICsgZGVwcmVjYXRpb24gb3V0c2lkZSBkZXByZWNhdGVkIGNvZGVcblwKK1wgICAgICBmaWVsZEhpZGluZyAgICAgICAgICBmaWVsZCBoaWRpbmcgYW5vdGhlciB2YXJpYWJsZVxuXAorXCAgICAgIGludGZOb25Jbmhlcml0ZWQgICArIGludGVyZmFjZSBub24taW5oZXJpdGVkIG1ldGhvZCBjb21wYXRpYmlsaXR5XG5cCitcICAgICAgbG9jYWxIaWRpbmcgICAgICAgICAgbG9jYWwgdmFyaWFibGUgaGlkaW5nIGFub3RoZXIgdmFyaWFibGVcblwKK1wgICAgICBtYXNrZWRDYXRjaEJsb2NrICAgKyBoaWRkZW4gY2F0Y2ggYmxvY2tcblwKK1wgICAgICBubHMgICAgICAgICAgICAgICAgICBzdHJpbmcgbGl0ZXJhbCBsYWNraW5nIG5vbi1ubHMgdGFnIC8vJE5PTi1OTFMtPG4+JFxuXAorXCAgICAgIG5vRWZmZWN0QXNzaWduICAgICArIGFzc2lnbm1lbnQgd2l0aG91dCBlZmZlY3RcblwKK1wgICAgICBjaGFyQ29uY2F0ICAgICAgICAgKyBjaGFyW10gaW4gU3RyaW5nIGNvbmNhdFxuXAorXCAgICAgIHBrZ0RlZmF1bHRNZXRob2QgICArIGF0dGVtcHQgdG8gb3ZlcnJpZGUgcGFja2FnZS1kZWZhdWx0IG1ldGhvZFxuXAorXCAgICAgIHVudXNlZEFyZ3VtZW50ICAgICAgIHVucmVhZCBtZXRob2QgYXJndW1lbnRcblwKK1wgICAgICB1bnVzZWRJbXBvcnQgICAgICAgKyB1bnVzZWQgaW1wb3J0IGRlY2xhcmF0aW9uXG5cCitcICAgICAgdW51c2VkTG9jYWwgICAgICAgICAgdW5yZWFkIGxvY2FsIHZhcmlhYmxlXG5cCitcICAgICAgdW51c2VkUHJpdmF0ZSAgICAgICAgdW51c2VkIHByaXZhdGUgbWVtYmVyIGRlY2xhcmF0aW9uXG5cCitcICAgICAgc3BlY2lhbFBhcmFtSGlkaW5nICAgY29uc3RydWN0b3Igb3Igc2V0dGVyIHBhcmFtZXRlciBoaWRpbmcgYW5vdGhlciBmaWVsZFxuXAorXCAgICAgIHN0YXRpY1JlY2VpdmVyICAgICArIG5vbi1zdGF0aWMgcmVmZXJlbmNlIHRvIHN0YXRpYyBtZW1iZXJcblwKK1wgICAgICBzeW50aGV0aWNBY2Nlc3MgICAgICBzeW50aGV0aWMgYWNjZXNzIGZvciBpbm5lcmNsYXNzXG5cCitcICAgICAgdGFza3MoPHRhZ3Mgc2VwYXJhdGVkIGJ5IHw+KSB0YXNrcyBpZGVudGlmaWVkIGJ5IHRhZ3MgaW5zaWRlIGNvbW1lbnRzXG5cCitcIFxuXAorXCBEZWJ1ZyBvcHRpb25zOlxuXAorXCAgICAtZ1s6bGluZXMsdmFycyxzb3VyY2VdIGN1c3RvbSBkZWJ1ZyBpbmZvXG5cCitcICAgIC1nOmxpbmVzLHNvdXJjZSAgKyBib3RoIGxpbmVzIHRhYmxlIGFuZCBzb3VyY2UgZGVidWcgaW5mb1xuXAorXCAgICAtZyAgICAgICAgICAgICAgICAgYWxsIGRlYnVnIGluZm9cblwKK1wgICAgLWc6bm9uZSAgICAgICAgICAgIG5vIGRlYnVnIGluZm9cblwKK1wgICAgLXByZXNlcnZlQWxsTG9jYWxzIHByZXNlcnZlIHVudXNlZCBsb2NhbCB2YXJzIGZvciBkZWJ1ZyBwdXJwb3NlXG5cCitcIFxuXAorXCBBZHZhbmNlZCBvcHRpb25zOlxuXAorXCAgICAtbG9nIDxmaWxlPiAgICAgICAgbG9nIHRvIGEgZmlsZVxuXAorXCAgICAtcHJvY2VlZE9uRXJyb3IgICAgZG8gbm90IHN0b3AgYXQgZmlyc3QgZXJyb3IsIGR1bXBpbmcgY2xhc3MgZmlsZXMgd2l0aCBwcm9ibGVtIG1ldGhvZHNcblwKK1wgICAgLXZlcmJvc2UgICAgICAgICAgIGVuYWJsZSB2ZXJib3NlIG91dHB1dFxuXAorXCAgICAtcmVmZXJlbmNlSW5mbyAgICAgY29tcHV0ZSByZWZlcmVuY2UgaW5mb1xuXAorXCAgICAtcHJvZ3Jlc3MgICAgICAgICAgc2hvdyBwcm9ncmVzcyAob25seSBpbiAtbG9nIG1vZGUpXG5cCitcICAgIC10aW1lICAgICAgICAgICAgICBkaXNwbGF5IHNwZWVkIGluZm9ybWF0aW9uIFxuXAorXCAgICAtbm9FeGl0ICAgICAgICAgICAgZG8gbm90IGNhbGwgU3lzdGVtLmV4aXQobikgYXQgZW5kIG9mIGNvbXBpbGF0aW9uIChuPT0wIGlmIG5vIGVycm9yKVxuXAorXCAgICAtcmVwZWF0IDxuPiAgICAgICAgcmVwZWF0IGNvbXBpbGF0aW9uIHByb2Nlc3MgPG4+IHRpbWVzIGZvciBwZXJmIGFuYWx5c2lzXG5cCitcIFxuXAorXCAgICAtPyAtaGVscCAgICAgICAgICAgcHJpbnQgdGhpcyBoZWxwIG1lc3NhZ2VcblwKK1wgICAgLXYgLXZlcnNpb24gICAgICAgIHByaW50IGNvbXBpbGVyIHZlcnNpb25cblwKK1wgICAgLXNob3d2ZXJzaW9uICAgICAgIHByaW50IGNvbXBpbGVyIHZlcnNpb24gYW5kIGNvbnRpbnVlXG4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpkdC5jb3JlL2J1aWxkbm90ZXNfamR0LWNvcmUuaHRtbCBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL2J1aWxkbm90ZXNfamR0LWNvcmUuaHRtbAppbmRleCBkNTE3MGFiLi5kYWY5MjViIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZHQuY29yZS9idWlsZG5vdGVzX2pkdC1jb3JlLmh0bWwKKysrIGIvb3JnLmVjbGlwc2UuamR0LmNvcmUvYnVpbGRub3Rlc19qZHQtY29yZS5odG1sCkBAIC00MSw2ICs0MSwzMzQgQEAKIDxwPjxocj48aDE+CiBFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgogSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgMy4wIEJ1aWxkIC0gMTh0aCBKdW5lIDIwMDMgCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzM1N2IKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzxsaT5iYWNrcG9ydCBpbmRleCBtYW5hZ2VyIGRlYWRsb2NrIGZpeCBvbiB0b3Agb2Ygdl8zNTc8L2xpPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zODkwMSI+Mzg5MDE8L2E+CitJbmRleE1hbmFnZXIgaGFuZ3MgaW4gZW5kLWxlc3MgbG9vcAorCis8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+CisKKworPHA+PGhyPjxoMT4KK0VjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXMmbmJzcDs8YnI+CitKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgQ29yZTwvaDE+CitFY2xpcHNlIFNESyAzLjAgQnVpbGQgLSAxNnRoIEp1bmUgMjAwMyAKKzxicj5Qcm9qZWN0IG9yZy5lY2xpcHNlLmpkdC5jb3JlIHZfMzU4CisKKzxwPjxiPk5PVEU6PC9iPiBUaGlzIHZlcnNpb24gZ290IGJhY2tlZCBvdXQgZHVlIHRvIHNldmVyZSByZWdyZXNzaW9uCisoc2VlIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM4OTUxIj4zODk1MTwvYT4gTlBFIGluIGVkaXRvciB3aGlsZSBzYXZpbmcgY29udGVudHMpLgorVW50aWwgc3Vic2VxdWVudCB2ZXJzaW9uIGlzIG1hZGUgYXZhaWxhYmxlIChzZWUgYWJvdmUpLCBpbnRlZ3JhdGlvbiBidWlsZHMgd2lsbCByZXZlcnQgdG8gcHJldmlvdXMgdmVyc2lvbiAodl8zNTcpLgorCis8aDI+CitXaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Cis8dWw+Cis8bGk+PGNvZGU+SmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KC4uLik8L2NvZGU+IHdpbGwgbm93IGFsbG93IGFuIGVtcHR5IHNvdXJjZSBhdHRhY2htZW50ICg8Y29kZT5uZXcgUGF0aCgiIik8L2NvZGU+KSB0bworYmUgZXF1aXZhbGVudCB0byBubyBzb3VyY2UgYXR0YWNobWVudCAoaS5lLiA8Y29kZT5udWxsPC9jb2RlPikuIFRoaXMgYWRqdXN0bWVudCBpcyBtYWRlIG5lY2Vzc2FyeSBmb3IKK2xpYnJhcnkgZW50cmllcyBnZW5lcmF0ZWQgZnJvbSBjbGFzc3BhdGggdmFyaWFibGVzIHdoaWNoIGNhbm5vdCBiZSBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4uIEFsc28gc2VlIAorYnVnIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM4NTMxIj4zODUzMTwvYT4uCis8cHJlPgorKiBAcGFyYW0gc291cmNlQXR0YWNobWVudFBhdGggdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGFyY2hpdmUgb3IgZm9sZGVyLCAKKyogICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4gTm90ZSwgc2luY2UgMy4wLCBhbiBlbXB0eSBwYXRoIGlzIGFsbG93ZWQgdG8gZGVub3RlIG5vIHNvdXJjZSBhdHRhY2htZW50LgorKiAgIGFuZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIDxjb2RlPm51bGw8L2NvZGU+LgorPC9wcmU+Cis8L2xpPgorPGxpPkFkZGVkIEFQSSA8Y29kZT5JSmF2YVByb2plY3QjZm9yY2VDbGFzc3BhdGhSZWxvYWQoSVByb2dyZXNzTW9uaXRvcik8L2NvZGU+IHRvIGZvcmNlIHJlbG9hZCBvZiA8Y29kZT4uY2xhc3NwYXRoPC9jb2RlPiBmaWxlCitiZWZvcmUgbmV4dCBhdXRvbWF0aWMgdXBkYXRlIG9jY3Vycy4KKzxwcmU+CisvKioKKyAqIEZvcmNlIHRoZSBwcm9qZWN0IHRvIHJlbG9hZCBpdHMgPGNvZGU+LmNsYXNzcGF0aDwvY29kZT4gZmlsZSBmcm9tIGRpc2sgYW5kIHVwZGF0ZSB0aGUgY2xhc3NwYXRoIGFjY29yZGluZ2x5LgorICogVXN1YWxseSwgYSBjaGFuZ2UgdG8gdGhlIDxjb2RlPi5jbGFzc3BhdGg8L2NvZGU+IGZpbGUgaXMgYXV0b21hdGljYWxseSBub3RpY2VkIGFuZCByZWNvbmNpbGVkIGF0IHRoZSBuZXh0IAorICogcmVzb3VyY2UgY2hhbmdlIG5vdGlmaWNhdGlvbiBldmVudC4gSWYgcmVxdWlyZWQgdG8gY29uc2lkZXIgc3VjaCBhIGNoYW5nZSBwcmlvciB0byB0aGUgbmV4dCBhdXRvbWF0aWMKKyAqIHJlZnJlc2gsIHRoZW4gdGhpcyBmdW5jdGlvbm5hbGl0eSBzaG91bGQgYmUgdXNlZCB0byB0cmlnZ2VyIGEgcmVmcmVzaC4gSW4gcGFydGljdWxhciwgaWYgYSBjaGFuZ2UgdG8gdGhlIGZpbGUgaXMgcGVyZm9ybWVkLAorICogZHVyaW5nIGFuIG9wZXJhdGlvbiB3aGVyZSB0aGlzIGNoYW5nZSBuZWVkcyB0byBiZSByZWZsZWN0ZWQgYmVmb3JlIHRoZSBvcGVyYXRpb24gZW5kcywgdGhlbiBhbiBleHBsaWNpdCByZWZyZXNoIGlzCisgKiBuZWNlc3NhcnkuCisgKiAKKyAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciBmb3IgcmVwb3J0aW5nIG9wZXJhdGlvbiBwcm9ncmVzcworICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhlIGNsYXNzcGF0aCBjb3VsZCBub3QgYmUgdXBkYXRlZC4gUmVhc29ucworICogaW5jbHVkZToKKyAqICAtIFRoaXMgSmF2YSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IChFTEVNRU5UX0RPRVNfTk9UX0VYSVNUKTwvbGk+CisgKiAgLSBUd28gb3IgbW9yZSBlbnRyaWVzIHNwZWNpZnkgc291cmNlIHJvb3RzIHdpdGggdGhlIHNhbWUgb3Igb3ZlcmxhcHBpbmcgcGF0aHMgKE5BTUVfQ09MTElTSU9OKQorICogIC0gQSBlbnRyeSBvZiBraW5kIDxjb2RlPkNQRV9QUk9KRUNUPC9jb2RlPiByZWZlcnMgdG8gdGhpcyBwcm9qZWN0IChJTlZBTElEX1BBVEgpCisgKiAgLSBUaGlzIEphdmEgZWxlbWVudCBkb2VzIG5vdCBleGlzdCAoRUxFTUVOVF9ET0VTX05PVF9FWElTVCk8L2xpPgorICogIC0gVGhlIG91dHB1dCBsb2NhdGlvbiBwYXRoIHJlZmVycyB0byBhIGxvY2F0aW9uIG5vdCBjb250YWluZWQgaW4gdGhpcyBwcm9qZWN0ICg8Y29kZT5QQVRIX09VVFNJREVfUFJPSkVDVDwvY29kZT4pCisgKiAgLSBUaGUgb3V0cHV0IGxvY2F0aW9uIHBhdGggaXMgbm90IGFuIGFic29sdXRlIHBhdGggKDxjb2RlPlJFTEFUSVZFX1BBVEg8L2NvZGU+KQorICogIC0gVGhlIG91dHB1dCBsb2NhdGlvbiBwYXRoIGlzIG5lc3RlZCBpbnNpZGUgYSBwYWNrYWdlIGZyYWdtZW50IHJvb3Qgb2YgdGhpcyBwcm9qZWN0ICg8Y29kZT5JTlZBTElEX1BBVEg8L2NvZGU+KQorICogIC0gVGhlIGNsYXNzcGF0aCBpcyBiZWluZyBtb2RpZmllZCBkdXJpbmcgcmVzb3VyY2UgY2hhbmdlIGV2ZW50IG5vdGlmaWNhdGlvbiAoQ09SRV9FWENFUFRJT04pCisgKiBAc2luY2UgMy4wCisgKi8KKzwvcHJlPgorPC9saT4KKzxsaT5JbiB0aGUgcHJvY2VzcyBvZiBjbG9zaW5nIHRoZSBnYXAgYmV0d2VlbiBjb21waWxhdGlvbiB1bml0cyBhbmQgd29ya2luZyBjb3BpZXMgCisoc2VlIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM2ODg4ICI+YnVnIDM2ODg4IDwvYT4pLCB0aGUgZm9sbG93aW5nIG5ldyBBUElzIAorYXJlIGFkZGVkIHRvIDxjb2RlPklDb21waWxhdGlvblVuaXQ8L2NvZGU+OgorCTx1bD4KKwk8bGk+PHByZT4KKy8qKgorICogQ2hhbmdlcyB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgaGFuZGxlIGludG8gYSB3b3JraW5nIGNvcHkuIEEgbmV3IElCdWZmZXIgaXMKKyAqIGNyZWF0ZWQgdXNpbmcgdGhpcyBjb21waWxhdGlvbiB1bml0IGhhbmRsZSdzIG93bmVyLiBVc2VzIHRoZSBwcmltYXJ5IG93bmVyIGlzIG5vbmUgd2FzCisgKiBzcGVjaWZpZWQgd2hlbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgaGFuZGxlIHdhcyBjcmVhdGVkLgorICoKKyAqIFdoZW4gc3dpdGNoaW5nIHRvIHdvcmtpbmcgY29weSBtb2RlLCBwcm9ibGVtcyBhcmUgcmVwb3J0ZWQgdG8gZ2l2ZW4gCisgKiBJUHJvYmxlbVJlcXVlc3Rvci4KKyAqCisgKiBPbmNlIGluIHdvcmtpbmcgY29weSBtb2RlLCBjaGFuZ2VzIHRvIHRoaXMgY29tcGlsYXRpb24gdW5pdCBvciBpdHMgY2hpbGRyZW4gYXJlIGRvbmUgaW4gbWVtb3J5LgorICogT25seSB0aGUgbmV3IGJ1ZmZlciBpcyBhZmZlY3RlZC4gVXNpbmcgY29tbWl0V29ya2luZ0NvcHkoYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcikKKyAqIHdpbGwgYnJpbmcgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgaW4gc3luYyB3aXRoIHRoaXMgY29tcGlsYXRpb24gdW5pdC4KKyAqCisgKiBJZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgd2FzIGFscmVhZHkgaW4gd29ya2luZyBjb3B5IG1vZGUsIGFuIGludGVybmFsIGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQgYW5kIG5vCisgKiBvdGhlciBhY3Rpb24gaXMgdGFrZW4gb24gdGhpcyBjb21waWxhdGlvbiB1bml0LiBUbyBicmluZyB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgYmFjayBpbnRvIHRoZSBvcmlnaW5hbCBtb2RlIAorICogKHdoZXJlIGl0IHJlZmxlY3RzIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlKSwgZGlzY2FyZFdvcmtpbmdDb3B5IG11c3QgYmUgY2FsbCBhcyBtYW55IAorICogdGltZXMgYXMgYmVjb21lV29ya2luZ0NvcHkuCisgKiAKKyAqIEBwYXJhbSBwcm9ibGVtUmVxdWVzdG9yIGEgcmVxdWVzdG9yIHdoaWNoIHdpbGwgZ2V0IG5vdGlmaWVkIG9mIHByb2JsZW1zIGRldGVjdGVkIGR1cmluZworICogCXJlY29uY2lsaW5nIGFzIHRoZXkgYXJlIGRpc2NvdmVyZWQuIFRoZSByZXF1ZXN0b3IgY2FuIGJlIHNldCB0byBudWxsIGluZGljYXRpbmcKKyAqIAl0aGF0IHRoZSBjbGllbnQgaXMgbm90IGludGVyZXN0ZWQgaW4gcHJvYmxlbXMuCisgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IgdXNlZCB0byByZXBvcnQgcHJvZ3Jlc3Mgd2hpbGUgb3BlbmluZyB0aGlzIGNvbXBpbGF0aW9uIHVuaXQKKyAqIAlvciBudWxsIGlmIG5vIHByb2dyZXNzIHNob3VsZCBiZSByZXBvcnRlZCAKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgY29tcGlsYXRpb24gdW5pdCBjb3VsZCBub3QgYmVjb21lIGEgd29ya2luZyBjb3B5LgorICogQHNlZSBkaXNjYXJkV29ya2luZ0NvcHkKKyAqIEBzaW5jZSAzLjAKKyAqLwordm9pZCBiZWNvbWVXb3JraW5nQ29weShJUHJvYmxlbVJlcXVlc3RvciBwcm9ibGVtUmVxdWVzdG9yLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CQorCTwvcHJlPjwvbGk+CisJPGxpPjxwcmU+CisvKioKKyAqIENvbW1pdHMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgd29ya2luZyBjb3B5IHRvIGl0cyB1bmRlcmx5aW5nIHJlc291cmNlLgorICoKKyAqIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBvcmlnaW5hbCByZXNvdXJjZSBoYXZlIGNoYW5nZWQKKyAqIHNpbmNlIHRoaXMgd29ya2luZyBjb3B5IHdhcyBjcmVhdGVkLCBpbiB3aGljaCBjYXNlIHRoZXJlIGlzIGFuIHVwZGF0ZSBjb25mbGljdC4KKyAqIFRoZSB2YWx1ZSBvZiB0aGUgZm9yY2UgcGFyYW1ldGVyIGVmZmVjdHMgdGhlIHJlc29sdXRpb24gb2YKKyAqIHN1Y2ggYSBjb25mbGljdDoKKyAqIC0gdHJ1ZSAtIGluIHRoaXMgY2FzZSB0aGUgY29udGVudHMgb2YgdGhpcyB3b3JraW5nIGNvcHkgYXJlIGFwcGxpZWQgdG8KKyAqIAl0aGUgdW5kZXJseWluZyByZXNvdXJjZSBldmVuIHRob3VnaCB0aGlzIHdvcmtpbmcgY29weSB3YXMgY3JlYXRlZCAKKyAqIAliZWZvcmUgYSBzdWJzZXF1ZW50IGNoYW5nZSBpbiB0aGUgcmVzb3VyY2UKKyAqIC0gZmFsc2UgLSBpbiB0aGlzIGNhc2UgYSBKYXZhTW9kZWxFeGNlcHRpb24gaXMgdGhyb3duCisgKiAKKyAqIFNpbmNlIDIuMSwgYSB3b3JraW5nIGNvcHkgY2FuIGJlIGNyZWF0ZWQgb24gYSBub3QteWV0IGV4aXN0aW5nIGNvbXBpbGF0aW9uCisgKiB1bml0LiBJbiBwYXJ0aWN1bGFyLCBzdWNoIGEgd29ya2luZyBjb3B5IGNhbiB0aGVuIGJlIGNvbW1pdHRlZCBpbiBvcmRlciB0byBjcmVhdGUKKyAqIHRoZSBjb3JyZXNwb25kaW5nIGNvbXBpbGF0aW9uIHVuaXQuCisgKiAKKyAqIEBwYXJhbSBmb3JjZSBhIGZsYWcgdG8gaGFuZGxlIHRoZSBjYXNlcyB3aGVuIHRoZSBjb250ZW50cyBvZiB0aGUgb3JpZ2luYWwgcmVzb3VyY2UgaGF2ZSBjaGFuZ2VkCisgKiBzaW5jZSB0aGlzIHdvcmtpbmcgY29weSB3YXMgY3JlYXRlZAorICogQHBhcmFtIG1vbml0b3IgdGhlIGdpdmVuIHByb2dyZXNzIG1vbml0b3IKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgd29ya2luZyBjb3B5IGNvdWxkIG5vdCBjb21taXQuIFJlYXNvbnMgaW5jbHVkZToKKyAqIC0gQSBDb3JlRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHVwZGF0aW5nIGFuIHVuZGVybHlpbmcgcmVzb3VyY2UKKyAqIC0gVGhpcyBlbGVtZW50IGlzIG5vdCBhIHdvcmtpbmcgY29weSAoSU5WQUxJRF9FTEVNRU5UX1RZUEVTKQorICogLSBBIHVwZGF0ZSBjb25mbGljdCAoZGVzY3JpYmVkIGFib3ZlKSAoVVBEQVRFX0NPTkZMSUNUKQorICogQHNpbmNlIDMuMAorICovCit2b2lkIGNvbW1pdFdvcmtpbmdDb3B5KGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsJCisJPC9wcmU+PC9saT4KKwk8bGk+PHByZT4KKy8qKgorICogQ2hhbmdlcyB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgaW4gd29ya2luZyBjb3B5IG1vZGUgYmFjayB0byBpdHMgb3JpZ2luYWwgbW9kZS4KKyAqCisgKiBUaGlzIGhhcyBubyBlZmZlY3QgaWYgdGhpcyBjb21waWxhdGlvbiB1bml0IHdhcyBub3QgaW4gd29ya2luZyBjb3B5IG1vZGUuCisgKiAKKyAqIElmIGJlY29tZVdvcmtpbmdDb3B5IHdhcyBjYWxsZWQgc2V2ZXJhbCB0aW1lcyBvbiB0aGlzCisgKiBjb21waWxhdGlvbiB1bml0LCBkaXNjYXJkV29ya2luZ0NvcHkgbXVzdCBiZSBjYWxsZWQgYXMgCisgKiBtYW55IHRpbWVzIGJlZm9yZSBpdCBzd2l0Y2hlcyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBtb2RlLgorICogCisgKiBAc2VlIGJlY29tZVdvcmtpbmdDb3B5CisgKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIHdvcmtpbmcgY29weSBjb3VsZCBub3QgcmV0dXJuIGluIGl0cyBvcmlnaW5hbCBtb2RlLgorICogQHNpbmNlIDMuMAorICovCit2b2lkIGRpc2NhcmRXb3JraW5nQ29weSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247CisJPC9wcmU+PC9saT4KKwk8bGk+PHByZT4KKy8qKgorICogUmV0dXJucyB0aGUgd29ya2luZyBjb3B5IG93bmVyIG9mIHRoaXMgd29ya2luZyBjb3B5LgorICogUmV0dXJucyBudWxsIGlmIGl0IGlzIG5vdCBhIHdvcmtpbmcgY29weSBvciBpZiBpdCBoYXMgbm8gb3duZXIuCisgKiAKKyAqIEByZXR1cm4gV29ya2luZ0NvcHlPd25lciB0aGUgb3duZXIgb2YgdGhpcyB3b3JraW5nIGNvcHkgb3IgbnVsbAorICogQHNpbmNlIDMuMAorICovCitXb3JraW5nQ29weU93bmVyIGdldE93bmVyKCk7CisJPC9wcmU+PC9saT4JCisJPGxpPjxwcmU+CisvKioKKyAqIFJldHVybnMgYSBuZXcgd29ya2luZyBjb3B5IG9mIHRoaXMgZWxlbWVudCBpZiB0aGlzIGVsZW1lbnQgaXMgbm90CisgKiBhIHdvcmtpbmcgY29weSwgb3IgdGhpcyBlbGVtZW50IGlmIHRoaXMgZWxlbWVudCBpcyBhbHJlYWR5IGEgd29ya2luZyBjb3B5LgorICogCisgKiBOb3RlOiBpZiBpbnRlbmRpbmcgdG8gc2hhcmUgYSB3b3JraW5nIGNvcHkgYW1vbmdzdCBzZXZlcmFsIGNsaWVudHMsIHRoZW4gCisgKiBnZXRXb3JraW5nQ29weShXb3JraW5nQ29weU93bmVyLCBJUHJvYmxlbVJlcXVlc3RvciwgSVByb2dyZXNzTW9uaXRvcikgCisgKiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgorICogCisgKiBXaGVuIHRoZSB3b3JraW5nIGNvcHkgaW5zdGFuY2UgaXMgY3JlYXRlZCwgYW4gQURERUQgSUphdmFFbGVtZW50RGVsdGEgaXMgCisgKiByZXBvcnRlZCBvbiB0aGlzIHdvcmtpbmcgY29weS4KKyAqIAorICogU2luY2UgMi4xLCBhIHdvcmtpbmcgY29weSBjYW4gYmUgY3JlYXRlZCBvbiBhIG5vdC15ZXQgZXhpc3RpbmcgY29tcGlsYXRpb24KKyAqIHVuaXQuIEluIHBhcnRpY3VsYXIsIHN1Y2ggYSB3b3JraW5nIGNvcHkgY2FuIHRoZW4gYmUgY29tbWl0dGVkIGluIG9yZGVyIHRvIGNyZWF0ZQorICogdGhlIGNvcnJlc3BvbmRpbmcgY29tcGlsYXRpb24gdW5pdC4KKyAqIAorKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IgdXNlZCB0byByZXBvcnQgcHJvZ3Jlc3Mgd2hpbGUgb3BlbmluZyB0aGlzIGNvbXBpbGF0aW9uIHVuaXQKKyAqIAlvciBudWxsIGlmIG5vIHByb2dyZXNzIHNob3VsZCBiZSByZXBvcnRlZCAKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSBjb250ZW50cyBvZiB0aGlzIGVsZW1lbnQgY2FuCisgKiAJbm90IGJlIGRldGVybWluZWQuIAorICogQHJldHVybiBhIG5ldyB3b3JraW5nIGNvcHkgb2YgdGhpcyBlbGVtZW50IGlmIHRoaXMgZWxlbWVudCBpcyBub3QKKyAqIAlhIHdvcmtpbmcgY29weSwgb3IgdGhpcyBlbGVtZW50IGlmIHRoaXMgZWxlbWVudCBpcyBhbHJlYWR5IGEgd29ya2luZyBjb3B5CisgKiBAc2luY2UgMy4wCisgKi8KK0lDb21waWxhdGlvblVuaXQgZ2V0V29ya2luZ0NvcHkoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOworCTwvcHJlPjwvbGk+CQorCTxsaT48cHJlPgorLyoqCisgKiBSZXR1cm5zIGEgc2hhcmVkIHdvcmtpbmcgY29weSBvbiB0aGlzIGVsZW1lbnQgdXNpbmcgdGhlIGdpdmVuIHdvcmtpbmcgY29weSBvd25lciB0byBjcmVhdGUKKyAqIHRoZSBidWZmZXIsIG9yIHRoaXMgZWxlbWVudCBpZiB0aGlzIGVsZW1lbnQgaXMgYWxyZWFkeSBhIHdvcmtpbmcgY29weS4KKyAqIFRoaXMgQVBJIGNhbiBvbmx5IGFuc3dlciBhbiBhbHJlYWR5IGV4aXN0aW5nIHdvcmtpbmcgY29weSBpZiBpdCBpcyBiYXNlZCBvbiB0aGUgc2FtZQorICogb3JpZ2luYWwgY29tcGlsYXRpb24gdW5pdCBBTkQgd2FzIHVzaW5nIHRoZSBzYW1lIHdvcmtpbmcgY29weSBvd25lciAodGhhdCBpcywgYXMgZGVmaW5lZCBieSBPYmplY3QuZXF1YWxzKS4JIAorICogCisgKiBUaGUgbGlmZSB0aW1lIG9mIGEgc2hhcmVkIHdvcmtpbmcgY29weSBpcyBhcyBmb2xsb3dzOgorICogLSBUaGUgZmlyc3QgY2FsbCB0byBnZXRXb3JraW5nQ29weShXb3JraW5nQ29weU93bmVyLCBJUHJvYmxlbVJlcXVlc3RvciwgSVByb2dyZXNzTW9uaXRvcikKKyAqICAgY3JlYXRlcyBhIG5ldyB3b3JraW5nIGNvcHkgZm9yIHRoaXMgZWxlbWVudAorICogLSBTdWJzZXF1ZW50IGNhbGxzIGluY3JlbWVudCBhbiBpbnRlcm5hbCBjb3VudGVyLgorICogLSBBIGNhbGwgdG8gZGlzY2FyZFdvcmtpbmdDb3B5KCkgZGVjcmVtZW50cyB0aGUgaW50ZXJuYWwgY291bnRlci4KKyAqIC0gV2hlbiB0aGlzIGNvdW50ZXIgaXMgMCwgdGhlIHdvcmtpbmcgY29weSBpcyBkaXNjYXJkZWQuCisgKiAKKyAqIFNvIHVzZXJzIG9mIHRoaXMgbWV0aG9kIG11c3QgZGlzY2FyZCBleGFjdGx5IG9uY2UgdGhlIHdvcmtpbmcgY29weS4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIHdvcmtpbmcgY29weSBvd25lciB3aWxsIGJlIHVzZWQgZm9yIHRoZSBsaWZlIHRpbWUgb2YgdGhpcyB3b3JraW5nIGNvcHksIHRoYXQgaXMgaWYgdGhlIAorICogd29ya2luZyBjb3B5IGlzIGNsb3NlZCB0aGVuIHJlb3BlbmVkLCB0aGlzIG93bmVyIHdpbGwgYmUgdXNlZC4KKyAqIFRoZSBidWZmZXIgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemVkIHdpdGggdGhlIG9yaWdpbmFsJ3MgY29tcGlsYXRpb24gdW5pdCBjb250ZW50CisgKiB1cG9uIGNyZWF0aW9uLgorICogCisgKiBXaGVuIHRoZSBzaGFyZWQgd29ya2luZyBjb3B5IGluc3RhbmNlIGlzIGNyZWF0ZWQsIGFuIEFEREVEIElKYXZhRWxlbWVudERlbHRhIGlzIHJlcG9ydGVkIG9uIHRoaXMKKyAqIHdvcmtpbmcgY29weS4KKyAqIAorICogU2luY2UgMi4xLCBhIHdvcmtpbmcgY29weSBjYW4gYmUgY3JlYXRlZCBvbiBhIG5vdC15ZXQgZXhpc3RpbmcgY29tcGlsYXRpb24KKyAqIHVuaXQuIEluIHBhcnRpY3VsYXIsIHN1Y2ggYSB3b3JraW5nIGNvcHkgY2FuIHRoZW4gYmUgY29tbWl0dGVkIGluIG9yZGVyIHRvIGNyZWF0ZQorICogdGhlIGNvcnJlc3BvbmRpbmcgY29tcGlsYXRpb24gdW5pdC4KKyAqIAorICogQHBhcmFtIG93bmVyIHRoZSB3b3JraW5nIGNvcHkgb3duZXIgdGhhdCBjcmVhdGVzIGEgYnVmZmVyIHRoYXQgaXMgdXNlZCB0byBnZXQgdGhlIGNvbnRlbnQgCisgKiAgCW9mIHRoZSB3b3JraW5nIGNvcHkKKyAqIEBwYXJhbSBwcm9ibGVtUmVxdWVzdG9yIGEgcmVxdWVzdG9yIHdoaWNoIHdpbGwgZ2V0IG5vdGlmaWVkIG9mIHByb2JsZW1zIGRldGVjdGVkIGR1cmluZworICogCXJlY29uY2lsaW5nIGFzIHRoZXkgYXJlIGRpc2NvdmVyZWQuIFRoZSByZXF1ZXN0b3IgY2FuIGJlIHNldCB0byBudWxsIGluZGljYXRpbmcKKyAqIAl0aGF0IHRoZSBjbGllbnQgaXMgbm90IGludGVyZXN0ZWQgaW4gcHJvYmxlbXMuCisgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IgdXNlZCB0byByZXBvcnQgcHJvZ3Jlc3Mgd2hpbGUgb3BlbmluZyB0aGlzIGNvbXBpbGF0aW9uIHVuaXQKKyAqIAlvciBudWxsIGlmIG5vIHByb2dyZXNzIHNob3VsZCBiZSByZXBvcnRlZCAKKyAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSBjb250ZW50cyBvZiB0aGlzIGVsZW1lbnQgY2FuCisgKiAgCW5vdCBiZSBkZXRlcm1pbmVkLiAKKyAqIEByZXR1cm4gYSBuZXcgd29ya2luZyBjb3B5IG9mIHRoaXMgZWxlbWVudCB1c2luZyB0aGUgZ2l2ZW4gZmFjdG9yeSB0byBjcmVhdGUKKyAqIHRoZSBidWZmZXIsIG9yIHRoaXMgZWxlbWVudCBpZiB0aGlzIGVsZW1lbnQgaXMgYWxyZWFkeSBhIHdvcmtpbmcgY29weQorICogQHNpbmNlIDMuMAorICovCitJQ29tcGlsYXRpb25Vbml0IGdldFdvcmtpbmdDb3B5KFdvcmtpbmdDb3B5T3duZXIgb3duZXIsIElQcm9ibGVtUmVxdWVzdG9yIHByb2JsZW1SZXF1ZXN0b3IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsJCisJPC9wcmU+PC9saT4KKwk8L3VsPgorQW5kIHRoZSBmb2xsb3dpbmcgYWJzdHJhY3QgY2xhc3MgcmVwbGFjZXMgPGNvZGU+SUJ1ZmZlckZhY3Rvcnk8L2NvZGU+OgorCTxwcmU+CisvKioKKyAqIFRoZSBvd25lciBvZiBhbiBJQ29tcGlsYXRpb25Vbml0IGhhbmRsZSBpbiB3b3JraW5nIGNvcHkgbW9kZS4gCisgKiBBbiBvd25lciBpcyB1c2VkIHRvIGlkZW50aWZ5IGEgd29ya2luZyBjb3B5IGFuZCB0byBjcmVhdGUgaXRzIGJ1ZmZlci4KKyAqIAorICogQHNlZSBJQ29tcGlsYXRpb25Vbml0I2JlY29tZVdvcmtpbmdDb3B5CisgKiBAc2VlIElDb21waWxhdGlvblVuaXQjZGlzY2FyZFdvcmtpbmdDb3B5CisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBXb3JraW5nQ29weU93bmVyIHsKKwkvKioKKwkgKiBDcmVhdGVzIGEgYnVmZmVyIGZvciB0aGUgZ2l2ZW4gd29ya2luZyBjb3B5LgorCSAqIFRoZSBuZXcgYnVmZmVyIHdpbGwgYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgY29udGVudHMgb2YgdGhlIHVuZGVybHlpbmcgZmlsZQorCSAqIGlmIGFuZCBvbmx5IGlmIGl0IHdhcyBub3QgYWxyZWFkeSBpbml0aWFsaXplZCBieSB0aGUgY29tcGlsYXRpb24gb3duZXIgKGEgYnVmZmVyIGlzIAorCSAqIHVuaW5pdGlhbGl6ZWQgaWYgaXRzIGNvbnRlbnQgaXMgbnVsbCkuCisJICogCisJICogQHBhcmFtIHdvcmtpbmdDb3B5IHRoZSB3b3JraW5nIGNvcHkgb2YgdGhlIGJ1ZmZlcgorCSAqIEByZXR1cm4gSUJ1ZmZlciB0aGUgY3JlYXRlZCBidWZmZXIgZm9yIHRoZSBnaXZlbiB3b3JraW5nIGNvcHkKKwkgKiBAc2VlIElCdWZmZXIKKwkgKi8KKwlwdWJsaWMgSUJ1ZmZlciBjcmVhdGVCdWZmZXIoSUNvbXBpbGF0aW9uVW5pdCB3b3JraW5nQ29weSkgeworCQkuLi4KKwl9Cit9CisJPC9wcmU+CisKKzwvbGk+Cis8L3VsPgorCis8aDM+UHJvYmxlbSBSZXBvcnRzIEZpeGVkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM4OTAxIj4zODkwMTwvYT4KK0luZGV4TWFuYWdlciBoYW5ncyBpbiBlbmQtbGVzcyBsb29wCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mzg5MDgiPjM4OTA4PC9hPgorQW50IHNjcmlwdCByZXBvcnRzIHRoYXQgdGhlIGJvb3RjbGFzc3BhdGggY2Fubm90IGJlIGluZmVyCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mzg1MzEiPjM4NTMxPC9hPgorSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICJTb3VyY2UgYXR0YWNobWVudCBwYXRoIHNob3VsZCBiZSBhYnNvbHV0ZSIKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zODQyNCI+Mzg0MjQ8L2E+CitNaXN0YWtlIG9uIFdlYiBzaXRlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mzg3MzIiPjM4NzMyPC9hPgorb3JnYW5pemUgaW1wb3J0cyBkb2VzIG5vdCB3b3JrIHdpdGggYXNzZXJ0IGluIHNvdXJjZSBjb2RlCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mzg0NDciPjM4NDQ3PC9hPgorQVNUOiBTb3VyY2UgcmFuZ2VzIHdpdGggbWlzc2luZyBicmFja2V0Cis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzY4NTQiPjM2ODU0PC9hPgorTlBFIG9wZW5pbmcgdHlwZSBoaWVyYXJjaHkgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM1MzAiPjMzNTMwPC9hPgorSmF2YU1vZGVsIHN5bmNocm9uaXphdGlvbiBtb2RlbCBzaG91bGQgYmUgbW9yZSBvcHRpbWlzdGljIAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwOTMxIj4yMDkzMTwvYT4KK05lZWQgYW4gQVBJIHRvIHJlbG9hZCB0aGUgY2xhc3NwYXRoIGZyb20gdGhlIGZpbGUKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zODM5MyI+MzgzOTM8L2E+CitieXRlY29kZSBnZW5lcmF0ZWQgZm9yIGV2YWx1YXRpb24gd2l0aCBwYXJlbnRoZXNlcyBpcyB3cm9uZworCisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM4OTc3Ij4zODk3NzwvYT4KK0RlYWRsb2NrIG9uIGluZGV4IG1hbmFnZXIgd2hpbGUgc2h1dHRpbmcgZG93biB0YXJnZXQgZWNsaXBzZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM4ODczIj4zODg3MzwvYT4KK0NvbXBpbGF0aW9uIFVuaXRzIHdoaWNoIGFyZW4ndCBhbnkuCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzI5NCI+NzI5NDwvYT4KK1N0YWNrT3ZlcmZsb3dFeGNlcHRpb24gZHVyaW5nIElUeXBlLmdldEZpZWxkcygpCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzY3NzciPjM2Nzc3PC9hPgorcmVmcmVzaGluZyBhIGxpYnJhcnkgcmVzdWx0cyBpbiBqemVudHJ5PT0wIGZhaWx1cmUgbWVzc2FnZSAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zODc2NiI+Mzg3NjY8L2E+CitXb3VsZCBsaWtlIHRoZSBDb21waWxlciB0byBpZ25vcmUgdGhlIHNlcmlhbFZlcnNpb25VSUQKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zODc2MyI+Mzg3NjM8L2E+CitVbmV4cGVjdGVkIE5MUyBwcm9ibGVtCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mzg0NDEiPjM4NDQxPC9hPgorQWxsb3cgc3JjIGZvbGRlciBleGNsdXNpb24gZmlsdGVycyB3aXRoIG5vIHBhdGggdGhhdCBleGNsdWRlIGFsbCBmaWxlcyBvZiBhIGNlcnRhaW4gdHlwZQorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM4NzAyIj4zODcwMjwvYT4KK0NvbXBpbGVyIGdlbmVyYXRlcyBpbGxlZ2FsIGJ5dGVjb2RlIGluIHN3aXRjaCBzdGF0ZW1lbnQuIFZlcmlmeUVycm9yLgorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM4Njg4Ij4zODY4ODwvYT4KK2V4Y2VwdGlvbiBpbiB0aGUgY29uc29sZSB3aW5kb3cgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzgxNjMiPjM4MTYzPC9hPgorTlBFIHdoaWxlIGJ1aWxkaW5nIHR5cGUgaGllcmFyY2h5IAorPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM3OTQ5Ij4zNzk0OTwvYT4KK05QRSBmcm9tIFNvdXJjZVR5cGVDb252ZXJ0ZXIgCis8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mzc4MDQiPjM3ODA0PC9hPgorTlBFIHdoZW4gb3BlbmluZyBjbGFzcyAKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zODYwNyI+Mzg2MDc8L2E+CitSZWZyZXNoIGRvZXMgbm90IGNhcHR1cmUgY2hhbmdlcyBpbiBqYXIgZmlsZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zODY3NCI+Mzg2NzQ8L2E+CiszLjAgTTEgLSBQcmVzZXJ2ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGVzIGRvZXNuJ3Qgc2VlbSB0byB3b3JrCisKKzxwPjxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgorRWNsaXBzZSBTREsgMy4wIEJ1aWxkIC0gNXRoIEp1bmUgMjAwMyAtIDMuMCBNSUxFU1RPTkUtMQorPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8zNTcKKzxoMj4KK1doYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KKzx1bD4KKzwvdWw+CisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgRml4ZWQ8L2gzPgorPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzcyNzQiPjM3Mjc0PC9hPgorRGVhZGxvY2sgb24gcGx1Z2luIGltcG9ydAorCis8aDM+UHJvYmxlbSBSZXBvcnRzIENsb3NlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zODM5OCI+MzgzOTg8L2E+CitEZWFkbG9jayBpbXBvcnRpbmcgYmluYXJpZXMKKzxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zODM5OCI+Mzg1MDk8L2E+CitkZWFkbG9jayBvbiBpbXBvcnRpbmcgcGx1Z2lucworCisKKzxwPjxocj48aDE+CitFY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzJm5ic3A7PGJyPgorSmF2YSBEZXZlbG9wbWVudCBUb29saW5nIENvcmU8L2gxPgogRWNsaXBzZSBTREsgMy4wIEJ1aWxkIC0gNHRoIEp1bmUgMjAwMyAtIDMuMCBNSUxFU1RPTkUtMQogPGJyPlByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUgdl8zNTYKIDxoMj4KQEAgLTM2OCw3ICs2OTYsOSBAQAogW0RPTS9BU1RdIEluY29ycmVjdCBncmFtbWFyIHJ1bGUgaW4gVHlwZURlY2xhcmF0aW9uCiAKIDxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM2NzA5Ij4zNjcwOTwvYT4KKzxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMzA0Ij4yMTMwNDwvYT4KK0hhdmUgb3B0aW9uIGZvciBjb21waWxlciB3YXJuaW5nIG9uIHJlZGVjbGFyYXRpb24gb2YgaW5zdGFuY2UvY2xhc3MgdmFyaWFibGVzIGFzIGxvY2FsIHZhcmlhYmxlcworPGJyPjxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM2NzA5Ij4zNjcwOTwvYT4KIGFic2VudCBsaW5lIG51bWJlcnMgbXNnIHdoZW4gZGVidWdnaW5nCiA8YnI+PGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzY2MjAiPjM2NjIwPC9hPgogTlBFIFNlYXJjaGluZyBmb3Igd29ya3NwYWNlIHJlZmVyZW5jZXMKQEAgLTQyMSw2ICs3NTEsMjEgQEAKIDxicj48YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTgzOCI+MjU4Mzg8L2E+CiBXYXJuaW5nIHdoZW4gb3ZlcnJpZGluZyBmaWVsZAogCis8cD48aHI+PGgxPgorRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3RlcyZuYnNwOzxicj4KK0phdmEgRGV2ZWxvcG1lbnQgVG9vbGluZyBDb3JlPC9oMT4KK0VjbGlwc2UgU0RLIDIuMSBCdWlsZCAoYmVmb3JlIDMuMC8yLjEuMSBicmFuY2hpbmcpIC0gMzFzdCBNYXJjaCAyMDAzCis8YnI+UHJvamVjdCBvcmcuZWNsaXBzZS5qZHQuY29yZSB2XzMxMgorPGgyPgorV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgorPHVsPgorPC91bD4KKworPGgzPlByb2JsZW0gUmVwb3J0cyBGaXhlZDwvaDM+Cis8YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTgzMSI+MzU4MzE8L2E+CitOUEUgbmF2aWdhdGluZyByZWZlcmVuY2VzIHVzaW5nIGxpbmtzCisKKzxoMz5Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KIAogPHA+PGhyPgogRm9yIGVhcmxpZXIgYnVpbGQgbm90ZXMsIGFsc28gc2VlIDxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvJTdFY2hlY2tvdXQlN0Uvb3JnLmVjbGlwc2UuamR0LmNvcmUvbm90ZXMvUjIxX2J1aWxkbm90ZXNfamR0LWNvcmUuaHRtbCI+YnVpbGQgbm90ZXMgdXAgdG8gUmVsZWFzZSAyLjE8L2E+LgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9wcm9jZXNzaW5nL0pvYk1hbmFnZXIuamF2YSBiL29yZy5lY2xpcHNlLmpkdC5jb3JlL3NlYXJjaC9vcmcvZWNsaXBzZS9qZHQvaW50ZXJuYWwvY29yZS9zZWFyY2gvcHJvY2Vzc2luZy9Kb2JNYW5hZ2VyLmphdmEKaW5kZXggNmZiYjBjZi4uMTg0M2VmZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamR0LmNvcmUvc2VhcmNoL29yZy9lY2xpcHNlL2pkdC9pbnRlcm5hbC9jb3JlL3NlYXJjaC9wcm9jZXNzaW5nL0pvYk1hbmFnZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZHQuY29yZS9zZWFyY2gvb3JnL2VjbGlwc2UvamR0L2ludGVybmFsL2NvcmUvc2VhcmNoL3Byb2Nlc3NpbmcvSm9iTWFuYWdlci5qYXZhCkBAIC0xMzQsMTAgKzEzNCwxMSBAQAogCQlpZiAoVkVSQk9TRSkKIAkJCUpvYk1hbmFnZXIudmVyYm9zZSgiRElTQ0FSRCAgIERPTkUgd2l0aCBiYWNrZ3JvdW5kIGpvYiBmYW1pbHkgLSAiICsgam9iRmFtaWx5KTsgLy8kTk9OLU5MUy0xJAogCX0KLQlwdWJsaWMgdm9pZCBlbmFibGUoKSB7CisJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGVuYWJsZSgpIHsKIAkJZW5hYmxlZCA9IHRydWU7CiAJCWlmIChWRVJCT1NFKQogCQkJSm9iTWFuYWdlci52ZXJib3NlKCJFTkFCTElORyAgYmFja2dyb3VuZCBpbmRleGluZyIpOyAvLyROT04tTkxTLTEkCisJCXRoaXMubm90aWZ5QWxsKCk7IC8vIHdha2UgdXAgdGhlIGJhY2tncm91bmQgdGhyZWFkIGlmIGl0IGlzIHdhaXRpbmcgKGNvbnRleHQgbXVzdCBiZSBzeW5jaHJvbml6ZWQpCQkJCiAJfQogCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKIAkJcmV0dXJuIGVuYWJsZWQ7CkBAIC0zNDcsNyArMzQ4LDcgQEAKIAkJCQkJCQlpZiAoaWRsaW5nU3RhcnQgPCAwKQogCQkJCQkJCQlpZGxpbmdTdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogCQkJCQkJCW5vdGlmeUlkbGUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBpZGxpbmdTdGFydCk7Ci0JCQkJCQkJdGhpcy53YWl0KCk7IC8vIHdhaXQgdW50aWwgYSBuZXcgam9iIGlzIHBvc3RlZAorCQkJCQkJCXRoaXMud2FpdCgpOyAvLyB3YWl0IHVudGlsIGEgbmV3IGpvYiBpcyBwb3N0ZWQgKG9yIHJlZW5hYmxlZDozODkwMSkKIAkJCQkJCQlUaHJlYWQuc2xlZXAoNTAwKTsgLy8gZGVsYXkgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIG5ldyBqb2IsIGFsbG93IHNvbWUgdGltZSBmb3IgdGhlIGFjdGl2ZSB0aHJlYWQgdG8gZmluaXNoCiAJCQkJCQkJY29udGludWU7CiAJCQkJCQl9IGVsc2Ugewo=