ZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcvLmNsYXNzcGF0aCBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODQ5NGU5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8Y2xhc3NwYXRoPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLWdlbiIvPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCis8L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjYyOWI3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy8ucHJvamVjdApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmc8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3YTVkZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSw0NCBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wDQorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMg0KK0J1bmRsZS1OYW1lOiBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcNCitCdW5kbGUtVmVuZG9yOiBNeSBDb21wYW55DQorQnVuZGxlLVZlcnNpb246IDEuMC4wDQorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nOyBzaW5nbGV0b246PXRydWUNCitFY2xpcHNlLVJlZ2lzdGVyQnVkZHk6IG9yZy5lY2xpcHNlLnh0ZXh0LmxvZzRqDQorQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkNCitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UueHRleHQsDQorIG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvcjtyZXNvbHV0aW9uOj1vcHRpb25hbCwNCisgZGUuaXRlbWlzLnh0ZXh0LmFudGxyO3Jlc29sdXRpb246PW9wdGlvbmFsLA0KKyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZztyZXNvbHV0aW9uOj1vcHRpb25hbCwNCisgb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4uZWNvcmU7cmVzb2x1dGlvbjo9b3B0aW9uYWwsDQorIG9yZy5lY2xpcHNlLnh0ZXh0LmxvZzRqO3Jlc29sdXRpb246PW9wdGlvbmFsLA0KKyBvcmcuZWNsaXBzZS5lbWYubXdlLnV0aWxzO3Jlc29sdXRpb246PW9wdGlvbmFsLA0KKyBvcmcuZWNsaXBzZS5lbWYubXdlLmNvcmU7cmVzb2x1dGlvbjo9b3B0aW9uYWwsDQorIGNvbS5pYm0uaWN1O3Jlc29sdXRpb246PW9wdGlvbmFsLA0KKyBvcmcuZWNsaXBzZS54dGV4dC54dGVuZDtyZXNvbHV0aW9uOj1vcHRpb25hbCwNCisgb3JnLmVjbGlwc2UueHRleHQudXRpbCwNCisgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLA0KKyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLA0KKyBvcmcuYW50bHIucnVudGltZSwNCisgb3JnLmVjbGlwc2UuYW1wLmFtZi5hY29yZTtidW5kbGUtdmVyc2lvbj0iMC4yLjAiLA0KKyBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iMy41LjAiLA0KKyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IjMuNS4wIiwNCisgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IjMuNS4wIiwNCisgb3JnLmVjbGlwc2UuYW1wLmFtZi5wYXJhbWV0ZXJzO2J1bmRsZS12ZXJzaW9uPSIxLjAuMCINCitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUNCitCdW5kbGUtQ2xhc3NQYXRoOiAuDQorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZywNCisgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LA0KKyBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuaW1wbCwNCisgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LnV0aWwsDQorIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLA0KKyBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5pbXBsLA0KKyBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy51dGlsLA0KKyBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy52YWxpZGF0aW9uLA0KKyBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuZm9ybWF0dGluZywNCisgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLnBhcnNlVHJlZUNvbnN0cnVjdGlvbiwNCisgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLnBhcnNlci5hbnRsciwNCisgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLnBhcnNlci5hbnRsci5pbnRlcm5hbCwNCisgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLnNjb3BpbmcsDQorIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5zZXJ2aWNlcywNCisgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLnZhbGlkYXRpb24NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM3MTljNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDE0IEBACitiaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAorICAgICAgICAgICAgICAgLixcCisgICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKKyAgICAgICAgICAgICAgIC5wcm9qZWN0LFwKKyAgICAgICAgICAgICAgIC5jbGFzc3BhdGgKK2phcnMuY29tcGlsZS5vcmRlciA9IC4KK291dHB1dC4uID0gYmluLworc291cmNlLi4gPSBzcmMvLFwKKyAgICAgICAgICAgc3JjLWdlbi8KK3NyYy5pbmNsdWRlcyA9IHNyYy1nZW4vLFwKKyAgICAgICAgICAgICAgIHNyYy8KK3NvdXJjZS4uID0gc3JjLyxcCisgICAgICAgICAgIHNyYy1nZW4vCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcvcGx1Z2luLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3BsdWdpbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmOTNmYjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3BsdWdpbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsOCBAQAorDQorIyA8Y29weXJpZ2h0Pg0KKyMgPC9jb3B5cmlnaHQ+DQorIw0KKyMgJElkOiBwbHVnaW4ucHJvcGVydGllcyx2IDEuMSAyMDA5LzA3LzMxIDIxOjQ4OjE5IG1wYXJrZXIgRXhwICQNCisNCitwbHVnaW5OYW1lID0gQXJlcyBNb2RlbA0KK3Byb3ZpZGVyTmFtZSA9IHd3dy5leGFtcGxlLm9yZw0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcvcGx1Z2luLnhtbCBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcvcGx1Z2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWQ5Y2NjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9wbHVnaW4ueG1sCkBAIC0wLDAgKzEsMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+CisKKzxwbHVnaW4+CisKKyAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KKyAgICA8cGFja2FnZSAKKyAgICAgICB1cmkgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9hbXAvYW1mL3Rlc3RpbmcvQVRlc3QiIAorICAgICAgIGNsYXNzID0gIm9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5BVGVzdFBhY2thZ2UiCisgICAgICAgZ2VuTW9kZWwgPSAib3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL0FUZXN0Lmdlbm1vZGVsIiAvPiAKKwkKKyAgPC9leHRlbnNpb24+CisKKworCisKKzwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9wbHVnaW4ueG1sX2dlbiBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcvcGx1Z2luLnhtbF9nZW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFkOWNjYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcvcGx1Z2luLnhtbF9nZW4KQEAgLTAsMCArMSwxNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KKworPHBsdWdpbj4KKworICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgorICAgIDxwYWNrYWdlIAorICAgICAgIHVyaSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2FtcC9hbWYvdGVzdGluZy9BVGVzdCIgCisgICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkFUZXN0UGFja2FnZSIKKyAgICAgICBnZW5Nb2RlbCA9ICJvcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvQVRlc3QuZ2VubW9kZWwiIC8+IAorCQorICA8L2V4dGVuc2lvbj4KKworCisKKworPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL0FUZXN0LmVjb3JlIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9BVGVzdC5lY29yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTUxMzgxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9BVGVzdC5lY29yZQpAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCisgICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJhVGVzdCIKKyAgICBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9hbXAvYW1mL3Rlc3RpbmcvQVRlc3QiIG5zUHJlZml4PSJhVGVzdCI+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTW9kZWwiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRlc3RzIiBlVHlwZT0iIy8vVGVzdHMiCisgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRyYWludHMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICBlVHlwZT0iIy8vQ29uc3RyYWludCIgY29udGFpbm1lbnQ9InRydWUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVzdHMiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbXBvcnRVUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29uc3RyYWludCI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1lYXN1cmUiIGVUeXBlPSIjLy9NZWFzdXJlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFnZW50IiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUvc3JjL21vZGVsL21ldGFhYm0uZWNvcmUjLy9TQWdlbnQiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXR0cmlidXRlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uLy4uLy4uLy4uLy4uLy4uL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUvc3JjL21vZGVsL21ldGFhYm0uZWNvcmUjLy9TQXR0cmlidXRlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InF1YWxpZmllciIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi8uLi8uLi8uLi8uLi8uLi9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlL3NyYy9tb2RlbC9tZXRhYWJtLmVjb3JlIy8vU1N0YXRlVmFsdWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWluVmFsdWUiIGVUeXBlPSJlY29yZTpFQ2xhc3MgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VPYmplY3QiCisgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1heFZhbHVlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FT2JqZWN0IgorICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9Ik1lYXN1cmUiPgorICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ09VTlQiIGxpdGVyYWw9IkNvdW50Ii8+CisgICAgPGVMaXRlcmFscyBuYW1lPSJBVkVSQUdFIiB2YWx1ZT0iMSIgbGl0ZXJhbD0iQXZlcmFnZSIvPgorICAgIDxlTGl0ZXJhbHMgbmFtZT0iU1VNIiB2YWx1ZT0iMiIgbGl0ZXJhbD0iU3VtIi8+CisgICAgPGVMaXRlcmFscyBuYW1lPSJNSU5JTVVNIiB2YWx1ZT0iMyIgbGl0ZXJhbD0iTWluaW11bSIvPgorICAgIDxlTGl0ZXJhbHMgbmFtZT0iTUFYSU1VTSIgdmFsdWU9IjQiIGxpdGVyYWw9Ik1heGltdW0iLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSW50VmFsdWUiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZWFsVmFsdWUiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICA8L2VDbGFzc2lmaWVycz4KKzwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL0FUZXN0Lmdlbm1vZGVsIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9BVGVzdC5nZW5tb2RlbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTQxYTNjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9BVGVzdC5nZW5tb2RlbApAQCAtMCwwICsxLDc5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/PgorPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuIiBlZGl0RGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmVkaXQvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuZWRpdG9yL3NyYyIgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nIiBmb3JjZU92ZXJ3cml0ZT0idHJ1ZSIgbW9kZWxOYW1lPSJBVGVzdCIgdXBkYXRlQ2xhc3NwYXRoPSJmYWxzZSIgcm9vdEV4dGVuZHNDbGFzcz0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuTWluaW1hbEVPYmplY3RJbXBsJENvbnRhaW5lciIgY29tcGxpYW5jZUxldmVsPSI1LjAiIGNvcHlyaWdodEZpZWxkcz0iZmFsc2UiIGVkaXRQbHVnaW5JRD0ib3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmVkaXQiIGVkaXRvclBsdWdpbklEPSJvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuZWRpdG9yIj4KKyAgPGdlblBhY2thZ2VzIHByZWZpeD0iQVRlc3QiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmciIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiPgorICAgIDxlY29yZVBhY2thZ2UgaHJlZj0iQVRlc3QuZWNvcmUjLyIvPgorICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSI+CisgICAgICA8ZWNvcmVFbnVtIGhyZWY9IkFUZXN0LmVjb3JlIy8vTWVhc3VyZSIvPgorICAgICAgPGdlbkVudW1MaXRlcmFscz4KKyAgICAgICAgPGVjb3JlRW51bUxpdGVyYWwgaHJlZj0iQVRlc3QuZWNvcmUjLy9NZWFzdXJlL0NPVU5UIi8+CisgICAgICA8L2dlbkVudW1MaXRlcmFscz4KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHM+CisgICAgICAgIDxlY29yZUVudW1MaXRlcmFsIGhyZWY9IkFUZXN0LmVjb3JlIy8vTWVhc3VyZS9BVkVSQUdFIi8+CisgICAgICA8L2dlbkVudW1MaXRlcmFscz4KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHM+CisgICAgICAgIDxlY29yZUVudW1MaXRlcmFsIGhyZWY9IkFUZXN0LmVjb3JlIy8vTWVhc3VyZS9TVU0iLz4KKyAgICAgIDwvZ2VuRW51bUxpdGVyYWxzPgorICAgICAgPGdlbkVudW1MaXRlcmFscz4KKyAgICAgICAgPGVjb3JlRW51bUxpdGVyYWwgaHJlZj0iQVRlc3QuZWNvcmUjLy9NZWFzdXJlL01JTklNVU0iLz4KKyAgICAgIDwvZ2VuRW51bUxpdGVyYWxzPgorICAgICAgPGdlbkVudW1MaXRlcmFscz4KKyAgICAgICAgPGVjb3JlRW51bUxpdGVyYWwgaHJlZj0iQVRlc3QuZWNvcmUjLy9NZWFzdXJlL01BWElNVU0iLz4KKyAgICAgIDwvZ2VuRW51bUxpdGVyYWxzPgorICAgIDwvZ2VuRW51bXM+CisgICAgPGdlbkNsYXNzZXM+CisgICAgICA8ZWNvcmVDbGFzcyBocmVmPSJBVGVzdC5lY29yZSMvL01vZGVsIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIj4KKyAgICAgICAgPGVjb3JlRmVhdHVyZSB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQVRlc3QuZWNvcmUjLy9Nb2RlbC9uYW1lIi8+CisgICAgICA8L2dlbkZlYXR1cmVzPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSI+CisgICAgICAgIDxlY29yZUZlYXR1cmUgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkFUZXN0LmVjb3JlIy8vTW9kZWwvZGVzY3JpcHRpb24iLz4KKyAgICAgIDwvZ2VuRmVhdHVyZXM+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSI+CisgICAgICAgIDxlY29yZUZlYXR1cmUgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIGhyZWY9IkFUZXN0LmVjb3JlIy8vTW9kZWwvdGVzdHMiLz4KKyAgICAgIDwvZ2VuRmVhdHVyZXM+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSI+CisgICAgICAgIDxlY29yZUZlYXR1cmUgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIGhyZWY9IkFUZXN0LmVjb3JlIy8vTW9kZWwvY29udHJhaW50cyIvPgorICAgICAgPC9nZW5GZWF0dXJlcz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXM+CisgICAgICA8ZWNvcmVDbGFzcyBocmVmPSJBVGVzdC5lY29yZSMvL1Rlc3RzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIj4KKyAgICAgICAgPGVjb3JlRmVhdHVyZSB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQVRlc3QuZWNvcmUjLy9UZXN0cy9pbXBvcnRVUkkiLz4KKyAgICAgIDwvZ2VuRmVhdHVyZXM+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzPgorICAgICAgPGVjb3JlQ2xhc3MgaHJlZj0iQVRlc3QuZWNvcmUjLy9Db25zdHJhaW50Ii8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIj4KKyAgICAgICAgPGVjb3JlRmVhdHVyZSB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQVRlc3QuZWNvcmUjLy9Db25zdHJhaW50L21lYXN1cmUiLz4KKyAgICAgIDwvZ2VuRmVhdHVyZXM+CisgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIj4KKyAgICAgICAgPGVjb3JlRmVhdHVyZSB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgaHJlZj0iQVRlc3QuZWNvcmUjLy9Db25zdHJhaW50L2FnZW50Ii8+CisgICAgICA8L2dlbkZlYXR1cmVzPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSI+CisgICAgICAgIDxlY29yZUZlYXR1cmUgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIGhyZWY9IkFUZXN0LmVjb3JlIy8vQ29uc3RyYWludC9hdHRyaWJ1dGUiLz4KKyAgICAgIDwvZ2VuRmVhdHVyZXM+CisgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIj4KKyAgICAgICAgPGVjb3JlRmVhdHVyZSB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgaHJlZj0iQVRlc3QuZWNvcmUjLy9Db25zdHJhaW50L3F1YWxpZmllciIvPgorICAgICAgPC9nZW5GZWF0dXJlcz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIj4KKyAgICAgICAgPGVjb3JlRmVhdHVyZSB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgaHJlZj0iQVRlc3QuZWNvcmUjLy9Db25zdHJhaW50L21pblZhbHVlIi8+CisgICAgICA8L2dlbkZlYXR1cmVzPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiPgorICAgICAgICA8ZWNvcmVGZWF0dXJlIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBocmVmPSJBVGVzdC5lY29yZSMvL0NvbnN0cmFpbnQvbWF4VmFsdWUiLz4KKyAgICAgIDwvZ2VuRmVhdHVyZXM+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzPgorICAgICAgPGVjb3JlQ2xhc3MgaHJlZj0iQVRlc3QuZWNvcmUjLy9JbnRWYWx1ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSI+CisgICAgICAgIDxlY29yZUZlYXR1cmUgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkFUZXN0LmVjb3JlIy8vSW50VmFsdWUvdmFsdWUiLz4KKyAgICAgIDwvZ2VuRmVhdHVyZXM+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzPgorICAgICAgPGVjb3JlQ2xhc3MgaHJlZj0iQVRlc3QuZWNvcmUjLy9SZWFsVmFsdWUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiPgorICAgICAgICA8ZWNvcmVGZWF0dXJlIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJBVGVzdC5lY29yZSMvL1JlYWxWYWx1ZS92YWx1ZSIvPgorICAgICAgPC9nZW5GZWF0dXJlcz4KKyAgICA8L2dlbkNsYXNzZXM+CisgIDwvZ2VuUGFja2FnZXM+CisgIDx1c2VkR2VuUGFja2FnZXMgaHJlZj0icGxhdGZvcm06L3Jlc291cmNlL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUvc3JjL21vZGVsL21ldGFhYm0uZ2VubW9kZWwjLy9tZXRhYWJtIi8+Cis8L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9BVGVzdC54bWkgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL0FUZXN0LnhtaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2U4YzUxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9BVGVzdC54bWkKQEAgLTAsMCArMSwzNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+Cis8eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiB4bWxuczp4dGV4dD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8yMDA4L1h0ZXh0Ij4KKyAgPHh0ZXh0OkdyYW1tYXIgbmFtZT0ib3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLkFUZXN0IiB1c2VkR3JhbW1hcnM9Ii8xIj4KKyAgICA8bWV0YW1vZGVsRGVjbGFyYXRpb25zIHhzaTp0eXBlPSJ4dGV4dDpHZW5lcmF0ZWRNZXRhbW9kZWwiIG5hbWU9ImFUZXN0Ij4KKyAgICAgIDxlUGFja2FnZSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2FtcC9hbWYvdGVzdGluZy9BVGVzdCMvIi8+CisgICAgPC9tZXRhbW9kZWxEZWNsYXJhdGlvbnM+CisgICAgPG1ldGFtb2RlbERlY2xhcmF0aW9ucyB4c2k6dHlwZT0ieHRleHQ6UmVmZXJlbmNlZE1ldGFtb2RlbCIgYWxpYXM9ImVjb3JlIj4KKyAgICAgIDxlUGFja2FnZSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8iLz4KKyAgICA8L21ldGFtb2RlbERlY2xhcmF0aW9ucz4KKyAgICA8bWV0YW1vZGVsRGVjbGFyYXRpb25zIHhzaTp0eXBlPSJ4dGV4dDpSZWZlcmVuY2VkTWV0YW1vZGVsIj4KKyAgICAgIDxlUGFja2FnZSBocmVmPSJodHRwOi8vbWV0YWFibS5vcmcvc3RydWN0dXJlIy8iLz4KKyAgICA8L21ldGFtb2RlbERlY2xhcmF0aW9ucz4KKyAgICA8cnVsZXMgeHNpOnR5cGU9Inh0ZXh0OlBhcnNlclJ1bGUiIG5hbWU9Ik1vZGVsIj4KKyAgICAgIDx0eXBlIG1ldGFtb2RlbD0iLzAvQG1ldGFtb2RlbERlY2xhcmF0aW9ucy4wIj4KKyAgICAgICAgPGNsYXNzaWZpZXIgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9hbXAvYW1mL3Rlc3RpbmcvQVRlc3QjLy9Nb2RlbCIvPgorICAgICAgPC90eXBlPgorICAgICAgPGFsdGVybmF0aXZlcyB4c2k6dHlwZT0ieHRleHQ6R3JvdXAiPgorICAgICAgICA8dG9rZW5zIHhzaTp0eXBlPSJ4dGV4dDpBc3NpZ25tZW50IiBjYXJkaW5hbGl0eT0iPyIgZmVhdHVyZT0ibmFtZSIgb3BlcmF0b3I9Ij0iPgorICAgICAgICAgIDx0ZXJtaW5hbCB4c2k6dHlwZT0ieHRleHQ6UnVsZUNhbGwiIHJ1bGU9Ii8xL0BydWxlcy4yIi8+CisgICAgICAgIDwvdG9rZW5zPgorICAgICAgICA8dG9rZW5zIHhzaTp0eXBlPSJ4dGV4dDpBc3NpZ25tZW50IiBjYXJkaW5hbGl0eT0iPyIgZmVhdHVyZT0iZGVzY3JpcHRpb24iIG9wZXJhdG9yPSI9Ij4KKyAgICAgICAgICA8dGVybWluYWwgeHNpOnR5cGU9Inh0ZXh0OlJ1bGVDYWxsIiBydWxlPSIvMC9AcnVsZXMuNyIvPgorICAgICAgICA8L3Rva2Vucz4KKyAgICAgICAgPHRva2VucyB4c2k6dHlwZT0ieHRleHQ6QXNzaWdubWVudCIgY2FyZGluYWxpdHk9Ij8iIGZlYXR1cmU9InRlc3RzIiBvcGVyYXRvcj0iPSI+CisgICAgICAgICAgPHRlcm1pbmFsIHhzaTp0eXBlPSJ4dGV4dDpSdWxlQ2FsbCIgcnVsZT0iLzAvQHJ1bGVzLjEiLz4KKyAgICAgICAgPC90b2tlbnM+CisgICAgICAgIDx0b2tlbnMgeHNpOnR5cGU9Inh0ZXh0OkFzc2lnbm1lbnQiIGNhcmRpbmFsaXR5PSIqIiBmZWF0dXJlPSJjb250cmFpbnRzIiBvcGVyYXRvcj0iKz0iPgorICAgICAgICAgIDx0ZXJtaW5hbCB4c2k6dHlwZT0ieHRleHQ6UnVsZUNhbGwiIHJ1bGU9Ii8wL0BydWxlcy4yIi8+CisgICAgICAgIDwvdG9rZW5zPgorICAgICAgPC9hbHRlcm5hdGl2ZXM+CisgICAgPC9ydWxlcz4KKyAgICA8cnVsZXMgeHNpOnR5cGU9Inh0ZXh0OlBhcnNlclJ1bGUiIG5hbWU9IlRlc3RzIj4KKyAgICAgIDx0eXBlIG1ldGFtb2RlbD0iLzAvQG1ldGFtb2RlbERlY2xhcmF0aW9ucy4wIj4KKyAgICAgICAgPGNsYXNzaWZpZXIgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9hbXAvYW1mL3Rlc3RpbmcvQVRlc3QjLy9UZXN0cyIvPgorICAgICAgPC90eXBlPgorICAgICAgPGFsdGVybmF0aXZlcyB4c2k6dHlwZT0ieHRleHQ6R3JvdXAiPgorICAgICAgICA8dG9rZW5zIHhzaTp0eXBlPSJ4dGV4dDpLZXl3b3JkIiB2YWx1ZT0iVEVTVFMiLz4KKyAgICAgICAgPHRva2VucyB4c2k6dHlwZT0ieHRleHQ6QXNzaWdubWVudCIgZmVhdHVyZT0iaW1wb3J0VVJJIiBvcGVyYXRvcj0iPSI+CisgICAgICAgICAgPHRlcm1pbmFsIHhzaTp0eXBlPSJ4dGV4dDpSdWxlQ2FsbCIgcnVsZT0iLzEvQHJ1bGVzLjIiLz4KKyAgICAgICAgPC90b2tlbnM+CisgICAgICA8L2FsdGVybmF0aXZlcz4KKyAgICA8L3J1bGVzPgorICAgIDxydWxlcyB4c2k6dHlwZT0ieHRleHQ6UGFyc2VyUnVsZSIgbmFtZT0iQ29uc3RyYWludCI+CisgICAgICA8dHlwZSBtZXRhbW9kZWw9Ii8wL0BtZXRhbW9kZWxEZWNsYXJhdGlvbnMuMCI+CisgICAgICAgIDxjbGFzc2lmaWVyIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvYW1wL2FtZi90ZXN0aW5nL0FUZXN0Iy8vQ29uc3RyYWludCIvPgorICAgICAgPC90eXBlPgorICAgICAgPGFsdGVybmF0aXZlcyB4c2k6dHlwZT0ieHRleHQ6R3JvdXAiPgorICAgICAgICA8dG9rZW5zIHhzaTp0eXBlPSJ4dGV4dDpBc3NpZ25tZW50IiBmZWF0dXJlPSJtZWFzdXJlIiBvcGVyYXRvcj0iPSI+CisgICAgICAgICAgPHRlcm1pbmFsIHhzaTp0eXBlPSJ4dGV4dDpSdWxlQ2FsbCIgcnVsZT0iLzAvQHJ1bGVzLjMiLz4KKyAgICAgICAgPC90b2tlbnM+CisgICAgICAgIDx0b2tlbnMgeHNpOnR5cGU9Inh0ZXh0OktleXdvcmQiIHZhbHVlPSIoIi8+CisgICAgICAgIDx0b2tlbnMgeHNpOnR5cGU9Inh0ZXh0OkFzc2lnbm1lbnQiIGZlYXR1cmU9ImFnZW50IiBvcGVyYXRvcj0iPSI+CisgICAgICAgICAgPHRlcm1pbmFsIHhzaTp0eXBlPSJ4dGV4dDpDcm9zc1JlZmVyZW5jZSI+CisgICAgICAgICAgICA8dHlwZSBtZXRhbW9kZWw9Ii8wL0BtZXRhbW9kZWxEZWNsYXJhdGlvbnMuMiI+CisgICAgICAgICAgICAgIDxjbGFzc2lmaWVyIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIGhyZWY9Imh0dHA6Ly9tZXRhYWJtLm9yZy9zdHJ1Y3R1cmUjLy9TQWdlbnQiLz4KKyAgICAgICAgICAgIDwvdHlwZT4KKyAgICAgICAgICAgIDx0ZXJtaW5hbCB4c2k6dHlwZT0ieHRleHQ6UnVsZUNhbGwiIHJ1bGU9Ii8xL0BydWxlcy4yIi8+CisgICAgICAgICAgPC90ZXJtaW5hbD4KKyAgICAgICAgPC90b2tlbnM+CisgICAgICAgIDx0b2tlbnMgeHNpOnR5cGU9Inh0ZXh0OktleXdvcmQiIHZhbHVlPSI6Ii8+CisgICAgICAgIDx0b2tlbnMgeHNpOnR5cGU9Inh0ZXh0OkFzc2lnbm1lbnQiIGZlYXR1cmU9ImF0dHJpYnV0ZSIgb3BlcmF0b3I9Ij0iPgorICAgICAgICAgIDx0ZXJtaW5hbCB4c2k6dHlwZT0ieHRleHQ6Q3Jvc3NSZWZlcmVuY2UiPgorICAgICAgICAgICAgPHR5cGUgbWV0YW1vZGVsPSIvMC9AbWV0YW1vZGVsRGVjbGFyYXRpb25zLjIiPgorICAgICAgICAgICAgICA8Y2xhc3NpZmllciB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBocmVmPSJodHRwOi8vbWV0YWFibS5vcmcvc3RydWN0dXJlIy8vU0F0dHJpYnV0ZSIvPgorICAgICAgICAgICAgPC90eXBlPgorICAgICAgICAgICAgPHRlcm1pbmFsIHhzaTp0eXBlPSJ4dGV4dDpSdWxlQ2FsbCIgcnVsZT0iLzEvQHJ1bGVzLjIiLz4KKyAgICAgICAgICA8L3Rlcm1pbmFsPgorICAgICAgICA8L3Rva2Vucz4KKyAgICAgICAgPHRva2VucyB4c2k6dHlwZT0ieHRleHQ6R3JvdXAiIGNhcmRpbmFsaXR5PSI/Ij4KKyAgICAgICAgICA8dG9rZW5zIHhzaTp0eXBlPSJ4dGV4dDpLZXl3b3JkIiB2YWx1ZT0iOiIvPgorICAgICAgICAgIDx0b2tlbnMgeHNpOnR5cGU9Inh0ZXh0OkFzc2lnbm1lbnQiIGZlYXR1cmU9InF1YWxpZmllciIgb3BlcmF0b3I9Ij0iPgorICAgICAgICAgICAgPHRlcm1pbmFsIHhzaTp0eXBlPSJ4dGV4dDpDcm9zc1JlZmVyZW5jZSI+CisgICAgICAgICAgICAgIDx0eXBlIG1ldGFtb2RlbD0iLzAvQG1ldGFtb2RlbERlY2xhcmF0aW9ucy4yIj4KKyAgICAgICAgICAgICAgICA8Y2xhc3NpZmllciB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBocmVmPSJodHRwOi8vbWV0YWFibS5vcmcvc3RydWN0dXJlIy8vU1N0YXRlVmFsdWUiLz4KKyAgICAgICAgICAgICAgPC90eXBlPgorICAgICAgICAgICAgICA8dGVybWluYWwgeHNpOnR5cGU9Inh0ZXh0OlJ1bGVDYWxsIiBydWxlPSIvMS9AcnVsZXMuMiIvPgorICAgICAgICAgICAgPC90ZXJtaW5hbD4KKyAgICAgICAgICA8L3Rva2Vucz4KKyAgICAgICAgPC90b2tlbnM+CisgICAgICAgIDx0b2tlbnMgeHNpOnR5cGU9Inh0ZXh0OktleXdvcmQiIHZhbHVlPSIpIi8+CisgICAgICAgIDx0b2tlbnMgeHNpOnR5cGU9Inh0ZXh0Okdyb3VwIj4KKyAgICAgICAgICA8dG9rZW5zIHhzaTp0eXBlPSJ4dGV4dDpLZXl3b3JkIiB2YWx1ZT0iPSIvPgorICAgICAgICAgIDx0b2tlbnMgeHNpOnR5cGU9Inh0ZXh0OktleXdvcmQiIHZhbHVlPSJbIi8+CisgICAgICAgICAgPHRva2VucyB4c2k6dHlwZT0ieHRleHQ6QXNzaWdubWVudCIgZmVhdHVyZT0ibWluVmFsdWUiIG9wZXJhdG9yPSI9Ij4KKyAgICAgICAgICAgIDx0ZXJtaW5hbCB4c2k6dHlwZT0ieHRleHQ6QWx0ZXJuYXRpdmVzIj4KKyAgICAgICAgICAgICAgPGdyb3VwcyB4c2k6dHlwZT0ieHRleHQ6UnVsZUNhbGwiIHJ1bGU9Ii8wL0BydWxlcy40Ii8+CisgICAgICAgICAgICAgIDxncm91cHMgeHNpOnR5cGU9Inh0ZXh0OlJ1bGVDYWxsIiBydWxlPSIvMC9AcnVsZXMuNSIvPgorICAgICAgICAgICAgPC90ZXJtaW5hbD4KKyAgICAgICAgICA8L3Rva2Vucz4KKyAgICAgICAgICA8dG9rZW5zIHhzaTp0eXBlPSJ4dGV4dDpLZXl3b3JkIiB2YWx1ZT0iLCIvPgorICAgICAgICAgIDx0b2tlbnMgeHNpOnR5cGU9Inh0ZXh0OkFzc2lnbm1lbnQiIGZlYXR1cmU9Im1heFZhbHVlIiBvcGVyYXRvcj0iPSI+CisgICAgICAgICAgICA8dGVybWluYWwgeHNpOnR5cGU9Inh0ZXh0OkFsdGVybmF0aXZlcyI+CisgICAgICAgICAgICAgIDxncm91cHMgeHNpOnR5cGU9Inh0ZXh0OlJ1bGVDYWxsIiBydWxlPSIvMC9AcnVsZXMuNCIvPgorICAgICAgICAgICAgICA8Z3JvdXBzIHhzaTp0eXBlPSJ4dGV4dDpSdWxlQ2FsbCIgcnVsZT0iLzAvQHJ1bGVzLjUiLz4KKyAgICAgICAgICAgIDwvdGVybWluYWw+CisgICAgICAgICAgPC90b2tlbnM+CisgICAgICAgICAgPHRva2VucyB4c2k6dHlwZT0ieHRleHQ6S2V5d29yZCIgdmFsdWU9Il0iLz4KKyAgICAgICAgPC90b2tlbnM+CisgICAgICA8L2FsdGVybmF0aXZlcz4KKyAgICA8L3J1bGVzPgorICAgIDxydWxlcyB4c2k6dHlwZT0ieHRleHQ6RW51bVJ1bGUiIG5hbWU9Ik1lYXN1cmUiPgorICAgICAgPHR5cGUgbWV0YW1vZGVsPSIvMC9AbWV0YW1vZGVsRGVjbGFyYXRpb25zLjAiPgorICAgICAgICA8Y2xhc3NpZmllciB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvYW1wL2FtZi90ZXN0aW5nL0FUZXN0Iy8vTWVhc3VyZSIvPgorICAgICAgPC90eXBlPgorICAgICAgPGFsdGVybmF0aXZlcyB4c2k6dHlwZT0ieHRleHQ6QWx0ZXJuYXRpdmVzIj4KKyAgICAgICAgPGdyb3VwcyB4c2k6dHlwZT0ieHRleHQ6RW51bUxpdGVyYWxEZWNsYXJhdGlvbiI+CisgICAgICAgICAgPGVudW1MaXRlcmFsIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvYW1wL2FtZi90ZXN0aW5nL0FUZXN0Iy8vTWVhc3VyZS9DT1VOVCIvPgorICAgICAgICAgIDxsaXRlcmFsIHZhbHVlPSJDb3VudCIvPgorICAgICAgICA8L2dyb3Vwcz4KKyAgICAgICAgPGdyb3VwcyB4c2k6dHlwZT0ieHRleHQ6RW51bUxpdGVyYWxEZWNsYXJhdGlvbiI+CisgICAgICAgICAgPGVudW1MaXRlcmFsIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvYW1wL2FtZi90ZXN0aW5nL0FUZXN0Iy8vTWVhc3VyZS9BVkVSQUdFIi8+CisgICAgICAgICAgPGxpdGVyYWwgdmFsdWU9IkF2ZXJhZ2UiLz4KKyAgICAgICAgPC9ncm91cHM+CisgICAgICAgIDxncm91cHMgeHNpOnR5cGU9Inh0ZXh0OkVudW1MaXRlcmFsRGVjbGFyYXRpb24iPgorICAgICAgICAgIDxlbnVtTGl0ZXJhbCBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2FtcC9hbWYvdGVzdGluZy9BVGVzdCMvL01lYXN1cmUvU1VNIi8+CisgICAgICAgICAgPGxpdGVyYWwgdmFsdWU9IlN1bSIvPgorICAgICAgICA8L2dyb3Vwcz4KKyAgICAgICAgPGdyb3VwcyB4c2k6dHlwZT0ieHRleHQ6RW51bUxpdGVyYWxEZWNsYXJhdGlvbiI+CisgICAgICAgICAgPGVudW1MaXRlcmFsIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvYW1wL2FtZi90ZXN0aW5nL0FUZXN0Iy8vTWVhc3VyZS9NSU5JTVVNIi8+CisgICAgICAgICAgPGxpdGVyYWwgdmFsdWU9Ik1pbmltdW0iLz4KKyAgICAgICAgPC9ncm91cHM+CisgICAgICAgIDxncm91cHMgeHNpOnR5cGU9Inh0ZXh0OkVudW1MaXRlcmFsRGVjbGFyYXRpb24iPgorICAgICAgICAgIDxlbnVtTGl0ZXJhbCBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2FtcC9hbWYvdGVzdGluZy9BVGVzdCMvL01lYXN1cmUvTUFYSU1VTSIvPgorICAgICAgICAgIDxsaXRlcmFsIHZhbHVlPSJNYXhpbXVtIi8+CisgICAgICAgIDwvZ3JvdXBzPgorICAgICAgPC9hbHRlcm5hdGl2ZXM+CisgICAgPC9ydWxlcz4KKyAgICA8cnVsZXMgeHNpOnR5cGU9Inh0ZXh0OlBhcnNlclJ1bGUiIG5hbWU9IkludFZhbHVlIj4KKyAgICAgIDx0eXBlIG1ldGFtb2RlbD0iLzAvQG1ldGFtb2RlbERlY2xhcmF0aW9ucy4wIj4KKyAgICAgICAgPGNsYXNzaWZpZXIgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9hbXAvYW1mL3Rlc3RpbmcvQVRlc3QjLy9JbnRWYWx1ZSIvPgorICAgICAgPC90eXBlPgorICAgICAgPGFsdGVybmF0aXZlcyB4c2k6dHlwZT0ieHRleHQ6QXNzaWdubWVudCIgZmVhdHVyZT0idmFsdWUiIG9wZXJhdG9yPSI9Ij4KKyAgICAgICAgPHRlcm1pbmFsIHhzaTp0eXBlPSJ4dGV4dDpSdWxlQ2FsbCIgcnVsZT0iLzEvQHJ1bGVzLjEiLz4KKyAgICAgIDwvYWx0ZXJuYXRpdmVzPgorICAgIDwvcnVsZXM+CisgICAgPHJ1bGVzIHhzaTp0eXBlPSJ4dGV4dDpQYXJzZXJSdWxlIiBuYW1lPSJSZWFsVmFsdWUiPgorICAgICAgPHR5cGUgbWV0YW1vZGVsPSIvMC9AbWV0YW1vZGVsRGVjbGFyYXRpb25zLjAiPgorICAgICAgICA8Y2xhc3NpZmllciB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2FtcC9hbWYvdGVzdGluZy9BVGVzdCMvL1JlYWxWYWx1ZSIvPgorICAgICAgPC90eXBlPgorICAgICAgPGFsdGVybmF0aXZlcyB4c2k6dHlwZT0ieHRleHQ6QXNzaWdubWVudCIgZmVhdHVyZT0idmFsdWUiIG9wZXJhdG9yPSI9Ij4KKyAgICAgICAgPHRlcm1pbmFsIHhzaTp0eXBlPSJ4dGV4dDpSdWxlQ2FsbCIgcnVsZT0iLzAvQHJ1bGVzLjYiLz4KKyAgICAgIDwvYWx0ZXJuYXRpdmVzPgorICAgIDwvcnVsZXM+CisgICAgPHJ1bGVzIHhzaTp0eXBlPSJ4dGV4dDpUZXJtaW5hbFJ1bGUiIG5hbWU9IlJFQUwiPgorICAgICAgPHR5cGUgbWV0YW1vZGVsPSIvMC9AbWV0YW1vZGVsRGVjbGFyYXRpb25zLjEiPgorICAgICAgICA8Y2xhc3NpZmllciB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICAgICAgPC90eXBlPgorICAgICAgPGFsdGVybmF0aXZlcyB4c2k6dHlwZT0ieHRleHQ6R3JvdXAiPgorICAgICAgICA8dG9rZW5zIHhzaTp0eXBlPSJ4dGV4dDpLZXl3b3JkIiBjYXJkaW5hbGl0eT0iPyIgdmFsdWU9Ii0iLz4KKyAgICAgICAgPHRva2VucyB4c2k6dHlwZT0ieHRleHQ6UnVsZUNhbGwiIHJ1bGU9Ii8xL0BydWxlcy4xIi8+CisgICAgICAgIDx0b2tlbnMgeHNpOnR5cGU9Inh0ZXh0Okdyb3VwIiBjYXJkaW5hbGl0eT0iPyI+CisgICAgICAgICAgPHRva2VucyB4c2k6dHlwZT0ieHRleHQ6S2V5d29yZCIgdmFsdWU9Ii4iLz4KKyAgICAgICAgICA8dG9rZW5zIHhzaTp0eXBlPSJ4dGV4dDpSdWxlQ2FsbCIgcnVsZT0iLzEvQHJ1bGVzLjEiLz4KKyAgICAgICAgPC90b2tlbnM+CisgICAgICA8L2FsdGVybmF0aXZlcz4KKyAgICA8L3J1bGVzPgorICAgIDxydWxlcyB4c2k6dHlwZT0ieHRleHQ6VGVybWluYWxSdWxlIiBuYW1lPSJQTEFJTl9TVFJJTkciPgorICAgICAgPHR5cGUgbWV0YW1vZGVsPSIvMC9AbWV0YW1vZGVsRGVjbGFyYXRpb25zLjEiPgorICAgICAgICA8Y2xhc3NpZmllciB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICAgICAgPC90eXBlPgorICAgICAgPGFsdGVybmF0aXZlcyB4c2k6dHlwZT0ieHRleHQ6R3JvdXAiPgorICAgICAgICA8dG9rZW5zIHhzaTp0eXBlPSJ4dGV4dDpLZXl3b3JkIiB2YWx1ZT0iJiN4YWI7Ii8+CisgICAgICAgIDx0b2tlbnMgeHNpOnR5cGU9Inh0ZXh0OkFsdGVybmF0aXZlcyIgY2FyZGluYWxpdHk9IioiPgorICAgICAgICAgIDxncm91cHMgeHNpOnR5cGU9Inh0ZXh0Okdyb3VwIj4KKyAgICAgICAgICAgIDx0b2tlbnMgeHNpOnR5cGU9Inh0ZXh0OktleXdvcmQiIHZhbHVlPSJcIi8+CisgICAgICAgICAgICA8dG9rZW5zIHhzaTp0eXBlPSJ4dGV4dDpBbHRlcm5hdGl2ZXMiPgorICAgICAgICAgICAgICA8Z3JvdXBzIHhzaTp0eXBlPSJ4dGV4dDpLZXl3b3JkIiB2YWx1ZT0iYiIvPgorICAgICAgICAgICAgICA8Z3JvdXBzIHhzaTp0eXBlPSJ4dGV4dDpLZXl3b3JkIiB2YWx1ZT0idCIvPgorICAgICAgICAgICAgICA8Z3JvdXBzIHhzaTp0eXBlPSJ4dGV4dDpLZXl3b3JkIiB2YWx1ZT0ibiIvPgorICAgICAgICAgICAgICA8Z3JvdXBzIHhzaTp0eXBlPSJ4dGV4dDpLZXl3b3JkIiB2YWx1ZT0iZiIvPgorICAgICAgICAgICAgICA8Z3JvdXBzIHhzaTp0eXBlPSJ4dGV4dDpLZXl3b3JkIiB2YWx1ZT0iciIvPgorICAgICAgICAgICAgICA8Z3JvdXBzIHhzaTp0eXBlPSJ4dGV4dDpLZXl3b3JkIiB2YWx1ZT0iJnF1b3Q7Ii8+CisgICAgICAgICAgICAgIDxncm91cHMgeHNpOnR5cGU9Inh0ZXh0OktleXdvcmQiIHZhbHVlPSInIi8+CisgICAgICAgICAgICAgIDxncm91cHMgeHNpOnR5cGU9Inh0ZXh0OktleXdvcmQiIHZhbHVlPSJcIi8+CisgICAgICAgICAgICA8L3Rva2Vucz4KKyAgICAgICAgICA8L2dyb3Vwcz4KKyAgICAgICAgICA8Z3JvdXBzIHhzaTp0eXBlPSJ4dGV4dDpOZWdhdGVkVG9rZW4iPgorICAgICAgICAgICAgPHRlcm1pbmFsIHhzaTp0eXBlPSJ4dGV4dDpBbHRlcm5hdGl2ZXMiPgorICAgICAgICAgICAgICA8Z3JvdXBzIHhzaTp0eXBlPSJ4dGV4dDpLZXl3b3JkIiB2YWx1ZT0iXCIvPgorICAgICAgICAgICAgICA8Z3JvdXBzIHhzaTp0eXBlPSJ4dGV4dDpLZXl3b3JkIiB2YWx1ZT0iJiN4YWI7Ii8+CisgICAgICAgICAgICAgIDxncm91cHMgeHNpOnR5cGU9Inh0ZXh0OktleXdvcmQiIHZhbHVlPSImI3hiYjsiLz4KKyAgICAgICAgICAgIDwvdGVybWluYWw+CisgICAgICAgICAgPC9ncm91cHM+CisgICAgICAgIDwvdG9rZW5zPgorICAgICAgICA8dG9rZW5zIHhzaTp0eXBlPSJ4dGV4dDpLZXl3b3JkIiB2YWx1ZT0iJiN4YmI7Ii8+CisgICAgICA8L2FsdGVybmF0aXZlcz4KKyAgICA8L3J1bGVzPgorICA8L3h0ZXh0OkdyYW1tYXI+CisgIDx4dGV4dDpHcmFtbWFyIG5hbWU9Im9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi5UZXJtaW5hbHMiIGRlZmluZXNIaWRkZW5Ub2tlbnM9InRydWUiIGhpZGRlblRva2Vucz0iLzEvQHJ1bGVzLjUgLzEvQHJ1bGVzLjMgLzEvQHJ1bGVzLjQiPgorICAgIDxtZXRhbW9kZWxEZWNsYXJhdGlvbnMgeHNpOnR5cGU9Inh0ZXh0OlJlZmVyZW5jZWRNZXRhbW9kZWwiIGFsaWFzPSJlY29yZSI+CisgICAgICA8ZVBhY2thZ2UgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvIi8+CisgICAgPC9tZXRhbW9kZWxEZWNsYXJhdGlvbnM+CisgICAgPHJ1bGVzIHhzaTp0eXBlPSJ4dGV4dDpUZXJtaW5hbFJ1bGUiIG5hbWU9IklEIj4KKyAgICAgIDx0eXBlIG1ldGFtb2RlbD0iLzEvQG1ldGFtb2RlbERlY2xhcmF0aW9ucy4wIj4KKyAgICAgICAgPGNsYXNzaWZpZXIgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KKyAgICAgIDwvdHlwZT4KKyAgICAgIDxhbHRlcm5hdGl2ZXMgeHNpOnR5cGU9Inh0ZXh0Okdyb3VwIj4KKyAgICAgICAgPHRva2VucyB4c2k6dHlwZT0ieHRleHQ6S2V5d29yZCIgY2FyZGluYWxpdHk9Ij8iIHZhbHVlPSJeIi8+CisgICAgICAgIDx0b2tlbnMgeHNpOnR5cGU9Inh0ZXh0OkFsdGVybmF0aXZlcyI+CisgICAgICAgICAgPGdyb3VwcyB4c2k6dHlwZT0ieHRleHQ6Q2hhcmFjdGVyUmFuZ2UiPgorICAgICAgICAgICAgPGxlZnQgdmFsdWU9ImEiLz4KKyAgICAgICAgICAgIDxyaWdodCB2YWx1ZT0ieiIvPgorICAgICAgICAgIDwvZ3JvdXBzPgorICAgICAgICAgIDxncm91cHMgeHNpOnR5cGU9Inh0ZXh0OkNoYXJhY3RlclJhbmdlIj4KKyAgICAgICAgICAgIDxsZWZ0IHZhbHVlPSJBIi8+CisgICAgICAgICAgICA8cmlnaHQgdmFsdWU9IloiLz4KKyAgICAgICAgICA8L2dyb3Vwcz4KKyAgICAgICAgICA8Z3JvdXBzIHhzaTp0eXBlPSJ4dGV4dDpLZXl3b3JkIiB2YWx1ZT0iXyIvPgorICAgICAgICA8L3Rva2Vucz4KKyAgICAgICAgPHRva2VucyB4c2k6dHlwZT0ieHRleHQ6QWx0ZXJuYXRpdmVzIiBjYXJkaW5hbGl0eT0iKiI+CisgICAgICAgICAgPGdyb3VwcyB4c2k6dHlwZT0ieHRleHQ6Q2hhcmFjdGVyUmFuZ2UiPgorICAgICAgICAgICAgPGxlZnQgdmFsdWU9ImEiLz4KKyAgICAgICAgICAgIDxyaWdodCB2YWx1ZT0ieiIvPgorICAgICAgICAgIDwvZ3JvdXBzPgorICAgICAgICAgIDxncm91cHMgeHNpOnR5cGU9Inh0ZXh0OkNoYXJhY3RlclJhbmdlIj4KKyAgICAgICAgICAgIDxsZWZ0IHZhbHVlPSJBIi8+CisgICAgICAgICAgICA8cmlnaHQgdmFsdWU9IloiLz4KKyAgICAgICAgICA8L2dyb3Vwcz4KKyAgICAgICAgICA8Z3JvdXBzIHhzaTp0eXBlPSJ4dGV4dDpLZXl3b3JkIiB2YWx1ZT0iXyIvPgorICAgICAgICAgIDxncm91cHMgeHNpOnR5cGU9Inh0ZXh0OkNoYXJhY3RlclJhbmdlIj4KKyAgICAgICAgICAgIDxsZWZ0IHZhbHVlPSIwIi8+CisgICAgICAgICAgICA8cmlnaHQgdmFsdWU9IjkiLz4KKyAgICAgICAgICA8L2dyb3Vwcz4KKyAgICAgICAgPC90b2tlbnM+CisgICAgICA8L2FsdGVybmF0aXZlcz4KKyAgICA8L3J1bGVzPgorICAgIDxydWxlcyB4c2k6dHlwZT0ieHRleHQ6VGVybWluYWxSdWxlIiBuYW1lPSJJTlQiPgorICAgICAgPHR5cGUgbWV0YW1vZGVsPSIvMS9AbWV0YW1vZGVsRGVjbGFyYXRpb25zLjAiPgorICAgICAgICA8Y2xhc3NpZmllciB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIvPgorICAgICAgPC90eXBlPgorICAgICAgPGFsdGVybmF0aXZlcyB4c2k6dHlwZT0ieHRleHQ6Q2hhcmFjdGVyUmFuZ2UiIGNhcmRpbmFsaXR5PSIrIj4KKyAgICAgICAgPGxlZnQgdmFsdWU9IjAiLz4KKyAgICAgICAgPHJpZ2h0IHZhbHVlPSI5Ii8+CisgICAgICA8L2FsdGVybmF0aXZlcz4KKyAgICA8L3J1bGVzPgorICAgIDxydWxlcyB4c2k6dHlwZT0ieHRleHQ6VGVybWluYWxSdWxlIiBuYW1lPSJTVFJJTkciPgorICAgICAgPHR5cGUgbWV0YW1vZGVsPSIvMS9AbWV0YW1vZGVsRGVjbGFyYXRpb25zLjAiPgorICAgICAgICA8Y2xhc3NpZmllciB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICAgICAgPC90eXBlPgorICAgICAgPGFsdGVybmF0aXZlcyB4c2k6dHlwZT0ieHRleHQ6QWx0ZXJuYXRpdmVzIj4KKyAgICAgICAgPGdyb3VwcyB4c2k6dHlwZT0ieHRleHQ6R3JvdXAiPgorICAgICAgICAgIDx0b2tlbnMgeHNpOnR5cGU9Inh0ZXh0OktleXdvcmQiIHZhbHVlPSImcXVvdDsiLz4KKyAgICAgICAgICA8dG9rZW5zIHhzaTp0eXBlPSJ4dGV4dDpBbHRlcm5hdGl2ZXMiIGNhcmRpbmFsaXR5PSIqIj4KKyAgICAgICAgICAgIDxncm91cHMgeHNpOnR5cGU9Inh0ZXh0Okdyb3VwIj4KKyAgICAgICAgICAgICAgPHRva2VucyB4c2k6dHlwZT0ieHRleHQ6S2V5d29yZCIgdmFsdWU9IlwiLz4KKyAgICAgICAgICAgICAgPHRva2VucyB4c2k6dHlwZT0ieHRleHQ6QWx0ZXJuYXRpdmVzIj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBzIHhzaTp0eXBlPSJ4dGV4dDpLZXl3b3JkIiB2YWx1ZT0iYiIvPgorICAgICAgICAgICAgICAgIDxncm91cHMgeHNpOnR5cGU9Inh0ZXh0OktleXdvcmQiIHZhbHVlPSJ0Ii8+CisgICAgICAgICAgICAgICAgPGdyb3VwcyB4c2k6dHlwZT0ieHRleHQ6S2V5d29yZCIgdmFsdWU9Im4iLz4KKyAgICAgICAgICAgICAgICA8Z3JvdXBzIHhzaTp0eXBlPSJ4dGV4dDpLZXl3b3JkIiB2YWx1ZT0iZiIvPgorICAgICAgICAgICAgICAgIDxncm91cHMgeHNpOnR5cGU9Inh0ZXh0OktleXdvcmQiIHZhbHVlPSJyIi8+CisgICAgICAgICAgICAgICAgPGdyb3VwcyB4c2k6dHlwZT0ieHRleHQ6S2V5d29yZCIgdmFsdWU9IiZxdW90OyIvPgorICAgICAgICAgICAgICAgIDxncm91cHMgeHNpOnR5cGU9Inh0ZXh0OktleXdvcmQiIHZhbHVlPSInIi8+CisgICAgICAgICAgICAgICAgPGdyb3VwcyB4c2k6dHlwZT0ieHRleHQ6S2V5d29yZCIgdmFsdWU9IlwiLz4KKyAgICAgICAgICAgICAgPC90b2tlbnM+CisgICAgICAgICAgICA8L2dyb3Vwcz4KKyAgICAgICAgICAgIDxncm91cHMgeHNpOnR5cGU9Inh0ZXh0Ok5lZ2F0ZWRUb2tlbiI+CisgICAgICAgICAgICAgIDx0ZXJtaW5hbCB4c2k6dHlwZT0ieHRleHQ6QWx0ZXJuYXRpdmVzIj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBzIHhzaTp0eXBlPSJ4dGV4dDpLZXl3b3JkIiB2YWx1ZT0iXCIvPgorICAgICAgICAgICAgICAgIDxncm91cHMgeHNpOnR5cGU9Inh0ZXh0OktleXdvcmQiIHZhbHVlPSImcXVvdDsiLz4KKyAgICAgICAgICAgICAgPC90ZXJtaW5hbD4KKyAgICAgICAgICAgIDwvZ3JvdXBzPgorICAgICAgICAgIDwvdG9rZW5zPgorICAgICAgICAgIDx0b2tlbnMgeHNpOnR5cGU9Inh0ZXh0OktleXdvcmQiIHZhbHVlPSImcXVvdDsiLz4KKyAgICAgICAgPC9ncm91cHM+CisgICAgICAgIDxncm91cHMgeHNpOnR5cGU9Inh0ZXh0Okdyb3VwIj4KKyAgICAgICAgICA8dG9rZW5zIHhzaTp0eXBlPSJ4dGV4dDpLZXl3b3JkIiB2YWx1ZT0iJyIvPgorICAgICAgICAgIDx0b2tlbnMgeHNpOnR5cGU9Inh0ZXh0OkFsdGVybmF0aXZlcyIgY2FyZGluYWxpdHk9IioiPgorICAgICAgICAgICAgPGdyb3VwcyB4c2k6dHlwZT0ieHRleHQ6R3JvdXAiPgorICAgICAgICAgICAgICA8dG9rZW5zIHhzaTp0eXBlPSJ4dGV4dDpLZXl3b3JkIiB2YWx1ZT0iXCIvPgorICAgICAgICAgICAgICA8dG9rZW5zIHhzaTp0eXBlPSJ4dGV4dDpBbHRlcm5hdGl2ZXMiPgorICAgICAgICAgICAgICAgIDxncm91cHMgeHNpOnR5cGU9Inh0ZXh0OktleXdvcmQiIHZhbHVlPSJiIi8+CisgICAgICAgICAgICAgICAgPGdyb3VwcyB4c2k6dHlwZT0ieHRleHQ6S2V5d29yZCIgdmFsdWU9InQiLz4KKyAgICAgICAgICAgICAgICA8Z3JvdXBzIHhzaTp0eXBlPSJ4dGV4dDpLZXl3b3JkIiB2YWx1ZT0ibiIvPgorICAgICAgICAgICAgICAgIDxncm91cHMgeHNpOnR5cGU9Inh0ZXh0OktleXdvcmQiIHZhbHVlPSJmIi8+CisgICAgICAgICAgICAgICAgPGdyb3VwcyB4c2k6dHlwZT0ieHRleHQ6S2V5d29yZCIgdmFsdWU9InIiLz4KKyAgICAgICAgICAgICAgICA8Z3JvdXBzIHhzaTp0eXBlPSJ4dGV4dDpLZXl3b3JkIiB2YWx1ZT0iJnF1b3Q7Ii8+CisgICAgICAgICAgICAgICAgPGdyb3VwcyB4c2k6dHlwZT0ieHRleHQ6S2V5d29yZCIgdmFsdWU9IiciLz4KKyAgICAgICAgICAgICAgICA8Z3JvdXBzIHhzaTp0eXBlPSJ4dGV4dDpLZXl3b3JkIiB2YWx1ZT0iXCIvPgorICAgICAgICAgICAgICA8L3Rva2Vucz4KKyAgICAgICAgICAgIDwvZ3JvdXBzPgorICAgICAgICAgICAgPGdyb3VwcyB4c2k6dHlwZT0ieHRleHQ6TmVnYXRlZFRva2VuIj4KKyAgICAgICAgICAgICAgPHRlcm1pbmFsIHhzaTp0eXBlPSJ4dGV4dDpBbHRlcm5hdGl2ZXMiPgorICAgICAgICAgICAgICAgIDxncm91cHMgeHNpOnR5cGU9Inh0ZXh0OktleXdvcmQiIHZhbHVlPSJcIi8+CisgICAgICAgICAgICAgICAgPGdyb3VwcyB4c2k6dHlwZT0ieHRleHQ6S2V5d29yZCIgdmFsdWU9IiciLz4KKyAgICAgICAgICAgICAgPC90ZXJtaW5hbD4KKyAgICAgICAgICAgIDwvZ3JvdXBzPgorICAgICAgICAgIDwvdG9rZW5zPgorICAgICAgICAgIDx0b2tlbnMgeHNpOnR5cGU9Inh0ZXh0OktleXdvcmQiIHZhbHVlPSInIi8+CisgICAgICAgIDwvZ3JvdXBzPgorICAgICAgPC9hbHRlcm5hdGl2ZXM+CisgICAgPC9ydWxlcz4KKyAgICA8cnVsZXMgeHNpOnR5cGU9Inh0ZXh0OlRlcm1pbmFsUnVsZSIgbmFtZT0iTUxfQ09NTUVOVCI+CisgICAgICA8dHlwZSBtZXRhbW9kZWw9Ii8xL0BtZXRhbW9kZWxEZWNsYXJhdGlvbnMuMCI+CisgICAgICAgIDxjbGFzc2lmaWVyIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgICAgICA8L3R5cGU+CisgICAgICA8YWx0ZXJuYXRpdmVzIHhzaTp0eXBlPSJ4dGV4dDpHcm91cCI+CisgICAgICAgIDx0b2tlbnMgeHNpOnR5cGU9Inh0ZXh0OktleXdvcmQiIHZhbHVlPSIvKiIvPgorICAgICAgICA8dG9rZW5zIHhzaTp0eXBlPSJ4dGV4dDpVbnRpbFRva2VuIj4KKyAgICAgICAgICA8dGVybWluYWwgeHNpOnR5cGU9Inh0ZXh0OktleXdvcmQiIHZhbHVlPSIqLyIvPgorICAgICAgICA8L3Rva2Vucz4KKyAgICAgIDwvYWx0ZXJuYXRpdmVzPgorICAgIDwvcnVsZXM+CisgICAgPHJ1bGVzIHhzaTp0eXBlPSJ4dGV4dDpUZXJtaW5hbFJ1bGUiIG5hbWU9IlNMX0NPTU1FTlQiPgorICAgICAgPHR5cGUgbWV0YW1vZGVsPSIvMS9AbWV0YW1vZGVsRGVjbGFyYXRpb25zLjAiPgorICAgICAgICA8Y2xhc3NpZmllciB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICAgICAgPC90eXBlPgorICAgICAgPGFsdGVybmF0aXZlcyB4c2k6dHlwZT0ieHRleHQ6R3JvdXAiPgorICAgICAgICA8dG9rZW5zIHhzaTp0eXBlPSJ4dGV4dDpLZXl3b3JkIiB2YWx1ZT0iLy8iLz4KKyAgICAgICAgPHRva2VucyB4c2k6dHlwZT0ieHRleHQ6TmVnYXRlZFRva2VuIiBjYXJkaW5hbGl0eT0iKiI+CisgICAgICAgICAgPHRlcm1pbmFsIHhzaTp0eXBlPSJ4dGV4dDpBbHRlcm5hdGl2ZXMiPgorICAgICAgICAgICAgPGdyb3VwcyB4c2k6dHlwZT0ieHRleHQ6S2V5d29yZCIgdmFsdWU9IiYjeEE7Ii8+CisgICAgICAgICAgICA8Z3JvdXBzIHhzaTp0eXBlPSJ4dGV4dDpLZXl3b3JkIiB2YWx1ZT0iJiN4RDsiLz4KKyAgICAgICAgICA8L3Rlcm1pbmFsPgorICAgICAgICA8L3Rva2Vucz4KKyAgICAgICAgPHRva2VucyB4c2k6dHlwZT0ieHRleHQ6R3JvdXAiIGNhcmRpbmFsaXR5PSI/Ij4KKyAgICAgICAgICA8dG9rZW5zIHhzaTp0eXBlPSJ4dGV4dDpLZXl3b3JkIiBjYXJkaW5hbGl0eT0iPyIgdmFsdWU9IiYjeEQ7Ii8+CisgICAgICAgICAgPHRva2VucyB4c2k6dHlwZT0ieHRleHQ6S2V5d29yZCIgdmFsdWU9IiYjeEE7Ii8+CisgICAgICAgIDwvdG9rZW5zPgorICAgICAgPC9hbHRlcm5hdGl2ZXM+CisgICAgPC9ydWxlcz4KKyAgICA8cnVsZXMgeHNpOnR5cGU9Inh0ZXh0OlRlcm1pbmFsUnVsZSIgbmFtZT0iV1MiPgorICAgICAgPHR5cGUgbWV0YW1vZGVsPSIvMS9AbWV0YW1vZGVsRGVjbGFyYXRpb25zLjAiPgorICAgICAgICA8Y2xhc3NpZmllciB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICAgICAgPC90eXBlPgorICAgICAgPGFsdGVybmF0aXZlcyB4c2k6dHlwZT0ieHRleHQ6QWx0ZXJuYXRpdmVzIiBjYXJkaW5hbGl0eT0iKyI+CisgICAgICAgIDxncm91cHMgeHNpOnR5cGU9Inh0ZXh0OktleXdvcmQiIHZhbHVlPSIgIi8+CisgICAgICAgIDxncm91cHMgeHNpOnR5cGU9Inh0ZXh0OktleXdvcmQiIHZhbHVlPSImI3g5OyIvPgorICAgICAgICA8Z3JvdXBzIHhzaTp0eXBlPSJ4dGV4dDpLZXl3b3JkIiB2YWx1ZT0iJiN4RDsiLz4KKyAgICAgICAgPGdyb3VwcyB4c2k6dHlwZT0ieHRleHQ6S2V5d29yZCIgdmFsdWU9IiYjeEE7Ii8+CisgICAgICA8L2FsdGVybmF0aXZlcz4KKyAgICA8L3J1bGVzPgorICAgIDxydWxlcyB4c2k6dHlwZT0ieHRleHQ6VGVybWluYWxSdWxlIiBuYW1lPSJBTllfT1RIRVIiPgorICAgICAgPHR5cGUgbWV0YW1vZGVsPSIvMS9AbWV0YW1vZGVsRGVjbGFyYXRpb25zLjAiPgorICAgICAgICA8Y2xhc3NpZmllciB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICAgICAgPC90eXBlPgorICAgICAgPGFsdGVybmF0aXZlcyB4c2k6dHlwZT0ieHRleHQ6V2lsZGNhcmQiLz4KKyAgICA8L3J1bGVzPgorICA8L3h0ZXh0OkdyYW1tYXI+Cis8L3htaTpYTUk+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL0FUZXN0U3RhbmRhbG9uZVNldHVwLmphdmEgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL0FUZXN0U3RhbmRhbG9uZVNldHVwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIyMTFmZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvQVRlc3RTdGFuZGFsb25lU2V0dXAuamF2YQpAQCAtMCwwICsxLDQzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5JU2V0dXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuR3VpY2U7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0b3I7CisKKy8qKgorICogR2VuZXJhdGVkIGZyb20gU3RhbmRhbG9uZVNldHVwLnhwdCEKKyAqLworcHVibGljIGNsYXNzIEFUZXN0U3RhbmRhbG9uZVNldHVwIGltcGxlbWVudHMgSVNldHVwIHsKKworCXB1YmxpYyBzdGF0aWMgdm9pZCBkb1NldHVwKCkgeworCQluZXcgQVRlc3RTdGFuZGFsb25lU2V0dXAoKS5jcmVhdGVJbmplY3RvckFuZERvRU1GUmVnaXN0cmF0aW9uKCk7CisJfQorCisJcHVibGljIEluamVjdG9yIGNyZWF0ZUluamVjdG9yQW5kRG9FTUZSZWdpc3RyYXRpb24oKSB7CisJCW9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi5UZXJtaW5hbHNTdGFuZGFsb25lU2V0dXAuZG9TZXR1cCgpOworCisJCUluamVjdG9yIGluamVjdG9yID0gY3JlYXRlSW5qZWN0b3IoKTsKKwkJcmVnaXN0ZXIoaW5qZWN0b3IpOworCQlyZXR1cm4gaW5qZWN0b3I7CisJfQorCQorCXB1YmxpYyBJbmplY3RvciBjcmVhdGVJbmplY3RvcigpIHsKKwkJcmV0dXJuIEd1aWNlLmNyZWF0ZUluamVjdG9yKG5ldyBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuQVRlc3RSdW50aW1lTW9kdWxlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZWdpc3RlcihJbmplY3RvciBpbmplY3RvcikgeworCWlmICghRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuY29udGFpbnNLZXkoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvYW1wL2FtZi90ZXN0aW5nL0FUZXN0IikpIHsKKwkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2FtcC9hbWYvdGVzdGluZy9BVGVzdCIsIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5BVGVzdFBhY2thZ2UuZUlOU1RBTkNFKTsKKwl9CisKKwkJb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuSVJlc291cmNlRmFjdG9yeSByZXNvdXJjZUZhY3RvcnkgPSBpbmplY3Rvci5nZXRJbnN0YW5jZShvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5JUmVzb3VyY2VGYWN0b3J5LmNsYXNzKTsKKwkJUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoImF0ZXN0IiwgcmVzb3VyY2VGYWN0b3J5KTsKKwkJCisKKworCisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9BYnN0cmFjdEFUZXN0UnVudGltZU1vZHVsZS5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9BYnN0cmFjdEFUZXN0UnVudGltZU1vZHVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YzQ1YzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL0Fic3RyYWN0QVRlc3RSdW50aW1lTW9kdWxlLmphdmEKQEAgLTAsMCArMSw3NiBAQAorCisvKgorICogZ2VuZXJhdGVkIGJ5IFh0ZXh0CisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nOworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNlcnZpY2UuRGVmYXVsdFJ1bnRpbWVNb2R1bGU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5CaW5kZXI7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QubmFtZS5OYW1lczsKKworLyoqCisgKiBNYW51YWwgbW9kaWZpY2F0aW9ucyBnbyB0byB7b3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLkFUZXN0UnVudGltZU1vZHVsZX0KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QVRlc3RSdW50aW1lTW9kdWxlIGV4dGVuZHMgRGVmYXVsdFJ1bnRpbWVNb2R1bGUgeworCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZShCaW5kZXIgYmluZGVyKSB7CisJCXN1cGVyLmNvbmZpZ3VyZShiaW5kZXIpOworCQliaW5kZXIuYmluZChTdHJpbmcuY2xhc3MpLmFubm90YXRlZFdpdGgoTmFtZXMubmFtZWQoQ29uc3RhbnRzLkxBTkdVQUdFX05BTUUpKS50b0luc3RhbmNlKAorCQkJIm9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5BVGVzdCIpOworCX0KKwkKKwkKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuZ3JhbW1hckFjY2Vzcy5HcmFtbWFyQWNjZXNzRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LklHcmFtbWFyQWNjZXNzPiBiaW5kSUdyYW1tYXJBY2Nlc3MoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcuc2VydmljZXMuQVRlc3RHcmFtbWFyQWNjZXNzLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5wYXJzZVRyZWVDb25zdHJ1Y3Rvci5QYXJzZVRyZWVDb25zdHJ1Y3RvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXRyZWUucmVjb25zdHIuSVBhcnNlVHJlZUNvbnN0cnVjdG9yPiBiaW5kSVBhcnNlVHJlZUNvbnN0cnVjdG9yKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLnBhcnNlVHJlZUNvbnN0cnVjdGlvbi5BVGVzdFBhcnNldHJlZUNvbnN0cnVjdG9yLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IGRlLml0ZW1pcy54dGV4dC5hbnRsci5YdGV4dEFudGxyR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5JQW50bHJQYXJzZXI+IGJpbmRJQW50bHJQYXJzZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcucGFyc2VyLmFudGxyLkFUZXN0UGFyc2VyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IGRlLml0ZW1pcy54dGV4dC5hbnRsci5YdGV4dEFudGxyR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5JVG9rZW5Ub1N0cmluZ0NvbnZlcnRlcj4gYmluZElUb2tlblRvU3RyaW5nQ29udmVydGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLkFudGxyVG9rZW5Ub1N0cmluZ0NvbnZlcnRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBkZS5pdGVtaXMueHRleHQuYW50bHIuWHRleHRBbnRsckdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuSUFudGxyVG9rZW5GaWxlUHJvdmlkZXI+IGJpbmRJQW50bHJUb2tlbkZpbGVQcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5wYXJzZXIuYW50bHIuQVRlc3RBbnRsclRva2VuRmlsZVByb3ZpZGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IGRlLml0ZW1pcy54dGV4dC5hbnRsci5YdGV4dEFudGxyR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5MZXhlcj4gYmluZExleGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLnBhcnNlci5hbnRsci5pbnRlcm5hbC5JbnRlcm5hbEFUZXN0TGV4ZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgZGUuaXRlbWlzLnh0ZXh0LmFudGxyLlh0ZXh0QW50bHJHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLklUb2tlbkRlZlByb3ZpZGVyPiBiaW5kSVRva2VuRGVmUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuQW50bHJUb2tlbkRlZlByb3ZpZGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci52YWxpZGF0aW9uLkphdmFWYWxpZGF0b3JGcmFnbWVudAorCUBvcmcuZWNsaXBzZS54dGV4dC5zZXJ2aWNlLlNpbmdsZXRvbkJpbmRpbmcoZWFnZXI9dHJ1ZSkJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcudmFsaWRhdGlvbi5BVGVzdEphdmFWYWxpZGF0b3I+IGJpbmRBVGVzdEphdmFWYWxpZGF0b3IoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcudmFsaWRhdGlvbi5BVGVzdEphdmFWYWxpZGF0b3IuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnNjb3BpbmcuSmF2YVNjb3BpbmdGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuc2NvcGluZy5JU2NvcGVQcm92aWRlcj4gYmluZElTY29wZVByb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLnNjb3BpbmcuQVRlc3RTY29wZVByb3ZpZGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5mb3JtYXR0aW5nLkZvcm1hdHRlckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5mb3JtYXR0aW5nLklGb3JtYXR0ZXI+IGJpbmRJRm9ybWF0dGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmZvcm1hdHRpbmcuQVRlc3RGb3JtYXR0ZXIuY2xhc3M7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL2FUZXN0L0FUZXN0RmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hVGVzdC9BVGVzdEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWUzMWI2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hVGVzdC9BVGVzdEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5BVGVzdFBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBBVGVzdEZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeQoreworICAvKioKKyAgICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIEFUZXN0RmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuaW1wbC5BVGVzdEZhY3RvcnlJbXBsLmluaXQoKTsKKworICAvKioKKyAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Nb2RlbDwvZW0+Jy4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TW9kZWw8L2VtPicuCisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIE1vZGVsIGNyZWF0ZU1vZGVsKCk7CisKKyAgLyoqCisgICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGVzdHM8L2VtPicuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlc3RzPC9lbT4nLgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBUZXN0cyBjcmVhdGVUZXN0cygpOworCisgIC8qKgorICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnN0cmFpbnQ8L2VtPicuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnN0cmFpbnQ8L2VtPicuCisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIENvbnN0cmFpbnQgY3JlYXRlQ29uc3RyYWludCgpOworCisgIC8qKgorICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkludCBWYWx1ZTwvZW0+Jy4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW50IFZhbHVlPC9lbT4nLgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBJbnRWYWx1ZSBjcmVhdGVJbnRWYWx1ZSgpOworCisgIC8qKgorICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlYWwgVmFsdWU8L2VtPicuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlYWwgVmFsdWU8L2VtPicuCisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIFJlYWxWYWx1ZSBjcmVhdGVSZWFsVmFsdWUoKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBBVGVzdFBhY2thZ2UgZ2V0QVRlc3RQYWNrYWdlKCk7CisKK30gLy9BVGVzdEZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvYVRlc3QvQVRlc3RQYWNrYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL2FUZXN0L0FUZXN0UGFja2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YzNiZGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL2FUZXN0L0FUZXN0UGFja2FnZS5qYXZhCkBAIC0wLDAgKzEsNjc4IEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKKyAqIDx1bD4KKyAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKyAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisgKiA8L3VsPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5BVGVzdEZhY3RvcnkKKyAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIEFUZXN0UGFja2FnZSBleHRlbmRzIEVQYWNrYWdlCit7CisgIC8qKgorICAgKiBUaGUgcGFja2FnZSBuYW1lLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgU3RyaW5nIGVOQU1FID0gImFUZXN0IjsKKworICAvKioKKyAgICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIFN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvYW1wL2FtZi90ZXN0aW5nL0FUZXN0IjsKKworICAvKioKKyAgICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBTdHJpbmcgZU5TX1BSRUZJWCA9ICJhVGVzdCI7CisKKyAgLyoqCisgICAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBBVGVzdFBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LmltcGwuQVRlc3RQYWNrYWdlSW1wbC5pbml0KCk7CisKKyAgLyoqCisgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LmltcGwuTW9kZWxJbXBsIDxlbT5Nb2RlbDwvZW0+fScgY2xhc3MuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5pbXBsLk1vZGVsSW1wbAorICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5pbXBsLkFUZXN0UGFja2FnZUltcGwjZ2V0TW9kZWwoKQorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBpbnQgTU9ERUwgPSAwOworCisgIC8qKgorICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKiBAb3JkZXJlZAorICAgKi8KKyAgaW50IE1PREVMX19OQU1FID0gMDsKKworICAvKioKKyAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqIEBvcmRlcmVkCisgICAqLworICBpbnQgTU9ERUxfX0RFU0NSSVBUSU9OID0gMTsKKworICAvKioKKyAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlc3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqIEBvcmRlcmVkCisgICAqLworICBpbnQgTU9ERUxfX1RFU1RTID0gMjsKKworICAvKioKKyAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRyYWludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKiBAb3JkZXJlZAorICAgKi8KKyAgaW50IE1PREVMX19DT05UUkFJTlRTID0gMzsKKworICAvKioKKyAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1vZGVsPC9lbT4nIGNsYXNzLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKiBAb3JkZXJlZAorICAgKi8KKyAgaW50IE1PREVMX0ZFQVRVUkVfQ09VTlQgPSA0OworCisgIC8qKgorICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5pbXBsLlRlc3RzSW1wbCA8ZW0+VGVzdHM8L2VtPn0nIGNsYXNzLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuaW1wbC5UZXN0c0ltcGwKKyAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuaW1wbC5BVGVzdFBhY2thZ2VJbXBsI2dldFRlc3RzKCkKKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgaW50IFRFU1RTID0gMTsKKworICAvKioKKyAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcG9ydCBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICogQG9yZGVyZWQKKyAgICovCisgIGludCBURVNUU19fSU1QT1JUX1VSSSA9IDA7CisKKyAgLyoqCisgICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UZXN0czwvZW0+JyBjbGFzcy4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICogQG9yZGVyZWQKKyAgICovCisgIGludCBURVNUU19GRUFUVVJFX0NPVU5UID0gMTsKKworICAvKioKKyAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuaW1wbC5Db25zdHJhaW50SW1wbCA8ZW0+Q29uc3RyYWludDwvZW0+fScgY2xhc3MuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5pbXBsLkNvbnN0cmFpbnRJbXBsCisgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LmltcGwuQVRlc3RQYWNrYWdlSW1wbCNnZXRDb25zdHJhaW50KCkKKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgaW50IENPTlNUUkFJTlQgPSAyOworCisgIC8qKgorICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVhc3VyZTwvYj48L2VtPicgYXR0cmlidXRlLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKiBAb3JkZXJlZAorICAgKi8KKyAgaW50IENPTlNUUkFJTlRfX01FQVNVUkUgPSAwOworCisgIC8qKgorICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWdlbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICogQG9yZGVyZWQKKyAgICovCisgIGludCBDT05TVFJBSU5UX19BR0VOVCA9IDE7CisKKyAgLyoqCisgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICogQG9yZGVyZWQKKyAgICovCisgIGludCBDT05TVFJBSU5UX19BVFRSSUJVVEUgPSAyOworCisgIC8qKgorICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UXVhbGlmaWVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqIEBvcmRlcmVkCisgICAqLworICBpbnQgQ09OU1RSQUlOVF9fUVVBTElGSUVSID0gMzsKKworICAvKioKKyAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1pbiBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKiBAb3JkZXJlZAorICAgKi8KKyAgaW50IENPTlNUUkFJTlRfX01JTl9WQUxVRSA9IDQ7CisKKyAgLyoqCisgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXggVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICogQG9yZGVyZWQKKyAgICovCisgIGludCBDT05TVFJBSU5UX19NQVhfVkFMVUUgPSA1OworCisgIC8qKgorICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29uc3RyYWludDwvZW0+JyBjbGFzcy4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICogQG9yZGVyZWQKKyAgICovCisgIGludCBDT05TVFJBSU5UX0ZFQVRVUkVfQ09VTlQgPSA2OworCisgIC8qKgorICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5pbXBsLkludFZhbHVlSW1wbCA8ZW0+SW50IFZhbHVlPC9lbT59JyBjbGFzcy4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LmltcGwuSW50VmFsdWVJbXBsCisgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LmltcGwuQVRlc3RQYWNrYWdlSW1wbCNnZXRJbnRWYWx1ZSgpCisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIGludCBJTlRfVkFMVUUgPSAzOworCisgIC8qKgorICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICogQG9yZGVyZWQKKyAgICovCisgIGludCBJTlRfVkFMVUVfX1ZBTFVFID0gMDsKKworICAvKioKKyAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkludCBWYWx1ZTwvZW0+JyBjbGFzcy4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICogQG9yZGVyZWQKKyAgICovCisgIGludCBJTlRfVkFMVUVfRkVBVFVSRV9DT1VOVCA9IDE7CisKKyAgLyoqCisgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LmltcGwuUmVhbFZhbHVlSW1wbCA8ZW0+UmVhbCBWYWx1ZTwvZW0+fScgY2xhc3MuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5pbXBsLlJlYWxWYWx1ZUltcGwKKyAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuaW1wbC5BVGVzdFBhY2thZ2VJbXBsI2dldFJlYWxWYWx1ZSgpCisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIGludCBSRUFMX1ZBTFVFID0gNDsKKworICAvKioKKyAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqIEBvcmRlcmVkCisgICAqLworICBpbnQgUkVBTF9WQUxVRV9fVkFMVUUgPSAwOworCisgIC8qKgorICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmVhbCBWYWx1ZTwvZW0+JyBjbGFzcy4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICogQG9yZGVyZWQKKyAgICovCisgIGludCBSRUFMX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgPSAxOworCisgIC8qKgorICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5NZWFzdXJlIDxlbT5NZWFzdXJlPC9lbT59JyBlbnVtLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuTWVhc3VyZQorICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5pbXBsLkFUZXN0UGFja2FnZUltcGwjZ2V0TWVhc3VyZSgpCisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIGludCBNRUFTVVJFID0gNTsKKworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuTW9kZWwgPGVtPk1vZGVsPC9lbT59Jy4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1vZGVsPC9lbT4nLgorICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5Nb2RlbAorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBFQ2xhc3MgZ2V0TW9kZWwoKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuTW9kZWwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCisgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0Lk1vZGVsI2dldE5hbWUoKQorICAgKiBAc2VlICNnZXRNb2RlbCgpCisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIEVBdHRyaWJ1dGUgZ2V0TW9kZWxfTmFtZSgpOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5Nb2RlbCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KKyAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuTW9kZWwjZ2V0RGVzY3JpcHRpb24oKQorICAgKiBAc2VlICNnZXRNb2RlbCgpCisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIEVBdHRyaWJ1dGUgZ2V0TW9kZWxfRGVzY3JpcHRpb24oKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuTW9kZWwjZ2V0VGVzdHMgPGVtPlRlc3RzPC9lbT59Jy4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+VGVzdHM8L2VtPicuCisgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0Lk1vZGVsI2dldFRlc3RzKCkKKyAgICogQHNlZSAjZ2V0TW9kZWwoKQorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBFUmVmZXJlbmNlIGdldE1vZGVsX1Rlc3RzKCk7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuTW9kZWwjZ2V0Q29udHJhaW50cyA8ZW0+Q29udHJhaW50czwvZW0+fScuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29udHJhaW50czwvZW0+Jy4KKyAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuTW9kZWwjZ2V0Q29udHJhaW50cygpCisgICAqIEBzZWUgI2dldE1vZGVsKCkKKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgRVJlZmVyZW5jZSBnZXRNb2RlbF9Db250cmFpbnRzKCk7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5UZXN0cyA8ZW0+VGVzdHM8L2VtPn0nLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGVzdHM8L2VtPicuCisgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LlRlc3RzCisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIEVDbGFzcyBnZXRUZXN0cygpOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5UZXN0cyNnZXRJbXBvcnRVUkkgPGVtPkltcG9ydCBVUkk8L2VtPn0nLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JbXBvcnQgVVJJPC9lbT4nLgorICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5UZXN0cyNnZXRJbXBvcnRVUkkoKQorICAgKiBAc2VlICNnZXRUZXN0cygpCisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIEVBdHRyaWJ1dGUgZ2V0VGVzdHNfSW1wb3J0VVJJKCk7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5Db25zdHJhaW50IDxlbT5Db25zdHJhaW50PC9lbT59Jy4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnN0cmFpbnQ8L2VtPicuCisgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkNvbnN0cmFpbnQKKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgRUNsYXNzIGdldENvbnN0cmFpbnQoKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuQ29uc3RyYWludCNnZXRNZWFzdXJlIDxlbT5NZWFzdXJlPC9lbT59Jy4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWVhc3VyZTwvZW0+Jy4KKyAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuQ29uc3RyYWludCNnZXRNZWFzdXJlKCkKKyAgICogQHNlZSAjZ2V0Q29uc3RyYWludCgpCisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIEVBdHRyaWJ1dGUgZ2V0Q29uc3RyYWludF9NZWFzdXJlKCk7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkNvbnN0cmFpbnQjZ2V0QWdlbnQgPGVtPkFnZW50PC9lbT59Jy4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+QWdlbnQ8L2VtPicuCisgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkNvbnN0cmFpbnQjZ2V0QWdlbnQoKQorICAgKiBAc2VlICNnZXRDb25zdHJhaW50KCkKKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgRVJlZmVyZW5jZSBnZXRDb25zdHJhaW50X0FnZW50KCk7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkNvbnN0cmFpbnQjZ2V0QXR0cmlidXRlIDxlbT5BdHRyaWJ1dGU8L2VtPn0nLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5BdHRyaWJ1dGU8L2VtPicuCisgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkNvbnN0cmFpbnQjZ2V0QXR0cmlidXRlKCkKKyAgICogQHNlZSAjZ2V0Q29uc3RyYWludCgpCisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIEVSZWZlcmVuY2UgZ2V0Q29uc3RyYWludF9BdHRyaWJ1dGUoKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuQ29uc3RyYWludCNnZXRRdWFsaWZpZXIgPGVtPlF1YWxpZmllcjwvZW0+fScuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlF1YWxpZmllcjwvZW0+Jy4KKyAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuQ29uc3RyYWludCNnZXRRdWFsaWZpZXIoKQorICAgKiBAc2VlICNnZXRDb25zdHJhaW50KCkKKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgRVJlZmVyZW5jZSBnZXRDb25zdHJhaW50X1F1YWxpZmllcigpOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5Db25zdHJhaW50I2dldE1pblZhbHVlIDxlbT5NaW4gVmFsdWU8L2VtPn0nLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5NaW4gVmFsdWU8L2VtPicuCisgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkNvbnN0cmFpbnQjZ2V0TWluVmFsdWUoKQorICAgKiBAc2VlICNnZXRDb25zdHJhaW50KCkKKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgRVJlZmVyZW5jZSBnZXRDb25zdHJhaW50X01pblZhbHVlKCk7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkNvbnN0cmFpbnQjZ2V0TWF4VmFsdWUgPGVtPk1heCBWYWx1ZTwvZW0+fScuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk1heCBWYWx1ZTwvZW0+Jy4KKyAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuQ29uc3RyYWludCNnZXRNYXhWYWx1ZSgpCisgICAqIEBzZWUgI2dldENvbnN0cmFpbnQoKQorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBFUmVmZXJlbmNlIGdldENvbnN0cmFpbnRfTWF4VmFsdWUoKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkludFZhbHVlIDxlbT5JbnQgVmFsdWU8L2VtPn0nLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SW50IFZhbHVlPC9lbT4nLgorICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5JbnRWYWx1ZQorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBFQ2xhc3MgZ2V0SW50VmFsdWUoKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuSW50VmFsdWUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCisgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkludFZhbHVlI2dldFZhbHVlKCkKKyAgICogQHNlZSAjZ2V0SW50VmFsdWUoKQorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBFQXR0cmlidXRlIGdldEludFZhbHVlX1ZhbHVlKCk7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5SZWFsVmFsdWUgPGVtPlJlYWwgVmFsdWU8L2VtPn0nLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVhbCBWYWx1ZTwvZW0+Jy4KKyAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuUmVhbFZhbHVlCisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIEVDbGFzcyBnZXRSZWFsVmFsdWUoKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuUmVhbFZhbHVlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgorICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5SZWFsVmFsdWUjZ2V0VmFsdWUoKQorICAgKiBAc2VlICNnZXRSZWFsVmFsdWUoKQorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBFQXR0cmlidXRlIGdldFJlYWxWYWx1ZV9WYWx1ZSgpOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5NZWFzdXJlIDxlbT5NZWFzdXJlPC9lbT59Jy4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+TWVhc3VyZTwvZW0+Jy4KKyAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuTWVhc3VyZQorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBFRW51bSBnZXRNZWFzdXJlKCk7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIEFUZXN0RmFjdG9yeSBnZXRBVGVzdEZhY3RvcnkoKTsKKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAorICAgKiA8dWw+CisgICAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KKyAgICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KKyAgICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+CisgICAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisgICAqIDwvdWw+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBpbnRlcmZhY2UgTGl0ZXJhbHMKKyAgeworICAgIC8qKgorICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuaW1wbC5Nb2RlbEltcGwgPGVtPk1vZGVsPC9lbT59JyBjbGFzcy4KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LmltcGwuTW9kZWxJbXBsCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuaW1wbC5BVGVzdFBhY2thZ2VJbXBsI2dldE1vZGVsKCkKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgRUNsYXNzIE1PREVMID0gZUlOU1RBTkNFLmdldE1vZGVsKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgRUF0dHJpYnV0ZSBNT0RFTF9fTkFNRSA9IGVJTlNUQU5DRS5nZXRNb2RlbF9OYW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIEVBdHRyaWJ1dGUgTU9ERUxfX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldE1vZGVsX0Rlc2NyaXB0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGVzdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIEVSZWZlcmVuY2UgTU9ERUxfX1RFU1RTID0gZUlOU1RBTkNFLmdldE1vZGVsX1Rlc3RzKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udHJhaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBFUmVmZXJlbmNlIE1PREVMX19DT05UUkFJTlRTID0gZUlOU1RBTkNFLmdldE1vZGVsX0NvbnRyYWludHMoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuaW1wbC5UZXN0c0ltcGwgPGVtPlRlc3RzPC9lbT59JyBjbGFzcy4KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LmltcGwuVGVzdHNJbXBsCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuaW1wbC5BVGVzdFBhY2thZ2VJbXBsI2dldFRlc3RzKCkKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgRUNsYXNzIFRFU1RTID0gZUlOU1RBTkNFLmdldFRlc3RzKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW1wb3J0IFVSSTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgRUF0dHJpYnV0ZSBURVNUU19fSU1QT1JUX1VSSSA9IGVJTlNUQU5DRS5nZXRUZXN0c19JbXBvcnRVUkkoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuaW1wbC5Db25zdHJhaW50SW1wbCA8ZW0+Q29uc3RyYWludDwvZW0+fScgY2xhc3MuCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5pbXBsLkNvbnN0cmFpbnRJbXBsCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuaW1wbC5BVGVzdFBhY2thZ2VJbXBsI2dldENvbnN0cmFpbnQoKQorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBFQ2xhc3MgQ09OU1RSQUlOVCA9IGVJTlNUQU5DRS5nZXRDb25zdHJhaW50KCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWVhc3VyZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgRUF0dHJpYnV0ZSBDT05TVFJBSU5UX19NRUFTVVJFID0gZUlOU1RBTkNFLmdldENvbnN0cmFpbnRfTWVhc3VyZSgpOworCisgICAgLyoqCisgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFnZW50PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBFUmVmZXJlbmNlIENPTlNUUkFJTlRfX0FHRU5UID0gZUlOU1RBTkNFLmdldENvbnN0cmFpbnRfQWdlbnQoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGU8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIEVSZWZlcmVuY2UgQ09OU1RSQUlOVF9fQVRUUklCVVRFID0gZUlOU1RBTkNFLmdldENvbnN0cmFpbnRfQXR0cmlidXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UXVhbGlmaWVyPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBFUmVmZXJlbmNlIENPTlNUUkFJTlRfX1FVQUxJRklFUiA9IGVJTlNUQU5DRS5nZXRDb25zdHJhaW50X1F1YWxpZmllcigpOworCisgICAgLyoqCisgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1pbiBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgRVJlZmVyZW5jZSBDT05TVFJBSU5UX19NSU5fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0Q29uc3RyYWludF9NaW5WYWx1ZSgpOworCisgICAgLyoqCisgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1heCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgRVJlZmVyZW5jZSBDT05TVFJBSU5UX19NQVhfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0Q29uc3RyYWludF9NYXhWYWx1ZSgpOworCisgICAgLyoqCisgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5pbXBsLkludFZhbHVlSW1wbCA8ZW0+SW50IFZhbHVlPC9lbT59JyBjbGFzcy4KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LmltcGwuSW50VmFsdWVJbXBsCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuaW1wbC5BVGVzdFBhY2thZ2VJbXBsI2dldEludFZhbHVlKCkKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgRUNsYXNzIElOVF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRJbnRWYWx1ZSgpOworCisgICAgLyoqCisgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBFQXR0cmlidXRlIElOVF9WQUxVRV9fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0SW50VmFsdWVfVmFsdWUoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuaW1wbC5SZWFsVmFsdWVJbXBsIDxlbT5SZWFsIFZhbHVlPC9lbT59JyBjbGFzcy4KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LmltcGwuUmVhbFZhbHVlSW1wbAorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LmltcGwuQVRlc3RQYWNrYWdlSW1wbCNnZXRSZWFsVmFsdWUoKQorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBFQ2xhc3MgUkVBTF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRSZWFsVmFsdWUoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgRUF0dHJpYnV0ZSBSRUFMX1ZBTFVFX19WQUxVRSA9IGVJTlNUQU5DRS5nZXRSZWFsVmFsdWVfVmFsdWUoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuTWVhc3VyZSA8ZW0+TWVhc3VyZTwvZW0+fScgZW51bS4KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0Lk1lYXN1cmUKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5pbXBsLkFUZXN0UGFja2FnZUltcGwjZ2V0TWVhc3VyZSgpCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIEVFbnVtIE1FQVNVUkUgPSBlSU5TVEFOQ0UuZ2V0TWVhc3VyZSgpOworCisgIH0KKworfSAvL0FUZXN0UGFja2FnZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hVGVzdC9Db25zdHJhaW50LmphdmEgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL2FUZXN0L0NvbnN0cmFpbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWVjNThlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hVGVzdC9Db25zdHJhaW50LmphdmEKQEAgLTAsMCArMSwxOTYgQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworaW1wb3J0IG9yZy5tZXRhYWJtLlNBZ2VudDsKK2ltcG9ydCBvcmcubWV0YWFibS5TQXR0cmlidXRlOworaW1wb3J0IG9yZy5tZXRhYWJtLlNTdGF0ZVZhbHVlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db25zdHJhaW50PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5Db25zdHJhaW50I2dldE1lYXN1cmUgPGVtPk1lYXN1cmU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5Db25zdHJhaW50I2dldEFnZW50IDxlbT5BZ2VudDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkNvbnN0cmFpbnQjZ2V0QXR0cmlidXRlIDxlbT5BdHRyaWJ1dGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5Db25zdHJhaW50I2dldFF1YWxpZmllciA8ZW0+UXVhbGlmaWVyPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuQ29uc3RyYWludCNnZXRNaW5WYWx1ZSA8ZW0+TWluIFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuQ29uc3RyYWludCNnZXRNYXhWYWx1ZSA8ZW0+TWF4IFZhbHVlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuQVRlc3RQYWNrYWdlI2dldENvbnN0cmFpbnQoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ29uc3RyYWludCBleHRlbmRzIEVPYmplY3QKK3sKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1lYXN1cmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKyAgICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0Lk1lYXN1cmV9LgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8cD4KKyAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWVhc3VyZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKyAgICogPC9wPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVhc3VyZTwvZW0+JyBhdHRyaWJ1dGUuCisgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0Lk1lYXN1cmUKKyAgICogQHNlZSAjc2V0TWVhc3VyZShNZWFzdXJlKQorICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5BVGVzdFBhY2thZ2UjZ2V0Q29uc3RyYWludF9NZWFzdXJlKCkKKyAgICogQG1vZGVsCisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIE1lYXN1cmUgZ2V0TWVhc3VyZSgpOworCisgIC8qKgorICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuQ29uc3RyYWludCNnZXRNZWFzdXJlIDxlbT5NZWFzdXJlPC9lbT59JyBhdHRyaWJ1dGUuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZWFzdXJlPC9lbT4nIGF0dHJpYnV0ZS4KKyAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuTWVhc3VyZQorICAgKiBAc2VlICNnZXRNZWFzdXJlKCkKKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgdm9pZCBzZXRNZWFzdXJlKE1lYXN1cmUgdmFsdWUpOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZ2VudDwvYj48L2VtPicgcmVmZXJlbmNlLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8cD4KKyAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWdlbnQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisgICAqIDwvcD4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFnZW50PC9lbT4nIHJlZmVyZW5jZS4KKyAgICogQHNlZSAjc2V0QWdlbnQoU0FnZW50KQorICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5BVGVzdFBhY2thZ2UjZ2V0Q29uc3RyYWludF9BZ2VudCgpCisgICAqIEBtb2RlbAorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBTQWdlbnQgZ2V0QWdlbnQoKTsKKworICAvKioKKyAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkNvbnN0cmFpbnQjZ2V0QWdlbnQgPGVtPkFnZW50PC9lbT59JyByZWZlcmVuY2UuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BZ2VudDwvZW0+JyByZWZlcmVuY2UuCisgICAqIEBzZWUgI2dldEFnZW50KCkKKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgdm9pZCBzZXRBZ2VudChTQWdlbnQgdmFsdWUpOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPHA+CisgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKyAgICogPC9wPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlPC9lbT4nIHJlZmVyZW5jZS4KKyAgICogQHNlZSAjc2V0QXR0cmlidXRlKFNBdHRyaWJ1dGUpCisgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkFUZXN0UGFja2FnZSNnZXRDb25zdHJhaW50X0F0dHJpYnV0ZSgpCisgICAqIEBtb2RlbAorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBTQXR0cmlidXRlIGdldEF0dHJpYnV0ZSgpOworCisgIC8qKgorICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuQ29uc3RyYWludCNnZXRBdHRyaWJ1dGUgPGVtPkF0dHJpYnV0ZTwvZW0+fScgcmVmZXJlbmNlLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlPC9lbT4nIHJlZmVyZW5jZS4KKyAgICogQHNlZSAjZ2V0QXR0cmlidXRlKCkKKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgdm9pZCBzZXRBdHRyaWJ1dGUoU0F0dHJpYnV0ZSB2YWx1ZSk7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlF1YWxpZmllcjwvYj48L2VtPicgcmVmZXJlbmNlLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8cD4KKyAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UXVhbGlmaWVyPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKyAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorICAgKiA8L3A+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5RdWFsaWZpZXI8L2VtPicgcmVmZXJlbmNlLgorICAgKiBAc2VlICNzZXRRdWFsaWZpZXIoU1N0YXRlVmFsdWUpCisgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkFUZXN0UGFja2FnZSNnZXRDb25zdHJhaW50X1F1YWxpZmllcigpCisgICAqIEBtb2RlbAorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBTU3RhdGVWYWx1ZSBnZXRRdWFsaWZpZXIoKTsKKworICAvKioKKyAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkNvbnN0cmFpbnQjZ2V0UXVhbGlmaWVyIDxlbT5RdWFsaWZpZXI8L2VtPn0nIHJlZmVyZW5jZS4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlF1YWxpZmllcjwvZW0+JyByZWZlcmVuY2UuCisgICAqIEBzZWUgI2dldFF1YWxpZmllcigpCisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHZvaWQgc2V0UXVhbGlmaWVyKFNTdGF0ZVZhbHVlIHZhbHVlKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWluIFZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDxwPgorICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NaW4gVmFsdWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisgICAqIDwvcD4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pbiBWYWx1ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisgICAqIEBzZWUgI3NldE1pblZhbHVlKEVPYmplY3QpCisgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkFUZXN0UGFja2FnZSNnZXRDb25zdHJhaW50X01pblZhbHVlKCkKKyAgICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBFT2JqZWN0IGdldE1pblZhbHVlKCk7CisKKyAgLyoqCisgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5Db25zdHJhaW50I2dldE1pblZhbHVlIDxlbT5NaW4gVmFsdWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1pbiBWYWx1ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisgICAqIEBzZWUgI2dldE1pblZhbHVlKCkKKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgdm9pZCBzZXRNaW5WYWx1ZShFT2JqZWN0IHZhbHVlKTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWF4IFZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDxwPgorICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXggVmFsdWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisgICAqIDwvcD4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1heCBWYWx1ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisgICAqIEBzZWUgI3NldE1heFZhbHVlKEVPYmplY3QpCisgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkFUZXN0UGFja2FnZSNnZXRDb25zdHJhaW50X01heFZhbHVlKCkKKyAgICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBFT2JqZWN0IGdldE1heFZhbHVlKCk7CisKKyAgLyoqCisgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5Db25zdHJhaW50I2dldE1heFZhbHVlIDxlbT5NYXggVmFsdWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1heCBWYWx1ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisgICAqIEBzZWUgI2dldE1heFZhbHVlKCkKKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgdm9pZCBzZXRNYXhWYWx1ZShFT2JqZWN0IHZhbHVlKTsKKworfSAvLyBDb25zdHJhaW50CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL2FUZXN0L0ludFZhbHVlLmphdmEgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL2FUZXN0L0ludFZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI0ZDA2ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvYVRlc3QvSW50VmFsdWUuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkludCBWYWx1ZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuSW50VmFsdWUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuQVRlc3RQYWNrYWdlI2dldEludFZhbHVlKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIEludFZhbHVlIGV4dGVuZHMgRU9iamVjdAoreworICAvKioKKyAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPHA+CisgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKyAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorICAgKiA8L3A+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisgICAqIEBzZWUgI3NldFZhbHVlKGludCkKKyAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuQVRlc3RQYWNrYWdlI2dldEludFZhbHVlX1ZhbHVlKCkKKyAgICogQG1vZGVsCisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIGludCBnZXRWYWx1ZSgpOworCisgIC8qKgorICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuSW50VmFsdWUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisgICAqIEBzZWUgI2dldFZhbHVlKCkKKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgdm9pZCBzZXRWYWx1ZShpbnQgdmFsdWUpOworCit9IC8vIEludFZhbHVlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL2FUZXN0L01lYXN1cmUuamF2YSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvYVRlc3QvTWVhc3VyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxN2JhYmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL2FUZXN0L01lYXN1cmUuamF2YQpAQCAtMCwwICsxLDMwNyBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPk1lYXN1cmU8L2I+PC9lbT4nLAorICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkFUZXN0UGFja2FnZSNnZXRNZWFzdXJlKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZW51bSBNZWFzdXJlIGltcGxlbWVudHMgRW51bWVyYXRvcgoreworICAvKioKKyAgICogVGhlICc8ZW0+PGI+Q09VTlQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHNlZSAjQ09VTlRfVkFMVUUKKyAgICogQGdlbmVyYXRlZAorICAgKiBAb3JkZXJlZAorICAgKi8KKyAgQ09VTlQoMCwgIkNPVU5UIiwgIkNvdW50IiksCisKKyAgLyoqCisgICAqIFRoZSAnPGVtPjxiPkFWRVJBR0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHNlZSAjQVZFUkFHRV9WQUxVRQorICAgKiBAZ2VuZXJhdGVkCisgICAqIEBvcmRlcmVkCisgICAqLworICBBVkVSQUdFKDEsICJBVkVSQUdFIiwgIkF2ZXJhZ2UiKSwKKworICAvKioKKyAgICogVGhlICc8ZW0+PGI+U1VNPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBzZWUgI1NVTV9WQUxVRQorICAgKiBAZ2VuZXJhdGVkCisgICAqIEBvcmRlcmVkCisgICAqLworICBTVU0oMiwgIlNVTSIsICJTdW0iKSwKKworICAvKioKKyAgICogVGhlICc8ZW0+PGI+TUlOSU1VTTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAc2VlICNNSU5JTVVNX1ZBTFVFCisgICAqIEBnZW5lcmF0ZWQKKyAgICogQG9yZGVyZWQKKyAgICovCisgIE1JTklNVU0oMywgIk1JTklNVU0iLCAiTWluaW11bSIpLAorCisgIC8qKgorICAgKiBUaGUgJzxlbT48Yj5NQVhJTVVNPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBzZWUgI01BWElNVU1fVkFMVUUKKyAgICogQGdlbmVyYXRlZAorICAgKiBAb3JkZXJlZAorICAgKi8KKyAgTUFYSU1VTSg0LCAiTUFYSU1VTSIsICJNYXhpbXVtIik7CisKKyAgLyoqCisgICAqIFRoZSAnPGVtPjxiPkNPVU5UPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8cD4KKyAgICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5DT1VOVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKyAgICogPC9wPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHNlZSAjQ09VTlQKKyAgICogQG1vZGVsIGxpdGVyYWw9IkNvdW50IgorICAgKiBAZ2VuZXJhdGVkCisgICAqIEBvcmRlcmVkCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT1VOVF9WQUxVRSA9IDA7CisKKyAgLyoqCisgICAqIFRoZSAnPGVtPjxiPkFWRVJBR0U8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDxwPgorICAgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkFWRVJBR0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisgICAqIDwvcD4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBzZWUgI0FWRVJBR0UKKyAgICogQG1vZGVsIGxpdGVyYWw9IkF2ZXJhZ2UiCisgICAqIEBnZW5lcmF0ZWQKKyAgICogQG9yZGVyZWQKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFWRVJBR0VfVkFMVUUgPSAxOworCisgIC8qKgorICAgKiBUaGUgJzxlbT48Yj5TVU08L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDxwPgorICAgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlNVTTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKyAgICogPC9wPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHNlZSAjU1VNCisgICAqIEBtb2RlbCBsaXRlcmFsPSJTdW0iCisgICAqIEBnZW5lcmF0ZWQKKyAgICogQG9yZGVyZWQKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVTV9WQUxVRSA9IDI7CisKKyAgLyoqCisgICAqIFRoZSAnPGVtPjxiPk1JTklNVU08L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDxwPgorICAgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk1JTklNVU08L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisgICAqIDwvcD4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBzZWUgI01JTklNVU0KKyAgICogQG1vZGVsIGxpdGVyYWw9Ik1pbmltdW0iCisgICAqIEBnZW5lcmF0ZWQKKyAgICogQG9yZGVyZWQKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTklNVU1fVkFMVUUgPSAzOworCisgIC8qKgorICAgKiBUaGUgJzxlbT48Yj5NQVhJTVVNPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8cD4KKyAgICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5NQVhJTVVNPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKyAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorICAgKiA8L3A+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAc2VlICNNQVhJTVVNCisgICAqIEBtb2RlbCBsaXRlcmFsPSJNYXhpbXVtIgorICAgKiBAZ2VuZXJhdGVkCisgICAqIEBvcmRlcmVkCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhJTVVNX1ZBTFVFID0gNDsKKworICAvKioKKyAgICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPk1lYXN1cmU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWVhc3VyZVtdIFZBTFVFU19BUlJBWSA9CisgICAgbmV3IE1lYXN1cmVbXQorICAgIHsKKyAgICAgIENPVU5ULAorICAgICAgQVZFUkFHRSwKKyAgICAgIFNVTSwKKyAgICAgIE1JTklNVU0sCisgICAgICBNQVhJTVVNLAorICAgIH07CisKKyAgLyoqCisgICAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5NZWFzdXJlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxNZWFzdXJlPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlICc8ZW0+PGI+TWVhc3VyZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgTWVhc3VyZSBnZXQoU3RyaW5nIGxpdGVyYWwpCisgIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKKyAgICB7CisgICAgICBNZWFzdXJlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKyAgICAgIGlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpCisgICAgICB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxsOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlICc8ZW0+PGI+TWVhc3VyZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgTWVhc3VyZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpCisgIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKKyAgICB7CisgICAgICBNZWFzdXJlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKyAgICAgIGlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgJzxlbT48Yj5NZWFzdXJlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIHN0YXRpYyBNZWFzdXJlIGdldChpbnQgdmFsdWUpCisgIHsKKyAgICBzd2l0Y2ggKHZhbHVlKQorICAgIHsKKyAgICAgIGNhc2UgQ09VTlRfVkFMVUU6IHJldHVybiBDT1VOVDsKKyAgICAgIGNhc2UgQVZFUkFHRV9WQUxVRTogcmV0dXJuIEFWRVJBR0U7CisgICAgICBjYXNlIFNVTV9WQUxVRTogcmV0dXJuIFNVTTsKKyAgICAgIGNhc2UgTUlOSU1VTV9WQUxVRTogcmV0dXJuIE1JTklNVU07CisgICAgICBjYXNlIE1BWElNVU1fVkFMVUU6IHJldHVybiBNQVhJTVVNOworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKKworICAvKioKKyAgICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHJpdmF0ZSBNZWFzdXJlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKQorICB7CisgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIGludCBnZXRWYWx1ZSgpCisgIHsKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCisgIHsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkKKyAgeworICAgIHJldHVybiBsaXRlcmFsOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgIHsKKyAgICByZXR1cm4gbGl0ZXJhbDsKKyAgfQorICAKK30gLy9NZWFzdXJlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL2FUZXN0L01vZGVsLmphdmEgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL2FUZXN0L01vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNjZWRhOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvYVRlc3QvTW9kZWwuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Nb2RlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuTW9kZWwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0Lk1vZGVsI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0Lk1vZGVsI2dldFRlc3RzIDxlbT5UZXN0czwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0Lk1vZGVsI2dldENvbnRyYWludHMgPGVtPkNvbnRyYWludHM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5BVGVzdFBhY2thZ2UjZ2V0TW9kZWwoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTW9kZWwgZXh0ZW5kcyBFT2JqZWN0Cit7CisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDxwPgorICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKyAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorICAgKiA8L3A+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKyAgICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCisgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkFUZXN0UGFja2FnZSNnZXRNb2RlbF9OYW1lKCkKKyAgICogQG1vZGVsCisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIFN0cmluZyBnZXROYW1lKCk7CisKKyAgLyoqCisgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5Nb2RlbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKyAgICogQHNlZSAjZ2V0TmFtZSgpCisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8cD4KKyAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisgICAqIDwvcD4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKyAgICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQorICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5BVGVzdFBhY2thZ2UjZ2V0TW9kZWxfRGVzY3JpcHRpb24oKQorICAgKiBAbW9kZWwKKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7CisKKyAgLyoqCisgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5Nb2RlbCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKyAgICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRlc3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDxwPgorICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UZXN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKyAgICogPC9wPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGVzdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorICAgKiBAc2VlICNzZXRUZXN0cyhUZXN0cykKKyAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuQVRlc3RQYWNrYWdlI2dldE1vZGVsX1Rlc3RzKCkKKyAgICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBUZXN0cyBnZXRUZXN0cygpOworCisgIC8qKgorICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuTW9kZWwjZ2V0VGVzdHMgPGVtPlRlc3RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UZXN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisgICAqIEBzZWUgI2dldFRlc3RzKCkKKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgdm9pZCBzZXRUZXN0cyhUZXN0cyB2YWx1ZSk7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRyYWludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkNvbnN0cmFpbnR9LgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8cD4KKyAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udHJhaW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKyAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorICAgKiA8L3A+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250cmFpbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5BVGVzdFBhY2thZ2UjZ2V0TW9kZWxfQ29udHJhaW50cygpCisgICAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgRUxpc3Q8Q29uc3RyYWludD4gZ2V0Q29udHJhaW50cygpOworCit9IC8vIE1vZGVsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL2FUZXN0L1JlYWxWYWx1ZS5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hVGVzdC9SZWFsVmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjMzNGE1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hVGVzdC9SZWFsVmFsdWUuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlYWwgVmFsdWU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LlJlYWxWYWx1ZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5BVGVzdFBhY2thZ2UjZ2V0UmVhbFZhbHVlKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlYWxWYWx1ZSBleHRlbmRzIEVPYmplY3QKK3sKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDxwPgorICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKyAgICogPC9wPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgorICAgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCisgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkFUZXN0UGFja2FnZSNnZXRSZWFsVmFsdWVfVmFsdWUoKQorICAgKiBAbW9kZWwKKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgU3RyaW5nIGdldFZhbHVlKCk7CisKKyAgLyoqCisgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5SZWFsVmFsdWUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisgICAqIEBzZWUgI2dldFZhbHVlKCkKKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOworCit9IC8vIFJlYWxWYWx1ZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hVGVzdC9UZXN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hVGVzdC9UZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2Y2Y0ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL2FUZXN0L1Rlc3RzLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZXN0czwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuVGVzdHMjZ2V0SW1wb3J0VVJJIDxlbT5JbXBvcnQgVVJJPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuQVRlc3RQYWNrYWdlI2dldFRlc3RzKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFRlc3RzIGV4dGVuZHMgRU9iamVjdAoreworICAvKioKKyAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW1wb3J0IFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8cD4KKyAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW1wb3J0IFVSSTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKyAgICogPC9wPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW1wb3J0IFVSSTwvZW0+JyBhdHRyaWJ1dGUuCisgICAqIEBzZWUgI3NldEltcG9ydFVSSShTdHJpbmcpCisgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkFUZXN0UGFja2FnZSNnZXRUZXN0c19JbXBvcnRVUkkoKQorICAgKiBAbW9kZWwKKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgU3RyaW5nIGdldEltcG9ydFVSSSgpOworCisgIC8qKgorICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuVGVzdHMjZ2V0SW1wb3J0VVJJIDxlbT5JbXBvcnQgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbXBvcnQgVVJJPC9lbT4nIGF0dHJpYnV0ZS4KKyAgICogQHNlZSAjZ2V0SW1wb3J0VVJJKCkKKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgdm9pZCBzZXRJbXBvcnRVUkkoU3RyaW5nIHZhbHVlKTsKKworfSAvLyBUZXN0cwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hVGVzdC9pbXBsL0FUZXN0RmFjdG9yeUltcGwuamF2YSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvYVRlc3QvaW1wbC9BVGVzdEZhY3RvcnlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEzY2JkYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvYVRlc3QvaW1wbC9BVGVzdEZhY3RvcnlJbXBsLmphdmEKQEAgLTAsMCArMSwyMTQgQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC4qOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgQVRlc3RGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIEFUZXN0RmFjdG9yeQoreworICAvKioKKyAgICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIHN0YXRpYyBBVGVzdEZhY3RvcnkgaW5pdCgpCisgIHsKKyAgICB0cnkKKyAgICB7CisgICAgICBBVGVzdEZhY3RvcnkgdGhlQVRlc3RGYWN0b3J5ID0gKEFUZXN0RmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9hbXAvYW1mL3Rlc3RpbmcvQVRlc3QiKTsgCisgICAgICBpZiAodGhlQVRlc3RGYWN0b3J5ICE9IG51bGwpCisgICAgICB7CisgICAgICAgIHJldHVybiB0aGVBVGVzdEZhY3Rvcnk7CisgICAgICB9CisgICAgfQorICAgIGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQorICAgIHsKKyAgICAgIEVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworICAgIH0KKyAgICByZXR1cm4gbmV3IEFUZXN0RmFjdG9yeUltcGwoKTsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIEFUZXN0RmFjdG9yeUltcGwoKQorICB7CisgICAgc3VwZXIoKTsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKQorICB7CisgICAgc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpCisgICAgeworICAgICAgY2FzZSBBVGVzdFBhY2thZ2UuTU9ERUw6IHJldHVybiBjcmVhdGVNb2RlbCgpOworICAgICAgY2FzZSBBVGVzdFBhY2thZ2UuVEVTVFM6IHJldHVybiBjcmVhdGVUZXN0cygpOworICAgICAgY2FzZSBBVGVzdFBhY2thZ2UuQ09OU1RSQUlOVDogcmV0dXJuIGNyZWF0ZUNvbnN0cmFpbnQoKTsKKyAgICAgIGNhc2UgQVRlc3RQYWNrYWdlLklOVF9WQUxVRTogcmV0dXJuIGNyZWF0ZUludFZhbHVlKCk7CisgICAgICBjYXNlIEFUZXN0UGFja2FnZS5SRUFMX1ZBTFVFOiByZXR1cm4gY3JlYXRlUmVhbFZhbHVlKCk7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQorICB7CisgICAgc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpCisgICAgeworICAgICAgY2FzZSBBVGVzdFBhY2thZ2UuTUVBU1VSRToKKyAgICAgICAgcmV0dXJuIGNyZWF0ZU1lYXN1cmVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCisgIHsKKyAgICBzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkKKyAgICB7CisgICAgICBjYXNlIEFUZXN0UGFja2FnZS5NRUFTVVJFOgorICAgICAgICByZXR1cm4gY29udmVydE1lYXN1cmVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHB1YmxpYyBNb2RlbCBjcmVhdGVNb2RlbCgpCisgIHsKKyAgICBNb2RlbEltcGwgbW9kZWwgPSBuZXcgTW9kZWxJbXBsKCk7CisgICAgcmV0dXJuIG1vZGVsOworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBwdWJsaWMgVGVzdHMgY3JlYXRlVGVzdHMoKQorICB7CisgICAgVGVzdHNJbXBsIHRlc3RzID0gbmV3IFRlc3RzSW1wbCgpOworICAgIHJldHVybiB0ZXN0czsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIENvbnN0cmFpbnQgY3JlYXRlQ29uc3RyYWludCgpCisgIHsKKyAgICBDb25zdHJhaW50SW1wbCBjb25zdHJhaW50ID0gbmV3IENvbnN0cmFpbnRJbXBsKCk7CisgICAgcmV0dXJuIGNvbnN0cmFpbnQ7CisgIH0KKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHB1YmxpYyBJbnRWYWx1ZSBjcmVhdGVJbnRWYWx1ZSgpCisgIHsKKyAgICBJbnRWYWx1ZUltcGwgaW50VmFsdWUgPSBuZXcgSW50VmFsdWVJbXBsKCk7CisgICAgcmV0dXJuIGludFZhbHVlOworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBwdWJsaWMgUmVhbFZhbHVlIGNyZWF0ZVJlYWxWYWx1ZSgpCisgIHsKKyAgICBSZWFsVmFsdWVJbXBsIHJlYWxWYWx1ZSA9IG5ldyBSZWFsVmFsdWVJbXBsKCk7CisgICAgcmV0dXJuIHJlYWxWYWx1ZTsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIE1lYXN1cmUgY3JlYXRlTWVhc3VyZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKKyAgeworICAgIE1lYXN1cmUgcmVzdWx0ID0gTWVhc3VyZS5nZXQoaW5pdGlhbFZhbHVlKTsKKyAgICBpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRNZWFzdXJlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCisgIHsKKyAgICByZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIEFUZXN0UGFja2FnZSBnZXRBVGVzdFBhY2thZ2UoKQorICB7CisgICAgcmV0dXJuIChBVGVzdFBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGRlcHJlY2F0ZWQKKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgQERlcHJlY2F0ZWQKKyAgcHVibGljIHN0YXRpYyBBVGVzdFBhY2thZ2UgZ2V0UGFja2FnZSgpCisgIHsKKyAgICByZXR1cm4gQVRlc3RQYWNrYWdlLmVJTlNUQU5DRTsKKyAgfQorCit9IC8vQVRlc3RGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hVGVzdC9pbXBsL0FUZXN0UGFja2FnZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvYVRlc3QvaW1wbC9BVGVzdFBhY2thZ2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRmYWE0OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvYVRlc3QvaW1wbC9BVGVzdFBhY2thZ2VJbXBsLmphdmEKQEAgLTAsMCArMSw0NTkgQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5BVGVzdEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkFUZXN0UGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuQ29uc3RyYWludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuSW50VmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0Lk1lYXN1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0Lk1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5SZWFsVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LlRlc3RzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOworCitpbXBvcnQgb3JnLm1ldGFhYm0uTWV0YUFCTVBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgQVRlc3RQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIEFUZXN0UGFja2FnZQoreworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHByaXZhdGUgRUNsYXNzIG1vZGVsRUNsYXNzID0gbnVsbDsKKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHByaXZhdGUgRUNsYXNzIHRlc3RzRUNsYXNzID0gbnVsbDsKKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHByaXZhdGUgRUNsYXNzIGNvbnN0cmFpbnRFQ2xhc3MgPSBudWxsOworCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHJpdmF0ZSBFQ2xhc3MgaW50VmFsdWVFQ2xhc3MgPSBudWxsOworCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHJpdmF0ZSBFQ2xhc3MgcmVhbFZhbHVlRUNsYXNzID0gbnVsbDsKKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHByaXZhdGUgRUVudW0gbWVhc3VyZUVFbnVtID0gbnVsbDsKKworICAvKioKKyAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAorICAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQorICAgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KKyAgICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYworICAgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcworICAgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAorICAgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQorICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5BVGVzdFBhY2thZ2UjZU5TX1VSSQorICAgKiBAc2VlICNpbml0KCkKKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHJpdmF0ZSBBVGVzdFBhY2thZ2VJbXBsKCkKKyAgeworICAgIHN1cGVyKGVOU19VUkksIEFUZXN0RmFjdG9yeS5lSU5TVEFOQ0UpOworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CisKKyAgLyoqCisgICAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4KKyAgICogCisgICAqIDxwPlRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB7QGxpbmsgQVRlc3RQYWNrYWdlI2VJTlNUQU5DRX0gd2hlbiB0aGF0IGZpZWxkIGlzIGFjY2Vzc2VkLgorICAgKiBDbGllbnRzIHNob3VsZCBub3QgaW52b2tlIGl0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCBzaW1wbHkgYWNjZXNzIHRoYXQgZmllbGQgdG8gb2J0YWluIHRoZSBwYWNrYWdlLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHNlZSAjZU5TX1VSSQorICAgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQorICAgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIHN0YXRpYyBBVGVzdFBhY2thZ2UgaW5pdCgpCisgIHsKKyAgICBpZiAoaXNJbml0ZWQpIHJldHVybiAoQVRlc3RQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFUZXN0UGFja2FnZS5lTlNfVVJJKTsKKworICAgIC8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKKyAgICBBVGVzdFBhY2thZ2VJbXBsIHRoZUFUZXN0UGFja2FnZSA9IChBVGVzdFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZiBBVGVzdFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IEFUZXN0UGFja2FnZUltcGwoKSk7CisKKyAgICBpc0luaXRlZCA9IHRydWU7CisKKyAgICAvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKKyAgICBNZXRhQUJNUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisKKyAgICAvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cworICAgIHRoZUFUZXN0UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKworICAgIC8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKKyAgICB0aGVBVGVzdFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCisgICAgLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAorICAgIHRoZUFUZXN0UGFja2FnZS5mcmVlemUoKTsKKworICAKKyAgICAvLyBVcGRhdGUgdGhlIHJlZ2lzdHJ5IGFuZCByZXR1cm4gdGhlIHBhY2thZ2UKKyAgICBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoQVRlc3RQYWNrYWdlLmVOU19VUkksIHRoZUFUZXN0UGFja2FnZSk7CisgICAgcmV0dXJuIHRoZUFUZXN0UGFja2FnZTsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIEVDbGFzcyBnZXRNb2RlbCgpCisgIHsKKyAgICByZXR1cm4gbW9kZWxFQ2xhc3M7CisgIH0KKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHB1YmxpYyBFQXR0cmlidXRlIGdldE1vZGVsX05hbWUoKQorICB7CisgICAgcmV0dXJuIChFQXR0cmlidXRlKW1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisgIH0KKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHB1YmxpYyBFQXR0cmlidXRlIGdldE1vZGVsX0Rlc2NyaXB0aW9uKCkKKyAgeworICAgIHJldHVybiAoRUF0dHJpYnV0ZSltb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRNb2RlbF9UZXN0cygpCisgIHsKKyAgICByZXR1cm4gKEVSZWZlcmVuY2UpbW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIEVSZWZlcmVuY2UgZ2V0TW9kZWxfQ29udHJhaW50cygpCisgIHsKKyAgICByZXR1cm4gKEVSZWZlcmVuY2UpbW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIEVDbGFzcyBnZXRUZXN0cygpCisgIHsKKyAgICByZXR1cm4gdGVzdHNFQ2xhc3M7CisgIH0KKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHB1YmxpYyBFQXR0cmlidXRlIGdldFRlc3RzX0ltcG9ydFVSSSgpCisgIHsKKyAgICByZXR1cm4gKEVBdHRyaWJ1dGUpdGVzdHNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIEVDbGFzcyBnZXRDb25zdHJhaW50KCkKKyAgeworICAgIHJldHVybiBjb25zdHJhaW50RUNsYXNzOworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb25zdHJhaW50X01lYXN1cmUoKQorICB7CisgICAgcmV0dXJuIChFQXR0cmlidXRlKWNvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29uc3RyYWludF9BZ2VudCgpCisgIHsKKyAgICByZXR1cm4gKEVSZWZlcmVuY2UpY29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb25zdHJhaW50X0F0dHJpYnV0ZSgpCisgIHsKKyAgICByZXR1cm4gKEVSZWZlcmVuY2UpY29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb25zdHJhaW50X1F1YWxpZmllcigpCisgIHsKKyAgICByZXR1cm4gKEVSZWZlcmVuY2UpY29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb25zdHJhaW50X01pblZhbHVlKCkKKyAgeworICAgIHJldHVybiAoRVJlZmVyZW5jZSljb25zdHJhaW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisgIH0KKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHB1YmxpYyBFUmVmZXJlbmNlIGdldENvbnN0cmFpbnRfTWF4VmFsdWUoKQorICB7CisgICAgcmV0dXJuIChFUmVmZXJlbmNlKWNvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIEVDbGFzcyBnZXRJbnRWYWx1ZSgpCisgIHsKKyAgICByZXR1cm4gaW50VmFsdWVFQ2xhc3M7CisgIH0KKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHB1YmxpYyBFQXR0cmlidXRlIGdldEludFZhbHVlX1ZhbHVlKCkKKyAgeworICAgIHJldHVybiAoRUF0dHJpYnV0ZSlpbnRWYWx1ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBwdWJsaWMgRUNsYXNzIGdldFJlYWxWYWx1ZSgpCisgIHsKKyAgICByZXR1cm4gcmVhbFZhbHVlRUNsYXNzOworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZWFsVmFsdWVfVmFsdWUoKQorICB7CisgICAgcmV0dXJuIChFQXR0cmlidXRlKXJlYWxWYWx1ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBwdWJsaWMgRUVudW0gZ2V0TWVhc3VyZSgpCisgIHsKKyAgICByZXR1cm4gbWVhc3VyZUVFbnVtOworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBwdWJsaWMgQVRlc3RGYWN0b3J5IGdldEFUZXN0RmFjdG9yeSgpCisgIHsKKyAgICByZXR1cm4gKEFUZXN0RmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7CisgIH0KKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKKworICAvKioKKyAgICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCisgICAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpCisgIHsKKyAgICBpZiAoaXNDcmVhdGVkKSByZXR1cm47CisgICAgaXNDcmVhdGVkID0gdHJ1ZTsKKworICAgIC8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcworICAgIG1vZGVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1PREVMKTsKKyAgICBjcmVhdGVFQXR0cmlidXRlKG1vZGVsRUNsYXNzLCBNT0RFTF9fTkFNRSk7CisgICAgY3JlYXRlRUF0dHJpYnV0ZShtb2RlbEVDbGFzcywgTU9ERUxfX0RFU0NSSVBUSU9OKTsKKyAgICBjcmVhdGVFUmVmZXJlbmNlKG1vZGVsRUNsYXNzLCBNT0RFTF9fVEVTVFMpOworICAgIGNyZWF0ZUVSZWZlcmVuY2UobW9kZWxFQ2xhc3MsIE1PREVMX19DT05UUkFJTlRTKTsKKworICAgIHRlc3RzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRFU1RTKTsKKyAgICBjcmVhdGVFQXR0cmlidXRlKHRlc3RzRUNsYXNzLCBURVNUU19fSU1QT1JUX1VSSSk7CisKKyAgICBjb25zdHJhaW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTlNUUkFJTlQpOworICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY29uc3RyYWludEVDbGFzcywgQ09OU1RSQUlOVF9fTUVBU1VSRSk7CisgICAgY3JlYXRlRVJlZmVyZW5jZShjb25zdHJhaW50RUNsYXNzLCBDT05TVFJBSU5UX19BR0VOVCk7CisgICAgY3JlYXRlRVJlZmVyZW5jZShjb25zdHJhaW50RUNsYXNzLCBDT05TVFJBSU5UX19BVFRSSUJVVEUpOworICAgIGNyZWF0ZUVSZWZlcmVuY2UoY29uc3RyYWludEVDbGFzcywgQ09OU1RSQUlOVF9fUVVBTElGSUVSKTsKKyAgICBjcmVhdGVFUmVmZXJlbmNlKGNvbnN0cmFpbnRFQ2xhc3MsIENPTlNUUkFJTlRfX01JTl9WQUxVRSk7CisgICAgY3JlYXRlRVJlZmVyZW5jZShjb25zdHJhaW50RUNsYXNzLCBDT05TVFJBSU5UX19NQVhfVkFMVUUpOworCisgICAgaW50VmFsdWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU5UX1ZBTFVFKTsKKyAgICBjcmVhdGVFQXR0cmlidXRlKGludFZhbHVlRUNsYXNzLCBJTlRfVkFMVUVfX1ZBTFVFKTsKKworICAgIHJlYWxWYWx1ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSRUFMX1ZBTFVFKTsKKyAgICBjcmVhdGVFQXR0cmlidXRlKHJlYWxWYWx1ZUVDbGFzcywgUkVBTF9WQUxVRV9fVkFMVUUpOworCisgICAgLy8gQ3JlYXRlIGVudW1zCisgICAgbWVhc3VyZUVFbnVtID0gY3JlYXRlRUVudW0oTUVBU1VSRSk7CisgIH0KKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7CisKKyAgLyoqCisgICAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCisgICAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKKyAgeworICAgIGlmIChpc0luaXRpYWxpemVkKSByZXR1cm47CisgICAgaXNJbml0aWFsaXplZCA9IHRydWU7CisKKyAgICAvLyBJbml0aWFsaXplIHBhY2thZ2UKKyAgICBzZXROYW1lKGVOQU1FKTsKKyAgICBzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKKyAgICBzZXROc1VSSShlTlNfVVJJKTsKKworICAgIC8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKKyAgICBNZXRhQUJNUGFja2FnZSB0aGVNZXRhQUJNUGFja2FnZSA9IChNZXRhQUJNUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNZXRhQUJNUGFja2FnZS5lTlNfVVJJKTsKKworICAgIC8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMKKworICAgIC8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycworCisgICAgLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcworCisgICAgLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKKyAgICBpbml0RUNsYXNzKG1vZGVsRUNsYXNzLCBNb2RlbC5jbGFzcywgIk1vZGVsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworICAgIGluaXRFQXR0cmlidXRlKGdldE1vZGVsX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKyAgICBpbml0RUF0dHJpYnV0ZShnZXRNb2RlbF9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKyAgICBpbml0RVJlZmVyZW5jZShnZXRNb2RlbF9UZXN0cygpLCB0aGlzLmdldFRlc3RzKCksIG51bGwsICJ0ZXN0cyIsIG51bGwsIDAsIDEsIE1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworICAgIGluaXRFUmVmZXJlbmNlKGdldE1vZGVsX0NvbnRyYWludHMoKSwgdGhpcy5nZXRDb25zdHJhaW50KCksIG51bGwsICJjb250cmFpbnRzIiwgbnVsbCwgMCwgLTEsIE1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisgICAgaW5pdEVDbGFzcyh0ZXN0c0VDbGFzcywgVGVzdHMuY2xhc3MsICJUZXN0cyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKyAgICBpbml0RUF0dHJpYnV0ZShnZXRUZXN0c19JbXBvcnRVUkkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImltcG9ydFVSSSIsIG51bGwsIDAsIDEsIFRlc3RzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisgICAgaW5pdEVDbGFzcyhjb25zdHJhaW50RUNsYXNzLCBDb25zdHJhaW50LmNsYXNzLCAiQ29uc3RyYWludCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKyAgICBpbml0RUF0dHJpYnV0ZShnZXRDb25zdHJhaW50X01lYXN1cmUoKSwgdGhpcy5nZXRNZWFzdXJlKCksICJtZWFzdXJlIiwgbnVsbCwgMCwgMSwgQ29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKyAgICBpbml0RVJlZmVyZW5jZShnZXRDb25zdHJhaW50X0FnZW50KCksIHRoZU1ldGFBQk1QYWNrYWdlLmdldFNBZ2VudCgpLCBudWxsLCAiYWdlbnQiLCBudWxsLCAwLCAxLCBDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworICAgIGluaXRFUmVmZXJlbmNlKGdldENvbnN0cmFpbnRfQXR0cmlidXRlKCksIHRoZU1ldGFBQk1QYWNrYWdlLmdldFNBdHRyaWJ1dGUoKSwgbnVsbCwgImF0dHJpYnV0ZSIsIG51bGwsIDAsIDEsIENvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisgICAgaW5pdEVSZWZlcmVuY2UoZ2V0Q29uc3RyYWludF9RdWFsaWZpZXIoKSwgdGhlTWV0YUFCTVBhY2thZ2UuZ2V0U1N0YXRlVmFsdWUoKSwgbnVsbCwgInF1YWxpZmllciIsIG51bGwsIDAsIDEsIENvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisgICAgaW5pdEVSZWZlcmVuY2UoZ2V0Q29uc3RyYWludF9NaW5WYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RU9iamVjdCgpLCBudWxsLCAibWluVmFsdWUiLCBudWxsLCAwLCAxLCBDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworICAgIGluaXRFUmVmZXJlbmNlKGdldENvbnN0cmFpbnRfTWF4VmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVPYmplY3QoKSwgbnVsbCwgIm1heFZhbHVlIiwgbnVsbCwgMCwgMSwgQ29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworICAgIGluaXRFQ2xhc3MoaW50VmFsdWVFQ2xhc3MsIEludFZhbHVlLmNsYXNzLCAiSW50VmFsdWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0SW50VmFsdWVfVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVJbnQoKSwgInZhbHVlIiwgbnVsbCwgMCwgMSwgSW50VmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKyAgICBpbml0RUNsYXNzKHJlYWxWYWx1ZUVDbGFzcywgUmVhbFZhbHVlLmNsYXNzLCAiUmVhbFZhbHVlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworICAgIGluaXRFQXR0cmlidXRlKGdldFJlYWxWYWx1ZV9WYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmFsdWUiLCBudWxsLCAwLCAxLCBSZWFsVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKyAgICAvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscworICAgIGluaXRFRW51bShtZWFzdXJlRUVudW0sIE1lYXN1cmUuY2xhc3MsICJNZWFzdXJlIik7CisgICAgYWRkRUVudW1MaXRlcmFsKG1lYXN1cmVFRW51bSwgTWVhc3VyZS5DT1VOVCk7CisgICAgYWRkRUVudW1MaXRlcmFsKG1lYXN1cmVFRW51bSwgTWVhc3VyZS5BVkVSQUdFKTsKKyAgICBhZGRFRW51bUxpdGVyYWwobWVhc3VyZUVFbnVtLCBNZWFzdXJlLlNVTSk7CisgICAgYWRkRUVudW1MaXRlcmFsKG1lYXN1cmVFRW51bSwgTWVhc3VyZS5NSU5JTVVNKTsKKyAgICBhZGRFRW51bUxpdGVyYWwobWVhc3VyZUVFbnVtLCBNZWFzdXJlLk1BWElNVU0pOworCisgICAgLy8gQ3JlYXRlIHJlc291cmNlCisgICAgY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CisgIH0KKworfSAvL0FUZXN0UGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvYVRlc3QvaW1wbC9Db25zdHJhaW50SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hVGVzdC9pbXBsL0NvbnN0cmFpbnRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI5MTZmMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvYVRlc3QvaW1wbC9Db25zdHJhaW50SW1wbC5qYXZhCkBAIC0wLDAgKzEsNTM5IEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuQVRlc3RQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5Db25zdHJhaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5NZWFzdXJlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuTWluaW1hbEVPYmplY3RJbXBsOworCitpbXBvcnQgb3JnLm1ldGFhYm0uU0FnZW50OworaW1wb3J0IG9yZy5tZXRhYWJtLlNBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLm1ldGFhYm0uU1N0YXRlVmFsdWU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db25zdHJhaW50PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuaW1wbC5Db25zdHJhaW50SW1wbCNnZXRNZWFzdXJlIDxlbT5NZWFzdXJlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuaW1wbC5Db25zdHJhaW50SW1wbCNnZXRBZ2VudCA8ZW0+QWdlbnQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5pbXBsLkNvbnN0cmFpbnRJbXBsI2dldEF0dHJpYnV0ZSA8ZW0+QXR0cmlidXRlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuaW1wbC5Db25zdHJhaW50SW1wbCNnZXRRdWFsaWZpZXIgPGVtPlF1YWxpZmllcjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LmltcGwuQ29uc3RyYWludEltcGwjZ2V0TWluVmFsdWUgPGVtPk1pbiBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LmltcGwuQ29uc3RyYWludEltcGwjZ2V0TWF4VmFsdWUgPGVtPk1heCBWYWx1ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIENvbnN0cmFpbnRJbXBsIGV4dGVuZHMgTWluaW1hbEVPYmplY3RJbXBsLkNvbnRhaW5lciBpbXBsZW1lbnRzIENvbnN0cmFpbnQKK3sKKyAgLyoqCisgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZWFzdXJlKCkgPGVtPk1lYXN1cmU8L2VtPn0nIGF0dHJpYnV0ZS4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBzZWUgI2dldE1lYXN1cmUoKQorICAgKiBAZ2VuZXJhdGVkCisgICAqIEBvcmRlcmVkCisgICAqLworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE1lYXN1cmUgTUVBU1VSRV9FREVGQVVMVCA9IE1lYXN1cmUuQ09VTlQ7CisKKyAgLyoqCisgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lYXN1cmUoKSA8ZW0+TWVhc3VyZTwvZW0+fScgYXR0cmlidXRlLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHNlZSAjZ2V0TWVhc3VyZSgpCisgICAqIEBnZW5lcmF0ZWQKKyAgICogQG9yZGVyZWQKKyAgICovCisgIHByb3RlY3RlZCBNZWFzdXJlIG1lYXN1cmUgPSBNRUFTVVJFX0VERUZBVUxUOworCisgIC8qKgorICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZ2VudCgpIDxlbT5BZ2VudDwvZW0+fScgcmVmZXJlbmNlLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHNlZSAjZ2V0QWdlbnQoKQorICAgKiBAZ2VuZXJhdGVkCisgICAqIEBvcmRlcmVkCisgICAqLworICBwcm90ZWN0ZWQgU0FnZW50IGFnZW50OworCisgIC8qKgorICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGUoKSA8ZW0+QXR0cmlidXRlPC9lbT59JyByZWZlcmVuY2UuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAc2VlICNnZXRBdHRyaWJ1dGUoKQorICAgKiBAZ2VuZXJhdGVkCisgICAqIEBvcmRlcmVkCisgICAqLworICBwcm90ZWN0ZWQgU0F0dHJpYnV0ZSBhdHRyaWJ1dGU7CisKKyAgLyoqCisgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFF1YWxpZmllcigpIDxlbT5RdWFsaWZpZXI8L2VtPn0nIHJlZmVyZW5jZS4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBzZWUgI2dldFF1YWxpZmllcigpCisgICAqIEBnZW5lcmF0ZWQKKyAgICogQG9yZGVyZWQKKyAgICovCisgIHByb3RlY3RlZCBTU3RhdGVWYWx1ZSBxdWFsaWZpZXI7CisKKyAgLyoqCisgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pblZhbHVlKCkgPGVtPk1pbiBWYWx1ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHNlZSAjZ2V0TWluVmFsdWUoKQorICAgKiBAZ2VuZXJhdGVkCisgICAqIEBvcmRlcmVkCisgICAqLworICBwcm90ZWN0ZWQgRU9iamVjdCBtaW5WYWx1ZTsKKworICAvKioKKyAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWF4VmFsdWUoKSA8ZW0+TWF4IFZhbHVlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAc2VlICNnZXRNYXhWYWx1ZSgpCisgICAqIEBnZW5lcmF0ZWQKKyAgICogQG9yZGVyZWQKKyAgICovCisgIHByb3RlY3RlZCBFT2JqZWN0IG1heFZhbHVlOworCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHJvdGVjdGVkIENvbnN0cmFpbnRJbXBsKCkKKyAgeworICAgIHN1cGVyKCk7CisgIH0KKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisgIHsKKyAgICByZXR1cm4gQVRlc3RQYWNrYWdlLkxpdGVyYWxzLkNPTlNUUkFJTlQ7CisgIH0KKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHB1YmxpYyBNZWFzdXJlIGdldE1lYXN1cmUoKQorICB7CisgICAgcmV0dXJuIG1lYXN1cmU7CisgIH0KKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldE1lYXN1cmUoTWVhc3VyZSBuZXdNZWFzdXJlKQorICB7CisgICAgTWVhc3VyZSBvbGRNZWFzdXJlID0gbWVhc3VyZTsKKyAgICBtZWFzdXJlID0gbmV3TWVhc3VyZSA9PSBudWxsID8gTUVBU1VSRV9FREVGQVVMVCA6IG5ld01lYXN1cmU7CisgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQVRlc3RQYWNrYWdlLkNPTlNUUkFJTlRfX01FQVNVUkUsIG9sZE1lYXN1cmUsIG1lYXN1cmUpKTsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIFNBZ2VudCBnZXRBZ2VudCgpCisgIHsKKyAgICBpZiAoYWdlbnQgIT0gbnVsbCAmJiBhZ2VudC5lSXNQcm94eSgpKQorICAgIHsKKyAgICAgIEludGVybmFsRU9iamVjdCBvbGRBZ2VudCA9IChJbnRlcm5hbEVPYmplY3QpYWdlbnQ7CisgICAgICBhZ2VudCA9IChTQWdlbnQpZVJlc29sdmVQcm94eShvbGRBZ2VudCk7CisgICAgICBpZiAoYWdlbnQgIT0gb2xkQWdlbnQpCisgICAgICB7CisgICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKyAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQVRlc3RQYWNrYWdlLkNPTlNUUkFJTlRfX0FHRU5ULCBvbGRBZ2VudCwgYWdlbnQpKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGFnZW50OworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBwdWJsaWMgU0FnZW50IGJhc2ljR2V0QWdlbnQoKQorICB7CisgICAgcmV0dXJuIGFnZW50OworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRBZ2VudChTQWdlbnQgbmV3QWdlbnQpCisgIHsKKyAgICBTQWdlbnQgb2xkQWdlbnQgPSBhZ2VudDsKKyAgICBhZ2VudCA9IG5ld0FnZW50OworICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKyAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEFUZXN0UGFja2FnZS5DT05TVFJBSU5UX19BR0VOVCwgb2xkQWdlbnQsIGFnZW50KSk7CisgIH0KKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHB1YmxpYyBTQXR0cmlidXRlIGdldEF0dHJpYnV0ZSgpCisgIHsKKyAgICBpZiAoYXR0cmlidXRlICE9IG51bGwgJiYgYXR0cmlidXRlLmVJc1Byb3h5KCkpCisgICAgeworICAgICAgSW50ZXJuYWxFT2JqZWN0IG9sZEF0dHJpYnV0ZSA9IChJbnRlcm5hbEVPYmplY3QpYXR0cmlidXRlOworICAgICAgYXR0cmlidXRlID0gKFNBdHRyaWJ1dGUpZVJlc29sdmVQcm94eShvbGRBdHRyaWJ1dGUpOworICAgICAgaWYgKGF0dHJpYnV0ZSAhPSBvbGRBdHRyaWJ1dGUpCisgICAgICB7CisgICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKyAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQVRlc3RQYWNrYWdlLkNPTlNUUkFJTlRfX0FUVFJJQlVURSwgb2xkQXR0cmlidXRlLCBhdHRyaWJ1dGUpKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGF0dHJpYnV0ZTsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIFNBdHRyaWJ1dGUgYmFzaWNHZXRBdHRyaWJ1dGUoKQorICB7CisgICAgcmV0dXJuIGF0dHJpYnV0ZTsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFNBdHRyaWJ1dGUgbmV3QXR0cmlidXRlKQorICB7CisgICAgU0F0dHJpYnV0ZSBvbGRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7CisgICAgYXR0cmlidXRlID0gbmV3QXR0cmlidXRlOworICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKyAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEFUZXN0UGFja2FnZS5DT05TVFJBSU5UX19BVFRSSUJVVEUsIG9sZEF0dHJpYnV0ZSwgYXR0cmlidXRlKSk7CisgIH0KKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHB1YmxpYyBTU3RhdGVWYWx1ZSBnZXRRdWFsaWZpZXIoKQorICB7CisgICAgaWYgKHF1YWxpZmllciAhPSBudWxsICYmIHF1YWxpZmllci5lSXNQcm94eSgpKQorICAgIHsKKyAgICAgIEludGVybmFsRU9iamVjdCBvbGRRdWFsaWZpZXIgPSAoSW50ZXJuYWxFT2JqZWN0KXF1YWxpZmllcjsKKyAgICAgIHF1YWxpZmllciA9IChTU3RhdGVWYWx1ZSllUmVzb2x2ZVByb3h5KG9sZFF1YWxpZmllcik7CisgICAgICBpZiAocXVhbGlmaWVyICE9IG9sZFF1YWxpZmllcikKKyAgICAgIHsKKyAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBBVGVzdFBhY2thZ2UuQ09OU1RSQUlOVF9fUVVBTElGSUVSLCBvbGRRdWFsaWZpZXIsIHF1YWxpZmllcikpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcXVhbGlmaWVyOworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBwdWJsaWMgU1N0YXRlVmFsdWUgYmFzaWNHZXRRdWFsaWZpZXIoKQorICB7CisgICAgcmV0dXJuIHF1YWxpZmllcjsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0UXVhbGlmaWVyKFNTdGF0ZVZhbHVlIG5ld1F1YWxpZmllcikKKyAgeworICAgIFNTdGF0ZVZhbHVlIG9sZFF1YWxpZmllciA9IHF1YWxpZmllcjsKKyAgICBxdWFsaWZpZXIgPSBuZXdRdWFsaWZpZXI7CisgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQVRlc3RQYWNrYWdlLkNPTlNUUkFJTlRfX1FVQUxJRklFUiwgb2xkUXVhbGlmaWVyLCBxdWFsaWZpZXIpKTsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIEVPYmplY3QgZ2V0TWluVmFsdWUoKQorICB7CisgICAgcmV0dXJuIG1pblZhbHVlOworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRNaW5WYWx1ZShFT2JqZWN0IG5ld01pblZhbHVlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorICB7CisgICAgRU9iamVjdCBvbGRNaW5WYWx1ZSA9IG1pblZhbHVlOworICAgIG1pblZhbHVlID0gbmV3TWluVmFsdWU7CisgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorICAgIHsKKyAgICAgIEVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBVGVzdFBhY2thZ2UuQ09OU1RSQUlOVF9fTUlOX1ZBTFVFLCBvbGRNaW5WYWx1ZSwgbmV3TWluVmFsdWUpOworICAgICAgaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworICAgIH0KKyAgICByZXR1cm4gbXNnczsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0TWluVmFsdWUoRU9iamVjdCBuZXdNaW5WYWx1ZSkKKyAgeworICAgIGlmIChuZXdNaW5WYWx1ZSAhPSBtaW5WYWx1ZSkKKyAgICB7CisgICAgICBOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKyAgICAgIGlmIChtaW5WYWx1ZSAhPSBudWxsKQorICAgICAgICBtc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbWluVmFsdWUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBBVGVzdFBhY2thZ2UuQ09OU1RSQUlOVF9fTUlOX1ZBTFVFLCBudWxsLCBtc2dzKTsKKyAgICAgIGlmIChuZXdNaW5WYWx1ZSAhPSBudWxsKQorICAgICAgICBtc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3TWluVmFsdWUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBBVGVzdFBhY2thZ2UuQ09OU1RSQUlOVF9fTUlOX1ZBTFVFLCBudWxsLCBtc2dzKTsKKyAgICAgIG1zZ3MgPSBiYXNpY1NldE1pblZhbHVlKG5ld01pblZhbHVlLCBtc2dzKTsKKyAgICAgIGlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKyAgICB9CisgICAgZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBVGVzdFBhY2thZ2UuQ09OU1RSQUlOVF9fTUlOX1ZBTFVFLCBuZXdNaW5WYWx1ZSwgbmV3TWluVmFsdWUpKTsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIEVPYmplY3QgZ2V0TWF4VmFsdWUoKQorICB7CisgICAgcmV0dXJuIG1heFZhbHVlOworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRNYXhWYWx1ZShFT2JqZWN0IG5ld01heFZhbHVlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorICB7CisgICAgRU9iamVjdCBvbGRNYXhWYWx1ZSA9IG1heFZhbHVlOworICAgIG1heFZhbHVlID0gbmV3TWF4VmFsdWU7CisgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorICAgIHsKKyAgICAgIEVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBVGVzdFBhY2thZ2UuQ09OU1RSQUlOVF9fTUFYX1ZBTFVFLCBvbGRNYXhWYWx1ZSwgbmV3TWF4VmFsdWUpOworICAgICAgaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworICAgIH0KKyAgICByZXR1cm4gbXNnczsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0TWF4VmFsdWUoRU9iamVjdCBuZXdNYXhWYWx1ZSkKKyAgeworICAgIGlmIChuZXdNYXhWYWx1ZSAhPSBtYXhWYWx1ZSkKKyAgICB7CisgICAgICBOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKyAgICAgIGlmIChtYXhWYWx1ZSAhPSBudWxsKQorICAgICAgICBtc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbWF4VmFsdWUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBBVGVzdFBhY2thZ2UuQ09OU1RSQUlOVF9fTUFYX1ZBTFVFLCBudWxsLCBtc2dzKTsKKyAgICAgIGlmIChuZXdNYXhWYWx1ZSAhPSBudWxsKQorICAgICAgICBtc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3TWF4VmFsdWUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBBVGVzdFBhY2thZ2UuQ09OU1RSQUlOVF9fTUFYX1ZBTFVFLCBudWxsLCBtc2dzKTsKKyAgICAgIG1zZ3MgPSBiYXNpY1NldE1heFZhbHVlKG5ld01heFZhbHVlLCBtc2dzKTsKKyAgICAgIGlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKyAgICB9CisgICAgZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBVGVzdFBhY2thZ2UuQ09OU1RSQUlOVF9fTUFYX1ZBTFVFLCBuZXdNYXhWYWx1ZSwgbmV3TWF4VmFsdWUpKTsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisgIHsKKyAgICBzd2l0Y2ggKGZlYXR1cmVJRCkKKyAgICB7CisgICAgICBjYXNlIEFUZXN0UGFja2FnZS5DT05TVFJBSU5UX19NSU5fVkFMVUU6CisgICAgICAgIHJldHVybiBiYXNpY1NldE1pblZhbHVlKG51bGwsIG1zZ3MpOworICAgICAgY2FzZSBBVGVzdFBhY2thZ2UuQ09OU1RSQUlOVF9fTUFYX1ZBTFVFOgorICAgICAgICByZXR1cm4gYmFzaWNTZXRNYXhWYWx1ZShudWxsLCBtc2dzKTsKKyAgICB9CisgICAgcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKyAgeworICAgIHN3aXRjaCAoZmVhdHVyZUlEKQorICAgIHsKKyAgICAgIGNhc2UgQVRlc3RQYWNrYWdlLkNPTlNUUkFJTlRfX01FQVNVUkU6CisgICAgICAgIHJldHVybiBnZXRNZWFzdXJlKCk7CisgICAgICBjYXNlIEFUZXN0UGFja2FnZS5DT05TVFJBSU5UX19BR0VOVDoKKyAgICAgICAgaWYgKHJlc29sdmUpIHJldHVybiBnZXRBZ2VudCgpOworICAgICAgICByZXR1cm4gYmFzaWNHZXRBZ2VudCgpOworICAgICAgY2FzZSBBVGVzdFBhY2thZ2UuQ09OU1RSQUlOVF9fQVRUUklCVVRFOgorICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEF0dHJpYnV0ZSgpOworICAgICAgICByZXR1cm4gYmFzaWNHZXRBdHRyaWJ1dGUoKTsKKyAgICAgIGNhc2UgQVRlc3RQYWNrYWdlLkNPTlNUUkFJTlRfX1FVQUxJRklFUjoKKyAgICAgICAgaWYgKHJlc29sdmUpIHJldHVybiBnZXRRdWFsaWZpZXIoKTsKKyAgICAgICAgcmV0dXJuIGJhc2ljR2V0UXVhbGlmaWVyKCk7CisgICAgICBjYXNlIEFUZXN0UGFja2FnZS5DT05TVFJBSU5UX19NSU5fVkFMVUU6CisgICAgICAgIHJldHVybiBnZXRNaW5WYWx1ZSgpOworICAgICAgY2FzZSBBVGVzdFBhY2thZ2UuQ09OU1RSQUlOVF9fTUFYX1ZBTFVFOgorICAgICAgICByZXR1cm4gZ2V0TWF4VmFsdWUoKTsKKyAgICB9CisgICAgcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisgIH0KKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKKyAgeworICAgIHN3aXRjaCAoZmVhdHVyZUlEKQorICAgIHsKKyAgICAgIGNhc2UgQVRlc3RQYWNrYWdlLkNPTlNUUkFJTlRfX01FQVNVUkU6CisgICAgICAgIHNldE1lYXN1cmUoKE1lYXN1cmUpbmV3VmFsdWUpOworICAgICAgICByZXR1cm47CisgICAgICBjYXNlIEFUZXN0UGFja2FnZS5DT05TVFJBSU5UX19BR0VOVDoKKyAgICAgICAgc2V0QWdlbnQoKFNBZ2VudCluZXdWYWx1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIGNhc2UgQVRlc3RQYWNrYWdlLkNPTlNUUkFJTlRfX0FUVFJJQlVURToKKyAgICAgICAgc2V0QXR0cmlidXRlKChTQXR0cmlidXRlKW5ld1ZhbHVlKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgY2FzZSBBVGVzdFBhY2thZ2UuQ09OU1RSQUlOVF9fUVVBTElGSUVSOgorICAgICAgICBzZXRRdWFsaWZpZXIoKFNTdGF0ZVZhbHVlKW5ld1ZhbHVlKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgY2FzZSBBVGVzdFBhY2thZ2UuQ09OU1RSQUlOVF9fTUlOX1ZBTFVFOgorICAgICAgICBzZXRNaW5WYWx1ZSgoRU9iamVjdCluZXdWYWx1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIGNhc2UgQVRlc3RQYWNrYWdlLkNPTlNUUkFJTlRfX01BWF9WQUxVRToKKyAgICAgICAgc2V0TWF4VmFsdWUoKEVPYmplY3QpbmV3VmFsdWUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisgIH0KKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKKyAgeworICAgIHN3aXRjaCAoZmVhdHVyZUlEKQorICAgIHsKKyAgICAgIGNhc2UgQVRlc3RQYWNrYWdlLkNPTlNUUkFJTlRfX01FQVNVUkU6CisgICAgICAgIHNldE1lYXN1cmUoTUVBU1VSRV9FREVGQVVMVCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIGNhc2UgQVRlc3RQYWNrYWdlLkNPTlNUUkFJTlRfX0FHRU5UOgorICAgICAgICBzZXRBZ2VudCgoU0FnZW50KW51bGwpOworICAgICAgICByZXR1cm47CisgICAgICBjYXNlIEFUZXN0UGFja2FnZS5DT05TVFJBSU5UX19BVFRSSUJVVEU6CisgICAgICAgIHNldEF0dHJpYnV0ZSgoU0F0dHJpYnV0ZSludWxsKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgY2FzZSBBVGVzdFBhY2thZ2UuQ09OU1RSQUlOVF9fUVVBTElGSUVSOgorICAgICAgICBzZXRRdWFsaWZpZXIoKFNTdGF0ZVZhbHVlKW51bGwpOworICAgICAgICByZXR1cm47CisgICAgICBjYXNlIEFUZXN0UGFja2FnZS5DT05TVFJBSU5UX19NSU5fVkFMVUU6CisgICAgICAgIHNldE1pblZhbHVlKChFT2JqZWN0KW51bGwpOworICAgICAgICByZXR1cm47CisgICAgICBjYXNlIEFUZXN0UGFja2FnZS5DT05TVFJBSU5UX19NQVhfVkFMVUU6CisgICAgICAgIHNldE1heFZhbHVlKChFT2JqZWN0KW51bGwpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCisgIHsKKyAgICBzd2l0Y2ggKGZlYXR1cmVJRCkKKyAgICB7CisgICAgICBjYXNlIEFUZXN0UGFja2FnZS5DT05TVFJBSU5UX19NRUFTVVJFOgorICAgICAgICByZXR1cm4gbWVhc3VyZSAhPSBNRUFTVVJFX0VERUZBVUxUOworICAgICAgY2FzZSBBVGVzdFBhY2thZ2UuQ09OU1RSQUlOVF9fQUdFTlQ6CisgICAgICAgIHJldHVybiBhZ2VudCAhPSBudWxsOworICAgICAgY2FzZSBBVGVzdFBhY2thZ2UuQ09OU1RSQUlOVF9fQVRUUklCVVRFOgorICAgICAgICByZXR1cm4gYXR0cmlidXRlICE9IG51bGw7CisgICAgICBjYXNlIEFUZXN0UGFja2FnZS5DT05TVFJBSU5UX19RVUFMSUZJRVI6CisgICAgICAgIHJldHVybiBxdWFsaWZpZXIgIT0gbnVsbDsKKyAgICAgIGNhc2UgQVRlc3RQYWNrYWdlLkNPTlNUUkFJTlRfX01JTl9WQUxVRToKKyAgICAgICAgcmV0dXJuIG1pblZhbHVlICE9IG51bGw7CisgICAgICBjYXNlIEFUZXN0UGFja2FnZS5DT05TVFJBSU5UX19NQVhfVkFMVUU6CisgICAgICAgIHJldHVybiBtYXhWYWx1ZSAhPSBudWxsOworICAgIH0KKyAgICByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisgIH0KKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgeworICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworICAgIHJlc3VsdC5hcHBlbmQoIiAobWVhc3VyZTogIik7CisgICAgcmVzdWx0LmFwcGVuZChtZWFzdXJlKTsKKyAgICByZXN1bHQuYXBwZW5kKCcpJyk7CisgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICB9CisKK30gLy9Db25zdHJhaW50SW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hVGVzdC9pbXBsL0ludFZhbHVlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hVGVzdC9pbXBsL0ludFZhbHVlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NWZjYmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL2FUZXN0L2ltcGwvSW50VmFsdWVJbXBsLmphdmEKQEAgLTAsMCArMSwxODAgQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5BVGVzdFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkludFZhbHVlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLk1pbmltYWxFT2JqZWN0SW1wbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkludCBWYWx1ZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LmltcGwuSW50VmFsdWVJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEludFZhbHVlSW1wbCBleHRlbmRzIE1pbmltYWxFT2JqZWN0SW1wbC5Db250YWluZXIgaW1wbGVtZW50cyBJbnRWYWx1ZQoreworICAvKioKKyAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAc2VlICNnZXRWYWx1ZSgpCisgICAqIEBnZW5lcmF0ZWQKKyAgICogQG9yZGVyZWQKKyAgICovCisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFZBTFVFX0VERUZBVUxUID0gMDsKKworICAvKioKKyAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBzZWUgI2dldFZhbHVlKCkKKyAgICogQGdlbmVyYXRlZAorICAgKiBAb3JkZXJlZAorICAgKi8KKyAgcHJvdGVjdGVkIGludCB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOworCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHJvdGVjdGVkIEludFZhbHVlSW1wbCgpCisgIHsKKyAgICBzdXBlcigpOworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQorICB7CisgICAgcmV0dXJuIEFUZXN0UGFja2FnZS5MaXRlcmFscy5JTlRfVkFMVUU7CisgIH0KKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0VmFsdWUoKQorICB7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShpbnQgbmV3VmFsdWUpCisgIHsKKyAgICBpbnQgb2xkVmFsdWUgPSB2YWx1ZTsKKyAgICB2YWx1ZSA9IG5ld1ZhbHVlOworICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKyAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEFUZXN0UGFja2FnZS5JTlRfVkFMVUVfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCisgIHsKKyAgICBzd2l0Y2ggKGZlYXR1cmVJRCkKKyAgICB7CisgICAgICBjYXNlIEFUZXN0UGFja2FnZS5JTlRfVkFMVUVfX1ZBTFVFOgorICAgICAgICByZXR1cm4gZ2V0VmFsdWUoKTsKKyAgICB9CisgICAgcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisgIH0KKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKKyAgeworICAgIHN3aXRjaCAoZmVhdHVyZUlEKQorICAgIHsKKyAgICAgIGNhc2UgQVRlc3RQYWNrYWdlLklOVF9WQUxVRV9fVkFMVUU6CisgICAgICAgIHNldFZhbHVlKChJbnRlZ2VyKW5ld1ZhbHVlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCisgIHsKKyAgICBzd2l0Y2ggKGZlYXR1cmVJRCkKKyAgICB7CisgICAgICBjYXNlIEFUZXN0UGFja2FnZS5JTlRfVkFMVUVfX1ZBTFVFOgorICAgICAgICBzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisgIH0KKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKKyAgeworICAgIHN3aXRjaCAoZmVhdHVyZUlEKQorICAgIHsKKyAgICAgIGNhc2UgQVRlc3RQYWNrYWdlLklOVF9WQUxVRV9fVkFMVUU6CisgICAgICAgIHJldHVybiB2YWx1ZSAhPSBWQUxVRV9FREVGQVVMVDsKKyAgICB9CisgICAgcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgIHsKKyAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKyAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKyAgICByZXN1bHQuYXBwZW5kKCIgKHZhbHVlOiAiKTsKKyAgICByZXN1bHQuYXBwZW5kKHZhbHVlKTsKKyAgICByZXN1bHQuYXBwZW5kKCcpJyk7CisgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICB9CisKK30gLy9JbnRWYWx1ZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvYVRlc3QvaW1wbC9Nb2RlbEltcGwuamF2YSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvYVRlc3QvaW1wbC9Nb2RlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmQ2ZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hVGVzdC9pbXBsL01vZGVsSW1wbC5qYXZhCkBAIC0wLDAgKzEsMzcxIEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5BVGVzdFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkNvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0Lk1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5UZXN0czsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLk1pbmltYWxFT2JqZWN0SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Nb2RlbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LmltcGwuTW9kZWxJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5pbXBsLk1vZGVsSW1wbCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5pbXBsLk1vZGVsSW1wbCNnZXRUZXN0cyA8ZW0+VGVzdHM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5pbXBsLk1vZGVsSW1wbCNnZXRDb250cmFpbnRzIDxlbT5Db250cmFpbnRzPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTW9kZWxJbXBsIGV4dGVuZHMgTWluaW1hbEVPYmplY3RJbXBsLkNvbnRhaW5lciBpbXBsZW1lbnRzIE1vZGVsCit7CisgIC8qKgorICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAc2VlICNnZXROYW1lKCkKKyAgICogQGdlbmVyYXRlZAorICAgKiBAb3JkZXJlZAorICAgKi8KKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7CisKKyAgLyoqCisgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHNlZSAjZ2V0TmFtZSgpCisgICAqIEBnZW5lcmF0ZWQKKyAgICogQG9yZGVyZWQKKyAgICovCisgIHByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7CisKKyAgLyoqCisgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQorICAgKiBAZ2VuZXJhdGVkCisgICAqIEBvcmRlcmVkCisgICAqLworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7CisKKyAgLyoqCisgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCisgICAqIEBnZW5lcmF0ZWQKKyAgICogQG9yZGVyZWQKKyAgICovCisgIHByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKKworICAvKioKKyAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGVzdHMoKSA8ZW0+VGVzdHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBzZWUgI2dldFRlc3RzKCkKKyAgICogQGdlbmVyYXRlZAorICAgKiBAb3JkZXJlZAorICAgKi8KKyAgcHJvdGVjdGVkIFRlc3RzIHRlc3RzOworCisgIC8qKgorICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb250cmFpbnRzKCkgPGVtPkNvbnRyYWludHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHNlZSAjZ2V0Q29udHJhaW50cygpCisgICAqIEBnZW5lcmF0ZWQKKyAgICogQG9yZGVyZWQKKyAgICovCisgIHByb3RlY3RlZCBFTGlzdDxDb25zdHJhaW50PiBjb250cmFpbnRzOworCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHJvdGVjdGVkIE1vZGVsSW1wbCgpCisgIHsKKyAgICBzdXBlcigpOworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQorICB7CisgICAgcmV0dXJuIEFUZXN0UGFja2FnZS5MaXRlcmFscy5NT0RFTDsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKKyAgeworICAgIHJldHVybiBuYW1lOworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQorICB7CisgICAgU3RyaW5nIG9sZE5hbWUgPSBuYW1lOworICAgIG5hbWUgPSBuZXdOYW1lOworICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKyAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEFUZXN0UGFja2FnZS5NT0RFTF9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKKyAgeworICAgIHJldHVybiBkZXNjcmlwdGlvbjsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKQorICB7CisgICAgU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgICAgZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKKyAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBVGVzdFBhY2thZ2UuTU9ERUxfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIFRlc3RzIGdldFRlc3RzKCkKKyAgeworICAgIHJldHVybiB0ZXN0czsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VGVzdHMoVGVzdHMgbmV3VGVzdHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisgIHsKKyAgICBUZXN0cyBvbGRUZXN0cyA9IHRlc3RzOworICAgIHRlc3RzID0gbmV3VGVzdHM7CisgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorICAgIHsKKyAgICAgIEVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBVGVzdFBhY2thZ2UuTU9ERUxfX1RFU1RTLCBvbGRUZXN0cywgbmV3VGVzdHMpOworICAgICAgaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworICAgIH0KKyAgICByZXR1cm4gbXNnczsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0VGVzdHMoVGVzdHMgbmV3VGVzdHMpCisgIHsKKyAgICBpZiAobmV3VGVzdHMgIT0gdGVzdHMpCisgICAgeworICAgICAgTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisgICAgICBpZiAodGVzdHMgIT0gbnVsbCkKKyAgICAgICAgbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXRlc3RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gQVRlc3RQYWNrYWdlLk1PREVMX19URVNUUywgbnVsbCwgbXNncyk7CisgICAgICBpZiAobmV3VGVzdHMgIT0gbnVsbCkKKyAgICAgICAgbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Rlc3RzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gQVRlc3RQYWNrYWdlLk1PREVMX19URVNUUywgbnVsbCwgbXNncyk7CisgICAgICBtc2dzID0gYmFzaWNTZXRUZXN0cyhuZXdUZXN0cywgbXNncyk7CisgICAgICBpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisgICAgfQorICAgIGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQVRlc3RQYWNrYWdlLk1PREVMX19URVNUUywgbmV3VGVzdHMsIG5ld1Rlc3RzKSk7CisgIH0KKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHB1YmxpYyBFTGlzdDxDb25zdHJhaW50PiBnZXRDb250cmFpbnRzKCkKKyAgeworICAgIGlmIChjb250cmFpbnRzID09IG51bGwpCisgICAgeworICAgICAgY29udHJhaW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxDb25zdHJhaW50PihDb25zdHJhaW50LmNsYXNzLCB0aGlzLCBBVGVzdFBhY2thZ2UuTU9ERUxfX0NPTlRSQUlOVFMpOworICAgIH0KKyAgICByZXR1cm4gY29udHJhaW50czsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCisgIHsKKyAgICBzd2l0Y2ggKGZlYXR1cmVJRCkKKyAgICB7CisgICAgICBjYXNlIEFUZXN0UGFja2FnZS5NT0RFTF9fVEVTVFM6CisgICAgICAgIHJldHVybiBiYXNpY1NldFRlc3RzKG51bGwsIG1zZ3MpOworICAgICAgY2FzZSBBVGVzdFBhY2thZ2UuTU9ERUxfX0NPTlRSQUlOVFM6CisgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Q29udHJhaW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisgICAgfQorICAgIHJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCisgIHsKKyAgICBzd2l0Y2ggKGZlYXR1cmVJRCkKKyAgICB7CisgICAgICBjYXNlIEFUZXN0UGFja2FnZS5NT0RFTF9fTkFNRToKKyAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKKyAgICAgIGNhc2UgQVRlc3RQYWNrYWdlLk1PREVMX19ERVNDUklQVElPTjoKKyAgICAgICAgcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7CisgICAgICBjYXNlIEFUZXN0UGFja2FnZS5NT0RFTF9fVEVTVFM6CisgICAgICAgIHJldHVybiBnZXRUZXN0cygpOworICAgICAgY2FzZSBBVGVzdFBhY2thZ2UuTU9ERUxfX0NPTlRSQUlOVFM6CisgICAgICAgIHJldHVybiBnZXRDb250cmFpbnRzKCk7CisgICAgfQorICAgIHJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQorICB7CisgICAgc3dpdGNoIChmZWF0dXJlSUQpCisgICAgeworICAgICAgY2FzZSBBVGVzdFBhY2thZ2UuTU9ERUxfX05BTUU6CisgICAgICAgIHNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIGNhc2UgQVRlc3RQYWNrYWdlLk1PREVMX19ERVNDUklQVElPTjoKKyAgICAgICAgc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIGNhc2UgQVRlc3RQYWNrYWdlLk1PREVMX19URVNUUzoKKyAgICAgICAgc2V0VGVzdHMoKFRlc3RzKW5ld1ZhbHVlKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgY2FzZSBBVGVzdFBhY2thZ2UuTU9ERUxfX0NPTlRSQUlOVFM6CisgICAgICAgIGdldENvbnRyYWludHMoKS5jbGVhcigpOworICAgICAgICBnZXRDb250cmFpbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDb25zdHJhaW50PiluZXdWYWx1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQorICB7CisgICAgc3dpdGNoIChmZWF0dXJlSUQpCisgICAgeworICAgICAgY2FzZSBBVGVzdFBhY2thZ2UuTU9ERUxfX05BTUU6CisgICAgICAgIHNldE5hbWUoTkFNRV9FREVGQVVMVCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIGNhc2UgQVRlc3RQYWNrYWdlLk1PREVMX19ERVNDUklQVElPTjoKKyAgICAgICAgc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOworICAgICAgICByZXR1cm47CisgICAgICBjYXNlIEFUZXN0UGFja2FnZS5NT0RFTF9fVEVTVFM6CisgICAgICAgIHNldFRlc3RzKChUZXN0cyludWxsKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgY2FzZSBBVGVzdFBhY2thZ2UuTU9ERUxfX0NPTlRSQUlOVFM6CisgICAgICAgIGdldENvbnRyYWludHMoKS5jbGVhcigpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCisgIHsKKyAgICBzd2l0Y2ggKGZlYXR1cmVJRCkKKyAgICB7CisgICAgICBjYXNlIEFUZXN0UGFja2FnZS5NT0RFTF9fTkFNRToKKyAgICAgICAgcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKKyAgICAgIGNhc2UgQVRlc3RQYWNrYWdlLk1PREVMX19ERVNDUklQVElPTjoKKyAgICAgICAgcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7CisgICAgICBjYXNlIEFUZXN0UGFja2FnZS5NT0RFTF9fVEVTVFM6CisgICAgICAgIHJldHVybiB0ZXN0cyAhPSBudWxsOworICAgICAgY2FzZSBBVGVzdFBhY2thZ2UuTU9ERUxfX0NPTlRSQUlOVFM6CisgICAgICAgIHJldHVybiBjb250cmFpbnRzICE9IG51bGwgJiYgIWNvbnRyYWludHMuaXNFbXB0eSgpOworICAgIH0KKyAgICByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisgIH0KKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgeworICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworICAgIHJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7CisgICAgcmVzdWx0LmFwcGVuZChuYW1lKTsKKyAgICByZXN1bHQuYXBwZW5kKCIsIGRlc2NyaXB0aW9uOiAiKTsKKyAgICByZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKKyAgICByZXN1bHQuYXBwZW5kKCcpJyk7CisgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICB9CisKK30gLy9Nb2RlbEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvYVRlc3QvaW1wbC9SZWFsVmFsdWVJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL2FUZXN0L2ltcGwvUmVhbFZhbHVlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwOGVhMDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL2FUZXN0L2ltcGwvUmVhbFZhbHVlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTgwIEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuQVRlc3RQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5SZWFsVmFsdWU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuTWluaW1hbEVPYmplY3RJbXBsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVhbCBWYWx1ZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LmltcGwuUmVhbFZhbHVlSW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBSZWFsVmFsdWVJbXBsIGV4dGVuZHMgTWluaW1hbEVPYmplY3RJbXBsLkNvbnRhaW5lciBpbXBsZW1lbnRzIFJlYWxWYWx1ZQoreworICAvKioKKyAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAc2VlICNnZXRWYWx1ZSgpCisgICAqIEBnZW5lcmF0ZWQKKyAgICogQG9yZGVyZWQKKyAgICovCisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gbnVsbDsKKworICAvKioKKyAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBzZWUgI2dldFZhbHVlKCkKKyAgICogQGdlbmVyYXRlZAorICAgKiBAb3JkZXJlZAorICAgKi8KKyAgcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOworCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHJvdGVjdGVkIFJlYWxWYWx1ZUltcGwoKQorICB7CisgICAgc3VwZXIoKTsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKKyAgeworICAgIHJldHVybiBBVGVzdFBhY2thZ2UuTGl0ZXJhbHMuUkVBTF9WQUxVRTsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpCisgIHsKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkKKyAgeworICAgIFN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOworICAgIHZhbHVlID0gbmV3VmFsdWU7CisgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQVRlc3RQYWNrYWdlLlJFQUxfVkFMVUVfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCisgIHsKKyAgICBzd2l0Y2ggKGZlYXR1cmVJRCkKKyAgICB7CisgICAgICBjYXNlIEFUZXN0UGFja2FnZS5SRUFMX1ZBTFVFX19WQUxVRToKKyAgICAgICAgcmV0dXJuIGdldFZhbHVlKCk7CisgICAgfQorICAgIHJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisgIHsKKyAgICBzd2l0Y2ggKGZlYXR1cmVJRCkKKyAgICB7CisgICAgICBjYXNlIEFUZXN0UGFja2FnZS5SRUFMX1ZBTFVFX19WQUxVRToKKyAgICAgICAgc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQorICB7CisgICAgc3dpdGNoIChmZWF0dXJlSUQpCisgICAgeworICAgICAgY2FzZSBBVGVzdFBhY2thZ2UuUkVBTF9WQUxVRV9fVkFMVUU6CisgICAgICAgIHNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQorICB7CisgICAgc3dpdGNoIChmZWF0dXJlSUQpCisgICAgeworICAgICAgY2FzZSBBVGVzdFBhY2thZ2UuUkVBTF9WQUxVRV9fVkFMVUU6CisgICAgICAgIHJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisgIH0KKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgeworICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworICAgIHJlc3VsdC5hcHBlbmQoIiAodmFsdWU6ICIpOworICAgIHJlc3VsdC5hcHBlbmQodmFsdWUpOworICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKKyAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisgIH0KKworfSAvL1JlYWxWYWx1ZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvYVRlc3QvaW1wbC9UZXN0c0ltcGwuamF2YSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvYVRlc3QvaW1wbC9UZXN0c0ltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTFjNDkzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hVGVzdC9pbXBsL1Rlc3RzSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTgwIEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuQVRlc3RQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5UZXN0czsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5NaW5pbWFsRU9iamVjdEltcGw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZXN0czwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LmltcGwuVGVzdHNJbXBsI2dldEltcG9ydFVSSSA8ZW0+SW1wb3J0IFVSSTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFRlc3RzSW1wbCBleHRlbmRzIE1pbmltYWxFT2JqZWN0SW1wbC5Db250YWluZXIgaW1wbGVtZW50cyBUZXN0cworeworICAvKioKKyAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEltcG9ydFVSSSgpIDxlbT5JbXBvcnQgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAc2VlICNnZXRJbXBvcnRVUkkoKQorICAgKiBAZ2VuZXJhdGVkCisgICAqIEBvcmRlcmVkCisgICAqLworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfVVJJX0VERUZBVUxUID0gbnVsbDsKKworICAvKioKKyAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW1wb3J0VVJJKCkgPGVtPkltcG9ydCBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBzZWUgI2dldEltcG9ydFVSSSgpCisgICAqIEBnZW5lcmF0ZWQKKyAgICogQG9yZGVyZWQKKyAgICovCisgIHByb3RlY3RlZCBTdHJpbmcgaW1wb3J0VVJJID0gSU1QT1JUX1VSSV9FREVGQVVMVDsKKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHByb3RlY3RlZCBUZXN0c0ltcGwoKQorICB7CisgICAgc3VwZXIoKTsKKyAgfQorCisgIC8qKgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKKyAgeworICAgIHJldHVybiBBVGVzdFBhY2thZ2UuTGl0ZXJhbHMuVEVTVFM7CisgIH0KKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0SW1wb3J0VVJJKCkKKyAgeworICAgIHJldHVybiBpbXBvcnRVUkk7CisgIH0KKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldEltcG9ydFVSSShTdHJpbmcgbmV3SW1wb3J0VVJJKQorICB7CisgICAgU3RyaW5nIG9sZEltcG9ydFVSSSA9IGltcG9ydFVSSTsKKyAgICBpbXBvcnRVUkkgPSBuZXdJbXBvcnRVUkk7CisgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQVRlc3RQYWNrYWdlLlRFU1RTX19JTVBPUlRfVVJJLCBvbGRJbXBvcnRVUkksIGltcG9ydFVSSSkpOworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKyAgeworICAgIHN3aXRjaCAoZmVhdHVyZUlEKQorICAgIHsKKyAgICAgIGNhc2UgQVRlc3RQYWNrYWdlLlRFU1RTX19JTVBPUlRfVVJJOgorICAgICAgICByZXR1cm4gZ2V0SW1wb3J0VVJJKCk7CisgICAgfQorICAgIHJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisgIHsKKyAgICBzd2l0Y2ggKGZlYXR1cmVJRCkKKyAgICB7CisgICAgICBjYXNlIEFUZXN0UGFja2FnZS5URVNUU19fSU1QT1JUX1VSSToKKyAgICAgICAgc2V0SW1wb3J0VVJJKChTdHJpbmcpbmV3VmFsdWUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisgIH0KKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKKyAgeworICAgIHN3aXRjaCAoZmVhdHVyZUlEKQorICAgIHsKKyAgICAgIGNhc2UgQVRlc3RQYWNrYWdlLlRFU1RTX19JTVBPUlRfVVJJOgorICAgICAgICBzZXRJbXBvcnRVUkkoSU1QT1JUX1VSSV9FREVGQVVMVCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisgIH0KKworICAvKioKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKKyAgeworICAgIHN3aXRjaCAoZmVhdHVyZUlEKQorICAgIHsKKyAgICAgIGNhc2UgQVRlc3RQYWNrYWdlLlRFU1RTX19JTVBPUlRfVVJJOgorICAgICAgICByZXR1cm4gSU1QT1JUX1VSSV9FREVGQVVMVCA9PSBudWxsID8gaW1wb3J0VVJJICE9IG51bGwgOiAhSU1QT1JUX1VSSV9FREVGQVVMVC5lcXVhbHMoaW1wb3J0VVJJKTsKKyAgICB9CisgICAgcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworICB9CisKKyAgLyoqCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgIHsKKyAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKyAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKyAgICByZXN1bHQuYXBwZW5kKCIgKGltcG9ydFVSSTogIik7CisgICAgcmVzdWx0LmFwcGVuZChpbXBvcnRVUkkpOworICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKKyAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisgIH0KKworfSAvL1Rlc3RzSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hVGVzdC91dGlsL0FUZXN0QWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvYVRlc3QvdXRpbC9BVGVzdEFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVjZTg4YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvYVRlc3QvdXRpbC9BVGVzdEFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyMTUgQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QudXRpbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC4qOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCisgKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuQVRlc3RQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBBVGVzdEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsCit7CisgIC8qKgorICAgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBwcm90ZWN0ZWQgc3RhdGljIEFUZXN0UGFja2FnZSBtb2RlbFBhY2thZ2U7CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHB1YmxpYyBBVGVzdEFkYXB0ZXJGYWN0b3J5KCkKKyAgeworICAgIGlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkKKyAgICB7CisgICAgICBtb2RlbFBhY2thZ2UgPSBBVGVzdFBhY2thZ2UuZUlOU1RBTkNFOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCisgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpCisgIHsKKyAgICBpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkKKyAgICB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpCisgICAgeworICAgICAgcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvKioKKyAgICogVGhlIHN3aXRjaCB0aGF0IGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHJvdGVjdGVkIEFUZXN0U3dpdGNoPEFkYXB0ZXI+IG1vZGVsU3dpdGNoID0KKyAgICBuZXcgQVRlc3RTd2l0Y2g8QWRhcHRlcj4oKQorICAgIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIEFkYXB0ZXIgY2FzZU1vZGVsKE1vZGVsIG9iamVjdCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZU1vZGVsQWRhcHRlcigpOworICAgICAgfQorICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgQWRhcHRlciBjYXNlVGVzdHMoVGVzdHMgb2JqZWN0KQorICAgICAgeworICAgICAgICByZXR1cm4gY3JlYXRlVGVzdHNBZGFwdGVyKCk7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBBZGFwdGVyIGNhc2VDb25zdHJhaW50KENvbnN0cmFpbnQgb2JqZWN0KQorICAgICAgeworICAgICAgICByZXR1cm4gY3JlYXRlQ29uc3RyYWludEFkYXB0ZXIoKTsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIEFkYXB0ZXIgY2FzZUludFZhbHVlKEludFZhbHVlIG9iamVjdCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUludFZhbHVlQWRhcHRlcigpOworICAgICAgfQorICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgQWRhcHRlciBjYXNlUmVhbFZhbHVlKFJlYWxWYWx1ZSBvYmplY3QpCisgICAgICB7CisgICAgICAgIHJldHVybiBjcmVhdGVSZWFsVmFsdWVBZGFwdGVyKCk7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBBZGFwdGVyIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KQorICAgICAgeworICAgICAgICByZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKKyAgICAgIH0KKyAgICB9OworCisgIC8qKgorICAgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgorICAgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KQorICB7CisgICAgcmV0dXJuIG1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7CisgIH0KKworCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5Nb2RlbCA8ZW0+TW9kZWw8L2VtPn0nLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0Lk1vZGVsCisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1vZGVsQWRhcHRlcigpCisgIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5UZXN0cyA8ZW0+VGVzdHM8L2VtPn0nLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LlRlc3RzCisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlc3RzQWRhcHRlcigpCisgIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5Db25zdHJhaW50IDxlbT5Db25zdHJhaW50PC9lbT59Jy4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5Db25zdHJhaW50CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnN0cmFpbnRBZGFwdGVyKCkKKyAgeworICAgIHJldHVybiBudWxsOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkludFZhbHVlIDxlbT5JbnQgVmFsdWU8L2VtPn0nLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkludFZhbHVlCisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUludFZhbHVlQWRhcHRlcigpCisgIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5SZWFsVmFsdWUgPGVtPlJlYWwgVmFsdWU8L2VtPn0nLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LlJlYWxWYWx1ZQorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBwdWJsaWMgQWRhcHRlciBjcmVhdGVSZWFsVmFsdWVBZGFwdGVyKCkKKyAgeworICAgIHJldHVybiBudWxsOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpCisgIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCit9IC8vQVRlc3RBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hVGVzdC91dGlsL0FUZXN0U3dpdGNoLmphdmEgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL2FUZXN0L3V0aWwvQVRlc3RTd2l0Y2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGQzMGQzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hVGVzdC91dGlsL0FUZXN0U3dpdGNoLmphdmEKQEAgLTAsMCArMSwyMzMgQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0Lio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgorICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQorICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAorICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKKyAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKKyAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAorICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5BVGVzdFBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEFUZXN0U3dpdGNoPFQ+Cit7CisgIC8qKgorICAgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHByb3RlY3RlZCBzdGF0aWMgQVRlc3RQYWNrYWdlIG1vZGVsUGFja2FnZTsKKworICAvKioKKyAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIEFUZXN0U3dpdGNoKCkKKyAgeworICAgIGlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkKKyAgICB7CisgICAgICBtb2RlbFBhY2thZ2UgPSBBVGVzdFBhY2thZ2UuZUlOU1RBTkNFOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHB1YmxpYyBUIGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkKKyAgeworICAgIHJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKKyAgfQorCisgIC8qKgorICAgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHByb3RlY3RlZCBUIGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkKKyAgeworICAgIGlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkKKyAgICB7CisgICAgICByZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIExpc3Q8RUNsYXNzPiBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOworICAgICAgcmV0dXJuCisgICAgICAgIGVTdXBlclR5cGVzLmlzRW1wdHkoKSA/CisgICAgICAgICAgZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgorICAgICAgICAgIGRvU3dpdGNoKGVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHJvdGVjdGVkIFQgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KQorICB7CisgICAgc3dpdGNoIChjbGFzc2lmaWVySUQpCisgICAgeworICAgICAgY2FzZSBBVGVzdFBhY2thZ2UuTU9ERUw6CisgICAgICB7CisgICAgICAgIE1vZGVsIG1vZGVsID0gKE1vZGVsKXRoZUVPYmplY3Q7CisgICAgICAgIFQgcmVzdWx0ID0gY2FzZU1vZGVsKG1vZGVsKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAgICAgIGNhc2UgQVRlc3RQYWNrYWdlLlRFU1RTOgorICAgICAgeworICAgICAgICBUZXN0cyB0ZXN0cyA9IChUZXN0cyl0aGVFT2JqZWN0OworICAgICAgICBUIHJlc3VsdCA9IGNhc2VUZXN0cyh0ZXN0cyk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CisgICAgICBjYXNlIEFUZXN0UGFja2FnZS5DT05TVFJBSU5UOgorICAgICAgeworICAgICAgICBDb25zdHJhaW50IGNvbnN0cmFpbnQgPSAoQ29uc3RyYWludCl0aGVFT2JqZWN0OworICAgICAgICBUIHJlc3VsdCA9IGNhc2VDb25zdHJhaW50KGNvbnN0cmFpbnQpOworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfQorICAgICAgY2FzZSBBVGVzdFBhY2thZ2UuSU5UX1ZBTFVFOgorICAgICAgeworICAgICAgICBJbnRWYWx1ZSBpbnRWYWx1ZSA9IChJbnRWYWx1ZSl0aGVFT2JqZWN0OworICAgICAgICBUIHJlc3VsdCA9IGNhc2VJbnRWYWx1ZShpbnRWYWx1ZSk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CisgICAgICBjYXNlIEFUZXN0UGFja2FnZS5SRUFMX1ZBTFVFOgorICAgICAgeworICAgICAgICBSZWFsVmFsdWUgcmVhbFZhbHVlID0gKFJlYWxWYWx1ZSl0aGVFT2JqZWN0OworICAgICAgICBUIHJlc3VsdCA9IGNhc2VSZWFsVmFsdWUocmVhbFZhbHVlKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TW9kZWw8L2VtPicuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Nb2RlbDwvZW0+Jy4KKyAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisgICAqIEBnZW5lcmF0ZWQKKyAgICovCisgIHB1YmxpYyBUIGNhc2VNb2RlbChNb2RlbCBvYmplY3QpCisgIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZXN0czwvZW0+Jy4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRlc3RzPC9lbT4nLgorICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIFQgY2FzZVRlc3RzKFRlc3RzIG9iamVjdCkKKyAgeworICAgIHJldHVybiBudWxsOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnN0cmFpbnQ8L2VtPicuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25zdHJhaW50PC9lbT4nLgorICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKyAgICogQGdlbmVyYXRlZAorICAgKi8KKyAgcHVibGljIFQgY2FzZUNvbnN0cmFpbnQoQ29uc3RyYWludCBvYmplY3QpCisgIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbnQgVmFsdWU8L2VtPicuCisgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKyAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbnQgVmFsdWU8L2VtPicuCisgICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBwdWJsaWMgVCBjYXNlSW50VmFsdWUoSW50VmFsdWUgb2JqZWN0KQorICB7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVhbCBWYWx1ZTwvZW0+Jy4KKyAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlYWwgVmFsdWU8L2VtPicuCisgICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBwdWJsaWMgVCBjYXNlUmVhbFZhbHVlKFJlYWxWYWx1ZSBvYmplY3QpCisgIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgorICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKyAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgorICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCisgICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQorICAgKiBAZ2VuZXJhdGVkCisgICAqLworICBwdWJsaWMgVCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkKKyAgeworICAgIHJldHVybiBudWxsOworICB9CisKK30gLy9BVGVzdFN3aXRjaApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZVRyZWVDb25zdHJ1Y3Rpb24vQVRlc3RQYXJzZXRyZWVDb25zdHJ1Y3Rvci5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZVRyZWVDb25zdHJ1Y3Rpb24vQVRlc3RQYXJzZXRyZWVDb25zdHJ1Y3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZTYzMDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlVHJlZUNvbnN0cnVjdGlvbi9BVGVzdFBhcnNldHJlZUNvbnN0cnVjdG9yLmphdmEKQEAgLTAsMCArMSw4ODMgQEAKKy8qCisqIGdlbmVyYXRlZCBieSBYdGV4dAorKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLnBhcnNlVHJlZUNvbnN0cnVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2V0cmVlLnJlY29uc3RyLklJbnN0YW5jZURlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNldHJlZS5yZWNvbnN0ci5pbXBsLkFic3RyYWN0UGFyc2VUcmVlQ29uc3RydWN0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcuc2VydmljZXMuQVRlc3RHcmFtbWFyQWNjZXNzOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitwdWJsaWMgY2xhc3MgQVRlc3RQYXJzZXRyZWVDb25zdHJ1Y3RvciBleHRlbmRzIEFic3RyYWN0UGFyc2VUcmVlQ29uc3RydWN0b3IgeworCQkKKwlASW5qZWN0CisJcHJpdmF0ZSBBVGVzdEdyYW1tYXJBY2Nlc3MgZ3JhbW1hckFjY2VzczsKKwkJCisJcHVibGljIEFUZXN0R3JhbW1hckFjY2VzcyBnZXRHcmFtbWFyQWNjZXNzKCkgeworCQlyZXR1cm4gZ3JhbW1hckFjY2VzczsKKwl9CisKKwlwcm90ZWN0ZWQgQWJzdHJhY3RUb2tlbiBnZXRSb290VG9rZW4oSUluc3RhbmNlRGVzY3JpcHRpb24gaW5zdCkgeworCQlyZXR1cm4gbmV3IFRoaXNSb290Tm9kZShpbnN0KTsJCisJfQorCQorcHJvdGVjdGVkIGNsYXNzIFRoaXNSb290Tm9kZSBleHRlbmRzIFJvb3RUb2tlbiB7CisJcHVibGljIFRoaXNSb290Tm9kZShJSW5zdGFuY2VEZXNjcmlwdGlvbiBpbnN0KSB7CisJCXN1cGVyKGluc3QpOworCX0KKwkKKwlwdWJsaWMgQWJzdHJhY3RUb2tlbiBjcmVhdGVGb2xsb3dlcihpbnQgaW5kZXgsIElJbnN0YW5jZURlc2NyaXB0aW9uIGluc3QpIHsKKwkJc3dpdGNoKGluZGV4KSB7CisJCQljYXNlIDA6IHJldHVybiBuZXcgTW9kZWxfR3JvdXAodGhpcywgdGhpcywgMCwgaW5zdCk7CisJCQljYXNlIDE6IHJldHVybiBuZXcgVGVzdHNfR3JvdXAodGhpcywgdGhpcywgMSwgaW5zdCk7CisJCQljYXNlIDI6IHJldHVybiBuZXcgQ29uc3RyYWludF9Hcm91cCh0aGlzLCB0aGlzLCAyLCBpbnN0KTsKKwkJCWNhc2UgMzogcmV0dXJuIG5ldyBJbnRWYWx1ZV9WYWx1ZUFzc2lnbm1lbnQodGhpcywgdGhpcywgMywgaW5zdCk7CisJCQljYXNlIDQ6IHJldHVybiBuZXcgUmVhbFZhbHVlX1ZhbHVlQXNzaWdubWVudCh0aGlzLCB0aGlzLCA0LCBpbnN0KTsKKwkJCWRlZmF1bHQ6IHJldHVybiBudWxsOworCQl9CQorCX0JCit9CisJCisKKy8qKioqKioqKioqKiogYmVnaW4gUnVsZSBNb2RlbCAqKioqKioqKioqKioqKioqCisgKgorICogTW9kZWw6CisgKiAgIG5hbWU9U1RSSU5HPyBkZXNjcmlwdGlvbj1QTEFJTl9TVFJJTkc/IHRlc3RzPVRlc3RzPyBjb250cmFpbnRzKz1Db25zdHJhaW50KjsKKyAqCisgKiovCisKKy8vIG5hbWU9U1RSSU5HPyBkZXNjcmlwdGlvbj1QTEFJTl9TVFJJTkc/IHRlc3RzPVRlc3RzPyBjb250cmFpbnRzKz1Db25zdHJhaW50KgorcHJvdGVjdGVkIGNsYXNzIE1vZGVsX0dyb3VwIGV4dGVuZHMgR3JvdXBUb2tlbiB7CisJCisJcHVibGljIE1vZGVsX0dyb3VwKEFic3RyYWN0VG9rZW4gcGFyZW50LCBBYnN0cmFjdFRva2VuIG5leHQsIGludCBubywgSUluc3RhbmNlRGVzY3JpcHRpb24gY3VycmVudCkgeworCQlzdXBlcihwYXJlbnQsIG5leHQsIG5vLCBjdXJyZW50KTsKKwl9CisJCisJcHVibGljIEdyb3VwIGdldEdyYW1tYXJFbGVtZW50KCkgeworCQlyZXR1cm4gZ3JhbW1hckFjY2Vzcy5nZXRNb2RlbEFjY2VzcygpLmdldEdyb3VwKCk7CisJfQorCisJcHVibGljIEFic3RyYWN0VG9rZW4gY3JlYXRlRm9sbG93ZXIoaW50IGluZGV4LCBJSW5zdGFuY2VEZXNjcmlwdGlvbiBpbnN0KSB7CisJCXN3aXRjaChpbmRleCkgeworCQkJY2FzZSAwOiByZXR1cm4gbmV3IE1vZGVsX0NvbnRyYWludHNBc3NpZ25tZW50XzMocGFyZW50LCB0aGlzLCAwLCBpbnN0KTsKKwkJCWNhc2UgMTogcmV0dXJuIG5ldyBNb2RlbF9UZXN0c0Fzc2lnbm1lbnRfMihwYXJlbnQsIHRoaXMsIDEsIGluc3QpOworCQkJY2FzZSAyOiByZXR1cm4gbmV3IE1vZGVsX0Rlc2NyaXB0aW9uQXNzaWdubWVudF8xKHBhcmVudCwgdGhpcywgMiwgaW5zdCk7CisJCQljYXNlIDM6IHJldHVybiBuZXcgTW9kZWxfTmFtZUFzc2lnbm1lbnRfMChwYXJlbnQsIHRoaXMsIDMsIGluc3QpOworCQkJZGVmYXVsdDogcmV0dXJuIG51bGw7CisJCX0JCisJfQkKKwkJCisJcHVibGljIElJbnN0YW5jZURlc2NyaXB0aW9uIHRyeUNvbnN1bWUoKSB7CisJCWlmKCFjdXJyZW50LmlzSW5zdGFuY2VPZihncmFtbWFyQWNjZXNzLmdldE1vZGVsUnVsZSgpLmdldFR5cGUoKS5nZXRDbGFzc2lmaWVyKCkpKSByZXR1cm4gbnVsbDsKKwkJcmV0dXJuIHRyeUNvbnN1bWVWYWwoKTsKKwl9Cit9CisKKy8vIG5hbWU9U1RSSU5HPworcHJvdGVjdGVkIGNsYXNzIE1vZGVsX05hbWVBc3NpZ25tZW50XzAgZXh0ZW5kcyBBc3NpZ25tZW50VG9rZW4gIHsKKwkKKwlwdWJsaWMgTW9kZWxfTmFtZUFzc2lnbm1lbnRfMChBYnN0cmFjdFRva2VuIHBhcmVudCwgQWJzdHJhY3RUb2tlbiBuZXh0LCBpbnQgbm8sIElJbnN0YW5jZURlc2NyaXB0aW9uIGN1cnJlbnQpIHsKKwkJc3VwZXIocGFyZW50LCBuZXh0LCBubywgY3VycmVudCk7CisJfQorCQorCXB1YmxpYyBBc3NpZ25tZW50IGdldEdyYW1tYXJFbGVtZW50KCkgeworCQlyZXR1cm4gZ3JhbW1hckFjY2Vzcy5nZXRNb2RlbEFjY2VzcygpLmdldE5hbWVBc3NpZ25tZW50XzAoKTsKKwl9CisKKwlwdWJsaWMgQWJzdHJhY3RUb2tlbiBjcmVhdGVGb2xsb3dlcihpbnQgaW5kZXgsIElJbnN0YW5jZURlc2NyaXB0aW9uIGluc3QpIHsKKwkJc3dpdGNoKGluZGV4KSB7CisJCQlkZWZhdWx0OiByZXR1cm4gcGFyZW50LmNyZWF0ZVBhcmVudEZvbGxvd2VyKHRoaXMsIGluZGV4LCBpbmRleCwgaW5zdCk7CisJCX0JCisJfQkKKwkJCisJcHJvdGVjdGVkIElJbnN0YW5jZURlc2NyaXB0aW9uIHRyeUNvbnN1bWVWYWwoKSB7CisJCWlmKCh2YWx1ZSA9IGN1cnJlbnQuZ2V0Q29uc3VtYWJsZSgibmFtZSIsZmFsc2UpKSA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwkJSUluc3RhbmNlRGVzY3JpcHRpb24gb2JqID0gY3VycmVudC5jbG9uZUFuZENvbnN1bWUoIm5hbWUiKTsKKwkJaWYoQm9vbGVhbi5UUlVFLmJvb2xlYW5WYWx1ZSgpKSB7IC8vIG9yZzo6ZWNsaXBzZTo6eHRleHQ6OmltcGw6OlJ1bGVDYWxsSW1wbCBGSVhNRTogY2hlY2sgaWYgdmFsdWUgaXMgdmFsaWQgZm9yIGxleGVyIHJ1bGUKKwkJCXR5cGUgPSBBc3NpZ25tZW50VHlwZS5MUkM7CisJCQllbGVtZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRNb2RlbEFjY2VzcygpLmdldE5hbWVTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzBfMCgpOworCQkJcmV0dXJuIG9iajsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKK30KKworLy8gZGVzY3JpcHRpb249UExBSU5fU1RSSU5HPworcHJvdGVjdGVkIGNsYXNzIE1vZGVsX0Rlc2NyaXB0aW9uQXNzaWdubWVudF8xIGV4dGVuZHMgQXNzaWdubWVudFRva2VuICB7CisJCisJcHVibGljIE1vZGVsX0Rlc2NyaXB0aW9uQXNzaWdubWVudF8xKEFic3RyYWN0VG9rZW4gcGFyZW50LCBBYnN0cmFjdFRva2VuIG5leHQsIGludCBubywgSUluc3RhbmNlRGVzY3JpcHRpb24gY3VycmVudCkgeworCQlzdXBlcihwYXJlbnQsIG5leHQsIG5vLCBjdXJyZW50KTsKKwl9CisJCisJcHVibGljIEFzc2lnbm1lbnQgZ2V0R3JhbW1hckVsZW1lbnQoKSB7CisJCXJldHVybiBncmFtbWFyQWNjZXNzLmdldE1vZGVsQWNjZXNzKCkuZ2V0RGVzY3JpcHRpb25Bc3NpZ25tZW50XzEoKTsKKwl9CisKKwlwdWJsaWMgQWJzdHJhY3RUb2tlbiBjcmVhdGVGb2xsb3dlcihpbnQgaW5kZXgsIElJbnN0YW5jZURlc2NyaXB0aW9uIGluc3QpIHsKKwkJc3dpdGNoKGluZGV4KSB7CisJCQljYXNlIDA6IHJldHVybiBuZXcgTW9kZWxfTmFtZUFzc2lnbm1lbnRfMChwYXJlbnQsIHRoaXMsIDAsIGluc3QpOworCQkJZGVmYXVsdDogcmV0dXJuIHBhcmVudC5jcmVhdGVQYXJlbnRGb2xsb3dlcih0aGlzLCBpbmRleCwgaW5kZXggLSAxLCBpbnN0KTsKKwkJfQkKKwl9CQorCQkKKwlwcm90ZWN0ZWQgSUluc3RhbmNlRGVzY3JpcHRpb24gdHJ5Q29uc3VtZVZhbCgpIHsKKwkJaWYoKHZhbHVlID0gY3VycmVudC5nZXRDb25zdW1hYmxlKCJkZXNjcmlwdGlvbiIsZmFsc2UpKSA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwkJSUluc3RhbmNlRGVzY3JpcHRpb24gb2JqID0gY3VycmVudC5jbG9uZUFuZENvbnN1bWUoImRlc2NyaXB0aW9uIik7CisJCWlmKEJvb2xlYW4uVFJVRS5ib29sZWFuVmFsdWUoKSkgeyAvLyBvcmc6OmVjbGlwc2U6Onh0ZXh0OjppbXBsOjpSdWxlQ2FsbEltcGwgRklYTUU6IGNoZWNrIGlmIHZhbHVlIGlzIHZhbGlkIGZvciBsZXhlciBydWxlCisJCQl0eXBlID0gQXNzaWdubWVudFR5cGUuTFJDOworCQkJZWxlbWVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0TW9kZWxBY2Nlc3MoKS5nZXREZXNjcmlwdGlvblBMQUlOX1NUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMV8wKCk7CisJCQlyZXR1cm4gb2JqOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworfQorCisvLyB0ZXN0cz1UZXN0cz8KK3Byb3RlY3RlZCBjbGFzcyBNb2RlbF9UZXN0c0Fzc2lnbm1lbnRfMiBleHRlbmRzIEFzc2lnbm1lbnRUb2tlbiAgeworCQorCXB1YmxpYyBNb2RlbF9UZXN0c0Fzc2lnbm1lbnRfMihBYnN0cmFjdFRva2VuIHBhcmVudCwgQWJzdHJhY3RUb2tlbiBuZXh0LCBpbnQgbm8sIElJbnN0YW5jZURlc2NyaXB0aW9uIGN1cnJlbnQpIHsKKwkJc3VwZXIocGFyZW50LCBuZXh0LCBubywgY3VycmVudCk7CisJfQorCQorCXB1YmxpYyBBc3NpZ25tZW50IGdldEdyYW1tYXJFbGVtZW50KCkgeworCQlyZXR1cm4gZ3JhbW1hckFjY2Vzcy5nZXRNb2RlbEFjY2VzcygpLmdldFRlc3RzQXNzaWdubWVudF8yKCk7CisJfQorCisJcHVibGljIEFic3RyYWN0VG9rZW4gY3JlYXRlRm9sbG93ZXIoaW50IGluZGV4LCBJSW5zdGFuY2VEZXNjcmlwdGlvbiBpbnN0KSB7CisJCXN3aXRjaChpbmRleCkgeworCQkJY2FzZSAwOiByZXR1cm4gbmV3IFRlc3RzX0dyb3VwKHRoaXMsIHRoaXMsIDAsIGluc3QpOworCQkJZGVmYXVsdDogcmV0dXJuIG51bGw7CisJCX0JCisJfQkKKwkJCisJcHJvdGVjdGVkIElJbnN0YW5jZURlc2NyaXB0aW9uIHRyeUNvbnN1bWVWYWwoKSB7CisJCWlmKCh2YWx1ZSA9IGN1cnJlbnQuZ2V0Q29uc3VtYWJsZSgidGVzdHMiLGZhbHNlKSkgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCUlJbnN0YW5jZURlc2NyaXB0aW9uIG9iaiA9IGN1cnJlbnQuY2xvbmVBbmRDb25zdW1lKCJ0ZXN0cyIpOworCQlpZih2YWx1ZSBpbnN0YW5jZW9mIEVPYmplY3QpIHsgLy8gb3JnOjplY2xpcHNlOjp4dGV4dDo6aW1wbDo6UnVsZUNhbGxJbXBsCisJCQlJSW5zdGFuY2VEZXNjcmlwdGlvbiBwYXJhbSA9IGdldERlc2NyKChFT2JqZWN0KXZhbHVlKTsKKwkJCWlmKHBhcmFtLmlzSW5zdGFuY2VPZihncmFtbWFyQWNjZXNzLmdldFRlc3RzUnVsZSgpLmdldFR5cGUoKS5nZXRDbGFzc2lmaWVyKCkpKSB7CisJCQkJdHlwZSA9IEFzc2lnbm1lbnRUeXBlLlBSQzsKKwkJCQllbGVtZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRNb2RlbEFjY2VzcygpLmdldFRlc3RzVGVzdHNQYXJzZXJSdWxlQ2FsbF8yXzAoKTsgCisJCQkJY29uc3VtZWQgPSBvYmo7CisJCQkJcmV0dXJuIHBhcmFtOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBBYnN0cmFjdFRva2VuIGNyZWF0ZVBhcmVudEZvbGxvd2VyKEFic3RyYWN0VG9rZW4gbmV4dCwJaW50IGFjdEluZGV4LCBpbnQgaW5kZXgsIElJbnN0YW5jZURlc2NyaXB0aW9uIGluc3QpIHsKKwkJaWYodmFsdWUgPT0gaW5zdC5nZXREZWxlZ2F0ZSgpICYmICFpbnN0LmlzQ29uc3VtZWQoKSkgcmV0dXJuIG51bGw7CisJCXN3aXRjaChpbmRleCkgeworCQkJY2FzZSAwOiByZXR1cm4gbmV3IE1vZGVsX0Rlc2NyaXB0aW9uQXNzaWdubWVudF8xKHBhcmVudCwgbmV4dCwgYWN0SW5kZXgsIGNvbnN1bWVkKTsKKwkJCWNhc2UgMTogcmV0dXJuIG5ldyBNb2RlbF9OYW1lQXNzaWdubWVudF8wKHBhcmVudCwgbmV4dCwgYWN0SW5kZXgsIGNvbnN1bWVkKTsKKwkJCWRlZmF1bHQ6IHJldHVybiBwYXJlbnQuY3JlYXRlUGFyZW50Rm9sbG93ZXIobmV4dCwgYWN0SW5kZXggLCBpbmRleCAtIDIsIGNvbnN1bWVkKTsKKwkJfQkKKwl9CQorfQorCisvLyBjb250cmFpbnRzKz1Db25zdHJhaW50KgorcHJvdGVjdGVkIGNsYXNzIE1vZGVsX0NvbnRyYWludHNBc3NpZ25tZW50XzMgZXh0ZW5kcyBBc3NpZ25tZW50VG9rZW4gIHsKKwkKKwlwdWJsaWMgTW9kZWxfQ29udHJhaW50c0Fzc2lnbm1lbnRfMyhBYnN0cmFjdFRva2VuIHBhcmVudCwgQWJzdHJhY3RUb2tlbiBuZXh0LCBpbnQgbm8sIElJbnN0YW5jZURlc2NyaXB0aW9uIGN1cnJlbnQpIHsKKwkJc3VwZXIocGFyZW50LCBuZXh0LCBubywgY3VycmVudCk7CisJfQorCQorCXB1YmxpYyBBc3NpZ25tZW50IGdldEdyYW1tYXJFbGVtZW50KCkgeworCQlyZXR1cm4gZ3JhbW1hckFjY2Vzcy5nZXRNb2RlbEFjY2VzcygpLmdldENvbnRyYWludHNBc3NpZ25tZW50XzMoKTsKKwl9CisKKwlwdWJsaWMgQWJzdHJhY3RUb2tlbiBjcmVhdGVGb2xsb3dlcihpbnQgaW5kZXgsIElJbnN0YW5jZURlc2NyaXB0aW9uIGluc3QpIHsKKwkJc3dpdGNoKGluZGV4KSB7CisJCQljYXNlIDA6IHJldHVybiBuZXcgQ29uc3RyYWludF9Hcm91cCh0aGlzLCB0aGlzLCAwLCBpbnN0KTsKKwkJCWRlZmF1bHQ6IHJldHVybiBudWxsOworCQl9CQorCX0JCisJCQorCXByb3RlY3RlZCBJSW5zdGFuY2VEZXNjcmlwdGlvbiB0cnlDb25zdW1lVmFsKCkgeworCQlpZigodmFsdWUgPSBjdXJyZW50LmdldENvbnN1bWFibGUoImNvbnRyYWludHMiLGZhbHNlKSkgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCUlJbnN0YW5jZURlc2NyaXB0aW9uIG9iaiA9IGN1cnJlbnQuY2xvbmVBbmRDb25zdW1lKCJjb250cmFpbnRzIik7CisJCWlmKHZhbHVlIGluc3RhbmNlb2YgRU9iamVjdCkgeyAvLyBvcmc6OmVjbGlwc2U6Onh0ZXh0OjppbXBsOjpSdWxlQ2FsbEltcGwKKwkJCUlJbnN0YW5jZURlc2NyaXB0aW9uIHBhcmFtID0gZ2V0RGVzY3IoKEVPYmplY3QpdmFsdWUpOworCQkJaWYocGFyYW0uaXNJbnN0YW5jZU9mKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludFJ1bGUoKS5nZXRUeXBlKCkuZ2V0Q2xhc3NpZmllcigpKSkgeworCQkJCXR5cGUgPSBBc3NpZ25tZW50VHlwZS5QUkM7CisJCQkJZWxlbWVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0TW9kZWxBY2Nlc3MoKS5nZXRDb250cmFpbnRzQ29uc3RyYWludFBhcnNlclJ1bGVDYWxsXzNfMCgpOyAKKwkJCQljb25zdW1lZCA9IG9iajsKKwkJCQlyZXR1cm4gcGFyYW07CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIEFic3RyYWN0VG9rZW4gY3JlYXRlUGFyZW50Rm9sbG93ZXIoQWJzdHJhY3RUb2tlbiBuZXh0LAlpbnQgYWN0SW5kZXgsIGludCBpbmRleCwgSUluc3RhbmNlRGVzY3JpcHRpb24gaW5zdCkgeworCQlpZih2YWx1ZSA9PSBpbnN0LmdldERlbGVnYXRlKCkgJiYgIWluc3QuaXNDb25zdW1lZCgpKSByZXR1cm4gbnVsbDsKKwkJc3dpdGNoKGluZGV4KSB7CisJCQljYXNlIDA6IHJldHVybiBuZXcgTW9kZWxfQ29udHJhaW50c0Fzc2lnbm1lbnRfMyhwYXJlbnQsIG5leHQsIGFjdEluZGV4LCBjb25zdW1lZCk7CisJCQljYXNlIDE6IHJldHVybiBuZXcgTW9kZWxfVGVzdHNBc3NpZ25tZW50XzIocGFyZW50LCBuZXh0LCBhY3RJbmRleCwgY29uc3VtZWQpOworCQkJY2FzZSAyOiByZXR1cm4gbmV3IE1vZGVsX0Rlc2NyaXB0aW9uQXNzaWdubWVudF8xKHBhcmVudCwgbmV4dCwgYWN0SW5kZXgsIGNvbnN1bWVkKTsKKwkJCWNhc2UgMzogcmV0dXJuIG5ldyBNb2RlbF9OYW1lQXNzaWdubWVudF8wKHBhcmVudCwgbmV4dCwgYWN0SW5kZXgsIGNvbnN1bWVkKTsKKwkJCWRlZmF1bHQ6IHJldHVybiBwYXJlbnQuY3JlYXRlUGFyZW50Rm9sbG93ZXIobmV4dCwgYWN0SW5kZXggLCBpbmRleCAtIDQsIGNvbnN1bWVkKTsKKwkJfQkKKwl9CQorfQorCisKKy8qKioqKioqKioqKiogZW5kIFJ1bGUgTW9kZWwgKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqIGJlZ2luIFJ1bGUgVGVzdHMgKioqKioqKioqKioqKioqKgorICoKKyAqIFRlc3RzOgorICogICAiVEVTVFMiIGltcG9ydFVSST1TVFJJTkc7CisgKgorICoqLworCisvLyAiVEVTVFMiIGltcG9ydFVSST1TVFJJTkcKK3Byb3RlY3RlZCBjbGFzcyBUZXN0c19Hcm91cCBleHRlbmRzIEdyb3VwVG9rZW4geworCQorCXB1YmxpYyBUZXN0c19Hcm91cChBYnN0cmFjdFRva2VuIHBhcmVudCwgQWJzdHJhY3RUb2tlbiBuZXh0LCBpbnQgbm8sIElJbnN0YW5jZURlc2NyaXB0aW9uIGN1cnJlbnQpIHsKKwkJc3VwZXIocGFyZW50LCBuZXh0LCBubywgY3VycmVudCk7CisJfQorCQorCXB1YmxpYyBHcm91cCBnZXRHcmFtbWFyRWxlbWVudCgpIHsKKwkJcmV0dXJuIGdyYW1tYXJBY2Nlc3MuZ2V0VGVzdHNBY2Nlc3MoKS5nZXRHcm91cCgpOworCX0KKworCXB1YmxpYyBBYnN0cmFjdFRva2VuIGNyZWF0ZUZvbGxvd2VyKGludCBpbmRleCwgSUluc3RhbmNlRGVzY3JpcHRpb24gaW5zdCkgeworCQlzd2l0Y2goaW5kZXgpIHsKKwkJCWNhc2UgMDogcmV0dXJuIG5ldyBUZXN0c19JbXBvcnRVUklBc3NpZ25tZW50XzEocGFyZW50LCB0aGlzLCAwLCBpbnN0KTsKKwkJCWRlZmF1bHQ6IHJldHVybiBudWxsOworCQl9CQorCX0JCisJCQorCXB1YmxpYyBJSW5zdGFuY2VEZXNjcmlwdGlvbiB0cnlDb25zdW1lKCkgeworCQlpZighY3VycmVudC5pc0luc3RhbmNlT2YoZ3JhbW1hckFjY2Vzcy5nZXRUZXN0c1J1bGUoKS5nZXRUeXBlKCkuZ2V0Q2xhc3NpZmllcigpKSkgcmV0dXJuIG51bGw7CisJCXJldHVybiB0cnlDb25zdW1lVmFsKCk7CisJfQorfQorCisvLyAiVEVTVFMiCitwcm90ZWN0ZWQgY2xhc3MgVGVzdHNfVEVTVFNLZXl3b3JkXzAgZXh0ZW5kcyBLZXl3b3JkVG9rZW4gIHsKKwkKKwlwdWJsaWMgVGVzdHNfVEVTVFNLZXl3b3JkXzAoQWJzdHJhY3RUb2tlbiBwYXJlbnQsIEFic3RyYWN0VG9rZW4gbmV4dCwgaW50IG5vLCBJSW5zdGFuY2VEZXNjcmlwdGlvbiBjdXJyZW50KSB7CisJCXN1cGVyKHBhcmVudCwgbmV4dCwgbm8sIGN1cnJlbnQpOworCX0KKwkKKwlwdWJsaWMgS2V5d29yZCBnZXRHcmFtbWFyRWxlbWVudCgpIHsKKwkJcmV0dXJuIGdyYW1tYXJBY2Nlc3MuZ2V0VGVzdHNBY2Nlc3MoKS5nZXRURVNUU0tleXdvcmRfMCgpOworCX0KKworCXB1YmxpYyBBYnN0cmFjdFRva2VuIGNyZWF0ZUZvbGxvd2VyKGludCBpbmRleCwgSUluc3RhbmNlRGVzY3JpcHRpb24gaW5zdCkgeworCQlzd2l0Y2goaW5kZXgpIHsKKwkJCWRlZmF1bHQ6IHJldHVybiBwYXJlbnQuY3JlYXRlUGFyZW50Rm9sbG93ZXIodGhpcywgaW5kZXgsIGluZGV4LCBpbnN0KTsKKwkJfQkKKwl9CQorCQkKK30KKworLy8gaW1wb3J0VVJJPVNUUklORworcHJvdGVjdGVkIGNsYXNzIFRlc3RzX0ltcG9ydFVSSUFzc2lnbm1lbnRfMSBleHRlbmRzIEFzc2lnbm1lbnRUb2tlbiAgeworCQorCXB1YmxpYyBUZXN0c19JbXBvcnRVUklBc3NpZ25tZW50XzEoQWJzdHJhY3RUb2tlbiBwYXJlbnQsIEFic3RyYWN0VG9rZW4gbmV4dCwgaW50IG5vLCBJSW5zdGFuY2VEZXNjcmlwdGlvbiBjdXJyZW50KSB7CisJCXN1cGVyKHBhcmVudCwgbmV4dCwgbm8sIGN1cnJlbnQpOworCX0KKwkKKwlwdWJsaWMgQXNzaWdubWVudCBnZXRHcmFtbWFyRWxlbWVudCgpIHsKKwkJcmV0dXJuIGdyYW1tYXJBY2Nlc3MuZ2V0VGVzdHNBY2Nlc3MoKS5nZXRJbXBvcnRVUklBc3NpZ25tZW50XzEoKTsKKwl9CisKKwlwdWJsaWMgQWJzdHJhY3RUb2tlbiBjcmVhdGVGb2xsb3dlcihpbnQgaW5kZXgsIElJbnN0YW5jZURlc2NyaXB0aW9uIGluc3QpIHsKKwkJc3dpdGNoKGluZGV4KSB7CisJCQljYXNlIDA6IHJldHVybiBuZXcgVGVzdHNfVEVTVFNLZXl3b3JkXzAocGFyZW50LCB0aGlzLCAwLCBpbnN0KTsKKwkJCWRlZmF1bHQ6IHJldHVybiBudWxsOworCQl9CQorCX0JCisJCQorCXByb3RlY3RlZCBJSW5zdGFuY2VEZXNjcmlwdGlvbiB0cnlDb25zdW1lVmFsKCkgeworCQlpZigodmFsdWUgPSBjdXJyZW50LmdldENvbnN1bWFibGUoImltcG9ydFVSSSIsdHJ1ZSkpID09IG51bGwpIHJldHVybiBudWxsOworCQlJSW5zdGFuY2VEZXNjcmlwdGlvbiBvYmogPSBjdXJyZW50LmNsb25lQW5kQ29uc3VtZSgiaW1wb3J0VVJJIik7CisJCWlmKEJvb2xlYW4uVFJVRS5ib29sZWFuVmFsdWUoKSkgeyAvLyBvcmc6OmVjbGlwc2U6Onh0ZXh0OjppbXBsOjpSdWxlQ2FsbEltcGwgRklYTUU6IGNoZWNrIGlmIHZhbHVlIGlzIHZhbGlkIGZvciBsZXhlciBydWxlCisJCQl0eXBlID0gQXNzaWdubWVudFR5cGUuTFJDOworCQkJZWxlbWVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0VGVzdHNBY2Nlc3MoKS5nZXRJbXBvcnRVUklTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzFfMCgpOworCQkJcmV0dXJuIG9iajsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKK30KKworCisvKioqKioqKioqKioqIGVuZCBSdWxlIFRlc3RzICoqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKiBiZWdpbiBSdWxlIENvbnN0cmFpbnQgKioqKioqKioqKioqKioqKgorICoKKyAqIENvbnN0cmFpbnQ6CisgKiAgIG1lYXN1cmU9TWVhc3VyZSAiKCIgYWdlbnQ9W1NBZ2VudHxTVFJJTkddICI6IiBhdHRyaWJ1dGU9W1NBdHRyaWJ1dGV8U1RSSU5HXSAoIjoiCisgKiAgIHF1YWxpZmllcj1bU1N0YXRlVmFsdWV8U1RSSU5HXSk/ICIpIiAoIj0iICJbIiBtaW5WYWx1ZT0oIEludFZhbHVlIHwgUmVhbFZhbHVlICkgIiwiCisgKiAgIG1heFZhbHVlPSggSW50VmFsdWUgfCBSZWFsVmFsdWUgKSAiXSIpOworICoKKyAqKi8KKworLy8gbWVhc3VyZT1NZWFzdXJlICIoIiBhZ2VudD1bU0FnZW50fFNUUklOR10gIjoiIGF0dHJpYnV0ZT1bU0F0dHJpYnV0ZXxTVFJJTkddICgiOiIKKy8vIHF1YWxpZmllcj1bU1N0YXRlVmFsdWV8U1RSSU5HXSk/ICIpIiAoIj0iICJbIiBtaW5WYWx1ZT0oIEludFZhbHVlIHwgUmVhbFZhbHVlICkgIiwiCisvLyBtYXhWYWx1ZT0oIEludFZhbHVlIHwgUmVhbFZhbHVlICkgIl0iKQorcHJvdGVjdGVkIGNsYXNzIENvbnN0cmFpbnRfR3JvdXAgZXh0ZW5kcyBHcm91cFRva2VuIHsKKwkKKwlwdWJsaWMgQ29uc3RyYWludF9Hcm91cChBYnN0cmFjdFRva2VuIHBhcmVudCwgQWJzdHJhY3RUb2tlbiBuZXh0LCBpbnQgbm8sIElJbnN0YW5jZURlc2NyaXB0aW9uIGN1cnJlbnQpIHsKKwkJc3VwZXIocGFyZW50LCBuZXh0LCBubywgY3VycmVudCk7CisJfQorCQorCXB1YmxpYyBHcm91cCBnZXRHcmFtbWFyRWxlbWVudCgpIHsKKwkJcmV0dXJuIGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludEFjY2VzcygpLmdldEdyb3VwKCk7CisJfQorCisJcHVibGljIEFic3RyYWN0VG9rZW4gY3JlYXRlRm9sbG93ZXIoaW50IGluZGV4LCBJSW5zdGFuY2VEZXNjcmlwdGlvbiBpbnN0KSB7CisJCXN3aXRjaChpbmRleCkgeworCQkJY2FzZSAwOiByZXR1cm4gbmV3IENvbnN0cmFpbnRfR3JvdXBfNyhwYXJlbnQsIHRoaXMsIDAsIGluc3QpOworCQkJZGVmYXVsdDogcmV0dXJuIG51bGw7CisJCX0JCisJfQkKKwkJCisJcHVibGljIElJbnN0YW5jZURlc2NyaXB0aW9uIHRyeUNvbnN1bWUoKSB7CisJCWlmKCFjdXJyZW50LmlzSW5zdGFuY2VPZihncmFtbWFyQWNjZXNzLmdldENvbnN0cmFpbnRSdWxlKCkuZ2V0VHlwZSgpLmdldENsYXNzaWZpZXIoKSkpIHJldHVybiBudWxsOworCQlyZXR1cm4gdHJ5Q29uc3VtZVZhbCgpOworCX0KK30KKworLy8gbWVhc3VyZT1NZWFzdXJlCitwcm90ZWN0ZWQgY2xhc3MgQ29uc3RyYWludF9NZWFzdXJlQXNzaWdubWVudF8wIGV4dGVuZHMgQXNzaWdubWVudFRva2VuICB7CisJCisJcHVibGljIENvbnN0cmFpbnRfTWVhc3VyZUFzc2lnbm1lbnRfMChBYnN0cmFjdFRva2VuIHBhcmVudCwgQWJzdHJhY3RUb2tlbiBuZXh0LCBpbnQgbm8sIElJbnN0YW5jZURlc2NyaXB0aW9uIGN1cnJlbnQpIHsKKwkJc3VwZXIocGFyZW50LCBuZXh0LCBubywgY3VycmVudCk7CisJfQorCQorCXB1YmxpYyBBc3NpZ25tZW50IGdldEdyYW1tYXJFbGVtZW50KCkgeworCQlyZXR1cm4gZ3JhbW1hckFjY2Vzcy5nZXRDb25zdHJhaW50QWNjZXNzKCkuZ2V0TWVhc3VyZUFzc2lnbm1lbnRfMCgpOworCX0KKworCXB1YmxpYyBBYnN0cmFjdFRva2VuIGNyZWF0ZUZvbGxvd2VyKGludCBpbmRleCwgSUluc3RhbmNlRGVzY3JpcHRpb24gaW5zdCkgeworCQlzd2l0Y2goaW5kZXgpIHsKKwkJCWRlZmF1bHQ6IHJldHVybiBwYXJlbnQuY3JlYXRlUGFyZW50Rm9sbG93ZXIodGhpcywgaW5kZXgsIGluZGV4LCBpbnN0KTsKKwkJfQkKKwl9CQorCQkKKwlwcm90ZWN0ZWQgSUluc3RhbmNlRGVzY3JpcHRpb24gdHJ5Q29uc3VtZVZhbCgpIHsKKwkJaWYoKHZhbHVlID0gY3VycmVudC5nZXRDb25zdW1hYmxlKCJtZWFzdXJlIix0cnVlKSkgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCUlJbnN0YW5jZURlc2NyaXB0aW9uIG9iaiA9IGN1cnJlbnQuY2xvbmVBbmRDb25zdW1lKCJtZWFzdXJlIik7CisJCWlmKEJvb2xlYW4uVFJVRS5ib29sZWFuVmFsdWUoKSkgeyAvLyBvcmc6OmVjbGlwc2U6Onh0ZXh0OjppbXBsOjpSdWxlQ2FsbEltcGwgRklYTUU6IGNoZWNrIGlmIHZhbHVlIGlzIHZhbGlkIGZvciBkYXRhdHlwZSBydWxlCisJCQl0eXBlID0gQXNzaWdubWVudFR5cGUuRVJDOworCQkJZWxlbWVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludEFjY2VzcygpLmdldE1lYXN1cmVNZWFzdXJlRW51bVJ1bGVDYWxsXzBfMCgpOworCQkJcmV0dXJuIG9iajsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKK30KKworLy8gIigiCitwcm90ZWN0ZWQgY2xhc3MgQ29uc3RyYWludF9MZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzEgZXh0ZW5kcyBLZXl3b3JkVG9rZW4gIHsKKwkKKwlwdWJsaWMgQ29uc3RyYWludF9MZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzEoQWJzdHJhY3RUb2tlbiBwYXJlbnQsIEFic3RyYWN0VG9rZW4gbmV4dCwgaW50IG5vLCBJSW5zdGFuY2VEZXNjcmlwdGlvbiBjdXJyZW50KSB7CisJCXN1cGVyKHBhcmVudCwgbmV4dCwgbm8sIGN1cnJlbnQpOworCX0KKwkKKwlwdWJsaWMgS2V5d29yZCBnZXRHcmFtbWFyRWxlbWVudCgpIHsKKwkJcmV0dXJuIGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludEFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfMSgpOworCX0KKworCXB1YmxpYyBBYnN0cmFjdFRva2VuIGNyZWF0ZUZvbGxvd2VyKGludCBpbmRleCwgSUluc3RhbmNlRGVzY3JpcHRpb24gaW5zdCkgeworCQlzd2l0Y2goaW5kZXgpIHsKKwkJCWNhc2UgMDogcmV0dXJuIG5ldyBDb25zdHJhaW50X01lYXN1cmVBc3NpZ25tZW50XzAocGFyZW50LCB0aGlzLCAwLCBpbnN0KTsKKwkJCWRlZmF1bHQ6IHJldHVybiBudWxsOworCQl9CQorCX0JCisJCQorfQorCisvLyBhZ2VudD1bU0FnZW50fFNUUklOR10KK3Byb3RlY3RlZCBjbGFzcyBDb25zdHJhaW50X0FnZW50QXNzaWdubWVudF8yIGV4dGVuZHMgQXNzaWdubWVudFRva2VuICB7CisJCisJcHVibGljIENvbnN0cmFpbnRfQWdlbnRBc3NpZ25tZW50XzIoQWJzdHJhY3RUb2tlbiBwYXJlbnQsIEFic3RyYWN0VG9rZW4gbmV4dCwgaW50IG5vLCBJSW5zdGFuY2VEZXNjcmlwdGlvbiBjdXJyZW50KSB7CisJCXN1cGVyKHBhcmVudCwgbmV4dCwgbm8sIGN1cnJlbnQpOworCX0KKwkKKwlwdWJsaWMgQXNzaWdubWVudCBnZXRHcmFtbWFyRWxlbWVudCgpIHsKKwkJcmV0dXJuIGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludEFjY2VzcygpLmdldEFnZW50QXNzaWdubWVudF8yKCk7CisJfQorCisJcHVibGljIEFic3RyYWN0VG9rZW4gY3JlYXRlRm9sbG93ZXIoaW50IGluZGV4LCBJSW5zdGFuY2VEZXNjcmlwdGlvbiBpbnN0KSB7CisJCXN3aXRjaChpbmRleCkgeworCQkJY2FzZSAwOiByZXR1cm4gbmV3IENvbnN0cmFpbnRfTGVmdFBhcmVudGhlc2lzS2V5d29yZF8xKHBhcmVudCwgdGhpcywgMCwgaW5zdCk7CisJCQlkZWZhdWx0OiByZXR1cm4gbnVsbDsKKwkJfQkKKwl9CQorCQkKKwlwcm90ZWN0ZWQgSUluc3RhbmNlRGVzY3JpcHRpb24gdHJ5Q29uc3VtZVZhbCgpIHsKKwkJaWYoKHZhbHVlID0gY3VycmVudC5nZXRDb25zdW1hYmxlKCJhZ2VudCIsdHJ1ZSkpID09IG51bGwpIHJldHVybiBudWxsOworCQlJSW5zdGFuY2VEZXNjcmlwdGlvbiBvYmogPSBjdXJyZW50LmNsb25lQW5kQ29uc3VtZSgiYWdlbnQiKTsKKwkJaWYodmFsdWUgaW5zdGFuY2VvZiBFT2JqZWN0KSB7IC8vIG9yZzo6ZWNsaXBzZTo6eHRleHQ6OmltcGw6OkNyb3NzUmVmZXJlbmNlSW1wbAorCQkJSUluc3RhbmNlRGVzY3JpcHRpb24gcGFyYW0gPSBnZXREZXNjcigoRU9iamVjdCl2YWx1ZSk7CisJCQlpZihwYXJhbS5pc0luc3RhbmNlT2YoZ3JhbW1hckFjY2Vzcy5nZXRDb25zdHJhaW50QWNjZXNzKCkuZ2V0QWdlbnRTQWdlbnRDcm9zc1JlZmVyZW5jZV8yXzAoKS5nZXRUeXBlKCkuZ2V0Q2xhc3NpZmllcigpKSkgeworCQkJCXR5cGUgPSBBc3NpZ25tZW50VHlwZS5DUjsKKwkJCQllbGVtZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRDb25zdHJhaW50QWNjZXNzKCkuZ2V0QWdlbnRTQWdlbnRDcm9zc1JlZmVyZW5jZV8yXzAoKTsgCisJCQkJcmV0dXJuIG9iajsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKK30KKworLy8gIjoiCitwcm90ZWN0ZWQgY2xhc3MgQ29uc3RyYWludF9Db2xvbktleXdvcmRfMyBleHRlbmRzIEtleXdvcmRUb2tlbiAgeworCQorCXB1YmxpYyBDb25zdHJhaW50X0NvbG9uS2V5d29yZF8zKEFic3RyYWN0VG9rZW4gcGFyZW50LCBBYnN0cmFjdFRva2VuIG5leHQsIGludCBubywgSUluc3RhbmNlRGVzY3JpcHRpb24gY3VycmVudCkgeworCQlzdXBlcihwYXJlbnQsIG5leHQsIG5vLCBjdXJyZW50KTsKKwl9CisJCisJcHVibGljIEtleXdvcmQgZ2V0R3JhbW1hckVsZW1lbnQoKSB7CisJCXJldHVybiBncmFtbWFyQWNjZXNzLmdldENvbnN0cmFpbnRBY2Nlc3MoKS5nZXRDb2xvbktleXdvcmRfMygpOworCX0KKworCXB1YmxpYyBBYnN0cmFjdFRva2VuIGNyZWF0ZUZvbGxvd2VyKGludCBpbmRleCwgSUluc3RhbmNlRGVzY3JpcHRpb24gaW5zdCkgeworCQlzd2l0Y2goaW5kZXgpIHsKKwkJCWNhc2UgMDogcmV0dXJuIG5ldyBDb25zdHJhaW50X0FnZW50QXNzaWdubWVudF8yKHBhcmVudCwgdGhpcywgMCwgaW5zdCk7CisJCQlkZWZhdWx0OiByZXR1cm4gbnVsbDsKKwkJfQkKKwl9CQorCQkKK30KKworLy8gYXR0cmlidXRlPVtTQXR0cmlidXRlfFNUUklOR10KK3Byb3RlY3RlZCBjbGFzcyBDb25zdHJhaW50X0F0dHJpYnV0ZUFzc2lnbm1lbnRfNCBleHRlbmRzIEFzc2lnbm1lbnRUb2tlbiAgeworCQorCXB1YmxpYyBDb25zdHJhaW50X0F0dHJpYnV0ZUFzc2lnbm1lbnRfNChBYnN0cmFjdFRva2VuIHBhcmVudCwgQWJzdHJhY3RUb2tlbiBuZXh0LCBpbnQgbm8sIElJbnN0YW5jZURlc2NyaXB0aW9uIGN1cnJlbnQpIHsKKwkJc3VwZXIocGFyZW50LCBuZXh0LCBubywgY3VycmVudCk7CisJfQorCQorCXB1YmxpYyBBc3NpZ25tZW50IGdldEdyYW1tYXJFbGVtZW50KCkgeworCQlyZXR1cm4gZ3JhbW1hckFjY2Vzcy5nZXRDb25zdHJhaW50QWNjZXNzKCkuZ2V0QXR0cmlidXRlQXNzaWdubWVudF80KCk7CisJfQorCisJcHVibGljIEFic3RyYWN0VG9rZW4gY3JlYXRlRm9sbG93ZXIoaW50IGluZGV4LCBJSW5zdGFuY2VEZXNjcmlwdGlvbiBpbnN0KSB7CisJCXN3aXRjaChpbmRleCkgeworCQkJY2FzZSAwOiByZXR1cm4gbmV3IENvbnN0cmFpbnRfQ29sb25LZXl3b3JkXzMocGFyZW50LCB0aGlzLCAwLCBpbnN0KTsKKwkJCWRlZmF1bHQ6IHJldHVybiBudWxsOworCQl9CQorCX0JCisJCQorCXByb3RlY3RlZCBJSW5zdGFuY2VEZXNjcmlwdGlvbiB0cnlDb25zdW1lVmFsKCkgeworCQlpZigodmFsdWUgPSBjdXJyZW50LmdldENvbnN1bWFibGUoImF0dHJpYnV0ZSIsdHJ1ZSkpID09IG51bGwpIHJldHVybiBudWxsOworCQlJSW5zdGFuY2VEZXNjcmlwdGlvbiBvYmogPSBjdXJyZW50LmNsb25lQW5kQ29uc3VtZSgiYXR0cmlidXRlIik7CisJCWlmKHZhbHVlIGluc3RhbmNlb2YgRU9iamVjdCkgeyAvLyBvcmc6OmVjbGlwc2U6Onh0ZXh0OjppbXBsOjpDcm9zc1JlZmVyZW5jZUltcGwKKwkJCUlJbnN0YW5jZURlc2NyaXB0aW9uIHBhcmFtID0gZ2V0RGVzY3IoKEVPYmplY3QpdmFsdWUpOworCQkJaWYocGFyYW0uaXNJbnN0YW5jZU9mKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludEFjY2VzcygpLmdldEF0dHJpYnV0ZVNBdHRyaWJ1dGVDcm9zc1JlZmVyZW5jZV80XzAoKS5nZXRUeXBlKCkuZ2V0Q2xhc3NpZmllcigpKSkgeworCQkJCXR5cGUgPSBBc3NpZ25tZW50VHlwZS5DUjsKKwkJCQllbGVtZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRDb25zdHJhaW50QWNjZXNzKCkuZ2V0QXR0cmlidXRlU0F0dHJpYnV0ZUNyb3NzUmVmZXJlbmNlXzRfMCgpOyAKKwkJCQlyZXR1cm4gb2JqOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworfQorCisvLyAoIjoiIHF1YWxpZmllcj1bU1N0YXRlVmFsdWV8U1RSSU5HXSk/Citwcm90ZWN0ZWQgY2xhc3MgQ29uc3RyYWludF9Hcm91cF81IGV4dGVuZHMgR3JvdXBUb2tlbiB7CisJCisJcHVibGljIENvbnN0cmFpbnRfR3JvdXBfNShBYnN0cmFjdFRva2VuIHBhcmVudCwgQWJzdHJhY3RUb2tlbiBuZXh0LCBpbnQgbm8sIElJbnN0YW5jZURlc2NyaXB0aW9uIGN1cnJlbnQpIHsKKwkJc3VwZXIocGFyZW50LCBuZXh0LCBubywgY3VycmVudCk7CisJfQorCQorCXB1YmxpYyBHcm91cCBnZXRHcmFtbWFyRWxlbWVudCgpIHsKKwkJcmV0dXJuIGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludEFjY2VzcygpLmdldEdyb3VwXzUoKTsKKwl9CisKKwlwdWJsaWMgQWJzdHJhY3RUb2tlbiBjcmVhdGVGb2xsb3dlcihpbnQgaW5kZXgsIElJbnN0YW5jZURlc2NyaXB0aW9uIGluc3QpIHsKKwkJc3dpdGNoKGluZGV4KSB7CisJCQljYXNlIDA6IHJldHVybiBuZXcgQ29uc3RyYWludF9RdWFsaWZpZXJBc3NpZ25tZW50XzVfMShwYXJlbnQsIHRoaXMsIDAsIGluc3QpOworCQkJZGVmYXVsdDogcmV0dXJuIG51bGw7CisJCX0JCisJfQkKKwkJCit9CisKKy8vICI6IgorcHJvdGVjdGVkIGNsYXNzIENvbnN0cmFpbnRfQ29sb25LZXl3b3JkXzVfMCBleHRlbmRzIEtleXdvcmRUb2tlbiAgeworCQorCXB1YmxpYyBDb25zdHJhaW50X0NvbG9uS2V5d29yZF81XzAoQWJzdHJhY3RUb2tlbiBwYXJlbnQsIEFic3RyYWN0VG9rZW4gbmV4dCwgaW50IG5vLCBJSW5zdGFuY2VEZXNjcmlwdGlvbiBjdXJyZW50KSB7CisJCXN1cGVyKHBhcmVudCwgbmV4dCwgbm8sIGN1cnJlbnQpOworCX0KKwkKKwlwdWJsaWMgS2V5d29yZCBnZXRHcmFtbWFyRWxlbWVudCgpIHsKKwkJcmV0dXJuIGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludEFjY2VzcygpLmdldENvbG9uS2V5d29yZF81XzAoKTsKKwl9CisKKwlwdWJsaWMgQWJzdHJhY3RUb2tlbiBjcmVhdGVGb2xsb3dlcihpbnQgaW5kZXgsIElJbnN0YW5jZURlc2NyaXB0aW9uIGluc3QpIHsKKwkJc3dpdGNoKGluZGV4KSB7CisJCQljYXNlIDA6IHJldHVybiBuZXcgQ29uc3RyYWludF9BdHRyaWJ1dGVBc3NpZ25tZW50XzQocGFyZW50LCB0aGlzLCAwLCBpbnN0KTsKKwkJCWRlZmF1bHQ6IHJldHVybiBudWxsOworCQl9CQorCX0JCisJCQorfQorCisvLyBxdWFsaWZpZXI9W1NTdGF0ZVZhbHVlfFNUUklOR10KK3Byb3RlY3RlZCBjbGFzcyBDb25zdHJhaW50X1F1YWxpZmllckFzc2lnbm1lbnRfNV8xIGV4dGVuZHMgQXNzaWdubWVudFRva2VuICB7CisJCisJcHVibGljIENvbnN0cmFpbnRfUXVhbGlmaWVyQXNzaWdubWVudF81XzEoQWJzdHJhY3RUb2tlbiBwYXJlbnQsIEFic3RyYWN0VG9rZW4gbmV4dCwgaW50IG5vLCBJSW5zdGFuY2VEZXNjcmlwdGlvbiBjdXJyZW50KSB7CisJCXN1cGVyKHBhcmVudCwgbmV4dCwgbm8sIGN1cnJlbnQpOworCX0KKwkKKwlwdWJsaWMgQXNzaWdubWVudCBnZXRHcmFtbWFyRWxlbWVudCgpIHsKKwkJcmV0dXJuIGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludEFjY2VzcygpLmdldFF1YWxpZmllckFzc2lnbm1lbnRfNV8xKCk7CisJfQorCisJcHVibGljIEFic3RyYWN0VG9rZW4gY3JlYXRlRm9sbG93ZXIoaW50IGluZGV4LCBJSW5zdGFuY2VEZXNjcmlwdGlvbiBpbnN0KSB7CisJCXN3aXRjaChpbmRleCkgeworCQkJY2FzZSAwOiByZXR1cm4gbmV3IENvbnN0cmFpbnRfQ29sb25LZXl3b3JkXzVfMChwYXJlbnQsIHRoaXMsIDAsIGluc3QpOworCQkJZGVmYXVsdDogcmV0dXJuIG51bGw7CisJCX0JCisJfQkKKwkJCisJcHJvdGVjdGVkIElJbnN0YW5jZURlc2NyaXB0aW9uIHRyeUNvbnN1bWVWYWwoKSB7CisJCWlmKCh2YWx1ZSA9IGN1cnJlbnQuZ2V0Q29uc3VtYWJsZSgicXVhbGlmaWVyIixmYWxzZSkpID09IG51bGwpIHJldHVybiBudWxsOworCQlJSW5zdGFuY2VEZXNjcmlwdGlvbiBvYmogPSBjdXJyZW50LmNsb25lQW5kQ29uc3VtZSgicXVhbGlmaWVyIik7CisJCWlmKHZhbHVlIGluc3RhbmNlb2YgRU9iamVjdCkgeyAvLyBvcmc6OmVjbGlwc2U6Onh0ZXh0OjppbXBsOjpDcm9zc1JlZmVyZW5jZUltcGwKKwkJCUlJbnN0YW5jZURlc2NyaXB0aW9uIHBhcmFtID0gZ2V0RGVzY3IoKEVPYmplY3QpdmFsdWUpOworCQkJaWYocGFyYW0uaXNJbnN0YW5jZU9mKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludEFjY2VzcygpLmdldFF1YWxpZmllclNTdGF0ZVZhbHVlQ3Jvc3NSZWZlcmVuY2VfNV8xXzAoKS5nZXRUeXBlKCkuZ2V0Q2xhc3NpZmllcigpKSkgeworCQkJCXR5cGUgPSBBc3NpZ25tZW50VHlwZS5DUjsKKwkJCQllbGVtZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRDb25zdHJhaW50QWNjZXNzKCkuZ2V0UXVhbGlmaWVyU1N0YXRlVmFsdWVDcm9zc1JlZmVyZW5jZV81XzFfMCgpOyAKKwkJCQlyZXR1cm4gb2JqOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworfQorCisKKy8vICIpIgorcHJvdGVjdGVkIGNsYXNzIENvbnN0cmFpbnRfUmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfNiBleHRlbmRzIEtleXdvcmRUb2tlbiAgeworCQorCXB1YmxpYyBDb25zdHJhaW50X1JpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzYoQWJzdHJhY3RUb2tlbiBwYXJlbnQsIEFic3RyYWN0VG9rZW4gbmV4dCwgaW50IG5vLCBJSW5zdGFuY2VEZXNjcmlwdGlvbiBjdXJyZW50KSB7CisJCXN1cGVyKHBhcmVudCwgbmV4dCwgbm8sIGN1cnJlbnQpOworCX0KKwkKKwlwdWJsaWMgS2V5d29yZCBnZXRHcmFtbWFyRWxlbWVudCgpIHsKKwkJcmV0dXJuIGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludEFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzYoKTsKKwl9CisKKwlwdWJsaWMgQWJzdHJhY3RUb2tlbiBjcmVhdGVGb2xsb3dlcihpbnQgaW5kZXgsIElJbnN0YW5jZURlc2NyaXB0aW9uIGluc3QpIHsKKwkJc3dpdGNoKGluZGV4KSB7CisJCQljYXNlIDA6IHJldHVybiBuZXcgQ29uc3RyYWludF9Hcm91cF81KHBhcmVudCwgdGhpcywgMCwgaW5zdCk7CisJCQljYXNlIDE6IHJldHVybiBuZXcgQ29uc3RyYWludF9BdHRyaWJ1dGVBc3NpZ25tZW50XzQocGFyZW50LCB0aGlzLCAxLCBpbnN0KTsKKwkJCWRlZmF1bHQ6IHJldHVybiBudWxsOworCQl9CQorCX0JCisJCQorfQorCisvLyAiPSIgIlsiIG1pblZhbHVlPSggSW50VmFsdWUgfCBSZWFsVmFsdWUgKSAiLCIgbWF4VmFsdWU9KCBJbnRWYWx1ZSB8IFJlYWxWYWx1ZSApICJdIgorcHJvdGVjdGVkIGNsYXNzIENvbnN0cmFpbnRfR3JvdXBfNyBleHRlbmRzIEdyb3VwVG9rZW4geworCQorCXB1YmxpYyBDb25zdHJhaW50X0dyb3VwXzcoQWJzdHJhY3RUb2tlbiBwYXJlbnQsIEFic3RyYWN0VG9rZW4gbmV4dCwgaW50IG5vLCBJSW5zdGFuY2VEZXNjcmlwdGlvbiBjdXJyZW50KSB7CisJCXN1cGVyKHBhcmVudCwgbmV4dCwgbm8sIGN1cnJlbnQpOworCX0KKwkKKwlwdWJsaWMgR3JvdXAgZ2V0R3JhbW1hckVsZW1lbnQoKSB7CisJCXJldHVybiBncmFtbWFyQWNjZXNzLmdldENvbnN0cmFpbnRBY2Nlc3MoKS5nZXRHcm91cF83KCk7CisJfQorCisJcHVibGljIEFic3RyYWN0VG9rZW4gY3JlYXRlRm9sbG93ZXIoaW50IGluZGV4LCBJSW5zdGFuY2VEZXNjcmlwdGlvbiBpbnN0KSB7CisJCXN3aXRjaChpbmRleCkgeworCQkJY2FzZSAwOiByZXR1cm4gbmV3IENvbnN0cmFpbnRfUmlnaHRTcXVhcmVCcmFja2V0S2V5d29yZF83XzUocGFyZW50LCB0aGlzLCAwLCBpbnN0KTsKKwkJCWRlZmF1bHQ6IHJldHVybiBudWxsOworCQl9CQorCX0JCisJCQorfQorCisvLyAiPSIKK3Byb3RlY3RlZCBjbGFzcyBDb25zdHJhaW50X0VxdWFsc1NpZ25LZXl3b3JkXzdfMCBleHRlbmRzIEtleXdvcmRUb2tlbiAgeworCQorCXB1YmxpYyBDb25zdHJhaW50X0VxdWFsc1NpZ25LZXl3b3JkXzdfMChBYnN0cmFjdFRva2VuIHBhcmVudCwgQWJzdHJhY3RUb2tlbiBuZXh0LCBpbnQgbm8sIElJbnN0YW5jZURlc2NyaXB0aW9uIGN1cnJlbnQpIHsKKwkJc3VwZXIocGFyZW50LCBuZXh0LCBubywgY3VycmVudCk7CisJfQorCQorCXB1YmxpYyBLZXl3b3JkIGdldEdyYW1tYXJFbGVtZW50KCkgeworCQlyZXR1cm4gZ3JhbW1hckFjY2Vzcy5nZXRDb25zdHJhaW50QWNjZXNzKCkuZ2V0RXF1YWxzU2lnbktleXdvcmRfN18wKCk7CisJfQorCisJcHVibGljIEFic3RyYWN0VG9rZW4gY3JlYXRlRm9sbG93ZXIoaW50IGluZGV4LCBJSW5zdGFuY2VEZXNjcmlwdGlvbiBpbnN0KSB7CisJCXN3aXRjaChpbmRleCkgeworCQkJY2FzZSAwOiByZXR1cm4gbmV3IENvbnN0cmFpbnRfUmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfNihwYXJlbnQsIHRoaXMsIDAsIGluc3QpOworCQkJZGVmYXVsdDogcmV0dXJuIG51bGw7CisJCX0JCisJfQkKKwkJCit9CisKKy8vICJbIgorcHJvdGVjdGVkIGNsYXNzIENvbnN0cmFpbnRfTGVmdFNxdWFyZUJyYWNrZXRLZXl3b3JkXzdfMSBleHRlbmRzIEtleXdvcmRUb2tlbiAgeworCQorCXB1YmxpYyBDb25zdHJhaW50X0xlZnRTcXVhcmVCcmFja2V0S2V5d29yZF83XzEoQWJzdHJhY3RUb2tlbiBwYXJlbnQsIEFic3RyYWN0VG9rZW4gbmV4dCwgaW50IG5vLCBJSW5zdGFuY2VEZXNjcmlwdGlvbiBjdXJyZW50KSB7CisJCXN1cGVyKHBhcmVudCwgbmV4dCwgbm8sIGN1cnJlbnQpOworCX0KKwkKKwlwdWJsaWMgS2V5d29yZCBnZXRHcmFtbWFyRWxlbWVudCgpIHsKKwkJcmV0dXJuIGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludEFjY2VzcygpLmdldExlZnRTcXVhcmVCcmFja2V0S2V5d29yZF83XzEoKTsKKwl9CisKKwlwdWJsaWMgQWJzdHJhY3RUb2tlbiBjcmVhdGVGb2xsb3dlcihpbnQgaW5kZXgsIElJbnN0YW5jZURlc2NyaXB0aW9uIGluc3QpIHsKKwkJc3dpdGNoKGluZGV4KSB7CisJCQljYXNlIDA6IHJldHVybiBuZXcgQ29uc3RyYWludF9FcXVhbHNTaWduS2V5d29yZF83XzAocGFyZW50LCB0aGlzLCAwLCBpbnN0KTsKKwkJCWRlZmF1bHQ6IHJldHVybiBudWxsOworCQl9CQorCX0JCisJCQorfQorCisvLyBtaW5WYWx1ZT0oIEludFZhbHVlIHwgUmVhbFZhbHVlICkKK3Byb3RlY3RlZCBjbGFzcyBDb25zdHJhaW50X01pblZhbHVlQXNzaWdubWVudF83XzIgZXh0ZW5kcyBBc3NpZ25tZW50VG9rZW4gIHsKKwkKKwlwdWJsaWMgQ29uc3RyYWludF9NaW5WYWx1ZUFzc2lnbm1lbnRfN18yKEFic3RyYWN0VG9rZW4gcGFyZW50LCBBYnN0cmFjdFRva2VuIG5leHQsIGludCBubywgSUluc3RhbmNlRGVzY3JpcHRpb24gY3VycmVudCkgeworCQlzdXBlcihwYXJlbnQsIG5leHQsIG5vLCBjdXJyZW50KTsKKwl9CisJCisJcHVibGljIEFzc2lnbm1lbnQgZ2V0R3JhbW1hckVsZW1lbnQoKSB7CisJCXJldHVybiBncmFtbWFyQWNjZXNzLmdldENvbnN0cmFpbnRBY2Nlc3MoKS5nZXRNaW5WYWx1ZUFzc2lnbm1lbnRfN18yKCk7CisJfQorCisJcHVibGljIEFic3RyYWN0VG9rZW4gY3JlYXRlRm9sbG93ZXIoaW50IGluZGV4LCBJSW5zdGFuY2VEZXNjcmlwdGlvbiBpbnN0KSB7CisJCXN3aXRjaChpbmRleCkgeworCQkJY2FzZSAwOiByZXR1cm4gbmV3IEludFZhbHVlX1ZhbHVlQXNzaWdubWVudCh0aGlzLCB0aGlzLCAwLCBpbnN0KTsKKwkJCWNhc2UgMTogcmV0dXJuIG5ldyBSZWFsVmFsdWVfVmFsdWVBc3NpZ25tZW50KHRoaXMsIHRoaXMsIDEsIGluc3QpOworCQkJZGVmYXVsdDogcmV0dXJuIG51bGw7CisJCX0JCisJfQkKKwkJCisJcHJvdGVjdGVkIElJbnN0YW5jZURlc2NyaXB0aW9uIHRyeUNvbnN1bWVWYWwoKSB7CisJCWlmKCh2YWx1ZSA9IGN1cnJlbnQuZ2V0Q29uc3VtYWJsZSgibWluVmFsdWUiLHRydWUpKSA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwkJSUluc3RhbmNlRGVzY3JpcHRpb24gb2JqID0gY3VycmVudC5jbG9uZUFuZENvbnN1bWUoIm1pblZhbHVlIik7CisJCWlmKHZhbHVlIGluc3RhbmNlb2YgRU9iamVjdCkgeyAvLyBvcmc6OmVjbGlwc2U6Onh0ZXh0OjppbXBsOjpSdWxlQ2FsbEltcGwKKwkJCUlJbnN0YW5jZURlc2NyaXB0aW9uIHBhcmFtID0gZ2V0RGVzY3IoKEVPYmplY3QpdmFsdWUpOworCQkJaWYocGFyYW0uaXNJbnN0YW5jZU9mKGdyYW1tYXJBY2Nlc3MuZ2V0SW50VmFsdWVSdWxlKCkuZ2V0VHlwZSgpLmdldENsYXNzaWZpZXIoKSkpIHsKKwkJCQl0eXBlID0gQXNzaWdubWVudFR5cGUuUFJDOworCQkJCWVsZW1lbnQgPSBncmFtbWFyQWNjZXNzLmdldENvbnN0cmFpbnRBY2Nlc3MoKS5nZXRNaW5WYWx1ZUludFZhbHVlUGFyc2VyUnVsZUNhbGxfN18yXzBfMCgpOyAKKwkJCQljb25zdW1lZCA9IG9iajsKKwkJCQlyZXR1cm4gcGFyYW07CisJCQl9CisJCX0KKwkJaWYodmFsdWUgaW5zdGFuY2VvZiBFT2JqZWN0KSB7IC8vIG9yZzo6ZWNsaXBzZTo6eHRleHQ6OmltcGw6OlJ1bGVDYWxsSW1wbAorCQkJSUluc3RhbmNlRGVzY3JpcHRpb24gcGFyYW0gPSBnZXREZXNjcigoRU9iamVjdCl2YWx1ZSk7CisJCQlpZihwYXJhbS5pc0luc3RhbmNlT2YoZ3JhbW1hckFjY2Vzcy5nZXRSZWFsVmFsdWVSdWxlKCkuZ2V0VHlwZSgpLmdldENsYXNzaWZpZXIoKSkpIHsKKwkJCQl0eXBlID0gQXNzaWdubWVudFR5cGUuUFJDOworCQkJCWVsZW1lbnQgPSBncmFtbWFyQWNjZXNzLmdldENvbnN0cmFpbnRBY2Nlc3MoKS5nZXRNaW5WYWx1ZVJlYWxWYWx1ZVBhcnNlclJ1bGVDYWxsXzdfMl8wXzEoKTsgCisJCQkJY29uc3VtZWQgPSBvYmo7CisJCQkJcmV0dXJuIHBhcmFtOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBBYnN0cmFjdFRva2VuIGNyZWF0ZVBhcmVudEZvbGxvd2VyKEFic3RyYWN0VG9rZW4gbmV4dCwJaW50IGFjdEluZGV4LCBpbnQgaW5kZXgsIElJbnN0YW5jZURlc2NyaXB0aW9uIGluc3QpIHsKKwkJaWYodmFsdWUgPT0gaW5zdC5nZXREZWxlZ2F0ZSgpICYmICFpbnN0LmlzQ29uc3VtZWQoKSkgcmV0dXJuIG51bGw7CisJCXN3aXRjaChpbmRleCkgeworCQkJY2FzZSAwOiByZXR1cm4gbmV3IENvbnN0cmFpbnRfTGVmdFNxdWFyZUJyYWNrZXRLZXl3b3JkXzdfMShwYXJlbnQsIG5leHQsIGFjdEluZGV4LCBjb25zdW1lZCk7CisJCQlkZWZhdWx0OiByZXR1cm4gbnVsbDsKKwkJfQkKKwl9CQorfQorCisvLyAiLCIKK3Byb3RlY3RlZCBjbGFzcyBDb25zdHJhaW50X0NvbW1hS2V5d29yZF83XzMgZXh0ZW5kcyBLZXl3b3JkVG9rZW4gIHsKKwkKKwlwdWJsaWMgQ29uc3RyYWludF9Db21tYUtleXdvcmRfN18zKEFic3RyYWN0VG9rZW4gcGFyZW50LCBBYnN0cmFjdFRva2VuIG5leHQsIGludCBubywgSUluc3RhbmNlRGVzY3JpcHRpb24gY3VycmVudCkgeworCQlzdXBlcihwYXJlbnQsIG5leHQsIG5vLCBjdXJyZW50KTsKKwl9CisJCisJcHVibGljIEtleXdvcmQgZ2V0R3JhbW1hckVsZW1lbnQoKSB7CisJCXJldHVybiBncmFtbWFyQWNjZXNzLmdldENvbnN0cmFpbnRBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfN18zKCk7CisJfQorCisJcHVibGljIEFic3RyYWN0VG9rZW4gY3JlYXRlRm9sbG93ZXIoaW50IGluZGV4LCBJSW5zdGFuY2VEZXNjcmlwdGlvbiBpbnN0KSB7CisJCXN3aXRjaChpbmRleCkgeworCQkJY2FzZSAwOiByZXR1cm4gbmV3IENvbnN0cmFpbnRfTWluVmFsdWVBc3NpZ25tZW50XzdfMihwYXJlbnQsIHRoaXMsIDAsIGluc3QpOworCQkJZGVmYXVsdDogcmV0dXJuIG51bGw7CisJCX0JCisJfQkKKwkJCit9CisKKy8vIG1heFZhbHVlPSggSW50VmFsdWUgfCBSZWFsVmFsdWUgKQorcHJvdGVjdGVkIGNsYXNzIENvbnN0cmFpbnRfTWF4VmFsdWVBc3NpZ25tZW50XzdfNCBleHRlbmRzIEFzc2lnbm1lbnRUb2tlbiAgeworCQorCXB1YmxpYyBDb25zdHJhaW50X01heFZhbHVlQXNzaWdubWVudF83XzQoQWJzdHJhY3RUb2tlbiBwYXJlbnQsIEFic3RyYWN0VG9rZW4gbmV4dCwgaW50IG5vLCBJSW5zdGFuY2VEZXNjcmlwdGlvbiBjdXJyZW50KSB7CisJCXN1cGVyKHBhcmVudCwgbmV4dCwgbm8sIGN1cnJlbnQpOworCX0KKwkKKwlwdWJsaWMgQXNzaWdubWVudCBnZXRHcmFtbWFyRWxlbWVudCgpIHsKKwkJcmV0dXJuIGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludEFjY2VzcygpLmdldE1heFZhbHVlQXNzaWdubWVudF83XzQoKTsKKwl9CisKKwlwdWJsaWMgQWJzdHJhY3RUb2tlbiBjcmVhdGVGb2xsb3dlcihpbnQgaW5kZXgsIElJbnN0YW5jZURlc2NyaXB0aW9uIGluc3QpIHsKKwkJc3dpdGNoKGluZGV4KSB7CisJCQljYXNlIDA6IHJldHVybiBuZXcgSW50VmFsdWVfVmFsdWVBc3NpZ25tZW50KHRoaXMsIHRoaXMsIDAsIGluc3QpOworCQkJY2FzZSAxOiByZXR1cm4gbmV3IFJlYWxWYWx1ZV9WYWx1ZUFzc2lnbm1lbnQodGhpcywgdGhpcywgMSwgaW5zdCk7CisJCQlkZWZhdWx0OiByZXR1cm4gbnVsbDsKKwkJfQkKKwl9CQorCQkKKwlwcm90ZWN0ZWQgSUluc3RhbmNlRGVzY3JpcHRpb24gdHJ5Q29uc3VtZVZhbCgpIHsKKwkJaWYoKHZhbHVlID0gY3VycmVudC5nZXRDb25zdW1hYmxlKCJtYXhWYWx1ZSIsdHJ1ZSkpID09IG51bGwpIHJldHVybiBudWxsOworCQlJSW5zdGFuY2VEZXNjcmlwdGlvbiBvYmogPSBjdXJyZW50LmNsb25lQW5kQ29uc3VtZSgibWF4VmFsdWUiKTsKKwkJaWYodmFsdWUgaW5zdGFuY2VvZiBFT2JqZWN0KSB7IC8vIG9yZzo6ZWNsaXBzZTo6eHRleHQ6OmltcGw6OlJ1bGVDYWxsSW1wbAorCQkJSUluc3RhbmNlRGVzY3JpcHRpb24gcGFyYW0gPSBnZXREZXNjcigoRU9iamVjdCl2YWx1ZSk7CisJCQlpZihwYXJhbS5pc0luc3RhbmNlT2YoZ3JhbW1hckFjY2Vzcy5nZXRJbnRWYWx1ZVJ1bGUoKS5nZXRUeXBlKCkuZ2V0Q2xhc3NpZmllcigpKSkgeworCQkJCXR5cGUgPSBBc3NpZ25tZW50VHlwZS5QUkM7CisJCQkJZWxlbWVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludEFjY2VzcygpLmdldE1heFZhbHVlSW50VmFsdWVQYXJzZXJSdWxlQ2FsbF83XzRfMF8wKCk7IAorCQkJCWNvbnN1bWVkID0gb2JqOworCQkJCXJldHVybiBwYXJhbTsKKwkJCX0KKwkJfQorCQlpZih2YWx1ZSBpbnN0YW5jZW9mIEVPYmplY3QpIHsgLy8gb3JnOjplY2xpcHNlOjp4dGV4dDo6aW1wbDo6UnVsZUNhbGxJbXBsCisJCQlJSW5zdGFuY2VEZXNjcmlwdGlvbiBwYXJhbSA9IGdldERlc2NyKChFT2JqZWN0KXZhbHVlKTsKKwkJCWlmKHBhcmFtLmlzSW5zdGFuY2VPZihncmFtbWFyQWNjZXNzLmdldFJlYWxWYWx1ZVJ1bGUoKS5nZXRUeXBlKCkuZ2V0Q2xhc3NpZmllcigpKSkgeworCQkJCXR5cGUgPSBBc3NpZ25tZW50VHlwZS5QUkM7CisJCQkJZWxlbWVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludEFjY2VzcygpLmdldE1heFZhbHVlUmVhbFZhbHVlUGFyc2VyUnVsZUNhbGxfN180XzBfMSgpOyAKKwkJCQljb25zdW1lZCA9IG9iajsKKwkJCQlyZXR1cm4gcGFyYW07CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIEFic3RyYWN0VG9rZW4gY3JlYXRlUGFyZW50Rm9sbG93ZXIoQWJzdHJhY3RUb2tlbiBuZXh0LAlpbnQgYWN0SW5kZXgsIGludCBpbmRleCwgSUluc3RhbmNlRGVzY3JpcHRpb24gaW5zdCkgeworCQlpZih2YWx1ZSA9PSBpbnN0LmdldERlbGVnYXRlKCkgJiYgIWluc3QuaXNDb25zdW1lZCgpKSByZXR1cm4gbnVsbDsKKwkJc3dpdGNoKGluZGV4KSB7CisJCQljYXNlIDA6IHJldHVybiBuZXcgQ29uc3RyYWludF9Db21tYUtleXdvcmRfN18zKHBhcmVudCwgbmV4dCwgYWN0SW5kZXgsIGNvbnN1bWVkKTsKKwkJCWRlZmF1bHQ6IHJldHVybiBudWxsOworCQl9CQorCX0JCit9CisKKy8vICJdIgorcHJvdGVjdGVkIGNsYXNzIENvbnN0cmFpbnRfUmlnaHRTcXVhcmVCcmFja2V0S2V5d29yZF83XzUgZXh0ZW5kcyBLZXl3b3JkVG9rZW4gIHsKKwkKKwlwdWJsaWMgQ29uc3RyYWludF9SaWdodFNxdWFyZUJyYWNrZXRLZXl3b3JkXzdfNShBYnN0cmFjdFRva2VuIHBhcmVudCwgQWJzdHJhY3RUb2tlbiBuZXh0LCBpbnQgbm8sIElJbnN0YW5jZURlc2NyaXB0aW9uIGN1cnJlbnQpIHsKKwkJc3VwZXIocGFyZW50LCBuZXh0LCBubywgY3VycmVudCk7CisJfQorCQorCXB1YmxpYyBLZXl3b3JkIGdldEdyYW1tYXJFbGVtZW50KCkgeworCQlyZXR1cm4gZ3JhbW1hckFjY2Vzcy5nZXRDb25zdHJhaW50QWNjZXNzKCkuZ2V0UmlnaHRTcXVhcmVCcmFja2V0S2V5d29yZF83XzUoKTsKKwl9CisKKwlwdWJsaWMgQWJzdHJhY3RUb2tlbiBjcmVhdGVGb2xsb3dlcihpbnQgaW5kZXgsIElJbnN0YW5jZURlc2NyaXB0aW9uIGluc3QpIHsKKwkJc3dpdGNoKGluZGV4KSB7CisJCQljYXNlIDA6IHJldHVybiBuZXcgQ29uc3RyYWludF9NYXhWYWx1ZUFzc2lnbm1lbnRfN180KHBhcmVudCwgdGhpcywgMCwgaW5zdCk7CisJCQlkZWZhdWx0OiByZXR1cm4gbnVsbDsKKwkJfQkKKwl9CQorCQkKK30KKworCisKKy8qKioqKioqKioqKiogZW5kIFJ1bGUgQ29uc3RyYWludCAqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKiogYmVnaW4gUnVsZSBJbnRWYWx1ZSAqKioqKioqKioqKioqKioqCisgKgorICogSW50VmFsdWU6CisgKiAgIHZhbHVlPUlOVDsKKyAqCisgKiovCisKKy8vIHZhbHVlPUlOVAorcHJvdGVjdGVkIGNsYXNzIEludFZhbHVlX1ZhbHVlQXNzaWdubWVudCBleHRlbmRzIEFzc2lnbm1lbnRUb2tlbiAgeworCQorCXB1YmxpYyBJbnRWYWx1ZV9WYWx1ZUFzc2lnbm1lbnQoQWJzdHJhY3RUb2tlbiBwYXJlbnQsIEFic3RyYWN0VG9rZW4gbmV4dCwgaW50IG5vLCBJSW5zdGFuY2VEZXNjcmlwdGlvbiBjdXJyZW50KSB7CisJCXN1cGVyKHBhcmVudCwgbmV4dCwgbm8sIGN1cnJlbnQpOworCX0KKwkKKwlwdWJsaWMgQXNzaWdubWVudCBnZXRHcmFtbWFyRWxlbWVudCgpIHsKKwkJcmV0dXJuIGdyYW1tYXJBY2Nlc3MuZ2V0SW50VmFsdWVBY2Nlc3MoKS5nZXRWYWx1ZUFzc2lnbm1lbnQoKTsKKwl9CisKKwlwdWJsaWMgQWJzdHJhY3RUb2tlbiBjcmVhdGVGb2xsb3dlcihpbnQgaW5kZXgsIElJbnN0YW5jZURlc2NyaXB0aW9uIGluc3QpIHsKKwkJc3dpdGNoKGluZGV4KSB7CisJCQlkZWZhdWx0OiByZXR1cm4gcGFyZW50LmNyZWF0ZVBhcmVudEZvbGxvd2VyKHRoaXMsIGluZGV4LCBpbmRleCwgaW5zdCk7CisJCX0JCisJfQkKKwkJCisJcHVibGljIElJbnN0YW5jZURlc2NyaXB0aW9uIHRyeUNvbnN1bWUoKSB7CisJCWlmKCFjdXJyZW50LmlzSW5zdGFuY2VPZihncmFtbWFyQWNjZXNzLmdldEludFZhbHVlUnVsZSgpLmdldFR5cGUoKS5nZXRDbGFzc2lmaWVyKCkpKSByZXR1cm4gbnVsbDsKKwkJcmV0dXJuIHRyeUNvbnN1bWVWYWwoKTsKKwl9CisJcHJvdGVjdGVkIElJbnN0YW5jZURlc2NyaXB0aW9uIHRyeUNvbnN1bWVWYWwoKSB7CisJCWlmKCh2YWx1ZSA9IGN1cnJlbnQuZ2V0Q29uc3VtYWJsZSgidmFsdWUiLHRydWUpKSA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwkJSUluc3RhbmNlRGVzY3JpcHRpb24gb2JqID0gY3VycmVudC5jbG9uZUFuZENvbnN1bWUoInZhbHVlIik7CisJCWlmKEJvb2xlYW4uVFJVRS5ib29sZWFuVmFsdWUoKSkgeyAvLyBvcmc6OmVjbGlwc2U6Onh0ZXh0OjppbXBsOjpSdWxlQ2FsbEltcGwgRklYTUU6IGNoZWNrIGlmIHZhbHVlIGlzIHZhbGlkIGZvciBsZXhlciBydWxlCisJCQl0eXBlID0gQXNzaWdubWVudFR5cGUuTFJDOworCQkJZWxlbWVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0SW50VmFsdWVBY2Nlc3MoKS5nZXRWYWx1ZUlOVFRlcm1pbmFsUnVsZUNhbGxfMCgpOworCQkJcmV0dXJuIG9iajsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKK30KKworLyoqKioqKioqKioqKiBlbmQgUnVsZSBJbnRWYWx1ZSAqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKiogYmVnaW4gUnVsZSBSZWFsVmFsdWUgKioqKioqKioqKioqKioqKgorICoKKyAqIFJlYWxWYWx1ZToKKyAqICAgdmFsdWU9UkVBTDsKKyAqCisgKiovCisKKy8vIHZhbHVlPVJFQUwKK3Byb3RlY3RlZCBjbGFzcyBSZWFsVmFsdWVfVmFsdWVBc3NpZ25tZW50IGV4dGVuZHMgQXNzaWdubWVudFRva2VuICB7CisJCisJcHVibGljIFJlYWxWYWx1ZV9WYWx1ZUFzc2lnbm1lbnQoQWJzdHJhY3RUb2tlbiBwYXJlbnQsIEFic3RyYWN0VG9rZW4gbmV4dCwgaW50IG5vLCBJSW5zdGFuY2VEZXNjcmlwdGlvbiBjdXJyZW50KSB7CisJCXN1cGVyKHBhcmVudCwgbmV4dCwgbm8sIGN1cnJlbnQpOworCX0KKwkKKwlwdWJsaWMgQXNzaWdubWVudCBnZXRHcmFtbWFyRWxlbWVudCgpIHsKKwkJcmV0dXJuIGdyYW1tYXJBY2Nlc3MuZ2V0UmVhbFZhbHVlQWNjZXNzKCkuZ2V0VmFsdWVBc3NpZ25tZW50KCk7CisJfQorCisJcHVibGljIEFic3RyYWN0VG9rZW4gY3JlYXRlRm9sbG93ZXIoaW50IGluZGV4LCBJSW5zdGFuY2VEZXNjcmlwdGlvbiBpbnN0KSB7CisJCXN3aXRjaChpbmRleCkgeworCQkJZGVmYXVsdDogcmV0dXJuIHBhcmVudC5jcmVhdGVQYXJlbnRGb2xsb3dlcih0aGlzLCBpbmRleCwgaW5kZXgsIGluc3QpOworCQl9CQorCX0JCisJCQorCXB1YmxpYyBJSW5zdGFuY2VEZXNjcmlwdGlvbiB0cnlDb25zdW1lKCkgeworCQlpZighY3VycmVudC5pc0luc3RhbmNlT2YoZ3JhbW1hckFjY2Vzcy5nZXRSZWFsVmFsdWVSdWxlKCkuZ2V0VHlwZSgpLmdldENsYXNzaWZpZXIoKSkpIHJldHVybiBudWxsOworCQlyZXR1cm4gdHJ5Q29uc3VtZVZhbCgpOworCX0KKwlwcm90ZWN0ZWQgSUluc3RhbmNlRGVzY3JpcHRpb24gdHJ5Q29uc3VtZVZhbCgpIHsKKwkJaWYoKHZhbHVlID0gY3VycmVudC5nZXRDb25zdW1hYmxlKCJ2YWx1ZSIsdHJ1ZSkpID09IG51bGwpIHJldHVybiBudWxsOworCQlJSW5zdGFuY2VEZXNjcmlwdGlvbiBvYmogPSBjdXJyZW50LmNsb25lQW5kQ29uc3VtZSgidmFsdWUiKTsKKwkJaWYoQm9vbGVhbi5UUlVFLmJvb2xlYW5WYWx1ZSgpKSB7IC8vIG9yZzo6ZWNsaXBzZTo6eHRleHQ6OmltcGw6OlJ1bGVDYWxsSW1wbCBGSVhNRTogY2hlY2sgaWYgdmFsdWUgaXMgdmFsaWQgZm9yIGxleGVyIHJ1bGUKKwkJCXR5cGUgPSBBc3NpZ25tZW50VHlwZS5MUkM7CisJCQllbGVtZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRSZWFsVmFsdWVBY2Nlc3MoKS5nZXRWYWx1ZVJFQUxUZXJtaW5hbFJ1bGVDYWxsXzAoKTsKKwkJCXJldHVybiBvYmo7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCit9CisKKy8qKioqKioqKioqKiogZW5kIFJ1bGUgUmVhbFZhbHVlICoqKioqKioqKioqKioqKiovCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL0FUZXN0QW50bHJUb2tlbkZpbGVQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvQVRlc3RBbnRsclRva2VuRmlsZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI3ZTRmNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL0FUZXN0QW50bHJUb2tlbkZpbGVQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisqIGdlbmVyYXRlZCBieSBYdGV4dAorKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLnBhcnNlci5hbnRscjsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLklBbnRsclRva2VuRmlsZVByb3ZpZGVyOworCitwdWJsaWMgY2xhc3MgQVRlc3RBbnRsclRva2VuRmlsZVByb3ZpZGVyIGltcGxlbWVudHMgSUFudGxyVG9rZW5GaWxlUHJvdmlkZXIgeworCQorCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRBbnRsclRva2VuRmlsZSgpIHsKKwkJQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7CisgICAgCXJldHVybiBjbGFzc0xvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKCJvcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QudG9rZW5zIik7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvQVRlc3RQYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL0FUZXN0UGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY2OTM3NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL0FUZXN0UGFyc2VyLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyogZ2VuZXJhdGVkIGJ5IFh0ZXh0CisqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcucGFyc2VyLmFudGxyOworCitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuQU5UTFJJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuSVRva2VuRGVmUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLklQYXJzZVJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLlh0ZXh0VG9rZW5TdHJlYW07CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcuc2VydmljZXMuQVRlc3RHcmFtbWFyQWNjZXNzOworCitwdWJsaWMgY2xhc3MgQVRlc3RQYXJzZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuQWJzdHJhY3RBbnRsclBhcnNlciB7CisJCisJQEluamVjdCAKKyAgICBwcm90ZWN0ZWQgSVRva2VuRGVmUHJvdmlkZXIgYW50bHJUb2tlbkRlZlByb3ZpZGVyOworCQorCUBJbmplY3QKKwlwcml2YXRlIEFUZXN0R3JhbW1hckFjY2VzcyBncmFtbWFyQWNjZXNzOworCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBJUGFyc2VSZXN1bHQgcGFyc2UoU3RyaW5nIHJ1bGVOYW1lLCBBTlRMUklucHV0U3RyZWFtIGluKSB7CisJCW9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5wYXJzZXIuYW50bHIuaW50ZXJuYWwuSW50ZXJuYWxBVGVzdExleGVyIGxleGVyID0gbmV3IG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5wYXJzZXIuYW50bHIuaW50ZXJuYWwuSW50ZXJuYWxBVGVzdExleGVyKGluKTsKKwkJWHRleHRUb2tlblN0cmVhbSBzdHJlYW0gPSBuZXcgWHRleHRUb2tlblN0cmVhbShsZXhlciwgYW50bHJUb2tlbkRlZlByb3ZpZGVyKTsKKwkJc3RyZWFtLnNldEluaXRpYWxIaWRkZW5Ub2tlbnMoIlJVTEVfV1MiLCAiUlVMRV9NTF9DT01NRU5UIiwgIlJVTEVfU0xfQ09NTUVOVCIpOworCQlvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcucGFyc2VyLmFudGxyLmludGVybmFsLkludGVybmFsQVRlc3RQYXJzZXIgcGFyc2VyID0gbmV3IG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5wYXJzZXIuYW50bHIuaW50ZXJuYWwuSW50ZXJuYWxBVGVzdFBhcnNlcigKKwkJCQlzdHJlYW0sIGdldEVsZW1lbnRGYWN0b3J5KCksIGdyYW1tYXJBY2Nlc3MpOworCQlwYXJzZXIuc2V0VG9rZW5UeXBlTWFwKGFudGxyVG9rZW5EZWZQcm92aWRlci5nZXRUb2tlbkRlZk1hcCgpKTsKKwkJdHJ5IHsKKwkJCWlmKHJ1bGVOYW1lICE9IG51bGwpCisJCQkJcmV0dXJuIHBhcnNlci5wYXJzZShydWxlTmFtZSk7CisJCQlyZXR1cm4gcGFyc2VyLnBhcnNlKCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiByZSkgeworCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKHJlLmdldE1lc3NhZ2UoKSxyZSk7CisJCX0KKwl9CisJCisJQE92ZXJyaWRlIAorCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFJ1bGVOYW1lKCkgeworCQlyZXR1cm4gIk1vZGVsIjsKKwl9CisJCisJcHVibGljIEFUZXN0R3JhbW1hckFjY2VzcyBnZXRHcmFtbWFyQWNjZXNzKCkgeworCQlyZXR1cm4gdGhpcy5ncmFtbWFyQWNjZXNzOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRHcmFtbWFyQWNjZXNzKEFUZXN0R3JhbW1hckFjY2VzcyBncmFtbWFyQWNjZXNzKSB7CisJCXRoaXMuZ3JhbW1hckFjY2VzcyA9IGdyYW1tYXJBY2Nlc3M7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYmUxN2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0LmcKQEAgLTAsMCArMSw1NDEgQEAKKy8qCisqIGdlbmVyYXRlZCBieSBYdGV4dAorKi8KK2dyYW1tYXIgSW50ZXJuYWxBVGVzdDsKKworb3B0aW9ucyB7CisJc3VwZXJDbGFzcz1BYnN0cmFjdEludGVybmFsQW50bHJQYXJzZXI7CisJCit9CisKK0BsZXhlcjo6aGVhZGVyIHsKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLnBhcnNlci5hbnRsci5pbnRlcm5hbDsKKworLy8gSGFjazogVXNlIG91ciBvd24gTGV4ZXIgc3VwZXJjbGFzcyBieSBtZWFucyBvZiBpbXBvcnQuIAorLy8gQ3VycmVudGx5IHRoZXJlIGlzIG5vIG90aGVyIHdheSB0byBzcGVjaWZ5IHRoZSBzdXBlcmNsYXNzIGZvciB0aGUgbGV4ZXIuCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLkxleGVyOworfQorCitAcGFyc2VyOjpoZWFkZXIgeworcGFja2FnZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcucGFyc2VyLmFudGxyLmludGVybmFsOyAKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuaW1wbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNldHJlZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuQWJzdHJhY3RJbnRlcm5hbEFudGxyUGFyc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5YdGV4dFRva2VuU3RyZWFtOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5YdGV4dFRva2VuU3RyZWFtLkhpZGRlblRva2VuczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuQW50bHJEYXRhdHlwZVJ1bGVUb2tlbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb252ZXJzaW9uLlZhbHVlQ29udmVydGVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5zZXJ2aWNlcy5BVGVzdEdyYW1tYXJBY2Nlc3M7CisKK30KKworQHBhcnNlcjo6bWVtYmVycyB7CisgCisgCXByaXZhdGUgQVRlc3RHcmFtbWFyQWNjZXNzIGdyYW1tYXJBY2Nlc3M7CisgCQorICAgIHB1YmxpYyBJbnRlcm5hbEFUZXN0UGFyc2VyKFRva2VuU3RyZWFtIGlucHV0LCBJQXN0RmFjdG9yeSBmYWN0b3J5LCBBVGVzdEdyYW1tYXJBY2Nlc3MgZ3JhbW1hckFjY2VzcykgeworICAgICAgICB0aGlzKGlucHV0KTsKKyAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKKyAgICAgICAgcmVnaXN0ZXJSdWxlcyhncmFtbWFyQWNjZXNzLmdldEdyYW1tYXIoKSk7CisgICAgICAgIHRoaXMuZ3JhbW1hckFjY2VzcyA9IGdyYW1tYXJBY2Nlc3M7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBnZXRUb2tlbkZpbGUoKSB7CisgICAgCUNsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOworICAgIAlyZXR1cm4gY2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbSgib3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0LnRva2VucyIpOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEZpcnN0UnVsZU5hbWUoKSB7CisgICAgCXJldHVybiAiTW9kZWwiOwkKKyAgIAl9IAorfQorCitAcnVsZWNhdGNoIHsgCisgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICB9IAorfQorCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU1vZGVsCitlbnRyeVJ1bGVNb2RlbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOgorCXsgY3VycmVudE5vZGUgPSBjcmVhdGVDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TW9kZWxSdWxlKCksIGN1cnJlbnROb2RlKTsgfQorCSBpdl9ydWxlTW9kZWw9cnVsZU1vZGVsIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlTW9kZWwuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIE1vZGVsCitydWxlTW9kZWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgRU9iamVjdCB0ZW1wPW51bGw7IHNldEN1cnJlbnRMb29rYWhlYWQoKTsgcmVzZXRMb29rYWhlYWQoKTsgCisgICAgfQorICAgIEBhZnRlciB7IHJlc2V0TG9va2FoZWFkKCk7IAorICAgIAlsYXN0Q29uc3VtZWROb2RlID0gY3VycmVudE5vZGU7CisgICAgfToKKygoCQorCQorCSAgICBsdl9uYW1lXzA9CVJVTEVfU1RSSU5HCisJeworCQljcmVhdGVMZWFmTm9kZShncmFtbWFyQWNjZXNzLmdldE1vZGVsQWNjZXNzKCkuZ2V0TmFtZVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMF8wKCksICJuYW1lIik7IAorCX0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBmYWN0b3J5LmNyZWF0ZShncmFtbWFyQWNjZXNzLmdldE1vZGVsUnVsZSgpLmdldFR5cGUoKS5nZXRDbGFzc2lmaWVyKCkpOworCSAgICAgICAgICAgIGFzc29jaWF0ZU5vZGVXaXRoQXN0RWxlbWVudChjdXJyZW50Tm9kZSwgJGN1cnJlbnQpOworCSAgICAgICAgfQorCSAgICAgICAgCisJICAgICAgICB0cnkgeworCSAgICAgICAJCXNldCgkY3VycmVudCwgIm5hbWUiLCBsdl9uYW1lXzAsICJTVFJJTkciLCBsYXN0Q29uc3VtZWROb2RlKTsKKwkgICAgICAgIH0gY2F0Y2ggKFZhbHVlQ29udmVydGVyRXhjZXB0aW9uIHZjZSkgeworCQkJCWhhbmRsZVZhbHVlQ29udmVydGVyRXhjZXB0aW9uKHZjZSk7CisJICAgICAgICB9CisJICAgIH0KKwkKKyk/KAkKKwkKKwkgICAgbHZfZGVzY3JpcHRpb25fMT0JUlVMRV9QTEFJTl9TVFJJTkcKKwl7CisJCWNyZWF0ZUxlYWZOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TW9kZWxBY2Nlc3MoKS5nZXREZXNjcmlwdGlvblBMQUlOX1NUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMV8wKCksICJkZXNjcmlwdGlvbiIpOyAKKwl9CisgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gZmFjdG9yeS5jcmVhdGUoZ3JhbW1hckFjY2Vzcy5nZXRNb2RlbFJ1bGUoKS5nZXRUeXBlKCkuZ2V0Q2xhc3NpZmllcigpKTsKKwkgICAgICAgICAgICBhc3NvY2lhdGVOb2RlV2l0aEFzdEVsZW1lbnQoY3VycmVudE5vZGUsICRjdXJyZW50KTsKKwkgICAgICAgIH0KKwkgICAgICAgIAorCSAgICAgICAgdHJ5IHsKKwkgICAgICAgCQlzZXQoJGN1cnJlbnQsICJkZXNjcmlwdGlvbiIsIGx2X2Rlc2NyaXB0aW9uXzEsICJQTEFJTl9TVFJJTkciLCBsYXN0Q29uc3VtZWROb2RlKTsKKwkgICAgICAgIH0gY2F0Y2ggKFZhbHVlQ29udmVydGVyRXhjZXB0aW9uIHZjZSkgeworCQkJCWhhbmRsZVZhbHVlQ29udmVydGVyRXhjZXB0aW9uKHZjZSk7CisJICAgICAgICB9CisJICAgIH0KKwkKKyk/KAkKKwkKKwkgICAgCisJICAgIHsgCisJICAgICAgICBjdXJyZW50Tm9kZT1jcmVhdGVDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TW9kZWxBY2Nlc3MoKS5nZXRUZXN0c1Rlc3RzUGFyc2VyUnVsZUNhbGxfMl8wKCksIGN1cnJlbnROb2RlKTsgCisJICAgIH0KKwkgICAgbHZfdGVzdHNfMj1ydWxlVGVzdHMgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gZmFjdG9yeS5jcmVhdGUoZ3JhbW1hckFjY2Vzcy5nZXRNb2RlbFJ1bGUoKS5nZXRUeXBlKCkuZ2V0Q2xhc3NpZmllcigpKTsKKwkgICAgICAgICAgICBhc3NvY2lhdGVOb2RlV2l0aEFzdEVsZW1lbnQoY3VycmVudE5vZGUuZ2V0UGFyZW50KCksICRjdXJyZW50KTsKKwkgICAgICAgIH0KKwkgICAgICAgIAorCSAgICAgICAgdHJ5IHsKKwkgICAgICAgCQlzZXQoJGN1cnJlbnQsICJ0ZXN0cyIsIGx2X3Rlc3RzXzIsICJUZXN0cyIsIGN1cnJlbnROb2RlKTsKKwkgICAgICAgIH0gY2F0Y2ggKFZhbHVlQ29udmVydGVyRXhjZXB0aW9uIHZjZSkgeworCQkJCWhhbmRsZVZhbHVlQ29udmVydGVyRXhjZXB0aW9uKHZjZSk7CisJICAgICAgICB9CisJICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmdldFBhcmVudCgpOworCSAgICB9CisJCispPygJCisJCisJICAgIAorCSAgICB7IAorCSAgICAgICAgY3VycmVudE5vZGU9Y3JlYXRlQ29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE1vZGVsQWNjZXNzKCkuZ2V0Q29udHJhaW50c0NvbnN0cmFpbnRQYXJzZXJSdWxlQ2FsbF8zXzAoKSwgY3VycmVudE5vZGUpOyAKKwkgICAgfQorCSAgICBsdl9jb250cmFpbnRzXzM9cnVsZUNvbnN0cmFpbnQgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gZmFjdG9yeS5jcmVhdGUoZ3JhbW1hckFjY2Vzcy5nZXRNb2RlbFJ1bGUoKS5nZXRUeXBlKCkuZ2V0Q2xhc3NpZmllcigpKTsKKwkgICAgICAgICAgICBhc3NvY2lhdGVOb2RlV2l0aEFzdEVsZW1lbnQoY3VycmVudE5vZGUuZ2V0UGFyZW50KCksICRjdXJyZW50KTsKKwkgICAgICAgIH0KKwkgICAgICAgIAorCSAgICAgICAgdHJ5IHsKKwkgICAgICAgCQlhZGQoJGN1cnJlbnQsICJjb250cmFpbnRzIiwgbHZfY29udHJhaW50c18zLCAiQ29uc3RyYWludCIsIGN1cnJlbnROb2RlKTsKKwkgICAgICAgIH0gY2F0Y2ggKFZhbHVlQ29udmVydGVyRXhjZXB0aW9uIHZjZSkgeworCQkJCWhhbmRsZVZhbHVlQ29udmVydGVyRXhjZXB0aW9uKHZjZSk7CisJICAgICAgICB9CisJICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmdldFBhcmVudCgpOworCSAgICB9CisJCispKik7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVUZXN0cworZW50cnlSdWxlVGVzdHMgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDoKKwl7IGN1cnJlbnROb2RlID0gY3JlYXRlQ29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFRlc3RzUnVsZSgpLCBjdXJyZW50Tm9kZSk7IH0KKwkgaXZfcnVsZVRlc3RzPXJ1bGVUZXN0cyAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVRlc3RzLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBUZXN0cworcnVsZVRlc3RzIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IEVPYmplY3QgdGVtcD1udWxsOyBzZXRDdXJyZW50TG9va2FoZWFkKCk7IHJlc2V0TG9va2FoZWFkKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyByZXNldExvb2thaGVhZCgpOyAKKyAgICAJbGFzdENvbnN1bWVkTm9kZSA9IGN1cnJlbnROb2RlOworICAgIH06CisoJ1RFU1RTJyAKKyAgICB7CisgICAgICAgIGNyZWF0ZUxlYWZOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VGVzdHNBY2Nlc3MoKS5nZXRURVNUU0tleXdvcmRfMCgpLCBudWxsKTsgCisgICAgfQorKAkKKwkKKwkgICAgbHZfaW1wb3J0VVJJXzE9CVJVTEVfU1RSSU5HCisJeworCQljcmVhdGVMZWFmTm9kZShncmFtbWFyQWNjZXNzLmdldFRlc3RzQWNjZXNzKCkuZ2V0SW1wb3J0VVJJU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8xXzAoKSwgImltcG9ydFVSSSIpOyAKKwl9CisgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gZmFjdG9yeS5jcmVhdGUoZ3JhbW1hckFjY2Vzcy5nZXRUZXN0c1J1bGUoKS5nZXRUeXBlKCkuZ2V0Q2xhc3NpZmllcigpKTsKKwkgICAgICAgICAgICBhc3NvY2lhdGVOb2RlV2l0aEFzdEVsZW1lbnQoY3VycmVudE5vZGUsICRjdXJyZW50KTsKKwkgICAgICAgIH0KKwkgICAgICAgIAorCSAgICAgICAgdHJ5IHsKKwkgICAgICAgCQlzZXQoJGN1cnJlbnQsICJpbXBvcnRVUkkiLCBsdl9pbXBvcnRVUklfMSwgIlNUUklORyIsIGxhc3RDb25zdW1lZE5vZGUpOworCSAgICAgICAgfSBjYXRjaCAoVmFsdWVDb252ZXJ0ZXJFeGNlcHRpb24gdmNlKSB7CisJCQkJaGFuZGxlVmFsdWVDb252ZXJ0ZXJFeGNlcHRpb24odmNlKTsKKwkgICAgICAgIH0KKwkgICAgfQorCQorKSk7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVDb25zdHJhaW50CitlbnRyeVJ1bGVDb25zdHJhaW50IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6CisJeyBjdXJyZW50Tm9kZSA9IGNyZWF0ZUNvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDb25zdHJhaW50UnVsZSgpLCBjdXJyZW50Tm9kZSk7IH0KKwkgaXZfcnVsZUNvbnN0cmFpbnQ9cnVsZUNvbnN0cmFpbnQgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVDb25zdHJhaW50LmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBDb25zdHJhaW50CitydWxlQ29uc3RyYWludCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBFT2JqZWN0IHRlbXA9bnVsbDsgc2V0Q3VycmVudExvb2thaGVhZCgpOyByZXNldExvb2thaGVhZCgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgcmVzZXRMb29rYWhlYWQoKTsgCisgICAgCWxhc3RDb25zdW1lZE5vZGUgPSBjdXJyZW50Tm9kZTsKKyAgICB9OgorKCgJCisJCisJICAgIAorCSAgICB7IAorCSAgICAgICAgY3VycmVudE5vZGU9Y3JlYXRlQ29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENvbnN0cmFpbnRBY2Nlc3MoKS5nZXRNZWFzdXJlTWVhc3VyZUVudW1SdWxlQ2FsbF8wXzAoKSwgY3VycmVudE5vZGUpOyAKKwkgICAgfQorCSAgICBsdl9tZWFzdXJlXzA9cnVsZU1lYXN1cmUgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gZmFjdG9yeS5jcmVhdGUoZ3JhbW1hckFjY2Vzcy5nZXRDb25zdHJhaW50UnVsZSgpLmdldFR5cGUoKS5nZXRDbGFzc2lmaWVyKCkpOworCSAgICAgICAgICAgIGFzc29jaWF0ZU5vZGVXaXRoQXN0RWxlbWVudChjdXJyZW50Tm9kZS5nZXRQYXJlbnQoKSwgJGN1cnJlbnQpOworCSAgICAgICAgfQorCSAgICAgICAgCisJICAgICAgICB0cnkgeworCSAgICAgICAJCXNldCgkY3VycmVudCwgIm1lYXN1cmUiLCBsdl9tZWFzdXJlXzAsICJNZWFzdXJlIiwgbGFzdENvbnN1bWVkTm9kZSk7CisJICAgICAgICB9IGNhdGNoIChWYWx1ZUNvbnZlcnRlckV4Y2VwdGlvbiB2Y2UpIHsKKwkJCQloYW5kbGVWYWx1ZUNvbnZlcnRlckV4Y2VwdGlvbih2Y2UpOworCSAgICAgICAgfQorCSAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5nZXRQYXJlbnQoKTsKKwkgICAgfQorCQorKScoJyAKKyAgICB7CisgICAgICAgIGNyZWF0ZUxlYWZOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludEFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfMSgpLCBudWxsKTsgCisgICAgfQorKAkKKwkKKwkJCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gZmFjdG9yeS5jcmVhdGUoZ3JhbW1hckFjY2Vzcy5nZXRDb25zdHJhaW50UnVsZSgpLmdldFR5cGUoKS5nZXRDbGFzc2lmaWVyKCkpOworCSAgICAgICAgICAgIGFzc29jaWF0ZU5vZGVXaXRoQXN0RWxlbWVudChjdXJyZW50Tm9kZSwgJGN1cnJlbnQpOworCSAgICAgICAgfQorICAgICAgICB9CisJUlVMRV9TVFJJTkcKKwl7CisJCWNyZWF0ZUxlYWZOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludEFjY2VzcygpLmdldEFnZW50U0FnZW50Q3Jvc3NSZWZlcmVuY2VfMl8wKCksICJhZ2VudCIpOyAKKwl9CisKKwkJLy8gVE9ETyBhc3NpZ24gZmVhdHVyZSB0byBjdXJyZW50Tm9kZQorCQorKSc6JyAKKyAgICB7CisgICAgICAgIGNyZWF0ZUxlYWZOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludEFjY2VzcygpLmdldENvbG9uS2V5d29yZF8zKCksIG51bGwpOyAKKyAgICB9CisoCQorCQorCQkKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBmYWN0b3J5LmNyZWF0ZShncmFtbWFyQWNjZXNzLmdldENvbnN0cmFpbnRSdWxlKCkuZ2V0VHlwZSgpLmdldENsYXNzaWZpZXIoKSk7CisJICAgICAgICAgICAgYXNzb2NpYXRlTm9kZVdpdGhBc3RFbGVtZW50KGN1cnJlbnROb2RlLCAkY3VycmVudCk7CisJICAgICAgICB9CisgICAgICAgIH0KKwlSVUxFX1NUUklORworCXsKKwkJY3JlYXRlTGVhZk5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDb25zdHJhaW50QWNjZXNzKCkuZ2V0QXR0cmlidXRlU0F0dHJpYnV0ZUNyb3NzUmVmZXJlbmNlXzRfMCgpLCAiYXR0cmlidXRlIik7IAorCX0KKworCQkvLyBUT0RPIGFzc2lnbiBmZWF0dXJlIHRvIGN1cnJlbnROb2RlCisJCispKCc6JyAKKyAgICB7CisgICAgICAgIGNyZWF0ZUxlYWZOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludEFjY2VzcygpLmdldENvbG9uS2V5d29yZF81XzAoKSwgbnVsbCk7IAorICAgIH0KKygJCisJCisJCQorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGZhY3RvcnkuY3JlYXRlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludFJ1bGUoKS5nZXRUeXBlKCkuZ2V0Q2xhc3NpZmllcigpKTsKKwkgICAgICAgICAgICBhc3NvY2lhdGVOb2RlV2l0aEFzdEVsZW1lbnQoY3VycmVudE5vZGUsICRjdXJyZW50KTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCVJVTEVfU1RSSU5HCisJeworCQljcmVhdGVMZWFmTm9kZShncmFtbWFyQWNjZXNzLmdldENvbnN0cmFpbnRBY2Nlc3MoKS5nZXRRdWFsaWZpZXJTU3RhdGVWYWx1ZUNyb3NzUmVmZXJlbmNlXzVfMV8wKCksICJxdWFsaWZpZXIiKTsgCisJfQorCisJCS8vIFRPRE8gYXNzaWduIGZlYXR1cmUgdG8gY3VycmVudE5vZGUKKwkKKykpPycpJyAKKyAgICB7CisgICAgICAgIGNyZWF0ZUxlYWZOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludEFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzYoKSwgbnVsbCk7IAorICAgIH0KKygnPScgCisgICAgeworICAgICAgICBjcmVhdGVMZWFmTm9kZShncmFtbWFyQWNjZXNzLmdldENvbnN0cmFpbnRBY2Nlc3MoKS5nZXRFcXVhbHNTaWduS2V5d29yZF83XzAoKSwgbnVsbCk7IAorICAgIH0KKydbJyAKKyAgICB7CisgICAgICAgIGNyZWF0ZUxlYWZOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludEFjY2VzcygpLmdldExlZnRTcXVhcmVCcmFja2V0S2V5d29yZF83XzEoKSwgbnVsbCk7IAorICAgIH0KKygJCisJCisJICAgIGx2X21pblZhbHVlXzEwPSgJeyAKKyAgICAgICAgY3VycmVudE5vZGU9Y3JlYXRlQ29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENvbnN0cmFpbnRBY2Nlc3MoKS5nZXRNaW5WYWx1ZUludFZhbHVlUGFyc2VyUnVsZUNhbGxfN18yXzBfMCgpLCBjdXJyZW50Tm9kZSk7IAorICAgIH0KKwlydWxlSW50VmFsdWUJeyAKKyAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5nZXRQYXJlbnQoKTsKKyAgICB9CisKKyAgICB8CXsgCisgICAgICAgIGN1cnJlbnROb2RlPWNyZWF0ZUNvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDb25zdHJhaW50QWNjZXNzKCkuZ2V0TWluVmFsdWVSZWFsVmFsdWVQYXJzZXJSdWxlQ2FsbF83XzJfMF8xKCksIGN1cnJlbnROb2RlKTsgCisgICAgfQorCXJ1bGVSZWFsVmFsdWUJeyAKKyAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5nZXRQYXJlbnQoKTsKKyAgICB9CispCisgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gZmFjdG9yeS5jcmVhdGUoZ3JhbW1hckFjY2Vzcy5nZXRDb25zdHJhaW50UnVsZSgpLmdldFR5cGUoKS5nZXRDbGFzc2lmaWVyKCkpOworCSAgICAgICAgICAgIGFzc29jaWF0ZU5vZGVXaXRoQXN0RWxlbWVudChjdXJyZW50Tm9kZSwgJGN1cnJlbnQpOworCSAgICAgICAgfQorCSAgICAgICAgCisJICAgICAgICB0cnkgeworCSAgICAgICAJCXNldCgkY3VycmVudCwgIm1pblZhbHVlIiwgbHZfbWluVmFsdWVfMTAsIG51bGwsIGxhc3RDb25zdW1lZE5vZGUpOworCSAgICAgICAgfSBjYXRjaCAoVmFsdWVDb252ZXJ0ZXJFeGNlcHRpb24gdmNlKSB7CisJCQkJaGFuZGxlVmFsdWVDb252ZXJ0ZXJFeGNlcHRpb24odmNlKTsKKwkgICAgICAgIH0KKwkgICAgfQorCQorKScsJyAKKyAgICB7CisgICAgICAgIGNyZWF0ZUxlYWZOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludEFjY2VzcygpLmdldENvbW1hS2V5d29yZF83XzMoKSwgbnVsbCk7IAorICAgIH0KKygJCisJCisJICAgIGx2X21heFZhbHVlXzEyPSgJeyAKKyAgICAgICAgY3VycmVudE5vZGU9Y3JlYXRlQ29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENvbnN0cmFpbnRBY2Nlc3MoKS5nZXRNYXhWYWx1ZUludFZhbHVlUGFyc2VyUnVsZUNhbGxfN180XzBfMCgpLCBjdXJyZW50Tm9kZSk7IAorICAgIH0KKwlydWxlSW50VmFsdWUJeyAKKyAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5nZXRQYXJlbnQoKTsKKyAgICB9CisKKyAgICB8CXsgCisgICAgICAgIGN1cnJlbnROb2RlPWNyZWF0ZUNvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDb25zdHJhaW50QWNjZXNzKCkuZ2V0TWF4VmFsdWVSZWFsVmFsdWVQYXJzZXJSdWxlQ2FsbF83XzRfMF8xKCksIGN1cnJlbnROb2RlKTsgCisgICAgfQorCXJ1bGVSZWFsVmFsdWUJeyAKKyAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5nZXRQYXJlbnQoKTsKKyAgICB9CispCisgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gZmFjdG9yeS5jcmVhdGUoZ3JhbW1hckFjY2Vzcy5nZXRDb25zdHJhaW50UnVsZSgpLmdldFR5cGUoKS5nZXRDbGFzc2lmaWVyKCkpOworCSAgICAgICAgICAgIGFzc29jaWF0ZU5vZGVXaXRoQXN0RWxlbWVudChjdXJyZW50Tm9kZSwgJGN1cnJlbnQpOworCSAgICAgICAgfQorCSAgICAgICAgCisJICAgICAgICB0cnkgeworCSAgICAgICAJCXNldCgkY3VycmVudCwgIm1heFZhbHVlIiwgbHZfbWF4VmFsdWVfMTIsIG51bGwsIGxhc3RDb25zdW1lZE5vZGUpOworCSAgICAgICAgfSBjYXRjaCAoVmFsdWVDb252ZXJ0ZXJFeGNlcHRpb24gdmNlKSB7CisJCQkJaGFuZGxlVmFsdWVDb252ZXJ0ZXJFeGNlcHRpb24odmNlKTsKKwkgICAgICAgIH0KKwkgICAgfQorCQorKSddJyAKKyAgICB7CisgICAgICAgIGNyZWF0ZUxlYWZOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludEFjY2VzcygpLmdldFJpZ2h0U3F1YXJlQnJhY2tldEtleXdvcmRfN181KCksIG51bGwpOyAKKyAgICB9CispKTsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUludFZhbHVlCitlbnRyeVJ1bGVJbnRWYWx1ZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOgorCXsgY3VycmVudE5vZGUgPSBjcmVhdGVDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SW50VmFsdWVSdWxlKCksIGN1cnJlbnROb2RlKTsgfQorCSBpdl9ydWxlSW50VmFsdWU9cnVsZUludFZhbHVlIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlSW50VmFsdWUuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEludFZhbHVlCitydWxlSW50VmFsdWUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgRU9iamVjdCB0ZW1wPW51bGw7IHNldEN1cnJlbnRMb29rYWhlYWQoKTsgcmVzZXRMb29rYWhlYWQoKTsgCisgICAgfQorICAgIEBhZnRlciB7IHJlc2V0TG9va2FoZWFkKCk7IAorICAgIAlsYXN0Q29uc3VtZWROb2RlID0gY3VycmVudE5vZGU7CisgICAgfToKKygJCisJCisJICAgIGx2X3ZhbHVlXzA9CVJVTEVfSU5UCisJeworCQljcmVhdGVMZWFmTm9kZShncmFtbWFyQWNjZXNzLmdldEludFZhbHVlQWNjZXNzKCkuZ2V0VmFsdWVJTlRUZXJtaW5hbFJ1bGVDYWxsXzAoKSwgInZhbHVlIik7IAorCX0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBmYWN0b3J5LmNyZWF0ZShncmFtbWFyQWNjZXNzLmdldEludFZhbHVlUnVsZSgpLmdldFR5cGUoKS5nZXRDbGFzc2lmaWVyKCkpOworCSAgICAgICAgICAgIGFzc29jaWF0ZU5vZGVXaXRoQXN0RWxlbWVudChjdXJyZW50Tm9kZSwgJGN1cnJlbnQpOworCSAgICAgICAgfQorCSAgICAgICAgCisJICAgICAgICB0cnkgeworCSAgICAgICAJCXNldCgkY3VycmVudCwgInZhbHVlIiwgbHZfdmFsdWVfMCwgIklOVCIsIGxhc3RDb25zdW1lZE5vZGUpOworCSAgICAgICAgfSBjYXRjaCAoVmFsdWVDb252ZXJ0ZXJFeGNlcHRpb24gdmNlKSB7CisJCQkJaGFuZGxlVmFsdWVDb252ZXJ0ZXJFeGNlcHRpb24odmNlKTsKKwkgICAgICAgIH0KKwkgICAgfQorCQorKTsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVJlYWxWYWx1ZQorZW50cnlSdWxlUmVhbFZhbHVlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6CisJeyBjdXJyZW50Tm9kZSA9IGNyZWF0ZUNvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSZWFsVmFsdWVSdWxlKCksIGN1cnJlbnROb2RlKTsgfQorCSBpdl9ydWxlUmVhbFZhbHVlPXJ1bGVSZWFsVmFsdWUgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVSZWFsVmFsdWUuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFJlYWxWYWx1ZQorcnVsZVJlYWxWYWx1ZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBFT2JqZWN0IHRlbXA9bnVsbDsgc2V0Q3VycmVudExvb2thaGVhZCgpOyByZXNldExvb2thaGVhZCgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgcmVzZXRMb29rYWhlYWQoKTsgCisgICAgCWxhc3RDb25zdW1lZE5vZGUgPSBjdXJyZW50Tm9kZTsKKyAgICB9OgorKAkKKwkKKwkgICAgbHZfdmFsdWVfMD0JUlVMRV9SRUFMCisJeworCQljcmVhdGVMZWFmTm9kZShncmFtbWFyQWNjZXNzLmdldFJlYWxWYWx1ZUFjY2VzcygpLmdldFZhbHVlUkVBTFRlcm1pbmFsUnVsZUNhbGxfMCgpLCAidmFsdWUiKTsgCisJfQorIAorCSAgICB7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGZhY3RvcnkuY3JlYXRlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVhbFZhbHVlUnVsZSgpLmdldFR5cGUoKS5nZXRDbGFzc2lmaWVyKCkpOworCSAgICAgICAgICAgIGFzc29jaWF0ZU5vZGVXaXRoQXN0RWxlbWVudChjdXJyZW50Tm9kZSwgJGN1cnJlbnQpOworCSAgICAgICAgfQorCSAgICAgICAgCisJICAgICAgICB0cnkgeworCSAgICAgICAJCXNldCgkY3VycmVudCwgInZhbHVlIiwgbHZfdmFsdWVfMCwgIlJFQUwiLCBsYXN0Q29uc3VtZWROb2RlKTsKKwkgICAgICAgIH0gY2F0Y2ggKFZhbHVlQ29udmVydGVyRXhjZXB0aW9uIHZjZSkgeworCQkJCWhhbmRsZVZhbHVlQ29udmVydGVyRXhjZXB0aW9uKHZjZSk7CisJICAgICAgICB9CisJICAgIH0KKwkKKyk7CisKKworCisKKworLy8gUnVsZSBNZWFzdXJlCitydWxlTWVhc3VyZSByZXR1cm5zIFtFbnVtZXJhdG9yIGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBzZXRDdXJyZW50TG9va2FoZWFkKCk7IHJlc2V0TG9va2FoZWFkKCk7IH0KKyAgICBAYWZ0ZXIgeyByZXNldExvb2thaGVhZCgpOyAKKyAgICAJbGFzdENvbnN1bWVkTm9kZSA9IGN1cnJlbnROb2RlOworICAgIH06CisoKAknQ291bnQnIAorCXsKKyAgICAgICAgJGN1cnJlbnQgPSBncmFtbWFyQWNjZXNzLmdldE1lYXN1cmVBY2Nlc3MoKS5nZXRDT1VOVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgY3JlYXRlTGVhZk5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRNZWFzdXJlQWNjZXNzKCkuZ2V0Q09VTlRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSwgbnVsbCk7IAorICAgIH0KKykKKyAgICB8KAknQXZlcmFnZScgCisJeworICAgICAgICAkY3VycmVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0TWVhc3VyZUFjY2VzcygpLmdldEFWRVJBR0VFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CisgICAgICAgIGNyZWF0ZUxlYWZOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TWVhc3VyZUFjY2VzcygpLmdldEFWRVJBR0VFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSwgbnVsbCk7IAorICAgIH0KKykKKyAgICB8KAknU3VtJyAKKwl7CisgICAgICAgICRjdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRNZWFzdXJlQWNjZXNzKCkuZ2V0U1VNRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yKCkuZ2V0RW51bUxpdGVyYWwoKS5nZXRJbnN0YW5jZSgpOworICAgICAgICBjcmVhdGVMZWFmTm9kZShncmFtbWFyQWNjZXNzLmdldE1lYXN1cmVBY2Nlc3MoKS5nZXRTVU1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIoKSwgbnVsbCk7IAorICAgIH0KKykKKyAgICB8KAknTWluaW11bScgCisJeworICAgICAgICAkY3VycmVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0TWVhc3VyZUFjY2VzcygpLmdldE1JTklNVU1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CisgICAgICAgIGNyZWF0ZUxlYWZOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TWVhc3VyZUFjY2VzcygpLmdldE1JTklNVU1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMoKSwgbnVsbCk7IAorICAgIH0KKykKKyAgICB8KAknTWF4aW11bScgCisJeworICAgICAgICAkY3VycmVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0TWVhc3VyZUFjY2VzcygpLmdldE1BWElNVU1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CisgICAgICAgIGNyZWF0ZUxlYWZOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TWVhc3VyZUFjY2VzcygpLmdldE1BWElNVU1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKSwgbnVsbCk7IAorICAgIH0KKykpOworCisKKworUlVMRV9SRUFMIDogJy0nPyBSVUxFX0lOVCAoJy4nIFJVTEVfSU5UKT87CisKK1JVTEVfUExBSU5fU1RSSU5HIDogJ1x1MDBBQicgKCdcXCcgKCdiJ3wndCd8J24nfCdmJ3wncid8JyInfCdcJyd8J1xcJyl8figoJ1xcJ3wnXHUwMEFCJ3wnXHUwMEJCJykpKSogJ1x1MDBCQic7CisKK1JVTEVfSUQgOiAnXic/ICgnYScuLid6J3wnQScuLidaJ3wnXycpICgnYScuLid6J3wnQScuLidaJ3wnXyd8JzAnLi4nOScpKjsKKworUlVMRV9JTlQgOiAoJzAnLi4nOScpKzsKKworUlVMRV9TVFJJTkcgOiAoJyInICgnXFwnICgnYid8J3QnfCduJ3wnZid8J3InfCciJ3wnXCcnfCdcXCcpfH4oKCdcXCd8JyInKSkpKiAnIid8J1wnJyAoJ1xcJyAoJ2InfCd0J3wnbid8J2YnfCdyJ3wnIid8J1wnJ3wnXFwnKXx+KCgnXFwnfCdcJycpKSkqICdcJycpOworCitSVUxFX01MX0NPTU1FTlQgOiAnLyonICggb3B0aW9ucyB7Z3JlZWR5PWZhbHNlO30gOiAuICkqJyovJzsKKworUlVMRV9TTF9DT01NRU5UIDogJy8vJyB+KCgnXG4nfCdccicpKSogKCdccic/ICdcbicpPzsKKworUlVMRV9XUyA6ICgnICd8J1x0J3wnXHInfCdcbicpKzsKKworUlVMRV9BTllfT1RIRVIgOiAuOworCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QudG9rZW5zIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC50b2tlbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQzZTk4MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QudG9rZW5zCkBAIC0wLDAgKzEsMjIgQEAKK1JVTEVfUExBSU5fU1RSSU5HPTUKK1JVTEVfSUQ9OAorUlVMRV9TVFJJTkc9NAorUlVMRV9BTllfT1RIRVI9MTIKK1JVTEVfSU5UPTYKK1JVTEVfUkVBTD03CitSVUxFX1dTPTExCitSVUxFX1NMX0NPTU1FTlQ9MTAKK1JVTEVfTUxfQ09NTUVOVD05CisnQ291bnQnPTIxCisnTWluaW11bSc9MjQKKydURVNUUyc9MTMKKyc9Jz0xNworJygnPTE0CisnOic9MTUKKydbJz0xOAorJ1N1bSc9MjMKKycsJz0xOQorJyknPTE2CisnQXZlcmFnZSc9MjIKKyddJz0yMAorJ01heGltdW0nPTI1CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0TGV4ZXIuamF2YSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3RMZXhlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjOTUwY2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0TGV4ZXIuamF2YQpAQCAtMCwwICsxLDEyMjMgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLnBhcnNlci5hbnRsci5pbnRlcm5hbDsKKworLy8gSGFjazogVXNlIG91ciBvd24gTGV4ZXIgc3VwZXJjbGFzcyBieSBtZWFucyBvZiBpbXBvcnQuIAorLy8gQ3VycmVudGx5IHRoZXJlIGlzIG5vIG90aGVyIHdheSB0byBzcGVjaWZ5IHRoZSBzdXBlcmNsYXNzIGZvciB0aGUgbGV4ZXIuCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLkxleGVyOworCisKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS4qOworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitwdWJsaWMgY2xhc3MgSW50ZXJuYWxBVGVzdExleGVyIGV4dGVuZHMgTGV4ZXIgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfSUQ9ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0FOWV9PVEhFUj0xMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUMjU9MjU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVG9rZW5zPTI2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFQyND0yNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFT0Y9LTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9TTF9DT01NRU5UPTEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFQyMz0yMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUMjI9MjI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVDIxPTIxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFQyMD0yMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX01MX0NPTU1FTlQ9OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX1BMQUlOX1NUUklORz01OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfU1RSSU5HPTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9JTlQ9NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX1JFQUw9NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUMTM9MTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVDE0PTE0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfV1M9MTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVDE1PTE1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFQxNj0xNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUMTc9MTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVDE4PTE4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFQxOT0xOTsKKyAgICBwdWJsaWMgSW50ZXJuYWxBVGVzdExleGVyKCkgezt9IAorICAgIHB1YmxpYyBJbnRlcm5hbEFUZXN0TGV4ZXIoQ2hhclN0cmVhbSBpbnB1dCkgeworICAgICAgICBzdXBlcihpbnB1dCk7CisgICAgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0R3JhbW1hckZpbGVOYW1lKCkgeyByZXR1cm4gIi4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nIjsgfQorCisgICAgLy8gJEFOVExSIHN0YXJ0IFQxMworICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UMTMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVDEzOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6MTA6NTogKCAnVEVTVFMnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjEwOjc6ICdURVNUUycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJURVNUUyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IF90eXBlOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgVDEzCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgVDE0CisgICAgcHVibGljIGZpbmFsIHZvaWQgbVQxNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUMTQ7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxMTo1OiAoICcoJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxMTo3OiAnKCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcoJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IF90eXBlOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgVDE0CisKKyAgICAvLyAkQU5UTFIgc3RhcnQgVDE1CisgICAgcHVibGljIGZpbmFsIHZvaWQgbVQxNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUMTU7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxMjo1OiAoICc6JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxMjo3OiAnOicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCc6Jyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IF90eXBlOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgVDE1CisKKyAgICAvLyAkQU5UTFIgc3RhcnQgVDE2CisgICAgcHVibGljIGZpbmFsIHZvaWQgbVQxNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUMTY7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxMzo1OiAoICcpJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxMzo3OiAnKScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcpJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IF90eXBlOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgVDE2CisKKyAgICAvLyAkQU5UTFIgc3RhcnQgVDE3CisgICAgcHVibGljIGZpbmFsIHZvaWQgbVQxNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUMTc7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxNDo1OiAoICc9JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxNDo3OiAnPScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCc9Jyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IF90eXBlOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgVDE3CisKKyAgICAvLyAkQU5UTFIgc3RhcnQgVDE4CisgICAgcHVibGljIGZpbmFsIHZvaWQgbVQxOCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUMTg7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxNTo1OiAoICdbJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxNTo3OiAnWycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCdbJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IF90eXBlOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgVDE4CisKKyAgICAvLyAkQU5UTFIgc3RhcnQgVDE5CisgICAgcHVibGljIGZpbmFsIHZvaWQgbVQxOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUMTk7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxNjo1OiAoICcsJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxNjo3OiAnLCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcsJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IF90eXBlOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgVDE5CisKKyAgICAvLyAkQU5UTFIgc3RhcnQgVDIwCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVQyMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUMjA7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxNzo1OiAoICddJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxNzo3OiAnXScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCddJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IF90eXBlOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgVDIwCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgVDIxCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVQyMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUMjE7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxODo1OiAoICdDb3VudCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6MTg6NzogJ0NvdW50JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIkNvdW50Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy50eXBlID0gX3R5cGU7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCBUMjEKKworICAgIC8vICRBTlRMUiBzdGFydCBUMjIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVDIyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFQyMjsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjE5OjU6ICggJ0F2ZXJhZ2UnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjE5Ojc6ICdBdmVyYWdlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIkF2ZXJhZ2UiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kIFQyMgorCisgICAgLy8gJEFOVExSIHN0YXJ0IFQyMworICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UMjMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVDIzOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6MjA6NTogKCAnU3VtJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoyMDo3OiAnU3VtJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIlN1bSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IF90eXBlOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgVDIzCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgVDI0CisgICAgcHVibGljIGZpbmFsIHZvaWQgbVQyNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUMjQ7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoyMTo1OiAoICdNaW5pbXVtJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoyMTo3OiAnTWluaW11bScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJNaW5pbXVtIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy50eXBlID0gX3R5cGU7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCBUMjQKKworICAgIC8vICRBTlRMUiBzdGFydCBUMjUKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVDI1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFQyNTsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjIyOjU6ICggJ01heGltdW0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjIyOjc6ICdNYXhpbXVtJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIk1heGltdW0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kIFQyNQorCisgICAgLy8gJEFOVExSIHN0YXJ0IFJVTEVfUkVBTAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX1JFQUwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9SRUFMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6NTIzOjExOiAoICggJy0nICk/IFJVTEVfSU5UICggJy4nIFJVTEVfSU5UICk/ICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjUyMzoxMzogKCAnLScgKT8gUlVMRV9JTlQgKCAnLicgUlVMRV9JTlQgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjUyMzoxMzogKCAnLScgKT8KKyAgICAgICAgICAgIGludCBhbHQxPTI7CisgICAgICAgICAgICBpbnQgTEExXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEExXzA9PSctJykgKSB7CisgICAgICAgICAgICAgICAgYWx0MT0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQxKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6NTIzOjEzOiAnLScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaCgnLScpOyAKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1SVUxFX0lOVCgpOyAKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjUyMzoyNzogKCAnLicgUlVMRV9JTlQgKT8KKyAgICAgICAgICAgIGludCBhbHQyPTI7CisgICAgICAgICAgICBpbnQgTEEyXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEEyXzA9PScuJykgKSB7CisgICAgICAgICAgICAgICAgYWx0Mj0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQyKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6NTIzOjI4OiAnLicgUlVMRV9JTlQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaCgnLicpOyAKKyAgICAgICAgICAgICAgICAgICAgbVJVTEVfSU5UKCk7IAorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IF90eXBlOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgUlVMRV9SRUFMCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgUlVMRV9QTEFJTl9TVFJJTkcKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtUlVMRV9QTEFJTl9TVFJJTkcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9QTEFJTl9TVFJJTkc7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzo1MjU6MTk6ICggJ1xcdTAwQUInICggJ1xcXFwnICggJ2InIHwgJ3QnIHwgJ24nIHwgJ2YnIHwgJ3InIHwgJ1wiJyB8ICdcXCcnIHwgJ1xcXFwnICkgfCB+ICggKCAnXFxcXCcgfCAnXFx1MDBBQicgfCAnXFx1MDBCQicgKSApICkqICdcXHUwMEJCJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzo1MjU6MjE6ICdcXHUwMEFCJyAoICdcXFxcJyAoICdiJyB8ICd0JyB8ICduJyB8ICdmJyB8ICdyJyB8ICdcIicgfCAnXFwnJyB8ICdcXFxcJyApIHwgfiAoICggJ1xcXFwnIHwgJ1xcdTAwQUInIHwgJ1xcdTAwQkInICkgKSApKiAnXFx1MDBCQicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCdcdTAwQUInKTsgCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzo1MjU6MzA6ICggJ1xcXFwnICggJ2InIHwgJ3QnIHwgJ24nIHwgJ2YnIHwgJ3InIHwgJ1wiJyB8ICdcXCcnIHwgJ1xcXFwnICkgfCB+ICggKCAnXFxcXCcgfCAnXFx1MDBBQicgfCAnXFx1MDBCQicgKSApICkqCisgICAgICAgICAgICBsb29wMzoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0Mz0zOworICAgICAgICAgICAgICAgIGludCBMQTNfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEEzXzA9PSdcXCcpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQzPTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBM18wPj0nXHUwMDAwJyAmJiBMQTNfMDw9J1snKXx8KExBM18wPj0nXScgJiYgTEEzXzA8PSdcdTAwQUEnKXx8KExBM18wPj0nXHUwMEFDJyAmJiBMQTNfMDw9J1x1MDBCQScpfHwoTEEzXzA+PSdcdTAwQkMnICYmIExBM18wPD0nXHVGRkZFJykpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQzPTI7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDMpIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzo1MjU6MzE6ICdcXFxcJyAoICdiJyB8ICd0JyB8ICduJyB8ICdmJyB8ICdyJyB8ICdcIicgfCAnXFwnJyB8ICdcXFxcJyApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgbWF0Y2goJ1xcJyk7IAorICAgICAgICAgICAgCSAgICBpZiAoIGlucHV0LkxBKDEpPT0nXCInfHxpbnB1dC5MQSgxKT09J1wnJ3x8aW5wdXQuTEEoMSk9PSdcXCd8fGlucHV0LkxBKDEpPT0nYid8fGlucHV0LkxBKDEpPT0nZid8fGlucHV0LkxBKDEpPT0nbid8fGlucHV0LkxBKDEpPT0ncid8fGlucHV0LkxBKDEpPT0ndCcgKSB7CisgICAgICAgICAgICAJICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBlbHNlIHsKKyAgICAgICAgICAgIAkgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0KKyAgICAgICAgICAgIAkgICAgICAgICAgICBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgIAkgICAgICAgIHJlY292ZXIobXNlKTsgICAgdGhyb3cgbXNlOworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMiA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjUyNTo3MjogfiAoICggJ1xcXFwnIHwgJ1xcdTAwQUInIHwgJ1xcdTAwQkInICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggKGlucHV0LkxBKDEpPj0nXHUwMDAwJyAmJiBpbnB1dC5MQSgxKTw9J1snKXx8KGlucHV0LkxBKDEpPj0nXScgJiYgaW5wdXQuTEEoMSk8PSdcdTAwQUEnKXx8KGlucHV0LkxBKDEpPj0nXHUwMEFDJyAmJiBpbnB1dC5MQSgxKTw9J1x1MDBCQScpfHwoaW5wdXQuTEEoMSk+PSdcdTAwQkMnICYmIGlucHV0LkxBKDEpPD0nXHVGRkZFJykgKSB7CisgICAgICAgICAgICAJICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBlbHNlIHsKKyAgICAgICAgICAgIAkgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0KKyAgICAgICAgICAgIAkgICAgICAgICAgICBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgIAkgICAgICAgIHJlY292ZXIobXNlKTsgICAgdGhyb3cgbXNlOworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICBtYXRjaCgnXHUwMEJCJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IF90eXBlOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgUlVMRV9QTEFJTl9TVFJJTkcKKworICAgIC8vICRBTlRMUiBzdGFydCBSVUxFX0lECisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfSUQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9JRDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjUyNzo5OiAoICggJ14nICk/ICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnXycgKSAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJ18nIHwgJzAnIC4uICc5JyApKiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzo1Mjc6MTE6ICggJ14nICk/ICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnXycgKSAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJ18nIHwgJzAnIC4uICc5JyApKgorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6NTI3OjExOiAoICdeJyApPworICAgICAgICAgICAgaW50IGFsdDQ9MjsKKyAgICAgICAgICAgIGludCBMQTRfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTRfMD09J14nKSApIHsKKyAgICAgICAgICAgICAgICBhbHQ0PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzo1Mjc6MTE6ICdeJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdeJyk7IAorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCAoaW5wdXQuTEEoMSk+PSdBJyAmJiBpbnB1dC5MQSgxKTw9J1onKXx8aW5wdXQuTEEoMSk9PSdfJ3x8KGlucHV0LkxBKDEpPj0nYScgJiYgaW5wdXQuTEEoMSk8PSd6JykgKSB7CisgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsgICAgdGhyb3cgbXNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzo1Mjc6NDA6ICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnXycgfCAnMCcgLi4gJzknICkqCisgICAgICAgICAgICBsb29wNToKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NT0yOworICAgICAgICAgICAgICAgIGludCBMQTVfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoKExBNV8wPj0nMCcgJiYgTEE1XzA8PSc5Jyl8fChMQTVfMD49J0EnICYmIExBNV8wPD0nWicpfHxMQTVfMD09J18nfHwoTEE1XzA+PSdhJyAmJiBMQTVfMDw9J3onKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDU9MTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NSkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggKGlucHV0LkxBKDEpPj0nMCcgJiYgaW5wdXQuTEEoMSk8PSc5Jyl8fChpbnB1dC5MQSgxKT49J0EnICYmIGlucHV0LkxBKDEpPD0nWicpfHxpbnB1dC5MQSgxKT09J18nfHwoaW5wdXQuTEEoMSk+PSdhJyAmJiBpbnB1dC5MQSgxKTw9J3onKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGVsc2UgeworICAgICAgICAgICAgCSAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPQorICAgICAgICAgICAgCSAgICAgICAgICAgIG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgCSAgICAgICAgcmVjb3Zlcihtc2UpOyAgICB0aHJvdyBtc2U7CisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kIFJVTEVfSUQKKworICAgIC8vICRBTlRMUiBzdGFydCBSVUxFX0lOVAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX0lOVCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX0lOVDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjUyOToxMDogKCAoICcwJyAuLiAnOScgKSsgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6NTI5OjEyOiAoICcwJyAuLiAnOScgKSsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjUyOToxMjogKCAnMCcgLi4gJzknICkrCisgICAgICAgICAgICBpbnQgY250Nj0wOworICAgICAgICAgICAgbG9vcDY6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDY9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEE2XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggKChMQTZfMD49JzAnICYmIExBNl8wPD0nOScpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0Nj0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ2KSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6NTI5OjEzOiAnMCcgLi4gJzknCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgbWF0Y2hSYW5nZSgnMCcsJzknKTsgCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBpZiAoIGNudDYgPj0gMSApIGJyZWFrIGxvb3A2OworICAgICAgICAgICAgICAgICAgICAgICAgRWFybHlFeGl0RXhjZXB0aW9uIGVlZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVhcmx5RXhpdEV4Y2VwdGlvbig2LCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlZWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNudDYrKzsKKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy50eXBlID0gX3R5cGU7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCBSVUxFX0lOVAorCisgICAgLy8gJEFOVExSIHN0YXJ0IFJVTEVfU1RSSU5HCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfU1RSSU5HKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfU1RSSU5HOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6NTMxOjEzOiAoICggJ1wiJyAoICdcXFxcJyAoICdiJyB8ICd0JyB8ICduJyB8ICdmJyB8ICdyJyB8ICdcIicgfCAnXFwnJyB8ICdcXFxcJyApIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSogJ1wiJyB8ICdcXCcnICggJ1xcXFwnICggJ2InIHwgJ3QnIHwgJ24nIHwgJ2YnIHwgJ3InIHwgJ1wiJyB8ICdcXCcnIHwgJ1xcXFwnICkgfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSogJ1xcJycgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzo1MzE6MTU6ICggJ1wiJyAoICdcXFxcJyAoICdiJyB8ICd0JyB8ICduJyB8ICdmJyB8ICdyJyB8ICdcIicgfCAnXFwnJyB8ICdcXFxcJyApIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSogJ1wiJyB8ICdcXCcnICggJ1xcXFwnICggJ2InIHwgJ3QnIHwgJ24nIHwgJ2YnIHwgJ3InIHwgJ1wiJyB8ICdcXCcnIHwgJ1xcXFwnICkgfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSogJ1xcJycgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6NTMxOjE1OiAoICdcIicgKCAnXFxcXCcgKCAnYicgfCAndCcgfCAnbicgfCAnZicgfCAncicgfCAnXCInIHwgJ1xcJycgfCAnXFxcXCcgKSB8IH4gKCAoICdcXFxcJyB8ICdcIicgKSApICkqICdcIicgfCAnXFwnJyAoICdcXFxcJyAoICdiJyB8ICd0JyB8ICduJyB8ICdmJyB8ICdyJyB8ICdcIicgfCAnXFwnJyB8ICdcXFxcJyApIHwgfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApICkqICdcXCcnICkKKyAgICAgICAgICAgIGludCBhbHQ5PTI7CisgICAgICAgICAgICBpbnQgTEE5XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEE5XzA9PSdcIicpICkgeworICAgICAgICAgICAgICAgIGFsdDk9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE5XzA9PSdcJycpICkgeworICAgICAgICAgICAgICAgIGFsdDk9MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIjUzMToxNTogKCAnXCInICggJ1xcXFwnICggJ2InIHwgJ3QnIHwgJ24nIHwgJ2YnIHwgJ3InIHwgJ1wiJyB8ICdcXCcnIHwgJ1xcXFwnICkgfCB+ICggKCAnXFxcXCcgfCAnXCInICkgKSApKiAnXCInIHwgJ1xcJycgKCAnXFxcXCcgKCAnYicgfCAndCcgfCAnbicgfCAnZicgfCAncicgfCAnXCInIHwgJ1xcJycgfCAnXFxcXCcgKSB8IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKSApKiAnXFwnJyApIiwgOSwgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0OSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjUzMToxNjogJ1wiJyAoICdcXFxcJyAoICdiJyB8ICd0JyB8ICduJyB8ICdmJyB8ICdyJyB8ICdcIicgfCAnXFwnJyB8ICdcXFxcJyApIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSogJ1wiJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdcIicpOyAKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6NTMxOjIwOiAoICdcXFxcJyAoICdiJyB8ICd0JyB8ICduJyB8ICdmJyB8ICdyJyB8ICdcIicgfCAnXFwnJyB8ICdcXFxcJyApIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgbG9vcDc6CisgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHQ3PTM7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE3XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEE3XzA9PSdcXCcpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDc9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBN18wPj0nXHUwMDAwJyAmJiBMQTdfMDw9JyEnKXx8KExBN18wPj0nIycgJiYgTEE3XzA8PSdbJyl8fChMQTdfMD49J10nICYmIExBN18wPD0nXHVGRkZFJykpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDc9MjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDcpIHsKKyAgICAgICAgICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6NTMxOjIxOiAnXFxcXCcgKCAnYicgfCAndCcgfCAnbicgfCAnZicgfCAncicgfCAnXCInIHwgJ1xcJycgfCAnXFxcXCcgKQorICAgICAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBtYXRjaCgnXFwnKTsgCisgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBpbnB1dC5MQSgxKT09J1wiJ3x8aW5wdXQuTEEoMSk9PSdcJyd8fGlucHV0LkxBKDEpPT0nXFwnfHxpbnB1dC5MQSgxKT09J2InfHxpbnB1dC5MQSgxKT09J2YnfHxpbnB1dC5MQSgxKT09J24nfHxpbnB1dC5MQSgxKT09J3InfHxpbnB1dC5MQSgxKT09J3QnICkgeworICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0KKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgICByZWNvdmVyKG1zZSk7ICAgIHRocm93IG1zZTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCWNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6NTMxOjYyOiB+ICggKCAnXFxcXCcgfCAnXCInICkgKQorICAgICAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIChpbnB1dC5MQSgxKT49J1x1MDAwMCcgJiYgaW5wdXQuTEEoMSk8PSchJyl8fChpbnB1dC5MQSgxKT49JyMnICYmIGlucHV0LkxBKDEpPD0nWycpfHwoaW5wdXQuTEEoMSk+PSddJyAmJiBpbnB1dC5MQSgxKTw9J1x1RkZGRScpICkgeworICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0KKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgICByZWNvdmVyKG1zZSk7ICAgIHRocm93IG1zZTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdcIicpOyAKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjUzMTo4MjogJ1xcJycgKCAnXFxcXCcgKCAnYicgfCAndCcgfCAnbicgfCAnZicgfCAncicgfCAnXCInIHwgJ1xcJycgfCAnXFxcXCcgKSB8IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKSApKiAnXFwnJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdcJycpOyAKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6NTMxOjg3OiAoICdcXFxcJyAoICdiJyB8ICd0JyB8ICduJyB8ICdmJyB8ICdyJyB8ICdcIicgfCAnXFwnJyB8ICdcXFxcJyApIHwgfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApICkqCisgICAgICAgICAgICAgICAgICAgIGxvb3A4OgorICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0OD0zOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBOF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBOF8wPT0nXFwnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ4PTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKChMQThfMD49J1x1MDAwMCcgJiYgTEE4XzA8PScmJyl8fChMQThfMD49JygnICYmIExBOF8wPD0nWycpfHwoTEE4XzA+PSddJyAmJiBMQThfMDw9J1x1RkZGRScpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ4PTI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ4KSB7CisgICAgICAgICAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjUzMTo4ODogJ1xcXFwnICggJ2InIHwgJ3QnIHwgJ24nIHwgJ2YnIHwgJ3InIHwgJ1wiJyB8ICdcXCcnIHwgJ1xcXFwnICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgbWF0Y2goJ1xcJyk7IAorICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggaW5wdXQuTEEoMSk9PSdcIid8fGlucHV0LkxBKDEpPT0nXCcnfHxpbnB1dC5MQSgxKT09J1xcJ3x8aW5wdXQuTEEoMSk9PSdiJ3x8aW5wdXQuTEEoMSk9PSdmJ3x8aW5wdXQuTEEoMSk9PSduJ3x8aW5wdXQuTEEoMSk9PSdyJ3x8aW5wdXQuTEEoMSk9PSd0JyApIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAJICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgcmVjb3Zlcihtc2UpOyAgICB0aHJvdyBtc2U7CisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAljYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjUzMToxMjk6IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKQorICAgICAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIChpbnB1dC5MQSgxKT49J1x1MDAwMCcgJiYgaW5wdXQuTEEoMSk8PScmJyl8fChpbnB1dC5MQSgxKT49JygnICYmIGlucHV0LkxBKDEpPD0nWycpfHwoaW5wdXQuTEEoMSk+PSddJyAmJiBpbnB1dC5MQSgxKTw9J1x1RkZGRScpICkgeworICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0KKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgICByZWNvdmVyKG1zZSk7ICAgIHRocm93IG1zZTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdcJycpOyAKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kIFJVTEVfU1RSSU5HCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgUlVMRV9NTF9DT01NRU5UCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfTUxfQ09NTUVOVCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX01MX0NPTU1FTlQ7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzo1MzM6MTc6ICggJy8qJyAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTsgfSA6IC4gKSogJyovJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzo1MzM6MTk6ICcvKicgKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7IH0gOiAuICkqICcqLycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIvKiIpOyAKKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6NTMzOjI0OiAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTsgfSA6IC4gKSoKKyAgICAgICAgICAgIGxvb3AxMDoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTA9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExMF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTEwXzA9PScqJykgKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTEwXzEgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTEwXzE9PScvJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQxMD0yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMTBfMT49J1x1MDAwMCcgJiYgTEExMF8xPD0nLicpfHwoTEExMF8xPj0nMCcgJiYgTEExMF8xPD0nXHVGRkZFJykpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTA9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEExMF8wPj0nXHUwMDAwJyAmJiBMQTEwXzA8PScpJyl8fChMQTEwXzA+PScrJyAmJiBMQTEwXzA8PSdcdUZGRkUnKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDEwPTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEwKSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6NTMzOjUyOiAuCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgbWF0Y2hBbnkoKTsgCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgIG1hdGNoKCIqLyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IF90eXBlOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgUlVMRV9NTF9DT01NRU5UCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgUlVMRV9TTF9DT01NRU5UCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfU0xfQ09NTUVOVCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX1NMX0NPTU1FTlQ7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzo1MzU6MTc6ICggJy8vJyAofiAoICggJ1xcbicgfCAnXFxyJyApICkgKSogKCAoICdcXHInICk/ICdcXG4nICk/ICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjUzNToxOTogJy8vJyAofiAoICggJ1xcbicgfCAnXFxyJyApICkgKSogKCAoICdcXHInICk/ICdcXG4nICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiLy8iKTsgCisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjUzNToyNDogKH4gKCAoICdcXG4nIHwgJ1xccicgKSApICkqCisgICAgICAgICAgICBsb29wMTE6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDExPTI7CisgICAgICAgICAgICAgICAgaW50IExBMTFfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoKExBMTFfMD49J1x1MDAwMCcgJiYgTEExMV8wPD0nXHQnKXx8KExBMTFfMD49J1x1MDAwQicgJiYgTEExMV8wPD0nXGYnKXx8KExBMTFfMD49J1x1MDAwRScgJiYgTEExMV8wPD0nXHVGRkZFJykpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMT0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMSkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjUzNToyNDogfiAoICggJ1xcbicgfCAnXFxyJyApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIChpbnB1dC5MQSgxKT49J1x1MDAwMCcgJiYgaW5wdXQuTEEoMSk8PSdcdCcpfHwoaW5wdXQuTEEoMSk+PSdcdTAwMEInICYmIGlucHV0LkxBKDEpPD0nXGYnKXx8KGlucHV0LkxBKDEpPj0nXHUwMDBFJyAmJiBpbnB1dC5MQSgxKTw9J1x1RkZGRScpICkgeworICAgICAgICAgICAgCSAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgZWxzZSB7CisgICAgICAgICAgICAJICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9CisgICAgICAgICAgICAJICAgICAgICAgICAgbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAJICAgICAgICByZWNvdmVyKG1zZSk7ICAgIHRocm93IG1zZTsKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjUzNTo0MDogKCAoICdcXHInICk/ICdcXG4nICk/CisgICAgICAgICAgICBpbnQgYWx0MTM9MjsKKyAgICAgICAgICAgIGludCBMQTEzXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEExM18wPT0nXG4nfHxMQTEzXzA9PSdccicpICkgeworICAgICAgICAgICAgICAgIGFsdDEzPTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDEzKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6NTM1OjQxOiAoICdcXHInICk/ICdcXG4nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6NTM1OjQxOiAoICdcXHInICk/CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQxMj0yOworICAgICAgICAgICAgICAgICAgICBpbnQgTEExMl8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExMl8wPT0nXHInKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDEyPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMikgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzo1MzU6NDE6ICdcXHInCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdccicpOyAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goJ1xuJyk7IAorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IF90eXBlOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgUlVMRV9TTF9DT01NRU5UCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgUlVMRV9XUworICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX1dTKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfV1M7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzo1Mzc6OTogKCAoICcgJyB8ICdcXHQnIHwgJ1xccicgfCAnXFxuJyApKyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzo1Mzc6MTE6ICggJyAnIHwgJ1xcdCcgfCAnXFxyJyB8ICdcXG4nICkrCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzo1Mzc6MTE6ICggJyAnIHwgJ1xcdCcgfCAnXFxyJyB8ICdcXG4nICkrCisgICAgICAgICAgICBpbnQgY250MTQ9MDsKKyAgICAgICAgICAgIGxvb3AxNDoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTQ9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExNF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoICgoTEExNF8wPj0nXHQnICYmIExBMTRfMDw9J1xuJyl8fExBMTRfMD09J1xyJ3x8TEExNF8wPT0nICcpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxND0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNCkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggKGlucHV0LkxBKDEpPj0nXHQnICYmIGlucHV0LkxBKDEpPD0nXG4nKXx8aW5wdXQuTEEoMSk9PSdccid8fGlucHV0LkxBKDEpPT0nICcgKSB7CisgICAgICAgICAgICAJICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBlbHNlIHsKKyAgICAgICAgICAgIAkgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0KKyAgICAgICAgICAgIAkgICAgICAgICAgICBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgIAkgICAgICAgIHJlY292ZXIobXNlKTsgICAgdGhyb3cgbXNlOworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGlmICggY250MTQgPj0gMSApIGJyZWFrIGxvb3AxNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVhcmx5RXhpdEV4Y2VwdGlvbiBlZWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFYXJseUV4aXRFeGNlcHRpb24oMTQsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVlZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY250MTQrKzsKKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy50eXBlID0gX3R5cGU7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCBSVUxFX1dTCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgUlVMRV9BTllfT1RIRVIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtUlVMRV9BTllfT1RIRVIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9BTllfT1RIRVI7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzo1Mzk6MTY6ICggLiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzo1Mzk6MTg6IC4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoQW55KCk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IF90eXBlOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgUlVMRV9BTllfT1RIRVIKKworICAgIHB1YmxpYyB2b2lkIG1Ub2tlbnMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxOjg6ICggVDEzIHwgVDE0IHwgVDE1IHwgVDE2IHwgVDE3IHwgVDE4IHwgVDE5IHwgVDIwIHwgVDIxIHwgVDIyIHwgVDIzIHwgVDI0IHwgVDI1IHwgUlVMRV9SRUFMIHwgUlVMRV9QTEFJTl9TVFJJTkcgfCBSVUxFX0lEIHwgUlVMRV9JTlQgfCBSVUxFX1NUUklORyB8IFJVTEVfTUxfQ09NTUVOVCB8IFJVTEVfU0xfQ09NTUVOVCB8IFJVTEVfV1MgfCBSVUxFX0FOWV9PVEhFUiApCisgICAgICAgIGludCBhbHQxNT0yMjsKKyAgICAgICAgYWx0MTUgPSBkZmExNS5wcmVkaWN0KGlucHV0KTsKKyAgICAgICAgc3dpdGNoIChhbHQxNSkgeworICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxOjEwOiBUMTMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVQxMygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6MToxNDogVDE0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UMTQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjE6MTg6IFQxNQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVDE1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxOjIyOiBUMTYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVQxNigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6MToyNjogVDE3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UMTcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjE6MzA6IFQxOAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVDE4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxOjM0OiBUMTkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVQxOSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6MTozODogVDIwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UMjAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjE6NDI6IFQyMQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVDIxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6MTo0NjogVDIyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UMjIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDExIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxOjUwOiBUMjMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVQyMygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjE6NTQ6IFQyNAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVDI0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6MTo1ODogVDI1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UMjUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxOjYyOiBSVUxFX1JFQUwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfUkVBTCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjE6NzI6IFJVTEVfUExBSU5fU1RSSU5HCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1SVUxFX1BMQUlOX1NUUklORygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjE6OTA6IFJVTEVfSUQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfSUQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxOjk4OiBSVUxFX0lOVAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtUlVMRV9JTlQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxOjEwNzogUlVMRV9TVFJJTkcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfU1RSSU5HKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6MToxMTk6IFJVTEVfTUxfQ09NTUVOVAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtUlVMRV9NTF9DT01NRU5UKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6MToxMzU6IFJVTEVfU0xfQ09NTUVOVAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtUlVMRV9TTF9DT01NRU5UKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6MToxNTE6IFJVTEVfV1MKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfV1MoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxOjE1OTogUlVMRV9BTllfT1RIRVIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfQU5ZX09USEVSKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKworICAgIH0KKworCisgICAgcHJvdGVjdGVkIERGQTE1IGRmYTE1ID0gbmV3IERGQTE1KHRoaXMpOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMTVfZW90UyA9CisgICAgICAgICJcMVx1ZmZmZlwxXDMwXDdcdWZmZmZcNFwzMFwxXDI2XDFcNDVcMlwyNlwxXHVmZmZmXDNcMjZcMlx1ZmZmZlwxIisKKyAgICAgICAgIlwzMFwxMFx1ZmZmZlw1XDMwXDFcdWZmZmZcMVw0NVw1XHVmZmZmXDNcMzBcMVw2NVw1XDMwXDFcdWZmZmZcMiIrCisgICAgICAgICJcMzBcMVw3NVwxXDc2XDNcMzBcMlx1ZmZmZlwzXDMwXDFcMTA1XDFcMTA2XDFcMTA3XDNcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMTVfZW9mUyA9CisgICAgICAgICJcMTEwXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE1X21pblMgPQorICAgICAgICAiXDFcMFwxXDEwNVw3XHVmZmZmXDFcMTU3XDFcMTY2XDFcMTY1XDFcMTQxXDJcNjBcMVwwXDFcMTAxXDFcdWZmZmYiKworICAgICAgICAiXDJcMFwxXDUyXDJcdWZmZmZcMVwxMjNcMTBcdWZmZmZcMVwxNjVcMVwxNDVcMVwxNTVcMVwxNzBcMVwxNTZcMSIrCisgICAgICAgICJcdWZmZmZcMVw2MFw1XHVmZmZmXDFcMTI0XDFcMTU2XDFcMTYyXDFcNjBcMlwxNTFcMVwxMjNcMVwxNjRcMVwxNDEiKworICAgICAgICAiXDFcdWZmZmZcMlwxNTVcMlw2MFwxXDE0N1wyXDE2NVwyXHVmZmZmXDFcMTQ1XDJcMTU1XDNcNjBcM1x1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkExNV9tYXhTID0KKyAgICAgICAgIlwxXHVmZmZlXDFcMTA1XDdcdWZmZmZcMVwxNTdcMVwxNjZcMVwxNjVcMVwxNTFcMlw3MVwxXHVmZmZlXDFcMTcyIisKKyAgICAgICAgIlwxXHVmZmZmXDJcdWZmZmVcMVw1N1wyXHVmZmZmXDFcMTIzXDEwXHVmZmZmXDFcMTY1XDFcMTQ1XDFcMTU1XDEiKworICAgICAgICAiXDE3MFwxXDE1NlwxXHVmZmZmXDFcNzFcNVx1ZmZmZlwxXDEyNFwxXDE1NlwxXDE2MlwxXDE3MlwyXDE1MVwxIisKKyAgICAgICAgIlwxMjNcMVwxNjRcMVwxNDFcMVx1ZmZmZlwyXDE1NVwyXDE3MlwxXDE0N1wyXDE2NVwyXHVmZmZmXDFcMTQ1XDIiKworICAgICAgICAiXDE1NVwzXDE3MlwzXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTE1X2FjY2VwdFMgPQorICAgICAgICAiXDJcdWZmZmZcMVwyXDFcM1wxXDRcMVw1XDFcNlwxXDdcMVwxMFwxMFx1ZmZmZlwxXDIwXDNcdWZmZmZcMVwyNSIrCisgICAgICAgICJcMVwyNlwxXHVmZmZmXDFcMjBcMVwyXDFcM1wxXDRcMVw1XDFcNlwxXDdcMVwxMFw1XHVmZmZmXDFcMTZcMVx1ZmZmZiIrCisgICAgICAgICJcMVwxN1wxXDIyXDFcMjNcMVwyNFwxXDI1XDExXHVmZmZmXDFcMTNcN1x1ZmZmZlwxXDFcMVwxMVw2XHVmZmZmIisKKyAgICAgICAgIlwxXDEyXDFcMTVcMVwxNCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkExNV9zcGVjaWFsUyA9CisgICAgICAgICJcMTEwXHVmZmZmfT4iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERkExNV90cmFuc2l0aW9uUyA9IHsKKyAgICAgICAgICAgICJcMTFcMjZcMlwyNVwyXDI2XDFcMjVcMjJcMjZcMVwyNVwxXDI2XDFcMjJcNFwyNlwxXDIzXDFcMlwxXDQiKworICAgICAgICAgICAgIlwyXDI2XDFcN1wxXDE1XDFcMjZcMVwyNFwxMlwxNlwxXDNcMlwyNlwxXDVcM1wyNlwxXDEyXDFcMjFcMSIrCisgICAgICAgICAgICAiXDExXDExXDIxXDFcMTRcNVwyMVwxXDEzXDFcMVw2XDIxXDFcNlwxXDI2XDFcMTBcMVwyMFwxXDIxXDEiKworICAgICAgICAgICAgIlwyNlwzMlwyMVw2MFwyNlwxXDE3XHVmZjUzXDI2IiwKKyAgICAgICAgICAgICJcMVwyNyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw0MCIsCisgICAgICAgICAgICAiXDFcNDEiLAorICAgICAgICAgICAgIlwxXDQyIiwKKyAgICAgICAgICAgICJcMVw0M1w3XHVmZmZmXDFcNDQiLAorICAgICAgICAgICAgIlwxMlw0NSIsCisgICAgICAgICAgICAiXDEyXDQ2IiwKKyAgICAgICAgICAgICJcdTAwYWJcNDdcMVx1ZmZmZlx1ZmY1M1w0NyIsCisgICAgICAgICAgICAiXDMyXDMwXDRcdWZmZmZcMVwzMFwxXHVmZmZmXDMyXDMwIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlx1ZmZmZlw1MCIsCisgICAgICAgICAgICAiXHVmZmZmXDUwIiwKKyAgICAgICAgICAgICJcMVw1MVw0XHVmZmZmXDFcNTIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw1NCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDU1IiwKKyAgICAgICAgICAgICJcMVw1NiIsCisgICAgICAgICAgICAiXDFcNTciLAorICAgICAgICAgICAgIlwxXDYwIiwKKyAgICAgICAgICAgICJcMVw2MSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMTJcNDYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw2MiIsCisgICAgICAgICAgICAiXDFcNjMiLAorICAgICAgICAgICAgIlwxXDY0IiwKKyAgICAgICAgICAgICJcMTJcMzBcN1x1ZmZmZlwzMlwzMFw0XHVmZmZmXDFcMzBcMVx1ZmZmZlwzMlwzMCIsCisgICAgICAgICAgICAiXDFcNjYiLAorICAgICAgICAgICAgIlwxXDY3IiwKKyAgICAgICAgICAgICJcMVw3MCIsCisgICAgICAgICAgICAiXDFcNzEiLAorICAgICAgICAgICAgIlwxXDcyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDczIiwKKyAgICAgICAgICAgICJcMVw3NCIsCisgICAgICAgICAgICAiXDEyXDMwXDdcdWZmZmZcMzJcMzBcNFx1ZmZmZlwxXDMwXDFcdWZmZmZcMzJcMzAiLAorICAgICAgICAgICAgIlwxMlwzMFw3XHVmZmZmXDMyXDMwXDRcdWZmZmZcMVwzMFwxXHVmZmZmXDMyXDMwIiwKKyAgICAgICAgICAgICJcMVw3NyIsCisgICAgICAgICAgICAiXDFcMTAwIiwKKyAgICAgICAgICAgICJcMVwxMDEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMDIiLAorICAgICAgICAgICAgIlwxXDEwMyIsCisgICAgICAgICAgICAiXDFcMTA0IiwKKyAgICAgICAgICAgICJcMTJcMzBcN1x1ZmZmZlwzMlwzMFw0XHVmZmZmXDFcMzBcMVx1ZmZmZlwzMlwzMCIsCisgICAgICAgICAgICAiXDEyXDMwXDdcdWZmZmZcMzJcMzBcNFx1ZmZmZlwxXDMwXDFcdWZmZmZcMzJcMzAiLAorICAgICAgICAgICAgIlwxMlwzMFw3XHVmZmZmXDMyXDMwXDRcdWZmZmZcMVwzMFwxXHVmZmZmXDMyXDMwIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIgorICAgIH07CisKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkExNV9lb3QgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkExNV9lb3RTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkExNV9lb2YgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkExNV9lb2ZTKTsKKyAgICBzdGF0aWMgZmluYWwgY2hhcltdIERGQTE1X21pbiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTE1X21pblMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMTVfbWF4ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmdUb1Vuc2lnbmVkQ2hhcnMoREZBMTVfbWF4Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMTVfYWNjZXB0ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMTVfYWNjZXB0Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMTVfc3BlY2lhbCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTE1X3NwZWNpYWxTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXVtdIERGQTE1X3RyYW5zaXRpb247CisKKyAgICBzdGF0aWMgeworICAgICAgICBpbnQgbnVtU3RhdGVzID0gREZBMTVfdHJhbnNpdGlvblMubGVuZ3RoOworICAgICAgICBERkExNV90cmFuc2l0aW9uID0gbmV3IHNob3J0W251bVN0YXRlc11bXTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPG51bVN0YXRlczsgaSsrKSB7CisgICAgICAgICAgICBERkExNV90cmFuc2l0aW9uW2ldID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMTVfdHJhbnNpdGlvblNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgREZBMTUgZXh0ZW5kcyBERkEgeworCisgICAgICAgIHB1YmxpYyBERkExNShCYXNlUmVjb2duaXplciByZWNvZ25pemVyKSB7CisgICAgICAgICAgICB0aGlzLnJlY29nbml6ZXIgPSByZWNvZ25pemVyOworICAgICAgICAgICAgdGhpcy5kZWNpc2lvbk51bWJlciA9IDE1OworICAgICAgICAgICAgdGhpcy5lb3QgPSBERkExNV9lb3Q7CisgICAgICAgICAgICB0aGlzLmVvZiA9IERGQTE1X2VvZjsKKyAgICAgICAgICAgIHRoaXMubWluID0gREZBMTVfbWluOworICAgICAgICAgICAgdGhpcy5tYXggPSBERkExNV9tYXg7CisgICAgICAgICAgICB0aGlzLmFjY2VwdCA9IERGQTE1X2FjY2VwdDsKKyAgICAgICAgICAgIHRoaXMuc3BlY2lhbCA9IERGQTE1X3NwZWNpYWw7CisgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBERkExNV90cmFuc2l0aW9uOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gIjE6MTogVG9rZW5zIDogKCBUMTMgfCBUMTQgfCBUMTUgfCBUMTYgfCBUMTcgfCBUMTggfCBUMTkgfCBUMjAgfCBUMjEgfCBUMjIgfCBUMjMgfCBUMjQgfCBUMjUgfCBSVUxFX1JFQUwgfCBSVUxFX1BMQUlOX1NUUklORyB8IFJVTEVfSUQgfCBSVUxFX0lOVCB8IFJVTEVfU1RSSU5HIHwgUlVMRV9NTF9DT01NRU5UIHwgUlVMRV9TTF9DT01NRU5UIHwgUlVMRV9XUyB8IFJVTEVfQU5ZX09USEVSICk7IjsKKyAgICAgICAgfQorICAgIH0KKyAKKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3RQYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3RQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTc4NGU5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdFBhcnNlci5qYXZhCkBAIC0wLDAgKzEsMTExOSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcucGFyc2VyLmFudGxyLmludGVybmFsOyAKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuaW1wbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNldHJlZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuQWJzdHJhY3RJbnRlcm5hbEFudGxyUGFyc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5YdGV4dFRva2VuU3RyZWFtOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5YdGV4dFRva2VuU3RyZWFtLkhpZGRlblRva2VuczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuQW50bHJEYXRhdHlwZVJ1bGVUb2tlbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb252ZXJzaW9uLlZhbHVlQ29udmVydGVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5zZXJ2aWNlcy5BVGVzdEdyYW1tYXJBY2Nlc3M7CisKKworCitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuKjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworcHVibGljIGNsYXNzIEludGVybmFsQVRlc3RQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdEludGVybmFsQW50bHJQYXJzZXIgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gdG9rZW5OYW1lcyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICI8aW52YWxpZD4iLCAiPEVPUj4iLCAiPERPV04+IiwgIjxVUD4iLCAiUlVMRV9TVFJJTkciLCAiUlVMRV9QTEFJTl9TVFJJTkciLCAiUlVMRV9JTlQiLCAiUlVMRV9SRUFMIiwgIlJVTEVfSUQiLCAiUlVMRV9NTF9DT01NRU5UIiwgIlJVTEVfU0xfQ09NTUVOVCIsICJSVUxFX1dTIiwgIlJVTEVfQU5ZX09USEVSIiwgIidURVNUUyciLCAiJygnIiwgIic6JyIsICInKSciLCAiJz0nIiwgIidbJyIsICInLCciLCAiJ10nIiwgIidDb3VudCciLCAiJ0F2ZXJhZ2UnIiwgIidTdW0nIiwgIidNaW5pbXVtJyIsICInTWF4aW11bSciCisgICAgfTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX1BMQUlOX1NUUklORz01OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfSUQ9ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX1NUUklORz00OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfQU5ZX09USEVSPTEyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfSU5UPTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9SRUFMPTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9XUz0xMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX1NMX0NPTU1FTlQ9MTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU9GPS0xOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfTUxfQ09NTUVOVD05OworCisgICAgICAgIHB1YmxpYyBJbnRlcm5hbEFUZXN0UGFyc2VyKFRva2VuU3RyZWFtIGlucHV0KSB7CisgICAgICAgICAgICBzdXBlcihpbnB1dCk7CisgICAgICAgIH0KKyAgICAgICAgCisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VG9rZW5OYW1lcygpIHsgcmV0dXJuIHRva2VuTmFtZXM7IH0KKyAgICBwdWJsaWMgU3RyaW5nIGdldEdyYW1tYXJGaWxlTmFtZSgpIHsgcmV0dXJuICIuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZyI7IH0KKworCisgICAgIAorICAgICAJcHJpdmF0ZSBBVGVzdEdyYW1tYXJBY2Nlc3MgZ3JhbW1hckFjY2VzczsKKyAgICAgCQorICAgICAgICBwdWJsaWMgSW50ZXJuYWxBVGVzdFBhcnNlcihUb2tlblN0cmVhbSBpbnB1dCwgSUFzdEZhY3RvcnkgZmFjdG9yeSwgQVRlc3RHcmFtbWFyQWNjZXNzIGdyYW1tYXJBY2Nlc3MpIHsKKyAgICAgICAgICAgIHRoaXMoaW5wdXQpOworICAgICAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKKyAgICAgICAgICAgIHJlZ2lzdGVyUnVsZXMoZ3JhbW1hckFjY2Vzcy5nZXRHcmFtbWFyKCkpOworICAgICAgICAgICAgdGhpcy5ncmFtbWFyQWNjZXNzID0gZ3JhbW1hckFjY2VzczsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBnZXRUb2tlbkZpbGUoKSB7CisgICAgICAgIAlDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgCXJldHVybiBjbGFzc0xvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKCJvcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QudG9rZW5zIik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEZpcnN0UnVsZU5hbWUoKSB7CisgICAgICAgIAlyZXR1cm4gIk1vZGVsIjsJCisgICAgICAgCX0gCisKKworCisgICAgLy8gJEFOVExSIHN0YXJ0IGVudHJ5UnVsZU1vZGVsCisgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6NzM6MTogZW50cnlSdWxlTW9kZWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZU1vZGVsPSBydWxlTW9kZWwgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVNb2RlbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlTW9kZWwgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjczOjQ3OiAoaXZfcnVsZU1vZGVsPSBydWxlTW9kZWwgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjc0OjI6IGl2X3J1bGVNb2RlbD0gcnVsZU1vZGVsIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY3JlYXRlQ29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE1vZGVsUnVsZSgpLCBjdXJyZW50Tm9kZSk7IAorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU1vZGVsX2luX2VudHJ5UnVsZU1vZGVsNzMpOworICAgICAgICAgICAgaXZfcnVsZU1vZGVsPXJ1bGVNb2RlbCgpOworICAgICAgICAgICAgX2ZzcC0tOworCisgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZU1vZGVsOyAKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZU1vZGVsODMpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCBlbnRyeVJ1bGVNb2RlbAorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgcnVsZU1vZGVsCisgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6ODE6MTogcnVsZU1vZGVsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKGx2X25hbWVfMD0gUlVMRV9TVFJJTkcgKT8gKGx2X2Rlc2NyaXB0aW9uXzE9IFJVTEVfUExBSU5fU1RSSU5HICk/IChsdl90ZXN0c18yPSBydWxlVGVzdHMgKT8gKGx2X2NvbnRyYWludHNfMz0gcnVsZUNvbnN0cmFpbnQgKSogKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZU1vZGVsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBsdl9uYW1lXzA9bnVsbDsKKyAgICAgICAgVG9rZW4gbHZfZGVzY3JpcHRpb25fMT1udWxsOworICAgICAgICBFT2JqZWN0IGx2X3Rlc3RzXzIgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfY29udHJhaW50c18zID0gbnVsbDsKKworCisgICAgICAgICBFT2JqZWN0IHRlbXA9bnVsbDsgc2V0Q3VycmVudExvb2thaGVhZCgpOyByZXNldExvb2thaGVhZCgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6ODY6NjogKCAoIChsdl9uYW1lXzA9IFJVTEVfU1RSSU5HICk/IChsdl9kZXNjcmlwdGlvbl8xPSBSVUxFX1BMQUlOX1NUUklORyApPyAobHZfdGVzdHNfMj0gcnVsZVRlc3RzICk/IChsdl9jb250cmFpbnRzXzM9IHJ1bGVDb25zdHJhaW50ICkqICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6ODc6MTogKCAobHZfbmFtZV8wPSBSVUxFX1NUUklORyApPyAobHZfZGVzY3JpcHRpb25fMT0gUlVMRV9QTEFJTl9TVFJJTkcgKT8gKGx2X3Rlc3RzXzI9IHJ1bGVUZXN0cyApPyAobHZfY29udHJhaW50c18zPSBydWxlQ29uc3RyYWludCApKiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzo4NzoxOiAoIChsdl9uYW1lXzA9IFJVTEVfU1RSSU5HICk/IChsdl9kZXNjcmlwdGlvbl8xPSBSVUxFX1BMQUlOX1NUUklORyApPyAobHZfdGVzdHNfMj0gcnVsZVRlc3RzICk/IChsdl9jb250cmFpbnRzXzM9IHJ1bGVDb25zdHJhaW50ICkqICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjg3OjI6IChsdl9uYW1lXzA9IFJVTEVfU1RSSU5HICk/IChsdl9kZXNjcmlwdGlvbl8xPSBSVUxFX1BMQUlOX1NUUklORyApPyAobHZfdGVzdHNfMj0gcnVsZVRlc3RzICk/IChsdl9jb250cmFpbnRzXzM9IHJ1bGVDb25zdHJhaW50ICkqCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzo4NzoyOiAobHZfbmFtZV8wPSBSVUxFX1NUUklORyApPworICAgICAgICAgICAgaW50IGFsdDE9MjsKKyAgICAgICAgICAgIGludCBMQTFfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTFfMD09UlVMRV9TVFJJTkcpICkgeworICAgICAgICAgICAgICAgIGFsdDE9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjg5OjY6IGx2X25hbWVfMD0gUlVMRV9TVFJJTkcKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsdl9uYW1lXzA9KFRva2VuKWlucHV0LkxUKDEpOworICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCxSVUxFX1NUUklORyxGT0xMT1dfUlVMRV9TVFJJTkdfaW5fcnVsZU1vZGVsMTMwKTsgCisKKyAgICAgICAgICAgICAgICAgICAgCQljcmVhdGVMZWFmTm9kZShncmFtbWFyQWNjZXNzLmdldE1vZGVsQWNjZXNzKCkuZ2V0TmFtZVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMF8wKCksICJuYW1lIik7IAorICAgICAgICAgICAgICAgICAgICAJCisKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBmYWN0b3J5LmNyZWF0ZShncmFtbWFyQWNjZXNzLmdldE1vZGVsUnVsZSgpLmdldFR5cGUoKS5nZXRDbGFzc2lmaWVyKCkpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgYXNzb2NpYXRlTm9kZVdpdGhBc3RFbGVtZW50KGN1cnJlbnROb2RlLCBjdXJyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAJCXNldChjdXJyZW50LCAibmFtZSIsIGx2X25hbWVfMCwgIlNUUklORyIsIGxhc3RDb25zdW1lZE5vZGUpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgICB9IGNhdGNoIChWYWx1ZUNvbnZlcnRlckV4Y2VwdGlvbiB2Y2UpIHsKKyAgICAgICAgICAgICAgICAgICAgCQkJCWhhbmRsZVZhbHVlQ29udmVydGVyRXhjZXB0aW9uKHZjZSk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICAKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjEwNzozOiAobHZfZGVzY3JpcHRpb25fMT0gUlVMRV9QTEFJTl9TVFJJTkcgKT8KKyAgICAgICAgICAgIGludCBhbHQyPTI7CisgICAgICAgICAgICBpbnQgTEEyXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEEyXzA9PVJVTEVfUExBSU5fU1RSSU5HKSApIHsKKyAgICAgICAgICAgICAgICBhbHQyPTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDIpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxMDk6NjogbHZfZGVzY3JpcHRpb25fMT0gUlVMRV9QTEFJTl9TVFJJTkcKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsdl9kZXNjcmlwdGlvbl8xPShUb2tlbilpbnB1dC5MVCgxKTsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsUlVMRV9QTEFJTl9TVFJJTkcsRk9MTE9XX1JVTEVfUExBSU5fU1RSSU5HX2luX3J1bGVNb2RlbDE2MSk7IAorCisgICAgICAgICAgICAgICAgICAgIAkJY3JlYXRlTGVhZk5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRNb2RlbEFjY2VzcygpLmdldERlc2NyaXB0aW9uUExBSU5fU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8xXzAoKSwgImRlc2NyaXB0aW9uIik7IAorICAgICAgICAgICAgICAgICAgICAJCisKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBmYWN0b3J5LmNyZWF0ZShncmFtbWFyQWNjZXNzLmdldE1vZGVsUnVsZSgpLmdldFR5cGUoKS5nZXRDbGFzc2lmaWVyKCkpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgYXNzb2NpYXRlTm9kZVdpdGhBc3RFbGVtZW50KGN1cnJlbnROb2RlLCBjdXJyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAJCXNldChjdXJyZW50LCAiZGVzY3JpcHRpb24iLCBsdl9kZXNjcmlwdGlvbl8xLCAiUExBSU5fU1RSSU5HIiwgbGFzdENvbnN1bWVkTm9kZSk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIH0gY2F0Y2ggKFZhbHVlQ29udmVydGVyRXhjZXB0aW9uIHZjZSkgeworICAgICAgICAgICAgICAgICAgICAJCQkJaGFuZGxlVmFsdWVDb252ZXJ0ZXJFeGNlcHRpb24odmNlKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIAorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6MTI3OjM6IChsdl90ZXN0c18yPSBydWxlVGVzdHMgKT8KKyAgICAgICAgICAgIGludCBhbHQzPTI7CisgICAgICAgICAgICBpbnQgTEEzXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEEzXzA9PTEzKSApIHsKKyAgICAgICAgICAgICAgICBhbHQzPTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDMpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxMzA6NjogbHZfdGVzdHNfMj0gcnVsZVRlc3RzCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAJICAgICAgICBjdXJyZW50Tm9kZT1jcmVhdGVDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TW9kZWxBY2Nlc3MoKS5nZXRUZXN0c1Rlc3RzUGFyc2VyUnVsZUNhbGxfMl8wKCksIGN1cnJlbnROb2RlKTsgCisgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVUZXN0c19pbl9ydWxlTW9kZWwyMDQpOworICAgICAgICAgICAgICAgICAgICBsdl90ZXN0c18yPXJ1bGVUZXN0cygpOworICAgICAgICAgICAgICAgICAgICBfZnNwLS07CisKKworICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGZhY3RvcnkuY3JlYXRlKGdyYW1tYXJBY2Nlc3MuZ2V0TW9kZWxSdWxlKCkuZ2V0VHlwZSgpLmdldENsYXNzaWZpZXIoKSk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBhc3NvY2lhdGVOb2RlV2l0aEFzdEVsZW1lbnQoY3VycmVudE5vZGUuZ2V0UGFyZW50KCksIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAJICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAJICAgICAgIAkJc2V0KGN1cnJlbnQsICJ0ZXN0cyIsIGx2X3Rlc3RzXzIsICJUZXN0cyIsIGN1cnJlbnROb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfSBjYXRjaCAoVmFsdWVDb252ZXJ0ZXJFeGNlcHRpb24gdmNlKSB7CisgICAgICAgICAgICAgICAgICAgIAkJCQloYW5kbGVWYWx1ZUNvbnZlcnRlckV4Y2VwdGlvbih2Y2UpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxNDg6MzogKGx2X2NvbnRyYWludHNfMz0gcnVsZUNvbnN0cmFpbnQgKSoKKyAgICAgICAgICAgIGxvb3A0OgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQ0PTI7CisgICAgICAgICAgICAgICAgaW50IExBNF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoICgoTEE0XzA+PTIxICYmIExBNF8wPD0yNSkpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ0PTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDQpIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxNTE6NjogbHZfY29udHJhaW50c18zPSBydWxlQ29uc3RyYWludAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgICAKKyAgICAgICAgICAgIAkgICAgCSAgICAgICAgY3VycmVudE5vZGU9Y3JlYXRlQ29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE1vZGVsQWNjZXNzKCkuZ2V0Q29udHJhaW50c0NvbnN0cmFpbnRQYXJzZXJSdWxlQ2FsbF8zXzAoKSwgY3VycmVudE5vZGUpOyAKKyAgICAgICAgICAgIAkgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNvbnN0cmFpbnRfaW5fcnVsZU1vZGVsMjQzKTsKKyAgICAgICAgICAgIAkgICAgbHZfY29udHJhaW50c18zPXJ1bGVDb25zdHJhaW50KCk7CisgICAgICAgICAgICAJICAgIF9mc3AtLTsKKworCisgICAgICAgICAgICAJICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gZmFjdG9yeS5jcmVhdGUoZ3JhbW1hckFjY2Vzcy5nZXRNb2RlbFJ1bGUoKS5nZXRUeXBlKCkuZ2V0Q2xhc3NpZmllcigpKTsKKyAgICAgICAgICAgIAkgICAgCSAgICAgICAgICAgIGFzc29jaWF0ZU5vZGVXaXRoQXN0RWxlbWVudChjdXJyZW50Tm9kZS5nZXRQYXJlbnQoKSwgY3VycmVudCk7CisgICAgICAgICAgICAJICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgCSAgICAgICAgCisgICAgICAgICAgICAJICAgIAkgICAgICAgIHRyeSB7CisgICAgICAgICAgICAJICAgIAkgICAgICAgCQlhZGQoY3VycmVudCwgImNvbnRyYWludHMiLCBsdl9jb250cmFpbnRzXzMsICJDb25zdHJhaW50IiwgY3VycmVudE5vZGUpOworICAgICAgICAgICAgCSAgICAJICAgICAgICB9IGNhdGNoIChWYWx1ZUNvbnZlcnRlckV4Y2VwdGlvbiB2Y2UpIHsKKyAgICAgICAgICAgIAkgICAgCQkJCWhhbmRsZVZhbHVlQ29udmVydGVyRXhjZXB0aW9uKHZjZSk7CisgICAgICAgICAgICAJICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgCSAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIAkgICAgCSAgICAKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3A0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICByZXNldExvb2thaGVhZCgpOyAKKyAgICAgICAgICAgICAgICAJbGFzdENvbnN1bWVkTm9kZSA9IGN1cnJlbnROb2RlOworICAgICAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgcnVsZU1vZGVsCisKKworICAgIC8vICRBTlRMUiBzdGFydCBlbnRyeVJ1bGVUZXN0cworICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjE3NjoxOiBlbnRyeVJ1bGVUZXN0cyByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlVGVzdHM9IHJ1bGVUZXN0cyBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVRlc3RzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVUZXN0cyA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6MTc2OjQ3OiAoaXZfcnVsZVRlc3RzPSBydWxlVGVzdHMgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjE3NzoyOiBpdl9ydWxlVGVzdHM9IHJ1bGVUZXN0cyBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGNyZWF0ZUNvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRUZXN0c1J1bGUoKSwgY3VycmVudE5vZGUpOyAKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVUZXN0c19pbl9lbnRyeVJ1bGVUZXN0czI4MSk7CisgICAgICAgICAgICBpdl9ydWxlVGVzdHM9cnVsZVRlc3RzKCk7CisgICAgICAgICAgICBfZnNwLS07CisKKyAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlVGVzdHM7IAorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlVGVzdHMyOTEpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCBlbnRyeVJ1bGVUZXN0cworCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgcnVsZVRlc3RzCisgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6MTg0OjE6IHJ1bGVUZXN0cyByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICdURVNUUycgKGx2X2ltcG9ydFVSSV8xPSBSVUxFX1NUUklORyApICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVUZXN0cygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gbHZfaW1wb3J0VVJJXzE9bnVsbDsKKworICAgICAgICAgRU9iamVjdCB0ZW1wPW51bGw7IHNldEN1cnJlbnRMb29rYWhlYWQoKTsgcmVzZXRMb29rYWhlYWQoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjE4OTo2OiAoICggJ1RFU1RTJyAobHZfaW1wb3J0VVJJXzE9IFJVTEVfU1RSSU5HICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxOTA6MTogKCAnVEVTVFMnIChsdl9pbXBvcnRVUklfMT0gUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxOTA6MTogKCAnVEVTVFMnIChsdl9pbXBvcnRVUklfMT0gUlVMRV9TVFJJTkcgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoxOTA6MjogJ1RFU1RTJyAobHZfaW1wb3J0VVJJXzE9IFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEzLEZPTExPV18xM19pbl9ydWxlVGVzdHMzMjUpOyAKKworICAgICAgICAgICAgICAgICAgICBjcmVhdGVMZWFmTm9kZShncmFtbWFyQWNjZXNzLmdldFRlc3RzQWNjZXNzKCkuZ2V0VEVTVFNLZXl3b3JkXzAoKSwgbnVsbCk7IAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6MTk0OjE6IChsdl9pbXBvcnRVUklfMT0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6MTk2OjY6IGx2X2ltcG9ydFVSSV8xPSBSVUxFX1NUUklORworICAgICAgICAgICAgeworICAgICAgICAgICAgbHZfaW1wb3J0VVJJXzE9KFRva2VuKWlucHV0LkxUKDEpOworICAgICAgICAgICAgbWF0Y2goaW5wdXQsUlVMRV9TVFJJTkcsRk9MTE9XX1JVTEVfU1RSSU5HX2luX3J1bGVUZXN0czM0Nyk7IAorCisgICAgICAgICAgICAJCWNyZWF0ZUxlYWZOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VGVzdHNBY2Nlc3MoKS5nZXRJbXBvcnRVUklTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzFfMCgpLCAiaW1wb3J0VVJJIik7IAorICAgICAgICAgICAgCQorCisgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBmYWN0b3J5LmNyZWF0ZShncmFtbWFyQWNjZXNzLmdldFRlc3RzUnVsZSgpLmdldFR5cGUoKS5nZXRDbGFzc2lmaWVyKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAgIGFzc29jaWF0ZU5vZGVXaXRoQXN0RWxlbWVudChjdXJyZW50Tm9kZSwgY3VycmVudCk7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgIHRyeSB7CisgICAgICAgICAgICAJICAgICAgIAkJc2V0KGN1cnJlbnQsICJpbXBvcnRVUkkiLCBsdl9pbXBvcnRVUklfMSwgIlNUUklORyIsIGxhc3RDb25zdW1lZE5vZGUpOworICAgICAgICAgICAgCSAgICAgICAgfSBjYXRjaCAoVmFsdWVDb252ZXJ0ZXJFeGNlcHRpb24gdmNlKSB7CisgICAgICAgICAgICAJCQkJaGFuZGxlVmFsdWVDb252ZXJ0ZXJFeGNlcHRpb24odmNlKTsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgcmVzZXRMb29rYWhlYWQoKTsgCisgICAgICAgICAgICAgICAgCWxhc3RDb25zdW1lZE5vZGUgPSBjdXJyZW50Tm9kZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kIHJ1bGVUZXN0cworCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgZW50cnlSdWxlQ29uc3RyYWludAorICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjIyMToxOiBlbnRyeVJ1bGVDb25zdHJhaW50IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVDb25zdHJhaW50PSBydWxlQ29uc3RyYWludCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZUNvbnN0cmFpbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZUNvbnN0cmFpbnQgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjIyMTo1MjogKGl2X3J1bGVDb25zdHJhaW50PSBydWxlQ29uc3RyYWludCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6MjIyOjI6IGl2X3J1bGVDb25zdHJhaW50PSBydWxlQ29uc3RyYWludCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGNyZWF0ZUNvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDb25zdHJhaW50UnVsZSgpLCBjdXJyZW50Tm9kZSk7IAorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNvbnN0cmFpbnRfaW5fZW50cnlSdWxlQ29uc3RyYWludDM4OCk7CisgICAgICAgICAgICBpdl9ydWxlQ29uc3RyYWludD1ydWxlQ29uc3RyYWludCgpOworICAgICAgICAgICAgX2ZzcC0tOworCisgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZUNvbnN0cmFpbnQ7IAorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlQ29uc3RyYWludDM5OCk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kIGVudHJ5UnVsZUNvbnN0cmFpbnQKKworCisgICAgLy8gJEFOVExSIHN0YXJ0IHJ1bGVDb25zdHJhaW50CisgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6MjI5OjE6IHJ1bGVDb25zdHJhaW50IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKGx2X21lYXN1cmVfMD0gcnVsZU1lYXN1cmUgKSAnKCcgKCBSVUxFX1NUUklORyApICc6JyAoIFJVTEVfU1RSSU5HICkgKCAnOicgKCBSVUxFX1NUUklORyApICk/ICcpJyAoICc9JyAnWycgKGx2X21pblZhbHVlXzEwPSAoIHJ1bGVJbnRWYWx1ZSB8IHJ1bGVSZWFsVmFsdWUgKSApICcsJyAobHZfbWF4VmFsdWVfMTI9ICggcnVsZUludFZhbHVlIHwgcnVsZVJlYWxWYWx1ZSApICkgJ10nICkgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZUNvbnN0cmFpbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIGx2X21pblZhbHVlXzEwPW51bGw7CisgICAgICAgIFRva2VuIGx2X21heFZhbHVlXzEyPW51bGw7CisgICAgICAgIEVudW1lcmF0b3IgbHZfbWVhc3VyZV8wID0gbnVsbDsKKworCisgICAgICAgICBFT2JqZWN0IHRlbXA9bnVsbDsgc2V0Q3VycmVudExvb2thaGVhZCgpOyByZXNldExvb2thaGVhZCgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6MjM0OjY6ICggKCAobHZfbWVhc3VyZV8wPSBydWxlTWVhc3VyZSApICcoJyAoIFJVTEVfU1RSSU5HICkgJzonICggUlVMRV9TVFJJTkcgKSAoICc6JyAoIFJVTEVfU1RSSU5HICkgKT8gJyknICggJz0nICdbJyAobHZfbWluVmFsdWVfMTA9ICggcnVsZUludFZhbHVlIHwgcnVsZVJlYWxWYWx1ZSApICkgJywnIChsdl9tYXhWYWx1ZV8xMj0gKCBydWxlSW50VmFsdWUgfCBydWxlUmVhbFZhbHVlICkgKSAnXScgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjIzNToxOiAoIChsdl9tZWFzdXJlXzA9IHJ1bGVNZWFzdXJlICkgJygnICggUlVMRV9TVFJJTkcgKSAnOicgKCBSVUxFX1NUUklORyApICggJzonICggUlVMRV9TVFJJTkcgKSApPyAnKScgKCAnPScgJ1snIChsdl9taW5WYWx1ZV8xMD0gKCBydWxlSW50VmFsdWUgfCBydWxlUmVhbFZhbHVlICkgKSAnLCcgKGx2X21heFZhbHVlXzEyPSAoIHJ1bGVJbnRWYWx1ZSB8IHJ1bGVSZWFsVmFsdWUgKSApICddJyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjIzNToxOiAoIChsdl9tZWFzdXJlXzA9IHJ1bGVNZWFzdXJlICkgJygnICggUlVMRV9TVFJJTkcgKSAnOicgKCBSVUxFX1NUUklORyApICggJzonICggUlVMRV9TVFJJTkcgKSApPyAnKScgKCAnPScgJ1snIChsdl9taW5WYWx1ZV8xMD0gKCBydWxlSW50VmFsdWUgfCBydWxlUmVhbFZhbHVlICkgKSAnLCcgKGx2X21heFZhbHVlXzEyPSAoIHJ1bGVJbnRWYWx1ZSB8IHJ1bGVSZWFsVmFsdWUgKSApICddJyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjIzNToyOiAobHZfbWVhc3VyZV8wPSBydWxlTWVhc3VyZSApICcoJyAoIFJVTEVfU1RSSU5HICkgJzonICggUlVMRV9TVFJJTkcgKSAoICc6JyAoIFJVTEVfU1RSSU5HICkgKT8gJyknICggJz0nICdbJyAobHZfbWluVmFsdWVfMTA9ICggcnVsZUludFZhbHVlIHwgcnVsZVJlYWxWYWx1ZSApICkgJywnIChsdl9tYXhWYWx1ZV8xMj0gKCBydWxlSW50VmFsdWUgfCBydWxlUmVhbFZhbHVlICkgKSAnXScgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6MjM1OjI6IChsdl9tZWFzdXJlXzA9IHJ1bGVNZWFzdXJlICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjIzODo2OiBsdl9tZWFzdXJlXzA9IHJ1bGVNZWFzdXJlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICBjdXJyZW50Tm9kZT1jcmVhdGVDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludEFjY2VzcygpLmdldE1lYXN1cmVNZWFzdXJlRW51bVJ1bGVDYWxsXzBfMCgpLCBjdXJyZW50Tm9kZSk7IAorICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVNZWFzdXJlX2luX3J1bGVDb25zdHJhaW50NDU3KTsKKyAgICAgICAgICAgIGx2X21lYXN1cmVfMD1ydWxlTWVhc3VyZSgpOworICAgICAgICAgICAgX2ZzcC0tOworCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGZhY3RvcnkuY3JlYXRlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludFJ1bGUoKS5nZXRUeXBlKCkuZ2V0Q2xhc3NpZmllcigpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBhc3NvY2lhdGVOb2RlV2l0aEFzdEVsZW1lbnQoY3VycmVudE5vZGUuZ2V0UGFyZW50KCksIGN1cnJlbnQpOworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICB0cnkgeworICAgICAgICAgICAgCSAgICAgICAJCXNldChjdXJyZW50LCAibWVhc3VyZSIsIGx2X21lYXN1cmVfMCwgIk1lYXN1cmUiLCBsYXN0Q29uc3VtZWROb2RlKTsKKyAgICAgICAgICAgIAkgICAgICAgIH0gY2F0Y2ggKFZhbHVlQ29udmVydGVyRXhjZXB0aW9uIHZjZSkgeworICAgICAgICAgICAgCQkJCWhhbmRsZVZhbHVlQ29udmVydGVyRXhjZXB0aW9uKHZjZSk7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmdldFBhcmVudCgpOworICAgICAgICAgICAgCSAgICAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtYXRjaChpbnB1dCwxNCxGT0xMT1dfMTRfaW5fcnVsZUNvbnN0cmFpbnQ0NzApOyAKKworICAgICAgICAgICAgICAgICAgICBjcmVhdGVMZWFmTm9kZShncmFtbWFyQWNjZXNzLmdldENvbnN0cmFpbnRBY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzEoKSwgbnVsbCk7IAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6MjYwOjE6ICggUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6MjYzOjM6IFJVTEVfU1RSSU5HCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgIAkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGZhY3RvcnkuY3JlYXRlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludFJ1bGUoKS5nZXRUeXBlKCkuZ2V0Q2xhc3NpZmllcigpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBhc3NvY2lhdGVOb2RlV2l0aEFzdEVsZW1lbnQoY3VycmVudE5vZGUsIGN1cnJlbnQpOworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LFJVTEVfU1RSSU5HLEZPTExPV19SVUxFX1NUUklOR19pbl9ydWxlQ29uc3RyYWludDQ5Mik7IAorCisgICAgICAgICAgICAJCWNyZWF0ZUxlYWZOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludEFjY2VzcygpLmdldEFnZW50U0FnZW50Q3Jvc3NSZWZlcmVuY2VfMl8wKCksICJhZ2VudCIpOyAKKyAgICAgICAgICAgIAkKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtYXRjaChpbnB1dCwxNSxGT0xMT1dfMTVfaW5fcnVsZUNvbnN0cmFpbnQ1MDQpOyAKKworICAgICAgICAgICAgICAgICAgICBjcmVhdGVMZWFmTm9kZShncmFtbWFyQWNjZXNzLmdldENvbnN0cmFpbnRBY2Nlc3MoKS5nZXRDb2xvbktleXdvcmRfMygpLCBudWxsKTsgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoyODA6MTogKCBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoyODM6MzogUlVMRV9TVFJJTkcKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gZmFjdG9yeS5jcmVhdGUoZ3JhbW1hckFjY2Vzcy5nZXRDb25zdHJhaW50UnVsZSgpLmdldFR5cGUoKS5nZXRDbGFzc2lmaWVyKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAgIGFzc29jaWF0ZU5vZGVXaXRoQXN0RWxlbWVudChjdXJyZW50Tm9kZSwgY3VycmVudCk7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgbWF0Y2goaW5wdXQsUlVMRV9TVFJJTkcsRk9MTE9XX1JVTEVfU1RSSU5HX2luX3J1bGVDb25zdHJhaW50NTI2KTsgCisKKyAgICAgICAgICAgIAkJY3JlYXRlTGVhZk5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDb25zdHJhaW50QWNjZXNzKCkuZ2V0QXR0cmlidXRlU0F0dHJpYnV0ZUNyb3NzUmVmZXJlbmNlXzRfMCgpLCAiYXR0cmlidXRlIik7IAorICAgICAgICAgICAgCQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjI5NjoyOiAoICc6JyAoIFJVTEVfU1RSSU5HICkgKT8KKyAgICAgICAgICAgIGludCBhbHQ1PTI7CisgICAgICAgICAgICBpbnQgTEE1XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEE1XzA9PTE1KSApIHsKKyAgICAgICAgICAgICAgICBhbHQ1PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzoyOTY6MzogJzonICggUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDE1LEZPTExPV18xNV9pbl9ydWxlQ29uc3RyYWludDUzOSk7IAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlTGVhZk5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDb25zdHJhaW50QWNjZXNzKCkuZ2V0Q29sb25LZXl3b3JkXzVfMCgpLCBudWxsKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6MzAwOjE6ICggUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzozMDM6MzogUlVMRV9TVFJJTkcKKyAgICAgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIAkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gZmFjdG9yeS5jcmVhdGUoZ3JhbW1hckFjY2Vzcy5nZXRDb25zdHJhaW50UnVsZSgpLmdldFR5cGUoKS5nZXRDbGFzc2lmaWVyKCkpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgYXNzb2NpYXRlTm9kZVdpdGhBc3RFbGVtZW50KGN1cnJlbnROb2RlLCBjdXJyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBtYXRjaChpbnB1dCxSVUxFX1NUUklORyxGT0xMT1dfUlVMRV9TVFJJTkdfaW5fcnVsZUNvbnN0cmFpbnQ1NjEpOyAKKworICAgICAgICAgICAgICAgICAgICAJCWNyZWF0ZUxlYWZOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludEFjY2VzcygpLmdldFF1YWxpZmllclNTdGF0ZVZhbHVlQ3Jvc3NSZWZlcmVuY2VfNV8xXzAoKSwgInF1YWxpZmllciIpOyAKKyAgICAgICAgICAgICAgICAgICAgCQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTYsRk9MTE9XXzE2X2luX3J1bGVDb25zdHJhaW50NTc1KTsgCisKKyAgICAgICAgICAgICAgICAgICAgY3JlYXRlTGVhZk5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDb25zdHJhaW50QWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfNigpLCBudWxsKTsgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzozMjA6MTogKCAnPScgJ1snIChsdl9taW5WYWx1ZV8xMD0gKCBydWxlSW50VmFsdWUgfCBydWxlUmVhbFZhbHVlICkgKSAnLCcgKGx2X21heFZhbHVlXzEyPSAoIHJ1bGVJbnRWYWx1ZSB8IHJ1bGVSZWFsVmFsdWUgKSApICddJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzozMjA6MjogJz0nICdbJyAobHZfbWluVmFsdWVfMTA9ICggcnVsZUludFZhbHVlIHwgcnVsZVJlYWxWYWx1ZSApICkgJywnIChsdl9tYXhWYWx1ZV8xMj0gKCBydWxlSW50VmFsdWUgfCBydWxlUmVhbFZhbHVlICkgKSAnXScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDE3LEZPTExPV18xN19pbl9ydWxlQ29uc3RyYWludDU4NSk7IAorCisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUxlYWZOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludEFjY2VzcygpLmdldEVxdWFsc1NpZ25LZXl3b3JkXzdfMCgpLCBudWxsKTsgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBtYXRjaChpbnB1dCwxOCxGT0xMT1dfMThfaW5fcnVsZUNvbnN0cmFpbnQ1OTQpOyAKKworICAgICAgICAgICAgICAgICAgICBjcmVhdGVMZWFmTm9kZShncmFtbWFyQWNjZXNzLmdldENvbnN0cmFpbnRBY2Nlc3MoKS5nZXRMZWZ0U3F1YXJlQnJhY2tldEtleXdvcmRfN18xKCksIG51bGwpOyAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjMyODoxOiAobHZfbWluVmFsdWVfMTA9ICggcnVsZUludFZhbHVlIHwgcnVsZVJlYWxWYWx1ZSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjMzMDo2OiBsdl9taW5WYWx1ZV8xMD0gKCBydWxlSW50VmFsdWUgfCBydWxlUmVhbFZhbHVlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjMzMDoyMTogKCBydWxlSW50VmFsdWUgfCBydWxlUmVhbFZhbHVlICkKKyAgICAgICAgICAgIGludCBhbHQ2PTI7CisgICAgICAgICAgICBpbnQgTEE2XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEE2XzA9PVJVTEVfSU5UKSApIHsKKyAgICAgICAgICAgICAgICBhbHQ2PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKExBNl8wPT1SVUxFX1JFQUwpICkgeworICAgICAgICAgICAgICAgIGFsdDY9MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIjMzMDoyMTogKCBydWxlSW50VmFsdWUgfCBydWxlUmVhbFZhbHVlICkiLCA2LCAwLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQ2KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6MzMwOjIzOiBydWxlSW50VmFsdWUKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU9Y3JlYXRlQ29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENvbnN0cmFpbnRBY2Nlc3MoKS5nZXRNaW5WYWx1ZUludFZhbHVlUGFyc2VyUnVsZUNhbGxfN18yXzBfMCgpLCBjdXJyZW50Tm9kZSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVJbnRWYWx1ZV9pbl9ydWxlQ29uc3RyYWludDYyMCk7CisgICAgICAgICAgICAgICAgICAgIHJ1bGVJbnRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICBfZnNwLS07CisKKyAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjMzNzo3OiBydWxlUmVhbFZhbHVlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlPWNyZWF0ZUNvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDb25zdHJhaW50QWNjZXNzKCkuZ2V0TWluVmFsdWVSZWFsVmFsdWVQYXJzZXJSdWxlQ2FsbF83XzJfMF8xKCksIGN1cnJlbnROb2RlKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJlYWxWYWx1ZV9pbl9ydWxlQ29uc3RyYWludDYzNCk7CisgICAgICAgICAgICAgICAgICAgIHJ1bGVSZWFsVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgX2ZzcC0tOworCisgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmdldFBhcmVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGZhY3RvcnkuY3JlYXRlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludFJ1bGUoKS5nZXRUeXBlKCkuZ2V0Q2xhc3NpZmllcigpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBhc3NvY2lhdGVOb2RlV2l0aEFzdEVsZW1lbnQoY3VycmVudE5vZGUsIGN1cnJlbnQpOworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICB0cnkgeworICAgICAgICAgICAgCSAgICAgICAJCXNldChjdXJyZW50LCAibWluVmFsdWUiLCBsdl9taW5WYWx1ZV8xMCwgbnVsbCwgbGFzdENvbnN1bWVkTm9kZSk7CisgICAgICAgICAgICAJICAgICAgICB9IGNhdGNoIChWYWx1ZUNvbnZlcnRlckV4Y2VwdGlvbiB2Y2UpIHsKKyAgICAgICAgICAgIAkJCQloYW5kbGVWYWx1ZUNvbnZlcnRlckV4Y2VwdGlvbih2Y2UpOworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtYXRjaChpbnB1dCwxOSxGT0xMT1dfMTlfaW5fcnVsZUNvbnN0cmFpbnQ2NTIpOyAKKworICAgICAgICAgICAgICAgICAgICBjcmVhdGVMZWFmTm9kZShncmFtbWFyQWNjZXNzLmdldENvbnN0cmFpbnRBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfN18zKCksIG51bGwpOyAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjM2MjoxOiAobHZfbWF4VmFsdWVfMTI9ICggcnVsZUludFZhbHVlIHwgcnVsZVJlYWxWYWx1ZSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjM2NDo2OiBsdl9tYXhWYWx1ZV8xMj0gKCBydWxlSW50VmFsdWUgfCBydWxlUmVhbFZhbHVlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjM2NDoyMTogKCBydWxlSW50VmFsdWUgfCBydWxlUmVhbFZhbHVlICkKKyAgICAgICAgICAgIGludCBhbHQ3PTI7CisgICAgICAgICAgICBpbnQgTEE3XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEE3XzA9PVJVTEVfSU5UKSApIHsKKyAgICAgICAgICAgICAgICBhbHQ3PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKExBN18wPT1SVUxFX1JFQUwpICkgeworICAgICAgICAgICAgICAgIGFsdDc9MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIjM2NDoyMTogKCBydWxlSW50VmFsdWUgfCBydWxlUmVhbFZhbHVlICkiLCA3LCAwLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQ3KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6MzY0OjIzOiBydWxlSW50VmFsdWUKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU9Y3JlYXRlQ29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENvbnN0cmFpbnRBY2Nlc3MoKS5nZXRNYXhWYWx1ZUludFZhbHVlUGFyc2VyUnVsZUNhbGxfN180XzBfMCgpLCBjdXJyZW50Tm9kZSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVJbnRWYWx1ZV9pbl9ydWxlQ29uc3RyYWludDY3OCk7CisgICAgICAgICAgICAgICAgICAgIHJ1bGVJbnRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICBfZnNwLS07CisKKyAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjM3MTo3OiBydWxlUmVhbFZhbHVlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlPWNyZWF0ZUNvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDb25zdHJhaW50QWNjZXNzKCkuZ2V0TWF4VmFsdWVSZWFsVmFsdWVQYXJzZXJSdWxlQ2FsbF83XzRfMF8xKCksIGN1cnJlbnROb2RlKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJlYWxWYWx1ZV9pbl9ydWxlQ29uc3RyYWludDY5Mik7CisgICAgICAgICAgICAgICAgICAgIHJ1bGVSZWFsVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgX2ZzcC0tOworCisgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmdldFBhcmVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGZhY3RvcnkuY3JlYXRlKGdyYW1tYXJBY2Nlc3MuZ2V0Q29uc3RyYWludFJ1bGUoKS5nZXRUeXBlKCkuZ2V0Q2xhc3NpZmllcigpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBhc3NvY2lhdGVOb2RlV2l0aEFzdEVsZW1lbnQoY3VycmVudE5vZGUsIGN1cnJlbnQpOworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICB0cnkgeworICAgICAgICAgICAgCSAgICAgICAJCXNldChjdXJyZW50LCAibWF4VmFsdWUiLCBsdl9tYXhWYWx1ZV8xMiwgbnVsbCwgbGFzdENvbnN1bWVkTm9kZSk7CisgICAgICAgICAgICAJICAgICAgICB9IGNhdGNoIChWYWx1ZUNvbnZlcnRlckV4Y2VwdGlvbiB2Y2UpIHsKKyAgICAgICAgICAgIAkJCQloYW5kbGVWYWx1ZUNvbnZlcnRlckV4Y2VwdGlvbih2Y2UpOworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtYXRjaChpbnB1dCwyMCxGT0xMT1dfMjBfaW5fcnVsZUNvbnN0cmFpbnQ3MTApOyAKKworICAgICAgICAgICAgICAgICAgICBjcmVhdGVMZWFmTm9kZShncmFtbWFyQWNjZXNzLmdldENvbnN0cmFpbnRBY2Nlc3MoKS5nZXRSaWdodFNxdWFyZUJyYWNrZXRLZXl3b3JkXzdfNSgpLCBudWxsKTsgCisgICAgICAgICAgICAgICAgCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgcmVzZXRMb29rYWhlYWQoKTsgCisgICAgICAgICAgICAgICAgCWxhc3RDb25zdW1lZE5vZGUgPSBjdXJyZW50Tm9kZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kIHJ1bGVDb25zdHJhaW50CisKKworICAgIC8vICRBTlRMUiBzdGFydCBlbnRyeVJ1bGVJbnRWYWx1ZQorICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjQwMzoxOiBlbnRyeVJ1bGVJbnRWYWx1ZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlSW50VmFsdWU9IHJ1bGVJbnRWYWx1ZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZUludFZhbHVlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVJbnRWYWx1ZSA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6NDAzOjUwOiAoaXZfcnVsZUludFZhbHVlPSBydWxlSW50VmFsdWUgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjQwNDoyOiBpdl9ydWxlSW50VmFsdWU9IHJ1bGVJbnRWYWx1ZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGNyZWF0ZUNvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRJbnRWYWx1ZVJ1bGUoKSwgY3VycmVudE5vZGUpOyAKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVJbnRWYWx1ZV9pbl9lbnRyeVJ1bGVJbnRWYWx1ZTc0NCk7CisgICAgICAgICAgICBpdl9ydWxlSW50VmFsdWU9cnVsZUludFZhbHVlKCk7CisgICAgICAgICAgICBfZnNwLS07CisKKyAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlSW50VmFsdWU7IAorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlSW50VmFsdWU3NTQpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCBlbnRyeVJ1bGVJbnRWYWx1ZQorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgcnVsZUludFZhbHVlCisgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6NDExOjE6IHJ1bGVJbnRWYWx1ZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAobHZfdmFsdWVfMD0gUlVMRV9JTlQgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZUludFZhbHVlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBsdl92YWx1ZV8wPW51bGw7CisKKyAgICAgICAgIEVPYmplY3QgdGVtcD1udWxsOyBzZXRDdXJyZW50TG9va2FoZWFkKCk7IHJlc2V0TG9va2FoZWFkKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzo0MTY6NjogKCAobHZfdmFsdWVfMD0gUlVMRV9JTlQgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzo0MTc6MTogKGx2X3ZhbHVlXzA9IFJVTEVfSU5UICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjQxNzoxOiAobHZfdmFsdWVfMD0gUlVMRV9JTlQgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6NDE5OjY6IGx2X3ZhbHVlXzA9IFJVTEVfSU5UCisgICAgICAgICAgICB7CisgICAgICAgICAgICBsdl92YWx1ZV8wPShUb2tlbilpbnB1dC5MVCgxKTsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LFJVTEVfSU5ULEZPTExPV19SVUxFX0lOVF9pbl9ydWxlSW50VmFsdWU4MDApOyAKKworICAgICAgICAgICAgCQljcmVhdGVMZWFmTm9kZShncmFtbWFyQWNjZXNzLmdldEludFZhbHVlQWNjZXNzKCkuZ2V0VmFsdWVJTlRUZXJtaW5hbFJ1bGVDYWxsXzAoKSwgInZhbHVlIik7IAorICAgICAgICAgICAgCQorCisgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBmYWN0b3J5LmNyZWF0ZShncmFtbWFyQWNjZXNzLmdldEludFZhbHVlUnVsZSgpLmdldFR5cGUoKS5nZXRDbGFzc2lmaWVyKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAgIGFzc29jaWF0ZU5vZGVXaXRoQXN0RWxlbWVudChjdXJyZW50Tm9kZSwgY3VycmVudCk7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgIHRyeSB7CisgICAgICAgICAgICAJICAgICAgIAkJc2V0KGN1cnJlbnQsICJ2YWx1ZSIsIGx2X3ZhbHVlXzAsICJJTlQiLCBsYXN0Q29uc3VtZWROb2RlKTsKKyAgICAgICAgICAgIAkgICAgICAgIH0gY2F0Y2ggKFZhbHVlQ29udmVydGVyRXhjZXB0aW9uIHZjZSkgeworICAgICAgICAgICAgCQkJCWhhbmRsZVZhbHVlQ29udmVydGVyRXhjZXB0aW9uKHZjZSk7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgIAorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgcmVzZXRMb29rYWhlYWQoKTsgCisgICAgICAgICAgICAgICAgCWxhc3RDb25zdW1lZE5vZGUgPSBjdXJyZW50Tm9kZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kIHJ1bGVJbnRWYWx1ZQorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgZW50cnlSdWxlUmVhbFZhbHVlCisgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6NDQ0OjE6IGVudHJ5UnVsZVJlYWxWYWx1ZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlUmVhbFZhbHVlPSBydWxlUmVhbFZhbHVlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlUmVhbFZhbHVlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVSZWFsVmFsdWUgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjQ0NDo1MTogKGl2X3J1bGVSZWFsVmFsdWU9IHJ1bGVSZWFsVmFsdWUgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjQ0NToyOiBpdl9ydWxlUmVhbFZhbHVlPSBydWxlUmVhbFZhbHVlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY3JlYXRlQ29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJlYWxWYWx1ZVJ1bGUoKSwgY3VycmVudE5vZGUpOyAKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVSZWFsVmFsdWVfaW5fZW50cnlSdWxlUmVhbFZhbHVlODQwKTsKKyAgICAgICAgICAgIGl2X3J1bGVSZWFsVmFsdWU9cnVsZVJlYWxWYWx1ZSgpOworICAgICAgICAgICAgX2ZzcC0tOworCisgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZVJlYWxWYWx1ZTsgCisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVSZWFsVmFsdWU4NTApOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCBlbnRyeVJ1bGVSZWFsVmFsdWUKKworCisgICAgLy8gJEFOVExSIHN0YXJ0IHJ1bGVSZWFsVmFsdWUKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzo0NTI6MTogcnVsZVJlYWxWYWx1ZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAobHZfdmFsdWVfMD0gUlVMRV9SRUFMICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVSZWFsVmFsdWUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIGx2X3ZhbHVlXzA9bnVsbDsKKworICAgICAgICAgRU9iamVjdCB0ZW1wPW51bGw7IHNldEN1cnJlbnRMb29rYWhlYWQoKTsgcmVzZXRMb29rYWhlYWQoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjQ1Nzo2OiAoIChsdl92YWx1ZV8wPSBSVUxFX1JFQUwgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzo0NTg6MTogKGx2X3ZhbHVlXzA9IFJVTEVfUkVBTCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzo0NTg6MTogKGx2X3ZhbHVlXzA9IFJVTEVfUkVBTCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzo0NjA6NjogbHZfdmFsdWVfMD0gUlVMRV9SRUFMCisgICAgICAgICAgICB7CisgICAgICAgICAgICBsdl92YWx1ZV8wPShUb2tlbilpbnB1dC5MVCgxKTsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LFJVTEVfUkVBTCxGT0xMT1dfUlVMRV9SRUFMX2luX3J1bGVSZWFsVmFsdWU4OTYpOyAKKworICAgICAgICAgICAgCQljcmVhdGVMZWFmTm9kZShncmFtbWFyQWNjZXNzLmdldFJlYWxWYWx1ZUFjY2VzcygpLmdldFZhbHVlUkVBTFRlcm1pbmFsUnVsZUNhbGxfMCgpLCAidmFsdWUiKTsgCisgICAgICAgICAgICAJCisKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGZhY3RvcnkuY3JlYXRlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVhbFZhbHVlUnVsZSgpLmdldFR5cGUoKS5nZXRDbGFzc2lmaWVyKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAgIGFzc29jaWF0ZU5vZGVXaXRoQXN0RWxlbWVudChjdXJyZW50Tm9kZSwgY3VycmVudCk7CisgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgIHRyeSB7CisgICAgICAgICAgICAJICAgICAgIAkJc2V0KGN1cnJlbnQsICJ2YWx1ZSIsIGx2X3ZhbHVlXzAsICJSRUFMIiwgbGFzdENvbnN1bWVkTm9kZSk7CisgICAgICAgICAgICAJICAgICAgICB9IGNhdGNoIChWYWx1ZUNvbnZlcnRlckV4Y2VwdGlvbiB2Y2UpIHsKKyAgICAgICAgICAgIAkJCQloYW5kbGVWYWx1ZUNvbnZlcnRlckV4Y2VwdGlvbih2Y2UpOworICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIHJlc2V0TG9va2FoZWFkKCk7IAorICAgICAgICAgICAgICAgIAlsYXN0Q29uc3VtZWROb2RlID0gY3VycmVudE5vZGU7CisgICAgICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCBydWxlUmVhbFZhbHVlCisKKworICAgIC8vICRBTlRMUiBzdGFydCBydWxlTWVhc3VyZQorICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjQ4NToxOiBydWxlTWVhc3VyZSByZXR1cm5zIFtFbnVtZXJhdG9yIGN1cnJlbnQ9bnVsbF0gOiAoICggJ0NvdW50JyApIHwgKCAnQXZlcmFnZScgKSB8ICggJ1N1bScgKSB8ICggJ01pbmltdW0nICkgfCAoICdNYXhpbXVtJyApICkgOworICAgIHB1YmxpYyBmaW5hbCBFbnVtZXJhdG9yIHJ1bGVNZWFzdXJlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRW51bWVyYXRvciBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICAgc2V0Q3VycmVudExvb2thaGVhZCgpOyByZXNldExvb2thaGVhZCgpOyAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjQ4OTo2OiAoICggKCAnQ291bnQnICkgfCAoICdBdmVyYWdlJyApIHwgKCAnU3VtJyApIHwgKCAnTWluaW11bScgKSB8ICggJ01heGltdW0nICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzo0OTA6MTogKCAoICdDb3VudCcgKSB8ICggJ0F2ZXJhZ2UnICkgfCAoICdTdW0nICkgfCAoICdNaW5pbXVtJyApIHwgKCAnTWF4aW11bScgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzo0OTA6MTogKCAoICdDb3VudCcgKSB8ICggJ0F2ZXJhZ2UnICkgfCAoICdTdW0nICkgfCAoICdNaW5pbXVtJyApIHwgKCAnTWF4aW11bScgKSApCisgICAgICAgICAgICBpbnQgYWx0OD01OworICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CisgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ4PTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0OD0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDg9MzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ4PTQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0OD01OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiNDkwOjE6ICggKCAnQ291bnQnICkgfCAoICdBdmVyYWdlJyApIHwgKCAnU3VtJyApIHwgKCAnTWluaW11bScgKSB8ICggJ01heGltdW0nICkgKSIsIDgsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0OCkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjQ5MDoyOiAoICdDb3VudCcgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjQ5MDoyOiAoICdDb3VudCcgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzo0OTA6NDogJ0NvdW50JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDIxLEZPTExPV18yMV9pbl9ydWxlTWVhc3VyZTk1MCk7IAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0TWVhc3VyZUFjY2VzcygpLmdldENPVU5URW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkuZ2V0RW51bUxpdGVyYWwoKS5nZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUxlYWZOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TWVhc3VyZUFjY2VzcygpLmdldENPVU5URW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCksIG51bGwpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6NDk2OjY6ICggJ0F2ZXJhZ2UnICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzo0OTY6NjogKCAnQXZlcmFnZScgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZzo0OTY6ODogJ0F2ZXJhZ2UnCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsMjIsRk9MTE9XXzIyX2luX3J1bGVNZWFzdXJlOTY1KTsgCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRNZWFzdXJlQWNjZXNzKCkuZ2V0QVZFUkFHRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVMZWFmTm9kZShncmFtbWFyQWNjZXNzLmdldE1lYXN1cmVBY2Nlc3MoKS5nZXRBVkVSQUdFRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCksIG51bGwpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6NTAyOjY6ICggJ1N1bScgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjUwMjo2OiAoICdTdW0nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6NTAyOjg6ICdTdW0nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goaW5wdXQsMjMsRk9MTE9XXzIzX2luX3J1bGVNZWFzdXJlOTgwKTsgCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRNZWFzdXJlQWNjZXNzKCkuZ2V0U1VNRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yKCkuZ2V0RW51bUxpdGVyYWwoKS5nZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUxlYWZOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TWVhc3VyZUFjY2VzcygpLmdldFNVTUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpLCBudWxsKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNCA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjUwODo2OiAoICdNaW5pbXVtJyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6NTA4OjY6ICggJ01pbmltdW0nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6NTA4Ojg6ICdNaW5pbXVtJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDI0LEZPTExPV18yNF9pbl9ydWxlTWVhc3VyZTk5NSk7IAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0TWVhc3VyZUFjY2VzcygpLmdldE1JTklNVU1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlTGVhZk5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRNZWFzdXJlQWNjZXNzKCkuZ2V0TUlOSU1VTUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMygpLCBudWxsKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nOjUxNDo2OiAoICdNYXhpbXVtJyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6NTE0OjY6ICggJ01heGltdW0nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0Lmc6NTE0Ojg6ICdNYXhpbXVtJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKGlucHV0LDI1LEZPTExPV18yNV9pbl9ydWxlTWVhc3VyZTEwMTApOyAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBncmFtbWFyQWNjZXNzLmdldE1lYXN1cmVBY2Nlc3MoKS5nZXRNQVhJTVVNRW51bUxpdGVyYWxEZWNsYXJhdGlvbl80KCkuZ2V0RW51bUxpdGVyYWwoKS5nZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUxlYWZOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TWVhc3VyZUFjY2VzcygpLmdldE1BWElNVU1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKSwgbnVsbCk7IAorICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIHJlc2V0TG9va2FoZWFkKCk7IAorICAgICAgICAgICAgICAgIAlsYXN0Q29uc3VtZWROb2RlID0gY3VycmVudE5vZGU7CisgICAgICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCBydWxlTWVhc3VyZQorCisKKyAKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19ydWxlTW9kZWxfaW5fZW50cnlSdWxlTW9kZWw3MyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVNb2RlbDgzID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfUlVMRV9TVFJJTkdfaW5fcnVsZU1vZGVsMTMwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwM0UwMjAyMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfUlVMRV9QTEFJTl9TVFJJTkdfaW5fcnVsZU1vZGVsMTYxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwM0UwMjAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfcnVsZVRlc3RzX2luX3J1bGVNb2RlbDIwNCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDNFMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX3J1bGVDb25zdHJhaW50X2luX3J1bGVNb2RlbDI0MyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDNFMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX3J1bGVUZXN0c19pbl9lbnRyeVJ1bGVUZXN0czI4MSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVUZXN0czI5MSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzEzX2luX3J1bGVUZXN0czMyNSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMTBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX1JVTEVfU1RSSU5HX2luX3J1bGVUZXN0czM0NyA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX3J1bGVDb25zdHJhaW50X2luX2VudHJ5UnVsZUNvbnN0cmFpbnQzODggPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19FT0ZfaW5fZW50cnlSdWxlQ29uc3RyYWludDM5OCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX3J1bGVNZWFzdXJlX2luX3J1bGVDb25zdHJhaW50NDU3ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwNDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTRfaW5fcnVsZUNvbnN0cmFpbnQ0NzAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDEwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19SVUxFX1NUUklOR19pbl9ydWxlQ29uc3RyYWludDQ5MiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDgwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE1X2luX3J1bGVDb25zdHJhaW50NTA0ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAxMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfUlVMRV9TVFJJTkdfaW5fcnVsZUNvbnN0cmFpbnQ1MjYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDE4MDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xNV9pbl9ydWxlQ29uc3RyYWludDUzOSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMTBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XX1JVTEVfU1RSSU5HX2luX3J1bGVDb25zdHJhaW50NTYxID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAxMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMTZfaW5fcnVsZUNvbnN0cmFpbnQ1NzUgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDIwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18xN19pbl9ydWxlQ29uc3RyYWludDU4NSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwNDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE4X2luX3J1bGVDb25zdHJhaW50NTk0ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDBDMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfcnVsZUludFZhbHVlX2luX3J1bGVDb25zdHJhaW50NjIwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDA4MDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfcnVsZVJlYWxWYWx1ZV9pbl9ydWxlQ29uc3RyYWludDYzNCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwODAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzE5X2luX3J1bGVDb25zdHJhaW50NjUyID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDBDMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfcnVsZUludFZhbHVlX2luX3J1bGVDb25zdHJhaW50Njc4ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDEwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfcnVsZVJlYWxWYWx1ZV9pbl9ydWxlQ29uc3RyYWludDY5MiA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAxMDAwMDBMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzIwX2luX3J1bGVDb25zdHJhaW50NzEwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfcnVsZUludFZhbHVlX2luX2VudHJ5UnVsZUludFZhbHVlNzQ0ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMEx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUludFZhbHVlNzU0ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfUlVMRV9JTlRfaW5fcnVsZUludFZhbHVlODAwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfcnVsZVJlYWxWYWx1ZV9pbl9lbnRyeVJ1bGVSZWFsVmFsdWU4NDAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAwTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV19FT0ZfaW5fZW50cnlSdWxlUmVhbFZhbHVlODUwID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfUlVMRV9SRUFMX2luX3J1bGVSZWFsVmFsdWU4OTYgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yMV9pbl9ydWxlTWVhc3VyZTk1MCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzIyX2luX3J1bGVNZWFzdXJlOTY1ID0gbmV3IEJpdFNldChuZXcgbG9uZ1tdezB4MDAwMDAwMDAwMDAwMDAwMkx9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBGT0xMT1dfMjNfaW5fcnVsZU1lYXN1cmU5ODAgPSBuZXcgQml0U2V0KG5ldyBsb25nW117MHgwMDAwMDAwMDAwMDAwMDAyTH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IEZPTExPV18yNF9pbl9ydWxlTWVhc3VyZTk5NSA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgRk9MTE9XXzI1X2luX3J1bGVNZWFzdXJlMTAxMCA9IG5ldyBCaXRTZXQobmV3IGxvbmdbXXsweDAwMDAwMDAwMDAwMDAwMDJMfSk7CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0X18uZyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3RfXy5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1OWVlNmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0X18uZwpAQCAtMCwwICsxLDUxIEBACitsZXhlciBncmFtbWFyIEludGVybmFsQVRlc3Q7CitAaGVhZGVyIHsKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLnBhcnNlci5hbnRsci5pbnRlcm5hbDsKKworLy8gSGFjazogVXNlIG91ciBvd24gTGV4ZXIgc3VwZXJjbGFzcyBieSBtZWFucyBvZiBpbXBvcnQuIAorLy8gQ3VycmVudGx5IHRoZXJlIGlzIG5vIG90aGVyIHdheSB0byBzcGVjaWZ5IHRoZSBzdXBlcmNsYXNzIGZvciB0aGUgbGV4ZXIuCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLkxleGVyOworfQorCitUMTMgOiAnVEVTVFMnIDsKK1QxNCA6ICcoJyA7CitUMTUgOiAnOicgOworVDE2IDogJyknIDsKK1QxNyA6ICc9JyA7CitUMTggOiAnWycgOworVDE5IDogJywnIDsKK1QyMCA6ICddJyA7CitUMjEgOiAnQ291bnQnIDsKK1QyMiA6ICdBdmVyYWdlJyA7CitUMjMgOiAnU3VtJyA7CitUMjQgOiAnTWluaW11bScgOworVDI1IDogJ01heGltdW0nIDsKKworLy8gJEFOVExSIHNyYyAiLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0LmciIDUyMworUlVMRV9SRUFMIDogJy0nPyBSVUxFX0lOVCAoJy4nIFJVTEVfSU5UKT87CisKKy8vICRBTlRMUiBzcmMgIi4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nIiA1MjUKK1JVTEVfUExBSU5fU1RSSU5HIDogJ1x1MDBBQicgKCdcXCcgKCdiJ3wndCd8J24nfCdmJ3wncid8JyInfCdcJyd8J1xcJyl8figoJ1xcJ3wnXHUwMEFCJ3wnXHUwMEJCJykpKSogJ1x1MDBCQic7CisKKy8vICRBTlRMUiBzcmMgIi4uL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBVGVzdC5nIiA1MjcKK1JVTEVfSUQgOiAnXic/ICgnYScuLid6J3wnQScuLidaJ3wnXycpICgnYScuLid6J3wnQScuLidaJ3wnXyd8JzAnLi4nOScpKjsKKworLy8gJEFOVExSIHNyYyAiLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0LmciIDUyOQorUlVMRV9JTlQgOiAoJzAnLi4nOScpKzsKKworLy8gJEFOVExSIHNyYyAiLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0LmciIDUzMQorUlVMRV9TVFJJTkcgOiAoJyInICgnXFwnICgnYid8J3QnfCduJ3wnZid8J3InfCciJ3wnXCcnfCdcXCcpfH4oKCdcXCd8JyInKSkpKiAnIid8J1wnJyAoJ1xcJyAoJ2InfCd0J3wnbid8J2YnfCdyJ3wnIid8J1wnJ3wnXFwnKXx+KCgnXFwnfCdcJycpKSkqICdcJycpOworCisvLyAkQU5UTFIgc3JjICIuLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQVRlc3QuZyIgNTMzCitSVUxFX01MX0NPTU1FTlQgOiAnLyonICggb3B0aW9ucyB7Z3JlZWR5PWZhbHNlO30gOiAuICkqJyovJzsKKworLy8gJEFOVExSIHNyYyAiLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0LmciIDUzNQorUlVMRV9TTF9DT01NRU5UIDogJy8vJyB+KCgnXG4nfCdccicpKSogKCdccic/ICdcbicpPzsKKworLy8gJEFOVExSIHNyYyAiLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0LmciIDUzNworUlVMRV9XUyA6ICgnICd8J1x0J3wnXHInfCdcbicpKzsKKworLy8gJEFOVExSIHNyYyAiLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEFUZXN0LmciIDUzOQorUlVMRV9BTllfT1RIRVIgOiAuOworCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3Rpbmcvc2VydmljZXMvQVRlc3RHcmFtbWFyQWNjZXNzLmphdmEgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3NlcnZpY2VzL0FUZXN0R3JhbW1hckFjY2Vzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMGM5YzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3NlcnZpY2VzL0FUZXN0R3JhbW1hckFjY2Vzcy5qYXZhCkBAIC0wLDAgKzEsNDUyIEBACisvKgorKiBnZW5lcmF0ZWQgYnkgWHRleHQKKyovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLnNlcnZpY2VzOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zZXJ2aWNlLkdyYW1tYXJQcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi5zZXJ2aWNlcy5UZXJtaW5hbHNHcmFtbWFyQWNjZXNzOworCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgQVRlc3RHcmFtbWFyQWNjZXNzIGltcGxlbWVudHMgSUdyYW1tYXJBY2Nlc3MgeworCQorCQorCXB1YmxpYyBjbGFzcyBNb2RlbEVsZW1lbnRzIGltcGxlbWVudHMgSVBhcnNlclJ1bGVBY2Nlc3MgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiTW9kZWwiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjTmFtZUFzc2lnbm1lbnRfMCA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY05hbWVTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzBfMCA9IChSdWxlQ2FsbCljTmFtZUFzc2lnbm1lbnRfMC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRGVzY3JpcHRpb25Bc3NpZ25tZW50XzEgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNEZXNjcmlwdGlvblBMQUlOX1NUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMV8wID0gKFJ1bGVDYWxsKWNEZXNjcmlwdGlvbkFzc2lnbm1lbnRfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjVGVzdHNBc3NpZ25tZW50XzIgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNUZXN0c1Rlc3RzUGFyc2VyUnVsZUNhbGxfMl8wID0gKFJ1bGVDYWxsKWNUZXN0c0Fzc2lnbm1lbnRfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjQ29udHJhaW50c0Fzc2lnbm1lbnRfMyA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMyk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0NvbnRyYWludHNDb25zdHJhaW50UGFyc2VyUnVsZUNhbGxfM18wID0gKFJ1bGVDYWxsKWNDb250cmFpbnRzQXNzaWdubWVudF8zLmVDb250ZW50cygpLmdldCgwKTsKKwkJCisJCS8vTW9kZWw6CisJCS8vICBuYW1lPVNUUklORz8gZGVzY3JpcHRpb249UExBSU5fU1RSSU5HPyB0ZXN0cz1UZXN0cz8gY29udHJhaW50cys9Q29uc3RyYWludCo7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9uYW1lPVNUUklORz8gZGVzY3JpcHRpb249UExBSU5fU1RSSU5HPyB0ZXN0cz1UZXN0cz8gY29udHJhaW50cys9Q29uc3RyYWludCoKKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy9uYW1lPVNUUklORz8KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TmFtZUFzc2lnbm1lbnRfMCgpIHsgcmV0dXJuIGNOYW1lQXNzaWdubWVudF8wOyB9CisKKwkJLy9TVFJJTkcKKwkJcHVibGljIFJ1bGVDYWxsIGdldE5hbWVTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzBfMCgpIHsgcmV0dXJuIGNOYW1lU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8wXzA7IH0KKworCQkvL2Rlc2NyaXB0aW9uPVBMQUlOX1NUUklORz8KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0RGVzY3JpcHRpb25Bc3NpZ25tZW50XzEoKSB7IHJldHVybiBjRGVzY3JpcHRpb25Bc3NpZ25tZW50XzE7IH0KKworCQkvL1BMQUlOX1NUUklORworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0RGVzY3JpcHRpb25QTEFJTl9TVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzFfMCgpIHsgcmV0dXJuIGNEZXNjcmlwdGlvblBMQUlOX1NUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMV8wOyB9CisKKwkJLy90ZXN0cz1UZXN0cz8KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0VGVzdHNBc3NpZ25tZW50XzIoKSB7IHJldHVybiBjVGVzdHNBc3NpZ25tZW50XzI7IH0KKworCQkvL1Rlc3RzCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRUZXN0c1Rlc3RzUGFyc2VyUnVsZUNhbGxfMl8wKCkgeyByZXR1cm4gY1Rlc3RzVGVzdHNQYXJzZXJSdWxlQ2FsbF8yXzA7IH0KKworCQkvL2NvbnRyYWludHMrPUNvbnN0cmFpbnQqCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldENvbnRyYWludHNBc3NpZ25tZW50XzMoKSB7IHJldHVybiBjQ29udHJhaW50c0Fzc2lnbm1lbnRfMzsgfQorCisJCS8vQ29uc3RyYWludAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Q29udHJhaW50c0NvbnN0cmFpbnRQYXJzZXJSdWxlQ2FsbF8zXzAoKSB7IHJldHVybiBjQ29udHJhaW50c0NvbnN0cmFpbnRQYXJzZXJSdWxlQ2FsbF8zXzA7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgVGVzdHNFbGVtZW50cyBpbXBsZW1lbnRzIElQYXJzZXJSdWxlQWNjZXNzIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlRlc3RzIik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1RFU1RTS2V5d29yZF8wID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNJbXBvcnRVUklBc3NpZ25tZW50XzEgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNJbXBvcnRVUklTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzFfMCA9IChSdWxlQ2FsbCljSW1wb3J0VVJJQXNzaWdubWVudF8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJCisJCS8vVGVzdHM6CisJCS8vICAiVEVTVFMiIGltcG9ydFVSST1TVFJJTkc7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy8iVEVTVFMiIGltcG9ydFVSST1TVFJJTkcKKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy8iVEVTVFMiCisJCXB1YmxpYyBLZXl3b3JkIGdldFRFU1RTS2V5d29yZF8wKCkgeyByZXR1cm4gY1RFU1RTS2V5d29yZF8wOyB9CisKKwkJLy9pbXBvcnRVUkk9U1RSSU5HCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEltcG9ydFVSSUFzc2lnbm1lbnRfMSgpIHsgcmV0dXJuIGNJbXBvcnRVUklBc3NpZ25tZW50XzE7IH0KKworCQkvL1NUUklORworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0SW1wb3J0VVJJU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8xXzAoKSB7IHJldHVybiBjSW1wb3J0VVJJU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8xXzA7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgQ29uc3RyYWludEVsZW1lbnRzIGltcGxlbWVudHMgSVBhcnNlclJ1bGVBY2Nlc3MgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiQ29uc3RyYWludCIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNNZWFzdXJlQXNzaWdubWVudF8wID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjTWVhc3VyZU1lYXN1cmVFbnVtUnVsZUNhbGxfMF8wID0gKFJ1bGVDYWxsKWNNZWFzdXJlQXNzaWdubWVudF8wLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzEgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0FnZW50QXNzaWdubWVudF8yID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBDcm9zc1JlZmVyZW5jZSBjQWdlbnRTQWdlbnRDcm9zc1JlZmVyZW5jZV8yXzAgPSAoQ3Jvc3NSZWZlcmVuY2UpY0FnZW50QXNzaWdubWVudF8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjQWdlbnRTQWdlbnRTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzJfMF8xID0gKFJ1bGVDYWxsKWNBZ2VudFNBZ2VudENyb3NzUmVmZXJlbmNlXzJfMC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjQ29sb25LZXl3b3JkXzMgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0F0dHJpYnV0ZUFzc2lnbm1lbnRfNCA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoNCk7CisJCXByaXZhdGUgZmluYWwgQ3Jvc3NSZWZlcmVuY2UgY0F0dHJpYnV0ZVNBdHRyaWJ1dGVDcm9zc1JlZmVyZW5jZV80XzAgPSAoQ3Jvc3NSZWZlcmVuY2UpY0F0dHJpYnV0ZUFzc2lnbm1lbnRfNC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0F0dHJpYnV0ZVNBdHRyaWJ1dGVTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzRfMF8xID0gKFJ1bGVDYWxsKWNBdHRyaWJ1dGVTQXR0cmlidXRlQ3Jvc3NSZWZlcmVuY2VfNF8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfNSA9IChHcm91cCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDUpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0NvbG9uS2V5d29yZF81XzAgPSAoS2V5d29yZCljR3JvdXBfNS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjUXVhbGlmaWVyQXNzaWdubWVudF81XzEgPSAoQXNzaWdubWVudCljR3JvdXBfNS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQ3Jvc3NSZWZlcmVuY2UgY1F1YWxpZmllclNTdGF0ZVZhbHVlQ3Jvc3NSZWZlcmVuY2VfNV8xXzAgPSAoQ3Jvc3NSZWZlcmVuY2UpY1F1YWxpZmllckFzc2lnbm1lbnRfNV8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUXVhbGlmaWVyU1N0YXRlVmFsdWVTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzVfMV8wXzEgPSAoUnVsZUNhbGwpY1F1YWxpZmllclNTdGF0ZVZhbHVlQ3Jvc3NSZWZlcmVuY2VfNV8xXzAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1JpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzYgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDYpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF83ID0gKEdyb3VwKWNHcm91cC5lQ29udGVudHMoKS5nZXQoNyk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjRXF1YWxzU2lnbktleXdvcmRfN18wID0gKEtleXdvcmQpY0dyb3VwXzcuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xlZnRTcXVhcmVCcmFja2V0S2V5d29yZF83XzEgPSAoS2V5d29yZCljR3JvdXBfNy5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjTWluVmFsdWVBc3NpZ25tZW50XzdfMiA9IChBc3NpZ25tZW50KWNHcm91cF83LmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBBbHRlcm5hdGl2ZXMgY01pblZhbHVlQWx0ZXJuYXRpdmVzXzdfMl8wID0gKEFsdGVybmF0aXZlcyljTWluVmFsdWVBc3NpZ25tZW50XzdfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY01pblZhbHVlSW50VmFsdWVQYXJzZXJSdWxlQ2FsbF83XzJfMF8wID0gKFJ1bGVDYWxsKWNNaW5WYWx1ZUFsdGVybmF0aXZlc183XzJfMC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY01pblZhbHVlUmVhbFZhbHVlUGFyc2VyUnVsZUNhbGxfN18yXzBfMSA9IChSdWxlQ2FsbCljTWluVmFsdWVBbHRlcm5hdGl2ZXNfN18yXzAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0NvbW1hS2V5d29yZF83XzMgPSAoS2V5d29yZCljR3JvdXBfNy5lQ29udGVudHMoKS5nZXQoMyk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjTWF4VmFsdWVBc3NpZ25tZW50XzdfNCA9IChBc3NpZ25tZW50KWNHcm91cF83LmVDb250ZW50cygpLmdldCg0KTsKKwkJcHJpdmF0ZSBmaW5hbCBBbHRlcm5hdGl2ZXMgY01heFZhbHVlQWx0ZXJuYXRpdmVzXzdfNF8wID0gKEFsdGVybmF0aXZlcyljTWF4VmFsdWVBc3NpZ25tZW50XzdfNC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY01heFZhbHVlSW50VmFsdWVQYXJzZXJSdWxlQ2FsbF83XzRfMF8wID0gKFJ1bGVDYWxsKWNNYXhWYWx1ZUFsdGVybmF0aXZlc183XzRfMC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY01heFZhbHVlUmVhbFZhbHVlUGFyc2VyUnVsZUNhbGxfN180XzBfMSA9IChSdWxlQ2FsbCljTWF4VmFsdWVBbHRlcm5hdGl2ZXNfN180XzAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1JpZ2h0U3F1YXJlQnJhY2tldEtleXdvcmRfN181ID0gKEtleXdvcmQpY0dyb3VwXzcuZUNvbnRlbnRzKCkuZ2V0KDUpOworCQkKKwkJLy9Db25zdHJhaW50OgorCQkvLyAgbWVhc3VyZT1NZWFzdXJlICIoIiBhZ2VudD1bU0FnZW50fFNUUklOR10gIjoiIGF0dHJpYnV0ZT1bU0F0dHJpYnV0ZXxTVFJJTkddICgiOiIKKwkJLy8gIHF1YWxpZmllcj1bU1N0YXRlVmFsdWV8U1RSSU5HXSk/ICIpIiAoIj0iICJbIiBtaW5WYWx1ZT0oIEludFZhbHVlIHwgUmVhbFZhbHVlICkgIiwiCisJCS8vICBtYXhWYWx1ZT0oIEludFZhbHVlIHwgUmVhbFZhbHVlICkgIl0iKTsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL21lYXN1cmU9TWVhc3VyZSAiKCIgYWdlbnQ9W1NBZ2VudHxTVFJJTkddICI6IiBhdHRyaWJ1dGU9W1NBdHRyaWJ1dGV8U1RSSU5HXSAoIjoiCisJCS8vcXVhbGlmaWVyPVtTU3RhdGVWYWx1ZXxTVFJJTkddKT8gIikiICgiPSIgIlsiIG1pblZhbHVlPSggSW50VmFsdWUgfCBSZWFsVmFsdWUgKSAiLCIKKwkJLy9tYXhWYWx1ZT0oIEludFZhbHVlIHwgUmVhbFZhbHVlICkgIl0iKQorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvL21lYXN1cmU9TWVhc3VyZQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRNZWFzdXJlQXNzaWdubWVudF8wKCkgeyByZXR1cm4gY01lYXN1cmVBc3NpZ25tZW50XzA7IH0KKworCQkvL01lYXN1cmUKKwkJcHVibGljIFJ1bGVDYWxsIGdldE1lYXN1cmVNZWFzdXJlRW51bVJ1bGVDYWxsXzBfMCgpIHsgcmV0dXJuIGNNZWFzdXJlTWVhc3VyZUVudW1SdWxlQ2FsbF8wXzA7IH0KKworCQkvLyIoIgorCQlwdWJsaWMgS2V5d29yZCBnZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzEoKSB7IHJldHVybiBjTGVmdFBhcmVudGhlc2lzS2V5d29yZF8xOyB9CisKKwkJLy9hZ2VudD1bU0FnZW50fFNUUklOR10KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0QWdlbnRBc3NpZ25tZW50XzIoKSB7IHJldHVybiBjQWdlbnRBc3NpZ25tZW50XzI7IH0KKworCQkvL1tTQWdlbnR8U1RSSU5HXQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0QWdlbnRTQWdlbnRDcm9zc1JlZmVyZW5jZV8yXzAoKSB7IHJldHVybiBjQWdlbnRTQWdlbnRDcm9zc1JlZmVyZW5jZV8yXzA7IH0KKworCQkvL1NUUklORworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0QWdlbnRTQWdlbnRTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzJfMF8xKCkgeyByZXR1cm4gY0FnZW50U0FnZW50U1RSSU5HVGVybWluYWxSdWxlQ2FsbF8yXzBfMTsgfQorCisJCS8vIjoiCisJCXB1YmxpYyBLZXl3b3JkIGdldENvbG9uS2V5d29yZF8zKCkgeyByZXR1cm4gY0NvbG9uS2V5d29yZF8zOyB9CisKKwkJLy9hdHRyaWJ1dGU9W1NBdHRyaWJ1dGV8U1RSSU5HXQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRBdHRyaWJ1dGVBc3NpZ25tZW50XzQoKSB7IHJldHVybiBjQXR0cmlidXRlQXNzaWdubWVudF80OyB9CisKKwkJLy9bU0F0dHJpYnV0ZXxTVFJJTkddCisJCXB1YmxpYyBDcm9zc1JlZmVyZW5jZSBnZXRBdHRyaWJ1dGVTQXR0cmlidXRlQ3Jvc3NSZWZlcmVuY2VfNF8wKCkgeyByZXR1cm4gY0F0dHJpYnV0ZVNBdHRyaWJ1dGVDcm9zc1JlZmVyZW5jZV80XzA7IH0KKworCQkvL1NUUklORworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0QXR0cmlidXRlU0F0dHJpYnV0ZVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfNF8wXzEoKSB7IHJldHVybiBjQXR0cmlidXRlU0F0dHJpYnV0ZVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfNF8wXzE7IH0KKworCQkvLygiOiIgcXVhbGlmaWVyPVtTU3RhdGVWYWx1ZXxTVFJJTkddKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzUoKSB7IHJldHVybiBjR3JvdXBfNTsgfQorCisJCS8vIjoiCisJCXB1YmxpYyBLZXl3b3JkIGdldENvbG9uS2V5d29yZF81XzAoKSB7IHJldHVybiBjQ29sb25LZXl3b3JkXzVfMDsgfQorCisJCS8vcXVhbGlmaWVyPVtTU3RhdGVWYWx1ZXxTVFJJTkddCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFF1YWxpZmllckFzc2lnbm1lbnRfNV8xKCkgeyByZXR1cm4gY1F1YWxpZmllckFzc2lnbm1lbnRfNV8xOyB9CisKKwkJLy9bU1N0YXRlVmFsdWV8U1RSSU5HXQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0UXVhbGlmaWVyU1N0YXRlVmFsdWVDcm9zc1JlZmVyZW5jZV81XzFfMCgpIHsgcmV0dXJuIGNRdWFsaWZpZXJTU3RhdGVWYWx1ZUNyb3NzUmVmZXJlbmNlXzVfMV8wOyB9CisKKwkJLy9TVFJJTkcKKwkJcHVibGljIFJ1bGVDYWxsIGdldFF1YWxpZmllclNTdGF0ZVZhbHVlU1RSSU5HVGVybWluYWxSdWxlQ2FsbF81XzFfMF8xKCkgeyByZXR1cm4gY1F1YWxpZmllclNTdGF0ZVZhbHVlU1RSSU5HVGVybWluYWxSdWxlQ2FsbF81XzFfMF8xOyB9CisKKwkJLy8iKSIKKwkJcHVibGljIEtleXdvcmQgZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfNigpIHsgcmV0dXJuIGNSaWdodFBhcmVudGhlc2lzS2V5d29yZF82OyB9CisKKwkJLy8iPSIgIlsiIG1pblZhbHVlPSggSW50VmFsdWUgfCBSZWFsVmFsdWUgKSAiLCIgbWF4VmFsdWU9KCBJbnRWYWx1ZSB8IFJlYWxWYWx1ZSApICJdIgorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfNygpIHsgcmV0dXJuIGNHcm91cF83OyB9CisKKwkJLy8iPSIKKwkJcHVibGljIEtleXdvcmQgZ2V0RXF1YWxzU2lnbktleXdvcmRfN18wKCkgeyByZXR1cm4gY0VxdWFsc1NpZ25LZXl3b3JkXzdfMDsgfQorCisJCS8vIlsiCisJCXB1YmxpYyBLZXl3b3JkIGdldExlZnRTcXVhcmVCcmFja2V0S2V5d29yZF83XzEoKSB7IHJldHVybiBjTGVmdFNxdWFyZUJyYWNrZXRLZXl3b3JkXzdfMTsgfQorCisJCS8vbWluVmFsdWU9KCBJbnRWYWx1ZSB8IFJlYWxWYWx1ZSApCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldE1pblZhbHVlQXNzaWdubWVudF83XzIoKSB7IHJldHVybiBjTWluVmFsdWVBc3NpZ25tZW50XzdfMjsgfQorCisJCS8vSW50VmFsdWV8UmVhbFZhbHVlCisJCXB1YmxpYyBBbHRlcm5hdGl2ZXMgZ2V0TWluVmFsdWVBbHRlcm5hdGl2ZXNfN18yXzAoKSB7IHJldHVybiBjTWluVmFsdWVBbHRlcm5hdGl2ZXNfN18yXzA7IH0KKworCQkvL0ludFZhbHVlCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRNaW5WYWx1ZUludFZhbHVlUGFyc2VyUnVsZUNhbGxfN18yXzBfMCgpIHsgcmV0dXJuIGNNaW5WYWx1ZUludFZhbHVlUGFyc2VyUnVsZUNhbGxfN18yXzBfMDsgfQorCisJCS8vUmVhbFZhbHVlCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRNaW5WYWx1ZVJlYWxWYWx1ZVBhcnNlclJ1bGVDYWxsXzdfMl8wXzEoKSB7IHJldHVybiBjTWluVmFsdWVSZWFsVmFsdWVQYXJzZXJSdWxlQ2FsbF83XzJfMF8xOyB9CisKKwkJLy8iLCIKKwkJcHVibGljIEtleXdvcmQgZ2V0Q29tbWFLZXl3b3JkXzdfMygpIHsgcmV0dXJuIGNDb21tYUtleXdvcmRfN18zOyB9CisKKwkJLy9tYXhWYWx1ZT0oIEludFZhbHVlIHwgUmVhbFZhbHVlICkKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TWF4VmFsdWVBc3NpZ25tZW50XzdfNCgpIHsgcmV0dXJuIGNNYXhWYWx1ZUFzc2lnbm1lbnRfN180OyB9CisKKwkJLy9JbnRWYWx1ZXxSZWFsVmFsdWUKKwkJcHVibGljIEFsdGVybmF0aXZlcyBnZXRNYXhWYWx1ZUFsdGVybmF0aXZlc183XzRfMCgpIHsgcmV0dXJuIGNNYXhWYWx1ZUFsdGVybmF0aXZlc183XzRfMDsgfQorCisJCS8vSW50VmFsdWUKKwkJcHVibGljIFJ1bGVDYWxsIGdldE1heFZhbHVlSW50VmFsdWVQYXJzZXJSdWxlQ2FsbF83XzRfMF8wKCkgeyByZXR1cm4gY01heFZhbHVlSW50VmFsdWVQYXJzZXJSdWxlQ2FsbF83XzRfMF8wOyB9CisKKwkJLy9SZWFsVmFsdWUKKwkJcHVibGljIFJ1bGVDYWxsIGdldE1heFZhbHVlUmVhbFZhbHVlUGFyc2VyUnVsZUNhbGxfN180XzBfMSgpIHsgcmV0dXJuIGNNYXhWYWx1ZVJlYWxWYWx1ZVBhcnNlclJ1bGVDYWxsXzdfNF8wXzE7IH0KKworCQkvLyJdIgorCQlwdWJsaWMgS2V5d29yZCBnZXRSaWdodFNxdWFyZUJyYWNrZXRLZXl3b3JkXzdfNSgpIHsgcmV0dXJuIGNSaWdodFNxdWFyZUJyYWNrZXRLZXl3b3JkXzdfNTsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBJbnRWYWx1ZUVsZW1lbnRzIGltcGxlbWVudHMgSVBhcnNlclJ1bGVBY2Nlc3MgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiSW50VmFsdWUiKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNWYWx1ZUFzc2lnbm1lbnQgPSAoQXNzaWdubWVudClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjVmFsdWVJTlRUZXJtaW5hbFJ1bGVDYWxsXzAgPSAoUnVsZUNhbGwpY1ZhbHVlQXNzaWdubWVudC5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL0ludFZhbHVlOgorCQkvLyAgdmFsdWU9SU5UOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vdmFsdWU9SU5UCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFZhbHVlQXNzaWdubWVudCgpIHsgcmV0dXJuIGNWYWx1ZUFzc2lnbm1lbnQ7IH0KKworCQkvL0lOVAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0VmFsdWVJTlRUZXJtaW5hbFJ1bGVDYWxsXzAoKSB7IHJldHVybiBjVmFsdWVJTlRUZXJtaW5hbFJ1bGVDYWxsXzA7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgUmVhbFZhbHVlRWxlbWVudHMgaW1wbGVtZW50cyBJUGFyc2VyUnVsZUFjY2VzcyB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJSZWFsVmFsdWUiKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNWYWx1ZUFzc2lnbm1lbnQgPSAoQXNzaWdubWVudClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjVmFsdWVSRUFMVGVybWluYWxSdWxlQ2FsbF8wID0gKFJ1bGVDYWxsKWNWYWx1ZUFzc2lnbm1lbnQuZUNvbnRlbnRzKCkuZ2V0KDApOworCQkKKwkJLy9SZWFsVmFsdWU6CisJCS8vICB2YWx1ZT1SRUFMOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vdmFsdWU9UkVBTAorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRWYWx1ZUFzc2lnbm1lbnQoKSB7IHJldHVybiBjVmFsdWVBc3NpZ25tZW50OyB9CisKKwkJLy9SRUFMCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRWYWx1ZVJFQUxUZXJtaW5hbFJ1bGVDYWxsXzAoKSB7IHJldHVybiBjVmFsdWVSRUFMVGVybWluYWxSdWxlQ2FsbF8wOyB9CisJfQorCQorCQorCXB1YmxpYyBjbGFzcyBNZWFzdXJlRWxlbWVudHMgaW1wbGVtZW50cyBJRW51bVJ1bGVBY2Nlc3MgeworCQlwcml2YXRlIGZpbmFsIEVudW1SdWxlIHJ1bGUgPSAoRW51bVJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJNZWFzdXJlIik7CisJCXByaXZhdGUgZmluYWwgQWx0ZXJuYXRpdmVzIGNBbHRlcm5hdGl2ZXMgPSAoQWx0ZXJuYXRpdmVzKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY0NPVU5URW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjQ09VTlRDb3VudEtleXdvcmRfMF8wID0gKEtleXdvcmQpY0NPVU5URW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNBVkVSQUdFRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjQVZFUkFHRUF2ZXJhZ2VLZXl3b3JkXzFfMCA9IChLZXl3b3JkKWNBVkVSQUdFRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNTVU1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNTVU1TdW1LZXl3b3JkXzJfMCA9IChLZXl3b3JkKWNTVU1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY01JTklNVU1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNNSU5JTVVNTWluaW11bUtleXdvcmRfM18wID0gKEtleXdvcmQpY01JTklNVU1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY01BWElNVU1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCg0KTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNNQVhJTVVNTWF4aW11bUtleXdvcmRfNF8wID0gKEtleXdvcmQpY01BWElNVU1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQuZUNvbnRlbnRzKCkuZ2V0KDApOworCQkKKwkJLy9lbnVtIE1lYXN1cmU6CisJCS8vICBDT1VOVD0iQ291bnQiIHwgQVZFUkFHRT0iQXZlcmFnZSIgfCBTVU09IlN1bSIgfCBNSU5JTVVNPSJNaW5pbXVtIiB8IE1BWElNVU09Ik1heGltdW0iOworCQlwdWJsaWMgRW51bVJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL0NPVU5UPSJDb3VudCIgfCBBVkVSQUdFPSJBdmVyYWdlIiB8IFNVTT0iU3VtIiB8IE1JTklNVU09Ik1pbmltdW0iIHwgTUFYSU1VTT0iTWF4aW11bSIKKwkJcHVibGljIEFsdGVybmF0aXZlcyBnZXRBbHRlcm5hdGl2ZXMoKSB7IHJldHVybiBjQWx0ZXJuYXRpdmVzOyB9CisKKwkJLy9DT1VOVD0iQ291bnQiCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldENPVU5URW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkgeyByZXR1cm4gY0NPVU5URW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wOyB9CisKKwkJLy8iQ291bnQiCisJCXB1YmxpYyBLZXl3b3JkIGdldENPVU5UQ291bnRLZXl3b3JkXzBfMCgpIHsgcmV0dXJuIGNDT1VOVENvdW50S2V5d29yZF8wXzA7IH0KKworCQkvL0FWRVJBR0U9IkF2ZXJhZ2UiCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldEFWRVJBR0VFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSB7IHJldHVybiBjQVZFUkFHRUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMTsgfQorCisJCS8vIkF2ZXJhZ2UiCisJCXB1YmxpYyBLZXl3b3JkIGdldEFWRVJBR0VBdmVyYWdlS2V5d29yZF8xXzAoKSB7IHJldHVybiBjQVZFUkFHRUF2ZXJhZ2VLZXl3b3JkXzFfMDsgfQorCisJCS8vU1VNPSJTdW0iCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldFNVTUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpIHsgcmV0dXJuIGNTVU1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzI7IH0KKworCQkvLyJTdW0iCisJCXB1YmxpYyBLZXl3b3JkIGdldFNVTVN1bUtleXdvcmRfMl8wKCkgeyByZXR1cm4gY1NVTVN1bUtleXdvcmRfMl8wOyB9CisKKwkJLy9NSU5JTVVNPSJNaW5pbXVtIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRNSU5JTVVNRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zKCkgeyByZXR1cm4gY01JTklNVU1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzM7IH0KKworCQkvLyJNaW5pbXVtIgorCQlwdWJsaWMgS2V5d29yZCBnZXRNSU5JTVVNTWluaW11bUtleXdvcmRfM18wKCkgeyByZXR1cm4gY01JTklNVU1NaW5pbXVtS2V5d29yZF8zXzA7IH0KKworCQkvL01BWElNVU09Ik1heGltdW0iCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldE1BWElNVU1FbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKSB7IHJldHVybiBjTUFYSU1VTUVudW1MaXRlcmFsRGVjbGFyYXRpb25fNDsgfQorCisJCS8vIk1heGltdW0iCisJCXB1YmxpYyBLZXl3b3JkIGdldE1BWElNVU1NYXhpbXVtS2V5d29yZF80XzAoKSB7IHJldHVybiBjTUFYSU1VTU1heGltdW1LZXl3b3JkXzRfMDsgfQorCX0KKwkKKwlwcml2YXRlIE1vZGVsRWxlbWVudHMgcE1vZGVsOworCXByaXZhdGUgVGVzdHNFbGVtZW50cyBwVGVzdHM7CisJcHJpdmF0ZSBDb25zdHJhaW50RWxlbWVudHMgcENvbnN0cmFpbnQ7CisJcHJpdmF0ZSBNZWFzdXJlRWxlbWVudHMgdW5rbm93blJ1bGVNZWFzdXJlOworCXByaXZhdGUgSW50VmFsdWVFbGVtZW50cyBwSW50VmFsdWU7CisJcHJpdmF0ZSBSZWFsVmFsdWVFbGVtZW50cyBwUmVhbFZhbHVlOworCXByaXZhdGUgVGVybWluYWxSdWxlIHRSRUFMOworCXByaXZhdGUgVGVybWluYWxSdWxlIHRQTEFJTl9TVFJJTkc7CisJCisJcHJpdmF0ZSBmaW5hbCBHcmFtbWFyUHJvdmlkZXIgZ3JhbW1hclByb3ZpZGVyOworCisJcHJpdmF0ZSBUZXJtaW5hbHNHcmFtbWFyQWNjZXNzIGdhVGVybWluYWxzOworCisJQEluamVjdAorCXB1YmxpYyBBVGVzdEdyYW1tYXJBY2Nlc3MoR3JhbW1hclByb3ZpZGVyIGdyYW1tYXJQcm92aWRlciwKKwkJVGVybWluYWxzR3JhbW1hckFjY2VzcyBnYVRlcm1pbmFscykgeworCQl0aGlzLmdyYW1tYXJQcm92aWRlciA9IGdyYW1tYXJQcm92aWRlcjsKKwkJdGhpcy5nYVRlcm1pbmFscyA9IGdhVGVybWluYWxzOworCX0KKwkKKwlwdWJsaWMgR3JhbW1hciBnZXRHcmFtbWFyKCkgewkKKwkJcmV0dXJuIGdyYW1tYXJQcm92aWRlci5nZXRHcmFtbWFyKHRoaXMpOworCX0KKwkKKworCXB1YmxpYyBUZXJtaW5hbHNHcmFtbWFyQWNjZXNzIGdldFRlcm1pbmFsc0dyYW1tYXJBY2Nlc3MoKSB7CisJCXJldHVybiBnYVRlcm1pbmFsczsKKwl9CisKKwkKKwkvL01vZGVsOgorCS8vICBuYW1lPVNUUklORz8gZGVzY3JpcHRpb249UExBSU5fU1RSSU5HPyB0ZXN0cz1UZXN0cz8gY29udHJhaW50cys9Q29uc3RyYWludCo7CisJcHVibGljIE1vZGVsRWxlbWVudHMgZ2V0TW9kZWxBY2Nlc3MoKSB7CisJCXJldHVybiAocE1vZGVsICE9IG51bGwpID8gcE1vZGVsIDogKHBNb2RlbCA9IG5ldyBNb2RlbEVsZW1lbnRzKCkpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRNb2RlbFJ1bGUoKSB7CisJCXJldHVybiBnZXRNb2RlbEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1Rlc3RzOgorCS8vICAiVEVTVFMiIGltcG9ydFVSST1TVFJJTkc7CisJcHVibGljIFRlc3RzRWxlbWVudHMgZ2V0VGVzdHNBY2Nlc3MoKSB7CisJCXJldHVybiAocFRlc3RzICE9IG51bGwpID8gcFRlc3RzIDogKHBUZXN0cyA9IG5ldyBUZXN0c0VsZW1lbnRzKCkpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRUZXN0c1J1bGUoKSB7CisJCXJldHVybiBnZXRUZXN0c0FjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0NvbnN0cmFpbnQ6CisJLy8gIG1lYXN1cmU9TWVhc3VyZSAiKCIgYWdlbnQ9W1NBZ2VudHxTVFJJTkddICI6IiBhdHRyaWJ1dGU9W1NBdHRyaWJ1dGV8U1RSSU5HXSAoIjoiCisJLy8gIHF1YWxpZmllcj1bU1N0YXRlVmFsdWV8U1RSSU5HXSk/ICIpIiAoIj0iICJbIiBtaW5WYWx1ZT0oIEludFZhbHVlIHwgUmVhbFZhbHVlICkgIiwiCisJLy8gIG1heFZhbHVlPSggSW50VmFsdWUgfCBSZWFsVmFsdWUgKSAiXSIpOworCXB1YmxpYyBDb25zdHJhaW50RWxlbWVudHMgZ2V0Q29uc3RyYWludEFjY2VzcygpIHsKKwkJcmV0dXJuIChwQ29uc3RyYWludCAhPSBudWxsKSA/IHBDb25zdHJhaW50IDogKHBDb25zdHJhaW50ID0gbmV3IENvbnN0cmFpbnRFbGVtZW50cygpKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0Q29uc3RyYWludFJ1bGUoKSB7CisJCXJldHVybiBnZXRDb25zdHJhaW50QWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vZW51bSBNZWFzdXJlOgorCS8vICBDT1VOVD0iQ291bnQiIHwgQVZFUkFHRT0iQXZlcmFnZSIgfCBTVU09IlN1bSIgfCBNSU5JTVVNPSJNaW5pbXVtIiB8IE1BWElNVU09Ik1heGltdW0iOworCXB1YmxpYyBNZWFzdXJlRWxlbWVudHMgZ2V0TWVhc3VyZUFjY2VzcygpIHsKKwkJcmV0dXJuICh1bmtub3duUnVsZU1lYXN1cmUgIT0gbnVsbCkgPyB1bmtub3duUnVsZU1lYXN1cmUgOiAodW5rbm93blJ1bGVNZWFzdXJlID0gbmV3IE1lYXN1cmVFbGVtZW50cygpKTsKKwl9CisJCisJcHVibGljIEVudW1SdWxlIGdldE1lYXN1cmVSdWxlKCkgeworCQlyZXR1cm4gZ2V0TWVhc3VyZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0ludFZhbHVlOgorCS8vICB2YWx1ZT1JTlQ7CisJcHVibGljIEludFZhbHVlRWxlbWVudHMgZ2V0SW50VmFsdWVBY2Nlc3MoKSB7CisJCXJldHVybiAocEludFZhbHVlICE9IG51bGwpID8gcEludFZhbHVlIDogKHBJbnRWYWx1ZSA9IG5ldyBJbnRWYWx1ZUVsZW1lbnRzKCkpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRJbnRWYWx1ZVJ1bGUoKSB7CisJCXJldHVybiBnZXRJbnRWYWx1ZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1JlYWxWYWx1ZToKKwkvLyAgdmFsdWU9UkVBTDsKKwlwdWJsaWMgUmVhbFZhbHVlRWxlbWVudHMgZ2V0UmVhbFZhbHVlQWNjZXNzKCkgeworCQlyZXR1cm4gKHBSZWFsVmFsdWUgIT0gbnVsbCkgPyBwUmVhbFZhbHVlIDogKHBSZWFsVmFsdWUgPSBuZXcgUmVhbFZhbHVlRWxlbWVudHMoKSk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJlYWxWYWx1ZVJ1bGUoKSB7CisJCXJldHVybiBnZXRSZWFsVmFsdWVBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy90ZXJtaW5hbCBSRUFMOgorCS8vICAiLSI/IElOVCAoIi4iIElOVCk/OworCXB1YmxpYyBUZXJtaW5hbFJ1bGUgZ2V0UkVBTFJ1bGUoKSB7CisJCXJldHVybiAodFJFQUwgIT0gbnVsbCkgPyB0UkVBTCA6ICh0UkVBTCA9IChUZXJtaW5hbFJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJSRUFMIikpOworCX0gCisKKwkvL3Rlcm1pbmFsIFBMQUlOX1NUUklORzoKKwkvLyAgIlx1MDBBQiIgKCJcXCIgKCJiIiB8ICJ0IiB8ICJuIiB8ICJmIiB8ICJyIiB8ICJcIiIgfCAiXCciIHwgIlxcIikgfCAhKCJcXCIgfCAiXHUwMEFCIiB8ICJcdTAwQkIiKSkqCisJLy8gICJcdTAwQkIiOworCXB1YmxpYyBUZXJtaW5hbFJ1bGUgZ2V0UExBSU5fU1RSSU5HUnVsZSgpIHsKKwkJcmV0dXJuICh0UExBSU5fU1RSSU5HICE9IG51bGwpID8gdFBMQUlOX1NUUklORyA6ICh0UExBSU5fU1RSSU5HID0gKFRlcm1pbmFsUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlBMQUlOX1NUUklORyIpKTsKKwl9IAorCisJLy90ZXJtaW5hbCBJRDoKKwkvLyAgIl4iPyAoImEiLi4ieiIgfCAiQSIuLiJaIiB8ICJfIikgKCJhIi4uInoiIHwgIkEiLi4iWiIgfCAiXyIgfCAiMCIuLiI5IikqOworCXB1YmxpYyBUZXJtaW5hbFJ1bGUgZ2V0SURSdWxlKCkgeworCQlyZXR1cm4gZ2FUZXJtaW5hbHMuZ2V0SURSdWxlKCk7CisJfSAKKworCS8vdGVybWluYWwgSU5UIHJldHVybnMgZWNvcmU6OkVJbnQ6CisJLy8gICIwIi4uIjkiKzsKKwlwdWJsaWMgVGVybWluYWxSdWxlIGdldElOVFJ1bGUoKSB7CisJCXJldHVybiBnYVRlcm1pbmFscy5nZXRJTlRSdWxlKCk7CisJfSAKKworCS8vdGVybWluYWwgU1RSSU5HOgorCS8vICAiXCIiICgiXFwiICgiYiIgfCAidCIgfCAibiIgfCAiZiIgfCAiciIgfCAiXCIiIHwgIlwnIiB8ICJcXCIpIHwgISgiXFwiIHwgIlwiIikpKiAiXCIiIHwgIlwnIiAoIlxcIiAoImIiIHwKKwkvLyAgInQiIHwgIm4iIHwgImYiIHwgInIiIHwgIlwiIiB8ICJcJyIgfCAiXFwiKSB8ICEoIlxcIiB8ICJcJyIpKSogIlwnIjsKKwlwdWJsaWMgVGVybWluYWxSdWxlIGdldFNUUklOR1J1bGUoKSB7CisJCXJldHVybiBnYVRlcm1pbmFscy5nZXRTVFJJTkdSdWxlKCk7CisJfSAKKworCS8vdGVybWluYWwgTUxfQ09NTUVOVDoKKwkvLyAgIi8gKiItPiIqIC8iOworCXB1YmxpYyBUZXJtaW5hbFJ1bGUgZ2V0TUxfQ09NTUVOVFJ1bGUoKSB7CisJCXJldHVybiBnYVRlcm1pbmFscy5nZXRNTF9DT01NRU5UUnVsZSgpOworCX0gCisKKwkvL3Rlcm1pbmFsIFNMX0NPTU1FTlQ6CisJLy8gICIvLyIgISgiXG4iIHwgIlxyIikqICgiXHIiPyAiXG4iKT87CisJcHVibGljIFRlcm1pbmFsUnVsZSBnZXRTTF9DT01NRU5UUnVsZSgpIHsKKwkJcmV0dXJuIGdhVGVybWluYWxzLmdldFNMX0NPTU1FTlRSdWxlKCk7CisJfSAKKworCS8vdGVybWluYWwgV1M6CisJLy8gICgiICIgfCAiXHQiIHwgIlxyIiB8ICJcbiIpKzsKKwlwdWJsaWMgVGVybWluYWxSdWxlIGdldFdTUnVsZSgpIHsKKwkJcmV0dXJuIGdhVGVybWluYWxzLmdldFdTUnVsZSgpOworCX0gCisKKwkvL3Rlcm1pbmFsIEFOWV9PVEhFUjoKKwkvLyAgLjsKKwlwdWJsaWMgVGVybWluYWxSdWxlIGdldEFOWV9PVEhFUlJ1bGUoKSB7CisJCXJldHVybiBnYVRlcm1pbmFscy5nZXRBTllfT1RIRVJSdWxlKCk7CisJfSAKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvdmFsaWRhdGlvbi9BYnN0cmFjdEFUZXN0SmF2YVZhbGlkYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy92YWxpZGF0aW9uL0Fic3RyYWN0QVRlc3RKYXZhVmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAzODFmNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvdmFsaWRhdGlvbi9BYnN0cmFjdEFUZXN0SmF2YVZhbGlkYXRvci5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLnZhbGlkYXRpb247CisgCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC52YWxpZGF0aW9uLkFic3RyYWN0RGVjbGFyYXRpdmVWYWxpZGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudmFsaWRhdGlvbi5Db21wb3NlZENoZWNrczsKKworQENvbXBvc2VkQ2hlY2tzKHZhbGlkYXRvcnM9IHtvcmcuZWNsaXBzZS54dGV4dC52YWxpZGF0aW9uLkltcG9ydFVyaVZhbGlkYXRvci5jbGFzc30pCitwdWJsaWMgY2xhc3MgQWJzdHJhY3RBVGVzdEphdmFWYWxpZGF0b3IgZXh0ZW5kcyBBYnN0cmFjdERlY2xhcmF0aXZlVmFsaWRhdG9yIHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBMaXN0PD8gZXh0ZW5kcyBFUGFja2FnZT4gZ2V0RVBhY2thZ2VzKCkgeworICAgICAgICBMaXN0PEVQYWNrYWdlPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEVQYWNrYWdlPigpOworICAgICAgICByZXN1bHQuYWRkKG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5BVGVzdFBhY2thZ2UuZUlOU1RBTkNFKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjL21vZGVsL2FyZXMuZWNvcmUgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy9tb2RlbC9hcmVzLmVjb3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZGU5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy9tb2RlbC9hcmVzLmVjb3JlCkBAIC0wLDAgKzEsMzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKKyAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9ImFyZXMiCisgICAgbnNVUkk9Imh0dHA6Ly9lY2xpcHNlLm9yZy9hbXAvYXJlcyIgbnNQcmVmaXg9ImFyZXMiPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJ1biI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1vZGVsIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uLy4uL29yZy5lY2xpcHNlLmFtcC5hbWYuYWNvcmUvc3JjL21vZGVsL21ldGFhYm0uZWNvcmUjLy9TQ29udGludW91c1NwYWNlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRlc3RNb2RlbCIgbG93ZXJCb3VuZD0iMSIKKyAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9BVGVzdC5lY29yZSMvL01vZGVsIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBhcmFtZXRlck1vZGVsIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uLy4uL29yZy5lY2xpcHNlLmFtcC5hbWYucGFyYW1ldGVycy9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvcGFyYW1ldGVycy9BUGFyLmVjb3JlIy8vTW9kZWwiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzdWx0IiBlVHlwZT0iIy8vUmVzdWx0IgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGFyYW1ldGVycyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vLi4vb3JnLmVjbGlwc2UuYW1wLmFtZi5wYXJhbWV0ZXJzL3NyYy1nZW4vb3JnL2VjbGlwc2UvYW1wL2FtZi9wYXJhbWV0ZXJzL0FQYXIuZWNvcmUjLy9QYXJhbWV0ZXIiCisgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnN0cmFpbnRzIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9zcmMtZ2VuL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9BVGVzdC5lY29yZSMvL0NvbnN0cmFpbnQiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnRlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURhdGUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEYXRlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iUmVzdWx0Ij4KKyAgICA8ZUxpdGVyYWxzIG5hbWU9IkluY29tcGxldGUiIHZhbHVlPSIxIiBsaXRlcmFsPSJJTkNPTVBMRVRFIi8+CisgICAgPGVMaXRlcmFscyBuYW1lPSJTdWNjZXNzIiB2YWx1ZT0iMiIgbGl0ZXJhbD0iU1VDQ0VTUyIvPgorICAgIDxlTGl0ZXJhbHMgbmFtZT0iRmFpbHVyZSIgdmFsdWU9IjMiIGxpdGVyYWw9IkZBSUxVUkUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRmFpbHVyZSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnN0cmFpbnQiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvQVRlc3QuZWNvcmUjLy9Db25zdHJhaW50Ii8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imlzc3VlIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vSXNzdWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsVmFsdWUiIGxvd2VyQm91bmQ9IjEiCisgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJJc3N1ZSI+CisgICAgPGVMaXRlcmFscyBuYW1lPSJCZWxvd1JhbmdlIiB2YWx1ZT0iMTAiIGxpdGVyYWw9IkJFTE9XX1JBTkdFIi8+CisgICAgPGVMaXRlcmFscyBuYW1lPSJBYm92ZVJhbmdlIiB2YWx1ZT0iMTUiIGxpdGVyYWw9IkFCT1ZFX1JBTkdFIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjL21vZGVsL2FyZXMuZ2VubW9kZWwgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy9tb2RlbC9hcmVzLmdlbm1vZGVsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNWUwNTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy9tb2RlbC9hcmVzLmdlbm1vZGVsCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKKyAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgorICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMiCisgICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nIiBtb2RlbE5hbWU9IkFyZXMiIGltcG9ydGVySUQ9Im9yZy5lY2xpcHNlLmVtZi5pbXBvcnRlci5lY29yZSIKKyAgICBjb21wbGlhbmNlTGV2ZWw9IjYuMCIgY29weXJpZ2h0RmllbGRzPSJmYWxzZSIgdXNlZEdlblBhY2thZ2VzPSIuLi8uLi8uLi9vcmcuZWNsaXBzZS5hbXAuYW1mLnBhcmFtZXRlcnMvc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3BhcmFtZXRlcnMvQVBhci5nZW5tb2RlbCMvL2FQYXIgLi4vLi4vc3JjLWdlbi9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvQVRlc3QuZ2VubW9kZWwjLy9hVGVzdCAuLi8uLi8uLi9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlL3NyYy9tb2RlbC9tZXRhYWJtLmdlbm1vZGVsIy8vbWV0YWFibSI+CisgIDxmb3JlaWduTW9kZWw+YXJlcy5lY29yZTwvZm9yZWlnbk1vZGVsPgorICA8Z2VuUGFja2FnZXMgcHJlZml4PSJBcmVzIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgorICAgICAgZ2VuZXJhdGVFeGFtcGxlQ2xhc3M9ImZhbHNlIiBlY29yZVBhY2thZ2U9ImFyZXMuZWNvcmUjLyI+CisgICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09ImFyZXMuZWNvcmUjLy9SZXN1bHQiPgorICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJhcmVzLmVjb3JlIy8vUmVzdWx0L0luY29tcGxldGUiLz4KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iYXJlcy5lY29yZSMvL1Jlc3VsdC9TdWNjZXNzIi8+CisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImFyZXMuZWNvcmUjLy9SZXN1bHQvRmFpbHVyZSIvPgorICAgIDwvZ2VuRW51bXM+CisgICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09ImFyZXMuZWNvcmUjLy9Jc3N1ZSI+CisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImFyZXMuZWNvcmUjLy9Jc3N1ZS9CZWxvd1JhbmdlIi8+CisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImFyZXMuZWNvcmUjLy9Jc3N1ZS9BYm92ZVJhbmdlIi8+CisgICAgPC9nZW5FbnVtcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJhcmVzLmVjb3JlIy8vUnVuIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBhcmVzLmVjb3JlIy8vUnVuL21vZGVsIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgYXJlcy5lY29yZSMvL1J1bi90ZXN0TW9kZWwiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBhcmVzLmVjb3JlIy8vUnVuL3BhcmFtZXRlck1vZGVsIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgYXJlcy5lY29yZSMvL1J1bi9yZXN1bHQiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgYXJlcy5lY29yZSMvL1J1bi9wYXJhbWV0ZXJzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgYXJlcy5lY29yZSMvL1J1bi9jb25zdHJhaW50cyIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGFyZXMuZWNvcmUjLy9SdW4vc3RhcnRlZCIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGFyZXMuZWNvcmUjLy9SdW4vZmluaXNoZWQiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iYXJlcy5lY29yZSMvL0ZhaWx1cmUiPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGFyZXMuZWNvcmUjLy9GYWlsdXJlL2NvbnN0cmFpbnQiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBhcmVzLmVjb3JlIy8vRmFpbHVyZS9pc3N1ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGFyZXMuZWNvcmUjLy9GYWlsdXJlL2FjdHVhbFZhbHVlIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICA8L2dlblBhY2thZ2VzPgorPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9BVGVzdC54dGV4dCBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9BVGVzdC54dGV4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mjg1MzEzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMvb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL0FUZXN0Lnh0ZXh0CkBAIC0wLDAgKzEsMzIgQEAKK2dyYW1tYXIgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLkFUZXN0IHdpdGggb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLlRlcm1pbmFscworCitnZW5lcmF0ZSBhVGVzdCAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9hbXAvYW1mL3Rlc3RpbmcvQVRlc3QiCitpbXBvcnQgImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIGFzIGVjb3JlCitpbXBvcnQgJ3BsYXRmb3JtOi9yZXNvdXJjZS9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlL3NyYy9tb2RlbC9tZXRhYWJtLmVjb3JlJworCitNb2RlbCA6CisJKG5hbWU9U1RSSU5HKT8KKwkoZGVzY3JpcHRpb249UExBSU5fU1RSSU5HKT8KKwkodGVzdHM9VGVzdHMpPworCShjb250cmFpbnRzKz1Db25zdHJhaW50KSo7CisKK1Rlc3RzIDoKKwknVEVTVFMnIGltcG9ydFVSST1TVFJJTkc7CisKK0NvbnN0cmFpbnQgOgorCW1lYXN1cmU9TWVhc3VyZSAiKCIgYWdlbnQ9W1NBZ2VudHxTVFJJTkddIjoiYXR0cmlidXRlPVtTQXR0cmlidXRlfFNUUklOR10gKCI6IiBxdWFsaWZpZXI9W1NTdGF0ZVZhbHVlfFNUUklOR10pPyAiKSIgKCI9IiAiWyIgbWluVmFsdWU9KEludFZhbHVlfFJlYWxWYWx1ZSkgIiwiIG1heFZhbHVlPShJbnRWYWx1ZXxSZWFsVmFsdWUpICJdIik7CisKK2VudW0gTWVhc3VyZSA6CisJQ09VTlQgPSAiQ291bnQiIHwgQVZFUkFHRSA9ICJBdmVyYWdlIiB8IFNVTSA9ICJTdW0iIHwgTUlOSU1VTSA9ICJNaW5pbXVtIiB8IE1BWElNVU0gPSAiTWF4aW11bSI7CisKK0ludFZhbHVlIDoKKwl2YWx1ZT1JTlQ7CisKK1JlYWxWYWx1ZSA6CisJdmFsdWU9UkVBTDsKKwordGVybWluYWwgUkVBTCA6CisJIi0iPyBJTlQgKCIuIiBJTlQpPzsKKwkKK3Rlcm1pbmFsIFBMQUlOX1NUUklORwk6IAorICAnqycoICdcXCcgKCdiJ3wndCd8J24nfCdmJ3wncid8JyInfCInInwnXFwnKSB8ICEoJ1xcJ3wnqyd8J7snKSApKie7JzsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9BVGVzdEludGVycHJldGVyLmphdmEgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvQVRlc3RJbnRlcnByZXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMTNjMjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvQVRlc3RJbnRlcnByZXRlci5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqDQorICogQ29weXJpZ2h0IChjKSAyMDA5IE1ldGFzY2FwZSwgTExDLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKiANCisgKiBDb250cmlidXRvcnM6DQorICogICBNZXRhc2NhcGUgLSBJbml0aWFsIEFQSSBhbmQgSW1wbGVtZW50YXRpb24NCisgKg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICovDQorDQorcGFja2FnZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmc7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYucGFyYW1ldGVycy5BUGFySW50ZXJwcmV0ZXI7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5Db25zdHJhaW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuSW50VmFsdWU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5Nb2RlbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LlJlYWxWYWx1ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuc3RhdHVzaGFuZGxlcnMuU3RhdHVzTWFuYWdlcjsNCisNCisvKioNCisgKiANCisgKiBAYXV0aG9yIG1wYXJrZXINCisgKiANCisgKi8NCitwdWJsaWMgY2xhc3MgQVRlc3RJbnRlcnByZXRlciB7DQorDQorICAgIE1vZGVsIGF0ZXN0TW9kZWw7DQorDQorICAgIEFQYXJJbnRlcnByZXRlciBhcGFySW50ZXJwcmV0ZXI7DQorDQorICAgIHByaXZhdGUgSVJlc291cmNlIG1vZGVsUmVzb3VyY2U7DQorDQorICAgIHB1YmxpYyBBVGVzdEludGVycHJldGVyKElSZXNvdXJjZSBtb2RlbFJlc291cmNlKSB7DQorICAgICAgICB0aGlzLm1vZGVsUmVzb3VyY2UgPSBtb2RlbFJlc291cmNlOw0KKyAgICAgICAgUmVzb3VyY2VTZXQgcmVzb3VyY2VzID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOw0KKyAgICAgICAgSVBhdGggZmlsZVBhdGggPSAoKElGaWxlKSBtb2RlbFJlc291cmNlKS5nZXRGdWxsUGF0aCgpOw0KKyAgICAgICAgVVJJIGF0ZXN0TG9jID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZmlsZVBhdGgudG9TdHJpbmcoKSwgdHJ1ZSk7DQorICAgICAgICBSZXNvdXJjZSBhdGVzdCA9IHJlc291cmNlcy5nZXRSZXNvdXJjZShhdGVzdExvYywgdHJ1ZSk7DQorICAgICAgICBhdGVzdE1vZGVsID0gKE1vZGVsKSBhdGVzdC5nZXRDb250ZW50cygpLmdldCgwKTsNCisNCisgICAgICAgIFVSSSBhcGFyTG9jID0gYXRlc3RMb2MudHJpbUZpbGVFeHRlbnNpb24oKS5hcHBlbmRGaWxlRXh0ZW5zaW9uKCJhcGFyIik7DQorICAgICAgICBSZXNvdXJjZSBhcGFyQW5hbG9nID0gcmVzb3VyY2VzLmdldFJlc291cmNlKGFwYXJMb2MsIHRydWUpOw0KKyAgICAgICAgaWYgKGFwYXJBbmFsb2cgPT0gbnVsbCkgew0KKyAgICAgICAgICAgIFN0YXR1c01hbmFnZXIuZ2V0TWFuYWdlcigpLmhhbmRsZSgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0YXR1cyhTdGF0dXMuV0FSTklORywgIm9yZy5lY2xpcHNlLmFtcC5hbWYucGFyYW1ldGVycyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBsb2NhdGUgYXBhciByZXNvdXJjZS4iKSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOw0KKyAgICAgICAgICAgIGFwYXJJbnRlcnByZXRlciA9IG5ldyBBUGFySW50ZXJwcmV0ZXIod29ya3NwYWNlLmdldFJvb3QoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpbGUobmV3IFBhdGgoYXBhckxvYy50b1BsYXRmb3JtU3RyaW5nKHRydWUpKSkpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyBNb2RlbCBnZXRBdGVzdE1vZGVsKCkgew0KKyAgICAgICAgcmV0dXJuIGF0ZXN0TW9kZWw7DQorICAgIH0NCisNCisgICAgcHVibGljIEFQYXJJbnRlcnByZXRlciBnZXRBcGFySW50ZXJwcmV0ZXIoKSB7DQorICAgICAgICByZXR1cm4gYXBhckludGVycHJldGVyOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7DQorICAgICAgICByZXR1cm4gbW9kZWxSZXNvdXJjZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnN0cmFpbnRTdHJpbmcoKSB7DQorICAgICAgICBTdHJpbmcgY29uc3RyYWludFN0cmluZyA9ICIiOw0KKyAgICAgICAgZm9yIChDb25zdHJhaW50IGNvbnN0cmFpbnQgOiBhdGVzdE1vZGVsLmdldENvbnRyYWludHMoKSkgew0KKyAgICAgICAgICAgIGNvbnN0cmFpbnRTdHJpbmcgKz0gY29uc3RyYWludC5nZXRBdHRyaWJ1dGUoKS5nZXRJRCgpICsgIlx0Ig0KKyAgICAgICAgICAgICsgdmFsdWVPZihjb25zdHJhaW50LmdldE1pblZhbHVlKCkpICsgIlx0Ig0KKyAgICAgICAgICAgICsgdmFsdWVPZihjb25zdHJhaW50LmdldE1pblZhbHVlKCkpICsgIlxyIjsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBjb25zdHJhaW50U3RyaW5nOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBkb3VibGUgdmFsdWVPZihFT2JqZWN0IGNvbnN0cmFpbnRWYWx1ZSkgew0KKyAgICAgICAgaWYgKGNvbnN0cmFpbnRWYWx1ZSBpbnN0YW5jZW9mIEludFZhbHVlKSB7DQorICAgICAgICAgICAgcmV0dXJuICgoSW50VmFsdWUpIGNvbnN0cmFpbnRWYWx1ZSkuZ2V0VmFsdWUoKTsNCisgICAgICAgIH0gZWxzZSBpZiAoY29uc3RyYWludFZhbHVlIGluc3RhbmNlb2YgUmVhbFZhbHVlKSB7DQorICAgICAgICAgICAgcmV0dXJuIERvdWJsZS52YWx1ZU9mKCgoUmVhbFZhbHVlKSBjb25zdHJhaW50VmFsdWUpLmdldFZhbHVlKCkpOw0KKyAgICAgICAgfSBlbHNlIGlmIChjb25zdHJhaW50VmFsdWUgPT0gbnVsbCkgew0KKyAgICAgICAgICAgIHJldHVybiBEb3VibGUuTmFOOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgdmFsdWUgZm9yIGNvbnN0cmFpbnQuIik7DQorICAgIH0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMvb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL0FUZXN0UmVzb3VyY2VGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvQVRlc3RSZXNvdXJjZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmZlYjY4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMvb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL0FUZXN0UmVzb3VyY2VGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBNZXRhc2NhcGUsIExMQy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICogDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgTWV0YXNjYXBlIC0gSW5pdGlhbCBBUEkgYW5kIEltcGxlbWVudGF0aW9uDQorICoNCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqLw0KKw0KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLlh0ZXh0UmVzb3VyY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLlh0ZXh0UmVzb3VyY2VGYWN0b3J5Ow0KKw0KK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7DQoraW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOw0KKw0KKy8qKg0KKyAqIA0KKyAqIEBhdXRob3IgbXBhcmtlcg0KKyAqDQorICovDQorcHVibGljIGNsYXNzIEFUZXN0UmVzb3VyY2VGYWN0b3J5IGV4dGVuZHMgWHRleHRSZXNvdXJjZUZhY3Rvcnkgew0KKw0KKyAgICAvKioNCisgICAgICogQHBhcmFtIHJlc291cmNlUHJvdmlkZXINCisgICAgICovDQorICAgIEBJbmplY3QNCisgICAgcHVibGljIEFUZXN0UmVzb3VyY2VGYWN0b3J5KFByb3ZpZGVyPFh0ZXh0UmVzb3VyY2U+IHJlc291cmNlUHJvdmlkZXIpIHsNCisgICAgICAgIHN1cGVyKHJlc291cmNlUHJvdmlkZXIpOw0KKyAgICAgICAgWHRleHRSZXNvdXJjZSB4dGV4dFJlc291cmNlID0gcmVzb3VyY2VQcm92aWRlci5nZXQoKTsNCisgICAgICAgIFVSSSB0ZXN0RmlsZVVSSSA9IHh0ZXh0UmVzb3VyY2UuZ2V0VVJJKCk7DQorICAgICAgICB0ZXN0RmlsZVVSSS50cmltRmlsZUV4dGVuc2lvbigpLmFwcGVuZEZpbGVFeHRlbnNpb24oImFwYXIiKTsNCisgICAgICAgIHJlc291cmNlUHJvdmlkZXIuZ2V0KCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZSh0ZXN0RmlsZVVSSSwgdHJ1ZSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEBwYXJhbSB1cmkNCisgICAgICogQHJldHVybg0KKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLlh0ZXh0UmVzb3VyY2VGYWN0b3J5I2NyZWF0ZVJlc291cmNlKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpDQorICAgICAqLw0KKyAgICBwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgew0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmNyZWF0ZVJlc291cmNlKHVyaSk7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMvb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL0FUZXN0UnVudGltZU1vZHVsZS5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMvb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL0FUZXN0UnVudGltZU1vZHVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYzRmNWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvQVRlc3RSdW50aW1lTW9kdWxlLmphdmEKQEAgLTAsMCArMSwxNyBAQAorLyoKKyAqIGdlbmVyYXRlZCBieSBYdGV4dAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYucGFyYW1ldGVycy5zY29waW5nLkFQYXJJbXBvcnRSZXNvbHZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zY29waW5nLmltcGwuSW1wb3J0VXJpUmVzb2x2ZXI7CisKKy8qKgorICogVXNlIHRoaXMgY2xhc3MgdG8gcmVnaXN0ZXIgY29tcG9uZW50cyB0byBiZSB1c2VkIHdpdGhpbiB0aGUgSURFLgorICovCitwdWJsaWMgY2xhc3MgQVRlc3RSdW50aW1lTW9kdWxlIGV4dGVuZHMgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLkFic3RyYWN0QVRlc3RSdW50aW1lTW9kdWxlIHsKKworICAgIHB1YmxpYyBDbGFzczw/IGV4dGVuZHMgSW1wb3J0VXJpUmVzb2x2ZXI+IGJpbmRJbXBvcnRVcmlSZXNvbHZlcigpIHsKKyAgICAgICAgcmV0dXJuIEFQYXJJbXBvcnRSZXNvbHZlci5jbGFzczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvR2VuZXJhdGVBVGVzdC5td2UgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvR2VuZXJhdGVBVGVzdC5td2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY1NTVjZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9HZW5lcmF0ZUFUZXN0Lm13ZQpAQCAtMCwwICsxLDc3IEBACis8d29ya2Zsb3c+CisJPHByb3BlcnR5IGZpbGU9Im9yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9HZW5lcmF0ZUFUZXN0LnByb3BlcnRpZXMiLz4KKwkKKwk8cHJvcGVydHkgbmFtZT0icnVudGltZVByb2plY3QiIHZhbHVlPSIuLi8ke3Byb2plY3ROYW1lfSIvPgorCQorCTxiZWFuIGNsYXNzPSJvcmcuZWNsaXBzZS5lbWYubXdlLnV0aWxzLlN0YW5kYWxvbmVTZXR1cCIgcGxhdGZvcm1Vcmk9IiR7cnVudGltZVByb2plY3R9Ly4uIj4KKyAgCQk8cmVnaXN0ZXJHZW5lcmF0ZWRFUGFja2FnZSB2YWx1ZT0ib3JnLm1ldGFhYm0uTWV0YUFCTVBhY2thZ2UiLz4KKyAgCQk8cmVnaXN0ZXJHZW5lcmF0ZWRFUGFja2FnZSB2YWx1ZT0ib3JnLm1ldGFhYm0uYWN0Lk1ldGFBQk1BY3RQYWNrYWdlIi8+CisgIAkJPHJlZ2lzdGVyR2VuZXJhdGVkRVBhY2thZ2UgdmFsdWU9Im9yZy5tZXRhYWJtLmZ1bmN0aW9uLk1ldGFBQk1GdW5jdGlvblBhY2thZ2UiLz4KKwk8L2JlYW4+CisJCisJPGJlYW4gY2xhc3M9Im9yZy5lY2xpcHNlLmVtZi5td2UudXRpbHMuU3RhbmRhbG9uZVNldHVwIiBwbGF0Zm9ybVVyaT0iJHtydW50aW1lUHJvamVjdH0vLi4iLz4KKwkKKwk8Y29tcG9uZW50IGNsYXNzPSJvcmcuZWNsaXBzZS5lbWYubXdlLnV0aWxzLkRpcmVjdG9yeUNsZWFuZXIiIGRpcmVjdG9yeT0iJHtydW50aW1lUHJvamVjdH0vc3JjLWdlbiIvPgorCTxjb21wb25lbnQgY2xhc3M9Im9yZy5lY2xpcHNlLmVtZi5td2UudXRpbHMuRGlyZWN0b3J5Q2xlYW5lciIgZGlyZWN0b3J5PSIke3J1bnRpbWVQcm9qZWN0fS51aS9zcmMtZ2VuIi8+CisJCisJPGNvbXBvbmVudCBjbGFzcz0ib3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLkdlbmVyYXRvciI+CisJCTxwYXRoUnRQcm9qZWN0IHZhbHVlPSIke3J1bnRpbWVQcm9qZWN0fSIvPgorCQk8cGF0aFVpUHJvamVjdCB2YWx1ZT0iJHtydW50aW1lUHJvamVjdH0udWkiLz4KKwkJPHByb2plY3ROYW1lUnQgdmFsdWU9IiR7cHJvamVjdE5hbWV9Ii8+CisJCTxwcm9qZWN0TmFtZVVpIHZhbHVlPSIke3Byb2plY3ROYW1lfS51aSIvPgorCQkKKwkJPGxhbmd1YWdlIHVyaT0iJHtncmFtbWFyVVJJfSIgZmlsZUV4dGVuc2lvbnM9IiR7ZmlsZS5leHRlbnNpb25zfSI+CisJCQk8IS0tIEphdmEgQVBJIHRvIGFjY2VzcyBncmFtbWFyIGVsZW1lbnRzIChyZXF1aXJlZCBieSBzZXZlcmFsIG90aGVyIGZyYWdtZW50cykgLS0+CisJCQk8ZnJhZ21lbnQgY2xhc3M9Im9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5ncmFtbWFyQWNjZXNzLkdyYW1tYXJBY2Nlc3NGcmFnbWVudCIvPgorCQkJCisJCQk8IS0tIGdlbmVyYXRlcyBKYXZhIEFQSSBmb3IgdGhlIGdlbmVyYXRlZCBFUGFja2FnZXMgLS0+CisJCQk8ZnJhZ21lbnQgY2xhc3M9Im9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5lY29yZS5FY29yZUdlbmVyYXRvckZyYWdtZW50IiBnZW5Nb2RlbHM9InBsYXRmb3JtOi9yZXNvdXJjZS9vcmcuZWNsaXBzZS5hbXAuYW1mLmFjb3JlL3NyYy9tb2RlbC9tZXRhYWJtLmdlbm1vZGVsIi8+CisJCQkKKwkJCTwhLS0gdGhlIHNlcmlhbGl6YXRpb24gY29tcG9uZW50IC0tPgorCQkJPGZyYWdtZW50IGNsYXNzPSJvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IucGFyc2VUcmVlQ29uc3RydWN0b3IuUGFyc2VUcmVlQ29uc3RydWN0b3JGcmFnbWVudCIvPgorCQkJCisJCQk8IS0tIGEgY3VzdG9tIFJlc291cmNlRmFjdG9yeSBmb3IgdXNlIHdpdGggRU1GIC0tPgorCQkJPGZyYWdtZW50IGNsYXNzPSJvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IucmVzb3VyY2VGYWN0b3J5LlJlc291cmNlRmFjdG9yeUZyYWdtZW50IiAKKwkJCQlmaWxlRXh0ZW5zaW9ucz0iJHtmaWxlLmV4dGVuc2lvbnN9Ii8+CisJCQkJCisJCQk8IS0tIHRoZSBmb2xsb3dpbmcgZnJhZ21lbnQgdHJpZXMgdG8gdXNlIHRoZSBBbnRsciBHZW5lcmF0b3IgZnJhZ21lbnQgd2hpY2ggY2FuIGJlIGluc3RhbGxlZCB2aWEgdXBkYXRlIG1hbmFnZXIgZnJvbSBodHRwOi8vZG93bmxvYWQuaXRlbWlzLmNvbS91cGRhdGVzLyAtLT4KKwkJCTxmcmFnbWVudCBjbGFzcz0ib3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLkFudGxyRGVsZWdhdGluZ0ZyYWdtZW50IiAvPgorCQkJCisJCQk8IS0tIElmIHlvdSBkb24ndCB3YW50IHRvIHVzZSB0aGUgQW50bHIgZnJhZ21lbnQgZm9yIHNvbWUgcmVhc29uLCByZW1vdmUgdGhlIGFudGxyIGZyYWdtZW50IGFuZCB1bmNvbW1lbnQgdGhlIHBhY2tyYXQgcGFyc2VyIGZyYWdtZW50IGJlbG93LgorCQkJPGZyYWdtZW50IGNsYXNzPSJvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IucGFyc2VyLlBhY2tyYXRQYXJzZXJGcmFnbWVudCIvPgorCQkJIC0tPgorCQorCQkJCisJCQk8IS0tIGphdmEtYmFzZWQgQVBJIGZvciB2YWxpZGF0aW9uIC0tPgorCQkJPGZyYWdtZW50IGNsYXNzPSJvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IudmFsaWRhdGlvbi5KYXZhVmFsaWRhdG9yRnJhZ21lbnQiPgorICAgICAgICAgICAgICAgIDxjb21wb3NlZENoZWNrIHZhbHVlPSJvcmcuZWNsaXBzZS54dGV4dC52YWxpZGF0aW9uLkltcG9ydFVyaVZhbGlkYXRvciIvPgorICAgICAgICAgICAgPC9mcmFnbWVudD4KKwkJCQorICAgICAgICAgICAgCisJCQk8IS0tIHNjb3BpbmcgQVBJIC0tPgorCQkJPGZyYWdtZW50IGNsYXNzPSJvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3Iuc2NvcGluZy5KYXZhU2NvcGluZ0ZyYWdtZW50Ii8+CisJCQkKKwkJCTwhLS0gZm9ybWF0dGVyIEFQSSAtLT4KKwkJCTxmcmFnbWVudCBjbGFzcz0ib3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLmZvcm1hdHRpbmcuRm9ybWF0dGVyRnJhZ21lbnQiLz4KKworCQkJPCEtLSBsYWJlbGluZyBBUEkgLS0+CisJCQk8ZnJhZ21lbnQgY2xhc3M9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci5sYWJlbGluZy5MYWJlbFByb3ZpZGVyRnJhZ21lbnQiLz4KKworCQkJPCEtLSBvdXRsaW5lIEFQSSAtLT4KKwkJCTxmcmFnbWVudCBjbGFzcz0ib3JnLmVjbGlwc2UueHRleHQudWkuZ2VuZXJhdG9yLm91dGxpbmUuVHJhbnNmb3JtZXJGcmFnbWVudCIvPgorCQkJPGZyYWdtZW50IGNsYXNzPSJvcmcuZWNsaXBzZS54dGV4dC51aS5nZW5lcmF0b3Iub3V0bGluZS5PdXRsaW5lTm9kZUFkYXB0ZXJGYWN0b3J5RnJhZ21lbnQiLz4KKworCQkJCisJCQk8IS0tIGphdmEtYmFzZWQgQVBJIGZvciBjb250ZW50IGFzc2lzdGFuY2UgLS0+CisJCQk8ZnJhZ21lbnQgY2xhc3M9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci5jb250ZW50QXNzaXN0LkphdmFCYXNlZENvbnRlbnRBc3Npc3RGcmFnbWVudCIvPgorCQkJPCEtLSB0aGUgZm9sbG93aW5nIGZyYWdtZW50IHRyaWVzIHRvIHVzZSB0aGUgQW50bHIgYmFzZWQgY29udGVudCBhc3Npc3QgZnJhZ21lbnQgd2hpY2ggY2FuIGJlIGRvd25sb2FkZWQgZnJvbSBodHRwOi8vd3d3Lml0ZW1pcy5jb20gCisJCQkgICAgIGFuZCB3aWxsIGJlIGlnbm9yZWQgaWYgaXQncyBub3QgYXZhaWxhYmxlLiAtLT4KKwkJCTxmcmFnbWVudCBjbGFzcz0ib3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLkRlbGVnYXRpbmdHZW5lcmF0b3JGcmFnbWVudCIgCisJCQkJZGVsZWdhdGU9ImRlLml0ZW1pcy54dGV4dC5hbnRsci5YdGV4dEFudGxyVWlHZW5lcmF0b3JGcmFnbWVudCIKKwkJCQltZXNzYWdlPSJZb3UgYXJlIGdlbmVyYXRpbmcgd2l0aG91dCBBTlRMUi4gSXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvIGRvd25sb2FkIGFuZCB1c2UgdGhlIHBsdWdpbiAnZGUuaXRlbWlzLnh0ZXh0LmFudGxyJyBcblx0IHVzaW5nIHRoZSB1cGRhdGUgc2l0ZSBodHRwOi8vZG93bmxvYWQuaXRlbWlzLmNvbS91cGRhdGVzLy4iPgorCQkJPC9mcmFnbWVudD4KKwkJCTwhLS0gPGZyYWdtZW50IGNsYXNzPSJkZS5pdGVtaXMueHRleHQuYW50bHIuWHRleHRBbnRsclVpR2VuZXJhdG9yRnJhZ21lbnQiLz4gLS0+IAorCQkJCisJCTwvbGFuZ3VhZ2U+CisJPC9jb21wb25lbnQ+Cis8L3dvcmtmbG93PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMvb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL0dlbmVyYXRlQVRlc3QucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9HZW5lcmF0ZUFUZXN0LnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RjOWUyNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9HZW5lcmF0ZUFUZXN0LnByb3BlcnRpZXMKQEAgLTAsMCArMSwzIEBACitncmFtbWFyVVJJPWNsYXNzcGF0aDovb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL0FUZXN0Lnh0ZXh0CitmaWxlLmV4dGVuc2lvbnM9YXRlc3QKK3Byb2plY3ROYW1lPW9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMvb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL2FyZXMvQXJlc0ZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hcmVzL0FyZXNGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI3NjNkNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hcmVzL0FyZXNGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZDogQXJlc0ZhY3RvcnkuamF2YSx2IDEuMSAyMDA5LzA3LzMxIDIxOjQ4OjE5IG1wYXJrZXIgRXhwICQNCisgKi8NCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4NCisgKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLkFyZXNQYWNrYWdlDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgQXJlc0ZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7DQorICAgIC8qKg0KKyAgICAgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5Lg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgQXJlc0ZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuaW1wbC5BcmVzRmFjdG9yeUltcGwuaW5pdCgpOw0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SdW48L2VtPicuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJ1bjwvZW0+Jy4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgUnVuIGNyZWF0ZVJ1bigpOw0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5GYWlsdXJlPC9lbT4nLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5GYWlsdXJlPC9lbT4nLg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBGYWlsdXJlIGNyZWF0ZUZhaWx1cmUoKTsNCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgQXJlc1BhY2thZ2UgZ2V0QXJlc1BhY2thZ2UoKTsNCisNCit9IC8vQXJlc0ZhY3RvcnkNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvYXJlcy9BcmVzUGFja2FnZS5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMvb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL2FyZXMvQXJlc1BhY2thZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGFmOGU2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMvb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL2FyZXMvQXJlc1BhY2thZ2UuamF2YQpAQCAtMCwwICsxLDUzNCBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZDogQXJlc1BhY2thZ2UuamF2YSx2IDEuMSAyMDA5LzA3LzMxIDIxOjQ4OjE5IG1wYXJrZXIgRXhwICQNCisgKi8NCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuDQorICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudA0KKyAqIDx1bD4NCisgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+DQorICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4NCisgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4NCisgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPg0KKyAqIDwvdWw+DQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5BcmVzRmFjdG9yeQ0KKyAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIEFyZXNQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2Ugew0KKyAgICAvKioNCisgICAgICogVGhlIHBhY2thZ2UgbmFtZS4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIFN0cmluZyBlTkFNRSA9ICJhcmVzIjsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vZWNsaXBzZS5vcmcvYW1wL2FyZXMiOw0KKw0KKyAgICAvKioNCisgICAgICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBTdHJpbmcgZU5TX1BSRUZJWCA9ICJhcmVzIjsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBBcmVzUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5pbXBsLkFyZXNQYWNrYWdlSW1wbC5pbml0KCk7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLmltcGwuUnVuSW1wbCA8ZW0+UnVuPC9lbT59JyBjbGFzcy4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuaW1wbC5SdW5JbXBsDQorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuaW1wbC5BcmVzUGFja2FnZUltcGwjZ2V0UnVuKCkNCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgaW50IFJVTiA9IDA7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW9kZWw8L2I+PC9lbT4nIHJlZmVyZW5jZS4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICogQG9yZGVyZWQNCisgICAgICovDQorICAgIGludCBSVU5fX01PREVMID0gMDsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXN0IE1vZGVsPC9iPjwvZW0+JyByZWZlcmVuY2UuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqIEBvcmRlcmVkDQorICAgICAqLw0KKyAgICBpbnQgUlVOX19URVNUX01PREVMID0gMTsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJhbWV0ZXIgTW9kZWw8L2I+PC9lbT4nIHJlZmVyZW5jZS4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICogQG9yZGVyZWQNCisgICAgICovDQorICAgIGludCBSVU5fX1BBUkFNRVRFUl9NT0RFTCA9IDI7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzdWx0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqIEBvcmRlcmVkDQorICAgICAqLw0KKyAgICBpbnQgUlVOX19SRVNVTFQgPSAzOw0KKw0KKyAgICAvKioNCisgICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcmFtZXRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKiBAb3JkZXJlZA0KKyAgICAgKi8NCisgICAgaW50IFJVTl9fUEFSQU1FVEVSUyA9IDQ7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uc3RyYWludHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0Lg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKiBAb3JkZXJlZA0KKyAgICAgKi8NCisgICAgaW50IFJVTl9fQ09OU1RSQUlOVFMgPSA1Ow0KKw0KKyAgICAvKioNCisgICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICogQG9yZGVyZWQNCisgICAgICovDQorICAgIGludCBSVU5fX1NUQVJURUQgPSA2Ow0KKw0KKyAgICAvKioNCisgICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmlzaGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqIEBvcmRlcmVkDQorICAgICAqLw0KKyAgICBpbnQgUlVOX19GSU5JU0hFRCA9IDc7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UnVuPC9lbT4nIGNsYXNzLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKiBAb3JkZXJlZA0KKyAgICAgKi8NCisgICAgaW50IFJVTl9GRUFUVVJFX0NPVU5UID0gODsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuaW1wbC5GYWlsdXJlSW1wbCA8ZW0+RmFpbHVyZTwvZW0+fScgY2xhc3MuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLmltcGwuRmFpbHVyZUltcGwNCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5pbXBsLkFyZXNQYWNrYWdlSW1wbCNnZXRGYWlsdXJlKCkNCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgaW50IEZBSUxVUkUgPSAxOw0KKw0KKyAgICAvKioNCisgICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnN0cmFpbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICogQG9yZGVyZWQNCisgICAgICovDQorICAgIGludCBGQUlMVVJFX19DT05TVFJBSU5UID0gMDsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jc3N1ZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKiBAb3JkZXJlZA0KKyAgICAgKi8NCisgICAgaW50IEZBSUxVUkVfX0lTU1VFID0gMTsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICogQG9yZGVyZWQNCisgICAgICovDQorICAgIGludCBGQUlMVVJFX19BQ1RVQUxfVkFMVUUgPSAyOw0KKw0KKyAgICAvKioNCisgICAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkZhaWx1cmU8L2VtPicgY2xhc3MuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqIEBvcmRlcmVkDQorICAgICAqLw0KKyAgICBpbnQgRkFJTFVSRV9GRUFUVVJFX0NPVU5UID0gMzsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuUmVzdWx0IDxlbT5SZXN1bHQ8L2VtPn0nIGVudW0uDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLlJlc3VsdA0KKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLmltcGwuQXJlc1BhY2thZ2VJbXBsI2dldFJlc3VsdCgpDQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIGludCBSRVNVTFQgPSAyOw0KKw0KKyAgICAvKioNCisgICAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5Jc3N1ZSA8ZW0+SXNzdWU8L2VtPn0nIGVudW0uDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLklzc3VlDQorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuaW1wbC5BcmVzUGFja2FnZUltcGwjZ2V0SXNzdWUoKQ0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBpbnQgSVNTVUUgPSAzOw0KKw0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuUnVuIDxlbT5SdW48L2VtPn0nLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UnVuPC9lbT4nLg0KKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLlJ1bg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBFQ2xhc3MgZ2V0UnVuKCk7DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLlJ1biNnZXRNb2RlbCA8ZW0+TW9kZWw8L2VtPn0nLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5Nb2RlbDwvZW0+Jy4NCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5SdW4jZ2V0TW9kZWwoKQ0KKyAgICAgKiBAc2VlICNnZXRSdW4oKQ0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBFUmVmZXJlbmNlIGdldFJ1bl9Nb2RlbCgpOw0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5SdW4jZ2V0VGVzdE1vZGVsIDxlbT5UZXN0IE1vZGVsPC9lbT59Jy4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+VGVzdCBNb2RlbDwvZW0+Jy4NCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5SdW4jZ2V0VGVzdE1vZGVsKCkNCisgICAgICogQHNlZSAjZ2V0UnVuKCkNCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgRVJlZmVyZW5jZSBnZXRSdW5fVGVzdE1vZGVsKCk7DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLlJ1biNnZXRQYXJhbWV0ZXJNb2RlbCA8ZW0+UGFyYW1ldGVyIE1vZGVsPC9lbT59Jy4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UGFyYW1ldGVyIE1vZGVsPC9lbT4nLg0KKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLlJ1biNnZXRQYXJhbWV0ZXJNb2RlbCgpDQorICAgICAqIEBzZWUgI2dldFJ1bigpDQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIEVSZWZlcmVuY2UgZ2V0UnVuX1BhcmFtZXRlck1vZGVsKCk7DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLlJ1biNnZXRSZXN1bHQgPGVtPlJlc3VsdDwvZW0+fScuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc3VsdDwvZW0+Jy4NCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5SdW4jZ2V0UmVzdWx0KCkNCisgICAgICogQHNlZSAjZ2V0UnVuKCkNCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgRUF0dHJpYnV0ZSBnZXRSdW5fUmVzdWx0KCk7DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuUnVuI2dldFBhcmFtZXRlcnMgPGVtPlBhcmFtZXRlcnM8L2VtPn0nLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlBhcmFtZXRlcnM8L2VtPicuDQorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuUnVuI2dldFBhcmFtZXRlcnMoKQ0KKyAgICAgKiBAc2VlICNnZXRSdW4oKQ0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBFUmVmZXJlbmNlIGdldFJ1bl9QYXJhbWV0ZXJzKCk7DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuUnVuI2dldENvbnN0cmFpbnRzIDxlbT5Db25zdHJhaW50czwvZW0+fScuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29uc3RyYWludHM8L2VtPicuDQorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuUnVuI2dldENvbnN0cmFpbnRzKCkNCisgICAgICogQHNlZSAjZ2V0UnVuKCkNCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgRVJlZmVyZW5jZSBnZXRSdW5fQ29uc3RyYWludHMoKTsNCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuUnVuI2dldFN0YXJ0ZWQgPGVtPlN0YXJ0ZWQ8L2VtPn0nLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFydGVkPC9lbT4nLg0KKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLlJ1biNnZXRTdGFydGVkKCkNCisgICAgICogQHNlZSAjZ2V0UnVuKCkNCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgRUF0dHJpYnV0ZSBnZXRSdW5fU3RhcnRlZCgpOw0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5SdW4jZ2V0RmluaXNoZWQgPGVtPkZpbmlzaGVkPC9lbT59Jy4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluaXNoZWQ8L2VtPicuDQorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuUnVuI2dldEZpbmlzaGVkKCkNCisgICAgICogQHNlZSAjZ2V0UnVuKCkNCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgRUF0dHJpYnV0ZSBnZXRSdW5fRmluaXNoZWQoKTsNCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLkZhaWx1cmUgPGVtPkZhaWx1cmU8L2VtPn0nLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RmFpbHVyZTwvZW0+Jy4NCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5GYWlsdXJlDQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIEVDbGFzcyBnZXRGYWlsdXJlKCk7DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLkZhaWx1cmUjZ2V0Q29uc3RyYWludCA8ZW0+Q29uc3RyYWludDwvZW0+fScuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkNvbnN0cmFpbnQ8L2VtPicuDQorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuRmFpbHVyZSNnZXRDb25zdHJhaW50KCkNCisgICAgICogQHNlZSAjZ2V0RmFpbHVyZSgpDQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIEVSZWZlcmVuY2UgZ2V0RmFpbHVyZV9Db25zdHJhaW50KCk7DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLkZhaWx1cmUjZ2V0SXNzdWUgPGVtPklzc3VlPC9lbT59Jy4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXNzdWU8L2VtPicuDQorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuRmFpbHVyZSNnZXRJc3N1ZSgpDQorICAgICAqIEBzZWUgI2dldEZhaWx1cmUoKQ0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBFQXR0cmlidXRlIGdldEZhaWx1cmVfSXNzdWUoKTsNCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuRmFpbHVyZSNnZXRBY3R1YWxWYWx1ZSA8ZW0+QWN0dWFsIFZhbHVlPC9lbT59Jy4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIFZhbHVlPC9lbT4nLg0KKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLkZhaWx1cmUjZ2V0QWN0dWFsVmFsdWUoKQ0KKyAgICAgKiBAc2VlICNnZXRGYWlsdXJlKCkNCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgRUF0dHJpYnV0ZSBnZXRGYWlsdXJlX0FjdHVhbFZhbHVlKCk7DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLlJlc3VsdCA8ZW0+UmVzdWx0PC9lbT59Jy4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+UmVzdWx0PC9lbT4nLg0KKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLlJlc3VsdA0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBFRW51bSBnZXRSZXN1bHQoKTsNCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuSXNzdWUgPGVtPklzc3VlPC9lbT59Jy4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+SXNzdWU8L2VtPicuDQorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuSXNzdWUNCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgRUVudW0gZ2V0SXNzdWUoKTsNCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuDQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIEFyZXNGYWN0b3J5IGdldEFyZXNGYWN0b3J5KCk7DQorDQorICAgIC8qKg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50DQorICAgICAqIDx1bD4NCisgICAgICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPg0KKyAgICAgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPg0KKyAgICAgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4NCisgICAgICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4NCisgICAgICogPC91bD4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIGludGVyZmFjZSBMaXRlcmFscyB7DQorICAgICAgICAvKioNCisgICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5pbXBsLlJ1bkltcGwgPGVtPlJ1bjwvZW0+fScgY2xhc3MuDQorICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLmltcGwuUnVuSW1wbA0KKyAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5pbXBsLkFyZXNQYWNrYWdlSW1wbCNnZXRSdW4oKQ0KKyAgICAgICAgICogQGdlbmVyYXRlZA0KKyAgICAgICAgICovDQorICAgICAgICBFQ2xhc3MgUlVOID0gZUlOU1RBTkNFLmdldFJ1bigpOw0KKw0KKyAgICAgICAgLyoqDQorICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TW9kZWw8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLg0KKyAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgICAgICogQGdlbmVyYXRlZA0KKyAgICAgICAgICovDQorICAgICAgICBFUmVmZXJlbmNlIFJVTl9fTU9ERUwgPSBlSU5TVEFOQ0UuZ2V0UnVuX01vZGVsKCk7DQorDQorICAgICAgICAvKioNCisgICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UZXN0IE1vZGVsPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4NCisgICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICAgICAqLw0KKyAgICAgICAgRVJlZmVyZW5jZSBSVU5fX1RFU1RfTU9ERUwgPSBlSU5TVEFOQ0UuZ2V0UnVuX1Rlc3RNb2RlbCgpOw0KKw0KKyAgICAgICAgLyoqDQorICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFyYW1ldGVyIE1vZGVsPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4NCisgICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICAgICAqLw0KKyAgICAgICAgRVJlZmVyZW5jZSBSVU5fX1BBUkFNRVRFUl9NT0RFTCA9IGVJTlNUQU5DRS5nZXRSdW5fUGFyYW1ldGVyTW9kZWwoKTsNCisNCisgICAgICAgIC8qKg0KKyAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc3VsdDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAgICAgKi8NCisgICAgICAgIEVBdHRyaWJ1dGUgUlVOX19SRVNVTFQgPSBlSU5TVEFOQ0UuZ2V0UnVuX1Jlc3VsdCgpOw0KKw0KKyAgICAgICAgLyoqDQorICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFyYW1ldGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4NCisgICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICAgICAqLw0KKyAgICAgICAgRVJlZmVyZW5jZSBSVU5fX1BBUkFNRVRFUlMgPSBlSU5TVEFOQ0UuZ2V0UnVuX1BhcmFtZXRlcnMoKTsNCisNCisgICAgICAgIC8qKg0KKyAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnN0cmFpbnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLg0KKyAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgICAgICogQGdlbmVyYXRlZA0KKyAgICAgICAgICovDQorICAgICAgICBFUmVmZXJlbmNlIFJVTl9fQ09OU1RSQUlOVFMgPSBlSU5TVEFOQ0UuZ2V0UnVuX0NvbnN0cmFpbnRzKCk7DQorDQorICAgICAgICAvKioNCisgICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdGFydGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCisgICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICAgICAqLw0KKyAgICAgICAgRUF0dHJpYnV0ZSBSVU5fX1NUQVJURUQgPSBlSU5TVEFOQ0UuZ2V0UnVuX1N0YXJ0ZWQoKTsNCisNCisgICAgICAgIC8qKg0KKyAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpbmlzaGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCisgICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICAgICAqLw0KKyAgICAgICAgRUF0dHJpYnV0ZSBSVU5fX0ZJTklTSEVEID0gZUlOU1RBTkNFLmdldFJ1bl9GaW5pc2hlZCgpOw0KKw0KKyAgICAgICAgLyoqDQorICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuaW1wbC5GYWlsdXJlSW1wbCA8ZW0+RmFpbHVyZTwvZW0+fScgY2xhc3MuDQorICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLmltcGwuRmFpbHVyZUltcGwNCisgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuaW1wbC5BcmVzUGFja2FnZUltcGwjZ2V0RmFpbHVyZSgpDQorICAgICAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAgICAgKi8NCisgICAgICAgIEVDbGFzcyBGQUlMVVJFID0gZUlOU1RBTkNFLmdldEZhaWx1cmUoKTsNCisNCisgICAgICAgIC8qKg0KKyAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnN0cmFpbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLg0KKyAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgICAgICogQGdlbmVyYXRlZA0KKyAgICAgICAgICovDQorICAgICAgICBFUmVmZXJlbmNlIEZBSUxVUkVfX0NPTlNUUkFJTlQgPSBlSU5TVEFOQ0UuZ2V0RmFpbHVyZV9Db25zdHJhaW50KCk7DQorDQorICAgICAgICAvKioNCisgICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Jc3N1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQorICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAgICAgKi8NCisgICAgICAgIEVBdHRyaWJ1dGUgRkFJTFVSRV9fSVNTVUUgPSBlSU5TVEFOQ0UuZ2V0RmFpbHVyZV9Jc3N1ZSgpOw0KKw0KKyAgICAgICAgLyoqDQorICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCisgICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICAgICAqLw0KKyAgICAgICAgRUF0dHJpYnV0ZSBGQUlMVVJFX19BQ1RVQUxfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0RmFpbHVyZV9BY3R1YWxWYWx1ZSgpOw0KKw0KKyAgICAgICAgLyoqDQorICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuUmVzdWx0IDxlbT5SZXN1bHQ8L2VtPn0nIGVudW0uDQorICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLlJlc3VsdA0KKyAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5pbXBsLkFyZXNQYWNrYWdlSW1wbCNnZXRSZXN1bHQoKQ0KKyAgICAgICAgICogQGdlbmVyYXRlZA0KKyAgICAgICAgICovDQorICAgICAgICBFRW51bSBSRVNVTFQgPSBlSU5TVEFOQ0UuZ2V0UmVzdWx0KCk7DQorDQorICAgICAgICAvKioNCisgICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5Jc3N1ZSA8ZW0+SXNzdWU8L2VtPn0nIGVudW0uDQorICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLklzc3VlDQorICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLmltcGwuQXJlc1BhY2thZ2VJbXBsI2dldElzc3VlKCkNCisgICAgICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICAgICAqLw0KKyAgICAgICAgRUVudW0gSVNTVUUgPSBlSU5TVEFOQ0UuZ2V0SXNzdWUoKTsNCisNCisgICAgfQ0KKw0KK30gLy9BcmVzUGFja2FnZQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hcmVzL0ZhaWx1cmUuamF2YSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hcmVzL0ZhaWx1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTJjMjE0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMvb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL2FyZXMvRmFpbHVyZS5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkOiBGYWlsdXJlLmphdmEsdiAxLjEgMjAwOS8wNy8zMSAyMTo0ODoxOSBtcGFya2VyIEV4cCAkDQorICovDQorcGFja2FnZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlczsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkNvbnN0cmFpbnQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RmFpbHVyZTwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICoNCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5GYWlsdXJlI2dldENvbnN0cmFpbnQgPGVtPkNvbnN0cmFpbnQ8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5GYWlsdXJlI2dldElzc3VlIDxlbT5Jc3N1ZTwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLkZhaWx1cmUjZ2V0QWN0dWFsVmFsdWUgPGVtPkFjdHVhbCBWYWx1ZTwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLkFyZXNQYWNrYWdlI2dldEZhaWx1cmUoKQ0KKyAqIEBtb2RlbA0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIEZhaWx1cmUgZXh0ZW5kcyBFT2JqZWN0IHsNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnN0cmFpbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPHA+DQorICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnN0cmFpbnQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLA0KKyAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorICAgICAqIDwvcD4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnN0cmFpbnQ8L2VtPicgcmVmZXJlbmNlLg0KKyAgICAgKiBAc2VlICNzZXRDb25zdHJhaW50KENvbnN0cmFpbnQpDQorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuQXJlc1BhY2thZ2UjZ2V0RmFpbHVyZV9Db25zdHJhaW50KCkNCisgICAgICogQG1vZGVsDQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIENvbnN0cmFpbnQgZ2V0Q29uc3RyYWludCgpOw0KKw0KKyAgICAvKioNCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuRmFpbHVyZSNnZXRDb25zdHJhaW50IDxlbT5Db25zdHJhaW50PC9lbT59JyByZWZlcmVuY2UuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db25zdHJhaW50PC9lbT4nIHJlZmVyZW5jZS4NCisgICAgICogQHNlZSAjZ2V0Q29uc3RyYWludCgpDQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHZvaWQgc2V0Q29uc3RyYWludChDb25zdHJhaW50IHZhbHVlKTsNCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzc3VlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorICAgICAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLklzc3VlfS4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPHA+DQorICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklzc3VlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCisgICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKyAgICAgKiA8L3A+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Jc3N1ZTwvZW0+JyBhdHRyaWJ1dGUuDQorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuSXNzdWUNCisgICAgICogQHNlZSAjc2V0SXNzdWUoSXNzdWUpDQorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuQXJlc1BhY2thZ2UjZ2V0RmFpbHVyZV9Jc3N1ZSgpDQorICAgICAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSINCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgSXNzdWUgZ2V0SXNzdWUoKTsNCisNCisgICAgLyoqDQorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLkZhaWx1cmUjZ2V0SXNzdWUgPGVtPklzc3VlPC9lbT59JyBhdHRyaWJ1dGUuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Jc3N1ZTwvZW0+JyBhdHRyaWJ1dGUuDQorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuSXNzdWUNCisgICAgICogQHNlZSAjZ2V0SXNzdWUoKQ0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICB2b2lkIHNldElzc3VlKElzc3VlIHZhbHVlKTsNCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8cD4NCisgICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWN0dWFsIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCisgICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKyAgICAgKiA8L3A+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgVmFsdWU8L2VtPicgYXR0cmlidXRlLg0KKyAgICAgKiBAc2VlICNzZXRBY3R1YWxWYWx1ZShkb3VibGUpDQorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuQXJlc1BhY2thZ2UjZ2V0RmFpbHVyZV9BY3R1YWxWYWx1ZSgpDQorICAgICAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSINCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgZG91YmxlIGdldEFjdHVhbFZhbHVlKCk7DQorDQorICAgIC8qKg0KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5GYWlsdXJlI2dldEFjdHVhbFZhbHVlIDxlbT5BY3R1YWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuDQorICAgICAqIEBzZWUgI2dldEFjdHVhbFZhbHVlKCkNCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgdm9pZCBzZXRBY3R1YWxWYWx1ZShkb3VibGUgdmFsdWUpOw0KKw0KK30gLy8gRmFpbHVyZQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hcmVzL0lzc3VlLmphdmEgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvYXJlcy9Jc3N1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NzFkMDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvYXJlcy9Jc3N1ZS5qYXZhCkBAIC0wLDAgKzEsMjEyIEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkOiBJc3N1ZS5qYXZhLHYgMS4xIDIwMDkvMDcvMzEgMjE6NDg6MTkgbXBhcmtlciBFeHAgJA0KKyAqLw0KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+SXNzdWU8L2I+PC9lbT4nLA0KKyAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuQXJlc1BhY2thZ2UjZ2V0SXNzdWUoKQ0KKyAqIEBtb2RlbA0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgZW51bSBJc3N1ZSBpbXBsZW1lbnRzIEVudW1lcmF0b3Igew0KKyAgICAvKioNCisgICAgICogVGhlICc8ZW0+PGI+QmVsb3cgUmFuZ2U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0Lg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQHNlZSAjQkVMT1dfUkFOR0VfVkFMVUUNCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKiBAb3JkZXJlZA0KKyAgICAgKi8NCisgICAgQkVMT1dfUkFOR0UoMTAsICJCZWxvd1JhbmdlIiwgIkJFTE9XX1JBTkdFIiksDQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgJzxlbT48Yj5BYm92ZSBSYW5nZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAc2VlICNBQk9WRV9SQU5HRV9WQUxVRQ0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqIEBvcmRlcmVkDQorICAgICAqLw0KKyAgICBBQk9WRV9SQU5HRSgxNSwgIkFib3ZlUmFuZ2UiLCAiQUJPVkVfUkFOR0UiKTsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSAnPGVtPjxiPkJlbG93IFJhbmdlPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8cD4NCisgICAgICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5CZWxvdyBSYW5nZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsDQorICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisgICAgICogPC9wPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQHNlZSAjQkVMT1dfUkFOR0UNCisgICAgICogQG1vZGVsIG5hbWU9IkJlbG93UmFuZ2UiIGxpdGVyYWw9IkJFTE9XX1JBTkdFIg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqIEBvcmRlcmVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCRUxPV19SQU5HRV9WQUxVRSA9IDEwOw0KKw0KKyAgICAvKioNCisgICAgICogVGhlICc8ZW0+PGI+QWJvdmUgUmFuZ2U8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDxwPg0KKyAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkFib3ZlIFJhbmdlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwNCisgICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKyAgICAgKiA8L3A+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAc2VlICNBQk9WRV9SQU5HRQ0KKyAgICAgKiBAbW9kZWwgbmFtZT0iQWJvdmVSYW5nZSIgbGl0ZXJhbD0iQUJPVkVfUkFOR0UiDQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICogQG9yZGVyZWQNCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCT1ZFX1JBTkdFX1ZBTFVFID0gMTU7DQorDQorICAgIC8qKg0KKyAgICAgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+SXNzdWU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXNzdWVbXSBWQUxVRVNfQVJSQVkgPQ0KKyAgICAgICAgbmV3IElzc3VlW10gew0KKyAgICAgICAgICAgIEJFTE9XX1JBTkdFLA0KKyAgICAgICAgICAgIEFCT1ZFX1JBTkdFLA0KKyAgICAgICAgfTsNCisNCisgICAgLyoqDQorICAgICAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5Jc3N1ZTwvYj48L2VtPicgZW51bWVyYXRvcnMuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8SXNzdWU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsNCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlICc8ZW0+PGI+SXNzdWU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIElzc3VlIGdldChTdHJpbmcgbGl0ZXJhbCkgew0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsNCisgICAgICAgICAgICBJc3N1ZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07DQorICAgICAgICAgICAgaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBudWxsOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPklzc3VlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBJc3N1ZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7DQorICAgICAgICAgICAgSXNzdWUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOw0KKyAgICAgICAgICAgIGlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBudWxsOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPklzc3VlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBJc3N1ZSBnZXQoaW50IHZhbHVlKSB7DQorICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7DQorICAgICAgICAgICAgY2FzZSBCRUxPV19SQU5HRV9WQUxVRTogcmV0dXJuIEJFTE9XX1JBTkdFOw0KKyAgICAgICAgICAgIGNhc2UgQUJPVkVfUkFOR0VfVkFMVUU6IHJldHVybiBBQk9WRV9SQU5HRTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBudWxsOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7DQorDQorICAgIC8qKg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsNCisNCisgICAgLyoqDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOw0KKw0KKyAgICAvKioNCisgICAgICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBJc3N1ZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgew0KKyAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOw0KKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCisgICAgICAgIHRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50IGdldFZhbHVlKCkgew0KKyAgICAgIHJldHVybiB2YWx1ZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCisgICAgICByZXR1cm4gbmFtZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsNCisgICAgICByZXR1cm4gbGl0ZXJhbDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKyAgICAgICAgcmV0dXJuIGxpdGVyYWw7DQorICAgIH0NCisgICAgDQorfSAvL0lzc3VlDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMvb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL2FyZXMvUmVzdWx0LmphdmEgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvYXJlcy9SZXN1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGY5ZjQxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMvb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL2FyZXMvUmVzdWx0LmphdmEKQEAgLTAsMCArMSwyMzkgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQ6IFJlc3VsdC5qYXZhLHYgMS4xIDIwMDkvMDcvMzEgMjE6NDg6MTkgbXBhcmtlciBFeHAgJA0KKyAqLw0KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXM7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+UmVzdWx0PC9iPjwvZW0+JywNCisgKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLkFyZXNQYWNrYWdlI2dldFJlc3VsdCgpDQorICogQG1vZGVsDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBlbnVtIFJlc3VsdCBpbXBsZW1lbnRzIEVudW1lcmF0b3Igew0KKyAgICAvKioNCisgICAgICogVGhlICc8ZW0+PGI+SW5jb21wbGV0ZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAc2VlICNJTkNPTVBMRVRFX1ZBTFVFDQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICogQG9yZGVyZWQNCisgICAgICovDQorICAgIElOQ09NUExFVEUoMSwgIkluY29tcGxldGUiLCAiSU5DT01QTEVURSIpLA0KKw0KKyAgICAvKioNCisgICAgICogVGhlICc8ZW0+PGI+U3VjY2VzczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAc2VlICNTVUNDRVNTX1ZBTFVFDQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICogQG9yZGVyZWQNCisgICAgICovDQorICAgIFNVQ0NFU1MoMiwgIlN1Y2Nlc3MiLCAiU1VDQ0VTUyIpLA0KKw0KKyAgICAvKioNCisgICAgICogVGhlICc8ZW0+PGI+RmFpbHVyZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAc2VlICNGQUlMVVJFX1ZBTFVFDQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICogQG9yZGVyZWQNCisgICAgICovDQorICAgIEZBSUxVUkUoMywgIkZhaWx1cmUiLCAiRkFJTFVSRSIpOw0KKw0KKyAgICAvKioNCisgICAgICogVGhlICc8ZW0+PGI+SW5jb21wbGV0ZTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPHA+DQorICAgICAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SW5jb21wbGV0ZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsDQorICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisgICAgICogPC9wPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQHNlZSAjSU5DT01QTEVURQ0KKyAgICAgKiBAbW9kZWwgbmFtZT0iSW5jb21wbGV0ZSIgbGl0ZXJhbD0iSU5DT01QTEVURSINCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKiBAb3JkZXJlZA0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5DT01QTEVURV9WQUxVRSA9IDE7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgJzxlbT48Yj5TdWNjZXNzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8cD4NCisgICAgICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TdWNjZXNzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwNCisgICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKyAgICAgKiA8L3A+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAc2VlICNTVUNDRVNTDQorICAgICAqIEBtb2RlbCBuYW1lPSJTdWNjZXNzIiBsaXRlcmFsPSJTVUNDRVNTIg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqIEBvcmRlcmVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVUNDRVNTX1ZBTFVFID0gMjsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSAnPGVtPjxiPkZhaWx1cmU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDxwPg0KKyAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkZhaWx1cmU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLA0KKyAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorICAgICAqIDwvcD4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBzZWUgI0ZBSUxVUkUNCisgICAgICogQG1vZGVsIG5hbWU9IkZhaWx1cmUiIGxpdGVyYWw9IkZBSUxVUkUiDQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICogQG9yZGVyZWQNCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBSUxVUkVfVkFMVUUgPSAzOw0KKw0KKyAgICAvKioNCisgICAgICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlJlc3VsdDwvYj48L2VtPicgZW51bWVyYXRvcnMuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXN1bHRbXSBWQUxVRVNfQVJSQVkgPQ0KKyAgICAgICAgbmV3IFJlc3VsdFtdIHsNCisgICAgICAgICAgICBJTkNPTVBMRVRFLA0KKyAgICAgICAgICAgIFNVQ0NFU1MsDQorICAgICAgICAgICAgRkFJTFVSRSwNCisgICAgICAgIH07DQorDQorICAgIC8qKg0KKyAgICAgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+UmVzdWx0PC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxSZXN1bHQ+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsNCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlICc8ZW0+PGI+UmVzdWx0PC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBSZXN1bHQgZ2V0KFN0cmluZyBsaXRlcmFsKSB7DQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgew0KKyAgICAgICAgICAgIFJlc3VsdCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07DQorICAgICAgICAgICAgaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBudWxsOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJlc3VsdDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgUmVzdWx0IGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgew0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsNCisgICAgICAgICAgICBSZXN1bHQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOw0KKyAgICAgICAgICAgIGlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBudWxsOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJlc3VsdDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgUmVzdWx0IGdldChpbnQgdmFsdWUpIHsNCisgICAgICAgIHN3aXRjaCAodmFsdWUpIHsNCisgICAgICAgICAgICBjYXNlIElOQ09NUExFVEVfVkFMVUU6IHJldHVybiBJTkNPTVBMRVRFOw0KKyAgICAgICAgICAgIGNhc2UgU1VDQ0VTU19WQUxVRTogcmV0dXJuIFNVQ0NFU1M7DQorICAgICAgICAgICAgY2FzZSBGQUlMVVJFX1ZBTFVFOiByZXR1cm4gRkFJTFVSRTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBudWxsOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7DQorDQorICAgIC8qKg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsNCisNCisgICAgLyoqDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOw0KKw0KKyAgICAvKioNCisgICAgICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBSZXN1bHQoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsNCisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsNCisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7DQorICAgICAgICB0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHVibGljIGludCBnZXRWYWx1ZSgpIHsNCisgICAgICByZXR1cm4gdmFsdWU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7DQorICAgICAgcmV0dXJuIG5hbWU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7DQorICAgICAgcmV0dXJuIGxpdGVyYWw7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCisgICAgICAgIHJldHVybiBsaXRlcmFsOw0KKyAgICB9DQorICAgIA0KK30gLy9SZXN1bHQNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvYXJlcy9SdW4uamF2YSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hcmVzL1J1bi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZDZjNjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvYXJlcy9SdW4uamF2YQpAQCAtMCwwICsxLDIzOCBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZDogUnVuLmphdmEsdiAxLjEgMjAwOS8wNy8zMSAyMTo0ODoxOSBtcGFya2VyIEV4cCAkDQorICovDQorcGFja2FnZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlczsNCisNCitpbXBvcnQgamF2YS51dGlsLkRhdGU7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYucGFyYW1ldGVycy5hUGFyLlBhcmFtZXRlcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkNvbnN0cmFpbnQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5Nb2RlbDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCisNCitpbXBvcnQgb3JnLm1ldGFhYm0uU0NvbnRpbnVvdXNTcGFjZTsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJ1bjwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICoNCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5SdW4jZ2V0TW9kZWwgPGVtPk1vZGVsPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuUnVuI2dldFRlc3RNb2RlbCA8ZW0+VGVzdCBNb2RlbDwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLlJ1biNnZXRQYXJhbWV0ZXJNb2RlbCA8ZW0+UGFyYW1ldGVyIE1vZGVsPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuUnVuI2dldFJlc3VsdCA8ZW0+UmVzdWx0PC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuUnVuI2dldFBhcmFtZXRlcnMgPGVtPlBhcmFtZXRlcnM8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5SdW4jZ2V0Q29uc3RyYWludHMgPGVtPkNvbnN0cmFpbnRzPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuUnVuI2dldFN0YXJ0ZWQgPGVtPlN0YXJ0ZWQ8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5SdW4jZ2V0RmluaXNoZWQgPGVtPkZpbmlzaGVkPC9lbT59PC9saT4NCisgKiA8L3VsPg0KKyAqIDwvcD4NCisgKg0KKyAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuQXJlc1BhY2thZ2UjZ2V0UnVuKCkNCisgKiBAbW9kZWwNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGludGVyZmFjZSBSdW4gZXh0ZW5kcyBFT2JqZWN0IHsNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1vZGVsPC9iPjwvZW0+JyByZWZlcmVuY2UuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDxwPg0KKyAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Nb2RlbDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsDQorICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisgICAgICogPC9wPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW9kZWw8L2VtPicgcmVmZXJlbmNlLg0KKyAgICAgKiBAc2VlICNzZXRNb2RlbChTQ29udGludW91c1NwYWNlKQ0KKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLkFyZXNQYWNrYWdlI2dldFJ1bl9Nb2RlbCgpDQorICAgICAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSINCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgU0NvbnRpbnVvdXNTcGFjZSBnZXRNb2RlbCgpOw0KKw0KKyAgICAvKioNCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuUnVuI2dldE1vZGVsIDxlbT5Nb2RlbDwvZW0+fScgcmVmZXJlbmNlLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TW9kZWw8L2VtPicgcmVmZXJlbmNlLg0KKyAgICAgKiBAc2VlICNnZXRNb2RlbCgpDQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHZvaWQgc2V0TW9kZWwoU0NvbnRpbnVvdXNTcGFjZSB2YWx1ZSk7DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UZXN0IE1vZGVsPC9iPjwvZW0+JyByZWZlcmVuY2UuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDxwPg0KKyAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UZXN0IE1vZGVsPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwNCisgICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKyAgICAgKiA8L3A+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UZXN0IE1vZGVsPC9lbT4nIHJlZmVyZW5jZS4NCisgICAgICogQHNlZSAjc2V0VGVzdE1vZGVsKE1vZGVsKQ0KKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLkFyZXNQYWNrYWdlI2dldFJ1bl9UZXN0TW9kZWwoKQ0KKyAgICAgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiDQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIE1vZGVsIGdldFRlc3RNb2RlbCgpOw0KKw0KKyAgICAvKioNCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuUnVuI2dldFRlc3RNb2RlbCA8ZW0+VGVzdCBNb2RlbDwvZW0+fScgcmVmZXJlbmNlLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGVzdCBNb2RlbDwvZW0+JyByZWZlcmVuY2UuDQorICAgICAqIEBzZWUgI2dldFRlc3RNb2RlbCgpDQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHZvaWQgc2V0VGVzdE1vZGVsKE1vZGVsIHZhbHVlKTsNCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcmFtZXRlciBNb2RlbDwvYj48L2VtPicgcmVmZXJlbmNlLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8cD4NCisgICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFyYW1ldGVyIE1vZGVsPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwNCisgICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKyAgICAgKiA8L3A+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJhbWV0ZXIgTW9kZWw8L2VtPicgcmVmZXJlbmNlLg0KKyAgICAgKiBAc2VlICNzZXRQYXJhbWV0ZXJNb2RlbChvcmcuZWNsaXBzZS5hbXAuYW1mLnBhcmFtZXRlcnMuYVBhci5Nb2RlbCkNCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5BcmVzUGFja2FnZSNnZXRSdW5fUGFyYW1ldGVyTW9kZWwoKQ0KKyAgICAgKiBAbW9kZWwNCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgb3JnLmVjbGlwc2UuYW1wLmFtZi5wYXJhbWV0ZXJzLmFQYXIuTW9kZWwgZ2V0UGFyYW1ldGVyTW9kZWwoKTsNCisNCisgICAgLyoqDQorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLlJ1biNnZXRQYXJhbWV0ZXJNb2RlbCA8ZW0+UGFyYW1ldGVyIE1vZGVsPC9lbT59JyByZWZlcmVuY2UuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJhbWV0ZXIgTW9kZWw8L2VtPicgcmVmZXJlbmNlLg0KKyAgICAgKiBAc2VlICNnZXRQYXJhbWV0ZXJNb2RlbCgpDQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHZvaWQgc2V0UGFyYW1ldGVyTW9kZWwob3JnLmVjbGlwc2UuYW1wLmFtZi5wYXJhbWV0ZXJzLmFQYXIuTW9kZWwgdmFsdWUpOw0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzdWx0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4NCisgICAgICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuUmVzdWx0fS4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPHA+DQorICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlc3VsdDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQorICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisgICAgICogPC9wPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzdWx0PC9lbT4nIGF0dHJpYnV0ZS4NCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5SZXN1bHQNCisgICAgICogQHNlZSAjc2V0UmVzdWx0KFJlc3VsdCkNCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5BcmVzUGFja2FnZSNnZXRSdW5fUmVzdWx0KCkNCisgICAgICogQG1vZGVsIGRlZmF1bHQ9IiINCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgUmVzdWx0IGdldFJlc3VsdCgpOw0KKw0KKyAgICAvKioNCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuUnVuI2dldFJlc3VsdCA8ZW0+UmVzdWx0PC9lbT59JyBhdHRyaWJ1dGUuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN1bHQ8L2VtPicgYXR0cmlidXRlLg0KKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLlJlc3VsdA0KKyAgICAgKiBAc2VlICNnZXRSZXN1bHQoKQ0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICB2b2lkIHNldFJlc3VsdChSZXN1bHQgdmFsdWUpOw0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFyYW1ldGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorICAgICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnBhcmFtZXRlcnMuYVBhci5QYXJhbWV0ZXJ9Lg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8cD4NCisgICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFyYW1ldGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwNCisgICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KKyAgICAgKiA8L3A+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJhbWV0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLkFyZXNQYWNrYWdlI2dldFJ1bl9QYXJhbWV0ZXJzKCkNCisgICAgICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBFTGlzdDxQYXJhbWV0ZXI+IGdldFBhcmFtZXRlcnMoKTsNCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnN0cmFpbnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4NCisgICAgICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5Db25zdHJhaW50fS4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPHA+DQorICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnN0cmFpbnRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLA0KKyAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQorICAgICAqIDwvcD4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnN0cmFpbnRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0Lg0KKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLkFyZXNQYWNrYWdlI2dldFJ1bl9Db25zdHJhaW50cygpDQorICAgICAqIEBtb2RlbA0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBFTGlzdDxDb25zdHJhaW50PiBnZXRDb25zdHJhaW50cygpOw0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhcnRlZDwvYj48L2VtPicgYXR0cmlidXRlLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8cD4NCisgICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RhcnRlZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQorICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisgICAgICogPC9wPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnRlZDwvZW0+JyBhdHRyaWJ1dGUuDQorICAgICAqIEBzZWUgI3NldFN0YXJ0ZWQoRGF0ZSkNCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5BcmVzUGFja2FnZSNnZXRSdW5fU3RhcnRlZCgpDQorICAgICAqIEBtb2RlbA0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBEYXRlIGdldFN0YXJ0ZWQoKTsNCisNCisgICAgLyoqDQorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLlJ1biNnZXRTdGFydGVkIDxlbT5TdGFydGVkPC9lbT59JyBhdHRyaWJ1dGUuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydGVkPC9lbT4nIGF0dHJpYnV0ZS4NCisgICAgICogQHNlZSAjZ2V0U3RhcnRlZCgpDQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHZvaWQgc2V0U3RhcnRlZChEYXRlIHZhbHVlKTsNCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbmlzaGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDxwPg0KKyAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5GaW5pc2hlZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQorICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCisgICAgICogPC9wPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoZWQ8L2VtPicgYXR0cmlidXRlLg0KKyAgICAgKiBAc2VlICNzZXRGaW5pc2hlZChEYXRlKQ0KKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLkFyZXNQYWNrYWdlI2dldFJ1bl9GaW5pc2hlZCgpDQorICAgICAqIEBtb2RlbA0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBEYXRlIGdldEZpbmlzaGVkKCk7DQorDQorICAgIC8qKg0KKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5SdW4jZ2V0RmluaXNoZWQgPGVtPkZpbmlzaGVkPC9lbT59JyBhdHRyaWJ1dGUuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2hlZDwvZW0+JyBhdHRyaWJ1dGUuDQorICAgICAqIEBzZWUgI2dldEZpbmlzaGVkKCkNCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgdm9pZCBzZXRGaW5pc2hlZChEYXRlIHZhbHVlKTsNCisNCit9IC8vIFJ1bg0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hcmVzL2ltcGwvQXJlc0ZhY3RvcnlJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvYXJlcy9pbXBsL0FyZXNGYWN0b3J5SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkM2FlNGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvYXJlcy9pbXBsL0FyZXNGYWN0b3J5SW1wbC5qYXZhCkBAIC0wLDAgKzEsMTg1IEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkOiBBcmVzRmFjdG9yeUltcGwuamF2YSx2IDEuMSAyMDA5LzA3LzMxIDIxOjQ4OjE4IG1wYXJrZXIgRXhwICQNCisgKi8NCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLmltcGw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLio7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIEFyZXNGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIEFyZXNGYWN0b3J5IHsNCisgICAgLyoqDQorICAgICAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgQXJlc0ZhY3RvcnkgaW5pdCgpIHsNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgQXJlc0ZhY3RvcnkgdGhlQXJlc0ZhY3RvcnkgPSAoQXJlc0ZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImh0dHA6Ly9lY2xpcHNlLm9yZy9hbXAvYXJlcyIpOyANCisgICAgICAgICAgICBpZiAodGhlQXJlc0ZhY3RvcnkgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhlQXJlc0ZhY3Rvcnk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCisgICAgICAgICAgICBFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBuZXcgQXJlc0ZhY3RvcnlJbXBsKCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgQXJlc0ZhY3RvcnlJbXBsKCkgew0KKyAgICAgICAgc3VwZXIoKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgew0KKyAgICAgICAgc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsNCisgICAgICAgICAgICBjYXNlIEFyZXNQYWNrYWdlLlJVTjogcmV0dXJuIGNyZWF0ZVJ1bigpOw0KKyAgICAgICAgICAgIGNhc2UgQXJlc1BhY2thZ2UuRkFJTFVSRTogcmV0dXJuIGNyZWF0ZUZhaWx1cmUoKTsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7DQorICAgICAgICBzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgew0KKyAgICAgICAgICAgIGNhc2UgQXJlc1BhY2thZ2UuUkVTVUxUOg0KKyAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVzdWx0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7DQorICAgICAgICAgICAgY2FzZSBBcmVzUGFja2FnZS5JU1NVRToNCisgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUlzc3VlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgew0KKyAgICAgICAgc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsNCisgICAgICAgICAgICBjYXNlIEFyZXNQYWNrYWdlLlJFU1VMVDoNCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRSZXN1bHRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOw0KKyAgICAgICAgICAgIGNhc2UgQXJlc1BhY2thZ2UuSVNTVUU6DQorICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0SXNzdWVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgUnVuIGNyZWF0ZVJ1bigpIHsNCisgICAgICAgIFJ1bkltcGwgcnVuID0gbmV3IFJ1bkltcGwoKTsNCisgICAgICAgIHJldHVybiBydW47DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgRmFpbHVyZSBjcmVhdGVGYWlsdXJlKCkgew0KKyAgICAgICAgRmFpbHVyZUltcGwgZmFpbHVyZSA9IG5ldyBGYWlsdXJlSW1wbCgpOw0KKyAgICAgICAgcmV0dXJuIGZhaWx1cmU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgUmVzdWx0IGNyZWF0ZVJlc3VsdEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgew0KKyAgICAgICAgUmVzdWx0IHJlc3VsdCA9IFJlc3VsdC5nZXQoaW5pdGlhbFZhbHVlKTsNCisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyBTdHJpbmcgY29udmVydFJlc3VsdFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7DQorICAgICAgICByZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyBJc3N1ZSBjcmVhdGVJc3N1ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgew0KKyAgICAgICAgSXNzdWUgcmVzdWx0ID0gSXNzdWUuZ2V0KGluaXRpYWxWYWx1ZSk7DQorICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsNCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRJc3N1ZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7DQorICAgICAgICByZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyBBcmVzUGFja2FnZSBnZXRBcmVzUGFja2FnZSgpIHsNCisgICAgICAgIHJldHVybiAoQXJlc1BhY2thZ2UpZ2V0RVBhY2thZ2UoKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBkZXByZWNhdGVkDQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIEBEZXByZWNhdGVkDQorICAgIHB1YmxpYyBzdGF0aWMgQXJlc1BhY2thZ2UgZ2V0UGFja2FnZSgpIHsNCisgICAgICAgIHJldHVybiBBcmVzUGFja2FnZS5lSU5TVEFOQ0U7DQorICAgIH0NCisNCit9IC8vQXJlc0ZhY3RvcnlJbXBsDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMvb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL2FyZXMvaW1wbC9BcmVzUGFja2FnZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hcmVzL2ltcGwvQXJlc1BhY2thZ2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMwOTNlZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hcmVzL2ltcGwvQXJlc1BhY2thZ2VJbXBsLmphdmEKQEAgLTAsMCArMSwzNzcgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQ6IEFyZXNQYWNrYWdlSW1wbC5qYXZhLHYgMS4xIDIwMDkvMDcvMzEgMjE6NDg6MTggbXBhcmtlciBFeHAgJA0KKyAqLw0KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuaW1wbDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmFtZi5wYXJhbWV0ZXJzLmFQYXIuQVBhclBhY2thZ2U7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5BVGVzdFBhY2thZ2U7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLkFyZXNGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5BcmVzUGFja2FnZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuRmFpbHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuSXNzdWU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLlJlc3VsdDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuUnVuOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7DQorDQoraW1wb3J0IG9yZy5tZXRhYWJtLk1ldGFBQk1QYWNrYWdlOw0KKw0KKy8qKg0KKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+Lg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQXJlc1BhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgQXJlc1BhY2thZ2Ugew0KKyAgICAvKioNCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHByaXZhdGUgRUNsYXNzIHJ1bkVDbGFzcyA9IG51bGw7DQorDQorICAgIC8qKg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBFQ2xhc3MgZmFpbHVyZUVDbGFzcyA9IG51bGw7DQorDQorICAgIC8qKg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBFRW51bSByZXN1bHRFRW51bSA9IG51bGw7DQorDQorICAgIC8qKg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBFRW51bSBpc3N1ZUVFbnVtID0gbnVsbDsNCisNCisgICAgLyoqDQorICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgNCisgICAgICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UNCisgICAgICogcGFja2FnZSBVUkkgdmFsdWUuDQorICAgICAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMNCisgICAgICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMNCisgICAgICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwNCisgICAgICogaWYgb25lIGFscmVhZHkgZXhpc3RzLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkNCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5BcmVzUGFja2FnZSNlTlNfVVJJDQorICAgICAqIEBzZWUgI2luaXQoKQ0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwcml2YXRlIEFyZXNQYWNrYWdlSW1wbCgpIHsNCisgICAgICAgIHN1cGVyKGVOU19VUkksIEFyZXNGYWN0b3J5LmVJTlNUQU5DRSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7DQorDQorICAgIC8qKg0KKyAgICAgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuDQorICAgICAqIA0KKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIEFyZXNQYWNrYWdlI2VJTlNUQU5DRX0gd2hlbiB0aGF0IGZpZWxkIGlzIGFjY2Vzc2VkLg0KKyAgICAgKiBDbGllbnRzIHNob3VsZCBub3QgaW52b2tlIGl0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCBzaW1wbHkgYWNjZXNzIHRoYXQgZmllbGQgdG8gb2J0YWluIHRoZSBwYWNrYWdlLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQHNlZSAjZU5TX1VSSQ0KKyAgICAgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQ0KKyAgICAgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkNCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBBcmVzUGFja2FnZSBpbml0KCkgew0KKyAgICAgICAgaWYgKGlzSW5pdGVkKSByZXR1cm4gKEFyZXNQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFyZXNQYWNrYWdlLmVOU19VUkkpOw0KKw0KKyAgICAgICAgLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQ0KKyAgICAgICAgQXJlc1BhY2thZ2VJbXBsIHRoZUFyZXNQYWNrYWdlID0gKEFyZXNQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgQXJlc1BhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IEFyZXNQYWNrYWdlSW1wbCgpKTsNCisNCisgICAgICAgIGlzSW5pdGVkID0gdHJ1ZTsNCisNCisgICAgICAgIC8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcw0KKyAgICAgICAgQVBhclBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOw0KKyAgICAgICAgQVRlc3RQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsNCisNCisgICAgICAgIC8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzDQorICAgICAgICB0aGVBcmVzUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsNCisNCisgICAgICAgIC8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGENCisgICAgICAgIHRoZUFyZXNQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsNCisNCisgICAgICAgIC8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQNCisgICAgICAgIHRoZUFyZXNQYWNrYWdlLmZyZWV6ZSgpOw0KKw0KKyAgDQorICAgICAgICAvLyBVcGRhdGUgdGhlIHJlZ2lzdHJ5IGFuZCByZXR1cm4gdGhlIHBhY2thZ2UNCisgICAgICAgIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChBcmVzUGFja2FnZS5lTlNfVVJJLCB0aGVBcmVzUGFja2FnZSk7DQorICAgICAgICByZXR1cm4gdGhlQXJlc1BhY2thZ2U7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgRUNsYXNzIGdldFJ1bigpIHsNCisgICAgICAgIHJldHVybiBydW5FQ2xhc3M7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRSdW5fTW9kZWwoKSB7DQorICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpcnVuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRSdW5fVGVzdE1vZGVsKCkgew0KKyAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKXJ1bkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0UnVuX1BhcmFtZXRlck1vZGVsKCkgew0KKyAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKXJ1bkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UnVuX1Jlc3VsdCgpIHsNCisgICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlydW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFJ1bl9QYXJhbWV0ZXJzKCkgew0KKyAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKXJ1bkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0UnVuX0NvbnN0cmFpbnRzKCkgew0KKyAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKXJ1bkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UnVuX1N0YXJ0ZWQoKSB7DQorICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpcnVuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSdW5fRmluaXNoZWQoKSB7DQorICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpcnVuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgRUNsYXNzIGdldEZhaWx1cmUoKSB7DQorICAgICAgICByZXR1cm4gZmFpbHVyZUVDbGFzczsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEZhaWx1cmVfQ29uc3RyYWludCgpIHsNCisgICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlmYWlsdXJlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGYWlsdXJlX0lzc3VlKCkgew0KKyAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWZhaWx1cmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEZhaWx1cmVfQWN0dWFsVmFsdWUoKSB7DQorICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZmFpbHVyZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHVibGljIEVFbnVtIGdldFJlc3VsdCgpIHsNCisgICAgICAgIHJldHVybiByZXN1bHRFRW51bTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyBFRW51bSBnZXRJc3N1ZSgpIHsNCisgICAgICAgIHJldHVybiBpc3N1ZUVFbnVtOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHVibGljIEFyZXNGYWN0b3J5IGdldEFyZXNGYWN0b3J5KCkgew0KKyAgICAgICAgcmV0dXJuIChBcmVzRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7DQorDQorICAgIC8qKg0KKyAgICAgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMNCisgICAgICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0Lg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgew0KKyAgICAgICAgaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOw0KKyAgICAgICAgaXNDcmVhdGVkID0gdHJ1ZTsNCisNCisgICAgICAgIC8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcw0KKyAgICAgICAgcnVuRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJVTik7DQorICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHJ1bkVDbGFzcywgUlVOX19NT0RFTCk7DQorICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHJ1bkVDbGFzcywgUlVOX19URVNUX01PREVMKTsNCisgICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UocnVuRUNsYXNzLCBSVU5fX1BBUkFNRVRFUl9NT0RFTCk7DQorICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHJ1bkVDbGFzcywgUlVOX19SRVNVTFQpOw0KKyAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShydW5FQ2xhc3MsIFJVTl9fUEFSQU1FVEVSUyk7DQorICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHJ1bkVDbGFzcywgUlVOX19DT05TVFJBSU5UUyk7DQorICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHJ1bkVDbGFzcywgUlVOX19TVEFSVEVEKTsNCisgICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUocnVuRUNsYXNzLCBSVU5fX0ZJTklTSEVEKTsNCisNCisgICAgICAgIGZhaWx1cmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRkFJTFVSRSk7DQorICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKGZhaWx1cmVFQ2xhc3MsIEZBSUxVUkVfX0NPTlNUUkFJTlQpOw0KKyAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShmYWlsdXJlRUNsYXNzLCBGQUlMVVJFX19JU1NVRSk7DQorICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGZhaWx1cmVFQ2xhc3MsIEZBSUxVUkVfX0FDVFVBTF9WQUxVRSk7DQorDQorICAgICAgICAvLyBDcmVhdGUgZW51bXMNCisgICAgICAgIHJlc3VsdEVFbnVtID0gY3JlYXRlRUVudW0oUkVTVUxUKTsNCisgICAgICAgIGlzc3VlRUVudW0gPSBjcmVhdGVFRW51bShJU1NVRSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOw0KKw0KKyAgICAvKioNCisgICAgICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMNCisgICAgICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7DQorICAgICAgICBpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOw0KKyAgICAgICAgaXNJbml0aWFsaXplZCA9IHRydWU7DQorDQorICAgICAgICAvLyBJbml0aWFsaXplIHBhY2thZ2UNCisgICAgICAgIHNldE5hbWUoZU5BTUUpOw0KKyAgICAgICAgc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7DQorICAgICAgICBzZXROc1VSSShlTlNfVVJJKTsNCisNCisgICAgICAgIC8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMNCisgICAgICAgIE1ldGFBQk1QYWNrYWdlIHRoZU1ldGFBQk1QYWNrYWdlID0gKE1ldGFBQk1QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1ldGFBQk1QYWNrYWdlLmVOU19VUkkpOw0KKyAgICAgICAgQVRlc3RQYWNrYWdlIHRoZUFUZXN0UGFja2FnZSA9IChBVGVzdFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQVRlc3RQYWNrYWdlLmVOU19VUkkpOw0KKyAgICAgICAgQVBhclBhY2thZ2UgdGhlQVBhclBhY2thZ2UgPSAoQVBhclBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQVBhclBhY2thZ2UuZU5TX1VSSSk7DQorDQorICAgICAgICAvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzDQorDQorICAgICAgICAvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMNCisNCisgICAgICAgIC8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMNCisNCisgICAgICAgIC8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzDQorICAgICAgICBpbml0RUNsYXNzKHJ1bkVDbGFzcywgUnVuLmNsYXNzLCAiUnVuIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOw0KKyAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0UnVuX01vZGVsKCksIHRoZU1ldGFBQk1QYWNrYWdlLmdldFNDb250aW51b3VzU3BhY2UoKSwgbnVsbCwgIm1vZGVsIiwgbnVsbCwgMSwgMSwgUnVuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKyAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0UnVuX1Rlc3RNb2RlbCgpLCB0aGVBVGVzdFBhY2thZ2UuZ2V0TW9kZWwoKSwgbnVsbCwgInRlc3RNb2RlbCIsIG51bGwsIDEsIDEsIFJ1bi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisgICAgICAgIGluaXRFUmVmZXJlbmNlKGdldFJ1bl9QYXJhbWV0ZXJNb2RlbCgpLCB0aGVBUGFyUGFja2FnZS5nZXRNb2RlbCgpLCBudWxsLCAicGFyYW1ldGVyTW9kZWwiLCBudWxsLCAwLCAxLCBSdW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRSdW5fUmVzdWx0KCksIHRoaXMuZ2V0UmVzdWx0KCksICJyZXN1bHQiLCAiIiwgMCwgMSwgUnVuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKyAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0UnVuX1BhcmFtZXRlcnMoKSwgdGhlQVBhclBhY2thZ2UuZ2V0UGFyYW1ldGVyKCksIG51bGwsICJwYXJhbWV0ZXJzIiwgbnVsbCwgMCwgLTEsIFJ1bi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisgICAgICAgIGluaXRFUmVmZXJlbmNlKGdldFJ1bl9Db25zdHJhaW50cygpLCB0aGVBVGVzdFBhY2thZ2UuZ2V0Q29uc3RyYWludCgpLCBudWxsLCAiY29uc3RyYWludHMiLCBudWxsLCAwLCAtMSwgUnVuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKyAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0UnVuX1N0YXJ0ZWQoKSwgZWNvcmVQYWNrYWdlLmdldEVEYXRlKCksICJzdGFydGVkIiwgbnVsbCwgMCwgMSwgUnVuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKyAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0UnVuX0ZpbmlzaGVkKCksIGVjb3JlUGFja2FnZS5nZXRFRGF0ZSgpLCAiZmluaXNoZWQiLCBudWxsLCAwLCAxLCBSdW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7DQorDQorICAgICAgICBpbml0RUNsYXNzKGZhaWx1cmVFQ2xhc3MsIEZhaWx1cmUuY2xhc3MsICJGYWlsdXJlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOw0KKyAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0RmFpbHVyZV9Db25zdHJhaW50KCksIHRoZUFUZXN0UGFja2FnZS5nZXRDb25zdHJhaW50KCksIG51bGwsICJjb25zdHJhaW50IiwgbnVsbCwgMCwgMSwgRmFpbHVyZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsNCisgICAgICAgIGluaXRFQXR0cmlidXRlKGdldEZhaWx1cmVfSXNzdWUoKSwgdGhpcy5nZXRJc3N1ZSgpLCAiaXNzdWUiLCBudWxsLCAxLCAxLCBGYWlsdXJlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKyAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0RmFpbHVyZV9BY3R1YWxWYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RURvdWJsZSgpLCAiYWN0dWFsVmFsdWUiLCBudWxsLCAxLCAxLCBGYWlsdXJlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOw0KKw0KKyAgICAgICAgLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMNCisgICAgICAgIGluaXRFRW51bShyZXN1bHRFRW51bSwgUmVzdWx0LmNsYXNzLCAiUmVzdWx0Iik7DQorICAgICAgICBhZGRFRW51bUxpdGVyYWwocmVzdWx0RUVudW0sIFJlc3VsdC5JTkNPTVBMRVRFKTsNCisgICAgICAgIGFkZEVFbnVtTGl0ZXJhbChyZXN1bHRFRW51bSwgUmVzdWx0LlNVQ0NFU1MpOw0KKyAgICAgICAgYWRkRUVudW1MaXRlcmFsKHJlc3VsdEVFbnVtLCBSZXN1bHQuRkFJTFVSRSk7DQorDQorICAgICAgICBpbml0RUVudW0oaXNzdWVFRW51bSwgSXNzdWUuY2xhc3MsICJJc3N1ZSIpOw0KKyAgICAgICAgYWRkRUVudW1MaXRlcmFsKGlzc3VlRUVudW0sIElzc3VlLkJFTE9XX1JBTkdFKTsNCisgICAgICAgIGFkZEVFbnVtTGl0ZXJhbChpc3N1ZUVFbnVtLCBJc3N1ZS5BQk9WRV9SQU5HRSk7DQorDQorICAgICAgICAvLyBDcmVhdGUgcmVzb3VyY2UNCisgICAgICAgIGNyZWF0ZVJlc291cmNlKGVOU19VUkkpOw0KKyAgICB9DQorDQorfSAvL0FyZXNQYWNrYWdlSW1wbA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hcmVzL2ltcGwvRmFpbHVyZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hcmVzL2ltcGwvRmFpbHVyZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmU4YWQyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMvb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL2FyZXMvaW1wbC9GYWlsdXJlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjg1IEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkOiBGYWlsdXJlSW1wbC5qYXZhLHYgMS4xIDIwMDkvMDcvMzEgMjE6NDg6MTggbXBhcmtlciBFeHAgJA0KKyAqLw0KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuaW1wbDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkNvbnN0cmFpbnQ7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLkFyZXNQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5GYWlsdXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5Jc3N1ZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RmFpbHVyZTwvYj48L2VtPicuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogPHA+DQorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQorICogPHVsPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5pbXBsLkZhaWx1cmVJbXBsI2dldENvbnN0cmFpbnQgPGVtPkNvbnN0cmFpbnQ8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5pbXBsLkZhaWx1cmVJbXBsI2dldElzc3VlIDxlbT5Jc3N1ZTwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLmltcGwuRmFpbHVyZUltcGwjZ2V0QWN0dWFsVmFsdWUgPGVtPkFjdHVhbCBWYWx1ZTwvZW0+fTwvbGk+DQorICogPC91bD4NCisgKiA8L3A+DQorICoNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIEZhaWx1cmVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBGYWlsdXJlIHsNCisgICAgLyoqDQorICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnN0cmFpbnQoKSA8ZW0+Q29uc3RyYWludDwvZW0+fScgcmVmZXJlbmNlLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQHNlZSAjZ2V0Q29uc3RyYWludCgpDQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICogQG9yZGVyZWQNCisgICAgICovDQorICAgIHByb3RlY3RlZCBDb25zdHJhaW50IGNvbnN0cmFpbnQ7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNzdWUoKSA8ZW0+SXNzdWU8L2VtPn0nIGF0dHJpYnV0ZS4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBzZWUgI2dldElzc3VlKCkNCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKiBAb3JkZXJlZA0KKyAgICAgKi8NCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJc3N1ZSBJU1NVRV9FREVGQVVMVCA9IElzc3VlLkJFTE9XX1JBTkdFOw0KKw0KKyAgICAvKioNCisgICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNzdWUoKSA8ZW0+SXNzdWU8L2VtPn0nIGF0dHJpYnV0ZS4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBzZWUgI2dldElzc3VlKCkNCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKiBAb3JkZXJlZA0KKyAgICAgKi8NCisgICAgcHJvdGVjdGVkIElzc3VlIGlzc3VlID0gSVNTVUVfRURFRkFVTFQ7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsVmFsdWUoKSA8ZW0+QWN0dWFsIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAc2VlICNnZXRBY3R1YWxWYWx1ZSgpDQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICogQG9yZGVyZWQNCisgICAgICovDQorICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIEFDVFVBTF9WQUxVRV9FREVGQVVMVCA9IDAuMDsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFZhbHVlKCkgPGVtPkFjdHVhbCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQHNlZSAjZ2V0QWN0dWFsVmFsdWUoKQ0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqIEBvcmRlcmVkDQorICAgICAqLw0KKyAgICBwcm90ZWN0ZWQgZG91YmxlIGFjdHVhbFZhbHVlID0gQUNUVUFMX1ZBTFVFX0VERUZBVUxUOw0KKw0KKyAgICAvKioNCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHByb3RlY3RlZCBGYWlsdXJlSW1wbCgpIHsNCisgICAgICAgIHN1cGVyKCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQorICAgICAgICByZXR1cm4gQXJlc1BhY2thZ2UuTGl0ZXJhbHMuRkFJTFVSRTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyBDb25zdHJhaW50IGdldENvbnN0cmFpbnQoKSB7DQorICAgICAgICBpZiAoY29uc3RyYWludCAhPSBudWxsICYmIGNvbnN0cmFpbnQuZUlzUHJveHkoKSkgew0KKyAgICAgICAgICAgIEludGVybmFsRU9iamVjdCBvbGRDb25zdHJhaW50ID0gKEludGVybmFsRU9iamVjdCljb25zdHJhaW50Ow0KKyAgICAgICAgICAgIGNvbnN0cmFpbnQgPSAoQ29uc3RyYWludCllUmVzb2x2ZVByb3h5KG9sZENvbnN0cmFpbnQpOw0KKyAgICAgICAgICAgIGlmIChjb25zdHJhaW50ICE9IG9sZENvbnN0cmFpbnQpIHsNCisgICAgICAgICAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKyAgICAgICAgICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEFyZXNQYWNrYWdlLkZBSUxVUkVfX0NPTlNUUkFJTlQsIG9sZENvbnN0cmFpbnQsIGNvbnN0cmFpbnQpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gY29uc3RyYWludDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyBDb25zdHJhaW50IGJhc2ljR2V0Q29uc3RyYWludCgpIHsNCisgICAgICAgIHJldHVybiBjb25zdHJhaW50Ow0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0Q29uc3RyYWludChDb25zdHJhaW50IG5ld0NvbnN0cmFpbnQpIHsNCisgICAgICAgIENvbnN0cmFpbnQgb2xkQ29uc3RyYWludCA9IGNvbnN0cmFpbnQ7DQorICAgICAgICBjb25zdHJhaW50ID0gbmV3Q29uc3RyYWludDsNCisgICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisgICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBcmVzUGFja2FnZS5GQUlMVVJFX19DT05TVFJBSU5ULCBvbGRDb25zdHJhaW50LCBjb25zdHJhaW50KSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgSXNzdWUgZ2V0SXNzdWUoKSB7DQorICAgICAgICByZXR1cm4gaXNzdWU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzZXRJc3N1ZShJc3N1ZSBuZXdJc3N1ZSkgew0KKyAgICAgICAgSXNzdWUgb2xkSXNzdWUgPSBpc3N1ZTsNCisgICAgICAgIGlzc3VlID0gbmV3SXNzdWUgPT0gbnVsbCA/IElTU1VFX0VERUZBVUxUIDogbmV3SXNzdWU7DQorICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQXJlc1BhY2thZ2UuRkFJTFVSRV9fSVNTVUUsIG9sZElzc3VlLCBpc3N1ZSkpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHVibGljIGRvdWJsZSBnZXRBY3R1YWxWYWx1ZSgpIHsNCisgICAgICAgIHJldHVybiBhY3R1YWxWYWx1ZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHNldEFjdHVhbFZhbHVlKGRvdWJsZSBuZXdBY3R1YWxWYWx1ZSkgew0KKyAgICAgICAgZG91YmxlIG9sZEFjdHVhbFZhbHVlID0gYWN0dWFsVmFsdWU7DQorICAgICAgICBhY3R1YWxWYWx1ZSA9IG5ld0FjdHVhbFZhbHVlOw0KKyAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKyAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEFyZXNQYWNrYWdlLkZBSUxVUkVfX0FDVFVBTF9WQUxVRSwgb2xkQWN0dWFsVmFsdWUsIGFjdHVhbFZhbHVlKSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KKyAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsNCisgICAgICAgICAgICBjYXNlIEFyZXNQYWNrYWdlLkZBSUxVUkVfX0NPTlNUUkFJTlQ6DQorICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0Q29uc3RyYWludCgpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gYmFzaWNHZXRDb25zdHJhaW50KCk7DQorICAgICAgICAgICAgY2FzZSBBcmVzUGFja2FnZS5GQUlMVVJFX19JU1NVRToNCisgICAgICAgICAgICAgICAgcmV0dXJuIGdldElzc3VlKCk7DQorICAgICAgICAgICAgY2FzZSBBcmVzUGFja2FnZS5GQUlMVVJFX19BQ1RVQUxfVkFMVUU6DQorICAgICAgICAgICAgICAgIHJldHVybiBnZXRBY3R1YWxWYWx1ZSgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCisgICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7DQorICAgICAgICAgICAgY2FzZSBBcmVzUGFja2FnZS5GQUlMVVJFX19DT05TVFJBSU5UOg0KKyAgICAgICAgICAgICAgICBzZXRDb25zdHJhaW50KChDb25zdHJhaW50KW5ld1ZhbHVlKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIGNhc2UgQXJlc1BhY2thZ2UuRkFJTFVSRV9fSVNTVUU6DQorICAgICAgICAgICAgICAgIHNldElzc3VlKChJc3N1ZSluZXdWYWx1ZSk7DQorICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICBjYXNlIEFyZXNQYWNrYWdlLkZBSUxVUkVfX0FDVFVBTF9WQUxVRToNCisgICAgICAgICAgICAgICAgc2V0QWN0dWFsVmFsdWUoKERvdWJsZSluZXdWYWx1ZSk7DQorICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIHN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsNCisgICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7DQorICAgICAgICAgICAgY2FzZSBBcmVzUGFja2FnZS5GQUlMVVJFX19DT05TVFJBSU5UOg0KKyAgICAgICAgICAgICAgICBzZXRDb25zdHJhaW50KChDb25zdHJhaW50KW51bGwpOw0KKyAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgY2FzZSBBcmVzUGFja2FnZS5GQUlMVVJFX19JU1NVRToNCisgICAgICAgICAgICAgICAgc2V0SXNzdWUoSVNTVUVfRURFRkFVTFQpOw0KKyAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgY2FzZSBBcmVzUGFja2FnZS5GQUlMVVJFX19BQ1RVQUxfVkFMVUU6DQorICAgICAgICAgICAgICAgIHNldEFjdHVhbFZhbHVlKEFDVFVBTF9WQUxVRV9FREVGQVVMVCk7DQorICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIHN1cGVyLmVVbnNldChmZWF0dXJlSUQpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7DQorICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKyAgICAgICAgICAgIGNhc2UgQXJlc1BhY2thZ2UuRkFJTFVSRV9fQ09OU1RSQUlOVDoNCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnQgIT0gbnVsbDsNCisgICAgICAgICAgICBjYXNlIEFyZXNQYWNrYWdlLkZBSUxVUkVfX0lTU1VFOg0KKyAgICAgICAgICAgICAgICByZXR1cm4gaXNzdWUgIT0gSVNTVUVfRURFRkFVTFQ7DQorICAgICAgICAgICAgY2FzZSBBcmVzUGFja2FnZS5GQUlMVVJFX19BQ1RVQUxfVkFMVUU6DQorICAgICAgICAgICAgICAgIHJldHVybiBhY3R1YWxWYWx1ZSAhPSBBQ1RVQUxfVkFMVUVfRURFRkFVTFQ7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCisgICAgICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsNCisNCisgICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOw0KKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiIChpc3N1ZTogIik7DQorICAgICAgICByZXN1bHQuYXBwZW5kKGlzc3VlKTsNCisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsVmFsdWU6ICIpOw0KKyAgICAgICAgcmVzdWx0LmFwcGVuZChhY3R1YWxWYWx1ZSk7DQorICAgICAgICByZXN1bHQuYXBwZW5kKCcpJyk7DQorICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7DQorICAgIH0NCisNCit9IC8vRmFpbHVyZUltcGwNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvYXJlcy9pbXBsL1J1bkltcGwuamF2YSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hcmVzL2ltcGwvUnVuSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZTNjY2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvYXJlcy9pbXBsL1J1bkltcGwuamF2YQpAQCAtMCwwICsxLDU1NyBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqICRJZDogUnVuSW1wbC5qYXZhLHYgMS4xIDIwMDkvMDcvMzEgMjE6NDg6MTggbXBhcmtlciBFeHAgJA0KKyAqLw0KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuaW1wbDsNCisNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5EYXRlOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5hbXAuYW1mLnBhcmFtZXRlcnMuYVBhci5QYXJhbWV0ZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5Db25zdHJhaW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuTW9kZWw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLkFyZXNQYWNrYWdlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5SZXN1bHQ7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLlJ1bjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0Ow0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7DQorDQoraW1wb3J0IG9yZy5tZXRhYWJtLlNDb250aW51b3VzU3BhY2U7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UnVuPC9iPjwvZW0+Jy4NCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgKiA8cD4NCisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoNCisgKiA8dWw+DQorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLmltcGwuUnVuSW1wbCNnZXRNb2RlbCA8ZW0+TW9kZWw8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5pbXBsLlJ1bkltcGwjZ2V0VGVzdE1vZGVsIDxlbT5UZXN0IE1vZGVsPC9lbT59PC9saT4NCisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuaW1wbC5SdW5JbXBsI2dldFBhcmFtZXRlck1vZGVsIDxlbT5QYXJhbWV0ZXIgTW9kZWw8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5pbXBsLlJ1bkltcGwjZ2V0UmVzdWx0IDxlbT5SZXN1bHQ8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5pbXBsLlJ1bkltcGwjZ2V0UGFyYW1ldGVycyA8ZW0+UGFyYW1ldGVyczwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLmltcGwuUnVuSW1wbCNnZXRDb25zdHJhaW50cyA8ZW0+Q29uc3RyYWludHM8L2VtPn08L2xpPg0KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5pbXBsLlJ1bkltcGwjZ2V0U3RhcnRlZCA8ZW0+U3RhcnRlZDwvZW0+fTwvbGk+DQorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLmltcGwuUnVuSW1wbCNnZXRGaW5pc2hlZCA8ZW0+RmluaXNoZWQ8L2VtPn08L2xpPg0KKyAqIDwvdWw+DQorICogPC9wPg0KKyAqDQorICogQGdlbmVyYXRlZA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBSdW5JbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBSdW4gew0KKyAgICAvKioNCisgICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TW9kZWwoKSA8ZW0+TW9kZWw8L2VtPn0nIHJlZmVyZW5jZS4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBzZWUgI2dldE1vZGVsKCkNCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKiBAb3JkZXJlZA0KKyAgICAgKi8NCisgICAgcHJvdGVjdGVkIFNDb250aW51b3VzU3BhY2UgbW9kZWw7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUZXN0TW9kZWwoKSA8ZW0+VGVzdCBNb2RlbDwvZW0+fScgcmVmZXJlbmNlLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQHNlZSAjZ2V0VGVzdE1vZGVsKCkNCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKiBAb3JkZXJlZA0KKyAgICAgKi8NCisgICAgcHJvdGVjdGVkIE1vZGVsIHRlc3RNb2RlbDsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmFtZXRlck1vZGVsKCkgPGVtPlBhcmFtZXRlciBNb2RlbDwvZW0+fScgcmVmZXJlbmNlLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQHNlZSAjZ2V0UGFyYW1ldGVyTW9kZWwoKQ0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqIEBvcmRlcmVkDQorICAgICAqLw0KKyAgICBwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuYW1wLmFtZi5wYXJhbWV0ZXJzLmFQYXIuTW9kZWwgcGFyYW1ldGVyTW9kZWw7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzdWx0KCkgPGVtPlJlc3VsdDwvZW0+fScgYXR0cmlidXRlLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQHNlZSAjZ2V0UmVzdWx0KCkNCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKiBAb3JkZXJlZA0KKyAgICAgKi8NCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBSZXN1bHQgUkVTVUxUX0VERUZBVUxUID0gUmVzdWx0LklOQ09NUExFVEU7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXN1bHQoKSA8ZW0+UmVzdWx0PC9lbT59JyBhdHRyaWJ1dGUuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAc2VlICNnZXRSZXN1bHQoKQ0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqIEBvcmRlcmVkDQorICAgICAqLw0KKyAgICBwcm90ZWN0ZWQgUmVzdWx0IHJlc3VsdCA9IFJFU1VMVF9FREVGQVVMVDsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmFtZXRlcnMoKSA8ZW0+UGFyYW1ldGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAc2VlICNnZXRQYXJhbWV0ZXJzKCkNCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKiBAb3JkZXJlZA0KKyAgICAgKi8NCisgICAgcHJvdGVjdGVkIEVMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVyczsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnN0cmFpbnRzKCkgPGVtPkNvbnN0cmFpbnRzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBzZWUgI2dldENvbnN0cmFpbnRzKCkNCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKiBAb3JkZXJlZA0KKyAgICAgKi8NCisgICAgcHJvdGVjdGVkIEVMaXN0PENvbnN0cmFpbnQ+IGNvbnN0cmFpbnRzOw0KKw0KKyAgICAvKioNCisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0ZWQoKSA8ZW0+U3RhcnRlZDwvZW0+fScgYXR0cmlidXRlLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQHNlZSAjZ2V0U3RhcnRlZCgpDQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICogQG9yZGVyZWQNCisgICAgICovDQorICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGF0ZSBTVEFSVEVEX0VERUZBVUxUID0gbnVsbDsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0ZWQoKSA8ZW0+U3RhcnRlZDwvZW0+fScgYXR0cmlidXRlLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQHNlZSAjZ2V0U3RhcnRlZCgpDQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICogQG9yZGVyZWQNCisgICAgICovDQorICAgIHByb3RlY3RlZCBEYXRlIHN0YXJ0ZWQgPSBTVEFSVEVEX0VERUZBVUxUOw0KKw0KKyAgICAvKioNCisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmlzaGVkKCkgPGVtPkZpbmlzaGVkPC9lbT59JyBhdHRyaWJ1dGUuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAc2VlICNnZXRGaW5pc2hlZCgpDQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICogQG9yZGVyZWQNCisgICAgICovDQorICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGF0ZSBGSU5JU0hFRF9FREVGQVVMVCA9IG51bGw7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2hlZCgpIDxlbT5GaW5pc2hlZDwvZW0+fScgYXR0cmlidXRlLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQHNlZSAjZ2V0RmluaXNoZWQoKQ0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqIEBvcmRlcmVkDQorICAgICAqLw0KKyAgICBwcm90ZWN0ZWQgRGF0ZSBmaW5pc2hlZCA9IEZJTklTSEVEX0VERUZBVUxUOw0KKw0KKyAgICAvKioNCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHByb3RlY3RlZCBSdW5JbXBsKCkgew0KKyAgICAgICAgc3VwZXIoKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCisgICAgICAgIHJldHVybiBBcmVzUGFja2FnZS5MaXRlcmFscy5SVU47DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgU0NvbnRpbnVvdXNTcGFjZSBnZXRNb2RlbCgpIHsNCisgICAgICAgIGlmIChtb2RlbCAhPSBudWxsICYmIG1vZGVsLmVJc1Byb3h5KCkpIHsNCisgICAgICAgICAgICBJbnRlcm5hbEVPYmplY3Qgb2xkTW9kZWwgPSAoSW50ZXJuYWxFT2JqZWN0KW1vZGVsOw0KKyAgICAgICAgICAgIG1vZGVsID0gKFNDb250aW51b3VzU3BhY2UpZVJlc29sdmVQcm94eShvbGRNb2RlbCk7DQorICAgICAgICAgICAgaWYgKG1vZGVsICE9IG9sZE1vZGVsKSB7DQorICAgICAgICAgICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisgICAgICAgICAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBBcmVzUGFja2FnZS5SVU5fX01PREVMLCBvbGRNb2RlbCwgbW9kZWwpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gbW9kZWw7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgU0NvbnRpbnVvdXNTcGFjZSBiYXNpY0dldE1vZGVsKCkgew0KKyAgICAgICAgcmV0dXJuIG1vZGVsOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0TW9kZWwoU0NvbnRpbnVvdXNTcGFjZSBuZXdNb2RlbCkgew0KKyAgICAgICAgU0NvbnRpbnVvdXNTcGFjZSBvbGRNb2RlbCA9IG1vZGVsOw0KKyAgICAgICAgbW9kZWwgPSBuZXdNb2RlbDsNCisgICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisgICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBcmVzUGFja2FnZS5SVU5fX01PREVMLCBvbGRNb2RlbCwgbW9kZWwpKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyBNb2RlbCBnZXRUZXN0TW9kZWwoKSB7DQorICAgICAgICBpZiAodGVzdE1vZGVsICE9IG51bGwgJiYgdGVzdE1vZGVsLmVJc1Byb3h5KCkpIHsNCisgICAgICAgICAgICBJbnRlcm5hbEVPYmplY3Qgb2xkVGVzdE1vZGVsID0gKEludGVybmFsRU9iamVjdCl0ZXN0TW9kZWw7DQorICAgICAgICAgICAgdGVzdE1vZGVsID0gKE1vZGVsKWVSZXNvbHZlUHJveHkob2xkVGVzdE1vZGVsKTsNCisgICAgICAgICAgICBpZiAodGVzdE1vZGVsICE9IG9sZFRlc3RNb2RlbCkgew0KKyAgICAgICAgICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorICAgICAgICAgICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQXJlc1BhY2thZ2UuUlVOX19URVNUX01PREVMLCBvbGRUZXN0TW9kZWwsIHRlc3RNb2RlbCkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0ZXN0TW9kZWw7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgTW9kZWwgYmFzaWNHZXRUZXN0TW9kZWwoKSB7DQorICAgICAgICByZXR1cm4gdGVzdE1vZGVsOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0VGVzdE1vZGVsKE1vZGVsIG5ld1Rlc3RNb2RlbCkgew0KKyAgICAgICAgTW9kZWwgb2xkVGVzdE1vZGVsID0gdGVzdE1vZGVsOw0KKyAgICAgICAgdGVzdE1vZGVsID0gbmV3VGVzdE1vZGVsOw0KKyAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKyAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEFyZXNQYWNrYWdlLlJVTl9fVEVTVF9NT0RFTCwgb2xkVGVzdE1vZGVsLCB0ZXN0TW9kZWwpKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyBvcmcuZWNsaXBzZS5hbXAuYW1mLnBhcmFtZXRlcnMuYVBhci5Nb2RlbCBnZXRQYXJhbWV0ZXJNb2RlbCgpIHsNCisgICAgICAgIGlmIChwYXJhbWV0ZXJNb2RlbCAhPSBudWxsICYmIHBhcmFtZXRlck1vZGVsLmVJc1Byb3h5KCkpIHsNCisgICAgICAgICAgICBJbnRlcm5hbEVPYmplY3Qgb2xkUGFyYW1ldGVyTW9kZWwgPSAoSW50ZXJuYWxFT2JqZWN0KXBhcmFtZXRlck1vZGVsOw0KKyAgICAgICAgICAgIHBhcmFtZXRlck1vZGVsID0gKG9yZy5lY2xpcHNlLmFtcC5hbWYucGFyYW1ldGVycy5hUGFyLk1vZGVsKWVSZXNvbHZlUHJveHkob2xkUGFyYW1ldGVyTW9kZWwpOw0KKyAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJNb2RlbCAhPSBvbGRQYXJhbWV0ZXJNb2RlbCkgew0KKyAgICAgICAgICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorICAgICAgICAgICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQXJlc1BhY2thZ2UuUlVOX19QQVJBTUVURVJfTU9ERUwsIG9sZFBhcmFtZXRlck1vZGVsLCBwYXJhbWV0ZXJNb2RlbCkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBwYXJhbWV0ZXJNb2RlbDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyBvcmcuZWNsaXBzZS5hbXAuYW1mLnBhcmFtZXRlcnMuYVBhci5Nb2RlbCBiYXNpY0dldFBhcmFtZXRlck1vZGVsKCkgew0KKyAgICAgICAgcmV0dXJuIHBhcmFtZXRlck1vZGVsOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyTW9kZWwob3JnLmVjbGlwc2UuYW1wLmFtZi5wYXJhbWV0ZXJzLmFQYXIuTW9kZWwgbmV3UGFyYW1ldGVyTW9kZWwpIHsNCisgICAgICAgIG9yZy5lY2xpcHNlLmFtcC5hbWYucGFyYW1ldGVycy5hUGFyLk1vZGVsIG9sZFBhcmFtZXRlck1vZGVsID0gcGFyYW1ldGVyTW9kZWw7DQorICAgICAgICBwYXJhbWV0ZXJNb2RlbCA9IG5ld1BhcmFtZXRlck1vZGVsOw0KKyAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KKyAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEFyZXNQYWNrYWdlLlJVTl9fUEFSQU1FVEVSX01PREVMLCBvbGRQYXJhbWV0ZXJNb2RlbCwgcGFyYW1ldGVyTW9kZWwpKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyBSZXN1bHQgZ2V0UmVzdWx0KCkgew0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHNldFJlc3VsdChSZXN1bHQgbmV3UmVzdWx0KSB7DQorICAgICAgICBSZXN1bHQgb2xkUmVzdWx0ID0gcmVzdWx0Ow0KKyAgICAgICAgcmVzdWx0ID0gbmV3UmVzdWx0ID09IG51bGwgPyBSRVNVTFRfRURFRkFVTFQgOiBuZXdSZXN1bHQ7DQorICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQorICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQXJlc1BhY2thZ2UuUlVOX19SRVNVTFQsIG9sZFJlc3VsdCwgcmVzdWx0KSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgRUxpc3Q8UGFyYW1ldGVyPiBnZXRQYXJhbWV0ZXJzKCkgew0KKyAgICAgICAgaWYgKHBhcmFtZXRlcnMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgIHBhcmFtZXRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8UGFyYW1ldGVyPihQYXJhbWV0ZXIuY2xhc3MsIHRoaXMsIEFyZXNQYWNrYWdlLlJVTl9fUEFSQU1FVEVSUyk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcGFyYW1ldGVyczsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyBFTGlzdDxDb25zdHJhaW50PiBnZXRDb25zdHJhaW50cygpIHsNCisgICAgICAgIGlmIChjb25zdHJhaW50cyA9PSBudWxsKSB7DQorICAgICAgICAgICAgY29uc3RyYWludHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PENvbnN0cmFpbnQ+KENvbnN0cmFpbnQuY2xhc3MsIHRoaXMsIEFyZXNQYWNrYWdlLlJVTl9fQ09OU1RSQUlOVFMpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnRzOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHVibGljIERhdGUgZ2V0U3RhcnRlZCgpIHsNCisgICAgICAgIHJldHVybiBzdGFydGVkOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0U3RhcnRlZChEYXRlIG5ld1N0YXJ0ZWQpIHsNCisgICAgICAgIERhdGUgb2xkU3RhcnRlZCA9IHN0YXJ0ZWQ7DQorICAgICAgICBzdGFydGVkID0gbmV3U3RhcnRlZDsNCisgICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisgICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBcmVzUGFja2FnZS5SVU5fX1NUQVJURUQsIG9sZFN0YXJ0ZWQsIHN0YXJ0ZWQpKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyBEYXRlIGdldEZpbmlzaGVkKCkgew0KKyAgICAgICAgcmV0dXJuIGZpbmlzaGVkOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0RmluaXNoZWQoRGF0ZSBuZXdGaW5pc2hlZCkgew0KKyAgICAgICAgRGF0ZSBvbGRGaW5pc2hlZCA9IGZpbmlzaGVkOw0KKyAgICAgICAgZmluaXNoZWQgPSBuZXdGaW5pc2hlZDsNCisgICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCisgICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBcmVzUGFja2FnZS5SVU5fX0ZJTklTSEVELCBvbGRGaW5pc2hlZCwgZmluaXNoZWQpKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQorICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKyAgICAgICAgICAgIGNhc2UgQXJlc1BhY2thZ2UuUlVOX19QQVJBTUVURVJTOg0KKyAgICAgICAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFBhcmFtZXRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsNCisgICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7DQorICAgICAgICAgICAgY2FzZSBBcmVzUGFja2FnZS5SVU5fX01PREVMOg0KKyAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldE1vZGVsKCk7DQorICAgICAgICAgICAgICAgIHJldHVybiBiYXNpY0dldE1vZGVsKCk7DQorICAgICAgICAgICAgY2FzZSBBcmVzUGFja2FnZS5SVU5fX1RFU1RfTU9ERUw6DQorICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0VGVzdE1vZGVsKCk7DQorICAgICAgICAgICAgICAgIHJldHVybiBiYXNpY0dldFRlc3RNb2RlbCgpOw0KKyAgICAgICAgICAgIGNhc2UgQXJlc1BhY2thZ2UuUlVOX19QQVJBTUVURVJfTU9ERUw6DQorICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UGFyYW1ldGVyTW9kZWwoKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2ljR2V0UGFyYW1ldGVyTW9kZWwoKTsNCisgICAgICAgICAgICBjYXNlIEFyZXNQYWNrYWdlLlJVTl9fUkVTVUxUOg0KKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UmVzdWx0KCk7DQorICAgICAgICAgICAgY2FzZSBBcmVzUGFja2FnZS5SVU5fX1BBUkFNRVRFUlM6DQorICAgICAgICAgICAgICAgIHJldHVybiBnZXRQYXJhbWV0ZXJzKCk7DQorICAgICAgICAgICAgY2FzZSBBcmVzUGFja2FnZS5SVU5fX0NPTlNUUkFJTlRTOg0KKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q29uc3RyYWludHMoKTsNCisgICAgICAgICAgICBjYXNlIEFyZXNQYWNrYWdlLlJVTl9fU1RBUlRFRDoNCisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFN0YXJ0ZWQoKTsNCisgICAgICAgICAgICBjYXNlIEFyZXNQYWNrYWdlLlJVTl9fRklOSVNIRUQ6DQorICAgICAgICAgICAgICAgIHJldHVybiBnZXRGaW5pc2hlZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7DQorICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKyAgICAgICAgICAgIGNhc2UgQXJlc1BhY2thZ2UuUlVOX19NT0RFTDoNCisgICAgICAgICAgICAgICAgc2V0TW9kZWwoKFNDb250aW51b3VzU3BhY2UpbmV3VmFsdWUpOw0KKyAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgY2FzZSBBcmVzUGFja2FnZS5SVU5fX1RFU1RfTU9ERUw6DQorICAgICAgICAgICAgICAgIHNldFRlc3RNb2RlbCgoTW9kZWwpbmV3VmFsdWUpOw0KKyAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgY2FzZSBBcmVzUGFja2FnZS5SVU5fX1BBUkFNRVRFUl9NT0RFTDoNCisgICAgICAgICAgICAgICAgc2V0UGFyYW1ldGVyTW9kZWwoKG9yZy5lY2xpcHNlLmFtcC5hbWYucGFyYW1ldGVycy5hUGFyLk1vZGVsKW5ld1ZhbHVlKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIGNhc2UgQXJlc1BhY2thZ2UuUlVOX19SRVNVTFQ6DQorICAgICAgICAgICAgICAgIHNldFJlc3VsdCgoUmVzdWx0KW5ld1ZhbHVlKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIGNhc2UgQXJlc1BhY2thZ2UuUlVOX19QQVJBTUVURVJTOg0KKyAgICAgICAgICAgICAgICBnZXRQYXJhbWV0ZXJzKCkuY2xlYXIoKTsNCisgICAgICAgICAgICAgICAgZ2V0UGFyYW1ldGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUGFyYW1ldGVyPiluZXdWYWx1ZSk7DQorICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICBjYXNlIEFyZXNQYWNrYWdlLlJVTl9fQ09OU1RSQUlOVFM6DQorICAgICAgICAgICAgICAgIGdldENvbnN0cmFpbnRzKCkuY2xlYXIoKTsNCisgICAgICAgICAgICAgICAgZ2V0Q29uc3RyYWludHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIENvbnN0cmFpbnQ+KW5ld1ZhbHVlKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIGNhc2UgQXJlc1BhY2thZ2UuUlVOX19TVEFSVEVEOg0KKyAgICAgICAgICAgICAgICBzZXRTdGFydGVkKChEYXRlKW5ld1ZhbHVlKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIGNhc2UgQXJlc1BhY2thZ2UuUlVOX19GSU5JU0hFRDoNCisgICAgICAgICAgICAgICAgc2V0RmluaXNoZWQoKERhdGUpbmV3VmFsdWUpOw0KKyAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7DQorICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgew0KKyAgICAgICAgICAgIGNhc2UgQXJlc1BhY2thZ2UuUlVOX19NT0RFTDoNCisgICAgICAgICAgICAgICAgc2V0TW9kZWwoKFNDb250aW51b3VzU3BhY2UpbnVsbCk7DQorICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICBjYXNlIEFyZXNQYWNrYWdlLlJVTl9fVEVTVF9NT0RFTDoNCisgICAgICAgICAgICAgICAgc2V0VGVzdE1vZGVsKChNb2RlbCludWxsKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIGNhc2UgQXJlc1BhY2thZ2UuUlVOX19QQVJBTUVURVJfTU9ERUw6DQorICAgICAgICAgICAgICAgIHNldFBhcmFtZXRlck1vZGVsKChvcmcuZWNsaXBzZS5hbXAuYW1mLnBhcmFtZXRlcnMuYVBhci5Nb2RlbCludWxsKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIGNhc2UgQXJlc1BhY2thZ2UuUlVOX19SRVNVTFQ6DQorICAgICAgICAgICAgICAgIHNldFJlc3VsdChSRVNVTFRfRURFRkFVTFQpOw0KKyAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgY2FzZSBBcmVzUGFja2FnZS5SVU5fX1BBUkFNRVRFUlM6DQorICAgICAgICAgICAgICAgIGdldFBhcmFtZXRlcnMoKS5jbGVhcigpOw0KKyAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgY2FzZSBBcmVzUGFja2FnZS5SVU5fX0NPTlNUUkFJTlRTOg0KKyAgICAgICAgICAgICAgICBnZXRDb25zdHJhaW50cygpLmNsZWFyKCk7DQorICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICBjYXNlIEFyZXNQYWNrYWdlLlJVTl9fU1RBUlRFRDoNCisgICAgICAgICAgICAgICAgc2V0U3RhcnRlZChTVEFSVEVEX0VERUZBVUxUKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIGNhc2UgQXJlc1BhY2thZ2UuUlVOX19GSU5JU0hFRDoNCisgICAgICAgICAgICAgICAgc2V0RmluaXNoZWQoRklOSVNIRURfRURFRkFVTFQpOw0KKyAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgew0KKyAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsNCisgICAgICAgICAgICBjYXNlIEFyZXNQYWNrYWdlLlJVTl9fTU9ERUw6DQorICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbCAhPSBudWxsOw0KKyAgICAgICAgICAgIGNhc2UgQXJlc1BhY2thZ2UuUlVOX19URVNUX01PREVMOg0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGVzdE1vZGVsICE9IG51bGw7DQorICAgICAgICAgICAgY2FzZSBBcmVzUGFja2FnZS5SVU5fX1BBUkFNRVRFUl9NT0RFTDoNCisgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtZXRlck1vZGVsICE9IG51bGw7DQorICAgICAgICAgICAgY2FzZSBBcmVzUGFja2FnZS5SVU5fX1JFU1VMVDoNCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAhPSBSRVNVTFRfRURFRkFVTFQ7DQorICAgICAgICAgICAgY2FzZSBBcmVzUGFja2FnZS5SVU5fX1BBUkFNRVRFUlM6DQorICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbWV0ZXJzICE9IG51bGwgJiYgIXBhcmFtZXRlcnMuaXNFbXB0eSgpOw0KKyAgICAgICAgICAgIGNhc2UgQXJlc1BhY2thZ2UuUlVOX19DT05TVFJBSU5UUzoNCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnRzICE9IG51bGwgJiYgIWNvbnN0cmFpbnRzLmlzRW1wdHkoKTsNCisgICAgICAgICAgICBjYXNlIEFyZXNQYWNrYWdlLlJVTl9fU1RBUlRFRDoNCisgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVJURURfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0ZWQgIT0gbnVsbCA6ICFTVEFSVEVEX0VERUZBVUxULmVxdWFscyhzdGFydGVkKTsNCisgICAgICAgICAgICBjYXNlIEFyZXNQYWNrYWdlLlJVTl9fRklOSVNIRUQ6DQorICAgICAgICAgICAgICAgIHJldHVybiBGSU5JU0hFRF9FREVGQVVMVCA9PSBudWxsID8gZmluaXNoZWQgIT0gbnVsbCA6ICFGSU5JU0hFRF9FREVGQVVMVC5lcXVhbHMoZmluaXNoZWQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorICAgICAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7DQorDQorICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsNCisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAocmVzdWx0OiAiKTsNCisgICAgICAgIHJlc3VsdC5hcHBlbmQocmVzdWx0KTsNCisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgc3RhcnRlZDogIik7DQorICAgICAgICByZXN1bHQuYXBwZW5kKHN0YXJ0ZWQpOw0KKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBmaW5pc2hlZDogIik7DQorICAgICAgICByZXN1bHQuYXBwZW5kKGZpbmlzaGVkKTsNCisgICAgICAgIHJlc3VsdC5hcHBlbmQoJyknKTsNCisgICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCisgICAgfQ0KKw0KK30gLy9SdW5JbXBsDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMvb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL2FyZXMvdXRpbC9BcmVzQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hcmVzL3V0aWwvQXJlc0FkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVkYzI2OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hcmVzL3V0aWwvQXJlc0FkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxNDIgQEAKKy8qKg0KKyAqIDxjb3B5cmlnaHQ+DQorICogPC9jb3B5cmlnaHQ+DQorICoNCisgKiAkSWQ6IEFyZXNBZGFwdGVyRmFjdG9yeS5qYXZhLHYgMS4xIDIwMDkvMDcvMzEgMjE6NDg6MjAgbXBhcmtlciBFeHAgJA0KKyAqLw0KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMudXRpbDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuKjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCisNCisvKioNCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuDQorICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuDQorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5BcmVzUGFja2FnZQ0KKyAqIEBnZW5lcmF0ZWQNCisgKi8NCitwdWJsaWMgY2xhc3MgQXJlc0FkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsNCisgICAgLyoqDQorICAgICAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHByb3RlY3RlZCBzdGF0aWMgQXJlc1BhY2thZ2UgbW9kZWxQYWNrYWdlOw0KKw0KKyAgICAvKioNCisgICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5Lg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHVibGljIEFyZXNBZGFwdGVyRmFjdG9yeSgpIHsNCisgICAgICAgIGlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgew0KKyAgICAgICAgICAgIG1vZGVsUGFja2FnZSA9IEFyZXNQYWNrYWdlLmVJTlNUQU5DRTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0Lg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0Lg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7DQorICAgICAgICBpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgew0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsNCisgICAgICAgICAgICByZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFRoZSBzd2l0Y2ggdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHByb3RlY3RlZCBBcmVzU3dpdGNoPEFkYXB0ZXI+IG1vZGVsU3dpdGNoID0NCisgICAgICAgIG5ldyBBcmVzU3dpdGNoPEFkYXB0ZXI+KCkgew0KKyAgICAgICAgICAgIEBPdmVycmlkZQ0KKyAgICAgICAgICAgIHB1YmxpYyBBZGFwdGVyIGNhc2VSdW4oUnVuIG9iamVjdCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlUnVuQWRhcHRlcigpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBAT3ZlcnJpZGUNCisgICAgICAgICAgICBwdWJsaWMgQWRhcHRlciBjYXNlRmFpbHVyZShGYWlsdXJlIG9iamVjdCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlRmFpbHVyZUFkYXB0ZXIoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgQE92ZXJyaWRlDQorICAgICAgICAgICAgcHVibGljIEFkYXB0ZXIgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfTsNCisNCisgICAgLyoqDQorICAgICAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuDQorICAgICAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+Lg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsNCisgICAgICAgIHJldHVybiBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOw0KKyAgICB9DQorDQorDQorICAgIC8qKg0KKyAgICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLlJ1biA8ZW0+UnVuPC9lbT59Jy4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KKyAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLlJ1bg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVSdW5BZGFwdGVyKCkgew0KKyAgICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuRmFpbHVyZSA8ZW0+RmFpbHVyZTwvZW0+fScuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCisgICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5GYWlsdXJlDQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUZhaWx1cmVBZGFwdGVyKCkgew0KKyAgICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsNCisgICAgICAgIHJldHVybiBudWxsOw0KKyAgICB9DQorDQorfSAvL0FyZXNBZGFwdGVyRmFjdG9yeQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hcmVzL3V0aWwvQXJlc1N3aXRjaC5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMvb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL2FyZXMvdXRpbC9BcmVzU3dpdGNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNiNTRiMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hcmVzL3V0aWwvQXJlc1N3aXRjaC5qYXZhCkBAIC0wLDAgKzEsMTUxIEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkOiBBcmVzU3dpdGNoLmphdmEsdiAxLjEgMjAwOS8wNy8zMSAyMTo0ODoxOSBtcGFya2VyIEV4cCAkDQorICovDQorcGFja2FnZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy51dGlsOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuKjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQorDQorLyoqDQorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5Lg0KKyAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0NCisgKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsDQorICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QNCisgKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5DQorICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsDQorICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLg0KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAqIEBzZWUgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuQXJlc1BhY2thZ2UNCisgKiBAZ2VuZXJhdGVkDQorICovDQorcHVibGljIGNsYXNzIEFyZXNTd2l0Y2g8VD4gew0KKyAgICAvKioNCisgICAgICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwcm90ZWN0ZWQgc3RhdGljIEFyZXNQYWNrYWdlIG1vZGVsUGFja2FnZTsNCisNCisgICAgLyoqDQorICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyBBcmVzU3dpdGNoKCkgew0KKyAgICAgICAgaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7DQorICAgICAgICAgICAgbW9kZWxQYWNrYWdlID0gQXJlc1BhY2thZ2UuZUlOU1RBTkNFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuDQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyBUIGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgew0KKyAgICAgICAgcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuDQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHByb3RlY3RlZCBUIGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgew0KKyAgICAgICAgaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7DQorICAgICAgICAgICAgcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7DQorICAgICAgICB9DQorICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICBMaXN0PEVDbGFzcz4gZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsNCisgICAgICAgICAgICByZXR1cm4NCisgICAgICAgICAgICAgICAgZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8NCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoNCisgICAgICAgICAgICAgICAgICAgIGRvU3dpdGNoKGVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0Lg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCisgICAgICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4NCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHJvdGVjdGVkIFQgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7DQorICAgICAgICBzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgew0KKyAgICAgICAgICAgIGNhc2UgQXJlc1BhY2thZ2UuUlVOOiB7DQorICAgICAgICAgICAgICAgIFJ1biBydW4gPSAoUnVuKXRoZUVPYmplY3Q7DQorICAgICAgICAgICAgICAgIFQgcmVzdWx0ID0gY2FzZVJ1bihydW4pOw0KKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXNlIEFyZXNQYWNrYWdlLkZBSUxVUkU6IHsNCisgICAgICAgICAgICAgICAgRmFpbHVyZSBmYWlsdXJlID0gKEZhaWx1cmUpdGhlRU9iamVjdDsNCisgICAgICAgICAgICAgICAgVCByZXN1bHQgPSBjYXNlRmFpbHVyZShmYWlsdXJlKTsNCisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SdW48L2VtPicuDQorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQorICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KKyAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SdW48L2VtPicuDQorICAgICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQ0KKyAgICAgKiBAZ2VuZXJhdGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgVCBjYXNlUnVuKFJ1biBvYmplY3QpIHsNCisgICAgICAgIHJldHVybiBudWxsOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5GYWlsdXJlPC9lbT4nLg0KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCisgICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KKyAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmFpbHVyZTwvZW0+Jy4NCisgICAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQorICAgICAqIEBnZW5lcmF0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyBUIGNhc2VGYWlsdXJlKEZhaWx1cmUgb2JqZWN0KSB7DQorICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4NCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQorICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4NCisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQorICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLg0KKyAgICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkNCisgICAgICogQGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgcHVibGljIFQgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsNCisgICAgICAgIHJldHVybiBudWxsOw0KKyAgICB9DQorDQorfSAvL0FyZXNTd2l0Y2gNCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvYXJlcy92YWxpZGF0aW9uL0ZhaWx1cmVWYWxpZGF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcvc3JjL29yZy9lY2xpcHNlL2FtcC9hbWYvdGVzdGluZy9hcmVzL3ZhbGlkYXRpb24vRmFpbHVyZVZhbGlkYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZGQ2YjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvYXJlcy92YWxpZGF0aW9uL0ZhaWx1cmVWYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkOiBGYWlsdXJlVmFsaWRhdG9yLmphdmEsdiAxLjEgMjAwOS8wNy8zMSAyMTo0ODoxOSBtcGFya2VyIEV4cCAkDQorICovDQorcGFja2FnZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy52YWxpZGF0aW9uOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuQ29uc3RyYWludDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFyZXMuSXNzdWU7DQorDQorLyoqDQorICogQSBzYW1wbGUgdmFsaWRhdG9yIGludGVyZmFjZSBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLkZhaWx1cmV9Lg0KKyAqIFRoaXMgZG9lc24ndCByZWFsbHkgZG8gYW55dGhpbmcsIGFuZCBpdCdzIG5vdCBhIHJlYWwgRU1GIGFydGlmYWN0Lg0KKyAqIEl0IHdhcyBnZW5lcmF0ZWQgYnkgdGhlIG9yZy5lY2xpcHNlLmVtZi5leGFtcGxlcy5nZW5lcmF0b3IudmFsaWRhdG9yIHBsdWctaW4gdG8gaWxsdXN0cmF0ZSBob3cgRU1GJ3MgY29kZSBnZW5lcmF0b3IgY2FuIGJlIGV4dGVuZGVkLg0KKyAqIFRoaXMgY2FuIGJlIGRpc2FibGVkIHdpdGggLXZtYXJncyAtRG9yZy5lY2xpcHNlLmVtZi5leGFtcGxlcy5nZW5lcmF0b3IudmFsaWRhdG9yPWZhbHNlLg0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgRmFpbHVyZVZhbGlkYXRvciB7DQorICAgIGJvb2xlYW4gdmFsaWRhdGUoKTsNCisNCisgICAgYm9vbGVhbiB2YWxpZGF0ZUNvbnN0cmFpbnQoQ29uc3RyYWludCB2YWx1ZSk7DQorICAgIGJvb2xlYW4gdmFsaWRhdGVJc3N1ZShJc3N1ZSB2YWx1ZSk7DQorICAgIGJvb2xlYW4gdmFsaWRhdGVBY3R1YWxWYWx1ZShkb3VibGUgdmFsdWUpOw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvYXJlcy92YWxpZGF0aW9uL1J1blZhbGlkYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMvb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL2FyZXMvdmFsaWRhdGlvbi9SdW5WYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTkyY2FkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMvb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL2FyZXMvdmFsaWRhdGlvbi9SdW5WYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKioNCisgKiA8Y29weXJpZ2h0Pg0KKyAqIDwvY29weXJpZ2h0Pg0KKyAqDQorICogJElkOiBSdW5WYWxpZGF0b3IuamF2YSx2IDEuMSAyMDA5LzA3LzMxIDIxOjQ4OjE5IG1wYXJrZXIgRXhwICQNCisgKi8NCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLnZhbGlkYXRpb247DQorDQoraW1wb3J0IGphdmEudXRpbC5EYXRlOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5hbXAuYW1mLnBhcmFtZXRlcnMuYVBhci5QYXJhbWV0ZXI7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hVGVzdC5Db25zdHJhaW50Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuTW9kZWw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5hcmVzLlJlc3VsdDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KKw0KK2ltcG9ydCBvcmcubWV0YWFibS5TQ29udGludW91c1NwYWNlOw0KKw0KKy8qKg0KKyAqIEEgc2FtcGxlIHZhbGlkYXRvciBpbnRlcmZhY2UgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYXJlcy5SdW59Lg0KKyAqIFRoaXMgZG9lc24ndCByZWFsbHkgZG8gYW55dGhpbmcsIGFuZCBpdCdzIG5vdCBhIHJlYWwgRU1GIGFydGlmYWN0Lg0KKyAqIEl0IHdhcyBnZW5lcmF0ZWQgYnkgdGhlIG9yZy5lY2xpcHNlLmVtZi5leGFtcGxlcy5nZW5lcmF0b3IudmFsaWRhdG9yIHBsdWctaW4gdG8gaWxsdXN0cmF0ZSBob3cgRU1GJ3MgY29kZSBnZW5lcmF0b3IgY2FuIGJlIGV4dGVuZGVkLg0KKyAqIFRoaXMgY2FuIGJlIGRpc2FibGVkIHdpdGggLXZtYXJncyAtRG9yZy5lY2xpcHNlLmVtZi5leGFtcGxlcy5nZW5lcmF0b3IudmFsaWRhdG9yPWZhbHNlLg0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgUnVuVmFsaWRhdG9yIHsNCisgICAgYm9vbGVhbiB2YWxpZGF0ZSgpOw0KKw0KKyAgICBib29sZWFuIHZhbGlkYXRlTW9kZWwoU0NvbnRpbnVvdXNTcGFjZSB2YWx1ZSk7DQorICAgIGJvb2xlYW4gdmFsaWRhdGVUZXN0TW9kZWwoTW9kZWwgdmFsdWUpOw0KKyAgICBib29sZWFuIHZhbGlkYXRlUGFyYW1ldGVyTW9kZWwob3JnLmVjbGlwc2UuYW1wLmFtZi5wYXJhbWV0ZXJzLmFQYXIuTW9kZWwgdmFsdWUpOw0KKyAgICBib29sZWFuIHZhbGlkYXRlUmVzdWx0KFJlc3VsdCB2YWx1ZSk7DQorICAgIGJvb2xlYW4gdmFsaWRhdGVQYXJhbWV0ZXJzKEVMaXN0PFBhcmFtZXRlcj4gdmFsdWUpOw0KKyAgICBib29sZWFuIHZhbGlkYXRlQ29uc3RyYWludHMoRUxpc3Q8Q29uc3RyYWludD4gdmFsdWUpOw0KKyAgICBib29sZWFuIHZhbGlkYXRlU3RhcnRlZChEYXRlIHZhbHVlKTsNCisgICAgYm9vbGVhbiB2YWxpZGF0ZUZpbmlzaGVkKERhdGUgdmFsdWUpOw0KK30NCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvZm9ybWF0dGluZy9BVGVzdEZvcm1hdHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMvb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL2Zvcm1hdHRpbmcvQVRlc3RGb3JtYXR0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzE3OWJmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMvb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL2Zvcm1hdHRpbmcvQVRlc3RGb3JtYXR0ZXIuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogZ2VuZXJhdGVkIGJ5IFh0ZXh0CisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmZvcm1hdHRpbmc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5mb3JtYXR0aW5nLmltcGwuQWJzdHJhY3REZWNsYXJhdGl2ZUZvcm1hdHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5mb3JtYXR0aW5nLmltcGwuRm9ybWF0dGluZ0NvbmZpZzsKKworLyoqCisgKiBUaGlzIGNsYXNzIGNvbnRhaW5zIGN1c3RvbSBmb3JtYXR0aW5nIGRlc2NyaXB0aW9uLgorICogCisgKiBzZWUgOiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL1h0ZXh0L2RvY3VtZW50YXRpb24vbGF0ZXN0L3h0ZXh0Lmh0bWwjZm9ybWF0dGluZworICogb24gaG93IGFuZCB3aGVuIHRvIHVzZSBpdCAKKyAqIAorICogQWxzbyBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLnh0ZXh0Lnh0ZXh0Llh0ZXh0Rm9ybWF0dGluZ1Rva2VuU2VyaWFsaXplcn0gYXMgYW4gZXhhbXBsZQorICovCitwdWJsaWMgY2xhc3MgQVRlc3RGb3JtYXR0ZXIgZXh0ZW5kcyBBYnN0cmFjdERlY2xhcmF0aXZlRm9ybWF0dGVyIHsKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVGb3JtYXR0aW5nKEZvcm1hdHRpbmdDb25maWcgYykgeworCQlvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3Rpbmcuc2VydmljZXMuQVRlc3RHcmFtbWFyQWNjZXNzIGYgPSAob3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLnNlcnZpY2VzLkFUZXN0R3JhbW1hckFjY2VzcykgZ2V0R3JhbW1hckFjY2VzcygpOworCisJCS8vLi4uCisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMvb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3Njb3BpbmcvQVRlc3RJbXBvcnRSZXNvbHZlci5qYXZhIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMvb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3Njb3BpbmcvQVRlc3RJbXBvcnRSZXNvbHZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMDVkYzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3Rpbmcvc2NvcGluZy9BVGVzdEltcG9ydFJlc29sdmVyLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoqDQorICogPGNvcHlyaWdodD4NCisgKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBNZXRhc2NhcGUsIExMQy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICogDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgTWV0YXNjYXBlIC0gSW5pdGlhbCBBUEkgYW5kIEltcGxlbWVudGF0aW9uDQorICoNCisgKiA8L2NvcHlyaWdodD4NCisgKg0KKyAqLw0KKw0KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLnNjb3Bpbmc7DQorDQoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5hbXAuYW1mLnBhcmFtZXRlcnMuc2NvcGluZy5BUGFySW1wb3J0UmVzb2x2ZXIuY29udmVydFVSSTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmFtZi5wYXJhbWV0ZXJzLnNjb3BpbmcuQVBhckltcG9ydFJlc29sdmVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcuYVRlc3QuVGVzdHM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KKw0KKy8qKg0KKyAqIA0KKyAqIEBhdXRob3IgbXBhcmtlcg0KKyAqIA0KKyAqLw0KK3B1YmxpYyBjbGFzcyBBVGVzdEltcG9ydFJlc29sdmVyIGV4dGVuZHMgQVBhckltcG9ydFJlc29sdmVyIHsNCisgICAgLyoqDQorICAgICAqIEBwYXJhbSBvYmplY3QNCisgICAgICogQHJldHVybg0KKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnh0ZXh0LnNjb3BpbmcuaW1wbC5JbXBvcnRVcmlSZXNvbHZlciNyZXNvbHZlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQ0KKyAgICAgKi8NCisgICAgcHVibGljIFN0cmluZyByZXNvbHZlKEVPYmplY3Qgb2JqZWN0KSB7DQorICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgVGVzdHMpIHsNCisgICAgICAgICAgICBUZXN0cyBtb2RlbCA9IChUZXN0cykgb2JqZWN0Ow0KKyAgICAgICAgICAgIG1vZGVsLnNldEltcG9ydFVSSShjb252ZXJ0VVJJKG1vZGVsKSk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gc3VwZXIucmVzb2x2ZShvYmplY3QpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRVUkkoVGVzdHMgdGVzdHMpIHsNCisgICAgICAgIHJldHVybiBjb252ZXJ0VVJJKHRlc3RzLCB0ZXN0cy5nZXRJbXBvcnRVUkkoKSk7DQorICAgIH0NCisNCit9DQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMvb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3Njb3BpbmcvQVRlc3RTY29wZVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3Rpbmcvc2NvcGluZy9BVGVzdFNjb3BlUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjM5MTc2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMvb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3Njb3BpbmcvQVRlc3RTY29wZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIGdlbmVyYXRlZCBieSBYdGV4dAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy5zY29waW5nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFtcC5hbWYucGFyYW1ldGVycy5BUGFySW50ZXJwcmV0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmFtZi5wYXJhbWV0ZXJzLnNjb3BpbmcuQVBhclNjb3BlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nLmFUZXN0LkNvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnN0YXR1c2hhbmRsZXJzLlN0YXR1c01hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2NvcGluZy5JU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2NvcGluZy5JU2NvcGVkRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zY29waW5nLmltcGwuU2NvcGVkRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zY29waW5nLmltcGwuU2ltcGxlU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueHRlbmQuc2NvcGluZy5TY29wZTsKK2ltcG9ydCBvcmcubWV0YWFibS5NZXRhQUJNUGFja2FnZTsKK2ltcG9ydCBvcmcubWV0YWFibS5TQWdlbnQ7CitpbXBvcnQgb3JnLm1ldGFhYm0uU0NvbnRleHQ7CitpbXBvcnQgb3JnLm1ldGFhYm0uU1N0YXRlOworaW1wb3J0IG9yZy5tZXRhYWJtLlNTdGF0ZVZhbHVlOworCisvKioKKyAqIFRoaXMgY2xhc3MgY29udGFpbnMgY3VzdG9tIHNjb3BpbmcgZGVzY3JpcHRpb24uCisgKiAKKyAqIHNlZSA6IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvWHRleHQvZG9jdW1lbnRhdGlvbi9sYXRlc3QveHRleHQuaHRtbCNzY29waW5nCisgKiBvbiBob3cgYW5kIHdoZW4gdG8gdXNlIGl0CisgKgorICovCitwdWJsaWMgY2xhc3MgQVRlc3RTY29wZVByb3ZpZGVyIGV4dGVuZHMgQVBhclNjb3BlUHJvdmlkZXIgeworCisgICAgU0NvbnRleHQgY29udGV4dDsKKworICAgIC8qKgorICAgICAqIEBwYXJhbSBvYmplY3QKKyAgICAgKiBAcGFyYW0gcmVmZXJlbmNlCisgICAgICogQHJldHVybgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UueHRleHQuc2NvcGluZy5pbXBsLkRlZmF1bHRTY29wZVByb3ZpZGVyI2dldFNjb3BlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAorICAgICAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2UpCisgICAgICovCisgICAgcHVibGljIElTY29wZSBnZXRTY29wZShFT2JqZWN0IG9iamVjdCwgRVJlZmVyZW5jZSByZWZlcmVuY2UpIHsKKyAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBvYmplY3QuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKKyAgICAgICAgICAgIFVSSSB0ZXN0RmlsZVVSSSA9IG9iamVjdC5lUmVzb3VyY2UoKS5nZXRVUkkoKTsKKyAgICAgICAgICAgIHRlc3RGaWxlVVJJID0gdGVzdEZpbGVVUkkudHJpbUZpbGVFeHRlbnNpb24oKS5hcHBlbmRGaWxlRXh0ZW5zaW9uKCJhcGFyIik7CisgICAgICAgICAgICBSZXNvdXJjZSBhcGFyQW5hbG9nID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UodGVzdEZpbGVVUkksIHRydWUpOworICAgICAgICAgICAgaWYgKGFwYXJBbmFsb2cgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0YXR1c01hbmFnZXIuZ2V0TWFuYWdlcigpLmhhbmRsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0YXR1cyhTdGF0dXMuV0FSTklORywgIm9yZy5lY2xpcHNlLmFtcC5hbWYucGFyYW1ldGVycyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBsb2NhdGUgZW5naW5lIGNvbnRleHQuIikpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBUGFySW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIgPSBuZXcgQVBhckludGVycHJldGVyKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWxlKG5ldyBQYXRoKHRlc3RGaWxlVVJJLnRvUGxhdGZvcm1TdHJpbmcodHJ1ZSkpKSk7CisgICAgICAgICAgICAgICAgY29udGV4dCA9IGludGVycHJldGVyLmdldFRhcmdldE1vZGVsKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIENvbnN0cmFpbnQpIHsKKyAgICAgICAgICAgIENvbnN0cmFpbnQgY29uc3RyYWludCA9IChDb25zdHJhaW50KSBvYmplY3Q7CisgICAgICAgICAgICBMaXN0PElTY29wZWRFbGVtZW50PiBhbGxFbGVtcyA9IG5ldyBBcnJheUxpc3Q8SVNjb3BlZEVsZW1lbnQ+KCk7CisgICAgICAgICAgICBpZiAocmVmZXJlbmNlLmdldEVUeXBlKCkgPT0gTWV0YUFCTVBhY2thZ2UuZUlOU1RBTkNFLmdldFNBZ2VudCgpKSB7CisgICAgICAgICAgICAgICAgZm9yIChTQWdlbnQgYWdlbnQgOiBjb250ZXh0LmdldEFnZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbEVsZW1zLmFkZChTY29wZWRFbGVtZW50LmNyZWF0ZShhZ2VudC5nZXRMYWJlbCgpLCBhZ2VudCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmVmZXJlbmNlLmdldEVUeXBlKCkgPT0gTWV0YUFCTVBhY2thZ2UuZUlOU1RBTkNFLmdldFNBdHRyaWJ1dGUoKSkgeworICAgICAgICAgICAgICAgIGlmIChjb25zdHJhaW50LmdldEFnZW50KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaW5kQXR0cmlidXRlcyhjb25zdHJhaW50LmdldEFnZW50KCksIGFsbEVsZW1zLCAiIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNjb3BlLk5VTExTQ09QRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJlZmVyZW5jZS5nZXRFVHlwZSgpID09IE1ldGFBQk1QYWNrYWdlLmVJTlNUQU5DRS5nZXRTU3RhdGVWYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbnN0cmFpbnQuZ2V0QXR0cmlidXRlKCkgaW5zdGFuY2VvZiBTU3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgU1N0YXRlIHN0YXRlID0gKFNTdGF0ZSkgY29uc3RyYWludC5nZXRBdHRyaWJ1dGUoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChTU3RhdGVWYWx1ZSB2YWx1ZSA6IHN0YXRlLmdldE9wdGlvbnMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWxsRWxlbXMuYWRkKFNjb3BlZEVsZW1lbnQuY3JlYXRlKHZhbHVlLmdldExhYmVsKCksIHZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NvcGUuTlVMTFNDT1BFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNpbXBsZVNjb3BlIGF0dHJTY29wZSA9IG5ldyBTaW1wbGVTY29wZShhbGxFbGVtcyk7CisgICAgICAgICAgICByZXR1cm4gYXR0clNjb3BlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5nZXRTY29wZShvYmplY3QsIHJlZmVyZW5jZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMvb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3ZhbGlkYXRpb24vQVRlc3RKYXZhVmFsaWRhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3NyYy9vcmcvZWNsaXBzZS9hbXAvYW1mL3Rlc3RpbmcvdmFsaWRhdGlvbi9BVGVzdEphdmFWYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWRhOTYwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYW1wLmFtZi9wbHVnaW5zL29yZy5lY2xpcHNlLmFtcC5hbWYudGVzdGluZy9zcmMvb3JnL2VjbGlwc2UvYW1wL2FtZi90ZXN0aW5nL3ZhbGlkYXRpb24vQVRlc3RKYXZhVmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSwxMyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcudmFsaWRhdGlvbjsKKyAKKworcHVibGljIGNsYXNzIEFUZXN0SmF2YVZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0QVRlc3RKYXZhVmFsaWRhdG9yIHsKKworLy8JQENoZWNrCisvLwlwdWJsaWMgdm9pZCBjaGVja1R5cGVOYW1lU3RhcnRzV2l0aENhcGl0YWwoVHlwZSB0eXBlKSB7CisvLwkJaWYgKCFDaGFyYWN0ZXIuaXNVcHBlckNhc2UodHlwZS5nZXROYW1lKCkuY2hhckF0KDApKSkgeworLy8JCQl3YXJuaW5nKCJOYW1lIHNob3VsZCBzdGFydCB3aXRoIGEgY2FwaXRhbCIsIE15RHNsUGFja2FnZS5UWVBFX19OQU1FKTsKKy8vCQl9CisvLwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmFtcC5hbWYvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbXAuYW1mLnRlc3RpbmcvdGV4dC9kZXNjcmlwdGlvbi50eHQgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3RleHQvZGVzY3JpcHRpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlOGExZmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5hbXAuYW1mL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW1wLmFtZi50ZXN0aW5nL3RleHQvZGVzY3JpcHRpb24udHh0CkBAIC0wLDAgKzEsMzIgQEAKK01vZGVsIEFyZXMNCisNCitUaGlzIG1vZGVsIGRlc2NyaXB0aW9uIGlzIG5vdCBhIHJlYWwgRU1GIGFydGlmYWN0LiBJdCB3YXMgZ2VuZXJhdGVkIGJ5IHRoZQ0KK29yZy5lY2xpcHNlLmVtZi5leGFtcGxlcy5nZW5lcmF0b3IudmFsaWRhdG9yIHBsdWctaW4gdG8gaWxsdXN0cmF0ZSBob3cgRU1GJ3MNCitjb2RlIGdlbmVyYXRvciBjYW4gYmUgZXh0ZW5kZWQuDQorVGhpcyBjYW4gYmUgZGlzYWJsZWQgd2l0aCAtdm1hcmdzIC1Eb3JnLmVjbGlwc2UuZW1mLmV4YW1wbGVzLmdlbmVyYXRvci52YWxpZGF0b3I9ZmFsc2UuDQorDQorUGFja2FnZSBhcmVzIDxodHRwOi8vZWNsaXBzZS5vcmcvYW1wL2FyZXM+DQorDQorICBDbGFzcyBSdW4NCisgICAgUmVmZXJlbmNlIG1vZGVsIDogU0NvbnRpbnVvdXNTcGFjZTw8MS4uMT4+DQorICAgIFJlZmVyZW5jZSB0ZXN0TW9kZWwgOiBNb2RlbDw8MS4uMT4+DQorICAgIFJlZmVyZW5jZSBwYXJhbWV0ZXJNb2RlbCA6IE1vZGVsDQorICAgIEF0dHJpYnV0ZSByZXN1bHQgOiBSZXN1bHQNCisgICAgUmVmZXJlbmNlIHBhcmFtZXRlcnMgOiBQYXJhbWV0ZXI8PDAuLio+Pg0KKyAgICBSZWZlcmVuY2UgY29uc3RyYWludHMgOiBDb25zdHJhaW50PDwwLi4qPj4NCisgICAgQXR0cmlidXRlIHN0YXJ0ZWQgOiBFRGF0ZQ0KKyAgICBBdHRyaWJ1dGUgZmluaXNoZWQgOiBFRGF0ZQ0KKw0KKyAgQ2xhc3MgRmFpbHVyZQ0KKyAgICBSZWZlcmVuY2UgY29uc3RyYWludCA6IENvbnN0cmFpbnQNCisgICAgQXR0cmlidXRlIGlzc3VlIDogSXNzdWU8PDEuLjE+Pg0KKyAgICBBdHRyaWJ1dGUgYWN0dWFsVmFsdWUgOiBFRG91YmxlPDwxLi4xPj4NCisNCisgIEVudW0gUmVzdWx0DQorICAgIExpdGVyYWwgSW5jb21wbGV0ZSA9IDENCisgICAgTGl0ZXJhbCBTdWNjZXNzID0gMg0KKyAgICBMaXRlcmFsIEZhaWx1cmUgPSAzDQorDQorICBFbnVtIElzc3VlDQorICAgIExpdGVyYWwgQmVsb3dSYW5nZSA9IDEwDQorICAgIExpdGVyYWwgQWJvdmVSYW5nZSA9IDE1DQo=